From 0e354d375e66210fdccaa944e7124d866d86bc73 Mon Sep 17 00:00:00 2001 From: Punch Date: Thu, 4 Jun 2026 03:18:46 +0000 Subject: [PATCH] Version 0.15.6: unclaimed filter scoped to active rounds --- CHANGELOG.md | 10 ++++++++++ app/main.py | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2130c88..ba12448 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## [0.15.6] — 2026-06-04 + +### Fixed +- **`GET /specs?unclaimed=true` scope** (`app/routes/specs.py`): filter now restricts to active-round specs only (as `?active=true` would). Previously returned all 108+ specs with no passing submission — including Thingiverse catalog entries with `round_id=None`. Now returns 42 (the actual competition specs without a SOTA). Non-competition specs are never "claimable." + +### Tests +- `test_specs_unclaimed_filter_*` tests updated: new `unclaimed_client` fixture with `SPECS_DIR=tests/fixtures/specs_round` and `ROUNDS_DIR=tests/fixtures/rounds_active`; new `tests/fixtures/specs_round/r01_001_easy.json`. `_make_client()` now reloads `app.specs` to prevent stale `SPECS_DIR` across tests. Test count: 138 (count unchanged, tests updated). + +--- + ## [0.15.5] — 2026-06-04 ### Added diff --git a/app/main.py b/app/main.py index 71af2aa..183dc39 100644 --- a/app/main.py +++ b/app/main.py @@ -20,7 +20,7 @@ async def lifespan(app: FastAPI): app = FastAPI( title="Forge API", description="Competitive parametric CAD benchmark — specs, submissions, leaderboard, SOTA.", - version="0.15.5", + version="0.15.6", lifespan=lifespan, )