Stage 2: engine package over scrabble-solver (registry, bag, Game, replay)
backend/internal/engine wraps the sibling scrabble-solver library in-process: - Registry: versioned DAWG load via dafsa.Load, keyed by (variant, dict_version), latest-per-variant; English / Russian / Эрудит handled uniformly. - Bag: own deterministic, seeded tile bag with Draw + Return (for exchanges), since the solver's self-play bag cannot return tiles. - Game: pure rules engine — deal, play/pass/exchange/resign, refill, per-move scoring, turn order, and end-condition detection (empty bag + empty rack, six scoreless turns, resignation) with end-game rack adjustment. - decode/ReplayBoard: dictionary-independent MoveRecords and board replay via scrabble.Apply (no internal/encoding), realising ARCHITECTURE §9.1. Wiring: go.work gains "replace scrabble-solver => ../scrabble-solver"; backend requires scrabble-solver (placeholder) and github.com/iliadenisov/dafsa directly. Both Go CI workflows clone the public solver sibling (master HEAD, no token) and set BACKEND_DICT_DIR. Docs: ARCHITECTURE §5/§14, TESTING engine layer, backend README, and PLAN refinements + deferred TODOs (publish/version solver; split engine vs dictionary generator).
This commit is contained in:
@@ -31,6 +31,13 @@ jobs:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Fetch scrabble-solver (sibling)
|
||||
# The engine package consumes scrabble-solver in-process; go.work points
|
||||
# its bare module path at this sibling checkout. The repository is public,
|
||||
# so the clone needs no credentials. It tracks master HEAD (see PLAN.md
|
||||
# TODO-1 for the move to a published, versioned module).
|
||||
run: git clone --depth 1 https://gitea.iliadenisov.ru/developer/scrabble-solver.git "${GITHUB_WORKSPACE}/../scrabble-solver"
|
||||
|
||||
- name: Set up Go
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
@@ -52,5 +59,8 @@ jobs:
|
||||
|
||||
- name: test
|
||||
# -count=1 disables the test cache so a green run never depends on a
|
||||
# previous runner's cached state.
|
||||
# previous runner's cached state. BACKEND_DICT_DIR points the engine
|
||||
# tests at the committed DAWGs in the sibling checkout.
|
||||
env:
|
||||
BACKEND_DICT_DIR: ${{ github.workspace }}/../scrabble-solver/dawg
|
||||
run: go test -count=1 ./backend/...
|
||||
|
||||
@@ -37,6 +37,13 @@ jobs:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Fetch scrabble-solver (sibling)
|
||||
# The backend now imports the engine package, which consumes
|
||||
# scrabble-solver in-process; go.work points its bare module path at this
|
||||
# sibling checkout. The repository is public, so the clone needs no
|
||||
# credentials. It tracks master HEAD (see PLAN.md TODO-1).
|
||||
run: git clone --depth 1 https://gitea.iliadenisov.ru/developer/scrabble-solver.git "${GITHUB_WORKSPACE}/../scrabble-solver"
|
||||
|
||||
- name: Set up Go
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
@@ -46,5 +53,8 @@ jobs:
|
||||
- name: Integration tests
|
||||
# -count=1 disables the test cache; -p=1 -parallel=1 keeps the
|
||||
# container-backed tests serial; the 15-minute timeout bounds a stuck
|
||||
# container pull.
|
||||
# container pull. The engine package's (untagged) tests also compile and
|
||||
# run here, so BACKEND_DICT_DIR points them at the committed DAWGs.
|
||||
env:
|
||||
BACKEND_DICT_DIR: ${{ github.workspace }}/../scrabble-solver/dawg
|
||||
run: go test -tags=integration -count=1 -p=1 -parallel=1 -timeout=15m ./backend/...
|
||||
|
||||
Reference in New Issue
Block a user