wip
This commit is contained in:
@@ -17,7 +17,8 @@
|
||||
"Bash(xargs basename:*)",
|
||||
"Bash(python -m sportstime_parser:*)",
|
||||
"Bash(python -m py_compile:*)",
|
||||
"WebFetch(domain:en.wikipedia.org)"
|
||||
"WebFetch(domain:en.wikipedia.org)",
|
||||
"Bash(tree:*)"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,15 @@ from .aliases import (
|
||||
FuzzyMatch,
|
||||
ManualReviewItem,
|
||||
)
|
||||
from .sport import (
|
||||
Sport,
|
||||
LeagueStructure,
|
||||
LeagueStructureType,
|
||||
save_sports,
|
||||
load_sports,
|
||||
save_league_structures,
|
||||
load_league_structures,
|
||||
)
|
||||
|
||||
__all__ = [
|
||||
# Game
|
||||
@@ -32,4 +41,12 @@ __all__ = [
|
||||
"StadiumAlias",
|
||||
"FuzzyMatch",
|
||||
"ManualReviewItem",
|
||||
# Sport and League Structure
|
||||
"Sport",
|
||||
"LeagueStructure",
|
||||
"LeagueStructureType",
|
||||
"save_sports",
|
||||
"load_sports",
|
||||
"save_league_structures",
|
||||
"load_league_structures",
|
||||
]
|
||||
|
||||
157
Scripts/sportstime_parser/models/sport.py
Normal file
157
Scripts/sportstime_parser/models/sport.py
Normal file
@@ -0,0 +1,157 @@
|
||||
"""Sport and LeagueStructure data models for sportstime-parser."""
|
||||
|
||||
from dataclasses import dataclass
|
||||
from enum import Enum
|
||||
from typing import Optional
|
||||
import json
|
||||
|
||||
|
||||
class LeagueStructureType(str, Enum):
|
||||
"""Type of league structure element."""
|
||||
CONFERENCE = "conference"
|
||||
DIVISION = "division"
|
||||
LEAGUE = "league"
|
||||
|
||||
|
||||
@dataclass
|
||||
class Sport:
|
||||
"""Represents a sport with all CloudKit fields.
|
||||
|
||||
Attributes:
|
||||
id: Canonical sport ID (e.g., 'MLB', 'NBA')
|
||||
abbreviation: Sport abbreviation (e.g., 'MLB', 'NBA')
|
||||
display_name: Full display name (e.g., 'Major League Baseball')
|
||||
icon_name: SF Symbol name for the sport icon
|
||||
color_hex: Primary color as hex string (e.g., '#FF0000')
|
||||
season_start_month: Month number when season typically starts (1-12)
|
||||
season_end_month: Month number when season typically ends (1-12)
|
||||
is_active: Whether the sport is currently active/supported
|
||||
"""
|
||||
|
||||
id: str
|
||||
abbreviation: str
|
||||
display_name: str
|
||||
icon_name: str
|
||||
color_hex: str
|
||||
season_start_month: int
|
||||
season_end_month: int
|
||||
is_active: bool = True
|
||||
|
||||
def to_dict(self) -> dict:
|
||||
"""Convert to dictionary for JSON serialization."""
|
||||
return {
|
||||
"id": self.id,
|
||||
"abbreviation": self.abbreviation,
|
||||
"display_name": self.display_name,
|
||||
"icon_name": self.icon_name,
|
||||
"color_hex": self.color_hex,
|
||||
"season_start_month": self.season_start_month,
|
||||
"season_end_month": self.season_end_month,
|
||||
"is_active": self.is_active,
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, data: dict) -> "Sport":
|
||||
"""Create a Sport from a dictionary."""
|
||||
return cls(
|
||||
id=data["id"],
|
||||
abbreviation=data["abbreviation"],
|
||||
display_name=data["display_name"],
|
||||
icon_name=data["icon_name"],
|
||||
color_hex=data["color_hex"],
|
||||
season_start_month=data["season_start_month"],
|
||||
season_end_month=data["season_end_month"],
|
||||
is_active=data.get("is_active", True),
|
||||
)
|
||||
|
||||
def to_json(self) -> str:
|
||||
"""Serialize to JSON string."""
|
||||
return json.dumps(self.to_dict(), indent=2)
|
||||
|
||||
@classmethod
|
||||
def from_json(cls, json_str: str) -> "Sport":
|
||||
"""Deserialize from JSON string."""
|
||||
return cls.from_dict(json.loads(json_str))
|
||||
|
||||
|
||||
@dataclass
|
||||
class LeagueStructure:
|
||||
"""Represents a league structure element (conference, division, etc.).
|
||||
|
||||
Attributes:
|
||||
id: Unique ID (e.g., 'nba_eastern', 'mlb_al_east')
|
||||
sport: Sport code (e.g., 'NBA', 'MLB')
|
||||
structure_type: Type of structure (conference, division, league)
|
||||
name: Full name (e.g., 'Eastern Conference', 'AL East')
|
||||
abbreviation: Optional abbreviation (e.g., 'East', 'ALE')
|
||||
parent_id: Parent structure ID (e.g., division's parent is conference)
|
||||
display_order: Order for display (0-indexed)
|
||||
"""
|
||||
|
||||
id: str
|
||||
sport: str
|
||||
structure_type: LeagueStructureType
|
||||
name: str
|
||||
abbreviation: Optional[str] = None
|
||||
parent_id: Optional[str] = None
|
||||
display_order: int = 0
|
||||
|
||||
def to_dict(self) -> dict:
|
||||
"""Convert to dictionary for JSON serialization."""
|
||||
return {
|
||||
"id": self.id,
|
||||
"sport": self.sport,
|
||||
"structure_type": self.structure_type.value,
|
||||
"name": self.name,
|
||||
"abbreviation": self.abbreviation,
|
||||
"parent_id": self.parent_id,
|
||||
"display_order": self.display_order,
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, data: dict) -> "LeagueStructure":
|
||||
"""Create a LeagueStructure from a dictionary."""
|
||||
return cls(
|
||||
id=data["id"],
|
||||
sport=data["sport"],
|
||||
structure_type=LeagueStructureType(data["structure_type"]),
|
||||
name=data["name"],
|
||||
abbreviation=data.get("abbreviation"),
|
||||
parent_id=data.get("parent_id"),
|
||||
display_order=data.get("display_order", 0),
|
||||
)
|
||||
|
||||
def to_json(self) -> str:
|
||||
"""Serialize to JSON string."""
|
||||
return json.dumps(self.to_dict(), indent=2)
|
||||
|
||||
@classmethod
|
||||
def from_json(cls, json_str: str) -> "LeagueStructure":
|
||||
"""Deserialize from JSON string."""
|
||||
return cls.from_dict(json.loads(json_str))
|
||||
|
||||
|
||||
def save_sports(sports: list[Sport], filepath: str) -> None:
|
||||
"""Save a list of sports to a JSON file."""
|
||||
with open(filepath, "w", encoding="utf-8") as f:
|
||||
json.dump([s.to_dict() for s in sports], f, indent=2)
|
||||
|
||||
|
||||
def load_sports(filepath: str) -> list[Sport]:
|
||||
"""Load a list of sports from a JSON file."""
|
||||
with open(filepath, "r", encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
return [Sport.from_dict(d) for d in data]
|
||||
|
||||
|
||||
def save_league_structures(structures: list[LeagueStructure], filepath: str) -> None:
|
||||
"""Save a list of league structures to a JSON file."""
|
||||
with open(filepath, "w", encoding="utf-8") as f:
|
||||
json.dump([s.to_dict() for s in structures], f, indent=2)
|
||||
|
||||
|
||||
def load_league_structures(filepath: str) -> list[LeagueStructure]:
|
||||
"""Load a list of league structures from a JSON file."""
|
||||
with open(filepath, "r", encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
return [LeagueStructure.from_dict(d) for d in data]
|
||||
@@ -33,12 +33,20 @@ from ..utils.logging import get_logger
|
||||
|
||||
|
||||
class RecordType(str, Enum):
|
||||
"""CloudKit record types for SportsTime."""
|
||||
"""CloudKit record types for SportsTime.
|
||||
|
||||
Must match CKRecordType constants in CKModels.swift.
|
||||
"""
|
||||
GAME = "Game"
|
||||
TEAM = "Team"
|
||||
STADIUM = "Stadium"
|
||||
TEAM_ALIAS = "TeamAlias"
|
||||
STADIUM_ALIAS = "StadiumAlias"
|
||||
SPORT = "Sport"
|
||||
LEAGUE_STRUCTURE = "LeagueStructure"
|
||||
TRIP_POLL = "TripPoll"
|
||||
POLL_VOTE = "PollVote"
|
||||
ITINERARY_ITEM = "ItineraryItem"
|
||||
|
||||
|
||||
@dataclass
|
||||
|
||||
@@ -2,19 +2,44 @@
|
||||
|
||||
This module compares local records with CloudKit records to determine
|
||||
what needs to be created, updated, or deleted.
|
||||
|
||||
Field names must match CKModels.swift exactly:
|
||||
- Stadium: stadiumId, canonicalId, name, city, state, location (CLLocation),
|
||||
capacity, yearOpened, imageURL, sport
|
||||
- Team: teamId, canonicalId, name, abbreviation, sport, city, stadiumCanonicalId,
|
||||
logoURL, primaryColor, secondaryColor
|
||||
- Game: gameId, canonicalId, homeTeamCanonicalId, awayTeamCanonicalId,
|
||||
stadiumCanonicalId, dateTime, sport, season, isPlayoff, broadcastInfo
|
||||
- TeamAlias: aliasId, teamCanonicalId, aliasType, aliasValue, validFrom, validUntil
|
||||
- StadiumAlias: aliasName, stadiumCanonicalId, validFrom, validUntil
|
||||
- Sport: sportId, abbreviation, displayName, iconName, colorHex,
|
||||
seasonStartMonth, seasonEndMonth, isActive
|
||||
- LeagueStructure: structureId, sport, type, name, abbreviation, parentId, displayOrder
|
||||
"""
|
||||
|
||||
from dataclasses import dataclass, field
|
||||
from datetime import datetime
|
||||
from datetime import datetime, date
|
||||
from enum import Enum
|
||||
from typing import Any, Optional
|
||||
|
||||
from ..models.game import Game
|
||||
from ..models.team import Team
|
||||
from ..models.stadium import Stadium
|
||||
from ..models.aliases import TeamAlias, StadiumAlias, AliasType
|
||||
from ..models.sport import Sport, LeagueStructure
|
||||
from .cloudkit import CloudKitRecord, RecordType
|
||||
|
||||
|
||||
def _date_to_datetime(d: Optional[date]) -> Optional[datetime]:
|
||||
"""Convert a date to a datetime at midnight UTC.
|
||||
|
||||
CloudKit TIMESTAMP fields require datetime, not date.
|
||||
"""
|
||||
if d is None:
|
||||
return None
|
||||
return datetime(d.year, d.month, d.day, 0, 0, 0)
|
||||
|
||||
|
||||
class DiffAction(str, Enum):
|
||||
"""Action to take for a record."""
|
||||
CREATE = "create"
|
||||
@@ -98,24 +123,45 @@ class DiffResult:
|
||||
|
||||
|
||||
class RecordDiffer:
|
||||
"""Compares local records with CloudKit records."""
|
||||
"""Compares local records with CloudKit records.
|
||||
|
||||
# Fields to compare for each record type
|
||||
Field names must match CKModels.swift field keys exactly (camelCase).
|
||||
"""
|
||||
|
||||
# Fields to compare for each record type (matching CKModels.swift keys)
|
||||
GAME_FIELDS = [
|
||||
"sport", "season", "home_team_id", "away_team_id", "stadium_id",
|
||||
"game_date", "game_number", "home_score", "away_score", "status",
|
||||
"gameId", "canonicalId", "sport", "season", "dateTime",
|
||||
"homeTeamCanonicalId", "awayTeamCanonicalId", "stadiumCanonicalId",
|
||||
"isPlayoff", "broadcastInfo",
|
||||
]
|
||||
|
||||
TEAM_FIELDS = [
|
||||
"sport", "city", "name", "full_name", "abbreviation",
|
||||
"conference", "division", "primary_color", "secondary_color",
|
||||
"logo_url", "stadium_id",
|
||||
"teamId", "canonicalId", "sport", "city", "name", "abbreviation",
|
||||
"stadiumCanonicalId", "logoURL", "primaryColor", "secondaryColor",
|
||||
]
|
||||
|
||||
STADIUM_FIELDS = [
|
||||
"sport", "name", "city", "state", "country",
|
||||
"latitude", "longitude", "capacity", "surface",
|
||||
"roof_type", "opened_year", "image_url", "timezone",
|
||||
"stadiumId", "canonicalId", "sport", "name", "city", "state",
|
||||
"location", "capacity", "yearOpened", "imageURL",
|
||||
]
|
||||
|
||||
TEAM_ALIAS_FIELDS = [
|
||||
"aliasId", "teamCanonicalId", "aliasType", "aliasValue",
|
||||
"validFrom", "validUntil",
|
||||
]
|
||||
|
||||
STADIUM_ALIAS_FIELDS = [
|
||||
"aliasName", "stadiumCanonicalId", "validFrom", "validUntil",
|
||||
]
|
||||
|
||||
SPORT_FIELDS = [
|
||||
"sportId", "abbreviation", "displayName", "iconName",
|
||||
"colorHex", "seasonStartMonth", "seasonEndMonth", "isActive",
|
||||
]
|
||||
|
||||
LEAGUE_STRUCTURE_FIELDS = [
|
||||
"structureId", "sport", "type", "name", "abbreviation",
|
||||
"parentId", "displayOrder",
|
||||
]
|
||||
|
||||
def diff_games(
|
||||
@@ -184,6 +230,94 @@ class RecordDiffer:
|
||||
self.STADIUM_FIELDS,
|
||||
)
|
||||
|
||||
def diff_team_aliases(
|
||||
self,
|
||||
local_aliases: list[TeamAlias],
|
||||
remote_records: list[dict],
|
||||
) -> DiffResult:
|
||||
"""Diff local team aliases against remote CloudKit records.
|
||||
|
||||
Args:
|
||||
local_aliases: List of local TeamAlias objects
|
||||
remote_records: List of remote record dictionaries
|
||||
|
||||
Returns:
|
||||
DiffResult with creates, updates, deletes
|
||||
"""
|
||||
local_records = [self._team_alias_to_record(a) for a in local_aliases]
|
||||
return self._diff_records(
|
||||
local_records,
|
||||
remote_records,
|
||||
RecordType.TEAM_ALIAS,
|
||||
self.TEAM_ALIAS_FIELDS,
|
||||
)
|
||||
|
||||
def diff_stadium_aliases(
|
||||
self,
|
||||
local_aliases: list[StadiumAlias],
|
||||
remote_records: list[dict],
|
||||
) -> DiffResult:
|
||||
"""Diff local stadium aliases against remote CloudKit records.
|
||||
|
||||
Args:
|
||||
local_aliases: List of local StadiumAlias objects
|
||||
remote_records: List of remote record dictionaries
|
||||
|
||||
Returns:
|
||||
DiffResult with creates, updates, deletes
|
||||
"""
|
||||
local_records = [self._stadium_alias_to_record(a) for a in local_aliases]
|
||||
return self._diff_records(
|
||||
local_records,
|
||||
remote_records,
|
||||
RecordType.STADIUM_ALIAS,
|
||||
self.STADIUM_ALIAS_FIELDS,
|
||||
)
|
||||
|
||||
def diff_sports(
|
||||
self,
|
||||
local_sports: list[Sport],
|
||||
remote_records: list[dict],
|
||||
) -> DiffResult:
|
||||
"""Diff local sports against remote CloudKit records.
|
||||
|
||||
Args:
|
||||
local_sports: List of local Sport objects
|
||||
remote_records: List of remote record dictionaries
|
||||
|
||||
Returns:
|
||||
DiffResult with creates, updates, deletes
|
||||
"""
|
||||
local_records = [self._sport_to_record(s) for s in local_sports]
|
||||
return self._diff_records(
|
||||
local_records,
|
||||
remote_records,
|
||||
RecordType.SPORT,
|
||||
self.SPORT_FIELDS,
|
||||
)
|
||||
|
||||
def diff_league_structures(
|
||||
self,
|
||||
local_structures: list[LeagueStructure],
|
||||
remote_records: list[dict],
|
||||
) -> DiffResult:
|
||||
"""Diff local league structures against remote CloudKit records.
|
||||
|
||||
Args:
|
||||
local_structures: List of local LeagueStructure objects
|
||||
remote_records: List of remote record dictionaries
|
||||
|
||||
Returns:
|
||||
DiffResult with creates, updates, deletes
|
||||
"""
|
||||
local_records = [self._league_structure_to_record(s) for s in local_structures]
|
||||
return self._diff_records(
|
||||
local_records,
|
||||
remote_records,
|
||||
RecordType.LEAGUE_STRUCTURE,
|
||||
self.LEAGUE_STRUCTURE_FIELDS,
|
||||
)
|
||||
|
||||
def _diff_records(
|
||||
self,
|
||||
local_records: list[CloudKitRecord],
|
||||
@@ -337,63 +471,206 @@ class RecordDiffer:
|
||||
return value
|
||||
|
||||
def _game_to_record(self, game: Game) -> CloudKitRecord:
|
||||
"""Convert a Game to a CloudKitRecord."""
|
||||
"""Convert a Game to a CloudKitRecord.
|
||||
|
||||
Field names match CKGame keys in CKModels.swift:
|
||||
- gameId, canonicalId: Unique identifiers
|
||||
- homeTeamCanonicalId, awayTeamCanonicalId, stadiumCanonicalId: References as strings
|
||||
- dateTime: Game time as datetime (will be converted to TIMESTAMP)
|
||||
- sport: Sport code uppercase (e.g., "MLB")
|
||||
- season: Season string (e.g., "2025-26" or "2026")
|
||||
- isPlayoff: Boolean as int (1 or 0)
|
||||
- broadcastInfo: Optional broadcast network string
|
||||
"""
|
||||
# Format season as string
|
||||
sport_lower = game.sport.lower()
|
||||
if sport_lower in ("nba", "nhl"):
|
||||
season_str = f"{game.season}-{str(game.season + 1)[-2:]}"
|
||||
else:
|
||||
season_str = str(game.season)
|
||||
|
||||
return CloudKitRecord(
|
||||
record_name=game.id,
|
||||
record_type=RecordType.GAME,
|
||||
fields={
|
||||
"sport": game.sport,
|
||||
"season": game.season,
|
||||
"home_team_id": game.home_team_id,
|
||||
"away_team_id": game.away_team_id,
|
||||
"stadium_id": game.stadium_id,
|
||||
"game_date": game.game_date,
|
||||
"game_number": game.game_number,
|
||||
"home_score": game.home_score,
|
||||
"away_score": game.away_score,
|
||||
"status": game.status,
|
||||
"gameId": game.id,
|
||||
"canonicalId": game.id,
|
||||
"sport": game.sport.upper(),
|
||||
"season": season_str,
|
||||
"dateTime": game.game_date,
|
||||
"homeTeamCanonicalId": game.home_team_id,
|
||||
"awayTeamCanonicalId": game.away_team_id,
|
||||
"stadiumCanonicalId": game.stadium_id,
|
||||
"isPlayoff": False, # Default, can be overridden
|
||||
"broadcastInfo": None, # Default, can be overridden
|
||||
},
|
||||
)
|
||||
|
||||
def _team_to_record(self, team: Team) -> CloudKitRecord:
|
||||
"""Convert a Team to a CloudKitRecord."""
|
||||
"""Convert a Team to a CloudKitRecord.
|
||||
|
||||
Field names match CKTeam keys in CKModels.swift:
|
||||
- teamId, canonicalId: Unique identifiers
|
||||
- name, abbreviation, city: Team info
|
||||
- sport: Sport code uppercase (e.g., "NBA")
|
||||
- stadiumCanonicalId: Home stadium canonical ID string
|
||||
- logoURL: URL string for team logo
|
||||
- primaryColor, secondaryColor: Hex color strings
|
||||
"""
|
||||
return CloudKitRecord(
|
||||
record_name=team.id,
|
||||
record_type=RecordType.TEAM,
|
||||
fields={
|
||||
"sport": team.sport,
|
||||
"teamId": team.id,
|
||||
"canonicalId": team.id,
|
||||
"sport": team.sport.upper(),
|
||||
"city": team.city,
|
||||
"name": team.name,
|
||||
"full_name": team.full_name,
|
||||
"abbreviation": team.abbreviation,
|
||||
"conference": team.conference,
|
||||
"division": team.division,
|
||||
"primary_color": team.primary_color,
|
||||
"secondary_color": team.secondary_color,
|
||||
"logo_url": team.logo_url,
|
||||
"stadium_id": team.stadium_id,
|
||||
"stadiumCanonicalId": team.stadium_id,
|
||||
"logoURL": team.logo_url,
|
||||
"primaryColor": team.primary_color,
|
||||
"secondaryColor": team.secondary_color,
|
||||
},
|
||||
)
|
||||
|
||||
def _stadium_to_record(self, stadium: Stadium) -> CloudKitRecord:
|
||||
"""Convert a Stadium to a CloudKitRecord."""
|
||||
"""Convert a Stadium to a CloudKitRecord.
|
||||
|
||||
Field names match CKStadium keys in CKModels.swift:
|
||||
- stadiumId, canonicalId: Unique identifiers
|
||||
- name, city, state: Location info
|
||||
- location: CloudKit LOCATION type with latitude/longitude
|
||||
- capacity: Seating capacity as int
|
||||
- yearOpened: Year opened as int
|
||||
- imageURL: URL string for stadium image
|
||||
- sport: Sport code uppercase (e.g., "MLB")
|
||||
"""
|
||||
return CloudKitRecord(
|
||||
record_name=stadium.id,
|
||||
record_type=RecordType.STADIUM,
|
||||
fields={
|
||||
"sport": stadium.sport,
|
||||
"stadiumId": stadium.id,
|
||||
"canonicalId": stadium.id,
|
||||
"sport": stadium.sport.upper(),
|
||||
"name": stadium.name,
|
||||
"city": stadium.city,
|
||||
"state": stadium.state,
|
||||
"country": stadium.country,
|
||||
"latitude": stadium.latitude,
|
||||
"longitude": stadium.longitude,
|
||||
# CloudKit LOCATION type expects dict with latitude/longitude
|
||||
"location": {
|
||||
"latitude": stadium.latitude,
|
||||
"longitude": stadium.longitude,
|
||||
},
|
||||
"capacity": stadium.capacity,
|
||||
"surface": stadium.surface,
|
||||
"roof_type": stadium.roof_type,
|
||||
"opened_year": stadium.opened_year,
|
||||
"image_url": stadium.image_url,
|
||||
"timezone": stadium.timezone,
|
||||
"yearOpened": stadium.opened_year,
|
||||
"imageURL": stadium.image_url,
|
||||
},
|
||||
)
|
||||
|
||||
def _team_alias_to_record(self, alias: TeamAlias) -> CloudKitRecord:
|
||||
"""Convert a TeamAlias to a CloudKitRecord.
|
||||
|
||||
Field names match CKTeamAlias keys in CKModels.swift:
|
||||
- aliasId: Unique identifier
|
||||
- teamCanonicalId: The canonical team this alias resolves to
|
||||
- aliasType: Type of alias ("abbreviation", "name", "city")
|
||||
- aliasValue: The alias value to match
|
||||
- validFrom, validUntil: Optional date bounds
|
||||
- schemaVersion, lastModified: Versioning fields
|
||||
"""
|
||||
return CloudKitRecord(
|
||||
record_name=alias.id,
|
||||
record_type=RecordType.TEAM_ALIAS,
|
||||
fields={
|
||||
"aliasId": alias.id,
|
||||
"teamCanonicalId": alias.team_canonical_id,
|
||||
"aliasType": alias.alias_type.value,
|
||||
"aliasValue": alias.alias_value,
|
||||
"validFrom": _date_to_datetime(alias.valid_from),
|
||||
"validUntil": _date_to_datetime(alias.valid_until),
|
||||
"schemaVersion": 1,
|
||||
"lastModified": datetime.utcnow(),
|
||||
},
|
||||
)
|
||||
|
||||
def _stadium_alias_to_record(self, alias: StadiumAlias) -> CloudKitRecord:
|
||||
"""Convert a StadiumAlias to a CloudKitRecord.
|
||||
|
||||
Field names match CKStadiumAlias keys in CKModels.swift:
|
||||
- aliasName: The alias name (used as record name/primary key)
|
||||
- stadiumCanonicalId: The canonical stadium this alias resolves to
|
||||
- validFrom, validUntil: Optional date bounds
|
||||
- schemaVersion, lastModified: Versioning fields
|
||||
"""
|
||||
return CloudKitRecord(
|
||||
record_name=alias.alias_name.lower(),
|
||||
record_type=RecordType.STADIUM_ALIAS,
|
||||
fields={
|
||||
"aliasName": alias.alias_name.lower(),
|
||||
"stadiumCanonicalId": alias.stadium_canonical_id,
|
||||
"validFrom": _date_to_datetime(alias.valid_from),
|
||||
"validUntil": _date_to_datetime(alias.valid_until),
|
||||
"schemaVersion": 1,
|
||||
"lastModified": datetime.utcnow(),
|
||||
},
|
||||
)
|
||||
|
||||
def _sport_to_record(self, sport: Sport) -> CloudKitRecord:
|
||||
"""Convert a Sport to a CloudKitRecord.
|
||||
|
||||
Field names match CKSport keys in CKModels.swift:
|
||||
- sportId: Unique identifier (e.g., 'MLB', 'NBA')
|
||||
- abbreviation: Sport abbreviation
|
||||
- displayName: Full display name
|
||||
- iconName: SF Symbol name
|
||||
- colorHex: Primary color as hex string
|
||||
- seasonStartMonth, seasonEndMonth: Season boundary months (1-12)
|
||||
- isActive: Whether sport is currently supported
|
||||
- schemaVersion, lastModified: Versioning fields
|
||||
"""
|
||||
return CloudKitRecord(
|
||||
record_name=sport.id,
|
||||
record_type=RecordType.SPORT,
|
||||
fields={
|
||||
"sportId": sport.id,
|
||||
"abbreviation": sport.abbreviation,
|
||||
"displayName": sport.display_name,
|
||||
"iconName": sport.icon_name,
|
||||
"colorHex": sport.color_hex,
|
||||
"seasonStartMonth": sport.season_start_month,
|
||||
"seasonEndMonth": sport.season_end_month,
|
||||
"isActive": sport.is_active,
|
||||
"schemaVersion": 1,
|
||||
"lastModified": datetime.utcnow(),
|
||||
},
|
||||
)
|
||||
|
||||
def _league_structure_to_record(self, structure: LeagueStructure) -> CloudKitRecord:
|
||||
"""Convert a LeagueStructure to a CloudKitRecord.
|
||||
|
||||
Field names match CKLeagueStructure keys in CKModels.swift:
|
||||
- structureId: Unique identifier (e.g., 'nba_eastern', 'mlb_al_east')
|
||||
- sport: Sport code (e.g., 'NBA', 'MLB')
|
||||
- type: Structure type ('conference', 'division', 'league')
|
||||
- name: Full name
|
||||
- abbreviation: Optional abbreviation
|
||||
- parentId: Parent structure ID (e.g., division's parent is conference)
|
||||
- displayOrder: Order for display (0-indexed)
|
||||
- schemaVersion, lastModified: Versioning fields
|
||||
"""
|
||||
return CloudKitRecord(
|
||||
record_name=structure.id,
|
||||
record_type=RecordType.LEAGUE_STRUCTURE,
|
||||
fields={
|
||||
"structureId": structure.id,
|
||||
"sport": structure.sport.upper(),
|
||||
"type": structure.structure_type.value,
|
||||
"name": structure.name,
|
||||
"abbreviation": structure.abbreviation,
|
||||
"parentId": structure.parent_id,
|
||||
"displayOrder": structure.display_order,
|
||||
"schemaVersion": 1,
|
||||
"lastModified": datetime.utcnow(),
|
||||
},
|
||||
)
|
||||
|
||||
@@ -423,3 +700,39 @@ def stadium_to_cloudkit_record(stadium: Stadium) -> CloudKitRecord:
|
||||
"""
|
||||
differ = RecordDiffer()
|
||||
return differ._stadium_to_record(stadium)
|
||||
|
||||
|
||||
def team_alias_to_cloudkit_record(alias: TeamAlias) -> CloudKitRecord:
|
||||
"""Convert a TeamAlias to a CloudKitRecord.
|
||||
|
||||
Convenience function for external use.
|
||||
"""
|
||||
differ = RecordDiffer()
|
||||
return differ._team_alias_to_record(alias)
|
||||
|
||||
|
||||
def stadium_alias_to_cloudkit_record(alias: StadiumAlias) -> CloudKitRecord:
|
||||
"""Convert a StadiumAlias to a CloudKitRecord.
|
||||
|
||||
Convenience function for external use.
|
||||
"""
|
||||
differ = RecordDiffer()
|
||||
return differ._stadium_alias_to_record(alias)
|
||||
|
||||
|
||||
def sport_to_cloudkit_record(sport: Sport) -> CloudKitRecord:
|
||||
"""Convert a Sport to a CloudKitRecord.
|
||||
|
||||
Convenience function for external use.
|
||||
"""
|
||||
differ = RecordDiffer()
|
||||
return differ._sport_to_record(sport)
|
||||
|
||||
|
||||
def league_structure_to_cloudkit_record(structure: LeagueStructure) -> CloudKitRecord:
|
||||
"""Convert a LeagueStructure to a CloudKitRecord.
|
||||
|
||||
Convenience function for external use.
|
||||
"""
|
||||
differ = RecordDiffer()
|
||||
return differ._league_structure_to_record(structure)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
5769
data/games.csv
5769
data/games.csv
File diff suppressed because it is too large
Load Diff
@@ -1 +0,0 @@
|
||||
[]
|
||||
@@ -1,153 +0,0 @@
|
||||
id,name,city,state,latitude,longitude,capacity,sport,team_abbrevs,source,year_opened
|
||||
mlb_chase_field,Chase Field,Phoenix,AZ,33.4453,-112.0667,48519,MLB,['ARI'],mlb_hardcoded,1998
|
||||
mlb_truist_park,Truist Park,Atlanta,GA,33.8907,-84.4677,41084,MLB,['ATL'],mlb_hardcoded,2017
|
||||
mlb_oriole_park_at_camden_yards,Oriole Park at Camden Yards,Baltimore,MD,39.2839,-76.6216,44970,MLB,['BAL'],mlb_hardcoded,1992
|
||||
mlb_fenway_park,Fenway Park,Boston,MA,42.3467,-71.0972,37755,MLB,['BOS'],mlb_hardcoded,1912
|
||||
mlb_wrigley_field,Wrigley Field,Chicago,IL,41.9484,-87.6553,41649,MLB,['CHC'],mlb_hardcoded,1914
|
||||
mlb_guaranteed_rate_field,Guaranteed Rate Field,Chicago,IL,41.8299,-87.6338,40615,MLB,['CHW'],mlb_hardcoded,1991
|
||||
mlb_great_american_ball_park,Great American Ball Park,Cincinnati,OH,39.0979,-84.5082,42319,MLB,['CIN'],mlb_hardcoded,2003
|
||||
mlb_progressive_field,Progressive Field,Cleveland,OH,41.4958,-81.6853,34830,MLB,['CLE'],mlb_hardcoded,1994
|
||||
mlb_coors_field,Coors Field,Denver,CO,39.7559,-104.9942,50144,MLB,['COL'],mlb_hardcoded,1995
|
||||
mlb_comerica_park,Comerica Park,Detroit,MI,42.339,-83.0485,41083,MLB,['DET'],mlb_hardcoded,2000
|
||||
mlb_minute_maid_park,Minute Maid Park,Houston,TX,29.7573,-95.3555,41168,MLB,['HOU'],mlb_hardcoded,2000
|
||||
mlb_kauffman_stadium,Kauffman Stadium,Kansas City,MO,39.0517,-94.4803,37903,MLB,['KCR'],mlb_hardcoded,1973
|
||||
mlb_angel_stadium,Angel Stadium,Anaheim,CA,33.8003,-117.8827,45517,MLB,['LAA'],mlb_hardcoded,1966
|
||||
mlb_dodger_stadium,Dodger Stadium,Los Angeles,CA,34.0739,-118.24,56000,MLB,['LAD'],mlb_hardcoded,1962
|
||||
mlb_loandepot_park,LoanDepot Park,Miami,FL,25.7781,-80.2196,36742,MLB,['MIA'],mlb_hardcoded,2012
|
||||
mlb_american_family_field,American Family Field,Milwaukee,WI,43.028,-87.9712,41900,MLB,['MIL'],mlb_hardcoded,2001
|
||||
mlb_target_field,Target Field,Minneapolis,MN,44.9818,-93.2775,38544,MLB,['MIN'],mlb_hardcoded,2010
|
||||
mlb_citi_field,Citi Field,Queens,NY,40.7571,-73.8458,41922,MLB,['NYM'],mlb_hardcoded,2009
|
||||
mlb_yankee_stadium,Yankee Stadium,Bronx,NY,40.8296,-73.9262,46537,MLB,['NYY'],mlb_hardcoded,2009
|
||||
mlb_sutter_health_park,Sutter Health Park,Sacramento,CA,38.5803,-121.5108,14014,MLB,['OAK'],mlb_hardcoded,2000
|
||||
mlb_citizens_bank_park,Citizens Bank Park,Philadelphia,PA,39.9061,-75.1665,42901,MLB,['PHI'],mlb_hardcoded,2004
|
||||
mlb_pnc_park,PNC Park,Pittsburgh,PA,40.4469,-80.0057,38362,MLB,['PIT'],mlb_hardcoded,2001
|
||||
mlb_petco_park,Petco Park,San Diego,CA,32.7073,-117.1566,40209,MLB,['SDP'],mlb_hardcoded,2004
|
||||
mlb_oracle_park,Oracle Park,San Francisco,CA,37.7786,-122.3893,41915,MLB,['SFG'],mlb_hardcoded,2000
|
||||
mlb_t-mobile_park,T-Mobile Park,Seattle,WA,47.5914,-122.3325,47929,MLB,['SEA'],mlb_hardcoded,1999
|
||||
mlb_busch_stadium,Busch Stadium,St. Louis,MO,38.6226,-90.1928,45538,MLB,['STL'],mlb_hardcoded,2006
|
||||
mlb_tropicana_field,Tropicana Field,St. Petersburg,FL,27.7682,-82.6534,25000,MLB,['TBR'],mlb_hardcoded,1990
|
||||
mlb_globe_life_field,Globe Life Field,Arlington,TX,32.7473,-97.0844,40300,MLB,['TEX'],mlb_hardcoded,2020
|
||||
mlb_rogers_centre,Rogers Centre,Toronto,ON,43.6414,-79.3894,49282,MLB,['TOR'],mlb_hardcoded,1989
|
||||
mlb_nationals_park,Nationals Park,Washington,DC,38.8729,-77.0074,41339,MLB,['WSN'],mlb_hardcoded,2008
|
||||
nba_state_farm_arena,State Farm Arena,Atlanta,GA,33.7573,-84.3963,18118,NBA,['ATL'],nba_hardcoded,1999
|
||||
nba_td_garden,TD Garden,Boston,MA,42.3662,-71.0621,19156,NBA,['BOS'],nba_hardcoded,1995
|
||||
nba_barclays_center,Barclays Center,Brooklyn,NY,40.6826,-73.9754,17732,NBA,['BRK'],nba_hardcoded,2012
|
||||
nba_spectrum_center,Spectrum Center,Charlotte,NC,35.2251,-80.8392,19077,NBA,['CHO'],nba_hardcoded,2005
|
||||
nba_united_center,United Center,Chicago,IL,41.8807,-87.6742,20917,NBA,['CHI'],nba_hardcoded,1994
|
||||
nba_rocket_mortgage_fieldhouse,Rocket Mortgage FieldHouse,Cleveland,OH,41.4965,-81.6882,19432,NBA,['CLE'],nba_hardcoded,1994
|
||||
nba_american_airlines_center,American Airlines Center,Dallas,TX,32.7905,-96.8103,19200,NBA,['DAL'],nba_hardcoded,2001
|
||||
nba_ball_arena,Ball Arena,Denver,CO,39.7487,-105.0077,19520,NBA,['DEN'],nba_hardcoded,1999
|
||||
nba_little_caesars_arena,Little Caesars Arena,Detroit,MI,42.3411,-83.0553,20332,NBA,['DET'],nba_hardcoded,2017
|
||||
nba_chase_center,Chase Center,San Francisco,CA,37.768,-122.3879,18064,NBA,['GSW'],nba_hardcoded,2019
|
||||
nba_toyota_center,Toyota Center,Houston,TX,29.7508,-95.3621,18055,NBA,['HOU'],nba_hardcoded,2003
|
||||
nba_gainbridge_fieldhouse,Gainbridge Fieldhouse,Indianapolis,IN,39.764,-86.1555,17923,NBA,['IND'],nba_hardcoded,1999
|
||||
nba_intuit_dome,Intuit Dome,Inglewood,CA,33.9425,-118.3419,18000,NBA,['LAC'],nba_hardcoded,2024
|
||||
nba_crypto.com_arena,Crypto.com Arena,Los Angeles,CA,34.043,-118.2673,18997,NBA,['LAL'],nba_hardcoded,1999
|
||||
nba_fedexforum,FedExForum,Memphis,TN,35.1382,-90.0506,17794,NBA,['MEM'],nba_hardcoded,2004
|
||||
nba_kaseya_center,Kaseya Center,Miami,FL,25.7814,-80.187,19600,NBA,['MIA'],nba_hardcoded,1999
|
||||
nba_fiserv_forum,Fiserv Forum,Milwaukee,WI,43.0451,-87.9174,17341,NBA,['MIL'],nba_hardcoded,2018
|
||||
nba_target_center,Target Center,Minneapolis,MN,44.9795,-93.2761,18978,NBA,['MIN'],nba_hardcoded,1990
|
||||
nba_smoothie_king_center,Smoothie King Center,New Orleans,LA,29.949,-90.0821,16867,NBA,['NOP'],nba_hardcoded,1999
|
||||
nba_madison_square_garden,Madison Square Garden,New York,NY,40.7505,-73.9934,19812,NBA,['NYK'],nba_hardcoded,1968
|
||||
nba_paycom_center,Paycom Center,Oklahoma City,OK,35.4634,-97.5151,18203,NBA,['OKC'],nba_hardcoded,2002
|
||||
nba_kia_center,Kia Center,Orlando,FL,28.5392,-81.3839,18846,NBA,['ORL'],nba_hardcoded,1989
|
||||
nba_wells_fargo_center,Wells Fargo Center,Philadelphia,PA,39.9012,-75.172,20478,NBA,['PHI'],nba_hardcoded,1996
|
||||
nba_footprint_center,Footprint Center,Phoenix,AZ,33.4457,-112.0712,17071,NBA,['PHO'],nba_hardcoded,1992
|
||||
nba_moda_center,Moda Center,Portland,OR,45.5316,-122.6668,19393,NBA,['POR'],nba_hardcoded,1995
|
||||
nba_golden_1_center,Golden 1 Center,Sacramento,CA,38.5802,-121.4997,17608,NBA,['SAC'],nba_hardcoded,2016
|
||||
nba_frost_bank_center,Frost Bank Center,San Antonio,TX,29.427,-98.4375,18418,NBA,['SAS'],nba_hardcoded,2002
|
||||
nba_scotiabank_arena,Scotiabank Arena,Toronto,ON,43.6435,-79.3791,19800,NBA,['TOR'],nba_hardcoded,1999
|
||||
nba_delta_center,Delta Center,Salt Lake City,UT,40.7683,-111.9011,18306,NBA,['UTA'],nba_hardcoded,1991
|
||||
nba_capital_one_arena,Capital One Arena,Washington,DC,38.8982,-77.0209,20356,NBA,['WAS'],nba_hardcoded,1997
|
||||
nhl_td_garden,TD Garden,Boston,MA,42.3662,-71.0621,17850,NHL,['BOS'],nhl_hardcoded,1995
|
||||
nhl_keybank_center,KeyBank Center,Buffalo,NY,42.875,-78.8764,19070,NHL,['BUF'],nhl_hardcoded,1996
|
||||
nhl_little_caesars_arena,Little Caesars Arena,Detroit,MI,42.3411,-83.0553,19515,NHL,['DET'],nhl_hardcoded,2017
|
||||
nhl_amerant_bank_arena,Amerant Bank Arena,Sunrise,FL,26.1584,-80.3256,19250,NHL,['FLA'],nhl_hardcoded,1998
|
||||
nhl_bell_centre,Bell Centre,Montreal,QC,45.4961,-73.5693,21302,NHL,['MTL'],nhl_hardcoded,1996
|
||||
nhl_canadian_tire_centre,Canadian Tire Centre,Ottawa,ON,45.2969,-75.9272,18652,NHL,['OTT'],nhl_hardcoded,1996
|
||||
nhl_amalie_arena,Amalie Arena,Tampa,FL,27.9426,-82.4519,19092,NHL,['TBL'],nhl_hardcoded,1996
|
||||
nhl_scotiabank_arena,Scotiabank Arena,Toronto,ON,43.6435,-79.3791,18800,NHL,['TOR'],nhl_hardcoded,1999
|
||||
nhl_pnc_arena,PNC Arena,Raleigh,NC,35.8033,-78.722,18680,NHL,['CAR'],nhl_hardcoded,1999
|
||||
nhl_nationwide_arena,Nationwide Arena,Columbus,OH,39.9692,-83.0061,18500,NHL,['CBJ'],nhl_hardcoded,2000
|
||||
nhl_prudential_center,Prudential Center,Newark,NJ,40.7334,-74.1713,16514,NHL,['NJD'],nhl_hardcoded,2007
|
||||
nhl_ubs_arena,UBS Arena,Elmont,NY,40.717,-73.726,17255,NHL,['NYI'],nhl_hardcoded,2021
|
||||
nhl_madison_square_garden,Madison Square Garden,New York,NY,40.7505,-73.9934,18006,NHL,['NYR'],nhl_hardcoded,1968
|
||||
nhl_wells_fargo_center,Wells Fargo Center,Philadelphia,PA,39.9012,-75.172,19500,NHL,['PHI'],nhl_hardcoded,1996
|
||||
nhl_ppg_paints_arena,PPG Paints Arena,Pittsburgh,PA,40.4395,-79.9892,18387,NHL,['PIT'],nhl_hardcoded,2010
|
||||
nhl_capital_one_arena,Capital One Arena,Washington,DC,38.8982,-77.0209,18573,NHL,['WSH'],nhl_hardcoded,1997
|
||||
nhl_united_center,United Center,Chicago,IL,41.8807,-87.6742,19717,NHL,['CHI'],nhl_hardcoded,1994
|
||||
nhl_ball_arena,Ball Arena,Denver,CO,39.7487,-105.0077,18007,NHL,['COL'],nhl_hardcoded,1999
|
||||
nhl_american_airlines_center,American Airlines Center,Dallas,TX,32.7905,-96.8103,18532,NHL,['DAL'],nhl_hardcoded,2001
|
||||
nhl_xcel_energy_center,Xcel Energy Center,Saint Paul,MN,44.9448,-93.101,17954,NHL,['MIN'],nhl_hardcoded,2000
|
||||
nhl_bridgestone_arena,Bridgestone Arena,Nashville,TN,36.1592,-86.7785,17159,NHL,['NSH'],nhl_hardcoded,1996
|
||||
nhl_enterprise_center,Enterprise Center,St. Louis,MO,38.6268,-90.2025,18096,NHL,['STL'],nhl_hardcoded,1994
|
||||
nhl_canada_life_centre,Canada Life Centre,Winnipeg,MB,49.8928,-97.1437,15321,NHL,['WPG'],nhl_hardcoded,2004
|
||||
nhl_honda_center,Honda Center,Anaheim,CA,33.8078,-117.8765,17174,NHL,['ANA'],nhl_hardcoded,1993
|
||||
nhl_delta_center,Delta Center,Salt Lake City,UT,40.7683,-111.9011,16210,NHL,['ARI'],nhl_hardcoded,1991
|
||||
nhl_sap_center,SAP Center,San Jose,CA,37.3327,-121.9012,17562,NHL,['SJS'],nhl_hardcoded,1993
|
||||
nhl_rogers_arena,Rogers Arena,Vancouver,BC,49.2778,-123.1089,18910,NHL,['VAN'],nhl_hardcoded,1995
|
||||
nhl_t-mobile_arena,T-Mobile Arena,Las Vegas,NV,36.1028,-115.1784,17500,NHL,['VGK'],nhl_hardcoded,2016
|
||||
nhl_climate_pledge_arena,Climate Pledge Arena,Seattle,WA,47.622,-122.354,17100,NHL,['SEA'],nhl_hardcoded,2021
|
||||
nhl_crypto.com_arena,Crypto.com Arena,Los Angeles,CA,34.043,-118.2673,18230,NHL,['LAK'],nhl_hardcoded,1999
|
||||
nhl_rogers_place,Rogers Place,Edmonton,AB,53.5469,-113.4979,18347,NHL,['EDM'],nhl_hardcoded,2016
|
||||
nhl_scotiabank_saddledome,Scotiabank Saddledome,Calgary,AB,51.0374,-114.0519,19289,NHL,['CGY'],nhl_hardcoded,1983
|
||||
nfl_state_farm_stadium,State Farm Stadium,Glendale,AZ,33.5276,-112.2626,63400,NFL,['ARI'],nfl_hardcoded,2006
|
||||
nfl_mercedes-benz_stadium,Mercedes-Benz Stadium,Atlanta,GA,33.7553,-84.4006,71000,NFL,['ATL'],nfl_hardcoded,2017
|
||||
nfl_m&t_bank_stadium,M&T Bank Stadium,Baltimore,MD,39.278,-76.6227,71008,NFL,['BAL'],nfl_hardcoded,1998
|
||||
nfl_highmark_stadium,Highmark Stadium,Orchard Park,NY,42.7738,-78.787,71608,NFL,['BUF'],nfl_hardcoded,1973
|
||||
nfl_bank_of_america_stadium,Bank of America Stadium,Charlotte,NC,35.2258,-80.8528,75523,NFL,['CAR'],nfl_hardcoded,1996
|
||||
nfl_soldier_field,Soldier Field,Chicago,IL,41.8623,-87.6167,61500,NFL,['CHI'],nfl_hardcoded,1924
|
||||
nfl_paycor_stadium,Paycor Stadium,Cincinnati,OH,39.0954,-84.516,65515,NFL,['CIN'],nfl_hardcoded,2000
|
||||
nfl_cleveland_browns_stadium,Cleveland Browns Stadium,Cleveland,OH,41.5061,-81.6995,67895,NFL,['CLE'],nfl_hardcoded,1999
|
||||
nfl_at&t_stadium,AT&T Stadium,Arlington,TX,32.748,-97.0928,80000,NFL,['DAL'],nfl_hardcoded,2009
|
||||
nfl_empower_field_at_mile_high,Empower Field at Mile High,Denver,CO,39.7439,-105.0201,76125,NFL,['DEN'],nfl_hardcoded,2001
|
||||
nfl_ford_field,Ford Field,Detroit,MI,42.34,-83.0456,65000,NFL,['DET'],nfl_hardcoded,2002
|
||||
nfl_lambeau_field,Lambeau Field,Green Bay,WI,44.5013,-88.0622,81435,NFL,['GB'],nfl_hardcoded,1957
|
||||
nfl_nrg_stadium,NRG Stadium,Houston,TX,29.6847,-95.4107,72220,NFL,['HOU'],nfl_hardcoded,2002
|
||||
nfl_lucas_oil_stadium,Lucas Oil Stadium,Indianapolis,IN,39.7601,-86.1639,67000,NFL,['IND'],nfl_hardcoded,2008
|
||||
nfl_everbank_stadium,EverBank Stadium,Jacksonville,FL,30.3239,-81.6373,67814,NFL,['JAX'],nfl_hardcoded,1995
|
||||
nfl_geha_field_at_arrowhead_stadiu,GEHA Field at Arrowhead Stadium,Kansas City,MO,39.0489,-94.4839,76416,NFL,['KC'],nfl_hardcoded,1972
|
||||
nfl_allegiant_stadium,Allegiant Stadium,Las Vegas,NV,36.0909,-115.1833,65000,NFL,['LV'],nfl_hardcoded,2020
|
||||
nfl_sofi_stadium,SoFi Stadium,Inglewood,CA,33.9535,-118.3392,70240,NFL,"['LAC', 'LAR']",nfl_hardcoded,2020
|
||||
nfl_hard_rock_stadium,Hard Rock Stadium,Miami Gardens,FL,25.958,-80.2389,64767,NFL,['MIA'],nfl_hardcoded,1987
|
||||
nfl_u.s._bank_stadium,U.S. Bank Stadium,Minneapolis,MN,44.9736,-93.2575,66655,NFL,['MIN'],nfl_hardcoded,2016
|
||||
nfl_gillette_stadium,Gillette Stadium,Foxborough,MA,42.0909,-71.2643,65878,NFL,['NE'],nfl_hardcoded,2002
|
||||
nfl_caesars_superdome,Caesars Superdome,New Orleans,LA,29.9511,-90.0812,73208,NFL,['NO'],nfl_hardcoded,1975
|
||||
nfl_metlife_stadium,MetLife Stadium,East Rutherford,NJ,40.8135,-74.0745,82500,NFL,"['NYG', 'NYJ']",nfl_hardcoded,2010
|
||||
nfl_lincoln_financial_field,Lincoln Financial Field,Philadelphia,PA,39.9008,-75.1675,69596,NFL,['PHI'],nfl_hardcoded,2003
|
||||
nfl_acrisure_stadium,Acrisure Stadium,Pittsburgh,PA,40.4468,-80.0158,68400,NFL,['PIT'],nfl_hardcoded,2001
|
||||
nfl_levi's_stadium,Levi's Stadium,Santa Clara,CA,37.4032,-121.9698,68500,NFL,['SF'],nfl_hardcoded,2014
|
||||
nfl_lumen_field,Lumen Field,Seattle,WA,47.5952,-122.3316,68740,NFL,['SEA'],nfl_hardcoded,2002
|
||||
nfl_raymond_james_stadium,Raymond James Stadium,Tampa,FL,27.9759,-82.5033,65618,NFL,['TB'],nfl_hardcoded,1998
|
||||
nfl_nissan_stadium,Nissan Stadium,Nashville,TN,36.1665,-86.7713,69143,NFL,['TEN'],nfl_hardcoded,1999
|
||||
nfl_northwest_stadium,Northwest Stadium,Landover,MD,38.9076,-76.8645,67617,NFL,['WAS'],nfl_hardcoded,1997
|
||||
mls_mercedes-benz_stadium,Mercedes-Benz Stadium,Atlanta,GA,33.7555,-84.4,42500,MLS,['ATL'],mls_hardcoded,2017
|
||||
mls_q2_stadium,Q2 Stadium,Austin,TX,30.3877,-97.7195,20738,MLS,['AUS'],mls_hardcoded,2021
|
||||
mls_bank_of_america_stadium,Bank of America Stadium,Charlotte,NC,35.2258,-80.8528,38000,MLS,['CLT'],mls_hardcoded,1996
|
||||
mls_soldier_field,Soldier Field,Chicago,IL,41.8623,-87.6167,24995,MLS,['CHI'],mls_hardcoded,1924
|
||||
mls_tql_stadium,TQL Stadium,Cincinnati,OH,39.1114,-84.5222,26000,MLS,['CIN'],mls_hardcoded,2021
|
||||
mls_dicks_sporting_goods_park,Dick's Sporting Goods Park,Commerce City,CO,39.8056,-104.8919,18061,MLS,['COL'],mls_hardcoded,2007
|
||||
mls_lowercom_field,Lower.com Field,Columbus,OH,39.9685,-83.0171,20371,MLS,['CLB'],mls_hardcoded,2021
|
||||
mls_toyota_stadium,Toyota Stadium,Frisco,TX,33.1544,-96.8353,20500,MLS,['DAL'],mls_hardcoded,2005
|
||||
mls_audi_field,Audi Field,Washington,DC,38.8684,-77.0129,20000,MLS,['DC'],mls_hardcoded,2018
|
||||
mls_shell_energy_stadium,Shell Energy Stadium,Houston,TX,29.7522,-95.3524,22039,MLS,['HOU'],mls_hardcoded,2012
|
||||
mls_dignity_health_sports_park,Dignity Health Sports Park,Carson,CA,33.864,-118.261,27000,MLS,['LAG'],mls_hardcoded,2003
|
||||
mls_bmo_stadium,BMO Stadium,Los Angeles,CA,34.0128,-118.2841,22000,MLS,['LAFC'],mls_hardcoded,2018
|
||||
mls_chase_stadium,Chase Stadium,Fort Lauderdale,FL,26.1933,-80.1607,21550,MLS,['MIA'],mls_hardcoded,2020
|
||||
mls_allianz_field,Allianz Field,Saint Paul,MN,44.9531,-93.1647,19400,MLS,['MIN'],mls_hardcoded,2019
|
||||
mls_stade_saputo,Stade Saputo,Montreal,QC,45.5631,-73.5525,19619,MLS,['MTL'],mls_hardcoded,2008
|
||||
mls_geodis_park,Geodis Park,Nashville,TN,36.1301,-86.766,30000,MLS,['NSH'],mls_hardcoded,2022
|
||||
mls_gillette_stadium,Gillette Stadium,Foxborough,MA,42.0909,-71.2643,22385,MLS,['NE'],mls_hardcoded,2002
|
||||
mls_yankee_stadium,Yankee Stadium,Bronx,NY,40.8292,-73.9264,28000,MLS,['NYCFC'],mls_hardcoded,2009
|
||||
mls_red_bull_arena,Red Bull Arena,Harrison,NJ,40.7367,-74.1503,25000,MLS,['NYRB'],mls_hardcoded,2010
|
||||
mls_interandco_stadium,Inter&Co Stadium,Orlando,FL,28.5411,-81.3893,25500,MLS,['ORL'],mls_hardcoded,2017
|
||||
mls_subaru_park,Subaru Park,Chester,PA,39.8322,-75.3789,18500,MLS,['PHI'],mls_hardcoded,2010
|
||||
mls_providence_park,Providence Park,Portland,OR,45.5214,-122.6917,25218,MLS,['POR'],mls_hardcoded,1926
|
||||
mls_america_first_field,America First Field,Sandy,UT,40.5829,-111.8934,20213,MLS,['RSL'],mls_hardcoded,2008
|
||||
mls_paypal_park,PayPal Park,San Jose,CA,37.3514,-121.925,18000,MLS,['SJ'],mls_hardcoded,2015
|
||||
mls_lumen_field,Lumen Field,Seattle,WA,47.5952,-122.3316,37722,MLS,['SEA'],mls_hardcoded,2002
|
||||
mls_childrens_mercy_park,Children's Mercy Park,Kansas City,KS,39.1217,-94.8232,18467,MLS,['SKC'],mls_hardcoded,2011
|
||||
mls_citypark,CityPark,St. Louis,MO,38.6314,-90.2103,22500,MLS,['STL'],mls_hardcoded,2023
|
||||
mls_bmo_field,BMO Field,Toronto,ON,43.6332,-79.4186,30000,MLS,['TOR'],mls_hardcoded,2007
|
||||
mls_bc_place,BC Place,Vancouver,BC,49.2767,-123.1119,22120,MLS,['VAN'],mls_hardcoded,1983
|
||||
mls_snapdragon_stadium,Snapdragon Stadium,San Diego,CA,32.7844,-117.1228,35000,MLS,['SD'],mls_hardcoded,2022
|
||||
|
2284
data/stadiums.json
2284
data/stadiums.json
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user