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,260 @@
1
+ module NBA
2
+ # Represents a found game from the league game finder
3
+ class FoundGame < Shale::Mapper
4
+ include Equalizer.new(:game_id)
5
+
6
+ # @!attribute [rw] season_id
7
+ # Returns the season ID
8
+ # @api public
9
+ # @example
10
+ # game.season_id #=> "22024"
11
+ # @return [String] the season ID
12
+ attribute :season_id, Shale::Type::String
13
+
14
+ # @!attribute [rw] team_id
15
+ # Returns the team ID
16
+ # @api public
17
+ # @example
18
+ # game.team_id #=> 1610612744
19
+ # @return [Integer] the team ID
20
+ attribute :team_id, Shale::Type::Integer
21
+
22
+ # @!attribute [rw] team_abbreviation
23
+ # Returns the team abbreviation
24
+ # @api public
25
+ # @example
26
+ # game.team_abbreviation #=> "GSW"
27
+ # @return [String] the team abbreviation
28
+ attribute :team_abbreviation, Shale::Type::String
29
+
30
+ # @!attribute [rw] team_name
31
+ # Returns the team name
32
+ # @api public
33
+ # @example
34
+ # game.team_name #=> "Warriors"
35
+ # @return [String] the team name
36
+ attribute :team_name, Shale::Type::String
37
+
38
+ # @!attribute [rw] game_id
39
+ # Returns the game ID
40
+ # @api public
41
+ # @example
42
+ # game.game_id #=> "0022400001"
43
+ # @return [String] the game ID
44
+ attribute :game_id, Shale::Type::String
45
+
46
+ # @!attribute [rw] game_date
47
+ # Returns the game date
48
+ # @api public
49
+ # @example
50
+ # game.game_date #=> "2024-10-22"
51
+ # @return [String] the game date
52
+ attribute :game_date, Shale::Type::String
53
+
54
+ # @!attribute [rw] matchup
55
+ # Returns the matchup string
56
+ # @api public
57
+ # @example
58
+ # game.matchup #=> "GSW vs. LAL"
59
+ # @return [String] the matchup
60
+ attribute :matchup, Shale::Type::String
61
+
62
+ # @!attribute [rw] wl
63
+ # Returns win/loss result
64
+ # @api public
65
+ # @example
66
+ # game.wl #=> "W"
67
+ # @return [String] W or L
68
+ attribute :wl, Shale::Type::String
69
+
70
+ # @!attribute [rw] min
71
+ # Returns minutes played
72
+ # @api public
73
+ # @example
74
+ # game.min #=> 240
75
+ # @return [Integer] minutes
76
+ attribute :min, Shale::Type::Integer
77
+
78
+ # @!attribute [rw] pts
79
+ # Returns points scored
80
+ # @api public
81
+ # @example
82
+ # game.pts #=> 110
83
+ # @return [Integer] points
84
+ attribute :pts, Shale::Type::Integer
85
+
86
+ # @!attribute [rw] fgm
87
+ # Returns field goals made
88
+ # @api public
89
+ # @example
90
+ # game.fgm #=> 42
91
+ # @return [Integer] field goals made
92
+ attribute :fgm, Shale::Type::Integer
93
+
94
+ # @!attribute [rw] fga
95
+ # Returns field goals attempted
96
+ # @api public
97
+ # @example
98
+ # game.fga #=> 85
99
+ # @return [Integer] field goals attempted
100
+ attribute :fga, Shale::Type::Integer
101
+
102
+ # @!attribute [rw] fg_pct
103
+ # Returns field goal percentage
104
+ # @api public
105
+ # @example
106
+ # game.fg_pct #=> 0.494
107
+ # @return [Float] field goal percentage
108
+ attribute :fg_pct, Shale::Type::Float
109
+
110
+ # @!attribute [rw] fg3m
111
+ # Returns three-pointers made
112
+ # @api public
113
+ # @example
114
+ # game.fg3m #=> 14
115
+ # @return [Integer] three-pointers made
116
+ attribute :fg3m, Shale::Type::Integer
117
+
118
+ # @!attribute [rw] fg3a
119
+ # Returns three-pointers attempted
120
+ # @api public
121
+ # @example
122
+ # game.fg3a #=> 35
123
+ # @return [Integer] three-pointers attempted
124
+ attribute :fg3a, Shale::Type::Integer
125
+
126
+ # @!attribute [rw] fg3_pct
127
+ # Returns three-point percentage
128
+ # @api public
129
+ # @example
130
+ # game.fg3_pct #=> 0.4
131
+ # @return [Float] three-point percentage
132
+ attribute :fg3_pct, Shale::Type::Float
133
+
134
+ # @!attribute [rw] ftm
135
+ # Returns free throws made
136
+ # @api public
137
+ # @example
138
+ # game.ftm #=> 12
139
+ # @return [Integer] free throws made
140
+ attribute :ftm, Shale::Type::Integer
141
+
142
+ # @!attribute [rw] fta
143
+ # Returns free throws attempted
144
+ # @api public
145
+ # @example
146
+ # game.fta #=> 15
147
+ # @return [Integer] free throws attempted
148
+ attribute :fta, Shale::Type::Integer
149
+
150
+ # @!attribute [rw] ft_pct
151
+ # Returns free throw percentage
152
+ # @api public
153
+ # @example
154
+ # game.ft_pct #=> 0.8
155
+ # @return [Float] free throw percentage
156
+ attribute :ft_pct, Shale::Type::Float
157
+
158
+ # @!attribute [rw] oreb
159
+ # Returns offensive rebounds
160
+ # @api public
161
+ # @example
162
+ # game.oreb #=> 10
163
+ # @return [Integer] offensive rebounds
164
+ attribute :oreb, Shale::Type::Integer
165
+
166
+ # @!attribute [rw] dreb
167
+ # Returns defensive rebounds
168
+ # @api public
169
+ # @example
170
+ # game.dreb #=> 32
171
+ # @return [Integer] defensive rebounds
172
+ attribute :dreb, Shale::Type::Integer
173
+
174
+ # @!attribute [rw] reb
175
+ # Returns total rebounds
176
+ # @api public
177
+ # @example
178
+ # game.reb #=> 42
179
+ # @return [Integer] total rebounds
180
+ attribute :reb, Shale::Type::Integer
181
+
182
+ # @!attribute [rw] ast
183
+ # Returns assists
184
+ # @api public
185
+ # @example
186
+ # game.ast #=> 28
187
+ # @return [Integer] assists
188
+ attribute :ast, Shale::Type::Integer
189
+
190
+ # @!attribute [rw] stl
191
+ # Returns steals
192
+ # @api public
193
+ # @example
194
+ # game.stl #=> 8
195
+ # @return [Integer] steals
196
+ attribute :stl, Shale::Type::Integer
197
+
198
+ # @!attribute [rw] blk
199
+ # Returns blocks
200
+ # @api public
201
+ # @example
202
+ # game.blk #=> 5
203
+ # @return [Integer] blocks
204
+ attribute :blk, Shale::Type::Integer
205
+
206
+ # @!attribute [rw] tov
207
+ # Returns turnovers
208
+ # @api public
209
+ # @example
210
+ # game.tov #=> 12
211
+ # @return [Integer] turnovers
212
+ attribute :tov, Shale::Type::Integer
213
+
214
+ # @!attribute [rw] pf
215
+ # Returns personal fouls
216
+ # @api public
217
+ # @example
218
+ # game.pf #=> 18
219
+ # @return [Integer] personal fouls
220
+ attribute :pf, Shale::Type::Integer
221
+
222
+ # @!attribute [rw] plus_minus
223
+ # Returns plus/minus
224
+ # @api public
225
+ # @example
226
+ # game.plus_minus #=> 10
227
+ # @return [Integer] plus/minus
228
+ attribute :plus_minus, Shale::Type::Integer
229
+
230
+ # Returns the team object
231
+ #
232
+ # @api public
233
+ # @example
234
+ # game.team #=> #<NBA::Team>
235
+ # @return [Team, nil] the team object
236
+ def team
237
+ Teams.find(team_id)
238
+ end
239
+
240
+ # Returns whether the game was a win
241
+ #
242
+ # @api public
243
+ # @example
244
+ # game.win? #=> true
245
+ # @return [Boolean] true if win
246
+ def win?
247
+ wl.eql?("W")
248
+ end
249
+
250
+ # Returns whether the game was a loss
251
+ #
252
+ # @api public
253
+ # @example
254
+ # game.loss? #=> true
255
+ # @return [Boolean] true if loss
256
+ def loss?
257
+ wl.eql?("L")
258
+ end
259
+ end
260
+ end
@@ -0,0 +1,136 @@
1
+ module NBA
2
+ # Represents franchise history data
3
+ class Franchise < Shale::Mapper
4
+ include Equalizer.new(:team_id)
5
+
6
+ # @!attribute [rw] league_id
7
+ # Returns the league ID
8
+ # @api public
9
+ # @example
10
+ # franchise.league_id #=> "00"
11
+ # @return [String] the league ID
12
+ attribute :league_id, Shale::Type::String
13
+
14
+ # @!attribute [rw] team_id
15
+ # Returns the team ID
16
+ # @api public
17
+ # @example
18
+ # franchise.team_id #=> 1610612744
19
+ # @return [Integer] the team ID
20
+ attribute :team_id, Shale::Type::Integer
21
+
22
+ # @!attribute [rw] team_city
23
+ # Returns the team city
24
+ # @api public
25
+ # @example
26
+ # franchise.team_city #=> "Golden State"
27
+ # @return [String] the team city
28
+ attribute :team_city, Shale::Type::String
29
+
30
+ # @!attribute [rw] team_name
31
+ # Returns the team name
32
+ # @api public
33
+ # @example
34
+ # franchise.team_name #=> "Warriors"
35
+ # @return [String] the team name
36
+ attribute :team_name, Shale::Type::String
37
+
38
+ # @!attribute [rw] start_year
39
+ # Returns the franchise start year
40
+ # @api public
41
+ # @example
42
+ # franchise.start_year #=> 1946
43
+ # @return [Integer] the start year
44
+ attribute :start_year, Shale::Type::Integer
45
+
46
+ # @!attribute [rw] end_year
47
+ # Returns the franchise end year
48
+ # @api public
49
+ # @example
50
+ # franchise.end_year #=> 2024
51
+ # @return [Integer] the end year
52
+ attribute :end_year, Shale::Type::Integer
53
+
54
+ # @!attribute [rw] years
55
+ # Returns the number of years the franchise has existed
56
+ # @api public
57
+ # @example
58
+ # franchise.years #=> 78
59
+ # @return [Integer] the number of years
60
+ attribute :years, Shale::Type::Integer
61
+
62
+ # @!attribute [rw] games
63
+ # Returns the total games played
64
+ # @api public
65
+ # @example
66
+ # franchise.games #=> 5832
67
+ # @return [Integer] the total games
68
+ attribute :games, Shale::Type::Integer
69
+
70
+ # @!attribute [rw] wins
71
+ # Returns the total wins
72
+ # @api public
73
+ # @example
74
+ # franchise.wins #=> 2980
75
+ # @return [Integer] the total wins
76
+ attribute :wins, Shale::Type::Integer
77
+
78
+ # @!attribute [rw] losses
79
+ # Returns the total losses
80
+ # @api public
81
+ # @example
82
+ # franchise.losses #=> 2852
83
+ # @return [Integer] the total losses
84
+ attribute :losses, Shale::Type::Integer
85
+
86
+ # @!attribute [rw] win_pct
87
+ # Returns the all-time win percentage
88
+ # @api public
89
+ # @example
90
+ # franchise.win_pct #=> 0.511
91
+ # @return [Float] the win percentage
92
+ attribute :win_pct, Shale::Type::Float
93
+
94
+ # @!attribute [rw] po_appearances
95
+ # Returns the number of playoff appearances
96
+ # @api public
97
+ # @example
98
+ # franchise.po_appearances #=> 35
99
+ # @return [Integer] the playoff appearances
100
+ attribute :po_appearances, Shale::Type::Integer
101
+
102
+ # @!attribute [rw] div_titles
103
+ # Returns the number of division titles
104
+ # @api public
105
+ # @example
106
+ # franchise.div_titles #=> 12
107
+ # @return [Integer] the division titles
108
+ attribute :div_titles, Shale::Type::Integer
109
+
110
+ # @!attribute [rw] conf_titles
111
+ # Returns the number of conference titles
112
+ # @api public
113
+ # @example
114
+ # franchise.conf_titles #=> 7
115
+ # @return [Integer] the conference titles
116
+ attribute :conf_titles, Shale::Type::Integer
117
+
118
+ # @!attribute [rw] league_titles
119
+ # Returns the number of league/NBA championships
120
+ # @api public
121
+ # @example
122
+ # franchise.league_titles #=> 7
123
+ # @return [Integer] the league championships
124
+ attribute :league_titles, Shale::Type::Integer
125
+
126
+ # Returns the team object for this franchise
127
+ #
128
+ # @api public
129
+ # @example
130
+ # franchise.team #=> #<NBA::Team>
131
+ # @return [Team, nil] the team object
132
+ def team
133
+ Teams.find(team_id)
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,142 @@
1
+ require "json"
2
+ require_relative "client"
3
+ require_relative "collection"
4
+ require_relative "franchise"
5
+
6
+ module NBA
7
+ # Provides methods to retrieve franchise history
8
+ module FranchiseHistory
9
+ # Result set name for franchise history
10
+ # @return [String] the result set name
11
+ FRANCHISE_HISTORY = "FranchiseHistory".freeze
12
+
13
+ # Result set name for defunct teams
14
+ # @return [String] the result set name
15
+ DEFUNCT_TEAMS = "DefunctTeams".freeze
16
+
17
+ # Retrieves all franchise history data
18
+ #
19
+ # @api public
20
+ # @example
21
+ # franchises = NBA::FranchiseHistory.all
22
+ # franchises.each { |f| puts "#{f.team_city} #{f.team_name}: #{f.league_titles} titles" }
23
+ # @param league [String, League] the league ID or League object (default NBA)
24
+ # @param client [Client] the API client to use
25
+ # @return [Collection] a collection of franchises
26
+ def self.all(league: League::NBA, client: CLIENT)
27
+ league_id = Utils.extract_league_id(league)
28
+ path = "franchisehistory?LeagueID=#{league_id}"
29
+ response = client.get(path)
30
+ parse_response(response, FRANCHISE_HISTORY)
31
+ end
32
+
33
+ # Retrieves defunct team history data
34
+ #
35
+ # @api public
36
+ # @example
37
+ # defunct = NBA::FranchiseHistory.defunct
38
+ # defunct.each { |f| puts "#{f.team_city} #{f.team_name}: #{f.start_year}-#{f.end_year}" }
39
+ # @param league [String, League] the league ID or League object (default NBA)
40
+ # @param client [Client] the API client to use
41
+ # @return [Collection] a collection of defunct franchises
42
+ def self.defunct(league: League::NBA, client: CLIENT)
43
+ league_id = Utils.extract_league_id(league)
44
+ path = "franchisehistory?LeagueID=#{league_id}"
45
+ response = client.get(path)
46
+ parse_response(response, DEFUNCT_TEAMS)
47
+ end
48
+
49
+ # Parses the API response
50
+ #
51
+ # @api private
52
+ # @param response [String] the JSON response body
53
+ # @param result_set_name [String] the name of the result set to extract
54
+ # @return [Collection] a collection of franchises
55
+ def self.parse_response(response, result_set_name)
56
+ return Collection.new unless response
57
+
58
+ data = JSON.parse(response)
59
+ result_set = find_result_set(data, result_set_name)
60
+ return Collection.new unless result_set
61
+
62
+ headers = result_set["headers"]
63
+ rows = result_set["rowSet"]
64
+ return Collection.new unless headers && rows
65
+
66
+ franchises = rows.map { |row| build_franchise(headers, row) }
67
+ Collection.new(franchises)
68
+ end
69
+ private_class_method :parse_response
70
+
71
+ # Finds a result set by name
72
+ #
73
+ # @api private
74
+ # @param data [Hash] the parsed JSON data
75
+ # @param name [String] the result set name
76
+ # @return [Hash, nil] the result set
77
+ def self.find_result_set(data, name)
78
+ result_sets = data["resultSets"]
79
+ return unless result_sets
80
+
81
+ result_sets.find { |rs| rs["name"].eql?(name) }
82
+ end
83
+ private_class_method :find_result_set
84
+
85
+ # Builds a franchise from a row
86
+ #
87
+ # @api private
88
+ # @param headers [Array<String>] the column headers
89
+ # @param row [Array] the row data
90
+ # @return [Franchise] the franchise object
91
+ def self.build_franchise(headers, row)
92
+ data = headers.zip(row).to_h
93
+ Franchise.new(**franchise_attributes(data))
94
+ end
95
+ private_class_method :build_franchise
96
+
97
+ # Extracts franchise attributes from row data
98
+ #
99
+ # @api private
100
+ # @param data [Hash] the franchise row data
101
+ # @return [Hash] the franchise attributes
102
+ def self.franchise_attributes(data)
103
+ identity_attributes(data).merge(history_attributes(data), title_attributes(data))
104
+ end
105
+ private_class_method :franchise_attributes
106
+
107
+ # Extracts identity attributes
108
+ #
109
+ # @api private
110
+ # @param data [Hash] the franchise data
111
+ # @return [Hash] the identity attributes
112
+ def self.identity_attributes(data)
113
+ {league_id: data["LEAGUE_ID"], team_id: data["TEAM_ID"], team_city: data["TEAM_CITY"],
114
+ team_name: data["TEAM_NAME"]}
115
+ end
116
+ private_class_method :identity_attributes
117
+
118
+ # Extracts history attributes
119
+ #
120
+ # @api private
121
+ # @param data [Hash] the franchise data
122
+ # @return [Hash] the history attributes
123
+ def self.history_attributes(data)
124
+ {start_year: data["START_YEAR"], end_year: data["END_YEAR"],
125
+ years: data["YEARS"], games: data["GAMES"],
126
+ wins: data["WINS"], losses: data["LOSSES"],
127
+ win_pct: data["WIN_PCT"]}
128
+ end
129
+ private_class_method :history_attributes
130
+
131
+ # Extracts title/championship attributes
132
+ #
133
+ # @api private
134
+ # @param data [Hash] the franchise data
135
+ # @return [Hash] the title attributes
136
+ def self.title_attributes(data)
137
+ {po_appearances: data["PO_APPEARANCES"], div_titles: data["DIV_TITLES"],
138
+ conf_titles: data["CONF_TITLES"], league_titles: data["LEAGUE_TITLES"]}
139
+ end
140
+ private_class_method :title_attributes
141
+ end
142
+ end
@@ -0,0 +1,147 @@
1
+ require "equalizer"
2
+ require "shale"
3
+
4
+ module NBA
5
+ # Represents franchise leaders in various statistical categories
6
+ class FranchiseLeader < 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
+ # leader.team_id #=> 1610612744
14
+ # @return [Integer] the team ID
15
+ attribute :team_id, Shale::Type::Integer
16
+
17
+ # @!attribute [rw] pts_person_id
18
+ # Returns the person ID of the points leader
19
+ # @api public
20
+ # @example
21
+ # leader.pts_person_id #=> 201939
22
+ # @return [Integer] the points leader's person ID
23
+ attribute :pts_person_id, Shale::Type::Integer
24
+
25
+ # @!attribute [rw] pts_player_name
26
+ # Returns the name of the points leader
27
+ # @api public
28
+ # @example
29
+ # leader.pts_player_name #=> "Stephen Curry"
30
+ # @return [String] the points leader's name
31
+ attribute :pts_player_name, Shale::Type::String
32
+
33
+ # @!attribute [rw] pts
34
+ # Returns the total points scored by the leader
35
+ # @api public
36
+ # @example
37
+ # leader.pts #=> 23668
38
+ # @return [Integer] the total points
39
+ attribute :pts, Shale::Type::Integer
40
+
41
+ # @!attribute [rw] ast_person_id
42
+ # Returns the person ID of the assists leader
43
+ # @api public
44
+ # @example
45
+ # leader.ast_person_id #=> 201939
46
+ # @return [Integer] the assists leader's person ID
47
+ attribute :ast_person_id, Shale::Type::Integer
48
+
49
+ # @!attribute [rw] ast_player_name
50
+ # Returns the name of the assists leader
51
+ # @api public
52
+ # @example
53
+ # leader.ast_player_name #=> "Stephen Curry"
54
+ # @return [String] the assists leader's name
55
+ attribute :ast_player_name, Shale::Type::String
56
+
57
+ # @!attribute [rw] ast
58
+ # Returns the total assists by the leader
59
+ # @api public
60
+ # @example
61
+ # leader.ast #=> 5845
62
+ # @return [Integer] the total assists
63
+ attribute :ast, Shale::Type::Integer
64
+
65
+ # @!attribute [rw] reb_person_id
66
+ # Returns the person ID of the rebounds leader
67
+ # @api public
68
+ # @example
69
+ # leader.reb_person_id #=> 600015
70
+ # @return [Integer] the rebounds leader's person ID
71
+ attribute :reb_person_id, Shale::Type::Integer
72
+
73
+ # @!attribute [rw] reb_player_name
74
+ # Returns the name of the rebounds leader
75
+ # @api public
76
+ # @example
77
+ # leader.reb_player_name #=> "Nate Thurmond"
78
+ # @return [String] the rebounds leader's name
79
+ attribute :reb_player_name, Shale::Type::String
80
+
81
+ # @!attribute [rw] reb
82
+ # Returns the total rebounds by the leader
83
+ # @api public
84
+ # @example
85
+ # leader.reb #=> 12771
86
+ # @return [Integer] the total rebounds
87
+ attribute :reb, Shale::Type::Integer
88
+
89
+ # @!attribute [rw] blk_person_id
90
+ # Returns the person ID of the blocks leader
91
+ # @api public
92
+ # @example
93
+ # leader.blk_person_id #=> 2442
94
+ # @return [Integer] the blocks leader's person ID
95
+ attribute :blk_person_id, Shale::Type::Integer
96
+
97
+ # @!attribute [rw] blk_player_name
98
+ # Returns the name of the blocks leader
99
+ # @api public
100
+ # @example
101
+ # leader.blk_player_name #=> "Manute Bol"
102
+ # @return [String] the blocks leader's name
103
+ attribute :blk_player_name, Shale::Type::String
104
+
105
+ # @!attribute [rw] blk
106
+ # Returns the total blocks by the leader
107
+ # @api public
108
+ # @example
109
+ # leader.blk #=> 2086
110
+ # @return [Integer] the total blocks
111
+ attribute :blk, Shale::Type::Integer
112
+
113
+ # @!attribute [rw] stl_person_id
114
+ # Returns the person ID of the steals leader
115
+ # @api public
116
+ # @example
117
+ # leader.stl_person_id #=> 959
118
+ # @return [Integer] the steals leader's person ID
119
+ attribute :stl_person_id, Shale::Type::Integer
120
+
121
+ # @!attribute [rw] stl_player_name
122
+ # Returns the name of the steals leader
123
+ # @api public
124
+ # @example
125
+ # leader.stl_player_name #=> "Chris Mullin"
126
+ # @return [String] the steals leader's name
127
+ attribute :stl_player_name, Shale::Type::String
128
+
129
+ # @!attribute [rw] stl
130
+ # Returns the total steals by the leader
131
+ # @api public
132
+ # @example
133
+ # leader.stl #=> 1360
134
+ # @return [Integer] the total steals
135
+ attribute :stl, Shale::Type::Integer
136
+
137
+ # Returns the team object for this franchise
138
+ #
139
+ # @api public
140
+ # @example
141
+ # leader.team #=> #<NBA::Team>
142
+ # @return [Team, nil] the team object
143
+ def team
144
+ Teams.find(team_id)
145
+ end
146
+ end
147
+ end