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,111 @@
1
+ require "equalizer"
2
+ require "shale"
3
+
4
+ module NBA
5
+ # Represents a team's game streak statistics
6
+ #
7
+ # @api public
8
+ class TeamGameStreak < Shale::Mapper
9
+ include Equalizer.new(:team_id, :start_date, :end_date)
10
+
11
+ # @!attribute [rw] team_name
12
+ # Returns the team name
13
+ # @api public
14
+ # @example
15
+ # streak.team_name #=> "Warriors"
16
+ # @return [String, nil] the team's name
17
+ attribute :team_name, Shale::Type::String
18
+
19
+ # @!attribute [rw] team_id
20
+ # Returns the team ID
21
+ # @api public
22
+ # @example
23
+ # streak.team_id #=> 1610612744
24
+ # @return [Integer, nil] the team ID
25
+ attribute :team_id, Shale::Type::Integer
26
+
27
+ # @!attribute [rw] abbreviation
28
+ # Returns the team abbreviation
29
+ # @api public
30
+ # @example
31
+ # streak.abbreviation #=> "GSW"
32
+ # @return [String, nil] the team abbreviation
33
+ attribute :abbreviation, Shale::Type::String
34
+
35
+ # @!attribute [rw] game_streak
36
+ # Returns the number of consecutive games in the streak
37
+ # @api public
38
+ # @example
39
+ # streak.game_streak #=> 10
40
+ # @return [Integer, nil] the number of consecutive games in the streak
41
+ attribute :game_streak, Shale::Type::Integer
42
+
43
+ # @!attribute [rw] start_date
44
+ # Returns the start date of the streak
45
+ # @api public
46
+ # @example
47
+ # streak.start_date #=> "2024-01-15"
48
+ # @return [String, nil] the start date of the streak
49
+ attribute :start_date, Shale::Type::String
50
+
51
+ # @!attribute [rw] end_date
52
+ # Returns the end date of the streak
53
+ # @api public
54
+ # @example
55
+ # streak.end_date #=> "2024-02-10"
56
+ # @return [String, nil] the end date of the streak
57
+ attribute :end_date, Shale::Type::String
58
+
59
+ # @!attribute [rw] active_streak
60
+ # Returns whether the streak is active (1 for active, 0 for inactive)
61
+ # @api public
62
+ # @example
63
+ # streak.active_streak #=> 1
64
+ # @return [Integer, nil] 1 for active, 0 for inactive
65
+ attribute :active_streak, Shale::Type::Integer
66
+
67
+ # @!attribute [rw] num_seasons
68
+ # Returns the number of seasons the streak spans
69
+ # @api public
70
+ # @example
71
+ # streak.num_seasons #=> 2
72
+ # @return [Integer, nil] the number of seasons the streak spans
73
+ attribute :num_seasons, Shale::Type::Integer
74
+
75
+ # @!attribute [rw] last_season
76
+ # Returns the last season of the streak
77
+ # @api public
78
+ # @example
79
+ # streak.last_season #=> "2024-25"
80
+ # @return [String, nil] the last season of the streak
81
+ attribute :last_season, Shale::Type::String
82
+
83
+ # @!attribute [rw] first_season
84
+ # Returns the first season of the streak
85
+ # @api public
86
+ # @example
87
+ # streak.first_season #=> "2023-24"
88
+ # @return [String, nil] the first season of the streak
89
+ attribute :first_season, Shale::Type::String
90
+
91
+ # Returns whether the streak is currently active
92
+ #
93
+ # @api public
94
+ # @example
95
+ # streak.active? #=> true
96
+ # @return [Boolean] true if the streak is active
97
+ def active?
98
+ active_streak.eql?(1)
99
+ end
100
+
101
+ # Returns the team associated with this streak
102
+ #
103
+ # @api public
104
+ # @example
105
+ # streak.team #=> #<NBA::Team>
106
+ # @return [Team, nil] the team object for this streak
107
+ def team
108
+ Teams.find(team_id)
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,109 @@
1
+ require "json"
2
+ require_relative "client"
3
+ require_relative "response_parser"
4
+ require_relative "team_game_streak"
5
+ require_relative "utils"
6
+
7
+ module NBA
8
+ # Provides methods to find team game streaks
9
+ #
10
+ # @api public
11
+ module TeamGameStreakFinder
12
+ # Result set name for streak finder results
13
+ # @return [String] the result set name
14
+ RESULT_SET_NAME = "TeamGameStreakFinderParametersResults".freeze
15
+
16
+ # Stat filter parameter mappings
17
+ # @return [Hash] mapping of Ruby method parameters to API parameters
18
+ STAT_FILTERS = {gt_pts: :GtPTS, gt_reb: :GtREB, gt_ast: :GtAST, gt_stl: :GtSTL, gt_blk: :GtBLK,
19
+ gt_fg3m: :GtFG3M, w_streak: :WStreak, l_streak: :LStreak}.freeze
20
+
21
+ # Finds team game streaks matching the specified criteria
22
+ #
23
+ # @api public
24
+ # @example Find active 100+ point streaks
25
+ # NBA::TeamGameStreakFinder.find(gt_pts: 100, active_streaks_only: true)
26
+ # @param season [String, nil] the season to search (e.g., "2024-25")
27
+ # @param team [Integer, Team, nil] filter by team ID or Team object
28
+ # @param active_streaks_only [Boolean, nil] only return active streaks
29
+ # @param gt_pts [Integer, nil] minimum points per game
30
+ # @param gt_reb [Integer, nil] minimum rebounds per game
31
+ # @param gt_ast [Integer, nil] minimum assists per game
32
+ # @param gt_stl [Integer, nil] minimum steals per game
33
+ # @param gt_blk [Integer, nil] minimum blocks per game
34
+ # @param gt_fg3m [Integer, nil] minimum 3-pointers made per game
35
+ # @param w_streak [Integer, nil] minimum consecutive wins
36
+ # @param l_streak [Integer, nil] minimum consecutive losses
37
+ # @param client [Client] the API client to use
38
+ # @return [Collection] collection of TeamGameStreak objects
39
+ def self.find(season: nil, team: nil, active_streaks_only: nil, gt_pts: nil, gt_reb: nil,
40
+ gt_ast: nil, gt_stl: nil, gt_blk: nil, gt_fg3m: nil, w_streak: nil, l_streak: nil, client: CLIENT)
41
+ filters = {gt_pts: gt_pts, gt_reb: gt_reb, gt_ast: gt_ast, gt_stl: gt_stl, gt_blk: gt_blk,
42
+ gt_fg3m: gt_fg3m, w_streak: w_streak, l_streak: l_streak}
43
+ path = build_path(season, team, active_streaks_only, filters)
44
+ ResponseParser.parse(client.get(path), result_set: RESULT_SET_NAME) { |data| build_streak(data) }
45
+ end
46
+
47
+ # Builds the API path with query parameters
48
+ #
49
+ # @api private
50
+ # @return [String] the API endpoint path
51
+ def self.build_path(season, team, active_only, filters)
52
+ params = base_params(season, team, active_only)
53
+ add_stat_filters(params, filters)
54
+ "teamgamestreakfinder?#{URI.encode_www_form(params)}"
55
+ end
56
+ private_class_method :build_path
57
+
58
+ # Returns base parameters for the endpoint
59
+ #
60
+ # @api private
61
+ # @return [Hash] the base parameters hash
62
+ def self.base_params(season, team, active_only)
63
+ params = {LeagueID: "00", MinGames: 1}
64
+ params[:SeasonNullable] = season if season
65
+ params[:TeamIDNullable] = Utils.extract_id(team) if team
66
+ params[:ActiveStreaksOnly] = "Y" if active_only
67
+ params
68
+ end
69
+ private_class_method :base_params
70
+
71
+ # Adds stat filter parameters
72
+ #
73
+ # @api private
74
+ # @return [void]
75
+ def self.add_stat_filters(params, filters)
76
+ STAT_FILTERS.each { |key, param| params[param] = filters.fetch(key) if filters.fetch(key) }
77
+ end
78
+ private_class_method :add_stat_filters
79
+
80
+ # Builds a TeamGameStreak from API data
81
+ #
82
+ # @api private
83
+ # @return [TeamGameStreak] the team game streak object
84
+ def self.build_streak(data)
85
+ TeamGameStreak.new(**team_info(data), **streak_info(data))
86
+ end
87
+ private_class_method :build_streak
88
+
89
+ # Extracts team information from data
90
+ #
91
+ # @api private
92
+ # @return [Hash] the team information hash
93
+ def self.team_info(data)
94
+ {team_name: data["TEAM_NAME"], team_id: data["TEAM_ID"], abbreviation: data["ABBREVIATION"]}
95
+ end
96
+ private_class_method :team_info
97
+
98
+ # Extracts streak information from data
99
+ #
100
+ # @api private
101
+ # @return [Hash] the streak information hash
102
+ def self.streak_info(data)
103
+ {game_streak: data["GAMESTREAK"], start_date: data["STARTDATE"], end_date: data["ENDDATE"],
104
+ active_streak: data["ACTIVESTREAK"], num_seasons: data["NUMSEASONS"],
105
+ last_season: data["LASTSEASON"], first_season: data["FIRSTSEASON"]}
106
+ end
107
+ private_class_method :streak_info
108
+ end
109
+ end
@@ -0,0 +1,207 @@
1
+ require "equalizer"
2
+ require "shale"
3
+
4
+ module NBA
5
+ # Represents a team's all-time statistical leaders
6
+ #
7
+ # @api public
8
+ class TeamHistoricalLeader < Shale::Mapper
9
+ include Equalizer.new(:team_id)
10
+
11
+ # @!attribute [rw] team_id
12
+ # Returns the team ID
13
+ # @api public
14
+ # @example
15
+ # leader.team_id #=> 1610612744
16
+ # @return [Integer, nil] the team ID
17
+ attribute :team_id, Shale::Type::Integer
18
+
19
+ # @!attribute [rw] season_year
20
+ # Returns the season year
21
+ # @api public
22
+ # @example
23
+ # leader.season_year #=> 2024
24
+ # @return [Integer, nil] the season year
25
+ attribute :season_year, Shale::Type::Integer
26
+
27
+ # @!attribute [rw] pts
28
+ # Returns the all-time points total
29
+ # @api public
30
+ # @example
31
+ # leader.pts #=> 25000
32
+ # @return [Integer, nil] all-time points total
33
+ attribute :pts, Shale::Type::Integer
34
+
35
+ # @!attribute [rw] pts_person_id
36
+ # Returns the points leader player ID
37
+ # @api public
38
+ # @example
39
+ # leader.pts_person_id #=> 201939
40
+ # @return [Integer, nil] points leader player ID
41
+ attribute :pts_person_id, Shale::Type::Integer
42
+
43
+ # @!attribute [rw] pts_player
44
+ # Returns the points leader player name
45
+ # @api public
46
+ # @example
47
+ # leader.pts_player #=> "Stephen Curry"
48
+ # @return [String, nil] points leader player name
49
+ attribute :pts_player, Shale::Type::String
50
+
51
+ # @!attribute [rw] ast
52
+ # Returns the all-time assists total
53
+ # @api public
54
+ # @example
55
+ # leader.ast #=> 5000
56
+ # @return [Integer, nil] all-time assists total
57
+ attribute :ast, Shale::Type::Integer
58
+
59
+ # @!attribute [rw] ast_person_id
60
+ # Returns the assists leader player ID
61
+ # @api public
62
+ # @example
63
+ # leader.ast_person_id #=> 201939
64
+ # @return [Integer, nil] assists leader player ID
65
+ attribute :ast_person_id, Shale::Type::Integer
66
+
67
+ # @!attribute [rw] ast_player
68
+ # Returns the assists leader player name
69
+ # @api public
70
+ # @example
71
+ # leader.ast_player #=> "Stephen Curry"
72
+ # @return [String, nil] assists leader player name
73
+ attribute :ast_player, Shale::Type::String
74
+
75
+ # @!attribute [rw] reb
76
+ # Returns the all-time rebounds total
77
+ # @api public
78
+ # @example
79
+ # leader.reb #=> 8000
80
+ # @return [Integer, nil] all-time rebounds total
81
+ attribute :reb, Shale::Type::Integer
82
+
83
+ # @!attribute [rw] reb_person_id
84
+ # Returns the rebounds leader player ID
85
+ # @api public
86
+ # @example
87
+ # leader.reb_person_id #=> 201142
88
+ # @return [Integer, nil] rebounds leader player ID
89
+ attribute :reb_person_id, Shale::Type::Integer
90
+
91
+ # @!attribute [rw] reb_player
92
+ # Returns the rebounds leader player name
93
+ # @api public
94
+ # @example
95
+ # leader.reb_player #=> "Wilt Chamberlain"
96
+ # @return [String, nil] rebounds leader player name
97
+ attribute :reb_player, Shale::Type::String
98
+
99
+ # @!attribute [rw] blk
100
+ # Returns the all-time blocks total
101
+ # @api public
102
+ # @example
103
+ # leader.blk #=> 1500
104
+ # @return [Integer, nil] all-time blocks total
105
+ attribute :blk, Shale::Type::Integer
106
+
107
+ # @!attribute [rw] blk_person_id
108
+ # Returns the blocks leader player ID
109
+ # @api public
110
+ # @example
111
+ # leader.blk_person_id #=> 201142
112
+ # @return [Integer, nil] blocks leader player ID
113
+ attribute :blk_person_id, Shale::Type::Integer
114
+
115
+ # @!attribute [rw] blk_player
116
+ # Returns the blocks leader player name
117
+ # @api public
118
+ # @example
119
+ # leader.blk_player #=> "Nate Thurmond"
120
+ # @return [String, nil] blocks leader player name
121
+ attribute :blk_player, Shale::Type::String
122
+
123
+ # @!attribute [rw] stl
124
+ # Returns the all-time steals total
125
+ # @api public
126
+ # @example
127
+ # leader.stl #=> 1200
128
+ # @return [Integer, nil] all-time steals total
129
+ attribute :stl, Shale::Type::Integer
130
+
131
+ # @!attribute [rw] stl_person_id
132
+ # Returns the steals leader player ID
133
+ # @api public
134
+ # @example
135
+ # leader.stl_person_id #=> 201939
136
+ # @return [Integer, nil] steals leader player ID
137
+ attribute :stl_person_id, Shale::Type::Integer
138
+
139
+ # @!attribute [rw] stl_player
140
+ # Returns the steals leader player name
141
+ # @api public
142
+ # @example
143
+ # leader.stl_player #=> "Chris Mullin"
144
+ # @return [String, nil] steals leader player name
145
+ attribute :stl_player, Shale::Type::String
146
+
147
+ # Returns the team for this leader record
148
+ #
149
+ # @api public
150
+ # @example
151
+ # leader.team #=> #<NBA::Team ...>
152
+ # @return [Team, nil] the team
153
+ def team
154
+ Teams.find(team_id)
155
+ end
156
+
157
+ # Returns the points leader player
158
+ #
159
+ # @api public
160
+ # @example
161
+ # leader.pts_leader #=> #<NBA::Player ...>
162
+ # @return [Player, nil] the points leader
163
+ def pts_leader
164
+ Players.find(pts_person_id)
165
+ end
166
+
167
+ # Returns the assists leader player
168
+ #
169
+ # @api public
170
+ # @example
171
+ # leader.ast_leader #=> #<NBA::Player ...>
172
+ # @return [Player, nil] the assists leader
173
+ def ast_leader
174
+ Players.find(ast_person_id)
175
+ end
176
+
177
+ # Returns the rebounds leader player
178
+ #
179
+ # @api public
180
+ # @example
181
+ # leader.reb_leader #=> #<NBA::Player ...>
182
+ # @return [Player, nil] the rebounds leader
183
+ def reb_leader
184
+ Players.find(reb_person_id)
185
+ end
186
+
187
+ # Returns the blocks leader player
188
+ #
189
+ # @api public
190
+ # @example
191
+ # leader.blk_leader #=> #<NBA::Player ...>
192
+ # @return [Player, nil] the blocks leader
193
+ def blk_leader
194
+ Players.find(blk_person_id)
195
+ end
196
+
197
+ # Returns the steals leader player
198
+ #
199
+ # @api public
200
+ # @example
201
+ # leader.stl_leader #=> #<NBA::Player ...>
202
+ # @return [Player, nil] the steals leader
203
+ def stl_leader
204
+ Players.find(stl_person_id)
205
+ end
206
+ end
207
+ end
@@ -0,0 +1,98 @@
1
+ require_relative "client"
2
+ require_relative "collection"
3
+ require_relative "response_parser"
4
+ require_relative "utils"
5
+
6
+ module NBA
7
+ # Provides methods to retrieve team historical career leaders
8
+ #
9
+ # @api public
10
+ module TeamHistoricalLeaders
11
+ # Result set name in API response
12
+ # @return [String] the result set name
13
+ RESULT_SET_NAME = "CareerLeadersByTeam".freeze
14
+
15
+ # Retrieves historical leaders for a team
16
+ #
17
+ # @api public
18
+ # @example
19
+ # leaders = NBA::TeamHistoricalLeaders.find(team: 1610612744)
20
+ # leaders.pts_player #=> "Stephen Curry"
21
+ # @param team [Integer, Team] the team or team ID
22
+ # @param season [Integer] the season year (defaults to current season)
23
+ # @param client [Client] the API client to use
24
+ # @return [TeamHistoricalLeader, nil] the team historical leaders
25
+ def self.find(team:, season: Utils.current_season, client: CLIENT)
26
+ id = Utils.extract_id(team)
27
+ return unless id
28
+
29
+ path = build_path(id, season)
30
+ ResponseParser.parse_single(client.get(path), result_set: RESULT_SET_NAME) { |data| build_leader(data) }
31
+ end
32
+
33
+ # Builds the API path
34
+ # @api private
35
+ # @return [String]
36
+ def self.build_path(team_id, season)
37
+ "teamhistoricalleaders?TeamID=#{team_id}&LeagueID=00&SeasonID=#{Utils.format_season_id(season)}"
38
+ end
39
+ private_class_method :build_path
40
+
41
+ # Builds a TeamHistoricalLeader from API data
42
+ # @api private
43
+ # @return [TeamHistoricalLeader]
44
+ def self.build_leader(data)
45
+ TeamHistoricalLeader.new(**identity_info(data), **pts_info(data), **ast_info(data), **reb_info(data),
46
+ **blk_info(data), **stl_info(data))
47
+ end
48
+ private_class_method :build_leader
49
+
50
+ # Extracts identity fields
51
+ # @api private
52
+ # @return [Hash]
53
+ def self.identity_info(data)
54
+ {team_id: data["TEAM_ID"], season_year: data["SEASON_YEAR"]}
55
+ end
56
+ private_class_method :identity_info
57
+
58
+ # Extracts points leader fields
59
+ # @api private
60
+ # @return [Hash]
61
+ def self.pts_info(data)
62
+ {pts: data["PTS"], pts_person_id: data["PTS_PERSON_ID"], pts_player: data["PTS_PLAYER"]}
63
+ end
64
+ private_class_method :pts_info
65
+
66
+ # Extracts assists leader fields
67
+ # @api private
68
+ # @return [Hash]
69
+ def self.ast_info(data)
70
+ {ast: data["AST"], ast_person_id: data["AST_PERSON_ID"], ast_player: data["AST_PLAYER"]}
71
+ end
72
+ private_class_method :ast_info
73
+
74
+ # Extracts rebounds leader fields
75
+ # @api private
76
+ # @return [Hash]
77
+ def self.reb_info(data)
78
+ {reb: data["REB"], reb_person_id: data["REB_PERSON_ID"], reb_player: data["REB_PLAYER"]}
79
+ end
80
+ private_class_method :reb_info
81
+
82
+ # Extracts blocks leader fields
83
+ # @api private
84
+ # @return [Hash]
85
+ def self.blk_info(data)
86
+ {blk: data["BLK"], blk_person_id: data["BLK_PERSON_ID"], blk_player: data["BLK_PLAYER"]}
87
+ end
88
+ private_class_method :blk_info
89
+
90
+ # Extracts steals leader fields
91
+ # @api private
92
+ # @return [Hash]
93
+ def self.stl_info(data)
94
+ {stl: data["STL"], stl_person_id: data["STL_PERSON_ID"], stl_player: data["STL_PLAYER"]}
95
+ end
96
+ private_class_method :stl_info
97
+ end
98
+ end
@@ -0,0 +1,139 @@
1
+ require "equalizer"
2
+ require "shale"
3
+
4
+ module NBA
5
+ # Represents a team's historical record
6
+ class TeamHistoricalRecord < Shale::Mapper
7
+ include Equalizer.new(:team_id, :season_id)
8
+
9
+ # @!attribute [rw] team_id
10
+ # Returns the team ID
11
+ # @api public
12
+ # @example
13
+ # record.team_id #=> 1610612744
14
+ # @return [Integer] the team ID
15
+ attribute :team_id, Shale::Type::Integer
16
+
17
+ # @!attribute [rw] city
18
+ # Returns the team city
19
+ # @api public
20
+ # @example
21
+ # record.city #=> "Golden State"
22
+ # @return [String] the city
23
+ attribute :city, Shale::Type::String
24
+
25
+ # @!attribute [rw] nickname
26
+ # Returns the team nickname
27
+ # @api public
28
+ # @example
29
+ # record.nickname #=> "Warriors"
30
+ # @return [String] the nickname
31
+ attribute :nickname, Shale::Type::String
32
+
33
+ # @!attribute [rw] season_id
34
+ # Returns the season ID
35
+ # @api public
36
+ # @example
37
+ # record.season_id #=> "22024"
38
+ # @return [String] the season ID
39
+ attribute :season_id, Shale::Type::String
40
+
41
+ # @!attribute [rw] year
42
+ # Returns the year
43
+ # @api public
44
+ # @example
45
+ # record.year #=> 2024
46
+ # @return [Integer] the year
47
+ attribute :year, Shale::Type::Integer
48
+
49
+ # @!attribute [rw] wins
50
+ # Returns the number of wins
51
+ # @api public
52
+ # @example
53
+ # record.wins #=> 46
54
+ # @return [Integer] the wins
55
+ attribute :wins, Shale::Type::Integer
56
+
57
+ # @!attribute [rw] losses
58
+ # Returns the number of losses
59
+ # @api public
60
+ # @example
61
+ # record.losses #=> 36
62
+ # @return [Integer] the losses
63
+ attribute :losses, Shale::Type::Integer
64
+
65
+ # @!attribute [rw] win_pct
66
+ # Returns the win percentage
67
+ # @api public
68
+ # @example
69
+ # record.win_pct #=> 0.561
70
+ # @return [Float] the win percentage
71
+ attribute :win_pct, Shale::Type::Float
72
+
73
+ # @!attribute [rw] conf_rank
74
+ # Returns the conference rank
75
+ # @api public
76
+ # @example
77
+ # record.conf_rank #=> 10
78
+ # @return [Integer] the conference rank
79
+ attribute :conf_rank, Shale::Type::Integer
80
+
81
+ # @!attribute [rw] div_rank
82
+ # Returns the division rank
83
+ # @api public
84
+ # @example
85
+ # record.div_rank #=> 3
86
+ # @return [Integer] the division rank
87
+ attribute :div_rank, Shale::Type::Integer
88
+
89
+ # @!attribute [rw] po_wins
90
+ # Returns playoff wins
91
+ # @api public
92
+ # @example
93
+ # record.po_wins #=> 0
94
+ # @return [Integer] the playoff wins
95
+ attribute :po_wins, Shale::Type::Integer
96
+
97
+ # @!attribute [rw] po_losses
98
+ # Returns playoff losses
99
+ # @api public
100
+ # @example
101
+ # record.po_losses #=> 0
102
+ # @return [Integer] the playoff losses
103
+ attribute :po_losses, Shale::Type::Integer
104
+
105
+ # @!attribute [rw] conf_count
106
+ # Returns conference titles
107
+ # @api public
108
+ # @example
109
+ # record.conf_count #=> 0
110
+ # @return [Integer] the conference titles
111
+ attribute :conf_count, Shale::Type::Integer
112
+
113
+ # @!attribute [rw] div_count
114
+ # Returns division titles
115
+ # @api public
116
+ # @example
117
+ # record.div_count #=> 0
118
+ # @return [Integer] the division titles
119
+ attribute :div_count, Shale::Type::Integer
120
+
121
+ # @!attribute [rw] nba_finals_appearance
122
+ # Returns NBA Finals appearances
123
+ # @api public
124
+ # @example
125
+ # record.nba_finals_appearance #=> "N/A"
126
+ # @return [String] the Finals appearances
127
+ attribute :nba_finals_appearance, Shale::Type::String
128
+
129
+ # Returns the team object
130
+ #
131
+ # @api public
132
+ # @example
133
+ # record.team #=> #<NBA::Team>
134
+ # @return [Team, nil] the team object
135
+ def team
136
+ Teams.find(team_id)
137
+ end
138
+ end
139
+ end