stattleship-ruby 0.1.19
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 +7 -0
- data/.gitignore +12 -0
- data/.rspec +2 -0
- data/.rubocop.yml +263 -0
- data/.ruby-version +1 -0
- data/.travis.yml +8 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/Gemfile +15 -0
- data/LICENSE +1 -0
- data/README.md +75 -0
- data/Rakefile +1 -0
- data/bin/console +7 -0
- data/bin/game_log_officials +32 -0
- data/bin/game_logs +69 -0
- data/bin/games +42 -0
- data/bin/in_progress +19 -0
- data/bin/injuries +18 -0
- data/bin/officials +42 -0
- data/bin/players +45 -0
- data/bin/scoreboard +43 -0
- data/bin/setup +7 -0
- data/bin/stat_leaders +25 -0
- data/bin/team_game_logs +35 -0
- data/bin/teams +29 -0
- data/bin/top_stats +25 -0
- data/bin/total_player_stat +33 -0
- data/bin/total_team_stat +22 -0
- data/examples/README.md +118 -0
- data/examples/baseball_feats.rb +35 -0
- data/examples/baseball_games.rb +32 -0
- data/examples/baseball_player_game_logs.rb +33 -0
- data/examples/baseball_stat_leaders.rb +30 -0
- data/examples/basketball_game_logs.rb +33 -0
- data/examples/basketball_injuries.rb +36 -0
- data/examples/basketball_season_player_performance_rankings.rb +31 -0
- data/examples/basketball_stat_leaders.rb +40 -0
- data/examples/basketball_team_game_logs.rb +38 -0
- data/examples/basketball_top_stats.rb +43 -0
- data/examples/basketball_winning_streaks.rb +27 -0
- data/examples/bears_team_game_logs.rb +46 -0
- data/examples/football_feats.rb +49 -0
- data/examples/football_game_logs.rb +40 -0
- data/examples/football_players.rb +43 -0
- data/examples/football_stats.rb +50 -0
- data/examples/football_total_player_stat.rb +32 -0
- data/examples/hockey_games.rb +56 -0
- data/examples/hockey_penalties.rb +47 -0
- data/examples/hockey_scoring_plays.rb +55 -0
- data/examples/hockey_team_ranked_streaks.rb +27 -0
- data/examples/hockey_teams.rb +54 -0
- data/examples/hockey_total_team_stat.rb +32 -0
- data/examples/sample.env +2 -0
- data/lib/stattleship.rb +117 -0
- data/lib/stattleship/baseball_feats.rb +15 -0
- data/lib/stattleship/baseball_game_logs.rb +159 -0
- data/lib/stattleship/baseball_games.rb +15 -0
- data/lib/stattleship/baseball_injuries.rb +15 -0
- data/lib/stattleship/baseball_penalties.rb +15 -0
- data/lib/stattleship/baseball_players.rb +15 -0
- data/lib/stattleship/baseball_scoring_plays.rb +15 -0
- data/lib/stattleship/baseball_stat_leaders.rb +15 -0
- data/lib/stattleship/baseball_stats.rb +15 -0
- data/lib/stattleship/baseball_team_game_logs.rb +142 -0
- data/lib/stattleship/baseball_team_outcome_streaks.rb +15 -0
- data/lib/stattleship/baseball_teams.rb +15 -0
- data/lib/stattleship/baseball_top_stats.rb +15 -0
- data/lib/stattleship/baseball_total_player_stat.rb +15 -0
- data/lib/stattleship/baseball_total_team_stat.rb +15 -0
- data/lib/stattleship/basketball_feats.rb +15 -0
- data/lib/stattleship/basketball_game_logs.rb +111 -0
- data/lib/stattleship/basketball_games.rb +15 -0
- data/lib/stattleship/basketball_injuries.rb +15 -0
- data/lib/stattleship/basketball_penalties.rb +15 -0
- data/lib/stattleship/basketball_players.rb +15 -0
- data/lib/stattleship/basketball_scoring_plays.rb +15 -0
- data/lib/stattleship/basketball_stat_leaders.rb +15 -0
- data/lib/stattleship/basketball_stats.rb +15 -0
- data/lib/stattleship/basketball_team_game_logs.rb +113 -0
- data/lib/stattleship/basketball_team_outcome_streaks.rb +15 -0
- data/lib/stattleship/basketball_teams.rb +15 -0
- data/lib/stattleship/basketball_top_stats.rb +15 -0
- data/lib/stattleship/basketball_total_player_stat.rb +15 -0
- data/lib/stattleship/basketball_total_team_stat.rb +15 -0
- data/lib/stattleship/client/client.rb +101 -0
- data/lib/stattleship/client/configuration.rb +42 -0
- data/lib/stattleship/endpoint.rb +208 -0
- data/lib/stattleship/feats.rb +150 -0
- data/lib/stattleship/football_feats.rb +15 -0
- data/lib/stattleship/football_game_logs.rb +255 -0
- data/lib/stattleship/football_games.rb +15 -0
- data/lib/stattleship/football_injuries.rb +15 -0
- data/lib/stattleship/football_penalties.rb +15 -0
- data/lib/stattleship/football_players.rb +15 -0
- data/lib/stattleship/football_scoring_plays.rb +15 -0
- data/lib/stattleship/football_stat_leaders.rb +15 -0
- data/lib/stattleship/football_stats.rb +15 -0
- data/lib/stattleship/football_team_game_logs.rb +176 -0
- data/lib/stattleship/football_team_outcome_streaks.rb +15 -0
- data/lib/stattleship/football_teams.rb +15 -0
- data/lib/stattleship/football_top_stats.rb +15 -0
- data/lib/stattleship/football_total_player_stat.rb +15 -0
- data/lib/stattleship/football_total_team_stat.rb +15 -0
- data/lib/stattleship/formatters/stat_formatter.rb +28 -0
- data/lib/stattleship/game_logs.rb +97 -0
- data/lib/stattleship/games.rb +38 -0
- data/lib/stattleship/hockey_feats.rb +15 -0
- data/lib/stattleship/hockey_game_logs.rb +107 -0
- data/lib/stattleship/hockey_games.rb +15 -0
- data/lib/stattleship/hockey_injuries.rb +15 -0
- data/lib/stattleship/hockey_penalties.rb +32 -0
- data/lib/stattleship/hockey_players.rb +15 -0
- data/lib/stattleship/hockey_scoring_plays.rb +15 -0
- data/lib/stattleship/hockey_stat_leaders.rb +15 -0
- data/lib/stattleship/hockey_stats.rb +15 -0
- data/lib/stattleship/hockey_team_game_logs.rb +128 -0
- data/lib/stattleship/hockey_team_outcome_streaks.rb +15 -0
- data/lib/stattleship/hockey_teams.rb +15 -0
- data/lib/stattleship/hockey_top_stats.rb +15 -0
- data/lib/stattleship/hockey_total_player_stat.rb +15 -0
- data/lib/stattleship/hockey_total_team_stat.rb +15 -0
- data/lib/stattleship/injuries.rb +32 -0
- data/lib/stattleship/models.rb +19 -0
- data/lib/stattleship/models/game.rb +360 -0
- data/lib/stattleship/models/injury.rb +22 -0
- data/lib/stattleship/models/league.rb +35 -0
- data/lib/stattleship/models/official.rb +20 -0
- data/lib/stattleship/models/penalty.rb +133 -0
- data/lib/stattleship/models/player.rb +124 -0
- data/lib/stattleship/models/playing_position.rb +17 -0
- data/lib/stattleship/models/ranking.rb +96 -0
- data/lib/stattleship/models/scoring_play.rb +201 -0
- data/lib/stattleship/models/scoring_player.rb +22 -0
- data/lib/stattleship/models/season.rb +18 -0
- data/lib/stattleship/models/team.rb +78 -0
- data/lib/stattleship/models/team_outcome_streak.rb +88 -0
- data/lib/stattleship/models/venue.rb +32 -0
- data/lib/stattleship/params.rb +102 -0
- data/lib/stattleship/params/baseball_feats_params.rb +6 -0
- data/lib/stattleship/params/baseball_game_logs_params.rb +6 -0
- data/lib/stattleship/params/baseball_games_params.rb +6 -0
- data/lib/stattleship/params/baseball_injuries_params.rb +6 -0
- data/lib/stattleship/params/baseball_penalties_params.rb +6 -0
- data/lib/stattleship/params/baseball_players_params.rb +6 -0
- data/lib/stattleship/params/baseball_scoring_plays_params.rb +6 -0
- data/lib/stattleship/params/baseball_stat_leaders_params.rb +6 -0
- data/lib/stattleship/params/baseball_stats_params.rb +6 -0
- data/lib/stattleship/params/baseball_team_game_logs_params.rb +6 -0
- data/lib/stattleship/params/baseball_team_outcome_streaks_params.rb +9 -0
- data/lib/stattleship/params/baseball_team_stats_params.rb +10 -0
- data/lib/stattleship/params/baseball_teams_params.rb +6 -0
- data/lib/stattleship/params/baseball_top_stats_params.rb +6 -0
- data/lib/stattleship/params/baseball_total_player_stat_params.rb +6 -0
- data/lib/stattleship/params/baseball_total_team_stat_params.rb +11 -0
- data/lib/stattleship/params/basketball_feats_params.rb +6 -0
- data/lib/stattleship/params/basketball_game_logs_params.rb +6 -0
- data/lib/stattleship/params/basketball_games_params.rb +6 -0
- data/lib/stattleship/params/basketball_injuries_params.rb +6 -0
- data/lib/stattleship/params/basketball_penalties_params.rb +6 -0
- data/lib/stattleship/params/basketball_players_params.rb +6 -0
- data/lib/stattleship/params/basketball_scoring_plays_params.rb +6 -0
- data/lib/stattleship/params/basketball_stat_leaders_params.rb +6 -0
- data/lib/stattleship/params/basketball_stats_params.rb +6 -0
- data/lib/stattleship/params/basketball_team_game_logs_params.rb +6 -0
- data/lib/stattleship/params/basketball_team_outcome_streaks_params.rb +9 -0
- data/lib/stattleship/params/basketball_team_stats_params.rb +10 -0
- data/lib/stattleship/params/basketball_teams_params.rb +6 -0
- data/lib/stattleship/params/basketball_top_stats_params.rb +6 -0
- data/lib/stattleship/params/basketball_total_player_stat_params.rb +6 -0
- data/lib/stattleship/params/basketball_total_team_stat_params.rb +11 -0
- data/lib/stattleship/params/feats_params.rb +23 -0
- data/lib/stattleship/params/football_feats_params.rb +6 -0
- data/lib/stattleship/params/football_game_logs_params.rb +11 -0
- data/lib/stattleship/params/football_games_params.rb +6 -0
- data/lib/stattleship/params/football_injuries_params.rb +6 -0
- data/lib/stattleship/params/football_penalties_params.rb +6 -0
- data/lib/stattleship/params/football_players_params.rb +6 -0
- data/lib/stattleship/params/football_scoring_plays_params.rb +6 -0
- data/lib/stattleship/params/football_stat_leaders_params.rb +6 -0
- data/lib/stattleship/params/football_stats_params.rb +6 -0
- data/lib/stattleship/params/football_team_game_logs_params.rb +6 -0
- data/lib/stattleship/params/football_team_outcome_streaks_params.rb +9 -0
- data/lib/stattleship/params/football_team_stats_params.rb +10 -0
- data/lib/stattleship/params/football_teams_params.rb +6 -0
- data/lib/stattleship/params/football_top_stats_params.rb +6 -0
- data/lib/stattleship/params/football_total_player_stat_params.rb +6 -0
- data/lib/stattleship/params/football_total_team_stat_params.rb +11 -0
- data/lib/stattleship/params/game_logs_params.rb +13 -0
- data/lib/stattleship/params/game_time_params.rb +17 -0
- data/lib/stattleship/params/games_params.rb +13 -0
- data/lib/stattleship/params/hockey_feats_params.rb +6 -0
- data/lib/stattleship/params/hockey_game_logs_params.rb +6 -0
- data/lib/stattleship/params/hockey_games_params.rb +6 -0
- data/lib/stattleship/params/hockey_injuries_params.rb +6 -0
- data/lib/stattleship/params/hockey_penalties_params.rb +6 -0
- data/lib/stattleship/params/hockey_players_params.rb +6 -0
- data/lib/stattleship/params/hockey_scoring_plays_params.rb +6 -0
- data/lib/stattleship/params/hockey_stat_leaders_params.rb +6 -0
- data/lib/stattleship/params/hockey_stats_params.rb +6 -0
- data/lib/stattleship/params/hockey_team_game_logs_params.rb +6 -0
- data/lib/stattleship/params/hockey_team_outcome_streaks_params.rb +9 -0
- data/lib/stattleship/params/hockey_team_stats_params.rb +10 -0
- data/lib/stattleship/params/hockey_teams_params.rb +6 -0
- data/lib/stattleship/params/hockey_top_stats_params.rb +6 -0
- data/lib/stattleship/params/hockey_total_player_stat_params.rb +6 -0
- data/lib/stattleship/params/hockey_total_team_stat_params.rb +11 -0
- data/lib/stattleship/params/injuries_params.rb +11 -0
- data/lib/stattleship/params/penalties_params.rb +11 -0
- data/lib/stattleship/params/players_params.rb +12 -0
- data/lib/stattleship/params/query_params.rb +50 -0
- data/lib/stattleship/params/rankings_params.rb +15 -0
- data/lib/stattleship/params/scoring_plays_params.rb +12 -0
- data/lib/stattleship/params/stat_leaders_params.rb +17 -0
- data/lib/stattleship/params/stats_params.rb +17 -0
- data/lib/stattleship/params/team_game_logs_params.rb +12 -0
- data/lib/stattleship/params/team_outcome_streaks_params.rb +24 -0
- data/lib/stattleship/params/teams_params.rb +9 -0
- data/lib/stattleship/params/top_stats_params.rb +17 -0
- data/lib/stattleship/params/total_player_stat_params.rb +17 -0
- data/lib/stattleship/params/total_team_stat_params.rb +18 -0
- data/lib/stattleship/penalties.rb +26 -0
- data/lib/stattleship/players.rb +26 -0
- data/lib/stattleship/rankings.rb +51 -0
- data/lib/stattleship/scoring_plays.rb +30 -0
- data/lib/stattleship/stat_leaders.rb +43 -0
- data/lib/stattleship/stats.rb +76 -0
- data/lib/stattleship/team_game_logs.rb +90 -0
- data/lib/stattleship/team_outcome_streaks.rb +28 -0
- data/lib/stattleship/teams.rb +20 -0
- data/lib/stattleship/top_stats.rb +58 -0
- data/lib/stattleship/total_player_stat.rb +37 -0
- data/lib/stattleship/total_team_stat.rb +30 -0
- data/lib/stattleship/validators.rb +33 -0
- data/lib/stattleship/validators/base_validator.rb +117 -0
- data/lib/stattleship/validators/birth_date_validator.rb +9 -0
- data/lib/stattleship/validators/current_validator.rb +9 -0
- data/lib/stattleship/validators/feat_validator.rb +9 -0
- data/lib/stattleship/validators/game_id_validator.rb +9 -0
- data/lib/stattleship/validators/interval_type_validator.rb +9 -0
- data/lib/stattleship/validators/level_up_validator.rb +9 -0
- data/lib/stattleship/validators/level_validator.rb +16 -0
- data/lib/stattleship/validators/on_validator.rb +9 -0
- data/lib/stattleship/validators/outcome_validator.rb +9 -0
- data/lib/stattleship/validators/page_validator.rb +9 -0
- data/lib/stattleship/validators/penalty_validator.rb +9 -0
- data/lib/stattleship/validators/per_page_validator.rb +9 -0
- data/lib/stattleship/validators/place_validator.rb +9 -0
- data/lib/stattleship/validators/player_id_validator.rb +9 -0
- data/lib/stattleship/validators/rank_validator.rb +9 -0
- data/lib/stattleship/validators/ranked_validator.rb +9 -0
- data/lib/stattleship/validators/ranking_validator.rb +9 -0
- data/lib/stattleship/validators/scoring_method_validator.rb +9 -0
- data/lib/stattleship/validators/scoring_type_validator.rb +9 -0
- data/lib/stattleship/validators/season_id_validator.rb +9 -0
- data/lib/stattleship/validators/since_validator.rb +9 -0
- data/lib/stattleship/validators/stat_validator.rb +23 -0
- data/lib/stattleship/validators/status_validator.rb +16 -0
- data/lib/stattleship/validators/streak_length_validator.rb +9 -0
- data/lib/stattleship/validators/team_id_validator.rb +9 -0
- data/lib/stattleship/validators/type_validator.rb +9 -0
- data/lib/stattleship/validators/week_validator.rb +9 -0
- data/lib/stattleship/version.rb +5 -0
- data/sample.env +1 -0
- data/stattleship-ruby.gemspec +33 -0
- metadata +503 -0
@@ -0,0 +1,15 @@
|
|
1
|
+
module Stattleship
|
2
|
+
class BasketballInjuries < Stattleship::Injuries
|
3
|
+
BASKETBALL_INJURIES = 'basketball/nba/injuries'.freeze
|
4
|
+
|
5
|
+
def self.fetch(params:)
|
6
|
+
super(path: BASKETBALL_INJURIES,
|
7
|
+
params: params)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module BasketballInjuriesRepresenter
|
12
|
+
include Roar::JSON
|
13
|
+
include InjuriesRepresenter
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Stattleship
|
2
|
+
class BasketballPenalties < Stattleship::Penalties
|
3
|
+
BASKETBALL_PENALTIES = 'basketball/nba/penalties'.freeze
|
4
|
+
|
5
|
+
def self.fetch(params:)
|
6
|
+
super(path: BASKETBALL_PENALTIES,
|
7
|
+
params: params)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module BasketballPenaltiesRepresenter
|
12
|
+
include Roar::JSON
|
13
|
+
include PenaltiesRepresenter
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Stattleship
|
2
|
+
class BasketballPlayers < Stattleship::Players
|
3
|
+
BASKETBALL_PLAYERS = 'basketball/nba/players'.freeze
|
4
|
+
|
5
|
+
def self.fetch(params:)
|
6
|
+
super(path: BASKETBALL_PLAYERS,
|
7
|
+
params: params)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module BasketballPlayersRepresenter
|
12
|
+
include Roar::JSON
|
13
|
+
include PlayersRepresenter
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Stattleship
|
2
|
+
class BasketballScoringPlays < Stattleship::ScoringPlays
|
3
|
+
BASKETBALL_SCORING_PLAYS = 'basketball/nba/scoring_plays'.freeze
|
4
|
+
|
5
|
+
def self.fetch(params:)
|
6
|
+
super(path: BASKETBALL_SCORING_PLAYS,
|
7
|
+
params: params)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module BasketballScoringPlaysRepresenter
|
12
|
+
include Roar::JSON
|
13
|
+
include ScoringPlaysRepresenter
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Stattleship
|
2
|
+
class BasketballStatLeaders < Stattleship::StatLeaders
|
3
|
+
BASKETBALL_STAT_LEADERS = 'basketball/nba/stat_leaders'.freeze
|
4
|
+
|
5
|
+
def self.fetch(params:)
|
6
|
+
super(path: BASKETBALL_STAT_LEADERS,
|
7
|
+
params: params)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module BasketballStatLeadersRepresenter
|
12
|
+
include Roar::JSON
|
13
|
+
include StatLeadersRepresenter
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Stattleship
|
2
|
+
class BasketballStats < Stattleship::Stats
|
3
|
+
BASKETBALL_STATS = 'basketball/nba/stats'.freeze
|
4
|
+
|
5
|
+
def self.fetch(params:)
|
6
|
+
super(path: BASKETBALL_STATS,
|
7
|
+
params: params)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module BasketballStatsRepresenter
|
12
|
+
include Roar::JSON
|
13
|
+
include StatsRepresenter
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
module Stattleship
|
2
|
+
class BasketballTeamGameLog < Stattleship::TeamGameLog
|
3
|
+
def stats
|
4
|
+
[
|
5
|
+
"#{field_goals_made.to_i} FGM",
|
6
|
+
"#{(field_goals_percentage.to_f * 100).round(1)} FG%",
|
7
|
+
"#{points_scored_total.to_i} PTS",
|
8
|
+
"#{rebounds_defensive.to_i} DRB",
|
9
|
+
"#{rebounds_offensive.to_i} ORB",
|
10
|
+
"#{rebounds_total} REB"
|
11
|
+
]
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_sentence
|
15
|
+
"#{team_name} #{stats.join(', ')} (#{game.name})"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class BasketballTeamGameLogs < Stattleship::TeamGameLogs
|
20
|
+
BASKETBALL_TEAM_GAME_LOGS = 'basketball/nba/team_game_logs'.freeze
|
21
|
+
|
22
|
+
def self.fetch(params:)
|
23
|
+
super(path: BASKETBALL_TEAM_GAME_LOGS,
|
24
|
+
params: params)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
module BasketballTeamGameLogsRepresenter
|
29
|
+
include Roar::JSON
|
30
|
+
include Roar::Coercion
|
31
|
+
include Stattleship::TeamGameLogsRepresenter
|
32
|
+
include Virtus.model
|
33
|
+
|
34
|
+
collection :team_game_logs, class: Stattleship::BasketballTeamGameLog do
|
35
|
+
|
36
|
+
[
|
37
|
+
:away_team_outcome,
|
38
|
+
:home_team_outcome,
|
39
|
+
:team_outcome,
|
40
|
+
:opponent_outcome,
|
41
|
+
].each do |attribute|
|
42
|
+
property attribute
|
43
|
+
end
|
44
|
+
|
45
|
+
[
|
46
|
+
:field_goals_percentage,
|
47
|
+
:free_throws_percentage,
|
48
|
+
:three_pointers_percentage,
|
49
|
+
].each do |attribute|
|
50
|
+
property attribute, type: BigDecimal
|
51
|
+
end
|
52
|
+
|
53
|
+
[
|
54
|
+
:away_team_score,
|
55
|
+
:home_team_score,
|
56
|
+
:team_score,
|
57
|
+
:opponent_score,
|
58
|
+
:assists_total,
|
59
|
+
:blocks_total,
|
60
|
+
:coach_technical_fouls,
|
61
|
+
:field_goals_attempted,
|
62
|
+
:field_goals_made,
|
63
|
+
:free_throws_attempted,
|
64
|
+
:free_throws_made,
|
65
|
+
:personal_fouls,
|
66
|
+
:points_biggest_lead,
|
67
|
+
:points_fast_break,
|
68
|
+
:points_highest,
|
69
|
+
:points_in_paint,
|
70
|
+
:points_overtime,
|
71
|
+
:points_overtime_1,
|
72
|
+
:points_overtime_2,
|
73
|
+
:points_overtime_3,
|
74
|
+
:points_overtime_4,
|
75
|
+
:points_overtime_5,
|
76
|
+
:points_quarter_1,
|
77
|
+
:points_quarter_2,
|
78
|
+
:points_quarter_3,
|
79
|
+
:points_quarter_4,
|
80
|
+
:points_scored_off_turnovers,
|
81
|
+
:points_scored_total,
|
82
|
+
:points_unanswered,
|
83
|
+
:rebounds_defensive,
|
84
|
+
:rebounds_offensive,
|
85
|
+
:rebounds_total,
|
86
|
+
:steals_total,
|
87
|
+
:team_rebounds_total,
|
88
|
+
:team_turnovers_total,
|
89
|
+
:technical_fouls,
|
90
|
+
:three_pointers_attempted,
|
91
|
+
:three_pointers_made,
|
92
|
+
:turnovers_total,
|
93
|
+
].each do |attribute|
|
94
|
+
property attribute, type: Integer
|
95
|
+
end
|
96
|
+
|
97
|
+
[
|
98
|
+
:is_home_team,
|
99
|
+
:is_away_team,
|
100
|
+
].each do |attribute|
|
101
|
+
property attribute, type: Boolean, default: false
|
102
|
+
end
|
103
|
+
|
104
|
+
[
|
105
|
+
:game_id,
|
106
|
+
:opponent_id,
|
107
|
+
:team_id,
|
108
|
+
].each do |relationship|
|
109
|
+
property relationship
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Stattleship
|
2
|
+
class BasketballTeamOutcomeStreaks < Stattleship::TeamOutcomeStreaks
|
3
|
+
BASKETBALL_TEAM_OUTCOME_STREAKS = 'basketball/nba/team_outcome_streaks'.freeze
|
4
|
+
|
5
|
+
def self.fetch(params:)
|
6
|
+
super(path: BASKETBALL_TEAM_OUTCOME_STREAKS,
|
7
|
+
params: params)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module BasketballTeamOutcomeStreaksRepresenter
|
12
|
+
include Roar::JSON
|
13
|
+
include TeamOutcomeStreaksRepresenter
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Stattleship
|
2
|
+
class BasketballTeams < Stattleship::Teams
|
3
|
+
BASKETBALL_TEAMS = 'basketball/nba/teams'.freeze
|
4
|
+
|
5
|
+
def self.fetch(params:)
|
6
|
+
super(path: BASKETBALL_TEAMS,
|
7
|
+
params: params)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module BasketballTeamsRepresenter
|
12
|
+
include Roar::JSON
|
13
|
+
include TeamsRepresenter
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Stattleship
|
2
|
+
class BasketballTopStats < Stattleship::TopStats
|
3
|
+
BASKETBALL_TOP_STATS = 'basketball/nba/top_stats'.freeze
|
4
|
+
|
5
|
+
def self.fetch(params:)
|
6
|
+
super(path: BASKETBALL_TOP_STATS,
|
7
|
+
params: params)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module BasketballTopStatsRepresenter
|
12
|
+
include Roar::JSON
|
13
|
+
include TopStatsRepresenter
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Stattleship
|
2
|
+
class BasketballTotalPlayerStat < Stattleship::TotalPlayerStat
|
3
|
+
BASKETBALL_TOTAL_PLAYER_STAT = 'basketball/nba/total_stats'.freeze
|
4
|
+
|
5
|
+
def self.fetch(params:)
|
6
|
+
super(path: BASKETBALL_TOTAL_PLAYER_STAT,
|
7
|
+
params: params)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module BasketballTotalPlayerStatRepresenter
|
12
|
+
include Roar::JSON
|
13
|
+
include TotalPlayerStatRepresenter
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Stattleship
|
2
|
+
class BasketballTotalTeamStat < Stattleship::TotalTeamStat
|
3
|
+
BASKETBALL_TOTAL_TEAM_STAT = 'basketball/nba/total_stats'.freeze
|
4
|
+
|
5
|
+
def self.fetch(params:)
|
6
|
+
super(path: BASKETBALL_TOTAL_TEAM_STAT,
|
7
|
+
params: params)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module BasketballTotalTeamStatRepresenter
|
12
|
+
include Roar::JSON
|
13
|
+
include TotalTeamStatRepresenter
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
module Stattleship
|
2
|
+
class Client
|
3
|
+
def initialize(path:,
|
4
|
+
query: nil,
|
5
|
+
token: Stattleship.configuration.api_token)
|
6
|
+
@base_uri = Stattleship.configuration.base_uri.freeze
|
7
|
+
@path = path
|
8
|
+
@query = query
|
9
|
+
@token = token
|
10
|
+
end
|
11
|
+
|
12
|
+
def headers
|
13
|
+
{
|
14
|
+
'Accept' => 'application/vnd.stattleship.com; version=1',
|
15
|
+
'Authorization' => "Token token=#{token}",
|
16
|
+
'Content-Type' => 'application/json',
|
17
|
+
'User-Agent' =>
|
18
|
+
"Stattleship-Ruby/#{Stattleship::Ruby::VERSION} (#{RUBY_PLATFORM})"
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
def fetch
|
23
|
+
Stattleship.configuration.http.request(endpoint)
|
24
|
+
rescue StandardError => e
|
25
|
+
puts "HTTP Request failed (#{e.message})"
|
26
|
+
raise e
|
27
|
+
end
|
28
|
+
|
29
|
+
def paginate(model:)
|
30
|
+
data = []
|
31
|
+
response = fetch
|
32
|
+
|
33
|
+
while keep_fetching?(response: response)
|
34
|
+
data << build(model: model, response: response)
|
35
|
+
|
36
|
+
if next_url(response: response)
|
37
|
+
response = fetch_next_url
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
data.flatten
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
attr_reader :base_uri, :path, :query, :token
|
47
|
+
|
48
|
+
def build(model:, response:)
|
49
|
+
builder = model.new
|
50
|
+
builder.extend(Kernel.const_get("#{builder.class.name}Representer"))
|
51
|
+
builder.from_json(response.body).data
|
52
|
+
end
|
53
|
+
|
54
|
+
def keep_fetching?(response:)
|
55
|
+
response.is_a?(Net::HTTPSuccess) && @url
|
56
|
+
end
|
57
|
+
|
58
|
+
def fetch_next_url
|
59
|
+
sleep(0.25)
|
60
|
+
|
61
|
+
response = fetch
|
62
|
+
|
63
|
+
unless response.is_a?(Net::HTTPSuccess)
|
64
|
+
@url = nil
|
65
|
+
end
|
66
|
+
|
67
|
+
response
|
68
|
+
end
|
69
|
+
|
70
|
+
def next_url(response:)
|
71
|
+
@url = nil
|
72
|
+
|
73
|
+
headers = response.header.to_hash
|
74
|
+
links = (headers['link'] || []).first
|
75
|
+
|
76
|
+
LinkHeader.parse(links).links.map do |link|
|
77
|
+
if link.attrs['rel'] == 'next'
|
78
|
+
@url = link.href
|
79
|
+
return true
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
false
|
84
|
+
end
|
85
|
+
|
86
|
+
def url
|
87
|
+
@url ||= begin
|
88
|
+
if query
|
89
|
+
template = Addressable::Template.new("#{base_uri}/#{path}{?query*}")
|
90
|
+
template.partial_expand(query).pattern
|
91
|
+
else
|
92
|
+
"#{base_uri}/#{path}"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def endpoint
|
98
|
+
Net::HTTP::Get.new(url, headers)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Stattleship
|
2
|
+
class << self
|
3
|
+
attr_accessor :configuration
|
4
|
+
|
5
|
+
def configure
|
6
|
+
if block_given?
|
7
|
+
yield configuration
|
8
|
+
end
|
9
|
+
|
10
|
+
configuration
|
11
|
+
end
|
12
|
+
|
13
|
+
def configuration
|
14
|
+
@configuration ||= Configuration.new
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Configuration
|
19
|
+
attr_accessor :api_token
|
20
|
+
attr_reader :http
|
21
|
+
attr_writer :base_uri
|
22
|
+
|
23
|
+
def api_token=(token)
|
24
|
+
@api_token = token
|
25
|
+
end
|
26
|
+
|
27
|
+
def api_token
|
28
|
+
@api_token || ENV['STATTLESHIP_ACCESS_TOKEN']
|
29
|
+
end
|
30
|
+
|
31
|
+
def base_uri
|
32
|
+
@base_uri ||= URI('https://www.stattleship.com')
|
33
|
+
end
|
34
|
+
|
35
|
+
def http
|
36
|
+
Net::HTTP.new(base_uri.host, base_uri.port).tap do |http|
|
37
|
+
http.use_ssl = true
|
38
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,208 @@
|
|
1
|
+
module Stattleship
|
2
|
+
class Endpoint < OpenStruct
|
3
|
+
def self.fetch(path:, params:)
|
4
|
+
Stattleship::Client.new(path: path,
|
5
|
+
query: params.query).
|
6
|
+
paginate(model: self)
|
7
|
+
end
|
8
|
+
|
9
|
+
def data
|
10
|
+
@data ||= populate
|
11
|
+
end
|
12
|
+
|
13
|
+
def populate
|
14
|
+
raise 'Endpoint subclass must implement populate'
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def populate_officials(model)
|
20
|
+
model.officials = []
|
21
|
+
|
22
|
+
return if model.official_ids.nil?
|
23
|
+
return if officials.nil?
|
24
|
+
|
25
|
+
model.official_ids.each do |official_id|
|
26
|
+
model.officials << officials.detect do |official|
|
27
|
+
official.id == official_id
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def populate_opponents(model)
|
33
|
+
return if opponents.nil?
|
34
|
+
|
35
|
+
model.opponent = opponents.detect do |opponent|
|
36
|
+
opponent.id == model.opponent_id
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def populate_players(model)
|
41
|
+
return if players.nil?
|
42
|
+
|
43
|
+
model.player = players.detect do |player|
|
44
|
+
player.id == model.player_id
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def populate_player_teams(model)
|
49
|
+
return if teams.nil? || model.player.nil?
|
50
|
+
|
51
|
+
model.team = teams.detect do |team|
|
52
|
+
team.id == model.player.team_id
|
53
|
+
end
|
54
|
+
|
55
|
+
if model.player
|
56
|
+
model.player.team = model.team
|
57
|
+
populate_player_playing_position(model.player)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def populate_player(player)
|
62
|
+
populate_player_team(player)
|
63
|
+
end
|
64
|
+
|
65
|
+
def populate_player_team(player)
|
66
|
+
return if player.nil?
|
67
|
+
return if teams.nil?
|
68
|
+
|
69
|
+
player.team = teams.detect do |team|
|
70
|
+
team.id == player.team_id
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def populate_player_playing_position(model)
|
75
|
+
return if playing_positions.nil?
|
76
|
+
|
77
|
+
model.playing_position = playing_positions.detect do |playing_position|
|
78
|
+
playing_position.id == model.player.playing_position_id
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def populate_games(model)
|
83
|
+
return if games.nil?
|
84
|
+
|
85
|
+
model.game = games.detect do |game|
|
86
|
+
game.id == model.game_id
|
87
|
+
end
|
88
|
+
|
89
|
+
populate_model_game(model)
|
90
|
+
end
|
91
|
+
|
92
|
+
def populate_game(game)
|
93
|
+
populate_away_team(game)
|
94
|
+
populate_home_team(game)
|
95
|
+
populate_officials(game)
|
96
|
+
populate_winning_team(game)
|
97
|
+
populate_season(game)
|
98
|
+
populate_venue(game)
|
99
|
+
|
100
|
+
if game && game.season
|
101
|
+
populate_league(game.season)
|
102
|
+
game.league = game.season.league
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def populate_model_game(model)
|
107
|
+
populate_season(model.game)
|
108
|
+
populate_venue(model.game)
|
109
|
+
|
110
|
+
if model.game && model.game.season
|
111
|
+
populate_league(model.game.season)
|
112
|
+
model.game.league = model.game.season.league
|
113
|
+
end
|
114
|
+
|
115
|
+
if model.game && model.game.league
|
116
|
+
model.league = model.game.league
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def populate_season(model)
|
121
|
+
return if seasons.nil?
|
122
|
+
|
123
|
+
model.season = seasons.detect do |season|
|
124
|
+
season.id == model.season_id
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def populate_season_league(model)
|
129
|
+
return if leagues.nil?
|
130
|
+
return if model.season.nil?
|
131
|
+
|
132
|
+
model.season.league = leagues.detect do |league|
|
133
|
+
league.id == model.season.league_id
|
134
|
+
end
|
135
|
+
|
136
|
+
model.league = model.season.league
|
137
|
+
end
|
138
|
+
|
139
|
+
def populate_league(model)
|
140
|
+
return if leagues.nil?
|
141
|
+
|
142
|
+
model.league = leagues.detect do |league|
|
143
|
+
league.id == model.league_id
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def populate_team(team)
|
148
|
+
populate_league(team)
|
149
|
+
end
|
150
|
+
|
151
|
+
def populate_away_team(model)
|
152
|
+
return if away_teams.nil?
|
153
|
+
model.away_team = away_teams.detect do |away_team|
|
154
|
+
away_team.id == model.away_team_id
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def populate_home_team(model)
|
159
|
+
return if home_teams.nil?
|
160
|
+
|
161
|
+
model.home_team = home_teams.detect do |home_team|
|
162
|
+
home_team.id == model.home_team_id
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def populate_winning_team(model)
|
167
|
+
return if winning_teams.nil?
|
168
|
+
|
169
|
+
model.winning_team = winning_teams.detect do |winning_team|
|
170
|
+
winning_team.id == model.winning_team_id
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
def populate_teams(model)
|
175
|
+
return if teams.nil?
|
176
|
+
|
177
|
+
model.team = teams.detect do |team|
|
178
|
+
team.id == model.team_id
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
def populate_venue(model)
|
183
|
+
return if venues.nil?
|
184
|
+
|
185
|
+
model.venue = venues.detect do |venue|
|
186
|
+
venue.id == model.venue_id
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
def populate_scoring_players(model)
|
191
|
+
model.scoring_players = []
|
192
|
+
|
193
|
+
return if scoring_players.nil?
|
194
|
+
|
195
|
+
model.scoring_player_ids.each do |scoring_player_id|
|
196
|
+
model.scoring_players << scoring_players.detect do |scoring_player|
|
197
|
+
scoring_player.id == scoring_player_id
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
model.scoring_players.each do |scoring_player|
|
202
|
+
scoring_player.player = players.detect do |player|
|
203
|
+
player.id == scoring_player.player_id
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|