sportsball 0.3.60__tar.gz → 0.3.62__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.60/sportsball.egg-info → sportsball-0.3.62}/PKG-INFO +1 -1
  2. {sportsball-0.3.60 → sportsball-0.3.62}/setup.py +1 -1
  3. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/__init__.py +1 -1
  4. sportsball-0.3.62/sportsball/data/afl/afl/afl_afl_league_model.py +137 -0
  5. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/afl/combined/afl_combined_league_model.py +3 -0
  6. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/google/google_address_model.py +20 -0
  7. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/sportsreference/sportsreference_game_model.py +26 -18
  8. {sportsball-0.3.60 → sportsball-0.3.62/sportsball.egg-info}/PKG-INFO +1 -1
  9. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball.egg-info/SOURCES.txt +2 -0
  10. sportsball-0.3.62/tests/data/afl/afl/afl_afl_league_model_test.py +37 -0
  11. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/sportsreference/sportsreference_game_model_test.py +14 -0
  12. sportsball-0.3.62/tests/data/x/__init__.py +0 -0
  13. sportsball-0.3.60/sportsball/data/afl/afl/afl_afl_league_model.py +0 -132
  14. {sportsball-0.3.60 → sportsball-0.3.62}/LICENSE +0 -0
  15. {sportsball-0.3.60 → sportsball-0.3.62}/MANIFEST.in +0 -0
  16. {sportsball-0.3.60 → sportsball-0.3.62}/README.md +0 -0
  17. {sportsball-0.3.60 → sportsball-0.3.62}/requirements.txt +0 -0
  18. {sportsball-0.3.60 → sportsball-0.3.62}/setup.cfg +0 -0
  19. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/__main__.py +0 -0
  20. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/args.py +0 -0
  21. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/cache.py +0 -0
  22. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/__init__.py +0 -0
  23. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/address_model.py +0 -0
  24. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/afl/__init__.py +0 -0
  25. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/afl/afl/__init__.py +0 -0
  26. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/afl/afl/afl_afl_game_model.py +0 -0
  27. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/afl/afl/afl_afl_player_model.py +0 -0
  28. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/afl/afl/afl_afl_team_model.py +0 -0
  29. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/afl/afl/afl_afl_venue_model.py +0 -0
  30. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/afl/afltables/__init__.py +0 -0
  31. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/afl/afltables/afl_afltables_game_model.py +0 -0
  32. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/afl/afltables/afl_afltables_league_model.py +0 -0
  33. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/afl/afltables/afl_afltables_player_model.py +0 -0
  34. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/afl/afltables/afl_afltables_team_model.py +0 -0
  35. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/afl/afltables/afl_afltables_venue_model.py +0 -0
  36. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/afl/aussportsbetting/__init__.py +0 -0
  37. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/afl/aussportsbetting/afl_aussportsbetting_league_model.py +0 -0
  38. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/afl/combined/__init__.py +0 -0
  39. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/afl/espn/__init__.py +0 -0
  40. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/afl/espn/afl_espn_league_model.py +0 -0
  41. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/afl/oddsportal/__init__.py +0 -0
  42. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/afl/oddsportal/afl_oddsportal_league_model.py +0 -0
  43. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/aussportsbetting/__init__.py +0 -0
  44. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/aussportsbetting/aussportsbetting_bookie_model.py +0 -0
  45. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/aussportsbetting/aussportsbetting_game_model.py +0 -0
  46. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/aussportsbetting/aussportsbetting_league_model.py +0 -0
  47. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/aussportsbetting/aussportsbetting_odds_model.py +0 -0
  48. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/aussportsbetting/aussportsbetting_team_model.py +0 -0
  49. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/aussportsbetting/aussportsbetting_venue_model.py +0 -0
  50. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/bookie_model.py +0 -0
  51. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/combined/__init__.py +0 -0
  52. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/combined/combined_address_model.py +0 -0
  53. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/combined/combined_game_model.py +0 -0
  54. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/combined/combined_league_model.py +0 -0
  55. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/combined/combined_player_model.py +0 -0
  56. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/combined/combined_team_model.py +0 -0
  57. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/combined/combined_venue_model.py +0 -0
  58. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/combined/combined_weather_model.py +0 -0
  59. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/espn/__init__.py +0 -0
  60. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/espn/espn_bookie_model.py +0 -0
  61. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/espn/espn_game_model.py +0 -0
  62. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/espn/espn_league_model.py +0 -0
  63. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/espn/espn_odds_model.py +0 -0
  64. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/espn/espn_player_model.py +0 -0
  65. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/espn/espn_team_model.py +0 -0
  66. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/espn/espn_venue_model.py +0 -0
  67. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/field_type.py +0 -0
  68. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/game_model.py +0 -0
  69. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/google/__init__.py +0 -0
  70. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/google/google_news_model.py +0 -0
  71. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/league.py +0 -0
  72. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/league_model.py +0 -0
  73. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/model.py +0 -0
  74. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nba/__init__.py +0 -0
  75. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nba/combined/__init__.py +0 -0
  76. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nba/combined/nba_combined_league_model.py +0 -0
  77. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nba/espn/__init__.py +0 -0
  78. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nba/espn/nba_espn_league_model.py +0 -0
  79. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nba/nba/__init__.py +0 -0
  80. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nba/nba/nba_nba_game_model.py +0 -0
  81. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nba/nba/nba_nba_league_model.py +0 -0
  82. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nba/nba/nba_nba_team_model.py +0 -0
  83. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nba/oddsportal/__init__.py +0 -0
  84. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nba/oddsportal/nba_oddsportal_league_model.py +0 -0
  85. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nba/sportsdb/__init__.py +0 -0
  86. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nba/sportsdb/nba_sportsdb_league_model.py +0 -0
  87. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nba/sportsreference/__init__.py +0 -0
  88. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nba/sportsreference/nba_sportsreference_league_model.py +0 -0
  89. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/ncaab/__init__.py +0 -0
  90. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/ncaab/combined/__init__.py +0 -0
  91. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/ncaab/combined/ncaab_combined_league_model.py +0 -0
  92. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/ncaab/espn/__init__.py +0 -0
  93. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/ncaab/espn/ncaab_espn_league_model.py +0 -0
  94. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/ncaab/oddsportal/__init__.py +0 -0
  95. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/ncaab/oddsportal/ncaab_oddsportal_league_model.py +0 -0
  96. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/ncaab/sportsreference/__init__.py +0 -0
  97. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/ncaab/sportsreference/ncaab_sportsreference_league_model.py +0 -0
  98. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/ncaaf/__init__.py +0 -0
  99. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/ncaaf/combined/__init__.py +0 -0
  100. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/ncaaf/combined/ncaaf_combined_league_model.py +0 -0
  101. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/ncaaf/espn/__init__.py +0 -0
  102. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/ncaaf/espn/ncaaf_espn_league_model.py +0 -0
  103. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/ncaaf/oddsportal/__init__.py +0 -0
  104. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/ncaaf/oddsportal/ncaaf_oddsportal_league_model.py +0 -0
  105. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/news_model.py +0 -0
  106. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nfl/__init__.py +0 -0
  107. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nfl/aussportsbetting/__init__.py +0 -0
  108. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nfl/aussportsbetting/nfl_aussportsbetting_league_model.py +0 -0
  109. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nfl/combined/__init__.py +0 -0
  110. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nfl/combined/nfl_combined_league_model.py +0 -0
  111. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nfl/espn/__init__.py +0 -0
  112. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nfl/espn/nfl_espn_league_model.py +0 -0
  113. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nfl/oddsportal/__init__.py +0 -0
  114. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nfl/oddsportal/nfl_oddsportal_league_model.py +0 -0
  115. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nfl/sportsdb/__init__.py +0 -0
  116. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/nfl/sportsdb/nfl_sportsdb_league_model.py +0 -0
  117. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/odds_model.py +0 -0
  118. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/oddsportal/__init__.py +0 -0
  119. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/oddsportal/decrypt.py +0 -0
  120. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/oddsportal/oddsportal_bookie_model.py +0 -0
  121. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/oddsportal/oddsportal_game_model.py +0 -0
  122. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/oddsportal/oddsportal_league_model.py +0 -0
  123. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/oddsportal/oddsportal_odds_model.py +0 -0
  124. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/oddsportal/oddsportal_team_model.py +0 -0
  125. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/oddsportal/oddsportal_venue_model.py +0 -0
  126. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/player_model.py +0 -0
  127. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/season_type.py +0 -0
  128. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/social_model.py +0 -0
  129. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/sportsdb/__init__.py +0 -0
  130. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/sportsdb/sportsdb_game_model.py +0 -0
  131. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/sportsdb/sportsdb_league_model.py +0 -0
  132. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/sportsdb/sportsdb_team_model.py +0 -0
  133. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/sportsdb/sportsdb_venue_model.py +0 -0
  134. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/sportsreference/__init__.py +0 -0
  135. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/sportsreference/sportsreference_league_model.py +0 -0
  136. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/sportsreference/sportsreference_player_model.py +0 -0
  137. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/sportsreference/sportsreference_team_model.py +0 -0
  138. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/sportsreference/sportsreference_venue_model.py +0 -0
  139. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/team_model.py +0 -0
  140. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/venue_model.py +0 -0
  141. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/weather/__init__.py +0 -0
  142. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/weather/gribstream/__init__.py +0 -0
  143. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/weather/gribstream/gribstream_weather_model.py +0 -0
  144. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/weather/multi_weather_model.py +0 -0
  145. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/weather/openmeteo/__init__.py +0 -0
  146. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/weather/openmeteo/openmeteo_weather_model.py +0 -0
  147. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/weather_model.py +0 -0
  148. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/wikipedia/__init__.py +0 -0
  149. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/wikipedia/wikipedia_venue_model.py +0 -0
  150. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/x/__init__.py +0 -0
  151. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/data/x/x_social_model.py +0 -0
  152. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/logger.py +0 -0
  153. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/loglevel.py +0 -0
  154. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/playwright.py +0 -0
  155. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/proxy_session.py +0 -0
  156. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/session.py +0 -0
  157. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/sportsball.py +0 -0
  158. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/vendor/__init__.py +0 -0
  159. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball/vendor/pygooglenews/__init__.py +0 -0
  160. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball.egg-info/dependency_links.txt +0 -0
  161. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball.egg-info/entry_points.txt +0 -0
  162. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball.egg-info/not-zip-safe +0 -0
  163. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball.egg-info/requires.txt +0 -0
  164. {sportsball-0.3.60 → sportsball-0.3.62}/sportsball.egg-info/top_level.txt +0 -0
  165. {sportsball-0.3.60 → sportsball-0.3.62}/tests/__init__.py +0 -0
  166. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/__init__.py +0 -0
  167. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/afl/__init__.py +0 -0
  168. {sportsball-0.3.60/tests/data/afl/afltables → sportsball-0.3.62/tests/data/afl/afl}/__init__.py +0 -0
  169. {sportsball-0.3.60/tests/data/aussportsbetting → sportsball-0.3.62/tests/data/afl/afltables}/__init__.py +0 -0
  170. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/afl/afltables/afl_afltables_game_model_test.py +0 -0
  171. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/afl/afltables/afl_afltables_league_model_test.py +0 -0
  172. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/afl/afltables/afl_afltables_player_model_test.py +0 -0
  173. {sportsball-0.3.60/tests/data/combined → sportsball-0.3.62/tests/data/aussportsbetting}/__init__.py +0 -0
  174. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/aussportsbetting/aussportsbetting_game_model_test.py +0 -0
  175. {sportsball-0.3.60/tests/data/espn → sportsball-0.3.62/tests/data/combined}/__init__.py +0 -0
  176. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/combined/combined_game_model_test.py +0 -0
  177. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/combined/combined_player_model_test.py +0 -0
  178. {sportsball-0.3.60/tests/data/google → sportsball-0.3.62/tests/data/espn}/__init__.py +0 -0
  179. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/espn/espn_game_model_test.py +0 -0
  180. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/espn/espn_player_model_test.py +0 -0
  181. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/game_model_test.py +0 -0
  182. {sportsball-0.3.60/tests/data/nba → sportsball-0.3.62/tests/data/google}/__init__.py +0 -0
  183. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/google/google_address_model_test.py +0 -0
  184. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/google/google_news_model_test.py +0 -0
  185. {sportsball-0.3.60/tests/data/nba → sportsball-0.3.62/tests/data}/nba/__init__.py +0 -0
  186. {sportsball-0.3.60/tests/data/nba/sportsdb → sportsball-0.3.62/tests/data/nba/nba}/__init__.py +0 -0
  187. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/nba/nba/nba_nba_game_model_test.py +0 -0
  188. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/nba/nba/nba_nba_league_model_test.py +0 -0
  189. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/nba/nba/nba_nba_team_model_test.py +0 -0
  190. {sportsball-0.3.60/tests/data/nba/sportsreference → sportsball-0.3.62/tests/data/nba/sportsdb}/__init__.py +0 -0
  191. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/nba/sportsdb/nba_sportsdb_league_model_test.py +0 -0
  192. {sportsball-0.3.60/tests/data/ncaab → sportsball-0.3.62/tests/data/nba/sportsreference}/__init__.py +0 -0
  193. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/nba/sportsreference/nba_sportsreference_league_model_test.py +0 -0
  194. {sportsball-0.3.60/tests/data/ncaab/sportsreference → sportsball-0.3.62/tests/data/ncaab}/__init__.py +0 -0
  195. {sportsball-0.3.60/tests/data/nfl → sportsball-0.3.62/tests/data/ncaab/sportsreference}/__init__.py +0 -0
  196. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/ncaab/sportsreference/ncaab_sportsreference_league_model_test.py +0 -0
  197. {sportsball-0.3.60/tests/data/nfl/sportsdb → sportsball-0.3.62/tests/data/nfl}/__init__.py +0 -0
  198. {sportsball-0.3.60/tests/data/oddsportal → sportsball-0.3.62/tests/data/nfl/sportsdb}/__init__.py +0 -0
  199. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/nfl/sportsdb/nfl_sportsdb_league_model_test.py +0 -0
  200. {sportsball-0.3.60/tests/data/sportsdb → sportsball-0.3.62/tests/data/oddsportal}/__init__.py +0 -0
  201. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/oddsportal/decrypt_test.py +0 -0
  202. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/oddsportal/oddsportal_game_model_test.py +0 -0
  203. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/oddsportal/oddsportal_league_model_test.py +0 -0
  204. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/player_model_test.py +0 -0
  205. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/social_model_test.py +0 -0
  206. {sportsball-0.3.60/tests/data/sportsreference → sportsball-0.3.62/tests/data/sportsdb}/__init__.py +0 -0
  207. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/sportsdb/sportsdb_game_model_test.py +0 -0
  208. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/sportsdb/sportsdb_league_model_test.py +0 -0
  209. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/sportsdb/sportsdb_team_model_test.py +0 -0
  210. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/sportsdb/sportsdb_venue_model_test.py +0 -0
  211. {sportsball-0.3.60/tests/data/x → sportsball-0.3.62/tests/data/sportsreference}/__init__.py +0 -0
  212. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/sportsreference/sportsreference_league_model_test.py +0 -0
  213. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/sportsreference/sportsreference_player_model_test.py +0 -0
  214. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/sportsreference/sportsreference_team_model_test.py +0 -0
  215. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/sportsreference/sportsreference_venue_model_test.py +0 -0
  216. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/team_model_test.py +0 -0
  217. {sportsball-0.3.60 → sportsball-0.3.62}/tests/data/x/x_social_model_test.py +0 -0
  218. {sportsball-0.3.60 → sportsball-0.3.62}/tests/proxy_session_test.py +0 -0
  219. {sportsball-0.3.60 → sportsball-0.3.62}/tests/sportsball_test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: sportsball
3
- Version: 0.3.60
3
+ Version: 0.3.62
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.60',
29
+ version='0.3.62',
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.60"
7
+ __VERSION__ = "0.3.62"
@@ -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)
@@ -88,6 +88,9 @@ AFL_TEAM_IDENTITY_MAP = {
88
88
  "Fremantle Dockers": FREMANTLE,
89
89
  "West Coast Eagles": WESTCOAST,
90
90
  "Gold Coast Suns": GOLDCOAST,
91
+ # AFL
92
+ "GWS GIANTS": GWS,
93
+ "Gold Coast SUNS": GOLDCOAST,
91
94
  }
92
95
  BRUNSWICK_ST = "brunswick_st"
93
96
  VICTORIA_PARK = "victoria_park"
@@ -12738,6 +12738,26 @@ _CACHED_GEOCODES: dict[str, Any] = {
12738
12738
  housenumber="300",
12739
12739
  country="USA",
12740
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,
12752
+ "Davis Field House, Greenville, South Carolina": SportsballGeocodeTuple(
12753
+ city="Greenville",
12754
+ state="SC",
12755
+ postal="",
12756
+ lat=34.8725,
12757
+ lng=-82.361944,
12758
+ housenumber="",
12759
+ country="USA",
12760
+ ),
12741
12761
  }
12742
12762
 
12743
12763
 
@@ -178,28 +178,36 @@ def _find_old_dt(
178
178
  if len(df) == 2:
179
179
  test_row = df.iat[0, 0]
180
180
  test_row_2 = df.iat[1, 0]
181
+ if isinstance(test_row, float):
182
+ continue
181
183
 
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
184
+ try:
185
+ if (
186
+ "Prev Game" in test_row
187
+ or "Next Game" in test_row
188
+ or "Lost" in test_row
189
+ or "PM," in test_row_2
190
+ ):
191
+ date_venue_split = df.iat[1, 0].split()
192
+ current_idx = 5
193
193
  try:
194
- current_idx = 3
195
194
  dt = parse(" ".join(date_venue_split[:current_idx]))
196
195
  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
196
+ try:
197
+ current_idx = 3
198
+ dt = parse(" ".join(date_venue_split[:current_idx]))
199
+ except dateutil.parser._parser.ParserError: # type: ignore
200
+ dt = parse(
201
+ " ".join(",".join(test_row.split(",")[1:]).split()[:3])
202
+ )
203
+ venue_name = " ".join(date_venue_split[current_idx:])
204
+ _process_team_row(df)
205
+ break
206
+ except TypeError as exc:
207
+ logging.error(test_row)
208
+ logging.error(response.url)
209
+ logging.error(response.text)
210
+ raise exc
203
211
 
204
212
  if dt is None:
205
213
  title_tag = soup.find("title")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: sportsball
3
- Version: 0.3.60
3
+ Version: 0.3.62
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
+ ]))
@@ -1019,3 +1019,17 @@ class TestSportsReferenceGameModel(unittest.TestCase):
1019
1019
  datetime.datetime(2010, 10, 10, 10, 10, 0),
1020
1020
  )
1021
1021
  self.assertEqual(game_model.dt, datetime.datetime(2016, 2, 23, 0, 0))
1022
+
1023
+ def test_dt_old_style_21(self):
1024
+ url = "https://www.sports-reference.com/cbb/boxscores/2015-11-23-detroit-mercy.html"
1025
+ with requests_mock.Mocker() as m:
1026
+ with open(os.path.join(self.dir, "2015-11-23-detroit-mercy.html"), "rb") as f:
1027
+ m.get(url, content=f.read())
1028
+
1029
+ game_model = create_sportsreference_game_model(
1030
+ self.session,
1031
+ url,
1032
+ League.NBA,
1033
+ datetime.datetime(2010, 10, 10, 10, 10, 0),
1034
+ )
1035
+ self.assertEqual(game_model.dt, datetime.datetime(2015, 11, 23, 0, 0))
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