This commit is contained in:
Trey t
2026-01-19 23:53:37 -06:00
parent 19dd1791f1
commit 11adfc10dd
8 changed files with 126 additions and 42 deletions

View File

@@ -53,7 +53,7 @@ def generate_game_id(
) -> str:
"""Generate a canonical game ID.
Format: {sport}_{season}_{away}_{home}_{MMDD}[_{game_number}]
Format: game_{sport}_{season}_{YYYYMMDD}_{away}_{home}[_{game_number}]
Args:
sport: Sport code (e.g., 'nba', 'mlb')
@@ -64,27 +64,27 @@ def generate_game_id(
game_number: Game number for doubleheaders (1 or 2), None for single games
Returns:
Canonical game ID (e.g., 'nba_2025_hou_okc_1021')
Canonical game ID (e.g., 'game_nba_2025_20251021_hou_okc')
Examples:
>>> generate_game_id('nba', 2025, 'HOU', 'OKC', date(2025, 10, 21))
'nba_2025_hou_okc_1021'
'game_nba_2025_20251021_hou_okc'
>>> generate_game_id('mlb', 2026, 'NYY', 'BOS', date(2026, 4, 1), game_number=1)
'mlb_2026_nyy_bos_0401_1'
'game_mlb_2026_20260401_nyy_bos_1'
"""
# Normalize sport and abbreviations
sport_norm = sport.lower()
away_norm = away_abbrev.lower()
home_norm = home_abbrev.lower()
# Format date as MMDD
# Format date as YYYYMMDD
if isinstance(game_date, datetime):
game_date = game_date.date()
date_str = game_date.strftime("%m%d")
date_str = game_date.strftime("%Y%m%d")
# Build ID
parts = [sport_norm, str(season), away_norm, home_norm, date_str]
# Build ID with game_ prefix
parts = ["game", sport_norm, str(season), date_str, away_norm, home_norm]
# Add game number for doubleheaders
if game_number is not None:
@@ -177,50 +177,55 @@ def parse_game_id(game_id: str) -> dict:
"""Parse a canonical game ID into its components.
Args:
game_id: Canonical game ID (e.g., 'nba_2025_hou_okc_1021')
game_id: Canonical game ID (e.g., 'game_nba_2025_20251021_hou_okc')
Returns:
Dictionary with keys: sport, season, away_abbrev, home_abbrev,
month, day, game_number (optional)
year, month, day, game_number (optional)
Raises:
ValueError: If game_id format is invalid
Examples:
>>> parse_game_id('nba_2025_hou_okc_1021')
>>> parse_game_id('game_nba_2025_20251021_hou_okc')
{'sport': 'nba', 'season': 2025, 'away_abbrev': 'hou',
'home_abbrev': 'okc', 'month': 10, 'day': 21, 'game_number': None}
'home_abbrev': 'okc', 'year': 2025, 'month': 10, 'day': 21, 'game_number': None}
>>> parse_game_id('mlb_2026_nyy_bos_0401_1')
>>> parse_game_id('game_mlb_2026_20260401_nyy_bos_1')
{'sport': 'mlb', 'season': 2026, 'away_abbrev': 'nyy',
'home_abbrev': 'bos', 'month': 4, 'day': 1, 'game_number': 1}
'home_abbrev': 'bos', 'year': 2026, 'month': 4, 'day': 1, 'game_number': 1}
"""
parts = game_id.split("_")
if len(parts) < 5 or len(parts) > 6:
if len(parts) < 6 or len(parts) > 7:
raise ValueError(f"Invalid game ID format: {game_id}")
sport = parts[0]
season = int(parts[1])
away_abbrev = parts[2]
home_abbrev = parts[3]
date_str = parts[4]
if parts[0] != "game":
raise ValueError(f"Game ID must start with 'game_': {game_id}")
if len(date_str) != 4:
sport = parts[1]
season = int(parts[2])
date_str = parts[3]
away_abbrev = parts[4]
home_abbrev = parts[5]
if len(date_str) != 8:
raise ValueError(f"Invalid date format in game ID: {game_id}")
month = int(date_str[:2])
day = int(date_str[2:])
year = int(date_str[:4])
month = int(date_str[4:6])
day = int(date_str[6:])
game_number = None
if len(parts) == 6:
game_number = int(parts[5])
if len(parts) == 7:
game_number = int(parts[6])
return {
"sport": sport,
"season": season,
"away_abbrev": away_abbrev,
"home_abbrev": home_abbrev,
"year": year,
"month": month,
"day": day,
"game_number": game_number,