sportsball 0.3.118__tar.gz → 0.3.120__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {sportsball-0.3.118/sportsball.egg-info → sportsball-0.3.120}/PKG-INFO +1 -1
- {sportsball-0.3.118 → sportsball-0.3.120}/setup.py +1 -1
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/__init__.py +1 -1
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afl/afl_afl_game_model.py +21 -8
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afl/afl_afl_league_model.py +90 -6
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afl/afl_afl_player_model.py +1 -0
- sportsball-0.3.120/sportsball/data/afl/afl/afl_afl_venue_model.py +25 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/combined/afl_combined_league_model.py +9 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/google/google_address_model.py +49 -9
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/combined/nba_combined_league_model.py +2 -0
- sportsball-0.3.120/sportsball/data/nba/nbacom/nba_nbacom_game_model.py +56 -0
- sportsball-0.3.120/sportsball/data/nba/nbacom/nba_nbacom_league_model.py +40 -0
- sportsball-0.3.120/sportsball/data/nba/nbacom/nba_nbacom_player_model.py +44 -0
- sportsball-0.3.120/sportsball/data/nba/nbacom/nba_nbacom_team_model.py +38 -0
- sportsball-0.3.118/sportsball/data/afl/afl/afl_afl_venue_model.py → sportsball-0.3.120/sportsball/data/nba/nbacom/nba_nbacom_venue_model.py +2 -2
- {sportsball-0.3.118 → sportsball-0.3.120/sportsball.egg-info}/PKG-INFO +1 -1
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball.egg-info/SOURCES.txt +6 -0
- sportsball-0.3.120/tests/data/x/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/LICENSE +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/MANIFEST.in +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/README.md +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/requirements.txt +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/setup.cfg +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/__main__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/args.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/cache.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/address_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afl/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afl/afl_afl_bookie_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afl/afl_afl_odds_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afl/afl_afl_team_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afltables/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afltables/afl_afltables_game_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afltables/afl_afltables_league_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afltables/afl_afltables_player_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afltables/afl_afltables_team_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afltables/afl_afltables_venue_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/aussportsbetting/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/aussportsbetting/afl_aussportsbetting_league_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/combined/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/espn/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/espn/afl_espn_league_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/oddsportal/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/oddsportal/afl_oddsportal_league_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/aussportsbetting/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/aussportsbetting/aussportsbetting_bookie_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/aussportsbetting/aussportsbetting_game_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/aussportsbetting/aussportsbetting_league_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/aussportsbetting/aussportsbetting_odds_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/aussportsbetting/aussportsbetting_team_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/aussportsbetting/aussportsbetting_venue_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/bookie_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/combined/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/combined/combined_address_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/combined/combined_game_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/combined/combined_league_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/combined/combined_player_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/combined/combined_team_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/combined/combined_venue_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/combined/combined_weather_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/combined/null_check.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/espn/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/espn/espn_bookie_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/espn/espn_game_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/espn/espn_league_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/espn/espn_odds_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/espn/espn_player_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/espn/espn_team_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/espn/espn_venue_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/field_type.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/game_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/google/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/google/google_news_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/league.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/league_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/combined/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/espn/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/espn/nba_espn_league_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/nba/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/nba/nba_nba_game_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/nba/nba_nba_league_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/nba/nba_nba_team_model.py +0 -0
- {sportsball-0.3.118/sportsball/data/nba/oddsportal → sportsball-0.3.120/sportsball/data/nba/nbacom}/__init__.py +0 -0
- {sportsball-0.3.118/sportsball/data/nba/sportsdb → sportsball-0.3.120/sportsball/data/nba/oddsportal}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/oddsportal/nba_oddsportal_league_model.py +0 -0
- {sportsball-0.3.118/sportsball/data/nba/sportsreference → sportsball-0.3.120/sportsball/data/nba/sportsdb}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/sportsdb/nba_sportsdb_league_model.py +0 -0
- {sportsball-0.3.118/sportsball/data/ncaab/combined → sportsball-0.3.120/sportsball/data/nba/sportsreference}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/sportsreference/nba_sportsreference_league_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/ncaab/__init__.py +0 -0
- {sportsball-0.3.118/sportsball/data/ncaab/espn → sportsball-0.3.120/sportsball/data/ncaab/combined}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/ncaab/combined/ncaab_combined_league_model.py +0 -0
- {sportsball-0.3.118/sportsball/data/ncaab/oddsportal → sportsball-0.3.120/sportsball/data/ncaab/espn}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/ncaab/espn/ncaab_espn_league_model.py +0 -0
- {sportsball-0.3.118/sportsball/data/ncaab/sportsreference → sportsball-0.3.120/sportsball/data/ncaab/oddsportal}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/ncaab/oddsportal/ncaab_oddsportal_league_model.py +0 -0
- {sportsball-0.3.118/sportsball/data/ncaaf/combined → sportsball-0.3.120/sportsball/data/ncaab/sportsreference}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/ncaab/sportsreference/ncaab_sportsreference_league_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/ncaaf/__init__.py +0 -0
- {sportsball-0.3.118/sportsball/data/ncaaf/espn → sportsball-0.3.120/sportsball/data/ncaaf/combined}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/ncaaf/combined/ncaaf_combined_league_model.py +0 -0
- {sportsball-0.3.118/sportsball/data/ncaaf/oddsportal → sportsball-0.3.120/sportsball/data/ncaaf/espn}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/ncaaf/espn/ncaaf_espn_league_model.py +0 -0
- {sportsball-0.3.118/sportsball/data/nfl/aussportsbetting → sportsball-0.3.120/sportsball/data/ncaaf/oddsportal}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/ncaaf/oddsportal/ncaaf_oddsportal_league_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/news_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nfl/__init__.py +0 -0
- {sportsball-0.3.118/sportsball/data/nfl/combined → sportsball-0.3.120/sportsball/data/nfl/aussportsbetting}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nfl/aussportsbetting/nfl_aussportsbetting_league_model.py +0 -0
- {sportsball-0.3.118/sportsball/data/nfl/oddsportal → sportsball-0.3.120/sportsball/data/nfl/combined}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nfl/combined/nfl_combined_league_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nfl/espn/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nfl/espn/nfl_espn_league_model.py +0 -0
- {sportsball-0.3.118/sportsball/data/nfl/sportsdb → sportsball-0.3.120/sportsball/data/nfl/oddsportal}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nfl/oddsportal/nfl_oddsportal_league_model.py +0 -0
- {sportsball-0.3.118/sportsball/data/oddsportal → sportsball-0.3.120/sportsball/data/nfl/sportsdb}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nfl/sportsdb/nfl_sportsdb_league_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/odds_model.py +0 -0
- {sportsball-0.3.118/sportsball/data/sportsdb → sportsball-0.3.120/sportsball/data/oddsportal}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/oddsportal/decrypt.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/oddsportal/oddsportal_bookie_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/oddsportal/oddsportal_game_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/oddsportal/oddsportal_league_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/oddsportal/oddsportal_odds_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/oddsportal/oddsportal_team_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/oddsportal/oddsportal_venue_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/player_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/season_type.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/social_model.py +0 -0
- {sportsball-0.3.118/sportsball/data/sportsreference → sportsball-0.3.120/sportsball/data/sportsdb}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/sportsdb/sportsdb_game_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/sportsdb/sportsdb_league_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/sportsdb/sportsdb_team_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/sportsdb/sportsdb_venue_model.py +0 -0
- {sportsball-0.3.118/sportsball/data/weather → sportsball-0.3.120/sportsball/data/sportsreference}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/sportsreference/sportsreference_game_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/sportsreference/sportsreference_league_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/sportsreference/sportsreference_player_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/sportsreference/sportsreference_team_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/sportsreference/sportsreference_venue_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/team_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/venue_model.py +0 -0
- {sportsball-0.3.118/sportsball/data/weather/gribstream → sportsball-0.3.120/sportsball/data/weather}/__init__.py +0 -0
- {sportsball-0.3.118/sportsball/data/weather/openmeteo → sportsball-0.3.120/sportsball/data/weather/gribstream}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/weather/gribstream/gribstream_weather_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/weather/multi_weather_model.py +0 -0
- {sportsball-0.3.118/sportsball/data/wikipedia → sportsball-0.3.120/sportsball/data/weather/openmeteo}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/weather/openmeteo/openmeteo_weather_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/weather_model.py +0 -0
- {sportsball-0.3.118/sportsball/data/x → sportsball-0.3.120/sportsball/data/wikipedia}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/wikipedia/wikipedia_venue_model.py +0 -0
- {sportsball-0.3.118/sportsball/vendor → sportsball-0.3.120/sportsball/data/x}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/x/x_social_model.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/logger.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/loglevel.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/playwright.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/proxy_session.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/session.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/sportsball.py +0 -0
- {sportsball-0.3.118/tests → sportsball-0.3.120/sportsball/vendor}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/vendor/pygooglenews/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball.egg-info/dependency_links.txt +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball.egg-info/entry_points.txt +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball.egg-info/not-zip-safe +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball.egg-info/requires.txt +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/sportsball.egg-info/top_level.txt +0 -0
- {sportsball-0.3.118/tests/data → sportsball-0.3.120/tests}/__init__.py +0 -0
- {sportsball-0.3.118/tests/data/afl → sportsball-0.3.120/tests/data}/__init__.py +0 -0
- {sportsball-0.3.118/tests/data/afl → sportsball-0.3.120/tests/data}/afl/__init__.py +0 -0
- {sportsball-0.3.118/tests/data/afl/afltables → sportsball-0.3.120/tests/data/afl/afl}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/afl/afl/afl_afl_league_model_test.py +0 -0
- {sportsball-0.3.118/tests/data/aussportsbetting → sportsball-0.3.120/tests/data/afl/afltables}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/afl/afltables/afl_afltables_game_model_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/afl/afltables/afl_afltables_league_model_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/afl/afltables/afl_afltables_player_model_test.py +0 -0
- {sportsball-0.3.118/tests/data/combined → sportsball-0.3.120/tests/data/aussportsbetting}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/aussportsbetting/aussportsbetting_game_model_test.py +0 -0
- {sportsball-0.3.118/tests/data/espn → sportsball-0.3.120/tests/data/combined}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/combined/combined_game_model_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/combined/combined_player_model_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/combined/combined_team_model_test.py +0 -0
- {sportsball-0.3.118/tests/data/google → sportsball-0.3.120/tests/data/espn}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/espn/espn_game_model_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/espn/espn_player_model_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/game_model_test.py +0 -0
- {sportsball-0.3.118/tests/data/nba → sportsball-0.3.120/tests/data/google}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/google/google_address_model_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/google/google_news_model_test.py +0 -0
- {sportsball-0.3.118/tests/data/nba → sportsball-0.3.120/tests/data}/nba/__init__.py +0 -0
- {sportsball-0.3.118/tests/data/nba/sportsdb → sportsball-0.3.120/tests/data/nba/nba}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/nba/nba/nba_nba_game_model_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/nba/nba/nba_nba_league_model_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/nba/nba/nba_nba_team_model_test.py +0 -0
- {sportsball-0.3.118/tests/data/nba/sportsreference → sportsball-0.3.120/tests/data/nba/sportsdb}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/nba/sportsdb/nba_sportsdb_league_model_test.py +0 -0
- {sportsball-0.3.118/tests/data/ncaab → sportsball-0.3.120/tests/data/nba/sportsreference}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/nba/sportsreference/nba_sportsreference_league_model_test.py +0 -0
- {sportsball-0.3.118/tests/data/ncaab/sportsreference → sportsball-0.3.120/tests/data/ncaab}/__init__.py +0 -0
- {sportsball-0.3.118/tests/data/nfl → sportsball-0.3.120/tests/data/ncaab/sportsreference}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/ncaab/sportsreference/ncaab_sportsreference_league_model_test.py +0 -0
- {sportsball-0.3.118/tests/data/nfl/sportsdb → sportsball-0.3.120/tests/data/nfl}/__init__.py +0 -0
- {sportsball-0.3.118/tests/data/oddsportal → sportsball-0.3.120/tests/data/nfl/sportsdb}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/nfl/sportsdb/nfl_sportsdb_league_model_test.py +0 -0
- {sportsball-0.3.118/tests/data/sportsdb → sportsball-0.3.120/tests/data/oddsportal}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/oddsportal/decrypt_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/oddsportal/oddsportal_game_model_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/oddsportal/oddsportal_league_model_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/player_model_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/social_model_test.py +0 -0
- {sportsball-0.3.118/tests/data/sportsreference → sportsball-0.3.120/tests/data/sportsdb}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/sportsdb/sportsdb_game_model_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/sportsdb/sportsdb_league_model_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/sportsdb/sportsdb_team_model_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/sportsdb/sportsdb_venue_model_test.py +0 -0
- {sportsball-0.3.118/tests/data/x → sportsball-0.3.120/tests/data/sportsreference}/__init__.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/sportsreference/sportsreference_game_model_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/sportsreference/sportsreference_league_model_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/sportsreference/sportsreference_player_model_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/sportsreference/sportsreference_team_model_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/sportsreference/sportsreference_venue_model_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/team_model_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/x/x_social_model_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/proxy_session_test.py +0 -0
- {sportsball-0.3.118 → sportsball-0.3.120}/tests/sportsball_test.py +0 -0
@@ -26,7 +26,7 @@ def install_requires() -> typing.List[str]:
|
|
26
26
|
|
27
27
|
setup(
|
28
28
|
name='sportsball',
|
29
|
-
version='0.3.
|
29
|
+
version='0.3.120',
|
30
30
|
description='A library for pulling in and normalising sports stats.',
|
31
31
|
long_description=long_description,
|
32
32
|
long_description_content_type='text/markdown',
|
@@ -1,8 +1,8 @@
|
|
1
1
|
"""AFL AFL game model."""
|
2
2
|
|
3
|
-
# pylint: disable=too-many-statements,protected-access,too-many-arguments,bare-except
|
3
|
+
# pylint: disable=too-many-statements,protected-access,too-many-arguments,bare-except,duplicate-code
|
4
4
|
import datetime
|
5
|
-
import
|
5
|
+
import re
|
6
6
|
|
7
7
|
import pytest_is_running
|
8
8
|
import requests_cache
|
@@ -16,18 +16,29 @@ from .afl_afl_team_model import create_afl_afl_team_model
|
|
16
16
|
from .afl_afl_venue_model import create_afl_afl_venue_model
|
17
17
|
|
18
18
|
|
19
|
-
def _extract_odds(
|
19
|
+
def _extract_odds(soup: BeautifulSoup) -> list[float]:
|
20
20
|
odds = []
|
21
|
-
soup = BeautifulSoup(html, "lxml")
|
22
21
|
for span in soup.find_all("span", {"class": "betting-button__money"}):
|
23
22
|
odds.append(float(span.get_text().strip().replace("$", "")))
|
24
23
|
return odds
|
25
24
|
|
26
25
|
|
26
|
+
def _extract_dt(soup: BeautifulSoup) -> datetime.datetime:
|
27
|
+
for div in soup.find_all("div", {"class": re.compile(".*js-match-start-time.*")}):
|
28
|
+
start_time = div.get("data-start-time")
|
29
|
+
return datetime.datetime.fromisoformat(start_time)
|
30
|
+
raise ValueError("Unable to find datetime")
|
31
|
+
|
32
|
+
|
33
|
+
def _parse(html: str) -> tuple[list[float], datetime.datetime]:
|
34
|
+
soup = BeautifulSoup(html, "lxml")
|
35
|
+
return _extract_odds(soup), _extract_dt(soup)
|
36
|
+
|
37
|
+
|
27
38
|
def create_afl_afl_game_model(
|
28
39
|
team_names: list[str],
|
29
40
|
players: list[list[tuple[str, str, str, str]]],
|
30
|
-
dt: datetime.datetime,
|
41
|
+
dt: datetime.datetime | None,
|
31
42
|
venue_name: str,
|
32
43
|
session: requests_cache.CachedSession,
|
33
44
|
ladder: list[str],
|
@@ -35,7 +46,7 @@ def create_afl_afl_game_model(
|
|
35
46
|
playwright: Playwright,
|
36
47
|
) -> GameModel:
|
37
48
|
"""Create a game model from AFL Tables."""
|
38
|
-
odds = []
|
49
|
+
odds: list[float] = []
|
39
50
|
if url is not None and not pytest_is_running.is_running():
|
40
51
|
ensure_install()
|
41
52
|
browser = playwright.chromium.launch()
|
@@ -44,8 +55,10 @@ def create_afl_afl_game_model(
|
|
44
55
|
try:
|
45
56
|
page.goto(url, wait_until="networkidle")
|
46
57
|
except: # noqa: E722
|
47
|
-
|
48
|
-
odds =
|
58
|
+
pass
|
59
|
+
odds, dt = _parse(page.content())
|
60
|
+
if dt is None:
|
61
|
+
raise ValueError("dt is null")
|
49
62
|
|
50
63
|
venue_model = create_afl_afl_venue_model(venue_name, session, dt)
|
51
64
|
teams = [
|
@@ -8,7 +8,7 @@ import urllib.parse
|
|
8
8
|
from typing import Iterator
|
9
9
|
|
10
10
|
import requests_cache
|
11
|
-
from bs4 import BeautifulSoup
|
11
|
+
from bs4 import BeautifulSoup, Tag
|
12
12
|
from dateutil.parser import parse
|
13
13
|
from playwright.sync_api import Playwright, sync_playwright
|
14
14
|
|
@@ -19,14 +19,13 @@ from ...league_model import LeagueModel
|
|
19
19
|
from .afl_afl_game_model import create_afl_afl_game_model
|
20
20
|
|
21
21
|
|
22
|
-
def
|
23
|
-
|
22
|
+
def _parse_v1(
|
23
|
+
soup: BeautifulSoup,
|
24
24
|
session: requests_cache.CachedSession,
|
25
25
|
ladder: list[str],
|
26
26
|
html_url: str,
|
27
27
|
playwright: Playwright,
|
28
28
|
) -> Iterator[GameModel]:
|
29
|
-
soup = BeautifulSoup(html, "lxml")
|
30
29
|
for div in soup.find_all("div", {"class": re.compile(".*js-match-list-item.*")}):
|
31
30
|
team_names = []
|
32
31
|
for span in div.find_all(
|
@@ -110,13 +109,97 @@ def _parse_game_info(
|
|
110
109
|
)
|
111
110
|
|
112
111
|
|
112
|
+
def _parse_v2(
|
113
|
+
soup: BeautifulSoup,
|
114
|
+
session: requests_cache.CachedSession,
|
115
|
+
ladder: list[str],
|
116
|
+
html_url: str,
|
117
|
+
playwright: Playwright,
|
118
|
+
) -> Iterator[GameModel]:
|
119
|
+
for div in soup.find_all("div", {"class": "team-lineups__item"}):
|
120
|
+
team_names = []
|
121
|
+
for span in div.find_all(
|
122
|
+
"span", {"class": re.compile(".*team-lineups-header__name.*")}
|
123
|
+
):
|
124
|
+
team_names = [x.strip() for x in span.get_text().strip().split(" v ")]
|
125
|
+
team_players: list[list[tuple[str, str, str, str]]] = [[], []]
|
126
|
+
|
127
|
+
def process_a_player(
|
128
|
+
a: Tag, idx: int, team_players: list[list[tuple[str, str, str, str]]]
|
129
|
+
) -> list[list[tuple[str, str, str, str]]]:
|
130
|
+
href = a.get("href")
|
131
|
+
if not isinstance(href, str):
|
132
|
+
raise ValueError("href is not a str")
|
133
|
+
player_id = "afl:" + href.split("/")[2]
|
134
|
+
name = a.get("title")
|
135
|
+
if not isinstance(name, str):
|
136
|
+
raise ValueError("name is not a str")
|
137
|
+
first_name, sur_name = name.split()
|
138
|
+
jersey = None
|
139
|
+
for div_shirt in a.find_all(
|
140
|
+
"div", {"class": re.compile(".*team-lineups__player-entry--shirt.*")}
|
141
|
+
):
|
142
|
+
jersey = div_shirt.get_text().strip()
|
143
|
+
if jersey is None:
|
144
|
+
raise ValueError("jersey is null")
|
145
|
+
team_players[idx].append((player_id, first_name, sur_name, jersey))
|
146
|
+
return team_players
|
147
|
+
|
148
|
+
for a in div.find_all(
|
149
|
+
"a", {"class": re.compile(".*team-lineups__player-entry--home-team.*")}
|
150
|
+
):
|
151
|
+
team_players = process_a_player(a, 0, team_players)
|
152
|
+
for a in div.find_all(
|
153
|
+
"a", {"class": re.compile(".*team-lineups__player-entry--away-team.*")}
|
154
|
+
):
|
155
|
+
team_players = process_a_player(a, 1, team_players)
|
156
|
+
|
157
|
+
venue_name = None
|
158
|
+
for div_info in div.find_all("div", {"class": "team-lineups-header__info"}):
|
159
|
+
header_info = div_info.get_text().strip()
|
160
|
+
venue_name = header_info.split("・")[1].strip()
|
161
|
+
if venue_name is None:
|
162
|
+
raise ValueError("venue_name is null")
|
163
|
+
|
164
|
+
url = None
|
165
|
+
for a in div.find_all("a", {"class": "team-lineups-header"}):
|
166
|
+
url = urllib.parse.urljoin(html_url, a.get("href"))
|
167
|
+
|
168
|
+
yield create_afl_afl_game_model(
|
169
|
+
team_names,
|
170
|
+
team_players,
|
171
|
+
None,
|
172
|
+
venue_name,
|
173
|
+
session,
|
174
|
+
ladder,
|
175
|
+
url,
|
176
|
+
playwright,
|
177
|
+
)
|
178
|
+
|
179
|
+
|
180
|
+
def _parse_game_info(
|
181
|
+
html: str,
|
182
|
+
session: requests_cache.CachedSession,
|
183
|
+
ladder: list[str],
|
184
|
+
html_url: str,
|
185
|
+
playwright: Playwright,
|
186
|
+
) -> Iterator[GameModel]:
|
187
|
+
soup = BeautifulSoup(html, "lxml")
|
188
|
+
found = False
|
189
|
+
for game_model in _parse_v1(soup, session, ladder, html_url, playwright):
|
190
|
+
found = True
|
191
|
+
yield game_model
|
192
|
+
if not found:
|
193
|
+
yield from _parse_v2(soup, session, ladder, html_url, playwright)
|
194
|
+
|
195
|
+
|
113
196
|
class AFLAFLLeagueModel(LeagueModel):
|
114
197
|
"""AFL AFL implementation of the league model."""
|
115
198
|
|
116
199
|
def __init__(
|
117
200
|
self, session: requests_cache.CachedSession, position: int | None = None
|
118
201
|
) -> None:
|
119
|
-
super().__init__(League.AFL, session)
|
202
|
+
super().__init__(League.AFL, session, position=position)
|
120
203
|
|
121
204
|
@classmethod
|
122
205
|
def name(cls) -> str:
|
@@ -137,7 +220,7 @@ class AFLAFLLeagueModel(LeagueModel):
|
|
137
220
|
timeout=60000.0,
|
138
221
|
)
|
139
222
|
except: # noqa: E722
|
140
|
-
|
223
|
+
pass
|
141
224
|
soup = BeautifulSoup(page.content(), "lxml")
|
142
225
|
for span in soup.find_all(
|
143
226
|
"span", {"class": re.compile(".*stats-table__club-name.*")}
|
@@ -146,6 +229,7 @@ class AFLAFLLeagueModel(LeagueModel):
|
|
146
229
|
if team_name in ladder:
|
147
230
|
continue
|
148
231
|
ladder.append(team_name)
|
232
|
+
logging.info("Found ladder: %s", ",".join(ladder))
|
149
233
|
return ladder
|
150
234
|
|
151
235
|
@property
|
@@ -0,0 +1,25 @@
|
|
1
|
+
"""AFL AFL venue model."""
|
2
|
+
|
3
|
+
# pylint: disable=too-many-statements,protected-access,duplicate-code
|
4
|
+
import datetime
|
5
|
+
|
6
|
+
import requests_cache
|
7
|
+
|
8
|
+
from ...google.google_address_model import create_google_address_model
|
9
|
+
from ...venue_model import VenueModel
|
10
|
+
|
11
|
+
|
12
|
+
def create_afl_afl_venue_model(
|
13
|
+
venue_name: str,
|
14
|
+
session: requests_cache.CachedSession,
|
15
|
+
dt: datetime.datetime,
|
16
|
+
) -> VenueModel:
|
17
|
+
"""Create a game model from AFL Tables."""
|
18
|
+
address_model = create_google_address_model(venue_name, session, dt)
|
19
|
+
return VenueModel(
|
20
|
+
identifier=venue_name,
|
21
|
+
name=venue_name,
|
22
|
+
address=address_model,
|
23
|
+
is_grass=None,
|
24
|
+
is_indoor=None,
|
25
|
+
)
|
{sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/combined/afl_combined_league_model.py
RENAMED
@@ -251,6 +251,15 @@ AFL_VENUE_IDENTITY_MAP = {
|
|
251
251
|
"Ondrej Nepela Arena": TIPOS_ARENA,
|
252
252
|
"Barossa Park": BAROSSA_PARK,
|
253
253
|
"Ninja Stadium": BELLERIVE_OVAL,
|
254
|
+
# AFL
|
255
|
+
"TIO Stadium, Darwin": MARRARA_OVAL,
|
256
|
+
"SCG, Sydney": SCG,
|
257
|
+
"MCG, Melbourne": MCG,
|
258
|
+
"Adelaide Oval, Adelaide": ADELAIDE_OVAL,
|
259
|
+
"ENGIE Stadium, Sydney": STADIUM_AUSTRALIA,
|
260
|
+
"Marvel Stadium, Melbourne": DOCKLANDS,
|
261
|
+
"Gabba, Brisbane": GABBA,
|
262
|
+
"Optus Stadium, Perth": PERTH,
|
254
263
|
}
|
255
264
|
|
256
265
|
|
@@ -2611,6 +2611,15 @@ OMNI_COLISEUM = SportsballGeocodeTuple(
|
|
2611
2611
|
housenumber="100",
|
2612
2612
|
country="USA",
|
2613
2613
|
)
|
2614
|
+
MCCAMISH_PAVILION = SportsballGeocodeTuple(
|
2615
|
+
city="Atlanta",
|
2616
|
+
state="GA",
|
2617
|
+
postal="",
|
2618
|
+
lat=33.780833,
|
2619
|
+
lng=-84.392778,
|
2620
|
+
housenumber="965",
|
2621
|
+
country="USA",
|
2622
|
+
)
|
2614
2623
|
_CACHED_GEOCODES: dict[str, Any] = {
|
2615
2624
|
"S.C.G. - Australia": SCG,
|
2616
2625
|
"Victoria Park - Australia": SportsballGeocodeTuple(
|
@@ -5558,15 +5567,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
5558
5567
|
housenumber="701",
|
5559
5568
|
country="USA",
|
5560
5569
|
),
|
5561
|
-
"McCamish Pavilion, Atlanta, Georgia":
|
5562
|
-
city="Atlanta",
|
5563
|
-
state="GA",
|
5564
|
-
postal="",
|
5565
|
-
lat=33.780833,
|
5566
|
-
lng=-84.392778,
|
5567
|
-
housenumber="965",
|
5568
|
-
country="USA",
|
5569
|
-
),
|
5570
|
+
"McCamish Pavilion, Atlanta, Georgia": MCCAMISH_PAVILION,
|
5570
5571
|
"Maravich Assembly Center, Baton Rouge, Louisiana": PETE_MARAVICH_ASSEMBLY_CENTER,
|
5571
5572
|
"Viejas Arena, San Diego, California": VIEJAS_ARENA,
|
5572
5573
|
"Reitz Arena, Baltimore, Maryland": SportsballGeocodeTuple(
|
@@ -13864,6 +13865,45 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
13864
13865
|
),
|
13865
13866
|
"Cox Arena, San Diego, California": VIEJAS_ARENA,
|
13866
13867
|
"The Omni, Atlanta, Georgia": OMNI_COLISEUM,
|
13868
|
+
"TD Banknorth Sports Center, Hamden, Connecticut": TD_BANK_SPORTS_CENTER,
|
13869
|
+
"The Event Center, San Jose, California": SportsballGeocodeTuple(
|
13870
|
+
city="San Jose",
|
13871
|
+
state="CA",
|
13872
|
+
postal="95192",
|
13873
|
+
lat=37.33536,
|
13874
|
+
lng=-121.87985,
|
13875
|
+
housenumber="290",
|
13876
|
+
country="USA",
|
13877
|
+
),
|
13878
|
+
"TIO Stadium, Darwin": TIO_STADIUM,
|
13879
|
+
"SCG, Sydney": SCG,
|
13880
|
+
"MCG, Melbourne": MCG,
|
13881
|
+
"Adelaide Oval, Adelaide": ADELAIDE_OVAL,
|
13882
|
+
"ENGIE Stadium, Sydney": ENGIE_STADIUM,
|
13883
|
+
"Marvel Stadium, Melbourne": MARVEL_STADIUM,
|
13884
|
+
"Gabba, Brisbane": GABBA,
|
13885
|
+
"Optus Stadium, Perth": OPTUS_STADIUM,
|
13886
|
+
"Ball Arena - Denver, Colorado, USA - United States": PEPSI_CENTRE,
|
13887
|
+
"Alexander Memorial Coliseum, Atlanta, Georgia": MCCAMISH_PAVILION,
|
13888
|
+
"Alltell Arena, North Little Rock, Arkansas": SIMMONS_BANK_ARENA,
|
13889
|
+
"Auburn Hills, Michigan": SportsballGeocodeTuple(
|
13890
|
+
city="Auburn Hills",
|
13891
|
+
state="MI",
|
13892
|
+
postal="",
|
13893
|
+
lat=42.6875,
|
13894
|
+
lng=-83.234167,
|
13895
|
+
housenumber="",
|
13896
|
+
country="USA",
|
13897
|
+
),
|
13898
|
+
"Guaynabo": SportsballGeocodeTuple(
|
13899
|
+
city="Guaynabo",
|
13900
|
+
state="PR",
|
13901
|
+
postal="",
|
13902
|
+
lat=18.366667,
|
13903
|
+
lng=-66.1,
|
13904
|
+
housenumber="",
|
13905
|
+
country="USA",
|
13906
|
+
),
|
13867
13907
|
}
|
13868
13908
|
|
13869
13909
|
|
{sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/combined/nba_combined_league_model.py
RENAMED
@@ -8,6 +8,7 @@ from ...combined.combined_league_model import CombinedLeagueModel
|
|
8
8
|
from ...league import League
|
9
9
|
from ..espn.nba_espn_league_model import NBAESPNLeagueModel
|
10
10
|
from ..nba.nba_nba_league_model import NBANBALeagueModel
|
11
|
+
from ..nbacom.nba_nbacom_league_model import NBANBAComLeagueModel
|
11
12
|
from ..oddsportal.nba_oddsportal_league_model import NBAOddsPortalLeagueModel
|
12
13
|
from ..sportsdb.nba_sportsdb_league_model import NBASportsDBLeagueModel
|
13
14
|
from ..sportsreference.nba_sportsreference_league_model import \
|
@@ -903,6 +904,7 @@ class NBACombinedLeagueModel(CombinedLeagueModel):
|
|
903
904
|
NBASportsDBLeagueModel(session, position=2),
|
904
905
|
NBASportsReferenceLeagueModel(session, position=3),
|
905
906
|
NBAOddsPortalLeagueModel(session, position=4),
|
907
|
+
NBANBAComLeagueModel(session, position=5),
|
906
908
|
],
|
907
909
|
league_filter,
|
908
910
|
)
|
@@ -0,0 +1,56 @@
|
|
1
|
+
"""NBA NBA.com game model."""
|
2
|
+
|
3
|
+
# pylint: disable=too-many-statements,protected-access,too-many-arguments,bare-except
|
4
|
+
import datetime
|
5
|
+
from typing import Any
|
6
|
+
|
7
|
+
import extruct # type: ignore
|
8
|
+
import requests_cache
|
9
|
+
|
10
|
+
from ...game_model import GameModel
|
11
|
+
from ...league import League
|
12
|
+
from .nba_nbacom_team_model import create_nba_nbacom_team_model
|
13
|
+
from .nba_nbacom_venue_model import create_nba_nbacom_venue_model
|
14
|
+
|
15
|
+
|
16
|
+
def create_nba_nbacom_game_model(
|
17
|
+
game: dict[str, Any], session: requests_cache.CachedSession
|
18
|
+
) -> GameModel:
|
19
|
+
"""Create a game model from AFL Tables."""
|
20
|
+
game_id = game["gameId"]
|
21
|
+
venue_name: str | None = None
|
22
|
+
dt = None
|
23
|
+
with session.cache_disabled():
|
24
|
+
response = session.get(f"https://www.nba.com/game/{game_id}")
|
25
|
+
response.raise_for_status()
|
26
|
+
data = extruct.extract(response.text, base_url=response.url)
|
27
|
+
for jsonld in data["json-ld"]:
|
28
|
+
location = jsonld.get("location")
|
29
|
+
if location is not None:
|
30
|
+
venue_name = location["name"]
|
31
|
+
start_date = jsonld.get("startDate")
|
32
|
+
if start_date is not None:
|
33
|
+
dt = datetime.datetime.fromisoformat(start_date)
|
34
|
+
|
35
|
+
if venue_name is None:
|
36
|
+
raise ValueError("venue_name is null")
|
37
|
+
if dt is None:
|
38
|
+
raise ValueError("dt is null")
|
39
|
+
venue_model = create_nba_nbacom_venue_model(venue_name, session, dt)
|
40
|
+
return GameModel(
|
41
|
+
dt=dt,
|
42
|
+
week=None,
|
43
|
+
game_number=None,
|
44
|
+
venue=venue_model,
|
45
|
+
teams=[
|
46
|
+
create_nba_nbacom_team_model(game["homeTeam"], session, dt),
|
47
|
+
create_nba_nbacom_team_model(game["awayTeam"], session, dt),
|
48
|
+
],
|
49
|
+
end_dt=None,
|
50
|
+
attendance=None,
|
51
|
+
league=League.NBA,
|
52
|
+
year=datetime.datetime.today().year,
|
53
|
+
season_type=None,
|
54
|
+
postponed=None,
|
55
|
+
play_off=None,
|
56
|
+
)
|
@@ -0,0 +1,40 @@
|
|
1
|
+
"""NBA NBA.com league model."""
|
2
|
+
|
3
|
+
# pylint: disable=too-many-statements,protected-access,too-many-locals,bare-except,too-many-branches,duplicate-code
|
4
|
+
import datetime
|
5
|
+
import logging
|
6
|
+
from typing import Iterator
|
7
|
+
|
8
|
+
import requests_cache
|
9
|
+
|
10
|
+
from ...game_model import GameModel
|
11
|
+
from ...league import League
|
12
|
+
from ...league_model import LeagueModel
|
13
|
+
from .nba_nbacom_game_model import create_nba_nbacom_game_model
|
14
|
+
|
15
|
+
|
16
|
+
class NBANBAComLeagueModel(LeagueModel):
|
17
|
+
"""NBA NBA.com implementation of the league model."""
|
18
|
+
|
19
|
+
def __init__(
|
20
|
+
self, session: requests_cache.CachedSession, position: int | None = None
|
21
|
+
) -> None:
|
22
|
+
super().__init__(League.AFL, session, position=position)
|
23
|
+
|
24
|
+
@classmethod
|
25
|
+
def name(cls) -> str:
|
26
|
+
return "nba-nbacom-league-model"
|
27
|
+
|
28
|
+
@property
|
29
|
+
def games(self) -> Iterator[GameModel]:
|
30
|
+
with self.session.cache_disabled():
|
31
|
+
date_slug = datetime.datetime.today().date().strftime("%Y%m%d")
|
32
|
+
response = self.session.get(
|
33
|
+
f"https://stats.nba.com/js/data/leaders/00_daily_lineups_{date_slug}.json"
|
34
|
+
)
|
35
|
+
if response.ok:
|
36
|
+
lineup = response.json()
|
37
|
+
for game in lineup["games"]:
|
38
|
+
yield create_nba_nbacom_game_model(game, self.session)
|
39
|
+
else:
|
40
|
+
logging.warning("Failed to fetch NBA daily lineups.")
|
@@ -0,0 +1,44 @@
|
|
1
|
+
"""NBA NBA.com player model."""
|
2
|
+
|
3
|
+
from typing import Any
|
4
|
+
|
5
|
+
from ...player_model import PlayerModel
|
6
|
+
|
7
|
+
|
8
|
+
def create_nba_nbacom_player_model(player_dict: dict[str, Any]) -> PlayerModel:
|
9
|
+
"""Create a player model from AFL AFL."""
|
10
|
+
return PlayerModel(
|
11
|
+
identifier=str(player_dict["personId"]),
|
12
|
+
jersey=None,
|
13
|
+
kicks=None,
|
14
|
+
fumbles=None,
|
15
|
+
fumbles_lost=None,
|
16
|
+
field_goals=None,
|
17
|
+
field_goals_attempted=None,
|
18
|
+
offensive_rebounds=None,
|
19
|
+
assists=None,
|
20
|
+
turnovers=None,
|
21
|
+
name=player_dict["playerName"],
|
22
|
+
marks=None,
|
23
|
+
handballs=None,
|
24
|
+
disposals=None,
|
25
|
+
goals=None,
|
26
|
+
behinds=None,
|
27
|
+
hit_outs=None,
|
28
|
+
tackles=None,
|
29
|
+
rebounds=None,
|
30
|
+
insides=None,
|
31
|
+
clearances=None,
|
32
|
+
clangers=None,
|
33
|
+
free_kicks_for=None,
|
34
|
+
free_kicks_against=None,
|
35
|
+
brownlow_votes=None,
|
36
|
+
contested_possessions=None,
|
37
|
+
uncontested_possessions=None,
|
38
|
+
contested_marks=None,
|
39
|
+
marks_inside=None,
|
40
|
+
one_percenters=None,
|
41
|
+
bounces=None,
|
42
|
+
goal_assists=None,
|
43
|
+
percentage_played=None,
|
44
|
+
)
|
@@ -0,0 +1,38 @@
|
|
1
|
+
"""NBA NBA.com team model."""
|
2
|
+
|
3
|
+
# pylint: disable=duplicate-code,too-many-arguments
|
4
|
+
import datetime
|
5
|
+
from typing import Any
|
6
|
+
|
7
|
+
import requests_cache
|
8
|
+
|
9
|
+
from ...google.google_news_model import create_google_news_models
|
10
|
+
from ...league import League
|
11
|
+
from ...team_model import TeamModel
|
12
|
+
from .nba_nbacom_player_model import create_nba_nbacom_player_model
|
13
|
+
|
14
|
+
|
15
|
+
def create_nba_nbacom_team_model(
|
16
|
+
team: dict[str, Any],
|
17
|
+
session: requests_cache.CachedSession,
|
18
|
+
dt: datetime.datetime,
|
19
|
+
) -> TeamModel:
|
20
|
+
"""Create a team model from AFL AFL."""
|
21
|
+
team_name = team["teamAbbreviation"]
|
22
|
+
return TeamModel(
|
23
|
+
identifier=str(team["teamId"]),
|
24
|
+
name=team_name,
|
25
|
+
location=None,
|
26
|
+
players=[create_nba_nbacom_player_model(x) for x in team["players"]],
|
27
|
+
odds=[],
|
28
|
+
points=None,
|
29
|
+
ladder_rank=None,
|
30
|
+
kicks=None,
|
31
|
+
news=create_google_news_models(team_name, session, dt, League.NBA),
|
32
|
+
social=[],
|
33
|
+
field_goals=None,
|
34
|
+
field_goals_attempted=None,
|
35
|
+
offensive_rebounds=None,
|
36
|
+
assists=None,
|
37
|
+
turnovers=None,
|
38
|
+
)
|
@@ -1,4 +1,4 @@
|
|
1
|
-
"""
|
1
|
+
"""NBA NBA.com venue model."""
|
2
2
|
|
3
3
|
# pylint: disable=too-many-statements,protected-access
|
4
4
|
import datetime
|
@@ -9,7 +9,7 @@ from ...google.google_address_model import create_google_address_model
|
|
9
9
|
from ...venue_model import VenueModel
|
10
10
|
|
11
11
|
|
12
|
-
def
|
12
|
+
def create_nba_nbacom_venue_model(
|
13
13
|
venue_name: str,
|
14
14
|
session: requests_cache.CachedSession,
|
15
15
|
dt: datetime.datetime,
|
@@ -95,6 +95,12 @@ sportsball/data/nba/nba/__init__.py
|
|
95
95
|
sportsball/data/nba/nba/nba_nba_game_model.py
|
96
96
|
sportsball/data/nba/nba/nba_nba_league_model.py
|
97
97
|
sportsball/data/nba/nba/nba_nba_team_model.py
|
98
|
+
sportsball/data/nba/nbacom/__init__.py
|
99
|
+
sportsball/data/nba/nbacom/nba_nbacom_game_model.py
|
100
|
+
sportsball/data/nba/nbacom/nba_nbacom_league_model.py
|
101
|
+
sportsball/data/nba/nbacom/nba_nbacom_player_model.py
|
102
|
+
sportsball/data/nba/nbacom/nba_nbacom_team_model.py
|
103
|
+
sportsball/data/nba/nbacom/nba_nbacom_venue_model.py
|
98
104
|
sportsball/data/nba/oddsportal/__init__.py
|
99
105
|
sportsball/data/nba/oddsportal/nba_oddsportal_league_model.py
|
100
106
|
sportsball/data/nba/sportsdb/__init__.py
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afltables/afl_afltables_game_model.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afltables/afl_afltables_team_model.py
RENAMED
File without changes
|
{sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afltables/afl_afltables_venue_model.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|