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.
Files changed (183) hide show
  1. {sportsball-0.3.16/sportsball.egg-info → sportsball-0.3.17}/PKG-INFO +2 -2
  2. {sportsball-0.3.16 → sportsball-0.3.17}/README.md +1 -1
  3. {sportsball-0.3.16 → sportsball-0.3.17}/setup.py +1 -1
  4. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/__init__.py +1 -1
  5. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/afltables/afl_afltables_league_model.py +8 -1
  6. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/afltables/afl_afltables_venue_model.py +22 -3
  7. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/aussportsbetting/aussportsbetting_league_model.py +2 -1
  8. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/combined/combined_league_model.py +1 -0
  9. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/weather/gribstream/gribstream_weather_model.py +29 -4
  10. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/weather/multi_weather_model.py +2 -2
  11. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/weather/openmeteo/openmeteo_weather_model.py +33 -4
  12. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/proxy_session.py +2 -42
  13. {sportsball-0.3.16 → sportsball-0.3.17/sportsball.egg-info}/PKG-INFO +2 -2
  14. {sportsball-0.3.16 → sportsball-0.3.17}/LICENSE +0 -0
  15. {sportsball-0.3.16 → sportsball-0.3.17}/MANIFEST.in +0 -0
  16. {sportsball-0.3.16 → sportsball-0.3.17}/requirements.txt +0 -0
  17. {sportsball-0.3.16 → sportsball-0.3.17}/setup.cfg +0 -0
  18. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/__main__.py +0 -0
  19. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/args.py +0 -0
  20. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/cache.py +0 -0
  21. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/__init__.py +0 -0
  22. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/address_model.py +0 -0
  23. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/__init__.py +0 -0
  24. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/afltables/__init__.py +0 -0
  25. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/afltables/afl_afltables_game_model.py +0 -0
  26. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/afltables/afl_afltables_player_model.py +0 -0
  27. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/afltables/afl_afltables_team_model.py +0 -0
  28. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/aussportsbetting/__init__.py +0 -0
  29. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/aussportsbetting/afl_aussportsbetting_league_model.py +0 -0
  30. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/combined/__init__.py +0 -0
  31. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/combined/afl_combined_league_model.py +0 -0
  32. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/espn/__init__.py +0 -0
  33. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/afl/espn/afl_espn_league_model.py +0 -0
  34. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/aussportsbetting/__init__.py +0 -0
  35. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/aussportsbetting/aussportsbetting_bookie_model.py +0 -0
  36. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/aussportsbetting/aussportsbetting_game_model.py +0 -0
  37. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/aussportsbetting/aussportsbetting_odds_model.py +0 -0
  38. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/aussportsbetting/aussportsbetting_team_model.py +0 -0
  39. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/aussportsbetting/aussportsbetting_venue_model.py +0 -0
  40. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/bookie_model.py +0 -0
  41. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/combined/__init__.py +0 -0
  42. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/combined/combined_address_model.py +0 -0
  43. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/combined/combined_game_model.py +0 -0
  44. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/combined/combined_player_model.py +0 -0
  45. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/combined/combined_team_model.py +0 -0
  46. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/combined/combined_venue_model.py +0 -0
  47. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/combined/combined_weather_model.py +0 -0
  48. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/espn/__init__.py +0 -0
  49. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/espn/espn_bookie_model.py +0 -0
  50. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/espn/espn_game_model.py +0 -0
  51. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/espn/espn_league_model.py +0 -0
  52. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/espn/espn_odds_model.py +0 -0
  53. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/espn/espn_player_model.py +0 -0
  54. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/espn/espn_team_model.py +0 -0
  55. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/espn/espn_venue_model.py +0 -0
  56. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/field_type.py +0 -0
  57. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/game_model.py +0 -0
  58. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/google/__init__.py +0 -0
  59. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/google/google_address_model.py +0 -0
  60. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/google/google_news_model.py +0 -0
  61. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/league.py +0 -0
  62. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/league_model.py +0 -0
  63. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/model.py +0 -0
  64. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/__init__.py +0 -0
  65. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/combined/__init__.py +0 -0
  66. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/combined/nba_combined_league_model.py +0 -0
  67. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/espn/__init__.py +0 -0
  68. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/espn/nba_espn_league_model.py +0 -0
  69. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/nba/__init__.py +0 -0
  70. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/nba/nba_nba_game_model.py +0 -0
  71. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/nba/nba_nba_league_model.py +0 -0
  72. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/nba/nba_nba_player_model.py +0 -0
  73. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/nba/nba_nba_team_model.py +0 -0
  74. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/sportsdb/__init__.py +0 -0
  75. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/sportsdb/nba_sportsdb_league_model.py +0 -0
  76. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/sportsreference/__init__.py +0 -0
  77. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nba/sportsreference/nba_sportsreference_league_model.py +0 -0
  78. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/ncaab/__init__.py +0 -0
  79. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/ncaab/combined/__init__.py +0 -0
  80. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/ncaab/combined/ncaab_combined_league_model.py +0 -0
  81. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/ncaab/espn/__init__.py +0 -0
  82. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/ncaab/espn/ncaab_espn_league_model.py +0 -0
  83. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/ncaab/sportsreference/__init__.py +0 -0
  84. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/ncaab/sportsreference/ncaab_sportsreference_league_model.py +0 -0
  85. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/ncaaf/__init__.py +0 -0
  86. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/ncaaf/espn/__init__.py +0 -0
  87. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/ncaaf/espn/ncaaf_espn_league_model.py +0 -0
  88. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/news_model.py +0 -0
  89. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nfl/__init__.py +0 -0
  90. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nfl/aussportsbetting/__init__.py +0 -0
  91. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nfl/aussportsbetting/nfl_aussportsbetting_league_model.py +0 -0
  92. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nfl/combined/__init__.py +0 -0
  93. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nfl/combined/nfl_combined_league_model.py +0 -0
  94. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nfl/espn/__init__.py +0 -0
  95. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nfl/espn/nfl_espn_league_model.py +0 -0
  96. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nfl/sportsdb/__init__.py +0 -0
  97. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/nfl/sportsdb/nfl_sportsdb_league_model.py +0 -0
  98. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/odds_model.py +0 -0
  99. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/player_model.py +0 -0
  100. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/season_type.py +0 -0
  101. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/social_model.py +0 -0
  102. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/sportsdb/__init__.py +0 -0
  103. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/sportsdb/sportsdb_game_model.py +0 -0
  104. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/sportsdb/sportsdb_league_model.py +0 -0
  105. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/sportsdb/sportsdb_team_model.py +0 -0
  106. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/sportsdb/sportsdb_venue_model.py +0 -0
  107. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/sportsreference/__init__.py +0 -0
  108. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/sportsreference/sportsreference_game_model.py +0 -0
  109. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/sportsreference/sportsreference_league_model.py +0 -0
  110. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/sportsreference/sportsreference_player_model.py +0 -0
  111. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/sportsreference/sportsreference_team_model.py +0 -0
  112. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/sportsreference/sportsreference_venue_model.py +0 -0
  113. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/team_model.py +0 -0
  114. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/venue_model.py +0 -0
  115. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/weather/__init__.py +0 -0
  116. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/weather/gribstream/__init__.py +0 -0
  117. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/weather/openmeteo/__init__.py +0 -0
  118. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/weather_model.py +0 -0
  119. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/wikipedia/__init__.py +0 -0
  120. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/wikipedia/wikipedia_venue_model.py +0 -0
  121. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/x/__init__.py +0 -0
  122. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/data/x/x_social_model.py +0 -0
  123. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/logger.py +0 -0
  124. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/loglevel.py +0 -0
  125. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/session.py +0 -0
  126. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball/sportsball.py +0 -0
  127. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball.egg-info/SOURCES.txt +0 -0
  128. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball.egg-info/dependency_links.txt +0 -0
  129. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball.egg-info/entry_points.txt +0 -0
  130. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball.egg-info/not-zip-safe +0 -0
  131. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball.egg-info/requires.txt +0 -0
  132. {sportsball-0.3.16 → sportsball-0.3.17}/sportsball.egg-info/top_level.txt +0 -0
  133. {sportsball-0.3.16 → sportsball-0.3.17}/tests/__init__.py +0 -0
  134. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/__init__.py +0 -0
  135. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/afl/__init__.py +0 -0
  136. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/afl/afltables/__init__.py +0 -0
  137. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/afl/afltables/afl_afltables_player_model_test.py +0 -0
  138. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/aussportsbetting/__init__.py +0 -0
  139. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/aussportsbetting/aussportsbetting_game_model_test.py +0 -0
  140. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/combined/__init__.py +0 -0
  141. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/combined/combined_game_model_test.py +0 -0
  142. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/combined/combined_player_model_test.py +0 -0
  143. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/espn/__init__.py +0 -0
  144. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/espn/espn_game_model_test.py +0 -0
  145. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/espn/espn_player_model_test.py +0 -0
  146. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/game_model_test.py +0 -0
  147. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/google/__init__.py +0 -0
  148. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/google/google_address_model_test.py +0 -0
  149. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/google/google_news_model_test.py +0 -0
  150. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nba/__init__.py +0 -0
  151. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nba/nba/__init__.py +0 -0
  152. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nba/nba/nba_nba_game_model_test.py +0 -0
  153. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nba/nba/nba_nba_league_model_test.py +0 -0
  154. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nba/nba/nba_nba_player_model_test.py +0 -0
  155. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nba/nba/nba_nba_team_model_test.py +0 -0
  156. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nba/sportsdb/__init__.py +0 -0
  157. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nba/sportsdb/nba_sportsdb_league_model_test.py +0 -0
  158. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nba/sportsreference/__init__.py +0 -0
  159. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nba/sportsreference/nba_sportsreference_league_model_test.py +0 -0
  160. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/ncaab/__init__.py +0 -0
  161. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/ncaab/sportsreference/__init__.py +0 -0
  162. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/ncaab/sportsreference/ncaab_sportsreference_league_model_test.py +0 -0
  163. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nfl/__init__.py +0 -0
  164. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nfl/sportsdb/__init__.py +0 -0
  165. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/nfl/sportsdb/nfl_sportsdb_league_model_test.py +0 -0
  166. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/player_model_test.py +0 -0
  167. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/social_model_test.py +0 -0
  168. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/sportsdb/__init__.py +0 -0
  169. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/sportsdb/sportsdb_game_model_test.py +0 -0
  170. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/sportsdb/sportsdb_league_model_test.py +0 -0
  171. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/sportsdb/sportsdb_team_model_test.py +0 -0
  172. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/sportsdb/sportsdb_venue_model_test.py +0 -0
  173. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/sportsreference/__init__.py +0 -0
  174. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/sportsreference/sportsreference_game_model_test.py +0 -0
  175. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/sportsreference/sportsreference_league_model_test.py +0 -0
  176. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/sportsreference/sportsreference_player_model_test.py +0 -0
  177. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/sportsreference/sportsreference_team_model_test.py +0 -0
  178. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/sportsreference/sportsreference_venue_model_test.py +0 -0
  179. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/team_model_test.py +0 -0
  180. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/x/__init__.py +0 -0
  181. {sportsball-0.3.16 → sportsball-0.3.17}/tests/data/x/x_social_model_test.py +0 -0
  182. {sportsball-0.3.16 → sportsball-0.3.17}/tests/proxy_session_test.py +0 -0
  183. {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.16
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 for 1 year.
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 for 1 year.
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.16',
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',
@@ -1,3 +1,3 @@
1
1
  """The main module for sportsball."""
2
2
 
3
- __VERSION__ = "0.3.16"
3
+ __VERSION__ = "0.3.17"
@@ -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
- response = self.session.get(season_url)
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
@@ -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
- @MEMORY.cache(ignore=["session"])
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
- response = self.session.get(self._spreadsheet_url)
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
@@ -1,5 +1,6 @@
1
1
  """Combined league model."""
2
2
 
3
+ # pylint: disable=raise-missing-from
3
4
  import logging
4
5
  import multiprocessing
5
6
  from multiprocessing import Pool
@@ -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
- @MEMORY.cache(ignore=["session"])
18
- def create_gribstream_weather_model(
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 requests
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: requests.Session,
16
+ session: requests_cache.CachedSession,
17
17
  latitude: float,
18
18
  longitude: float,
19
19
  dt: datetime.datetime,
@@ -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
- @MEMORY.cache(ignore=["session"])
58
- def create_openmeteo_weather_model(
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=datetime.timedelta(days=365),
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.16
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 for 1 year.
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