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,206 @@
1
+ require "equalizer"
2
+ require "shale"
3
+ require_relative "players"
4
+ require_relative "teams"
5
+
6
+ module NBA
7
+ # Represents an assist tracker entry (pass to score)
8
+ class AssistTrackerEntry < Shale::Mapper
9
+ include Equalizer.new(:player_id, :pass_to)
10
+
11
+ # @!attribute [rw] player_id
12
+ # Returns the passer's player ID
13
+ # @api public
14
+ # @example
15
+ # entry.player_id #=> 201566
16
+ # @return [Integer] the passer's player ID
17
+ attribute :player_id, Shale::Type::Integer
18
+
19
+ # @!attribute [rw] player_name
20
+ # Returns the passer's name
21
+ # @api public
22
+ # @example
23
+ # entry.player_name #=> "Russell Westbrook"
24
+ # @return [String] the passer's name
25
+ attribute :player_name, Shale::Type::String
26
+
27
+ # @!attribute [rw] team_id
28
+ # Returns the team ID
29
+ # @api public
30
+ # @example
31
+ # entry.team_id #=> 1610612746
32
+ # @return [Integer] the team ID
33
+ attribute :team_id, Shale::Type::Integer
34
+
35
+ # @!attribute [rw] team_abbreviation
36
+ # Returns the team abbreviation
37
+ # @api public
38
+ # @example
39
+ # entry.team_abbreviation #=> "LAC"
40
+ # @return [String] the team abbreviation
41
+ attribute :team_abbreviation, Shale::Type::String
42
+
43
+ # @!attribute [rw] pass_to
44
+ # Returns the name of the player receiving the pass
45
+ # @api public
46
+ # @example
47
+ # entry.pass_to #=> "Kawhi Leonard"
48
+ # @return [String] the receiver's name
49
+ attribute :pass_to, Shale::Type::String
50
+
51
+ # @!attribute [rw] pass_to_player_id
52
+ # Returns the ID of the player receiving the pass
53
+ # @api public
54
+ # @example
55
+ # entry.pass_to_player_id #=> 202695
56
+ # @return [Integer] the receiver's player ID
57
+ attribute :pass_to_player_id, Shale::Type::Integer
58
+
59
+ # @!attribute [rw] frequency
60
+ # Returns the frequency of this pass combination
61
+ # @api public
62
+ # @example
63
+ # entry.frequency #=> 0.123
64
+ # @return [Float] the frequency
65
+ attribute :frequency, Shale::Type::Float
66
+
67
+ # @!attribute [rw] pass
68
+ # Returns the number of passes
69
+ # @api public
70
+ # @example
71
+ # entry.pass #=> 45
72
+ # @return [Integer] the number of passes
73
+ attribute :pass, Shale::Type::Integer
74
+
75
+ # @!attribute [rw] ast
76
+ # Returns the number of assists
77
+ # @api public
78
+ # @example
79
+ # entry.ast #=> 32
80
+ # @return [Integer] the number of assists
81
+ attribute :ast, Shale::Type::Integer
82
+
83
+ # @!attribute [rw] fg_m
84
+ # Returns the field goals made
85
+ # @api public
86
+ # @example
87
+ # entry.fg_m #=> 28
88
+ # @return [Integer] the field goals made
89
+ attribute :fg_m, Shale::Type::Integer
90
+
91
+ # @!attribute [rw] fg_a
92
+ # Returns the field goal attempts
93
+ # @api public
94
+ # @example
95
+ # entry.fg_a #=> 45
96
+ # @return [Integer] the field goal attempts
97
+ attribute :fg_a, Shale::Type::Integer
98
+
99
+ # @!attribute [rw] fg_pct
100
+ # Returns the field goal percentage
101
+ # @api public
102
+ # @example
103
+ # entry.fg_pct #=> 0.622
104
+ # @return [Float] the field goal percentage
105
+ attribute :fg_pct, Shale::Type::Float
106
+
107
+ # @!attribute [rw] fg2m
108
+ # Returns the 2-point field goals made
109
+ # @api public
110
+ # @example
111
+ # entry.fg2m #=> 20
112
+ # @return [Integer] the 2-point field goals made
113
+ attribute :fg2m, Shale::Type::Integer
114
+
115
+ # @!attribute [rw] fg2a
116
+ # Returns the 2-point field goal attempts
117
+ # @api public
118
+ # @example
119
+ # entry.fg2a #=> 30
120
+ # @return [Integer] the 2-point field goal attempts
121
+ attribute :fg2a, Shale::Type::Integer
122
+
123
+ # @!attribute [rw] fg2_pct
124
+ # Returns the 2-point field goal percentage
125
+ # @api public
126
+ # @example
127
+ # entry.fg2_pct #=> 0.667
128
+ # @return [Float] the 2-point field goal percentage
129
+ attribute :fg2_pct, Shale::Type::Float
130
+
131
+ # @!attribute [rw] fg3m
132
+ # Returns the 3-point field goals made
133
+ # @api public
134
+ # @example
135
+ # entry.fg3m #=> 8
136
+ # @return [Integer] the 3-point field goals made
137
+ attribute :fg3m, Shale::Type::Integer
138
+
139
+ # @!attribute [rw] fg3a
140
+ # Returns the 3-point field goal attempts
141
+ # @api public
142
+ # @example
143
+ # entry.fg3a #=> 15
144
+ # @return [Integer] the 3-point field goal attempts
145
+ attribute :fg3a, Shale::Type::Integer
146
+
147
+ # @!attribute [rw] fg3_pct
148
+ # Returns the 3-point field goal percentage
149
+ # @api public
150
+ # @example
151
+ # entry.fg3_pct #=> 0.533
152
+ # @return [Float] the 3-point field goal percentage
153
+ attribute :fg3_pct, Shale::Type::Float
154
+
155
+ # Returns the passer player object
156
+ #
157
+ # @api public
158
+ # @example
159
+ # entry.player #=> #<NBA::Player>
160
+ # @return [Player, nil] the passer player object
161
+ def player
162
+ Players.find(player_id)
163
+ end
164
+
165
+ # Returns the receiver player object
166
+ #
167
+ # @api public
168
+ # @example
169
+ # entry.pass_to_player #=> #<NBA::Player>
170
+ # @return [Player, nil] the receiver player object
171
+ def pass_to_player
172
+ Players.find(pass_to_player_id)
173
+ end
174
+
175
+ # Returns the team object
176
+ #
177
+ # @api public
178
+ # @example
179
+ # entry.team #=> #<NBA::Team>
180
+ # @return [Team, nil] the team object
181
+ def team
182
+ Teams.find(team_id)
183
+ end
184
+
185
+ json do
186
+ map "player_id", to: :player_id
187
+ map "player_name", to: :player_name
188
+ map "team_id", to: :team_id
189
+ map "team_abbreviation", to: :team_abbreviation
190
+ map "pass_to", to: :pass_to
191
+ map "pass_to_player_id", to: :pass_to_player_id
192
+ map "frequency", to: :frequency
193
+ map "pass", to: :pass
194
+ map "ast", to: :ast
195
+ map "fg_m", to: :fg_m
196
+ map "fg_a", to: :fg_a
197
+ map "fg_pct", to: :fg_pct
198
+ map "fg2m", to: :fg2m
199
+ map "fg2a", to: :fg2a
200
+ map "fg2_pct", to: :fg2_pct
201
+ map "fg3m", to: :fg3m
202
+ map "fg3a", to: :fg3a
203
+ map "fg3_pct", to: :fg3_pct
204
+ end
205
+ end
206
+ end
data/lib/nba/award.rb ADDED
@@ -0,0 +1,128 @@
1
+ module NBA
2
+ # Represents a player's award
3
+ class Award < Shale::Mapper
4
+ include Equalizer.new(:player_id, :description, :season)
5
+
6
+ # @!attribute [rw] player_id
7
+ # Returns the player ID
8
+ # @api public
9
+ # @example
10
+ # award.player_id #=> 201939
11
+ # @return [Integer] the player ID
12
+ attribute :player_id, Shale::Type::Integer
13
+
14
+ # @!attribute [rw] first_name
15
+ # Returns the player's first name
16
+ # @api public
17
+ # @example
18
+ # award.first_name #=> "Stephen"
19
+ # @return [String] the first name
20
+ attribute :first_name, Shale::Type::String
21
+
22
+ # @!attribute [rw] last_name
23
+ # Returns the player's last name
24
+ # @api public
25
+ # @example
26
+ # award.last_name #=> "Curry"
27
+ # @return [String] the last name
28
+ attribute :last_name, Shale::Type::String
29
+
30
+ # @!attribute [rw] team
31
+ # Returns the team name
32
+ # @api public
33
+ # @example
34
+ # award.team #=> "Golden State Warriors"
35
+ # @return [String] the team name
36
+ attribute :team, Shale::Type::String
37
+
38
+ # @!attribute [rw] description
39
+ # Returns the award description
40
+ # @api public
41
+ # @example
42
+ # award.description #=> "All-NBA"
43
+ # @return [String] the award description
44
+ attribute :description, Shale::Type::String
45
+
46
+ # @!attribute [rw] all_nba_team_number
47
+ # Returns the All-NBA team number (1st, 2nd, 3rd)
48
+ # @api public
49
+ # @example
50
+ # award.all_nba_team_number #=> 1
51
+ # @return [Integer] the team number
52
+ attribute :all_nba_team_number, Shale::Type::Integer
53
+
54
+ # @!attribute [rw] season
55
+ # Returns the season
56
+ # @api public
57
+ # @example
58
+ # award.season #=> "2023-24"
59
+ # @return [String] the season
60
+ attribute :season, Shale::Type::String
61
+
62
+ # @!attribute [rw] month
63
+ # Returns the month (for monthly awards)
64
+ # @api public
65
+ # @example
66
+ # award.month #=> 11
67
+ # @return [Integer] the month
68
+ attribute :month, Shale::Type::Integer
69
+
70
+ # @!attribute [rw] week
71
+ # Returns the week (for weekly awards)
72
+ # @api public
73
+ # @example
74
+ # award.week #=> 5
75
+ # @return [Integer] the week
76
+ attribute :week, Shale::Type::Integer
77
+
78
+ # @!attribute [rw] conference
79
+ # Returns the conference
80
+ # @api public
81
+ # @example
82
+ # award.conference #=> "West"
83
+ # @return [String] the conference
84
+ attribute :conference, Shale::Type::String
85
+
86
+ # @!attribute [rw] award_type
87
+ # Returns the award type
88
+ # @api public
89
+ # @example
90
+ # award.award_type #=> "All-Star"
91
+ # @return [String] the award type
92
+ attribute :award_type, Shale::Type::String
93
+
94
+ # @!attribute [rw] subtype1
95
+ # Returns the award subtype 1
96
+ # @api public
97
+ # @example
98
+ # award.subtype1 #=> "Guard"
99
+ # @return [String] the subtype
100
+ attribute :subtype1, Shale::Type::String
101
+
102
+ # @!attribute [rw] subtype2
103
+ # Returns the award subtype 2
104
+ # @api public
105
+ # @example
106
+ # award.subtype2 #=> "Starter"
107
+ # @return [String] the subtype
108
+ attribute :subtype2, Shale::Type::String
109
+
110
+ # @!attribute [rw] subtype3
111
+ # Returns the award subtype 3
112
+ # @api public
113
+ # @example
114
+ # award.subtype3 #=> nil
115
+ # @return [String] the subtype
116
+ attribute :subtype3, Shale::Type::String
117
+
118
+ # Returns the player object
119
+ #
120
+ # @api public
121
+ # @example
122
+ # award.player #=> #<NBA::Player>
123
+ # @return [Player, nil] the player object
124
+ def player
125
+ Players.find(player_id)
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,2 @@
1
+ require_relative "box_score_player_stat"
2
+ require_relative "box_score_team_stat"
@@ -0,0 +1,114 @@
1
+ require_relative "box_score_advanced_player_stat"
2
+ require_relative "box_score_advanced_team_stat"
3
+ require_relative "client"
4
+ require_relative "response_parser"
5
+ require_relative "utils"
6
+
7
+ module NBA
8
+ # Provides methods to retrieve advanced box score statistics
9
+ module BoxScoreAdvanced
10
+ # Result set name for player stats
11
+ # @return [String] the result set name
12
+ PLAYER_STATS = "PlayerStats".freeze
13
+
14
+ # Result set name for team stats
15
+ # @return [String] the result set name
16
+ TEAM_STATS = "TeamStats".freeze
17
+
18
+ # Retrieves player advanced box score stats for a game
19
+ #
20
+ # @api public
21
+ # @example
22
+ # stats = NBA::BoxScoreAdvanced.player_stats(game: "0022400001")
23
+ # stats.each { |s| puts "#{s.player_name}: #{s.off_rating} ORTG" }
24
+ # @param game [String, Game] the game ID or Game object
25
+ # @param client [Client] the API client to use
26
+ # @return [Collection] a collection of player advanced box score stats
27
+ def self.player_stats(game:, client: CLIENT)
28
+ path = "boxscoreadvancedv2?GameID=#{Utils.extract_id(game)}"
29
+ ResponseParser.parse(client.get(path), result_set: PLAYER_STATS) { |data| build_player_stat(data) }
30
+ end
31
+
32
+ # Retrieves team advanced box score stats for a game
33
+ #
34
+ # @api public
35
+ # @example
36
+ # stats = NBA::BoxScoreAdvanced.team_stats(game: "0022400001")
37
+ # stats.each { |s| puts "#{s.team_name}: #{s.off_rating} ORTG" }
38
+ # @param game [String, Game] the game ID or Game object
39
+ # @param client [Client] the API client to use
40
+ # @return [Collection] a collection of team advanced box score stats
41
+ def self.team_stats(game:, client: CLIENT)
42
+ path = "boxscoreadvancedv2?GameID=#{Utils.extract_id(game)}"
43
+ ResponseParser.parse(client.get(path), result_set: TEAM_STATS) { |data| build_team_stat(data) }
44
+ end
45
+
46
+ # Builds a player stat object from API data
47
+ # @api private
48
+ # @return [BoxScoreAdvancedPlayerStat]
49
+ def self.build_player_stat(data)
50
+ BoxScoreAdvancedPlayerStat.new(**player_identity(data), **rating_stats(data),
51
+ **efficiency_stats(data), **tempo_stats(data), usg_pct: data["USG_PCT"], e_usg_pct: data["E_USG_PCT"])
52
+ end
53
+ private_class_method :build_player_stat
54
+
55
+ # Builds a team stat object from API data
56
+ # @api private
57
+ # @return [BoxScoreAdvancedTeamStat]
58
+ def self.build_team_stat(data)
59
+ BoxScoreAdvancedTeamStat.new(**team_identity(data), **rating_stats(data),
60
+ **efficiency_stats(data), **tempo_stats(data))
61
+ end
62
+ private_class_method :build_team_stat
63
+
64
+ # Extracts player identity attributes from data
65
+ # @api private
66
+ # @return [Hash]
67
+ def self.player_identity(data)
68
+ {game_id: data["GAME_ID"], team_id: data["TEAM_ID"], team_abbreviation: data["TEAM_ABBREVIATION"],
69
+ team_city: data["TEAM_CITY"], player_id: data["PLAYER_ID"], player_name: data["PLAYER_NAME"],
70
+ start_position: data["START_POSITION"], comment: data["COMMENT"], min: data["MIN"]}
71
+ end
72
+ private_class_method :player_identity
73
+
74
+ # Extracts team identity attributes from data
75
+ # @api private
76
+ # @return [Hash]
77
+ def self.team_identity(data)
78
+ {game_id: data["GAME_ID"], team_id: data["TEAM_ID"], team_name: data["TEAM_NAME"],
79
+ team_abbreviation: data["TEAM_ABBREVIATION"], team_city: data["TEAM_CITY"], min: data["MIN"]}
80
+ end
81
+ private_class_method :team_identity
82
+
83
+ # Extracts rating statistics from data
84
+ # @api private
85
+ # @return [Hash]
86
+ def self.rating_stats(data)
87
+ {e_off_rating: data["E_OFF_RATING"], off_rating: data["OFF_RATING"],
88
+ e_def_rating: data["E_DEF_RATING"], def_rating: data["DEF_RATING"],
89
+ e_net_rating: data["E_NET_RATING"], net_rating: data["NET_RATING"]}
90
+ end
91
+ private_class_method :rating_stats
92
+
93
+ # Extracts efficiency statistics from data
94
+ # @api private
95
+ # @return [Hash]
96
+ def self.efficiency_stats(data)
97
+ {ast_pct: data["AST_PCT"], ast_tov: data["AST_TOV"],
98
+ ast_ratio: data["AST_RATIO"], oreb_pct: data["OREB_PCT"],
99
+ dreb_pct: data["DREB_PCT"], reb_pct: data["REB_PCT"],
100
+ tov_pct: data["TM_TOV_PCT"], efg_pct: data["EFG_PCT"],
101
+ ts_pct: data["TS_PCT"], pie: data["PIE"]}
102
+ end
103
+ private_class_method :efficiency_stats
104
+
105
+ # Extracts tempo statistics from data
106
+ # @api private
107
+ # @return [Hash]
108
+ def self.tempo_stats(data)
109
+ {e_pace: data["E_PACE"], pace: data["PACE"], pace_per40: data["PACE_PER40"],
110
+ poss: data["POSS"]}
111
+ end
112
+ private_class_method :tempo_stats
113
+ end
114
+ end