sportsball 0.6.0__tar.gz → 0.6.1__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 (260) hide show
  1. {sportsball-0.6.0/sportsball.egg-info → sportsball-0.6.1}/PKG-INFO +1 -1
  2. {sportsball-0.6.0 → sportsball-0.6.1}/setup.py +1 -1
  3. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/__init__.py +1 -1
  4. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/google/google_address_model.py +18 -0
  5. sportsball-0.6.1/sportsball/data/weather/openmeteo/openmeteo_weather_model.py +504 -0
  6. {sportsball-0.6.0 → sportsball-0.6.1/sportsball.egg-info}/PKG-INFO +1 -1
  7. sportsball-0.6.0/sportsball/data/weather/openmeteo/openmeteo_weather_model.py +0 -480
  8. {sportsball-0.6.0 → sportsball-0.6.1}/LICENSE +0 -0
  9. {sportsball-0.6.0 → sportsball-0.6.1}/MANIFEST.in +0 -0
  10. {sportsball-0.6.0 → sportsball-0.6.1}/README.md +0 -0
  11. {sportsball-0.6.0 → sportsball-0.6.1}/requirements.txt +0 -0
  12. {sportsball-0.6.0 → sportsball-0.6.1}/setup.cfg +0 -0
  13. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/__main__.py +0 -0
  14. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/args.py +0 -0
  15. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/cache.py +0 -0
  16. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/__init__.py +0 -0
  17. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/address_model.py +0 -0
  18. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/__init__.py +0 -0
  19. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/afl/__init__.py +0 -0
  20. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/afl/afl_afl_bookie_model.py +0 -0
  21. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/afl/afl_afl_game_model.py +0 -0
  22. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/afl/afl_afl_league_model.py +0 -0
  23. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/afl/afl_afl_odds_model.py +0 -0
  24. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/afl/afl_afl_player_model.py +0 -0
  25. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/afl/afl_afl_team_model.py +0 -0
  26. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/afl/afl_afl_venue_model.py +0 -0
  27. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/afltables/__init__.py +0 -0
  28. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/afltables/afl_afltables_coach_model.py +0 -0
  29. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/afltables/afl_afltables_game_model.py +0 -0
  30. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/afltables/afl_afltables_league_model.py +0 -0
  31. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/afltables/afl_afltables_player_model.py +0 -0
  32. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/afltables/afl_afltables_team_model.py +0 -0
  33. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/afltables/afl_afltables_venue_model.py +0 -0
  34. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/aussportsbetting/__init__.py +0 -0
  35. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/aussportsbetting/afl_aussportsbetting_league_model.py +0 -0
  36. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/combined/__init__.py +0 -0
  37. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/combined/afl_combined_league_model.py +0 -0
  38. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/espn/__init__.py +0 -0
  39. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/espn/afl_espn_league_model.py +0 -0
  40. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/oddsportal/__init__.py +0 -0
  41. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/oddsportal/afl_oddsportal_league_model.py +0 -0
  42. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/afl/position.py +0 -0
  43. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/aussportsbetting/__init__.py +0 -0
  44. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/aussportsbetting/aussportsbetting_bookie_model.py +0 -0
  45. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/aussportsbetting/aussportsbetting_game_model.py +0 -0
  46. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/aussportsbetting/aussportsbetting_league_model.py +0 -0
  47. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/aussportsbetting/aussportsbetting_odds_model.py +0 -0
  48. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/aussportsbetting/aussportsbetting_team_model.py +0 -0
  49. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/aussportsbetting/aussportsbetting_venue_model.py +0 -0
  50. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/bet.py +0 -0
  51. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/bookie_model.py +0 -0
  52. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/coach_model.py +0 -0
  53. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/combined/__init__.py +0 -0
  54. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/combined/combined_address_model.py +0 -0
  55. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/combined/combined_coach_model.py +0 -0
  56. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/combined/combined_game_model.py +0 -0
  57. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/combined/combined_league_model.py +0 -0
  58. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/combined/combined_player_model.py +0 -0
  59. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/combined/combined_team_model.py +0 -0
  60. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/combined/combined_venue_model.py +0 -0
  61. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/combined/combined_weather_model.py +0 -0
  62. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/combined/null_check.py +0 -0
  63. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/dividend_model.py +0 -0
  64. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/espn/__init__.py +0 -0
  65. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/espn/espn_bookie_model.py +0 -0
  66. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/espn/espn_coach_model.py +0 -0
  67. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/espn/espn_game_model.py +0 -0
  68. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/espn/espn_league_model.py +0 -0
  69. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/espn/espn_odds_model.py +0 -0
  70. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/espn/espn_player_model.py +0 -0
  71. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/espn/espn_team_model.py +0 -0
  72. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/espn/espn_venue_model.py +0 -0
  73. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/field_type.py +0 -0
  74. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/game_model.py +0 -0
  75. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/google/__init__.py +0 -0
  76. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/google/google_news_model.py +0 -0
  77. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/hkjc/__init__.py +0 -0
  78. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/hkjc/hkjc/__init__.py +0 -0
  79. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/hkjc/hkjc/hkjc_hkjc_bookie_model.py +0 -0
  80. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/hkjc/hkjc/hkjc_hkjc_coach_model.py +0 -0
  81. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/hkjc/hkjc/hkjc_hkjc_dividend_model.py +0 -0
  82. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/hkjc/hkjc/hkjc_hkjc_game_model.py +0 -0
  83. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/hkjc/hkjc/hkjc_hkjc_league_model.py +0 -0
  84. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/hkjc/hkjc/hkjc_hkjc_odds_model.py +0 -0
  85. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/hkjc/hkjc/hkjc_hkjc_owner_model.py +0 -0
  86. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/hkjc/hkjc/hkjc_hkjc_player_model.py +0 -0
  87. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/hkjc/hkjc/hkjc_hkjc_team_model.py +0 -0
  88. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/hkjc/hkjc/hkjc_hkjc_venue_model.py +0 -0
  89. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/hkjc/position.py +0 -0
  90. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/league.py +0 -0
  91. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/league_model.py +0 -0
  92. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/model.py +0 -0
  93. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nba/__init__.py +0 -0
  94. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nba/combined/__init__.py +0 -0
  95. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nba/combined/nba_combined_league_model.py +0 -0
  96. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nba/espn/__init__.py +0 -0
  97. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nba/espn/nba_espn_league_model.py +0 -0
  98. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nba/nba/__init__.py +0 -0
  99. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nba/nba/nba_nba_game_model.py +0 -0
  100. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nba/nba/nba_nba_league_model.py +0 -0
  101. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nba/nba/nba_nba_team_model.py +0 -0
  102. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nba/nbacom/__init__.py +0 -0
  103. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nba/nbacom/nba_nbacom_game_model.py +0 -0
  104. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nba/nbacom/nba_nbacom_league_model.py +0 -0
  105. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nba/nbacom/nba_nbacom_player_model.py +0 -0
  106. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nba/nbacom/nba_nbacom_team_model.py +0 -0
  107. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nba/nbacom/nba_nbacom_venue_model.py +0 -0
  108. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nba/oddsportal/__init__.py +0 -0
  109. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nba/oddsportal/nba_oddsportal_league_model.py +0 -0
  110. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nba/position.py +0 -0
  111. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nba/sportsdb/__init__.py +0 -0
  112. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nba/sportsdb/nba_sportsdb_league_model.py +0 -0
  113. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nba/sportsreference/__init__.py +0 -0
  114. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nba/sportsreference/nba_sportsreference_league_model.py +0 -0
  115. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/ncaab/__init__.py +0 -0
  116. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/ncaab/combined/__init__.py +0 -0
  117. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/ncaab/combined/ncaab_combined_league_model.py +0 -0
  118. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/ncaab/espn/__init__.py +0 -0
  119. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/ncaab/espn/ncaab_espn_league_model.py +0 -0
  120. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/ncaab/oddsportal/__init__.py +0 -0
  121. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/ncaab/oddsportal/ncaab_oddsportal_league_model.py +0 -0
  122. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/ncaab/sportsreference/__init__.py +0 -0
  123. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/ncaab/sportsreference/ncaab_sportsreference_league_model.py +0 -0
  124. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/ncaaf/__init__.py +0 -0
  125. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/ncaaf/combined/__init__.py +0 -0
  126. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/ncaaf/combined/ncaaf_combined_league_model.py +0 -0
  127. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/ncaaf/espn/__init__.py +0 -0
  128. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/ncaaf/espn/ncaaf_espn_league_model.py +0 -0
  129. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/ncaaf/oddsportal/__init__.py +0 -0
  130. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/ncaaf/oddsportal/ncaaf_oddsportal_league_model.py +0 -0
  131. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/news_model.py +0 -0
  132. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nfl/__init__.py +0 -0
  133. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nfl/aussportsbetting/__init__.py +0 -0
  134. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nfl/aussportsbetting/nfl_aussportsbetting_league_model.py +0 -0
  135. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nfl/combined/__init__.py +0 -0
  136. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nfl/combined/nfl_combined_league_model.py +0 -0
  137. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nfl/espn/__init__.py +0 -0
  138. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nfl/espn/nfl_espn_league_model.py +0 -0
  139. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nfl/oddsportal/__init__.py +0 -0
  140. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nfl/oddsportal/nfl_oddsportal_league_model.py +0 -0
  141. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nfl/position.py +0 -0
  142. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nfl/sportsdb/__init__.py +0 -0
  143. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/nfl/sportsdb/nfl_sportsdb_league_model.py +0 -0
  144. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/odds_model.py +0 -0
  145. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/oddsportal/__init__.py +0 -0
  146. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/oddsportal/decrypt.py +0 -0
  147. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/oddsportal/oddsportal_bookie_model.py +0 -0
  148. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/oddsportal/oddsportal_game_model.py +0 -0
  149. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/oddsportal/oddsportal_league_model.py +0 -0
  150. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/oddsportal/oddsportal_odds_model.py +0 -0
  151. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/oddsportal/oddsportal_team_model.py +0 -0
  152. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/oddsportal/oddsportal_venue_model.py +0 -0
  153. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/owner_model.py +0 -0
  154. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/player_model.py +0 -0
  155. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/season_type.py +0 -0
  156. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/sex.py +0 -0
  157. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/social_model.py +0 -0
  158. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/species.py +0 -0
  159. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/sportsdb/__init__.py +0 -0
  160. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/sportsdb/sportsdb_game_model.py +0 -0
  161. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/sportsdb/sportsdb_league_model.py +0 -0
  162. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/sportsdb/sportsdb_team_model.py +0 -0
  163. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/sportsdb/sportsdb_venue_model.py +0 -0
  164. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/sportsreference/__init__.py +0 -0
  165. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/sportsreference/sportsreference_coach_model.py +0 -0
  166. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/sportsreference/sportsreference_game_model.py +0 -0
  167. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/sportsreference/sportsreference_league_model.py +0 -0
  168. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/sportsreference/sportsreference_player_model.py +0 -0
  169. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/sportsreference/sportsreference_team_model.py +0 -0
  170. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/sportsreference/sportsreference_venue_model.py +0 -0
  171. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/team_model.py +0 -0
  172. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/venue_model.py +0 -0
  173. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/weather/__init__.py +0 -0
  174. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/weather/gribstream/__init__.py +0 -0
  175. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/weather/gribstream/gribstream_weather_model.py +0 -0
  176. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/weather/multi_weather_model.py +0 -0
  177. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/weather/openmeteo/__init__.py +0 -0
  178. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/weather_model.py +0 -0
  179. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/wikipedia/__init__.py +0 -0
  180. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/wikipedia/wikipedia_venue_model.py +0 -0
  181. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/x/__init__.py +0 -0
  182. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/data/x/x_social_model.py +0 -0
  183. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/logger.py +0 -0
  184. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/loglevel.py +0 -0
  185. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/playwright.py +0 -0
  186. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/sportsball.py +0 -0
  187. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/vendor/__init__.py +0 -0
  188. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball/vendor/pygooglenews/__init__.py +0 -0
  189. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball.egg-info/SOURCES.txt +0 -0
  190. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball.egg-info/dependency_links.txt +0 -0
  191. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball.egg-info/entry_points.txt +0 -0
  192. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball.egg-info/not-zip-safe +0 -0
  193. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball.egg-info/requires.txt +0 -0
  194. {sportsball-0.6.0 → sportsball-0.6.1}/sportsball.egg-info/top_level.txt +0 -0
  195. {sportsball-0.6.0 → sportsball-0.6.1}/tests/__init__.py +0 -0
  196. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/__init__.py +0 -0
  197. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/afl/__init__.py +0 -0
  198. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/afl/afl/__init__.py +0 -0
  199. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/afl/afl/afl_afl_game_model_test.py +0 -0
  200. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/afl/afl/afl_afl_league_model_test.py +0 -0
  201. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/afl/afltables/__init__.py +0 -0
  202. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/afl/afltables/afl_afltables_coach_model_test.py +0 -0
  203. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/afl/afltables/afl_afltables_game_model_test.py +0 -0
  204. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/afl/afltables/afl_afltables_league_model_test.py +0 -0
  205. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/afl/afltables/afl_afltables_player_model_test.py +0 -0
  206. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/aussportsbetting/__init__.py +0 -0
  207. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/aussportsbetting/aussportsbetting_game_model_test.py +0 -0
  208. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/combined/__init__.py +0 -0
  209. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/combined/combined_game_model_test.py +0 -0
  210. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/combined/combined_player_model_test.py +0 -0
  211. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/combined/combined_team_model_test.py +0 -0
  212. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/combined/combined_venue_model_test.py +0 -0
  213. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/espn/__init__.py +0 -0
  214. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/espn/espn_game_model_test.py +0 -0
  215. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/espn/espn_player_model_test.py +0 -0
  216. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/game_model_test.py +0 -0
  217. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/google/__init__.py +0 -0
  218. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/google/google_address_model_test.py +0 -0
  219. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/google/google_news_model_test.py +0 -0
  220. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/hkjc/__init__.py +0 -0
  221. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/hkjc/hkjc/__init__.py +0 -0
  222. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/hkjc/hkjc/hkjc_hkjc_game_model_test.py +0 -0
  223. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/hkjc/hkjc/hkjc_hkjc_player_model_test.py +0 -0
  224. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/nba/__init__.py +0 -0
  225. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/nba/nba/__init__.py +0 -0
  226. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/nba/nba/nba_nba_game_model_test.py +0 -0
  227. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/nba/nba/nba_nba_league_model_test.py +0 -0
  228. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/nba/nba/nba_nba_team_model_test.py +0 -0
  229. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/nba/sportsdb/__init__.py +0 -0
  230. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/nba/sportsdb/nba_sportsdb_league_model_test.py +0 -0
  231. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/nba/sportsreference/__init__.py +0 -0
  232. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/nba/sportsreference/nba_sportsreference_league_model_test.py +0 -0
  233. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/ncaab/__init__.py +0 -0
  234. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/ncaab/sportsreference/__init__.py +0 -0
  235. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/ncaab/sportsreference/ncaab_sportsreference_league_model_test.py +0 -0
  236. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/nfl/__init__.py +0 -0
  237. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/nfl/sportsdb/__init__.py +0 -0
  238. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/nfl/sportsdb/nfl_sportsdb_league_model_test.py +0 -0
  239. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/oddsportal/__init__.py +0 -0
  240. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/oddsportal/decrypt_test.py +0 -0
  241. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/oddsportal/oddsportal_game_model_test.py +0 -0
  242. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/oddsportal/oddsportal_league_model_test.py +0 -0
  243. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/player_model_test.py +0 -0
  244. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/social_model_test.py +0 -0
  245. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/sportsdb/__init__.py +0 -0
  246. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/sportsdb/sportsdb_game_model_test.py +0 -0
  247. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/sportsdb/sportsdb_league_model_test.py +0 -0
  248. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/sportsdb/sportsdb_team_model_test.py +0 -0
  249. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/sportsdb/sportsdb_venue_model_test.py +0 -0
  250. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/sportsreference/__init__.py +0 -0
  251. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/sportsreference/sportsreference_coach_model_test.py +0 -0
  252. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/sportsreference/sportsreference_game_model_test.py +0 -0
  253. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/sportsreference/sportsreference_league_model_test.py +0 -0
  254. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/sportsreference/sportsreference_player_model_test.py +0 -0
  255. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/sportsreference/sportsreference_team_model_test.py +0 -0
  256. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/sportsreference/sportsreference_venue_model_test.py +0 -0
  257. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/team_model_test.py +0 -0
  258. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/x/__init__.py +0 -0
  259. {sportsball-0.6.0 → sportsball-0.6.1}/tests/data/x/x_social_model_test.py +0 -0
  260. {sportsball-0.6.0 → sportsball-0.6.1}/tests/sportsball_test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: sportsball
3
- Version: 0.6.0
3
+ Version: 0.6.1
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.6.0',
29
+ version='0.6.1',
30
30
  description='A library for pulling in and normalising sports stats.',
31
31
  long_description=long_description,
32
32
  long_description_content_type='text/markdown',
@@ -4,4 +4,4 @@
4
4
  import cchardet # type: ignore
5
5
  import lxml # noqa: ignore
6
6
 
7
- __VERSION__ = "0.6.0"
7
+ __VERSION__ = "0.6.1"
@@ -15978,6 +15978,24 @@ _CACHED_GEOCODES: dict[str, Any] = {
15978
15978
  country="USA",
15979
15979
  ),
15980
15980
  "The Spectrum, Philadelphia, Pennsylvania": SPECTRUM,
15981
+ "Carson, CA, USA": SportsballGeocodeTuple(
15982
+ city="Carson",
15983
+ state="CA",
15984
+ postal="",
15985
+ lat=33.839722,
15986
+ lng=-118.259722,
15987
+ housenumber="",
15988
+ country="USA",
15989
+ ),
15990
+ "Allen, TX, USA": SportsballGeocodeTuple(
15991
+ city="Allen",
15992
+ state="TX",
15993
+ postal="",
15994
+ lat=33.126944,
15995
+ lng=-96.663056,
15996
+ housenumber="",
15997
+ country="USA",
15998
+ ),
15981
15999
  }
15982
16000
 
15983
16001
 
@@ -0,0 +1,504 @@
1
+ """Openmeteo weather model."""
2
+
3
+ # pylint: disable=too-many-statements,too-many-locals,line-too-long,duplicate-code,too-many-arguments
4
+ import datetime
5
+ import struct
6
+
7
+ import openmeteo_requests # type: ignore
8
+ import pandas as pd
9
+ import pytest_is_running
10
+ import pytz
11
+ import requests
12
+ import requests_cache
13
+ from openmeteo_requests.Client import OpenMeteoRequestsError # type: ignore
14
+ from openmeteo_requests.Client import WeatherApiResponse
15
+
16
+ from ....cache import MEMORY
17
+ from ...weather_model import VERSION, WeatherModel
18
+
19
+
20
+ def _parse_openmeteo(
21
+ responses: list[WeatherApiResponse], tz: str, dt: datetime.datetime, version: str
22
+ ) -> WeatherModel | None:
23
+ # pylint: disable=broad-exception-caught
24
+ if not responses:
25
+ return None
26
+ response = responses[0]
27
+ try:
28
+ hourly = response.Hourly()
29
+ daily = response.Daily()
30
+ except Exception:
31
+ return None
32
+ if hourly is None:
33
+ raise ValueError("hourly is null.")
34
+ if daily is None:
35
+ raise ValueError("daily is null")
36
+ dt_index = pd.date_range(
37
+ start=pd.to_datetime(hourly.Time(), unit="s"),
38
+ end=pd.to_datetime(hourly.TimeEnd(), unit="s"),
39
+ freq=pd.Timedelta(seconds=hourly.Interval()),
40
+ inclusive="left",
41
+ tz=tz,
42
+ )
43
+ try:
44
+ row_count = min(
45
+ len(hourly.Variables(0).ValuesAsNumpy()), # type: ignore
46
+ len(hourly.Variables(1).ValuesAsNumpy()), # type: ignore
47
+ len(hourly.Variables(2).ValuesAsNumpy()), # type: ignore
48
+ len(hourly.Variables(3).ValuesAsNumpy()), # type: ignore
49
+ len(hourly.Variables(4).ValuesAsNumpy()), # type: ignore
50
+ len(hourly.Variables(5).ValuesAsNumpy()), # type: ignore
51
+ len(hourly.Variables(6).ValuesAsNumpy()), # type: ignore
52
+ len(hourly.Variables(7).ValuesAsNumpy()), # type: ignore
53
+ len(hourly.Variables(8).ValuesAsNumpy()), # type: ignore
54
+ len(hourly.Variables(9).ValuesAsNumpy()), # type: ignore
55
+ len(hourly.Variables(10).ValuesAsNumpy()), # type: ignore
56
+ len(hourly.Variables(11).ValuesAsNumpy()), # type: ignore
57
+ len(hourly.Variables(12).ValuesAsNumpy()), # type: ignore
58
+ len(hourly.Variables(13).ValuesAsNumpy()), # type: ignore
59
+ len(hourly.Variables(14).ValuesAsNumpy()), # type: ignore
60
+ len(hourly.Variables(15).ValuesAsNumpy()), # type: ignore
61
+ len(hourly.Variables(16).ValuesAsNumpy()), # type: ignore
62
+ len(hourly.Variables(17).ValuesAsNumpy()), # type: ignore
63
+ len(hourly.Variables(18).ValuesAsNumpy()), # type: ignore
64
+ len(hourly.Variables(19).ValuesAsNumpy()), # type: ignore
65
+ len(hourly.Variables(20).ValuesAsNumpy()), # type: ignore
66
+ len(hourly.Variables(21).ValuesAsNumpy()), # type: ignore
67
+ len(hourly.Variables(22).ValuesAsNumpy()), # type: ignore
68
+ len(hourly.Variables(23).ValuesAsNumpy()), # type: ignore
69
+ len(hourly.Variables(24).ValuesAsNumpy()), # type: ignore
70
+ len(hourly.Variables(25).ValuesAsNumpy()), # type: ignore
71
+ len(hourly.Variables(26).ValuesAsNumpy()), # type: ignore
72
+ len(hourly.Variables(27).ValuesAsNumpy()), # type: ignore
73
+ len(hourly.Variables(28).ValuesAsNumpy()), # type: ignore
74
+ len(hourly.Variables(29).ValuesAsNumpy()), # type: ignore
75
+ len(hourly.Variables(30).ValuesAsNumpy()), # type: ignore
76
+ len(hourly.Variables(31).ValuesAsNumpy()), # type: ignore
77
+ len(hourly.Variables(32).ValuesAsNumpy()), # type: ignore
78
+ len(hourly.Variables(33).ValuesAsNumpy()), # type: ignore
79
+ len(hourly.Variables(34).ValuesAsNumpy()), # type: ignore
80
+ len(hourly.Variables(35).ValuesAsNumpy()), # type: ignore
81
+ len(hourly.Variables(36).ValuesAsNumpy()), # type: ignore
82
+ len(hourly.Variables(37).ValuesAsNumpy()), # type: ignore
83
+ len(hourly.Variables(38).ValuesAsNumpy()), # type: ignore
84
+ len(hourly.Variables(39).ValuesAsNumpy()), # type: ignore
85
+ len(hourly.Variables(40).ValuesAsNumpy()), # type: ignore
86
+ len(hourly.Variables(41).ValuesAsNumpy()), # type: ignore
87
+ len(dt_index),
88
+ )
89
+ hourly_df = pd.DataFrame(
90
+ index=dt_index[:row_count], # type: ignore
91
+ data={
92
+ "temperature_2m": hourly.Variables(0).ValuesAsNumpy()[:row_count], # type: ignore
93
+ "relative_humidity_2m": hourly.Variables(1).ValuesAsNumpy()[:row_count], # type: ignore
94
+ "dew_point_2m": hourly.Variables(2).ValuesAsNumpy()[:row_count], # type: ignore
95
+ "apparent_temperature": hourly.Variables(3).ValuesAsNumpy()[:row_count], # type: ignore
96
+ "precipitation_probability": hourly.Variables(4).ValuesAsNumpy()[ # type: ignore
97
+ :row_count
98
+ ], # type: ignore
99
+ "precipitation": hourly.Variables(5).ValuesAsNumpy()[:row_count], # type: ignore
100
+ "rain": hourly.Variables(6).ValuesAsNumpy()[:row_count], # type: ignore
101
+ "showers": hourly.Variables(7).ValuesAsNumpy()[:row_count], # type: ignore
102
+ "snowfall": hourly.Variables(8).ValuesAsNumpy()[:row_count], # type: ignore
103
+ "snow_depth": hourly.Variables(9).ValuesAsNumpy()[:row_count], # type: ignore
104
+ "weather_code": hourly.Variables(10).ValuesAsNumpy()[:row_count], # type: ignore
105
+ "pressure_msl": hourly.Variables(11).ValuesAsNumpy()[:row_count], # type: ignore
106
+ "surface_pressure": hourly.Variables(12).ValuesAsNumpy()[:row_count], # type: ignore
107
+ "cloud_cover": hourly.Variables(13).ValuesAsNumpy()[:row_count], # type: ignore
108
+ "cloud_cover_low": hourly.Variables(14).ValuesAsNumpy()[:row_count], # type: ignore
109
+ "cloud_cover_mid": hourly.Variables(15).ValuesAsNumpy()[:row_count], # type: ignore
110
+ "cloud_cover_high": hourly.Variables(16).ValuesAsNumpy()[:row_count], # type: ignore
111
+ "visibility": hourly.Variables(17).ValuesAsNumpy()[:row_count], # type: ignore
112
+ "evapotranspiration": hourly.Variables(18).ValuesAsNumpy()[:row_count], # type: ignore
113
+ "reference_evapotranspiration": hourly.Variables(19).ValuesAsNumpy()[ # type: ignore
114
+ :row_count
115
+ ], # type: ignore
116
+ "vapour_pressure_deficit": hourly.Variables(20).ValuesAsNumpy()[ # type: ignore
117
+ :row_count
118
+ ], # type: ignore
119
+ "wind_speed_10m": hourly.Variables(21).ValuesAsNumpy()[:row_count], # type: ignore
120
+ "wind_speed_80m": hourly.Variables(22).ValuesAsNumpy()[:row_count], # type: ignore
121
+ "wind_speed_120m": hourly.Variables(23).ValuesAsNumpy()[:row_count], # type: ignore
122
+ "wind_speed_180m": hourly.Variables(24).ValuesAsNumpy()[:row_count], # type: ignore
123
+ "wind_direction_10m": hourly.Variables(25).ValuesAsNumpy()[:row_count], # type: ignore
124
+ "wind_direction_80m": hourly.Variables(26).ValuesAsNumpy()[:row_count], # type: ignore
125
+ "wind_direction_120m": hourly.Variables(27).ValuesAsNumpy()[:row_count], # type: ignore
126
+ "wind_direction_180m": hourly.Variables(28).ValuesAsNumpy()[:row_count], # type: ignore
127
+ "wind_gusts": hourly.Variables(29).ValuesAsNumpy()[:row_count], # type: ignore
128
+ "temperature_80m": hourly.Variables(30).ValuesAsNumpy()[:row_count], # type: ignore
129
+ "temperature_120m": hourly.Variables(31).ValuesAsNumpy()[:row_count], # type: ignore
130
+ "temperature_180m": hourly.Variables(32).ValuesAsNumpy()[:row_count], # type: ignore
131
+ "soil_temperature": hourly.Variables(33).ValuesAsNumpy()[:row_count], # type: ignore
132
+ "soil_temperature_6cm": hourly.Variables(34).ValuesAsNumpy()[ # type: ignore
133
+ :row_count
134
+ ], # type: ignore
135
+ "soil_temperature_18cm": hourly.Variables(35).ValuesAsNumpy()[ # type: ignore
136
+ :row_count
137
+ ], # type: ignore
138
+ "soil_temperature_54cm": hourly.Variables(36).ValuesAsNumpy()[ # type: ignore
139
+ :row_count
140
+ ], # type: ignore
141
+ "soil_moisture": hourly.Variables(37).ValuesAsNumpy()[:row_count], # type: ignore
142
+ "soil_moisture_1cm": hourly.Variables(38).ValuesAsNumpy()[:row_count], # type: ignore
143
+ "soil_moisture_3cm": hourly.Variables(39).ValuesAsNumpy()[:row_count], # type: ignore
144
+ "soil_moisture_9cm": hourly.Variables(40).ValuesAsNumpy()[:row_count], # type: ignore
145
+ "soil_moisture_27cm": hourly.Variables(41).ValuesAsNumpy()[:row_count], # type: ignore
146
+ },
147
+ )
148
+
149
+ dt_index = pd.date_range(
150
+ start=pd.to_datetime(daily.Time(), unit="s"),
151
+ end=pd.to_datetime(daily.TimeEnd(), unit="s"),
152
+ freq=pd.Timedelta(seconds=daily.Interval()),
153
+ inclusive="left",
154
+ tz=tz,
155
+ )
156
+ row_count = min(
157
+ len(daily.Variables(0).ValuesAsNumpy()), # type: ignore
158
+ len(daily.Variables(1).ValuesAsNumpy()), # type: ignore
159
+ len(daily.Variables(2).ValuesAsNumpy()), # type: ignore
160
+ len(daily.Variables(3).ValuesAsNumpy()), # type: ignore
161
+ len(daily.Variables(4).ValuesAsNumpy()), # type: ignore
162
+ len(daily.Variables(5).ValuesAsNumpy()), # type: ignore
163
+ len(daily.Variables(6).ValuesAsNumpy()), # type: ignore
164
+ len(daily.Variables(7).ValuesAsNumpy()), # type: ignore
165
+ len(daily.Variables(8).ValuesAsNumpy()), # type: ignore
166
+ len(daily.Variables(9).ValuesAsNumpy()), # type: ignore
167
+ len(daily.Variables(10).ValuesAsNumpy()), # type: ignore
168
+ len(daily.Variables(11).ValuesAsNumpy()), # type: ignore
169
+ len(daily.Variables(12).ValuesAsNumpy()), # type: ignore
170
+ len(daily.Variables(13).ValuesAsNumpy()), # type: ignore
171
+ len(daily.Variables(14).ValuesAsNumpy()), # type: ignore
172
+ len(daily.Variables(15).ValuesAsNumpy()), # type: ignore
173
+ len(daily.Variables(16).ValuesAsNumpy()), # type: ignore
174
+ len(daily.Variables(17).ValuesAsNumpy()), # type: ignore
175
+ len(daily.Variables(18).ValuesAsNumpy()), # type: ignore
176
+ len(daily.Variables(19).ValuesAsNumpy()), # type: ignore
177
+ len(daily.Variables(20).ValuesAsNumpy()), # type: ignore
178
+ len(daily.Variables(21).ValuesAsNumpy()), # type: ignore
179
+ len(dt_index),
180
+ )
181
+ daily_df = pd.DataFrame(
182
+ index=dt_index[:row_count], # type: ignore
183
+ data={
184
+ "weather_code": daily.Variables(0).ValuesAsNumpy()[:row_count], # type: ignore
185
+ "temperature_2m_max": daily.Variables(1).ValuesAsNumpy()[:row_count], # type: ignore
186
+ "temperature_2m_min": daily.Variables(2).ValuesAsNumpy()[:row_count], # type: ignore
187
+ "apparent_temperature_max": daily.Variables(3).ValuesAsNumpy()[ # type: ignore
188
+ :row_count
189
+ ], # type: ignore
190
+ "apparent_temperature_min": daily.Variables(4).ValuesAsNumpy()[ # type: ignore
191
+ :row_count
192
+ ], # type: ignore
193
+ "sunrise": daily.Variables(5).ValuesAsNumpy()[:row_count], # type: ignore
194
+ "sunset": daily.Variables(6).ValuesAsNumpy()[:row_count], # type: ignore
195
+ "daylight_duration": daily.Variables(7).ValuesAsNumpy()[:row_count], # type: ignore
196
+ "sunshine_duration": daily.Variables(8).ValuesAsNumpy()[:row_count], # type: ignore
197
+ "uv_index_max": daily.Variables(9).ValuesAsNumpy()[:row_count], # type: ignore
198
+ "uv_index_clear_sky_max": daily.Variables(10).ValuesAsNumpy()[ # type: ignore
199
+ :row_count
200
+ ], # type: ignore
201
+ "rain_sum": daily.Variables(11).ValuesAsNumpy()[:row_count], # type: ignore
202
+ "showers_sum": daily.Variables(12).ValuesAsNumpy()[:row_count], # type: ignore
203
+ "snowfall_sum": daily.Variables(13).ValuesAsNumpy()[:row_count], # type: ignore
204
+ "precipitation_sum": daily.Variables(14).ValuesAsNumpy()[:row_count], # type: ignore
205
+ "precipitation_hours": daily.Variables(15).ValuesAsNumpy()[:row_count], # type: ignore
206
+ "precipitation_probability_max": daily.Variables(16).ValuesAsNumpy()[ # type: ignore
207
+ :row_count
208
+ ], # type: ignore
209
+ "wind_speed_10m_max": daily.Variables(17).ValuesAsNumpy()[:row_count], # type: ignore
210
+ "wind_gusts_10m_max": daily.Variables(18).ValuesAsNumpy()[:row_count], # type: ignore
211
+ "wind_direction_10m_dominant": daily.Variables(19).ValuesAsNumpy()[ # type: ignore
212
+ :row_count
213
+ ], # type: ignore
214
+ "shortwave_radiation_sum": daily.Variables(20).ValuesAsNumpy()[ # type: ignore
215
+ :row_count
216
+ ], # type: ignore
217
+ "et0_fao_evapotranspiration": daily.Variables(21).ValuesAsNumpy()[ # type: ignore
218
+ :row_count
219
+ ], # type: ignore
220
+ },
221
+ )
222
+
223
+ dt = dt.replace(tzinfo=None)
224
+ timezone = pytz.timezone(tz)
225
+ dt = timezone.localize(dt)
226
+
227
+ hourly_idx = hourly_df.index.get_indexer([dt], method="nearest")[0]
228
+ temperature = hourly_df.iloc[hourly_idx]["temperature_2m"] # type: ignore
229
+ relative_humidity = hourly_df.iloc[hourly_idx]["relative_humidity_2m"] # type: ignore
230
+ dew_point_2m = hourly_df.iloc[hourly_idx]["dew_point_2m"] # type: ignore
231
+ apparent_temperature = hourly_df.iloc[hourly_idx]["apparent_temperature"] # type: ignore
232
+ precipitation_probability = hourly_df.iloc[hourly_idx][
233
+ "precipitation_probability"
234
+ ] # type: ignore
235
+ precipitation = hourly_df.iloc[hourly_idx]["precipitation"] # type: ignore
236
+ rain = hourly_df.iloc[hourly_idx]["rain"] # type: ignore
237
+ showers = hourly_df.iloc[hourly_idx]["showers"] # type: ignore
238
+ snowfall = hourly_df.iloc[hourly_idx]["snowfall"] # type: ignore
239
+ snow_depth = hourly_df.iloc[hourly_idx]["snow_depth"] # type: ignore
240
+ weather_code = hourly_df.iloc[hourly_idx]["weather_code"] # type: ignore
241
+ pressure_msl = hourly_df.iloc[hourly_idx]["pressure_msl"] # type: ignore
242
+ surface_pressure = hourly_df.iloc[hourly_idx]["surface_pressure"] # type: ignore
243
+ cloud_cover = hourly_df.iloc[hourly_idx]["cloud_cover"] # type: ignore
244
+ cloud_cover_low = hourly_df.iloc[hourly_idx]["cloud_cover_low"] # type: ignore
245
+ cloud_cover_mid = hourly_df.iloc[hourly_idx]["cloud_cover_mid"] # type: ignore
246
+ cloud_cover_high = hourly_df.iloc[hourly_idx]["cloud_cover_high"] # type: ignore
247
+ visibility = hourly_df.iloc[hourly_idx]["visibility"] # type: ignore
248
+ evapotranspiration = hourly_df.iloc[hourly_idx]["evapotranspiration"] # type: ignore
249
+ reference_evapotranspiration = hourly_df.iloc[hourly_idx][
250
+ "reference_evapotranspiration"
251
+ ] # type: ignore
252
+ vapour_pressure_deficit = hourly_df.iloc[hourly_idx]["vapour_pressure_deficit"] # type: ignore
253
+ wind_speed_10m = hourly_df.iloc[hourly_idx]["wind_speed_10m"] # type: ignore
254
+ wind_speed_80m = hourly_df.iloc[hourly_idx]["wind_speed_80m"] # type: ignore
255
+ wind_speed_120m = hourly_df.iloc[hourly_idx]["wind_speed_120m"] # type: ignore
256
+ wind_speed_180m = hourly_df.iloc[hourly_idx]["wind_speed_180m"] # type: ignore
257
+ wind_direction_10m = hourly_df.iloc[hourly_idx]["wind_direction_10m"] # type: ignore
258
+ wind_direction_80m = hourly_df.iloc[hourly_idx]["wind_direction_80m"] # type: ignore
259
+ wind_direction_120m = hourly_df.iloc[hourly_idx]["wind_direction_120m"] # type: ignore
260
+ wind_direction_180m = hourly_df.iloc[hourly_idx]["wind_direction_180m"] # type: ignore
261
+ wind_gusts = hourly_df.iloc[hourly_idx]["wind_gusts"] # type: ignore
262
+ temperature_80m = hourly_df.iloc[hourly_idx]["temperature_80m"] # type: ignore
263
+ temperature_120m = hourly_df.iloc[hourly_idx]["temperature_120m"] # type: ignore
264
+ temperature_180m = hourly_df.iloc[hourly_idx]["temperature_180m"] # type: ignore
265
+ soil_temperature = hourly_df.iloc[hourly_idx]["soil_temperature"] # type: ignore
266
+ soil_temperature_6cm = hourly_df.iloc[hourly_idx]["soil_temperature_6cm"] # type: ignore
267
+ soil_temperature_18cm = hourly_df.iloc[hourly_idx]["soil_temperature_18cm"] # type: ignore
268
+ soil_temperature_54cm = hourly_df.iloc[hourly_idx]["soil_temperature_54cm"] # type: ignore
269
+ soil_moisture = hourly_df.iloc[hourly_idx]["soil_moisture"] # type: ignore
270
+ soil_moisture_1cm = hourly_df.iloc[hourly_idx]["soil_moisture_1cm"] # type: ignore
271
+ soil_moisture_3cm = hourly_df.iloc[hourly_idx]["soil_moisture_3cm"] # type: ignore
272
+ soil_moisture_9cm = hourly_df.iloc[hourly_idx]["soil_moisture_9cm"] # type: ignore
273
+ soil_moisture_27cm = hourly_df.iloc[hourly_idx]["soil_moisture_27cm"] # type: ignore
274
+
275
+ daily_idx = daily_df.index.get_indexer([dt], method="nearest")[0]
276
+ daily_weather_code = daily_df.iloc[daily_idx]["weather_code"] # type: ignore
277
+ temperature_2m_max = daily_df.iloc[daily_idx]["temperature_2m_max"] # type: ignore
278
+ temperature_2m_min = daily_df.iloc[daily_idx]["temperature_2m_min"] # type: ignore
279
+ apparent_temperature_max = daily_df.iloc[daily_idx]["apparent_temperature_max"] # type: ignore
280
+ apparent_temperature_min = daily_df.iloc[daily_idx]["apparent_temperature_min"] # type: ignore
281
+ sunrise = daily_df.iloc[daily_idx]["sunrise"] # type: ignore
282
+ sunset = daily_df.iloc[daily_idx]["sunset"] # type: ignore
283
+ daylight_duration = daily_df.iloc[daily_idx]["daylight_duration"] # type: ignore
284
+ sunshine_duration = daily_df.iloc[daily_idx]["sunshine_duration"] # type: ignore
285
+ uv_index_max = daily_df.iloc[daily_idx]["uv_index_max"] # type: ignore
286
+ uv_index_clear_sky_max = daily_df.iloc[daily_idx]["uv_index_clear_sky_max"] # type: ignore
287
+ rain_sum = daily_df.iloc[daily_idx]["rain_sum"] # type: ignore
288
+ showers_sum = daily_df.iloc[daily_idx]["showers_sum"] # type: ignore
289
+ snowfall_sum = daily_df.iloc[daily_idx]["snowfall_sum"] # type: ignore
290
+ precipitation_sum = daily_df.iloc[daily_idx]["precipitation_sum"] # type: ignore
291
+ precipitation_hours = daily_df.iloc[daily_idx]["precipitation_hours"] # type: ignore
292
+ precipitation_probability_max = daily_df.iloc[daily_idx][
293
+ "precipitation_probability_max"
294
+ ] # type: ignore
295
+ wind_speed_10m_max = daily_df.iloc[daily_idx]["wind_speed_10m_max"] # type: ignore
296
+ wind_gusts_10m_max = daily_df.iloc[daily_idx]["wind_gusts_10m_max"] # type: ignore
297
+ wind_direction_10m_dominant = daily_df.iloc[daily_idx][
298
+ "wind_direction_10m_dominant"
299
+ ] # type: ignore
300
+ shortwave_radiation_sum = daily_df.iloc[daily_idx]["shortwave_radiation_sum"] # type: ignore
301
+ et0_fao_evapotranspiration = daily_df.iloc[daily_idx][
302
+ "et0_fao_evapotranspiration"
303
+ ] # type: ignore
304
+
305
+ return WeatherModel(
306
+ temperature=temperature,
307
+ relative_humidity=relative_humidity,
308
+ dew_point=dew_point_2m,
309
+ apparent_temperature=apparent_temperature,
310
+ precipitation_probability=precipitation_probability,
311
+ precipitation=precipitation,
312
+ rain=rain,
313
+ showers=showers,
314
+ snowfall=snowfall,
315
+ snow_depth=snow_depth,
316
+ weather_code=weather_code,
317
+ sealevel_pressure=pressure_msl,
318
+ surface_pressure=surface_pressure,
319
+ cloud_cover_total=cloud_cover,
320
+ cloud_cover_low=cloud_cover_low,
321
+ cloud_cover_mid=cloud_cover_mid,
322
+ cloud_cover_high=cloud_cover_high,
323
+ visibility=visibility,
324
+ evapotranspiration=evapotranspiration,
325
+ reference_evapotranspiration=reference_evapotranspiration,
326
+ vapour_pressure_deficit=vapour_pressure_deficit,
327
+ wind_speed_10m=wind_speed_10m,
328
+ wind_speed_80m=wind_speed_80m,
329
+ wind_speed_120m=wind_speed_120m,
330
+ wind_speed_180m=wind_speed_180m,
331
+ wind_direction_10m=wind_direction_10m,
332
+ wind_direction_80m=wind_direction_80m,
333
+ wind_direction_120m=wind_direction_120m,
334
+ wind_direction_180m=wind_direction_180m,
335
+ wind_gusts=wind_gusts,
336
+ temperature_80m=temperature_80m,
337
+ temperature_120m=temperature_120m,
338
+ temperature_180m=temperature_180m,
339
+ soil_temperature_0cm=soil_temperature,
340
+ soil_temperature_6cm=soil_temperature_6cm,
341
+ soil_temperature_18cm=soil_temperature_18cm,
342
+ soil_temperature_54cm=soil_temperature_54cm,
343
+ soil_moisture_0cm=soil_moisture,
344
+ soil_moisture_1cm=soil_moisture_1cm,
345
+ soil_moisture_3cm=soil_moisture_3cm,
346
+ soil_moisture_9cm=soil_moisture_9cm,
347
+ soil_moisture_27cm=soil_moisture_27cm,
348
+ daily_weather_code=daily_weather_code,
349
+ daily_maximum_temperature_2m=temperature_2m_max,
350
+ daily_minimum_temperature_2m=temperature_2m_min,
351
+ daily_maximum_apparent_temperature_2m=apparent_temperature_max,
352
+ daily_minimum_apparent_temperature_2m=apparent_temperature_min,
353
+ sunrise=sunrise,
354
+ sunset=sunset,
355
+ daylight_duration=daylight_duration,
356
+ sunshine_duration=sunshine_duration,
357
+ uv_index=uv_index_max,
358
+ uv_index_clear_sky=uv_index_clear_sky_max,
359
+ rain_sum=rain_sum,
360
+ showers_sum=showers_sum,
361
+ snowfall_sum=snowfall_sum,
362
+ precipitation_sum=precipitation_sum,
363
+ precipitation_hours=precipitation_hours,
364
+ precipitation_probability_max=precipitation_probability_max,
365
+ maximum_wind_speed_10m=wind_speed_10m_max,
366
+ maximum_wind_gusts_10m=wind_gusts_10m_max,
367
+ dominant_wind_direction=wind_direction_10m_dominant,
368
+ shortwave_radiation_sum=shortwave_radiation_sum,
369
+ daily_reference_evapotranspiration=et0_fao_evapotranspiration,
370
+ version=version,
371
+ )
372
+ except struct.error:
373
+ return None
374
+
375
+
376
+ def _create_openmeteo_weather_model(
377
+ session: requests_cache.CachedSession,
378
+ latitude: float,
379
+ longitude: float,
380
+ dt: datetime.datetime,
381
+ tz: str,
382
+ version: str,
383
+ ) -> WeatherModel | None:
384
+ # pylint: disable=broad-exception-caught
385
+ client = openmeteo_requests.Client(session=session)
386
+ try:
387
+ params = {
388
+ "latitude": latitude,
389
+ "longitude": longitude,
390
+ "hourly": [
391
+ "temperature_2m",
392
+ "relative_humidity_2m",
393
+ "dew_point_2m",
394
+ "apparent_temperature",
395
+ "precipitation",
396
+ "rain",
397
+ "snowfall",
398
+ "snow_depth",
399
+ "weather_code",
400
+ "pressure_msl",
401
+ "surface_pressure",
402
+ "cloud_cover",
403
+ "cloud_cover_low",
404
+ "cloud_cover_mid",
405
+ "cloud_cover_high",
406
+ "et0_fao_evapotranspiration",
407
+ "vapour_pressure_deficit",
408
+ "wind_speed_10m",
409
+ "wind_speed_100m",
410
+ "wind_direction_10m",
411
+ "wind_direction_100m",
412
+ "wind_gusts_10m",
413
+ "soil_temperature_0_to_7cm",
414
+ "soil_temperature_7_to_28cm",
415
+ "soil_temperature_28_to_100cm",
416
+ "soil_temperature_100_to_255cm",
417
+ "soil_moisture_0_to_7cm",
418
+ "soil_moisture_7_to_28cm",
419
+ "soil_moisture_28_to_100cm",
420
+ "soil_moisture_100_to_255cm",
421
+ ],
422
+ "daily": [
423
+ "weather_code",
424
+ "temperature_2m_max",
425
+ "temperature_2m_min",
426
+ "temperature_2m_mean",
427
+ "apparent_temperature_max",
428
+ "apparent_temperature_min",
429
+ "apparent_temperature_mean",
430
+ "sunrise",
431
+ "sunset",
432
+ "daylight_duration",
433
+ "sunshine_duration",
434
+ "precipitation_sum",
435
+ "rain_sum",
436
+ "snowfall_sum",
437
+ "precipitation_hours",
438
+ "wind_speed_10m_max",
439
+ "wind_gusts_10m_max",
440
+ "wind_direction_10m_dominant",
441
+ "shortwave_radiation_sum",
442
+ "et0_fao_evapotranspiration",
443
+ ],
444
+ "timezone": tz,
445
+ }
446
+ url = "https://historical-forecast-api.open-meteo.com/v1/forecast"
447
+ if dt.date() > datetime.datetime.today().date():
448
+ url = "https://api.open-meteo.com/v1/forecast"
449
+ params["forecast_days"] = (
450
+ datetime.datetime.today().date() - dt.date()
451
+ ).days
452
+ else:
453
+ params["start_date"] = str((dt - datetime.timedelta(days=1.0)).date())
454
+ params["end_date"] = str(dt.date())
455
+ responses = client.weather_api(
456
+ url,
457
+ params=params,
458
+ )
459
+ return _parse_openmeteo(responses, tz, dt, version)
460
+ except (
461
+ requests.exceptions.RetryError,
462
+ OpenMeteoRequestsError,
463
+ requests.exceptions.ReadTimeout,
464
+ ):
465
+ return None
466
+ except Exception as e:
467
+ e_text = str(e)
468
+ if "Parameter 'start_date' is out of allowed range from" in e_text:
469
+ return None
470
+ raise e
471
+
472
+
473
+ @MEMORY.cache(ignore=["session"])
474
+ def _cached_create_openmeteo_weather_model(
475
+ session: requests_cache.CachedSession,
476
+ latitude: float,
477
+ longitude: float,
478
+ dt: datetime.datetime,
479
+ tz: str,
480
+ version: str,
481
+ ) -> WeatherModel | None:
482
+ return _create_openmeteo_weather_model(
483
+ session, latitude, longitude, dt, tz, version
484
+ )
485
+
486
+
487
+ def create_openmeteo_weather_model(
488
+ session: requests_cache.CachedSession,
489
+ latitude: float,
490
+ longitude: float,
491
+ dt: datetime.datetime,
492
+ tz: str,
493
+ ) -> WeatherModel | None:
494
+ """Create a weather model from openmeteo."""
495
+ if not pytest_is_running.is_running() and dt < datetime.datetime.now().replace(
496
+ tzinfo=dt.tzinfo
497
+ ) - datetime.timedelta(days=3):
498
+ return _cached_create_openmeteo_weather_model(
499
+ session, latitude, longitude, dt, tz, VERSION
500
+ )
501
+ with session.cache_disabled():
502
+ return _create_openmeteo_weather_model(
503
+ session, latitude, longitude, dt, tz, VERSION
504
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: sportsball
3
- Version: 0.6.0
3
+ Version: 0.6.1
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