Meal planner backend ## Structure - `main.py`: FastAPI app with all HTTP endpoints. - `db.py`: aiosqlite connection + schema bootstrap across subpackages (calls each feature's `repository.create`). - Domain packages with models and persistence: - `products/` (models.py, repository.py, scrapers for Woolworths/Coles) - `ingredients/` (models.py, repository.py) - `recipes/` (models.py, repository.py, scraping.py) - `meals/` (models.py, repository.py, service.py) - `persons/` (models.py, repository.py) - `shopping/` (models.py, repository.py) - `tests/`: unit and API tests with sample HTTP fixtures. ## Getting started Install packages ``` pip install -r ./requirements.txt ``` Run API (dev) ``` uvicorn main:app --reload ``` Run tests ``` pytest -q ``` ## Tooling This repo includes baseline configs in `pyproject.toml`: - black (format) - ruff (lint) - mypy (type check) Optional commands (install these locally first): ``` ruff check . ruff format . mypy . ``` ## Environment variables - DOOF_DB: Path to sqlite database (default: `./data/doof.sqlite`) - DOOF_PORT: Port the server listens on when containerized; align Dockerfile `EXPOSE` accordingly. ## OpenAPI schema - Generate the schema artifact used by the frontend and CI checks: ``` python scripts/export_openapi.py ``` This writes `openapi.json` to the repo root. Versioned endpoints live under `/api/v1`, legacy under `/api` (deprecated with `Deprecation` header). ## Schema lint/diff (manual) Optionally, lint and compare schemas locally using Node tools: ``` npx -y @stoplight/spectral-cli lint openapi.json npx -y openapi-diff --fail-on-changed --fail-on-incompatible path/to/baseline.json openapi.json ``` Keep a `baseline.json` on release branches to detect breaking changes.