sportsball 0.3.32__tar.gz → 0.3.33__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.32/sportsball.egg-info → sportsball-0.3.33}/PKG-INFO +1 -1
- {sportsball-0.3.32 → sportsball-0.3.33}/setup.py +1 -1
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/__init__.py +1 -1
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/address_model.py +3 -1
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/google/google_address_model.py +136 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/oddsportal/decrypt.py +14 -2
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/oddsportal/oddsportal_game_model.py +14 -7
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/oddsportal/oddsportal_league_model.py +6 -2
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/oddsportal/oddsportal_team_model.py +27 -21
- {sportsball-0.3.32 → sportsball-0.3.33/sportsball.egg-info}/PKG-INFO +1 -1
- {sportsball-0.3.32 → sportsball-0.3.33}/LICENSE +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/MANIFEST.in +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/README.md +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/requirements.txt +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/setup.cfg +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/__main__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/args.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/cache.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/afl/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/afl/afltables/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/afl/afltables/afl_afltables_game_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/afl/afltables/afl_afltables_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/afl/afltables/afl_afltables_player_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/afl/afltables/afl_afltables_team_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/afl/afltables/afl_afltables_venue_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/afl/aussportsbetting/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/afl/aussportsbetting/afl_aussportsbetting_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/afl/combined/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/afl/combined/afl_combined_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/afl/espn/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/afl/espn/afl_espn_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/afl/oddsportal/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/afl/oddsportal/afl_oddsportal_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/aussportsbetting/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/aussportsbetting/aussportsbetting_bookie_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/aussportsbetting/aussportsbetting_game_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/aussportsbetting/aussportsbetting_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/aussportsbetting/aussportsbetting_odds_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/aussportsbetting/aussportsbetting_team_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/aussportsbetting/aussportsbetting_venue_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/bookie_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/combined/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/combined/combined_address_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/combined/combined_game_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/combined/combined_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/combined/combined_player_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/combined/combined_team_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/combined/combined_venue_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/combined/combined_weather_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/espn/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/espn/espn_bookie_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/espn/espn_game_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/espn/espn_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/espn/espn_odds_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/espn/espn_player_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/espn/espn_team_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/espn/espn_venue_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/field_type.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/game_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/google/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/google/google_news_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/league.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nba/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nba/combined/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nba/combined/nba_combined_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nba/espn/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nba/espn/nba_espn_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nba/nba/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nba/nba/nba_nba_game_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nba/nba/nba_nba_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nba/nba/nba_nba_player_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nba/nba/nba_nba_team_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nba/oddsportal/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nba/oddsportal/nba_oddsportal_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nba/sportsdb/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nba/sportsdb/nba_sportsdb_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nba/sportsreference/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nba/sportsreference/nba_sportsreference_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/ncaab/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/ncaab/combined/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/ncaab/combined/ncaab_combined_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/ncaab/espn/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/ncaab/espn/ncaab_espn_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/ncaab/oddsportal/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/ncaab/oddsportal/ncaab_oddsportal_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/ncaab/sportsreference/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/ncaab/sportsreference/ncaab_sportsreference_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/ncaaf/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/ncaaf/combined/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/ncaaf/combined/ncaaf_combined_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/ncaaf/espn/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/ncaaf/espn/ncaaf_espn_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/ncaaf/oddsportal/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/ncaaf/oddsportal/ncaaf_oddsportal_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/news_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nfl/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nfl/aussportsbetting/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nfl/aussportsbetting/nfl_aussportsbetting_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nfl/combined/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nfl/combined/nfl_combined_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nfl/espn/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nfl/espn/nfl_espn_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nfl/oddsportal/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nfl/oddsportal/nfl_oddsportal_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nfl/sportsdb/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/nfl/sportsdb/nfl_sportsdb_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/odds_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/oddsportal/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/oddsportal/oddsportal_bookie_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/oddsportal/oddsportal_odds_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/oddsportal/oddsportal_venue_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/player_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/season_type.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/social_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/sportsdb/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/sportsdb/sportsdb_game_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/sportsdb/sportsdb_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/sportsdb/sportsdb_team_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/sportsdb/sportsdb_venue_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/sportsreference/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/sportsreference/sportsreference_game_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/sportsreference/sportsreference_league_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/sportsreference/sportsreference_player_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/sportsreference/sportsreference_team_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/sportsreference/sportsreference_venue_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/team_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/venue_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/weather/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/weather/gribstream/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/weather/gribstream/gribstream_weather_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/weather/multi_weather_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/weather/openmeteo/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/weather/openmeteo/openmeteo_weather_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/weather_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/wikipedia/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/wikipedia/wikipedia_venue_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/x/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/x/x_social_model.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/logger.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/loglevel.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/proxy_session.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/session.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/sportsball.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/vendor/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball/vendor/pygooglenews/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball.egg-info/SOURCES.txt +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball.egg-info/dependency_links.txt +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball.egg-info/entry_points.txt +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball.egg-info/not-zip-safe +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball.egg-info/requires.txt +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/sportsball.egg-info/top_level.txt +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/afl/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/afl/afltables/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/afl/afltables/afl_afltables_league_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/afl/afltables/afl_afltables_player_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/aussportsbetting/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/aussportsbetting/aussportsbetting_game_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/combined/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/combined/combined_game_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/combined/combined_player_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/espn/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/espn/espn_game_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/espn/espn_player_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/game_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/google/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/google/google_address_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/google/google_news_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/nba/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/nba/nba/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/nba/nba/nba_nba_game_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/nba/nba/nba_nba_league_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/nba/nba/nba_nba_player_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/nba/nba/nba_nba_team_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/nba/sportsdb/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/nba/sportsdb/nba_sportsdb_league_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/nba/sportsreference/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/nba/sportsreference/nba_sportsreference_league_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/ncaab/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/ncaab/sportsreference/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/ncaab/sportsreference/ncaab_sportsreference_league_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/nfl/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/nfl/sportsdb/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/nfl/sportsdb/nfl_sportsdb_league_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/oddsportal/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/oddsportal/oddsportal_game_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/oddsportal/oddsportal_league_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/player_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/social_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/sportsdb/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/sportsdb/sportsdb_game_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/sportsdb/sportsdb_league_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/sportsdb/sportsdb_team_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/sportsdb/sportsdb_venue_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/sportsreference/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/sportsreference/sportsreference_game_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/sportsreference/sportsreference_league_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/sportsreference/sportsreference_player_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/sportsreference/sportsreference_team_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/sportsreference/sportsreference_venue_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/team_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/x/__init__.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/data/x/x_social_model_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/tests/proxy_session_test.py +0 -0
- {sportsball-0.3.32 → sportsball-0.3.33}/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.33',
|
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',
|
@@ -11,7 +11,9 @@ class AddressModel(BaseModel):
|
|
11
11
|
|
12
12
|
city: str = Field(..., json_schema_extra={TYPE_KEY: FieldType.CATEGORICAL})
|
13
13
|
state: str = Field(..., json_schema_extra={TYPE_KEY: FieldType.CATEGORICAL})
|
14
|
-
zipcode: str = Field(
|
14
|
+
zipcode: str | None = Field(
|
15
|
+
..., json_schema_extra={TYPE_KEY: FieldType.CATEGORICAL}
|
16
|
+
)
|
15
17
|
latitude: float | None
|
16
18
|
longitude: float | None
|
17
19
|
housenumber: str | None = Field(
|
@@ -7828,6 +7828,142 @@ _CACHED_GEOCODES: dict[str, Any] = {
|
|
7828
7828
|
country="USA",
|
7829
7829
|
),
|
7830
7830
|
"Island Federal Credit Union Arena, New York, NY, USA": STONY_BROOK_ARENA,
|
7831
|
+
"Subiaco Oval, Perth, Australia": DOMAIN_STADIUM,
|
7832
|
+
"University of Tasmania Stadium, Launceston, Australia": UTAS_STADIUM,
|
7833
|
+
"Mars Stadium, Ballarat, Australia": MARS_STADIUM,
|
7834
|
+
"Savannah, Georgia": SportsballGeocodeTuple(
|
7835
|
+
city="Savannah",
|
7836
|
+
state="GA",
|
7837
|
+
postal="",
|
7838
|
+
lat=32.081111,
|
7839
|
+
lng=-81.091111,
|
7840
|
+
housenumber="",
|
7841
|
+
country="USA",
|
7842
|
+
),
|
7843
|
+
"Blundstone Arena, Hobart, Australia": BLUNDSTONE_ARENA,
|
7844
|
+
"Akron, Ohio": SportsballGeocodeTuple(
|
7845
|
+
city="Akron",
|
7846
|
+
state="OH",
|
7847
|
+
postal="",
|
7848
|
+
lat=41.080556,
|
7849
|
+
lng=-81.522222,
|
7850
|
+
housenumber="",
|
7851
|
+
country="USA",
|
7852
|
+
),
|
7853
|
+
"Michelob Ultra Arena, Paradise, Nevada": SportsballGeocodeTuple(
|
7854
|
+
city="Paradise",
|
7855
|
+
state="NV",
|
7856
|
+
postal="",
|
7857
|
+
lat=36.090678,
|
7858
|
+
lng=-115.178981,
|
7859
|
+
housenumber="3950",
|
7860
|
+
country="USA",
|
7861
|
+
),
|
7862
|
+
"Sioux Falls, South Dakota": SportsballGeocodeTuple(
|
7863
|
+
city="Sioux Falls",
|
7864
|
+
state="SD",
|
7865
|
+
postal="",
|
7866
|
+
lat=43.536389,
|
7867
|
+
lng=-96.731667,
|
7868
|
+
housenumber="",
|
7869
|
+
country="USA",
|
7870
|
+
),
|
7871
|
+
"TIO Traeger Park, Alice Springs, Australia": TIO_STADIUM,
|
7872
|
+
"Springfield, Massachusetts": SportsballGeocodeTuple(
|
7873
|
+
city="Springfield",
|
7874
|
+
state="MA",
|
7875
|
+
postal="",
|
7876
|
+
lat=42.101389,
|
7877
|
+
lng=-72.590278,
|
7878
|
+
housenumber="",
|
7879
|
+
country="USA",
|
7880
|
+
),
|
7881
|
+
"Elmont, New York": SportsballGeocodeTuple(
|
7882
|
+
city="Elmont",
|
7883
|
+
state="NY",
|
7884
|
+
postal="",
|
7885
|
+
lat=40.701667,
|
7886
|
+
lng=-73.7025,
|
7887
|
+
housenumber="",
|
7888
|
+
country="USA",
|
7889
|
+
),
|
7890
|
+
"Manuka Oval, Canberra, Australia": MANUKA_OVAL,
|
7891
|
+
"Tulsa, Oklahoma": SportsballGeocodeTuple(
|
7892
|
+
city="Tulsa",
|
7893
|
+
state="OK",
|
7894
|
+
postal="",
|
7895
|
+
lat=36.131389,
|
7896
|
+
lng=-95.937222,
|
7897
|
+
housenumber="",
|
7898
|
+
country="USA",
|
7899
|
+
),
|
7900
|
+
"Sunrise, Florida": SportsballGeocodeTuple(
|
7901
|
+
city="Sunrise",
|
7902
|
+
state="FL",
|
7903
|
+
postal="",
|
7904
|
+
lat=26.157222,
|
7905
|
+
lng=-80.286111,
|
7906
|
+
housenumber="",
|
7907
|
+
country="USA",
|
7908
|
+
),
|
7909
|
+
"Paradise, Nevada": SportsballGeocodeTuple(
|
7910
|
+
city="Paradise",
|
7911
|
+
state="NV",
|
7912
|
+
postal="",
|
7913
|
+
lat=36.081944,
|
7914
|
+
lng=-115.124722,
|
7915
|
+
housenumber="",
|
7916
|
+
country="USA",
|
7917
|
+
),
|
7918
|
+
"Niceville, Florida": SportsballGeocodeTuple(
|
7919
|
+
city="Niceville",
|
7920
|
+
state="FL",
|
7921
|
+
postal="",
|
7922
|
+
lat=30.516111,
|
7923
|
+
lng=-86.471667,
|
7924
|
+
housenumber="",
|
7925
|
+
country="USA",
|
7926
|
+
),
|
7927
|
+
"Jiangwan Stadium, Shanghai, China": JIANGWAN_STADIUM,
|
7928
|
+
"Ondrej Nepela Arena, Bratislava, Slovakia": SportsballGeocodeTuple(
|
7929
|
+
city="Bratislava",
|
7930
|
+
state="",
|
7931
|
+
postal="",
|
7932
|
+
lat=48.16,
|
7933
|
+
lng=17.135833,
|
7934
|
+
housenumber="9",
|
7935
|
+
country="Slovakia",
|
7936
|
+
),
|
7937
|
+
"Cazaly's Stadium, Cairns, Australia": CAZALYS_STADIUM,
|
7938
|
+
"San Juan Capistrano, California": SportsballGeocodeTuple(
|
7939
|
+
city="San Juan Capistrano",
|
7940
|
+
state="CA",
|
7941
|
+
postal="",
|
7942
|
+
lat=33.499444,
|
7943
|
+
lng=-117.661667,
|
7944
|
+
housenumber="",
|
7945
|
+
country="USA",
|
7946
|
+
),
|
7947
|
+
"Giants Stadium, East Rutherford, NJ, USA": METLIFE_STADIUM,
|
7948
|
+
"TIO Stadium, Darwin, Australia": TIO_STADIUM,
|
7949
|
+
"Fort Myers, Florida": SportsballGeocodeTuple(
|
7950
|
+
city="Fort Myers",
|
7951
|
+
state="FL",
|
7952
|
+
postal="",
|
7953
|
+
lat=26.616667,
|
7954
|
+
lng=-81.833333,
|
7955
|
+
housenumber="",
|
7956
|
+
country="USA",
|
7957
|
+
),
|
7958
|
+
"Thunderdome Stadium, Nonthaburi, Thailand": SportsballGeocodeTuple(
|
7959
|
+
city="Nonthaburi",
|
7960
|
+
state="",
|
7961
|
+
postal="",
|
7962
|
+
lat=13.917989,
|
7963
|
+
lng=100.547411,
|
7964
|
+
housenumber="",
|
7965
|
+
country="Thailand",
|
7966
|
+
),
|
7831
7967
|
}
|
7832
7968
|
|
7833
7969
|
|
@@ -3,9 +3,11 @@
|
|
3
3
|
# pylint: disable=too-many-locals
|
4
4
|
import base64
|
5
5
|
import json
|
6
|
+
import logging
|
6
7
|
import urllib.parse
|
7
8
|
from typing import Any
|
8
9
|
|
10
|
+
import requests
|
9
11
|
import requests_cache
|
10
12
|
from bs4 import BeautifulSoup
|
11
13
|
from cryptography.hazmat.backends import default_backend
|
@@ -73,8 +75,18 @@ def fetch_data(
|
|
73
75
|
url,
|
74
76
|
headers=headers,
|
75
77
|
)
|
76
|
-
|
77
|
-
|
78
|
+
|
79
|
+
try:
|
80
|
+
response.raise_for_status()
|
81
|
+
except requests.exceptions.HTTPError as exc:
|
82
|
+
logging.error("HTTP error: %s for URL: %s", str(exc), referer_url)
|
83
|
+
raise exc
|
84
|
+
|
85
|
+
try:
|
86
|
+
decoded_data = base64.b64decode(response.content).decode()
|
87
|
+
except UnicodeDecodeError as exc:
|
88
|
+
logging.error("Error base64 decoding payload: %s", response.content)
|
89
|
+
raise exc
|
78
90
|
encrypted, key = decoded_data.split(":")
|
79
91
|
encrypted_bytes = base64.urlsafe_b64decode(encrypted)
|
80
92
|
key_bytes = bytes.fromhex(key)
|
@@ -3,6 +3,7 @@
|
|
3
3
|
# pylint: disable=too-many-locals,too-many-statements,line-too-long
|
4
4
|
import datetime
|
5
5
|
import json
|
6
|
+
import logging
|
6
7
|
import urllib.parse
|
7
8
|
|
8
9
|
import pytest_is_running
|
@@ -22,8 +23,13 @@ def _create_oddsportal_game_model(
|
|
22
23
|
session: requests_cache.CachedSession,
|
23
24
|
url: str,
|
24
25
|
league: League,
|
25
|
-
) -> GameModel:
|
26
|
-
response = session.get(
|
26
|
+
) -> GameModel | None:
|
27
|
+
response = session.get(
|
28
|
+
url,
|
29
|
+
headers={
|
30
|
+
X_NO_WAYBACK: "1",
|
31
|
+
},
|
32
|
+
)
|
27
33
|
response.raise_for_status()
|
28
34
|
|
29
35
|
soup = BeautifulSoup(response.text, "html.parser")
|
@@ -32,7 +38,8 @@ def _create_oddsportal_game_model(
|
|
32
38
|
soup_x = BeautifulSoup(response.text, "xml")
|
33
39
|
event_tag = soup_x.find("Event")
|
34
40
|
if not isinstance(event_tag, Tag):
|
35
|
-
|
41
|
+
logging.error("event_tag is not a tag for URL: %s.", url)
|
42
|
+
return None
|
36
43
|
event = json.loads(str(event_tag[":data"]))
|
37
44
|
else:
|
38
45
|
event = json.loads(str(event_tag["data"]))
|
@@ -72,8 +79,8 @@ def _create_oddsportal_game_model(
|
|
72
79
|
event_body["venueCountry"],
|
73
80
|
)
|
74
81
|
|
75
|
-
|
76
|
-
parsed_data = fetch_data(
|
82
|
+
dat_url = f"https://www.oddsportal.com/match-event/{version_id}-{sport_id}-{unique_id}-{default_bet_id}-{default_scope_id}-{xhash}.dat"
|
83
|
+
parsed_data = fetch_data(dat_url, session, url, soup)
|
77
84
|
|
78
85
|
return GameModel(
|
79
86
|
dt=dt,
|
@@ -121,7 +128,7 @@ def _cached_create_oddsportal_game_model(
|
|
121
128
|
session: requests_cache.CachedSession,
|
122
129
|
url: str,
|
123
130
|
league: League,
|
124
|
-
) -> GameModel:
|
131
|
+
) -> GameModel | None:
|
125
132
|
return _create_oddsportal_game_model(session, url, league)
|
126
133
|
|
127
134
|
|
@@ -130,7 +137,7 @@ def create_oddsportal_game_model(
|
|
130
137
|
url: str,
|
131
138
|
league: League,
|
132
139
|
is_next: bool,
|
133
|
-
) -> GameModel:
|
140
|
+
) -> GameModel | None:
|
134
141
|
"""Create a OddsPortal game model."""
|
135
142
|
if not pytest_is_running.is_running() and not is_next:
|
136
143
|
return _cached_create_oddsportal_game_model(session, url, league)
|
{sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/oddsportal/oddsportal_league_model.py
RENAMED
@@ -56,7 +56,7 @@ def _process_results_pages(
|
|
56
56
|
current_page = 1
|
57
57
|
total_pages = None
|
58
58
|
while (current_page == 1 and total_pages is None) or (
|
59
|
-
current_page <= 0 if total_pages is None else total_pages
|
59
|
+
current_page <= (0 if total_pages is None else total_pages)
|
60
60
|
):
|
61
61
|
dat_url = f"https://www.oddsportal.com/ajax-sport-country-tournament-archive_/{sports_id}/{oddsportal_id}/X134529032X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X512X32X0X0X0X0X0X0X131072X0X2048/1/-5/page/{current_page}//"
|
62
62
|
parsed_data = fetch_data(dat_url, session, url, soup)
|
@@ -67,6 +67,8 @@ def _process_results_pages(
|
|
67
67
|
game_model = create_oddsportal_game_model(
|
68
68
|
session, urllib.parse.urljoin(url, row["url"]), league, False
|
69
69
|
)
|
70
|
+
if game_model is None:
|
71
|
+
continue
|
70
72
|
pbar.update(1)
|
71
73
|
pbar.set_description(f"OddsPortal {game_model.dt}")
|
72
74
|
yield game_model
|
@@ -97,7 +99,7 @@ class OddsPortalLeagueModel(LeagueModel):
|
|
97
99
|
def _find_next(self, pbar: tqdm.tqdm) -> Iterator[GameModel]:
|
98
100
|
base_url = "https://www.oddsportal.com/" + self._path
|
99
101
|
with self.session.cache_disabled():
|
100
|
-
response = self.session.get(base_url)
|
102
|
+
response = self.session.get(base_url, headers={X_NO_WAYBACK: "1"})
|
101
103
|
response.raise_for_status()
|
102
104
|
data = extruct.extract(response.text, base_url=base_url)
|
103
105
|
for jsonld in data["json-ld"]:
|
@@ -110,6 +112,8 @@ class OddsPortalLeagueModel(LeagueModel):
|
|
110
112
|
self.league,
|
111
113
|
True,
|
112
114
|
)
|
115
|
+
if game_model is None:
|
116
|
+
continue
|
113
117
|
pbar.update(1)
|
114
118
|
pbar.set_description(
|
115
119
|
f"OddsPortal {game_model.year} - {game_model.season_type} - {game_model.dt}"
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
# pylint: disable=too-many-arguments,duplicate-code,line-too-long,too-many-locals
|
4
4
|
import datetime
|
5
|
+
import logging
|
5
6
|
from typing import Any
|
6
7
|
|
7
8
|
import pytest_is_running
|
@@ -27,29 +28,34 @@ def _create_oddsportal_team_model(
|
|
27
28
|
team_idx: int,
|
28
29
|
parsed_data: dict[str, Any],
|
29
30
|
) -> TeamModel:
|
30
|
-
|
31
|
-
odds_data = parsed_data["d"]["oddsdata"]["back"][
|
32
|
-
f"E-{default_bet_id}-{default_scope_id}-0-0-0"
|
33
|
-
]
|
34
|
-
except KeyError:
|
35
|
-
back = parsed_data["d"]["oddsdata"]["back"]
|
36
|
-
odds_data = back[sorted(list(back.keys()))[0]]
|
37
|
-
try:
|
38
|
-
outcome_id = odds_data["outcomeId"][team_idx]
|
39
|
-
except KeyError:
|
40
|
-
outcome_id = odds_data["outcomeId"][str(team_idx)]
|
41
|
-
history = odds_data["history"][outcome_id]
|
31
|
+
back = parsed_data["d"]["oddsdata"]["back"]
|
42
32
|
odds_models = []
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
33
|
+
|
34
|
+
if not isinstance(back, list):
|
35
|
+
try:
|
36
|
+
odds_data = back[f"E-{default_bet_id}-{default_scope_id}-0-0-0"]
|
37
|
+
except KeyError:
|
38
|
+
back = parsed_data["d"]["oddsdata"]["back"]
|
39
|
+
odds_data = back[sorted(list(back.keys()))[0]]
|
40
|
+
except TypeError as exc:
|
41
|
+
logging.error("Failed to parse the following odds")
|
42
|
+
raise exc
|
43
|
+
try:
|
44
|
+
outcome_id = odds_data["outcomeId"][team_idx]
|
45
|
+
except KeyError:
|
46
|
+
outcome_id = odds_data["outcomeId"][str(team_idx)]
|
47
|
+
history = odds_data["history"][outcome_id]
|
48
|
+
|
49
|
+
for bookie_id, bookie_name in bookie_names.items():
|
50
|
+
for odds, _, timestamp in history.get(bookie_id, []):
|
51
|
+
odds_models.append(
|
52
|
+
create_oddsportal_odds_model(
|
53
|
+
odds,
|
54
|
+
datetime.datetime.fromtimestamp(timestamp),
|
55
|
+
bookie_name,
|
56
|
+
bookie_id, # type: ignore
|
57
|
+
)
|
51
58
|
)
|
52
|
-
)
|
53
59
|
|
54
60
|
return TeamModel(
|
55
61
|
identifier=team_name,
|
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.32 → sportsball-0.3.33}/sportsball/data/afl/afltables/afl_afltables_game_model.py
RENAMED
File without changes
|
{sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/afl/afltables/afl_afltables_league_model.py
RENAMED
File without changes
|
{sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/afl/afltables/afl_afltables_player_model.py
RENAMED
File without changes
|
{sportsball-0.3.32 → sportsball-0.3.33}/sportsball/data/afl/afltables/afl_afltables_team_model.py
RENAMED
File without changes
|
{sportsball-0.3.32 → sportsball-0.3.33}/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.32 → sportsball-0.3.33}/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
|
File without changes
|
{sportsball-0.3.32 → sportsball-0.3.33}/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
|
File without changes
|
{sportsball-0.3.32 → sportsball-0.3.33}/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.32 → sportsball-0.3.33}/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.32 → sportsball-0.3.33}/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.32 → sportsball-0.3.33}/sportsball/data/nfl/combined/nfl_combined_league_model.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|