sportsball 0.3.118__tar.gz → 0.3.120__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 (228) hide show
  1. {sportsball-0.3.118/sportsball.egg-info → sportsball-0.3.120}/PKG-INFO +1 -1
  2. {sportsball-0.3.118 → sportsball-0.3.120}/setup.py +1 -1
  3. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/__init__.py +1 -1
  4. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afl/afl_afl_game_model.py +21 -8
  5. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afl/afl_afl_league_model.py +90 -6
  6. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afl/afl_afl_player_model.py +1 -0
  7. sportsball-0.3.120/sportsball/data/afl/afl/afl_afl_venue_model.py +25 -0
  8. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/combined/afl_combined_league_model.py +9 -0
  9. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/google/google_address_model.py +49 -9
  10. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/combined/nba_combined_league_model.py +2 -0
  11. sportsball-0.3.120/sportsball/data/nba/nbacom/nba_nbacom_game_model.py +56 -0
  12. sportsball-0.3.120/sportsball/data/nba/nbacom/nba_nbacom_league_model.py +40 -0
  13. sportsball-0.3.120/sportsball/data/nba/nbacom/nba_nbacom_player_model.py +44 -0
  14. sportsball-0.3.120/sportsball/data/nba/nbacom/nba_nbacom_team_model.py +38 -0
  15. sportsball-0.3.118/sportsball/data/afl/afl/afl_afl_venue_model.py → sportsball-0.3.120/sportsball/data/nba/nbacom/nba_nbacom_venue_model.py +2 -2
  16. {sportsball-0.3.118 → sportsball-0.3.120/sportsball.egg-info}/PKG-INFO +1 -1
  17. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball.egg-info/SOURCES.txt +6 -0
  18. sportsball-0.3.120/tests/data/x/__init__.py +0 -0
  19. {sportsball-0.3.118 → sportsball-0.3.120}/LICENSE +0 -0
  20. {sportsball-0.3.118 → sportsball-0.3.120}/MANIFEST.in +0 -0
  21. {sportsball-0.3.118 → sportsball-0.3.120}/README.md +0 -0
  22. {sportsball-0.3.118 → sportsball-0.3.120}/requirements.txt +0 -0
  23. {sportsball-0.3.118 → sportsball-0.3.120}/setup.cfg +0 -0
  24. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/__main__.py +0 -0
  25. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/args.py +0 -0
  26. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/cache.py +0 -0
  27. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/__init__.py +0 -0
  28. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/address_model.py +0 -0
  29. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/__init__.py +0 -0
  30. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afl/__init__.py +0 -0
  31. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afl/afl_afl_bookie_model.py +0 -0
  32. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afl/afl_afl_odds_model.py +0 -0
  33. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afl/afl_afl_team_model.py +0 -0
  34. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afltables/__init__.py +0 -0
  35. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afltables/afl_afltables_game_model.py +0 -0
  36. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afltables/afl_afltables_league_model.py +0 -0
  37. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afltables/afl_afltables_player_model.py +0 -0
  38. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afltables/afl_afltables_team_model.py +0 -0
  39. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/afltables/afl_afltables_venue_model.py +0 -0
  40. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/aussportsbetting/__init__.py +0 -0
  41. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/aussportsbetting/afl_aussportsbetting_league_model.py +0 -0
  42. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/combined/__init__.py +0 -0
  43. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/espn/__init__.py +0 -0
  44. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/espn/afl_espn_league_model.py +0 -0
  45. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/oddsportal/__init__.py +0 -0
  46. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/afl/oddsportal/afl_oddsportal_league_model.py +0 -0
  47. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/aussportsbetting/__init__.py +0 -0
  48. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/aussportsbetting/aussportsbetting_bookie_model.py +0 -0
  49. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/aussportsbetting/aussportsbetting_game_model.py +0 -0
  50. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/aussportsbetting/aussportsbetting_league_model.py +0 -0
  51. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/aussportsbetting/aussportsbetting_odds_model.py +0 -0
  52. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/aussportsbetting/aussportsbetting_team_model.py +0 -0
  53. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/aussportsbetting/aussportsbetting_venue_model.py +0 -0
  54. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/bookie_model.py +0 -0
  55. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/combined/__init__.py +0 -0
  56. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/combined/combined_address_model.py +0 -0
  57. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/combined/combined_game_model.py +0 -0
  58. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/combined/combined_league_model.py +0 -0
  59. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/combined/combined_player_model.py +0 -0
  60. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/combined/combined_team_model.py +0 -0
  61. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/combined/combined_venue_model.py +0 -0
  62. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/combined/combined_weather_model.py +0 -0
  63. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/combined/null_check.py +0 -0
  64. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/espn/__init__.py +0 -0
  65. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/espn/espn_bookie_model.py +0 -0
  66. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/espn/espn_game_model.py +0 -0
  67. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/espn/espn_league_model.py +0 -0
  68. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/espn/espn_odds_model.py +0 -0
  69. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/espn/espn_player_model.py +0 -0
  70. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/espn/espn_team_model.py +0 -0
  71. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/espn/espn_venue_model.py +0 -0
  72. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/field_type.py +0 -0
  73. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/game_model.py +0 -0
  74. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/google/__init__.py +0 -0
  75. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/google/google_news_model.py +0 -0
  76. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/league.py +0 -0
  77. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/league_model.py +0 -0
  78. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/model.py +0 -0
  79. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/__init__.py +0 -0
  80. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/combined/__init__.py +0 -0
  81. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/espn/__init__.py +0 -0
  82. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/espn/nba_espn_league_model.py +0 -0
  83. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/nba/__init__.py +0 -0
  84. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/nba/nba_nba_game_model.py +0 -0
  85. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/nba/nba_nba_league_model.py +0 -0
  86. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/nba/nba_nba_team_model.py +0 -0
  87. {sportsball-0.3.118/sportsball/data/nba/oddsportal → sportsball-0.3.120/sportsball/data/nba/nbacom}/__init__.py +0 -0
  88. {sportsball-0.3.118/sportsball/data/nba/sportsdb → sportsball-0.3.120/sportsball/data/nba/oddsportal}/__init__.py +0 -0
  89. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/oddsportal/nba_oddsportal_league_model.py +0 -0
  90. {sportsball-0.3.118/sportsball/data/nba/sportsreference → sportsball-0.3.120/sportsball/data/nba/sportsdb}/__init__.py +0 -0
  91. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/sportsdb/nba_sportsdb_league_model.py +0 -0
  92. {sportsball-0.3.118/sportsball/data/ncaab/combined → sportsball-0.3.120/sportsball/data/nba/sportsreference}/__init__.py +0 -0
  93. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nba/sportsreference/nba_sportsreference_league_model.py +0 -0
  94. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/ncaab/__init__.py +0 -0
  95. {sportsball-0.3.118/sportsball/data/ncaab/espn → sportsball-0.3.120/sportsball/data/ncaab/combined}/__init__.py +0 -0
  96. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/ncaab/combined/ncaab_combined_league_model.py +0 -0
  97. {sportsball-0.3.118/sportsball/data/ncaab/oddsportal → sportsball-0.3.120/sportsball/data/ncaab/espn}/__init__.py +0 -0
  98. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/ncaab/espn/ncaab_espn_league_model.py +0 -0
  99. {sportsball-0.3.118/sportsball/data/ncaab/sportsreference → sportsball-0.3.120/sportsball/data/ncaab/oddsportal}/__init__.py +0 -0
  100. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/ncaab/oddsportal/ncaab_oddsportal_league_model.py +0 -0
  101. {sportsball-0.3.118/sportsball/data/ncaaf/combined → sportsball-0.3.120/sportsball/data/ncaab/sportsreference}/__init__.py +0 -0
  102. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/ncaab/sportsreference/ncaab_sportsreference_league_model.py +0 -0
  103. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/ncaaf/__init__.py +0 -0
  104. {sportsball-0.3.118/sportsball/data/ncaaf/espn → sportsball-0.3.120/sportsball/data/ncaaf/combined}/__init__.py +0 -0
  105. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/ncaaf/combined/ncaaf_combined_league_model.py +0 -0
  106. {sportsball-0.3.118/sportsball/data/ncaaf/oddsportal → sportsball-0.3.120/sportsball/data/ncaaf/espn}/__init__.py +0 -0
  107. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/ncaaf/espn/ncaaf_espn_league_model.py +0 -0
  108. {sportsball-0.3.118/sportsball/data/nfl/aussportsbetting → sportsball-0.3.120/sportsball/data/ncaaf/oddsportal}/__init__.py +0 -0
  109. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/ncaaf/oddsportal/ncaaf_oddsportal_league_model.py +0 -0
  110. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/news_model.py +0 -0
  111. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nfl/__init__.py +0 -0
  112. {sportsball-0.3.118/sportsball/data/nfl/combined → sportsball-0.3.120/sportsball/data/nfl/aussportsbetting}/__init__.py +0 -0
  113. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nfl/aussportsbetting/nfl_aussportsbetting_league_model.py +0 -0
  114. {sportsball-0.3.118/sportsball/data/nfl/oddsportal → sportsball-0.3.120/sportsball/data/nfl/combined}/__init__.py +0 -0
  115. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nfl/combined/nfl_combined_league_model.py +0 -0
  116. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nfl/espn/__init__.py +0 -0
  117. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nfl/espn/nfl_espn_league_model.py +0 -0
  118. {sportsball-0.3.118/sportsball/data/nfl/sportsdb → sportsball-0.3.120/sportsball/data/nfl/oddsportal}/__init__.py +0 -0
  119. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nfl/oddsportal/nfl_oddsportal_league_model.py +0 -0
  120. {sportsball-0.3.118/sportsball/data/oddsportal → sportsball-0.3.120/sportsball/data/nfl/sportsdb}/__init__.py +0 -0
  121. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/nfl/sportsdb/nfl_sportsdb_league_model.py +0 -0
  122. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/odds_model.py +0 -0
  123. {sportsball-0.3.118/sportsball/data/sportsdb → sportsball-0.3.120/sportsball/data/oddsportal}/__init__.py +0 -0
  124. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/oddsportal/decrypt.py +0 -0
  125. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/oddsportal/oddsportal_bookie_model.py +0 -0
  126. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/oddsportal/oddsportal_game_model.py +0 -0
  127. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/oddsportal/oddsportal_league_model.py +0 -0
  128. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/oddsportal/oddsportal_odds_model.py +0 -0
  129. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/oddsportal/oddsportal_team_model.py +0 -0
  130. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/oddsportal/oddsportal_venue_model.py +0 -0
  131. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/player_model.py +0 -0
  132. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/season_type.py +0 -0
  133. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/social_model.py +0 -0
  134. {sportsball-0.3.118/sportsball/data/sportsreference → sportsball-0.3.120/sportsball/data/sportsdb}/__init__.py +0 -0
  135. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/sportsdb/sportsdb_game_model.py +0 -0
  136. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/sportsdb/sportsdb_league_model.py +0 -0
  137. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/sportsdb/sportsdb_team_model.py +0 -0
  138. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/sportsdb/sportsdb_venue_model.py +0 -0
  139. {sportsball-0.3.118/sportsball/data/weather → sportsball-0.3.120/sportsball/data/sportsreference}/__init__.py +0 -0
  140. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/sportsreference/sportsreference_game_model.py +0 -0
  141. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/sportsreference/sportsreference_league_model.py +0 -0
  142. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/sportsreference/sportsreference_player_model.py +0 -0
  143. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/sportsreference/sportsreference_team_model.py +0 -0
  144. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/sportsreference/sportsreference_venue_model.py +0 -0
  145. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/team_model.py +0 -0
  146. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/venue_model.py +0 -0
  147. {sportsball-0.3.118/sportsball/data/weather/gribstream → sportsball-0.3.120/sportsball/data/weather}/__init__.py +0 -0
  148. {sportsball-0.3.118/sportsball/data/weather/openmeteo → sportsball-0.3.120/sportsball/data/weather/gribstream}/__init__.py +0 -0
  149. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/weather/gribstream/gribstream_weather_model.py +0 -0
  150. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/weather/multi_weather_model.py +0 -0
  151. {sportsball-0.3.118/sportsball/data/wikipedia → sportsball-0.3.120/sportsball/data/weather/openmeteo}/__init__.py +0 -0
  152. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/weather/openmeteo/openmeteo_weather_model.py +0 -0
  153. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/weather_model.py +0 -0
  154. {sportsball-0.3.118/sportsball/data/x → sportsball-0.3.120/sportsball/data/wikipedia}/__init__.py +0 -0
  155. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/wikipedia/wikipedia_venue_model.py +0 -0
  156. {sportsball-0.3.118/sportsball/vendor → sportsball-0.3.120/sportsball/data/x}/__init__.py +0 -0
  157. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/data/x/x_social_model.py +0 -0
  158. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/logger.py +0 -0
  159. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/loglevel.py +0 -0
  160. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/playwright.py +0 -0
  161. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/proxy_session.py +0 -0
  162. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/session.py +0 -0
  163. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/sportsball.py +0 -0
  164. {sportsball-0.3.118/tests → sportsball-0.3.120/sportsball/vendor}/__init__.py +0 -0
  165. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball/vendor/pygooglenews/__init__.py +0 -0
  166. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball.egg-info/dependency_links.txt +0 -0
  167. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball.egg-info/entry_points.txt +0 -0
  168. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball.egg-info/not-zip-safe +0 -0
  169. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball.egg-info/requires.txt +0 -0
  170. {sportsball-0.3.118 → sportsball-0.3.120}/sportsball.egg-info/top_level.txt +0 -0
  171. {sportsball-0.3.118/tests/data → sportsball-0.3.120/tests}/__init__.py +0 -0
  172. {sportsball-0.3.118/tests/data/afl → sportsball-0.3.120/tests/data}/__init__.py +0 -0
  173. {sportsball-0.3.118/tests/data/afl → sportsball-0.3.120/tests/data}/afl/__init__.py +0 -0
  174. {sportsball-0.3.118/tests/data/afl/afltables → sportsball-0.3.120/tests/data/afl/afl}/__init__.py +0 -0
  175. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/afl/afl/afl_afl_league_model_test.py +0 -0
  176. {sportsball-0.3.118/tests/data/aussportsbetting → sportsball-0.3.120/tests/data/afl/afltables}/__init__.py +0 -0
  177. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/afl/afltables/afl_afltables_game_model_test.py +0 -0
  178. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/afl/afltables/afl_afltables_league_model_test.py +0 -0
  179. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/afl/afltables/afl_afltables_player_model_test.py +0 -0
  180. {sportsball-0.3.118/tests/data/combined → sportsball-0.3.120/tests/data/aussportsbetting}/__init__.py +0 -0
  181. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/aussportsbetting/aussportsbetting_game_model_test.py +0 -0
  182. {sportsball-0.3.118/tests/data/espn → sportsball-0.3.120/tests/data/combined}/__init__.py +0 -0
  183. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/combined/combined_game_model_test.py +0 -0
  184. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/combined/combined_player_model_test.py +0 -0
  185. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/combined/combined_team_model_test.py +0 -0
  186. {sportsball-0.3.118/tests/data/google → sportsball-0.3.120/tests/data/espn}/__init__.py +0 -0
  187. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/espn/espn_game_model_test.py +0 -0
  188. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/espn/espn_player_model_test.py +0 -0
  189. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/game_model_test.py +0 -0
  190. {sportsball-0.3.118/tests/data/nba → sportsball-0.3.120/tests/data/google}/__init__.py +0 -0
  191. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/google/google_address_model_test.py +0 -0
  192. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/google/google_news_model_test.py +0 -0
  193. {sportsball-0.3.118/tests/data/nba → sportsball-0.3.120/tests/data}/nba/__init__.py +0 -0
  194. {sportsball-0.3.118/tests/data/nba/sportsdb → sportsball-0.3.120/tests/data/nba/nba}/__init__.py +0 -0
  195. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/nba/nba/nba_nba_game_model_test.py +0 -0
  196. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/nba/nba/nba_nba_league_model_test.py +0 -0
  197. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/nba/nba/nba_nba_team_model_test.py +0 -0
  198. {sportsball-0.3.118/tests/data/nba/sportsreference → sportsball-0.3.120/tests/data/nba/sportsdb}/__init__.py +0 -0
  199. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/nba/sportsdb/nba_sportsdb_league_model_test.py +0 -0
  200. {sportsball-0.3.118/tests/data/ncaab → sportsball-0.3.120/tests/data/nba/sportsreference}/__init__.py +0 -0
  201. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/nba/sportsreference/nba_sportsreference_league_model_test.py +0 -0
  202. {sportsball-0.3.118/tests/data/ncaab/sportsreference → sportsball-0.3.120/tests/data/ncaab}/__init__.py +0 -0
  203. {sportsball-0.3.118/tests/data/nfl → sportsball-0.3.120/tests/data/ncaab/sportsreference}/__init__.py +0 -0
  204. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/ncaab/sportsreference/ncaab_sportsreference_league_model_test.py +0 -0
  205. {sportsball-0.3.118/tests/data/nfl/sportsdb → sportsball-0.3.120/tests/data/nfl}/__init__.py +0 -0
  206. {sportsball-0.3.118/tests/data/oddsportal → sportsball-0.3.120/tests/data/nfl/sportsdb}/__init__.py +0 -0
  207. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/nfl/sportsdb/nfl_sportsdb_league_model_test.py +0 -0
  208. {sportsball-0.3.118/tests/data/sportsdb → sportsball-0.3.120/tests/data/oddsportal}/__init__.py +0 -0
  209. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/oddsportal/decrypt_test.py +0 -0
  210. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/oddsportal/oddsportal_game_model_test.py +0 -0
  211. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/oddsportal/oddsportal_league_model_test.py +0 -0
  212. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/player_model_test.py +0 -0
  213. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/social_model_test.py +0 -0
  214. {sportsball-0.3.118/tests/data/sportsreference → sportsball-0.3.120/tests/data/sportsdb}/__init__.py +0 -0
  215. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/sportsdb/sportsdb_game_model_test.py +0 -0
  216. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/sportsdb/sportsdb_league_model_test.py +0 -0
  217. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/sportsdb/sportsdb_team_model_test.py +0 -0
  218. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/sportsdb/sportsdb_venue_model_test.py +0 -0
  219. {sportsball-0.3.118/tests/data/x → sportsball-0.3.120/tests/data/sportsreference}/__init__.py +0 -0
  220. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/sportsreference/sportsreference_game_model_test.py +0 -0
  221. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/sportsreference/sportsreference_league_model_test.py +0 -0
  222. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/sportsreference/sportsreference_player_model_test.py +0 -0
  223. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/sportsreference/sportsreference_team_model_test.py +0 -0
  224. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/sportsreference/sportsreference_venue_model_test.py +0 -0
  225. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/team_model_test.py +0 -0
  226. {sportsball-0.3.118 → sportsball-0.3.120}/tests/data/x/x_social_model_test.py +0 -0
  227. {sportsball-0.3.118 → sportsball-0.3.120}/tests/proxy_session_test.py +0 -0
  228. {sportsball-0.3.118 → sportsball-0.3.120}/tests/sportsball_test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: sportsball
3
- Version: 0.3.118
3
+ Version: 0.3.120
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.118',
29
+ version='0.3.120',
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.118"
7
+ __VERSION__ = "0.3.120"
@@ -1,8 +1,8 @@
1
1
  """AFL AFL game model."""
2
2
 
3
- # pylint: disable=too-many-statements,protected-access,too-many-arguments,bare-except
3
+ # pylint: disable=too-many-statements,protected-access,too-many-arguments,bare-except,duplicate-code
4
4
  import datetime
5
- import logging
5
+ import re
6
6
 
7
7
  import pytest_is_running
8
8
  import requests_cache
@@ -16,18 +16,29 @@ 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],
@@ -35,7 +46,7 @@ def create_afl_afl_game_model(
35
46
  playwright: Playwright,
36
47
  ) -> GameModel:
37
48
  """Create a game model from AFL Tables."""
38
- odds = []
49
+ odds: list[float] = []
39
50
  if url is not None and not pytest_is_running.is_running():
40
51
  ensure_install()
41
52
  browser = playwright.chromium.launch()
@@ -44,8 +55,10 @@ def create_afl_afl_game_model(
44
55
  try:
45
56
  page.goto(url, wait_until="networkidle")
46
57
  except: # noqa: E722
47
- logging.warning("Ladder URL timed out.")
48
- odds = _extract_odds(page.content())
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,7 +8,7 @@ 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
13
  from playwright.sync_api import Playwright, sync_playwright
14
14
 
@@ -19,14 +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,
22
+ def _parse_v1(
23
+ soup: BeautifulSoup,
24
24
  session: requests_cache.CachedSession,
25
25
  ladder: list[str],
26
26
  html_url: str,
27
27
  playwright: Playwright,
28
28
  ) -> Iterator[GameModel]:
29
- soup = BeautifulSoup(html, "lxml")
30
29
  for div in soup.find_all("div", {"class": re.compile(".*js-match-list-item.*")}):
31
30
  team_names = []
32
31
  for span in div.find_all(
@@ -110,13 +109,97 @@ def _parse_game_info(
110
109
  )
111
110
 
112
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
+
113
196
  class AFLAFLLeagueModel(LeagueModel):
114
197
  """AFL AFL implementation of the league model."""
115
198
 
116
199
  def __init__(
117
200
  self, session: requests_cache.CachedSession, position: int | None = None
118
201
  ) -> None:
119
- super().__init__(League.AFL, session)
202
+ super().__init__(League.AFL, session, position=position)
120
203
 
121
204
  @classmethod
122
205
  def name(cls) -> str:
@@ -137,7 +220,7 @@ class AFLAFLLeagueModel(LeagueModel):
137
220
  timeout=60000.0,
138
221
  )
139
222
  except: # noqa: E722
140
- logging.warning("Ladder URL timed out.")
223
+ pass
141
224
  soup = BeautifulSoup(page.content(), "lxml")
142
225
  for span in soup.find_all(
143
226
  "span", {"class": re.compile(".*stats-table__club-name.*")}
@@ -146,6 +229,7 @@ class AFLAFLLeagueModel(LeagueModel):
146
229
  if team_name in ladder:
147
230
  continue
148
231
  ladder.append(team_name)
232
+ logging.info("Found ladder: %s", ",".join(ladder))
149
233
  return ladder
150
234
 
151
235
  @property
@@ -1,5 +1,6 @@
1
1
  """AFL AFL player model."""
2
2
 
3
+ # pylint: disable=duplicate-code
3
4
  from ...player_model import PlayerModel
4
5
 
5
6
 
@@ -0,0 +1,25 @@
1
+ """AFL AFL venue model."""
2
+
3
+ # pylint: disable=too-many-statements,protected-access,duplicate-code
4
+ import datetime
5
+
6
+ import requests_cache
7
+
8
+ from ...google.google_address_model import create_google_address_model
9
+ from ...venue_model import VenueModel
10
+
11
+
12
+ def create_afl_afl_venue_model(
13
+ venue_name: str,
14
+ session: requests_cache.CachedSession,
15
+ dt: datetime.datetime,
16
+ ) -> VenueModel:
17
+ """Create a game model from AFL Tables."""
18
+ address_model = create_google_address_model(venue_name, session, dt)
19
+ return VenueModel(
20
+ identifier=venue_name,
21
+ name=venue_name,
22
+ address=address_model,
23
+ is_grass=None,
24
+ is_indoor=None,
25
+ )
@@ -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
 
@@ -2611,6 +2611,15 @@ OMNI_COLISEUM = SportsballGeocodeTuple(
2611
2611
  housenumber="100",
2612
2612
  country="USA",
2613
2613
  )
2614
+ MCCAMISH_PAVILION = SportsballGeocodeTuple(
2615
+ city="Atlanta",
2616
+ state="GA",
2617
+ postal="",
2618
+ lat=33.780833,
2619
+ lng=-84.392778,
2620
+ housenumber="965",
2621
+ country="USA",
2622
+ )
2614
2623
  _CACHED_GEOCODES: dict[str, Any] = {
2615
2624
  "S.C.G. - Australia": SCG,
2616
2625
  "Victoria Park - Australia": SportsballGeocodeTuple(
@@ -5558,15 +5567,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
5558
5567
  housenumber="701",
5559
5568
  country="USA",
5560
5569
  ),
5561
- "McCamish Pavilion, Atlanta, Georgia": SportsballGeocodeTuple(
5562
- city="Atlanta",
5563
- state="GA",
5564
- postal="",
5565
- lat=33.780833,
5566
- lng=-84.392778,
5567
- housenumber="965",
5568
- country="USA",
5569
- ),
5570
+ "McCamish Pavilion, Atlanta, Georgia": MCCAMISH_PAVILION,
5570
5571
  "Maravich Assembly Center, Baton Rouge, Louisiana": PETE_MARAVICH_ASSEMBLY_CENTER,
5571
5572
  "Viejas Arena, San Diego, California": VIEJAS_ARENA,
5572
5573
  "Reitz Arena, Baltimore, Maryland": SportsballGeocodeTuple(
@@ -13864,6 +13865,45 @@ _CACHED_GEOCODES: dict[str, Any] = {
13864
13865
  ),
13865
13866
  "Cox Arena, San Diego, California": VIEJAS_ARENA,
13866
13867
  "The Omni, Atlanta, Georgia": OMNI_COLISEUM,
13868
+ "TD Banknorth Sports Center, Hamden, Connecticut": TD_BANK_SPORTS_CENTER,
13869
+ "The Event Center, San Jose, California": SportsballGeocodeTuple(
13870
+ city="San Jose",
13871
+ state="CA",
13872
+ postal="95192",
13873
+ lat=37.33536,
13874
+ lng=-121.87985,
13875
+ housenumber="290",
13876
+ country="USA",
13877
+ ),
13878
+ "TIO Stadium, Darwin": TIO_STADIUM,
13879
+ "SCG, Sydney": SCG,
13880
+ "MCG, Melbourne": MCG,
13881
+ "Adelaide Oval, Adelaide": ADELAIDE_OVAL,
13882
+ "ENGIE Stadium, Sydney": ENGIE_STADIUM,
13883
+ "Marvel Stadium, Melbourne": MARVEL_STADIUM,
13884
+ "Gabba, Brisbane": GABBA,
13885
+ "Optus Stadium, Perth": OPTUS_STADIUM,
13886
+ "Ball Arena - Denver, Colorado, USA - United States": PEPSI_CENTRE,
13887
+ "Alexander Memorial Coliseum, Atlanta, Georgia": MCCAMISH_PAVILION,
13888
+ "Alltell Arena, North Little Rock, Arkansas": SIMMONS_BANK_ARENA,
13889
+ "Auburn Hills, Michigan": SportsballGeocodeTuple(
13890
+ city="Auburn Hills",
13891
+ state="MI",
13892
+ postal="",
13893
+ lat=42.6875,
13894
+ lng=-83.234167,
13895
+ housenumber="",
13896
+ country="USA",
13897
+ ),
13898
+ "Guaynabo": SportsballGeocodeTuple(
13899
+ city="Guaynabo",
13900
+ state="PR",
13901
+ postal="",
13902
+ lat=18.366667,
13903
+ lng=-66.1,
13904
+ housenumber="",
13905
+ country="USA",
13906
+ ),
13867
13907
  }
13868
13908
 
13869
13909
 
@@ -8,6 +8,7 @@ from ...combined.combined_league_model import CombinedLeagueModel
8
8
  from ...league import League
9
9
  from ..espn.nba_espn_league_model import NBAESPNLeagueModel
10
10
  from ..nba.nba_nba_league_model import NBANBALeagueModel
11
+ from ..nbacom.nba_nbacom_league_model import NBANBAComLeagueModel
11
12
  from ..oddsportal.nba_oddsportal_league_model import NBAOddsPortalLeagueModel
12
13
  from ..sportsdb.nba_sportsdb_league_model import NBASportsDBLeagueModel
13
14
  from ..sportsreference.nba_sportsreference_league_model import \
@@ -903,6 +904,7 @@ class NBACombinedLeagueModel(CombinedLeagueModel):
903
904
  NBASportsDBLeagueModel(session, position=2),
904
905
  NBASportsReferenceLeagueModel(session, position=3),
905
906
  NBAOddsPortalLeagueModel(session, position=4),
907
+ NBANBAComLeagueModel(session, position=5),
906
908
  ],
907
909
  league_filter,
908
910
  )
@@ -0,0 +1,56 @@
1
+ """NBA NBA.com game model."""
2
+
3
+ # pylint: disable=too-many-statements,protected-access,too-many-arguments,bare-except
4
+ import datetime
5
+ from typing import Any
6
+
7
+ import extruct # type: ignore
8
+ import requests_cache
9
+
10
+ from ...game_model import GameModel
11
+ from ...league import League
12
+ from .nba_nbacom_team_model import create_nba_nbacom_team_model
13
+ from .nba_nbacom_venue_model import create_nba_nbacom_venue_model
14
+
15
+
16
+ def create_nba_nbacom_game_model(
17
+ game: dict[str, Any], session: requests_cache.CachedSession
18
+ ) -> GameModel:
19
+ """Create a game model from AFL Tables."""
20
+ game_id = game["gameId"]
21
+ venue_name: str | None = None
22
+ dt = None
23
+ with session.cache_disabled():
24
+ response = session.get(f"https://www.nba.com/game/{game_id}")
25
+ response.raise_for_status()
26
+ data = extruct.extract(response.text, base_url=response.url)
27
+ for jsonld in data["json-ld"]:
28
+ location = jsonld.get("location")
29
+ if location is not None:
30
+ venue_name = location["name"]
31
+ start_date = jsonld.get("startDate")
32
+ if start_date is not None:
33
+ dt = datetime.datetime.fromisoformat(start_date)
34
+
35
+ if venue_name is None:
36
+ raise ValueError("venue_name is null")
37
+ if dt is None:
38
+ raise ValueError("dt is null")
39
+ venue_model = create_nba_nbacom_venue_model(venue_name, session, dt)
40
+ return GameModel(
41
+ dt=dt,
42
+ week=None,
43
+ game_number=None,
44
+ venue=venue_model,
45
+ teams=[
46
+ create_nba_nbacom_team_model(game["homeTeam"], session, dt),
47
+ create_nba_nbacom_team_model(game["awayTeam"], session, dt),
48
+ ],
49
+ end_dt=None,
50
+ attendance=None,
51
+ league=League.NBA,
52
+ year=datetime.datetime.today().year,
53
+ season_type=None,
54
+ postponed=None,
55
+ play_off=None,
56
+ )
@@ -0,0 +1,40 @@
1
+ """NBA NBA.com league model."""
2
+
3
+ # pylint: disable=too-many-statements,protected-access,too-many-locals,bare-except,too-many-branches,duplicate-code
4
+ import datetime
5
+ import logging
6
+ from typing import Iterator
7
+
8
+ import requests_cache
9
+
10
+ from ...game_model import GameModel
11
+ from ...league import League
12
+ from ...league_model import LeagueModel
13
+ from .nba_nbacom_game_model import create_nba_nbacom_game_model
14
+
15
+
16
+ class NBANBAComLeagueModel(LeagueModel):
17
+ """NBA NBA.com implementation of the league model."""
18
+
19
+ def __init__(
20
+ self, session: requests_cache.CachedSession, position: int | None = None
21
+ ) -> None:
22
+ super().__init__(League.AFL, session, position=position)
23
+
24
+ @classmethod
25
+ def name(cls) -> str:
26
+ return "nba-nbacom-league-model"
27
+
28
+ @property
29
+ def games(self) -> Iterator[GameModel]:
30
+ with self.session.cache_disabled():
31
+ date_slug = datetime.datetime.today().date().strftime("%Y%m%d")
32
+ response = self.session.get(
33
+ f"https://stats.nba.com/js/data/leaders/00_daily_lineups_{date_slug}.json"
34
+ )
35
+ if response.ok:
36
+ lineup = response.json()
37
+ for game in lineup["games"]:
38
+ yield create_nba_nbacom_game_model(game, self.session)
39
+ else:
40
+ logging.warning("Failed to fetch NBA daily lineups.")
@@ -0,0 +1,44 @@
1
+ """NBA NBA.com player model."""
2
+
3
+ from typing import Any
4
+
5
+ from ...player_model import PlayerModel
6
+
7
+
8
+ def create_nba_nbacom_player_model(player_dict: dict[str, Any]) -> PlayerModel:
9
+ """Create a player model from AFL AFL."""
10
+ return PlayerModel(
11
+ identifier=str(player_dict["personId"]),
12
+ jersey=None,
13
+ kicks=None,
14
+ fumbles=None,
15
+ fumbles_lost=None,
16
+ field_goals=None,
17
+ field_goals_attempted=None,
18
+ offensive_rebounds=None,
19
+ assists=None,
20
+ turnovers=None,
21
+ name=player_dict["playerName"],
22
+ marks=None,
23
+ handballs=None,
24
+ disposals=None,
25
+ goals=None,
26
+ behinds=None,
27
+ hit_outs=None,
28
+ tackles=None,
29
+ rebounds=None,
30
+ insides=None,
31
+ clearances=None,
32
+ clangers=None,
33
+ free_kicks_for=None,
34
+ free_kicks_against=None,
35
+ brownlow_votes=None,
36
+ contested_possessions=None,
37
+ uncontested_possessions=None,
38
+ contested_marks=None,
39
+ marks_inside=None,
40
+ one_percenters=None,
41
+ bounces=None,
42
+ goal_assists=None,
43
+ percentage_played=None,
44
+ )
@@ -0,0 +1,38 @@
1
+ """NBA NBA.com team model."""
2
+
3
+ # pylint: disable=duplicate-code,too-many-arguments
4
+ import datetime
5
+ from typing import Any
6
+
7
+ import requests_cache
8
+
9
+ from ...google.google_news_model import create_google_news_models
10
+ from ...league import League
11
+ from ...team_model import TeamModel
12
+ from .nba_nbacom_player_model import create_nba_nbacom_player_model
13
+
14
+
15
+ def create_nba_nbacom_team_model(
16
+ team: dict[str, Any],
17
+ session: requests_cache.CachedSession,
18
+ dt: datetime.datetime,
19
+ ) -> TeamModel:
20
+ """Create a team model from AFL AFL."""
21
+ team_name = team["teamAbbreviation"]
22
+ return TeamModel(
23
+ identifier=str(team["teamId"]),
24
+ name=team_name,
25
+ location=None,
26
+ players=[create_nba_nbacom_player_model(x) for x in team["players"]],
27
+ odds=[],
28
+ points=None,
29
+ ladder_rank=None,
30
+ kicks=None,
31
+ news=create_google_news_models(team_name, session, dt, League.NBA),
32
+ social=[],
33
+ field_goals=None,
34
+ field_goals_attempted=None,
35
+ offensive_rebounds=None,
36
+ assists=None,
37
+ turnovers=None,
38
+ )
@@ -1,4 +1,4 @@
1
- """AFL AFL venue model."""
1
+ """NBA NBA.com venue model."""
2
2
 
3
3
  # pylint: disable=too-many-statements,protected-access
4
4
  import datetime
@@ -9,7 +9,7 @@ from ...google.google_address_model import create_google_address_model
9
9
  from ...venue_model import VenueModel
10
10
 
11
11
 
12
- def create_afl_afl_venue_model(
12
+ def create_nba_nbacom_venue_model(
13
13
  venue_name: str,
14
14
  session: requests_cache.CachedSession,
15
15
  dt: datetime.datetime,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: sportsball
3
- Version: 0.3.118
3
+ Version: 0.3.120
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
@@ -95,6 +95,12 @@ sportsball/data/nba/nba/__init__.py
95
95
  sportsball/data/nba/nba/nba_nba_game_model.py
96
96
  sportsball/data/nba/nba/nba_nba_league_model.py
97
97
  sportsball/data/nba/nba/nba_nba_team_model.py
98
+ sportsball/data/nba/nbacom/__init__.py
99
+ sportsball/data/nba/nbacom/nba_nbacom_game_model.py
100
+ sportsball/data/nba/nbacom/nba_nbacom_league_model.py
101
+ sportsball/data/nba/nbacom/nba_nbacom_player_model.py
102
+ sportsball/data/nba/nbacom/nba_nbacom_team_model.py
103
+ sportsball/data/nba/nbacom/nba_nbacom_venue_model.py
98
104
  sportsball/data/nba/oddsportal/__init__.py
99
105
  sportsball/data/nba/oddsportal/nba_oddsportal_league_model.py
100
106
  sportsball/data/nba/sportsdb/__init__.py
File without changes
File without changes
File without changes
File without changes
File without changes