fix: pin playoff card to its own gameNumber so the header doesn't tick forward after a final
CI / Lint (push) Successful in 10s
CI / Test (push) Successful in 10s
CI / Build & Push (push) Successful in 23s

series_state derives game_number from topSeedWins + bottomSeedWins + 1, which becomes the *next* game's number once the API advances seriesStatus post-final. The card for the just-finished game would then read "Game N+1 of 7". Prefer the raw gameNumber on the game payload, falling back to the derived value when it's missing.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-04-19 18:41:04 -04:00
parent 13bb90b52b
commit e908139323
3 changed files with 22 additions and 3 deletions
+11 -2
View File
@@ -92,10 +92,19 @@ def series_state(series_status):
} }
def _game_number(game, state):
"""This card's game number. Prefer the raw ``gameNumber`` field so we don't
drift forward once ``seriesStatus`` advances after the game ends."""
raw = game.get("gameNumber")
if isinstance(raw, int) and raw > 0:
return raw
return state["game_number"]
def series_blurb(game): def series_blurb(game):
"""One sentence of series context for a playoff card.""" """One sentence of series context for a playoff card."""
state = series_state(game.get("seriesStatus", {})) state = series_state(game.get("seriesStatus", {}))
g = state["game_number"] g = _game_number(game, state)
leader_name = _leader_name(game, state) leader_name = _leader_name(game, state)
trailer_name = _trailer_name(game, state) trailer_name = _trailer_name(game, state)
@@ -137,7 +146,7 @@ def series_badges(game):
def series_summary(game): def series_summary(game):
"""Short line rendered above the card, e.g. 'Game 2 of 7'.""" """Short line rendered above the card, e.g. 'Game 2 of 7'."""
state = series_state(game.get("seriesStatus", {})) state = series_state(game.get("seriesStatus", {}))
return f"Game {state['game_number']} of 7" return f"Game {_game_number(game, state)} of 7"
def is_pinned(game): def is_pinned(game):
+5 -1
View File
@@ -65,6 +65,7 @@ def make_playoff_game(
bottom_abbrev="BOS", bottom_abbrev="BOS",
top_is_home=True, top_is_home=True,
game_state="LIVE", game_state="LIVE",
game_number=None,
**kwargs, **kwargs,
): ):
"""Convenience wrapper around make_game for playoff fixtures. """Convenience wrapper around make_game for playoff fixtures.
@@ -87,7 +88,7 @@ def make_playoff_game(
home_abbrev, away_abbrev = bottom_abbrev, top_abbrev home_abbrev, away_abbrev = bottom_abbrev, top_abbrev
home_name, away_name = "Bottom Seeds", "Top Seeds" home_name, away_name = "Bottom Seeds", "Top Seeds"
return make_game( game = make_game(
game_state=game_state, game_state=game_state,
game_type=3, game_type=3,
series_status=series_status, series_status=series_status,
@@ -97,6 +98,9 @@ def make_playoff_game(
away_name=kwargs.pop("away_name", away_name), away_name=kwargs.pop("away_name", away_name),
**kwargs, **kwargs,
) )
if game_number is not None:
game["gameNumber"] = game_number
return game
LIVE_GAME = make_game() LIVE_GAME = make_game()
+6
View File
@@ -149,6 +149,12 @@ class TestSeriesSummary:
game = make_playoff_game(top_wins=1, bottom_wins=1) game = make_playoff_game(top_wins=1, bottom_wins=1)
assert series_summary(game) == "Game 3 of 7" assert series_summary(game) == "Game 3 of 7"
def test_finished_game_keeps_its_own_number(self):
# seriesStatus has advanced to 2-0 after this game finished, but the
# raw gameNumber pins the card to the game it actually represents.
game = make_playoff_game(top_wins=2, bottom_wins=0, game_number=2)
assert series_summary(game) == "Game 2 of 7"
class TestIsPinned: class TestIsPinned:
def test_game7_live_is_pinned(self): def test_game7_live_is_pinned(self):