Add flight comparator web app with full scan pipeline
Full-stack flight price scanner built on fast-flights v3 (SOCS cookie bypass): Backend (FastAPI + SQLite): - REST API with rate limiting, Pydantic v2 validation, paginated responses - Scan pipeline: resolves airports, queries every day in the window, saves individual flights + aggregate route stats to SQLite - Background async scan processor with real-time progress tracking - Airport search endpoint backed by OpenFlights dataset - Daily scan window (all dates, not monthly samples) Frontend (React 19 + TypeScript + Tailwind CSS v4): - Dashboard with live scan status and recent scans - Create scan form: country mode or specific airports (searchable dropdown) - Scan detail page with expandable route rows showing individual flights (date, airline, departure, arrival, price) loaded on demand - AirportSearch component with debounced live search and multi-select Database: - scans → routes → flights schema with FK cascade and auto-update triggers - Migrations for schema evolution (relaxed country constraint) Tests: - 74 tests: unit + integration, isolated per-test SQLite DB - Confirmed flight fixtures in tests/confirmed_flights.json (50 real flights, BDS→FMM Ryanair + BDS→DUS Eurowings, scraped Feb 2026) - Integration tests parametrized from confirmed routes Docker: - Multi-stage builds, Compose orchestration, Nginx reverse proxy Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
69
flight-comparator/.coveragerc
Normal file
69
flight-comparator/.coveragerc
Normal file
@@ -0,0 +1,69 @@
|
||||
[run]
|
||||
# Coverage configuration for Flight Radar Web App
|
||||
|
||||
# Source directories
|
||||
source = .
|
||||
|
||||
# Omit these files from coverage
|
||||
omit =
|
||||
*/tests/*
|
||||
*/test_*.py
|
||||
*/__pycache__/*
|
||||
*/venv/*
|
||||
*/env/*
|
||||
*/.venv/*
|
||||
*/site-packages/*
|
||||
*/dist-packages/*
|
||||
*/airports.py
|
||||
*/cache.py
|
||||
*/cache_admin.py
|
||||
*/date_resolver.py
|
||||
*/formatter.py
|
||||
*/main.py
|
||||
*/progress.py
|
||||
*/searcher_*.py
|
||||
setup.py
|
||||
|
||||
# Include only api_server.py and database files
|
||||
include =
|
||||
api_server.py
|
||||
database/*.py
|
||||
|
||||
[report]
|
||||
# Reporting options
|
||||
|
||||
# Precision for coverage percentage
|
||||
precision = 2
|
||||
|
||||
# Show missing lines
|
||||
show_missing = True
|
||||
|
||||
# Skip empty files
|
||||
skip_empty = True
|
||||
|
||||
# Skip covered files
|
||||
skip_covered = False
|
||||
|
||||
# Exclude lines from coverage
|
||||
exclude_lines =
|
||||
# Standard pragma
|
||||
pragma: no cover
|
||||
|
||||
# Don't complain about missing debug code
|
||||
def __repr__
|
||||
|
||||
# Don't complain if tests don't hit defensive assertion code
|
||||
raise AssertionError
|
||||
raise NotImplementedError
|
||||
|
||||
# Don't complain if non-runnable code isn't run
|
||||
if __name__ == .__main__.:
|
||||
if TYPE_CHECKING:
|
||||
|
||||
# Don't complain about abstract methods
|
||||
@abstractmethod
|
||||
|
||||
[html]
|
||||
# HTML report options
|
||||
directory = htmlcov
|
||||
title = Flight Radar Web App - Test Coverage Report
|
||||
Reference in New Issue
Block a user