sportradar-api 0.9.12 → 0.11.21
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 +4 -4
- data/.env.sample +6 -0
- data/.travis.yml +1 -0
- data/Gemfile.lock +32 -30
- data/README.md +12 -9
- data/lib/sportradar/api/baseball/README.md +28 -0
- data/lib/sportradar/api/baseball/error.rb +25 -0
- data/lib/sportradar/api/baseball/event.rb +44 -0
- data/lib/sportradar/api/baseball/events/at_bat.rb +96 -0
- data/lib/sportradar/api/baseball/events/lineup.rb +41 -0
- data/lib/sportradar/api/baseball/events/warming_up.rb +35 -0
- data/lib/sportradar/api/baseball/fielder.rb +26 -0
- data/lib/sportradar/api/baseball/game.rb +472 -0
- data/lib/sportradar/api/baseball/half_inning.rb +69 -0
- data/lib/sportradar/api/baseball/inning.rb +42 -0
- data/lib/sportradar/api/baseball/lineup.rb +116 -0
- data/lib/sportradar/api/baseball/mlb/division.rb +32 -0
- data/lib/sportradar/api/baseball/mlb/hierarchy.rb +273 -0
- data/lib/sportradar/api/baseball/mlb/league.rb +27 -0
- data/lib/sportradar/api/baseball/mlb.rb +84 -0
- data/lib/sportradar/api/baseball/outcome.rb +87 -0
- data/lib/sportradar/api/baseball/pitch.rb +245 -0
- data/lib/sportradar/api/baseball/player.rb +119 -0
- data/lib/sportradar/api/baseball/record.rb +42 -0
- data/lib/sportradar/api/baseball/runner.rb +78 -0
- data/lib/sportradar/api/baseball/scoring.rb +86 -0
- data/lib/sportradar/api/baseball/team.rb +147 -0
- data/lib/sportradar/api/baseball/venue.rb +51 -0
- data/lib/sportradar/api/baseball.rb +46 -0
- data/lib/sportradar/api/basketball/broadcast.rb +15 -0
- data/lib/sportradar/api/basketball/game.rb +339 -0
- data/lib/sportradar/api/basketball/injury.rb +41 -0
- data/lib/sportradar/api/basketball/nba/conference.rb +27 -0
- data/lib/sportradar/api/basketball/nba/division.rb +30 -0
- data/lib/sportradar/api/basketball/nba/game.rb +62 -0
- data/lib/sportradar/api/basketball/nba/hierarchy.rb +47 -0
- data/lib/sportradar/api/basketball/nba/player.rb +160 -0
- data/lib/sportradar/api/basketball/nba/quarter.rb +51 -0
- data/lib/sportradar/api/basketball/nba/schedule.rb +43 -0
- data/lib/sportradar/api/basketball/nba/scoring.rb +15 -0
- data/lib/sportradar/api/basketball/nba/season.rb +54 -0
- data/lib/sportradar/api/basketball/nba/series.rb +82 -0
- data/lib/sportradar/api/basketball/nba/team.rb +74 -0
- data/lib/sportradar/api/basketball/nba.rb +129 -0
- data/lib/sportradar/api/basketball/ncaamb/bracket.rb +44 -0
- data/lib/sportradar/api/basketball/ncaamb/conference.rb +41 -0
- data/lib/sportradar/api/basketball/ncaamb/division.rb +42 -0
- data/lib/sportradar/api/basketball/ncaamb/game.rb +75 -0
- data/lib/sportradar/api/basketball/ncaamb/half.rb +49 -0
- data/lib/sportradar/api/basketball/ncaamb/hierarchy.rb +65 -0
- data/lib/sportradar/api/basketball/ncaamb/player.rb +162 -0
- data/lib/sportradar/api/basketball/ncaamb/round.rb +55 -0
- data/lib/sportradar/api/basketball/ncaamb/schedule.rb +41 -0
- data/lib/sportradar/api/basketball/ncaamb/season.rb +55 -0
- data/lib/sportradar/api/basketball/ncaamb/team.rb +61 -0
- data/lib/sportradar/api/basketball/ncaamb/tournament.rb +154 -0
- data/lib/sportradar/api/basketball/ncaamb.rb +149 -0
- data/lib/sportradar/api/basketball/play.rb +75 -0
- data/lib/sportradar/api/basketball/plays/assist.rb +14 -0
- data/lib/sportradar/api/basketball/plays/base.rb +126 -0
- data/lib/sportradar/api/basketball/plays/block.rb +14 -0
- data/lib/sportradar/api/basketball/plays/clear_path_foul.rb +11 -0
- data/lib/sportradar/api/basketball/plays/deadball.rb +11 -0
- data/lib/sportradar/api/basketball/plays/defensive_three_seconds.rb +11 -0
- data/lib/sportradar/api/basketball/plays/delay.rb +11 -0
- data/lib/sportradar/api/basketball/plays/ejection.rb +14 -0
- data/lib/sportradar/api/basketball/plays/end_period.rb +28 -0
- data/lib/sportradar/api/basketball/plays/flagrant_one.rb +11 -0
- data/lib/sportradar/api/basketball/plays/flagrant_two.rb +11 -0
- data/lib/sportradar/api/basketball/plays/foul.rb +17 -0
- data/lib/sportradar/api/basketball/plays/free_throw_made.rb +23 -0
- data/lib/sportradar/api/basketball/plays/free_throw_miss.rb +25 -0
- data/lib/sportradar/api/basketball/plays/jumpball.rb +12 -0
- data/lib/sportradar/api/basketball/plays/kickball.rb +11 -0
- data/lib/sportradar/api/basketball/plays/lineup_change.rb +11 -0
- data/lib/sportradar/api/basketball/plays/offensive_foul.rb +11 -0
- data/lib/sportradar/api/basketball/plays/official_timeout.rb +11 -0
- data/lib/sportradar/api/basketball/plays/open_inbound.rb +9 -0
- data/lib/sportradar/api/basketball/plays/open_tip.rb +11 -0
- data/lib/sportradar/api/basketball/plays/personal_foul.rb +9 -0
- data/lib/sportradar/api/basketball/plays/rebound.rb +28 -0
- data/lib/sportradar/api/basketball/plays/review.rb +11 -0
- data/lib/sportradar/api/basketball/plays/shooting_foul.rb +9 -0
- data/lib/sportradar/api/basketball/plays/shot_made.rb +22 -0
- data/lib/sportradar/api/basketball/plays/shot_miss.rb +22 -0
- data/lib/sportradar/api/basketball/plays/steal.rb +11 -0
- data/lib/sportradar/api/basketball/plays/team_timeout.rb +14 -0
- data/lib/sportradar/api/basketball/plays/technical_foul.rb +14 -0
- data/lib/sportradar/api/basketball/plays/three_point_made.rb +14 -0
- data/lib/sportradar/api/basketball/plays/three_point_miss.rb +11 -0
- data/lib/sportradar/api/basketball/plays/timeout.rb +24 -0
- data/lib/sportradar/api/basketball/plays/turnover.rb +19 -0
- data/lib/sportradar/api/basketball/plays/tv_timeout.rb +11 -0
- data/lib/sportradar/api/basketball/plays/two_point_made.rb +14 -0
- data/lib/sportradar/api/basketball/plays/two_point_miss.rb +11 -0
- data/lib/sportradar/api/basketball/plays.rb +39 -0
- data/lib/sportradar/api/basketball/record.rb +28 -0
- data/lib/sportradar/api/basketball/scoring.rb +103 -0
- data/lib/sportradar/api/basketball/season.rb +20 -0
- data/lib/sportradar/api/basketball/team.rb +136 -0
- data/lib/sportradar/api/basketball/venue.rb +54 -0
- data/lib/sportradar/api/basketball.rb +35 -0
- data/lib/sportradar/api/{nfl/broadcast.rb → broadcast.rb} +1 -1
- data/lib/sportradar/api/content/article.rb +1 -1
- data/lib/sportradar/api/content/article_list.rb +1 -1
- data/lib/sportradar/api/content.rb +17 -5
- data/lib/sportradar/api/data.rb +53 -0
- data/lib/sportradar/api/football/README.md +62 -0
- data/lib/sportradar/api/football/drive.rb +114 -0
- data/lib/sportradar/api/football/event.rb +36 -0
- data/lib/sportradar/api/football/game.rb +404 -0
- data/lib/sportradar/api/football/game_stats.rb +135 -0
- data/lib/sportradar/api/football/ncaafb/api.rb +81 -0
- data/lib/sportradar/api/football/ncaafb/conference.rb +53 -0
- data/lib/sportradar/api/football/ncaafb/division.rb +42 -0
- data/lib/sportradar/api/football/ncaafb/drive.rb +36 -0
- data/lib/sportradar/api/football/ncaafb/game.rb +130 -0
- data/lib/sportradar/api/football/ncaafb/play.rb +97 -0
- data/lib/sportradar/api/football/ncaafb/player.rb +31 -0
- data/lib/sportradar/api/football/ncaafb/quarter.rb +15 -0
- data/lib/sportradar/api/football/ncaafb/subdivision.rb +43 -0
- data/lib/sportradar/api/football/ncaafb/team.rb +49 -0
- data/lib/sportradar/api/football/ncaafb/week.rb +24 -0
- data/lib/sportradar/api/football/ncaafb.rb +273 -0
- data/lib/sportradar/api/football/nfl/api.rb +76 -0
- data/lib/sportradar/api/football/nfl/conference.rb +35 -0
- data/lib/sportradar/api/football/nfl/depth_chart.rb +53 -0
- data/lib/sportradar/api/football/nfl/division.rb +37 -0
- data/lib/sportradar/api/football/nfl/drive.rb +19 -0
- data/lib/sportradar/api/football/nfl/event.rb +19 -0
- data/lib/sportradar/api/football/nfl/game.rb +77 -0
- data/lib/sportradar/api/football/nfl/league_depth_chart.rb +41 -0
- data/lib/sportradar/api/football/nfl/play.rb +27 -0
- data/lib/sportradar/api/football/nfl/player.rb +31 -0
- data/lib/sportradar/api/football/nfl/quarter.rb +15 -0
- data/lib/sportradar/api/football/nfl/team.rb +42 -0
- data/lib/sportradar/api/football/nfl/team_depth_chart.rb +44 -0
- data/lib/sportradar/api/football/nfl/week.rb +24 -0
- data/lib/sportradar/api/football/nfl.rb +322 -0
- data/lib/sportradar/api/football/play.rb +116 -0
- data/lib/sportradar/api/football/play_statistics.rb +313 -0
- data/lib/sportradar/api/football/player.rb +121 -0
- data/lib/sportradar/api/football/quarter.rb +46 -0
- data/lib/sportradar/api/football/record.rb +48 -0
- data/lib/sportradar/api/football/scoring.rb +92 -0
- data/lib/sportradar/api/football/situation.rb +32 -0
- data/lib/sportradar/api/football/stat_pack/defense.rb +20 -20
- data/lib/sportradar/api/football/stat_pack/extra_points.rb +5 -4
- data/lib/sportradar/api/football/stat_pack/field_goals.rb +6 -5
- data/lib/sportradar/api/football/stat_pack/fumbles.rb +11 -9
- data/lib/sportradar/api/football/stat_pack/kick_returns.rb +8 -7
- data/lib/sportradar/api/football/stat_pack/kickoffs.rb +9 -7
- data/lib/sportradar/api/football/stat_pack/misc_returns.rb +1 -1
- data/lib/sportradar/api/football/stat_pack/passing.rb +13 -11
- data/lib/sportradar/api/football/stat_pack/penalties.rb +2 -2
- data/lib/sportradar/api/football/stat_pack/punt_returns.rb +7 -6
- data/lib/sportradar/api/football/stat_pack/punts.rb +12 -10
- data/lib/sportradar/api/football/stat_pack/receiving.rb +10 -9
- data/lib/sportradar/api/football/stat_pack/rushing.rb +11 -9
- data/lib/sportradar/api/football/stat_pack.rb +7 -3
- data/lib/sportradar/api/football/team.rb +160 -0
- data/lib/sportradar/api/football/venue.rb +25 -0
- data/lib/sportradar/api/football/week.rb +57 -0
- data/lib/sportradar/api/football.rb +47 -0
- data/lib/sportradar/api/images/asset.rb +2 -1
- data/lib/sportradar/api/images/ref.rb +15 -0
- data/lib/sportradar/api/images.rb +51 -9
- data/lib/sportradar/api/mma/event.rb +111 -0
- data/lib/sportradar/api/mma/fight.rb +107 -0
- data/lib/sportradar/api/mma/fighter.rb +95 -0
- data/lib/sportradar/api/mma/judge.rb +70 -0
- data/lib/sportradar/api/mma/league.rb +63 -0
- data/lib/sportradar/api/mma/referee.rb +70 -0
- data/lib/sportradar/api/mma/result.rb +68 -0
- data/lib/sportradar/api/mma/roster.rb +72 -0
- data/lib/sportradar/api/mma/schedule.rb +53 -0
- data/lib/sportradar/api/mma/score.rb +83 -0
- data/lib/sportradar/api/mma/venue.rb +72 -0
- data/lib/sportradar/api/mma.rb +195 -0
- data/lib/sportradar/api/poll.rb +40 -0
- data/lib/sportradar/api/request.rb +40 -8
- data/lib/sportradar/api/soccer/schedule.rb +1 -0
- data/lib/sportradar/api/version.rb +1 -1
- data/lib/sportradar/api.rb +20 -34
- metadata +157 -34
- data/lib/sportradar/api/nfl/.play_statistics.rb.swo +0 -0
- data/lib/sportradar/api/nfl/changelog.rb +0 -17
- data/lib/sportradar/api/nfl/coach.rb +0 -17
- data/lib/sportradar/api/nfl/conference.rb +0 -16
- data/lib/sportradar/api/nfl/depth_chart.rb +0 -47
- data/lib/sportradar/api/nfl/division.rb +0 -16
- data/lib/sportradar/api/nfl/draft.rb +0 -16
- data/lib/sportradar/api/nfl/drive.rb +0 -73
- data/lib/sportradar/api/nfl/event.rb +0 -19
- data/lib/sportradar/api/nfl/franchise.rb +0 -14
- data/lib/sportradar/api/nfl/game.rb +0 -94
- data/lib/sportradar/api/nfl/game_statistic.rb +0 -133
- data/lib/sportradar/api/nfl/hierarchy.rb +0 -19
- data/lib/sportradar/api/nfl/injury.rb +0 -16
- data/lib/sportradar/api/nfl/league_depth_chart.rb +0 -26
- data/lib/sportradar/api/nfl/play.rb +0 -39
- data/lib/sportradar/api/nfl/play_statistics.rb +0 -247
- data/lib/sportradar/api/nfl/player.rb +0 -49
- data/lib/sportradar/api/nfl/position.rb +0 -14
- data/lib/sportradar/api/nfl/quarter.rb +0 -29
- data/lib/sportradar/api/nfl/scoring.rb +0 -25
- data/lib/sportradar/api/nfl/season.rb +0 -23
- data/lib/sportradar/api/nfl/situation.rb +0 -18
- data/lib/sportradar/api/nfl/statistic.rb +0 -28
- data/lib/sportradar/api/nfl/summary.rb +0 -17
- data/lib/sportradar/api/nfl/team.rb +0 -56
- data/lib/sportradar/api/nfl/team_depth_chart.rb +0 -44
- data/lib/sportradar/api/nfl/venue.rb +0 -22
- data/lib/sportradar/api/nfl/week.rb +0 -16
- data/lib/sportradar/api/nfl.rb +0 -205
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
module Sportradar
|
|
2
|
+
module Api
|
|
3
|
+
module Baseball
|
|
4
|
+
class Pitch < Data
|
|
5
|
+
attr_accessor :response, :id, :at_bat, :outcome_id, :status, :count, :is_ab_over, :is_hit, :warming_up, :runners, :errors, :pitch_type_name, :x, :y, :zone, :total_pitch_count, :atbat_pitch_count, :speed, :outcome, :hit_type, :balls, :strikes, :outs, :fielders
|
|
6
|
+
|
|
7
|
+
def initialize(data, **opts)
|
|
8
|
+
@response = data
|
|
9
|
+
@api = opts[:api]
|
|
10
|
+
@at_bat = opts[:at_bat]
|
|
11
|
+
# @half_inning = opts[:half_inning]
|
|
12
|
+
|
|
13
|
+
@id = data["id"]
|
|
14
|
+
|
|
15
|
+
update(data)
|
|
16
|
+
end
|
|
17
|
+
def ==(other)
|
|
18
|
+
@id == other.id && @count == other.count && @outcome_id == other.outcome_id
|
|
19
|
+
end
|
|
20
|
+
def update(data, **opts)
|
|
21
|
+
|
|
22
|
+
if data['outcome_id']
|
|
23
|
+
@outcome_id = data['outcome_id']
|
|
24
|
+
@outcome = self.class.pitch_outcome(@outcome_id)
|
|
25
|
+
end
|
|
26
|
+
@description = data['description'] if data['description']
|
|
27
|
+
@status = data['status'] if data['status']
|
|
28
|
+
|
|
29
|
+
parse_hit(data)
|
|
30
|
+
parse_runners(data['runners']) if data['runners']
|
|
31
|
+
parse_pitcher(data['pitcher']) if data['pitcher']
|
|
32
|
+
parse_flags(data['flags']) if data['flags']
|
|
33
|
+
parse_count(data['count']) if data['count']
|
|
34
|
+
parse_warming_up(data['warming_up']) if data['warming_up']
|
|
35
|
+
parse_fielders(data['fielders']) if data['fielders']
|
|
36
|
+
parse_errors(data['errors']) if data['errors']
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def pitches
|
|
40
|
+
@pitches_hash.values
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def homerun?
|
|
44
|
+
@outcome_id == 'aHR'
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def foul?
|
|
48
|
+
['kF','kFT'].include? @outcome_id
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def ball?
|
|
52
|
+
['bAB', 'bB', 'bDB', 'bIB', 'bPO'].include? @outcome_id
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def strike?
|
|
56
|
+
['aKLAD1', 'aKLAD2', 'aKLAD3', 'aKLAD4', 'aKSAD1', 'aKSAD2', 'aKSAD3', 'aKSAD4', 'kF', 'kFT', 'kKL', 'kKS', 'oKLT1', 'oKLT2', 'oKLT3', 'oKLT4', 'oKST1', 'oKST2', 'oKST3', 'oKST4'].include? @outcome_id
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def hit_ends_ab?
|
|
60
|
+
@hit_location.present? && !foul?
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def parse_hit(data)
|
|
64
|
+
@hit_type = data['hit_type'] if data['hit_type']
|
|
65
|
+
@hit_location = data['hit_location'] if data['hit_location']
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def parse_runners(data)
|
|
69
|
+
@runners = data.map { |hash| Runner.new(hash) }
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def parse_errors(data)
|
|
73
|
+
@errors = data.map { |hash| Error.new(hash) }
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def parse_fielders(data)
|
|
77
|
+
@fielders = data.map { |hash| Fielder.new(hash) }
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def parse_pitcher(data)
|
|
81
|
+
@type = data['pitch_type'] if data['pitch_type']
|
|
82
|
+
@speed = data['pitch_speed'] if data['pitch_speed']
|
|
83
|
+
@x = data['pitch_x'] if data['pitch_x']
|
|
84
|
+
@y = data['pitch_y'] if data['pitch_y']
|
|
85
|
+
@zone = data['pitch_zone'] if data['pitch_zone']
|
|
86
|
+
|
|
87
|
+
@pitch_type_name = self.class.pitch_type(@type)
|
|
88
|
+
@total_pitch_count = data['pitch_count'] if data['pitch_count']
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def parse_flags(data)
|
|
92
|
+
@is_ab_over = data['is_ab_over'] if data['is_ab_over']
|
|
93
|
+
@is_bunt = data['is_bunt'] if data['is_bunt']
|
|
94
|
+
@is_bunt_shown = data['is_bunt_shown'] if data['is_bunt_shown']
|
|
95
|
+
@is_hit = data['is_hit'] if data['is_hit']
|
|
96
|
+
@is_wild_pitch = data['is_wild_pitch'] if data['is_wild_pitch']
|
|
97
|
+
@is_passed_ball = data['is_passed_ball'] if data['is_passed_ball']
|
|
98
|
+
@is_double_play = data['is_double_play'] if data['is_double_play']
|
|
99
|
+
@is_triple_play = data['is_triple_play'] if data['is_triple_play']
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def parse_count(data)
|
|
103
|
+
@count = data
|
|
104
|
+
@balls = data['balls'] if data['balls']
|
|
105
|
+
@strikes = data['strikes'] if data['strikes']
|
|
106
|
+
@outs = data['outs'] if data['outs']
|
|
107
|
+
@atbat_pitch_count = data['pitch_count'] if data['pitch_count']
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def parse_warming_up(data)
|
|
111
|
+
@warming_id = data['id']
|
|
112
|
+
@warming_player_id = data['player_id']
|
|
113
|
+
@warming_team_id = data['team_id']
|
|
114
|
+
@warming_last_name = data['last_name']
|
|
115
|
+
@warming_first_name = data['first_name']
|
|
116
|
+
@warming_preferred_name = data['preferred_name']
|
|
117
|
+
@warming_jersey_number = data['jersey_number']
|
|
118
|
+
@warming_up = "#{data['preferred_name'] || data['first_name']} #{data['last_name']}"
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def parse_steal(data)
|
|
122
|
+
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
{"type"=>"steal", "id"=>"76762fd9-683c-42f2-8c72-8d9fd4f5bc7b", "status"=>"official", "created_at"=>"2017-05-06T02:56:49+00:00", "pitcher"=>{"id"=>"9dd06397-4353-44e8-81bb-6e88a75e42b5"}, "runners"=>[{"id"=>"3e39fe20-6dca-4894-807b-1ce76ff93e29", "starting_base"=>1, "ending_base"=>1, "outcome_id"=>"", "out"=>false, "last_name"=>"Owings", "first_name"=>"Christopher", "preferred_name"=>"Chris", "jersey_number"=>"16"}]}
|
|
126
|
+
|
|
127
|
+
{"type"=>"steal", "id"=>"df01b116-afcd-467f-9b9c-99d3891629c6", "status"=>"official", "created_at"=>"2017-05-06T03:00:58+00:00", "pitcher"=>{"id"=>"90fb6719-5135-42f3-88c0-0ccde448368c"}, "runners"=>[{"id"=>"106e6fb6-6460-412e-abdb-9f73469a27b9", "starting_base"=>1, "ending_base"=>1, "outcome_id"=>"CK", "out"=>false, "last_name"=>"DeShields", "first_name"=>"Delino", "preferred_name"=>"Delino", "jersey_number"=>"3"}]}
|
|
128
|
+
{"type"=>"steal", "id"=>"37c9192d-cac9-4320-b721-f68955eecf24", "status"=>"official", "created_at"=>"2017-05-06T03:02:16+00:00", "pitcher"=>{"id"=>"90fb6719-5135-42f3-88c0-0ccde448368c"}, "runners"=>[{"id"=>"106e6fb6-6460-412e-abdb-9f73469a27b9", "starting_base"=>1, "ending_base"=>1, "outcome_id"=>"CK", "out"=>false, "last_name"=>"DeShields", "first_name"=>"Delino", "preferred_name"=>"Delino", "jersey_number"=>"3"}]}
|
|
129
|
+
{"type"=>"steal", "id"=>"b8dcebfa-e02c-470e-ba73-e9b6b553cc0d", "status"=>"official", "created_at"=>"2017-05-06T03:38:48+00:00", "pitcher"=>{"id"=>"1a2638a3-28df-46b3-9cca-0f8eb29b581f"}, "runners"=>[{"id"=>"2847c4e0-01be-46bd-992e-701ee447e3f5", "starting_base"=>1, "ending_base"=>1, "outcome_id"=>"CK", "out"=>false, "last_name"=>"Upton", "first_name"=>"Justin", "preferred_name"=>"Justin", "jersey_number"=>"8"}, {"id"=>"f27a7574-57db-4eeb-8f88-377048806de2", "starting_base"=>3, "ending_base"=>3, "outcome_id"=>"", "out"=>false, "last_name"=>"Martínez", "first_name"=>"Victor", "preferred_name"=>"Victor", "jersey_number"=>"41"}]}
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def self.pitch_type(code)
|
|
133
|
+
pitch_types[code]
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def self.pitch_types
|
|
137
|
+
@pitch_types ||= {
|
|
138
|
+
'FA' => 'Fastball',
|
|
139
|
+
'SI' => 'Sinker',
|
|
140
|
+
'CT' => 'Cutter',
|
|
141
|
+
'CU' => 'Curveball',
|
|
142
|
+
'SL' => 'Slider',
|
|
143
|
+
'CH' => 'Changeup',
|
|
144
|
+
'KN' => 'Knuckleball',
|
|
145
|
+
'SP' => 'Splitter',
|
|
146
|
+
'SC' => 'Screwball',
|
|
147
|
+
'FO' => 'Forkball',
|
|
148
|
+
'IB' => 'Intentional Ball',
|
|
149
|
+
'PI' => 'Pitchout',
|
|
150
|
+
}
|
|
151
|
+
end
|
|
152
|
+
def self.pitch_outcome(code)
|
|
153
|
+
pitch_outcomes[code]
|
|
154
|
+
end
|
|
155
|
+
def self.pitch_outcomes
|
|
156
|
+
@pitch_outcomes ||= {
|
|
157
|
+
'aBK' => 'Balk',
|
|
158
|
+
'aCI' => 'Catcher Interference',
|
|
159
|
+
'aD' => 'Double',
|
|
160
|
+
'aDAD3' => 'Double - Adv 3rd',
|
|
161
|
+
'aDAD4' => 'Double - Adv Home',
|
|
162
|
+
'aFCAD2' => 'Fielders Choice - Adv 2nd',
|
|
163
|
+
'aFCAD3' => 'Fielders Choice - Adv 3rd',
|
|
164
|
+
'aFCAD4' => 'Fielders Choice - Adv Home',
|
|
165
|
+
'aHBP' => 'Hit By Pitch',
|
|
166
|
+
'aHR' => 'Homerun',
|
|
167
|
+
'aIBB' => 'Intentional Walk',
|
|
168
|
+
'aKLAD1' => 'Strike Looking - Adv 1st',
|
|
169
|
+
'aKLAD2' => 'Strike Looking - Adv 2nd',
|
|
170
|
+
'aKLAD3' => 'Strike Looking - Adv 3rd',
|
|
171
|
+
'aKLAD4' => 'Strike Looking - Adv Home',
|
|
172
|
+
'aKSAD1' => 'Strike Swinging - Adv 1st',
|
|
173
|
+
'aKSAD2' => 'Strike Swinging - Adv 2nd',
|
|
174
|
+
'aKSAD3' => 'Strike Swinging - Adv 3rd',
|
|
175
|
+
'aKSAD4' => 'Strike Swinging - Adv Home',
|
|
176
|
+
'aROE' => 'Reached On Error',
|
|
177
|
+
'aROEAD2' => 'Reached On Error - Adv 2nd',
|
|
178
|
+
'aROEAD3' => 'Reached On Error - Adv 3rd',
|
|
179
|
+
'aROEAD4' => 'Reached On Error - Adv Home',
|
|
180
|
+
'aS' => 'Single',
|
|
181
|
+
'aSAD2' => 'Single - Adv 2nd',
|
|
182
|
+
'aSAD3' => 'Single - Adv 3rd',
|
|
183
|
+
'aSAD4' => 'Single - Adv Home',
|
|
184
|
+
'aSBAD1' => 'Sacrifice Bunt - Adv 1st',
|
|
185
|
+
'aSBAD2' => 'Sacrifice Bunt - Adv 2nd',
|
|
186
|
+
'aSBAD3' => 'Sacrifice Bunt - Adv 3rd',
|
|
187
|
+
'aSBAD4' => 'Sacrifice Bunt - Adv Home',
|
|
188
|
+
'aSFAD1' => 'Sacrifice Fly - Adv 1st',
|
|
189
|
+
'aSFAD2' => 'Sacrifice Fly - Adv 2nd',
|
|
190
|
+
'aSFAD3' => 'Sacrifice Fly - Adv 3rd',
|
|
191
|
+
'aSFAD4' => 'Sacrifice Fly - Adv Home',
|
|
192
|
+
'aT' => 'Triple',
|
|
193
|
+
'aTAD4' => 'Triple - Adv Home',
|
|
194
|
+
'bAB' => 'Enforced Ball',
|
|
195
|
+
'bB' => 'Ball',
|
|
196
|
+
'bDB' => 'Dirt Ball',
|
|
197
|
+
'bIB' => 'Intentional Ball',
|
|
198
|
+
'bPO' => 'Pitchout',
|
|
199
|
+
'kF' => 'Foul Ball',
|
|
200
|
+
'kFT' => 'Foul Tip',
|
|
201
|
+
'kKL' => 'Strike Looking',
|
|
202
|
+
'kKS' => 'Strike Swinging',
|
|
203
|
+
'oBI' => 'Hitter Interference',
|
|
204
|
+
'oDT3' => 'Double - Out at 3rd',
|
|
205
|
+
'oDT4' => 'Double - Out at Home',
|
|
206
|
+
'oFC' => 'Fielders Choice',
|
|
207
|
+
'oFCT2' => 'Fielders Choice - Out at 2nd',
|
|
208
|
+
'oFCT3' => 'Fielders Choice - Out at 3rd',
|
|
209
|
+
'oFCT4' => 'Fielders Choice - Out at Home',
|
|
210
|
+
'oFO' => 'Fly Out',
|
|
211
|
+
'oGO' => 'Ground Out',
|
|
212
|
+
'oKLT1' => 'Strike Looking - Out at 1st',
|
|
213
|
+
'oKLT2' => 'Strike Looking - Out at 2nd',
|
|
214
|
+
'oKLT3' => 'Strike Looking - Out at 3rd',
|
|
215
|
+
'oKLT4' => 'Strike Looking - Out at Home',
|
|
216
|
+
'oKST1' => 'Strike Swinging - Out at 1st',
|
|
217
|
+
'oKST2' => 'Strike Swinging - Out at 2nd',
|
|
218
|
+
'oKST3' => 'Strike Swinging - Out at 3rd',
|
|
219
|
+
'oKST4' => 'Strike Swinging - Out at Home',
|
|
220
|
+
'oLO' => 'Line Out',
|
|
221
|
+
'oOBB' => 'Out of Batters Box',
|
|
222
|
+
'oOP' => 'Out on Appeal',
|
|
223
|
+
'oPO' => 'Pop Out',
|
|
224
|
+
'oROET2' => 'Reached On Error - Out at 2nd',
|
|
225
|
+
'oROET3' => 'Reached On Error - Out at 3rd',
|
|
226
|
+
'oROET4' => 'Reached On Error - Out at Home',
|
|
227
|
+
'oSB' => 'Sacrifice Bunt',
|
|
228
|
+
'oSBT2' => 'Sacrifice Bunt - Out at 2nd',
|
|
229
|
+
'oSBT3' => 'Sacrifice Bunt - Out at 3rd',
|
|
230
|
+
'oSBT4' => 'Sacrifice Bunt - Out at Home',
|
|
231
|
+
'oSF' => 'Sacrifice Fly',
|
|
232
|
+
'oSFT2' => 'Sacrifice Fly - Out at 2nd',
|
|
233
|
+
'oSFT3' => 'Sacrifice Fly - Out at 3rd',
|
|
234
|
+
'oSFT4' => 'Sacrifice Fly - Out at Home',
|
|
235
|
+
'oST2' => 'Single - Out at 2nd',
|
|
236
|
+
'oST3' => 'Single - Out at 3rd',
|
|
237
|
+
'oST4' => 'Single - Out at Home',
|
|
238
|
+
'oTT4' => 'Triple - Out at Home',
|
|
239
|
+
}
|
|
240
|
+
end
|
|
241
|
+
{"type"=>"steal", "id"=>"01ead210-1586-4d07-9713-6fd3d17b2b4c", "status"=>"official", "created_at"=>"2017-05-15T23:55:53+00:00", "pitcher"=>{"id"=>"9c12832b-c487-40d4-915b-e44097632d7c"}, "runners"=>[{"id"=>"65de4cd1-ca86-468c-9346-1e68d6279a8e", "starting_base"=>1, "ending_base"=>0, "outcome_id"=>"PO", "out"=>true, "last_name"=>"Gordon", "first_name"=>"Devaris", "preferred_name"=>"Dee", "jersey_number"=>"9", "description"=>"Dee Gordon picked off.", "fielders"=>[{"id"=>"bd519b9f-7539-4282-a741-3bd2bf532c40", "type"=>"putout", "sequence"=>1, "last_name"=>"Gurriel", "first_name"=>"Yulieski", "preferred_name"=>"Yulieski", "jersey_number"=>"10"}, {"id"=>"9c12832b-c487-40d4-915b-e44097632d7c", "type"=>"assist", "sequence"=>1, "last_name"=>"Musgrove", "first_name"=>"Joseph", "preferred_name"=>"Joe", "jersey_number"=>"59"}]}]}
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
end
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
module Sportradar
|
|
2
|
+
module Api
|
|
3
|
+
module Baseball
|
|
4
|
+
class Player < Data
|
|
5
|
+
attr_accessor :response, :id, :number, :full_name, :first_name, :last_name, :position, :primary_position, :birth_place, :college, :height, :weight, :draft, :hitting, :pitching, :fielding, :team
|
|
6
|
+
|
|
7
|
+
def initialize(data, **opts)
|
|
8
|
+
@response = data # comment this out when done developing
|
|
9
|
+
@api = opts[:api]
|
|
10
|
+
@team = opts[:team]
|
|
11
|
+
|
|
12
|
+
@id = data["id"]
|
|
13
|
+
|
|
14
|
+
update(data, **opts)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def name # to match api for NFL::Player
|
|
18
|
+
full_name
|
|
19
|
+
end
|
|
20
|
+
def display_name
|
|
21
|
+
full_name || "#{@preferred_name || @first_name} #{@last_name}"
|
|
22
|
+
end
|
|
23
|
+
def jersey
|
|
24
|
+
@jersey_number
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def birth_date # to match api for NFL::Player
|
|
28
|
+
@birthdate
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def update(data, **opts)
|
|
32
|
+
@depth = data['depth'] if data['depth']
|
|
33
|
+
@experience = data['experience'] if data['experience']
|
|
34
|
+
@birth_place = data['birth_place'].gsub(',,', ', ') if data['birth_place']
|
|
35
|
+
@college = data['college'] if data['college']
|
|
36
|
+
|
|
37
|
+
# from team roster
|
|
38
|
+
@status = data['status'] if data['status']
|
|
39
|
+
@position = data['position'] if data['position']
|
|
40
|
+
@primary_position = data['primary_position'] if data['primary_position']
|
|
41
|
+
@first_name = data['first_name'] if data['first_name']
|
|
42
|
+
@last_name = data['last_name'] if data['last_name']
|
|
43
|
+
@preferred_name = data['preferred_name'] if data['preferred_name']
|
|
44
|
+
@jersey_number = data['jersey_number'] if data['jersey_number']
|
|
45
|
+
@full_name = data['full_name'] if data['full_name']
|
|
46
|
+
@mlbam_id = data['mlbam_id'] if data['mlbam_id']
|
|
47
|
+
@height = data['height'] if data['height']
|
|
48
|
+
@weight = data['weight'] if data['weight']
|
|
49
|
+
@throw_hand = data['throw_hand'] if data['throw_hand']
|
|
50
|
+
@bat_hand = data['bat_hand'] if data['bat_hand']
|
|
51
|
+
@high_school = data['high_school'] if data['high_school']
|
|
52
|
+
@birthdate = data['birthdate'] if data['birthdate']
|
|
53
|
+
@birthstate = data['birthstate'] if data['birthstate']
|
|
54
|
+
@birthcountry = data['birthcountry'] if data['birthcountry']
|
|
55
|
+
@birthcity = data['birthcity'] if data['birthcity']
|
|
56
|
+
@pro_debut = data['pro_debut'] if data['pro_debut']
|
|
57
|
+
@updated = data['updated'] if data['updated']
|
|
58
|
+
@active = data['active'] if data['active']
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
update_injuries(data)
|
|
62
|
+
update_draft(data)
|
|
63
|
+
|
|
64
|
+
@team.update_player_stats(self, data['statistics'], opts[:game]) if data['statistics']
|
|
65
|
+
if stats = data['statistics']
|
|
66
|
+
@fielding = stats.dig('fielding', 'overall')
|
|
67
|
+
@pitching = stats.dig('pitching', 'overall')
|
|
68
|
+
@hitting = stats.dig('hitting', 'overall')
|
|
69
|
+
|
|
70
|
+
# used to be @team, lets leave as opt until it needs to go back
|
|
71
|
+
opts[:team].update_player_stats(self, stats)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
self
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def injured?
|
|
78
|
+
!!(@injury && @injury.out?)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def age
|
|
82
|
+
if birth_date.present?
|
|
83
|
+
now = Time.now.utc.to_date
|
|
84
|
+
dob = birth_date.to_date
|
|
85
|
+
now.year - dob.year - ((now.month > dob.month || (now.month == dob.month && now.day >= dob.day)) ? 0 : 1)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def update_draft(data)
|
|
90
|
+
@draft = data['draft'] if data['draft'] # {"team_id"=>"583ec825-fb46-11e1-82cb-f4ce4684ea4c", "year"=>"2012", "round"=>"1", "pick"=>"30"},
|
|
91
|
+
end
|
|
92
|
+
def update_injuries(data)
|
|
93
|
+
# @injury = Injury.new(data['injuries']) if data['injuries']
|
|
94
|
+
# {"injury"=>
|
|
95
|
+
# {"id"=>"06423591-3fc1-4d2b-8c60-a3f30d735345",
|
|
96
|
+
# "comment"=>"Ezeli suffered a setback in his recovery from a procedure on his knee and there is no timetable for his return, according to Jason Quick of csnnw.com.",
|
|
97
|
+
# "desc"=>"Knee",
|
|
98
|
+
# "status"=>"Out",
|
|
99
|
+
# "start_date"=>"2016-10-25",
|
|
100
|
+
# "update_date"=>"2016-11-09"}}}
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def api
|
|
104
|
+
@api || Sportradar::Api::Baseball::Mlb.new
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
__END__
|
|
113
|
+
|
|
114
|
+
mlb = Sportradar::Api::Baseball::Mlb::Hierarchy.new
|
|
115
|
+
mlb.get_hierarchy;
|
|
116
|
+
t = mlb.teams.first;
|
|
117
|
+
t.get_season_stats(2016);
|
|
118
|
+
t.players.sample
|
|
119
|
+
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
module Sportradar
|
|
2
|
+
module Api
|
|
3
|
+
module Baseball
|
|
4
|
+
class Record < Data
|
|
5
|
+
attr_accessor :id, :team, :wins, :losses, :win_pct, :streak, :games_back #, :runs_for, :runs_against, :run_diff, :games_behind, :streak
|
|
6
|
+
alias :games_behind :games_back
|
|
7
|
+
|
|
8
|
+
def initialize(data, type: 'overall', **opts)
|
|
9
|
+
@team = opts[:team]
|
|
10
|
+
@type = type
|
|
11
|
+
|
|
12
|
+
update(data, **opts)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def update(data, **opts)
|
|
16
|
+
@wins = data["win"]
|
|
17
|
+
@losses = data["loss"]
|
|
18
|
+
@win_pct = data["win_p"]
|
|
19
|
+
@home_win = data["home_win"]
|
|
20
|
+
@home_loss = data["home_loss"]
|
|
21
|
+
@away_win = data["away_win"]
|
|
22
|
+
@away_loss = data["away_loss"]
|
|
23
|
+
@streak = data["streak"]
|
|
24
|
+
@e_win = data["e_win"]
|
|
25
|
+
@e_loss = data["e_loss"]
|
|
26
|
+
@c_win = data["c_win"]
|
|
27
|
+
@c_loss = data["c_loss"]
|
|
28
|
+
@w_win = data["w_win"]
|
|
29
|
+
@w_loss = data["w_loss"]
|
|
30
|
+
@al_win = data["al_win"]
|
|
31
|
+
@al_loss = data["al_loss"]
|
|
32
|
+
@last_10_won = data["last_10_won"]
|
|
33
|
+
@last_10_lost = data["last_10_lost"]
|
|
34
|
+
@games_back = data["games_back"]
|
|
35
|
+
@wild_card_back = data["wild_card_back"]
|
|
36
|
+
@elimination_number = data["elimination_number"]
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
module Sportradar
|
|
2
|
+
module Api
|
|
3
|
+
module Baseball
|
|
4
|
+
class Runner < Data
|
|
5
|
+
attr_accessor :response, :id, :starting_base, :ending_base, :outcome_id, :out, :description, :fielders, :outcome
|
|
6
|
+
|
|
7
|
+
def initialize(data, **opts)
|
|
8
|
+
@response = data
|
|
9
|
+
# @game = opts[:game]
|
|
10
|
+
|
|
11
|
+
update(data)
|
|
12
|
+
end
|
|
13
|
+
def update(data, **opts)
|
|
14
|
+
@id = data["id"]
|
|
15
|
+
@starting_base = data["starting_base"]
|
|
16
|
+
@ending_base = data["ending_base"]
|
|
17
|
+
@outcome_id = data["outcome_id"]
|
|
18
|
+
@outcome = runner_outcome(@outcome_id)
|
|
19
|
+
@out = data["out"]
|
|
20
|
+
@last_name = data["last_name"]
|
|
21
|
+
@first_name = data["first_name"]
|
|
22
|
+
@preferred_name = data["preferred_name"]
|
|
23
|
+
@jersey_number = data["jersey_number"]
|
|
24
|
+
@description = data['description']
|
|
25
|
+
@fielders = data['fielders'].map { |hash| Fielder.new(hash) } if data['fielders']
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def runner_outcome(code)
|
|
29
|
+
runner_outcomes[code]
|
|
30
|
+
end
|
|
31
|
+
def runner_outcomes
|
|
32
|
+
@runner_outcomes ||= {
|
|
33
|
+
'CK' => 'Checked',
|
|
34
|
+
'ERN' => 'Earned Run/RBI',
|
|
35
|
+
'eRN' => 'Earned Run/No RBI',
|
|
36
|
+
'URN' => 'Unearned Run/RBI',
|
|
37
|
+
'uRN' => 'Unearned Run/No RBI',
|
|
38
|
+
'PO' => 'Pickoff',
|
|
39
|
+
'POCS2' => 'Pickoff/Caught Stealing 2nd',
|
|
40
|
+
'POCS3' => 'Pickoff/Caught Stealing 3nd',
|
|
41
|
+
'POCS4' => 'Pickoff/Caught Stealing Home',
|
|
42
|
+
'AD1' => 'Advance 1st',
|
|
43
|
+
'AD2' => 'Advance 2nd',
|
|
44
|
+
'AD3' => 'Advance 3rd',
|
|
45
|
+
'SB2' => 'Stole 2nd',
|
|
46
|
+
'SB2E4E' => 'Stole 2nd, error to home (earned)',
|
|
47
|
+
'SB3' => 'Stole 3rd',
|
|
48
|
+
'SB3E4E' => 'Stole 3rd, error to home (earned)',
|
|
49
|
+
'SB4' => 'Stole Home',
|
|
50
|
+
'TO2' => 'Tag out 2nd',
|
|
51
|
+
'TO3' => 'Tag out 3rd',
|
|
52
|
+
'TO4' => 'Tag out Home',
|
|
53
|
+
'FO1' => 'Force out 1st',
|
|
54
|
+
'FO2' => 'Force out 2nd',
|
|
55
|
+
'FO3' => 'Force out 3rd',
|
|
56
|
+
'FO4' => 'Force out Home',
|
|
57
|
+
'CS2' => 'Caught Stealing 2nd',
|
|
58
|
+
'CS3' => 'Caught Stealing 3rd',
|
|
59
|
+
'CS4' => 'Caught Stealing Home',
|
|
60
|
+
'SB2E3' => 'Stole 2nd, error to 3rd',
|
|
61
|
+
'SB2E4' => 'Stole 2nd, error to Home',
|
|
62
|
+
'SB3E4' => 'Stole 3nd, error to Home',
|
|
63
|
+
'DI2' => 'Indifference to 2nd',
|
|
64
|
+
'DI3' => 'Indifference to 3rd',
|
|
65
|
+
'DO1' => 'Doubled off 1st',
|
|
66
|
+
'DO2' => 'Doubled off 2nd',
|
|
67
|
+
'DO3' => 'Doubled off 3rd',
|
|
68
|
+
'RI' => 'Runner Interference',
|
|
69
|
+
'OOA' => 'Out on Appeal',
|
|
70
|
+
'OBP' => 'Out of Base Path',
|
|
71
|
+
'HBB' => 'Hit by Batted Ball',
|
|
72
|
+
}
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
module Sportradar
|
|
2
|
+
module Api
|
|
3
|
+
module Baseball
|
|
4
|
+
class Scoring < Data
|
|
5
|
+
attr_accessor :response, :api, :id, :home, :away, :scores
|
|
6
|
+
|
|
7
|
+
def initialize(data, **opts)
|
|
8
|
+
@api = opts[:api]
|
|
9
|
+
@game = opts[:game]
|
|
10
|
+
|
|
11
|
+
@scores = {}
|
|
12
|
+
@id = data['id']
|
|
13
|
+
|
|
14
|
+
update(data, **opts)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def update(data, source: nil, **opts)
|
|
18
|
+
new_scores = case source
|
|
19
|
+
when :box
|
|
20
|
+
parse_from_box(data)
|
|
21
|
+
when :pbp
|
|
22
|
+
parse_from_pbp(data)
|
|
23
|
+
when :summary
|
|
24
|
+
parse_from_box(data)
|
|
25
|
+
when :rhe
|
|
26
|
+
data
|
|
27
|
+
else
|
|
28
|
+
# if data['quarter'] || data['half']
|
|
29
|
+
# parse_from_pbp(data)
|
|
30
|
+
# elsif data['team']
|
|
31
|
+
# parse_from_box(data)
|
|
32
|
+
# else # schedule requests
|
|
33
|
+
# {}
|
|
34
|
+
# end
|
|
35
|
+
{}
|
|
36
|
+
end
|
|
37
|
+
# parse data structure
|
|
38
|
+
# handle data from team (all quarters)
|
|
39
|
+
# handle data from quarter (both teams)
|
|
40
|
+
# handle data from game?
|
|
41
|
+
@scores.each { |k, v| v.merge!(new_scores.delete(k) || {} ) }
|
|
42
|
+
new_scores.each { |k, v| @scores.merge!(k => v) }
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def runs(team_id)
|
|
46
|
+
@scores.dig(team_id, 'runs').to_i
|
|
47
|
+
end
|
|
48
|
+
def hits(team_id)
|
|
49
|
+
@scores.dig(team_id, 'hits').to_i
|
|
50
|
+
end
|
|
51
|
+
def errors(team_id)
|
|
52
|
+
@scores.dig(team_id, 'errors').to_i
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
alias :points :runs
|
|
56
|
+
|
|
57
|
+
private
|
|
58
|
+
|
|
59
|
+
def parse_from_pbp(data)
|
|
60
|
+
scoring = data['innings'].map {|i| i['scoring'] }.compact
|
|
61
|
+
return {} if scoring.empty?
|
|
62
|
+
scoring.each_with_object({}).with_index(1) do |(hash, memo), idx|
|
|
63
|
+
memo[idx] = {hash.dig('home', 'id') => hash.dig('home', 'runs'), hash.dig('away', 'id') => hash.dig('away', 'runs')}
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def parse_from_box(data)
|
|
68
|
+
id = data.dig('home', 'id')
|
|
69
|
+
da = data.dig('home', 'scoring')
|
|
70
|
+
return {} unless da
|
|
71
|
+
da.each { |h| h[id] = h.delete('runs') }
|
|
72
|
+
id = data.dig('away', 'id')
|
|
73
|
+
db = data.dig('away', 'scoring')
|
|
74
|
+
return {} unless db
|
|
75
|
+
db.each { |h| h[id] = h.delete('runs') }
|
|
76
|
+
da.zip(db).map{ |a, b| [a['sequence'].to_i, a.merge(b)] }.sort{ |(a,_), (b,_)| a <=> b }.to_h
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def parse_from_summary(data)
|
|
80
|
+
#
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|