sportsball 0.3.27__tar.gz → 0.3.29__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 (207) hide show
  1. {sportsball-0.3.27/sportsball.egg-info → sportsball-0.3.29}/PKG-INFO +1 -1
  2. {sportsball-0.3.27 → sportsball-0.3.29}/setup.py +1 -1
  3. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/__init__.py +1 -1
  4. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/afl/afltables/afl_afltables_league_model.py +16 -3
  5. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/afl/combined/afl_combined_league_model.py +1 -1
  6. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/google/google_address_model.py +192 -54
  7. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/ncaab/combined/ncaab_combined_league_model.py +5 -2
  8. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/oddsportal/oddsportal_game_model.py +15 -5
  9. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/oddsportal/oddsportal_league_model.py +3 -2
  10. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/oddsportal/oddsportal_team_model.py +11 -4
  11. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/weather/openmeteo/openmeteo_weather_model.py +5 -1
  12. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/proxy_session.py +1 -1
  13. {sportsball-0.3.27 → sportsball-0.3.29/sportsball.egg-info}/PKG-INFO +1 -1
  14. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/oddsportal/oddsportal_game_model_test.py +18 -0
  15. {sportsball-0.3.27 → sportsball-0.3.29}/LICENSE +0 -0
  16. {sportsball-0.3.27 → sportsball-0.3.29}/MANIFEST.in +0 -0
  17. {sportsball-0.3.27 → sportsball-0.3.29}/README.md +0 -0
  18. {sportsball-0.3.27 → sportsball-0.3.29}/requirements.txt +0 -0
  19. {sportsball-0.3.27 → sportsball-0.3.29}/setup.cfg +0 -0
  20. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/__main__.py +0 -0
  21. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/args.py +0 -0
  22. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/cache.py +0 -0
  23. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/__init__.py +0 -0
  24. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/address_model.py +0 -0
  25. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/afl/__init__.py +0 -0
  26. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/afl/afltables/__init__.py +0 -0
  27. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/afl/afltables/afl_afltables_game_model.py +0 -0
  28. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/afl/afltables/afl_afltables_player_model.py +0 -0
  29. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/afl/afltables/afl_afltables_team_model.py +0 -0
  30. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/afl/afltables/afl_afltables_venue_model.py +0 -0
  31. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/afl/aussportsbetting/__init__.py +0 -0
  32. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/afl/aussportsbetting/afl_aussportsbetting_league_model.py +0 -0
  33. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/afl/combined/__init__.py +0 -0
  34. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/afl/espn/__init__.py +0 -0
  35. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/afl/espn/afl_espn_league_model.py +0 -0
  36. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/afl/oddsportal/__init__.py +0 -0
  37. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/afl/oddsportal/afl_oddsportal_league_model.py +0 -0
  38. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/aussportsbetting/__init__.py +0 -0
  39. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/aussportsbetting/aussportsbetting_bookie_model.py +0 -0
  40. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/aussportsbetting/aussportsbetting_game_model.py +0 -0
  41. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/aussportsbetting/aussportsbetting_league_model.py +0 -0
  42. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/aussportsbetting/aussportsbetting_odds_model.py +0 -0
  43. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/aussportsbetting/aussportsbetting_team_model.py +0 -0
  44. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/aussportsbetting/aussportsbetting_venue_model.py +0 -0
  45. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/bookie_model.py +0 -0
  46. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/combined/__init__.py +0 -0
  47. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/combined/combined_address_model.py +0 -0
  48. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/combined/combined_game_model.py +0 -0
  49. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/combined/combined_league_model.py +0 -0
  50. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/combined/combined_player_model.py +0 -0
  51. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/combined/combined_team_model.py +0 -0
  52. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/combined/combined_venue_model.py +0 -0
  53. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/combined/combined_weather_model.py +0 -0
  54. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/espn/__init__.py +0 -0
  55. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/espn/espn_bookie_model.py +0 -0
  56. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/espn/espn_game_model.py +0 -0
  57. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/espn/espn_league_model.py +0 -0
  58. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/espn/espn_odds_model.py +0 -0
  59. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/espn/espn_player_model.py +0 -0
  60. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/espn/espn_team_model.py +0 -0
  61. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/espn/espn_venue_model.py +0 -0
  62. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/field_type.py +0 -0
  63. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/game_model.py +0 -0
  64. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/google/__init__.py +0 -0
  65. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/google/google_news_model.py +0 -0
  66. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/league.py +0 -0
  67. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/league_model.py +0 -0
  68. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/model.py +0 -0
  69. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nba/__init__.py +0 -0
  70. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nba/combined/__init__.py +0 -0
  71. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nba/combined/nba_combined_league_model.py +0 -0
  72. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nba/espn/__init__.py +0 -0
  73. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nba/espn/nba_espn_league_model.py +0 -0
  74. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nba/nba/__init__.py +0 -0
  75. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nba/nba/nba_nba_game_model.py +0 -0
  76. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nba/nba/nba_nba_league_model.py +0 -0
  77. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nba/nba/nba_nba_player_model.py +0 -0
  78. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nba/nba/nba_nba_team_model.py +0 -0
  79. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nba/oddsportal/__init__.py +0 -0
  80. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nba/oddsportal/nba_oddsportal_league_model.py +0 -0
  81. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nba/sportsdb/__init__.py +0 -0
  82. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nba/sportsdb/nba_sportsdb_league_model.py +0 -0
  83. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nba/sportsreference/__init__.py +0 -0
  84. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nba/sportsreference/nba_sportsreference_league_model.py +0 -0
  85. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/ncaab/__init__.py +0 -0
  86. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/ncaab/combined/__init__.py +0 -0
  87. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/ncaab/espn/__init__.py +0 -0
  88. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/ncaab/espn/ncaab_espn_league_model.py +0 -0
  89. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/ncaab/oddsportal/__init__.py +0 -0
  90. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/ncaab/oddsportal/ncaab_oddsportal_league_model.py +0 -0
  91. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/ncaab/sportsreference/__init__.py +0 -0
  92. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/ncaab/sportsreference/ncaab_sportsreference_league_model.py +0 -0
  93. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/ncaaf/__init__.py +0 -0
  94. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/ncaaf/combined/__init__.py +0 -0
  95. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/ncaaf/combined/ncaaf_combined_league_model.py +0 -0
  96. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/ncaaf/espn/__init__.py +0 -0
  97. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/ncaaf/espn/ncaaf_espn_league_model.py +0 -0
  98. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/ncaaf/oddsportal/__init__.py +0 -0
  99. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/ncaaf/oddsportal/ncaaf_oddsportal_league_model.py +0 -0
  100. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/news_model.py +0 -0
  101. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nfl/__init__.py +0 -0
  102. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nfl/aussportsbetting/__init__.py +0 -0
  103. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nfl/aussportsbetting/nfl_aussportsbetting_league_model.py +0 -0
  104. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nfl/combined/__init__.py +0 -0
  105. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nfl/combined/nfl_combined_league_model.py +0 -0
  106. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nfl/espn/__init__.py +0 -0
  107. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nfl/espn/nfl_espn_league_model.py +0 -0
  108. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nfl/oddsportal/__init__.py +0 -0
  109. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nfl/oddsportal/nfl_oddsportal_league_model.py +0 -0
  110. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nfl/sportsdb/__init__.py +0 -0
  111. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/nfl/sportsdb/nfl_sportsdb_league_model.py +0 -0
  112. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/odds_model.py +0 -0
  113. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/oddsportal/__init__.py +0 -0
  114. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/oddsportal/oddsportal_bookie_model.py +0 -0
  115. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/oddsportal/oddsportal_odds_model.py +0 -0
  116. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/oddsportal/oddsportal_venue_model.py +0 -0
  117. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/player_model.py +0 -0
  118. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/season_type.py +0 -0
  119. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/social_model.py +0 -0
  120. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/sportsdb/__init__.py +0 -0
  121. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/sportsdb/sportsdb_game_model.py +0 -0
  122. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/sportsdb/sportsdb_league_model.py +0 -0
  123. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/sportsdb/sportsdb_team_model.py +0 -0
  124. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/sportsdb/sportsdb_venue_model.py +0 -0
  125. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/sportsreference/__init__.py +0 -0
  126. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/sportsreference/sportsreference_game_model.py +0 -0
  127. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/sportsreference/sportsreference_league_model.py +0 -0
  128. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/sportsreference/sportsreference_player_model.py +0 -0
  129. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/sportsreference/sportsreference_team_model.py +0 -0
  130. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/sportsreference/sportsreference_venue_model.py +0 -0
  131. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/team_model.py +0 -0
  132. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/venue_model.py +0 -0
  133. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/weather/__init__.py +0 -0
  134. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/weather/gribstream/__init__.py +0 -0
  135. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/weather/gribstream/gribstream_weather_model.py +0 -0
  136. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/weather/multi_weather_model.py +0 -0
  137. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/weather/openmeteo/__init__.py +0 -0
  138. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/weather_model.py +0 -0
  139. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/wikipedia/__init__.py +0 -0
  140. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/wikipedia/wikipedia_venue_model.py +0 -0
  141. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/x/__init__.py +0 -0
  142. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/data/x/x_social_model.py +0 -0
  143. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/logger.py +0 -0
  144. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/loglevel.py +0 -0
  145. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/session.py +0 -0
  146. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/sportsball.py +0 -0
  147. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/vendor/__init__.py +0 -0
  148. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball/vendor/pygooglenews/__init__.py +0 -0
  149. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball.egg-info/SOURCES.txt +0 -0
  150. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball.egg-info/dependency_links.txt +0 -0
  151. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball.egg-info/entry_points.txt +0 -0
  152. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball.egg-info/not-zip-safe +0 -0
  153. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball.egg-info/requires.txt +0 -0
  154. {sportsball-0.3.27 → sportsball-0.3.29}/sportsball.egg-info/top_level.txt +0 -0
  155. {sportsball-0.3.27 → sportsball-0.3.29}/tests/__init__.py +0 -0
  156. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/__init__.py +0 -0
  157. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/afl/__init__.py +0 -0
  158. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/afl/afltables/__init__.py +0 -0
  159. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/afl/afltables/afl_afltables_league_model_test.py +0 -0
  160. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/afl/afltables/afl_afltables_player_model_test.py +0 -0
  161. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/aussportsbetting/__init__.py +0 -0
  162. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/aussportsbetting/aussportsbetting_game_model_test.py +0 -0
  163. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/combined/__init__.py +0 -0
  164. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/combined/combined_game_model_test.py +0 -0
  165. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/combined/combined_player_model_test.py +0 -0
  166. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/espn/__init__.py +0 -0
  167. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/espn/espn_game_model_test.py +0 -0
  168. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/espn/espn_player_model_test.py +0 -0
  169. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/game_model_test.py +0 -0
  170. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/google/__init__.py +0 -0
  171. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/google/google_address_model_test.py +0 -0
  172. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/google/google_news_model_test.py +0 -0
  173. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/nba/__init__.py +0 -0
  174. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/nba/nba/__init__.py +0 -0
  175. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/nba/nba/nba_nba_game_model_test.py +0 -0
  176. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/nba/nba/nba_nba_league_model_test.py +0 -0
  177. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/nba/nba/nba_nba_player_model_test.py +0 -0
  178. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/nba/nba/nba_nba_team_model_test.py +0 -0
  179. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/nba/sportsdb/__init__.py +0 -0
  180. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/nba/sportsdb/nba_sportsdb_league_model_test.py +0 -0
  181. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/nba/sportsreference/__init__.py +0 -0
  182. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/nba/sportsreference/nba_sportsreference_league_model_test.py +0 -0
  183. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/ncaab/__init__.py +0 -0
  184. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/ncaab/sportsreference/__init__.py +0 -0
  185. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/ncaab/sportsreference/ncaab_sportsreference_league_model_test.py +0 -0
  186. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/nfl/__init__.py +0 -0
  187. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/nfl/sportsdb/__init__.py +0 -0
  188. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/nfl/sportsdb/nfl_sportsdb_league_model_test.py +0 -0
  189. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/oddsportal/__init__.py +0 -0
  190. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/player_model_test.py +0 -0
  191. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/social_model_test.py +0 -0
  192. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/sportsdb/__init__.py +0 -0
  193. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/sportsdb/sportsdb_game_model_test.py +0 -0
  194. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/sportsdb/sportsdb_league_model_test.py +0 -0
  195. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/sportsdb/sportsdb_team_model_test.py +0 -0
  196. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/sportsdb/sportsdb_venue_model_test.py +0 -0
  197. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/sportsreference/__init__.py +0 -0
  198. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/sportsreference/sportsreference_game_model_test.py +0 -0
  199. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/sportsreference/sportsreference_league_model_test.py +0 -0
  200. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/sportsreference/sportsreference_player_model_test.py +0 -0
  201. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/sportsreference/sportsreference_team_model_test.py +0 -0
  202. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/sportsreference/sportsreference_venue_model_test.py +0 -0
  203. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/team_model_test.py +0 -0
  204. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/x/__init__.py +0 -0
  205. {sportsball-0.3.27 → sportsball-0.3.29}/tests/data/x/x_social_model_test.py +0 -0
  206. {sportsball-0.3.27 → sportsball-0.3.29}/tests/proxy_session_test.py +0 -0
  207. {sportsball-0.3.27 → sportsball-0.3.29}/tests/sportsball_test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: sportsball
3
- Version: 0.3.27
3
+ Version: 0.3.29
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.27',
29
+ version='0.3.29',
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.27"
3
+ __VERSION__ = "0.3.29"
@@ -1,7 +1,8 @@
1
1
  """AFL AFLTables league model."""
2
2
 
3
- # pylint: disable=too-many-statements
3
+ # pylint: disable=too-many-statements,protected-access
4
4
  import datetime
5
+ import logging
5
6
  import os
6
7
  import urllib.parse
7
8
  from typing import Iterator
@@ -59,9 +60,21 @@ class AFLAFLTablesLeagueModel(LeagueModel):
59
60
  for td in table.find_all("td"):
60
61
  td_text = td.get_text().strip()
61
62
  if "Venue:" in td_text:
62
- cleaned_text = td_text.split("Venue:")[0].split("Att:")[0].strip()
63
+ cleaned_text = (
64
+ td_text.split("Venue:")[0]
65
+ .split("Att:")[0]
66
+ .strip()
67
+ .split("(")[0]
68
+ .strip()
69
+ )
63
70
  cleaned_text = " ".join(cleaned_text.split()[-3:])
64
- current_dt = parser.parse(cleaned_text)
71
+ try:
72
+ current_dt = parser.parse(cleaned_text)
73
+ except parser._parser.ParserError as exc: # type: ignore
74
+ logging.error(
75
+ "Failed to parse date in season URL: %s", season_url
76
+ )
77
+ raise exc
65
78
  for a in table.find_all("a", href=True):
66
79
  if a.get_text().strip().lower() == "match stats":
67
80
  url = urllib.parse.urljoin(season_url, a.get("href"))
@@ -213,7 +213,7 @@ class AFLCombinedLeagueModel(CombinedLeagueModel):
213
213
  AFLAFLTablesLeagueModel(session, position=0),
214
214
  AFLESPNLeagueModel(session, position=1),
215
215
  AFLAusSportsBettingLeagueModel(session, position=2),
216
- AFLOddsPortalLeagueModel(session),
216
+ AFLOddsPortalLeagueModel(session, position=3),
217
217
  ],
218
218
  )
219
219
 
@@ -1387,6 +1387,60 @@ CORBETT_SPORTS_CENTER = SportsballGeocodeTuple(
1387
1387
  housenumber="1601",
1388
1388
  country="USA",
1389
1389
  )
1390
+ EA_DIDDLE_ARENA = SportsballGeocodeTuple(
1391
+ city="Bowling Green",
1392
+ state="KY",
1393
+ postal="42101",
1394
+ lat=36.985833,
1395
+ lng=-86.4575,
1396
+ housenumber="1526",
1397
+ country="USA",
1398
+ )
1399
+ JMA_WIRELESS_DOME = SportsballGeocodeTuple(
1400
+ city="Syracuse",
1401
+ state="NY",
1402
+ postal="13244",
1403
+ lat=43.036111,
1404
+ lng=-76.136389,
1405
+ housenumber="900",
1406
+ country="USA",
1407
+ )
1408
+ AG_SPANOS_CENTER = SportsballGeocodeTuple(
1409
+ city="Stockton",
1410
+ state="CA",
1411
+ postal="95211",
1412
+ lat=37.976669,
1413
+ lng=-121.315095,
1414
+ housenumber="1178",
1415
+ country="USA",
1416
+ )
1417
+ WAR_MEMORIAL_GYMNASIUM = SportsballGeocodeTuple(
1418
+ city="San Francisco",
1419
+ state="CA",
1420
+ postal="94118",
1421
+ lat=37.776944,
1422
+ lng=-122.449444,
1423
+ housenumber="2335",
1424
+ country="USA",
1425
+ )
1426
+ HENDERSON_CENTER = SportsballGeocodeTuple(
1427
+ city="Huntington",
1428
+ state="WV",
1429
+ postal="25755",
1430
+ lat=38.424517,
1431
+ lng=-82.425211,
1432
+ housenumber="",
1433
+ country="USA",
1434
+ )
1435
+ TED_CONSTANT_CONVOCATION_CENTER = SportsballGeocodeTuple(
1436
+ city="Norfolk",
1437
+ state="VA",
1438
+ postal="",
1439
+ lat=36.884169,
1440
+ lng=-76.301231,
1441
+ housenumber="4320",
1442
+ country="USA",
1443
+ )
1390
1444
  _CACHED_GEOCODES: dict[str, Any] = {
1391
1445
  "S.C.G. - Australia": SCG,
1392
1446
  "Victoria Park - Australia": SportsballGeocodeTuple(
@@ -2306,15 +2360,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
2306
2360
  housenumber="1972",
2307
2361
  country="USA",
2308
2362
  ),
2309
- "JMA Wireless Dome - Syracuse - NY - 13244": SportsballGeocodeTuple(
2310
- city="Syracuse",
2311
- state="NY",
2312
- postal="13244",
2313
- lat=43.036111,
2314
- lng=-76.136389,
2315
- housenumber="900",
2316
- country="USA",
2317
- ),
2363
+ "JMA Wireless Dome - Syracuse - NY - 13244": JMA_WIRELESS_DOME,
2318
2364
  "Davis Wade Stadium - Starkville - MS - 39762": SportsballGeocodeTuple(
2319
2365
  city="Starkville",
2320
2366
  state="MS",
@@ -3474,15 +3520,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
3474
3520
  housenumber="1000",
3475
3521
  country="USA",
3476
3522
  ),
3477
- "Ted Constant Convocation Ctr., Norfolk, Virginia": SportsballGeocodeTuple(
3478
- city="Norfolk",
3479
- state="VA",
3480
- postal="",
3481
- lat=36.884169,
3482
- lng=-76.301231,
3483
- housenumber="4320",
3484
- country="USA",
3485
- ),
3523
+ "Ted Constant Convocation Ctr., Norfolk, Virginia": TED_CONSTANT_CONVOCATION_CENTER,
3486
3524
  "Yanitelli Center, Jersey City, New Jersey": SportsballGeocodeTuple(
3487
3525
  city="Jersey City",
3488
3526
  state="NJ",
@@ -4951,15 +4989,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
4951
4989
  housenumber="18",
4952
4990
  country="USA",
4953
4991
  ),
4954
- "Henderson Center, Huntington, West Virginia": SportsballGeocodeTuple(
4955
- city="Huntington",
4956
- state="WV",
4957
- postal="25755",
4958
- lat=38.424517,
4959
- lng=-82.425211,
4960
- housenumber="",
4961
- country="USA",
4962
- ),
4992
+ "Henderson Center, Huntington, West Virginia": HENDERSON_CENTER,
4963
4993
  "Costello Athletic Center, Lowell, Massachusetts": SportsballGeocodeTuple(
4964
4994
  city="Lowell",
4965
4995
  state="MA",
@@ -5095,15 +5125,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
5095
5125
  housenumber="1",
5096
5126
  country="USA",
5097
5127
  ),
5098
- "E.A. Diddle Arena, Bowling Green, Kentucky": SportsballGeocodeTuple(
5099
- city="Bowling Green",
5100
- state="KY",
5101
- postal="42101",
5102
- lat=36.985833,
5103
- lng=-86.4575,
5104
- housenumber="1526",
5105
- country="USA",
5106
- ),
5128
+ "E.A. Diddle Arena, Bowling Green, Kentucky": EA_DIDDLE_ARENA,
5107
5129
  "Don Haskins Center, El Paso, Texas": SportsballGeocodeTuple(
5108
5130
  city="El Paso",
5109
5131
  state="TX",
@@ -5131,15 +5153,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
5131
5153
  housenumber="1",
5132
5154
  country="USA",
5133
5155
  ),
5134
- "A.G. Spanos Center, Stockton, California": SportsballGeocodeTuple(
5135
- city="Stockton",
5136
- state="CA",
5137
- postal="95211",
5138
- lat=37.976669,
5139
- lng=-121.315095,
5140
- housenumber="1178",
5141
- country="USA",
5142
- ),
5156
+ "A.G. Spanos Center, Stockton, California": AG_SPANOS_CENTER,
5143
5157
  "Leavey Center, Santa Clara, California": SportsballGeocodeTuple(
5144
5158
  city="Santa Clara",
5145
5159
  state="CA",
@@ -5685,15 +5699,7 @@ _CACHED_GEOCODES: dict[str, Any] = {
5685
5699
  country="USA",
5686
5700
  ),
5687
5701
  "John F. Savage Hall, Toledo, Ohio": SAVAGE_ARENA,
5688
- "War Memorial at The Sobrato Center, San Francisco, California": SportsballGeocodeTuple(
5689
- city="San Francisco",
5690
- state="CA",
5691
- postal="94118",
5692
- lat=37.776944,
5693
- lng=-122.449444,
5694
- housenumber="2335",
5695
- country="USA",
5696
- ),
5702
+ "War Memorial at The Sobrato Center, San Francisco, California": WAR_MEMORIAL_GYMNASIUM,
5697
5703
  "The Jungle, Indianapolis, Indiana": SportsballGeocodeTuple(
5698
5704
  city="Indianapolis",
5699
5705
  state="IN",
@@ -7687,6 +7693,138 @@ _CACHED_GEOCODES: dict[str, Any] = {
7687
7693
  housenumber="",
7688
7694
  country="USA",
7689
7695
  ),
7696
+ "University Credit Union Center, Davis, California": SportsballGeocodeTuple(
7697
+ city="Davis",
7698
+ state="CA",
7699
+ postal="95616",
7700
+ lat=38.541667,
7701
+ lng=-121.759444,
7702
+ housenumber="1",
7703
+ country="USA",
7704
+ ),
7705
+ "Buccaneer Field House, Charleston, South Carolina": SportsballGeocodeTuple(
7706
+ city="Charleston",
7707
+ state="SC",
7708
+ postal="29406",
7709
+ lat=32.980822,
7710
+ lng=-80.067125,
7711
+ housenumber="9200",
7712
+ country="USA",
7713
+ ),
7714
+ "Credit Union 1 Arena, Chicago, Illinois": SportsballGeocodeTuple(
7715
+ city="Chicago",
7716
+ state="IL",
7717
+ postal="60607",
7718
+ lat=41.874722,
7719
+ lng=-87.656111,
7720
+ housenumber="525",
7721
+ country="USA",
7722
+ ),
7723
+ "E. A. Diddle Arena, Bowling Green, Kentucky": EA_DIDDLE_ARENA,
7724
+ "JMA Wireless Dome, Syracuse, New York": JMA_WIRELESS_DOME,
7725
+ "Truist Arena, Highland Heights, Kentucky": SportsballGeocodeTuple(
7726
+ city="Highland Heights",
7727
+ state="KT",
7728
+ postal="41099",
7729
+ lat=39.032273,
7730
+ lng=-84.458864,
7731
+ housenumber="500",
7732
+ country="USA",
7733
+ ),
7734
+ "Kress Events Center, Green Bay, Wisconsin": SportsballGeocodeTuple(
7735
+ city="Green Bay",
7736
+ state="WI",
7737
+ postal="",
7738
+ lat=44.530069,
7739
+ lng=-87.915967,
7740
+ housenumber="",
7741
+ country="USA",
7742
+ ),
7743
+ "OceanFirst Bank Center, West Long Branch, New Jersey": SportsballGeocodeTuple(
7744
+ city="West Long Branch",
7745
+ state="NJ",
7746
+ postal="07764",
7747
+ lat=40.279475,
7748
+ lng=-74.007583,
7749
+ housenumber="400",
7750
+ country="USA",
7751
+ ),
7752
+ "Alex G. Spanos Center, Stockton, California": AG_SPANOS_CENTER,
7753
+ "War Memorial Gymnasium, San Francisco, California": WAR_MEMORIAL_GYMNASIUM,
7754
+ "First National Bank Arena, Jonesboro, Arkansas": SportsballGeocodeTuple(
7755
+ city="Jonesboro",
7756
+ state="AR",
7757
+ postal="72401",
7758
+ lat=35.845422,
7759
+ lng=-90.670319,
7760
+ housenumber="217",
7761
+ country="USA",
7762
+ ),
7763
+ "Frost Arena, Brookings, South Dakota": SportsballGeocodeTuple(
7764
+ city="Brookings",
7765
+ state="SD",
7766
+ postal="57007",
7767
+ lat=44.317984,
7768
+ lng=-96.779058,
7769
+ housenumber="1165",
7770
+ country="USA",
7771
+ ),
7772
+ "Louisville, Kentucky": SportsballGeocodeTuple(
7773
+ city="Louisville",
7774
+ state="KT",
7775
+ postal="",
7776
+ lat=38.256111,
7777
+ lng=-85.751389,
7778
+ housenumber="",
7779
+ country="USA",
7780
+ ),
7781
+ "Saint Charles, Missouri": SportsballGeocodeTuple(
7782
+ city="Saint Charles",
7783
+ state="MO",
7784
+ postal="",
7785
+ lat=38.789,
7786
+ lng=-90.514,
7787
+ housenumber="",
7788
+ country="USA",
7789
+ ),
7790
+ "Cam Henderson Center, Huntington, West Virginia": HENDERSON_CENTER,
7791
+ "Ted Constant Convocaation Center, Norfolk, Virginia": TED_CONSTANT_CONVOCATION_CENTER,
7792
+ "Brooklyn, New York": SportsballGeocodeTuple(
7793
+ city="Brooklyn",
7794
+ state="NY",
7795
+ postal="",
7796
+ lat=40.65,
7797
+ lng=-73.95,
7798
+ housenumber="",
7799
+ country="USA",
7800
+ ),
7801
+ "Chicago, Illinois": SportsballGeocodeTuple(
7802
+ city="Chicago",
7803
+ state="IL",
7804
+ postal="",
7805
+ lat=41.881944,
7806
+ lng=-87.627778,
7807
+ housenumber="",
7808
+ country="USA",
7809
+ ),
7810
+ "Alabama A&M Events Center, Huntsville, Alabama": SportsballGeocodeTuple(
7811
+ city="Huntsville",
7812
+ state="AL",
7813
+ postal="35810",
7814
+ lat=34.781139,
7815
+ lng=-86.580528,
7816
+ housenumber="",
7817
+ country="USA",
7818
+ ),
7819
+ "Vadalabene Center, Edwardsville, Illinois": SportsballGeocodeTuple(
7820
+ city="Edwardsville",
7821
+ state="IL",
7822
+ postal="",
7823
+ lat=38.795989,
7824
+ lng=-89.999883,
7825
+ housenumber="35",
7826
+ country="USA",
7827
+ ),
7690
7828
  }
7691
7829
 
7692
7830
 
@@ -5,6 +5,8 @@ import requests_cache
5
5
  from ...combined.combined_league_model import CombinedLeagueModel
6
6
  from ...league import League
7
7
  from ..espn.ncaab_espn_league_model import NCAABESPNLeagueModel
8
+ from ..oddsportal.ncaab_oddsportal_league_model import \
9
+ NCAABOddsPortalLeagueModel
8
10
  from ..sportsreference.ncaab_sportsreference_league_model import \
9
11
  NCAABSportsReferenceLeagueModel
10
12
 
@@ -749,8 +751,9 @@ class NCAABCombinedLeagueModel(CombinedLeagueModel):
749
751
  session,
750
752
  League.NCAAB,
751
753
  [
752
- NCAABSportsReferenceLeagueModel(session),
753
- NCAABESPNLeagueModel(session),
754
+ NCAABSportsReferenceLeagueModel(session, position=0),
755
+ NCAABESPNLeagueModel(session, position=1),
756
+ NCAABOddsPortalLeagueModel(session, position=2),
754
757
  ],
755
758
  )
756
759
 
@@ -10,6 +10,7 @@ import requests_cache
10
10
  from bs4 import BeautifulSoup, Tag
11
11
 
12
12
  from ...cache import MEMORY
13
+ from ...proxy_session import X_NO_WAYBACK
13
14
  from ..game_model import GameModel
14
15
  from ..league import League
15
16
  from .oddsportal_team_model import create_oddsportal_team_model
@@ -21,14 +22,19 @@ def _create_oddsportal_game_model(
21
22
  url: str,
22
23
  league: League,
23
24
  ) -> GameModel:
24
- response = session.get(url, headers={"X-No-Wayback": "1"})
25
+ response = session.get(url, headers={X_NO_WAYBACK: "1"})
25
26
  response.raise_for_status()
26
27
 
27
28
  soup = BeautifulSoup(response.text, "html.parser")
28
29
  event_tag = soup.find("div", id="react-event-header")
29
30
  if not isinstance(event_tag, Tag):
30
- raise ValueError(f"event_tag is not a tag for URL: {url}.")
31
- event = json.loads(str(event_tag["data"]))
31
+ soup_x = BeautifulSoup(response.text, "xml")
32
+ event_tag = soup_x.find("Event")
33
+ if not isinstance(event_tag, Tag):
34
+ raise ValueError(f"event_tag is not a tag for URL: {url}.")
35
+ event = json.loads(str(event_tag[":data"]))
36
+ else:
37
+ event = json.loads(str(event_tag["data"]))
32
38
 
33
39
  event_body = event["eventBody"]
34
40
  event_data = event["eventData"]
@@ -51,7 +57,7 @@ def _create_oddsportal_game_model(
51
57
  continue
52
58
  if "/app.js" in src:
53
59
  src_url = urllib.parse.urljoin(url, src)
54
- src_response = session.get(src_url)
60
+ src_response = session.get(src_url, headers={X_NO_WAYBACK: "1"})
55
61
  src_response.raise_for_status()
56
62
  variables = src_response.text
57
63
  sentinel = 'break}return e.next=9,g(r.data,"'
@@ -77,7 +83,11 @@ def _create_oddsportal_game_model(
77
83
  away_points = float(event_body["awayResult"])
78
84
 
79
85
  venue = None
80
- if event_body["venue"] and event_body["venueTown"] and event_body["venueCountry"]:
86
+ if (
87
+ event_body.get("venue", "")
88
+ and event_body.get("venueTown", "")
89
+ and event_body.get("venueCountry", "")
90
+ ):
81
91
  venue = create_oddsportal_venue_model(
82
92
  session,
83
93
  dt,
@@ -1,6 +1,6 @@
1
1
  """Odds Portal league model."""
2
2
 
3
- # pylint: disable=too-many-locals,too-many-branches,too-many-statements
3
+ # pylint: disable=too-many-locals,too-many-branches,too-many-statements,protected-access
4
4
  import http
5
5
  import json
6
6
  import logging
@@ -82,6 +82,7 @@ class OddsPortalLeagueModel(LeagueModel):
82
82
  url = queued_urls.pop()
83
83
  if url in seen_urls:
84
84
  continue
85
+ logging.debug("processing url: %s", url)
85
86
  seen_urls.add(url)
86
87
 
87
88
  if url.endswith(standard_suffix):
@@ -163,5 +164,5 @@ class OddsPortalLeagueModel(LeagueModel):
163
164
  @property
164
165
  def games(self) -> Iterator[GameModel]:
165
166
  with tqdm.tqdm(position=self.position) as pbar:
166
- yield from self._find_next(pbar)
167
+ # yield from self._find_next(pbar)
167
168
  yield from self._find_previous(pbar)
@@ -66,10 +66,17 @@ def _create_oddsportal_team_model(
66
66
  if end_of_json != -1:
67
67
  decrypted_data = decrypted_data[: end_of_json + 1]
68
68
  parsed_data = json.loads(decrypted_data)
69
- odds_data = parsed_data["d"]["oddsdata"]["back"][
70
- f"E-{default_bet_id}-{default_scope_id}-0-0-0"
71
- ]
72
- outcome_id = odds_data["outcomeId"][team_idx]
69
+ try:
70
+ odds_data = parsed_data["d"]["oddsdata"]["back"][
71
+ f"E-{default_bet_id}-{default_scope_id}-0-0-0"
72
+ ]
73
+ except KeyError:
74
+ back = parsed_data["d"]["oddsdata"]["back"]
75
+ odds_data = back[sorted(list(back.keys()))[0]]
76
+ try:
77
+ outcome_id = odds_data["outcomeId"][team_idx]
78
+ except KeyError:
79
+ outcome_id = odds_data["outcomeId"][str(team_idx)]
73
80
  history = odds_data["history"][outcome_id]
74
81
  odds_models = []
75
82
  for bookie_id, bookie_name in bookie_names.items():
@@ -131,7 +131,11 @@ def _create_openmeteo_weather_model(
131
131
  },
132
132
  )
133
133
  return _parse_openmeteo(responses, tz, dt)
134
- except (requests.exceptions.RetryError, OpenMeteoRequestsError):
134
+ except (
135
+ requests.exceptions.RetryError,
136
+ OpenMeteoRequestsError,
137
+ requests.exceptions.ReadTimeout,
138
+ ):
135
139
  return None
136
140
  except Exception as e:
137
141
  e_text = str(e)
@@ -145,7 +145,7 @@ class ProxySession(requests_cache.CachedSession):
145
145
  logging.info("Request for %s not cached.", request.url)
146
146
 
147
147
  # Otherwise check the wayback machine
148
- if not _is_fast_fail_url(request.url) and no_wayback:
148
+ if not _is_fast_fail_url(request.url) and not no_wayback:
149
149
  response = self._wayback_machine_request(
150
150
  request.method, request.url, headers=request.headers
151
151
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: sportsball
3
- Version: 0.3.27
3
+ Version: 0.3.29
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
@@ -33,3 +33,21 @@ class TestOddsPortalGameModel(unittest.TestCase):
33
33
  True,
34
34
  )
35
35
  self.assertEqual(game_model.dt, datetime.datetime(2025, 3, 6, 3, 50))
36
+
37
+ def test_event_dt(self):
38
+ url = "https://www.oddsportal.com/aussie-rules/australia/afl-2013/collingwood-magpies-north-melbourne-kangaroos-6yxbPNei/"
39
+ with requests_mock.Mocker() as m:
40
+ with open(os.path.join(self.dir, "collingwood-magpies-north-melbourne-kangaroos-6yxbPNei.html"), "rb") as f:
41
+ m.get(url, content=f.read())
42
+ with open(os.path.join(self.dir, "app.js"), "rb") as f:
43
+ m.get("https://www.oddsportal.com/res/public/js/build/app.js?v=240917140831", content=f.read())
44
+ with open(os.path.join(self.dir, "1-18-6yxbPNei-3-1-yj485.dat"), "rb") as f:
45
+ m.get("https://www.oddsportal.com/match-event/1-18-6yxbPNei-3-1-yj485.dat", content=f.read())
46
+
47
+ game_model = create_oddsportal_game_model(
48
+ self.session,
49
+ url,
50
+ League.AFL,
51
+ True,
52
+ )
53
+ self.assertEqual(game_model.dt, datetime.datetime(2013, 9, 1, 1, 20))
File without changes
File without changes
File without changes
File without changes