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,267 @@
1
+ require "equalizer"
2
+ require "shale"
3
+
4
+ module NBA
5
+ # Represents total cumulative team statistics
6
+ class CumeStatsTeamTotal < Shale::Mapper
7
+ include Equalizer.new(:team_id)
8
+
9
+ # @!attribute [rw] team_id
10
+ # Returns the team ID
11
+ # @api public
12
+ # @example
13
+ # total.team_id #=> 1610612744
14
+ # @return [Integer] the team ID
15
+ attribute :team_id, Shale::Type::Integer
16
+
17
+ # @!attribute [rw] city
18
+ # Returns the city name
19
+ # @api public
20
+ # @example
21
+ # total.city #=> "Golden State"
22
+ # @return [String] the city name
23
+ attribute :city, Shale::Type::String
24
+
25
+ # @!attribute [rw] nickname
26
+ # Returns the team nickname
27
+ # @api public
28
+ # @example
29
+ # total.nickname #=> "Warriors"
30
+ # @return [String] the team nickname
31
+ attribute :nickname, Shale::Type::String
32
+
33
+ # @!attribute [rw] gp
34
+ # Returns games played
35
+ # @api public
36
+ # @example
37
+ # total.gp #=> 10
38
+ # @return [Integer] games played
39
+ attribute :gp, Shale::Type::Integer
40
+
41
+ # @!attribute [rw] gs
42
+ # Returns games started
43
+ # @api public
44
+ # @example
45
+ # total.gs #=> 10
46
+ # @return [Integer] games started
47
+ attribute :gs, Shale::Type::Integer
48
+
49
+ # @!attribute [rw] w
50
+ # Returns wins
51
+ # @api public
52
+ # @example
53
+ # total.w #=> 8
54
+ # @return [Integer] wins
55
+ attribute :w, Shale::Type::Integer
56
+
57
+ # @!attribute [rw] l
58
+ # Returns losses
59
+ # @api public
60
+ # @example
61
+ # total.l #=> 2
62
+ # @return [Integer] losses
63
+ attribute :l, Shale::Type::Integer
64
+
65
+ # @!attribute [rw] w_home
66
+ # Returns home wins
67
+ # @api public
68
+ # @example
69
+ # total.w_home #=> 5
70
+ # @return [Integer] home wins
71
+ attribute :w_home, Shale::Type::Integer
72
+
73
+ # @!attribute [rw] l_home
74
+ # Returns home losses
75
+ # @api public
76
+ # @example
77
+ # total.l_home #=> 1
78
+ # @return [Integer] home losses
79
+ attribute :l_home, Shale::Type::Integer
80
+
81
+ # @!attribute [rw] w_road
82
+ # Returns road wins
83
+ # @api public
84
+ # @example
85
+ # total.w_road #=> 3
86
+ # @return [Integer] road wins
87
+ attribute :w_road, Shale::Type::Integer
88
+
89
+ # @!attribute [rw] l_road
90
+ # Returns road losses
91
+ # @api public
92
+ # @example
93
+ # total.l_road #=> 1
94
+ # @return [Integer] road losses
95
+ attribute :l_road, Shale::Type::Integer
96
+
97
+ # @!attribute [rw] team_turnovers
98
+ # Returns team turnovers
99
+ # @api public
100
+ # @example
101
+ # total.team_turnovers #=> 120
102
+ # @return [Integer] team turnovers
103
+ attribute :team_turnovers, Shale::Type::Integer
104
+
105
+ # @!attribute [rw] team_rebounds
106
+ # Returns team rebounds
107
+ # @api public
108
+ # @example
109
+ # total.team_rebounds #=> 450
110
+ # @return [Integer] team rebounds
111
+ attribute :team_rebounds, Shale::Type::Integer
112
+
113
+ # @!attribute [rw] fgm
114
+ # Returns field goals made
115
+ # @api public
116
+ # @example
117
+ # total.fgm #=> 400
118
+ # @return [Integer] field goals made
119
+ attribute :fgm, Shale::Type::Integer
120
+
121
+ # @!attribute [rw] fga
122
+ # Returns field goals attempted
123
+ # @api public
124
+ # @example
125
+ # total.fga #=> 850
126
+ # @return [Integer] field goals attempted
127
+ attribute :fga, Shale::Type::Integer
128
+
129
+ # @!attribute [rw] fg_pct
130
+ # Returns field goal percentage
131
+ # @api public
132
+ # @example
133
+ # total.fg_pct #=> 0.471
134
+ # @return [Float] field goal percentage
135
+ attribute :fg_pct, Shale::Type::Float
136
+
137
+ # @!attribute [rw] fg3m
138
+ # Returns three point field goals made
139
+ # @api public
140
+ # @example
141
+ # total.fg3m #=> 150
142
+ # @return [Integer] three point field goals made
143
+ attribute :fg3m, Shale::Type::Integer
144
+
145
+ # @!attribute [rw] fg3a
146
+ # Returns three point field goals attempted
147
+ # @api public
148
+ # @example
149
+ # total.fg3a #=> 400
150
+ # @return [Integer] three point field goals attempted
151
+ attribute :fg3a, Shale::Type::Integer
152
+
153
+ # @!attribute [rw] fg3_pct
154
+ # Returns three point field goal percentage
155
+ # @api public
156
+ # @example
157
+ # total.fg3_pct #=> 0.375
158
+ # @return [Float] three point field goal percentage
159
+ attribute :fg3_pct, Shale::Type::Float
160
+
161
+ # @!attribute [rw] ftm
162
+ # Returns free throws made
163
+ # @api public
164
+ # @example
165
+ # total.ftm #=> 180
166
+ # @return [Integer] free throws made
167
+ attribute :ftm, Shale::Type::Integer
168
+
169
+ # @!attribute [rw] fta
170
+ # Returns free throws attempted
171
+ # @api public
172
+ # @example
173
+ # total.fta #=> 220
174
+ # @return [Integer] free throws attempted
175
+ attribute :fta, Shale::Type::Integer
176
+
177
+ # @!attribute [rw] ft_pct
178
+ # Returns free throw percentage
179
+ # @api public
180
+ # @example
181
+ # total.ft_pct #=> 0.818
182
+ # @return [Float] free throw percentage
183
+ attribute :ft_pct, Shale::Type::Float
184
+
185
+ # @!attribute [rw] oreb
186
+ # Returns offensive rebounds
187
+ # @api public
188
+ # @example
189
+ # total.oreb #=> 100
190
+ # @return [Integer] offensive rebounds
191
+ attribute :oreb, Shale::Type::Integer
192
+
193
+ # @!attribute [rw] dreb
194
+ # Returns defensive rebounds
195
+ # @api public
196
+ # @example
197
+ # total.dreb #=> 350
198
+ # @return [Integer] defensive rebounds
199
+ attribute :dreb, Shale::Type::Integer
200
+
201
+ # @!attribute [rw] tot_reb
202
+ # Returns total rebounds
203
+ # @api public
204
+ # @example
205
+ # total.tot_reb #=> 450
206
+ # @return [Integer] total rebounds
207
+ attribute :tot_reb, Shale::Type::Integer
208
+
209
+ # @!attribute [rw] ast
210
+ # Returns assists
211
+ # @api public
212
+ # @example
213
+ # total.ast #=> 250
214
+ # @return [Integer] assists
215
+ attribute :ast, Shale::Type::Integer
216
+
217
+ # @!attribute [rw] pf
218
+ # Returns personal fouls
219
+ # @api public
220
+ # @example
221
+ # total.pf #=> 180
222
+ # @return [Integer] personal fouls
223
+ attribute :pf, Shale::Type::Integer
224
+
225
+ # @!attribute [rw] stl
226
+ # Returns steals
227
+ # @api public
228
+ # @example
229
+ # total.stl #=> 80
230
+ # @return [Integer] steals
231
+ attribute :stl, Shale::Type::Integer
232
+
233
+ # @!attribute [rw] tov
234
+ # Returns turnovers
235
+ # @api public
236
+ # @example
237
+ # total.tov #=> 120
238
+ # @return [Integer] turnovers
239
+ attribute :tov, Shale::Type::Integer
240
+
241
+ # @!attribute [rw] blk
242
+ # Returns blocks
243
+ # @api public
244
+ # @example
245
+ # total.blk #=> 45
246
+ # @return [Integer] blocks
247
+ attribute :blk, Shale::Type::Integer
248
+
249
+ # @!attribute [rw] pts
250
+ # Returns points
251
+ # @api public
252
+ # @example
253
+ # total.pts #=> 1130
254
+ # @return [Integer] points
255
+ attribute :pts, Shale::Type::Integer
256
+
257
+ # Returns the team object
258
+ #
259
+ # @api public
260
+ # @example
261
+ # total.team #=> #<NBA::Team>
262
+ # @return [Team, nil] the team object
263
+ def team
264
+ Teams.find(team_id)
265
+ end
266
+ end
267
+ end
data/lib/nba/data.rb ADDED
@@ -0,0 +1,73 @@
1
+ require "json"
2
+ require_relative "client"
3
+ require_relative "team"
4
+
5
+ module NBA
6
+ # Provides static team data for all 30 NBA teams
7
+ module Data
8
+ # All NBA team data with complete information
9
+ # @return [Array<Hash>] array of team hashes
10
+ TEAMS = [
11
+ {id: Team::ATL, abbreviation: "ATL", name: "Atlanta Hawks", full_name: "Atlanta Hawks", nickname: "Hawks",
12
+ city: "Atlanta", state: "Georgia", year_founded: 1946},
13
+ {id: Team::BOS, abbreviation: "BOS", name: "Boston Celtics", full_name: "Boston Celtics", nickname: "Celtics",
14
+ city: "Boston", state: "Massachusetts", year_founded: 1946},
15
+ {id: Team::BKN, abbreviation: "BKN", name: "Brooklyn Nets", full_name: "Brooklyn Nets", nickname: "Nets",
16
+ city: "Brooklyn", state: "New York", year_founded: 1967},
17
+ {id: Team::CHA, abbreviation: "CHA", name: "Charlotte Hornets", full_name: "Charlotte Hornets", nickname: "Hornets",
18
+ city: "Charlotte", state: "North Carolina", year_founded: 1988},
19
+ {id: Team::CHI, abbreviation: "CHI", name: "Chicago Bulls", full_name: "Chicago Bulls", nickname: "Bulls",
20
+ city: "Chicago", state: "Illinois", year_founded: 1966},
21
+ {id: Team::CLE, abbreviation: "CLE", name: "Cleveland Cavaliers", full_name: "Cleveland Cavaliers", nickname: "Cavaliers",
22
+ city: "Cleveland", state: "Ohio", year_founded: 1970},
23
+ {id: Team::DAL, abbreviation: "DAL", name: "Dallas Mavericks", full_name: "Dallas Mavericks", nickname: "Mavericks",
24
+ city: "Dallas", state: "Texas", year_founded: 1980},
25
+ {id: Team::DEN, abbreviation: "DEN", name: "Denver Nuggets", full_name: "Denver Nuggets", nickname: "Nuggets",
26
+ city: "Denver", state: "Colorado", year_founded: 1967},
27
+ {id: Team::DET, abbreviation: "DET", name: "Detroit Pistons", full_name: "Detroit Pistons", nickname: "Pistons",
28
+ city: "Detroit", state: "Michigan", year_founded: 1941},
29
+ {id: Team::GSW, abbreviation: "GSW", name: "Golden State Warriors", full_name: "Golden State Warriors", nickname: "Warriors",
30
+ city: "San Francisco", state: "California", year_founded: 1946},
31
+ {id: Team::HOU, abbreviation: "HOU", name: "Houston Rockets", full_name: "Houston Rockets", nickname: "Rockets",
32
+ city: "Houston", state: "Texas", year_founded: 1967},
33
+ {id: Team::IND, abbreviation: "IND", name: "Indiana Pacers", full_name: "Indiana Pacers", nickname: "Pacers",
34
+ city: "Indianapolis", state: "Indiana", year_founded: 1967},
35
+ {id: Team::LAC, abbreviation: "LAC", name: "LA Clippers", full_name: "Los Angeles Clippers", nickname: "Clippers",
36
+ city: "Los Angeles", state: "California", year_founded: 1970},
37
+ {id: Team::LAL, abbreviation: "LAL", name: "Los Angeles Lakers", full_name: "Los Angeles Lakers", nickname: "Lakers",
38
+ city: "Los Angeles", state: "California", year_founded: 1947},
39
+ {id: Team::MEM, abbreviation: "MEM", name: "Memphis Grizzlies", full_name: "Memphis Grizzlies", nickname: "Grizzlies",
40
+ city: "Memphis", state: "Tennessee", year_founded: 1995},
41
+ {id: Team::MIA, abbreviation: "MIA", name: "Miami Heat", full_name: "Miami Heat", nickname: "Heat",
42
+ city: "Miami", state: "Florida", year_founded: 1988},
43
+ {id: Team::MIL, abbreviation: "MIL", name: "Milwaukee Bucks", full_name: "Milwaukee Bucks", nickname: "Bucks",
44
+ city: "Milwaukee", state: "Wisconsin", year_founded: 1968},
45
+ {id: Team::MIN, abbreviation: "MIN", name: "Minnesota Timberwolves", full_name: "Minnesota Timberwolves", nickname: "Timberwolves",
46
+ city: "Minneapolis", state: "Minnesota", year_founded: 1989},
47
+ {id: Team::NOP, abbreviation: "NOP", name: "New Orleans Pelicans", full_name: "New Orleans Pelicans", nickname: "Pelicans",
48
+ city: "New Orleans", state: "Louisiana", year_founded: 2002},
49
+ {id: Team::NYK, abbreviation: "NYK", name: "New York Knicks", full_name: "New York Knicks", nickname: "Knicks",
50
+ city: "New York", state: "New York", year_founded: 1946},
51
+ {id: Team::OKC, abbreviation: "OKC", name: "Oklahoma City Thunder", full_name: "Oklahoma City Thunder", nickname: "Thunder",
52
+ city: "Oklahoma City", state: "Oklahoma", year_founded: 1967},
53
+ {id: Team::ORL, abbreviation: "ORL", name: "Orlando Magic", full_name: "Orlando Magic", nickname: "Magic",
54
+ city: "Orlando", state: "Florida", year_founded: 1989},
55
+ {id: Team::PHI, abbreviation: "PHI", name: "Philadelphia 76ers", full_name: "Philadelphia 76ers", nickname: "76ers",
56
+ city: "Philadelphia", state: "Pennsylvania", year_founded: 1946},
57
+ {id: Team::PHX, abbreviation: "PHX", name: "Phoenix Suns", full_name: "Phoenix Suns", nickname: "Suns",
58
+ city: "Phoenix", state: "Arizona", year_founded: 1968},
59
+ {id: Team::POR, abbreviation: "POR", name: "Portland Trail Blazers", full_name: "Portland Trail Blazers", nickname: "Trail Blazers",
60
+ city: "Portland", state: "Oregon", year_founded: 1970},
61
+ {id: Team::SAC, abbreviation: "SAC", name: "Sacramento Kings", full_name: "Sacramento Kings", nickname: "Kings",
62
+ city: "Sacramento", state: "California", year_founded: 1945},
63
+ {id: Team::SAS, abbreviation: "SAS", name: "San Antonio Spurs", full_name: "San Antonio Spurs", nickname: "Spurs",
64
+ city: "San Antonio", state: "Texas", year_founded: 1967},
65
+ {id: Team::TOR, abbreviation: "TOR", name: "Toronto Raptors", full_name: "Toronto Raptors", nickname: "Raptors",
66
+ city: "Toronto", state: "Ontario", year_founded: 1995},
67
+ {id: Team::UTA, abbreviation: "UTA", name: "Utah Jazz", full_name: "Utah Jazz", nickname: "Jazz",
68
+ city: "Salt Lake City", state: "Utah", year_founded: 1974},
69
+ {id: Team::WAS, abbreviation: "WAS", name: "Washington Wizards", full_name: "Washington Wizards", nickname: "Wizards",
70
+ city: "Washington", state: "District of Columbia", year_founded: 1961}
71
+ ].freeze
72
+ end
73
+ end
@@ -0,0 +1,109 @@
1
+ require "json"
2
+ require_relative "client"
3
+ require_relative "collection"
4
+ require_relative "defense_hub_stat"
5
+ require_relative "league"
6
+ require_relative "response_parser"
7
+ require_relative "utils"
8
+
9
+ module NBA
10
+ # Provides methods to retrieve NBA defense hub statistics
11
+ module DefenseHub
12
+ # Stat categories available in the defense hub
13
+ STAT_CATEGORIES = {
14
+ dreb: "DefenseHubStat1",
15
+ stl: "DefenseHubStat2",
16
+ blk: "DefenseHubStat3",
17
+ def_rating: "DefenseHubStat4",
18
+ overall_pm: "DefenseHubStat5",
19
+ threep_dfg_pct: "DefenseHubStat6",
20
+ twop_dfg_pct: "DefenseHubStat7",
21
+ fifteenf_dfg_pct: "DefenseHubStat8",
22
+ def_rim_pct: "DefenseHubStat9"
23
+ }.freeze
24
+
25
+ # Retrieves defense hub statistics for a stat category
26
+ #
27
+ # @api public
28
+ # @example
29
+ # stats = NBA::DefenseHub.all(stat_category: :dreb, season: 2023)
30
+ # stats.each { |s| puts "#{s.rank}. #{s.team_abbreviation}: #{s.value}" }
31
+ # @param stat_category [Symbol] the stat category (:dreb, :stl, :blk, etc.)
32
+ # @param season [Integer] the season year (defaults to current season)
33
+ # @param season_type [String] the season type (Regular Season, Playoffs, etc.)
34
+ # @param game_scope [String] the game scope (Season, Yesterday, etc.)
35
+ # @param player_or_team [String] player or team stats (Player, Team)
36
+ # @param player_scope [String] the player scope (All Players, Rookies)
37
+ # @param league [String, League] the league ID or League object
38
+ # @param client [Client] the API client to use
39
+ # @return [Collection] a collection of defense hub stats
40
+ def self.all(stat_category:, season: Utils.current_season, season_type: "Regular Season",
41
+ game_scope: "Season", player_or_team: "Team", player_scope: "All Players",
42
+ league: League::NBA, client: CLIENT)
43
+ result_set = STAT_CATEGORIES.fetch(stat_category)
44
+ league_id = Utils.extract_league_id(league)
45
+ opts = {season: season, season_type: season_type, game_scope: game_scope,
46
+ player_or_team: player_or_team, player_scope: player_scope, league_id: league_id}
47
+ response = client.get(build_path(opts))
48
+ parse_response(response, result_set, stat_category)
49
+ end
50
+
51
+ # Builds the API request path
52
+ # @api private
53
+ # @return [String] the request path
54
+ def self.build_path(opts)
55
+ "defensehub?GameScope=#{opts[:game_scope]}&LeagueID=#{opts[:league_id]}" \
56
+ "&PlayerOrTeam=#{opts[:player_or_team]}&PlayerScope=#{opts[:player_scope]}" \
57
+ "&Season=#{Utils.format_season(opts[:season])}&SeasonType=#{opts[:season_type]}"
58
+ end
59
+ private_class_method :build_path
60
+
61
+ # Parses the API response
62
+ # @api private
63
+ # @param response [String, nil] the raw API response
64
+ # @param result_set [String] the result set name
65
+ # @param stat_category [Symbol] the stat category
66
+ # @return [Collection] parsed stats
67
+ def self.parse_response(response, result_set, stat_category)
68
+ ResponseParser.parse(response, result_set: result_set) do |data|
69
+ build_stat(data, stat_category)
70
+ end
71
+ end
72
+ private_class_method :parse_response
73
+
74
+ # Builds a DefenseHubStat object from raw data
75
+ # @api private
76
+ # @param data [Hash] the row data
77
+ # @param stat_category [Symbol] the stat category
78
+ # @return [DefenseHubStat] the stat object
79
+ def self.build_stat(data, stat_category)
80
+ DefenseHubStat.new(**stat_attributes(data, stat_category))
81
+ end
82
+ private_class_method :build_stat
83
+
84
+ # Extracts stat attributes from data
85
+ # @api private
86
+ # @param data [Hash] the row data
87
+ # @param stat_category [Symbol] the stat category name
88
+ # @return [Hash] stat attributes
89
+ def self.stat_attributes(data, stat_category)
90
+ {rank: data["RANK"], team_id: data["TEAM_ID"],
91
+ team_abbreviation: data["TEAM_ABBREVIATION"],
92
+ team_name: data["TEAM_NAME"],
93
+ value: extract_value(data), stat_name: stat_category}
94
+ end
95
+ private_class_method :stat_attributes
96
+
97
+ # Extracts the stat value from data (different keys per result set)
98
+ # @api private
99
+ # @param data [Hash] the row data
100
+ # @return [Float, nil] the stat value
101
+ def self.extract_value(data)
102
+ value_keys = %w[DREB STL BLK TM_DEF_RATING OVERALL_PM THREEP_DFGPCT
103
+ TWOP_DFGPCT FIFETEENF_DFGPCT DEF_RIM_PCT]
104
+ value_keys.each { |key| return data.fetch(key) if data.key?(key) }
105
+ nil
106
+ end
107
+ private_class_method :extract_value
108
+ end
109
+ end
@@ -0,0 +1,57 @@
1
+ require "equalizer"
2
+ require "shale"
3
+
4
+ module NBA
5
+ # Represents a defense hub statistic entry
6
+ #
7
+ # @api public
8
+ # @example
9
+ # stat.rank #=> 1
10
+ # stat.team_abbreviation #=> "BOS"
11
+ # stat.value #=> 47.8
12
+ class DefenseHubStat < Shale::Mapper
13
+ include Equalizer.new(:rank, :team_id)
14
+
15
+ # Returns the rank
16
+ # @api public
17
+ # @example
18
+ # stat.rank #=> 1
19
+ # @return [Integer, nil] the rank
20
+ attribute :rank, Shale::Type::Integer
21
+
22
+ # Returns the team ID
23
+ # @api public
24
+ # @example
25
+ # stat.team_id #=> 1610612738
26
+ # @return [Integer, nil] the team ID
27
+ attribute :team_id, Shale::Type::Integer
28
+
29
+ # Returns the team abbreviation
30
+ # @api public
31
+ # @example
32
+ # stat.team_abbreviation #=> "BOS"
33
+ # @return [String, nil] the team abbreviation
34
+ attribute :team_abbreviation, Shale::Type::String
35
+
36
+ # Returns the team name
37
+ # @api public
38
+ # @example
39
+ # stat.team_name #=> "Boston Celtics"
40
+ # @return [String, nil] the team name
41
+ attribute :team_name, Shale::Type::String
42
+
43
+ # Returns the statistic value
44
+ # @api public
45
+ # @example
46
+ # stat.value #=> 47.8
47
+ # @return [Float, nil] the statistic value
48
+ attribute :value, Shale::Type::Float
49
+
50
+ # Returns the statistic name
51
+ # @api public
52
+ # @example
53
+ # stat.stat_name #=> "dreb"
54
+ # @return [String, nil] the statistic name
55
+ attribute :stat_name, Shale::Type::String
56
+ end
57
+ end
@@ -0,0 +1,102 @@
1
+ require "equalizer"
2
+ require "shale"
3
+ require_relative "players"
4
+
5
+ module NBA
6
+ # Represents a player's defensive shot statistics
7
+ #
8
+ # @api public
9
+ class DefensiveShotStat < Shale::Mapper
10
+ include Equalizer.new(:close_def_person_id, :defense_category, :g)
11
+
12
+ # @!attribute [rw] close_def_person_id
13
+ # Returns the defender's player ID
14
+ # @api public
15
+ # @example
16
+ # stat.close_def_person_id #=> 201939
17
+ # @return [Integer, nil] the defender's player ID
18
+ attribute :close_def_person_id, Shale::Type::Integer
19
+
20
+ # @!attribute [rw] gp
21
+ # Returns games played
22
+ # @api public
23
+ # @example
24
+ # stat.gp #=> 74
25
+ # @return [Integer, nil] games played
26
+ attribute :gp, Shale::Type::Integer
27
+
28
+ # @!attribute [rw] g
29
+ # Returns number of games
30
+ # @api public
31
+ # @example
32
+ # stat.g #=> 74
33
+ # @return [Integer, nil] games
34
+ attribute :g, Shale::Type::Integer
35
+
36
+ # @!attribute [rw] defense_category
37
+ # Returns the defensive category
38
+ # @api public
39
+ # @example
40
+ # stat.defense_category #=> "3 Pointers"
41
+ # @return [String, nil] the defensive category
42
+ attribute :defense_category, Shale::Type::String
43
+
44
+ # @!attribute [rw] freq
45
+ # Returns the frequency
46
+ # @api public
47
+ # @example
48
+ # stat.freq #=> 0.25
49
+ # @return [Float, nil] frequency
50
+ attribute :freq, Shale::Type::Float
51
+
52
+ # @!attribute [rw] d_fgm
53
+ # Returns defended field goals made
54
+ # @api public
55
+ # @example
56
+ # stat.d_fgm #=> 2.1
57
+ # @return [Float, nil] defended field goals made
58
+ attribute :d_fgm, Shale::Type::Float
59
+
60
+ # @!attribute [rw] d_fga
61
+ # Returns defended field goals attempted
62
+ # @api public
63
+ # @example
64
+ # stat.d_fga #=> 5.3
65
+ # @return [Float, nil] defended field goals attempted
66
+ attribute :d_fga, Shale::Type::Float
67
+
68
+ # @!attribute [rw] d_fg_pct
69
+ # Returns defended field goal percentage
70
+ # @api public
71
+ # @example
72
+ # stat.d_fg_pct #=> 0.396
73
+ # @return [Float, nil] defended field goal percentage
74
+ attribute :d_fg_pct, Shale::Type::Float
75
+
76
+ # @!attribute [rw] normal_fg_pct
77
+ # Returns normal field goal percentage
78
+ # @api public
79
+ # @example
80
+ # stat.normal_fg_pct #=> 0.401
81
+ # @return [Float, nil] normal field goal percentage
82
+ attribute :normal_fg_pct, Shale::Type::Float
83
+
84
+ # @!attribute [rw] pct_plusminus
85
+ # Returns percentage plus/minus
86
+ # @api public
87
+ # @example
88
+ # stat.pct_plusminus #=> -0.005
89
+ # @return [Float, nil] percentage plus/minus
90
+ attribute :pct_plusminus, Shale::Type::Float
91
+
92
+ # Returns the player who defended the shots
93
+ #
94
+ # @api public
95
+ # @example
96
+ # stat.player #=> #<NBA::Player id=201939 ...>
97
+ # @return [Player, nil] the player object
98
+ def player
99
+ Players.find(close_def_person_id)
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,49 @@
1
+ require "equalizer"
2
+ require "shale"
3
+ require_relative "conference"
4
+
5
+ module NBA
6
+ # Represents an NBA division
7
+ class Division < Shale::Mapper
8
+ include Equalizer.new(:id)
9
+
10
+ # @!attribute [rw] id
11
+ # Returns the unique identifier for the division
12
+ # @api public
13
+ # @example
14
+ # division.id #=> 5
15
+ # @return [Integer] the unique identifier for the division
16
+ attribute :id, Shale::Type::Integer
17
+
18
+ # @!attribute [rw] name
19
+ # Returns the division name
20
+ # @api public
21
+ # @example
22
+ # division.name #=> "Atlantic"
23
+ # @return [String] the division name
24
+ attribute :name, Shale::Type::String
25
+
26
+ # @!attribute [rw] link
27
+ # Returns the API link for the division
28
+ # @api public
29
+ # @example
30
+ # division.link #=> "/api/v1/divisions/5"
31
+ # @return [String] the API link for the division
32
+ attribute :link, Shale::Type::String
33
+
34
+ # @!attribute [rw] conference
35
+ # Returns the conference this division belongs to
36
+ # @api public
37
+ # @example
38
+ # division.conference #=> #<NBA::Conference>
39
+ # @return [Conference] the conference
40
+ attribute :conference, Conference
41
+
42
+ json do
43
+ map "id", to: :id
44
+ map "name", to: :name
45
+ map "link", to: :link
46
+ map "conference", to: :conference
47
+ end
48
+ end
49
+ end