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,102 @@
1
+ require "json"
2
+ require_relative "collection"
3
+ require_relative "live_connection"
4
+ require_relative "live_game"
5
+
6
+ module NBA
7
+ # Default live client instance
8
+ LIVE_CLIENT = LiveConnection.new
9
+
10
+ # Provides methods to retrieve live NBA scoreboard data
11
+ module LiveScoreboard
12
+ # Retrieves today's live scoreboard
13
+ #
14
+ # @api public
15
+ # @example
16
+ # games = NBA::LiveScoreboard.today
17
+ # games.each { |g| puts "#{g.away_team_tricode} #{g.away_team_score} @ #{g.home_team_tricode} #{g.home_team_score}" }
18
+ # @param client [LiveConnection] the API client to use
19
+ # @return [Collection] a collection of live games
20
+ def self.today(client: LIVE_CLIENT)
21
+ path = "scoreboard/todaysScoreboard_00.json"
22
+ response = client.get(path)
23
+ parse_response(response)
24
+ end
25
+
26
+ # Parses the live scoreboard API response
27
+ #
28
+ # @api private
29
+ # @param response [String, nil] the JSON response body
30
+ # @return [Collection] a collection of live games
31
+ def self.parse_response(response)
32
+ return Collection.new unless response
33
+
34
+ data = JSON.parse(response)
35
+ games = data.dig("scoreboard", "games")
36
+ return Collection.new unless games
37
+
38
+ live_games = games.map { |game| build_live_game(game) }
39
+ Collection.new(live_games)
40
+ end
41
+ private_class_method :parse_response
42
+
43
+ # Builds a LiveGame object from raw data
44
+ #
45
+ # @api private
46
+ # @param data [Hash] the game data
47
+ # @return [LiveGame] the live game object
48
+ def self.build_live_game(data)
49
+ LiveGame.new(**live_game_attributes(data))
50
+ end
51
+ private_class_method :build_live_game
52
+
53
+ # Combines all live game attributes
54
+ #
55
+ # @api private
56
+ # @param data [Hash] the game data
57
+ # @return [Hash] the combined attributes
58
+ def self.live_game_attributes(data)
59
+ game_info_attributes(data).merge(home_team_attributes(data), away_team_attributes(data))
60
+ end
61
+ private_class_method :live_game_attributes
62
+
63
+ # Extracts game info attributes from data
64
+ #
65
+ # @api private
66
+ # @param data [Hash] the game data
67
+ # @return [Hash] game info attributes
68
+ def self.game_info_attributes(data)
69
+ {game_id: data["gameId"], game_code: data["gameCode"],
70
+ game_status: data["gameStatus"], game_status_text: data["gameStatusText"],
71
+ period: data["period"], game_clock: data["gameClock"],
72
+ game_time_utc: data["gameTimeUTC"], game_et: data["gameEt"]}
73
+ end
74
+ private_class_method :game_info_attributes
75
+
76
+ # Extracts home team attributes from data
77
+ #
78
+ # @api private
79
+ # @param data [Hash] the game data
80
+ # @return [Hash] home team attributes
81
+ def self.home_team_attributes(data)
82
+ home = data["homeTeam"] || {}
83
+ {home_team_id: home["teamId"], home_team_name: home["teamName"],
84
+ home_team_city: home["teamCity"], home_team_tricode: home["teamTricode"],
85
+ home_team_score: home["score"]}
86
+ end
87
+ private_class_method :home_team_attributes
88
+
89
+ # Extracts away team attributes from data
90
+ #
91
+ # @api private
92
+ # @param data [Hash] the game data
93
+ # @return [Hash] away team attributes
94
+ def self.away_team_attributes(data)
95
+ away = data["awayTeam"] || {}
96
+ {away_team_id: away["teamId"], away_team_name: away["teamName"],
97
+ away_team_city: away["teamCity"], away_team_tricode: away["teamTricode"],
98
+ away_team_score: away["score"]}
99
+ end
100
+ private_class_method :away_team_attributes
101
+ end
102
+ end
@@ -0,0 +1,98 @@
1
+ require "equalizer"
2
+ require "shale"
3
+
4
+ module NBA
5
+ # Represents a matchup rollup statistic entry
6
+ #
7
+ # @api public
8
+ # @example
9
+ # matchup.def_player_name #=> "Jayson Tatum"
10
+ # matchup.matchup_fg_pct #=> 0.425
11
+ class MatchupRollup < Shale::Mapper
12
+ include Equalizer.new(:season_id, :def_player_id, :position)
13
+
14
+ # Returns the season ID
15
+ # @api public
16
+ # @example
17
+ # matchup.season_id #=> "22023"
18
+ # @return [String, nil] the season ID
19
+ attribute :season_id, Shale::Type::String
20
+
21
+ # Returns the position
22
+ # @api public
23
+ # @example
24
+ # matchup.position #=> "F"
25
+ # @return [String, nil] the position
26
+ attribute :position, Shale::Type::String
27
+
28
+ # Returns percent of time
29
+ # @api public
30
+ # @example
31
+ # matchup.percent_of_time #=> 0.15
32
+ # @return [Float, nil] percent of time
33
+ attribute :percent_of_time, Shale::Type::Float
34
+
35
+ # Returns the defensive player ID
36
+ # @api public
37
+ # @example
38
+ # matchup.def_player_id #=> 1628369
39
+ # @return [Integer, nil] the defensive player ID
40
+ attribute :def_player_id, Shale::Type::Integer
41
+
42
+ # Returns the defensive player name
43
+ # @api public
44
+ # @example
45
+ # matchup.def_player_name #=> "Jayson Tatum"
46
+ # @return [String, nil] the defensive player name
47
+ attribute :def_player_name, Shale::Type::String
48
+
49
+ # Returns games played
50
+ # @api public
51
+ # @example
52
+ # matchup.gp #=> 82
53
+ # @return [Integer, nil] games played
54
+ attribute :gp, Shale::Type::Integer
55
+
56
+ # Returns matchup minutes
57
+ # @api public
58
+ # @example
59
+ # matchup.matchup_min #=> 2.5
60
+ # @return [Float, nil] matchup minutes
61
+ attribute :matchup_min, Shale::Type::Float
62
+
63
+ # Returns partial possessions
64
+ # @api public
65
+ # @example
66
+ # matchup.partial_poss #=> 1.8
67
+ # @return [Float, nil] partial possessions
68
+ attribute :partial_poss, Shale::Type::Float
69
+
70
+ # Returns player points
71
+ # @api public
72
+ # @example
73
+ # matchup.player_pts #=> 1.2
74
+ # @return [Float, nil] player points
75
+ attribute :player_pts, Shale::Type::Float
76
+
77
+ # Returns team points
78
+ # @api public
79
+ # @example
80
+ # matchup.team_pts #=> 1.4
81
+ # @return [Float, nil] team points
82
+ attribute :team_pts, Shale::Type::Float
83
+
84
+ # Returns matchup field goal percentage
85
+ # @api public
86
+ # @example
87
+ # matchup.matchup_fg_pct #=> 0.425
88
+ # @return [Float, nil] matchup field goal percentage
89
+ attribute :matchup_fg_pct, Shale::Type::Float
90
+
91
+ # Returns matchup 3-point percentage
92
+ # @api public
93
+ # @example
94
+ # matchup.matchup_fg3_pct #=> 0.375
95
+ # @return [Float, nil] matchup 3-point percentage
96
+ attribute :matchup_fg3_pct, Shale::Type::Float
97
+ end
98
+ end
@@ -0,0 +1,81 @@
1
+ require "json"
2
+ require_relative "client"
3
+ require_relative "collection"
4
+ require_relative "matchup_rollup"
5
+ require_relative "league"
6
+ require_relative "response_parser"
7
+ require_relative "utils"
8
+
9
+ module NBA
10
+ # Provides methods to retrieve NBA matchup rollup statistics
11
+ module MatchupsRollup
12
+ # Result set name for matchups rollup
13
+ # @return [String] the result set name
14
+ RESULT_SET = "MatchupsRollup".freeze
15
+
16
+ # Retrieves matchup rollup statistics
17
+ #
18
+ # @api public
19
+ # @example
20
+ # matchups = NBA::MatchupsRollup.all(season: 2023)
21
+ # matchups.each { |m| puts "#{m.def_player_name}: #{m.matchup_fg_pct}" }
22
+ # @param season [Integer] the season year (defaults to current season)
23
+ # @param season_type [String] the season type (Regular Season, Playoffs, etc.)
24
+ # @param per_mode [String] the per mode (Totals, PerGame, etc.)
25
+ # @param def_player [Integer, Player, nil] the defensive player ID or Player object
26
+ # @param def_team [Integer, Team, nil] the defensive team ID or Team object
27
+ # @param off_player [Integer, Player, nil] the offensive player ID or Player object
28
+ # @param off_team [Integer, Team, nil] the offensive team ID or Team object
29
+ # @param league [String, League] the league ID or League object
30
+ # @param client [Client] the API client to use
31
+ # @return [Collection] a collection of matchup rollups
32
+ def self.all(season: Utils.current_season, season_type: "Regular Season",
33
+ per_mode: "Totals", def_player: nil, def_team: nil, off_player: nil,
34
+ off_team: nil, league: League::NBA, client: CLIENT)
35
+ league_id = Utils.extract_league_id(league)
36
+ opts = {season: season, season_type: season_type, per_mode: per_mode,
37
+ def_player_id: Utils.extract_id(def_player), def_team_id: Utils.extract_id(def_team),
38
+ off_player_id: Utils.extract_id(off_player), off_team_id: Utils.extract_id(off_team),
39
+ league_id: league_id}
40
+ ResponseParser.parse(client.get(build_path(opts)), result_set: RESULT_SET) do |data|
41
+ build_matchup(data)
42
+ end
43
+ end
44
+
45
+ # Builds the API request path
46
+ # @api private
47
+ # @return [String] the request path
48
+ def self.build_path(opts)
49
+ "matchupsrollup?DefPlayerID=#{opts[:def_player_id]}&DefTeamID=#{opts[:def_team_id]}" \
50
+ "&LeagueID=#{opts[:league_id]}&OffPlayerID=#{opts[:off_player_id]}" \
51
+ "&OffTeamID=#{opts[:off_team_id]}&PerMode=#{opts[:per_mode]}" \
52
+ "&Season=#{Utils.format_season(opts[:season])}&SeasonType=#{opts[:season_type]}"
53
+ end
54
+ private_class_method :build_path
55
+
56
+ # Builds a MatchupRollup object from raw data
57
+ # @api private
58
+ # @param data [Hash] the row data
59
+ # @return [MatchupRollup] the matchup object
60
+ def self.build_matchup(data)
61
+ MatchupRollup.new(**matchup_attributes(data))
62
+ end
63
+ private_class_method :build_matchup
64
+
65
+ # Extracts matchup attributes from data
66
+ # @api private
67
+ # @param data [Hash] the row data
68
+ # @return [Hash] matchup attributes
69
+ def self.matchup_attributes(data)
70
+ {season_id: data["SEASON_ID"], position: data["POSITION"],
71
+ percent_of_time: data["PERCENT_OF_TIME"],
72
+ def_player_id: data["DEF_PLAYER_ID"],
73
+ def_player_name: data["DEF_PLAYER_NAME"], gp: data["GP"],
74
+ matchup_min: data["MATCHUP_MIN"],
75
+ partial_poss: data["PARTIAL_POSS"], player_pts: data["PLAYER_PTS"],
76
+ team_pts: data["TEAM_PTS"], matchup_fg_pct: data["MATCHUP_FG_PCT"],
77
+ matchup_fg3_pct: data["MATCHUP_FG3_PCT"]}
78
+ end
79
+ private_class_method :matchup_attributes
80
+ end
81
+ end
@@ -0,0 +1,209 @@
1
+ require "equalizer"
2
+ require "shale"
3
+
4
+ module NBA
5
+ # Represents player tracking pass statistics
6
+ #
7
+ # @api public
8
+ class PassStat < Shale::Mapper
9
+ include Equalizer.new(:player_id, :pass_to)
10
+
11
+ # @!attribute [rw] player_id
12
+ # Returns the player ID
13
+ # @api public
14
+ # @example
15
+ # stat.player_id #=> 201939
16
+ # @return [Integer] the player ID
17
+ attribute :player_id, Shale::Type::Integer
18
+
19
+ # @!attribute [rw] player_name_last_first
20
+ # Returns the player name in "Last, First" format
21
+ # @api public
22
+ # @example
23
+ # stat.player_name_last_first #=> "Curry, Stephen"
24
+ # @return [String] the player name
25
+ attribute :player_name_last_first, Shale::Type::String
26
+
27
+ # @!attribute [rw] pass_to
28
+ # Returns the pass recipient or passer name
29
+ # @api public
30
+ # @example
31
+ # stat.pass_to #=> "Klay Thompson"
32
+ # @return [String] the pass partner name
33
+ attribute :pass_to, Shale::Type::String
34
+
35
+ # @!attribute [rw] pass_teammate_player_id
36
+ # Returns the pass partner player ID
37
+ # @api public
38
+ # @example
39
+ # stat.pass_teammate_player_id #=> 202691
40
+ # @return [Integer] the teammate player ID
41
+ attribute :pass_teammate_player_id, Shale::Type::Integer
42
+
43
+ # @!attribute [rw] team_id
44
+ # Returns the team ID
45
+ # @api public
46
+ # @example
47
+ # stat.team_id #=> 1610612744
48
+ # @return [Integer] the team ID
49
+ attribute :team_id, Shale::Type::Integer
50
+
51
+ # @!attribute [rw] team_abbreviation
52
+ # Returns the team abbreviation
53
+ # @api public
54
+ # @example
55
+ # stat.team_abbreviation #=> "GSW"
56
+ # @return [String] the team abbreviation
57
+ attribute :team_abbreviation, Shale::Type::String
58
+
59
+ # @!attribute [rw] gp
60
+ # Returns games played
61
+ # @api public
62
+ # @example
63
+ # stat.gp #=> 74
64
+ # @return [Integer] games played
65
+ attribute :gp, Shale::Type::Integer
66
+
67
+ # @!attribute [rw] g
68
+ # Returns games
69
+ # @api public
70
+ # @example
71
+ # stat.g #=> 74
72
+ # @return [Integer] games
73
+ attribute :g, Shale::Type::Integer
74
+
75
+ # @!attribute [rw] pass_type
76
+ # Returns the type of pass
77
+ # @api public
78
+ # @example
79
+ # stat.pass_type #=> "Made"
80
+ # @return [String] the pass type
81
+ attribute :pass_type, Shale::Type::String
82
+
83
+ # @!attribute [rw] frequency
84
+ # Returns the frequency percentage
85
+ # @api public
86
+ # @example
87
+ # stat.frequency #=> 0.25
88
+ # @return [Float] the frequency
89
+ attribute :frequency, Shale::Type::Float
90
+
91
+ # @!attribute [rw] pass
92
+ # Returns passes per game
93
+ # @api public
94
+ # @example
95
+ # stat.pass #=> 5.2
96
+ # @return [Float] passes per game
97
+ attribute :pass, Shale::Type::Float
98
+
99
+ # @!attribute [rw] ast
100
+ # Returns assists per game
101
+ # @api public
102
+ # @example
103
+ # stat.ast #=> 2.1
104
+ # @return [Float] assists per game
105
+ attribute :ast, Shale::Type::Float
106
+
107
+ # @!attribute [rw] fgm
108
+ # Returns field goals made following pass
109
+ # @api public
110
+ # @example
111
+ # stat.fgm #=> 3.5
112
+ # @return [Float] field goals made
113
+ attribute :fgm, Shale::Type::Float
114
+
115
+ # @!attribute [rw] fga
116
+ # Returns field goals attempted following pass
117
+ # @api public
118
+ # @example
119
+ # stat.fga #=> 7.2
120
+ # @return [Float] field goals attempted
121
+ attribute :fga, Shale::Type::Float
122
+
123
+ # @!attribute [rw] fg_pct
124
+ # Returns field goal percentage following pass
125
+ # @api public
126
+ # @example
127
+ # stat.fg_pct #=> 0.486
128
+ # @return [Float] field goal percentage
129
+ attribute :fg_pct, Shale::Type::Float
130
+
131
+ # @!attribute [rw] fg2m
132
+ # Returns two-pointers made following pass
133
+ # @api public
134
+ # @example
135
+ # stat.fg2m #=> 1.5
136
+ # @return [Float] two-pointers made
137
+ attribute :fg2m, Shale::Type::Float
138
+
139
+ # @!attribute [rw] fg2a
140
+ # Returns two-pointers attempted following pass
141
+ # @api public
142
+ # @example
143
+ # stat.fg2a #=> 3.0
144
+ # @return [Float] two-pointers attempted
145
+ attribute :fg2a, Shale::Type::Float
146
+
147
+ # @!attribute [rw] fg2_pct
148
+ # Returns two-point percentage following pass
149
+ # @api public
150
+ # @example
151
+ # stat.fg2_pct #=> 0.500
152
+ # @return [Float] two-point percentage
153
+ attribute :fg2_pct, Shale::Type::Float
154
+
155
+ # @!attribute [rw] fg3m
156
+ # Returns three-pointers made following pass
157
+ # @api public
158
+ # @example
159
+ # stat.fg3m #=> 2.0
160
+ # @return [Float] three-pointers made
161
+ attribute :fg3m, Shale::Type::Float
162
+
163
+ # @!attribute [rw] fg3a
164
+ # Returns three-pointers attempted following pass
165
+ # @api public
166
+ # @example
167
+ # stat.fg3a #=> 4.2
168
+ # @return [Float] three-pointers attempted
169
+ attribute :fg3a, Shale::Type::Float
170
+
171
+ # @!attribute [rw] fg3_pct
172
+ # Returns three-point percentage following pass
173
+ # @api public
174
+ # @example
175
+ # stat.fg3_pct #=> 0.476
176
+ # @return [Float] three-point percentage
177
+ attribute :fg3_pct, Shale::Type::Float
178
+
179
+ # Returns the player object
180
+ #
181
+ # @api public
182
+ # @example
183
+ # stat.player #=> #<NBA::Player>
184
+ # @return [Player, nil] the player object
185
+ def player
186
+ Players.find(player_id)
187
+ end
188
+
189
+ # Returns the teammate player object
190
+ #
191
+ # @api public
192
+ # @example
193
+ # stat.teammate #=> #<NBA::Player>
194
+ # @return [Player, nil] the teammate player object
195
+ def teammate
196
+ Players.find(pass_teammate_player_id)
197
+ end
198
+
199
+ # Returns the team object
200
+ #
201
+ # @api public
202
+ # @example
203
+ # stat.team #=> #<NBA::Team>
204
+ # @return [Team, nil] the team object
205
+ def team
206
+ Teams.find(team_id)
207
+ end
208
+ end
209
+ end