Expand Development section with complete setup instructions (venv, calibration, config, run), add Running tests section, and include end-to-end smoke test checklist for real-hardware validation. Update phase-status table to reflect that Phase 1 is built and unit-tested, pending real-hardware validation.
Wrap camera.read_frame() call in try/except to catch RuntimeError and
return a 503 Service Unavailable response with structured error JSON
(error + detail fields) instead of letting the exception propagate
as an unhandled 500. This gives kiosk operators a friendly, actionable
error message when the camera becomes unavailable.
Added FailingCamera test fixture and regression test that verifies
the 503 response with expected error details.
- Fix critical resource leak when cv2.VideoCapture.isOpened() returns False:
create capture in local variable, verify it opened, call .release() before
raising RuntimeError, only assign to self._capture after confirming success
- Fix potential leak on repeated open(): release any existing self._capture
before creating a new one
- Add regression test: test_open_raises_when_capture_not_opened now verifies
.release() is called on failed capture
- Add new test: test_open_twice_releases_first_capture verifies first capture's
.release() is called before second is assigned
All 28 tests passing (5 camera + 23 existing).
Bookmark is fully open source (donated to Books in Hand nonprofit, no
BSL tiering). Adds an MIT LICENSE file, a CONTRIBUTING.md scoped to an
early-stage volunteer project, and a PEP 639 license field in
pyproject.toml. Repo description and topics were also updated via the
Forgejo API for discoverability.
Implement Catalogue class with BookRecord dataclass for managing the
CSV-based book inventory. Provides operations to append records, read all
rows, update specific books, and generate unique book IDs.
5 tests passing, all functionality working as specified.