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,119 @@
1
+ require "json"
2
+ require_relative "client"
3
+ require_relative "collection"
4
+ require_relative "utils"
5
+
6
+ require_relative "box_score_similarity_stat"
7
+
8
+ module NBA
9
+ # Provides methods to retrieve G League Alum box score similarity scores
10
+ module BoxScoreSimilarityScore
11
+ # Result set name for similarity scores
12
+ # @return [String] the result set name
13
+ RESULT_SET_NAME = "GLeagueAlumBoxScoreSimilarityScores".freeze
14
+
15
+ # Regular season type constant
16
+ # @return [String] the season type
17
+ REGULAR_SEASON = "Regular Season".freeze
18
+
19
+ # Playoffs season type constant
20
+ # @return [String] the season type
21
+ PLAYOFFS = "Playoffs".freeze
22
+
23
+ # Retrieves box score similarity scores for two players
24
+ #
25
+ # @api public
26
+ # @example
27
+ # stats = NBA::BoxScoreSimilarityScore.find(first_person: 201939, second_person: 203507)
28
+ # stats.first.similarity_score #=> 0.85
29
+ # @param first_person [Integer, Player] the first player ID or Player object
30
+ # @param second_person [Integer, Player] the second player ID or Player object
31
+ # @param first_season [Integer] the season year for first player
32
+ # @param second_season [Integer] the season year for second player
33
+ # @param first_season_type [String] the season type for first player
34
+ # @param second_season_type [String] the season type for second player
35
+ # @param client [Client] the API client to use
36
+ # @return [Collection] a collection of similarity stats
37
+ def self.find(first_person:, second_person:, first_season: Utils.current_season, second_season: Utils.current_season,
38
+ first_season_type: REGULAR_SEASON, second_season_type: REGULAR_SEASON, client: CLIENT)
39
+ first_id = Utils.extract_id(first_person)
40
+ second_id = Utils.extract_id(second_person)
41
+ path = build_path(first_id: first_id, second_id: second_id, first_season: first_season, second_season: second_season,
42
+ first_season_type: first_season_type, second_season_type: second_season_type)
43
+ response = client.get(path)
44
+ parse_response(response, first_id)
45
+ end
46
+
47
+ # Builds the API path
48
+ #
49
+ # @api private
50
+ # @return [String] the request path
51
+ def self.build_path(opts)
52
+ "glalumboxscoresimilarityscore?Person1Id=#{opts[:first_id]}&Person2Id=#{opts[:second_id]}" \
53
+ "&Person1LeagueId=00&Person2LeagueId=00" \
54
+ "&Person1Season=#{Utils.format_season(opts[:first_season])}&Person2Season=#{Utils.format_season(opts[:second_season])}" \
55
+ "&Person1SeasonType=#{opts[:first_season_type]}&Person2SeasonType=#{opts[:second_season_type]}"
56
+ end
57
+ private_class_method :build_path
58
+
59
+ # Parses the API response into stat objects
60
+ #
61
+ # @api private
62
+ # @return [Collection] collection of similarity stats
63
+ def self.parse_response(response, first_person_id)
64
+ return Collection.new unless response
65
+
66
+ data = JSON.parse(response)
67
+ result_set = find_result_set(data)
68
+ return Collection.new unless result_set
69
+
70
+ build_stats(result_set, first_person_id)
71
+ end
72
+ private_class_method :parse_response
73
+
74
+ # Finds the result set by name
75
+ #
76
+ # @api private
77
+ # @return [Hash, nil] the result set hash or nil if not found
78
+ def self.find_result_set(data)
79
+ result_sets = data["resultSets"]
80
+ return unless result_sets
81
+
82
+ result_sets.find { |rs| rs["name"].eql?(RESULT_SET_NAME) }
83
+ end
84
+ private_class_method :find_result_set
85
+
86
+ # Builds stats collection from result set
87
+ #
88
+ # @api private
89
+ # @return [Collection] the stats collection
90
+ def self.build_stats(result_set, first_person_id)
91
+ headers = result_set["headers"]
92
+ rows = result_set["rowSet"]
93
+ return Collection.new unless headers && rows
94
+
95
+ Collection.new(rows.map { |row| build_stat(headers.zip(row).to_h, first_person_id) })
96
+ end
97
+ private_class_method :build_stats
98
+
99
+ # Builds a single stat object from API data
100
+ #
101
+ # @api private
102
+ # @return [BoxScoreSimilarityStat] the stat object
103
+ def self.build_stat(data, first_person_id)
104
+ BoxScoreSimilarityStat.new(**stat_attributes(data, first_person_id))
105
+ end
106
+ private_class_method :build_stat
107
+
108
+ # Extracts stat attributes from data
109
+ #
110
+ # @api private
111
+ # @return [Hash] the stat attributes
112
+ def self.stat_attributes(data, first_person_id)
113
+ {first_person_id: first_person_id, second_person_id: data["PERSON_2_ID"],
114
+ second_person_name: data["PERSON_2"], team_id: data["TEAM_ID"],
115
+ similarity_score: data["SIMILARITY_SCORE"]}
116
+ end
117
+ private_class_method :stat_attributes
118
+ end
119
+ end
@@ -0,0 +1,76 @@
1
+ module NBA
2
+ # Represents a G League Alum box score similarity score
3
+ class BoxScoreSimilarityStat < Shale::Mapper
4
+ include Equalizer.new(:first_person_id, :second_person_id)
5
+
6
+ # @!attribute [rw] first_person_id
7
+ # Returns the first player ID
8
+ # @api public
9
+ # @example
10
+ # stat.first_person_id #=> 201939
11
+ # @return [Integer] the first player ID
12
+ attribute :first_person_id, Shale::Type::Integer
13
+
14
+ # @!attribute [rw] second_person_id
15
+ # Returns the second player ID
16
+ # @api public
17
+ # @example
18
+ # stat.second_person_id #=> 203507
19
+ # @return [Integer] the second player ID
20
+ attribute :second_person_id, Shale::Type::Integer
21
+
22
+ # @!attribute [rw] second_person_name
23
+ # Returns the second player name
24
+ # @api public
25
+ # @example
26
+ # stat.second_person_name #=> "Giannis Antetokounmpo"
27
+ # @return [String] the second player name
28
+ attribute :second_person_name, Shale::Type::String
29
+
30
+ # @!attribute [rw] team_id
31
+ # Returns the team ID
32
+ # @api public
33
+ # @example
34
+ # stat.team_id #=> 1610612749
35
+ # @return [Integer] the team ID
36
+ attribute :team_id, Shale::Type::Integer
37
+
38
+ # @!attribute [rw] similarity_score
39
+ # Returns the similarity score between the two players
40
+ # @api public
41
+ # @example
42
+ # stat.similarity_score #=> 0.85
43
+ # @return [Float] the similarity score
44
+ attribute :similarity_score, Shale::Type::Float
45
+
46
+ # Returns the first player object
47
+ #
48
+ # @api public
49
+ # @example
50
+ # stat.first_person #=> #<NBA::Player>
51
+ # @return [Player, nil] the first player object
52
+ def first_person
53
+ Players.find(first_person_id)
54
+ end
55
+
56
+ # Returns the second player object
57
+ #
58
+ # @api public
59
+ # @example
60
+ # stat.second_person #=> #<NBA::Player>
61
+ # @return [Player, nil] the second player object
62
+ def second_person
63
+ Players.find(second_person_id)
64
+ end
65
+
66
+ # Returns the team object
67
+ #
68
+ # @api public
69
+ # @example
70
+ # stat.team #=> #<NBA::Team>
71
+ # @return [Team, nil] the team object
72
+ def team
73
+ Teams.find(team_id)
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,257 @@
1
+ require "equalizer"
2
+ require "shale"
3
+
4
+ module NBA
5
+ # Represents starter vs bench aggregate statistics for a team in a game
6
+ class BoxScoreStarterBenchStat < Shale::Mapper
7
+ include Equalizer.new(:game_id, :team_id, :starters_bench)
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] team_id
18
+ # Returns the team ID
19
+ # @api public
20
+ # @example
21
+ # stat.team_id #=> 1610612744
22
+ # @return [Integer] the team ID
23
+ attribute :team_id, Shale::Type::Integer
24
+
25
+ # @!attribute [rw] team_name
26
+ # Returns the team name
27
+ # @api public
28
+ # @example
29
+ # stat.team_name #=> "Warriors"
30
+ # @return [String] the team name
31
+ attribute :team_name, Shale::Type::String
32
+
33
+ # @!attribute [rw] team_abbreviation
34
+ # Returns the team abbreviation
35
+ # @api public
36
+ # @example
37
+ # stat.team_abbreviation #=> "GSW"
38
+ # @return [String] the team abbreviation
39
+ attribute :team_abbreviation, Shale::Type::String
40
+
41
+ # @!attribute [rw] team_city
42
+ # Returns the team city
43
+ # @api public
44
+ # @example
45
+ # stat.team_city #=> "Golden State"
46
+ # @return [String] the team city
47
+ attribute :team_city, Shale::Type::String
48
+
49
+ # @!attribute [rw] starters_bench
50
+ # Returns whether this is starters or bench stats
51
+ # @api public
52
+ # @example
53
+ # stat.starters_bench #=> "starters"
54
+ # @return [String] "starters" or "bench"
55
+ attribute :starters_bench, Shale::Type::String
56
+
57
+ # @!attribute [rw] min
58
+ # Returns minutes played
59
+ # @api public
60
+ # @example
61
+ # stat.min #=> "PT120M00.00S"
62
+ # @return [String] minutes played
63
+ attribute :min, Shale::Type::String
64
+
65
+ # @!attribute [rw] fgm
66
+ # Returns field goals made
67
+ # @api public
68
+ # @example
69
+ # stat.fgm #=> 35
70
+ # @return [Integer] field goals made
71
+ attribute :fgm, Shale::Type::Integer
72
+
73
+ # @!attribute [rw] fga
74
+ # Returns field goals attempted
75
+ # @api public
76
+ # @example
77
+ # stat.fga #=> 70
78
+ # @return [Integer] field goals attempted
79
+ attribute :fga, Shale::Type::Integer
80
+
81
+ # @!attribute [rw] fg_pct
82
+ # Returns field goal percentage
83
+ # @api public
84
+ # @example
85
+ # stat.fg_pct #=> 0.5
86
+ # @return [Float] field goal percentage
87
+ attribute :fg_pct, Shale::Type::Float
88
+
89
+ # @!attribute [rw] fg3m
90
+ # Returns three-pointers made
91
+ # @api public
92
+ # @example
93
+ # stat.fg3m #=> 10
94
+ # @return [Integer] three-pointers made
95
+ attribute :fg3m, Shale::Type::Integer
96
+
97
+ # @!attribute [rw] fg3a
98
+ # Returns three-pointers attempted
99
+ # @api public
100
+ # @example
101
+ # stat.fg3a #=> 25
102
+ # @return [Integer] three-pointers attempted
103
+ attribute :fg3a, Shale::Type::Integer
104
+
105
+ # @!attribute [rw] fg3_pct
106
+ # Returns three-point percentage
107
+ # @api public
108
+ # @example
109
+ # stat.fg3_pct #=> 0.4
110
+ # @return [Float] three-point percentage
111
+ attribute :fg3_pct, Shale::Type::Float
112
+
113
+ # @!attribute [rw] ftm
114
+ # Returns free throws made
115
+ # @api public
116
+ # @example
117
+ # stat.ftm #=> 15
118
+ # @return [Integer] free throws made
119
+ attribute :ftm, Shale::Type::Integer
120
+
121
+ # @!attribute [rw] fta
122
+ # Returns free throws attempted
123
+ # @api public
124
+ # @example
125
+ # stat.fta #=> 18
126
+ # @return [Integer] free throws attempted
127
+ attribute :fta, Shale::Type::Integer
128
+
129
+ # @!attribute [rw] ft_pct
130
+ # Returns free throw percentage
131
+ # @api public
132
+ # @example
133
+ # stat.ft_pct #=> 0.833
134
+ # @return [Float] free throw percentage
135
+ attribute :ft_pct, Shale::Type::Float
136
+
137
+ # @!attribute [rw] oreb
138
+ # Returns offensive rebounds
139
+ # @api public
140
+ # @example
141
+ # stat.oreb #=> 8
142
+ # @return [Integer] offensive rebounds
143
+ attribute :oreb, Shale::Type::Integer
144
+
145
+ # @!attribute [rw] dreb
146
+ # Returns defensive rebounds
147
+ # @api public
148
+ # @example
149
+ # stat.dreb #=> 22
150
+ # @return [Integer] defensive rebounds
151
+ attribute :dreb, Shale::Type::Integer
152
+
153
+ # @!attribute [rw] reb
154
+ # Returns total rebounds
155
+ # @api public
156
+ # @example
157
+ # stat.reb #=> 30
158
+ # @return [Integer] total rebounds
159
+ attribute :reb, Shale::Type::Integer
160
+
161
+ # @!attribute [rw] ast
162
+ # Returns assists
163
+ # @api public
164
+ # @example
165
+ # stat.ast #=> 20
166
+ # @return [Integer] assists
167
+ attribute :ast, Shale::Type::Integer
168
+
169
+ # @!attribute [rw] stl
170
+ # Returns steals
171
+ # @api public
172
+ # @example
173
+ # stat.stl #=> 6
174
+ # @return [Integer] steals
175
+ attribute :stl, Shale::Type::Integer
176
+
177
+ # @!attribute [rw] blk
178
+ # Returns blocks
179
+ # @api public
180
+ # @example
181
+ # stat.blk #=> 4
182
+ # @return [Integer] blocks
183
+ attribute :blk, Shale::Type::Integer
184
+
185
+ # @!attribute [rw] tov
186
+ # Returns turnovers
187
+ # @api public
188
+ # @example
189
+ # stat.tov #=> 10
190
+ # @return [Integer] turnovers
191
+ attribute :tov, Shale::Type::Integer
192
+
193
+ # @!attribute [rw] pf
194
+ # Returns personal fouls
195
+ # @api public
196
+ # @example
197
+ # stat.pf #=> 12
198
+ # @return [Integer] personal fouls
199
+ attribute :pf, Shale::Type::Integer
200
+
201
+ # @!attribute [rw] pts
202
+ # Returns points
203
+ # @api public
204
+ # @example
205
+ # stat.pts #=> 95
206
+ # @return [Integer] points
207
+ attribute :pts, Shale::Type::Integer
208
+
209
+ # @!attribute [rw] plus_minus
210
+ # Returns plus/minus
211
+ # @api public
212
+ # @example
213
+ # stat.plus_minus #=> 15
214
+ # @return [Integer] plus/minus
215
+ attribute :plus_minus, Shale::Type::Integer
216
+
217
+ # Returns whether this is starter stats
218
+ #
219
+ # @api public
220
+ # @example
221
+ # stat.starters? #=> true
222
+ # @return [Boolean] true if starters
223
+ def starters?
224
+ starters_bench.eql?("starters")
225
+ end
226
+
227
+ # Returns whether this is bench stats
228
+ #
229
+ # @api public
230
+ # @example
231
+ # stat.bench? #=> true
232
+ # @return [Boolean] true if bench
233
+ def bench?
234
+ starters_bench.eql?("bench")
235
+ end
236
+
237
+ # Returns the team object
238
+ #
239
+ # @api public
240
+ # @example
241
+ # stat.team #=> #<NBA::Team>
242
+ # @return [Team, nil] the team object
243
+ def team
244
+ Teams.find(team_id)
245
+ end
246
+
247
+ # Returns the game object
248
+ #
249
+ # @api public
250
+ # @example
251
+ # stat.game #=> #<NBA::Game>
252
+ # @return [Game, nil] the game object
253
+ def game
254
+ Games.find(game_id)
255
+ end
256
+ end
257
+ end