sportsball 0.3.43__tar.gz → 0.3.45__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. {sportsball-0.3.43/sportsball.egg-info → sportsball-0.3.45}/PKG-INFO +1 -1
  2. {sportsball-0.3.43 → sportsball-0.3.45}/setup.py +1 -1
  3. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/__init__.py +1 -1
  4. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/address_model.py +7 -2
  5. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/afl/afl/afl_afl_game_model.py +1 -1
  6. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/afl/afl/afl_afl_league_model.py +7 -3
  7. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/afl/afl/afl_afl_player_model.py +2 -0
  8. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/afl/afl/afl_afl_team_model.py +5 -3
  9. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/afl/afltables/afl_afltables_game_model.py +14 -4
  10. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/afl/afltables/afl_afltables_player_model.py +13 -6
  11. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/afl/afltables/afl_afltables_team_model.py +7 -5
  12. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/afl/combined/afl_combined_league_model.py +13 -2
  13. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/combined/combined_game_model.py +7 -3
  14. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/combined/combined_league_model.py +2 -0
  15. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/combined/combined_player_model.py +7 -0
  16. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/combined/combined_team_model.py +14 -10
  17. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/espn/espn_player_model.py +5 -0
  18. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/google/google_address_model.py +194 -27
  19. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nba/nba/nba_nba_team_model.py +1 -7
  20. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/player_model.py +1 -0
  21. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/sportsreference/sportsreference_player_model.py +1 -0
  22. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/venue_model.py +2 -1
  23. {sportsball-0.3.43 → sportsball-0.3.45/sportsball.egg-info}/PKG-INFO +1 -1
  24. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball.egg-info/SOURCES.txt +0 -2
  25. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/afl/afltables/afl_afltables_player_model_test.py +1 -0
  26. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/combined/combined_game_model_test.py +2 -0
  27. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/combined/combined_player_model_test.py +1 -0
  28. sportsball-0.3.45/tests/data/espn/espn_player_model_test.py +52 -0
  29. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/player_model_test.py +1 -0
  30. sportsball-0.3.43/sportsball/data/nba/nba/nba_nba_player_model.py +0 -64
  31. sportsball-0.3.43/tests/data/espn/espn_player_model_test.py +0 -29
  32. sportsball-0.3.43/tests/data/nba/nba/nba_nba_player_model_test.py +0 -30
  33. {sportsball-0.3.43 → sportsball-0.3.45}/LICENSE +0 -0
  34. {sportsball-0.3.43 → sportsball-0.3.45}/MANIFEST.in +0 -0
  35. {sportsball-0.3.43 → sportsball-0.3.45}/README.md +0 -0
  36. {sportsball-0.3.43 → sportsball-0.3.45}/requirements.txt +0 -0
  37. {sportsball-0.3.43 → sportsball-0.3.45}/setup.cfg +0 -0
  38. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/__main__.py +0 -0
  39. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/args.py +0 -0
  40. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/cache.py +0 -0
  41. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/__init__.py +0 -0
  42. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/afl/__init__.py +0 -0
  43. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/afl/afl/__init__.py +0 -0
  44. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/afl/afl/afl_afl_venue_model.py +0 -0
  45. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/afl/afltables/__init__.py +0 -0
  46. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/afl/afltables/afl_afltables_league_model.py +0 -0
  47. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/afl/afltables/afl_afltables_venue_model.py +0 -0
  48. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/afl/aussportsbetting/__init__.py +0 -0
  49. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/afl/aussportsbetting/afl_aussportsbetting_league_model.py +0 -0
  50. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/afl/combined/__init__.py +0 -0
  51. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/afl/espn/__init__.py +0 -0
  52. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/afl/espn/afl_espn_league_model.py +0 -0
  53. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/afl/oddsportal/__init__.py +0 -0
  54. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/afl/oddsportal/afl_oddsportal_league_model.py +0 -0
  55. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/aussportsbetting/__init__.py +0 -0
  56. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/aussportsbetting/aussportsbetting_bookie_model.py +0 -0
  57. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/aussportsbetting/aussportsbetting_game_model.py +0 -0
  58. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/aussportsbetting/aussportsbetting_league_model.py +0 -0
  59. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/aussportsbetting/aussportsbetting_odds_model.py +0 -0
  60. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/aussportsbetting/aussportsbetting_team_model.py +0 -0
  61. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/aussportsbetting/aussportsbetting_venue_model.py +0 -0
  62. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/bookie_model.py +0 -0
  63. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/combined/__init__.py +0 -0
  64. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/combined/combined_address_model.py +0 -0
  65. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/combined/combined_venue_model.py +0 -0
  66. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/combined/combined_weather_model.py +0 -0
  67. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/espn/__init__.py +0 -0
  68. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/espn/espn_bookie_model.py +0 -0
  69. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/espn/espn_game_model.py +0 -0
  70. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/espn/espn_league_model.py +0 -0
  71. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/espn/espn_odds_model.py +0 -0
  72. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/espn/espn_team_model.py +0 -0
  73. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/espn/espn_venue_model.py +0 -0
  74. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/field_type.py +0 -0
  75. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/game_model.py +0 -0
  76. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/google/__init__.py +0 -0
  77. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/google/google_news_model.py +0 -0
  78. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/league.py +0 -0
  79. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/league_model.py +0 -0
  80. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/model.py +0 -0
  81. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nba/__init__.py +0 -0
  82. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nba/combined/__init__.py +0 -0
  83. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nba/combined/nba_combined_league_model.py +0 -0
  84. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nba/espn/__init__.py +0 -0
  85. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nba/espn/nba_espn_league_model.py +0 -0
  86. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nba/nba/__init__.py +0 -0
  87. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nba/nba/nba_nba_game_model.py +0 -0
  88. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nba/nba/nba_nba_league_model.py +0 -0
  89. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nba/oddsportal/__init__.py +0 -0
  90. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nba/oddsportal/nba_oddsportal_league_model.py +0 -0
  91. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nba/sportsdb/__init__.py +0 -0
  92. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nba/sportsdb/nba_sportsdb_league_model.py +0 -0
  93. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nba/sportsreference/__init__.py +0 -0
  94. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nba/sportsreference/nba_sportsreference_league_model.py +0 -0
  95. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/ncaab/__init__.py +0 -0
  96. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/ncaab/combined/__init__.py +0 -0
  97. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/ncaab/combined/ncaab_combined_league_model.py +0 -0
  98. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/ncaab/espn/__init__.py +0 -0
  99. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/ncaab/espn/ncaab_espn_league_model.py +0 -0
  100. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/ncaab/oddsportal/__init__.py +0 -0
  101. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/ncaab/oddsportal/ncaab_oddsportal_league_model.py +0 -0
  102. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/ncaab/sportsreference/__init__.py +0 -0
  103. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/ncaab/sportsreference/ncaab_sportsreference_league_model.py +0 -0
  104. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/ncaaf/__init__.py +0 -0
  105. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/ncaaf/combined/__init__.py +0 -0
  106. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/ncaaf/combined/ncaaf_combined_league_model.py +0 -0
  107. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/ncaaf/espn/__init__.py +0 -0
  108. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/ncaaf/espn/ncaaf_espn_league_model.py +0 -0
  109. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/ncaaf/oddsportal/__init__.py +0 -0
  110. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/ncaaf/oddsportal/ncaaf_oddsportal_league_model.py +0 -0
  111. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/news_model.py +0 -0
  112. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nfl/__init__.py +0 -0
  113. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nfl/aussportsbetting/__init__.py +0 -0
  114. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nfl/aussportsbetting/nfl_aussportsbetting_league_model.py +0 -0
  115. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nfl/combined/__init__.py +0 -0
  116. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nfl/combined/nfl_combined_league_model.py +0 -0
  117. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nfl/espn/__init__.py +0 -0
  118. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nfl/espn/nfl_espn_league_model.py +0 -0
  119. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nfl/oddsportal/__init__.py +0 -0
  120. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nfl/oddsportal/nfl_oddsportal_league_model.py +0 -0
  121. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nfl/sportsdb/__init__.py +0 -0
  122. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/nfl/sportsdb/nfl_sportsdb_league_model.py +0 -0
  123. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/odds_model.py +0 -0
  124. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/oddsportal/__init__.py +0 -0
  125. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/oddsportal/decrypt.py +0 -0
  126. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/oddsportal/oddsportal_bookie_model.py +0 -0
  127. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/oddsportal/oddsportal_game_model.py +0 -0
  128. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/oddsportal/oddsportal_league_model.py +0 -0
  129. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/oddsportal/oddsportal_odds_model.py +0 -0
  130. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/oddsportal/oddsportal_team_model.py +0 -0
  131. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/oddsportal/oddsportal_venue_model.py +0 -0
  132. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/season_type.py +0 -0
  133. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/social_model.py +0 -0
  134. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/sportsdb/__init__.py +0 -0
  135. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/sportsdb/sportsdb_game_model.py +0 -0
  136. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/sportsdb/sportsdb_league_model.py +0 -0
  137. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/sportsdb/sportsdb_team_model.py +0 -0
  138. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/sportsdb/sportsdb_venue_model.py +0 -0
  139. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/sportsreference/__init__.py +0 -0
  140. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/sportsreference/sportsreference_game_model.py +0 -0
  141. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/sportsreference/sportsreference_league_model.py +0 -0
  142. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/sportsreference/sportsreference_team_model.py +0 -0
  143. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/sportsreference/sportsreference_venue_model.py +0 -0
  144. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/team_model.py +0 -0
  145. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/weather/__init__.py +0 -0
  146. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/weather/gribstream/__init__.py +0 -0
  147. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/weather/gribstream/gribstream_weather_model.py +0 -0
  148. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/weather/multi_weather_model.py +0 -0
  149. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/weather/openmeteo/__init__.py +0 -0
  150. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/weather/openmeteo/openmeteo_weather_model.py +0 -0
  151. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/weather_model.py +0 -0
  152. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/wikipedia/__init__.py +0 -0
  153. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/wikipedia/wikipedia_venue_model.py +0 -0
  154. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/x/__init__.py +0 -0
  155. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/data/x/x_social_model.py +0 -0
  156. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/logger.py +0 -0
  157. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/loglevel.py +0 -0
  158. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/playwright.py +0 -0
  159. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/proxy_session.py +0 -0
  160. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/session.py +0 -0
  161. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/sportsball.py +0 -0
  162. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/vendor/__init__.py +0 -0
  163. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball/vendor/pygooglenews/__init__.py +0 -0
  164. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball.egg-info/dependency_links.txt +0 -0
  165. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball.egg-info/entry_points.txt +0 -0
  166. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball.egg-info/not-zip-safe +0 -0
  167. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball.egg-info/requires.txt +0 -0
  168. {sportsball-0.3.43 → sportsball-0.3.45}/sportsball.egg-info/top_level.txt +0 -0
  169. {sportsball-0.3.43 → sportsball-0.3.45}/tests/__init__.py +0 -0
  170. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/__init__.py +0 -0
  171. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/afl/__init__.py +0 -0
  172. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/afl/afltables/__init__.py +0 -0
  173. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/afl/afltables/afl_afltables_game_model_test.py +0 -0
  174. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/afl/afltables/afl_afltables_league_model_test.py +0 -0
  175. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/aussportsbetting/__init__.py +0 -0
  176. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/aussportsbetting/aussportsbetting_game_model_test.py +0 -0
  177. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/combined/__init__.py +0 -0
  178. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/espn/__init__.py +0 -0
  179. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/espn/espn_game_model_test.py +0 -0
  180. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/game_model_test.py +0 -0
  181. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/google/__init__.py +0 -0
  182. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/google/google_address_model_test.py +0 -0
  183. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/google/google_news_model_test.py +0 -0
  184. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/nba/__init__.py +0 -0
  185. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/nba/nba/__init__.py +0 -0
  186. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/nba/nba/nba_nba_game_model_test.py +0 -0
  187. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/nba/nba/nba_nba_league_model_test.py +0 -0
  188. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/nba/nba/nba_nba_team_model_test.py +0 -0
  189. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/nba/sportsdb/__init__.py +0 -0
  190. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/nba/sportsdb/nba_sportsdb_league_model_test.py +0 -0
  191. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/nba/sportsreference/__init__.py +0 -0
  192. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/nba/sportsreference/nba_sportsreference_league_model_test.py +0 -0
  193. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/ncaab/__init__.py +0 -0
  194. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/ncaab/sportsreference/__init__.py +0 -0
  195. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/ncaab/sportsreference/ncaab_sportsreference_league_model_test.py +0 -0
  196. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/nfl/__init__.py +0 -0
  197. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/nfl/sportsdb/__init__.py +0 -0
  198. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/nfl/sportsdb/nfl_sportsdb_league_model_test.py +0 -0
  199. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/oddsportal/__init__.py +0 -0
  200. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/oddsportal/decrypt_test.py +0 -0
  201. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/oddsportal/oddsportal_game_model_test.py +0 -0
  202. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/oddsportal/oddsportal_league_model_test.py +0 -0
  203. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/social_model_test.py +0 -0
  204. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/sportsdb/__init__.py +0 -0
  205. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/sportsdb/sportsdb_game_model_test.py +0 -0
  206. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/sportsdb/sportsdb_league_model_test.py +0 -0
  207. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/sportsdb/sportsdb_team_model_test.py +0 -0
  208. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/sportsdb/sportsdb_venue_model_test.py +0 -0
  209. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/sportsreference/__init__.py +0 -0
  210. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/sportsreference/sportsreference_game_model_test.py +0 -0
  211. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/sportsreference/sportsreference_league_model_test.py +0 -0
  212. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/sportsreference/sportsreference_player_model_test.py +0 -0
  213. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/sportsreference/sportsreference_team_model_test.py +0 -0
  214. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/sportsreference/sportsreference_venue_model_test.py +0 -0
  215. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/team_model_test.py +0 -0
  216. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/x/__init__.py +0 -0
  217. {sportsball-0.3.43 → sportsball-0.3.45}/tests/data/x/x_social_model_test.py +0 -0
  218. {sportsball-0.3.43 → sportsball-0.3.45}/tests/proxy_session_test.py +0 -0
  219. {sportsball-0.3.43 → sportsball-0.3.45}/tests/sportsball_test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: sportsball
3
- Version: 0.3.43
3
+ Version: 0.3.45
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.43',
29
+ version='0.3.45',
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',
@@ -1,3 +1,3 @@
1
1
  """The main module for sportsball."""
2
2
 
3
- __VERSION__ = "0.3.43"
3
+ __VERSION__ = "0.3.45"
@@ -1,10 +1,15 @@
1
1
  """A class for holding address information."""
2
2
 
3
+ from typing import Literal
4
+
3
5
  from pydantic import BaseModel, Field
4
6
 
5
7
  from .field_type import TYPE_KEY, FieldType
6
8
  from .weather_model import WeatherModel
7
9
 
10
+ ADDRESS_LATITUDE_COLUMN: Literal["latitude"] = "latitude"
11
+ ADDRESS_LONGITUDE_COLUMN: Literal["longitude"] = "longitude"
12
+
8
13
 
9
14
  class AddressModel(BaseModel):
10
15
  """The class for representing an address."""
@@ -14,8 +19,8 @@ class AddressModel(BaseModel):
14
19
  zipcode: str | None = Field(
15
20
  ..., json_schema_extra={TYPE_KEY: FieldType.CATEGORICAL}
16
21
  )
17
- latitude: float | None
18
- longitude: float | None
22
+ latitude: float | None = Field(..., alias=ADDRESS_LATITUDE_COLUMN)
23
+ longitude: float | None = Field(..., alias=ADDRESS_LONGITUDE_COLUMN)
19
24
  housenumber: str | None = Field(
20
25
  ..., json_schema_extra={TYPE_KEY: FieldType.CATEGORICAL}
21
26
  )
@@ -13,7 +13,7 @@ from .afl_afl_venue_model import create_afl_afl_venue_model
13
13
 
14
14
  def create_afl_afl_game_model(
15
15
  team_names: list[str],
16
- players: list[list[tuple[str, str]]],
16
+ players: list[list[tuple[str, str, str, str]]],
17
17
  dt: datetime.datetime,
18
18
  venue_name: str,
19
19
  session: requests_cache.CachedSession,
@@ -44,15 +44,17 @@ class AFLAFLLeagueModel(LeagueModel):
44
44
  "span", {"class": re.compile(".*team-lineups__team-name.*")}
45
45
  ):
46
46
  team_names.append(span.get_text().strip())
47
- teams_players: list[list[tuple[str, str]]] = []
47
+ teams_players: list[list[tuple[str, str, str, str]]] = []
48
48
  for div_team_players in div.find_all(
49
49
  "div", {"class": re.compile(".*team-lineups__positions-players.*")}
50
50
  ):
51
- team_players: list[tuple[str, str]] = []
51
+ team_players: list[tuple[str, str, str, str]] = []
52
52
  for a in div_team_players.find_all(
53
53
  "a", {"class": re.compile(".*js-player-profile-link.*")}
54
54
  ):
55
55
  player_id = "afl:" + a.get("data-player-id")
56
+ first_name = a.get("data-first-name")
57
+ second_name = a.get("data-surname")
56
58
  player_number = None
57
59
  for span_player_number in a.find_all(
58
60
  "span",
@@ -66,7 +68,9 @@ class AFLAFLLeagueModel(LeagueModel):
66
68
  )
67
69
  if player_number is None:
68
70
  raise ValueError("player_number is null")
69
- team_players.append((player_id, player_number))
71
+ team_players.append(
72
+ (player_id, player_number, first_name, second_name)
73
+ )
70
74
  teams_players.append(team_players)
71
75
  dt = None
72
76
  for time in div.find_all(
@@ -6,6 +6,7 @@ from ...player_model import PlayerModel
6
6
  def create_afl_afl_player_model(
7
7
  identifier: str,
8
8
  player_number: str,
9
+ name: str,
9
10
  ) -> PlayerModel:
10
11
  """Create a player model from AFL AFL."""
11
12
  return PlayerModel(
@@ -19,4 +20,5 @@ def create_afl_afl_player_model(
19
20
  offensive_rebounds=None,
20
21
  assists=None,
21
22
  turnovers=None,
23
+ name=name,
22
24
  )
@@ -13,14 +13,16 @@ from .afl_afl_player_model import create_afl_afl_player_model
13
13
 
14
14
  def create_afl_afl_team_model(
15
15
  team_name: str,
16
- players: list[tuple[str, str]],
16
+ players: list[tuple[str, str, str, str]],
17
17
  session: requests_cache.CachedSession,
18
18
  dt: datetime.datetime,
19
19
  ) -> TeamModel:
20
20
  """Create a team model from AFL AFL."""
21
21
  player_models = [
22
- create_afl_afl_player_model(identifier, player_number)
23
- for identifier, player_number in players
22
+ create_afl_afl_player_model(
23
+ identifier, player_number, " ".join([first_name, second_name])
24
+ )
25
+ for identifier, player_number, first_name, second_name in players
24
26
  ]
25
27
  return TeamModel(
26
28
  identifier=team_name,
@@ -152,7 +152,7 @@ def _create_afl_afltables_game_model(
152
152
 
153
153
  def _find_teams_metadata(
154
154
  soup: BeautifulSoup, team_infos: list[tuple[str, str, int]]
155
- ) -> list[tuple[str, list[tuple[str, str, int | None]], int]]:
155
+ ) -> list[tuple[str, list[tuple[str, str, int | None, str]], int]]:
156
156
  def _is_correct_table(table: Tag, name: str) -> bool:
157
157
  for th in table.find_all("th"):
158
158
  header_text = th.get_text().strip()
@@ -160,8 +160,8 @@ def _create_afl_afltables_game_model(
160
160
  return True
161
161
  return False
162
162
 
163
- def _find_players(table: Tag) -> list[tuple[str, str, int | None]]:
164
- players: list[tuple[str, str, int | None]] = []
163
+ def _find_players(table: Tag) -> list[tuple[str, str, int | None, str]]:
164
+ players: list[tuple[str, str, int | None, str]] = []
165
165
  for tr in table.find_all("tr"):
166
166
  player_row = False
167
167
  player_url = None
@@ -172,10 +172,18 @@ def _create_afl_afltables_game_model(
172
172
  player_row = True
173
173
  if player_row and player_url is not None:
174
174
  jersey = None
175
+ name = None
175
176
  kicks = None
176
177
  for count, td in enumerate(tr.find_all("td")):
177
178
  if count == 0:
178
179
  jersey = td.get_text().strip()
180
+ elif count == 1:
181
+ name = " ".join(
182
+ [
183
+ x.strip()
184
+ for x in reversed(td.get_text().strip().split(","))
185
+ ]
186
+ )
179
187
  elif count == 2:
180
188
  kicks_text = td.get_text().strip()
181
189
  if kicks_text:
@@ -183,8 +191,10 @@ def _create_afl_afltables_game_model(
183
191
 
184
192
  if jersey is None:
185
193
  raise ValueError("jersey is null.")
194
+ if name is None:
195
+ raise ValueError("name is null")
186
196
 
187
- players.append((player_url, jersey, kicks))
197
+ players.append((player_url, jersey, kicks, name))
188
198
  return players
189
199
 
190
200
  team_metadata = []
@@ -1,6 +1,6 @@
1
1
  """AFL AFLTables player model."""
2
2
 
3
- # pylint: disable=line-too-long,duplicate-code
3
+ # pylint: disable=line-too-long,duplicate-code,too-many-arguments
4
4
  import datetime
5
5
  import os
6
6
  from urllib.parse import urlparse
@@ -13,7 +13,7 @@ from ...player_model import PlayerModel
13
13
 
14
14
 
15
15
  def _create_afl_afltables_player_model(
16
- player_url: str, jersey: str, kicks: int | None
16
+ player_url: str, jersey: str, kicks: int | None, name: str
17
17
  ) -> PlayerModel:
18
18
  o = urlparse(player_url)
19
19
  last_component = o.path.split("/")[-1]
@@ -30,14 +30,15 @@ def _create_afl_afltables_player_model(
30
30
  offensive_rebounds=None,
31
31
  assists=None,
32
32
  turnovers=None,
33
+ name=name,
33
34
  )
34
35
 
35
36
 
36
37
  @MEMORY.cache
37
38
  def _cached_create_afl_afltables_player_model(
38
- player_url: str, jersey: str, kicks: int | None
39
+ player_url: str, jersey: str, kicks: int | None, name: str
39
40
  ) -> PlayerModel:
40
- return _create_afl_afltables_player_model(player_url, jersey, kicks)
41
+ return _create_afl_afltables_player_model(player_url, jersey, kicks, name)
41
42
 
42
43
 
43
44
  def create_afl_afltables_player_model(
@@ -46,12 +47,18 @@ def create_afl_afltables_player_model(
46
47
  kicks: int | None,
47
48
  dt: datetime.datetime,
48
49
  session: requests_cache.CachedSession,
50
+ name: str,
49
51
  ) -> PlayerModel:
50
52
  """Create a player model from AFL Tables."""
51
53
  if (
52
54
  not pytest_is_running.is_running()
53
55
  and dt < datetime.datetime.now() - datetime.timedelta(days=7)
54
56
  ):
55
- return _cached_create_afl_afltables_player_model(player_url, jersey, kicks) # pyright: ignore
57
+ return _cached_create_afl_afltables_player_model(
58
+ player_url,
59
+ jersey,
60
+ kicks,
61
+ name, # pyright: ignore
62
+ )
56
63
  with session.cache_disabled():
57
- return _create_afl_afltables_player_model(player_url, jersey, kicks)
64
+ return _create_afl_afltables_player_model(player_url, jersey, kicks, name)
@@ -44,7 +44,7 @@ _TEAM_NAME_MAP = {
44
44
 
45
45
  def _create_afl_afltables_team_model(
46
46
  team_url: str,
47
- players: list[tuple[str, str, int | None]],
47
+ players: list[tuple[str, str, int | None, str]],
48
48
  points: float,
49
49
  session: requests_cache.CachedSession,
50
50
  last_ladder_ranks: dict[str, int] | None,
@@ -71,8 +71,10 @@ def _create_afl_afltables_team_model(
71
71
  identifier=identifier,
72
72
  name=name,
73
73
  players=[ # pyright: ignore
74
- create_afl_afltables_player_model(player_url, jersey, kicks, dt, session)
75
- for player_url, jersey, kicks in players
74
+ create_afl_afltables_player_model(
75
+ player_url, jersey, kicks, dt, session, name
76
+ )
77
+ for player_url, jersey, kicks, name in players
76
78
  ],
77
79
  odds=[],
78
80
  points=points,
@@ -87,7 +89,7 @@ def _create_afl_afltables_team_model(
87
89
  @MEMORY.cache(ignore=["session"])
88
90
  def _cached_create_afl_afltables_team_model(
89
91
  team_url: str,
90
- players: list[tuple[str, str, int | None]],
92
+ players: list[tuple[str, str, int | None, str]],
91
93
  points: float,
92
94
  session: requests_cache.CachedSession,
93
95
  last_ladder_ranks: dict[str, int] | None,
@@ -101,7 +103,7 @@ def _cached_create_afl_afltables_team_model(
101
103
 
102
104
  def create_afl_afltables_team_model(
103
105
  team_url: str,
104
- players: list[tuple[str, str, int | None]],
106
+ players: list[tuple[str, str, int | None, str]],
105
107
  points: float,
106
108
  session: requests_cache.CachedSession,
107
109
  last_ladder_ranks: dict[str, int] | None,
@@ -242,7 +242,18 @@ AFL_VENUE_IDENTITY_MAP = {
242
242
  "Ondrej Nepela Arena": TIPOS_ARENA,
243
243
  "Barossa Park": BAROSSA_PARK,
244
244
  }
245
- AFL_TEAM_IDENTITY_MAP = {}
245
+ RYAN_LESTER = "afl:CD_I291548"
246
+ JACK_PAYNE = "afl:CD_I1002347"
247
+ DAYNE_ZORKO = "afl:CD_I261224"
248
+ JAMES_WORPEL = "James_Worpel"
249
+ JOSH_WEDDLE = "Josh_Weddle"
250
+ AFL_PLAYER_IDENTITY_MAP = {
251
+ "afl:CD_I291548": RYAN_LESTER,
252
+ "afl:CD_I1002347": JACK_PAYNE,
253
+ "afl:CD_I261224": DAYNE_ZORKO,
254
+ "James_Worpel": JAMES_WORPEL,
255
+ "Josh_Weddle": JOSH_WEDDLE,
256
+ }
246
257
 
247
258
 
248
259
  class AFLCombinedLeagueModel(CombinedLeagueModel):
@@ -271,4 +282,4 @@ class AFLCombinedLeagueModel(CombinedLeagueModel):
271
282
 
272
283
  @classmethod
273
284
  def player_identity_map(cls) -> dict[str, str]:
274
- return AFL_TEAM_IDENTITY_MAP
285
+ return AFL_PLAYER_IDENTITY_MAP
@@ -1,6 +1,6 @@
1
1
  """Combined game model."""
2
2
 
3
- # pylint: disable=too-many-locals,line-too-long
3
+ # pylint: disable=too-many-locals,line-too-long,too-many-arguments
4
4
  import logging
5
5
 
6
6
  import requests
@@ -35,6 +35,7 @@ def _team_models(
35
35
  game_models: list[GameModel],
36
36
  team_identity_map: dict[str, str],
37
37
  player_identity_map: dict[str, str],
38
+ names: dict[str, str],
38
39
  ) -> list[TeamModel]:
39
40
  team_models: dict[str, list[TeamModel]] = {}
40
41
  for game_model in game_models:
@@ -51,7 +52,7 @@ def _team_models(
51
52
  team_model
52
53
  ]
53
54
  return [
54
- create_combined_team_model(v, k, player_identity_map) # pyright: ignore
55
+ create_combined_team_model(v, k, player_identity_map, names) # pyright: ignore
55
56
  for k, v in team_models.items()
56
57
  ]
57
58
 
@@ -62,10 +63,13 @@ def create_combined_game_model(
62
63
  team_identity_map: dict[str, str],
63
64
  player_identity_map: dict[str, str],
64
65
  session: requests.Session,
66
+ names: dict[str, str],
65
67
  ) -> GameModel:
66
68
  """Create a game model by combining many game models."""
67
69
  venue_models, full_venue_identity = _venue_models(game_models, venue_identity_map)
68
- full_team_models = _team_models(game_models, team_identity_map, player_identity_map)
70
+ full_team_models = _team_models(
71
+ game_models, team_identity_map, player_identity_map, names
72
+ )
69
73
  attendance = None
70
74
  end_dt = None
71
75
  year = None
@@ -87,6 +87,7 @@ class CombinedLeagueModel(LeagueModel):
87
87
  game_components = sorted(game_components)
88
88
  key = "-".join(game_components)
89
89
  games[key] = games.get(key, []) + [game_model]
90
+ names: dict[str, str] = {}
90
91
  for game_models in games.values():
91
92
  yield create_combined_game_model( # type: ignore
92
93
  game_models,
@@ -94,4 +95,5 @@ class CombinedLeagueModel(LeagueModel):
94
95
  team_identity_map,
95
96
  self.player_identity_map(),
96
97
  self.session,
98
+ names,
97
99
  )
@@ -17,6 +17,7 @@ def create_combined_player_model(
17
17
  offensive_rebounds = None
18
18
  assists = None
19
19
  turnovers = None
20
+ name = None
20
21
  for player_model in player_models:
21
22
  player_model_jersey = player_model.jersey
22
23
  if player_model_jersey is not None:
@@ -45,6 +46,11 @@ def create_combined_player_model(
45
46
  player_model_turnovers = player_model.turnovers
46
47
  if player_model_turnovers is not None:
47
48
  turnovers = player_model_turnovers
49
+ player_model_name = player_model.name
50
+ if player_model_name is not None:
51
+ name = player_model_name
52
+ if name is None:
53
+ raise ValueError("name is null.")
48
54
  return PlayerModel(
49
55
  identifier=identifier,
50
56
  jersey=jersey,
@@ -56,4 +62,5 @@ def create_combined_player_model(
56
62
  offensive_rebounds=offensive_rebounds,
57
63
  assists=assists,
58
64
  turnovers=turnovers,
65
+ name=name,
59
66
  )
@@ -1,7 +1,8 @@
1
1
  """Combined team model."""
2
2
 
3
3
  # pylint: disable=too-many-locals
4
- import logging
4
+ import re
5
+ import unicodedata
5
6
 
6
7
  from ..news_model import NewsModel
7
8
  from ..odds_model import OddsModel
@@ -10,11 +11,14 @@ from ..social_model import SocialModel
10
11
  from ..team_model import TeamModel
11
12
  from .combined_player_model import create_combined_player_model
12
13
 
14
+ REGEX = re.compile("[^a-zA-Z]")
15
+
13
16
 
14
17
  def create_combined_team_model(
15
18
  team_models: list[TeamModel],
16
19
  identifier: str,
17
20
  player_identity_map: dict[str, str],
21
+ names: dict[str, str],
18
22
  ) -> TeamModel:
19
23
  """Create a team model by combining many team models."""
20
24
  location = None
@@ -31,16 +35,16 @@ def create_combined_team_model(
31
35
  location = team_model_location
32
36
  for player_model in team_model.players:
33
37
  player_id = player_model.identifier
34
- if player_model.identifier not in player_identity_map:
35
- logging.warning(
36
- "Failed to find %s player identifier.", player_model.identifier
37
- )
38
- else:
38
+ player_name_key = REGEX.sub(
39
+ "", unicodedata.normalize("NFC", player_model.name).lower()
40
+ )
41
+ if player_model.identifier in player_identity_map:
39
42
  player_id = player_identity_map[player_id]
40
- key = player_model.jersey
41
- if key is None:
42
- key = player_id
43
- players[key] = players.get(key, []) + [player_model]
43
+ elif player_name_key in names:
44
+ player_id = names[player_name_key]
45
+ else:
46
+ names[player_name_key] = player_id
47
+ players[player_id] = players.get(player_id, []) + [player_model]
44
48
  for odds_model in team_model.odds:
45
49
  key = f"{odds_model.bookie.identifier}-{odds_model.odds}"
46
50
  odds[key] = odds.get(key, []) + [odds_model]
@@ -29,6 +29,10 @@ def _create_espn_player_model(
29
29
  fumbles = stat["value"]
30
30
  if stat["name"] == "fumblesLost":
31
31
  fumbles_lost = stat["value"]
32
+ athlete_response = session.get(player["athlete"]["$ref"])
33
+ athlete_response.raise_for_status()
34
+ athlete_dict = athlete_response.json()
35
+ name = athlete_dict["fullName"]
32
36
  return PlayerModel(
33
37
  identifier=identifier,
34
38
  jersey=jersey,
@@ -40,6 +44,7 @@ def _create_espn_player_model(
40
44
  offensive_rebounds=None,
41
45
  assists=None,
42
46
  turnovers=None,
47
+ name=name,
43
48
  )
44
49
 
45
50