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,214 @@
1
+ require "json"
2
+ require_relative "client"
3
+ require_relative "collection"
4
+ require_relative "utils"
5
+
6
+ module NBA
7
+ # Provides methods to retrieve team on/off court summary statistics
8
+ #
9
+ # @api public
10
+ module TeamPlayerOnOffSummary
11
+ # Result set name for overall summary
12
+ # @return [String] the result set name
13
+ OVERALL = "OverallTeamPlayerOnOffSummary".freeze
14
+ # Result set name for players on court summary
15
+ # @return [String] the result set name
16
+ PLAYERS_ON = "PlayersOnCourtTeamPlayerOnOffSummary".freeze
17
+ # Result set name for players off court summary
18
+ # @return [String] the result set name
19
+ PLAYERS_OFF = "PlayersOffCourtTeamPlayerOnOffSummary".freeze
20
+
21
+ # Retrieves overall team on/off court summary statistics
22
+ #
23
+ # @api public
24
+ # @example stats = NBA::TeamPlayerOnOffSummary.overall(team: NBA::Team::GSW)
25
+ # @param team [Integer, Team] the team ID or Team object
26
+ # @param season [Integer] the season year
27
+ # @param season_type [String] the season type
28
+ # @param per_mode [String] the per mode
29
+ # @param client [Client] the API client to use
30
+ # @return [Collection] a collection of overall stats
31
+ def self.overall(team:, season: Utils.current_season, season_type: "Regular Season", per_mode: "PerGame", client: CLIENT)
32
+ fetch_stats(team, season, season_type, per_mode, OVERALL, client:)
33
+ end
34
+
35
+ # Retrieves summary statistics when opponent players are on the court
36
+ #
37
+ # @api public
38
+ # @example stats = NBA::TeamPlayerOnOffSummary.players_on_court(team: NBA::Team::GSW)
39
+ # @param team [Integer, Team] the team ID or Team object
40
+ # @param season [Integer] the season year
41
+ # @param season_type [String] the season type
42
+ # @param per_mode [String] the per mode
43
+ # @param client [Client] the API client to use
44
+ # @return [Collection] a collection of player on court stats
45
+ def self.players_on_court(team:, season: Utils.current_season, season_type: "Regular Season", per_mode: "PerGame", client: CLIENT)
46
+ fetch_stats(team, season, season_type, per_mode, PLAYERS_ON, client:)
47
+ end
48
+
49
+ # Retrieves summary statistics when opponent players are off the court
50
+ #
51
+ # @api public
52
+ # @example stats = NBA::TeamPlayerOnOffSummary.players_off_court(team: NBA::Team::GSW)
53
+ # @param team [Integer, Team] the team ID or Team object
54
+ # @param season [Integer] the season year
55
+ # @param season_type [String] the season type
56
+ # @param per_mode [String] the per mode
57
+ # @param client [Client] the API client to use
58
+ # @return [Collection] a collection of player off court stats
59
+ def self.players_off_court(team:, season: Utils.current_season, season_type: "Regular Season", per_mode: "PerGame", client: CLIENT)
60
+ fetch_stats(team, season, season_type, per_mode, PLAYERS_OFF, client:)
61
+ end
62
+
63
+ # Fetches team player on/off summary from the API
64
+ #
65
+ # @api private
66
+ # @return [Collection] the collection of statistics
67
+ def self.fetch_stats(team, season, season_type, per_mode, result_set_name, client:)
68
+ parse_response(client.get(build_path(Utils.extract_id(team), season, season_type, per_mode)), result_set_name)
69
+ end
70
+ private_class_method :fetch_stats
71
+
72
+ # Builds the API request path with all parameters
73
+ #
74
+ # @api private
75
+ # @return [String] the API request path
76
+ def self.build_path(team_id, season, season_type, per_mode)
77
+ season_str = Utils.format_season(season)
78
+ "teamplayeronoffsummary?TeamID=#{team_id}&Season=#{season_str}&SeasonType=#{season_type}&PerMode=#{per_mode}&LeagueID=00"
79
+ end
80
+ private_class_method :build_path
81
+
82
+ # Parses the API response into stat objects
83
+ # @api private
84
+ # @return [Collection] collection of stat objects
85
+ def self.parse_response(response, result_set_name)
86
+ return Collection.new unless response
87
+
88
+ result_set = find_result_set(JSON.parse(response), result_set_name)
89
+ build_collection(result_set, result_set_name)
90
+ end
91
+ private_class_method :parse_response
92
+
93
+ # Finds a result set by name in the parsed response data
94
+ # @api private
95
+ # @return [Hash, nil] the matching result set or nil
96
+ def self.find_result_set(data, name)
97
+ data["resultSets"]&.find { |rs| rs["name"].eql?(name) }
98
+ end
99
+ private_class_method :find_result_set
100
+
101
+ # Builds a collection of stat objects from a result set
102
+ # @api private
103
+ # @return [Collection] collection of stat objects
104
+ def self.build_collection(result_set, result_set_name)
105
+ return Collection.new unless result_set
106
+
107
+ headers = result_set["headers"]
108
+ rows = result_set["rowSet"]
109
+ return Collection.new unless headers && rows
110
+
111
+ Collection.new(rows.map { |row| build_stat(headers.zip(row).to_h, result_set_name) })
112
+ end
113
+ private_class_method :build_collection
114
+
115
+ # Builds a stat object from row data
116
+ # @api private
117
+ # @return [TeamOnOffOverallStat, TeamOnOffPlayerSummary] the stat object
118
+ def self.build_stat(data, result_set_name)
119
+ attrs = result_set_name.eql?(OVERALL) ? overall_attrs(data) : player_attrs(data)
120
+ result_set_name.eql?(OVERALL) ? TeamOnOffOverallStat.new(**attrs) : TeamOnOffPlayerSummary.new(**attrs)
121
+ end
122
+ private_class_method :build_stat
123
+
124
+ # Extracts overall stat attributes from row data
125
+ # @api private
126
+ # @return [Hash] overall stat attributes
127
+ def self.overall_attrs(data)
128
+ {group_set: data["GROUP_SET"], group_value: data["GROUP_VALUE"], team_id: data["TEAM_ID"],
129
+ team_abbreviation: data["TEAM_ABBREVIATION"], team_name: data["TEAM_NAME"]}.merge(stat_attrs(data))
130
+ end
131
+ private_class_method :overall_attrs
132
+
133
+ # Extracts player stat attributes from row data
134
+ # @api private
135
+ # @return [Hash] player stat attributes
136
+ def self.player_attrs(data)
137
+ {group_set: data["GROUP_SET"], team_id: data["TEAM_ID"], team_abbreviation: data["TEAM_ABBREVIATION"],
138
+ team_name: data["TEAM_NAME"], vs_player_id: data["VS_PLAYER_ID"], vs_player_name: data["VS_PLAYER_NAME"],
139
+ court_status: data["COURT_STATUS"], gp: data["GP"], min: data["MIN"], plus_minus: data["PLUS_MINUS"],
140
+ off_rating: data["OFF_RATING"], def_rating: data["DEF_RATING"], net_rating: data["NET_RATING"]}
141
+ end
142
+ private_class_method :player_attrs
143
+
144
+ # Extracts common stat attributes from row data
145
+ # @api private
146
+ # @return [Hash] common stat attributes
147
+ def self.stat_attrs(data)
148
+ record_attrs(data).merge(shooting_attrs(data), counting_attrs(data), rank_attrs(data))
149
+ end
150
+ private_class_method :stat_attrs
151
+
152
+ # Extracts record attributes from row data
153
+ # @api private
154
+ # @return [Hash] record attributes
155
+ def self.record_attrs(data)
156
+ {gp: data["GP"], w: data["W"], l: data["L"], w_pct: data["W_PCT"], min: data["MIN"]}
157
+ end
158
+ private_class_method :record_attrs
159
+
160
+ # Extracts shooting stat attributes from row data
161
+ # @api private
162
+ # @return [Hash] shooting stat attributes
163
+ def self.shooting_attrs(data)
164
+ {fgm: data["FGM"], fga: data["FGA"], fg_pct: data["FG_PCT"], fg3m: data["FG3M"], fg3a: data["FG3A"],
165
+ fg3_pct: data["FG3_PCT"], ftm: data["FTM"], fta: data["FTA"], ft_pct: data["FT_PCT"]}
166
+ end
167
+ private_class_method :shooting_attrs
168
+
169
+ # Extracts counting stat attributes from row data
170
+ # @api private
171
+ # @return [Hash] counting stat attributes
172
+ def self.counting_attrs(data)
173
+ {oreb: data["OREB"], dreb: data["DREB"], reb: data["REB"], ast: data["AST"], tov: data["TOV"], stl: data["STL"],
174
+ blk: data["BLK"], blka: data["BLKA"], pf: data["PF"], pfd: data["PFD"], pts: data["PTS"], plus_minus: data["PLUS_MINUS"]}
175
+ end
176
+ private_class_method :counting_attrs
177
+
178
+ # Extracts rank attributes from row data
179
+ # @api private
180
+ # @return [Hash] rank attributes
181
+ def self.rank_attrs(data)
182
+ record_rank_attrs(data).merge(shooting_rank_attrs(data), counting_rank_attrs(data))
183
+ end
184
+ private_class_method :rank_attrs
185
+
186
+ # Extracts record rank attributes from row data
187
+ # @api private
188
+ # @return [Hash] record rank attributes
189
+ def self.record_rank_attrs(data)
190
+ {gp_rank: data["GP_RANK"], w_rank: data["W_RANK"], l_rank: data["L_RANK"], w_pct_rank: data["W_PCT_RANK"], min_rank: data["MIN_RANK"]}
191
+ end
192
+ private_class_method :record_rank_attrs
193
+
194
+ # Extracts shooting rank attributes from row data
195
+ # @api private
196
+ # @return [Hash] shooting rank attributes
197
+ def self.shooting_rank_attrs(data)
198
+ {fgm_rank: data["FGM_RANK"], fga_rank: data["FGA_RANK"], fg_pct_rank: data["FG_PCT_RANK"], fg3m_rank: data["FG3M_RANK"],
199
+ fg3a_rank: data["FG3A_RANK"], fg3_pct_rank: data["FG3_PCT_RANK"], ftm_rank: data["FTM_RANK"], fta_rank: data["FTA_RANK"],
200
+ ft_pct_rank: data["FT_PCT_RANK"]}
201
+ end
202
+ private_class_method :shooting_rank_attrs
203
+
204
+ # Extracts counting rank attributes from row data
205
+ # @api private
206
+ # @return [Hash] counting rank attributes
207
+ def self.counting_rank_attrs(data)
208
+ {oreb_rank: data["OREB_RANK"], dreb_rank: data["DREB_RANK"], reb_rank: data["REB_RANK"], ast_rank: data["AST_RANK"],
209
+ tov_rank: data["TOV_RANK"], stl_rank: data["STL_RANK"], blk_rank: data["BLK_RANK"], blka_rank: data["BLKA_RANK"],
210
+ pf_rank: data["PF_RANK"], pfd_rank: data["PFD_RANK"], pts_rank: data["PTS_RANK"], plus_minus_rank: data["PLUS_MINUS_RANK"]}
211
+ end
212
+ private_class_method :counting_rank_attrs
213
+ end
214
+ end
@@ -0,0 +1,275 @@
1
+ require "equalizer"
2
+ require "shale"
3
+
4
+ module NBA
5
+ # Represents a player's statistics for a specific team
6
+ class TeamPlayerStat < Shale::Mapper
7
+ include Equalizer.new(:player_id, :gp)
8
+
9
+ # @!attribute [rw] group_set
10
+ # Returns the group set name
11
+ # @api public
12
+ # @example
13
+ # stat.group_set #=> "PlayersSeasonTotals"
14
+ # @return [String, nil] the group set
15
+ attribute :group_set, Shale::Type::String
16
+
17
+ # @!attribute [rw] player_id
18
+ # Returns the player ID
19
+ # @api public
20
+ # @example
21
+ # stat.player_id #=> 201939
22
+ # @return [Integer, nil] the player ID
23
+ attribute :player_id, Shale::Type::Integer
24
+
25
+ # @!attribute [rw] player_name
26
+ # Returns the player name
27
+ # @api public
28
+ # @example
29
+ # stat.player_name #=> "Stephen Curry"
30
+ # @return [String, nil] the player name
31
+ attribute :player_name, Shale::Type::String
32
+
33
+ # @!attribute [rw] gp
34
+ # Returns games played
35
+ # @api public
36
+ # @example
37
+ # stat.gp #=> 74
38
+ # @return [Integer, nil] games played
39
+ attribute :gp, Shale::Type::Integer
40
+
41
+ # @!attribute [rw] w
42
+ # Returns wins
43
+ # @api public
44
+ # @example
45
+ # stat.w #=> 46
46
+ # @return [Integer, nil] wins
47
+ attribute :w, Shale::Type::Integer
48
+
49
+ # @!attribute [rw] l
50
+ # Returns losses
51
+ # @api public
52
+ # @example
53
+ # stat.l #=> 28
54
+ # @return [Integer, nil] losses
55
+ attribute :l, Shale::Type::Integer
56
+
57
+ # @!attribute [rw] w_pct
58
+ # Returns win percentage
59
+ # @api public
60
+ # @example
61
+ # stat.w_pct #=> 0.622
62
+ # @return [Float, nil] win percentage
63
+ attribute :w_pct, Shale::Type::Float
64
+
65
+ # @!attribute [rw] min
66
+ # Returns minutes per game
67
+ # @api public
68
+ # @example
69
+ # stat.min #=> 32.7
70
+ # @return [Float, nil] minutes
71
+ attribute :min, Shale::Type::Float
72
+
73
+ # @!attribute [rw] fgm
74
+ # Returns field goals made per game
75
+ # @api public
76
+ # @example
77
+ # stat.fgm #=> 10.0
78
+ # @return [Float, nil] field goals made
79
+ attribute :fgm, Shale::Type::Float
80
+
81
+ # @!attribute [rw] fga
82
+ # Returns field goals attempted per game
83
+ # @api public
84
+ # @example
85
+ # stat.fga #=> 19.6
86
+ # @return [Float, nil] field goals attempted
87
+ attribute :fga, Shale::Type::Float
88
+
89
+ # @!attribute [rw] fg_pct
90
+ # Returns field goal percentage
91
+ # @api public
92
+ # @example
93
+ # stat.fg_pct #=> 0.451
94
+ # @return [Float, nil] field goal percentage
95
+ attribute :fg_pct, Shale::Type::Float
96
+
97
+ # @!attribute [rw] fg3m
98
+ # Returns three-pointers made per game
99
+ # @api public
100
+ # @example
101
+ # stat.fg3m #=> 4.8
102
+ # @return [Float, nil] three-pointers made
103
+ attribute :fg3m, Shale::Type::Float
104
+
105
+ # @!attribute [rw] fg3a
106
+ # Returns three-pointers attempted per game
107
+ # @api public
108
+ # @example
109
+ # stat.fg3a #=> 11.7
110
+ # @return [Float, nil] three-pointers attempted
111
+ attribute :fg3a, Shale::Type::Float
112
+
113
+ # @!attribute [rw] fg3_pct
114
+ # Returns three-point percentage
115
+ # @api public
116
+ # @example
117
+ # stat.fg3_pct #=> 0.408
118
+ # @return [Float, nil] three-point percentage
119
+ attribute :fg3_pct, Shale::Type::Float
120
+
121
+ # @!attribute [rw] ftm
122
+ # Returns free throws made per game
123
+ # @api public
124
+ # @example
125
+ # stat.ftm #=> 4.8
126
+ # @return [Float, nil] free throws made
127
+ attribute :ftm, Shale::Type::Float
128
+
129
+ # @!attribute [rw] fta
130
+ # Returns free throws attempted per game
131
+ # @api public
132
+ # @example
133
+ # stat.fta #=> 5.1
134
+ # @return [Float, nil] free throws attempted
135
+ attribute :fta, Shale::Type::Float
136
+
137
+ # @!attribute [rw] ft_pct
138
+ # Returns free throw percentage
139
+ # @api public
140
+ # @example
141
+ # stat.ft_pct #=> 0.921
142
+ # @return [Float, nil] free throw percentage
143
+ attribute :ft_pct, Shale::Type::Float
144
+
145
+ # @!attribute [rw] oreb
146
+ # Returns offensive rebounds per game
147
+ # @api public
148
+ # @example
149
+ # stat.oreb #=> 0.7
150
+ # @return [Float, nil] offensive rebounds
151
+ attribute :oreb, Shale::Type::Float
152
+
153
+ # @!attribute [rw] dreb
154
+ # Returns defensive rebounds per game
155
+ # @api public
156
+ # @example
157
+ # stat.dreb #=> 4.5
158
+ # @return [Float, nil] defensive rebounds
159
+ attribute :dreb, Shale::Type::Float
160
+
161
+ # @!attribute [rw] reb
162
+ # Returns total rebounds per game
163
+ # @api public
164
+ # @example
165
+ # stat.reb #=> 5.1
166
+ # @return [Float, nil] total rebounds
167
+ attribute :reb, Shale::Type::Float
168
+
169
+ # @!attribute [rw] ast
170
+ # Returns assists per game
171
+ # @api public
172
+ # @example
173
+ # stat.ast #=> 5.1
174
+ # @return [Float, nil] assists
175
+ attribute :ast, Shale::Type::Float
176
+
177
+ # @!attribute [rw] tov
178
+ # Returns turnovers per game
179
+ # @api public
180
+ # @example
181
+ # stat.tov #=> 2.8
182
+ # @return [Float, nil] turnovers
183
+ attribute :tov, Shale::Type::Float
184
+
185
+ # @!attribute [rw] stl
186
+ # Returns steals per game
187
+ # @api public
188
+ # @example
189
+ # stat.stl #=> 0.7
190
+ # @return [Float, nil] steals
191
+ attribute :stl, Shale::Type::Float
192
+
193
+ # @!attribute [rw] blk
194
+ # Returns blocks per game
195
+ # @api public
196
+ # @example
197
+ # stat.blk #=> 0.4
198
+ # @return [Float, nil] blocks
199
+ attribute :blk, Shale::Type::Float
200
+
201
+ # @!attribute [rw] blka
202
+ # Returns blocked attempts per game
203
+ # @api public
204
+ # @example
205
+ # stat.blka #=> 0.3
206
+ # @return [Float, nil] blocked attempts
207
+ attribute :blka, Shale::Type::Float
208
+
209
+ # @!attribute [rw] pf
210
+ # Returns personal fouls per game
211
+ # @api public
212
+ # @example
213
+ # stat.pf #=> 1.6
214
+ # @return [Float, nil] personal fouls
215
+ attribute :pf, Shale::Type::Float
216
+
217
+ # @!attribute [rw] pfd
218
+ # Returns personal fouls drawn per game
219
+ # @api public
220
+ # @example
221
+ # stat.pfd #=> 1.9
222
+ # @return [Float, nil] personal fouls drawn
223
+ attribute :pfd, Shale::Type::Float
224
+
225
+ # @!attribute [rw] pts
226
+ # Returns points per game
227
+ # @api public
228
+ # @example
229
+ # stat.pts #=> 26.4
230
+ # @return [Float, nil] points
231
+ attribute :pts, Shale::Type::Float
232
+
233
+ # @!attribute [rw] plus_minus
234
+ # Returns plus/minus per game
235
+ # @api public
236
+ # @example
237
+ # stat.plus_minus #=> 7.8
238
+ # @return [Float, nil] plus/minus
239
+ attribute :plus_minus, Shale::Type::Float
240
+
241
+ # @!attribute [rw] nba_fantasy_pts
242
+ # Returns NBA fantasy points per game
243
+ # @api public
244
+ # @example
245
+ # stat.nba_fantasy_pts #=> 45.2
246
+ # @return [Float, nil] fantasy points
247
+ attribute :nba_fantasy_pts, Shale::Type::Float
248
+
249
+ # @!attribute [rw] dd2
250
+ # Returns double-double count
251
+ # @api public
252
+ # @example
253
+ # stat.dd2 #=> 10
254
+ # @return [Integer, nil] double-doubles
255
+ attribute :dd2, Shale::Type::Integer
256
+
257
+ # @!attribute [rw] td3
258
+ # Returns triple-double count
259
+ # @api public
260
+ # @example
261
+ # stat.td3 #=> 2
262
+ # @return [Integer, nil] triple-doubles
263
+ attribute :td3, Shale::Type::Integer
264
+
265
+ # Returns the player object
266
+ #
267
+ # @api public
268
+ # @example
269
+ # stat.player #=> #<NBA::Player>
270
+ # @return [Player, nil] the player object
271
+ def player
272
+ Players.find(player_id)
273
+ end
274
+ end
275
+ end
@@ -0,0 +1,189 @@
1
+ require "equalizer"
2
+ require "shale"
3
+
4
+ module NBA
5
+ # Represents team tracking rebound statistics
6
+ #
7
+ # @api public
8
+ class TeamReboundStat < Shale::Mapper
9
+ include Equalizer.new(:team_id, :g, :reb)
10
+
11
+ # @!attribute [rw] team_id
12
+ # Returns the team ID
13
+ # @api public
14
+ # @example
15
+ # stat.team_id #=> 1610612744
16
+ # @return [Integer, nil] the team's ID
17
+ attribute :team_id, Shale::Type::Integer
18
+
19
+ # @!attribute [rw] team_name
20
+ # Returns the team name
21
+ # @api public
22
+ # @example
23
+ # stat.team_name #=> "Golden State Warriors"
24
+ # @return [String, nil] the team's name
25
+ attribute :team_name, Shale::Type::String
26
+
27
+ # @!attribute [rw] sort_order
28
+ # Returns the sort order for the row
29
+ # @api public
30
+ # @example
31
+ # stat.sort_order #=> 1
32
+ # @return [Integer, nil] the sort order for the row
33
+ attribute :sort_order, Shale::Type::Integer
34
+
35
+ # @!attribute [rw] g
36
+ # Returns the number of games
37
+ # @api public
38
+ # @example
39
+ # stat.g #=> 74
40
+ # @return [Integer, nil] the number of games
41
+ attribute :g, Shale::Type::Integer
42
+
43
+ # @!attribute [rw] reb_num_contesting_range
44
+ # Returns the number of contesting players range
45
+ # @api public
46
+ # @example
47
+ # stat.reb_num_contesting_range #=> "0 Contests"
48
+ # @return [String, nil] the number of contesting players range
49
+ attribute :reb_num_contesting_range, Shale::Type::String
50
+
51
+ # @!attribute [rw] overall
52
+ # Returns the overall category
53
+ # @api public
54
+ # @example
55
+ # stat.overall #=> "Overall"
56
+ # @return [String, nil] the overall category
57
+ attribute :overall, Shale::Type::String
58
+
59
+ # @!attribute [rw] reb_dist_range
60
+ # Returns the rebound distance range
61
+ # @api public
62
+ # @example
63
+ # stat.reb_dist_range #=> "0-6 Feet"
64
+ # @return [String, nil] the rebound distance range
65
+ attribute :reb_dist_range, Shale::Type::String
66
+
67
+ # @!attribute [rw] shot_dist_range
68
+ # Returns the shot distance range
69
+ # @api public
70
+ # @example
71
+ # stat.shot_dist_range #=> "0-6 Feet"
72
+ # @return [String, nil] the shot distance range
73
+ attribute :shot_dist_range, Shale::Type::String
74
+
75
+ # @!attribute [rw] shot_type_range
76
+ # Returns the shot type range
77
+ # @api public
78
+ # @example
79
+ # stat.shot_type_range #=> "2PT FGs"
80
+ # @return [String, nil] the shot type range
81
+ attribute :shot_type_range, Shale::Type::String
82
+
83
+ # @!attribute [rw] reb_frequency
84
+ # Returns the rebound frequency
85
+ # @api public
86
+ # @example
87
+ # stat.reb_frequency #=> 0.25
88
+ # @return [Float, nil] the rebound frequency
89
+ attribute :reb_frequency, Shale::Type::Float
90
+
91
+ # @!attribute [rw] oreb
92
+ # Returns offensive rebounds per game
93
+ # @api public
94
+ # @example
95
+ # stat.oreb #=> 1.2
96
+ # @return [Float, nil] offensive rebounds per game
97
+ attribute :oreb, Shale::Type::Float
98
+
99
+ # @!attribute [rw] dreb
100
+ # Returns defensive rebounds per game
101
+ # @api public
102
+ # @example
103
+ # stat.dreb #=> 4.5
104
+ # @return [Float, nil] defensive rebounds per game
105
+ attribute :dreb, Shale::Type::Float
106
+
107
+ # @!attribute [rw] reb
108
+ # Returns total rebounds per game
109
+ # @api public
110
+ # @example
111
+ # stat.reb #=> 5.7
112
+ # @return [Float, nil] total rebounds per game
113
+ attribute :reb, Shale::Type::Float
114
+
115
+ # @!attribute [rw] c_oreb
116
+ # Returns contested offensive rebounds per game
117
+ # @api public
118
+ # @example
119
+ # stat.c_oreb #=> 0.8
120
+ # @return [Float, nil] contested offensive rebounds per game
121
+ attribute :c_oreb, Shale::Type::Float
122
+
123
+ # @!attribute [rw] c_dreb
124
+ # Returns contested defensive rebounds per game
125
+ # @api public
126
+ # @example
127
+ # stat.c_dreb #=> 2.1
128
+ # @return [Float, nil] contested defensive rebounds per game
129
+ attribute :c_dreb, Shale::Type::Float
130
+
131
+ # @!attribute [rw] c_reb
132
+ # Returns contested total rebounds per game
133
+ # @api public
134
+ # @example
135
+ # stat.c_reb #=> 2.9
136
+ # @return [Float, nil] contested total rebounds per game
137
+ attribute :c_reb, Shale::Type::Float
138
+
139
+ # @!attribute [rw] c_reb_pct
140
+ # Returns contested rebound percentage
141
+ # @api public
142
+ # @example
143
+ # stat.c_reb_pct #=> 0.509
144
+ # @return [Float, nil] contested rebound percentage
145
+ attribute :c_reb_pct, Shale::Type::Float
146
+
147
+ # @!attribute [rw] uc_oreb
148
+ # Returns uncontested offensive rebounds per game
149
+ # @api public
150
+ # @example
151
+ # stat.uc_oreb #=> 0.4
152
+ # @return [Float, nil] uncontested offensive rebounds per game
153
+ attribute :uc_oreb, Shale::Type::Float
154
+
155
+ # @!attribute [rw] uc_dreb
156
+ # Returns uncontested defensive rebounds per game
157
+ # @api public
158
+ # @example
159
+ # stat.uc_dreb #=> 2.4
160
+ # @return [Float, nil] uncontested defensive rebounds per game
161
+ attribute :uc_dreb, Shale::Type::Float
162
+
163
+ # @!attribute [rw] uc_reb
164
+ # Returns uncontested total rebounds per game
165
+ # @api public
166
+ # @example
167
+ # stat.uc_reb #=> 2.8
168
+ # @return [Float, nil] uncontested total rebounds per game
169
+ attribute :uc_reb, Shale::Type::Float
170
+
171
+ # @!attribute [rw] uc_reb_pct
172
+ # Returns uncontested rebound percentage
173
+ # @api public
174
+ # @example
175
+ # stat.uc_reb_pct #=> 0.491
176
+ # @return [Float, nil] uncontested rebound percentage
177
+ attribute :uc_reb_pct, Shale::Type::Float
178
+
179
+ # Returns the team associated with this stat
180
+ #
181
+ # @api public
182
+ # @example
183
+ # stat.team #=> #<NBA::Team ...>
184
+ # @return [Team, nil] the Team object
185
+ def team
186
+ Teams.find(team_id)
187
+ end
188
+ end
189
+ end