Files

2.4 KiB

FastAPI current-status step

Python/FastAPI implementation for step 3. It keeps one in-memory completed result per target behind a single asyncio.Lock and emits current_status_implementation while preserving all prior contract outputs.

Integrate with the prior service/checker

Create one coordinator for the FastAPI process and include its router:

coordinator = CurrentStatusCoordinator()
app.include_router(build_current_status_router(coordinator))

The prior target-create path must call await coordinator.register_target(target_id). The prior target-delete path must call await coordinator.delete_target(target_id). The scheduler/check path calls:

published = await coordinator.run_check(target_id, target, prior_checker)

prior_checker is an async callable returning a JSON-compatible mapping. published=False means the result became stale. These lifecycle hooks are deliberately explicit so target deletion and status cleanup share the coordinator's critical section.

REST contract

GET /targets/{target_id}/status returns:

  • 404 with {"detail":{"code":"target_not_found","target_id":"..."}} when the target does not exist.
  • 200 with state="not_checked" and result=null when it exists but has no completed check.
  • 200 with state="checked" and the latest result otherwise.

Only one _statuses[target_id] value can exist. A UUID incarnation prevents an in-flight check from publishing after delete/recreate. A per-incarnation sequence prevents an older overlapping check from replacing a newer-started check. Deletion removes status while holding the same lock.

Contract transformer

python -m current_status < input.json > output.json

The three input objects are deep-copied unchanged and current_status_implementation is appended.

Tests and exact verification command

Files: tests/test_api.py, tests/test_concurrency.py, and tests/test_transform.py.

python -m pip install -e '.[test]'
python -m pytest -q

The tests audit latest-only retention, REST not-found/no-check/latest responses, deletion cleanup, overlapping-check ordering, delete/recreate resurrection prevention, and output preservation/emission.

Execution evidence

No shell/test runner is available to the generation call, so this commit does not claim that pytest was executed there. The exact reproducible command is above; committed tests are the auditable evidence supplied by this generation step.