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,311 @@
1
+ require "equalizer"
2
+ require "shale"
3
+
4
+ module NBA
5
+ # Represents FanDuel infographic statistics for a player in a game
6
+ class InfographicFanDuelPlayerStat < Shale::Mapper
7
+ include Equalizer.new(:game_id, :player_id)
8
+
9
+ # @!attribute [rw] game_id
10
+ # Returns the game ID
11
+ # @api public
12
+ # @example
13
+ # stat.game_id #=> "0022400001"
14
+ # @return [String] the game ID
15
+ attribute :game_id, Shale::Type::String
16
+
17
+ # @!attribute [rw] player_id
18
+ # Returns the player ID
19
+ # @api public
20
+ # @example
21
+ # stat.player_id #=> 201939
22
+ # @return [Integer] the player ID
23
+ attribute :player_id, Shale::Type::Integer
24
+
25
+ # @!attribute [rw] player_name
26
+ # Returns the player name
27
+ # @api public
28
+ # @example
29
+ # stat.player_name #=> "Stephen Curry"
30
+ # @return [String] the player name
31
+ attribute :player_name, Shale::Type::String
32
+
33
+ # @!attribute [rw] team_id
34
+ # Returns the team ID
35
+ # @api public
36
+ # @example
37
+ # stat.team_id #=> 1610612744
38
+ # @return [Integer] the team ID
39
+ attribute :team_id, Shale::Type::Integer
40
+
41
+ # @!attribute [rw] team_name
42
+ # Returns the team name
43
+ # @api public
44
+ # @example
45
+ # stat.team_name #=> "Warriors"
46
+ # @return [String] the team name
47
+ attribute :team_name, Shale::Type::String
48
+
49
+ # @!attribute [rw] team_abbreviation
50
+ # Returns the team abbreviation
51
+ # @api public
52
+ # @example
53
+ # stat.team_abbreviation #=> "GSW"
54
+ # @return [String] the team abbreviation
55
+ attribute :team_abbreviation, Shale::Type::String
56
+
57
+ # @!attribute [rw] jersey_num
58
+ # Returns the jersey number
59
+ # @api public
60
+ # @example
61
+ # stat.jersey_num #=> "30"
62
+ # @return [String] the jersey number
63
+ attribute :jersey_num, Shale::Type::String
64
+
65
+ # @!attribute [rw] player_position
66
+ # Returns the player position
67
+ # @api public
68
+ # @example
69
+ # stat.player_position #=> "G"
70
+ # @return [String] the player position
71
+ attribute :player_position, Shale::Type::String
72
+
73
+ # @!attribute [rw] location
74
+ # Returns the location (home/away)
75
+ # @api public
76
+ # @example
77
+ # stat.location #=> "Home"
78
+ # @return [String] the location
79
+ attribute :location, Shale::Type::String
80
+
81
+ # @!attribute [rw] fan_duel_pts
82
+ # Returns the FanDuel fantasy points
83
+ # @api public
84
+ # @example
85
+ # stat.fan_duel_pts #=> 52.3
86
+ # @return [Float] FanDuel points
87
+ attribute :fan_duel_pts, Shale::Type::Float
88
+
89
+ # @!attribute [rw] nba_fantasy_pts
90
+ # Returns the NBA fantasy points
91
+ # @api public
92
+ # @example
93
+ # stat.nba_fantasy_pts #=> 48.5
94
+ # @return [Float] NBA fantasy points
95
+ attribute :nba_fantasy_pts, Shale::Type::Float
96
+
97
+ # @!attribute [rw] usg_pct
98
+ # Returns the usage percentage
99
+ # @api public
100
+ # @example
101
+ # stat.usg_pct #=> 0.312
102
+ # @return [Float] usage percentage
103
+ attribute :usg_pct, Shale::Type::Float
104
+
105
+ # @!attribute [rw] min
106
+ # Returns the minutes played
107
+ # @api public
108
+ # @example
109
+ # stat.min #=> 34.5
110
+ # @return [Float] minutes
111
+ attribute :min, Shale::Type::Float
112
+
113
+ # @!attribute [rw] fgm
114
+ # Returns the field goals made
115
+ # @api public
116
+ # @example
117
+ # stat.fgm #=> 10
118
+ # @return [Integer] field goals made
119
+ attribute :fgm, Shale::Type::Integer
120
+
121
+ # @!attribute [rw] fga
122
+ # Returns the field goals attempted
123
+ # @api public
124
+ # @example
125
+ # stat.fga #=> 20
126
+ # @return [Integer] field goals attempted
127
+ attribute :fga, Shale::Type::Integer
128
+
129
+ # @!attribute [rw] fg_pct
130
+ # Returns the field goal percentage
131
+ # @api public
132
+ # @example
133
+ # stat.fg_pct #=> 0.500
134
+ # @return [Float] field goal percentage
135
+ attribute :fg_pct, Shale::Type::Float
136
+
137
+ # @!attribute [rw] fg3m
138
+ # Returns the three-pointers made
139
+ # @api public
140
+ # @example
141
+ # stat.fg3m #=> 5
142
+ # @return [Integer] three-pointers made
143
+ attribute :fg3m, Shale::Type::Integer
144
+
145
+ # @!attribute [rw] fg3a
146
+ # Returns the three-pointers attempted
147
+ # @api public
148
+ # @example
149
+ # stat.fg3a #=> 11
150
+ # @return [Integer] three-pointers attempted
151
+ attribute :fg3a, Shale::Type::Integer
152
+
153
+ # @!attribute [rw] fg3_pct
154
+ # Returns the three-point percentage
155
+ # @api public
156
+ # @example
157
+ # stat.fg3_pct #=> 0.455
158
+ # @return [Float] three-point percentage
159
+ attribute :fg3_pct, Shale::Type::Float
160
+
161
+ # @!attribute [rw] ftm
162
+ # Returns the free throws made
163
+ # @api public
164
+ # @example
165
+ # stat.ftm #=> 5
166
+ # @return [Integer] free throws made
167
+ attribute :ftm, Shale::Type::Integer
168
+
169
+ # @!attribute [rw] fta
170
+ # Returns the free throws attempted
171
+ # @api public
172
+ # @example
173
+ # stat.fta #=> 6
174
+ # @return [Integer] free throws attempted
175
+ attribute :fta, Shale::Type::Integer
176
+
177
+ # @!attribute [rw] ft_pct
178
+ # Returns the free throw percentage
179
+ # @api public
180
+ # @example
181
+ # stat.ft_pct #=> 0.833
182
+ # @return [Float] free throw percentage
183
+ attribute :ft_pct, Shale::Type::Float
184
+
185
+ # @!attribute [rw] oreb
186
+ # Returns the offensive rebounds
187
+ # @api public
188
+ # @example
189
+ # stat.oreb #=> 1
190
+ # @return [Integer] offensive rebounds
191
+ attribute :oreb, Shale::Type::Integer
192
+
193
+ # @!attribute [rw] dreb
194
+ # Returns the defensive rebounds
195
+ # @api public
196
+ # @example
197
+ # stat.dreb #=> 5
198
+ # @return [Integer] defensive rebounds
199
+ attribute :dreb, Shale::Type::Integer
200
+
201
+ # @!attribute [rw] reb
202
+ # Returns the total rebounds
203
+ # @api public
204
+ # @example
205
+ # stat.reb #=> 6
206
+ # @return [Integer] total rebounds
207
+ attribute :reb, Shale::Type::Integer
208
+
209
+ # @!attribute [rw] ast
210
+ # Returns the assists
211
+ # @api public
212
+ # @example
213
+ # stat.ast #=> 8
214
+ # @return [Integer] assists
215
+ attribute :ast, Shale::Type::Integer
216
+
217
+ # @!attribute [rw] tov
218
+ # Returns the turnovers
219
+ # @api public
220
+ # @example
221
+ # stat.tov #=> 3
222
+ # @return [Integer] turnovers
223
+ attribute :tov, Shale::Type::Integer
224
+
225
+ # @!attribute [rw] stl
226
+ # Returns the steals
227
+ # @api public
228
+ # @example
229
+ # stat.stl #=> 2
230
+ # @return [Integer] steals
231
+ attribute :stl, Shale::Type::Integer
232
+
233
+ # @!attribute [rw] blk
234
+ # Returns the blocks
235
+ # @api public
236
+ # @example
237
+ # stat.blk #=> 0
238
+ # @return [Integer] blocks
239
+ attribute :blk, Shale::Type::Integer
240
+
241
+ # @!attribute [rw] blka
242
+ # Returns the blocked attempts
243
+ # @api public
244
+ # @example
245
+ # stat.blka #=> 1
246
+ # @return [Integer] blocked attempts
247
+ attribute :blka, Shale::Type::Integer
248
+
249
+ # @!attribute [rw] pf
250
+ # Returns the personal fouls
251
+ # @api public
252
+ # @example
253
+ # stat.pf #=> 2
254
+ # @return [Integer] personal fouls
255
+ attribute :pf, Shale::Type::Integer
256
+
257
+ # @!attribute [rw] pfd
258
+ # Returns the personal fouls drawn
259
+ # @api public
260
+ # @example
261
+ # stat.pfd #=> 4
262
+ # @return [Integer] personal fouls drawn
263
+ attribute :pfd, Shale::Type::Integer
264
+
265
+ # @!attribute [rw] pts
266
+ # Returns the points scored
267
+ # @api public
268
+ # @example
269
+ # stat.pts #=> 30
270
+ # @return [Integer] points
271
+ attribute :pts, Shale::Type::Integer
272
+
273
+ # @!attribute [rw] plus_minus
274
+ # Returns the plus/minus
275
+ # @api public
276
+ # @example
277
+ # stat.plus_minus #=> 15
278
+ # @return [Integer] plus/minus
279
+ attribute :plus_minus, Shale::Type::Integer
280
+
281
+ # Returns the player object
282
+ #
283
+ # @api public
284
+ # @example
285
+ # stat.player #=> #<NBA::Player>
286
+ # @return [Player, nil] the player object
287
+ def player
288
+ Players.find(player_id)
289
+ end
290
+
291
+ # Returns the team object
292
+ #
293
+ # @api public
294
+ # @example
295
+ # stat.team #=> #<NBA::Team>
296
+ # @return [Team, nil] the team object
297
+ def team
298
+ Teams.find(team_id)
299
+ end
300
+
301
+ # Returns the game object
302
+ #
303
+ # @api public
304
+ # @example
305
+ # stat.game #=> #<NBA::Game>
306
+ # @return [Game, nil] the game object
307
+ def game
308
+ Games.find(game_id)
309
+ end
310
+ end
311
+ end
@@ -0,0 +1,167 @@
1
+ require "equalizer"
2
+ require "shale"
3
+ require_relative "teams"
4
+
5
+ module NBA
6
+ # Represents an In-Season Tournament standing entry
7
+ class IstStanding < Shale::Mapper
8
+ include Equalizer.new(:team_id, :season_id)
9
+
10
+ # @!attribute [rw] season_id
11
+ # Returns the season ID
12
+ # @api public
13
+ # @example
14
+ # standing.season_id #=> "2023-24"
15
+ # @return [String] the season ID
16
+ attribute :season_id, Shale::Type::String
17
+
18
+ # @!attribute [rw] team_id
19
+ # Returns the team ID
20
+ # @api public
21
+ # @example
22
+ # standing.team_id #=> 1610612747
23
+ # @return [Integer] the team ID
24
+ attribute :team_id, Shale::Type::Integer
25
+
26
+ # @!attribute [rw] team_city
27
+ # Returns the team city
28
+ # @api public
29
+ # @example
30
+ # standing.team_city #=> "Los Angeles"
31
+ # @return [String] the team city
32
+ attribute :team_city, Shale::Type::String
33
+
34
+ # @!attribute [rw] team_name
35
+ # Returns the team name
36
+ # @api public
37
+ # @example
38
+ # standing.team_name #=> "Lakers"
39
+ # @return [String] the team name
40
+ attribute :team_name, Shale::Type::String
41
+
42
+ # @!attribute [rw] team_abbreviation
43
+ # Returns the team abbreviation
44
+ # @api public
45
+ # @example
46
+ # standing.team_abbreviation #=> "LAL"
47
+ # @return [String] the team abbreviation
48
+ attribute :team_abbreviation, Shale::Type::String
49
+
50
+ # @!attribute [rw] team_slug
51
+ # Returns the team slug
52
+ # @api public
53
+ # @example
54
+ # standing.team_slug #=> "lakers"
55
+ # @return [String] the team slug
56
+ attribute :team_slug, Shale::Type::String
57
+
58
+ # @!attribute [rw] conference
59
+ # Returns the conference
60
+ # @api public
61
+ # @example
62
+ # standing.conference #=> "West"
63
+ # @return [String] the conference
64
+ attribute :conference, Shale::Type::String
65
+
66
+ # @!attribute [rw] ist_group
67
+ # Returns the IST group
68
+ # @api public
69
+ # @example
70
+ # standing.ist_group #=> "West Group A"
71
+ # @return [String] the IST group
72
+ attribute :ist_group, Shale::Type::String
73
+
74
+ # @!attribute [rw] ist_group_rank
75
+ # Returns the rank within IST group
76
+ # @api public
77
+ # @example
78
+ # standing.ist_group_rank #=> 1
79
+ # @return [Integer] the IST group rank
80
+ attribute :ist_group_rank, Shale::Type::Integer
81
+
82
+ # @!attribute [rw] wins
83
+ # Returns the number of wins
84
+ # @api public
85
+ # @example
86
+ # standing.wins #=> 3
87
+ # @return [Integer] the number of wins
88
+ attribute :wins, Shale::Type::Integer
89
+
90
+ # @!attribute [rw] losses
91
+ # Returns the number of losses
92
+ # @api public
93
+ # @example
94
+ # standing.losses #=> 1
95
+ # @return [Integer] the number of losses
96
+ attribute :losses, Shale::Type::Integer
97
+
98
+ # @!attribute [rw] win_pct
99
+ # Returns the win percentage
100
+ # @api public
101
+ # @example
102
+ # standing.win_pct #=> 0.750
103
+ # @return [Float] the win percentage
104
+ attribute :win_pct, Shale::Type::Float
105
+
106
+ # @!attribute [rw] pts_for
107
+ # Returns total points scored
108
+ # @api public
109
+ # @example
110
+ # standing.pts_for #=> 450
111
+ # @return [Integer] points scored
112
+ attribute :pts_for, Shale::Type::Integer
113
+
114
+ # @!attribute [rw] pts_against
115
+ # Returns total points allowed
116
+ # @api public
117
+ # @example
118
+ # standing.pts_against #=> 420
119
+ # @return [Integer] points allowed
120
+ attribute :pts_against, Shale::Type::Integer
121
+
122
+ # @!attribute [rw] pts_diff
123
+ # Returns the point differential
124
+ # @api public
125
+ # @example
126
+ # standing.pts_diff #=> 30
127
+ # @return [Integer] the point differential
128
+ attribute :pts_diff, Shale::Type::Integer
129
+
130
+ # @!attribute [rw] clinch_indicator
131
+ # Returns the clinch indicator
132
+ # @api public
133
+ # @example
134
+ # standing.clinch_indicator #=> "z"
135
+ # @return [String] the clinch indicator
136
+ attribute :clinch_indicator, Shale::Type::String
137
+
138
+ # Returns the team object
139
+ #
140
+ # @api public
141
+ # @example
142
+ # standing.team #=> #<NBA::Team>
143
+ # @return [Team, nil] the team object
144
+ def team
145
+ Teams.find(team_id)
146
+ end
147
+
148
+ json do
149
+ map "season_id", to: :season_id
150
+ map "team_id", to: :team_id
151
+ map "team_city", to: :team_city
152
+ map "team_name", to: :team_name
153
+ map "team_abbreviation", to: :team_abbreviation
154
+ map "team_slug", to: :team_slug
155
+ map "conference", to: :conference
156
+ map "ist_group", to: :ist_group
157
+ map "ist_group_rank", to: :ist_group_rank
158
+ map "wins", to: :wins
159
+ map "losses", to: :losses
160
+ map "win_pct", to: :win_pct
161
+ map "pts_for", to: :pts_for
162
+ map "pts_against", to: :pts_against
163
+ map "pts_diff", to: :pts_diff
164
+ map "clinch_indicator", to: :clinch_indicator
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,81 @@
1
+ require "json"
2
+ require_relative "client"
3
+ require_relative "collection"
4
+ require_relative "ist_standing"
5
+ require_relative "response_parser"
6
+ require_relative "utils"
7
+
8
+ module NBA
9
+ # Provides methods to retrieve NBA In-Season Tournament standings
10
+ module IstStandings
11
+ # Result set name for IST standings
12
+ # @return [String] the result set name
13
+ RESULT_SET = "Standings".freeze
14
+
15
+ # Retrieves In-Season Tournament standings for a season
16
+ #
17
+ # @api public
18
+ # @example
19
+ # standings = NBA::IstStandings.all(season: 2023)
20
+ # standings.each { |s| puts "#{s.team_name}: #{s.wins}-#{s.losses}" }
21
+ # @param season [Integer] the season year (defaults to current season)
22
+ # @param league [String, League] the league ID or League object (default NBA)
23
+ # @param client [Client] the API client to use
24
+ # @return [Collection] a collection of IST standings
25
+ def self.all(season: Utils.current_season, league: League::NBA, client: CLIENT)
26
+ league_id = Utils.extract_league_id(league)
27
+ path = build_path(season, league_id)
28
+ ResponseParser.parse(client.get(path), result_set: RESULT_SET) { |data| build_standing(data) }
29
+ end
30
+
31
+ # Builds the API request path
32
+ # @api private
33
+ # @return [String] the request path
34
+ def self.build_path(season, league_id)
35
+ "iststandings?LeagueID=#{league_id}&Season=#{Utils.format_season(season)}"
36
+ end
37
+ private_class_method :build_path
38
+
39
+ # Builds an IstStanding object from raw data
40
+ # @api private
41
+ # @param data [Hash] the row data
42
+ # @return [IstStanding] the standing object
43
+ def self.build_standing(data)
44
+ IstStanding.new(**team_attrs(data), **record_attrs(data), **pts_attrs(data))
45
+ end
46
+ private_class_method :build_standing
47
+
48
+ # Extracts team attributes from data
49
+ # @api private
50
+ # @param data [Hash] the row data
51
+ # @return [Hash] team attributes
52
+ def self.team_attrs(data)
53
+ {season_id: data["SEASON_ID"], team_id: data["TEAM_ID"],
54
+ team_city: data["TEAM_CITY"], team_name: data["TEAM_NAME"],
55
+ team_abbreviation: data["TEAM_ABBREVIATION"], team_slug: data["TEAM_SLUG"],
56
+ conference: data["CONFERENCE"], ist_group: data["IST_GROUP"]}
57
+ end
58
+ private_class_method :team_attrs
59
+
60
+ # Extracts record attributes from data
61
+ # @api private
62
+ # @param data [Hash] the row data
63
+ # @return [Hash] record attributes
64
+ def self.record_attrs(data)
65
+ {ist_group_rank: data["IST_GROUP_RANK"], wins: data["WINS"],
66
+ losses: data["LOSSES"], win_pct: data["WIN_PCT"],
67
+ clinch_indicator: data["CLINCH_INDICATOR"]}
68
+ end
69
+ private_class_method :record_attrs
70
+
71
+ # Extracts point attributes from data
72
+ # @api private
73
+ # @param data [Hash] the row data
74
+ # @return [Hash] point attributes
75
+ def self.pts_attrs(data)
76
+ {pts_for: data["PTS_FOR"], pts_against: data["PTS_AGAINST"],
77
+ pts_diff: data["PTS_DIFF"]}
78
+ end
79
+ private_class_method :pts_attrs
80
+ end
81
+ end
data/lib/nba/leader.rb ADDED
@@ -0,0 +1,103 @@
1
+ require "equalizer"
2
+ require "shale"
3
+ require_relative "players"
4
+ require_relative "teams"
5
+
6
+ module NBA
7
+ # Represents a statistical leader entry
8
+ class Leader < Shale::Mapper
9
+ include Equalizer.new(:player_id, :category)
10
+
11
+ # @!attribute [rw] player_id
12
+ # Returns the player ID
13
+ # @api public
14
+ # @example
15
+ # leader.player_id #=> 201939
16
+ # @return [Integer] the player ID
17
+ attribute :player_id, Shale::Type::Integer
18
+
19
+ # @!attribute [rw] player_name
20
+ # Returns the player name
21
+ # @api public
22
+ # @example
23
+ # leader.player_name #=> "Stephen Curry"
24
+ # @return [String] the player name
25
+ attribute :player_name, Shale::Type::String
26
+
27
+ # @!attribute [rw] team_id
28
+ # Returns the team ID
29
+ # @api public
30
+ # @example
31
+ # leader.team_id #=> 1610612744
32
+ # @return [Integer] the team ID
33
+ attribute :team_id, Shale::Type::Integer
34
+
35
+ # @!attribute [rw] team_abbreviation
36
+ # Returns the team abbreviation
37
+ # @api public
38
+ # @example
39
+ # leader.team_abbreviation #=> "GSW"
40
+ # @return [String] the team abbreviation
41
+ attribute :team_abbreviation, Shale::Type::String
42
+
43
+ # @!attribute [rw] category
44
+ # Returns the statistical category
45
+ # @api public
46
+ # @example
47
+ # leader.category #=> "PTS"
48
+ # @return [String] the statistical category
49
+ attribute :category, Shale::Type::String
50
+
51
+ # @!attribute [rw] rank
52
+ # Returns the rank in the category
53
+ # @api public
54
+ # @example
55
+ # leader.rank #=> 1
56
+ # @return [Integer] the rank
57
+ attribute :rank, Shale::Type::Integer
58
+
59
+ # @!attribute [rw] value
60
+ # Returns the statistical value
61
+ # @api public
62
+ # @example
63
+ # leader.value #=> 32.4
64
+ # @return [Float] the statistical value
65
+ attribute :value, Shale::Type::Float
66
+
67
+ # Returns the player object for this leader
68
+ #
69
+ # @api public
70
+ # @example
71
+ # leader.player #=> #<NBA::Player>
72
+ # leader.player.college #=> "Davidson"
73
+ # @return [Player, nil] the hydrated player object
74
+ def player
75
+ Players.find(player_id)
76
+ end
77
+
78
+ # Returns the team object for this leader
79
+ #
80
+ # @api public
81
+ # @example
82
+ # leader.team #=> #<NBA::Team>
83
+ # leader.team.name #=> "Golden State Warriors"
84
+ # @return [Team, nil] the team object
85
+ def team
86
+ Teams.find(team_id)
87
+ end
88
+
89
+ json do
90
+ map "player_id", to: :player_id
91
+ map "playerId", to: :player_id
92
+ map "player_name", to: :player_name
93
+ map "playerName", to: :player_name
94
+ map "team_id", to: :team_id
95
+ map "teamId", to: :team_id
96
+ map "team_abbreviation", to: :team_abbreviation
97
+ map "teamAbbreviation", to: :team_abbreviation
98
+ map "category", to: :category
99
+ map "rank", to: :rank
100
+ map "value", to: :value
101
+ end
102
+ end
103
+ end