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,211 @@
1
+ require "json"
2
+ require_relative "client"
3
+ require_relative "collection"
4
+ require_relative "utils"
5
+
6
+ require_relative "play_type_stat"
7
+
8
+ module NBA
9
+ # Provides methods to retrieve Synergy play type data
10
+ module SynergyPlayTypes
11
+ # Result set name for play types
12
+ # @return [String] the result set name
13
+ SYNERGY_PLAY_TYPE = "SynergyPlayType".freeze
14
+
15
+ # Season type constant for regular season
16
+ # @return [String] the season type
17
+ REGULAR_SEASON = "Regular Season".freeze
18
+
19
+ # Season type constant for playoffs
20
+ # @return [String] the season type
21
+ PLAYOFFS = "Playoffs".freeze
22
+
23
+ # Type grouping for offensive
24
+ # @return [String] the type grouping
25
+ OFFENSIVE = "offensive".freeze
26
+
27
+ # Type grouping for defensive
28
+ # @return [String] the type grouping
29
+ DEFENSIVE = "defensive".freeze
30
+
31
+ # Per mode constant for per game stats
32
+ # @return [String] the per mode
33
+ PER_GAME = "PerGame".freeze
34
+
35
+ # Per mode constant for totals
36
+ # @return [String] the per mode
37
+ TOTALS = "Totals".freeze
38
+
39
+ # Play type constant for isolation plays
40
+ # @return [String] the play type
41
+ ISOLATION = "Isolation".freeze
42
+ # Play type constant for transition plays
43
+ # @return [String] the play type
44
+ TRANSITION = "Transition".freeze
45
+ # Play type constant for pick and roll ball handler plays
46
+ # @return [String] the play type
47
+ PICK_AND_ROLL_BALL_HANDLER = "PRBallHandler".freeze
48
+ # Play type constant for pick and roll roll man plays
49
+ # @return [String] the play type
50
+ PICK_AND_ROLL_ROLL_MAN = "PRRollman".freeze
51
+ # Play type constant for post up plays
52
+ # @return [String] the play type
53
+ POST_UP = "Postup".freeze
54
+ # Play type constant for spot up plays
55
+ # @return [String] the play type
56
+ SPOT_UP = "Spotup".freeze
57
+ # Play type constant for handoff plays
58
+ # @return [String] the play type
59
+ HANDOFF = "Handoff".freeze
60
+ # Play type constant for cut plays
61
+ # @return [String] the play type
62
+ CUT = "Cut".freeze
63
+ # Play type constant for off screen plays
64
+ # @return [String] the play type
65
+ OFF_SCREEN = "OffScreen".freeze
66
+ # Play type constant for putback plays
67
+ # @return [String] the play type
68
+ PUTBACKS = "OffRebound".freeze
69
+ # Play type constant for miscellaneous plays
70
+ # @return [String] the play type
71
+ MISCELLANEOUS = "Misc".freeze
72
+
73
+ # Retrieves synergy play type stats for players
74
+ #
75
+ # @api public
76
+ # @example
77
+ # stats = NBA::SynergyPlayTypes.player_stats(play_type: "Isolation", type_grouping: "offensive")
78
+ # stats.each { |s| puts "#{s.player_name}: #{s.ppp} PPP" }
79
+ # @param play_type [String] the play type
80
+ # @param type_grouping [String] offensive or defensive
81
+ # @param season [Integer] the season year
82
+ # @param season_type [String] the season type
83
+ # @param per_mode [String] the per mode
84
+ # @param client [Client] the API client to use
85
+ # @return [Collection] a collection of play type stats
86
+ def self.player_stats(play_type:, type_grouping: OFFENSIVE, season: Utils.current_season,
87
+ season_type: REGULAR_SEASON, per_mode: PER_GAME, client: CLIENT)
88
+ path = build_path("player", play_type, type_grouping, season, season_type: season_type, per_mode: per_mode)
89
+ response = client.get(path)
90
+ parse_response(response, play_type, type_grouping)
91
+ end
92
+
93
+ # Retrieves synergy play type stats for teams
94
+ #
95
+ # @api public
96
+ # @example
97
+ # stats = NBA::SynergyPlayTypes.team_stats(play_type: "Transition", type_grouping: "offensive")
98
+ # stats.each { |s| puts "#{s.team_abbreviation}: #{s.ppp} PPP" }
99
+ # @param play_type [String] the play type
100
+ # @param type_grouping [String] offensive or defensive
101
+ # @param season [Integer] the season year
102
+ # @param season_type [String] the season type
103
+ # @param per_mode [String] the per mode
104
+ # @param client [Client] the API client to use
105
+ # @return [Collection] a collection of play type stats
106
+ def self.team_stats(play_type:, type_grouping: OFFENSIVE, season: Utils.current_season,
107
+ season_type: REGULAR_SEASON, per_mode: PER_GAME, client: CLIENT)
108
+ path = build_path("team", play_type, type_grouping, season, season_type: season_type, per_mode: per_mode)
109
+ response = client.get(path)
110
+ parse_response(response, play_type, type_grouping)
111
+ end
112
+
113
+ # Builds the API path
114
+ #
115
+ # @api private
116
+ # @return [String] the request path
117
+ def self.build_path(player_or_team, play_type, type_grouping, season, season_type:, per_mode:)
118
+ season_str = Utils.format_season(season)
119
+ "synergyplaytypes?LeagueID=00&SeasonYear=#{season_str}&SeasonType=#{season_type}" \
120
+ "&PerMode=#{per_mode}&PlayerOrTeam=#{player_or_team.capitalize}" \
121
+ "&PlayType=#{play_type}&TypeGrouping=#{type_grouping}"
122
+ end
123
+ private_class_method :build_path
124
+
125
+ # Parses the API response into play type stat objects
126
+ #
127
+ # @api private
128
+ # @return [Collection] collection of play type stats
129
+ def self.parse_response(response, play_type, type_grouping)
130
+ return Collection.new unless response
131
+
132
+ data = JSON.parse(response)
133
+ result_set = find_result_set(data)
134
+ return Collection.new unless result_set
135
+
136
+ headers = result_set["headers"]
137
+ rows = result_set["rowSet"]
138
+ return Collection.new unless headers && rows
139
+
140
+ stats = rows.map { |row| build_play_type_stat(headers, row, play_type, type_grouping) }
141
+ Collection.new(stats)
142
+ end
143
+ private_class_method :parse_response
144
+
145
+ # Finds the result set in the response
146
+ #
147
+ # @api private
148
+ # @return [Hash, nil] the result set hash
149
+ def self.find_result_set(data)
150
+ result_sets = data["resultSets"]
151
+ return unless result_sets
152
+
153
+ result_sets.find { |rs| rs["name"].eql?(SYNERGY_PLAY_TYPE) }
154
+ end
155
+ private_class_method :find_result_set
156
+
157
+ # Builds a PlayTypeStat object from raw data
158
+ #
159
+ # @api private
160
+ # @return [PlayTypeStat] the play type stat object
161
+ def self.build_play_type_stat(headers, row, play_type, type_grouping)
162
+ data = headers.zip(row).to_h
163
+ PlayTypeStat.new(**play_type_attributes(data, play_type, type_grouping))
164
+ end
165
+ private_class_method :build_play_type_stat
166
+
167
+ # Combines all play type attributes
168
+ #
169
+ # @api private
170
+ # @return [Hash] the combined attributes
171
+ def self.play_type_attributes(data, play_type, type_grouping)
172
+ identity_attributes(data, play_type, type_grouping)
173
+ .merge(possession_attributes(data))
174
+ .merge(efficiency_attributes(data))
175
+ end
176
+ private_class_method :play_type_attributes
177
+
178
+ # Extracts identity attributes from data
179
+ #
180
+ # @api private
181
+ # @return [Hash] identity attributes
182
+ def self.identity_attributes(data, play_type, type_grouping)
183
+ {player_id: data["PLAYER_ID"], player_name: data["PLAYER_NAME"],
184
+ team_id: data["TEAM_ID"], team_abbreviation: data["TEAM_ABBREVIATION"],
185
+ play_type: play_type, type_grouping: type_grouping, gp: data["GP"]}
186
+ end
187
+ private_class_method :identity_attributes
188
+
189
+ # Extracts possession attributes from data
190
+ #
191
+ # @api private
192
+ # @return [Hash] possession attributes
193
+ def self.possession_attributes(data)
194
+ {poss: data["POSS"], poss_pct: data["POSS_PCT"],
195
+ pts: data["PTS"], pts_pct: data["PTS_PCT"]}
196
+ end
197
+ private_class_method :possession_attributes
198
+
199
+ # Extracts efficiency attributes from data
200
+ #
201
+ # @api private
202
+ # @return [Hash] efficiency attributes
203
+ def self.efficiency_attributes(data)
204
+ {fgm: data["FGM"], fga: data["FGA"], fg_pct: data["FG_PCT"],
205
+ efg_pct: data["EFG_PCT"], ft_poss_pct: data["FT_POSS_PCT"],
206
+ tov_poss_pct: data["TOV_POSS_PCT"], sf_poss_pct: data["SF_POSS_PCT"],
207
+ ppp: data["PPP"], percentile: data["PERCENTILE"]}
208
+ end
209
+ private_class_method :efficiency_attributes
210
+ end
211
+ end
data/lib/nba/team.rb CHANGED
@@ -1,135 +1,211 @@
1
- require 'faraday'
2
- require 'json'
1
+ require "equalizer"
2
+ require "shale"
3
+ require_relative "conference"
4
+ require_relative "division"
3
5
 
4
6
  module NBA
5
- class Team
6
- attr_reader :name, :founded, :conference, :division, :championships, :players, :head_coach, :team_stats
7
-
8
- alias :coach :head_coach
7
+ # Represents an NBA team
8
+ class Team < Shale::Mapper
9
+ include Equalizer.new(:id)
10
+
11
+ # @!group Team ID Constants
12
+
13
+ # Atlanta Hawks team ID
14
+ # @return [Integer] the team ID
15
+ ATL = 1_610_612_737
16
+ # Boston Celtics team ID
17
+ # @return [Integer] the team ID
18
+ BOS = 1_610_612_738
19
+ # Brooklyn Nets team ID
20
+ # @return [Integer] the team ID
21
+ BKN = 1_610_612_751
22
+ # Charlotte Hornets team ID
23
+ # @return [Integer] the team ID
24
+ CHA = 1_610_612_766
25
+ # Chicago Bulls team ID
26
+ # @return [Integer] the team ID
27
+ CHI = 1_610_612_741
28
+ # Cleveland Cavaliers team ID
29
+ # @return [Integer] the team ID
30
+ CLE = 1_610_612_739
31
+ # Dallas Mavericks team ID
32
+ # @return [Integer] the team ID
33
+ DAL = 1_610_612_742
34
+ # Denver Nuggets team ID
35
+ # @return [Integer] the team ID
36
+ DEN = 1_610_612_743
37
+ # Detroit Pistons team ID
38
+ # @return [Integer] the team ID
39
+ DET = 1_610_612_765
40
+ # Golden State Warriors team ID
41
+ # @return [Integer] the team ID
42
+ GSW = 1_610_612_744
43
+ # Houston Rockets team ID
44
+ # @return [Integer] the team ID
45
+ HOU = 1_610_612_745
46
+ # Indiana Pacers team ID
47
+ # @return [Integer] the team ID
48
+ IND = 1_610_612_754
49
+ # Los Angeles Clippers team ID
50
+ # @return [Integer] the team ID
51
+ LAC = 1_610_612_746
52
+ # Los Angeles Lakers team ID
53
+ # @return [Integer] the team ID
54
+ LAL = 1_610_612_747
55
+ # Memphis Grizzlies team ID
56
+ # @return [Integer] the team ID
57
+ MEM = 1_610_612_763
58
+ # Miami Heat team ID
59
+ # @return [Integer] the team ID
60
+ MIA = 1_610_612_748
61
+ # Milwaukee Bucks team ID
62
+ # @return [Integer] the team ID
63
+ MIL = 1_610_612_749
64
+ # Minnesota Timberwolves team ID
65
+ # @return [Integer] the team ID
66
+ MIN = 1_610_612_750
67
+ # New Orleans Pelicans team ID
68
+ # @return [Integer] the team ID
69
+ NOP = 1_610_612_740
70
+ # New York Knicks team ID
71
+ # @return [Integer] the team ID
72
+ NYK = 1_610_612_752
73
+ # Oklahoma City Thunder team ID
74
+ # @return [Integer] the team ID
75
+ OKC = 1_610_612_760
76
+ # Orlando Magic team ID
77
+ # @return [Integer] the team ID
78
+ ORL = 1_610_612_753
79
+ # Philadelphia 76ers team ID
80
+ # @return [Integer] the team ID
81
+ PHI = 1_610_612_755
82
+ # Phoenix Suns team ID
83
+ # @return [Integer] the team ID
84
+ PHX = 1_610_612_756
85
+ # Portland Trail Blazers team ID
86
+ # @return [Integer] the team ID
87
+ POR = 1_610_612_757
88
+ # Sacramento Kings team ID
89
+ # @return [Integer] the team ID
90
+ SAC = 1_610_612_758
91
+ # San Antonio Spurs team ID
92
+ # @return [Integer] the team ID
93
+ SAS = 1_610_612_759
94
+ # Toronto Raptors team ID
95
+ # @return [Integer] the team ID
96
+ TOR = 1_610_612_761
97
+ # Utah Jazz team ID
98
+ # @return [Integer] the team ID
99
+ UTA = 1_610_612_762
100
+ # Washington Wizards team ID
101
+ # @return [Integer] the team ID
102
+ WAS = 1_610_612_764
103
+
104
+ # @!endgroup
105
+
106
+ # @!attribute [rw] id
107
+ # Returns the unique identifier for the team
108
+ # @api public
109
+ # @example
110
+ # team.id #=> 1610612747
111
+ # @return [Integer] the unique identifier for the team
112
+ attribute :id, Shale::Type::Integer
113
+
114
+ # @!attribute [rw] name
115
+ # Returns the team name
116
+ # @api public
117
+ # @example
118
+ # team.name #=> "Los Angeles Lakers"
119
+ # @return [String] the team name
120
+ attribute :name, Shale::Type::String
121
+
122
+ # @!attribute [rw] full_name
123
+ # Returns the team's full name
124
+ # @api public
125
+ # @example
126
+ # team.full_name #=> "Los Angeles Lakers"
127
+ # @return [String] the team's full name
128
+ attribute :full_name, Shale::Type::String
129
+
130
+ # @!attribute [rw] abbreviation
131
+ # Returns the team abbreviation
132
+ # @api public
133
+ # @example
134
+ # team.abbreviation #=> "LAL"
135
+ # @return [String] the team abbreviation
136
+ attribute :abbreviation, Shale::Type::String
137
+
138
+ # @!attribute [rw] nickname
139
+ # Returns the team nickname
140
+ # @api public
141
+ # @example
142
+ # team.nickname #=> "Lakers"
143
+ # @return [String] the team nickname
144
+ attribute :nickname, Shale::Type::String
145
+
146
+ # @!attribute [rw] city
147
+ # Returns the team's city
148
+ # @api public
149
+ # @example
150
+ # team.city #=> "Los Angeles"
151
+ # @return [String] the team's city
152
+ attribute :city, Shale::Type::String
153
+
154
+ # @!attribute [rw] state
155
+ # Returns the team's state
156
+ # @api public
157
+ # @example
158
+ # team.state #=> "California"
159
+ # @return [String] the team's state
160
+ attribute :state, Shale::Type::String
161
+
162
+ # @!attribute [rw] year_founded
163
+ # Returns the year the team was founded
164
+ # @api public
165
+ # @example
166
+ # team.year_founded #=> 1947
167
+ # @return [Integer] the year the team was founded
168
+ attribute :year_founded, Shale::Type::Integer
169
+
170
+ # @!attribute [rw] conference
171
+ # Returns the team's conference
172
+ # @api public
173
+ # @example
174
+ # team.conference #=> #<NBA::Conference>
175
+ # @return [Conference] the team's conference
176
+ attribute :conference, Conference
177
+
178
+ # @!attribute [rw] division
179
+ # Returns the team's division
180
+ # @api public
181
+ # @example
182
+ # team.division #=> #<NBA::Division>
183
+ # @return [Division] the team's division
184
+ attribute :division, Division
185
+
186
+ json do
187
+ map "id", to: :id
188
+ map "name", to: :name
189
+ map "full_name", to: :full_name
190
+ map "fullName", to: :full_name
191
+ map "abbreviation", to: :abbreviation
192
+ map "nickname", to: :nickname
193
+ map "city", to: :city
194
+ map "state", to: :state
195
+ map "year_founded", to: :year_founded
196
+ map "yearFounded", to: :year_founded
197
+ map "conference", to: :conference
198
+ map "division", to: :division
199
+ end
9
200
 
10
- # Returns an array of Team objects
201
+ # Returns the team's home arena
11
202
  #
203
+ # @api public
12
204
  # @example
13
- # NBA::Team.all.first.name # => "Atlanta Hawks"
14
- # NBA::Team.all.first.division # => "Southeast Division"
15
- # NBA::Team.all.first.founded # => 1946
16
- # NBA::Team.all.first.players.first.name # => "Al Horford"
17
- # NBA::Team.all.first.players.first.number # => 15
18
- # NBA::Team.all.first.players.first.position # => ["Forward-center"]
19
- def self.all
20
- # Attempt to fetch the result from the Freebase API unless there is a
21
- # connection error, in which case read from a fixture file
22
- @all ||= begin
23
- results_to_team(results_from_freebase)
24
- rescue Errno::EHOSTUNREACH, Faraday::Error::ConnectionFailed, Faraday::Error::TimeoutError
25
- results_to_team(results_from_cache)
26
- end
27
- end
28
-
29
- def self.reset
30
- @all = nil
205
+ # team.arena #=> "Chase Center"
206
+ # @return [String, nil] the arena name
207
+ def arena
208
+ TeamDetails.find(team: id)&.arena
31
209
  end
32
-
33
- ADJUST_WIDTH = 16
34
- def pretty_print
35
- puts "%#{ADJUST_WIDTH}s: #{self.name}" % "Name"
36
- puts "%#{ADJUST_WIDTH}s: #{self.founded}" % "Founded"
37
- puts "%#{ADJUST_WIDTH}s: #{self.conference}" % "Conference"
38
- puts "%#{ADJUST_WIDTH}s: #{self.division}" % "Division"
39
- puts "%#{ADJUST_WIDTH}s: #{self.coach}" % "Coach"
40
- puts "%#{ADJUST_WIDTH}s: #{pretty_print_championships}" % "Championships"
41
- puts "%#{ADJUST_WIDTH}s: #{pretty_print_players}" % "Players"
42
- end
43
-
44
- private
45
-
46
- def initialize(attributes = {})
47
- attributes.each do |key, value|
48
- instance_variable_set("@#{key}", value) if self.respond_to?(key)
49
- end
50
- end
51
-
52
- def pretty_print_championships
53
- idx = 0
54
-
55
- self.championships.sort.reverse.each_slice(2).inject("") do |string, chams|
56
- string << "\n" + (" " * (ADJUST_WIDTH + 2)) if (idx += 1) != 1
57
- string << chams.join(", ")
58
- end
59
- end
60
-
61
- def pretty_print_players
62
- idx = 0
63
-
64
- self.players.sort_by{|p| -p.number}.reverse.inject("") do |string, player|
65
- string << "\n" + (" " * (ADJUST_WIDTH + 2)) if (idx += 1) != 1
66
- string << player.pretty_print
67
- end
68
- end
69
-
70
- def self.results_from_freebase
71
- options = {:query => mql_query}
72
- Request.get_teams('/freebase/v1/mqlread', options)
73
- end
74
-
75
- def self.results_from_cache
76
- JSON.load(file_from_cache('teams.json').read)
77
- end
78
-
79
- def self.file_from_cache(file_name)
80
- File.new(File.expand_path('../../../cache', __FILE__) + '/' + file_name)
81
- end
82
-
83
- def self.results_to_team(results)
84
- results['result'].map do |result|
85
- players = result['/sports/sports_team/roster']
86
-
87
- new(
88
- :name => result['name'],
89
- :conference => result['/basketball/basketball_team/conference'],
90
- :division => result['/basketball/basketball_team/division'],
91
- :head_coach => result['/basketball/basketball_team/head_coach'],
92
- :team_stats => result['/basketball/basketball_team/team_stats'],
93
- :founded => result['/sports/sports_team/founded'].to_i,
94
- :championships => result['/sports/sports_team/championships'],
95
- :players => (players ? Player.all_from_roster(players) : [])
96
- )
97
- end
98
- end
99
-
100
- # Returns the MQL query for teams, as a Ruby hash
101
- def self.mql_query
102
- query = <<-eos
103
- [{
104
- "name": null,
105
- "mid": null,
106
- "/basketball/basketball_team/head_coach": null,
107
- "/basketball/basketball_team/conference": null,
108
- "/basketball/basketball_team/division": null,
109
- "/sports/sports_team/founded": null,
110
- "/sports/sports_team/championships": [],
111
- "/sports/sports_team/roster": [{
112
- "number": null,
113
- "player": null,
114
- "from": null,
115
- "to": null,
116
- "position": [],
117
- "sort": "player"
118
- }],
119
- "/basketball/basketball_team/team_stats": [{
120
- "optional": true,
121
- "season": null,
122
- "wins": null,
123
- "losses": null
124
- }],
125
- "sort": "name",
126
- "type": "/basketball/basketball_team",
127
- "/sports/sports_team/league": [{
128
- "league": "National Basketball Association"
129
- }]
130
- }]
131
- eos
132
- query.gsub!("\n", '')
133
- end
134
210
  end
135
211
  end