sportsball 0.3.21__tar.gz → 0.3.23__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.21/sportsball.egg-info → sportsball-0.3.23}/PKG-INFO +1 -1
- {sportsball-0.3.21 → sportsball-0.3.23}/setup.py +1 -1
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/__init__.py +1 -1
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/afl/afltables/afl_afltables_league_model.py +4 -2
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/combined/combined_league_model.py +2 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/google/google_address_model.py +29 -9
- sportsball-0.3.23/sportsball/data/ncaaf/__init__.py +5 -0
- sportsball-0.3.23/sportsball/data/ncaaf/combined/ncaaf_combined_league_model.py +34 -0
- sportsball-0.3.23/sportsball/data/ncaaf/oddsportal/ncaaf_oddsportal_league_model.py +15 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/oddsportal/oddsportal_game_model.py +16 -9
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/oddsportal/oddsportal_league_model.py +32 -7
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/oddsportal/oddsportal_team_model.py +8 -5
- {sportsball-0.3.21 → sportsball-0.3.23/sportsball.egg-info}/PKG-INFO +1 -1
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball.egg-info/SOURCES.txt +7 -0
- sportsball-0.3.23/tests/data/afl/afltables/afl_afltables_league_model_test.py +16 -0
- sportsball-0.3.23/tests/data/oddsportal/oddsportal_game_model_test.py +35 -0
- sportsball-0.3.23/tests/data/sportsdb/__init__.py +0 -0
- sportsball-0.3.23/tests/data/sportsreference/__init__.py +0 -0
- sportsball-0.3.23/tests/data/x/__init__.py +0 -0
- sportsball-0.3.21/sportsball/data/ncaaf/__init__.py +0 -5
- {sportsball-0.3.21 → sportsball-0.3.23}/LICENSE +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/MANIFEST.in +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/README.md +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/requirements.txt +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/setup.cfg +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/__main__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/args.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/cache.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/address_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/afl/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/afl/afltables/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/afl/afltables/afl_afltables_game_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/afl/afltables/afl_afltables_player_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/afl/afltables/afl_afltables_team_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/afl/afltables/afl_afltables_venue_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/afl/aussportsbetting/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/afl/aussportsbetting/afl_aussportsbetting_league_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/afl/combined/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/afl/combined/afl_combined_league_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/afl/espn/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/afl/espn/afl_espn_league_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/afl/oddsportal/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/afl/oddsportal/afl_oddsportal_league_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/aussportsbetting/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/aussportsbetting/aussportsbetting_bookie_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/aussportsbetting/aussportsbetting_game_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/aussportsbetting/aussportsbetting_league_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/aussportsbetting/aussportsbetting_odds_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/aussportsbetting/aussportsbetting_team_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/aussportsbetting/aussportsbetting_venue_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/bookie_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/combined/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/combined/combined_address_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/combined/combined_game_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/combined/combined_player_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/combined/combined_team_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/combined/combined_venue_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/combined/combined_weather_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/espn/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/espn/espn_bookie_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/espn/espn_game_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/espn/espn_league_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/espn/espn_odds_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/espn/espn_player_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/espn/espn_team_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/espn/espn_venue_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/field_type.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/game_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/google/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/google/google_news_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/league.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/league_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/nba/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/nba/combined/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/nba/combined/nba_combined_league_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/nba/espn/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/nba/espn/nba_espn_league_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/nba/nba/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/nba/nba/nba_nba_game_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/nba/nba/nba_nba_league_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/nba/nba/nba_nba_player_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/nba/nba/nba_nba_team_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/nba/oddsportal/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/nba/oddsportal/nba_oddsportal_league_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/nba/sportsdb/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/nba/sportsdb/nba_sportsdb_league_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/nba/sportsreference/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/nba/sportsreference/nba_sportsreference_league_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/ncaab/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/ncaab/combined/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/ncaab/combined/ncaab_combined_league_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/ncaab/espn/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/ncaab/espn/ncaab_espn_league_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/ncaab/oddsportal/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/ncaab/oddsportal/ncaab_oddsportal_league_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/ncaab/sportsreference/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/ncaab/sportsreference/ncaab_sportsreference_league_model.py +0 -0
- {sportsball-0.3.21/sportsball/data/ncaaf/espn → sportsball-0.3.23/sportsball/data/ncaaf/combined}/__init__.py +0 -0
- {sportsball-0.3.21/sportsball/data/nfl/aussportsbetting → sportsball-0.3.23/sportsball/data/ncaaf/espn}/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/ncaaf/espn/ncaaf_espn_league_model.py +0 -0
- {sportsball-0.3.21/sportsball/data/nfl/combined → sportsball-0.3.23/sportsball/data/ncaaf/oddsportal}/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/news_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/nfl/__init__.py +0 -0
- {sportsball-0.3.21/sportsball/data/nfl/oddsportal → sportsball-0.3.23/sportsball/data/nfl/aussportsbetting}/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/nfl/aussportsbetting/nfl_aussportsbetting_league_model.py +0 -0
- {sportsball-0.3.21/sportsball/data/nfl/sportsdb → sportsball-0.3.23/sportsball/data/nfl/combined}/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/nfl/combined/nfl_combined_league_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/nfl/espn/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/nfl/espn/nfl_espn_league_model.py +0 -0
- {sportsball-0.3.21/sportsball/data → sportsball-0.3.23/sportsball/data/nfl}/oddsportal/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/nfl/oddsportal/nfl_oddsportal_league_model.py +0 -0
- {sportsball-0.3.21/sportsball/data → sportsball-0.3.23/sportsball/data/nfl}/sportsdb/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/nfl/sportsdb/nfl_sportsdb_league_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/odds_model.py +0 -0
- {sportsball-0.3.21/sportsball/data/sportsreference → sportsball-0.3.23/sportsball/data/oddsportal}/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/oddsportal/oddsportal_bookie_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/oddsportal/oddsportal_odds_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/oddsportal/oddsportal_venue_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/player_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/season_type.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/social_model.py +0 -0
- {sportsball-0.3.21/sportsball/data/weather → sportsball-0.3.23/sportsball/data/sportsdb}/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/sportsdb/sportsdb_game_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/sportsdb/sportsdb_league_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/sportsdb/sportsdb_team_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/sportsdb/sportsdb_venue_model.py +0 -0
- {sportsball-0.3.21/sportsball/data/weather/gribstream → sportsball-0.3.23/sportsball/data/sportsreference}/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/sportsreference/sportsreference_game_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/sportsreference/sportsreference_league_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/sportsreference/sportsreference_player_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/sportsreference/sportsreference_team_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/sportsreference/sportsreference_venue_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/team_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/venue_model.py +0 -0
- {sportsball-0.3.21/sportsball/data/weather/openmeteo → sportsball-0.3.23/sportsball/data/weather}/__init__.py +0 -0
- {sportsball-0.3.21/sportsball/data/wikipedia → sportsball-0.3.23/sportsball/data/weather/gribstream}/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/weather/gribstream/gribstream_weather_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/weather/multi_weather_model.py +0 -0
- {sportsball-0.3.21/sportsball/data/x → sportsball-0.3.23/sportsball/data/weather/openmeteo}/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/weather/openmeteo/openmeteo_weather_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/weather_model.py +0 -0
- {sportsball-0.3.21/sportsball/vendor → sportsball-0.3.23/sportsball/data/wikipedia}/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/wikipedia/wikipedia_venue_model.py +0 -0
- {sportsball-0.3.21/tests → sportsball-0.3.23/sportsball/data/x}/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/x/x_social_model.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/logger.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/loglevel.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/proxy_session.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/session.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/sportsball.py +0 -0
- {sportsball-0.3.21/tests/data → sportsball-0.3.23/sportsball/vendor}/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball/vendor/pygooglenews/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball.egg-info/dependency_links.txt +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball.egg-info/entry_points.txt +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball.egg-info/not-zip-safe +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball.egg-info/requires.txt +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/sportsball.egg-info/top_level.txt +0 -0
- {sportsball-0.3.21/tests/data/afl → sportsball-0.3.23/tests}/__init__.py +0 -0
- {sportsball-0.3.21/tests/data/afl/afltables → sportsball-0.3.23/tests/data}/__init__.py +0 -0
- {sportsball-0.3.21/tests/data/aussportsbetting → sportsball-0.3.23/tests/data/afl}/__init__.py +0 -0
- {sportsball-0.3.21/tests/data/combined → sportsball-0.3.23/tests/data/afl/afltables}/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/afl/afltables/afl_afltables_player_model_test.py +0 -0
- {sportsball-0.3.21/tests/data/espn → sportsball-0.3.23/tests/data/aussportsbetting}/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/aussportsbetting/aussportsbetting_game_model_test.py +0 -0
- {sportsball-0.3.21/tests/data/google → sportsball-0.3.23/tests/data/combined}/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/combined/combined_game_model_test.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/combined/combined_player_model_test.py +0 -0
- {sportsball-0.3.21/tests/data/nba → sportsball-0.3.23/tests/data/espn}/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/espn/espn_game_model_test.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/espn/espn_player_model_test.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/game_model_test.py +0 -0
- {sportsball-0.3.21/tests/data/nba/nba → sportsball-0.3.23/tests/data/google}/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/google/google_address_model_test.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/google/google_news_model_test.py +0 -0
- {sportsball-0.3.21/tests/data/nba/sportsdb → sportsball-0.3.23/tests/data/nba}/__init__.py +0 -0
- {sportsball-0.3.21/tests/data/nba/sportsreference → sportsball-0.3.23/tests/data/nba/nba}/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/nba/nba/nba_nba_game_model_test.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/nba/nba/nba_nba_league_model_test.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/nba/nba/nba_nba_player_model_test.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/nba/nba/nba_nba_team_model_test.py +0 -0
- {sportsball-0.3.21/tests/data/ncaab → sportsball-0.3.23/tests/data/nba/sportsdb}/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/nba/sportsdb/nba_sportsdb_league_model_test.py +0 -0
- {sportsball-0.3.21/tests/data/ncaab → sportsball-0.3.23/tests/data/nba}/sportsreference/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/nba/sportsreference/nba_sportsreference_league_model_test.py +0 -0
- {sportsball-0.3.21/tests/data/nfl → sportsball-0.3.23/tests/data/ncaab}/__init__.py +0 -0
- {sportsball-0.3.21/tests/data/nfl/sportsdb → sportsball-0.3.23/tests/data/ncaab/sportsreference}/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/ncaab/sportsreference/ncaab_sportsreference_league_model_test.py +0 -0
- {sportsball-0.3.21/tests/data/sportsdb → sportsball-0.3.23/tests/data/nfl}/__init__.py +0 -0
- {sportsball-0.3.21/tests/data/sportsreference → sportsball-0.3.23/tests/data/nfl/sportsdb}/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/nfl/sportsdb/nfl_sportsdb_league_model_test.py +0 -0
- {sportsball-0.3.21/tests/data/x → sportsball-0.3.23/tests/data/oddsportal}/__init__.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/player_model_test.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/social_model_test.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/sportsdb/sportsdb_game_model_test.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/sportsdb/sportsdb_league_model_test.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/sportsdb/sportsdb_team_model_test.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/sportsdb/sportsdb_venue_model_test.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/sportsreference/sportsreference_game_model_test.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/sportsreference/sportsreference_league_model_test.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/sportsreference/sportsreference_player_model_test.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/sportsreference/sportsreference_team_model_test.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/sportsreference/sportsreference_venue_model_test.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/team_model_test.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/data/x/x_social_model_test.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/tests/proxy_session_test.py +0 -0
- {sportsball-0.3.21 → sportsball-0.3.23}/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.23',
|
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',
|
{sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/afl/afltables/afl_afltables_league_model.py
RENAMED
@@ -56,8 +56,10 @@ class AFLAFLTablesLeagueModel(LeagueModel):
|
|
56
56
|
current_dt = None
|
57
57
|
for td in table.find_all("td"):
|
58
58
|
td_text = td.get_text().strip()
|
59
|
-
if "
|
60
|
-
|
59
|
+
if "Venue:" in td_text:
|
60
|
+
cleaned_text = td_text.split("Venue:")[0].split("Att:")[0].strip()
|
61
|
+
cleaned_text = " ".join(cleaned_text.split()[-3:])
|
62
|
+
current_dt = parser.parse(cleaned_text)
|
61
63
|
for a in table.find_all("a", href=True):
|
62
64
|
if a.get_text().strip().lower() == "match stats":
|
63
65
|
url = urllib.parse.urljoin(season_url, a.get("href"))
|
@@ -3,6 +3,7 @@
|
|
3
3
|
# pylint: disable=raise-missing-from
|
4
4
|
import logging
|
5
5
|
import multiprocessing
|
6
|
+
import traceback
|
6
7
|
from multiprocessing import Pool
|
7
8
|
from typing import Any, Iterator
|
8
9
|
|
@@ -21,6 +22,7 @@ def _produce_league_games(league_model: LeagueModel) -> list[dict[str, Any]]:
|
|
21
22
|
return [x.model_dump() for x in league_model.games]
|
22
23
|
except Exception as exc:
|
23
24
|
logging.error("Exception: %s", str(exc))
|
25
|
+
logging.error(traceback.format_exc())
|
24
26
|
raise ValueError(str(exc))
|
25
27
|
|
26
28
|
|
@@ -1108,6 +1108,15 @@ TEXAS_AM_COMMERCE_FIELD_HOUSE = SportsballGeocodeTuple(
|
|
1108
1108
|
housenumber="2600",
|
1109
1109
|
country="USA",
|
1110
1110
|
)
|
1111
|
+
WISDOM_GYM = SportsballGeocodeTuple(
|
1112
|
+
city="Stephenville",
|
1113
|
+
state="TX",
|
1114
|
+
postal="",
|
1115
|
+
lat=32.215438,
|
1116
|
+
lng=-98.220617,
|
1117
|
+
housenumber="",
|
1118
|
+
country="USA",
|
1119
|
+
)
|
1111
1120
|
_CACHED_GEOCODES: dict[str, Any] = {
|
1112
1121
|
"S.C.G. - Australia": SCG,
|
1113
1122
|
"Victoria Park - Australia": SportsballGeocodeTuple(
|
@@ -3528,15 +3537,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
3528
3537
|
housenumber="8600",
|
3529
3538
|
country="USA",
|
3530
3539
|
),
|
3531
|
-
"Wisdom Gym, Stephenville, Texas":
|
3532
|
-
city="Stephenville",
|
3533
|
-
state="TX",
|
3534
|
-
postal="",
|
3535
|
-
lat=32.215438,
|
3536
|
-
lng=-98.220617,
|
3537
|
-
housenumber="",
|
3538
|
-
country="USA",
|
3539
|
-
),
|
3540
|
+
"Wisdom Gym, Stephenville, Texas": WISDOM_GYM,
|
3540
3541
|
"Skyhawk Arena, Martin, Tennessee": SportsballGeocodeTuple(
|
3541
3542
|
city="Martin",
|
3542
3543
|
state="TN",
|
@@ -7075,6 +7076,25 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
7075
7076
|
housenumber="",
|
7076
7077
|
country="USA",
|
7077
7078
|
),
|
7079
|
+
"The Gabba, Brisbane, Australia": GABBA,
|
7080
|
+
"Sydney Cricket Ground, Sydney, Australia": SCG,
|
7081
|
+
"People First Stadium, Gold Coast, Australia": PEOPLE_FIRST_STADIUM,
|
7082
|
+
"Engie Stadium, Sydney, Australia": ENGIE_STADIUM,
|
7083
|
+
"Melbourne Cricket Ground, Melbourne, Australia": MCG,
|
7084
|
+
"GMHBA Stadium, Geelong, Australia": GMHBA_STADIUM,
|
7085
|
+
"Marvel Stadium, Melbourne, Australia": MARVEL_STADIUM,
|
7086
|
+
"Adelaide Oval, Adelaide, Australia": ADELAIDE_OVAL,
|
7087
|
+
"Optus Stadium, Perth, Australia": OPTUS_STADIUM,
|
7088
|
+
"Wisdom Gymnasium, Stephenville, Texas": WISDOM_GYM,
|
7089
|
+
"Charlotte, North Carolina": SportsballGeocodeTuple(
|
7090
|
+
city="Charlotte",
|
7091
|
+
state="NC",
|
7092
|
+
postal="",
|
7093
|
+
lat=35.227222,
|
7094
|
+
lng=-80.843056,
|
7095
|
+
housenumber="",
|
7096
|
+
country="USA",
|
7097
|
+
),
|
7078
7098
|
}
|
7079
7099
|
|
7080
7100
|
|
@@ -0,0 +1,34 @@
|
|
1
|
+
"""NCAAF combined league model."""
|
2
|
+
|
3
|
+
import requests_cache
|
4
|
+
|
5
|
+
from ...combined.combined_league_model import CombinedLeagueModel
|
6
|
+
from ...league import League
|
7
|
+
from ..espn.ncaaf_espn_league_model import NCAAFESPNLeagueModel
|
8
|
+
from ..oddsportal.ncaaf_oddsportal_league_model import \
|
9
|
+
NCAAFOddsPortalLeagueModel
|
10
|
+
|
11
|
+
NCAAF_TEAM_IDENTITY_MAP: dict[str, str] = {}
|
12
|
+
NCAAF_VENUE_IDENTITY_MAP: dict[str, str] = {}
|
13
|
+
|
14
|
+
|
15
|
+
class NCAAFCombinedLeagueModel(CombinedLeagueModel):
|
16
|
+
"""NCAAF combined implementation of the league model."""
|
17
|
+
|
18
|
+
def __init__(self, session: requests_cache.CachedSession) -> None:
|
19
|
+
super().__init__(
|
20
|
+
session,
|
21
|
+
League.NCAAF,
|
22
|
+
[
|
23
|
+
NCAAFESPNLeagueModel(session),
|
24
|
+
NCAAFOddsPortalLeagueModel(session),
|
25
|
+
],
|
26
|
+
)
|
27
|
+
|
28
|
+
@classmethod
|
29
|
+
def team_identity_map(cls) -> dict[str, str]:
|
30
|
+
return NCAAF_TEAM_IDENTITY_MAP
|
31
|
+
|
32
|
+
@classmethod
|
33
|
+
def venue_identity_map(cls) -> dict[str, str]:
|
34
|
+
return NCAAF_VENUE_IDENTITY_MAP
|
@@ -0,0 +1,15 @@
|
|
1
|
+
"""NCAAF OddsPortal league model."""
|
2
|
+
|
3
|
+
# pylint: disable=line-too-long
|
4
|
+
|
5
|
+
import requests_cache
|
6
|
+
|
7
|
+
from ...league import League
|
8
|
+
from ...oddsportal.oddsportal_league_model import OddsPortalLeagueModel
|
9
|
+
|
10
|
+
|
11
|
+
class NCAAFOddsPortalLeagueModel(OddsPortalLeagueModel):
|
12
|
+
"""NCAAF OddsPortal implementation of the league model."""
|
13
|
+
|
14
|
+
def __init__(self, session: requests_cache.CachedSession) -> None:
|
15
|
+
super().__init__(League.NCAAF, session)
|
@@ -24,17 +24,17 @@ def _create_oddsportal_game_model(
|
|
24
24
|
response = session.get(url)
|
25
25
|
response.raise_for_status()
|
26
26
|
|
27
|
-
soup = BeautifulSoup(
|
28
|
-
event_tag = soup.find("
|
27
|
+
soup = BeautifulSoup(response.text, "html.parser")
|
28
|
+
event_tag = soup.find("div", id="react-event-header")
|
29
29
|
if not isinstance(event_tag, Tag):
|
30
|
-
raise ValueError("event_tag is not a tag.")
|
31
|
-
event = json.loads(str(event_tag["
|
30
|
+
raise ValueError(f"event_tag is not a tag for URL: {url}.")
|
31
|
+
event = json.loads(str(event_tag["data"]))
|
32
32
|
|
33
33
|
event_body = event["eventBody"]
|
34
34
|
event_data = event["eventData"]
|
35
35
|
dt = datetime.datetime.fromtimestamp(event_body["startDate"])
|
36
36
|
end_dt = None
|
37
|
-
if
|
37
|
+
if event_body.get("endDate", False) is not False:
|
38
38
|
end_dt = datetime.datetime.fromtimestamp(event_body["endDate"])
|
39
39
|
version_id = str(event_data["versionId"])
|
40
40
|
sport_id = str(event_data["sportId"])
|
@@ -54,11 +54,12 @@ def _create_oddsportal_game_model(
|
|
54
54
|
src_response = session.get(src_url)
|
55
55
|
src_response.raise_for_status()
|
56
56
|
variables = src_response.text
|
57
|
-
|
57
|
+
sentinel = 'break}return e.next=9,g(r.data,"'
|
58
|
+
variables = variables[variables.find(sentinel) + len(sentinel) :]
|
58
59
|
variables = variables[
|
59
60
|
: variables.find('");case 9:return s=e.sent,l=JSON.parse(s),e.abrupt')
|
60
61
|
]
|
61
|
-
|
62
|
+
password_str, salt_str = variables.split('","')
|
62
63
|
salt = str.encode(salt_str)
|
63
64
|
password = str.encode(password_str)
|
64
65
|
break
|
@@ -68,6 +69,12 @@ def _create_oddsportal_game_model(
|
|
68
69
|
raise ValueError("password is null.")
|
69
70
|
|
70
71
|
bookie_names = event_body["providersNames"]
|
72
|
+
home_points = None
|
73
|
+
if event_body["homeResult"] != "":
|
74
|
+
home_points = float(event_body["homeResult"])
|
75
|
+
away_points = None
|
76
|
+
if event_body["awayResult"] != "":
|
77
|
+
away_points = float(event_body["awayResult"])
|
71
78
|
|
72
79
|
return GameModel(
|
73
80
|
dt=dt,
|
@@ -86,7 +93,7 @@ def _create_oddsportal_game_model(
|
|
86
93
|
dt,
|
87
94
|
event_data["home"],
|
88
95
|
league,
|
89
|
-
|
96
|
+
home_points,
|
90
97
|
version_id,
|
91
98
|
sport_id,
|
92
99
|
unique_id,
|
@@ -103,7 +110,7 @@ def _create_oddsportal_game_model(
|
|
103
110
|
dt,
|
104
111
|
event_data["away"],
|
105
112
|
league,
|
106
|
-
|
113
|
+
away_points,
|
107
114
|
version_id,
|
108
115
|
sport_id,
|
109
116
|
unique_id,
|
{sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/oddsportal/oddsportal_league_model.py
RENAMED
@@ -13,6 +13,16 @@ from ..league import League
|
|
13
13
|
from ..league_model import LeagueModel
|
14
14
|
from .oddsportal_game_model import create_oddsportal_game_model
|
15
15
|
|
16
|
+
# Sports
|
17
|
+
AMERICAN_FOOTBALL = "american-football"
|
18
|
+
BASKETBALL = "basketball"
|
19
|
+
|
20
|
+
# Countries
|
21
|
+
USA = "usa"
|
22
|
+
|
23
|
+
# Leagues
|
24
|
+
NCAA = "ncaa"
|
25
|
+
|
16
26
|
|
17
27
|
class OddsPortalLeagueModel(LeagueModel):
|
18
28
|
"""Odds Portal implementation of the league model."""
|
@@ -23,11 +33,13 @@ class OddsPortalLeagueModel(LeagueModel):
|
|
23
33
|
case League.AFL:
|
24
34
|
return "/".join(["aussie-rules", "australia", "afl", ""])
|
25
35
|
case League.NBA:
|
26
|
-
return "/".join([
|
36
|
+
return "/".join([BASKETBALL, USA, "nba", ""])
|
27
37
|
case League.NCAAB:
|
28
|
-
return "/".join([
|
38
|
+
return "/".join([BASKETBALL, USA, NCAA, ""])
|
39
|
+
case League.NCAAF:
|
40
|
+
return "/".join([AMERICAN_FOOTBALL, USA, NCAA, ""])
|
29
41
|
case League.NFL:
|
30
|
-
return "/".join([
|
42
|
+
return "/".join([AMERICAN_FOOTBALL, USA, "nfl", ""])
|
31
43
|
case _:
|
32
44
|
raise ValueError(f"Unsupported league: {self.league}")
|
33
45
|
|
@@ -41,7 +53,10 @@ class OddsPortalLeagueModel(LeagueModel):
|
|
41
53
|
if jsonld["@type"] != "SportsEvent":
|
42
54
|
continue
|
43
55
|
game_model = create_oddsportal_game_model(
|
44
|
-
self.session,
|
56
|
+
self.session,
|
57
|
+
urllib.parse.urljoin(base_url, jsonld["url"]),
|
58
|
+
self.league,
|
59
|
+
True,
|
45
60
|
)
|
46
61
|
pbar.update(1)
|
47
62
|
pbar.set_description(f"OddsPortal {game_model.dt}")
|
@@ -56,7 +71,11 @@ class OddsPortalLeagueModel(LeagueModel):
|
|
56
71
|
continue
|
57
72
|
seen_urls.add(url)
|
58
73
|
|
59
|
-
|
74
|
+
if url.endswith("results/"):
|
75
|
+
with self.session.cache_disabled():
|
76
|
+
response = self.session.get(url)
|
77
|
+
else:
|
78
|
+
response = self.session.get(url)
|
60
79
|
response.raise_for_status()
|
61
80
|
|
62
81
|
soup = BeautifulSoup(response.text, "html.parser")
|
@@ -73,9 +92,15 @@ class OddsPortalLeagueModel(LeagueModel):
|
|
73
92
|
if not isinstance(tournament_component, Tag):
|
74
93
|
raise ValueError("tournament_component is not a tag.")
|
75
94
|
matches = json.loads(str(tournament_component[":sport-data"]))
|
76
|
-
|
95
|
+
component = matches.get("tournamentGamesComponent", matches.get("d"))
|
96
|
+
if component.get("total") == 0:
|
97
|
+
break
|
98
|
+
for match in component.get("rows", []):
|
77
99
|
game_model = create_oddsportal_game_model(
|
78
|
-
self.session,
|
100
|
+
self.session,
|
101
|
+
urllib.parse.urljoin(url, match["url"]),
|
102
|
+
self.league,
|
103
|
+
False,
|
79
104
|
)
|
80
105
|
pbar.update(1)
|
81
106
|
pbar.set_description(f"OddsPortal {game_model.dt}")
|
@@ -25,7 +25,7 @@ def _create_oddsportal_team_model(
|
|
25
25
|
dt: datetime.datetime,
|
26
26
|
team_name: str,
|
27
27
|
league: League,
|
28
|
-
points: float,
|
28
|
+
points: float | None,
|
29
29
|
version_id: str,
|
30
30
|
sport_id: str,
|
31
31
|
unique_id: str,
|
@@ -38,7 +38,10 @@ def _create_oddsportal_team_model(
|
|
38
38
|
team_idx: int,
|
39
39
|
) -> TeamModel:
|
40
40
|
response = session.get(
|
41
|
-
f"https://www.oddsportal.com/
|
41
|
+
f"https://www.oddsportal.com/match-event/{version_id}-{sport_id}-{unique_id}-{default_bet_id}-{default_scope_id}-{xhash}.dat",
|
42
|
+
headers={
|
43
|
+
"X-Requested-With": "XMLHttpRequest",
|
44
|
+
},
|
42
45
|
)
|
43
46
|
response.raise_for_status()
|
44
47
|
decoded_data = base64.b64decode(response.content).decode()
|
@@ -70,7 +73,7 @@ def _create_oddsportal_team_model(
|
|
70
73
|
history = odds_data["history"][outcome_id]
|
71
74
|
odds_models = []
|
72
75
|
for bookie_id, bookie_name in bookie_names.items():
|
73
|
-
for odds, _, timestamp in history[
|
76
|
+
for odds, _, timestamp in history.get(bookie_id, []):
|
74
77
|
odds_models.append(
|
75
78
|
create_oddsportal_odds_model(
|
76
79
|
odds,
|
@@ -100,7 +103,7 @@ def _cached_create_oddsportal_team_model(
|
|
100
103
|
dt: datetime.datetime,
|
101
104
|
team_name: str,
|
102
105
|
league: League,
|
103
|
-
points: float,
|
106
|
+
points: float | None,
|
104
107
|
version_id: str,
|
105
108
|
sport_id: str,
|
106
109
|
unique_id: str,
|
@@ -136,7 +139,7 @@ def create_oddsportal_team_model(
|
|
136
139
|
dt: datetime.datetime,
|
137
140
|
team_name: str,
|
138
141
|
league: League,
|
139
|
-
points: float,
|
142
|
+
points: float | None,
|
140
143
|
version_id: str,
|
141
144
|
sport_id: str,
|
142
145
|
unique_id: str,
|
@@ -102,8 +102,12 @@ sportsball/data/ncaab/oddsportal/ncaab_oddsportal_league_model.py
|
|
102
102
|
sportsball/data/ncaab/sportsreference/__init__.py
|
103
103
|
sportsball/data/ncaab/sportsreference/ncaab_sportsreference_league_model.py
|
104
104
|
sportsball/data/ncaaf/__init__.py
|
105
|
+
sportsball/data/ncaaf/combined/__init__.py
|
106
|
+
sportsball/data/ncaaf/combined/ncaaf_combined_league_model.py
|
105
107
|
sportsball/data/ncaaf/espn/__init__.py
|
106
108
|
sportsball/data/ncaaf/espn/ncaaf_espn_league_model.py
|
109
|
+
sportsball/data/ncaaf/oddsportal/__init__.py
|
110
|
+
sportsball/data/ncaaf/oddsportal/ncaaf_oddsportal_league_model.py
|
107
111
|
sportsball/data/nfl/__init__.py
|
108
112
|
sportsball/data/nfl/aussportsbetting/__init__.py
|
109
113
|
sportsball/data/nfl/aussportsbetting/nfl_aussportsbetting_league_model.py
|
@@ -155,6 +159,7 @@ tests/data/social_model_test.py
|
|
155
159
|
tests/data/team_model_test.py
|
156
160
|
tests/data/afl/__init__.py
|
157
161
|
tests/data/afl/afltables/__init__.py
|
162
|
+
tests/data/afl/afltables/afl_afltables_league_model_test.py
|
158
163
|
tests/data/afl/afltables/afl_afltables_player_model_test.py
|
159
164
|
tests/data/aussportsbetting/__init__.py
|
160
165
|
tests/data/aussportsbetting/aussportsbetting_game_model_test.py
|
@@ -183,6 +188,8 @@ tests/data/ncaab/sportsreference/ncaab_sportsreference_league_model_test.py
|
|
183
188
|
tests/data/nfl/__init__.py
|
184
189
|
tests/data/nfl/sportsdb/__init__.py
|
185
190
|
tests/data/nfl/sportsdb/nfl_sportsdb_league_model_test.py
|
191
|
+
tests/data/oddsportal/__init__.py
|
192
|
+
tests/data/oddsportal/oddsportal_game_model_test.py
|
186
193
|
tests/data/sportsdb/__init__.py
|
187
194
|
tests/data/sportsdb/sportsdb_game_model_test.py
|
188
195
|
tests/data/sportsdb/sportsdb_league_model_test.py
|
@@ -0,0 +1,16 @@
|
|
1
|
+
"""Tests for the afltables league model class."""
|
2
|
+
import unittest
|
3
|
+
|
4
|
+
import requests_cache
|
5
|
+
from sportsball.data.afl.afltables.afl_afltables_league_model import AFLAFLTablesLeagueModel
|
6
|
+
from sportsball.data.league import League
|
7
|
+
|
8
|
+
|
9
|
+
class TestAFLTablesLeagueModel(unittest.TestCase):
|
10
|
+
|
11
|
+
def setUp(self):
|
12
|
+
self._session = requests_cache.CachedSession(backend="memory")
|
13
|
+
self._league_model = AFLAFLTablesLeagueModel(self._session)
|
14
|
+
|
15
|
+
def test_league(self):
|
16
|
+
self.assertEqual(self._league_model.league, League.AFL)
|
@@ -0,0 +1,35 @@
|
|
1
|
+
"""Tests for the oddsportal game model class."""
|
2
|
+
import datetime
|
3
|
+
import os
|
4
|
+
import unittest
|
5
|
+
|
6
|
+
import requests_mock
|
7
|
+
import requests_cache
|
8
|
+
from sportsball.data.oddsportal.oddsportal_game_model import create_oddsportal_game_model
|
9
|
+
from sportsball.data.league import League
|
10
|
+
|
11
|
+
|
12
|
+
class TestOddsPortalGameModel(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_dt(self):
|
19
|
+
url = "https://www.oddsportal.com/aussie-rules/australia/afl/brisbane-lions-geelong-cats-hjaPGVek/"
|
20
|
+
with requests_mock.Mocker() as m:
|
21
|
+
with open(os.path.join(self.dir, "brisbane-lions-geelong-cats-hjaPGVek.html"), "rb") as f:
|
22
|
+
m.get(url, content=f.read())
|
23
|
+
with open(os.path.join(self.dir, "app.js"), "rb") as f:
|
24
|
+
m.get("https://www.oddsportal.com/res/public/js/build/app.js?v=250131150028", content=f.read())
|
25
|
+
m.get("https://historical-forecast-api.open-meteo.com/v1/forecast?latitude=-27.4858375&longitude=153.0332144&start_date=2025-03-05&end_date=2025-03-06&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%2FBrisbane&format=flatbuffers")
|
26
|
+
with open(os.path.join(self.dir, "1-18-hjaPGVek-3-1-yjee3.dat"), "rb") as f:
|
27
|
+
m.get("https://www.oddsportal.com/match-event/1-18-hjaPGVek-3-1-yjee3.dat", content=f.read())
|
28
|
+
|
29
|
+
game_model = create_oddsportal_game_model(
|
30
|
+
self.session,
|
31
|
+
url,
|
32
|
+
League.AFL,
|
33
|
+
True,
|
34
|
+
)
|
35
|
+
self.assertEqual(game_model.dt, datetime.datetime(2025, 3, 6, 3, 50))
|
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.21 → sportsball-0.3.23}/sportsball/data/afl/afltables/afl_afltables_game_model.py
RENAMED
File without changes
|
{sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/afl/afltables/afl_afltables_player_model.py
RENAMED
File without changes
|
{sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/afl/afltables/afl_afltables_team_model.py
RENAMED
File without changes
|
{sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/afl/afltables/afl_afltables_venue_model.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{sportsball-0.3.21 → sportsball-0.3.23}/sportsball/data/afl/combined/afl_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
|
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
|
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.21 → sportsball-0.3.23}/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
|