[Arch] main.py is a 1,553-line god module with no router split #50
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Severity: High | Category: Architecture
52
@app.*route handlers live in one flat file (grep -c "^@app\." main.py→ 52); zeroAPIRouter/include_routerusage anywhere.Problem: No structural boundary between shipment CRUD, admin, auth, settings, scrapers. Hard to reason about locally; concentrates merge conflicts.
Recommendation: Split into
APIRoutermodules by resource (routers/shipments.py,routers/settings.py,routers/admin.py,routers/auth.py,routers/scrapers.py), mounted viaapp.include_router(...). Pure mechanical extraction.Refactoring safety:
tests/test_api.py+tests/test_multiuser.pyalready cover most routes end-to-end.Full detail:
docs/architecture-review.md§ C, Finding "main.py is a 1,553-line god module..."Fixed on branch
architecture-rework, commits933e290,430d744,1a6ff16,de06465: split main.py's 52 route handlers intorouters/admin.py,routers/auth.py,routers/settings.py,routers/scrapers.py,routers/shipments.py, mounted viaapp.include_router(). main.py shrinks from 1,553 lines / 52 routes to 630 lines / 5 core routes (/ingest,/health,/metrics,/api/releases,/api/stats) plus middleware, startup/shutdown, the exception handler, and shared singletons.Routers needing main.py's shared state (scheduler, notifiers, rate limiters) use
import mainand only readmain.xxxinside function bodies, deferring attribute access to request time — main.py includes the routers after all its own singletons/helpers are defined, so this avoids a circular import without needing a separate app-state module. Caught and fixed one real test-visibility regression along the way: a router importingscrape_singledirectly (instead of viamain.scrape_single) broke tests patchingmain.scrape_single. Full suite: 259 passed at completion.