CLAUDE: Fix runner_advancement for new GameState structure
Updated runner_advancement.py and its tests to use the new GameState
structure where current_batter is a LineupPlayerState object instead of
an integer ID.
Changes:
- runner_advancement.py: Replaced all 17 references to
state.current_batter_lineup_id with state.current_batter.lineup_id
- tests/unit/core/test_runner_advancement.py: Updated test fixtures
- Mock fixture: Added mock_batter object with lineup_id attribute
- GameState constructor calls: Create LineupPlayerState objects instead
of using current_batter_lineup_id parameter (9 tests fixed)
All 34 runner advancement tests now passing. This fixes the AttributeError
that was preventing X-Check resolution from completing in the terminal
client ("'GameState' object has no attribute 'current_batter_lineup_id'").
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
bb78de2b84
commit
cf7cc23f45
@ -493,7 +493,7 @@ class RunnerAdvancement:
|
|||||||
|
|
||||||
# Batter is out
|
# Batter is out
|
||||||
movements.append(RunnerMovement(
|
movements.append(RunnerMovement(
|
||||||
lineup_id=state.current_batter_lineup_id,
|
lineup_id=state.current_batter.lineup_id,
|
||||||
from_base=0,
|
from_base=0,
|
||||||
to_base=0,
|
to_base=0,
|
||||||
is_out=True
|
is_out=True
|
||||||
@ -564,7 +564,7 @@ class RunnerAdvancement:
|
|||||||
|
|
||||||
# Batter out at first
|
# Batter out at first
|
||||||
movements.append(RunnerMovement(
|
movements.append(RunnerMovement(
|
||||||
lineup_id=state.current_batter_lineup_id,
|
lineup_id=state.current_batter.lineup_id,
|
||||||
from_base=0,
|
from_base=0,
|
||||||
to_base=0,
|
to_base=0,
|
||||||
is_out=True
|
is_out=True
|
||||||
@ -575,7 +575,7 @@ class RunnerAdvancement:
|
|||||||
else:
|
else:
|
||||||
# Can't turn DP, just batter out
|
# Can't turn DP, just batter out
|
||||||
movements.append(RunnerMovement(
|
movements.append(RunnerMovement(
|
||||||
lineup_id=state.current_batter_lineup_id,
|
lineup_id=state.current_batter.lineup_id,
|
||||||
from_base=0,
|
from_base=0,
|
||||||
to_base=0,
|
to_base=0,
|
||||||
is_out=True
|
is_out=True
|
||||||
@ -622,7 +622,7 @@ class RunnerAdvancement:
|
|||||||
|
|
||||||
# Batter is out
|
# Batter is out
|
||||||
movements.append(RunnerMovement(
|
movements.append(RunnerMovement(
|
||||||
lineup_id=state.current_batter_lineup_id,
|
lineup_id=state.current_batter.lineup_id,
|
||||||
from_base=0,
|
from_base=0,
|
||||||
to_base=0,
|
to_base=0,
|
||||||
is_out=True
|
is_out=True
|
||||||
@ -682,7 +682,7 @@ class RunnerAdvancement:
|
|||||||
|
|
||||||
# Batter safe at first
|
# Batter safe at first
|
||||||
movements.append(RunnerMovement(
|
movements.append(RunnerMovement(
|
||||||
lineup_id=state.current_batter_lineup_id,
|
lineup_id=state.current_batter.lineup_id,
|
||||||
from_base=0,
|
from_base=0,
|
||||||
to_base=1,
|
to_base=1,
|
||||||
is_out=False
|
is_out=False
|
||||||
@ -752,7 +752,7 @@ class RunnerAdvancement:
|
|||||||
|
|
||||||
# Batter is out
|
# Batter is out
|
||||||
movements.append(RunnerMovement(
|
movements.append(RunnerMovement(
|
||||||
lineup_id=state.current_batter_lineup_id,
|
lineup_id=state.current_batter.lineup_id,
|
||||||
from_base=0,
|
from_base=0,
|
||||||
to_base=0,
|
to_base=0,
|
||||||
is_out=True
|
is_out=True
|
||||||
@ -826,7 +826,7 @@ class RunnerAdvancement:
|
|||||||
|
|
||||||
# Batter is out
|
# Batter is out
|
||||||
movements.append(RunnerMovement(
|
movements.append(RunnerMovement(
|
||||||
lineup_id=state.current_batter_lineup_id,
|
lineup_id=state.current_batter.lineup_id,
|
||||||
from_base=0,
|
from_base=0,
|
||||||
to_base=0,
|
to_base=0,
|
||||||
is_out=True
|
is_out=True
|
||||||
@ -891,7 +891,7 @@ class RunnerAdvancement:
|
|||||||
|
|
||||||
# Batter out at first
|
# Batter out at first
|
||||||
movements.append(RunnerMovement(
|
movements.append(RunnerMovement(
|
||||||
lineup_id=state.current_batter_lineup_id,
|
lineup_id=state.current_batter.lineup_id,
|
||||||
from_base=0,
|
from_base=0,
|
||||||
to_base=0,
|
to_base=0,
|
||||||
is_out=True
|
is_out=True
|
||||||
@ -902,7 +902,7 @@ class RunnerAdvancement:
|
|||||||
else:
|
else:
|
||||||
# Can't turn DP, just batter out
|
# Can't turn DP, just batter out
|
||||||
movements.append(RunnerMovement(
|
movements.append(RunnerMovement(
|
||||||
lineup_id=state.current_batter_lineup_id,
|
lineup_id=state.current_batter.lineup_id,
|
||||||
from_base=0,
|
from_base=0,
|
||||||
to_base=0,
|
to_base=0,
|
||||||
is_out=True
|
is_out=True
|
||||||
@ -974,7 +974,7 @@ class RunnerAdvancement:
|
|||||||
|
|
||||||
# Batter safe at first
|
# Batter safe at first
|
||||||
movements.append(RunnerMovement(
|
movements.append(RunnerMovement(
|
||||||
lineup_id=state.current_batter_lineup_id,
|
lineup_id=state.current_batter.lineup_id,
|
||||||
from_base=0,
|
from_base=0,
|
||||||
to_base=1,
|
to_base=1,
|
||||||
is_out=False
|
is_out=False
|
||||||
@ -1037,7 +1037,7 @@ class RunnerAdvancement:
|
|||||||
# TODO: This needs to be interactive in the game engine
|
# TODO: This needs to be interactive in the game engine
|
||||||
|
|
||||||
movements.append(RunnerMovement(
|
movements.append(RunnerMovement(
|
||||||
lineup_id=state.current_batter_lineup_id,
|
lineup_id=state.current_batter.lineup_id,
|
||||||
from_base=0,
|
from_base=0,
|
||||||
to_base=0,
|
to_base=0,
|
||||||
is_out=True
|
is_out=True
|
||||||
@ -1120,7 +1120,7 @@ class RunnerAdvancement:
|
|||||||
|
|
||||||
# Batter safe at first
|
# Batter safe at first
|
||||||
movements.append(RunnerMovement(
|
movements.append(RunnerMovement(
|
||||||
lineup_id=state.current_batter_lineup_id,
|
lineup_id=state.current_batter.lineup_id,
|
||||||
from_base=0,
|
from_base=0,
|
||||||
to_base=1,
|
to_base=1,
|
||||||
is_out=False
|
is_out=False
|
||||||
@ -1130,7 +1130,7 @@ class RunnerAdvancement:
|
|||||||
else:
|
else:
|
||||||
# Can't turn DP
|
# Can't turn DP
|
||||||
movements.append(RunnerMovement(
|
movements.append(RunnerMovement(
|
||||||
lineup_id=state.current_batter_lineup_id,
|
lineup_id=state.current_batter.lineup_id,
|
||||||
from_base=0,
|
from_base=0,
|
||||||
to_base=0,
|
to_base=0,
|
||||||
is_out=True
|
is_out=True
|
||||||
@ -1213,7 +1213,7 @@ class RunnerAdvancement:
|
|||||||
|
|
||||||
# Batter is out
|
# Batter is out
|
||||||
movements.append(RunnerMovement(
|
movements.append(RunnerMovement(
|
||||||
lineup_id=state.current_batter_lineup_id,
|
lineup_id=state.current_batter.lineup_id,
|
||||||
from_base=0,
|
from_base=0,
|
||||||
to_base=0,
|
to_base=0,
|
||||||
is_out=True
|
is_out=True
|
||||||
@ -1274,7 +1274,7 @@ class RunnerAdvancement:
|
|||||||
|
|
||||||
# Batter is out
|
# Batter is out
|
||||||
movements.append(RunnerMovement(
|
movements.append(RunnerMovement(
|
||||||
lineup_id=state.current_batter_lineup_id,
|
lineup_id=state.current_batter.lineup_id,
|
||||||
from_base=0,
|
from_base=0,
|
||||||
to_base=0,
|
to_base=0,
|
||||||
is_out=True
|
is_out=True
|
||||||
@ -1337,7 +1337,7 @@ class RunnerAdvancement:
|
|||||||
|
|
||||||
# Batter is out
|
# Batter is out
|
||||||
movements.append(RunnerMovement(
|
movements.append(RunnerMovement(
|
||||||
lineup_id=state.current_batter_lineup_id,
|
lineup_id=state.current_batter.lineup_id,
|
||||||
from_base=0,
|
from_base=0,
|
||||||
to_base=0,
|
to_base=0,
|
||||||
is_out=True
|
is_out=True
|
||||||
@ -1393,7 +1393,7 @@ class RunnerAdvancement:
|
|||||||
|
|
||||||
# Batter is out
|
# Batter is out
|
||||||
movements.append(RunnerMovement(
|
movements.append(RunnerMovement(
|
||||||
lineup_id=state.current_batter_lineup_id,
|
lineup_id=state.current_batter.lineup_id,
|
||||||
from_base=0,
|
from_base=0,
|
||||||
to_base=0,
|
to_base=0,
|
||||||
is_out=True
|
is_out=True
|
||||||
|
|||||||
@ -48,7 +48,10 @@ def base_state():
|
|||||||
state = Mock(spec=GameState)
|
state = Mock(spec=GameState)
|
||||||
state.outs = 0
|
state.outs = 0
|
||||||
state.current_on_base_code = 0
|
state.current_on_base_code = 0
|
||||||
state.current_batter_lineup_id = 1
|
# Mock current_batter with lineup_id
|
||||||
|
mock_batter = Mock()
|
||||||
|
mock_batter.lineup_id = 1
|
||||||
|
state.current_batter = mock_batter
|
||||||
state.on_first = None
|
state.on_first = None
|
||||||
state.on_second = None
|
state.on_second = None
|
||||||
state.on_third = None
|
state.on_third = None
|
||||||
@ -649,12 +652,18 @@ class TestXCheckPlaceholders:
|
|||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
|
|
||||||
# Create GameState (bases empty, 0 outs)
|
# Create GameState (bases empty, 0 outs)
|
||||||
|
from app.models.game_models import LineupPlayerState
|
||||||
|
|
||||||
|
mock_batter = LineupPlayerState(lineup_id=1, card_id=100, position='CF', batting_order=1)
|
||||||
|
|
||||||
state = GameState(
|
state = GameState(
|
||||||
game_id=uuid4(),
|
game_id=uuid4(),
|
||||||
league_id='sba',
|
league_id='sba',
|
||||||
home_team_id=1,
|
home_team_id=1,
|
||||||
away_team_id=2,
|
away_team_id=2,
|
||||||
current_batter_lineup_id=1
|
|
||||||
|
current_batter=mock_batter
|
||||||
|
|
||||||
)
|
)
|
||||||
state.outs = 0
|
state.outs = 0
|
||||||
|
|
||||||
@ -685,12 +694,18 @@ class TestXCheckPlaceholders:
|
|||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
|
|
||||||
# Create GameState (not used for error case, but required by signature)
|
# Create GameState (not used for error case, but required by signature)
|
||||||
|
from app.models.game_models import LineupPlayerState
|
||||||
|
|
||||||
|
mock_batter = LineupPlayerState(lineup_id=1, card_id=100, position='CF', batting_order=1)
|
||||||
|
|
||||||
state = GameState(
|
state = GameState(
|
||||||
game_id=uuid4(),
|
game_id=uuid4(),
|
||||||
league_id='sba',
|
league_id='sba',
|
||||||
home_team_id=1,
|
home_team_id=1,
|
||||||
away_team_id=2,
|
away_team_id=2,
|
||||||
current_batter_lineup_id=1
|
|
||||||
|
current_batter=mock_batter
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
defensive_decision = DefensiveDecision(
|
defensive_decision = DefensiveDecision(
|
||||||
@ -721,12 +736,18 @@ class TestXCheckPlaceholders:
|
|||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
|
|
||||||
# Create GameState (not used for error case, but required by signature)
|
# Create GameState (not used for error case, but required by signature)
|
||||||
|
from app.models.game_models import LineupPlayerState
|
||||||
|
|
||||||
|
mock_batter = LineupPlayerState(lineup_id=1, card_id=100, position='CF', batting_order=1)
|
||||||
|
|
||||||
state = GameState(
|
state = GameState(
|
||||||
game_id=uuid4(),
|
game_id=uuid4(),
|
||||||
league_id='sba',
|
league_id='sba',
|
||||||
home_team_id=1,
|
home_team_id=1,
|
||||||
away_team_id=2,
|
away_team_id=2,
|
||||||
current_batter_lineup_id=1
|
|
||||||
|
current_batter=mock_batter
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
defensive_decision = DefensiveDecision(
|
defensive_decision = DefensiveDecision(
|
||||||
@ -757,12 +778,18 @@ class TestXCheckPlaceholders:
|
|||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
|
|
||||||
# Create GameState (bases empty, 0 outs)
|
# Create GameState (bases empty, 0 outs)
|
||||||
|
from app.models.game_models import LineupPlayerState
|
||||||
|
|
||||||
|
mock_batter = LineupPlayerState(lineup_id=1, card_id=100, position='CF', batting_order=1)
|
||||||
|
|
||||||
state = GameState(
|
state = GameState(
|
||||||
game_id=uuid4(),
|
game_id=uuid4(),
|
||||||
league_id='sba',
|
league_id='sba',
|
||||||
home_team_id=1,
|
home_team_id=1,
|
||||||
away_team_id=2,
|
away_team_id=2,
|
||||||
current_batter_lineup_id=1
|
|
||||||
|
current_batter=mock_batter
|
||||||
|
|
||||||
)
|
)
|
||||||
state.outs = 0
|
state.outs = 0
|
||||||
|
|
||||||
@ -785,12 +812,18 @@ class TestXCheckPlaceholders:
|
|||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
|
|
||||||
# Create GameState (not used for error case, but required by signature)
|
# Create GameState (not used for error case, but required by signature)
|
||||||
|
from app.models.game_models import LineupPlayerState
|
||||||
|
|
||||||
|
mock_batter = LineupPlayerState(lineup_id=1, card_id=100, position='CF', batting_order=1)
|
||||||
|
|
||||||
state = GameState(
|
state = GameState(
|
||||||
game_id=uuid4(),
|
game_id=uuid4(),
|
||||||
league_id='sba',
|
league_id='sba',
|
||||||
home_team_id=1,
|
home_team_id=1,
|
||||||
away_team_id=2,
|
away_team_id=2,
|
||||||
current_batter_lineup_id=1
|
|
||||||
|
current_batter=mock_batter
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
result = x_check_f2(
|
result = x_check_f2(
|
||||||
@ -812,12 +845,18 @@ class TestXCheckPlaceholders:
|
|||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
|
|
||||||
# Create GameState (not used for error case, but required by signature)
|
# Create GameState (not used for error case, but required by signature)
|
||||||
|
from app.models.game_models import LineupPlayerState
|
||||||
|
|
||||||
|
mock_batter = LineupPlayerState(lineup_id=1, card_id=100, position='CF', batting_order=1)
|
||||||
|
|
||||||
state = GameState(
|
state = GameState(
|
||||||
game_id=uuid4(),
|
game_id=uuid4(),
|
||||||
league_id='sba',
|
league_id='sba',
|
||||||
home_team_id=1,
|
home_team_id=1,
|
||||||
away_team_id=2,
|
away_team_id=2,
|
||||||
current_batter_lineup_id=1
|
|
||||||
|
current_batter=mock_batter
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
result = x_check_f3(
|
result = x_check_f3(
|
||||||
@ -839,12 +878,18 @@ class TestXCheckPlaceholders:
|
|||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
|
|
||||||
# Create GameState
|
# Create GameState
|
||||||
|
from app.models.game_models import LineupPlayerState
|
||||||
|
|
||||||
|
mock_batter = LineupPlayerState(lineup_id=1, card_id=100, position='CF', batting_order=1)
|
||||||
|
|
||||||
state = GameState(
|
state = GameState(
|
||||||
game_id=uuid4(),
|
game_id=uuid4(),
|
||||||
league_id='sba',
|
league_id='sba',
|
||||||
home_team_id=1,
|
home_team_id=1,
|
||||||
away_team_id=2,
|
away_team_id=2,
|
||||||
current_batter_lineup_id=1
|
|
||||||
|
current_batter=mock_batter
|
||||||
|
|
||||||
)
|
)
|
||||||
state.outs = 0
|
state.outs = 0
|
||||||
|
|
||||||
@ -883,12 +928,18 @@ class TestXCheckPlaceholders:
|
|||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
|
|
||||||
# Create GameState
|
# Create GameState
|
||||||
|
from app.models.game_models import LineupPlayerState
|
||||||
|
|
||||||
|
mock_batter = LineupPlayerState(lineup_id=1, card_id=100, position='CF', batting_order=1)
|
||||||
|
|
||||||
state = GameState(
|
state = GameState(
|
||||||
game_id=uuid4(),
|
game_id=uuid4(),
|
||||||
league_id='sba',
|
league_id='sba',
|
||||||
home_team_id=1,
|
home_team_id=1,
|
||||||
away_team_id=2,
|
away_team_id=2,
|
||||||
current_batter_lineup_id=1
|
|
||||||
|
current_batter=mock_batter
|
||||||
|
|
||||||
)
|
)
|
||||||
state.outs = 0
|
state.outs = 0
|
||||||
|
|
||||||
@ -915,12 +966,18 @@ class TestXCheckPlaceholders:
|
|||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
|
|
||||||
# Create GameState
|
# Create GameState
|
||||||
|
from app.models.game_models import LineupPlayerState
|
||||||
|
|
||||||
|
mock_batter = LineupPlayerState(lineup_id=1, card_id=100, position='CF', batting_order=1)
|
||||||
|
|
||||||
state = GameState(
|
state = GameState(
|
||||||
game_id=uuid4(),
|
game_id=uuid4(),
|
||||||
league_id='sba',
|
league_id='sba',
|
||||||
home_team_id=1,
|
home_team_id=1,
|
||||||
away_team_id=2,
|
away_team_id=2,
|
||||||
current_batter_lineup_id=1
|
|
||||||
|
current_batter=mock_batter
|
||||||
|
|
||||||
)
|
)
|
||||||
state.outs = 0
|
state.outs = 0
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user