sportsball 0.3.60__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.60/sportsball.egg-info → sportsball-0.3.61}/PKG-INFO +1 -1
  2. {sportsball-0.3.60 → sportsball-0.3.61}/setup.py +1 -1
  3. {sportsball-0.3.60 → 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.60 → sportsball-0.3.61}/sportsball/data/google/google_address_model.py +11 -0
  6. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/sportsreference/sportsreference_game_model.py +24 -18
  7. {sportsball-0.3.60 → sportsball-0.3.61/sportsball.egg-info}/PKG-INFO +1 -1
  8. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball.egg-info/SOURCES.txt +2 -0
  9. sportsball-0.3.61/tests/data/afl/afl/afl_afl_league_model_test.py +37 -0
  10. sportsball-0.3.61/tests/data/x/__init__.py +0 -0
  11. sportsball-0.3.60/sportsball/data/afl/afl/afl_afl_league_model.py +0 -132
  12. {sportsball-0.3.60 → sportsball-0.3.61}/LICENSE +0 -0
  13. {sportsball-0.3.60 → sportsball-0.3.61}/MANIFEST.in +0 -0
  14. {sportsball-0.3.60 → sportsball-0.3.61}/README.md +0 -0
  15. {sportsball-0.3.60 → sportsball-0.3.61}/requirements.txt +0 -0
  16. {sportsball-0.3.60 → sportsball-0.3.61}/setup.cfg +0 -0
  17. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/__main__.py +0 -0
  18. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/args.py +0 -0
  19. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/cache.py +0 -0
  20. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/__init__.py +0 -0
  21. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/address_model.py +0 -0
  22. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/afl/__init__.py +0 -0
  23. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/afl/afl/__init__.py +0 -0
  24. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/afl/afl/afl_afl_game_model.py +0 -0
  25. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/afl/afl/afl_afl_player_model.py +0 -0
  26. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/afl/afl/afl_afl_team_model.py +0 -0
  27. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/afl/afl/afl_afl_venue_model.py +0 -0
  28. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/afl/afltables/__init__.py +0 -0
  29. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/afl/afltables/afl_afltables_game_model.py +0 -0
  30. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/afl/afltables/afl_afltables_league_model.py +0 -0
  31. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/afl/afltables/afl_afltables_player_model.py +0 -0
  32. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/afl/afltables/afl_afltables_team_model.py +0 -0
  33. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/afl/afltables/afl_afltables_venue_model.py +0 -0
  34. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/afl/aussportsbetting/__init__.py +0 -0
  35. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/afl/aussportsbetting/afl_aussportsbetting_league_model.py +0 -0
  36. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/afl/combined/__init__.py +0 -0
  37. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/afl/combined/afl_combined_league_model.py +0 -0
  38. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/afl/espn/__init__.py +0 -0
  39. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/afl/espn/afl_espn_league_model.py +0 -0
  40. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/afl/oddsportal/__init__.py +0 -0
  41. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/afl/oddsportal/afl_oddsportal_league_model.py +0 -0
  42. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/aussportsbetting/__init__.py +0 -0
  43. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/aussportsbetting/aussportsbetting_bookie_model.py +0 -0
  44. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/aussportsbetting/aussportsbetting_game_model.py +0 -0
  45. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/aussportsbetting/aussportsbetting_league_model.py +0 -0
  46. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/aussportsbetting/aussportsbetting_odds_model.py +0 -0
  47. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/aussportsbetting/aussportsbetting_team_model.py +0 -0
  48. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/aussportsbetting/aussportsbetting_venue_model.py +0 -0
  49. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/bookie_model.py +0 -0
  50. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/combined/__init__.py +0 -0
  51. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/combined/combined_address_model.py +0 -0
  52. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/combined/combined_game_model.py +0 -0
  53. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/combined/combined_league_model.py +0 -0
  54. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/combined/combined_player_model.py +0 -0
  55. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/combined/combined_team_model.py +0 -0
  56. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/combined/combined_venue_model.py +0 -0
  57. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/combined/combined_weather_model.py +0 -0
  58. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/espn/__init__.py +0 -0
  59. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/espn/espn_bookie_model.py +0 -0
  60. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/espn/espn_game_model.py +0 -0
  61. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/espn/espn_league_model.py +0 -0
  62. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/espn/espn_odds_model.py +0 -0
  63. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/espn/espn_player_model.py +0 -0
  64. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/espn/espn_team_model.py +0 -0
  65. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/espn/espn_venue_model.py +0 -0
  66. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/field_type.py +0 -0
  67. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/game_model.py +0 -0
  68. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/google/__init__.py +0 -0
  69. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/google/google_news_model.py +0 -0
  70. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/league.py +0 -0
  71. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/league_model.py +0 -0
  72. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/model.py +0 -0
  73. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nba/__init__.py +0 -0
  74. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nba/combined/__init__.py +0 -0
  75. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nba/combined/nba_combined_league_model.py +0 -0
  76. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nba/espn/__init__.py +0 -0
  77. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nba/espn/nba_espn_league_model.py +0 -0
  78. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nba/nba/__init__.py +0 -0
  79. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nba/nba/nba_nba_game_model.py +0 -0
  80. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nba/nba/nba_nba_league_model.py +0 -0
  81. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nba/nba/nba_nba_team_model.py +0 -0
  82. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nba/oddsportal/__init__.py +0 -0
  83. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nba/oddsportal/nba_oddsportal_league_model.py +0 -0
  84. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nba/sportsdb/__init__.py +0 -0
  85. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nba/sportsdb/nba_sportsdb_league_model.py +0 -0
  86. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nba/sportsreference/__init__.py +0 -0
  87. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nba/sportsreference/nba_sportsreference_league_model.py +0 -0
  88. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/ncaab/__init__.py +0 -0
  89. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/ncaab/combined/__init__.py +0 -0
  90. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/ncaab/combined/ncaab_combined_league_model.py +0 -0
  91. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/ncaab/espn/__init__.py +0 -0
  92. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/ncaab/espn/ncaab_espn_league_model.py +0 -0
  93. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/ncaab/oddsportal/__init__.py +0 -0
  94. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/ncaab/oddsportal/ncaab_oddsportal_league_model.py +0 -0
  95. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/ncaab/sportsreference/__init__.py +0 -0
  96. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/ncaab/sportsreference/ncaab_sportsreference_league_model.py +0 -0
  97. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/ncaaf/__init__.py +0 -0
  98. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/ncaaf/combined/__init__.py +0 -0
  99. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/ncaaf/combined/ncaaf_combined_league_model.py +0 -0
  100. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/ncaaf/espn/__init__.py +0 -0
  101. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/ncaaf/espn/ncaaf_espn_league_model.py +0 -0
  102. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/ncaaf/oddsportal/__init__.py +0 -0
  103. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/ncaaf/oddsportal/ncaaf_oddsportal_league_model.py +0 -0
  104. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/news_model.py +0 -0
  105. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nfl/__init__.py +0 -0
  106. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nfl/aussportsbetting/__init__.py +0 -0
  107. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nfl/aussportsbetting/nfl_aussportsbetting_league_model.py +0 -0
  108. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nfl/combined/__init__.py +0 -0
  109. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nfl/combined/nfl_combined_league_model.py +0 -0
  110. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nfl/espn/__init__.py +0 -0
  111. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nfl/espn/nfl_espn_league_model.py +0 -0
  112. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nfl/oddsportal/__init__.py +0 -0
  113. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nfl/oddsportal/nfl_oddsportal_league_model.py +0 -0
  114. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nfl/sportsdb/__init__.py +0 -0
  115. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/nfl/sportsdb/nfl_sportsdb_league_model.py +0 -0
  116. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/odds_model.py +0 -0
  117. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/oddsportal/__init__.py +0 -0
  118. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/oddsportal/decrypt.py +0 -0
  119. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/oddsportal/oddsportal_bookie_model.py +0 -0
  120. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/oddsportal/oddsportal_game_model.py +0 -0
  121. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/oddsportal/oddsportal_league_model.py +0 -0
  122. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/oddsportal/oddsportal_odds_model.py +0 -0
  123. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/oddsportal/oddsportal_team_model.py +0 -0
  124. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/oddsportal/oddsportal_venue_model.py +0 -0
  125. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/player_model.py +0 -0
  126. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/season_type.py +0 -0
  127. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/social_model.py +0 -0
  128. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/sportsdb/__init__.py +0 -0
  129. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/sportsdb/sportsdb_game_model.py +0 -0
  130. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/sportsdb/sportsdb_league_model.py +0 -0
  131. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/sportsdb/sportsdb_team_model.py +0 -0
  132. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/sportsdb/sportsdb_venue_model.py +0 -0
  133. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/sportsreference/__init__.py +0 -0
  134. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/sportsreference/sportsreference_league_model.py +0 -0
  135. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/sportsreference/sportsreference_player_model.py +0 -0
  136. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/sportsreference/sportsreference_team_model.py +0 -0
  137. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/sportsreference/sportsreference_venue_model.py +0 -0
  138. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/team_model.py +0 -0
  139. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/venue_model.py +0 -0
  140. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/weather/__init__.py +0 -0
  141. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/weather/gribstream/__init__.py +0 -0
  142. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/weather/gribstream/gribstream_weather_model.py +0 -0
  143. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/weather/multi_weather_model.py +0 -0
  144. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/weather/openmeteo/__init__.py +0 -0
  145. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/weather/openmeteo/openmeteo_weather_model.py +0 -0
  146. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/weather_model.py +0 -0
  147. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/wikipedia/__init__.py +0 -0
  148. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/wikipedia/wikipedia_venue_model.py +0 -0
  149. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/x/__init__.py +0 -0
  150. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/data/x/x_social_model.py +0 -0
  151. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/logger.py +0 -0
  152. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/loglevel.py +0 -0
  153. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/playwright.py +0 -0
  154. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/proxy_session.py +0 -0
  155. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/session.py +0 -0
  156. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/sportsball.py +0 -0
  157. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/vendor/__init__.py +0 -0
  158. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball/vendor/pygooglenews/__init__.py +0 -0
  159. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball.egg-info/dependency_links.txt +0 -0
  160. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball.egg-info/entry_points.txt +0 -0
  161. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball.egg-info/not-zip-safe +0 -0
  162. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball.egg-info/requires.txt +0 -0
  163. {sportsball-0.3.60 → sportsball-0.3.61}/sportsball.egg-info/top_level.txt +0 -0
  164. {sportsball-0.3.60 → sportsball-0.3.61}/tests/__init__.py +0 -0
  165. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/__init__.py +0 -0
  166. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/afl/__init__.py +0 -0
  167. {sportsball-0.3.60/tests/data/afl/afltables → sportsball-0.3.61/tests/data/afl/afl}/__init__.py +0 -0
  168. {sportsball-0.3.60/tests/data/aussportsbetting → sportsball-0.3.61/tests/data/afl/afltables}/__init__.py +0 -0
  169. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/afl/afltables/afl_afltables_game_model_test.py +0 -0
  170. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/afl/afltables/afl_afltables_league_model_test.py +0 -0
  171. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/afl/afltables/afl_afltables_player_model_test.py +0 -0
  172. {sportsball-0.3.60/tests/data/combined → sportsball-0.3.61/tests/data/aussportsbetting}/__init__.py +0 -0
  173. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/aussportsbetting/aussportsbetting_game_model_test.py +0 -0
  174. {sportsball-0.3.60/tests/data/espn → sportsball-0.3.61/tests/data/combined}/__init__.py +0 -0
  175. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/combined/combined_game_model_test.py +0 -0
  176. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/combined/combined_player_model_test.py +0 -0
  177. {sportsball-0.3.60/tests/data/google → sportsball-0.3.61/tests/data/espn}/__init__.py +0 -0
  178. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/espn/espn_game_model_test.py +0 -0
  179. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/espn/espn_player_model_test.py +0 -0
  180. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/game_model_test.py +0 -0
  181. {sportsball-0.3.60/tests/data/nba → sportsball-0.3.61/tests/data/google}/__init__.py +0 -0
  182. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/google/google_address_model_test.py +0 -0
  183. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/google/google_news_model_test.py +0 -0
  184. {sportsball-0.3.60/tests/data/nba → sportsball-0.3.61/tests/data}/nba/__init__.py +0 -0
  185. {sportsball-0.3.60/tests/data/nba/sportsdb → sportsball-0.3.61/tests/data/nba/nba}/__init__.py +0 -0
  186. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/nba/nba/nba_nba_game_model_test.py +0 -0
  187. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/nba/nba/nba_nba_league_model_test.py +0 -0
  188. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/nba/nba/nba_nba_team_model_test.py +0 -0
  189. {sportsball-0.3.60/tests/data/nba/sportsreference → sportsball-0.3.61/tests/data/nba/sportsdb}/__init__.py +0 -0
  190. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/nba/sportsdb/nba_sportsdb_league_model_test.py +0 -0
  191. {sportsball-0.3.60/tests/data/ncaab → sportsball-0.3.61/tests/data/nba/sportsreference}/__init__.py +0 -0
  192. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/nba/sportsreference/nba_sportsreference_league_model_test.py +0 -0
  193. {sportsball-0.3.60/tests/data/ncaab/sportsreference → sportsball-0.3.61/tests/data/ncaab}/__init__.py +0 -0
  194. {sportsball-0.3.60/tests/data/nfl → sportsball-0.3.61/tests/data/ncaab/sportsreference}/__init__.py +0 -0
  195. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/ncaab/sportsreference/ncaab_sportsreference_league_model_test.py +0 -0
  196. {sportsball-0.3.60/tests/data/nfl/sportsdb → sportsball-0.3.61/tests/data/nfl}/__init__.py +0 -0
  197. {sportsball-0.3.60/tests/data/oddsportal → sportsball-0.3.61/tests/data/nfl/sportsdb}/__init__.py +0 -0
  198. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/nfl/sportsdb/nfl_sportsdb_league_model_test.py +0 -0
  199. {sportsball-0.3.60/tests/data/sportsdb → sportsball-0.3.61/tests/data/oddsportal}/__init__.py +0 -0
  200. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/oddsportal/decrypt_test.py +0 -0
  201. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/oddsportal/oddsportal_game_model_test.py +0 -0
  202. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/oddsportal/oddsportal_league_model_test.py +0 -0
  203. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/player_model_test.py +0 -0
  204. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/social_model_test.py +0 -0
  205. {sportsball-0.3.60/tests/data/sportsreference → sportsball-0.3.61/tests/data/sportsdb}/__init__.py +0 -0
  206. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/sportsdb/sportsdb_game_model_test.py +0 -0
  207. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/sportsdb/sportsdb_league_model_test.py +0 -0
  208. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/sportsdb/sportsdb_team_model_test.py +0 -0
  209. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/sportsdb/sportsdb_venue_model_test.py +0 -0
  210. {sportsball-0.3.60/tests/data/x → sportsball-0.3.61/tests/data/sportsreference}/__init__.py +0 -0
  211. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/sportsreference/sportsreference_game_model_test.py +0 -0
  212. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/sportsreference/sportsreference_league_model_test.py +0 -0
  213. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/sportsreference/sportsreference_player_model_test.py +0 -0
  214. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/sportsreference/sportsreference_team_model_test.py +0 -0
  215. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/sportsreference/sportsreference_venue_model_test.py +0 -0
  216. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/team_model_test.py +0 -0
  217. {sportsball-0.3.60 → sportsball-0.3.61}/tests/data/x/x_social_model_test.py +0 -0
  218. {sportsball-0.3.60 → sportsball-0.3.61}/tests/proxy_session_test.py +0 -0
  219. {sportsball-0.3.60 → 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.60
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.60',
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.60"
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)
@@ -12738,6 +12738,17 @@ _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,
12741
12752
  }
12742
12753
 
12743
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")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: sportsball
3
- Version: 0.3.60
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