This example demonstrates how to use Codegen to automatically add OpenAPI decorators (@response and @expect) to Flask-RESTx API endpoints. The migration script analyzes existing code patterns and adds appropriate decorators to improve API documentation.
Note
This codemod helps maintain consistent API documentation by automatically analyzing endpoint behavior and adding appropriate OpenAPI decorators.
The script automates the documentation process in several key steps:
-
Resource Class Detection
for cls in codebase.classes: if cls.is_subclass_of("Resource"): # Process Flask-RESTx resource classes
- Identifies Flask-RESTx resource classes
- Analyzes HTTP method handlers (get, post, put, patch, delete)
- Determines which decorators are missing
-
Response Analysis
response_schemas = analyze_method_returns(method)
- Analyzes return statements
- Extracts response codes and schemas
- Handles error responses from
http_errorcalls - Processes existing
@docdecorators
-
Parameter Analysis
expect_schema = analyze_method_params(method)
- Analyzes request parameter usage
- Detects JSON request body schemas
- Processes existing
@expectdecorators
-
Automated Analysis
- Automatically detects API patterns
- Infers response and request schemas
- No manual documentation required
-
Consistent Documentation
- Ensures all endpoints are documented
- Maintains consistent decorator usage
- Preserves existing decorators
-
Intelligent Schema Detection
- Analyzes model fields
- Detects request parameter types
- Handles nested objects
# Before
@ns.route("/endpoint")
class MyResource(Resource):
def get(self):
return {"data": result}
# After
@ns.route("/endpoint")
class MyResource(Resource):
@ns.response(200, "Success", {"data": {"type": "any"}})
def get(self):
return {"data": result}# Before
@ns.route("/endpoint")
class MyResource(Resource):
def post(self):
data = request.json["name"]
return {"status": "success"}
# After
@ns.route("/endpoint")
class MyResource(Resource):
@ns.expect({"name": {"type": "any", "required": True}})
@ns.response(200, "Success", {"status": {"type": "any"}})
def post(self):
data = request.json["name"]
return {"status": "success"}-
Better API Documentation
- Clear response schemas
- Documented request parameters
- Improved API explorer experience
-
Consistent Error Handling
- Documented error responses
- Clear status codes
- Better client integration
-
Time Savings
- Automated decorator generation
- Reduced manual documentation work
- Easier maintenance
# Install Codegen
pip install codegen
# Run the migration
python run.pyThe script will:
- Initialize the codebase
- Find Flask-RESTx resource classes
- Analyze methods and add decorators
- Print detailed analytics about missing decorators
Feel free to submit issues and enhancement requests!