sportsball 0.3.15__tar.gz → 0.3.17__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 (183) hide show
  1. {sportsball-0.3.15/sportsball.egg-info → sportsball-0.3.17}/PKG-INFO +4 -2
  2. {sportsball-0.3.15 → sportsball-0.3.17}/README.md +3 -1
  3. {sportsball-0.3.15 → sportsball-0.3.17}/setup.py +1 -1
  4. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/__init__.py +1 -1
  5. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/afl/afltables/afl_afltables_league_model.py +8 -1
  6. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/afl/afltables/afl_afltables_player_model.py +1 -0
  7. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/afl/afltables/afl_afltables_venue_model.py +22 -3
  8. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/aussportsbetting/aussportsbetting_league_model.py +2 -1
  9. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/combined/combined_league_model.py +22 -4
  10. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/combined/combined_player_model.py +5 -0
  11. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/espn/espn_player_model.py +1 -0
  12. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/google/google_address_model.py +67 -54
  13. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/nba/nba/nba_nba_player_model.py +1 -0
  14. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/nba/nba/nba_nba_team_model.py +1 -0
  15. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/player_model.py +6 -0
  16. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/sportsdb/sportsdb_league_model.py +13 -12
  17. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/sportsreference/sportsreference_game_model.py +20 -5
  18. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/sportsreference/sportsreference_player_model.py +11 -4
  19. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/sportsreference/sportsreference_team_model.py +35 -5
  20. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/team_model.py +20 -0
  21. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/weather/gribstream/gribstream_weather_model.py +29 -4
  22. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/weather/multi_weather_model.py +2 -2
  23. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/weather/openmeteo/openmeteo_weather_model.py +48 -13
  24. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/proxy_session.py +46 -64
  25. {sportsball-0.3.15 → sportsball-0.3.17/sportsball.egg-info}/PKG-INFO +4 -2
  26. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/combined/combined_player_model_test.py +1 -0
  27. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/nba/nba/nba_nba_game_model_test.py +4 -0
  28. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/nba/nba/nba_nba_team_model_test.py +2 -0
  29. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/player_model_test.py +1 -0
  30. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/sportsreference/sportsreference_player_model_test.py +1 -0
  31. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/sportsreference/sportsreference_team_model_test.py +3 -0
  32. {sportsball-0.3.15 → sportsball-0.3.17}/LICENSE +0 -0
  33. {sportsball-0.3.15 → sportsball-0.3.17}/MANIFEST.in +0 -0
  34. {sportsball-0.3.15 → sportsball-0.3.17}/requirements.txt +0 -0
  35. {sportsball-0.3.15 → sportsball-0.3.17}/setup.cfg +0 -0
  36. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/__main__.py +0 -0
  37. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/args.py +0 -0
  38. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/cache.py +0 -0
  39. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/__init__.py +0 -0
  40. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/address_model.py +0 -0
  41. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/afl/__init__.py +0 -0
  42. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/afl/afltables/__init__.py +0 -0
  43. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/afl/afltables/afl_afltables_game_model.py +0 -0
  44. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/afl/afltables/afl_afltables_team_model.py +0 -0
  45. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/afl/aussportsbetting/__init__.py +0 -0
  46. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/afl/aussportsbetting/afl_aussportsbetting_league_model.py +0 -0
  47. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/afl/combined/__init__.py +0 -0
  48. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/afl/combined/afl_combined_league_model.py +0 -0
  49. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/afl/espn/__init__.py +0 -0
  50. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/afl/espn/afl_espn_league_model.py +0 -0
  51. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/aussportsbetting/__init__.py +0 -0
  52. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/aussportsbetting/aussportsbetting_bookie_model.py +0 -0
  53. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/aussportsbetting/aussportsbetting_game_model.py +0 -0
  54. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/aussportsbetting/aussportsbetting_odds_model.py +0 -0
  55. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/aussportsbetting/aussportsbetting_team_model.py +0 -0
  56. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/aussportsbetting/aussportsbetting_venue_model.py +0 -0
  57. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/bookie_model.py +0 -0
  58. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/combined/__init__.py +0 -0
  59. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/combined/combined_address_model.py +0 -0
  60. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/combined/combined_game_model.py +0 -0
  61. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/combined/combined_team_model.py +0 -0
  62. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/combined/combined_venue_model.py +0 -0
  63. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/combined/combined_weather_model.py +0 -0
  64. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/espn/__init__.py +0 -0
  65. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/espn/espn_bookie_model.py +0 -0
  66. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/espn/espn_game_model.py +0 -0
  67. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/espn/espn_league_model.py +0 -0
  68. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/espn/espn_odds_model.py +0 -0
  69. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/espn/espn_team_model.py +0 -0
  70. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/espn/espn_venue_model.py +0 -0
  71. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/field_type.py +0 -0
  72. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/game_model.py +0 -0
  73. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/google/__init__.py +0 -0
  74. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/google/google_news_model.py +0 -0
  75. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/league.py +0 -0
  76. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/league_model.py +0 -0
  77. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/model.py +0 -0
  78. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/nba/__init__.py +0 -0
  79. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/nba/combined/__init__.py +0 -0
  80. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/nba/combined/nba_combined_league_model.py +0 -0
  81. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/nba/espn/__init__.py +0 -0
  82. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/nba/espn/nba_espn_league_model.py +0 -0
  83. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/nba/nba/__init__.py +0 -0
  84. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/nba/nba/nba_nba_game_model.py +0 -0
  85. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/nba/nba/nba_nba_league_model.py +0 -0
  86. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/nba/sportsdb/__init__.py +0 -0
  87. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/nba/sportsdb/nba_sportsdb_league_model.py +0 -0
  88. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/nba/sportsreference/__init__.py +0 -0
  89. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/nba/sportsreference/nba_sportsreference_league_model.py +0 -0
  90. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/ncaab/__init__.py +0 -0
  91. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/ncaab/combined/__init__.py +0 -0
  92. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/ncaab/combined/ncaab_combined_league_model.py +0 -0
  93. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/ncaab/espn/__init__.py +0 -0
  94. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/ncaab/espn/ncaab_espn_league_model.py +0 -0
  95. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/ncaab/sportsreference/__init__.py +0 -0
  96. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/ncaab/sportsreference/ncaab_sportsreference_league_model.py +0 -0
  97. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/ncaaf/__init__.py +0 -0
  98. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/ncaaf/espn/__init__.py +0 -0
  99. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/ncaaf/espn/ncaaf_espn_league_model.py +0 -0
  100. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/news_model.py +0 -0
  101. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/nfl/__init__.py +0 -0
  102. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/nfl/aussportsbetting/__init__.py +0 -0
  103. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/nfl/aussportsbetting/nfl_aussportsbetting_league_model.py +0 -0
  104. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/nfl/combined/__init__.py +0 -0
  105. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/nfl/combined/nfl_combined_league_model.py +0 -0
  106. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/nfl/espn/__init__.py +0 -0
  107. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/nfl/espn/nfl_espn_league_model.py +0 -0
  108. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/nfl/sportsdb/__init__.py +0 -0
  109. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/nfl/sportsdb/nfl_sportsdb_league_model.py +0 -0
  110. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/odds_model.py +0 -0
  111. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/season_type.py +0 -0
  112. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/social_model.py +0 -0
  113. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/sportsdb/__init__.py +0 -0
  114. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/sportsdb/sportsdb_game_model.py +0 -0
  115. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/sportsdb/sportsdb_team_model.py +0 -0
  116. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/sportsdb/sportsdb_venue_model.py +0 -0
  117. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/sportsreference/__init__.py +0 -0
  118. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/sportsreference/sportsreference_league_model.py +0 -0
  119. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/sportsreference/sportsreference_venue_model.py +0 -0
  120. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/venue_model.py +0 -0
  121. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/weather/__init__.py +0 -0
  122. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/weather/gribstream/__init__.py +0 -0
  123. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/weather/openmeteo/__init__.py +0 -0
  124. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/weather_model.py +0 -0
  125. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/wikipedia/__init__.py +0 -0
  126. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/wikipedia/wikipedia_venue_model.py +0 -0
  127. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/x/__init__.py +0 -0
  128. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/data/x/x_social_model.py +0 -0
  129. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/logger.py +0 -0
  130. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/loglevel.py +0 -0
  131. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/session.py +0 -0
  132. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball/sportsball.py +0 -0
  133. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball.egg-info/SOURCES.txt +0 -0
  134. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball.egg-info/dependency_links.txt +0 -0
  135. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball.egg-info/entry_points.txt +0 -0
  136. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball.egg-info/not-zip-safe +0 -0
  137. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball.egg-info/requires.txt +0 -0
  138. {sportsball-0.3.15 → sportsball-0.3.17}/sportsball.egg-info/top_level.txt +0 -0
  139. {sportsball-0.3.15 → sportsball-0.3.17}/tests/__init__.py +0 -0
  140. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/__init__.py +0 -0
  141. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/afl/__init__.py +0 -0
  142. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/afl/afltables/__init__.py +0 -0
  143. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/afl/afltables/afl_afltables_player_model_test.py +0 -0
  144. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/aussportsbetting/__init__.py +0 -0
  145. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/aussportsbetting/aussportsbetting_game_model_test.py +0 -0
  146. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/combined/__init__.py +0 -0
  147. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/combined/combined_game_model_test.py +0 -0
  148. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/espn/__init__.py +0 -0
  149. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/espn/espn_game_model_test.py +0 -0
  150. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/espn/espn_player_model_test.py +0 -0
  151. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/game_model_test.py +0 -0
  152. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/google/__init__.py +0 -0
  153. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/google/google_address_model_test.py +0 -0
  154. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/google/google_news_model_test.py +0 -0
  155. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/nba/__init__.py +0 -0
  156. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/nba/nba/__init__.py +0 -0
  157. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/nba/nba/nba_nba_league_model_test.py +0 -0
  158. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/nba/nba/nba_nba_player_model_test.py +0 -0
  159. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/nba/sportsdb/__init__.py +0 -0
  160. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/nba/sportsdb/nba_sportsdb_league_model_test.py +0 -0
  161. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/nba/sportsreference/__init__.py +0 -0
  162. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/nba/sportsreference/nba_sportsreference_league_model_test.py +0 -0
  163. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/ncaab/__init__.py +0 -0
  164. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/ncaab/sportsreference/__init__.py +0 -0
  165. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/ncaab/sportsreference/ncaab_sportsreference_league_model_test.py +0 -0
  166. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/nfl/__init__.py +0 -0
  167. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/nfl/sportsdb/__init__.py +0 -0
  168. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/nfl/sportsdb/nfl_sportsdb_league_model_test.py +0 -0
  169. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/social_model_test.py +0 -0
  170. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/sportsdb/__init__.py +0 -0
  171. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/sportsdb/sportsdb_game_model_test.py +0 -0
  172. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/sportsdb/sportsdb_league_model_test.py +0 -0
  173. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/sportsdb/sportsdb_team_model_test.py +0 -0
  174. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/sportsdb/sportsdb_venue_model_test.py +0 -0
  175. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/sportsreference/__init__.py +0 -0
  176. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/sportsreference/sportsreference_game_model_test.py +0 -0
  177. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/sportsreference/sportsreference_league_model_test.py +0 -0
  178. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/sportsreference/sportsreference_venue_model_test.py +0 -0
  179. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/team_model_test.py +0 -0
  180. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/x/__init__.py +0 -0
  181. {sportsball-0.3.15 → sportsball-0.3.17}/tests/data/x/x_social_model_test.py +0 -0
  182. {sportsball-0.3.15 → sportsball-0.3.17}/tests/proxy_session_test.py +0 -0
  183. {sportsball-0.3.15 → sportsball-0.3.17}/tests/sportsball_test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: sportsball
3
- Version: 0.3.15
3
+ Version: 0.3.17
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
@@ -164,6 +164,7 @@ A representation of a team within a game.
164
164
  * **field_goals**: The sum of the field goals made by the team in the game.
165
165
  * **field_goals_attempted**: The sum of the field goals attempted by the team in the game.
166
166
  * **offensive_rebounds**: The number of rebounds during offense by the team in the game.
167
+ * **assists**: The number of times the player on the team made a pass that resulted in a field goal in the game.
167
168
 
168
169
  #### Player
169
170
 
@@ -177,6 +178,7 @@ A representation of a player within a team within a game.
177
178
  * **field_goals**: The number of field goals the player made in the game.
178
179
  * **field_goals_attempted**: The number of field goal attempts the player made in the game.
179
180
  * **offensive_rebounds**: The number of rebounds during offense by the player made in the game.
181
+ * **assists**: The number of times the player made a pass that resulted in a field goal in the game.
180
182
 
181
183
  #### Odds
182
184
 
@@ -242,7 +244,7 @@ Social media posts one day out from the game.
242
244
  This library uses very aggressive caching due to the large data requirements. If the requests are about a recent game (generally in the last 7 days) the caching is bypassed. The caching is as follows:
243
245
 
244
246
  1. A joblib disk cache that caches calls to pydantic model creation functions. This changes on every version update to keep the models in sync. This is the fastest cache.
245
- 2. A requests cache backed by sqlite that caches requests for 1 year.
247
+ 2. A requests cache backed by sqlite that caches requests forever.
246
248
  3. An attempt to find the response is made to the wayback machine, and used if found.
247
249
 
248
250
  It's very recommended that the user uses proxies defined in the `PROXIES` environment variable. The more proxies the easier it is to collect data.
@@ -111,6 +111,7 @@ A representation of a team within a game.
111
111
  * **field_goals**: The sum of the field goals made by the team in the game.
112
112
  * **field_goals_attempted**: The sum of the field goals attempted by the team in the game.
113
113
  * **offensive_rebounds**: The number of rebounds during offense by the team in the game.
114
+ * **assists**: The number of times the player on the team made a pass that resulted in a field goal in the game.
114
115
 
115
116
  #### Player
116
117
 
@@ -124,6 +125,7 @@ A representation of a player within a team within a game.
124
125
  * **field_goals**: The number of field goals the player made in the game.
125
126
  * **field_goals_attempted**: The number of field goal attempts the player made in the game.
126
127
  * **offensive_rebounds**: The number of rebounds during offense by the player made in the game.
128
+ * **assists**: The number of times the player made a pass that resulted in a field goal in the game.
127
129
 
128
130
  #### Odds
129
131
 
@@ -189,7 +191,7 @@ Social media posts one day out from the game.
189
191
  This library uses very aggressive caching due to the large data requirements. If the requests are about a recent game (generally in the last 7 days) the caching is bypassed. The caching is as follows:
190
192
 
191
193
  1. A joblib disk cache that caches calls to pydantic model creation functions. This changes on every version update to keep the models in sync. This is the fastest cache.
192
- 2. A requests cache backed by sqlite that caches requests for 1 year.
194
+ 2. A requests cache backed by sqlite that caches requests forever.
193
195
  3. An attempt to find the response is made to the wayback machine, and used if found.
194
196
 
195
197
  It's very recommended that the user uses proxies defined in the `PROXIES` environment variable. The more proxies the easier it is to collect data.
@@ -23,7 +23,7 @@ def install_requires() -> typing.List[str]:
23
23
 
24
24
  setup(
25
25
  name='sportsball',
26
- version='0.3.15',
26
+ version='0.3.17',
27
27
  description='A library for pulling in and normalising sports stats.',
28
28
  long_description=long_description,
29
29
  long_description_content_type='text/markdown',
@@ -1,3 +1,3 @@
1
1
  """The main module for sportsball."""
2
2
 
3
- __VERSION__ = "0.3.15"
3
+ __VERSION__ = "0.3.17"
@@ -1,5 +1,7 @@
1
1
  """AFL AFLTables league model."""
2
2
 
3
+ # pylint: disable=too-many-statements
4
+ import datetime
3
5
  import os
4
6
  import urllib.parse
5
7
  from typing import Iterator
@@ -34,7 +36,12 @@ class AFLAFLTablesLeagueModel(LeagueModel):
34
36
  filename, _ = os.path.splitext(last_component)
35
37
  year = int(filename)
36
38
 
37
- response = self.session.get(season_url)
39
+ if year < datetime.datetime.now().year - 1:
40
+ with self.session.cache_disabled():
41
+ response = self.session.get(season_url)
42
+ else:
43
+ response = self.session.get(season_url)
44
+
38
45
  soup = BeautifulSoup(response.text, "html.parser")
39
46
  in_finals = False
40
47
  game_number = 0
@@ -28,6 +28,7 @@ def _create_afl_afltables_player_model(
28
28
  field_goals=None,
29
29
  field_goals_attempted=None,
30
30
  offensive_rebounds=None,
31
+ assists=None,
31
32
  )
32
33
 
33
34
 
@@ -4,6 +4,7 @@ import datetime
4
4
  import os
5
5
  from urllib.parse import urlparse
6
6
 
7
+ import pytest_is_running
7
8
  import requests_cache
8
9
  from bs4 import BeautifulSoup
9
10
 
@@ -12,11 +13,9 @@ from ...google.google_address_model import create_google_address_model
12
13
  from ...venue_model import VenueModel
13
14
 
14
15
 
15
- @MEMORY.cache(ignore=["session"])
16
- def create_afl_afltables_venue_model(
16
+ def _create_afl_afltables_venue_model(
17
17
  url: str, session: requests_cache.CachedSession, dt: datetime.datetime
18
18
  ) -> VenueModel:
19
- """Create a venue model from AFL tables."""
20
19
  o = urlparse(url)
21
20
  last_component = o.path.split("/")[-1]
22
21
  identifier, _ = os.path.splitext(last_component)
@@ -35,3 +34,23 @@ def create_afl_afltables_venue_model(
35
34
  is_grass=None,
36
35
  is_indoor=None,
37
36
  )
37
+
38
+
39
+ @MEMORY.cache(ignore=["session"])
40
+ def _cached_create_afl_afltables_venue_model(
41
+ url: str, session: requests_cache.CachedSession, dt: datetime.datetime
42
+ ) -> VenueModel:
43
+ return _create_afl_afltables_venue_model(url, session, dt)
44
+
45
+
46
+ def create_afl_afltables_venue_model(
47
+ url: str, session: requests_cache.CachedSession, dt: datetime.datetime
48
+ ) -> VenueModel:
49
+ """Create a venue model from AFL tables."""
50
+ if (
51
+ not pytest_is_running.is_running()
52
+ and dt < datetime.datetime.now() - datetime.timedelta(days=7)
53
+ ):
54
+ return _cached_create_afl_afltables_venue_model(url, session, dt)
55
+ with session.cache_disabled():
56
+ return _create_afl_afltables_venue_model(url, session, dt)
@@ -88,7 +88,8 @@ class AusSportsBettingLeagueModel(LeagueModel):
88
88
 
89
89
  @property
90
90
  def games(self) -> Iterator[GameModel]:
91
- response = self.session.get(self._spreadsheet_url)
91
+ with self.session.cache_disabled():
92
+ response = self.session.get(self._spreadsheet_url)
92
93
  response.raise_for_status()
93
94
  workbook = load_workbook(filename=BytesIO(response.content))
94
95
  ws = workbook.active
@@ -1,9 +1,10 @@
1
1
  """Combined league model."""
2
2
 
3
+ # pylint: disable=raise-missing-from
3
4
  import logging
4
5
  import multiprocessing
5
6
  from multiprocessing import Pool
6
- from typing import Iterator
7
+ from typing import Any, Iterator
7
8
 
8
9
  import requests_cache
9
10
 
@@ -14,9 +15,13 @@ from ..league_model import LeagueModel
14
15
  from .combined_game_model import create_combined_game_model
15
16
 
16
17
 
17
- def _produce_league_games(league_model: LeagueModel) -> list[GameModel]:
18
+ def _produce_league_games(league_model: LeagueModel) -> list[dict[str, Any]]:
18
19
  setup_logger()
19
- return list(league_model.games)
20
+ try:
21
+ return [x.model_dump() for x in league_model.games]
22
+ except Exception as exc:
23
+ logging.error("Exception: %s", str(exc))
24
+ raise ValueError(str(exc))
20
25
 
21
26
 
22
27
  class CombinedLeagueModel(LeagueModel):
@@ -52,7 +57,20 @@ class CombinedLeagueModel(LeagueModel):
52
57
  for league_model in self._league_models:
53
58
  league_model.clear_session()
54
59
  with Pool(min(multiprocessing.cpu_count(), len(self._league_models))) as p:
55
- game_lists = p.map(_produce_league_games, self._league_models)
60
+ # We want to terminate immediately if any of our runners runs into trouble.
61
+ def _error_callback(exc: BaseException) -> None:
62
+ p.terminate()
63
+ raise ValueError(str(exc))
64
+
65
+ results = [
66
+ p.apply_async(
67
+ _produce_league_games, args=(x,), error_callback=_error_callback
68
+ )
69
+ for x in self._league_models
70
+ ]
71
+ game_lists = [
72
+ [GameModel.model_validate(y) for y in x.get()] for x in results
73
+ ]
56
74
 
57
75
  for game_list in game_lists:
58
76
  for game_model in game_list:
@@ -15,6 +15,7 @@ def create_combined_player_model(
15
15
  field_goals = None
16
16
  field_goals_attempted = None
17
17
  offensive_rebounds = None
18
+ assists = None
18
19
  for player_model in player_models:
19
20
  player_model_jersey = player_model.jersey
20
21
  if player_model_jersey is not None:
@@ -37,6 +38,9 @@ def create_combined_player_model(
37
38
  player_model_offensive_rebounds = player_model.offensive_rebounds
38
39
  if player_model_offensive_rebounds is not None:
39
40
  offensive_rebounds = player_model_offensive_rebounds
41
+ player_model_assists = player_model.assists
42
+ if player_model_assists is not None:
43
+ assists = player_model_assists
40
44
  return PlayerModel(
41
45
  identifier=identifier,
42
46
  jersey=jersey,
@@ -46,4 +50,5 @@ def create_combined_player_model(
46
50
  field_goals=field_goals,
47
51
  field_goals_attempted=field_goals_attempted,
48
52
  offensive_rebounds=offensive_rebounds,
53
+ assists=assists,
49
54
  )
@@ -37,6 +37,7 @@ def _create_espn_player_model(
37
37
  field_goals=None,
38
38
  field_goals_attempted=None,
39
39
  offensive_rebounds=None,
40
+ assists=None,
40
41
  )
41
42
 
42
43
 
@@ -973,6 +973,60 @@ GOLDEN_1_CENTER = SportsballGeocodeTuple(
973
973
  housenumber="500",
974
974
  country="USA",
975
975
  )
976
+ DELTA_CENTER = SportsballGeocodeTuple(
977
+ city="Salt Lake City",
978
+ state="UT",
979
+ postal="",
980
+ lat=40.768333,
981
+ lng=-111.901111,
982
+ housenumber="301",
983
+ country="USA",
984
+ )
985
+ ATT_CENTER = SportsballGeocodeTuple(
986
+ city="San Antonio",
987
+ state="TX",
988
+ postal="",
989
+ lat=29.426944,
990
+ lng=-98.4375,
991
+ housenumber="1",
992
+ country="USA",
993
+ )
994
+ FTX_ARENA = SportsballGeocodeTuple(
995
+ city="Miami",
996
+ state="FL",
997
+ postal="",
998
+ lat=25.781389,
999
+ lng=-80.188056,
1000
+ housenumber="601",
1001
+ country="USA",
1002
+ )
1003
+ VIVINT_ARENA = SportsballGeocodeTuple(
1004
+ city="Salt Lake City",
1005
+ state="UT",
1006
+ postal="",
1007
+ lat=40.768333,
1008
+ lng=-111.901111,
1009
+ housenumber="301",
1010
+ country="USA",
1011
+ )
1012
+ CHESAPEAKE_ENERGY_ARENA = SportsballGeocodeTuple(
1013
+ city="Oklahoma City",
1014
+ state="OK",
1015
+ postal="",
1016
+ lat=35.463333,
1017
+ lng=-97.515,
1018
+ housenumber="100",
1019
+ country="USA",
1020
+ )
1021
+ ESPN_WIDE_WORLD_OF_SPORTS_COMPLEX = SportsballGeocodeTuple(
1022
+ city="Lake Buena Vista",
1023
+ state="FL",
1024
+ postal="32830",
1025
+ lat=28.337083,
1026
+ lng=-81.556,
1027
+ housenumber="1375",
1028
+ country="USA",
1029
+ )
976
1030
  _CACHED_GEOCODES: dict[str, Any] = {
977
1031
  "S.C.G. - Australia": SCG,
978
1032
  "Victoria Park - Australia": SportsballGeocodeTuple(
@@ -6288,15 +6342,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
6288
6342
  housenumber="200",
6289
6343
  country="USA",
6290
6344
  ),
6291
- "Vivint Arena, Salt Lake City, Utah": SportsballGeocodeTuple(
6292
- city="Salt Lake City",
6293
- state="UT",
6294
- postal="",
6295
- lat=40.768333,
6296
- lng=-111.901111,
6297
- housenumber="301",
6298
- country="USA",
6299
- ),
6345
+ "Vivint Arena, Salt Lake City, Utah": VIVINT_ARENA,
6300
6346
  "Rock Hill Sports & Event Center, Rock Hill, South Carolina": SportsballGeocodeTuple(
6301
6347
  city="Rock Hill",
6302
6348
  state="SC",
@@ -6487,24 +6533,8 @@ _CACHED_GEOCODES: dict[str, Any] = {
6487
6533
  "Pepsi Center - Denver, Colorado, U.S. - United States": PEPSI_CENTRE,
6488
6534
  "Staples Center": STAPLES_CENTRE,
6489
6535
  "American Airlines Arena": AMERICAN_AIRLINES_ARENA,
6490
- "Chesapeake Energy Arena - Oklahoma City, Oklahoma - United States": SportsballGeocodeTuple(
6491
- city="Oklahoma City",
6492
- state="OK",
6493
- postal="",
6494
- lat=35.463333,
6495
- lng=-97.515,
6496
- housenumber="100",
6497
- country="USA",
6498
- ),
6499
- "AT&T Center - San Antonio, Texas - United States": SportsballGeocodeTuple(
6500
- city="San Antonio",
6501
- state="TX",
6502
- postal="",
6503
- lat=29.426944,
6504
- lng=-98.4375,
6505
- housenumber="1",
6506
- country="USA",
6507
- ),
6536
+ "Chesapeake Energy Arena - Oklahoma City, Oklahoma - United States": CHESAPEAKE_ENERGY_ARENA,
6537
+ "AT&T Center - San Antonio, Texas - United States": ATT_CENTER,
6508
6538
  "Oakland Arena - Oakland, California - United States": SportsballGeocodeTuple(
6509
6539
  city="Oakland",
6510
6540
  state="CA",
@@ -6514,15 +6544,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
6514
6544
  housenumber="7000",
6515
6545
  country="USA",
6516
6546
  ),
6517
- "ESPN Wide World of Sports Complex": SportsballGeocodeTuple(
6518
- city="Lake Buena Vista",
6519
- state="FL",
6520
- postal="32830",
6521
- lat=28.337083,
6522
- lng=-81.556,
6523
- housenumber="1375",
6524
- country="USA",
6525
- ),
6547
+ "ESPN Wide World of Sports Complex": ESPN_WIDE_WORLD_OF_SPORTS_COMPLEX,
6526
6548
  "International Amphitheatre": SportsballGeocodeTuple(
6527
6549
  city="Chicago",
6528
6550
  state="IL",
@@ -6798,15 +6820,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
6798
6820
  ),
6799
6821
  "Target Center - Minneapolis, Minnesota - United States": TARGET_CENTER,
6800
6822
  "Thomas & Mack Center - Paradise, NV - United States": THOMAS_AND_MACK_CENTER,
6801
- "Delta Center - Salt Lake City, Utah - United States": SportsballGeocodeTuple(
6802
- city="Salt Lake City",
6803
- state="UT",
6804
- postal="",
6805
- lat=40.768333,
6806
- lng=-111.901111,
6807
- housenumber="301",
6808
- country="USA",
6809
- ),
6823
+ "Delta Center - Salt Lake City, Utah - United States": DELTA_CENTER,
6810
6824
  "Yokohama Arena": SportsballGeocodeTuple(
6811
6825
  city="Kanagawa",
6812
6826
  state="",
@@ -6829,15 +6843,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
6829
6843
  "Amway Arena": ORLANDO_ARENA,
6830
6844
  "TD Garden - Boston, Massachusetts - United States": TD_GARDEN,
6831
6845
  "American Airlines Center - Dallas, Texas, USA - United States": AMERICAN_AIRLINES_ARENA,
6832
- "FTX Arena": SportsballGeocodeTuple(
6833
- city="Miami",
6834
- state="FL",
6835
- postal="",
6836
- lat=25.781389,
6837
- lng=-80.188056,
6838
- housenumber="601",
6839
- country="USA",
6840
- ),
6846
+ "FTX Arena": FTX_ARENA,
6841
6847
  "Rose Garden": SportsballGeocodeTuple(
6842
6848
  city="Portland",
6843
6849
  state="OR",
@@ -6981,6 +6987,13 @@ _CACHED_GEOCODES: dict[str, Any] = {
6981
6987
  housenumber="3930",
6982
6988
  country="USA",
6983
6989
  ),
6990
+ "Delta Center, Salt Lake City, Utah": DELTA_CENTER,
6991
+ "AT&T Center, San Antonio, Texas": ATT_CENTER,
6992
+ "FTX Arena, Miami, Florida": FTX_ARENA,
6993
+ "Vivint Smart Home Arena, Salt Lake City, Utah": VIVINT_ARENA,
6994
+ "Chesapeake Energy Arena, Oklahoma City, Oklahoma": CHESAPEAKE_ENERGY_ARENA,
6995
+ "The Arena, Bay Lake, Florida": ESPN_WIDE_WORLD_OF_SPORTS_COMPLEX,
6996
+ "HP Field House, Bay Lake, Florida": ESPN_WIDE_WORLD_OF_SPORTS_COMPLEX,
6984
6997
  }
6985
6998
 
6986
6999
 
@@ -37,6 +37,7 @@ def _create_nba_nba_player_model(
37
37
  field_goals=None,
38
38
  field_goals_attempted=None,
39
39
  offensive_rebounds=None,
40
+ assists=None,
40
41
  )
41
42
 
42
43
 
@@ -48,6 +48,7 @@ def _create_nba_nba_team_model(
48
48
  field_goals=row["FGM" + suffix],
49
49
  field_goals_attempted=row["FGA" + suffix],
50
50
  offensive_rebounds=row["OREB" + suffix],
51
+ assists=row["AST" + suffix],
51
52
  )
52
53
 
53
54
 
@@ -13,6 +13,7 @@ PLAYER_FUMBLES_LOST_COLUMN: Literal["fumbles_lost"] = "fumbles_lost"
13
13
  FIELD_GOALS_COLUMN: Literal["field_goals"] = "field_goals"
14
14
  FIELD_GOALS_ATTEMPTED_COLUMN: Literal["field_goals_attempted"] = "field_goals_attempted"
15
15
  OFFENSIVE_REBOUNDS_COLUMN: Literal["offensive_rebounds"] = "offensive_rebounds"
16
+ ASSISTS_COLUMN: Literal["assists"] = "assists"
16
17
 
17
18
 
18
19
  class PlayerModel(BaseModel):
@@ -54,3 +55,8 @@ class PlayerModel(BaseModel):
54
55
  json_schema_extra={TYPE_KEY: FieldType.LOOKAHEAD},
55
56
  alias=OFFENSIVE_REBOUNDS_COLUMN,
56
57
  )
58
+ assists: int | None = Field(
59
+ ...,
60
+ json_schema_extra={TYPE_KEY: FieldType.LOOKAHEAD},
61
+ alias=ASSISTS_COLUMN,
62
+ )
@@ -103,18 +103,19 @@ class SportsDBLeagueModel(LeagueModel):
103
103
  except ValueError:
104
104
  pass
105
105
  case SeasonType.REGULAR:
106
- try:
107
- for count, round_str in enumerate(range(1, 125)):
108
- yield from self._produce_games(
109
- str(round_str),
110
- count,
111
- self._league_id,
112
- season_year,
113
- season_type,
114
- pbar,
115
- )
116
- except ValueError:
117
- pass
106
+ if self.league != League.NBA:
107
+ try:
108
+ for count, round_str in enumerate(range(1, 125)):
109
+ yield from self._produce_games(
110
+ str(round_str),
111
+ count,
112
+ self._league_id,
113
+ season_year,
114
+ season_type,
115
+ pbar,
116
+ )
117
+ except ValueError:
118
+ pass
118
119
  case SeasonType.POSTSEASON:
119
120
  for count, round_str in enumerate(
120
121
  [125, 150, 160, 170, 180, 200]
@@ -1,12 +1,12 @@
1
1
  """Sports Reference game model."""
2
2
 
3
- # pylint: disable=too-many-locals,too-many-statements,unused-argument
3
+ # pylint: disable=too-many-locals,too-many-statements,unused-argument,protected-access
4
4
  import datetime
5
5
  import io
6
6
  import logging
7
- import time
8
7
  import urllib.parse
9
8
 
9
+ import dateutil
10
10
  import pandas as pd
11
11
  import pytest_is_running
12
12
  import requests_cache
@@ -36,10 +36,19 @@ def _create_sportsreference_game_model(
36
36
  raise ValueError("scorebox_meta_div is not a Tag.")
37
37
 
38
38
  in_divs = scorebox_meta_div.find_all("div")
39
- in_div = in_divs[0]
39
+ current_in_div_idx = 0
40
+ in_div = in_divs[current_in_div_idx]
40
41
  in_div_text = in_div.get_text().strip()
41
- dt = parse(in_div_text)
42
- venue_div = in_divs[1]
42
+ current_in_div_idx += 1
43
+ if "Tournament" in in_div_text:
44
+ in_div_text = in_divs[1].get_text().strip()
45
+ current_in_div_idx += 1
46
+ try:
47
+ dt = parse(in_div_text)
48
+ except dateutil.parser._parser.ParserError as exc: # type: ignore
49
+ logging.error("Failed to parse date for URL: %s", url)
50
+ raise exc
51
+ venue_div = in_divs[current_in_div_idx]
43
52
  venue_name = venue_div.get_text().strip()
44
53
  scorebox_div = soup.find("div", class_="scorebox")
45
54
  if not isinstance(scorebox_div, Tag):
@@ -62,6 +71,7 @@ def _create_sportsreference_game_model(
62
71
  fg = {}
63
72
  fga = {}
64
73
  offensive_rebounds = {}
74
+ assists = {}
65
75
  for df in dfs:
66
76
  if df.index.nlevels > 1:
67
77
  df.columns = df.columns.get_level_values(1)
@@ -79,6 +89,10 @@ def _create_sportsreference_game_model(
79
89
  orebs = df["OREB"].tolist()
80
90
  for idx, player in enumerate(players):
81
91
  offensive_rebounds[player] = orebs[idx]
92
+ if "AST" in df.columns.values:
93
+ asts = df["AST"].tolist()
94
+ for idx, player in enumerate(players):
95
+ assists[player] = asts[idx]
82
96
 
83
97
  teams: list[TeamModel] = []
84
98
  for a in scorebox_div.find_all("a"):
@@ -95,6 +109,7 @@ def _create_sportsreference_game_model(
95
109
  fg,
96
110
  fga,
97
111
  offensive_rebounds,
112
+ assists,
98
113
  )
99
114
  )
100
115
 
@@ -3,6 +3,7 @@
3
3
  # pylint: disable=too-many-arguments,unused-argument
4
4
  import datetime
5
5
  import http
6
+ import logging
6
7
  from urllib.parse import unquote
7
8
 
8
9
  import pytest_is_running
@@ -26,18 +27,21 @@ def _create_sportsreference_player_model(
26
27
  fg: dict[str, int],
27
28
  fga: dict[str, int],
28
29
  offensive_rebounds: dict[str, int],
30
+ assists: dict[str, int],
29
31
  ) -> PlayerModel | None:
30
32
  """Create a player model from NCAAB sports reference."""
31
33
  player_url = _fix_url(player_url)
32
34
  response = session.get(player_url, timeout=DEFAULT_TIMEOUT)
33
35
  # Some players can't be accessed on sports reference
34
36
  if response.status_code == http.HTTPStatus.FORBIDDEN:
37
+ logging.warning("Cannot access player at URL %s", player_url)
35
38
  return None
36
39
  response.raise_for_status()
37
40
  soup = BeautifulSoup(response.text, "html.parser")
38
41
  h1 = soup.find("h1")
39
42
  if h1 is None:
40
- raise ValueError("h1 is null.")
43
+ logging.warning("h1 is null for %s", player_url)
44
+ return None
41
45
  name = h1.get_text().strip()
42
46
  return PlayerModel(
43
47
  identifier=name,
@@ -48,6 +52,7 @@ def _create_sportsreference_player_model(
48
52
  field_goals=fg.get(name),
49
53
  field_goals_attempted=fga.get(name),
50
54
  offensive_rebounds=offensive_rebounds.get(name),
55
+ assists=assists.get(name),
51
56
  )
52
57
 
53
58
 
@@ -58,9 +63,10 @@ def _cached_create_sportsreference_player_model(
58
63
  fg: dict[str, int],
59
64
  fga: dict[str, int],
60
65
  offensive_rebounds: dict[str, int],
66
+ assists: dict[str, int],
61
67
  ) -> PlayerModel | None:
62
68
  return _create_sportsreference_player_model(
63
- session, player_url, fg, fga, offensive_rebounds
69
+ session, player_url, fg, fga, offensive_rebounds, assists
64
70
  )
65
71
 
66
72
 
@@ -71,13 +77,14 @@ def create_sportsreference_player_model(
71
77
  fg: dict[str, int],
72
78
  fga: dict[str, int],
73
79
  offensive_rebounds: dict[str, int],
80
+ assists: dict[str, int],
74
81
  ) -> PlayerModel | None:
75
82
  """Create a player model from sports reference."""
76
83
  if not pytest_is_running.is_running():
77
84
  return _cached_create_sportsreference_player_model(
78
- session, player_url, fg, fga, offensive_rebounds
85
+ session, player_url, fg, fga, offensive_rebounds, assists
79
86
  )
80
87
  with session.cache_disabled():
81
88
  return _create_sportsreference_player_model(
82
- session, player_url, fg, fga, offensive_rebounds
89
+ session, player_url, fg, fga, offensive_rebounds, assists
83
90
  )