sportsball 0.3.124__tar.gz → 0.3.125__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.124/sportsball.egg-info → sportsball-0.3.125}/PKG-INFO +1 -1
- {sportsball-0.3.124 → sportsball-0.3.125}/setup.py +1 -1
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/__init__.py +1 -1
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/afl/afl_afl_player_model.py +1 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/afltables/afl_afltables_player_model.py +13 -6
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/afltables/afl_afltables_team_model.py +1 -5
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/combined/combined_player_model.py +5 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/espn/espn_player_model.py +3 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/google/google_address_model.py +78 -34
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nba/combined/nba_combined_league_model.py +1 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nba/nbacom/nba_nbacom_player_model.py +1 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/player_model.py +3 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/sportsreference/sportsreference_league_model.py +2 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/sportsreference/sportsreference_player_model.py +10 -1
- {sportsball-0.3.124 → sportsball-0.3.125/sportsball.egg-info}/PKG-INFO +1 -1
- sportsball-0.3.125/tests/data/afl/afltables/afl_afltables_game_model_test.py +134 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/afl/afltables/afl_afltables_player_model_test.py +2 -1
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/combined/combined_player_model_test.py +1 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/combined/combined_team_model_test.py +4 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/player_model_test.py +1 -0
- sportsball-0.3.124/tests/data/afl/afltables/afl_afltables_game_model_test.py +0 -42
- {sportsball-0.3.124 → sportsball-0.3.125}/LICENSE +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/MANIFEST.in +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/README.md +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/requirements.txt +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/setup.cfg +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/__main__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/args.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/cache.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/address_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/afl/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/afl/afl_afl_bookie_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/afl/afl_afl_game_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/afl/afl_afl_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/afl/afl_afl_odds_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/afl/afl_afl_team_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/afl/afl_afl_venue_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/afltables/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/afltables/afl_afltables_game_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/afltables/afl_afltables_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/afltables/afl_afltables_venue_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/aussportsbetting/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/aussportsbetting/afl_aussportsbetting_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/combined/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/combined/afl_combined_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/espn/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/espn/afl_espn_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/oddsportal/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/oddsportal/afl_oddsportal_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/aussportsbetting/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/aussportsbetting/aussportsbetting_bookie_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/aussportsbetting/aussportsbetting_game_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/aussportsbetting/aussportsbetting_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/aussportsbetting/aussportsbetting_odds_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/aussportsbetting/aussportsbetting_team_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/aussportsbetting/aussportsbetting_venue_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/bookie_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/combined/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/combined/combined_address_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/combined/combined_game_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/combined/combined_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/combined/combined_team_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/combined/combined_venue_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/combined/combined_weather_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/combined/null_check.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/espn/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/espn/espn_bookie_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/espn/espn_game_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/espn/espn_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/espn/espn_odds_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/espn/espn_team_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/espn/espn_venue_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/field_type.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/game_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/google/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/google/google_news_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/league.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nba/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nba/combined/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nba/espn/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nba/espn/nba_espn_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nba/nba/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nba/nba/nba_nba_game_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nba/nba/nba_nba_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nba/nba/nba_nba_team_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nba/nbacom/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nba/nbacom/nba_nbacom_game_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nba/nbacom/nba_nbacom_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nba/nbacom/nba_nbacom_team_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nba/nbacom/nba_nbacom_venue_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nba/oddsportal/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nba/oddsportal/nba_oddsportal_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nba/sportsdb/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nba/sportsdb/nba_sportsdb_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nba/sportsreference/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nba/sportsreference/nba_sportsreference_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/ncaab/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/ncaab/combined/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/ncaab/combined/ncaab_combined_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/ncaab/espn/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/ncaab/espn/ncaab_espn_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/ncaab/oddsportal/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/ncaab/oddsportal/ncaab_oddsportal_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/ncaab/sportsreference/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/ncaab/sportsreference/ncaab_sportsreference_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/ncaaf/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/ncaaf/combined/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/ncaaf/combined/ncaaf_combined_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/ncaaf/espn/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/ncaaf/espn/ncaaf_espn_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/ncaaf/oddsportal/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/ncaaf/oddsportal/ncaaf_oddsportal_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/news_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nfl/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nfl/aussportsbetting/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nfl/aussportsbetting/nfl_aussportsbetting_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nfl/combined/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nfl/combined/nfl_combined_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nfl/espn/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nfl/espn/nfl_espn_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nfl/oddsportal/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nfl/oddsportal/nfl_oddsportal_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nfl/sportsdb/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nfl/sportsdb/nfl_sportsdb_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/odds_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/oddsportal/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/oddsportal/decrypt.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/oddsportal/oddsportal_bookie_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/oddsportal/oddsportal_game_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/oddsportal/oddsportal_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/oddsportal/oddsportal_odds_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/oddsportal/oddsportal_team_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/oddsportal/oddsportal_venue_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/season_type.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/social_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/sportsdb/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/sportsdb/sportsdb_game_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/sportsdb/sportsdb_league_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/sportsdb/sportsdb_team_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/sportsdb/sportsdb_venue_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/sportsreference/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/sportsreference/sportsreference_game_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/sportsreference/sportsreference_team_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/sportsreference/sportsreference_venue_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/team_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/venue_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/weather/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/weather/gribstream/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/weather/gribstream/gribstream_weather_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/weather/multi_weather_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/weather/openmeteo/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/weather/openmeteo/openmeteo_weather_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/weather_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/wikipedia/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/wikipedia/wikipedia_venue_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/x/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/x/x_social_model.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/logger.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/loglevel.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/playwright.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/proxy_session.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/session.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/sportsball.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/vendor/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball/vendor/pygooglenews/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball.egg-info/SOURCES.txt +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball.egg-info/dependency_links.txt +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball.egg-info/entry_points.txt +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball.egg-info/not-zip-safe +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball.egg-info/requires.txt +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/sportsball.egg-info/top_level.txt +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/afl/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/afl/afl/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/afl/afl/afl_afl_game_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/afl/afl/afl_afl_league_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/afl/afltables/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/afl/afltables/afl_afltables_league_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/aussportsbetting/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/aussportsbetting/aussportsbetting_game_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/combined/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/combined/combined_game_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/espn/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/espn/espn_game_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/espn/espn_player_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/game_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/google/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/google/google_address_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/google/google_news_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/nba/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/nba/nba/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/nba/nba/nba_nba_game_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/nba/nba/nba_nba_league_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/nba/nba/nba_nba_team_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/nba/sportsdb/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/nba/sportsdb/nba_sportsdb_league_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/nba/sportsreference/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/nba/sportsreference/nba_sportsreference_league_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/ncaab/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/ncaab/sportsreference/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/ncaab/sportsreference/ncaab_sportsreference_league_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/nfl/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/nfl/sportsdb/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/nfl/sportsdb/nfl_sportsdb_league_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/oddsportal/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/oddsportal/decrypt_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/oddsportal/oddsportal_game_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/oddsportal/oddsportal_league_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/social_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/sportsdb/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/sportsdb/sportsdb_game_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/sportsdb/sportsdb_league_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/sportsdb/sportsdb_team_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/sportsdb/sportsdb_venue_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/sportsreference/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/sportsreference/sportsreference_game_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/sportsreference/sportsreference_league_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/sportsreference/sportsreference_player_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/sportsreference/sportsreference_team_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/sportsreference/sportsreference_venue_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/team_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/x/__init__.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/data/x/x_social_model_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/tests/proxy_session_test.py +0 -0
- {sportsball-0.3.124 → sportsball-0.3.125}/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.125',
|
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,12 +1,13 @@
|
|
1
1
|
"""AFL AFLTables player model."""
|
2
2
|
|
3
3
|
# pylint: disable=line-too-long,duplicate-code,too-many-arguments,too-many-locals
|
4
|
-
import datetime
|
5
4
|
import os
|
6
5
|
from urllib.parse import urlparse
|
7
6
|
|
8
7
|
import pytest_is_running
|
9
8
|
import requests_cache
|
9
|
+
from bs4 import BeautifulSoup
|
10
|
+
from dateutil.parser import parse
|
10
11
|
|
11
12
|
from ....cache import MEMORY
|
12
13
|
from ...player_model import PlayerModel
|
@@ -39,11 +40,16 @@ def _create_afl_afltables_player_model(
|
|
39
40
|
bounces: int | None,
|
40
41
|
goal_assists: int | None,
|
41
42
|
percentage_played: float | None,
|
43
|
+
session: requests_cache.CachedSession,
|
42
44
|
) -> PlayerModel:
|
43
45
|
o = urlparse(player_url)
|
44
46
|
last_component = o.path.split("/")[-1]
|
45
47
|
identifier, _ = os.path.splitext(last_component)
|
46
48
|
jersey = "".join(filter(str.isdigit, jersey))
|
49
|
+
response = session.get(player_url)
|
50
|
+
response.raise_for_status()
|
51
|
+
soup = BeautifulSoup(response.text, "lxml")
|
52
|
+
birth_date = parse(soup.get_text().split("Born:")[1].strip().split()[0].strip())
|
47
53
|
return PlayerModel(
|
48
54
|
identifier=identifier,
|
49
55
|
jersey=jersey,
|
@@ -78,6 +84,7 @@ def _create_afl_afltables_player_model(
|
|
78
84
|
bounces=bounces,
|
79
85
|
goal_assists=goal_assists,
|
80
86
|
percentage_played=percentage_played,
|
87
|
+
birth_date=birth_date,
|
81
88
|
)
|
82
89
|
|
83
90
|
|
@@ -109,6 +116,7 @@ def _cached_create_afl_afltables_player_model(
|
|
109
116
|
bounces: int | None,
|
110
117
|
goal_assists: int | None,
|
111
118
|
percentage_played: float | None,
|
119
|
+
session: requests_cache.CachedSession,
|
112
120
|
) -> PlayerModel:
|
113
121
|
return _create_afl_afltables_player_model(
|
114
122
|
player_url,
|
@@ -137,6 +145,7 @@ def _cached_create_afl_afltables_player_model(
|
|
137
145
|
bounces,
|
138
146
|
goal_assists,
|
139
147
|
percentage_played,
|
148
|
+
session,
|
140
149
|
)
|
141
150
|
|
142
151
|
|
@@ -144,7 +153,6 @@ def create_afl_afltables_player_model(
|
|
144
153
|
player_url: str,
|
145
154
|
jersey: str,
|
146
155
|
kicks: int | None,
|
147
|
-
dt: datetime.datetime,
|
148
156
|
session: requests_cache.CachedSession,
|
149
157
|
name: str,
|
150
158
|
marks: int | None,
|
@@ -171,10 +179,7 @@ def create_afl_afltables_player_model(
|
|
171
179
|
percentage_played: float | None,
|
172
180
|
) -> PlayerModel:
|
173
181
|
"""Create a player model from AFL Tables."""
|
174
|
-
if (
|
175
|
-
not pytest_is_running.is_running()
|
176
|
-
and dt < datetime.datetime.now() - datetime.timedelta(days=7)
|
177
|
-
):
|
182
|
+
if not pytest_is_running.is_running():
|
178
183
|
return _cached_create_afl_afltables_player_model(
|
179
184
|
player_url,
|
180
185
|
jersey,
|
@@ -202,6 +207,7 @@ def create_afl_afltables_player_model(
|
|
202
207
|
bounces,
|
203
208
|
goal_assists,
|
204
209
|
percentage_played,
|
210
|
+
session,
|
205
211
|
)
|
206
212
|
with session.cache_disabled():
|
207
213
|
return _create_afl_afltables_player_model(
|
@@ -231,4 +237,5 @@ def create_afl_afltables_player_model(
|
|
231
237
|
bounces,
|
232
238
|
goal_assists,
|
233
239
|
percentage_played,
|
240
|
+
session,
|
234
241
|
)
|
{sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/afl/afltables/afl_afltables_team_model.py
RENAMED
@@ -104,7 +104,6 @@ def _create_afl_afltables_team_model(
|
|
104
104
|
player_url,
|
105
105
|
jersey,
|
106
106
|
kicks,
|
107
|
-
dt,
|
108
107
|
session,
|
109
108
|
name,
|
110
109
|
marks,
|
@@ -231,10 +230,7 @@ def create_afl_afltables_team_model(
|
|
231
230
|
league: League,
|
232
231
|
) -> TeamModel:
|
233
232
|
"""Create a team model from AFL Tables."""
|
234
|
-
if (
|
235
|
-
not pytest_is_running.is_running()
|
236
|
-
and dt < datetime.datetime.now() - datetime.timedelta(days=7)
|
237
|
-
):
|
233
|
+
if not pytest_is_running.is_running():
|
238
234
|
return _cached_create_afl_afltables_team_model(
|
239
235
|
team_url, players, points, session, last_ladder_ranks, dt, league
|
240
236
|
)
|
@@ -41,6 +41,7 @@ def create_combined_player_model(
|
|
41
41
|
bounces = None
|
42
42
|
goal_assists = None
|
43
43
|
percentage_played = None
|
44
|
+
birth_date = None
|
44
45
|
for player_model in player_models:
|
45
46
|
player_model_jersey = player_model.jersey
|
46
47
|
if not is_null(player_model_jersey):
|
@@ -138,6 +139,9 @@ def create_combined_player_model(
|
|
138
139
|
player_model_percentage_played = player_model.percentage_played
|
139
140
|
if not is_null(player_model_percentage_played):
|
140
141
|
percentage_played = player_model_percentage_played
|
142
|
+
player_model_birth_date = player_model.birth_date
|
143
|
+
if not is_null(player_model_birth_date):
|
144
|
+
birth_date = player_model_birth_date
|
141
145
|
if name is None:
|
142
146
|
raise ValueError("name is null.")
|
143
147
|
return PlayerModel(
|
@@ -174,4 +178,5 @@ def create_combined_player_model(
|
|
174
178
|
bounces=bounces,
|
175
179
|
goal_assists=goal_assists,
|
176
180
|
percentage_played=percentage_played,
|
181
|
+
birth_date=birth_date,
|
177
182
|
)
|
@@ -6,6 +6,7 @@ from typing import Any
|
|
6
6
|
|
7
7
|
import pytest_is_running
|
8
8
|
import requests_cache
|
9
|
+
from dateutil.parser import parse
|
9
10
|
|
10
11
|
from ...cache import MEMORY
|
11
12
|
from ..player_model import PlayerModel
|
@@ -33,6 +34,7 @@ def _create_espn_player_model(
|
|
33
34
|
athlete_response.raise_for_status()
|
34
35
|
athlete_dict = athlete_response.json()
|
35
36
|
name = athlete_dict["fullName"]
|
37
|
+
birth_date = parse(athlete_dict["dateOfBirth"]).date()
|
36
38
|
return PlayerModel(
|
37
39
|
identifier=identifier,
|
38
40
|
jersey=jersey,
|
@@ -67,6 +69,7 @@ def _create_espn_player_model(
|
|
67
69
|
bounces=None,
|
68
70
|
goal_assists=None,
|
69
71
|
percentage_played=None,
|
72
|
+
birth_date=birth_date,
|
70
73
|
)
|
71
74
|
|
72
75
|
|
@@ -2620,6 +2620,33 @@ MCCAMISH_PAVILION = SportsballGeocodeTuple(
|
|
2620
2620
|
housenumber="965",
|
2621
2621
|
country="USA",
|
2622
2622
|
)
|
2623
|
+
TUDOR_FIELDHOUSE = SportsballGeocodeTuple(
|
2624
|
+
city="Houston",
|
2625
|
+
state="TX",
|
2626
|
+
postal="77251",
|
2627
|
+
lat=29.715102,
|
2628
|
+
lng=-95.403895,
|
2629
|
+
housenumber="6100",
|
2630
|
+
country="USA",
|
2631
|
+
)
|
2632
|
+
HAGAN_ARENA = SportsballGeocodeTuple(
|
2633
|
+
city="Philadelphia",
|
2634
|
+
state="PA",
|
2635
|
+
postal="",
|
2636
|
+
lat=39.995245,
|
2637
|
+
lng=-75.234806,
|
2638
|
+
housenumber="",
|
2639
|
+
country="USA",
|
2640
|
+
)
|
2641
|
+
COORS_EVENTS_CONFERENCE_CENTER = SportsballGeocodeTuple(
|
2642
|
+
city="Boulder",
|
2643
|
+
state="CO",
|
2644
|
+
postal="",
|
2645
|
+
lat=40.0047,
|
2646
|
+
lng=-105.2606,
|
2647
|
+
housenumber="950",
|
2648
|
+
country="USA",
|
2649
|
+
)
|
2623
2650
|
_CACHED_GEOCODES: dict[str, Any] = {
|
2624
2651
|
"S.C.G. - Australia": SCG,
|
2625
2652
|
"Victoria Park - Australia": SportsballGeocodeTuple(
|
@@ -4566,15 +4593,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
4566
4593
|
housenumber="820",
|
4567
4594
|
country="USA",
|
4568
4595
|
),
|
4569
|
-
"Hagan Arena, Philadelphia, Pennsylvania":
|
4570
|
-
city="Philadelphia",
|
4571
|
-
state="PA",
|
4572
|
-
postal="",
|
4573
|
-
lat=39.995245,
|
4574
|
-
lng=-75.234806,
|
4575
|
-
housenumber="",
|
4576
|
-
country="USA",
|
4577
|
-
),
|
4596
|
+
"Hagan Arena, Philadelphia, Pennsylvania": HAGAN_ARENA,
|
4578
4597
|
"Wells Fargo Center, Philadelphia, Pennsylvania": SPECTRUM,
|
4579
4598
|
"UW-Milwaukee Panther Arena, Milwaukee, Wisconsin": MILWAUKEE_ARENA,
|
4580
4599
|
"Pauley Pavilion, Los Angeles, California": SportsballGeocodeTuple(
|
@@ -5313,15 +5332,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
5313
5332
|
housenumber="601",
|
5314
5333
|
country="USA",
|
5315
5334
|
),
|
5316
|
-
"Coors Events/Conference Center, Boulder, Colorado":
|
5317
|
-
city="Boulder",
|
5318
|
-
state="CO",
|
5319
|
-
postal="",
|
5320
|
-
lat=40.0047,
|
5321
|
-
lng=-105.2606,
|
5322
|
-
housenumber="950",
|
5323
|
-
country="USA",
|
5324
|
-
),
|
5335
|
+
"Coors Events/Conference Center, Boulder, Colorado": COORS_EVENTS_CONFERENCE_CENTER,
|
5325
5336
|
"Hamilton Gymnasium, Denver, Colorado": SportsballGeocodeTuple(
|
5326
5337
|
city="Denver",
|
5327
5338
|
state="CO",
|
@@ -5539,15 +5550,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
5539
5550
|
),
|
5540
5551
|
"Charles Koch Arena, Wichita, Kansas": CHARLES_KOCH_ARENA,
|
5541
5552
|
"CHI Health Center Omaha, Omaha, Nebraska": CHI_HEALTH_CENTER,
|
5542
|
-
"Tudor Fieldhouse, Houston, Texas":
|
5543
|
-
city="Houston",
|
5544
|
-
state="TX",
|
5545
|
-
postal="77251",
|
5546
|
-
lat=29.715102,
|
5547
|
-
lng=-95.403895,
|
5548
|
-
housenumber="6100",
|
5549
|
-
country="USA",
|
5550
|
-
),
|
5553
|
+
"Tudor Fieldhouse, Houston, Texas": TUDOR_FIELDHOUSE,
|
5551
5554
|
"Show Me Center, Cape Girardeau, Missouri": SportsballGeocodeTuple(
|
5552
5555
|
city="Cape Girardeau",
|
5553
5556
|
state="MO",
|
@@ -6228,7 +6231,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
6228
6231
|
),
|
6229
6232
|
"Mizzou Arena, Columbia, Missouri": SportsballGeocodeTuple(
|
6230
6233
|
city="Columbia",
|
6231
|
-
state="
|
6234
|
+
state="MO",
|
6232
6235
|
postal="65211",
|
6233
6236
|
lat=38.93237,
|
6234
6237
|
lng=-92.33303,
|
@@ -7637,7 +7640,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
7637
7640
|
),
|
7638
7641
|
"T-Mobile Center, Kansas City, Missouri": SportsballGeocodeTuple(
|
7639
7642
|
city="Kansas City",
|
7640
|
-
state="
|
7643
|
+
state="MO",
|
7641
7644
|
postal="",
|
7642
7645
|
lat=39.0975,
|
7643
7646
|
lng=-94.580278,
|
@@ -10383,7 +10386,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
10383
10386
|
"ExploreAsheville.com Arena, Asheville, North Carolina": HARRAHS_CHEROKEE_CENTER,
|
10384
10387
|
"St. Louis, Missouri": SportsballGeocodeTuple(
|
10385
10388
|
city="St. Louis",
|
10386
|
-
state="
|
10389
|
+
state="MO",
|
10387
10390
|
postal="",
|
10388
10391
|
lat=38.627222,
|
10389
10392
|
lng=-90.197778,
|
@@ -10500,7 +10503,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
10500
10503
|
),
|
10501
10504
|
"Springfield, Missouri": SportsballGeocodeTuple(
|
10502
10505
|
city="Springfield",
|
10503
|
-
state="
|
10506
|
+
state="MO",
|
10504
10507
|
postal="",
|
10505
10508
|
lat=37.215278,
|
10506
10509
|
lng=-93.298333,
|
@@ -10894,7 +10897,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
10894
10897
|
),
|
10895
10898
|
"Sikeston Field House, Sikeston, Missouri": SportsballGeocodeTuple(
|
10896
10899
|
city="Sikeston",
|
10897
|
-
state="
|
10900
|
+
state="MO",
|
10898
10901
|
postal="63801",
|
10899
10902
|
lat=36.87943,
|
10900
10903
|
lng=-89.57209,
|
@@ -10994,7 +10997,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
10994
10997
|
),
|
10995
10998
|
"Columbia, Missouri": SportsballGeocodeTuple(
|
10996
10999
|
city="Columbia",
|
10997
|
-
state="
|
11000
|
+
state="MO",
|
10998
11001
|
postal="",
|
10999
11002
|
lat=38.9475,
|
11000
11003
|
lng=-92.326667,
|
@@ -11462,7 +11465,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
11462
11465
|
"Miami Beach Auditorium, Miami Beach, Florida": MIAMI_BEACH_CONVENTION_CENTER,
|
11463
11466
|
"Kiel Auditorium, St. Louis, Missouri": SportsballGeocodeTuple(
|
11464
11467
|
city="St. Louis",
|
11465
|
-
state="
|
11468
|
+
state="MO",
|
11466
11469
|
postal="63103",
|
11467
11470
|
lat=38.627972,
|
11468
11471
|
lng=-90.201782,
|
@@ -13934,6 +13937,47 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
13934
13937
|
country="USA",
|
13935
13938
|
),
|
13936
13939
|
"Madison Square Garden, New York, NY": MADISON_SQUARE_GARDEN,
|
13940
|
+
"Hoffman Estates, Illinois": SportsballGeocodeTuple(
|
13941
|
+
city="Hoffman Estates",
|
13942
|
+
state="IL",
|
13943
|
+
postal="",
|
13944
|
+
lat=42.063889,
|
13945
|
+
lng=-88.146944,
|
13946
|
+
housenumber="",
|
13947
|
+
country="USA",
|
13948
|
+
),
|
13949
|
+
"Bojangles Coliseum, Charlotte, North Carolina": SportsballGeocodeTuple(
|
13950
|
+
city="Charlotte",
|
13951
|
+
state="NC",
|
13952
|
+
postal="",
|
13953
|
+
lat=35.205164,
|
13954
|
+
lng=-80.795103,
|
13955
|
+
housenumber="2700",
|
13956
|
+
country="USA",
|
13957
|
+
),
|
13958
|
+
"Rice Gymnasium, Houston, Texas": TUDOR_FIELDHOUSE,
|
13959
|
+
"Alumni Memorial Fieldhouse, Philadelphia, Pennsylvania": HAGAN_ARENA,
|
13960
|
+
"Colonial Center, Columbia, South Carolina": COLONIAL_LIFE_ARENA,
|
13961
|
+
"F. Mitchell Johnson Center, Charleston, South Carolina": SportsballGeocodeTuple(
|
13962
|
+
city="Charleston",
|
13963
|
+
state="SC",
|
13964
|
+
postal="",
|
13965
|
+
lat=32.785278,
|
13966
|
+
lng=-79.934167,
|
13967
|
+
housenumber="",
|
13968
|
+
country="USA",
|
13969
|
+
),
|
13970
|
+
"Coors Events Center, Boulder, Colorado": COORS_EVENTS_CONFERENCE_CENTER,
|
13971
|
+
"Target Center, Minneapolis, MN": TARGET_CENTER,
|
13972
|
+
"Hammons Student Center, Springfield, Missouri": SportsballGeocodeTuple(
|
13973
|
+
city="Springfield",
|
13974
|
+
state="MO",
|
13975
|
+
postal="",
|
13976
|
+
lat=37.202222,
|
13977
|
+
lng=-93.284444,
|
13978
|
+
housenumber="",
|
13979
|
+
country="USA",
|
13980
|
+
),
|
13937
13981
|
}
|
13938
13982
|
|
13939
13983
|
|
{sportsball-0.3.124 → sportsball-0.3.125}/sportsball/data/nba/combined/nba_combined_league_model.py
RENAMED
@@ -889,6 +889,7 @@ NBA_VENUE_IDENTITY_MAP: dict[str, str] = {
|
|
889
889
|
# NBACom
|
890
890
|
"Paycom Center, Oklahoma City, OK": PAYCOM_CENTER,
|
891
891
|
"Madison Square Garden, New York, NY": MADISON_SQUARE_GARDEN,
|
892
|
+
"Target Center, Minneapolis, MN": TARGET_CENTER,
|
892
893
|
}
|
893
894
|
NBA_PLAYER_IDENTITY_MAP: dict[str, str] = {}
|
894
895
|
|
@@ -1,5 +1,6 @@
|
|
1
1
|
"""The prototype class for a player."""
|
2
2
|
|
3
|
+
import datetime
|
3
4
|
from typing import Literal
|
4
5
|
|
5
6
|
from pydantic import BaseModel, Field
|
@@ -42,6 +43,7 @@ PLAYER_BOUNCES_COLUMN: Literal["bounces"] = "bounces"
|
|
42
43
|
PLAYER_GOAL_ASSISTS_COLUMN: Literal["goal_assists"] = "goal_assists"
|
43
44
|
PLAYER_PERCENTAGE_PLAYED_COLUMN: Literal["percentage_played"] = "percentage_played"
|
44
45
|
PLAYER_NAME_COLUMN: Literal["name"] = "name"
|
46
|
+
PLAYER_BIRTH_DATE_COLUMN: Literal["birth_date"] = "birth_date"
|
45
47
|
|
46
48
|
|
47
49
|
class PlayerModel(BaseModel):
|
@@ -204,3 +206,4 @@ class PlayerModel(BaseModel):
|
|
204
206
|
json_schema_extra={TYPE_KEY: FieldType.LOOKAHEAD},
|
205
207
|
alias=PLAYER_PERCENTAGE_PLAYED_COLUMN,
|
206
208
|
)
|
209
|
+
birth_date: datetime.date | None = Field(..., alias=PLAYER_BIRTH_DATE_COLUMN)
|
@@ -41,6 +41,8 @@ BAD_URLS = {
|
|
41
41
|
"https://www.sports-reference.com/cbb/boxscores/2009-04-01-texas-el-paso.html",
|
42
42
|
"https://www.sports-reference.com/cbb/boxscores/2009-03-15-florida-state.html",
|
43
43
|
"https://www.sports-reference.com/cbb/boxscores/2009-03-15-purdue.html",
|
44
|
+
"https://www.sports-reference.com/cbb/boxscores/2008-11-19-alabama-am_w.html",
|
45
|
+
"https://www.sports-reference.com/cbb/boxscores/2008-04-04-tulsa.html",
|
44
46
|
}
|
45
47
|
|
46
48
|
|
@@ -6,9 +6,11 @@ import http
|
|
6
6
|
import logging
|
7
7
|
from urllib.parse import unquote
|
8
8
|
|
9
|
+
import extruct # type: ignore
|
9
10
|
import pytest_is_running
|
10
11
|
import requests_cache
|
11
12
|
from bs4 import BeautifulSoup
|
13
|
+
from dateutil.parser import parse
|
12
14
|
|
13
15
|
from ...cache import MEMORY
|
14
16
|
from ...session import DEFAULT_TIMEOUT
|
@@ -52,7 +54,7 @@ def _create_sportsreference_player_model(
|
|
52
54
|
assists: dict[str, int],
|
53
55
|
turnovers: dict[str, int],
|
54
56
|
) -> PlayerModel | None:
|
55
|
-
"""Create a player model from
|
57
|
+
"""Create a player model from sports reference."""
|
56
58
|
player_url = _fix_url(player_url)
|
57
59
|
response = session.get(player_url, timeout=DEFAULT_TIMEOUT)
|
58
60
|
# Some players can't be accessed on sports reference
|
@@ -66,6 +68,12 @@ def _create_sportsreference_player_model(
|
|
66
68
|
logging.warning("h1 is null for %s", player_url)
|
67
69
|
return None
|
68
70
|
name = h1.get_text().strip()
|
71
|
+
data = extruct.extract(response.text, base_url=response.url)
|
72
|
+
birth_date = None
|
73
|
+
for jsonld in data["json-ld"]:
|
74
|
+
if jsonld["@type"] != "Person":
|
75
|
+
continue
|
76
|
+
birth_date = parse(jsonld["birthDate"])
|
69
77
|
return PlayerModel(
|
70
78
|
identifier=name,
|
71
79
|
jersey=None,
|
@@ -100,6 +108,7 @@ def _create_sportsreference_player_model(
|
|
100
108
|
bounces=None,
|
101
109
|
goal_assists=None,
|
102
110
|
percentage_played=None,
|
111
|
+
birth_date=birth_date,
|
103
112
|
)
|
104
113
|
|
105
114
|
|
@@ -0,0 +1,134 @@
|
|
1
|
+
"""Tests for the afltables game model class."""
|
2
|
+
import unittest
|
3
|
+
import os
|
4
|
+
import datetime
|
5
|
+
|
6
|
+
import requests_cache
|
7
|
+
import requests_mock
|
8
|
+
from sportsball.data.afl.afltables.afl_afltables_game_model import _create_afl_afltables_game_model
|
9
|
+
from sportsball.data.league import League
|
10
|
+
|
11
|
+
|
12
|
+
class TestAFLTablesGameModel(unittest.TestCase):
|
13
|
+
|
14
|
+
def setUp(self):
|
15
|
+
self._session = requests_cache.CachedSession(backend="memory")
|
16
|
+
self.dir = os.path.dirname(__file__)
|
17
|
+
|
18
|
+
def test_player_identifier(self):
|
19
|
+
url = "https://afltables.com/afl/stats/games/2025/081820250330.html"
|
20
|
+
with requests_mock.Mocker() as m:
|
21
|
+
with open(os.path.join(self.dir, "081820250330.html"), "rb") as f:
|
22
|
+
m.get(url, content=f.read())
|
23
|
+
with open(os.path.join(self.dir, "perth.html"), "rb") as f:
|
24
|
+
m.get("https://afltables.com/afl/venues/perth.html", content=f.read())
|
25
|
+
with open(os.path.join(self.dir, "westcoast_idx.html"), "rb") as f:
|
26
|
+
m.get("https://afltables.com/afl/teams/westcoast_idx.html", content=f.read())
|
27
|
+
with open(os.path.join(self.dir, "fremantle_idx.html"), "rb") as f:
|
28
|
+
m.get("https://afltables.com/afl/teams/fremantle_idx.html", content=f.read())
|
29
|
+
with open(os.path.join(self.dir, "Oscar_Allen.html"), "rb") as f:
|
30
|
+
m.get("https://afltables.com/afl/stats/players/O/Oscar_Allen.html", content=f.read())
|
31
|
+
with open(os.path.join(self.dir, "Liam_Baker.html"), "rb") as f:
|
32
|
+
m.get("https://afltables.com/afl/stats/players/L/Liam_Baker.html", content=f.read())
|
33
|
+
with open(os.path.join(self.dir, "Tyler_Brockman.html"), "rb") as f:
|
34
|
+
m.get("https://afltables.com/afl/stats/players/T/Tyler_Brockman.html", content=f.read())
|
35
|
+
with open(os.path.join(self.dir, "Tom_Cole.html"), "rb") as f:
|
36
|
+
m.get("https://afltables.com/afl/stats/players/T/Tom_Cole.html", content=f.read())
|
37
|
+
with open(os.path.join(self.dir, "Jamie_Cripps.html"), "rb") as f:
|
38
|
+
m.get("https://afltables.com/afl/stats/players/J/Jamie_Cripps.html", content=f.read())
|
39
|
+
with open(os.path.join(self.dir, "Tyrell_Dewar.html"), "rb") as f:
|
40
|
+
m.get("https://afltables.com/afl/stats/players/T/Tyrell_Dewar.html", content=f.read())
|
41
|
+
with open(os.path.join(self.dir, "Liam_Duggan.html"), "rb") as f:
|
42
|
+
m.get("https://afltables.com/afl/stats/players/L/Liam_Duggan.html", content=f.read())
|
43
|
+
with open(os.path.join(self.dir, "Harry_Edwards.html"), "rb") as f:
|
44
|
+
m.get("https://afltables.com/afl/stats/players/H/Harry_Edwards.html", content=f.read())
|
45
|
+
with open(os.path.join(self.dir, "Reuben_Ginbey.html"), "rb") as f:
|
46
|
+
m.get("https://afltables.com/afl/stats/players/R/Reuben_Ginbey.html", content=f.read())
|
47
|
+
with open(os.path.join(self.dir, "Jack_Graham.html"), "rb") as f:
|
48
|
+
m.get("https://afltables.com/afl/stats/players/J/Jack_Graham.html", content=f.read())
|
49
|
+
with open(os.path.join(self.dir, "Elijah_Hewett.html"), "rb") as f:
|
50
|
+
m.get("https://afltables.com/afl/stats/players/E/Elijah_Hewett.html", content=f.read())
|
51
|
+
with open(os.path.join(self.dir, "Brady_Hough.html"), "rb") as f:
|
52
|
+
m.get("https://afltables.com/afl/stats/players/B/Brady_Hough.html", content=f.read())
|
53
|
+
with open(os.path.join(self.dir, "Jayden_Hunt.html"), "rb") as f:
|
54
|
+
m.get("https://afltables.com/afl/stats/players/J/Jayden_Hunt.html", content=f.read())
|
55
|
+
with open(os.path.join(self.dir, "Tim_Kelly.html"), "rb") as f:
|
56
|
+
m.get("https://afltables.com/afl/stats/players/T/Tim_Kelly.html", content=f.read())
|
57
|
+
with open(os.path.join(self.dir, "Noah_Long.html"), "rb") as f:
|
58
|
+
m.get("https://afltables.com/afl/stats/players/N/Noah_Long.html", content=f.read())
|
59
|
+
with open(os.path.join(self.dir, "Ryan_Maric.html"), "rb") as f:
|
60
|
+
m.get("https://afltables.com/afl/stats/players/R/Ryan_Maric.html", content=f.read())
|
61
|
+
with open(os.path.join(self.dir, "Jeremy_McGovern.html"), "rb") as f:
|
62
|
+
m.get("https://afltables.com/afl/stats/players/J/Jeremy_McGovern.html", content=f.read())
|
63
|
+
with open(os.path.join(self.dir, "Matthew_Owies.html"), "rb") as f:
|
64
|
+
m.get("https://afltables.com/afl/stats/players/M/Matthew_Owies.html", content=f.read())
|
65
|
+
with open(os.path.join(self.dir, "Archer_Reid.html"), "rb") as f:
|
66
|
+
m.get("https://afltables.com/afl/stats/players/A/Archer_Reid.html", content=f.read())
|
67
|
+
with open(os.path.join(self.dir, "Harley_Reid.html"), "rb") as f:
|
68
|
+
m.get("https://afltables.com/afl/stats/players/H/Harley_Reid.html", content=f.read())
|
69
|
+
with open(os.path.join(self.dir, "Liam_Ryan.html"), "rb") as f:
|
70
|
+
m.get("https://afltables.com/afl/stats/players/L/Liam_Ryan.html", content=f.read())
|
71
|
+
with open(os.path.join(self.dir, "Bailey_Williams1.html"), "rb") as f:
|
72
|
+
m.get("https://afltables.com/afl/stats/players/B/Bailey_Williams1.html", content=f.read())
|
73
|
+
with open(os.path.join(self.dir, "Jack_Williams.html"), "rb") as f:
|
74
|
+
m.get("https://afltables.com/afl/stats/players/J/Jack_Williams.html", content=f.read())
|
75
|
+
with open(os.path.join(self.dir, "James_Aish.html"), "rb") as f:
|
76
|
+
m.get("https://afltables.com/afl/stats/players/J/James_Aish.html", content=f.read())
|
77
|
+
with open(os.path.join(self.dir, "Jye_Amiss.html"), "rb") as f:
|
78
|
+
m.get("https://afltables.com/afl/stats/players/J/Jye_Amiss.html", content=f.read())
|
79
|
+
with open(os.path.join(self.dir, "Bailey_Banfield.html"), "rb") as f:
|
80
|
+
m.get("https://afltables.com/afl/stats/players/B/Bailey_Banfield.html", content=f.read())
|
81
|
+
with open(os.path.join(self.dir, "Shai_Bolton.html"), "rb") as f:
|
82
|
+
m.get("https://afltables.com/afl/stats/players/S/Shai_Bolton.html", content=f.read())
|
83
|
+
with open(os.path.join(self.dir, "Andrew_Brayshaw.html"), "rb") as f:
|
84
|
+
m.get("https://afltables.com/afl/stats/players/A/Andrew_Brayshaw.html", content=f.read())
|
85
|
+
with open(os.path.join(self.dir, "Heath_Chapman.html"), "rb") as f:
|
86
|
+
m.get("https://afltables.com/afl/stats/players/H/Heath_Chapman.html", content=f.read())
|
87
|
+
with open(os.path.join(self.dir, "Jordan_Clark.html"), "rb") as f:
|
88
|
+
m.get("https://afltables.com/afl/stats/players/J/Jordan_Clark.html", content=f.read())
|
89
|
+
with open(os.path.join(self.dir, "Brennan_Cox.html"), "rb") as f:
|
90
|
+
m.get("https://afltables.com/afl/stats/players/B/Brennan_Cox.html", content=f.read())
|
91
|
+
with open(os.path.join(self.dir, "Josh_Draper.html"), "rb") as f:
|
92
|
+
m.get("https://afltables.com/afl/stats/players/J/Josh_Draper.html", content=f.read())
|
93
|
+
with open(os.path.join(self.dir, "Isaiah_Dudley.html"), "rb") as f:
|
94
|
+
m.get("https://afltables.com/afl/stats/players/I/Isaiah_Dudley.html", content=f.read())
|
95
|
+
with open(os.path.join(self.dir, "Neil_Erasmus.html"), "rb") as f:
|
96
|
+
m.get("https://afltables.com/afl/stats/players/N/Neil_Erasmus.html", content=f.read())
|
97
|
+
with open(os.path.join(self.dir, "Michael_Frederick.html"), "rb") as f:
|
98
|
+
m.get("https://afltables.com/afl/stats/players/M/Michael_Frederick.html", content=f.read())
|
99
|
+
with open(os.path.join(self.dir, "Luke_Jackson.html"), "rb") as f:
|
100
|
+
m.get("https://afltables.com/afl/stats/players/L/Luke_Jackson.html", content=f.read())
|
101
|
+
with open(os.path.join(self.dir, "Matthew_Johnson.html"), "rb") as f:
|
102
|
+
m.get("https://afltables.com/afl/stats/players/M/Matthew_Johnson.html", content=f.read())
|
103
|
+
with open(os.path.join(self.dir, "Nathan_ODriscoll.html"), "rb") as f:
|
104
|
+
m.get("https://afltables.com/afl/stats/players/N/Nathan_ODriscoll.html", content=f.read())
|
105
|
+
with open(os.path.join(self.dir, "Alex_Pearce.html"), "rb") as f:
|
106
|
+
m.get("https://afltables.com/afl/stats/players/A/Alex_Pearce.html", content=f.read())
|
107
|
+
with open(os.path.join(self.dir, "Murphy_Reid.html"), "rb") as f:
|
108
|
+
m.get("https://afltables.com/afl/stats/players/M/Murphy_Reid.html", content=f.read())
|
109
|
+
with open(os.path.join(self.dir, "Luke_Ryan.html"), "rb") as f:
|
110
|
+
m.get("https://afltables.com/afl/stats/players/L/Luke_Ryan.html", content=f.read())
|
111
|
+
with open(os.path.join(self.dir, "Caleb_Serong.html"), "rb") as f:
|
112
|
+
m.get("https://afltables.com/afl/stats/players/C/Caleb_Serong.html", content=f.read())
|
113
|
+
with open(os.path.join(self.dir, "Jeremy_Sharp.html"), "rb") as f:
|
114
|
+
m.get("https://afltables.com/afl/stats/players/J/Jeremy_Sharp.html", content=f.read())
|
115
|
+
with open(os.path.join(self.dir, "Josh_Treacy.html"), "rb") as f:
|
116
|
+
m.get("https://afltables.com/afl/stats/players/J/Josh_Treacy.html", content=f.read())
|
117
|
+
with open(os.path.join(self.dir, "Patrick_Voss.html"), "rb") as f:
|
118
|
+
m.get("https://afltables.com/afl/stats/players/P/Patrick_Voss.html", content=f.read())
|
119
|
+
with open(os.path.join(self.dir, "Karl_Worner.html"), "rb") as f:
|
120
|
+
m.get("https://afltables.com/afl/stats/players/K/Karl_Worner.html", content=f.read())
|
121
|
+
m.get("https://historical-forecast-api.open-meteo.com/v1/forecast?latitude=-31.9511597&longitude=115.884175&start_date=2025-03-29&end_date=2025-03-30&hourly=temperature_2m&hourly=relative_humidity_2m&hourly=dew_point_2m&hourly=apparent_temperature&hourly=precipitation&hourly=rain&hourly=snowfall&hourly=snow_depth&hourly=weather_code&hourly=pressure_msl&hourly=surface_pressure&hourly=cloud_cover&hourly=cloud_cover_low&hourly=cloud_cover_mid&hourly=cloud_cover_high&hourly=et0_fao_evapotranspiration&hourly=vapour_pressure_deficit&hourly=wind_speed_10m&hourly=wind_speed_100m&hourly=wind_direction_10m&hourly=wind_direction_100m&hourly=wind_gusts_10m&hourly=soil_temperature_0_to_7cm&hourly=soil_temperature_7_to_28cm&hourly=soil_temperature_28_to_100cm&hourly=soil_temperature_100_to_255cm&hourly=soil_moisture_0_to_7cm&hourly=soil_moisture_7_to_28cm&hourly=soil_moisture_28_to_100cm&hourly=soil_moisture_100_to_255cm&daily=weather_code&daily=temperature_2m_max&daily=temperature_2m_min&daily=temperature_2m_mean&daily=apparent_temperature_max&daily=apparent_temperature_min&daily=apparent_temperature_mean&daily=sunrise&daily=sunset&daily=daylight_duration&daily=sunshine_duration&daily=precipitation_sum&daily=rain_sum&daily=snowfall_sum&daily=precipitation_hours&daily=wind_speed_10m_max&daily=wind_gusts_10m_max&daily=wind_direction_10m_dominant&daily=shortwave_radiation_sum&daily=et0_fao_evapotranspiration&timezone=Australia%2FPerth&format=flatbuffers")
|
122
|
+
|
123
|
+
game_model = _create_afl_afltables_game_model(
|
124
|
+
0,
|
125
|
+
self._session,
|
126
|
+
url,
|
127
|
+
2,
|
128
|
+
{},
|
129
|
+
League.AFL,
|
130
|
+
2025,
|
131
|
+
season_type=None,
|
132
|
+
)
|
133
|
+
self.assertIsNotNone(game_model.teams[0].players[0].identifier)
|
134
|
+
self.assertEqual(game_model.dt, datetime.datetime(2025, 3, 30, 15, 10))
|
@@ -17,11 +17,12 @@ class TestAFLTablesPlayerModel(unittest.TestCase):
|
|
17
17
|
def test_dt(self):
|
18
18
|
dt = datetime.datetime(2023, 9, 15, 0, 15)
|
19
19
|
with requests_mock.Mocker() as m:
|
20
|
+
with open(os.path.join(self.dir, "Dennis_Armfield.html"), "rb") as f:
|
21
|
+
m.get("https://afltables.com/afl/stats/players/D/Dennis_Armfield.html", content=f.read())
|
20
22
|
player_model = create_afl_afltables_player_model(
|
21
23
|
"https://afltables.com/afl/stats/players/D/Dennis_Armfield.html",
|
22
24
|
"35",
|
23
25
|
10,
|
24
|
-
dt,
|
25
26
|
self._session,
|
26
27
|
"Dennis Armfield",
|
27
28
|
0,
|