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,102 @@
|
|
|
1
|
+
require "json"
|
|
2
|
+
require_relative "collection"
|
|
3
|
+
require_relative "live_connection"
|
|
4
|
+
require_relative "live_game"
|
|
5
|
+
|
|
6
|
+
module NBA
|
|
7
|
+
# Default live client instance
|
|
8
|
+
LIVE_CLIENT = LiveConnection.new
|
|
9
|
+
|
|
10
|
+
# Provides methods to retrieve live NBA scoreboard data
|
|
11
|
+
module LiveScoreboard
|
|
12
|
+
# Retrieves today's live scoreboard
|
|
13
|
+
#
|
|
14
|
+
# @api public
|
|
15
|
+
# @example
|
|
16
|
+
# games = NBA::LiveScoreboard.today
|
|
17
|
+
# games.each { |g| puts "#{g.away_team_tricode} #{g.away_team_score} @ #{g.home_team_tricode} #{g.home_team_score}" }
|
|
18
|
+
# @param client [LiveConnection] the API client to use
|
|
19
|
+
# @return [Collection] a collection of live games
|
|
20
|
+
def self.today(client: LIVE_CLIENT)
|
|
21
|
+
path = "scoreboard/todaysScoreboard_00.json"
|
|
22
|
+
response = client.get(path)
|
|
23
|
+
parse_response(response)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Parses the live scoreboard API response
|
|
27
|
+
#
|
|
28
|
+
# @api private
|
|
29
|
+
# @param response [String, nil] the JSON response body
|
|
30
|
+
# @return [Collection] a collection of live games
|
|
31
|
+
def self.parse_response(response)
|
|
32
|
+
return Collection.new unless response
|
|
33
|
+
|
|
34
|
+
data = JSON.parse(response)
|
|
35
|
+
games = data.dig("scoreboard", "games")
|
|
36
|
+
return Collection.new unless games
|
|
37
|
+
|
|
38
|
+
live_games = games.map { |game| build_live_game(game) }
|
|
39
|
+
Collection.new(live_games)
|
|
40
|
+
end
|
|
41
|
+
private_class_method :parse_response
|
|
42
|
+
|
|
43
|
+
# Builds a LiveGame object from raw data
|
|
44
|
+
#
|
|
45
|
+
# @api private
|
|
46
|
+
# @param data [Hash] the game data
|
|
47
|
+
# @return [LiveGame] the live game object
|
|
48
|
+
def self.build_live_game(data)
|
|
49
|
+
LiveGame.new(**live_game_attributes(data))
|
|
50
|
+
end
|
|
51
|
+
private_class_method :build_live_game
|
|
52
|
+
|
|
53
|
+
# Combines all live game attributes
|
|
54
|
+
#
|
|
55
|
+
# @api private
|
|
56
|
+
# @param data [Hash] the game data
|
|
57
|
+
# @return [Hash] the combined attributes
|
|
58
|
+
def self.live_game_attributes(data)
|
|
59
|
+
game_info_attributes(data).merge(home_team_attributes(data), away_team_attributes(data))
|
|
60
|
+
end
|
|
61
|
+
private_class_method :live_game_attributes
|
|
62
|
+
|
|
63
|
+
# Extracts game info attributes from data
|
|
64
|
+
#
|
|
65
|
+
# @api private
|
|
66
|
+
# @param data [Hash] the game data
|
|
67
|
+
# @return [Hash] game info attributes
|
|
68
|
+
def self.game_info_attributes(data)
|
|
69
|
+
{game_id: data["gameId"], game_code: data["gameCode"],
|
|
70
|
+
game_status: data["gameStatus"], game_status_text: data["gameStatusText"],
|
|
71
|
+
period: data["period"], game_clock: data["gameClock"],
|
|
72
|
+
game_time_utc: data["gameTimeUTC"], game_et: data["gameEt"]}
|
|
73
|
+
end
|
|
74
|
+
private_class_method :game_info_attributes
|
|
75
|
+
|
|
76
|
+
# Extracts home team attributes from data
|
|
77
|
+
#
|
|
78
|
+
# @api private
|
|
79
|
+
# @param data [Hash] the game data
|
|
80
|
+
# @return [Hash] home team attributes
|
|
81
|
+
def self.home_team_attributes(data)
|
|
82
|
+
home = data["homeTeam"] || {}
|
|
83
|
+
{home_team_id: home["teamId"], home_team_name: home["teamName"],
|
|
84
|
+
home_team_city: home["teamCity"], home_team_tricode: home["teamTricode"],
|
|
85
|
+
home_team_score: home["score"]}
|
|
86
|
+
end
|
|
87
|
+
private_class_method :home_team_attributes
|
|
88
|
+
|
|
89
|
+
# Extracts away team attributes from data
|
|
90
|
+
#
|
|
91
|
+
# @api private
|
|
92
|
+
# @param data [Hash] the game data
|
|
93
|
+
# @return [Hash] away team attributes
|
|
94
|
+
def self.away_team_attributes(data)
|
|
95
|
+
away = data["awayTeam"] || {}
|
|
96
|
+
{away_team_id: away["teamId"], away_team_name: away["teamName"],
|
|
97
|
+
away_team_city: away["teamCity"], away_team_tricode: away["teamTricode"],
|
|
98
|
+
away_team_score: away["score"]}
|
|
99
|
+
end
|
|
100
|
+
private_class_method :away_team_attributes
|
|
101
|
+
end
|
|
102
|
+
end
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
require "equalizer"
|
|
2
|
+
require "shale"
|
|
3
|
+
|
|
4
|
+
module NBA
|
|
5
|
+
# Represents a matchup rollup statistic entry
|
|
6
|
+
#
|
|
7
|
+
# @api public
|
|
8
|
+
# @example
|
|
9
|
+
# matchup.def_player_name #=> "Jayson Tatum"
|
|
10
|
+
# matchup.matchup_fg_pct #=> 0.425
|
|
11
|
+
class MatchupRollup < Shale::Mapper
|
|
12
|
+
include Equalizer.new(:season_id, :def_player_id, :position)
|
|
13
|
+
|
|
14
|
+
# Returns the season ID
|
|
15
|
+
# @api public
|
|
16
|
+
# @example
|
|
17
|
+
# matchup.season_id #=> "22023"
|
|
18
|
+
# @return [String, nil] the season ID
|
|
19
|
+
attribute :season_id, Shale::Type::String
|
|
20
|
+
|
|
21
|
+
# Returns the position
|
|
22
|
+
# @api public
|
|
23
|
+
# @example
|
|
24
|
+
# matchup.position #=> "F"
|
|
25
|
+
# @return [String, nil] the position
|
|
26
|
+
attribute :position, Shale::Type::String
|
|
27
|
+
|
|
28
|
+
# Returns percent of time
|
|
29
|
+
# @api public
|
|
30
|
+
# @example
|
|
31
|
+
# matchup.percent_of_time #=> 0.15
|
|
32
|
+
# @return [Float, nil] percent of time
|
|
33
|
+
attribute :percent_of_time, Shale::Type::Float
|
|
34
|
+
|
|
35
|
+
# Returns the defensive player ID
|
|
36
|
+
# @api public
|
|
37
|
+
# @example
|
|
38
|
+
# matchup.def_player_id #=> 1628369
|
|
39
|
+
# @return [Integer, nil] the defensive player ID
|
|
40
|
+
attribute :def_player_id, Shale::Type::Integer
|
|
41
|
+
|
|
42
|
+
# Returns the defensive player name
|
|
43
|
+
# @api public
|
|
44
|
+
# @example
|
|
45
|
+
# matchup.def_player_name #=> "Jayson Tatum"
|
|
46
|
+
# @return [String, nil] the defensive player name
|
|
47
|
+
attribute :def_player_name, Shale::Type::String
|
|
48
|
+
|
|
49
|
+
# Returns games played
|
|
50
|
+
# @api public
|
|
51
|
+
# @example
|
|
52
|
+
# matchup.gp #=> 82
|
|
53
|
+
# @return [Integer, nil] games played
|
|
54
|
+
attribute :gp, Shale::Type::Integer
|
|
55
|
+
|
|
56
|
+
# Returns matchup minutes
|
|
57
|
+
# @api public
|
|
58
|
+
# @example
|
|
59
|
+
# matchup.matchup_min #=> 2.5
|
|
60
|
+
# @return [Float, nil] matchup minutes
|
|
61
|
+
attribute :matchup_min, Shale::Type::Float
|
|
62
|
+
|
|
63
|
+
# Returns partial possessions
|
|
64
|
+
# @api public
|
|
65
|
+
# @example
|
|
66
|
+
# matchup.partial_poss #=> 1.8
|
|
67
|
+
# @return [Float, nil] partial possessions
|
|
68
|
+
attribute :partial_poss, Shale::Type::Float
|
|
69
|
+
|
|
70
|
+
# Returns player points
|
|
71
|
+
# @api public
|
|
72
|
+
# @example
|
|
73
|
+
# matchup.player_pts #=> 1.2
|
|
74
|
+
# @return [Float, nil] player points
|
|
75
|
+
attribute :player_pts, Shale::Type::Float
|
|
76
|
+
|
|
77
|
+
# Returns team points
|
|
78
|
+
# @api public
|
|
79
|
+
# @example
|
|
80
|
+
# matchup.team_pts #=> 1.4
|
|
81
|
+
# @return [Float, nil] team points
|
|
82
|
+
attribute :team_pts, Shale::Type::Float
|
|
83
|
+
|
|
84
|
+
# Returns matchup field goal percentage
|
|
85
|
+
# @api public
|
|
86
|
+
# @example
|
|
87
|
+
# matchup.matchup_fg_pct #=> 0.425
|
|
88
|
+
# @return [Float, nil] matchup field goal percentage
|
|
89
|
+
attribute :matchup_fg_pct, Shale::Type::Float
|
|
90
|
+
|
|
91
|
+
# Returns matchup 3-point percentage
|
|
92
|
+
# @api public
|
|
93
|
+
# @example
|
|
94
|
+
# matchup.matchup_fg3_pct #=> 0.375
|
|
95
|
+
# @return [Float, nil] matchup 3-point percentage
|
|
96
|
+
attribute :matchup_fg3_pct, Shale::Type::Float
|
|
97
|
+
end
|
|
98
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
require "json"
|
|
2
|
+
require_relative "client"
|
|
3
|
+
require_relative "collection"
|
|
4
|
+
require_relative "matchup_rollup"
|
|
5
|
+
require_relative "league"
|
|
6
|
+
require_relative "response_parser"
|
|
7
|
+
require_relative "utils"
|
|
8
|
+
|
|
9
|
+
module NBA
|
|
10
|
+
# Provides methods to retrieve NBA matchup rollup statistics
|
|
11
|
+
module MatchupsRollup
|
|
12
|
+
# Result set name for matchups rollup
|
|
13
|
+
# @return [String] the result set name
|
|
14
|
+
RESULT_SET = "MatchupsRollup".freeze
|
|
15
|
+
|
|
16
|
+
# Retrieves matchup rollup statistics
|
|
17
|
+
#
|
|
18
|
+
# @api public
|
|
19
|
+
# @example
|
|
20
|
+
# matchups = NBA::MatchupsRollup.all(season: 2023)
|
|
21
|
+
# matchups.each { |m| puts "#{m.def_player_name}: #{m.matchup_fg_pct}" }
|
|
22
|
+
# @param season [Integer] the season year (defaults to current season)
|
|
23
|
+
# @param season_type [String] the season type (Regular Season, Playoffs, etc.)
|
|
24
|
+
# @param per_mode [String] the per mode (Totals, PerGame, etc.)
|
|
25
|
+
# @param def_player [Integer, Player, nil] the defensive player ID or Player object
|
|
26
|
+
# @param def_team [Integer, Team, nil] the defensive team ID or Team object
|
|
27
|
+
# @param off_player [Integer, Player, nil] the offensive player ID or Player object
|
|
28
|
+
# @param off_team [Integer, Team, nil] the offensive team ID or Team object
|
|
29
|
+
# @param league [String, League] the league ID or League object
|
|
30
|
+
# @param client [Client] the API client to use
|
|
31
|
+
# @return [Collection] a collection of matchup rollups
|
|
32
|
+
def self.all(season: Utils.current_season, season_type: "Regular Season",
|
|
33
|
+
per_mode: "Totals", def_player: nil, def_team: nil, off_player: nil,
|
|
34
|
+
off_team: nil, league: League::NBA, client: CLIENT)
|
|
35
|
+
league_id = Utils.extract_league_id(league)
|
|
36
|
+
opts = {season: season, season_type: season_type, per_mode: per_mode,
|
|
37
|
+
def_player_id: Utils.extract_id(def_player), def_team_id: Utils.extract_id(def_team),
|
|
38
|
+
off_player_id: Utils.extract_id(off_player), off_team_id: Utils.extract_id(off_team),
|
|
39
|
+
league_id: league_id}
|
|
40
|
+
ResponseParser.parse(client.get(build_path(opts)), result_set: RESULT_SET) do |data|
|
|
41
|
+
build_matchup(data)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Builds the API request path
|
|
46
|
+
# @api private
|
|
47
|
+
# @return [String] the request path
|
|
48
|
+
def self.build_path(opts)
|
|
49
|
+
"matchupsrollup?DefPlayerID=#{opts[:def_player_id]}&DefTeamID=#{opts[:def_team_id]}" \
|
|
50
|
+
"&LeagueID=#{opts[:league_id]}&OffPlayerID=#{opts[:off_player_id]}" \
|
|
51
|
+
"&OffTeamID=#{opts[:off_team_id]}&PerMode=#{opts[:per_mode]}" \
|
|
52
|
+
"&Season=#{Utils.format_season(opts[:season])}&SeasonType=#{opts[:season_type]}"
|
|
53
|
+
end
|
|
54
|
+
private_class_method :build_path
|
|
55
|
+
|
|
56
|
+
# Builds a MatchupRollup object from raw data
|
|
57
|
+
# @api private
|
|
58
|
+
# @param data [Hash] the row data
|
|
59
|
+
# @return [MatchupRollup] the matchup object
|
|
60
|
+
def self.build_matchup(data)
|
|
61
|
+
MatchupRollup.new(**matchup_attributes(data))
|
|
62
|
+
end
|
|
63
|
+
private_class_method :build_matchup
|
|
64
|
+
|
|
65
|
+
# Extracts matchup attributes from data
|
|
66
|
+
# @api private
|
|
67
|
+
# @param data [Hash] the row data
|
|
68
|
+
# @return [Hash] matchup attributes
|
|
69
|
+
def self.matchup_attributes(data)
|
|
70
|
+
{season_id: data["SEASON_ID"], position: data["POSITION"],
|
|
71
|
+
percent_of_time: data["PERCENT_OF_TIME"],
|
|
72
|
+
def_player_id: data["DEF_PLAYER_ID"],
|
|
73
|
+
def_player_name: data["DEF_PLAYER_NAME"], gp: data["GP"],
|
|
74
|
+
matchup_min: data["MATCHUP_MIN"],
|
|
75
|
+
partial_poss: data["PARTIAL_POSS"], player_pts: data["PLAYER_PTS"],
|
|
76
|
+
team_pts: data["TEAM_PTS"], matchup_fg_pct: data["MATCHUP_FG_PCT"],
|
|
77
|
+
matchup_fg3_pct: data["MATCHUP_FG3_PCT"]}
|
|
78
|
+
end
|
|
79
|
+
private_class_method :matchup_attributes
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
require "equalizer"
|
|
2
|
+
require "shale"
|
|
3
|
+
|
|
4
|
+
module NBA
|
|
5
|
+
# Represents player tracking pass statistics
|
|
6
|
+
#
|
|
7
|
+
# @api public
|
|
8
|
+
class PassStat < Shale::Mapper
|
|
9
|
+
include Equalizer.new(:player_id, :pass_to)
|
|
10
|
+
|
|
11
|
+
# @!attribute [rw] player_id
|
|
12
|
+
# Returns the player ID
|
|
13
|
+
# @api public
|
|
14
|
+
# @example
|
|
15
|
+
# stat.player_id #=> 201939
|
|
16
|
+
# @return [Integer] the player ID
|
|
17
|
+
attribute :player_id, Shale::Type::Integer
|
|
18
|
+
|
|
19
|
+
# @!attribute [rw] player_name_last_first
|
|
20
|
+
# Returns the player name in "Last, First" format
|
|
21
|
+
# @api public
|
|
22
|
+
# @example
|
|
23
|
+
# stat.player_name_last_first #=> "Curry, Stephen"
|
|
24
|
+
# @return [String] the player name
|
|
25
|
+
attribute :player_name_last_first, Shale::Type::String
|
|
26
|
+
|
|
27
|
+
# @!attribute [rw] pass_to
|
|
28
|
+
# Returns the pass recipient or passer name
|
|
29
|
+
# @api public
|
|
30
|
+
# @example
|
|
31
|
+
# stat.pass_to #=> "Klay Thompson"
|
|
32
|
+
# @return [String] the pass partner name
|
|
33
|
+
attribute :pass_to, Shale::Type::String
|
|
34
|
+
|
|
35
|
+
# @!attribute [rw] pass_teammate_player_id
|
|
36
|
+
# Returns the pass partner player ID
|
|
37
|
+
# @api public
|
|
38
|
+
# @example
|
|
39
|
+
# stat.pass_teammate_player_id #=> 202691
|
|
40
|
+
# @return [Integer] the teammate player ID
|
|
41
|
+
attribute :pass_teammate_player_id, Shale::Type::Integer
|
|
42
|
+
|
|
43
|
+
# @!attribute [rw] team_id
|
|
44
|
+
# Returns the team ID
|
|
45
|
+
# @api public
|
|
46
|
+
# @example
|
|
47
|
+
# stat.team_id #=> 1610612744
|
|
48
|
+
# @return [Integer] the team ID
|
|
49
|
+
attribute :team_id, Shale::Type::Integer
|
|
50
|
+
|
|
51
|
+
# @!attribute [rw] team_abbreviation
|
|
52
|
+
# Returns the team abbreviation
|
|
53
|
+
# @api public
|
|
54
|
+
# @example
|
|
55
|
+
# stat.team_abbreviation #=> "GSW"
|
|
56
|
+
# @return [String] the team abbreviation
|
|
57
|
+
attribute :team_abbreviation, Shale::Type::String
|
|
58
|
+
|
|
59
|
+
# @!attribute [rw] gp
|
|
60
|
+
# Returns games played
|
|
61
|
+
# @api public
|
|
62
|
+
# @example
|
|
63
|
+
# stat.gp #=> 74
|
|
64
|
+
# @return [Integer] games played
|
|
65
|
+
attribute :gp, Shale::Type::Integer
|
|
66
|
+
|
|
67
|
+
# @!attribute [rw] g
|
|
68
|
+
# Returns games
|
|
69
|
+
# @api public
|
|
70
|
+
# @example
|
|
71
|
+
# stat.g #=> 74
|
|
72
|
+
# @return [Integer] games
|
|
73
|
+
attribute :g, Shale::Type::Integer
|
|
74
|
+
|
|
75
|
+
# @!attribute [rw] pass_type
|
|
76
|
+
# Returns the type of pass
|
|
77
|
+
# @api public
|
|
78
|
+
# @example
|
|
79
|
+
# stat.pass_type #=> "Made"
|
|
80
|
+
# @return [String] the pass type
|
|
81
|
+
attribute :pass_type, Shale::Type::String
|
|
82
|
+
|
|
83
|
+
# @!attribute [rw] frequency
|
|
84
|
+
# Returns the frequency percentage
|
|
85
|
+
# @api public
|
|
86
|
+
# @example
|
|
87
|
+
# stat.frequency #=> 0.25
|
|
88
|
+
# @return [Float] the frequency
|
|
89
|
+
attribute :frequency, Shale::Type::Float
|
|
90
|
+
|
|
91
|
+
# @!attribute [rw] pass
|
|
92
|
+
# Returns passes per game
|
|
93
|
+
# @api public
|
|
94
|
+
# @example
|
|
95
|
+
# stat.pass #=> 5.2
|
|
96
|
+
# @return [Float] passes per game
|
|
97
|
+
attribute :pass, Shale::Type::Float
|
|
98
|
+
|
|
99
|
+
# @!attribute [rw] ast
|
|
100
|
+
# Returns assists per game
|
|
101
|
+
# @api public
|
|
102
|
+
# @example
|
|
103
|
+
# stat.ast #=> 2.1
|
|
104
|
+
# @return [Float] assists per game
|
|
105
|
+
attribute :ast, Shale::Type::Float
|
|
106
|
+
|
|
107
|
+
# @!attribute [rw] fgm
|
|
108
|
+
# Returns field goals made following pass
|
|
109
|
+
# @api public
|
|
110
|
+
# @example
|
|
111
|
+
# stat.fgm #=> 3.5
|
|
112
|
+
# @return [Float] field goals made
|
|
113
|
+
attribute :fgm, Shale::Type::Float
|
|
114
|
+
|
|
115
|
+
# @!attribute [rw] fga
|
|
116
|
+
# Returns field goals attempted following pass
|
|
117
|
+
# @api public
|
|
118
|
+
# @example
|
|
119
|
+
# stat.fga #=> 7.2
|
|
120
|
+
# @return [Float] field goals attempted
|
|
121
|
+
attribute :fga, Shale::Type::Float
|
|
122
|
+
|
|
123
|
+
# @!attribute [rw] fg_pct
|
|
124
|
+
# Returns field goal percentage following pass
|
|
125
|
+
# @api public
|
|
126
|
+
# @example
|
|
127
|
+
# stat.fg_pct #=> 0.486
|
|
128
|
+
# @return [Float] field goal percentage
|
|
129
|
+
attribute :fg_pct, Shale::Type::Float
|
|
130
|
+
|
|
131
|
+
# @!attribute [rw] fg2m
|
|
132
|
+
# Returns two-pointers made following pass
|
|
133
|
+
# @api public
|
|
134
|
+
# @example
|
|
135
|
+
# stat.fg2m #=> 1.5
|
|
136
|
+
# @return [Float] two-pointers made
|
|
137
|
+
attribute :fg2m, Shale::Type::Float
|
|
138
|
+
|
|
139
|
+
# @!attribute [rw] fg2a
|
|
140
|
+
# Returns two-pointers attempted following pass
|
|
141
|
+
# @api public
|
|
142
|
+
# @example
|
|
143
|
+
# stat.fg2a #=> 3.0
|
|
144
|
+
# @return [Float] two-pointers attempted
|
|
145
|
+
attribute :fg2a, Shale::Type::Float
|
|
146
|
+
|
|
147
|
+
# @!attribute [rw] fg2_pct
|
|
148
|
+
# Returns two-point percentage following pass
|
|
149
|
+
# @api public
|
|
150
|
+
# @example
|
|
151
|
+
# stat.fg2_pct #=> 0.500
|
|
152
|
+
# @return [Float] two-point percentage
|
|
153
|
+
attribute :fg2_pct, Shale::Type::Float
|
|
154
|
+
|
|
155
|
+
# @!attribute [rw] fg3m
|
|
156
|
+
# Returns three-pointers made following pass
|
|
157
|
+
# @api public
|
|
158
|
+
# @example
|
|
159
|
+
# stat.fg3m #=> 2.0
|
|
160
|
+
# @return [Float] three-pointers made
|
|
161
|
+
attribute :fg3m, Shale::Type::Float
|
|
162
|
+
|
|
163
|
+
# @!attribute [rw] fg3a
|
|
164
|
+
# Returns three-pointers attempted following pass
|
|
165
|
+
# @api public
|
|
166
|
+
# @example
|
|
167
|
+
# stat.fg3a #=> 4.2
|
|
168
|
+
# @return [Float] three-pointers attempted
|
|
169
|
+
attribute :fg3a, Shale::Type::Float
|
|
170
|
+
|
|
171
|
+
# @!attribute [rw] fg3_pct
|
|
172
|
+
# Returns three-point percentage following pass
|
|
173
|
+
# @api public
|
|
174
|
+
# @example
|
|
175
|
+
# stat.fg3_pct #=> 0.476
|
|
176
|
+
# @return [Float] three-point percentage
|
|
177
|
+
attribute :fg3_pct, Shale::Type::Float
|
|
178
|
+
|
|
179
|
+
# Returns the player object
|
|
180
|
+
#
|
|
181
|
+
# @api public
|
|
182
|
+
# @example
|
|
183
|
+
# stat.player #=> #<NBA::Player>
|
|
184
|
+
# @return [Player, nil] the player object
|
|
185
|
+
def player
|
|
186
|
+
Players.find(player_id)
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# Returns the teammate player object
|
|
190
|
+
#
|
|
191
|
+
# @api public
|
|
192
|
+
# @example
|
|
193
|
+
# stat.teammate #=> #<NBA::Player>
|
|
194
|
+
# @return [Player, nil] the teammate player object
|
|
195
|
+
def teammate
|
|
196
|
+
Players.find(pass_teammate_player_id)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
# Returns the team object
|
|
200
|
+
#
|
|
201
|
+
# @api public
|
|
202
|
+
# @example
|
|
203
|
+
# stat.team #=> #<NBA::Team>
|
|
204
|
+
# @return [Team, nil] the team object
|
|
205
|
+
def team
|
|
206
|
+
Teams.find(team_id)
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
end
|