RPGs become local library citizens: identified, enriched, never uploaded
When the board-game search (and truncation heads) runs dry, resolve falls back to type=rpgitem — the geekdo database is shared, so the same API, token, cache, and classification machinery apply. Matched rpgitems flow through review and enrich normally but diff routes them to a local_only bucket, structurally outside to_add/to_update: their collections live on RPGGeek, beyond this pipeline's write scope. The library page gains an All/Board games/RPGs filter and an "RPG · local only" badge; the catalog tags them too. Fixture generators write blanket empty rpgitem stubs for every known query (the fallback fires for every unmatched title) with real synthetic entries for Alice Is Missing. Data: both Alice rows re-resolved from unmatched to auto rpgitem matches. First diff since the audit reworks also lands their real-data consequences: Dungeon! gains its TSR edition update on a versionless copy the old claim ordering missed, to_add rows carry unioned reshoot provenance, and the Herbaceous typo row's survivor is now the correctly-spelled title. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="1"><item type="rpgitem" id="400001"><name type="primary" value="Alice Is Missing: A Silent Role Playing Game"/><yearpublished value="2020"/></item></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="1"><item type="rpgitem" id="400002"><name type="primary" value="Alice Is Missing: Silent Falls Expansion"/><yearpublished value="2023"/></item></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<items total="0"></items>
|
||||
@@ -0,0 +1 @@
|
||||
<items><item type="boardgame" id="400001"><name type="primary" value="game"/><versions></versions></item></items>
|
||||
@@ -0,0 +1 @@
|
||||
<items><item type="boardgame" id="400002"><name type="primary" value="game"/><versions></versions></item></items>
|
||||
@@ -397,3 +397,11 @@ def test_second_copy_flag_travels_on_exhausted_adds():
|
||||
result = compute_diff(rows, [_item(13, 900, version_id=123)])
|
||||
(added,) = result.to_add
|
||||
assert added["second_copy"] == "1"
|
||||
|
||||
|
||||
def test_rpgitem_rows_are_local_only_never_queued():
|
||||
rpg = {**_match("ALICE IS MISSING", "400001"), "type": "rpgitem"}
|
||||
result = compute_diff([rpg, _match("Catan", "13")], [])
|
||||
assert result.local_only == ["ALICE IS MISSING"]
|
||||
assert [r["bgg_id"] for r in result.to_add] == ["13"] # RPG never queued
|
||||
assert result.recognized == 1 # RPGs aren't counted against the queue
|
||||
|
||||
@@ -672,3 +672,16 @@ def test_merged_into_chains_resolve_to_terminal_survivor():
|
||||
dedupe_matches([x, y, w], [])
|
||||
assert y["match_status"] == "merged" and y["merged_into"] == "Wingspan"
|
||||
assert x["merged_into"] == "Wingspan" # chain collapsed
|
||||
|
||||
|
||||
def test_rpg_falls_back_to_rpgitem_search(client):
|
||||
# Alice Is Missing: absent from the board-game search, present as an
|
||||
# rpgitem — same geekdo API, resolved as a local library citizen
|
||||
entry = TitleEntry(
|
||||
title_raw="ALICE IS MISSING: A SILENT ROLE PLAYING GAME",
|
||||
title_normalized="alice is missing silent role playing game",
|
||||
)
|
||||
row = resolve_entry(client, entry)
|
||||
assert row.match_status == "auto"
|
||||
assert row.type == "rpgitem"
|
||||
assert row.bgg_id == 400001
|
||||
|
||||
Reference in New Issue
Block a user