sportsball 0.3.117__tar.gz → 0.3.119__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.117/sportsball.egg-info → sportsball-0.3.119}/PKG-INFO +1 -1
- {sportsball-0.3.117 → sportsball-0.3.119}/setup.py +1 -1
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/__init__.py +1 -1
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afl/afl_afl_game_model.py +28 -15
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afl/afl_afl_league_model.py +103 -8
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/combined/afl_combined_league_model.py +9 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/google/google_address_model.py +18 -0
- {sportsball-0.3.117 → sportsball-0.3.119/sportsball.egg-info}/PKG-INFO +1 -1
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/afl/afl/afl_afl_league_model_test.py +1 -1
- {sportsball-0.3.117 → sportsball-0.3.119}/LICENSE +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/MANIFEST.in +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/README.md +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/requirements.txt +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/setup.cfg +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/__main__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/args.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/cache.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/address_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afl/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afl/afl_afl_bookie_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afl/afl_afl_odds_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afl/afl_afl_player_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afl/afl_afl_team_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afl/afl_afl_venue_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afltables/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afltables/afl_afltables_game_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afltables/afl_afltables_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afltables/afl_afltables_player_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afltables/afl_afltables_team_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afltables/afl_afltables_venue_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/aussportsbetting/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/aussportsbetting/afl_aussportsbetting_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/combined/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/espn/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/espn/afl_espn_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/oddsportal/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/oddsportal/afl_oddsportal_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/aussportsbetting/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/aussportsbetting/aussportsbetting_bookie_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/aussportsbetting/aussportsbetting_game_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/aussportsbetting/aussportsbetting_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/aussportsbetting/aussportsbetting_odds_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/aussportsbetting/aussportsbetting_team_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/aussportsbetting/aussportsbetting_venue_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/bookie_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/combined/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/combined/combined_address_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/combined/combined_game_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/combined/combined_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/combined/combined_player_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/combined/combined_team_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/combined/combined_venue_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/combined/combined_weather_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/combined/null_check.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/espn/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/espn/espn_bookie_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/espn/espn_game_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/espn/espn_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/espn/espn_odds_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/espn/espn_player_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/espn/espn_team_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/espn/espn_venue_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/field_type.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/game_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/google/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/google/google_news_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/league.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/combined/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/combined/nba_combined_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/espn/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/espn/nba_espn_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/nba/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/nba/nba_nba_game_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/nba/nba_nba_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/nba/nba_nba_team_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/oddsportal/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/oddsportal/nba_oddsportal_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/sportsdb/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/sportsdb/nba_sportsdb_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/sportsreference/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/sportsreference/nba_sportsreference_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaab/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaab/combined/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaab/combined/ncaab_combined_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaab/espn/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaab/espn/ncaab_espn_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaab/oddsportal/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaab/oddsportal/ncaab_oddsportal_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaab/sportsreference/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaab/sportsreference/ncaab_sportsreference_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaaf/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaaf/combined/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaaf/combined/ncaaf_combined_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaaf/espn/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaaf/espn/ncaaf_espn_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaaf/oddsportal/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaaf/oddsportal/ncaaf_oddsportal_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/news_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nfl/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nfl/aussportsbetting/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nfl/aussportsbetting/nfl_aussportsbetting_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nfl/combined/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nfl/combined/nfl_combined_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nfl/espn/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nfl/espn/nfl_espn_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nfl/oddsportal/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nfl/oddsportal/nfl_oddsportal_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nfl/sportsdb/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nfl/sportsdb/nfl_sportsdb_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/odds_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/oddsportal/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/oddsportal/decrypt.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/oddsportal/oddsportal_bookie_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/oddsportal/oddsportal_game_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/oddsportal/oddsportal_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/oddsportal/oddsportal_odds_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/oddsportal/oddsportal_team_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/oddsportal/oddsportal_venue_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/player_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/season_type.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/social_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/sportsdb/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/sportsdb/sportsdb_game_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/sportsdb/sportsdb_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/sportsdb/sportsdb_team_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/sportsdb/sportsdb_venue_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/sportsreference/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/sportsreference/sportsreference_game_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/sportsreference/sportsreference_league_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/sportsreference/sportsreference_player_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/sportsreference/sportsreference_team_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/sportsreference/sportsreference_venue_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/team_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/venue_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/weather/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/weather/gribstream/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/weather/gribstream/gribstream_weather_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/weather/multi_weather_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/weather/openmeteo/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/weather/openmeteo/openmeteo_weather_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/weather_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/wikipedia/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/wikipedia/wikipedia_venue_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/x/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/x/x_social_model.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/logger.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/loglevel.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/playwright.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/proxy_session.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/session.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/sportsball.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/vendor/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/vendor/pygooglenews/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball.egg-info/SOURCES.txt +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball.egg-info/dependency_links.txt +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball.egg-info/entry_points.txt +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball.egg-info/not-zip-safe +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball.egg-info/requires.txt +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/sportsball.egg-info/top_level.txt +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/afl/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/afl/afl/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/afl/afltables/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/afl/afltables/afl_afltables_game_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/afl/afltables/afl_afltables_league_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/afl/afltables/afl_afltables_player_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/aussportsbetting/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/aussportsbetting/aussportsbetting_game_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/combined/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/combined/combined_game_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/combined/combined_player_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/combined/combined_team_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/espn/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/espn/espn_game_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/espn/espn_player_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/game_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/google/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/google/google_address_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/google/google_news_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nba/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nba/nba/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nba/nba/nba_nba_game_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nba/nba/nba_nba_league_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nba/nba/nba_nba_team_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nba/sportsdb/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nba/sportsdb/nba_sportsdb_league_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nba/sportsreference/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nba/sportsreference/nba_sportsreference_league_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/ncaab/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/ncaab/sportsreference/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/ncaab/sportsreference/ncaab_sportsreference_league_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nfl/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nfl/sportsdb/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nfl/sportsdb/nfl_sportsdb_league_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/oddsportal/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/oddsportal/decrypt_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/oddsportal/oddsportal_game_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/oddsportal/oddsportal_league_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/player_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/social_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/sportsdb/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/sportsdb/sportsdb_game_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/sportsdb/sportsdb_league_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/sportsdb/sportsdb_team_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/sportsdb/sportsdb_venue_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/sportsreference/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/sportsreference/sportsreference_game_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/sportsreference/sportsreference_league_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/sportsreference/sportsreference_player_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/sportsreference/sportsreference_team_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/sportsreference/sportsreference_venue_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/team_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/x/__init__.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/x/x_social_model_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/tests/proxy_session_test.py +0 -0
- {sportsball-0.3.117 → sportsball-0.3.119}/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.119',
|
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',
|
@@ -2,12 +2,12 @@
|
|
2
2
|
|
3
3
|
# pylint: disable=too-many-statements,protected-access,too-many-arguments,bare-except
|
4
4
|
import datetime
|
5
|
-
import
|
5
|
+
import re
|
6
6
|
|
7
7
|
import pytest_is_running
|
8
8
|
import requests_cache
|
9
9
|
from bs4 import BeautifulSoup
|
10
|
-
from playwright.sync_api import
|
10
|
+
from playwright.sync_api import Playwright
|
11
11
|
|
12
12
|
from ....playwright import ensure_install
|
13
13
|
from ...game_model import GameModel
|
@@ -16,36 +16,49 @@ 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],
|
34
45
|
url: str | None,
|
46
|
+
playwright: Playwright,
|
35
47
|
) -> GameModel:
|
36
48
|
"""Create a game model from AFL Tables."""
|
37
|
-
odds = []
|
49
|
+
odds: list[float] = []
|
38
50
|
if url is not None and not pytest_is_running.is_running():
|
39
51
|
ensure_install()
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
52
|
+
browser = playwright.chromium.launch()
|
53
|
+
context = browser.new_context()
|
54
|
+
page = context.new_page()
|
55
|
+
try:
|
56
|
+
page.goto(url, wait_until="networkidle")
|
57
|
+
except: # noqa: E722
|
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,9 +8,9 @@ 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
|
-
from playwright.sync_api import sync_playwright
|
13
|
+
from playwright.sync_api import Playwright, sync_playwright
|
14
14
|
|
15
15
|
from ....playwright import ensure_install
|
16
16
|
from ...game_model import GameModel
|
@@ -19,10 +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
|
+
session: requests_cache.CachedSession,
|
25
|
+
ladder: list[str],
|
26
|
+
html_url: str,
|
27
|
+
playwright: Playwright,
|
24
28
|
) -> Iterator[GameModel]:
|
25
|
-
soup = BeautifulSoup(html, "lxml")
|
26
29
|
for div in soup.find_all("div", {"class": re.compile(".*js-match-list-item.*")}):
|
27
30
|
team_names = []
|
28
31
|
for span in div.find_all(
|
@@ -95,10 +98,101 @@ def _parse_game_info(
|
|
95
98
|
):
|
96
99
|
url = urllib.parse.urljoin(html_url, a.get("href"))
|
97
100
|
yield create_afl_afl_game_model(
|
98
|
-
team_names,
|
101
|
+
team_names,
|
102
|
+
teams_players,
|
103
|
+
dt,
|
104
|
+
venue_name,
|
105
|
+
session,
|
106
|
+
ladder,
|
107
|
+
url,
|
108
|
+
playwright,
|
99
109
|
)
|
100
110
|
|
101
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
|
+
|
102
196
|
class AFLAFLLeagueModel(LeagueModel):
|
103
197
|
"""AFL AFL implementation of the league model."""
|
104
198
|
|
@@ -126,7 +220,7 @@ class AFLAFLLeagueModel(LeagueModel):
|
|
126
220
|
timeout=60000.0,
|
127
221
|
)
|
128
222
|
except: # noqa: E722
|
129
|
-
|
223
|
+
pass
|
130
224
|
soup = BeautifulSoup(page.content(), "lxml")
|
131
225
|
for span in soup.find_all(
|
132
226
|
"span", {"class": re.compile(".*stats-table__club-name.*")}
|
@@ -135,6 +229,7 @@ class AFLAFLLeagueModel(LeagueModel):
|
|
135
229
|
if team_name in ladder:
|
136
230
|
continue
|
137
231
|
ladder.append(team_name)
|
232
|
+
logging.info("Found ladder: %s", ",".join(ladder))
|
138
233
|
return ladder
|
139
234
|
|
140
235
|
@property
|
@@ -147,4 +242,4 @@ class AFLAFLLeagueModel(LeagueModel):
|
|
147
242
|
page = context.new_page()
|
148
243
|
url = "https://www.afl.com.au/matches/team-lineups"
|
149
244
|
page.goto(url, wait_until="networkidle")
|
150
|
-
yield from _parse_game_info(page.content(), self.session, ladder, url)
|
245
|
+
yield from _parse_game_info(page.content(), self.session, ladder, url, p)
|
{sportsball-0.3.117 → sportsball-0.3.119}/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
|
|
@@ -13864,6 +13864,24 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
13864
13864
|
),
|
13865
13865
|
"Cox Arena, San Diego, California": VIEJAS_ARENA,
|
13866
13866
|
"The Omni, Atlanta, Georgia": OMNI_COLISEUM,
|
13867
|
+
"TD Banknorth Sports Center, Hamden, Connecticut": TD_BANK_SPORTS_CENTER,
|
13868
|
+
"The Event Center, San Jose, California": SportsballGeocodeTuple(
|
13869
|
+
city="San Jose",
|
13870
|
+
state="CA",
|
13871
|
+
postal="95192",
|
13872
|
+
lat=37.33536,
|
13873
|
+
lng=-121.87985,
|
13874
|
+
housenumber="290",
|
13875
|
+
country="USA",
|
13876
|
+
),
|
13877
|
+
"TIO Stadium, Darwin": TIO_STADIUM,
|
13878
|
+
"SCG, Sydney": SCG,
|
13879
|
+
"MCG, Melbourne": MCG,
|
13880
|
+
"Adelaide Oval, Adelaide": ADELAIDE_OVAL,
|
13881
|
+
"ENGIE Stadium, Sydney": ENGIE_STADIUM,
|
13882
|
+
"Marvel Stadium, Melbourne": MARVEL_STADIUM,
|
13883
|
+
"Gabba, Brisbane": GABBA,
|
13884
|
+
"Optus Stadium, Perth": OPTUS_STADIUM,
|
13867
13885
|
}
|
13868
13886
|
|
13869
13887
|
|
@@ -34,7 +34,7 @@ class TestAFLAFLLeagueModel(unittest.TestCase):
|
|
34
34
|
"Geelong Cats",
|
35
35
|
"Hawthorn",
|
36
36
|
"West Coast Eagles",
|
37
|
-
], "https://www.afl.com.au/matches/team-lineups"))
|
37
|
+
], "https://www.afl.com.au/matches/team-lineups", None))
|
38
38
|
first_game = game_models[0]
|
39
39
|
self.assertEqual(len(first_game.teams), 2)
|
40
40
|
for team in first_game.teams:
|
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
|
File without changes
|
{sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afltables/afl_afltables_game_model.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afltables/afl_afltables_team_model.py
RENAMED
File without changes
|
{sportsball-0.3.117 → sportsball-0.3.119}/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
|
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.117 → sportsball-0.3.119}/sportsball/data/combined/combined_address_model.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/combined/combined_weather_model.py
RENAMED
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
|
File without changes
|
File without changes
|
{sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/combined/nba_combined_league_model.py
RENAMED
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.117 → sportsball-0.3.119}/sportsball/data/nba/sportsdb/nba_sportsdb_league_model.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaab/espn/ncaab_espn_league_model.py
RENAMED
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.117 → sportsball-0.3.119}/sportsball/data/ncaaf/espn/ncaaf_espn_league_model.py
RENAMED
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.117 → sportsball-0.3.119}/sportsball/data/nfl/combined/nfl_combined_league_model.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nfl/sportsdb/nfl_sportsdb_league_model.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/oddsportal/oddsportal_bookie_model.py
RENAMED
File without changes
|
{sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/oddsportal/oddsportal_game_model.py
RENAMED
File without changes
|
{sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/oddsportal/oddsportal_league_model.py
RENAMED
File without changes
|
{sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/oddsportal/oddsportal_odds_model.py
RENAMED
File without changes
|
{sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/oddsportal/oddsportal_team_model.py
RENAMED
File without changes
|
{sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/oddsportal/oddsportal_venue_model.py
RENAMED
File without changes
|
File without changes
|
File without changes
|