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.
- checksums.yaml +5 -5
- data/AGENTS.md +362 -0
- data/CHANGELOG.md +169 -0
- data/CLAUDE.md +1 -0
- data/LICENSE +21 -0
- data/README.md +501 -101
- data/bin/console +10 -0
- data/bin/setup +6 -0
- data/exe/nba +8 -0
- data/lib/nba/all_time_leader.rb +77 -0
- data/lib/nba/all_time_leaders.rb +185 -0
- data/lib/nba/assist_leader.rb +92 -0
- data/lib/nba/assist_leaders.rb +64 -0
- data/lib/nba/assist_tracker.rb +108 -0
- data/lib/nba/assist_tracker_entry.rb +206 -0
- data/lib/nba/award.rb +128 -0
- data/lib/nba/box_score.rb +2 -0
- data/lib/nba/box_score_advanced.rb +114 -0
- data/lib/nba/box_score_advanced_player_stat.rb +297 -0
- data/lib/nba/box_score_advanced_team_stat.rb +237 -0
- data/lib/nba/box_score_advanced_v3.rb +124 -0
- data/lib/nba/box_score_defensive_player_stat.rb +281 -0
- data/lib/nba/box_score_defensive_team_stat.rb +85 -0
- data/lib/nba/box_score_defensive_v2.rb +190 -0
- data/lib/nba/box_score_four_factors.rb +91 -0
- data/lib/nba/box_score_four_factors_player_stat.rb +185 -0
- data/lib/nba/box_score_four_factors_team_stat.rb +141 -0
- data/lib/nba/box_score_four_factors_v3.rb +133 -0
- data/lib/nba/box_score_hustle.rb +226 -0
- data/lib/nba/box_score_hustle_player_stat.rb +233 -0
- data/lib/nba/box_score_hustle_team_stat.rb +189 -0
- data/lib/nba/box_score_matchup_stat.rb +417 -0
- data/lib/nba/box_score_matchups_v3.rb +184 -0
- data/lib/nba/box_score_misc.rb +100 -0
- data/lib/nba/box_score_misc_player_stat.rb +217 -0
- data/lib/nba/box_score_misc_team_stat.rb +173 -0
- data/lib/nba/box_score_misc_v3.rb +163 -0
- data/lib/nba/box_score_player_stat.rb +273 -0
- data/lib/nba/box_score_player_track.rb +223 -0
- data/lib/nba/box_score_player_track_stat.rb +273 -0
- data/lib/nba/box_score_player_track_team_stat.rb +229 -0
- data/lib/nba/box_score_scoring.rb +103 -0
- data/lib/nba/box_score_scoring_player_stat.rb +241 -0
- data/lib/nba/box_score_scoring_team_stat.rb +197 -0
- data/lib/nba/box_score_scoring_v3.rb +170 -0
- data/lib/nba/box_score_similarity_score.rb +119 -0
- data/lib/nba/box_score_similarity_stat.rb +76 -0
- data/lib/nba/box_score_starter_bench_stat.rb +257 -0
- data/lib/nba/box_score_summary.rb +285 -0
- data/lib/nba/box_score_summary_v2.rb +202 -0
- data/lib/nba/box_score_summary_v3.rb +120 -0
- data/lib/nba/box_score_summary_v3_data.rb +419 -0
- data/lib/nba/box_score_team_stat.rb +229 -0
- data/lib/nba/box_score_traditional.rb +101 -0
- data/lib/nba/box_score_traditional_v3.rb +195 -0
- data/lib/nba/box_score_usage.rb +102 -0
- data/lib/nba/box_score_usage_player_stat.rb +265 -0
- data/lib/nba/box_score_usage_team_stat.rb +221 -0
- data/lib/nba/box_score_usage_v3.rb +169 -0
- data/lib/nba/box_score_v3_helpers.rb +144 -0
- data/lib/nba/career_stats.rb +217 -0
- data/lib/nba/cli/display/player_display.rb +98 -0
- data/lib/nba/cli/display.rb +178 -0
- data/lib/nba/cli/formatters/game_formatters.rb +86 -0
- data/lib/nba/cli/formatters/leaders_formatters.rb +26 -0
- data/lib/nba/cli/formatters/player_formatters.rb +52 -0
- data/lib/nba/cli/formatters/standings_formatters.rb +26 -0
- data/lib/nba/cli/formatters/team_formatters.rb +67 -0
- data/lib/nba/cli/formatters/time_formatters.rb +82 -0
- data/lib/nba/cli/formatters.rb +56 -0
- data/lib/nba/cli/helpers.rb +135 -0
- data/lib/nba/cli.rb +171 -20
- data/lib/nba/client.rb +35 -0
- data/lib/nba/collection.rb +89 -0
- data/lib/nba/college_player_stat.rb +200 -0
- data/lib/nba/common_player_info.rb +142 -0
- data/lib/nba/common_playoff_series.rb +90 -0
- data/lib/nba/common_team_years.rb +113 -0
- data/lib/nba/conference.rb +39 -0
- data/lib/nba/connection.rb +84 -0
- data/lib/nba/cume_stats_player.rb +358 -0
- data/lib/nba/cume_stats_player_game.rb +217 -0
- data/lib/nba/cume_stats_player_games.rb +99 -0
- data/lib/nba/cume_stats_player_games_entry.rb +25 -0
- data/lib/nba/cume_stats_player_total.rb +481 -0
- data/lib/nba/cume_stats_team.rb +349 -0
- data/lib/nba/cume_stats_team_games.rb +145 -0
- data/lib/nba/cume_stats_team_games_entry.rb +25 -0
- data/lib/nba/cume_stats_team_player.rb +485 -0
- data/lib/nba/cume_stats_team_total.rb +267 -0
- data/lib/nba/data.rb +73 -0
- data/lib/nba/defense_hub.rb +109 -0
- data/lib/nba/defense_hub_stat.rb +57 -0
- data/lib/nba/defensive_shot_stat.rb +102 -0
- data/lib/nba/division.rb +49 -0
- data/lib/nba/draft_board.rb +126 -0
- data/lib/nba/draft_board_pick.rb +173 -0
- data/lib/nba/draft_combine_anthro_measurement.rb +163 -0
- data/lib/nba/draft_combine_drill_result.rb +115 -0
- data/lib/nba/draft_combine_drill_results.rb +112 -0
- data/lib/nba/draft_combine_non_stationary_shooting.rb +268 -0
- data/lib/nba/draft_combine_non_stationary_shooting_result.rb +355 -0
- data/lib/nba/draft_combine_player_anthro.rb +133 -0
- data/lib/nba/draft_combine_spot_shooting.rb +243 -0
- data/lib/nba/draft_combine_spot_shooting_result.rb +419 -0
- data/lib/nba/draft_combine_stat.rb +211 -0
- data/lib/nba/draft_combine_stats.rb +160 -0
- data/lib/nba/draft_history.rb +142 -0
- data/lib/nba/draft_pick.rb +154 -0
- data/lib/nba/dunk_score_leader.rb +93 -0
- data/lib/nba/dunk_score_leaders.rb +77 -0
- data/lib/nba/estimated_metrics_stat.rb +152 -0
- data/lib/nba/fantasy_profile_stat.rb +142 -0
- data/lib/nba/fantasy_widget.rb +72 -0
- data/lib/nba/fantasy_widget_player.rb +98 -0
- data/lib/nba/found_game.rb +260 -0
- data/lib/nba/franchise.rb +136 -0
- data/lib/nba/franchise_history.rb +142 -0
- data/lib/nba/franchise_leader.rb +147 -0
- data/lib/nba/franchise_leaders.rb +162 -0
- data/lib/nba/franchise_player.rb +224 -0
- data/lib/nba/franchise_players.rb +147 -0
- data/lib/nba/game.rb +80 -64
- data/lib/nba/game_log.rb +349 -0
- data/lib/nba/game_rotation.rb +152 -0
- data/lib/nba/game_streak.rb +102 -0
- data/lib/nba/games.rb +46 -0
- data/lib/nba/home_page_leader.rb +99 -0
- data/lib/nba/home_page_leaders.rb +75 -0
- data/lib/nba/home_page_stat.rb +57 -0
- data/lib/nba/home_page_v2.rb +110 -0
- data/lib/nba/hustle_stats_box_score.rb +182 -0
- data/lib/nba/infographic_fan_duel_player.rb +139 -0
- data/lib/nba/infographic_fan_duel_player_stat.rb +311 -0
- data/lib/nba/ist_standing.rb +167 -0
- data/lib/nba/ist_standings.rb +81 -0
- data/lib/nba/leader.rb +103 -0
- data/lib/nba/leaders.rb +110 -0
- data/lib/nba/leaders_tile.rb +57 -0
- data/lib/nba/leaders_tiles.rb +90 -0
- data/lib/nba/league.rb +37 -0
- data/lib/nba/league_dash_lineup_stat.rb +270 -0
- data/lib/nba/league_dash_lineups.rb +177 -0
- data/lib/nba/league_dash_opp_pt_shot.rb +150 -0
- data/lib/nba/league_dash_player_bio_stat.rb +217 -0
- data/lib/nba/league_dash_player_bio_stats.rb +164 -0
- data/lib/nba/league_dash_player_clutch.rb +212 -0
- data/lib/nba/league_dash_player_clutch_stat.rb +271 -0
- data/lib/nba/league_dash_player_pt_shot.rb +152 -0
- data/lib/nba/league_dash_player_pt_shot_stat.rb +193 -0
- data/lib/nba/league_dash_player_shot_location_stat.rb +265 -0
- data/lib/nba/league_dash_player_shot_locations.rb +210 -0
- data/lib/nba/league_dash_player_stat.rb +306 -0
- data/lib/nba/league_dash_player_stats.rb +176 -0
- data/lib/nba/league_dash_pt_defend.rb +160 -0
- data/lib/nba/league_dash_pt_defend_stat.rb +145 -0
- data/lib/nba/league_dash_pt_stats.rb +152 -0
- data/lib/nba/league_dash_pt_stats_stat.rb +169 -0
- data/lib/nba/league_dash_pt_team_defend.rb +158 -0
- data/lib/nba/league_dash_pt_team_defend_stat.rb +110 -0
- data/lib/nba/league_dash_team_clutch.rb +211 -0
- data/lib/nba/league_dash_team_clutch_stat.rb +237 -0
- data/lib/nba/league_dash_team_pt_shot.rb +150 -0
- data/lib/nba/league_dash_team_pt_shot_stat.rb +166 -0
- data/lib/nba/league_dash_team_shot_location_stat.rb +230 -0
- data/lib/nba/league_dash_team_shot_locations.rb +208 -0
- data/lib/nba/league_dash_team_stat.rb +275 -0
- data/lib/nba/league_dash_team_stats.rb +172 -0
- data/lib/nba/league_game_finder.rb +170 -0
- data/lib/nba/league_game_log.rb +224 -0
- data/lib/nba/league_hustle_stats_player.rb +161 -0
- data/lib/nba/league_hustle_stats_player_stat.rb +253 -0
- data/lib/nba/league_hustle_stats_team.rb +157 -0
- data/lib/nba/league_hustle_stats_team_stat.rb +179 -0
- data/lib/nba/league_lineup_viz.rb +184 -0
- data/lib/nba/league_lineup_viz_stat.rb +214 -0
- data/lib/nba/league_player_on_details.rb +175 -0
- data/lib/nba/league_player_on_details_stat.rb +313 -0
- data/lib/nba/league_season_matchup_stat.rb +241 -0
- data/lib/nba/league_season_matchups.rb +181 -0
- data/lib/nba/league_standing.rb +284 -0
- data/lib/nba/league_standings.rb +159 -0
- data/lib/nba/league_wide_shot_stat.rb +62 -0
- data/lib/nba/live_action.rb +240 -0
- data/lib/nba/live_box_score.rb +143 -0
- data/lib/nba/live_connection.rb +84 -0
- data/lib/nba/live_game.rb +230 -0
- data/lib/nba/live_play_by_play.rb +120 -0
- data/lib/nba/live_player_stat.rb +276 -0
- data/lib/nba/live_scoreboard.rb +102 -0
- data/lib/nba/matchup_rollup.rb +98 -0
- data/lib/nba/matchups_rollup.rb +81 -0
- data/lib/nba/pass_stat.rb +209 -0
- data/lib/nba/play.rb +258 -0
- data/lib/nba/play_by_play.rb +85 -0
- data/lib/nba/play_by_play_v3.rb +91 -0
- data/lib/nba/play_type_stat.rb +206 -0
- data/lib/nba/player.rb +242 -24
- data/lib/nba/player_awards.rb +110 -0
- data/lib/nba/player_career_by_college.rb +86 -0
- data/lib/nba/player_career_by_college_rollup.rb +143 -0
- data/lib/nba/player_career_stats.rb +77 -0
- data/lib/nba/player_compare.rb +156 -0
- data/lib/nba/player_comparison_stat.rb +242 -0
- data/lib/nba/player_dash_pt_pass.rb +164 -0
- data/lib/nba/player_dash_pt_reb.rb +235 -0
- data/lib/nba/player_dash_pt_shot_defend.rb +119 -0
- data/lib/nba/player_dash_pt_shots.rb +279 -0
- data/lib/nba/player_dashboard.rb +259 -0
- data/lib/nba/player_dashboard_stat.rb +248 -0
- data/lib/nba/player_estimated_metrics.rb +84 -0
- data/lib/nba/player_fantasy_profile_bar_graph.rb +147 -0
- data/lib/nba/player_game_log.rb +72 -0
- data/lib/nba/player_game_logs.rb +117 -0
- data/lib/nba/player_game_streak_finder.rb +108 -0
- data/lib/nba/player_index.rb +135 -0
- data/lib/nba/player_index_entry.rb +266 -0
- data/lib/nba/player_info.rb +225 -0
- data/lib/nba/player_next_n_games.rb +64 -0
- data/lib/nba/player_profile_v2.rb +169 -0
- data/lib/nba/player_vs_player.rb +153 -0
- data/lib/nba/players.rb +107 -0
- data/lib/nba/playoff_matchup.rb +84 -0
- data/lib/nba/playoff_picture.rb +98 -0
- data/lib/nba/playoff_series.rb +76 -0
- data/lib/nba/position.rb +48 -0
- data/lib/nba/rebound_stat.rb +189 -0
- data/lib/nba/response_parser.rb +116 -0
- data/lib/nba/roster.rb +74 -0
- data/lib/nba/rotation_entry.rb +154 -0
- data/lib/nba/schedule.rb +183 -0
- data/lib/nba/schedule_international.rb +182 -0
- data/lib/nba/scheduled_game.rb +240 -0
- data/lib/nba/scoreboard.rb +183 -0
- data/lib/nba/scoreboard_v3.rb +104 -0
- data/lib/nba/shot.rb +208 -0
- data/lib/nba/shot_chart.rb +75 -0
- data/lib/nba/shot_chart_league_wide.rb +102 -0
- data/lib/nba/shot_chart_lineup_detail.rb +109 -0
- data/lib/nba/shot_stat.rb +174 -0
- data/lib/nba/standing.rb +129 -0
- data/lib/nba/standings.rb +75 -0
- data/lib/nba/static.rb +107 -0
- data/lib/nba/synergy_play_types.rb +211 -0
- data/lib/nba/team.rb +203 -127
- data/lib/nba/team_and_players_vs_players.rb +227 -0
- data/lib/nba/team_and_players_vs_players_stat.rb +155 -0
- data/lib/nba/team_dash_pt_pass.rb +157 -0
- data/lib/nba/team_dash_pt_reb.rb +216 -0
- data/lib/nba/team_dash_pt_shots.rb +244 -0
- data/lib/nba/team_dashboard.rb +275 -0
- data/lib/nba/team_dashboard_stat.rb +248 -0
- data/lib/nba/team_detail.rb +117 -0
- data/lib/nba/team_details.rb +173 -0
- data/lib/nba/team_estimated_metrics.rb +91 -0
- data/lib/nba/team_estimated_metrics_stat.rb +146 -0
- data/lib/nba/team_game_log.rb +143 -0
- data/lib/nba/team_game_log_entry.rb +246 -0
- data/lib/nba/team_game_log_stat.rb +275 -0
- data/lib/nba/team_game_logs.rb +163 -0
- data/lib/nba/team_game_streak.rb +111 -0
- data/lib/nba/team_game_streak_finder.rb +109 -0
- data/lib/nba/team_historical_leader.rb +207 -0
- data/lib/nba/team_historical_leaders.rb +98 -0
- data/lib/nba/team_historical_record.rb +139 -0
- data/lib/nba/team_info.rb +150 -0
- data/lib/nba/team_info_common.rb +177 -0
- data/lib/nba/team_on_off_overall_stat.rb +477 -0
- data/lib/nba/team_on_off_player_stat.rb +523 -0
- data/lib/nba/team_on_off_player_summary.rb +135 -0
- data/lib/nba/team_pass_stat.rb +183 -0
- data/lib/nba/team_player_dashboard.rb +212 -0
- data/lib/nba/team_player_on_off_details.rb +218 -0
- data/lib/nba/team_player_on_off_summary.rb +214 -0
- data/lib/nba/team_player_stat.rb +275 -0
- data/lib/nba/team_rebound_stat.rb +189 -0
- data/lib/nba/team_season_rank.rb +110 -0
- data/lib/nba/team_shot_stat.rb +173 -0
- data/lib/nba/team_vs_player.rb +151 -0
- data/lib/nba/team_vs_player_stat.rb +157 -0
- data/lib/nba/team_year.rb +55 -0
- data/lib/nba/team_year_by_year_stats.rb +152 -0
- data/lib/nba/team_year_stat.rb +282 -0
- data/lib/nba/teams.rb +33 -0
- data/lib/nba/upcoming_game.rb +115 -0
- data/lib/nba/utils.rb +94 -0
- data/lib/nba/version.rb +5 -2
- data/lib/nba/video_detail.rb +103 -0
- data/lib/nba/video_details.rb +118 -0
- data/lib/nba/video_details_asset.rb +115 -0
- data/lib/nba/video_details_asset_entry.rb +91 -0
- data/lib/nba/video_event.rb +83 -0
- data/lib/nba/video_event_asset.rb +91 -0
- data/lib/nba/video_events.rb +106 -0
- data/lib/nba/video_events_asset.rb +107 -0
- data/lib/nba/video_status.rb +129 -0
- data/lib/nba/video_status_entry.rb +161 -0
- data/lib/nba/vs_player_stat.rb +156 -0
- data/lib/nba/win_probability.rb +117 -0
- data/lib/nba/win_probability_point.rb +140 -0
- data/lib/nba.rb +249 -5
- data/sig/equalizer.rbs +3 -0
- data/sig/nba.rbs +7297 -0
- data/sig/shale.rbs +24 -0
- data/sig/thor.rbs +19 -0
- metadata +324 -95
- data/.gitignore +0 -18
- data/.travis.yml +0 -22
- data/Gemfile +0 -23
- data/LICENSE.md +0 -22
- data/Rakefile +0 -18
- data/bin/nba +0 -7
- data/cache/teams.json +0 -16529
- data/lib/faraday_middleware/scrape_game.rb +0 -41
- data/lib/nba/request.rb +0 -37
- data/nba.gemspec +0 -28
- data/spec/fixtures/games.html +0 -785
- data/spec/fixtures/teams.json +0 -16529
- data/spec/game_spec.rb +0 -40
- data/spec/spec_helper.rb +0 -25
- 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
|
|
2
|
-
require
|
|
1
|
+
require "equalizer"
|
|
2
|
+
require "shale"
|
|
3
|
+
require_relative "conference"
|
|
4
|
+
require_relative "division"
|
|
3
5
|
|
|
4
6
|
module NBA
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
|
201
|
+
# Returns the team's home arena
|
|
11
202
|
#
|
|
203
|
+
# @api public
|
|
12
204
|
# @example
|
|
13
|
-
#
|
|
14
|
-
#
|
|
15
|
-
|
|
16
|
-
|
|
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
|