mirror of
https://github.com/got-feedBack/feedBack.git
synced 2026-08-10 18:59:56 +00:00
refactor(server): carve builtin-content seeding into lib/builtin_content.py (R3b) (#900)
lib/builtin_content.py (321 lines moved). server.py 2,418 -> 2,098.
The calibration/diagnostic sloppaks and the starter library: _copy_builtin_packs,
_write_builtin_pack, the two seed helpers, their source tables, and the seed marker.
━━━ THE ONE SIGNATURE CHANGE, AND WHY THE CARVE IS UNSAFE WITHOUT IT ━━━
server.py has:
def _feedBack_server_root() -> Path:
return Path(__file__).resolve().parent
That is correct IN server.py: the repo root in dev, resources/feedBack when bundled — the
tree that actually holds docs/ and data/.
Move that body into lib/ unchanged and it keeps working, silently, and returns lib/. There
is no docs/diagnostics under lib/, so every seed would find nothing, log "source missing"
at debug, and return. Nothing raises. Nothing fails. The starter library simply never
appears, and the calibration sloppak is never seeded — on a fresh install, in the field.
A verbatim move whose MEANING changed because __file__ did.
So this module cannot compute a root: `server_root` is a PARAMETER, and server.py — the
only place that legitimately knows where it lives — passes it in. The trap is now
structurally impossible rather than merely avoided. (_copy_builtin_packs already took the
root that way; the two seed helpers now do too.)
Everything else is byte-identical. CONFIG_DIR is read late as appstate.config_dir and the
DLC root through dlc_paths._get_dlc_dir — the same seam every router in lib/routers/ uses,
late-bound because tests monkeypatch it.
━━━ PYFLAKES FOUND THREE MISSING IMPORTS THE TESTS WOULD HAVE FOUND ONE AT A TIME ━━━
The moved code uses `secrets`, `stat` and `tempfile`; none was in my import block. Each is
a NameError on a live path. `python3 -m pyflakes` names all three in one shot — this is the
Python twin of the no-undef gate that guarded every frontend carve, and it should run on
every server.py slice from here.
It also flagged a PRE-EXISTING one I deliberately did not touch: server.py's
TuningProviderRegistry.get_merged() calls `logger.exception(...)` in an except handler and
there is no `logger` in the module (it is `log`). So a raising tuning provider takes down
the merged-tunings call for everyone, with a NameError naming the wrong problem. Filed as
issue #899 rather than smuggled into a carve whose whole value is being behaviour-neutral.
The constants lost their underscore prefix: they cross a module boundary now (the seed
tests read them), so `_BUILTIN_STARTER_SOURCES` was a lie.
pytest 2397, pyflakes 0, Codex 0. Guarded by the plugin_context contract test (#898).
Refs #48
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
1cef01d02c
commit
70dbe45e27
@@ -5,6 +5,7 @@ import importlib
|
||||
import json
|
||||
import sys
|
||||
|
||||
import builtin_content
|
||||
import pytest
|
||||
from fastapi.testclient import TestClient
|
||||
|
||||
@@ -192,7 +193,7 @@ def test_low_accuracy_play_does_not_complete_gated_challenge(client):
|
||||
|
||||
|
||||
def test_diagnostic_at_100_completes_calibration(client, server):
|
||||
diag = server._builtin_diagnostic_filename()
|
||||
diag = builtin_content.builtin_diagnostic_filename()
|
||||
# A near-miss leaves calibration pending.
|
||||
_scored_play(client, filename=diag, accuracy=0.97, score=500)
|
||||
assert client.get("/api/progression").json()["onboarding"]["calibration_status"] == "pending"
|
||||
@@ -207,7 +208,7 @@ def test_diagnostic_play_does_not_feed_challenges_or_quests(client, server):
|
||||
# The calibration run is a perfect guitar play — it must yield rank 1
|
||||
# EXACTLY, advancing neither the guitar path nor the daily song quest.
|
||||
client.post("/api/progression/paths", json={"add": ["guitar"]})
|
||||
r = _scored_play(client, filename=server._builtin_diagnostic_filename(),
|
||||
r = _scored_play(client, filename=builtin_content.builtin_diagnostic_filename(),
|
||||
accuracy=1.0, score=500)
|
||||
summary = r.json()["progression"]
|
||||
assert summary["calibration_completed"] is True
|
||||
@@ -228,7 +229,7 @@ def test_pathless_diagnostic_run_still_completes_calibration(client, server):
|
||||
run is an earned achievement and must count even before any path is
|
||||
selected (e.g. a pre-progression profile playing the diagnostic as a
|
||||
hardware test) — yielding a valid pathless rank-1 state."""
|
||||
_scored_play(client, filename=server._builtin_diagnostic_filename(),
|
||||
_scored_play(client, filename=builtin_content.builtin_diagnostic_filename(),
|
||||
accuracy=1.0, score=500)
|
||||
data = client.get("/api/progression").json()
|
||||
assert data["onboarding"]["calibration_status"] == "completed"
|
||||
@@ -240,7 +241,7 @@ def test_diagnostic_upgrades_skipped_without_rank_change(client, server):
|
||||
client.post("/api/progression/paths", json={"add": ["guitar"]})
|
||||
r = client.post("/api/progression/onboarding", json={"action": "skip"})
|
||||
assert r.json()["onboarding"]["calibration_status"] == "skipped"
|
||||
_scored_play(client, filename=server._builtin_diagnostic_filename(), accuracy=1.0, score=500)
|
||||
_scored_play(client, filename=builtin_content.builtin_diagnostic_filename(), accuracy=1.0, score=500)
|
||||
data = client.get("/api/progression").json()
|
||||
assert data["onboarding"]["calibration_status"] == "completed"
|
||||
assert data["mastery_rank"] == 1
|
||||
|
||||
Reference in New Issue
Block a user