Code Quality and Linting
This guide covers code quality improvements and linting fixes applied to the tracker REST API project.
Ruff B008 Warning Resolution
Problem
The Ruff linter was reporting B008 warnings across multiple tracker route files:
Do not perform function call `Depends` in argument defaults; instead, perform the call within the function, or read the default from a module-level singleton variable
This warning occurs when function calls (like Depends() or File()) are used in function parameter defaults, which can lead to unexpected behavior since the default value is evaluated once when the function is defined, not each time it's called.
Affected Files
The following files had B008 warnings:
app/api/routes/trackers/listing.py(1 warning)app/api/routes/trackers/crud.py(3 warnings)app/api/routes/trackers/csv_import.py(2 warnings)app/api/routes/trackers/status.py(1 warning)
Solution: Module-Level Singleton Dependencies
We implemented the module-level singleton approach recommended by Ruff to resolve these warnings.
Before (Problematic Code)
@router.get("/", response_model=schemas.base.PaginatedResponse)
def read_trackers(
request: Request,
filtered_db: Tuple[Session, models.User] = Depends(deps.get_filtered_db),
cache_manager: deps.CacheManager = Depends(
lambda: deps.get_cache_manager(List[schemas.Tracker])
),
) -> Any:
# Function implementation
After (Fixed Code)
# Module-level singleton for cache manager dependency
_tracker_cache_manager_dependency = Depends(lambda: deps.get_cache_manager(List[schemas.Tracker]))
@router.get("/", response_model=schemas.base.PaginatedResponse)
def read_trackers(
request: Request,
filtered_db: Tuple[Session, models.User] = Depends(deps.get_filtered_db),
cache_manager: deps.CacheManager = _tracker_cache_manager_dependency,
) -> Any:
# Function implementation
For File Upload Dependencies
In csv_import.py, we also had to handle File(...) dependencies:
# Module-level singletons for dependencies
_csv_file_dependency = File(...)
_tracker_cache_manager_dependency = Depends(lambda: deps.get_cache_manager(list[schemas.Tracker]))
@router.post("/import-csv", response_model=Dict[str, Any])
def import_trackers_csv(
*,
filtered_db: Tuple[Session, models.User] = Depends(deps.get_filtered_db),
production_run_id: int,
csv_file: UploadFile = _csv_file_dependency,
cache_manager: deps.CacheManager = _tracker_cache_manager_dependency,
) -> Any:
# Function implementation
Benefits
- Resolves Linting Warnings: Eliminates all Ruff B008 warnings
- Better Performance: Dependencies are created once at module load time instead of being recreated
- Safer Code: Avoids potential issues with mutable default arguments
- Maintains Functionality: FastAPI dependency injection continues to work identically
- Cleaner Code: More explicit and maintainable dependency management
Verification
After applying the fixes:
trunk check --filter=ruff/B008
Result: ✔ No issues - all B008 warnings resolved.
Best Practices
When working with FastAPI dependencies in function defaults:
- Use module-level variables for complex dependency objects
- Avoid lambda functions in parameter defaults
- Create dependencies once and reuse them across functions
- Follow the pattern established in this codebase for consistency
Related Files
The following files were modified to implement this fix:
app/api/routes/trackers/listing.pyapp/api/routes/trackers/crud.pyapp/api/routes/trackers/csv_import.pyapp/api/routes/trackers/status.py
Testing
All existing functionality remains unchanged. The API endpoints continue to work exactly as before, with improved code quality and performance.