Skip to content

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

  1. Resolves Linting Warnings: Eliminates all Ruff B008 warnings
  2. Better Performance: Dependencies are created once at module load time instead of being recreated
  3. Safer Code: Avoids potential issues with mutable default arguments
  4. Maintains Functionality: FastAPI dependency injection continues to work identically
  5. 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:

  1. Use module-level variables for complex dependency objects
  2. Avoid lambda functions in parameter defaults
  3. Create dependencies once and reuse them across functions
  4. Follow the pattern established in this codebase for consistency

The following files were modified to implement this fix:

  • app/api/routes/trackers/listing.py
  • app/api/routes/trackers/crud.py
  • app/api/routes/trackers/csv_import.py
  • app/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.