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,110 @@
|
|
|
1
|
+
require "equalizer"
|
|
2
|
+
require "shale"
|
|
3
|
+
require_relative "teams"
|
|
4
|
+
|
|
5
|
+
module NBA
|
|
6
|
+
# Represents team season rankings from the TeamInfoCommon endpoint
|
|
7
|
+
#
|
|
8
|
+
# @api public
|
|
9
|
+
class TeamSeasonRank < Shale::Mapper
|
|
10
|
+
include Equalizer.new(:team_id, :season_id)
|
|
11
|
+
|
|
12
|
+
# @!attribute [rw] league_id
|
|
13
|
+
# Returns the league ID
|
|
14
|
+
# @api public
|
|
15
|
+
# @example
|
|
16
|
+
# rank.league_id #=> "00"
|
|
17
|
+
# @return [String, nil] the league ID
|
|
18
|
+
attribute :league_id, Shale::Type::String
|
|
19
|
+
|
|
20
|
+
# @!attribute [rw] season_id
|
|
21
|
+
# Returns the season ID
|
|
22
|
+
# @api public
|
|
23
|
+
# @example
|
|
24
|
+
# rank.season_id #=> "2024-25"
|
|
25
|
+
# @return [String, nil] the season ID
|
|
26
|
+
attribute :season_id, Shale::Type::String
|
|
27
|
+
|
|
28
|
+
# @!attribute [rw] team_id
|
|
29
|
+
# Returns the team ID
|
|
30
|
+
# @api public
|
|
31
|
+
# @example
|
|
32
|
+
# rank.team_id #=> 1610612744
|
|
33
|
+
# @return [Integer, nil] the team's ID
|
|
34
|
+
attribute :team_id, Shale::Type::Integer
|
|
35
|
+
|
|
36
|
+
# @!attribute [rw] pts_rank
|
|
37
|
+
# Returns the points per game rank
|
|
38
|
+
# @api public
|
|
39
|
+
# @example
|
|
40
|
+
# rank.pts_rank #=> 5
|
|
41
|
+
# @return [Integer, nil] the points rank
|
|
42
|
+
attribute :pts_rank, Shale::Type::Integer
|
|
43
|
+
|
|
44
|
+
# @!attribute [rw] pts_pg
|
|
45
|
+
# Returns the points per game
|
|
46
|
+
# @api public
|
|
47
|
+
# @example
|
|
48
|
+
# rank.pts_pg #=> 118.9
|
|
49
|
+
# @return [Float, nil] the points per game
|
|
50
|
+
attribute :pts_pg, Shale::Type::Float
|
|
51
|
+
|
|
52
|
+
# @!attribute [rw] reb_rank
|
|
53
|
+
# Returns the rebounds per game rank
|
|
54
|
+
# @api public
|
|
55
|
+
# @example
|
|
56
|
+
# rank.reb_rank #=> 12
|
|
57
|
+
# @return [Integer, nil] the rebounds rank
|
|
58
|
+
attribute :reb_rank, Shale::Type::Integer
|
|
59
|
+
|
|
60
|
+
# @!attribute [rw] reb_pg
|
|
61
|
+
# Returns the rebounds per game
|
|
62
|
+
# @api public
|
|
63
|
+
# @example
|
|
64
|
+
# rank.reb_pg #=> 44.2
|
|
65
|
+
# @return [Float, nil] the rebounds per game
|
|
66
|
+
attribute :reb_pg, Shale::Type::Float
|
|
67
|
+
|
|
68
|
+
# @!attribute [rw] ast_rank
|
|
69
|
+
# Returns the assists per game rank
|
|
70
|
+
# @api public
|
|
71
|
+
# @example
|
|
72
|
+
# rank.ast_rank #=> 3
|
|
73
|
+
# @return [Integer, nil] the assists rank
|
|
74
|
+
attribute :ast_rank, Shale::Type::Integer
|
|
75
|
+
|
|
76
|
+
# @!attribute [rw] ast_pg
|
|
77
|
+
# Returns the assists per game
|
|
78
|
+
# @api public
|
|
79
|
+
# @example
|
|
80
|
+
# rank.ast_pg #=> 28.7
|
|
81
|
+
# @return [Float, nil] the assists per game
|
|
82
|
+
attribute :ast_pg, Shale::Type::Float
|
|
83
|
+
|
|
84
|
+
# @!attribute [rw] opp_pts_rank
|
|
85
|
+
# Returns the opponent points per game rank
|
|
86
|
+
# @api public
|
|
87
|
+
# @example
|
|
88
|
+
# rank.opp_pts_rank #=> 15
|
|
89
|
+
# @return [Integer, nil] the opponent points rank
|
|
90
|
+
attribute :opp_pts_rank, Shale::Type::Integer
|
|
91
|
+
|
|
92
|
+
# @!attribute [rw] opp_pts_pg
|
|
93
|
+
# Returns the opponent points per game
|
|
94
|
+
# @api public
|
|
95
|
+
# @example
|
|
96
|
+
# rank.opp_pts_pg #=> 115.2
|
|
97
|
+
# @return [Float, nil] the opponent points per game
|
|
98
|
+
attribute :opp_pts_pg, Shale::Type::Float
|
|
99
|
+
|
|
100
|
+
# Returns the team associated with this rank
|
|
101
|
+
#
|
|
102
|
+
# @api public
|
|
103
|
+
# @example
|
|
104
|
+
# rank.team #=> #<NBA::Team ...>
|
|
105
|
+
# @return [Team, nil] the Team object
|
|
106
|
+
def team
|
|
107
|
+
Teams.find(team_id)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
require "equalizer"
|
|
2
|
+
require "shale"
|
|
3
|
+
|
|
4
|
+
module NBA
|
|
5
|
+
# Represents team tracking shot statistics
|
|
6
|
+
#
|
|
7
|
+
# @api public
|
|
8
|
+
class TeamShotStat < Shale::Mapper
|
|
9
|
+
include Equalizer.new(:team_id, :shot_type, :g)
|
|
10
|
+
|
|
11
|
+
# @!attribute [rw] team_id
|
|
12
|
+
# Returns the team ID
|
|
13
|
+
# @api public
|
|
14
|
+
# @example
|
|
15
|
+
# stat.team_id #=> 1610612744
|
|
16
|
+
# @return [Integer, nil] the team's ID
|
|
17
|
+
attribute :team_id, Shale::Type::Integer
|
|
18
|
+
|
|
19
|
+
# @!attribute [rw] team_name
|
|
20
|
+
# Returns the team name
|
|
21
|
+
# @api public
|
|
22
|
+
# @example
|
|
23
|
+
# stat.team_name #=> "Golden State Warriors"
|
|
24
|
+
# @return [String, nil] the team's name
|
|
25
|
+
attribute :team_name, Shale::Type::String
|
|
26
|
+
|
|
27
|
+
# @!attribute [rw] team_abbreviation
|
|
28
|
+
# Returns the team abbreviation
|
|
29
|
+
# @api public
|
|
30
|
+
# @example
|
|
31
|
+
# stat.team_abbreviation #=> "GSW"
|
|
32
|
+
# @return [String, nil] the team abbreviation
|
|
33
|
+
attribute :team_abbreviation, Shale::Type::String
|
|
34
|
+
|
|
35
|
+
# @!attribute [rw] sort_order
|
|
36
|
+
# Returns the sort order
|
|
37
|
+
# @api public
|
|
38
|
+
# @example
|
|
39
|
+
# stat.sort_order #=> 1
|
|
40
|
+
# @return [Integer, nil] the sort order
|
|
41
|
+
attribute :sort_order, Shale::Type::Integer
|
|
42
|
+
|
|
43
|
+
# @!attribute [rw] g
|
|
44
|
+
# Returns number of games
|
|
45
|
+
# @api public
|
|
46
|
+
# @example
|
|
47
|
+
# stat.g #=> 74
|
|
48
|
+
# @return [Integer, nil] games
|
|
49
|
+
attribute :g, Shale::Type::Integer
|
|
50
|
+
|
|
51
|
+
# @!attribute [rw] shot_type
|
|
52
|
+
# Returns the shot type or category
|
|
53
|
+
# @api public
|
|
54
|
+
# @example
|
|
55
|
+
# stat.shot_type #=> "Catch and Shoot"
|
|
56
|
+
# @return [String, nil] the shot type or category
|
|
57
|
+
attribute :shot_type, Shale::Type::String
|
|
58
|
+
|
|
59
|
+
# @!attribute [rw] fga_frequency
|
|
60
|
+
# Returns field goal attempt frequency
|
|
61
|
+
# @api public
|
|
62
|
+
# @example
|
|
63
|
+
# stat.fga_frequency #=> 0.35
|
|
64
|
+
# @return [Float, nil] field goal attempt frequency
|
|
65
|
+
attribute :fga_frequency, Shale::Type::Float
|
|
66
|
+
|
|
67
|
+
# @!attribute [rw] fgm
|
|
68
|
+
# Returns field goals made
|
|
69
|
+
# @api public
|
|
70
|
+
# @example
|
|
71
|
+
# stat.fgm #=> 7.2
|
|
72
|
+
# @return [Float, nil] field goals made
|
|
73
|
+
attribute :fgm, Shale::Type::Float
|
|
74
|
+
|
|
75
|
+
# @!attribute [rw] fga
|
|
76
|
+
# Returns field goals attempted
|
|
77
|
+
# @api public
|
|
78
|
+
# @example
|
|
79
|
+
# stat.fga #=> 15.3
|
|
80
|
+
# @return [Float, nil] field goals attempted
|
|
81
|
+
attribute :fga, Shale::Type::Float
|
|
82
|
+
|
|
83
|
+
# @!attribute [rw] fg_pct
|
|
84
|
+
# Returns field goal percentage
|
|
85
|
+
# @api public
|
|
86
|
+
# @example
|
|
87
|
+
# stat.fg_pct #=> 0.472
|
|
88
|
+
# @return [Float, nil] field goal percentage
|
|
89
|
+
attribute :fg_pct, Shale::Type::Float
|
|
90
|
+
|
|
91
|
+
# @!attribute [rw] efg_pct
|
|
92
|
+
# Returns effective field goal percentage
|
|
93
|
+
# @api public
|
|
94
|
+
# @example
|
|
95
|
+
# stat.efg_pct #=> 0.561
|
|
96
|
+
# @return [Float, nil] effective field goal percentage
|
|
97
|
+
attribute :efg_pct, Shale::Type::Float
|
|
98
|
+
|
|
99
|
+
# @!attribute [rw] fg2a_frequency
|
|
100
|
+
# Returns 2-point field goal attempt frequency
|
|
101
|
+
# @api public
|
|
102
|
+
# @example
|
|
103
|
+
# stat.fg2a_frequency #=> 0.45
|
|
104
|
+
# @return [Float, nil] 2-point field goal attempt frequency
|
|
105
|
+
attribute :fg2a_frequency, Shale::Type::Float
|
|
106
|
+
|
|
107
|
+
# @!attribute [rw] fg2m
|
|
108
|
+
# Returns 2-point field goals made
|
|
109
|
+
# @api public
|
|
110
|
+
# @example
|
|
111
|
+
# stat.fg2m #=> 4.1
|
|
112
|
+
# @return [Float, nil] 2-point field goals made
|
|
113
|
+
attribute :fg2m, Shale::Type::Float
|
|
114
|
+
|
|
115
|
+
# @!attribute [rw] fg2a
|
|
116
|
+
# Returns 2-point field goals attempted
|
|
117
|
+
# @api public
|
|
118
|
+
# @example
|
|
119
|
+
# stat.fg2a #=> 7.8
|
|
120
|
+
# @return [Float, nil] 2-point field goals attempted
|
|
121
|
+
attribute :fg2a, Shale::Type::Float
|
|
122
|
+
|
|
123
|
+
# @!attribute [rw] fg2_pct
|
|
124
|
+
# Returns 2-point field goal percentage
|
|
125
|
+
# @api public
|
|
126
|
+
# @example
|
|
127
|
+
# stat.fg2_pct #=> 0.526
|
|
128
|
+
# @return [Float, nil] 2-point field goal percentage
|
|
129
|
+
attribute :fg2_pct, Shale::Type::Float
|
|
130
|
+
|
|
131
|
+
# @!attribute [rw] fg3a_frequency
|
|
132
|
+
# Returns 3-point field goal attempt frequency
|
|
133
|
+
# @api public
|
|
134
|
+
# @example
|
|
135
|
+
# stat.fg3a_frequency #=> 0.55
|
|
136
|
+
# @return [Float, nil] 3-point field goal attempt frequency
|
|
137
|
+
attribute :fg3a_frequency, Shale::Type::Float
|
|
138
|
+
|
|
139
|
+
# @!attribute [rw] fg3m
|
|
140
|
+
# Returns 3-point field goals made
|
|
141
|
+
# @api public
|
|
142
|
+
# @example
|
|
143
|
+
# stat.fg3m #=> 4.8
|
|
144
|
+
# @return [Float, nil] 3-point field goals made
|
|
145
|
+
attribute :fg3m, Shale::Type::Float
|
|
146
|
+
|
|
147
|
+
# @!attribute [rw] fg3a
|
|
148
|
+
# Returns 3-point field goals attempted
|
|
149
|
+
# @api public
|
|
150
|
+
# @example
|
|
151
|
+
# stat.fg3a #=> 11.2
|
|
152
|
+
# @return [Float, nil] 3-point field goals attempted
|
|
153
|
+
attribute :fg3a, Shale::Type::Float
|
|
154
|
+
|
|
155
|
+
# @!attribute [rw] fg3_pct
|
|
156
|
+
# Returns 3-point field goal percentage
|
|
157
|
+
# @api public
|
|
158
|
+
# @example
|
|
159
|
+
# stat.fg3_pct #=> 0.428
|
|
160
|
+
# @return [Float, nil] 3-point field goal percentage
|
|
161
|
+
attribute :fg3_pct, Shale::Type::Float
|
|
162
|
+
|
|
163
|
+
# Returns the team associated with this stat
|
|
164
|
+
#
|
|
165
|
+
# @api public
|
|
166
|
+
# @example
|
|
167
|
+
# stat.team #=> #<NBA::Team ...>
|
|
168
|
+
# @return [Team, nil] the Team object
|
|
169
|
+
def team
|
|
170
|
+
Teams.find(team_id)
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
end
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
require "json"
|
|
2
|
+
require_relative "client"
|
|
3
|
+
require_relative "collection"
|
|
4
|
+
require_relative "team_vs_player_stat"
|
|
5
|
+
require_relative "utils"
|
|
6
|
+
|
|
7
|
+
module NBA
|
|
8
|
+
# Provides methods to retrieve team vs player statistics
|
|
9
|
+
#
|
|
10
|
+
# @api public
|
|
11
|
+
module TeamVsPlayer
|
|
12
|
+
# Result set name for overall comparison
|
|
13
|
+
# @return [String] the result set name
|
|
14
|
+
OVERALL = "Overall".freeze
|
|
15
|
+
|
|
16
|
+
# Result set name for on/off court comparison
|
|
17
|
+
# @return [String] the result set name
|
|
18
|
+
ON_OFF_COURT = "OnOffCourt".freeze
|
|
19
|
+
|
|
20
|
+
# Retrieves overall comparison statistics for team vs player
|
|
21
|
+
#
|
|
22
|
+
# @api public
|
|
23
|
+
# @example
|
|
24
|
+
# stats = NBA::TeamVsPlayer.overall(team: 1610612744, vs_player: 201566)
|
|
25
|
+
# stats.first.pts #=> 106.4
|
|
26
|
+
# @param team [Integer, Team] the team ID or Team object
|
|
27
|
+
# @param vs_player [Integer, Player] the vs player ID or Player object
|
|
28
|
+
# @param season [Integer] the season year
|
|
29
|
+
# @param season_type [String] the season type
|
|
30
|
+
# @param per_mode [String] the per mode
|
|
31
|
+
# @param client [Client] the API client to use
|
|
32
|
+
# @return [Collection] a collection of team vs player statistics
|
|
33
|
+
def self.overall(team:, vs_player:, season: Utils.current_season, season_type: "Regular Season",
|
|
34
|
+
per_mode: "PerGame", client: CLIENT)
|
|
35
|
+
options = {season_type: season_type, per_mode: per_mode, result_set: OVERALL}
|
|
36
|
+
fetch_stats(team, vs_player, season, options, client: client)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Retrieves on/off court comparison statistics for team vs player
|
|
40
|
+
#
|
|
41
|
+
# @api public
|
|
42
|
+
# @example
|
|
43
|
+
# stats = NBA::TeamVsPlayer.on_off_court(team: 1610612744, vs_player: 201566)
|
|
44
|
+
# stats.each { |s| puts "#{s.court_status}: #{s.pts}" }
|
|
45
|
+
# @param team [Integer, Team] the team ID or Team object
|
|
46
|
+
# @param vs_player [Integer, Player] the vs player ID or Player object
|
|
47
|
+
# @param season [Integer] the season year
|
|
48
|
+
# @param season_type [String] the season type
|
|
49
|
+
# @param per_mode [String] the per mode
|
|
50
|
+
# @param client [Client] the API client to use
|
|
51
|
+
# @return [Collection] a collection of team vs player statistics
|
|
52
|
+
def self.on_off_court(team:, vs_player:, season: Utils.current_season, season_type: "Regular Season",
|
|
53
|
+
per_mode: "PerGame", client: CLIENT)
|
|
54
|
+
options = {season_type: season_type, per_mode: per_mode, result_set: ON_OFF_COURT}
|
|
55
|
+
fetch_stats(team, vs_player, season, options, client: client)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Fetches team vs player statistics from the API
|
|
59
|
+
#
|
|
60
|
+
# @api private
|
|
61
|
+
# @return [Collection] the collection of statistics
|
|
62
|
+
def self.fetch_stats(team, vs_player, season, options, client:)
|
|
63
|
+
path = build_path(team, vs_player, season, options.fetch(:season_type), options.fetch(:per_mode))
|
|
64
|
+
response = client.get(path)
|
|
65
|
+
parse_response(response, options.fetch(:result_set))
|
|
66
|
+
end
|
|
67
|
+
private_class_method :fetch_stats
|
|
68
|
+
|
|
69
|
+
# Builds the API request path with all parameters
|
|
70
|
+
#
|
|
71
|
+
# @api private
|
|
72
|
+
# @return [String] the API request path
|
|
73
|
+
def self.build_path(team, vs_player, season, season_type, per_mode)
|
|
74
|
+
team_id = Utils.extract_id(team)
|
|
75
|
+
vs_player_id = Utils.extract_id(vs_player)
|
|
76
|
+
season_str = Utils.format_season(season)
|
|
77
|
+
"teamvsplayer?TeamID=#{team_id}&VsPlayerID=#{vs_player_id}&Season=#{season_str}" \
|
|
78
|
+
"&SeasonType=#{season_type}&PerMode=#{per_mode}&LeagueID=00"
|
|
79
|
+
end
|
|
80
|
+
private_class_method :build_path
|
|
81
|
+
|
|
82
|
+
# Parses the API response and extracts the result set
|
|
83
|
+
#
|
|
84
|
+
# @api private
|
|
85
|
+
# @return [Collection] the collection of statistics
|
|
86
|
+
def self.parse_response(response, result_set_name)
|
|
87
|
+
return Collection.new if response.nil? || response.empty?
|
|
88
|
+
|
|
89
|
+
data = JSON.parse(response)
|
|
90
|
+
result_set = find_result_set(data, result_set_name)
|
|
91
|
+
build_collection(result_set)
|
|
92
|
+
end
|
|
93
|
+
private_class_method :parse_response
|
|
94
|
+
|
|
95
|
+
# Finds the result set matching the given name
|
|
96
|
+
#
|
|
97
|
+
# @api private
|
|
98
|
+
# @return [Hash, nil] the result set hash or nil
|
|
99
|
+
def self.find_result_set(data, result_set_name)
|
|
100
|
+
result_sets = data["resultSets"]
|
|
101
|
+
return unless result_sets
|
|
102
|
+
|
|
103
|
+
result_sets.find { |rs| rs["name"].eql?(result_set_name) }
|
|
104
|
+
end
|
|
105
|
+
private_class_method :find_result_set
|
|
106
|
+
|
|
107
|
+
# Builds a collection from the result set data
|
|
108
|
+
#
|
|
109
|
+
# @api private
|
|
110
|
+
# @return [Collection] the collection of statistics
|
|
111
|
+
def self.build_collection(result_set)
|
|
112
|
+
return Collection.new unless result_set
|
|
113
|
+
|
|
114
|
+
headers = result_set["headers"]
|
|
115
|
+
rows = result_set["rowSet"]
|
|
116
|
+
return Collection.new unless headers && rows
|
|
117
|
+
|
|
118
|
+
Collection.new(rows.map { |row| build_team_vs_player_stat(headers.zip(row).to_h) })
|
|
119
|
+
end
|
|
120
|
+
private_class_method :build_collection
|
|
121
|
+
|
|
122
|
+
# Builds a stat object from the data hash
|
|
123
|
+
#
|
|
124
|
+
# @api private
|
|
125
|
+
# @return [TeamVsPlayerStat] the stat object
|
|
126
|
+
def self.build_team_vs_player_stat(data)
|
|
127
|
+
TeamVsPlayerStat.new(**identity_info(data), **stat_info(data))
|
|
128
|
+
end
|
|
129
|
+
private_class_method :build_team_vs_player_stat
|
|
130
|
+
|
|
131
|
+
# Extracts identity information from the data hash
|
|
132
|
+
#
|
|
133
|
+
# @api private
|
|
134
|
+
# @return [Hash] the identity attributes
|
|
135
|
+
def self.identity_info(data)
|
|
136
|
+
{team_id: data["TEAM_ID"], vs_player_id: data["VS_PLAYER_ID"],
|
|
137
|
+
court_status: data["COURT_STATUS"], gp: data["GP"], min: data["MIN"]}
|
|
138
|
+
end
|
|
139
|
+
private_class_method :identity_info
|
|
140
|
+
|
|
141
|
+
# Extracts stat information from the data hash
|
|
142
|
+
#
|
|
143
|
+
# @api private
|
|
144
|
+
# @return [Hash] the stat attributes
|
|
145
|
+
def self.stat_info(data)
|
|
146
|
+
{pts: data["PTS"], reb: data["REB"], ast: data["AST"], stl: data["STL"],
|
|
147
|
+
blk: data["BLK"], tov: data["TOV"], fg_pct: data["FG_PCT"], plus_minus: data["PLUS_MINUS"]}
|
|
148
|
+
end
|
|
149
|
+
private_class_method :stat_info
|
|
150
|
+
end
|
|
151
|
+
end
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
require "equalizer"
|
|
2
|
+
require "shale"
|
|
3
|
+
require_relative "players"
|
|
4
|
+
require_relative "teams"
|
|
5
|
+
|
|
6
|
+
module NBA
|
|
7
|
+
# Represents team vs player comparison statistics
|
|
8
|
+
#
|
|
9
|
+
# @api public
|
|
10
|
+
class TeamVsPlayerStat < Shale::Mapper
|
|
11
|
+
include Equalizer.new(:team_id, :vs_player_id)
|
|
12
|
+
|
|
13
|
+
# @!attribute [rw] team_id
|
|
14
|
+
# Returns the team ID
|
|
15
|
+
# @api public
|
|
16
|
+
# @example
|
|
17
|
+
# stat.team_id #=> 1610612744
|
|
18
|
+
# @return [Integer, nil] the team's ID
|
|
19
|
+
attribute :team_id, Shale::Type::Integer
|
|
20
|
+
|
|
21
|
+
# @!attribute [rw] vs_player_id
|
|
22
|
+
# Returns the vs player ID
|
|
23
|
+
# @api public
|
|
24
|
+
# @example
|
|
25
|
+
# stat.vs_player_id #=> 201566
|
|
26
|
+
# @return [Integer, nil] the vs player's ID
|
|
27
|
+
attribute :vs_player_id, Shale::Type::Integer
|
|
28
|
+
|
|
29
|
+
# @!attribute [rw] court_status
|
|
30
|
+
# Returns the on/off court status
|
|
31
|
+
# @api public
|
|
32
|
+
# @example
|
|
33
|
+
# stat.court_status #=> "On"
|
|
34
|
+
# @return [String, nil] on/off court status
|
|
35
|
+
attribute :court_status, Shale::Type::String
|
|
36
|
+
|
|
37
|
+
# @!attribute [rw] gp
|
|
38
|
+
# Returns games played
|
|
39
|
+
# @api public
|
|
40
|
+
# @example
|
|
41
|
+
# stat.gp #=> 24
|
|
42
|
+
# @return [Integer, nil] games played
|
|
43
|
+
attribute :gp, Shale::Type::Integer
|
|
44
|
+
|
|
45
|
+
# @!attribute [rw] min
|
|
46
|
+
# Returns minutes played
|
|
47
|
+
# @api public
|
|
48
|
+
# @example
|
|
49
|
+
# stat.min #=> 32.5
|
|
50
|
+
# @return [Float, nil] minutes played
|
|
51
|
+
attribute :min, Shale::Type::Float
|
|
52
|
+
|
|
53
|
+
# @!attribute [rw] pts
|
|
54
|
+
# Returns points
|
|
55
|
+
# @api public
|
|
56
|
+
# @example
|
|
57
|
+
# stat.pts #=> 26.4
|
|
58
|
+
# @return [Float, nil] points
|
|
59
|
+
attribute :pts, Shale::Type::Float
|
|
60
|
+
|
|
61
|
+
# @!attribute [rw] reb
|
|
62
|
+
# Returns rebounds
|
|
63
|
+
# @api public
|
|
64
|
+
# @example
|
|
65
|
+
# stat.reb #=> 5.7
|
|
66
|
+
# @return [Float, nil] rebounds
|
|
67
|
+
attribute :reb, Shale::Type::Float
|
|
68
|
+
|
|
69
|
+
# @!attribute [rw] ast
|
|
70
|
+
# Returns assists
|
|
71
|
+
# @api public
|
|
72
|
+
# @example
|
|
73
|
+
# stat.ast #=> 6.1
|
|
74
|
+
# @return [Float, nil] assists
|
|
75
|
+
attribute :ast, Shale::Type::Float
|
|
76
|
+
|
|
77
|
+
# @!attribute [rw] stl
|
|
78
|
+
# Returns steals
|
|
79
|
+
# @api public
|
|
80
|
+
# @example
|
|
81
|
+
# stat.stl #=> 1.2
|
|
82
|
+
# @return [Float, nil] steals
|
|
83
|
+
attribute :stl, Shale::Type::Float
|
|
84
|
+
|
|
85
|
+
# @!attribute [rw] blk
|
|
86
|
+
# Returns blocks
|
|
87
|
+
# @api public
|
|
88
|
+
# @example
|
|
89
|
+
# stat.blk #=> 0.3
|
|
90
|
+
# @return [Float, nil] blocks
|
|
91
|
+
attribute :blk, Shale::Type::Float
|
|
92
|
+
|
|
93
|
+
# @!attribute [rw] tov
|
|
94
|
+
# Returns turnovers
|
|
95
|
+
# @api public
|
|
96
|
+
# @example
|
|
97
|
+
# stat.tov #=> 3.1
|
|
98
|
+
# @return [Float, nil] turnovers
|
|
99
|
+
attribute :tov, Shale::Type::Float
|
|
100
|
+
|
|
101
|
+
# @!attribute [rw] fg_pct
|
|
102
|
+
# Returns field goal percentage
|
|
103
|
+
# @api public
|
|
104
|
+
# @example
|
|
105
|
+
# stat.fg_pct #=> 0.467
|
|
106
|
+
# @return [Float, nil] field goal percentage
|
|
107
|
+
attribute :fg_pct, Shale::Type::Float
|
|
108
|
+
|
|
109
|
+
# @!attribute [rw] plus_minus
|
|
110
|
+
# Returns plus/minus
|
|
111
|
+
# @api public
|
|
112
|
+
# @example
|
|
113
|
+
# stat.plus_minus #=> 8.5
|
|
114
|
+
# @return [Float, nil] plus/minus
|
|
115
|
+
attribute :plus_minus, Shale::Type::Float
|
|
116
|
+
|
|
117
|
+
# Returns the team
|
|
118
|
+
#
|
|
119
|
+
# @api public
|
|
120
|
+
# @example
|
|
121
|
+
# stat.team #=> #<NBA::Team id=1610612744 ...>
|
|
122
|
+
# @return [Team, nil] the team object
|
|
123
|
+
def team
|
|
124
|
+
Teams.find(team_id)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Returns the vs player
|
|
128
|
+
#
|
|
129
|
+
# @api public
|
|
130
|
+
# @example
|
|
131
|
+
# stat.vs_player #=> #<NBA::Player id=201566 ...>
|
|
132
|
+
# @return [Player, nil] the vs player object
|
|
133
|
+
def vs_player
|
|
134
|
+
Players.find(vs_player_id)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# Returns whether the player is on court
|
|
138
|
+
#
|
|
139
|
+
# @api public
|
|
140
|
+
# @example
|
|
141
|
+
# stat.on_court? #=> true
|
|
142
|
+
# @return [Boolean] true if player is on court
|
|
143
|
+
def on_court?
|
|
144
|
+
court_status.eql?("On")
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Returns whether the player is off court
|
|
148
|
+
#
|
|
149
|
+
# @api public
|
|
150
|
+
# @example
|
|
151
|
+
# stat.off_court? #=> true
|
|
152
|
+
# @return [Boolean] true if player is off court
|
|
153
|
+
def off_court?
|
|
154
|
+
court_status.eql?("Off")
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
require "equalizer"
|
|
2
|
+
require "shale"
|
|
3
|
+
|
|
4
|
+
module NBA
|
|
5
|
+
# Represents a year/season a team participated in the league
|
|
6
|
+
class TeamYear < Shale::Mapper
|
|
7
|
+
include Equalizer.new(:team_id, :year)
|
|
8
|
+
|
|
9
|
+
# @!attribute [rw] team_id
|
|
10
|
+
# Returns the team ID
|
|
11
|
+
# @api public
|
|
12
|
+
# @example
|
|
13
|
+
# team_year.team_id #=> 1610612744
|
|
14
|
+
# @return [Integer] the team ID
|
|
15
|
+
attribute :team_id, Shale::Type::Integer
|
|
16
|
+
|
|
17
|
+
# @!attribute [rw] year
|
|
18
|
+
# Returns the year
|
|
19
|
+
# @api public
|
|
20
|
+
# @example
|
|
21
|
+
# team_year.year #=> 2024
|
|
22
|
+
# @return [Integer] the year
|
|
23
|
+
attribute :year, Shale::Type::Integer
|
|
24
|
+
|
|
25
|
+
# @!attribute [rw] abbreviation
|
|
26
|
+
# Returns the team abbreviation for that year
|
|
27
|
+
# @api public
|
|
28
|
+
# @example
|
|
29
|
+
# team_year.abbreviation #=> "GSW"
|
|
30
|
+
# @return [String] the abbreviation
|
|
31
|
+
attribute :abbreviation, Shale::Type::String
|
|
32
|
+
|
|
33
|
+
# Returns the team object
|
|
34
|
+
#
|
|
35
|
+
# @api public
|
|
36
|
+
# @example
|
|
37
|
+
# team_year.team #=> #<NBA::Team>
|
|
38
|
+
# @return [Team, nil] the team object
|
|
39
|
+
def team
|
|
40
|
+
Teams.find(team_id)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Returns the season string
|
|
44
|
+
#
|
|
45
|
+
# @api public
|
|
46
|
+
# @example
|
|
47
|
+
# team_year.season #=> "2024-25"
|
|
48
|
+
# @return [String, nil] the season string
|
|
49
|
+
def season
|
|
50
|
+
return unless year
|
|
51
|
+
|
|
52
|
+
Utils.format_season(year)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|