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,110 @@
1
+ require "equalizer"
2
+ require "shale"
3
+ require_relative "teams"
4
+
5
+ module NBA
6
+ # Represents team season rankings from the TeamInfoCommon endpoint
7
+ #
8
+ # @api public
9
+ class TeamSeasonRank < Shale::Mapper
10
+ include Equalizer.new(:team_id, :season_id)
11
+
12
+ # @!attribute [rw] league_id
13
+ # Returns the league ID
14
+ # @api public
15
+ # @example
16
+ # rank.league_id #=> "00"
17
+ # @return [String, nil] the league ID
18
+ attribute :league_id, Shale::Type::String
19
+
20
+ # @!attribute [rw] season_id
21
+ # Returns the season ID
22
+ # @api public
23
+ # @example
24
+ # rank.season_id #=> "2024-25"
25
+ # @return [String, nil] the season ID
26
+ attribute :season_id, Shale::Type::String
27
+
28
+ # @!attribute [rw] team_id
29
+ # Returns the team ID
30
+ # @api public
31
+ # @example
32
+ # rank.team_id #=> 1610612744
33
+ # @return [Integer, nil] the team's ID
34
+ attribute :team_id, Shale::Type::Integer
35
+
36
+ # @!attribute [rw] pts_rank
37
+ # Returns the points per game rank
38
+ # @api public
39
+ # @example
40
+ # rank.pts_rank #=> 5
41
+ # @return [Integer, nil] the points rank
42
+ attribute :pts_rank, Shale::Type::Integer
43
+
44
+ # @!attribute [rw] pts_pg
45
+ # Returns the points per game
46
+ # @api public
47
+ # @example
48
+ # rank.pts_pg #=> 118.9
49
+ # @return [Float, nil] the points per game
50
+ attribute :pts_pg, Shale::Type::Float
51
+
52
+ # @!attribute [rw] reb_rank
53
+ # Returns the rebounds per game rank
54
+ # @api public
55
+ # @example
56
+ # rank.reb_rank #=> 12
57
+ # @return [Integer, nil] the rebounds rank
58
+ attribute :reb_rank, Shale::Type::Integer
59
+
60
+ # @!attribute [rw] reb_pg
61
+ # Returns the rebounds per game
62
+ # @api public
63
+ # @example
64
+ # rank.reb_pg #=> 44.2
65
+ # @return [Float, nil] the rebounds per game
66
+ attribute :reb_pg, Shale::Type::Float
67
+
68
+ # @!attribute [rw] ast_rank
69
+ # Returns the assists per game rank
70
+ # @api public
71
+ # @example
72
+ # rank.ast_rank #=> 3
73
+ # @return [Integer, nil] the assists rank
74
+ attribute :ast_rank, Shale::Type::Integer
75
+
76
+ # @!attribute [rw] ast_pg
77
+ # Returns the assists per game
78
+ # @api public
79
+ # @example
80
+ # rank.ast_pg #=> 28.7
81
+ # @return [Float, nil] the assists per game
82
+ attribute :ast_pg, Shale::Type::Float
83
+
84
+ # @!attribute [rw] opp_pts_rank
85
+ # Returns the opponent points per game rank
86
+ # @api public
87
+ # @example
88
+ # rank.opp_pts_rank #=> 15
89
+ # @return [Integer, nil] the opponent points rank
90
+ attribute :opp_pts_rank, Shale::Type::Integer
91
+
92
+ # @!attribute [rw] opp_pts_pg
93
+ # Returns the opponent points per game
94
+ # @api public
95
+ # @example
96
+ # rank.opp_pts_pg #=> 115.2
97
+ # @return [Float, nil] the opponent points per game
98
+ attribute :opp_pts_pg, Shale::Type::Float
99
+
100
+ # Returns the team associated with this rank
101
+ #
102
+ # @api public
103
+ # @example
104
+ # rank.team #=> #<NBA::Team ...>
105
+ # @return [Team, nil] the Team object
106
+ def team
107
+ Teams.find(team_id)
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,173 @@
1
+ require "equalizer"
2
+ require "shale"
3
+
4
+ module NBA
5
+ # Represents team tracking shot statistics
6
+ #
7
+ # @api public
8
+ class TeamShotStat < Shale::Mapper
9
+ include Equalizer.new(:team_id, :shot_type, :g)
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] team_abbreviation
28
+ # Returns the team abbreviation
29
+ # @api public
30
+ # @example
31
+ # stat.team_abbreviation #=> "GSW"
32
+ # @return [String, nil] the team abbreviation
33
+ attribute :team_abbreviation, Shale::Type::String
34
+
35
+ # @!attribute [rw] sort_order
36
+ # Returns the sort order
37
+ # @api public
38
+ # @example
39
+ # stat.sort_order #=> 1
40
+ # @return [Integer, nil] the sort order
41
+ attribute :sort_order, Shale::Type::Integer
42
+
43
+ # @!attribute [rw] g
44
+ # Returns number of games
45
+ # @api public
46
+ # @example
47
+ # stat.g #=> 74
48
+ # @return [Integer, nil] games
49
+ attribute :g, Shale::Type::Integer
50
+
51
+ # @!attribute [rw] shot_type
52
+ # Returns the shot type or category
53
+ # @api public
54
+ # @example
55
+ # stat.shot_type #=> "Catch and Shoot"
56
+ # @return [String, nil] the shot type or category
57
+ attribute :shot_type, Shale::Type::String
58
+
59
+ # @!attribute [rw] fga_frequency
60
+ # Returns field goal attempt frequency
61
+ # @api public
62
+ # @example
63
+ # stat.fga_frequency #=> 0.35
64
+ # @return [Float, nil] field goal attempt frequency
65
+ attribute :fga_frequency, Shale::Type::Float
66
+
67
+ # @!attribute [rw] fgm
68
+ # Returns field goals made
69
+ # @api public
70
+ # @example
71
+ # stat.fgm #=> 7.2
72
+ # @return [Float, nil] field goals made
73
+ attribute :fgm, Shale::Type::Float
74
+
75
+ # @!attribute [rw] fga
76
+ # Returns field goals attempted
77
+ # @api public
78
+ # @example
79
+ # stat.fga #=> 15.3
80
+ # @return [Float, nil] field goals attempted
81
+ attribute :fga, Shale::Type::Float
82
+
83
+ # @!attribute [rw] fg_pct
84
+ # Returns field goal percentage
85
+ # @api public
86
+ # @example
87
+ # stat.fg_pct #=> 0.472
88
+ # @return [Float, nil] field goal percentage
89
+ attribute :fg_pct, Shale::Type::Float
90
+
91
+ # @!attribute [rw] efg_pct
92
+ # Returns effective field goal percentage
93
+ # @api public
94
+ # @example
95
+ # stat.efg_pct #=> 0.561
96
+ # @return [Float, nil] effective field goal percentage
97
+ attribute :efg_pct, Shale::Type::Float
98
+
99
+ # @!attribute [rw] fg2a_frequency
100
+ # Returns 2-point field goal attempt frequency
101
+ # @api public
102
+ # @example
103
+ # stat.fg2a_frequency #=> 0.45
104
+ # @return [Float, nil] 2-point field goal attempt frequency
105
+ attribute :fg2a_frequency, Shale::Type::Float
106
+
107
+ # @!attribute [rw] fg2m
108
+ # Returns 2-point field goals made
109
+ # @api public
110
+ # @example
111
+ # stat.fg2m #=> 4.1
112
+ # @return [Float, nil] 2-point field goals made
113
+ attribute :fg2m, Shale::Type::Float
114
+
115
+ # @!attribute [rw] fg2a
116
+ # Returns 2-point field goals attempted
117
+ # @api public
118
+ # @example
119
+ # stat.fg2a #=> 7.8
120
+ # @return [Float, nil] 2-point field goals attempted
121
+ attribute :fg2a, Shale::Type::Float
122
+
123
+ # @!attribute [rw] fg2_pct
124
+ # Returns 2-point field goal percentage
125
+ # @api public
126
+ # @example
127
+ # stat.fg2_pct #=> 0.526
128
+ # @return [Float, nil] 2-point field goal percentage
129
+ attribute :fg2_pct, Shale::Type::Float
130
+
131
+ # @!attribute [rw] fg3a_frequency
132
+ # Returns 3-point field goal attempt frequency
133
+ # @api public
134
+ # @example
135
+ # stat.fg3a_frequency #=> 0.55
136
+ # @return [Float, nil] 3-point field goal attempt frequency
137
+ attribute :fg3a_frequency, Shale::Type::Float
138
+
139
+ # @!attribute [rw] fg3m
140
+ # Returns 3-point field goals made
141
+ # @api public
142
+ # @example
143
+ # stat.fg3m #=> 4.8
144
+ # @return [Float, nil] 3-point field goals made
145
+ attribute :fg3m, Shale::Type::Float
146
+
147
+ # @!attribute [rw] fg3a
148
+ # Returns 3-point field goals attempted
149
+ # @api public
150
+ # @example
151
+ # stat.fg3a #=> 11.2
152
+ # @return [Float, nil] 3-point field goals attempted
153
+ attribute :fg3a, Shale::Type::Float
154
+
155
+ # @!attribute [rw] fg3_pct
156
+ # Returns 3-point field goal percentage
157
+ # @api public
158
+ # @example
159
+ # stat.fg3_pct #=> 0.428
160
+ # @return [Float, nil] 3-point field goal percentage
161
+ attribute :fg3_pct, Shale::Type::Float
162
+
163
+ # Returns the team associated with this stat
164
+ #
165
+ # @api public
166
+ # @example
167
+ # stat.team #=> #<NBA::Team ...>
168
+ # @return [Team, nil] the Team object
169
+ def team
170
+ Teams.find(team_id)
171
+ end
172
+ end
173
+ end
@@ -0,0 +1,151 @@
1
+ require "json"
2
+ require_relative "client"
3
+ require_relative "collection"
4
+ require_relative "team_vs_player_stat"
5
+ require_relative "utils"
6
+
7
+ module NBA
8
+ # Provides methods to retrieve team vs player statistics
9
+ #
10
+ # @api public
11
+ module TeamVsPlayer
12
+ # Result set name for overall comparison
13
+ # @return [String] the result set name
14
+ OVERALL = "Overall".freeze
15
+
16
+ # Result set name for on/off court comparison
17
+ # @return [String] the result set name
18
+ ON_OFF_COURT = "OnOffCourt".freeze
19
+
20
+ # Retrieves overall comparison statistics for team vs player
21
+ #
22
+ # @api public
23
+ # @example
24
+ # stats = NBA::TeamVsPlayer.overall(team: 1610612744, vs_player: 201566)
25
+ # stats.first.pts #=> 106.4
26
+ # @param team [Integer, Team] the team ID or Team object
27
+ # @param vs_player [Integer, Player] the vs player ID or Player object
28
+ # @param season [Integer] the season year
29
+ # @param season_type [String] the season type
30
+ # @param per_mode [String] the per mode
31
+ # @param client [Client] the API client to use
32
+ # @return [Collection] a collection of team vs player statistics
33
+ def self.overall(team:, vs_player:, season: Utils.current_season, season_type: "Regular Season",
34
+ per_mode: "PerGame", client: CLIENT)
35
+ options = {season_type: season_type, per_mode: per_mode, result_set: OVERALL}
36
+ fetch_stats(team, vs_player, season, options, client: client)
37
+ end
38
+
39
+ # Retrieves on/off court comparison statistics for team vs player
40
+ #
41
+ # @api public
42
+ # @example
43
+ # stats = NBA::TeamVsPlayer.on_off_court(team: 1610612744, vs_player: 201566)
44
+ # stats.each { |s| puts "#{s.court_status}: #{s.pts}" }
45
+ # @param team [Integer, Team] the team ID or Team object
46
+ # @param vs_player [Integer, Player] the vs player ID or Player object
47
+ # @param season [Integer] the season year
48
+ # @param season_type [String] the season type
49
+ # @param per_mode [String] the per mode
50
+ # @param client [Client] the API client to use
51
+ # @return [Collection] a collection of team vs player statistics
52
+ def self.on_off_court(team:, vs_player:, season: Utils.current_season, season_type: "Regular Season",
53
+ per_mode: "PerGame", client: CLIENT)
54
+ options = {season_type: season_type, per_mode: per_mode, result_set: ON_OFF_COURT}
55
+ fetch_stats(team, vs_player, season, options, client: client)
56
+ end
57
+
58
+ # Fetches team vs player statistics from the API
59
+ #
60
+ # @api private
61
+ # @return [Collection] the collection of statistics
62
+ def self.fetch_stats(team, vs_player, season, options, client:)
63
+ path = build_path(team, vs_player, season, options.fetch(:season_type), options.fetch(:per_mode))
64
+ response = client.get(path)
65
+ parse_response(response, options.fetch(:result_set))
66
+ end
67
+ private_class_method :fetch_stats
68
+
69
+ # Builds the API request path with all parameters
70
+ #
71
+ # @api private
72
+ # @return [String] the API request path
73
+ def self.build_path(team, vs_player, season, season_type, per_mode)
74
+ team_id = Utils.extract_id(team)
75
+ vs_player_id = Utils.extract_id(vs_player)
76
+ season_str = Utils.format_season(season)
77
+ "teamvsplayer?TeamID=#{team_id}&VsPlayerID=#{vs_player_id}&Season=#{season_str}" \
78
+ "&SeasonType=#{season_type}&PerMode=#{per_mode}&LeagueID=00"
79
+ end
80
+ private_class_method :build_path
81
+
82
+ # Parses the API response and extracts the result set
83
+ #
84
+ # @api private
85
+ # @return [Collection] the collection of statistics
86
+ def self.parse_response(response, result_set_name)
87
+ return Collection.new if response.nil? || response.empty?
88
+
89
+ data = JSON.parse(response)
90
+ result_set = find_result_set(data, result_set_name)
91
+ build_collection(result_set)
92
+ end
93
+ private_class_method :parse_response
94
+
95
+ # Finds the result set matching the given name
96
+ #
97
+ # @api private
98
+ # @return [Hash, nil] the result set hash or nil
99
+ def self.find_result_set(data, result_set_name)
100
+ result_sets = data["resultSets"]
101
+ return unless result_sets
102
+
103
+ result_sets.find { |rs| rs["name"].eql?(result_set_name) }
104
+ end
105
+ private_class_method :find_result_set
106
+
107
+ # Builds a collection from the result set data
108
+ #
109
+ # @api private
110
+ # @return [Collection] the collection of statistics
111
+ def self.build_collection(result_set)
112
+ return Collection.new unless result_set
113
+
114
+ headers = result_set["headers"]
115
+ rows = result_set["rowSet"]
116
+ return Collection.new unless headers && rows
117
+
118
+ Collection.new(rows.map { |row| build_team_vs_player_stat(headers.zip(row).to_h) })
119
+ end
120
+ private_class_method :build_collection
121
+
122
+ # Builds a stat object from the data hash
123
+ #
124
+ # @api private
125
+ # @return [TeamVsPlayerStat] the stat object
126
+ def self.build_team_vs_player_stat(data)
127
+ TeamVsPlayerStat.new(**identity_info(data), **stat_info(data))
128
+ end
129
+ private_class_method :build_team_vs_player_stat
130
+
131
+ # Extracts identity information from the data hash
132
+ #
133
+ # @api private
134
+ # @return [Hash] the identity attributes
135
+ def self.identity_info(data)
136
+ {team_id: data["TEAM_ID"], vs_player_id: data["VS_PLAYER_ID"],
137
+ court_status: data["COURT_STATUS"], gp: data["GP"], min: data["MIN"]}
138
+ end
139
+ private_class_method :identity_info
140
+
141
+ # Extracts stat information from the data hash
142
+ #
143
+ # @api private
144
+ # @return [Hash] the stat attributes
145
+ def self.stat_info(data)
146
+ {pts: data["PTS"], reb: data["REB"], ast: data["AST"], stl: data["STL"],
147
+ blk: data["BLK"], tov: data["TOV"], fg_pct: data["FG_PCT"], plus_minus: data["PLUS_MINUS"]}
148
+ end
149
+ private_class_method :stat_info
150
+ end
151
+ end
@@ -0,0 +1,157 @@
1
+ require "equalizer"
2
+ require "shale"
3
+ require_relative "players"
4
+ require_relative "teams"
5
+
6
+ module NBA
7
+ # Represents team vs player comparison statistics
8
+ #
9
+ # @api public
10
+ class TeamVsPlayerStat < Shale::Mapper
11
+ include Equalizer.new(:team_id, :vs_player_id)
12
+
13
+ # @!attribute [rw] team_id
14
+ # Returns the team ID
15
+ # @api public
16
+ # @example
17
+ # stat.team_id #=> 1610612744
18
+ # @return [Integer, nil] the team's ID
19
+ attribute :team_id, Shale::Type::Integer
20
+
21
+ # @!attribute [rw] vs_player_id
22
+ # Returns the vs player ID
23
+ # @api public
24
+ # @example
25
+ # stat.vs_player_id #=> 201566
26
+ # @return [Integer, nil] the vs player's ID
27
+ attribute :vs_player_id, Shale::Type::Integer
28
+
29
+ # @!attribute [rw] court_status
30
+ # Returns the on/off court status
31
+ # @api public
32
+ # @example
33
+ # stat.court_status #=> "On"
34
+ # @return [String, nil] on/off court status
35
+ attribute :court_status, Shale::Type::String
36
+
37
+ # @!attribute [rw] gp
38
+ # Returns games played
39
+ # @api public
40
+ # @example
41
+ # stat.gp #=> 24
42
+ # @return [Integer, nil] games played
43
+ attribute :gp, Shale::Type::Integer
44
+
45
+ # @!attribute [rw] min
46
+ # Returns minutes played
47
+ # @api public
48
+ # @example
49
+ # stat.min #=> 32.5
50
+ # @return [Float, nil] minutes played
51
+ attribute :min, Shale::Type::Float
52
+
53
+ # @!attribute [rw] pts
54
+ # Returns points
55
+ # @api public
56
+ # @example
57
+ # stat.pts #=> 26.4
58
+ # @return [Float, nil] points
59
+ attribute :pts, Shale::Type::Float
60
+
61
+ # @!attribute [rw] reb
62
+ # Returns rebounds
63
+ # @api public
64
+ # @example
65
+ # stat.reb #=> 5.7
66
+ # @return [Float, nil] rebounds
67
+ attribute :reb, Shale::Type::Float
68
+
69
+ # @!attribute [rw] ast
70
+ # Returns assists
71
+ # @api public
72
+ # @example
73
+ # stat.ast #=> 6.1
74
+ # @return [Float, nil] assists
75
+ attribute :ast, Shale::Type::Float
76
+
77
+ # @!attribute [rw] stl
78
+ # Returns steals
79
+ # @api public
80
+ # @example
81
+ # stat.stl #=> 1.2
82
+ # @return [Float, nil] steals
83
+ attribute :stl, Shale::Type::Float
84
+
85
+ # @!attribute [rw] blk
86
+ # Returns blocks
87
+ # @api public
88
+ # @example
89
+ # stat.blk #=> 0.3
90
+ # @return [Float, nil] blocks
91
+ attribute :blk, Shale::Type::Float
92
+
93
+ # @!attribute [rw] tov
94
+ # Returns turnovers
95
+ # @api public
96
+ # @example
97
+ # stat.tov #=> 3.1
98
+ # @return [Float, nil] turnovers
99
+ attribute :tov, Shale::Type::Float
100
+
101
+ # @!attribute [rw] fg_pct
102
+ # Returns field goal percentage
103
+ # @api public
104
+ # @example
105
+ # stat.fg_pct #=> 0.467
106
+ # @return [Float, nil] field goal percentage
107
+ attribute :fg_pct, Shale::Type::Float
108
+
109
+ # @!attribute [rw] plus_minus
110
+ # Returns plus/minus
111
+ # @api public
112
+ # @example
113
+ # stat.plus_minus #=> 8.5
114
+ # @return [Float, nil] plus/minus
115
+ attribute :plus_minus, Shale::Type::Float
116
+
117
+ # Returns the team
118
+ #
119
+ # @api public
120
+ # @example
121
+ # stat.team #=> #<NBA::Team id=1610612744 ...>
122
+ # @return [Team, nil] the team object
123
+ def team
124
+ Teams.find(team_id)
125
+ end
126
+
127
+ # Returns the vs player
128
+ #
129
+ # @api public
130
+ # @example
131
+ # stat.vs_player #=> #<NBA::Player id=201566 ...>
132
+ # @return [Player, nil] the vs player object
133
+ def vs_player
134
+ Players.find(vs_player_id)
135
+ end
136
+
137
+ # Returns whether the player is on court
138
+ #
139
+ # @api public
140
+ # @example
141
+ # stat.on_court? #=> true
142
+ # @return [Boolean] true if player is on court
143
+ def on_court?
144
+ court_status.eql?("On")
145
+ end
146
+
147
+ # Returns whether the player is off court
148
+ #
149
+ # @api public
150
+ # @example
151
+ # stat.off_court? #=> true
152
+ # @return [Boolean] true if player is off court
153
+ def off_court?
154
+ court_status.eql?("Off")
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,55 @@
1
+ require "equalizer"
2
+ require "shale"
3
+
4
+ module NBA
5
+ # Represents a year/season a team participated in the league
6
+ class TeamYear < Shale::Mapper
7
+ include Equalizer.new(:team_id, :year)
8
+
9
+ # @!attribute [rw] team_id
10
+ # Returns the team ID
11
+ # @api public
12
+ # @example
13
+ # team_year.team_id #=> 1610612744
14
+ # @return [Integer] the team ID
15
+ attribute :team_id, Shale::Type::Integer
16
+
17
+ # @!attribute [rw] year
18
+ # Returns the year
19
+ # @api public
20
+ # @example
21
+ # team_year.year #=> 2024
22
+ # @return [Integer] the year
23
+ attribute :year, Shale::Type::Integer
24
+
25
+ # @!attribute [rw] abbreviation
26
+ # Returns the team abbreviation for that year
27
+ # @api public
28
+ # @example
29
+ # team_year.abbreviation #=> "GSW"
30
+ # @return [String] the abbreviation
31
+ attribute :abbreviation, Shale::Type::String
32
+
33
+ # Returns the team object
34
+ #
35
+ # @api public
36
+ # @example
37
+ # team_year.team #=> #<NBA::Team>
38
+ # @return [Team, nil] the team object
39
+ def team
40
+ Teams.find(team_id)
41
+ end
42
+
43
+ # Returns the season string
44
+ #
45
+ # @api public
46
+ # @example
47
+ # team_year.season #=> "2024-25"
48
+ # @return [String, nil] the season string
49
+ def season
50
+ return unless year
51
+
52
+ Utils.format_season(year)
53
+ end
54
+ end
55
+ end