deprecated-api-updater
Deprecated API Updater
Identify and replace deprecated API usage with modern alternatives automatically.
Quick Start
Detect Deprecated APIs
Scan code to identify deprecated API usage:
# Scan a single file
python scripts/detect_deprecated_apis.py src/app.py
# Scan entire directory
python scripts/detect_deprecated_apis.py src/
# Specify language explicitly
python scripts/detect_deprecated_apis.py legacy/ --language python
# Output as JSON
python scripts/detect_deprecated_apis.py src/ --format json
Replace Deprecated APIs
Automatically replace deprecated APIs:
# Dry run (preview changes)
python scripts/replace_deprecated_apis.py src/ --dry-run
# Apply replacements (creates .bak backups)
python scripts/replace_deprecated_apis.py src/
# Replace in specific language
python scripts/replace_deprecated_apis.py src/ --language javascript
Supported Languages
Python
- Standard library (collections, time, os, platform, imp)
- Django (URL routing, encoding, translation, models)
- Flask (JSON handling, send_file)
- SQLAlchemy, Pandas, NumPy, Requests
See python_deprecations.md for complete reference.
JavaScript/TypeScript
- Node.js core (Buffer, url, crypto, fs, util)
- React (lifecycle methods, createClass, PropTypes, Context)
- Express.js (body-parser)
- Webpack, Moment.js alternatives
See javascript_deprecations.md for complete reference.
Java
- Java core (Date/Calendar, Thread methods, finalize)
- Spring Framework (WebMvcConfigurerAdapter, RestTemplate)
- Hibernate (Criteria API)
- JUnit 4 → JUnit 5
- Android (AsyncTask, ProgressDialog, startActivityForResult)
See java_deprecations.md for complete reference.
Other Languages
- Ruby: URI.escape, Dir.exists?, File.exists?
- Go: ioutil package functions
Detection Methods
AST-Based Detection (Precise)
For Python and JavaScript, the skill uses Abstract Syntax Tree parsing for accurate detection:
- Advantages: Precise, understands code structure, fewer false positives
- Limitations: Requires parseable code, language-specific implementation
Example: Detects os.popen() by analyzing the AST node structure, not just string matching.
Pattern Matching (Fast)
For all languages, regex-based pattern matching provides fast detection:
- Advantages: Works across all languages, fast, handles unparseable code
- Limitations: May have false positives, less precise
Both methods are used together for comprehensive detection.
Workflow
1. Scan for Deprecations
Run detection to identify deprecated APIs:
python scripts/detect_deprecated_apis.py src/
Output example:
Found 3 deprecated API usage(s):
📍 src/utils.py:5:0
Deprecated: collections.Mapping
Replacement: collections.abc.Mapping
Context: from collections import Mapping
Detection: ast
📍 src/legacy.py:12:9
Deprecated: os.popen()
Replacement: subprocess.run() or subprocess.Popen()
Context: result = os.popen('ls')
Detection: ast
2. Review Suggestions
Examine the detected deprecations and suggested replacements. Check the reference documentation for detailed migration guides.
3. Test Replacements (Dry Run)
Preview changes before applying:
python scripts/replace_deprecated_apis.py src/ --dry-run
Output shows:
- What will be replaced
- Line-by-line changes
- Deprecated API → Replacement API mapping
4. Apply Replacements
Apply changes with automatic backups:
python scripts/replace_deprecated_apis.py src/
Creates:
.bakbackup files for all modified files- Updated source files with modern APIs
5. Validate Changes
Critical: Always validate after replacement:
# Run tests
npm test # JavaScript
pytest # Python
mvn test # Java
# Run linters
eslint src/ # JavaScript
flake8 src/ # Python
mvn checkstyle # Java
# Manual testing
# Test critical functionality
6. Commit Changes
Once validated:
# Review changes
git diff
# Commit
git add .
git commit -m "Replace deprecated APIs with modern alternatives"
# Remove backup files
find . -name "*.bak" -delete
Best Practices
Before Replacement
- Create a branch:
git checkout -b fix/deprecated-apis - Commit current state: Ensure working directory is clean
- Run tests: Verify tests pass before changes
- Review deprecation docs: Check reference files for context
During Replacement
- Start with dry run: Always preview changes first
- Replace incrementally: Process one module/directory at a time
- Keep backups: Don't delete
.bakfiles until validated - Check imports: Some replacements require new imports
After Replacement
- Run full test suite: Catch any breaking changes
- Check build output: Look for new warnings
- Manual testing: Test critical user flows
- Update dependencies: Install any newly required packages
- Code review: Have team members review changes
Common Scenarios
Scenario 1: Upgrading Django 2.x → 3.x
Deprecations:
django.conf.urls.url→django.urls.pathforce_text()→force_str()ugettext→gettext
Process:
# Detect Django-specific deprecations
python scripts/detect_deprecated_apis.py myproject/ --language python
# Preview replacements
python scripts/replace_deprecated_apis.py myproject/ --dry-run
# Apply
python scripts/replace_deprecated_apis.py myproject/
# Test
python manage.py test
Scenario 2: Upgrading React 17 → 18
Deprecations:
ReactDOM.render()→ReactDOM.createRoot()- Unsafe lifecycle methods → Modern alternatives
Process:
# Detect React deprecations
python scripts/detect_deprecated_apis.py src/ --language javascript
# Manual review needed for complex cases
# Some React upgrades require structural changes
# Apply simple replacements
python scripts/replace_deprecated_apis.py src/ --dry-run
python scripts/replace_deprecated_apis.py src/
# Test
npm test
npm start # Manual testing
Scenario 3: Modernizing Python Standard Library Usage
Deprecations:
collections.Mapping→collections.abc.Mappingtime.clock()→time.perf_counter()os.popen()→subprocess.run()
Process:
# Scan codebase
python scripts/detect_deprecated_apis.py . --language python --format json > deprecations.json
# Review JSON output
cat deprecations.json
# Apply replacements
python scripts/replace_deprecated_apis.py . --dry-run
python scripts/replace_deprecated_apis.py .
# Run tests
pytest
Limitations and Caveats
Automatic Replacement Limitations
- Context-dependent changes: Some deprecations require understanding business logic
- Complex refactoring: Major API redesigns may need manual intervention
- Imports: New imports may need to be added manually
- Breaking changes: Some replacements change behavior subtly
Manual Review Required
Always manually review replacements for:
- Security-sensitive code (authentication, encryption)
- Performance-critical sections (may need optimization)
- Complex logic (ensure semantics unchanged)
- Public APIs (breaking changes for consumers)
Known Edge Cases
- Dynamic imports: May not detect
importlib.import_module('collections').Mapping - Aliased imports: May not detect
import collections as c; c.Mapping - Conditional code: Replacements in dead code paths
- Comments: May replace deprecated API mentions in comments
Troubleshooting
Detection Issues
Problem: Deprecations not detected
Solutions:
- Check file extension matches language
- Use
--languageflag explicitly - Verify file is parseable (no syntax errors)
- Check if pattern exists in deprecation database
Problem: False positives
Solutions:
- Review AST vs pattern detection method
- Check if it's actually deprecated in your version
- Report false positives for pattern refinement
Replacement Issues
Problem: Replacement breaks code
Solutions:
- Restore from
.bakfiles - Review reference documentation for proper usage
- Check if imports need updating
- Manually refactor complex cases
Problem: Tests fail after replacement
Solutions:
- Check test expectations (mocking, assertions)
- Update test fixtures if API signatures changed
- Review behavior changes in reference docs
- Consider phased replacement approach
Reference Documentation
Language-Specific Guides
- python_deprecations.md: Python standard library, Django, Flask, SQLAlchemy, Pandas, NumPy
- javascript_deprecations.md: Node.js, React, Express, Webpack, Moment.js
- java_deprecations.md: Java core, Spring, Hibernate, JUnit, Android
Each guide includes:
- Deprecated API examples
- Modern replacement examples
- Migration rationale
- Code samples (before/after)
Advanced Usage
Custom Detection Patterns
To add custom deprecation patterns, edit the scripts:
scripts/detect_deprecated_apis.py:
DEPRECATION_PATTERNS = {
'python': [
# Add your patterns
(r'your\.deprecated\.api\(', 'your.deprecated.api()', 'modern.api()'),
]
}
scripts/replace_deprecated_apis.py:
REPLACEMENT_RULES = {
'python': [
# Add your replacements
(r'your\.deprecated\.api\(', r'modern.api(', 'deprecated', 'modern'),
]
}
Integration with CI/CD
Detect deprecations in CI:
# .github/workflows/deprecation-check.yml
name: Check Deprecations
on: [push, pull_request]
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Check for deprecated APIs
run: |
python scripts/detect_deprecated_apis.py src/ --format json > deprecations.json
if [ -s deprecations.json ]; then
echo "Deprecated APIs found!"
cat deprecations.json
exit 1
fi
Batch Processing
Process multiple projects:
#!/bin/bash
for project in project1 project2 project3; do
echo "Processing $project..."
python scripts/detect_deprecated_apis.py "$project/src" > "$project-report.txt"
python scripts/replace_deprecated_apis.py "$project/src" --dry-run
done