sportsball 0.3.117__tar.gz → 0.3.119__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 (222) hide show
  1. {sportsball-0.3.117/sportsball.egg-info → sportsball-0.3.119}/PKG-INFO +1 -1
  2. {sportsball-0.3.117 → sportsball-0.3.119}/setup.py +1 -1
  3. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/__init__.py +1 -1
  4. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afl/afl_afl_game_model.py +28 -15
  5. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afl/afl_afl_league_model.py +103 -8
  6. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/combined/afl_combined_league_model.py +9 -0
  7. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/google/google_address_model.py +18 -0
  8. {sportsball-0.3.117 → sportsball-0.3.119/sportsball.egg-info}/PKG-INFO +1 -1
  9. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/afl/afl/afl_afl_league_model_test.py +1 -1
  10. {sportsball-0.3.117 → sportsball-0.3.119}/LICENSE +0 -0
  11. {sportsball-0.3.117 → sportsball-0.3.119}/MANIFEST.in +0 -0
  12. {sportsball-0.3.117 → sportsball-0.3.119}/README.md +0 -0
  13. {sportsball-0.3.117 → sportsball-0.3.119}/requirements.txt +0 -0
  14. {sportsball-0.3.117 → sportsball-0.3.119}/setup.cfg +0 -0
  15. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/__main__.py +0 -0
  16. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/args.py +0 -0
  17. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/cache.py +0 -0
  18. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/__init__.py +0 -0
  19. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/address_model.py +0 -0
  20. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/__init__.py +0 -0
  21. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afl/__init__.py +0 -0
  22. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afl/afl_afl_bookie_model.py +0 -0
  23. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afl/afl_afl_odds_model.py +0 -0
  24. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afl/afl_afl_player_model.py +0 -0
  25. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afl/afl_afl_team_model.py +0 -0
  26. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afl/afl_afl_venue_model.py +0 -0
  27. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afltables/__init__.py +0 -0
  28. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afltables/afl_afltables_game_model.py +0 -0
  29. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afltables/afl_afltables_league_model.py +0 -0
  30. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afltables/afl_afltables_player_model.py +0 -0
  31. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afltables/afl_afltables_team_model.py +0 -0
  32. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/afltables/afl_afltables_venue_model.py +0 -0
  33. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/aussportsbetting/__init__.py +0 -0
  34. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/aussportsbetting/afl_aussportsbetting_league_model.py +0 -0
  35. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/combined/__init__.py +0 -0
  36. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/espn/__init__.py +0 -0
  37. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/espn/afl_espn_league_model.py +0 -0
  38. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/oddsportal/__init__.py +0 -0
  39. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/afl/oddsportal/afl_oddsportal_league_model.py +0 -0
  40. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/aussportsbetting/__init__.py +0 -0
  41. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/aussportsbetting/aussportsbetting_bookie_model.py +0 -0
  42. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/aussportsbetting/aussportsbetting_game_model.py +0 -0
  43. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/aussportsbetting/aussportsbetting_league_model.py +0 -0
  44. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/aussportsbetting/aussportsbetting_odds_model.py +0 -0
  45. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/aussportsbetting/aussportsbetting_team_model.py +0 -0
  46. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/aussportsbetting/aussportsbetting_venue_model.py +0 -0
  47. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/bookie_model.py +0 -0
  48. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/combined/__init__.py +0 -0
  49. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/combined/combined_address_model.py +0 -0
  50. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/combined/combined_game_model.py +0 -0
  51. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/combined/combined_league_model.py +0 -0
  52. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/combined/combined_player_model.py +0 -0
  53. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/combined/combined_team_model.py +0 -0
  54. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/combined/combined_venue_model.py +0 -0
  55. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/combined/combined_weather_model.py +0 -0
  56. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/combined/null_check.py +0 -0
  57. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/espn/__init__.py +0 -0
  58. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/espn/espn_bookie_model.py +0 -0
  59. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/espn/espn_game_model.py +0 -0
  60. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/espn/espn_league_model.py +0 -0
  61. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/espn/espn_odds_model.py +0 -0
  62. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/espn/espn_player_model.py +0 -0
  63. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/espn/espn_team_model.py +0 -0
  64. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/espn/espn_venue_model.py +0 -0
  65. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/field_type.py +0 -0
  66. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/game_model.py +0 -0
  67. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/google/__init__.py +0 -0
  68. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/google/google_news_model.py +0 -0
  69. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/league.py +0 -0
  70. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/league_model.py +0 -0
  71. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/model.py +0 -0
  72. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/__init__.py +0 -0
  73. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/combined/__init__.py +0 -0
  74. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/combined/nba_combined_league_model.py +0 -0
  75. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/espn/__init__.py +0 -0
  76. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/espn/nba_espn_league_model.py +0 -0
  77. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/nba/__init__.py +0 -0
  78. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/nba/nba_nba_game_model.py +0 -0
  79. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/nba/nba_nba_league_model.py +0 -0
  80. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/nba/nba_nba_team_model.py +0 -0
  81. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/oddsportal/__init__.py +0 -0
  82. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/oddsportal/nba_oddsportal_league_model.py +0 -0
  83. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/sportsdb/__init__.py +0 -0
  84. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/sportsdb/nba_sportsdb_league_model.py +0 -0
  85. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/sportsreference/__init__.py +0 -0
  86. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nba/sportsreference/nba_sportsreference_league_model.py +0 -0
  87. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaab/__init__.py +0 -0
  88. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaab/combined/__init__.py +0 -0
  89. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaab/combined/ncaab_combined_league_model.py +0 -0
  90. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaab/espn/__init__.py +0 -0
  91. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaab/espn/ncaab_espn_league_model.py +0 -0
  92. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaab/oddsportal/__init__.py +0 -0
  93. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaab/oddsportal/ncaab_oddsportal_league_model.py +0 -0
  94. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaab/sportsreference/__init__.py +0 -0
  95. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaab/sportsreference/ncaab_sportsreference_league_model.py +0 -0
  96. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaaf/__init__.py +0 -0
  97. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaaf/combined/__init__.py +0 -0
  98. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaaf/combined/ncaaf_combined_league_model.py +0 -0
  99. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaaf/espn/__init__.py +0 -0
  100. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaaf/espn/ncaaf_espn_league_model.py +0 -0
  101. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaaf/oddsportal/__init__.py +0 -0
  102. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/ncaaf/oddsportal/ncaaf_oddsportal_league_model.py +0 -0
  103. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/news_model.py +0 -0
  104. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nfl/__init__.py +0 -0
  105. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nfl/aussportsbetting/__init__.py +0 -0
  106. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nfl/aussportsbetting/nfl_aussportsbetting_league_model.py +0 -0
  107. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nfl/combined/__init__.py +0 -0
  108. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nfl/combined/nfl_combined_league_model.py +0 -0
  109. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nfl/espn/__init__.py +0 -0
  110. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nfl/espn/nfl_espn_league_model.py +0 -0
  111. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nfl/oddsportal/__init__.py +0 -0
  112. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nfl/oddsportal/nfl_oddsportal_league_model.py +0 -0
  113. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nfl/sportsdb/__init__.py +0 -0
  114. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/nfl/sportsdb/nfl_sportsdb_league_model.py +0 -0
  115. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/odds_model.py +0 -0
  116. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/oddsportal/__init__.py +0 -0
  117. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/oddsportal/decrypt.py +0 -0
  118. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/oddsportal/oddsportal_bookie_model.py +0 -0
  119. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/oddsportal/oddsportal_game_model.py +0 -0
  120. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/oddsportal/oddsportal_league_model.py +0 -0
  121. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/oddsportal/oddsportal_odds_model.py +0 -0
  122. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/oddsportal/oddsportal_team_model.py +0 -0
  123. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/oddsportal/oddsportal_venue_model.py +0 -0
  124. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/player_model.py +0 -0
  125. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/season_type.py +0 -0
  126. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/social_model.py +0 -0
  127. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/sportsdb/__init__.py +0 -0
  128. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/sportsdb/sportsdb_game_model.py +0 -0
  129. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/sportsdb/sportsdb_league_model.py +0 -0
  130. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/sportsdb/sportsdb_team_model.py +0 -0
  131. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/sportsdb/sportsdb_venue_model.py +0 -0
  132. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/sportsreference/__init__.py +0 -0
  133. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/sportsreference/sportsreference_game_model.py +0 -0
  134. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/sportsreference/sportsreference_league_model.py +0 -0
  135. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/sportsreference/sportsreference_player_model.py +0 -0
  136. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/sportsreference/sportsreference_team_model.py +0 -0
  137. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/sportsreference/sportsreference_venue_model.py +0 -0
  138. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/team_model.py +0 -0
  139. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/venue_model.py +0 -0
  140. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/weather/__init__.py +0 -0
  141. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/weather/gribstream/__init__.py +0 -0
  142. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/weather/gribstream/gribstream_weather_model.py +0 -0
  143. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/weather/multi_weather_model.py +0 -0
  144. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/weather/openmeteo/__init__.py +0 -0
  145. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/weather/openmeteo/openmeteo_weather_model.py +0 -0
  146. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/weather_model.py +0 -0
  147. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/wikipedia/__init__.py +0 -0
  148. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/wikipedia/wikipedia_venue_model.py +0 -0
  149. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/x/__init__.py +0 -0
  150. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/data/x/x_social_model.py +0 -0
  151. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/logger.py +0 -0
  152. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/loglevel.py +0 -0
  153. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/playwright.py +0 -0
  154. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/proxy_session.py +0 -0
  155. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/session.py +0 -0
  156. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/sportsball.py +0 -0
  157. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/vendor/__init__.py +0 -0
  158. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball/vendor/pygooglenews/__init__.py +0 -0
  159. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball.egg-info/SOURCES.txt +0 -0
  160. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball.egg-info/dependency_links.txt +0 -0
  161. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball.egg-info/entry_points.txt +0 -0
  162. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball.egg-info/not-zip-safe +0 -0
  163. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball.egg-info/requires.txt +0 -0
  164. {sportsball-0.3.117 → sportsball-0.3.119}/sportsball.egg-info/top_level.txt +0 -0
  165. {sportsball-0.3.117 → sportsball-0.3.119}/tests/__init__.py +0 -0
  166. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/__init__.py +0 -0
  167. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/afl/__init__.py +0 -0
  168. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/afl/afl/__init__.py +0 -0
  169. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/afl/afltables/__init__.py +0 -0
  170. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/afl/afltables/afl_afltables_game_model_test.py +0 -0
  171. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/afl/afltables/afl_afltables_league_model_test.py +0 -0
  172. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/afl/afltables/afl_afltables_player_model_test.py +0 -0
  173. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/aussportsbetting/__init__.py +0 -0
  174. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/aussportsbetting/aussportsbetting_game_model_test.py +0 -0
  175. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/combined/__init__.py +0 -0
  176. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/combined/combined_game_model_test.py +0 -0
  177. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/combined/combined_player_model_test.py +0 -0
  178. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/combined/combined_team_model_test.py +0 -0
  179. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/espn/__init__.py +0 -0
  180. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/espn/espn_game_model_test.py +0 -0
  181. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/espn/espn_player_model_test.py +0 -0
  182. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/game_model_test.py +0 -0
  183. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/google/__init__.py +0 -0
  184. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/google/google_address_model_test.py +0 -0
  185. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/google/google_news_model_test.py +0 -0
  186. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nba/__init__.py +0 -0
  187. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nba/nba/__init__.py +0 -0
  188. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nba/nba/nba_nba_game_model_test.py +0 -0
  189. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nba/nba/nba_nba_league_model_test.py +0 -0
  190. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nba/nba/nba_nba_team_model_test.py +0 -0
  191. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nba/sportsdb/__init__.py +0 -0
  192. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nba/sportsdb/nba_sportsdb_league_model_test.py +0 -0
  193. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nba/sportsreference/__init__.py +0 -0
  194. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nba/sportsreference/nba_sportsreference_league_model_test.py +0 -0
  195. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/ncaab/__init__.py +0 -0
  196. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/ncaab/sportsreference/__init__.py +0 -0
  197. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/ncaab/sportsreference/ncaab_sportsreference_league_model_test.py +0 -0
  198. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nfl/__init__.py +0 -0
  199. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nfl/sportsdb/__init__.py +0 -0
  200. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/nfl/sportsdb/nfl_sportsdb_league_model_test.py +0 -0
  201. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/oddsportal/__init__.py +0 -0
  202. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/oddsportal/decrypt_test.py +0 -0
  203. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/oddsportal/oddsportal_game_model_test.py +0 -0
  204. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/oddsportal/oddsportal_league_model_test.py +0 -0
  205. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/player_model_test.py +0 -0
  206. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/social_model_test.py +0 -0
  207. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/sportsdb/__init__.py +0 -0
  208. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/sportsdb/sportsdb_game_model_test.py +0 -0
  209. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/sportsdb/sportsdb_league_model_test.py +0 -0
  210. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/sportsdb/sportsdb_team_model_test.py +0 -0
  211. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/sportsdb/sportsdb_venue_model_test.py +0 -0
  212. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/sportsreference/__init__.py +0 -0
  213. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/sportsreference/sportsreference_game_model_test.py +0 -0
  214. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/sportsreference/sportsreference_league_model_test.py +0 -0
  215. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/sportsreference/sportsreference_player_model_test.py +0 -0
  216. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/sportsreference/sportsreference_team_model_test.py +0 -0
  217. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/sportsreference/sportsreference_venue_model_test.py +0 -0
  218. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/team_model_test.py +0 -0
  219. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/x/__init__.py +0 -0
  220. {sportsball-0.3.117 → sportsball-0.3.119}/tests/data/x/x_social_model_test.py +0 -0
  221. {sportsball-0.3.117 → sportsball-0.3.119}/tests/proxy_session_test.py +0 -0
  222. {sportsball-0.3.117 → sportsball-0.3.119}/tests/sportsball_test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: sportsball
3
- Version: 0.3.117
3
+ Version: 0.3.119
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.117',
29
+ version='0.3.119',
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.117"
7
+ __VERSION__ = "0.3.119"
@@ -2,12 +2,12 @@
2
2
 
3
3
  # pylint: disable=too-many-statements,protected-access,too-many-arguments,bare-except
4
4
  import datetime
5
- import logging
5
+ import re
6
6
 
7
7
  import pytest_is_running
8
8
  import requests_cache
9
9
  from bs4 import BeautifulSoup
10
- from playwright.sync_api import sync_playwright
10
+ from playwright.sync_api import Playwright
11
11
 
12
12
  from ....playwright import ensure_install
13
13
  from ...game_model import GameModel
@@ -16,36 +16,49 @@ from .afl_afl_team_model import create_afl_afl_team_model
16
16
  from .afl_afl_venue_model import create_afl_afl_venue_model
17
17
 
18
18
 
19
- def _extract_odds(html: str) -> list[float]:
19
+ def _extract_odds(soup: BeautifulSoup) -> list[float]:
20
20
  odds = []
21
- soup = BeautifulSoup(html, "lxml")
22
21
  for span in soup.find_all("span", {"class": "betting-button__money"}):
23
22
  odds.append(float(span.get_text().strip().replace("$", "")))
24
23
  return odds
25
24
 
26
25
 
26
+ def _extract_dt(soup: BeautifulSoup) -> datetime.datetime:
27
+ for div in soup.find_all("div", {"class": re.compile(".*js-match-start-time.*")}):
28
+ start_time = div.get("data-start-time")
29
+ return datetime.datetime.fromisoformat(start_time)
30
+ raise ValueError("Unable to find datetime")
31
+
32
+
33
+ def _parse(html: str) -> tuple[list[float], datetime.datetime]:
34
+ soup = BeautifulSoup(html, "lxml")
35
+ return _extract_odds(soup), _extract_dt(soup)
36
+
37
+
27
38
  def create_afl_afl_game_model(
28
39
  team_names: list[str],
29
40
  players: list[list[tuple[str, str, str, str]]],
30
- dt: datetime.datetime,
41
+ dt: datetime.datetime | None,
31
42
  venue_name: str,
32
43
  session: requests_cache.CachedSession,
33
44
  ladder: list[str],
34
45
  url: str | None,
46
+ playwright: Playwright,
35
47
  ) -> GameModel:
36
48
  """Create a game model from AFL Tables."""
37
- odds = []
49
+ odds: list[float] = []
38
50
  if url is not None and not pytest_is_running.is_running():
39
51
  ensure_install()
40
- with sync_playwright() as p:
41
- browser = p.chromium.launch()
42
- context = browser.new_context()
43
- page = context.new_page()
44
- try:
45
- page.goto(url, wait_until="networkidle")
46
- except: # noqa: E722
47
- logging.warning("Ladder URL timed out.")
48
- odds = _extract_odds(page.content())
52
+ browser = playwright.chromium.launch()
53
+ context = browser.new_context()
54
+ page = context.new_page()
55
+ try:
56
+ page.goto(url, wait_until="networkidle")
57
+ except: # noqa: E722
58
+ pass
59
+ odds, dt = _parse(page.content())
60
+ if dt is None:
61
+ raise ValueError("dt is null")
49
62
 
50
63
  venue_model = create_afl_afl_venue_model(venue_name, session, dt)
51
64
  teams = [
@@ -8,9 +8,9 @@ import urllib.parse
8
8
  from typing import Iterator
9
9
 
10
10
  import requests_cache
11
- from bs4 import BeautifulSoup
11
+ from bs4 import BeautifulSoup, Tag
12
12
  from dateutil.parser import parse
13
- from playwright.sync_api import sync_playwright
13
+ from playwright.sync_api import Playwright, sync_playwright
14
14
 
15
15
  from ....playwright import ensure_install
16
16
  from ...game_model import GameModel
@@ -19,10 +19,13 @@ from ...league_model import LeagueModel
19
19
  from .afl_afl_game_model import create_afl_afl_game_model
20
20
 
21
21
 
22
- def _parse_game_info(
23
- html: str, session: requests_cache.CachedSession, ladder: list[str], html_url: str
22
+ def _parse_v1(
23
+ soup: BeautifulSoup,
24
+ session: requests_cache.CachedSession,
25
+ ladder: list[str],
26
+ html_url: str,
27
+ playwright: Playwright,
24
28
  ) -> Iterator[GameModel]:
25
- soup = BeautifulSoup(html, "lxml")
26
29
  for div in soup.find_all("div", {"class": re.compile(".*js-match-list-item.*")}):
27
30
  team_names = []
28
31
  for span in div.find_all(
@@ -95,10 +98,101 @@ def _parse_game_info(
95
98
  ):
96
99
  url = urllib.parse.urljoin(html_url, a.get("href"))
97
100
  yield create_afl_afl_game_model(
98
- team_names, teams_players, dt, venue_name, session, ladder, url
101
+ team_names,
102
+ teams_players,
103
+ dt,
104
+ venue_name,
105
+ session,
106
+ ladder,
107
+ url,
108
+ playwright,
99
109
  )
100
110
 
101
111
 
112
+ def _parse_v2(
113
+ soup: BeautifulSoup,
114
+ session: requests_cache.CachedSession,
115
+ ladder: list[str],
116
+ html_url: str,
117
+ playwright: Playwright,
118
+ ) -> Iterator[GameModel]:
119
+ for div in soup.find_all("div", {"class": "team-lineups__item"}):
120
+ team_names = []
121
+ for span in div.find_all(
122
+ "span", {"class": re.compile(".*team-lineups-header__name.*")}
123
+ ):
124
+ team_names = [x.strip() for x in span.get_text().strip().split(" v ")]
125
+ team_players: list[list[tuple[str, str, str, str]]] = [[], []]
126
+
127
+ def process_a_player(
128
+ a: Tag, idx: int, team_players: list[list[tuple[str, str, str, str]]]
129
+ ) -> list[list[tuple[str, str, str, str]]]:
130
+ href = a.get("href")
131
+ if not isinstance(href, str):
132
+ raise ValueError("href is not a str")
133
+ player_id = "afl:" + href.split("/")[2]
134
+ name = a.get("title")
135
+ if not isinstance(name, str):
136
+ raise ValueError("name is not a str")
137
+ first_name, sur_name = name.split()
138
+ jersey = None
139
+ for div_shirt in a.find_all(
140
+ "div", {"class": re.compile(".*team-lineups__player-entry--shirt.*")}
141
+ ):
142
+ jersey = div_shirt.get_text().strip()
143
+ if jersey is None:
144
+ raise ValueError("jersey is null")
145
+ team_players[idx].append((player_id, first_name, sur_name, jersey))
146
+ return team_players
147
+
148
+ for a in div.find_all(
149
+ "a", {"class": re.compile(".*team-lineups__player-entry--home-team.*")}
150
+ ):
151
+ team_players = process_a_player(a, 0, team_players)
152
+ for a in div.find_all(
153
+ "a", {"class": re.compile(".*team-lineups__player-entry--away-team.*")}
154
+ ):
155
+ team_players = process_a_player(a, 1, team_players)
156
+
157
+ venue_name = None
158
+ for div_info in div.find_all("div", {"class": "team-lineups-header__info"}):
159
+ header_info = div_info.get_text().strip()
160
+ venue_name = header_info.split("・")[1].strip()
161
+ if venue_name is None:
162
+ raise ValueError("venue_name is null")
163
+
164
+ url = None
165
+ for a in div.find_all("a", {"class": "team-lineups-header"}):
166
+ url = urllib.parse.urljoin(html_url, a.get("href"))
167
+
168
+ yield create_afl_afl_game_model(
169
+ team_names,
170
+ team_players,
171
+ None,
172
+ venue_name,
173
+ session,
174
+ ladder,
175
+ url,
176
+ playwright,
177
+ )
178
+
179
+
180
+ def _parse_game_info(
181
+ html: str,
182
+ session: requests_cache.CachedSession,
183
+ ladder: list[str],
184
+ html_url: str,
185
+ playwright: Playwright,
186
+ ) -> Iterator[GameModel]:
187
+ soup = BeautifulSoup(html, "lxml")
188
+ found = False
189
+ for game_model in _parse_v1(soup, session, ladder, html_url, playwright):
190
+ found = True
191
+ yield game_model
192
+ if not found:
193
+ yield from _parse_v2(soup, session, ladder, html_url, playwright)
194
+
195
+
102
196
  class AFLAFLLeagueModel(LeagueModel):
103
197
  """AFL AFL implementation of the league model."""
104
198
 
@@ -126,7 +220,7 @@ class AFLAFLLeagueModel(LeagueModel):
126
220
  timeout=60000.0,
127
221
  )
128
222
  except: # noqa: E722
129
- logging.warning("Ladder URL timed out.")
223
+ pass
130
224
  soup = BeautifulSoup(page.content(), "lxml")
131
225
  for span in soup.find_all(
132
226
  "span", {"class": re.compile(".*stats-table__club-name.*")}
@@ -135,6 +229,7 @@ class AFLAFLLeagueModel(LeagueModel):
135
229
  if team_name in ladder:
136
230
  continue
137
231
  ladder.append(team_name)
232
+ logging.info("Found ladder: %s", ",".join(ladder))
138
233
  return ladder
139
234
 
140
235
  @property
@@ -147,4 +242,4 @@ class AFLAFLLeagueModel(LeagueModel):
147
242
  page = context.new_page()
148
243
  url = "https://www.afl.com.au/matches/team-lineups"
149
244
  page.goto(url, wait_until="networkidle")
150
- yield from _parse_game_info(page.content(), self.session, ladder, url)
245
+ yield from _parse_game_info(page.content(), self.session, ladder, url, p)
@@ -251,6 +251,15 @@ AFL_VENUE_IDENTITY_MAP = {
251
251
  "Ondrej Nepela Arena": TIPOS_ARENA,
252
252
  "Barossa Park": BAROSSA_PARK,
253
253
  "Ninja Stadium": BELLERIVE_OVAL,
254
+ # AFL
255
+ "TIO Stadium, Darwin": MARRARA_OVAL,
256
+ "SCG, Sydney": SCG,
257
+ "MCG, Melbourne": MCG,
258
+ "Adelaide Oval, Adelaide": ADELAIDE_OVAL,
259
+ "ENGIE Stadium, Sydney": STADIUM_AUSTRALIA,
260
+ "Marvel Stadium, Melbourne": DOCKLANDS,
261
+ "Gabba, Brisbane": GABBA,
262
+ "Optus Stadium, Perth": PERTH,
254
263
  }
255
264
 
256
265
 
@@ -13864,6 +13864,24 @@ _CACHED_GEOCODES: dict[str, Any] = {
13864
13864
  ),
13865
13865
  "Cox Arena, San Diego, California": VIEJAS_ARENA,
13866
13866
  "The Omni, Atlanta, Georgia": OMNI_COLISEUM,
13867
+ "TD Banknorth Sports Center, Hamden, Connecticut": TD_BANK_SPORTS_CENTER,
13868
+ "The Event Center, San Jose, California": SportsballGeocodeTuple(
13869
+ city="San Jose",
13870
+ state="CA",
13871
+ postal="95192",
13872
+ lat=37.33536,
13873
+ lng=-121.87985,
13874
+ housenumber="290",
13875
+ country="USA",
13876
+ ),
13877
+ "TIO Stadium, Darwin": TIO_STADIUM,
13878
+ "SCG, Sydney": SCG,
13879
+ "MCG, Melbourne": MCG,
13880
+ "Adelaide Oval, Adelaide": ADELAIDE_OVAL,
13881
+ "ENGIE Stadium, Sydney": ENGIE_STADIUM,
13882
+ "Marvel Stadium, Melbourne": MARVEL_STADIUM,
13883
+ "Gabba, Brisbane": GABBA,
13884
+ "Optus Stadium, Perth": OPTUS_STADIUM,
13867
13885
  }
13868
13886
 
13869
13887
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: sportsball
3
- Version: 0.3.117
3
+ Version: 0.3.119
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
@@ -34,7 +34,7 @@ class TestAFLAFLLeagueModel(unittest.TestCase):
34
34
  "Geelong Cats",
35
35
  "Hawthorn",
36
36
  "West Coast Eagles",
37
- ], "https://www.afl.com.au/matches/team-lineups"))
37
+ ], "https://www.afl.com.au/matches/team-lineups", None))
38
38
  first_game = game_models[0]
39
39
  self.assertEqual(len(first_game.teams), 2)
40
40
  for team in first_game.teams:
File without changes
File without changes
File without changes
File without changes