sportsball 0.3.59__tar.gz → 0.3.61__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 (219) hide show
  1. {sportsball-0.3.59/sportsball.egg-info → sportsball-0.3.61}/PKG-INFO +1 -1
  2. {sportsball-0.3.59 → sportsball-0.3.61}/setup.py +1 -1
  3. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/__init__.py +1 -1
  4. sportsball-0.3.61/sportsball/data/afl/afl/afl_afl_league_model.py +137 -0
  5. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/google/google_address_model.py +49 -9
  6. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/sportsreference/sportsreference_game_model.py +25 -19
  7. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/sportsreference/sportsreference_team_model.py +14 -0
  8. {sportsball-0.3.59 → sportsball-0.3.61/sportsball.egg-info}/PKG-INFO +1 -1
  9. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball.egg-info/SOURCES.txt +2 -0
  10. sportsball-0.3.61/tests/data/afl/afl/afl_afl_league_model_test.py +37 -0
  11. sportsball-0.3.61/tests/data/x/__init__.py +0 -0
  12. sportsball-0.3.59/sportsball/data/afl/afl/afl_afl_league_model.py +0 -132
  13. {sportsball-0.3.59 → sportsball-0.3.61}/LICENSE +0 -0
  14. {sportsball-0.3.59 → sportsball-0.3.61}/MANIFEST.in +0 -0
  15. {sportsball-0.3.59 → sportsball-0.3.61}/README.md +0 -0
  16. {sportsball-0.3.59 → sportsball-0.3.61}/requirements.txt +0 -0
  17. {sportsball-0.3.59 → sportsball-0.3.61}/setup.cfg +0 -0
  18. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/__main__.py +0 -0
  19. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/args.py +0 -0
  20. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/cache.py +0 -0
  21. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/__init__.py +0 -0
  22. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/address_model.py +0 -0
  23. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/afl/__init__.py +0 -0
  24. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/afl/afl/__init__.py +0 -0
  25. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/afl/afl/afl_afl_game_model.py +0 -0
  26. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/afl/afl/afl_afl_player_model.py +0 -0
  27. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/afl/afl/afl_afl_team_model.py +0 -0
  28. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/afl/afl/afl_afl_venue_model.py +0 -0
  29. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/afl/afltables/__init__.py +0 -0
  30. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/afl/afltables/afl_afltables_game_model.py +0 -0
  31. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/afl/afltables/afl_afltables_league_model.py +0 -0
  32. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/afl/afltables/afl_afltables_player_model.py +0 -0
  33. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/afl/afltables/afl_afltables_team_model.py +0 -0
  34. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/afl/afltables/afl_afltables_venue_model.py +0 -0
  35. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/afl/aussportsbetting/__init__.py +0 -0
  36. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/afl/aussportsbetting/afl_aussportsbetting_league_model.py +0 -0
  37. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/afl/combined/__init__.py +0 -0
  38. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/afl/combined/afl_combined_league_model.py +0 -0
  39. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/afl/espn/__init__.py +0 -0
  40. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/afl/espn/afl_espn_league_model.py +0 -0
  41. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/afl/oddsportal/__init__.py +0 -0
  42. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/afl/oddsportal/afl_oddsportal_league_model.py +0 -0
  43. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/aussportsbetting/__init__.py +0 -0
  44. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/aussportsbetting/aussportsbetting_bookie_model.py +0 -0
  45. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/aussportsbetting/aussportsbetting_game_model.py +0 -0
  46. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/aussportsbetting/aussportsbetting_league_model.py +0 -0
  47. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/aussportsbetting/aussportsbetting_odds_model.py +0 -0
  48. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/aussportsbetting/aussportsbetting_team_model.py +0 -0
  49. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/aussportsbetting/aussportsbetting_venue_model.py +0 -0
  50. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/bookie_model.py +0 -0
  51. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/combined/__init__.py +0 -0
  52. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/combined/combined_address_model.py +0 -0
  53. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/combined/combined_game_model.py +0 -0
  54. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/combined/combined_league_model.py +0 -0
  55. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/combined/combined_player_model.py +0 -0
  56. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/combined/combined_team_model.py +0 -0
  57. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/combined/combined_venue_model.py +0 -0
  58. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/combined/combined_weather_model.py +0 -0
  59. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/espn/__init__.py +0 -0
  60. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/espn/espn_bookie_model.py +0 -0
  61. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/espn/espn_game_model.py +0 -0
  62. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/espn/espn_league_model.py +0 -0
  63. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/espn/espn_odds_model.py +0 -0
  64. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/espn/espn_player_model.py +0 -0
  65. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/espn/espn_team_model.py +0 -0
  66. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/espn/espn_venue_model.py +0 -0
  67. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/field_type.py +0 -0
  68. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/game_model.py +0 -0
  69. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/google/__init__.py +0 -0
  70. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/google/google_news_model.py +0 -0
  71. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/league.py +0 -0
  72. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/league_model.py +0 -0
  73. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/model.py +0 -0
  74. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nba/__init__.py +0 -0
  75. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nba/combined/__init__.py +0 -0
  76. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nba/combined/nba_combined_league_model.py +0 -0
  77. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nba/espn/__init__.py +0 -0
  78. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nba/espn/nba_espn_league_model.py +0 -0
  79. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nba/nba/__init__.py +0 -0
  80. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nba/nba/nba_nba_game_model.py +0 -0
  81. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nba/nba/nba_nba_league_model.py +0 -0
  82. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nba/nba/nba_nba_team_model.py +0 -0
  83. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nba/oddsportal/__init__.py +0 -0
  84. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nba/oddsportal/nba_oddsportal_league_model.py +0 -0
  85. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nba/sportsdb/__init__.py +0 -0
  86. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nba/sportsdb/nba_sportsdb_league_model.py +0 -0
  87. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nba/sportsreference/__init__.py +0 -0
  88. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nba/sportsreference/nba_sportsreference_league_model.py +0 -0
  89. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/ncaab/__init__.py +0 -0
  90. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/ncaab/combined/__init__.py +0 -0
  91. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/ncaab/combined/ncaab_combined_league_model.py +0 -0
  92. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/ncaab/espn/__init__.py +0 -0
  93. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/ncaab/espn/ncaab_espn_league_model.py +0 -0
  94. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/ncaab/oddsportal/__init__.py +0 -0
  95. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/ncaab/oddsportal/ncaab_oddsportal_league_model.py +0 -0
  96. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/ncaab/sportsreference/__init__.py +0 -0
  97. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/ncaab/sportsreference/ncaab_sportsreference_league_model.py +0 -0
  98. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/ncaaf/__init__.py +0 -0
  99. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/ncaaf/combined/__init__.py +0 -0
  100. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/ncaaf/combined/ncaaf_combined_league_model.py +0 -0
  101. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/ncaaf/espn/__init__.py +0 -0
  102. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/ncaaf/espn/ncaaf_espn_league_model.py +0 -0
  103. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/ncaaf/oddsportal/__init__.py +0 -0
  104. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/ncaaf/oddsportal/ncaaf_oddsportal_league_model.py +0 -0
  105. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/news_model.py +0 -0
  106. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nfl/__init__.py +0 -0
  107. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nfl/aussportsbetting/__init__.py +0 -0
  108. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nfl/aussportsbetting/nfl_aussportsbetting_league_model.py +0 -0
  109. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nfl/combined/__init__.py +0 -0
  110. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nfl/combined/nfl_combined_league_model.py +0 -0
  111. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nfl/espn/__init__.py +0 -0
  112. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nfl/espn/nfl_espn_league_model.py +0 -0
  113. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nfl/oddsportal/__init__.py +0 -0
  114. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nfl/oddsportal/nfl_oddsportal_league_model.py +0 -0
  115. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nfl/sportsdb/__init__.py +0 -0
  116. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/nfl/sportsdb/nfl_sportsdb_league_model.py +0 -0
  117. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/odds_model.py +0 -0
  118. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/oddsportal/__init__.py +0 -0
  119. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/oddsportal/decrypt.py +0 -0
  120. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/oddsportal/oddsportal_bookie_model.py +0 -0
  121. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/oddsportal/oddsportal_game_model.py +0 -0
  122. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/oddsportal/oddsportal_league_model.py +0 -0
  123. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/oddsportal/oddsportal_odds_model.py +0 -0
  124. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/oddsportal/oddsportal_team_model.py +0 -0
  125. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/oddsportal/oddsportal_venue_model.py +0 -0
  126. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/player_model.py +0 -0
  127. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/season_type.py +0 -0
  128. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/social_model.py +0 -0
  129. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/sportsdb/__init__.py +0 -0
  130. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/sportsdb/sportsdb_game_model.py +0 -0
  131. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/sportsdb/sportsdb_league_model.py +0 -0
  132. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/sportsdb/sportsdb_team_model.py +0 -0
  133. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/sportsdb/sportsdb_venue_model.py +0 -0
  134. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/sportsreference/__init__.py +0 -0
  135. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/sportsreference/sportsreference_league_model.py +0 -0
  136. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/sportsreference/sportsreference_player_model.py +0 -0
  137. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/sportsreference/sportsreference_venue_model.py +0 -0
  138. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/team_model.py +0 -0
  139. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/venue_model.py +0 -0
  140. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/weather/__init__.py +0 -0
  141. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/weather/gribstream/__init__.py +0 -0
  142. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/weather/gribstream/gribstream_weather_model.py +0 -0
  143. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/weather/multi_weather_model.py +0 -0
  144. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/weather/openmeteo/__init__.py +0 -0
  145. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/weather/openmeteo/openmeteo_weather_model.py +0 -0
  146. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/weather_model.py +0 -0
  147. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/wikipedia/__init__.py +0 -0
  148. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/wikipedia/wikipedia_venue_model.py +0 -0
  149. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/x/__init__.py +0 -0
  150. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/data/x/x_social_model.py +0 -0
  151. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/logger.py +0 -0
  152. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/loglevel.py +0 -0
  153. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/playwright.py +0 -0
  154. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/proxy_session.py +0 -0
  155. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/session.py +0 -0
  156. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/sportsball.py +0 -0
  157. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/vendor/__init__.py +0 -0
  158. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball/vendor/pygooglenews/__init__.py +0 -0
  159. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball.egg-info/dependency_links.txt +0 -0
  160. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball.egg-info/entry_points.txt +0 -0
  161. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball.egg-info/not-zip-safe +0 -0
  162. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball.egg-info/requires.txt +0 -0
  163. {sportsball-0.3.59 → sportsball-0.3.61}/sportsball.egg-info/top_level.txt +0 -0
  164. {sportsball-0.3.59 → sportsball-0.3.61}/tests/__init__.py +0 -0
  165. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/__init__.py +0 -0
  166. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/afl/__init__.py +0 -0
  167. {sportsball-0.3.59/tests/data/afl/afltables → sportsball-0.3.61/tests/data/afl/afl}/__init__.py +0 -0
  168. {sportsball-0.3.59/tests/data/aussportsbetting → sportsball-0.3.61/tests/data/afl/afltables}/__init__.py +0 -0
  169. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/afl/afltables/afl_afltables_game_model_test.py +0 -0
  170. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/afl/afltables/afl_afltables_league_model_test.py +0 -0
  171. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/afl/afltables/afl_afltables_player_model_test.py +0 -0
  172. {sportsball-0.3.59/tests/data/combined → sportsball-0.3.61/tests/data/aussportsbetting}/__init__.py +0 -0
  173. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/aussportsbetting/aussportsbetting_game_model_test.py +0 -0
  174. {sportsball-0.3.59/tests/data/espn → sportsball-0.3.61/tests/data/combined}/__init__.py +0 -0
  175. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/combined/combined_game_model_test.py +0 -0
  176. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/combined/combined_player_model_test.py +0 -0
  177. {sportsball-0.3.59/tests/data/google → sportsball-0.3.61/tests/data/espn}/__init__.py +0 -0
  178. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/espn/espn_game_model_test.py +0 -0
  179. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/espn/espn_player_model_test.py +0 -0
  180. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/game_model_test.py +0 -0
  181. {sportsball-0.3.59/tests/data/nba → sportsball-0.3.61/tests/data/google}/__init__.py +0 -0
  182. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/google/google_address_model_test.py +0 -0
  183. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/google/google_news_model_test.py +0 -0
  184. {sportsball-0.3.59/tests/data/nba → sportsball-0.3.61/tests/data}/nba/__init__.py +0 -0
  185. {sportsball-0.3.59/tests/data/nba/sportsdb → sportsball-0.3.61/tests/data/nba/nba}/__init__.py +0 -0
  186. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/nba/nba/nba_nba_game_model_test.py +0 -0
  187. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/nba/nba/nba_nba_league_model_test.py +0 -0
  188. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/nba/nba/nba_nba_team_model_test.py +0 -0
  189. {sportsball-0.3.59/tests/data/nba/sportsreference → sportsball-0.3.61/tests/data/nba/sportsdb}/__init__.py +0 -0
  190. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/nba/sportsdb/nba_sportsdb_league_model_test.py +0 -0
  191. {sportsball-0.3.59/tests/data/ncaab → sportsball-0.3.61/tests/data/nba/sportsreference}/__init__.py +0 -0
  192. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/nba/sportsreference/nba_sportsreference_league_model_test.py +0 -0
  193. {sportsball-0.3.59/tests/data/ncaab/sportsreference → sportsball-0.3.61/tests/data/ncaab}/__init__.py +0 -0
  194. {sportsball-0.3.59/tests/data/nfl → sportsball-0.3.61/tests/data/ncaab/sportsreference}/__init__.py +0 -0
  195. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/ncaab/sportsreference/ncaab_sportsreference_league_model_test.py +0 -0
  196. {sportsball-0.3.59/tests/data/nfl/sportsdb → sportsball-0.3.61/tests/data/nfl}/__init__.py +0 -0
  197. {sportsball-0.3.59/tests/data/oddsportal → sportsball-0.3.61/tests/data/nfl/sportsdb}/__init__.py +0 -0
  198. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/nfl/sportsdb/nfl_sportsdb_league_model_test.py +0 -0
  199. {sportsball-0.3.59/tests/data/sportsdb → sportsball-0.3.61/tests/data/oddsportal}/__init__.py +0 -0
  200. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/oddsportal/decrypt_test.py +0 -0
  201. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/oddsportal/oddsportal_game_model_test.py +0 -0
  202. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/oddsportal/oddsportal_league_model_test.py +0 -0
  203. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/player_model_test.py +0 -0
  204. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/social_model_test.py +0 -0
  205. {sportsball-0.3.59/tests/data/sportsreference → sportsball-0.3.61/tests/data/sportsdb}/__init__.py +0 -0
  206. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/sportsdb/sportsdb_game_model_test.py +0 -0
  207. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/sportsdb/sportsdb_league_model_test.py +0 -0
  208. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/sportsdb/sportsdb_team_model_test.py +0 -0
  209. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/sportsdb/sportsdb_venue_model_test.py +0 -0
  210. {sportsball-0.3.59/tests/data/x → sportsball-0.3.61/tests/data/sportsreference}/__init__.py +0 -0
  211. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/sportsreference/sportsreference_game_model_test.py +0 -0
  212. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/sportsreference/sportsreference_league_model_test.py +0 -0
  213. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/sportsreference/sportsreference_player_model_test.py +0 -0
  214. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/sportsreference/sportsreference_team_model_test.py +0 -0
  215. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/sportsreference/sportsreference_venue_model_test.py +0 -0
  216. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/team_model_test.py +0 -0
  217. {sportsball-0.3.59 → sportsball-0.3.61}/tests/data/x/x_social_model_test.py +0 -0
  218. {sportsball-0.3.59 → sportsball-0.3.61}/tests/proxy_session_test.py +0 -0
  219. {sportsball-0.3.59 → sportsball-0.3.61}/tests/sportsball_test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: sportsball
3
- Version: 0.3.59
3
+ Version: 0.3.61
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
@@ -26,7 +26,7 @@ def install_requires() -> typing.List[str]:
26
26
 
27
27
  setup(
28
28
  name='sportsball',
29
- version='0.3.59',
29
+ version='0.3.61',
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',
@@ -4,4 +4,4 @@
4
4
  import cchardet # type: ignore
5
5
  import lxml # noqa: ignore
6
6
 
7
- __VERSION__ = "0.3.59"
7
+ __VERSION__ = "0.3.61"
@@ -0,0 +1,137 @@
1
+ """AFL AFL league model."""
2
+
3
+ # pylint: disable=too-many-statements,protected-access,too-many-locals,bare-except,too-many-branches
4
+ import datetime
5
+ import logging
6
+ import re
7
+ from typing import Iterator
8
+
9
+ import requests_cache
10
+ from bs4 import BeautifulSoup
11
+ from playwright.sync_api import sync_playwright
12
+
13
+ from ....playwright import ensure_install
14
+ from ...game_model import GameModel
15
+ from ...league import League
16
+ from ...league_model import LeagueModel
17
+ from .afl_afl_game_model import create_afl_afl_game_model
18
+
19
+
20
+ def _parse_game_info(
21
+ html: str, session: requests_cache.CachedSession, ladder: list[str]
22
+ ) -> Iterator[GameModel]:
23
+ soup = BeautifulSoup(html, "lxml")
24
+ for div in soup.find_all("div", {"class": re.compile(".*js-match-list-item.*")}):
25
+ team_names = []
26
+ for span in div.find_all(
27
+ "span", {"class": re.compile(".*team-lineups__team-name.*")}
28
+ ):
29
+ team_names.append(span.get_text().strip())
30
+ teams_players: list[list[tuple[str, str, str, str]]] = [[], []]
31
+ for div_positions_row in div.find_all(
32
+ "div", {"class": re.compile(".*team-lineups__positions-row.*")}
33
+ ):
34
+ row_players: list[list[tuple[str, str, str, str]]] = []
35
+ for div_team_players in div_positions_row.find_all(
36
+ "div",
37
+ {"class": re.compile(".*team-lineups__positions-players.*")},
38
+ ):
39
+ team_players: list[tuple[str, str, str, str]] = []
40
+ for a in div_team_players.find_all(
41
+ "a", {"class": re.compile(".*js-player-profile-link.*")}
42
+ ):
43
+ player_id = "afl:" + a.get("data-player-id")
44
+ first_name = a.get("data-first-name")
45
+ second_name = a.get("data-surname")
46
+ player_number = None
47
+ for span_player_number in a.find_all(
48
+ "span",
49
+ {"class": re.compile(".*team-lineups__player-number.*")},
50
+ ):
51
+ player_number = (
52
+ span_player_number.get_text()
53
+ .strip()
54
+ .replace("[", "")
55
+ .replace("]", "")
56
+ )
57
+ if player_number is None:
58
+ raise ValueError("player_number is null")
59
+ team_players.append(
60
+ (player_id, player_number, first_name, second_name)
61
+ )
62
+ row_players.append(team_players)
63
+ if len(row_players) >= 2:
64
+ break
65
+ for count, row_players_list in enumerate(row_players):
66
+ try:
67
+ teams_players[count].extend(row_players_list)
68
+ except IndexError as exc:
69
+ # logging.error(html)
70
+ logging.error(len(team_players))
71
+ logging.error(count)
72
+ raise exc
73
+ dt = None
74
+ for time in div.find_all(
75
+ "time", {"class": re.compile(".*match-list-alt__header-time.*")}
76
+ ):
77
+ dt = datetime.datetime.fromtimestamp(float(time.get("data-date")) / 1000.0)
78
+ venue_name: str | None = None
79
+ for span in div.find_all(
80
+ "span", {"class": re.compile(".*match-list-alt__header-venue.*")}
81
+ ):
82
+ venue_name = span.get_text().strip().replace(",", "")
83
+ if venue_name is None:
84
+ raise ValueError("venue_name is null")
85
+ if dt is None:
86
+ raise ValueError("dt is null")
87
+ yield create_afl_afl_game_model(
88
+ team_names, teams_players, dt, venue_name, session, ladder
89
+ )
90
+
91
+
92
+ class AFLAFLLeagueModel(LeagueModel):
93
+ """AFL AFL implementation of the league model."""
94
+
95
+ def __init__(
96
+ self, session: requests_cache.CachedSession, position: int | None = None
97
+ ) -> None:
98
+ super().__init__(League.AFL, session)
99
+
100
+ @property
101
+ def _ladder(self) -> list[str]:
102
+ ladder = []
103
+ ensure_install()
104
+ with sync_playwright() as p:
105
+ browser = p.chromium.launch()
106
+ context = browser.new_context()
107
+ page = context.new_page()
108
+ try:
109
+ page.goto(
110
+ "https://www.afl.com.au/ladder",
111
+ wait_until="networkidle",
112
+ timeout=60000.0,
113
+ )
114
+ except: # noqa: E722
115
+ logging.warning("Ladder URL timed out.")
116
+ soup = BeautifulSoup(page.content(), "lxml")
117
+ for span in soup.find_all(
118
+ "span", {"class": re.compile(".*stats-table__club-name.*")}
119
+ ):
120
+ team_name = span.get_text().strip()
121
+ if team_name in ladder:
122
+ continue
123
+ ladder.append(team_name)
124
+ return ladder
125
+
126
+ @property
127
+ def games(self) -> Iterator[GameModel]:
128
+ ladder = self._ladder
129
+ ensure_install()
130
+ with sync_playwright() as p:
131
+ browser = p.chromium.launch()
132
+ context = browser.new_context()
133
+ page = context.new_page()
134
+ page.goto(
135
+ "https://www.afl.com.au/matches/team-lineups", wait_until="networkidle"
136
+ )
137
+ yield from _parse_game_info(page.content(), self.session, ladder)
@@ -2287,6 +2287,15 @@ NEW_ORLEANS_CITY = SportsballGeocodeTuple(
2287
2287
  housenumber="",
2288
2288
  country="USA",
2289
2289
  )
2290
+ PETCO_PARK = SportsballGeocodeTuple(
2291
+ city="San Diego",
2292
+ state="CA",
2293
+ postal="92101",
2294
+ lat=32.7073,
2295
+ lng=-117.1566,
2296
+ housenumber="100",
2297
+ country="USA",
2298
+ )
2290
2299
  _CACHED_GEOCODES: dict[str, Any] = {
2291
2300
  "S.C.G. - Australia": SCG,
2292
2301
  "Victoria Park - Australia": SportsballGeocodeTuple(
@@ -4035,15 +4044,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
4035
4044
  ),
4036
4045
  "Riccardo Silva Stadium - Miami - FL - 33199": PITBULL_STADIUM,
4037
4046
  "Ryan Field - Evanston - IL - 60208": LANNY_AND_SHARON_MARTIN_STADIUM,
4038
- "Petco Park - San Diego - CA - 92101": SportsballGeocodeTuple(
4039
- city="San Diego",
4040
- state="CA",
4041
- postal="92101",
4042
- lat=32.7073,
4043
- lng=-117.1566,
4044
- housenumber="100",
4045
- country="USA",
4046
- ),
4047
+ "Petco Park - San Diego - CA - 92101": PETCO_PARK,
4047
4048
  "Providence Park - Portland - OR - 97205": SportsballGeocodeTuple(
4048
4049
  city="Portland",
4049
4050
  state="OR",
@@ -12709,6 +12710,45 @@ _CACHED_GEOCODES: dict[str, Any] = {
12709
12710
  country="USA",
12710
12711
  ),
12711
12712
  "New Orleans , Louisiana": NEW_ORLEANS_CITY,
12713
+ "First Bank & Trust Arena, Brookings, South Dakota": SportsballGeocodeTuple(
12714
+ city="Brookings",
12715
+ state="SD",
12716
+ postal="57007",
12717
+ lat=44.317984,
12718
+ lng=-96.779058,
12719
+ housenumber="1165",
12720
+ country="USA",
12721
+ ),
12722
+ "Cambria County War Memorial Arena, Johnstown, Pennsylvania": SportsballGeocodeTuple(
12723
+ city="Johnstown",
12724
+ state="PA",
12725
+ postal="15901",
12726
+ lat=40.32296,
12727
+ lng=-78.922654,
12728
+ housenumber="326",
12729
+ country="USA",
12730
+ ),
12731
+ "Petco Park, San Diego, California": PETCO_PARK,
12732
+ "Esby Gym, Glassboro, New Jersey": SportsballGeocodeTuple(
12733
+ city="Glassboro",
12734
+ state="NJ",
12735
+ postal="08028",
12736
+ lat=39.7106001,
12737
+ lng=-75.1186627,
12738
+ housenumber="300",
12739
+ country="USA",
12740
+ ),
12741
+ "Boone, North Carolina": SportsballGeocodeTuple(
12742
+ city="Boone",
12743
+ state="NC",
12744
+ postal="",
12745
+ lat=36.211111,
12746
+ lng=-81.666944,
12747
+ housenumber="",
12748
+ country="USA",
12749
+ ),
12750
+ "FedExForum - Memphis, Tennessee - United States": FEDEX_FORUM,
12751
+ "Kia Center, Orlando, FL, EUA": KIA_CENTER,
12712
12752
  }
12713
12753
 
12714
12754
 
@@ -179,27 +179,33 @@ def _find_old_dt(
179
179
  test_row = df.iat[0, 0]
180
180
  test_row_2 = df.iat[1, 0]
181
181
 
182
- if (
183
- "Prev Game" in test_row
184
- or "Next Game" in test_row
185
- or "Lost" in test_row
186
- or "PM," in test_row_2
187
- ):
188
- date_venue_split = df.iat[1, 0].split()
189
- current_idx = 5
190
- try:
191
- dt = parse(" ".join(date_venue_split[:current_idx]))
192
- except dateutil.parser._parser.ParserError: # type: ignore
182
+ try:
183
+ if (
184
+ "Prev Game" in test_row
185
+ or "Next Game" in test_row
186
+ or "Lost" in test_row
187
+ or "PM," in test_row_2
188
+ ):
189
+ date_venue_split = df.iat[1, 0].split()
190
+ current_idx = 5
193
191
  try:
194
- current_idx = 3
195
192
  dt = parse(" ".join(date_venue_split[:current_idx]))
196
193
  except dateutil.parser._parser.ParserError: # type: ignore
197
- dt = parse(
198
- " ".join(",".join(test_row.split(",")[1:]).split()[:3])
199
- )
200
- venue_name = " ".join(date_venue_split[current_idx:])
201
- _process_team_row(df)
202
- break
194
+ try:
195
+ current_idx = 3
196
+ dt = parse(" ".join(date_venue_split[:current_idx]))
197
+ except dateutil.parser._parser.ParserError: # type: ignore
198
+ dt = parse(
199
+ " ".join(",".join(test_row.split(",")[1:]).split()[:3])
200
+ )
201
+ venue_name = " ".join(date_venue_split[current_idx:])
202
+ _process_team_row(df)
203
+ break
204
+ except TypeError as exc:
205
+ logging.error(test_row)
206
+ logging.error(response.url)
207
+ logging.error(response.text)
208
+ raise exc
203
209
 
204
210
  if dt is None:
205
211
  title_tag = soup.find("title")
@@ -305,7 +311,7 @@ def _create_sportsreference_game_model(
305
311
 
306
312
  # If the page_title is bad, try fetching from a non wayback source
307
313
  if page_title is not None:
308
- if page_title.get_text().strip() == "File Not Found":
314
+ if "File Not Found" in page_title.get_text().strip():
309
315
  session.cache.delete(urls=[url])
310
316
  response = session.get(url, headers={X_NO_WAYBACK: "1"})
311
317
  response.raise_for_status()
@@ -90,6 +90,20 @@ def _create_sportsreference_team_model(
90
90
  assists: dict[str, int],
91
91
  turnovers: dict[str, int],
92
92
  ) -> TeamModel:
93
+ if url == "https://www.sports-reference.com/cbb/schools/alaska-anchorage/2016.html":
94
+ name = "Alaska-Anchorage"
95
+ return TeamModel(
96
+ identifier=name,
97
+ name=name,
98
+ location="Alaska",
99
+ players=[],
100
+ odds=[],
101
+ points=points,
102
+ ladder_rank=None,
103
+ news=create_google_news_models(name, session, dt, league),
104
+ social=create_x_social_model(name, session, dt),
105
+ )
106
+
93
107
  headers = {}
94
108
  if url in _NON_WAYBACK_URLS:
95
109
  headers = {X_NO_WAYBACK: "1"}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: sportsball
3
- Version: 0.3.59
3
+ Version: 0.3.61
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
@@ -165,6 +165,8 @@ tests/data/player_model_test.py
165
165
  tests/data/social_model_test.py
166
166
  tests/data/team_model_test.py
167
167
  tests/data/afl/__init__.py
168
+ tests/data/afl/afl/__init__.py
169
+ tests/data/afl/afl/afl_afl_league_model_test.py
168
170
  tests/data/afl/afltables/__init__.py
169
171
  tests/data/afl/afltables/afl_afltables_game_model_test.py
170
172
  tests/data/afl/afltables/afl_afltables_league_model_test.py
@@ -0,0 +1,37 @@
1
+ """Tests for the afl AFL league model class."""
2
+ import unittest
3
+ import os
4
+ import datetime
5
+
6
+ import requests_cache
7
+ from sportsball.data.afl.afl.afl_afl_league_model import _parse_game_info
8
+
9
+
10
+ class TestAFLAFLLeagueModel(unittest.TestCase):
11
+
12
+ def setUp(self):
13
+ self.dir = os.path.dirname(__file__)
14
+ self._session = requests_cache.CachedSession(backend="memory")
15
+
16
+ def test_parse_game_info(self):
17
+ with open(os.path.join(self.dir, "team-lineups.html")) as handle:
18
+ list(_parse_game_info(handle.read(), self._session, [
19
+ "Melbourne",
20
+ "Richmond",
21
+ "Collingwood",
22
+ "Essendon",
23
+ "Fremantle",
24
+ "Adelaide Crows",
25
+ "St Kilda",
26
+ "Brisbane Lions",
27
+ "Port Adelaide",
28
+ "North Melbourne",
29
+ "GWS GIANTS",
30
+ "Western Bulldogs",
31
+ "Gold Coast SUNS",
32
+ "Sydney Swans",
33
+ "Carlton",
34
+ "Geelong Cats",
35
+ "Hawthorn",
36
+ "West Coast Eagles",
37
+ ]))
File without changes
@@ -1,132 +0,0 @@
1
- """AFL AFL league model."""
2
-
3
- # pylint: disable=too-many-statements,protected-access,too-many-locals,bare-except
4
- import datetime
5
- import logging
6
- import re
7
- from typing import Iterator
8
-
9
- import requests_cache
10
- from bs4 import BeautifulSoup
11
- from playwright.sync_api import sync_playwright
12
-
13
- from ....playwright import ensure_install
14
- from ...game_model import GameModel
15
- from ...league import League
16
- from ...league_model import LeagueModel
17
- from .afl_afl_game_model import create_afl_afl_game_model
18
-
19
-
20
- class AFLAFLLeagueModel(LeagueModel):
21
- """AFL AFL implementation of the league model."""
22
-
23
- def __init__(
24
- self, session: requests_cache.CachedSession, position: int | None = None
25
- ) -> None:
26
- super().__init__(League.AFL, session)
27
-
28
- @property
29
- def _ladder(self) -> list[str]:
30
- ladder = []
31
- ensure_install()
32
- with sync_playwright() as p:
33
- browser = p.chromium.launch()
34
- context = browser.new_context()
35
- page = context.new_page()
36
- try:
37
- page.goto(
38
- "https://www.afl.com.au/ladder",
39
- wait_until="networkidle",
40
- timeout=60000.0,
41
- )
42
- except: # noqa: E722
43
- logging.warning("Ladder URL timed out.")
44
- soup = BeautifulSoup(page.content(), "lxml")
45
- for span in soup.find_all(
46
- "span", {"class": re.compile(".*stats-table__club-name.*")}
47
- ):
48
- team_name = span.get_text().strip()
49
- if team_name in ladder:
50
- continue
51
- ladder.append(team_name)
52
- return ladder
53
-
54
- @property
55
- def games(self) -> Iterator[GameModel]:
56
- # https://www.afl.com.au/matches/team-lineups
57
- ladder = self._ladder
58
- ensure_install()
59
- with sync_playwright() as p:
60
- browser = p.chromium.launch()
61
- context = browser.new_context()
62
- page = context.new_page()
63
- page.goto(
64
- "https://www.afl.com.au/matches/team-lineups", wait_until="networkidle"
65
- )
66
- soup = BeautifulSoup(page.content(), "lxml")
67
- for div in soup.find_all(
68
- "div", {"class": re.compile(".*js-match-list-item.*")}
69
- ):
70
- team_names = []
71
- for span in div.find_all(
72
- "span", {"class": re.compile(".*team-lineups__team-name.*")}
73
- ):
74
- team_names.append(span.get_text().strip())
75
- teams_players: list[list[tuple[str, str, str, str]]] = [[], []]
76
- for div_positions_row in div.find_all(
77
- "div", {"class": re.compile(".*team-lineups__positions-row.*")}
78
- ):
79
- row_players: list[list[tuple[str, str, str, str]]] = []
80
- for div_team_players in div_positions_row.find_all(
81
- "div",
82
- {"class": re.compile(".*team-lineups__positions-players.*")},
83
- ):
84
- team_players: list[tuple[str, str, str, str]] = []
85
- for a in div_team_players.find_all(
86
- "a", {"class": re.compile(".*js-player-profile-link.*")}
87
- ):
88
- player_id = "afl:" + a.get("data-player-id")
89
- first_name = a.get("data-first-name")
90
- second_name = a.get("data-surname")
91
- player_number = None
92
- for span_player_number in a.find_all(
93
- "span",
94
- {
95
- "class": re.compile(
96
- ".*team-lineups__player-number.*"
97
- )
98
- },
99
- ):
100
- player_number = (
101
- span_player_number.get_text()
102
- .strip()
103
- .replace("[", "")
104
- .replace("]", "")
105
- )
106
- if player_number is None:
107
- raise ValueError("player_number is null")
108
- team_players.append(
109
- (player_id, player_number, first_name, second_name)
110
- )
111
- row_players.append(team_players)
112
- for count, row_players_list in enumerate(row_players):
113
- teams_players[count].extend(row_players_list)
114
- dt = None
115
- for time in div.find_all(
116
- "time", {"class": re.compile(".*match-list-alt__header-time.*")}
117
- ):
118
- dt = datetime.datetime.fromtimestamp(
119
- float(time.get("data-date")) / 1000.0
120
- )
121
- venue_name: str | None = None
122
- for span in div.find_all(
123
- "span", {"class": re.compile(".*match-list-alt__header-venue.*")}
124
- ):
125
- venue_name = span.get_text().strip().replace(",", "")
126
- if venue_name is None:
127
- raise ValueError("venue_name is null")
128
- if dt is None:
129
- raise ValueError("dt is null")
130
- yield create_afl_afl_game_model(
131
- team_names, teams_players, dt, venue_name, self.session, ladder
132
- )
File without changes
File without changes
File without changes
File without changes