nba 0.1.1 → 0.2.0

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 (321) hide show
  1. checksums.yaml +5 -5
  2. data/AGENTS.md +362 -0
  3. data/CHANGELOG.md +169 -0
  4. data/CLAUDE.md +1 -0
  5. data/LICENSE +21 -0
  6. data/README.md +501 -101
  7. data/bin/console +10 -0
  8. data/bin/setup +6 -0
  9. data/exe/nba +8 -0
  10. data/lib/nba/all_time_leader.rb +77 -0
  11. data/lib/nba/all_time_leaders.rb +185 -0
  12. data/lib/nba/assist_leader.rb +92 -0
  13. data/lib/nba/assist_leaders.rb +64 -0
  14. data/lib/nba/assist_tracker.rb +108 -0
  15. data/lib/nba/assist_tracker_entry.rb +206 -0
  16. data/lib/nba/award.rb +128 -0
  17. data/lib/nba/box_score.rb +2 -0
  18. data/lib/nba/box_score_advanced.rb +114 -0
  19. data/lib/nba/box_score_advanced_player_stat.rb +297 -0
  20. data/lib/nba/box_score_advanced_team_stat.rb +237 -0
  21. data/lib/nba/box_score_advanced_v3.rb +124 -0
  22. data/lib/nba/box_score_defensive_player_stat.rb +281 -0
  23. data/lib/nba/box_score_defensive_team_stat.rb +85 -0
  24. data/lib/nba/box_score_defensive_v2.rb +190 -0
  25. data/lib/nba/box_score_four_factors.rb +91 -0
  26. data/lib/nba/box_score_four_factors_player_stat.rb +185 -0
  27. data/lib/nba/box_score_four_factors_team_stat.rb +141 -0
  28. data/lib/nba/box_score_four_factors_v3.rb +133 -0
  29. data/lib/nba/box_score_hustle.rb +226 -0
  30. data/lib/nba/box_score_hustle_player_stat.rb +233 -0
  31. data/lib/nba/box_score_hustle_team_stat.rb +189 -0
  32. data/lib/nba/box_score_matchup_stat.rb +417 -0
  33. data/lib/nba/box_score_matchups_v3.rb +184 -0
  34. data/lib/nba/box_score_misc.rb +100 -0
  35. data/lib/nba/box_score_misc_player_stat.rb +217 -0
  36. data/lib/nba/box_score_misc_team_stat.rb +173 -0
  37. data/lib/nba/box_score_misc_v3.rb +163 -0
  38. data/lib/nba/box_score_player_stat.rb +273 -0
  39. data/lib/nba/box_score_player_track.rb +223 -0
  40. data/lib/nba/box_score_player_track_stat.rb +273 -0
  41. data/lib/nba/box_score_player_track_team_stat.rb +229 -0
  42. data/lib/nba/box_score_scoring.rb +103 -0
  43. data/lib/nba/box_score_scoring_player_stat.rb +241 -0
  44. data/lib/nba/box_score_scoring_team_stat.rb +197 -0
  45. data/lib/nba/box_score_scoring_v3.rb +170 -0
  46. data/lib/nba/box_score_similarity_score.rb +119 -0
  47. data/lib/nba/box_score_similarity_stat.rb +76 -0
  48. data/lib/nba/box_score_starter_bench_stat.rb +257 -0
  49. data/lib/nba/box_score_summary.rb +285 -0
  50. data/lib/nba/box_score_summary_v2.rb +202 -0
  51. data/lib/nba/box_score_summary_v3.rb +120 -0
  52. data/lib/nba/box_score_summary_v3_data.rb +419 -0
  53. data/lib/nba/box_score_team_stat.rb +229 -0
  54. data/lib/nba/box_score_traditional.rb +101 -0
  55. data/lib/nba/box_score_traditional_v3.rb +195 -0
  56. data/lib/nba/box_score_usage.rb +102 -0
  57. data/lib/nba/box_score_usage_player_stat.rb +265 -0
  58. data/lib/nba/box_score_usage_team_stat.rb +221 -0
  59. data/lib/nba/box_score_usage_v3.rb +169 -0
  60. data/lib/nba/box_score_v3_helpers.rb +144 -0
  61. data/lib/nba/career_stats.rb +217 -0
  62. data/lib/nba/cli/display/player_display.rb +98 -0
  63. data/lib/nba/cli/display.rb +178 -0
  64. data/lib/nba/cli/formatters/game_formatters.rb +86 -0
  65. data/lib/nba/cli/formatters/leaders_formatters.rb +26 -0
  66. data/lib/nba/cli/formatters/player_formatters.rb +52 -0
  67. data/lib/nba/cli/formatters/standings_formatters.rb +26 -0
  68. data/lib/nba/cli/formatters/team_formatters.rb +67 -0
  69. data/lib/nba/cli/formatters/time_formatters.rb +82 -0
  70. data/lib/nba/cli/formatters.rb +56 -0
  71. data/lib/nba/cli/helpers.rb +135 -0
  72. data/lib/nba/cli.rb +171 -20
  73. data/lib/nba/client.rb +35 -0
  74. data/lib/nba/collection.rb +89 -0
  75. data/lib/nba/college_player_stat.rb +200 -0
  76. data/lib/nba/common_player_info.rb +142 -0
  77. data/lib/nba/common_playoff_series.rb +90 -0
  78. data/lib/nba/common_team_years.rb +113 -0
  79. data/lib/nba/conference.rb +39 -0
  80. data/lib/nba/connection.rb +84 -0
  81. data/lib/nba/cume_stats_player.rb +358 -0
  82. data/lib/nba/cume_stats_player_game.rb +217 -0
  83. data/lib/nba/cume_stats_player_games.rb +99 -0
  84. data/lib/nba/cume_stats_player_games_entry.rb +25 -0
  85. data/lib/nba/cume_stats_player_total.rb +481 -0
  86. data/lib/nba/cume_stats_team.rb +349 -0
  87. data/lib/nba/cume_stats_team_games.rb +145 -0
  88. data/lib/nba/cume_stats_team_games_entry.rb +25 -0
  89. data/lib/nba/cume_stats_team_player.rb +485 -0
  90. data/lib/nba/cume_stats_team_total.rb +267 -0
  91. data/lib/nba/data.rb +73 -0
  92. data/lib/nba/defense_hub.rb +109 -0
  93. data/lib/nba/defense_hub_stat.rb +57 -0
  94. data/lib/nba/defensive_shot_stat.rb +102 -0
  95. data/lib/nba/division.rb +49 -0
  96. data/lib/nba/draft_board.rb +126 -0
  97. data/lib/nba/draft_board_pick.rb +173 -0
  98. data/lib/nba/draft_combine_anthro_measurement.rb +163 -0
  99. data/lib/nba/draft_combine_drill_result.rb +115 -0
  100. data/lib/nba/draft_combine_drill_results.rb +112 -0
  101. data/lib/nba/draft_combine_non_stationary_shooting.rb +268 -0
  102. data/lib/nba/draft_combine_non_stationary_shooting_result.rb +355 -0
  103. data/lib/nba/draft_combine_player_anthro.rb +133 -0
  104. data/lib/nba/draft_combine_spot_shooting.rb +243 -0
  105. data/lib/nba/draft_combine_spot_shooting_result.rb +419 -0
  106. data/lib/nba/draft_combine_stat.rb +211 -0
  107. data/lib/nba/draft_combine_stats.rb +160 -0
  108. data/lib/nba/draft_history.rb +142 -0
  109. data/lib/nba/draft_pick.rb +154 -0
  110. data/lib/nba/dunk_score_leader.rb +93 -0
  111. data/lib/nba/dunk_score_leaders.rb +77 -0
  112. data/lib/nba/estimated_metrics_stat.rb +152 -0
  113. data/lib/nba/fantasy_profile_stat.rb +142 -0
  114. data/lib/nba/fantasy_widget.rb +72 -0
  115. data/lib/nba/fantasy_widget_player.rb +98 -0
  116. data/lib/nba/found_game.rb +260 -0
  117. data/lib/nba/franchise.rb +136 -0
  118. data/lib/nba/franchise_history.rb +142 -0
  119. data/lib/nba/franchise_leader.rb +147 -0
  120. data/lib/nba/franchise_leaders.rb +162 -0
  121. data/lib/nba/franchise_player.rb +224 -0
  122. data/lib/nba/franchise_players.rb +147 -0
  123. data/lib/nba/game.rb +80 -64
  124. data/lib/nba/game_log.rb +349 -0
  125. data/lib/nba/game_rotation.rb +152 -0
  126. data/lib/nba/game_streak.rb +102 -0
  127. data/lib/nba/games.rb +46 -0
  128. data/lib/nba/home_page_leader.rb +99 -0
  129. data/lib/nba/home_page_leaders.rb +75 -0
  130. data/lib/nba/home_page_stat.rb +57 -0
  131. data/lib/nba/home_page_v2.rb +110 -0
  132. data/lib/nba/hustle_stats_box_score.rb +182 -0
  133. data/lib/nba/infographic_fan_duel_player.rb +139 -0
  134. data/lib/nba/infographic_fan_duel_player_stat.rb +311 -0
  135. data/lib/nba/ist_standing.rb +167 -0
  136. data/lib/nba/ist_standings.rb +81 -0
  137. data/lib/nba/leader.rb +103 -0
  138. data/lib/nba/leaders.rb +110 -0
  139. data/lib/nba/leaders_tile.rb +57 -0
  140. data/lib/nba/leaders_tiles.rb +90 -0
  141. data/lib/nba/league.rb +37 -0
  142. data/lib/nba/league_dash_lineup_stat.rb +270 -0
  143. data/lib/nba/league_dash_lineups.rb +177 -0
  144. data/lib/nba/league_dash_opp_pt_shot.rb +150 -0
  145. data/lib/nba/league_dash_player_bio_stat.rb +217 -0
  146. data/lib/nba/league_dash_player_bio_stats.rb +164 -0
  147. data/lib/nba/league_dash_player_clutch.rb +212 -0
  148. data/lib/nba/league_dash_player_clutch_stat.rb +271 -0
  149. data/lib/nba/league_dash_player_pt_shot.rb +152 -0
  150. data/lib/nba/league_dash_player_pt_shot_stat.rb +193 -0
  151. data/lib/nba/league_dash_player_shot_location_stat.rb +265 -0
  152. data/lib/nba/league_dash_player_shot_locations.rb +210 -0
  153. data/lib/nba/league_dash_player_stat.rb +306 -0
  154. data/lib/nba/league_dash_player_stats.rb +176 -0
  155. data/lib/nba/league_dash_pt_defend.rb +160 -0
  156. data/lib/nba/league_dash_pt_defend_stat.rb +145 -0
  157. data/lib/nba/league_dash_pt_stats.rb +152 -0
  158. data/lib/nba/league_dash_pt_stats_stat.rb +169 -0
  159. data/lib/nba/league_dash_pt_team_defend.rb +158 -0
  160. data/lib/nba/league_dash_pt_team_defend_stat.rb +110 -0
  161. data/lib/nba/league_dash_team_clutch.rb +211 -0
  162. data/lib/nba/league_dash_team_clutch_stat.rb +237 -0
  163. data/lib/nba/league_dash_team_pt_shot.rb +150 -0
  164. data/lib/nba/league_dash_team_pt_shot_stat.rb +166 -0
  165. data/lib/nba/league_dash_team_shot_location_stat.rb +230 -0
  166. data/lib/nba/league_dash_team_shot_locations.rb +208 -0
  167. data/lib/nba/league_dash_team_stat.rb +275 -0
  168. data/lib/nba/league_dash_team_stats.rb +172 -0
  169. data/lib/nba/league_game_finder.rb +170 -0
  170. data/lib/nba/league_game_log.rb +224 -0
  171. data/lib/nba/league_hustle_stats_player.rb +161 -0
  172. data/lib/nba/league_hustle_stats_player_stat.rb +253 -0
  173. data/lib/nba/league_hustle_stats_team.rb +157 -0
  174. data/lib/nba/league_hustle_stats_team_stat.rb +179 -0
  175. data/lib/nba/league_lineup_viz.rb +184 -0
  176. data/lib/nba/league_lineup_viz_stat.rb +214 -0
  177. data/lib/nba/league_player_on_details.rb +175 -0
  178. data/lib/nba/league_player_on_details_stat.rb +313 -0
  179. data/lib/nba/league_season_matchup_stat.rb +241 -0
  180. data/lib/nba/league_season_matchups.rb +181 -0
  181. data/lib/nba/league_standing.rb +284 -0
  182. data/lib/nba/league_standings.rb +159 -0
  183. data/lib/nba/league_wide_shot_stat.rb +62 -0
  184. data/lib/nba/live_action.rb +240 -0
  185. data/lib/nba/live_box_score.rb +143 -0
  186. data/lib/nba/live_connection.rb +84 -0
  187. data/lib/nba/live_game.rb +230 -0
  188. data/lib/nba/live_play_by_play.rb +120 -0
  189. data/lib/nba/live_player_stat.rb +276 -0
  190. data/lib/nba/live_scoreboard.rb +102 -0
  191. data/lib/nba/matchup_rollup.rb +98 -0
  192. data/lib/nba/matchups_rollup.rb +81 -0
  193. data/lib/nba/pass_stat.rb +209 -0
  194. data/lib/nba/play.rb +258 -0
  195. data/lib/nba/play_by_play.rb +85 -0
  196. data/lib/nba/play_by_play_v3.rb +91 -0
  197. data/lib/nba/play_type_stat.rb +206 -0
  198. data/lib/nba/player.rb +242 -24
  199. data/lib/nba/player_awards.rb +110 -0
  200. data/lib/nba/player_career_by_college.rb +86 -0
  201. data/lib/nba/player_career_by_college_rollup.rb +143 -0
  202. data/lib/nba/player_career_stats.rb +77 -0
  203. data/lib/nba/player_compare.rb +156 -0
  204. data/lib/nba/player_comparison_stat.rb +242 -0
  205. data/lib/nba/player_dash_pt_pass.rb +164 -0
  206. data/lib/nba/player_dash_pt_reb.rb +235 -0
  207. data/lib/nba/player_dash_pt_shot_defend.rb +119 -0
  208. data/lib/nba/player_dash_pt_shots.rb +279 -0
  209. data/lib/nba/player_dashboard.rb +259 -0
  210. data/lib/nba/player_dashboard_stat.rb +248 -0
  211. data/lib/nba/player_estimated_metrics.rb +84 -0
  212. data/lib/nba/player_fantasy_profile_bar_graph.rb +147 -0
  213. data/lib/nba/player_game_log.rb +72 -0
  214. data/lib/nba/player_game_logs.rb +117 -0
  215. data/lib/nba/player_game_streak_finder.rb +108 -0
  216. data/lib/nba/player_index.rb +135 -0
  217. data/lib/nba/player_index_entry.rb +266 -0
  218. data/lib/nba/player_info.rb +225 -0
  219. data/lib/nba/player_next_n_games.rb +64 -0
  220. data/lib/nba/player_profile_v2.rb +169 -0
  221. data/lib/nba/player_vs_player.rb +153 -0
  222. data/lib/nba/players.rb +107 -0
  223. data/lib/nba/playoff_matchup.rb +84 -0
  224. data/lib/nba/playoff_picture.rb +98 -0
  225. data/lib/nba/playoff_series.rb +76 -0
  226. data/lib/nba/position.rb +48 -0
  227. data/lib/nba/rebound_stat.rb +189 -0
  228. data/lib/nba/response_parser.rb +116 -0
  229. data/lib/nba/roster.rb +74 -0
  230. data/lib/nba/rotation_entry.rb +154 -0
  231. data/lib/nba/schedule.rb +183 -0
  232. data/lib/nba/schedule_international.rb +182 -0
  233. data/lib/nba/scheduled_game.rb +240 -0
  234. data/lib/nba/scoreboard.rb +183 -0
  235. data/lib/nba/scoreboard_v3.rb +104 -0
  236. data/lib/nba/shot.rb +208 -0
  237. data/lib/nba/shot_chart.rb +75 -0
  238. data/lib/nba/shot_chart_league_wide.rb +102 -0
  239. data/lib/nba/shot_chart_lineup_detail.rb +109 -0
  240. data/lib/nba/shot_stat.rb +174 -0
  241. data/lib/nba/standing.rb +129 -0
  242. data/lib/nba/standings.rb +75 -0
  243. data/lib/nba/static.rb +107 -0
  244. data/lib/nba/synergy_play_types.rb +211 -0
  245. data/lib/nba/team.rb +203 -127
  246. data/lib/nba/team_and_players_vs_players.rb +227 -0
  247. data/lib/nba/team_and_players_vs_players_stat.rb +155 -0
  248. data/lib/nba/team_dash_pt_pass.rb +157 -0
  249. data/lib/nba/team_dash_pt_reb.rb +216 -0
  250. data/lib/nba/team_dash_pt_shots.rb +244 -0
  251. data/lib/nba/team_dashboard.rb +275 -0
  252. data/lib/nba/team_dashboard_stat.rb +248 -0
  253. data/lib/nba/team_detail.rb +117 -0
  254. data/lib/nba/team_details.rb +173 -0
  255. data/lib/nba/team_estimated_metrics.rb +91 -0
  256. data/lib/nba/team_estimated_metrics_stat.rb +146 -0
  257. data/lib/nba/team_game_log.rb +143 -0
  258. data/lib/nba/team_game_log_entry.rb +246 -0
  259. data/lib/nba/team_game_log_stat.rb +275 -0
  260. data/lib/nba/team_game_logs.rb +163 -0
  261. data/lib/nba/team_game_streak.rb +111 -0
  262. data/lib/nba/team_game_streak_finder.rb +109 -0
  263. data/lib/nba/team_historical_leader.rb +207 -0
  264. data/lib/nba/team_historical_leaders.rb +98 -0
  265. data/lib/nba/team_historical_record.rb +139 -0
  266. data/lib/nba/team_info.rb +150 -0
  267. data/lib/nba/team_info_common.rb +177 -0
  268. data/lib/nba/team_on_off_overall_stat.rb +477 -0
  269. data/lib/nba/team_on_off_player_stat.rb +523 -0
  270. data/lib/nba/team_on_off_player_summary.rb +135 -0
  271. data/lib/nba/team_pass_stat.rb +183 -0
  272. data/lib/nba/team_player_dashboard.rb +212 -0
  273. data/lib/nba/team_player_on_off_details.rb +218 -0
  274. data/lib/nba/team_player_on_off_summary.rb +214 -0
  275. data/lib/nba/team_player_stat.rb +275 -0
  276. data/lib/nba/team_rebound_stat.rb +189 -0
  277. data/lib/nba/team_season_rank.rb +110 -0
  278. data/lib/nba/team_shot_stat.rb +173 -0
  279. data/lib/nba/team_vs_player.rb +151 -0
  280. data/lib/nba/team_vs_player_stat.rb +157 -0
  281. data/lib/nba/team_year.rb +55 -0
  282. data/lib/nba/team_year_by_year_stats.rb +152 -0
  283. data/lib/nba/team_year_stat.rb +282 -0
  284. data/lib/nba/teams.rb +33 -0
  285. data/lib/nba/upcoming_game.rb +115 -0
  286. data/lib/nba/utils.rb +94 -0
  287. data/lib/nba/version.rb +5 -2
  288. data/lib/nba/video_detail.rb +103 -0
  289. data/lib/nba/video_details.rb +118 -0
  290. data/lib/nba/video_details_asset.rb +115 -0
  291. data/lib/nba/video_details_asset_entry.rb +91 -0
  292. data/lib/nba/video_event.rb +83 -0
  293. data/lib/nba/video_event_asset.rb +91 -0
  294. data/lib/nba/video_events.rb +106 -0
  295. data/lib/nba/video_events_asset.rb +107 -0
  296. data/lib/nba/video_status.rb +129 -0
  297. data/lib/nba/video_status_entry.rb +161 -0
  298. data/lib/nba/vs_player_stat.rb +156 -0
  299. data/lib/nba/win_probability.rb +117 -0
  300. data/lib/nba/win_probability_point.rb +140 -0
  301. data/lib/nba.rb +249 -5
  302. data/sig/equalizer.rbs +3 -0
  303. data/sig/nba.rbs +7297 -0
  304. data/sig/shale.rbs +24 -0
  305. data/sig/thor.rbs +19 -0
  306. metadata +324 -95
  307. data/.gitignore +0 -18
  308. data/.travis.yml +0 -22
  309. data/Gemfile +0 -23
  310. data/LICENSE.md +0 -22
  311. data/Rakefile +0 -18
  312. data/bin/nba +0 -7
  313. data/cache/teams.json +0 -16529
  314. data/lib/faraday_middleware/scrape_game.rb +0 -41
  315. data/lib/nba/request.rb +0 -37
  316. data/nba.gemspec +0 -28
  317. data/spec/fixtures/games.html +0 -785
  318. data/spec/fixtures/teams.json +0 -16529
  319. data/spec/game_spec.rb +0 -40
  320. data/spec/spec_helper.rb +0 -25
  321. data/spec/team_spec.rb +0 -93
@@ -0,0 +1,241 @@
1
+ require "equalizer"
2
+ require "shale"
3
+ require_relative "players"
4
+ require_relative "teams"
5
+
6
+ module NBA
7
+ # Represents a season matchup statistic between offensive and defensive players
8
+ #
9
+ # @api public
10
+ class LeagueSeasonMatchupStat < Shale::Mapper
11
+ include Equalizer.new(:season_id, :off_player_id, :def_player_id)
12
+
13
+ # @!attribute [rw] season_id
14
+ # Returns the season ID
15
+ # @api public
16
+ # @example
17
+ # stat.season_id #=> "22024"
18
+ # @return [String, nil] the season ID
19
+ attribute :season_id, Shale::Type::String
20
+
21
+ # @!attribute [rw] off_player_id
22
+ # Returns the offensive player ID
23
+ # @api public
24
+ # @example
25
+ # stat.off_player_id #=> 201939
26
+ # @return [Integer, nil] the offensive player's ID
27
+ attribute :off_player_id, Shale::Type::Integer
28
+
29
+ # @!attribute [rw] off_player_name
30
+ # Returns the offensive player name
31
+ # @api public
32
+ # @example
33
+ # stat.off_player_name #=> "Stephen Curry"
34
+ # @return [String, nil] the offensive player's name
35
+ attribute :off_player_name, Shale::Type::String
36
+
37
+ # @!attribute [rw] def_player_id
38
+ # Returns the defensive player ID
39
+ # @api public
40
+ # @example
41
+ # stat.def_player_id #=> 203507
42
+ # @return [Integer, nil] the defensive player's ID
43
+ attribute :def_player_id, Shale::Type::Integer
44
+
45
+ # @!attribute [rw] def_player_name
46
+ # Returns the defensive player name
47
+ # @api public
48
+ # @example
49
+ # stat.def_player_name #=> "Giannis Antetokounmpo"
50
+ # @return [String, nil] the defensive player's name
51
+ attribute :def_player_name, Shale::Type::String
52
+
53
+ # @!attribute [rw] gp
54
+ # Returns games played
55
+ # @api public
56
+ # @example
57
+ # stat.gp #=> 4
58
+ # @return [Integer, nil] games played
59
+ attribute :gp, Shale::Type::Integer
60
+
61
+ # @!attribute [rw] matchup_min
62
+ # Returns matchup minutes
63
+ # @api public
64
+ # @example
65
+ # stat.matchup_min #=> 12.5
66
+ # @return [Float, nil] matchup minutes
67
+ attribute :matchup_min, Shale::Type::Float
68
+
69
+ # @!attribute [rw] partial_poss
70
+ # Returns partial possessions
71
+ # @api public
72
+ # @example
73
+ # stat.partial_poss #=> 45.2
74
+ # @return [Float, nil] partial possessions
75
+ attribute :partial_poss, Shale::Type::Float
76
+
77
+ # @!attribute [rw] player_pts
78
+ # Returns points scored by offensive player
79
+ # @api public
80
+ # @example
81
+ # stat.player_pts #=> 18.0
82
+ # @return [Float, nil] player points
83
+ attribute :player_pts, Shale::Type::Float
84
+
85
+ # @!attribute [rw] team_pts
86
+ # Returns team points during matchup
87
+ # @api public
88
+ # @example
89
+ # stat.team_pts #=> 22.0
90
+ # @return [Float, nil] team points
91
+ attribute :team_pts, Shale::Type::Float
92
+
93
+ # @!attribute [rw] matchup_ast
94
+ # Returns assists during matchup
95
+ # @api public
96
+ # @example
97
+ # stat.matchup_ast #=> 3.0
98
+ # @return [Float, nil] matchup assists
99
+ attribute :matchup_ast, Shale::Type::Float
100
+
101
+ # @!attribute [rw] matchup_tov
102
+ # Returns turnovers during matchup
103
+ # @api public
104
+ # @example
105
+ # stat.matchup_tov #=> 1.0
106
+ # @return [Float, nil] matchup turnovers
107
+ attribute :matchup_tov, Shale::Type::Float
108
+
109
+ # @!attribute [rw] matchup_blk
110
+ # Returns blocks during matchup
111
+ # @api public
112
+ # @example
113
+ # stat.matchup_blk #=> 0.5
114
+ # @return [Float, nil] matchup blocks
115
+ attribute :matchup_blk, Shale::Type::Float
116
+
117
+ # @!attribute [rw] matchup_fgm
118
+ # Returns field goals made during matchup
119
+ # @api public
120
+ # @example
121
+ # stat.matchup_fgm #=> 6.0
122
+ # @return [Float, nil] matchup field goals made
123
+ attribute :matchup_fgm, Shale::Type::Float
124
+
125
+ # @!attribute [rw] matchup_fga
126
+ # Returns field goals attempted during matchup
127
+ # @api public
128
+ # @example
129
+ # stat.matchup_fga #=> 14.0
130
+ # @return [Float, nil] matchup field goals attempted
131
+ attribute :matchup_fga, Shale::Type::Float
132
+
133
+ # @!attribute [rw] matchup_fg_pct
134
+ # Returns field goal percentage during matchup
135
+ # @api public
136
+ # @example
137
+ # stat.matchup_fg_pct #=> 0.429
138
+ # @return [Float, nil] matchup field goal percentage
139
+ attribute :matchup_fg_pct, Shale::Type::Float
140
+
141
+ # @!attribute [rw] matchup_fg3m
142
+ # Returns three-pointers made during matchup
143
+ # @api public
144
+ # @example
145
+ # stat.matchup_fg3m #=> 2.0
146
+ # @return [Float, nil] matchup three-pointers made
147
+ attribute :matchup_fg3m, Shale::Type::Float
148
+
149
+ # @!attribute [rw] matchup_fg3a
150
+ # Returns three-pointers attempted during matchup
151
+ # @api public
152
+ # @example
153
+ # stat.matchup_fg3a #=> 6.0
154
+ # @return [Float, nil] matchup three-pointers attempted
155
+ attribute :matchup_fg3a, Shale::Type::Float
156
+
157
+ # @!attribute [rw] matchup_fg3_pct
158
+ # Returns three-point percentage during matchup
159
+ # @api public
160
+ # @example
161
+ # stat.matchup_fg3_pct #=> 0.333
162
+ # @return [Float, nil] matchup three-point percentage
163
+ attribute :matchup_fg3_pct, Shale::Type::Float
164
+
165
+ # @!attribute [rw] help_blk
166
+ # Returns help blocks
167
+ # @api public
168
+ # @example
169
+ # stat.help_blk #=> 0.0
170
+ # @return [Float, nil] help blocks
171
+ attribute :help_blk, Shale::Type::Float
172
+
173
+ # @!attribute [rw] help_fgm
174
+ # Returns help field goals made
175
+ # @api public
176
+ # @example
177
+ # stat.help_fgm #=> 1.0
178
+ # @return [Float, nil] help field goals made
179
+ attribute :help_fgm, Shale::Type::Float
180
+
181
+ # @!attribute [rw] help_fga
182
+ # Returns help field goals attempted
183
+ # @api public
184
+ # @example
185
+ # stat.help_fga #=> 2.0
186
+ # @return [Float, nil] help field goals attempted
187
+ attribute :help_fga, Shale::Type::Float
188
+
189
+ # @!attribute [rw] help_fg_pct
190
+ # Returns help field goal percentage
191
+ # @api public
192
+ # @example
193
+ # stat.help_fg_pct #=> 0.500
194
+ # @return [Float, nil] help field goal percentage
195
+ attribute :help_fg_pct, Shale::Type::Float
196
+
197
+ # @!attribute [rw] matchup_ftm
198
+ # Returns free throws made during matchup
199
+ # @api public
200
+ # @example
201
+ # stat.matchup_ftm #=> 4.0
202
+ # @return [Float, nil] matchup free throws made
203
+ attribute :matchup_ftm, Shale::Type::Float
204
+
205
+ # @!attribute [rw] matchup_fta
206
+ # Returns free throws attempted during matchup
207
+ # @api public
208
+ # @example
209
+ # stat.matchup_fta #=> 5.0
210
+ # @return [Float, nil] matchup free throws attempted
211
+ attribute :matchup_fta, Shale::Type::Float
212
+
213
+ # @!attribute [rw] sfl
214
+ # Returns shooting fouls drawn
215
+ # @api public
216
+ # @example
217
+ # stat.sfl #=> 2.0
218
+ # @return [Float, nil] shooting fouls
219
+ attribute :sfl, Shale::Type::Float
220
+
221
+ # Returns the offensive player
222
+ #
223
+ # @api public
224
+ # @example
225
+ # stat.off_player #=> #<NBA::Player id=201939 ...>
226
+ # @return [Player, nil] the offensive player object
227
+ def off_player
228
+ Players.find(off_player_id)
229
+ end
230
+
231
+ # Returns the defensive player
232
+ #
233
+ # @api public
234
+ # @example
235
+ # stat.def_player #=> #<NBA::Player id=203507 ...>
236
+ # @return [Player, nil] the defensive player object
237
+ def def_player
238
+ Players.find(def_player_id)
239
+ end
240
+ end
241
+ end
@@ -0,0 +1,181 @@
1
+ require "json"
2
+ require_relative "client"
3
+ require_relative "collection"
4
+ require_relative "league_season_matchup_stat"
5
+ require_relative "utils"
6
+
7
+ module NBA
8
+ # Provides methods to retrieve league-wide season matchup statistics
9
+ #
10
+ # @api public
11
+ module LeagueSeasonMatchups
12
+ # Result set name for season matchups
13
+ # @return [String] the result set name
14
+ SEASON_MATCHUPS = "SeasonMatchups".freeze
15
+
16
+ # Regular season type constant
17
+ # @return [String] the season type
18
+ REGULAR_SEASON = "Regular Season".freeze
19
+
20
+ # Playoffs season type constant
21
+ # @return [String] the season type
22
+ PLAYOFFS = "Playoffs".freeze
23
+
24
+ # Per game mode constant
25
+ # @return [String] the per mode
26
+ PER_GAME = "PerGame".freeze
27
+
28
+ # Totals mode constant
29
+ # @return [String] the per mode
30
+ TOTALS = "Totals".freeze
31
+
32
+ # Retrieves all league-wide season matchup statistics
33
+ #
34
+ # @api public
35
+ # @example
36
+ # matchups = NBA::LeagueSeasonMatchups.all(season: 2024)
37
+ # matchups.first.off_player_name #=> "Stephen Curry"
38
+ # @param season [Integer] the season year
39
+ # @param season_type [String] the season type
40
+ # @param per_mode [String] the per mode
41
+ # @param off_player [Integer, #id, nil] offensive player ID or object
42
+ # @param def_player [Integer, #id, nil] defensive player ID or object
43
+ # @param off_team [Integer, #id, nil] offensive team ID or object
44
+ # @param def_team [Integer, #id, nil] defensive team ID or object
45
+ # @param client [Client] the API client to use
46
+ # @return [Collection] a collection of matchup statistics
47
+ def self.all(season: Utils.current_season, season_type: REGULAR_SEASON, per_mode: PER_GAME,
48
+ off_player: nil, def_player: nil, off_team: nil, def_team: nil, client: CLIENT)
49
+ path = build_path(season, season_type: season_type, per_mode: per_mode,
50
+ off_player: off_player, def_player: def_player, off_team: off_team, def_team: def_team)
51
+ response = client.get(path)
52
+ parse_response(response)
53
+ end
54
+
55
+ # Builds the API request path
56
+ #
57
+ # @api private
58
+ # @return [String] the request path
59
+ def self.build_path(season, opts)
60
+ season_str = Utils.format_season(season)
61
+ path = "leagueseasonmatchups?LeagueID=00&Season=#{season_str}" \
62
+ "&SeasonType=#{opts.fetch(:season_type)}&PerMode=#{opts.fetch(:per_mode)}"
63
+ append_optional_params(path, opts)
64
+ end
65
+ private_class_method :build_path
66
+
67
+ # Appends optional parameters to the path
68
+ #
69
+ # @api private
70
+ # @return [String] the path with optional parameters
71
+ def self.append_optional_params(path, opts)
72
+ off_player_id = Utils.extract_id(opts.fetch(:off_player))
73
+ def_player_id = Utils.extract_id(opts.fetch(:def_player))
74
+ off_team_id = Utils.extract_id(opts.fetch(:off_team))
75
+ def_team_id = Utils.extract_id(opts.fetch(:def_team))
76
+
77
+ path += "&OffPlayerID=#{off_player_id}" if off_player_id
78
+ path += "&DefPlayerID=#{def_player_id}" if def_player_id
79
+ path += "&OffTeamID=#{off_team_id}" if off_team_id
80
+ path += "&DefTeamID=#{def_team_id}" if def_team_id
81
+ path
82
+ end
83
+ private_class_method :append_optional_params
84
+
85
+ # Parses the API response into stat objects
86
+ #
87
+ # @api private
88
+ # @return [Collection] collection of matchup stats
89
+ def self.parse_response(response)
90
+ return Collection.new if response.nil? || response.empty?
91
+
92
+ data = JSON.parse(response)
93
+ result_set = find_result_set(data)
94
+ build_stats(result_set)
95
+ end
96
+ private_class_method :parse_response
97
+
98
+ # Finds the result set by name
99
+ #
100
+ # @api private
101
+ # @return [Hash, nil] the result set hash or nil if not found
102
+ def self.find_result_set(data)
103
+ result_sets = data["resultSets"]
104
+ return unless result_sets
105
+
106
+ result_sets.find { |rs| rs["name"].eql?(SEASON_MATCHUPS) }
107
+ end
108
+ private_class_method :find_result_set
109
+
110
+ # Builds stats collection from result set
111
+ #
112
+ # @api private
113
+ # @return [Collection] the stats collection
114
+ def self.build_stats(result_set)
115
+ return Collection.new unless result_set
116
+
117
+ headers = result_set["headers"]
118
+ rows = result_set["rowSet"]
119
+ return Collection.new unless headers && rows
120
+
121
+ Collection.new(rows.map { |row| build_stat(headers.zip(row).to_h) })
122
+ end
123
+ private_class_method :build_stats
124
+
125
+ # Builds a single stat object from API data
126
+ #
127
+ # @api private
128
+ # @return [LeagueSeasonMatchupStat] the stat object
129
+ def self.build_stat(data)
130
+ LeagueSeasonMatchupStat.new(**identity_info(data), **matchup_stats(data), **shooting_stats(data),
131
+ **help_stats(data))
132
+ end
133
+ private_class_method :build_stat
134
+
135
+ # Extracts identity information from data
136
+ #
137
+ # @api private
138
+ # @return [Hash] the identity information hash
139
+ def self.identity_info(data)
140
+ {season_id: data["SEASON_ID"], off_player_id: data["OFF_PLAYER_ID"],
141
+ off_player_name: data["OFF_PLAYER_NAME"], def_player_id: data["DEF_PLAYER_ID"],
142
+ def_player_name: data["DEF_PLAYER_NAME"], gp: data["GP"]}
143
+ end
144
+ private_class_method :identity_info
145
+
146
+ # Extracts matchup statistics from data
147
+ #
148
+ # @api private
149
+ # @return [Hash] the matchup statistics hash
150
+ def self.matchup_stats(data)
151
+ {matchup_min: data["MATCHUP_MIN"], partial_poss: data["PARTIAL_POSS"],
152
+ player_pts: data["PLAYER_PTS"], team_pts: data["TEAM_PTS"],
153
+ matchup_ast: data["MATCHUP_AST"], matchup_tov: data["MATCHUP_TOV"],
154
+ matchup_blk: data["MATCHUP_BLK"]}
155
+ end
156
+ private_class_method :matchup_stats
157
+
158
+ # Extracts shooting statistics from data
159
+ #
160
+ # @api private
161
+ # @return [Hash] the shooting statistics hash
162
+ def self.shooting_stats(data)
163
+ {matchup_fgm: data["MATCHUP_FGM"], matchup_fga: data["MATCHUP_FGA"],
164
+ matchup_fg_pct: data["MATCHUP_FG_PCT"], matchup_fg3m: data["MATCHUP_FG3M"],
165
+ matchup_fg3a: data["MATCHUP_FG3A"], matchup_fg3_pct: data["MATCHUP_FG3_PCT"],
166
+ matchup_ftm: data["MATCHUP_FTM"], matchup_fta: data["MATCHUP_FTA"],
167
+ sfl: data["SFL"]}
168
+ end
169
+ private_class_method :shooting_stats
170
+
171
+ # Extracts help defense statistics from data
172
+ #
173
+ # @api private
174
+ # @return [Hash] the help defense statistics hash
175
+ def self.help_stats(data)
176
+ {help_blk: data["HELP_BLK"], help_fgm: data["HELP_FGM"],
177
+ help_fga: data["HELP_FGA"], help_fg_pct: data["HELP_FG_PERC"]}
178
+ end
179
+ private_class_method :help_stats
180
+ end
181
+ end
@@ -0,0 +1,284 @@
1
+ module NBA
2
+ # Represents a team's standing with extended information
3
+ class LeagueStanding < Shale::Mapper
4
+ include Equalizer.new(:team_id, :season_id)
5
+
6
+ # @!attribute [rw] league_id
7
+ # Returns the league ID
8
+ # @api public
9
+ # @example
10
+ # standing.league_id #=> "00"
11
+ # @return [String] the league ID
12
+ attribute :league_id, Shale::Type::String
13
+
14
+ # @!attribute [rw] season_id
15
+ # Returns the season ID
16
+ # @api public
17
+ # @example
18
+ # standing.season_id #=> "22024"
19
+ # @return [String] the season ID
20
+ attribute :season_id, Shale::Type::String
21
+
22
+ # @!attribute [rw] team_id
23
+ # Returns the team ID
24
+ # @api public
25
+ # @example
26
+ # standing.team_id #=> 1610612744
27
+ # @return [Integer] the team ID
28
+ attribute :team_id, Shale::Type::Integer
29
+
30
+ # @!attribute [rw] team_city
31
+ # Returns the team city
32
+ # @api public
33
+ # @example
34
+ # standing.team_city #=> "Golden State"
35
+ # @return [String] the team city
36
+ attribute :team_city, Shale::Type::String
37
+
38
+ # @!attribute [rw] team_name
39
+ # Returns the team name
40
+ # @api public
41
+ # @example
42
+ # standing.team_name #=> "Warriors"
43
+ # @return [String] the team name
44
+ attribute :team_name, Shale::Type::String
45
+
46
+ # @!attribute [rw] team_slug
47
+ # Returns the team slug
48
+ # @api public
49
+ # @example
50
+ # standing.team_slug #=> "warriors"
51
+ # @return [String] the team slug
52
+ attribute :team_slug, Shale::Type::String
53
+
54
+ # @!attribute [rw] conference
55
+ # Returns the conference
56
+ # @api public
57
+ # @example
58
+ # standing.conference #=> "West"
59
+ # @return [String] the conference
60
+ attribute :conference, Shale::Type::String
61
+
62
+ # @!attribute [rw] conference_record
63
+ # Returns the conference record
64
+ # @api public
65
+ # @example
66
+ # standing.conference_record #=> "30-22"
67
+ # @return [String] the conference record
68
+ attribute :conference_record, Shale::Type::String
69
+
70
+ # @!attribute [rw] playoff_rank
71
+ # Returns the playoff rank
72
+ # @api public
73
+ # @example
74
+ # standing.playoff_rank #=> 10
75
+ # @return [Integer] the playoff rank
76
+ attribute :playoff_rank, Shale::Type::Integer
77
+
78
+ # @!attribute [rw] clinch_indicator
79
+ # Returns the clinch indicator
80
+ # @api public
81
+ # @example
82
+ # standing.clinch_indicator #=> "x"
83
+ # @return [String] the clinch indicator
84
+ attribute :clinch_indicator, Shale::Type::String
85
+
86
+ # @!attribute [rw] division
87
+ # Returns the division
88
+ # @api public
89
+ # @example
90
+ # standing.division #=> "Pacific"
91
+ # @return [String] the division
92
+ attribute :division, Shale::Type::String
93
+
94
+ # @!attribute [rw] division_record
95
+ # Returns the division record
96
+ # @api public
97
+ # @example
98
+ # standing.division_record #=> "8-8"
99
+ # @return [String] the division record
100
+ attribute :division_record, Shale::Type::String
101
+
102
+ # @!attribute [rw] division_rank
103
+ # Returns the division rank
104
+ # @api public
105
+ # @example
106
+ # standing.division_rank #=> 3
107
+ # @return [Integer] the division rank
108
+ attribute :division_rank, Shale::Type::Integer
109
+
110
+ # @!attribute [rw] wins
111
+ # Returns the number of wins
112
+ # @api public
113
+ # @example
114
+ # standing.wins #=> 46
115
+ # @return [Integer] the wins
116
+ attribute :wins, Shale::Type::Integer
117
+
118
+ # @!attribute [rw] losses
119
+ # Returns the number of losses
120
+ # @api public
121
+ # @example
122
+ # standing.losses #=> 36
123
+ # @return [Integer] the losses
124
+ attribute :losses, Shale::Type::Integer
125
+
126
+ # @!attribute [rw] win_pct
127
+ # Returns the win percentage
128
+ # @api public
129
+ # @example
130
+ # standing.win_pct #=> 0.561
131
+ # @return [Float] the win percentage
132
+ attribute :win_pct, Shale::Type::Float
133
+
134
+ # @!attribute [rw] league_rank
135
+ # Returns the league rank
136
+ # @api public
137
+ # @example
138
+ # standing.league_rank #=> 15
139
+ # @return [Integer] the league rank
140
+ attribute :league_rank, Shale::Type::Integer
141
+
142
+ # @!attribute [rw] record
143
+ # Returns the full record string
144
+ # @api public
145
+ # @example
146
+ # standing.record #=> "46-36"
147
+ # @return [String] the record
148
+ attribute :record, Shale::Type::String
149
+
150
+ # @!attribute [rw] home_record
151
+ # Returns the home record
152
+ # @api public
153
+ # @example
154
+ # standing.home_record #=> "28-13"
155
+ # @return [String] the home record
156
+ attribute :home_record, Shale::Type::String
157
+
158
+ # @!attribute [rw] road_record
159
+ # Returns the road record
160
+ # @api public
161
+ # @example
162
+ # standing.road_record #=> "18-23"
163
+ # @return [String] the road record
164
+ attribute :road_record, Shale::Type::String
165
+
166
+ # @!attribute [rw] l10_record
167
+ # Returns the last 10 games record
168
+ # @api public
169
+ # @example
170
+ # standing.l10_record #=> "6-4"
171
+ # @return [String] the L10 record
172
+ attribute :l10_record, Shale::Type::String
173
+
174
+ # @!attribute [rw] long_win_streak
175
+ # Returns the longest win streak
176
+ # @api public
177
+ # @example
178
+ # standing.long_win_streak #=> 7
179
+ # @return [Integer] the longest win streak
180
+ attribute :long_win_streak, Shale::Type::Integer
181
+
182
+ # @!attribute [rw] long_loss_streak
183
+ # Returns the longest loss streak
184
+ # @api public
185
+ # @example
186
+ # standing.long_loss_streak #=> 4
187
+ # @return [Integer] the longest loss streak
188
+ attribute :long_loss_streak, Shale::Type::Integer
189
+
190
+ # @!attribute [rw] current_streak
191
+ # Returns the current streak
192
+ # @api public
193
+ # @example
194
+ # standing.current_streak #=> "W 2"
195
+ # @return [String] the current streak
196
+ attribute :current_streak, Shale::Type::String
197
+
198
+ # @!attribute [rw] conference_games_back
199
+ # Returns games back in the conference
200
+ # @api public
201
+ # @example
202
+ # standing.conference_games_back #=> 12.0
203
+ # @return [Float] the games back
204
+ attribute :conference_games_back, Shale::Type::Float
205
+
206
+ # @!attribute [rw] clinched_conference_title
207
+ # Returns if team clinched conference title
208
+ # @api public
209
+ # @example
210
+ # standing.clinched_conference_title #=> 0
211
+ # @return [Integer] 1 if clinched, 0 otherwise
212
+ attribute :clinched_conference_title, Shale::Type::Integer
213
+
214
+ # @!attribute [rw] clinched_playoff_birth
215
+ # Returns if team clinched playoff berth
216
+ # @api public
217
+ # @example
218
+ # standing.clinched_playoff_birth #=> 1
219
+ # @return [Integer] 1 if clinched, 0 otherwise
220
+ attribute :clinched_playoff_birth, Shale::Type::Integer
221
+
222
+ # @!attribute [rw] eliminated_conference
223
+ # Returns if team is eliminated from conference
224
+ # @api public
225
+ # @example
226
+ # standing.eliminated_conference #=> 0
227
+ # @return [Integer] 1 if eliminated, 0 otherwise
228
+ attribute :eliminated_conference, Shale::Type::Integer
229
+
230
+ # @!attribute [rw] points_pg
231
+ # Returns points per game
232
+ # @api public
233
+ # @example
234
+ # standing.points_pg #=> 118.7
235
+ # @return [Float] the points per game
236
+ attribute :points_pg, Shale::Type::Float
237
+
238
+ # @!attribute [rw] opp_points_pg
239
+ # Returns opponent points per game
240
+ # @api public
241
+ # @example
242
+ # standing.opp_points_pg #=> 117.2
243
+ # @return [Float] the opponent points per game
244
+ attribute :opp_points_pg, Shale::Type::Float
245
+
246
+ # @!attribute [rw] diff_points_pg
247
+ # Returns point differential per game
248
+ # @api public
249
+ # @example
250
+ # standing.diff_points_pg #=> 1.5
251
+ # @return [Float] the point differential
252
+ attribute :diff_points_pg, Shale::Type::Float
253
+
254
+ # Returns the team object
255
+ #
256
+ # @api public
257
+ # @example
258
+ # standing.team #=> #<NBA::Team>
259
+ # @return [Team, nil] the team object
260
+ def team
261
+ Teams.find(team_id)
262
+ end
263
+
264
+ # Returns the full team name
265
+ #
266
+ # @api public
267
+ # @example
268
+ # standing.full_name #=> "Golden State Warriors"
269
+ # @return [String] the full name
270
+ def full_name
271
+ "#{team_city} #{team_name}".strip
272
+ end
273
+
274
+ # Returns whether the team made the playoffs
275
+ #
276
+ # @api public
277
+ # @example
278
+ # standing.playoffs? #=> true
279
+ # @return [Boolean] true if in playoffs
280
+ def playoffs?
281
+ clinched_playoff_birth.eql?(1)
282
+ end
283
+ end
284
+ end