sportsball 0.3.16__tar.gz → 0.3.17__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.16/sportsball.egg-info → sportsball-0.3.17}/PKG-INFO +2 -2
- {sportsball-0.3.16 → sportsball-0.3.17}/README.md +1 -1
- {sportsball-0.3.16 → sportsball-0.3.17}/setup.py +1 -1
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/__init__.py +1 -1
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/afltables/afl_afltables_league_model.py +8 -1
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/afltables/afl_afltables_venue_model.py +22 -3
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/aussportsbetting/aussportsbetting_league_model.py +2 -1
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/combined/combined_league_model.py +1 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/weather/gribstream/gribstream_weather_model.py +29 -4
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/weather/multi_weather_model.py +2 -2
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/weather/openmeteo/openmeteo_weather_model.py +33 -4
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/proxy_session.py +2 -42
- {sportsball-0.3.16 → sportsball-0.3.17/sportsball.egg-info}/PKG-INFO +2 -2
- {sportsball-0.3.16 → sportsball-0.3.17}/LICENSE +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/MANIFEST.in +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/requirements.txt +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/setup.cfg +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/__main__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/args.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/cache.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/address_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/afltables/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/afltables/afl_afltables_game_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/afltables/afl_afltables_player_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/afltables/afl_afltables_team_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/aussportsbetting/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/aussportsbetting/afl_aussportsbetting_league_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/combined/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/combined/afl_combined_league_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/espn/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/espn/afl_espn_league_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/aussportsbetting/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/aussportsbetting/aussportsbetting_bookie_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/aussportsbetting/aussportsbetting_game_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/aussportsbetting/aussportsbetting_odds_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/aussportsbetting/aussportsbetting_team_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/aussportsbetting/aussportsbetting_venue_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/bookie_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/combined/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/combined/combined_address_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/combined/combined_game_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/combined/combined_player_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/combined/combined_team_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/combined/combined_venue_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/combined/combined_weather_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/espn/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/espn/espn_bookie_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/espn/espn_game_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/espn/espn_league_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/espn/espn_odds_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/espn/espn_player_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/espn/espn_team_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/espn/espn_venue_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/field_type.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/game_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/google/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/google/google_address_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/google/google_news_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/league.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/league_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/combined/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/combined/nba_combined_league_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/espn/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/espn/nba_espn_league_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/nba/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/nba/nba_nba_game_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/nba/nba_nba_league_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/nba/nba_nba_player_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/nba/nba_nba_team_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/sportsdb/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/sportsdb/nba_sportsdb_league_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/sportsreference/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/sportsreference/nba_sportsreference_league_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/ncaab/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/ncaab/combined/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/ncaab/combined/ncaab_combined_league_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/ncaab/espn/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/ncaab/espn/ncaab_espn_league_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/ncaab/sportsreference/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/ncaab/sportsreference/ncaab_sportsreference_league_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/ncaaf/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/ncaaf/espn/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/ncaaf/espn/ncaaf_espn_league_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/news_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nfl/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nfl/aussportsbetting/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nfl/aussportsbetting/nfl_aussportsbetting_league_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nfl/combined/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nfl/combined/nfl_combined_league_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nfl/espn/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nfl/espn/nfl_espn_league_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nfl/sportsdb/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nfl/sportsdb/nfl_sportsdb_league_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/odds_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/player_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/season_type.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/social_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/sportsdb/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/sportsdb/sportsdb_game_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/sportsdb/sportsdb_league_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/sportsdb/sportsdb_team_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/sportsdb/sportsdb_venue_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/sportsreference/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/sportsreference/sportsreference_game_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/sportsreference/sportsreference_league_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/sportsreference/sportsreference_player_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/sportsreference/sportsreference_team_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/sportsreference/sportsreference_venue_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/team_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/venue_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/weather/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/weather/gribstream/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/weather/openmeteo/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/weather_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/wikipedia/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/wikipedia/wikipedia_venue_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/x/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/x/x_social_model.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/logger.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/loglevel.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/session.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/sportsball.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball.egg-info/SOURCES.txt +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball.egg-info/dependency_links.txt +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball.egg-info/entry_points.txt +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball.egg-info/not-zip-safe +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball.egg-info/requires.txt +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/sportsball.egg-info/top_level.txt +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/afl/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/afl/afltables/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/afl/afltables/afl_afltables_player_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/aussportsbetting/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/aussportsbetting/aussportsbetting_game_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/combined/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/combined/combined_game_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/combined/combined_player_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/espn/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/espn/espn_game_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/espn/espn_player_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/game_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/google/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/google/google_address_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/google/google_news_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nba/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nba/nba/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nba/nba/nba_nba_game_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nba/nba/nba_nba_league_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nba/nba/nba_nba_player_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nba/nba/nba_nba_team_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nba/sportsdb/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nba/sportsdb/nba_sportsdb_league_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nba/sportsreference/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nba/sportsreference/nba_sportsreference_league_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/ncaab/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/ncaab/sportsreference/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/ncaab/sportsreference/ncaab_sportsreference_league_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nfl/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nfl/sportsdb/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nfl/sportsdb/nfl_sportsdb_league_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/player_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/social_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/sportsdb/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/sportsdb/sportsdb_game_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/sportsdb/sportsdb_league_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/sportsdb/sportsdb_team_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/sportsdb/sportsdb_venue_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/sportsreference/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/sportsreference/sportsreference_game_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/sportsreference/sportsreference_league_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/sportsreference/sportsreference_player_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/sportsreference/sportsreference_team_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/sportsreference/sportsreference_venue_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/team_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/x/__init__.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/x/x_social_model_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/proxy_session_test.py +0 -0
- {sportsball-0.3.16 → sportsball-0.3.17}/tests/sportsball_test.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: sportsball
|
3
|
-
Version: 0.3.
|
3
|
+
Version: 0.3.17
|
4
4
|
Summary: A library for pulling in and normalising sports stats.
|
5
5
|
Home-page: https://github.com/8W9aG/sportsball
|
6
6
|
Author: Will Sackfield
|
@@ -244,7 +244,7 @@ Social media posts one day out from the game.
|
|
244
244
|
This library uses very aggressive caching due to the large data requirements. If the requests are about a recent game (generally in the last 7 days) the caching is bypassed. The caching is as follows:
|
245
245
|
|
246
246
|
1. A joblib disk cache that caches calls to pydantic model creation functions. This changes on every version update to keep the models in sync. This is the fastest cache.
|
247
|
-
2. A requests cache backed by sqlite that caches requests
|
247
|
+
2. A requests cache backed by sqlite that caches requests forever.
|
248
248
|
3. An attempt to find the response is made to the wayback machine, and used if found.
|
249
249
|
|
250
250
|
It's very recommended that the user uses proxies defined in the `PROXIES` environment variable. The more proxies the easier it is to collect data.
|
@@ -191,7 +191,7 @@ Social media posts one day out from the game.
|
|
191
191
|
This library uses very aggressive caching due to the large data requirements. If the requests are about a recent game (generally in the last 7 days) the caching is bypassed. The caching is as follows:
|
192
192
|
|
193
193
|
1. A joblib disk cache that caches calls to pydantic model creation functions. This changes on every version update to keep the models in sync. This is the fastest cache.
|
194
|
-
2. A requests cache backed by sqlite that caches requests
|
194
|
+
2. A requests cache backed by sqlite that caches requests forever.
|
195
195
|
3. An attempt to find the response is made to the wayback machine, and used if found.
|
196
196
|
|
197
197
|
It's very recommended that the user uses proxies defined in the `PROXIES` environment variable. The more proxies the easier it is to collect data.
|
@@ -23,7 +23,7 @@ def install_requires() -> typing.List[str]:
|
|
23
23
|
|
24
24
|
setup(
|
25
25
|
name='sportsball',
|
26
|
-
version='0.3.
|
26
|
+
version='0.3.17',
|
27
27
|
description='A library for pulling in and normalising sports stats.',
|
28
28
|
long_description=long_description,
|
29
29
|
long_description_content_type='text/markdown',
|
{sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/afltables/afl_afltables_league_model.py
RENAMED
@@ -1,5 +1,7 @@
|
|
1
1
|
"""AFL AFLTables league model."""
|
2
2
|
|
3
|
+
# pylint: disable=too-many-statements
|
4
|
+
import datetime
|
3
5
|
import os
|
4
6
|
import urllib.parse
|
5
7
|
from typing import Iterator
|
@@ -34,7 +36,12 @@ class AFLAFLTablesLeagueModel(LeagueModel):
|
|
34
36
|
filename, _ = os.path.splitext(last_component)
|
35
37
|
year = int(filename)
|
36
38
|
|
37
|
-
|
39
|
+
if year < datetime.datetime.now().year - 1:
|
40
|
+
with self.session.cache_disabled():
|
41
|
+
response = self.session.get(season_url)
|
42
|
+
else:
|
43
|
+
response = self.session.get(season_url)
|
44
|
+
|
38
45
|
soup = BeautifulSoup(response.text, "html.parser")
|
39
46
|
in_finals = False
|
40
47
|
game_number = 0
|
{sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/afltables/afl_afltables_venue_model.py
RENAMED
@@ -4,6 +4,7 @@ import datetime
|
|
4
4
|
import os
|
5
5
|
from urllib.parse import urlparse
|
6
6
|
|
7
|
+
import pytest_is_running
|
7
8
|
import requests_cache
|
8
9
|
from bs4 import BeautifulSoup
|
9
10
|
|
@@ -12,11 +13,9 @@ from ...google.google_address_model import create_google_address_model
|
|
12
13
|
from ...venue_model import VenueModel
|
13
14
|
|
14
15
|
|
15
|
-
|
16
|
-
def create_afl_afltables_venue_model(
|
16
|
+
def _create_afl_afltables_venue_model(
|
17
17
|
url: str, session: requests_cache.CachedSession, dt: datetime.datetime
|
18
18
|
) -> VenueModel:
|
19
|
-
"""Create a venue model from AFL tables."""
|
20
19
|
o = urlparse(url)
|
21
20
|
last_component = o.path.split("/")[-1]
|
22
21
|
identifier, _ = os.path.splitext(last_component)
|
@@ -35,3 +34,23 @@ def create_afl_afltables_venue_model(
|
|
35
34
|
is_grass=None,
|
36
35
|
is_indoor=None,
|
37
36
|
)
|
37
|
+
|
38
|
+
|
39
|
+
@MEMORY.cache(ignore=["session"])
|
40
|
+
def _cached_create_afl_afltables_venue_model(
|
41
|
+
url: str, session: requests_cache.CachedSession, dt: datetime.datetime
|
42
|
+
) -> VenueModel:
|
43
|
+
return _create_afl_afltables_venue_model(url, session, dt)
|
44
|
+
|
45
|
+
|
46
|
+
def create_afl_afltables_venue_model(
|
47
|
+
url: str, session: requests_cache.CachedSession, dt: datetime.datetime
|
48
|
+
) -> VenueModel:
|
49
|
+
"""Create a venue model from AFL tables."""
|
50
|
+
if (
|
51
|
+
not pytest_is_running.is_running()
|
52
|
+
and dt < datetime.datetime.now() - datetime.timedelta(days=7)
|
53
|
+
):
|
54
|
+
return _cached_create_afl_afltables_venue_model(url, session, dt)
|
55
|
+
with session.cache_disabled():
|
56
|
+
return _create_afl_afltables_venue_model(url, session, dt)
|
@@ -88,7 +88,8 @@ class AusSportsBettingLeagueModel(LeagueModel):
|
|
88
88
|
|
89
89
|
@property
|
90
90
|
def games(self) -> Iterator[GameModel]:
|
91
|
-
|
91
|
+
with self.session.cache_disabled():
|
92
|
+
response = self.session.get(self._spreadsheet_url)
|
92
93
|
response.raise_for_status()
|
93
94
|
workbook = load_workbook(filename=BytesIO(response.content))
|
94
95
|
ws = workbook.active
|
@@ -7,21 +7,21 @@ import json
|
|
7
7
|
import os
|
8
8
|
|
9
9
|
import pandas as pd
|
10
|
+
import pytest_is_running
|
10
11
|
import pytz
|
11
12
|
import requests
|
13
|
+
import requests_cache
|
12
14
|
|
13
15
|
from ....cache import MEMORY
|
14
16
|
from ...weather_model import WeatherModel
|
15
17
|
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
-
session: requests.Session,
|
19
|
+
def _create_gribstream_weather_model(
|
20
|
+
session: requests_cache.CachedSession,
|
20
21
|
latitude: float,
|
21
22
|
longitude: float,
|
22
23
|
dt: datetime.datetime,
|
23
24
|
) -> WeatherModel | None:
|
24
|
-
"""Create a weather model from gribstream."""
|
25
25
|
api_key = os.environ.get("GRIBSTREAM_API_KEY")
|
26
26
|
if api_key is None:
|
27
27
|
return None
|
@@ -58,3 +58,28 @@ def create_gribstream_weather_model(
|
|
58
58
|
temperature = df.iloc[idx]["TMP|2 m above ground|"] # type: ignore
|
59
59
|
relative_humidity = df.iloc[idx]["RH|2 m above ground|"] # type: ignore
|
60
60
|
return WeatherModel(temperature=temperature, relative_humidity=relative_humidity)
|
61
|
+
|
62
|
+
|
63
|
+
@MEMORY.cache(ignore=["session"])
|
64
|
+
def _cached_create_gribstream_weather_model(
|
65
|
+
session: requests_cache.CachedSession,
|
66
|
+
latitude: float,
|
67
|
+
longitude: float,
|
68
|
+
dt: datetime.datetime,
|
69
|
+
) -> WeatherModel | None:
|
70
|
+
return _create_gribstream_weather_model(session, latitude, longitude, dt)
|
71
|
+
|
72
|
+
|
73
|
+
def create_gribstream_weather_model(
|
74
|
+
session: requests_cache.CachedSession,
|
75
|
+
latitude: float,
|
76
|
+
longitude: float,
|
77
|
+
dt: datetime.datetime,
|
78
|
+
) -> WeatherModel | None:
|
79
|
+
"""Create a weather model from gribstream."""
|
80
|
+
if not pytest_is_running.is_running() and dt < datetime.datetime.now().replace(
|
81
|
+
tzinfo=dt.tzinfo
|
82
|
+
) - datetime.timedelta(days=3):
|
83
|
+
return _cached_create_gribstream_weather_model(session, latitude, longitude, dt)
|
84
|
+
with session.cache_disabled():
|
85
|
+
return _create_gribstream_weather_model(session, latitude, longitude, dt)
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
import datetime
|
4
4
|
|
5
|
-
import
|
5
|
+
import requests_cache
|
6
6
|
|
7
7
|
from ...cache import MEMORY
|
8
8
|
from ..weather_model import WeatherModel
|
@@ -13,7 +13,7 @@ from .openmeteo.openmeteo_weather_model import create_openmeteo_weather_model
|
|
13
13
|
|
14
14
|
@MEMORY.cache(ignore=["session"])
|
15
15
|
def create_mutli_weather_model(
|
16
|
-
session:
|
16
|
+
session: requests_cache.CachedSession,
|
17
17
|
latitude: float,
|
18
18
|
longitude: float,
|
19
19
|
dt: datetime.datetime,
|
{sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/weather/openmeteo/openmeteo_weather_model.py
RENAMED
@@ -4,8 +4,10 @@ import datetime
|
|
4
4
|
|
5
5
|
import openmeteo_requests # type: ignore
|
6
6
|
import pandas as pd
|
7
|
+
import pytest_is_running
|
7
8
|
import pytz
|
8
9
|
import requests
|
10
|
+
import requests_cache
|
9
11
|
from openmeteo_requests.Client import OpenMeteoRequestsError # type: ignore
|
10
12
|
from openmeteo_requests.Client import WeatherApiResponse
|
11
13
|
|
@@ -54,15 +56,13 @@ def _parse_openmeteo(
|
|
54
56
|
return WeatherModel(temperature=temperature, relative_humidity=relative_humidity)
|
55
57
|
|
56
58
|
|
57
|
-
|
58
|
-
|
59
|
-
session: requests.Session,
|
59
|
+
def _create_openmeteo_weather_model(
|
60
|
+
session: requests_cache.CachedSession,
|
60
61
|
latitude: float,
|
61
62
|
longitude: float,
|
62
63
|
dt: datetime.datetime,
|
63
64
|
tz: str,
|
64
65
|
) -> WeatherModel | None:
|
65
|
-
"""Create a weather model from openmeteo."""
|
66
66
|
# pylint: disable=broad-exception-caught
|
67
67
|
client = openmeteo_requests.Client(session=session)
|
68
68
|
try:
|
@@ -138,3 +138,32 @@ def create_openmeteo_weather_model(
|
|
138
138
|
if "Parameter 'start_date' is out of allowed range from" in e_text:
|
139
139
|
return None
|
140
140
|
raise e
|
141
|
+
|
142
|
+
|
143
|
+
@MEMORY.cache(ignore=["session"])
|
144
|
+
def _cached_create_openmeteo_weather_model(
|
145
|
+
session: requests_cache.CachedSession,
|
146
|
+
latitude: float,
|
147
|
+
longitude: float,
|
148
|
+
dt: datetime.datetime,
|
149
|
+
tz: str,
|
150
|
+
) -> WeatherModel | None:
|
151
|
+
return _create_openmeteo_weather_model(session, latitude, longitude, dt, tz)
|
152
|
+
|
153
|
+
|
154
|
+
def create_openmeteo_weather_model(
|
155
|
+
session: requests_cache.CachedSession,
|
156
|
+
latitude: float,
|
157
|
+
longitude: float,
|
158
|
+
dt: datetime.datetime,
|
159
|
+
tz: str,
|
160
|
+
) -> WeatherModel | None:
|
161
|
+
"""Create a weather model from openmeteo."""
|
162
|
+
if not pytest_is_running.is_running() and dt < datetime.datetime.now().replace(
|
163
|
+
tzinfo=dt.tzinfo
|
164
|
+
) - datetime.timedelta(days=3):
|
165
|
+
return _cached_create_openmeteo_weather_model(
|
166
|
+
session, latitude, longitude, dt, tz
|
167
|
+
)
|
168
|
+
with session.cache_disabled():
|
169
|
+
return _create_openmeteo_weather_model(session, latitude, longitude, dt, tz)
|
@@ -86,47 +86,6 @@ class ProxySession(requests_cache.CachedSession):
|
|
86
86
|
def _perform_request(self, *args, **kwargs) -> requests.Response:
|
87
87
|
return super().request(*args, **kwargs)
|
88
88
|
|
89
|
-
@retry(
|
90
|
-
stop=stop_after_attempt(50),
|
91
|
-
after=after_log(logging.getLogger(__name__), logging.DEBUG),
|
92
|
-
before=before_log(logging.getLogger(__name__), logging.DEBUG),
|
93
|
-
retry=retry_if_exception_type(FunctionTimedOut)
|
94
|
-
| retry_if_exception_type(requests.exceptions.ProxyError)
|
95
|
-
| retry_if_exception_type(requests.exceptions.ConnectionError)
|
96
|
-
| retry_if_exception_type(requests.exceptions.ChunkedEncodingError)
|
97
|
-
| retry_if_exception_type(ValueError)
|
98
|
-
| retry_if_exception_type(requests.exceptions.HTTPError)
|
99
|
-
| retry_if_exception_type(requests.exceptions.ReadTimeout),
|
100
|
-
reraise=True,
|
101
|
-
)
|
102
|
-
def _perform_proxy_request(self, *args, **kwargs) -> requests.Response:
|
103
|
-
proxy = self._suggest_proxy()
|
104
|
-
if proxy:
|
105
|
-
logging.debug("Using proxy: %s", proxy)
|
106
|
-
kwargs.setdefault(
|
107
|
-
"proxies",
|
108
|
-
{
|
109
|
-
"http": proxy,
|
110
|
-
"https": proxy,
|
111
|
-
},
|
112
|
-
)
|
113
|
-
kwargs.setdefault("timeout", DEFAULT_TIMEOUT)
|
114
|
-
kwargs.setdefault("verify", False)
|
115
|
-
|
116
|
-
try:
|
117
|
-
response = self._perform_request(*args, **kwargs)
|
118
|
-
if not _is_fast_fail_url(response.url):
|
119
|
-
response.raise_for_status()
|
120
|
-
if not response.from_cache: # pyright: ignore
|
121
|
-
self._proxies.remove(proxy)
|
122
|
-
self._proxies.insert(0, proxy)
|
123
|
-
return response
|
124
|
-
except Exception as e:
|
125
|
-
logging.debug("Burning proxy: %s due to %s", proxy, str(e))
|
126
|
-
self._proxies.remove(proxy)
|
127
|
-
self._proxies.append(proxy)
|
128
|
-
raise e
|
129
|
-
|
130
89
|
def _wayback_machine_request(
|
131
90
|
self, method, url, **kwargs
|
132
91
|
) -> requests.Response | None:
|
@@ -205,6 +164,7 @@ class ProxySession(requests_cache.CachedSession):
|
|
205
164
|
| retry_if_exception_type(ValueError)
|
206
165
|
| retry_if_exception_type(requests.exceptions.HTTPError)
|
207
166
|
| retry_if_exception_type(requests.exceptions.ReadTimeout),
|
167
|
+
reraise=True,
|
208
168
|
)
|
209
169
|
def _perform_retry_send(self, request: requests.PreparedRequest, **kwargs) -> Any:
|
210
170
|
return self._perform_timeout_send(request, **kwargs)
|
@@ -289,5 +249,5 @@ def create_proxy_session() -> ProxySession:
|
|
289
249
|
"""Creates a standard proxy session."""
|
290
250
|
return ProxySession(
|
291
251
|
"sportsball",
|
292
|
-
expire_after=
|
252
|
+
expire_after=requests_cache.NEVER_EXPIRE,
|
293
253
|
)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: sportsball
|
3
|
-
Version: 0.3.
|
3
|
+
Version: 0.3.17
|
4
4
|
Summary: A library for pulling in and normalising sports stats.
|
5
5
|
Home-page: https://github.com/8W9aG/sportsball
|
6
6
|
Author: Will Sackfield
|
@@ -244,7 +244,7 @@ Social media posts one day out from the game.
|
|
244
244
|
This library uses very aggressive caching due to the large data requirements. If the requests are about a recent game (generally in the last 7 days) the caching is bypassed. The caching is as follows:
|
245
245
|
|
246
246
|
1. A joblib disk cache that caches calls to pydantic model creation functions. This changes on every version update to keep the models in sync. This is the fastest cache.
|
247
|
-
2. A requests cache backed by sqlite that caches requests
|
247
|
+
2. A requests cache backed by sqlite that caches requests forever.
|
248
248
|
3. An attempt to find the response is made to the wayback machine, and used if found.
|
249
249
|
|
250
250
|
It's very recommended that the user uses proxies defined in the `PROXIES` environment variable. The more proxies the easier it is to collect data.
|
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.16 → sportsball-0.3.17}/sportsball/data/afl/afltables/afl_afltables_game_model.py
RENAMED
File without changes
|
{sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/afltables/afl_afltables_player_model.py
RENAMED
File without changes
|
{sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/afltables/afl_afltables_team_model.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{sportsball-0.3.16 → sportsball-0.3.17}/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
|
{sportsball-0.3.16 → sportsball-0.3.17}/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
|
{sportsball-0.3.16 → sportsball-0.3.17}/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.16 → sportsball-0.3.17}/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
|
{sportsball-0.3.16 → sportsball-0.3.17}/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
|
{sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nfl/combined/nfl_combined_league_model.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nfl/sportsdb/nfl_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
|
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.16 → sportsball-0.3.17}/tests/data/afl/afltables/afl_afltables_player_model_test.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
|
{sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nba/sportsdb/nba_sportsdb_league_model_test.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.16 → sportsball-0.3.17}/tests/data/nfl/sportsdb/nfl_sportsdb_league_model_test.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
|