Split app/services/ingestion/application.py (2,955 lines) into three
focused modules:
- page_fetch.py (219 lines): PageFetcher class for single-page fetch,
parse-or-layout-error handling, and retry with backoff
- pagination.py (486 lines): PaginationEngine class for multi-page
orchestration, loop state management, and short-circuit detection
- publication_upsert.py (239 lines): module-level functions for
resolve_publication, upsert_profile_publications, and all
find/create/update helpers
Also fixes two external import paths in portability/ that incorrectly
sourced normalize_title and build_publication_url from application.py
instead of fingerprints.py.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add ruff and mypy to dev dependencies with configuration in pyproject.toml.
Add a lint CI job that runs ruff check, ruff format --check, and mypy.
Auto-fix import sorting and formatting across the codebase. Exclude
alembic/versions from linting (auto-generated migrations). Ignore B008
(FastAPI Depends pattern) and RUF001 (unicode in user-facing strings).
21 ruff lint errors and 50 mypy errors remain for manual review.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>