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,313 @@
|
|
|
1
|
+
module Sportradar
|
|
2
|
+
module Api
|
|
3
|
+
module Football
|
|
4
|
+
class PlayStatistics < Data
|
|
5
|
+
attr_accessor :response, :kick, :return, :rush, :defense, :receive, :punt, :penalty, :pass, :first_down, :field_goal, :extra_point, :defense, :down_conversion
|
|
6
|
+
def initialize(data)
|
|
7
|
+
data = [data] if data.is_a?(Hash)
|
|
8
|
+
@response = data
|
|
9
|
+
data.each do |hash|
|
|
10
|
+
begin
|
|
11
|
+
klass = self.class.stat_type_classes[hash['stat_type']] || MiscStatistics
|
|
12
|
+
instance_variable_set("@#{hash['stat_type']}", klass.new(hash))
|
|
13
|
+
rescue => e
|
|
14
|
+
binding.pry
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.stat_type_classes
|
|
20
|
+
stat_type_classes ||= {
|
|
21
|
+
'kick' => PlayKickStatistics,
|
|
22
|
+
'return' => PlayReturnStatistics,
|
|
23
|
+
'rush' => PlayRushStatistics,
|
|
24
|
+
'fumble' => PlayFumbleStatistics,
|
|
25
|
+
'defense' => PlayDefenseStatistics,
|
|
26
|
+
'receive' => PlayReceiveStatistics,
|
|
27
|
+
'punt' => PlayPuntStatistics,
|
|
28
|
+
'penalty' => PlayPenaltyStatistics,
|
|
29
|
+
'pass' => PlayPassingStatistics,
|
|
30
|
+
'first_down' => PlayFirstDownStatistics,
|
|
31
|
+
'field_goal' => PlayFieldGoalStatistics,
|
|
32
|
+
'extra_point' => PlayExtraPointStatistics,
|
|
33
|
+
'down_conversion' => PlayDownConversionStatistics,
|
|
34
|
+
'conversion' => ConversionStatistics,
|
|
35
|
+
'block' => BlockStatistics,
|
|
36
|
+
'misc' => MiscStatistics,
|
|
37
|
+
}.freeze
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
class MiscStatistics < Data
|
|
42
|
+
attr_reader :team, :player, :yards
|
|
43
|
+
def initialize(data)
|
|
44
|
+
@yards = data['yards']
|
|
45
|
+
@team = OpenStruct.new(data['team']) if data['team']
|
|
46
|
+
@player = OpenStruct.new(data['player']) if data['player']
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
class BlockStatistics < Data
|
|
51
|
+
attr_reader :team, :player, :block, :category
|
|
52
|
+
def initialize(data)
|
|
53
|
+
@category = data['category']
|
|
54
|
+
@block = data['block']
|
|
55
|
+
@team = OpenStruct.new(data['team']) if data['team']
|
|
56
|
+
@player = OpenStruct.new(data['player']) if data['player']
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
class PlayDownConversionStatistics < Data
|
|
61
|
+
attr_accessor :attempt, :complete, :down, :nullified, :team
|
|
62
|
+
def initialize(data)
|
|
63
|
+
@attempt = data['attempt']
|
|
64
|
+
@complete = data['complete']
|
|
65
|
+
@down = data['down']
|
|
66
|
+
@team = OpenStruct.new(data['team']) if data['team']
|
|
67
|
+
@nullified = data['nullified']
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def nullified?
|
|
71
|
+
@nullified.to_s == 'true'
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
class PlayDefenseStatistics < Data
|
|
76
|
+
attr_accessor :ast_tackle, :interception, :int_yards, :nullified, :pass_defended, :primary, :qb_hit, :sack, :sack_yards, :tlost, :tlost_yards, :team, :player, :tackle, :int_touchdown
|
|
77
|
+
def initialize(data)
|
|
78
|
+
@ast_tackle = data['ast_tackle']
|
|
79
|
+
@interception = data['interception']
|
|
80
|
+
@int_yards = data['int_yards']
|
|
81
|
+
@int_touchdown = data['int_touchdown']
|
|
82
|
+
@nullified = data['nullified']
|
|
83
|
+
@pass_defended = data['pass_defended']
|
|
84
|
+
@primary = data['primary']
|
|
85
|
+
@qb_hit = data['qb_hit']
|
|
86
|
+
@sack = data['sack']
|
|
87
|
+
@sack_yards = data['sack_yards']
|
|
88
|
+
@tlost = data['tlost']
|
|
89
|
+
@tlost_yards = data['tlost_yards']
|
|
90
|
+
@tackle = data['tackle']
|
|
91
|
+
@team = OpenStruct.new(data['team']) if data['team']
|
|
92
|
+
@player = OpenStruct.new(data['player']) if data['player']
|
|
93
|
+
@nullified = data['nullified']
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def nullified?
|
|
97
|
+
@nullified.to_s == 'true'
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
class PlayExtraPointStatistics < Data
|
|
102
|
+
attr_accessor :attempt, :nullified
|
|
103
|
+
def initialize(data)
|
|
104
|
+
@attempt = data['attempt']
|
|
105
|
+
@nullified = data['nullified']
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def nullified?
|
|
109
|
+
@nullified.to_s == 'true'
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
class PlayFieldGoalStatistics < Data
|
|
114
|
+
attr_accessor :attempt, :att_yards, :missed, :yards, :nullified, :blocked, :team, :player
|
|
115
|
+
def initialize(data)
|
|
116
|
+
@attempt = data['attempt']
|
|
117
|
+
@att_yards = data['att_yards']
|
|
118
|
+
@missed = data['missed']
|
|
119
|
+
@blocked = data['blocked']
|
|
120
|
+
@yards = data['yards']
|
|
121
|
+
@nullified = data['nullified']
|
|
122
|
+
@team = OpenStruct.new(data['team']) if data['team']
|
|
123
|
+
@player = OpenStruct.new(data['player']) if data['player']
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def nullified?
|
|
127
|
+
@nullified.to_s == 'true'
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
class PlayFirstDownStatistics < Data
|
|
132
|
+
attr_accessor :category, :nullified, :team
|
|
133
|
+
def initialize(data)
|
|
134
|
+
@category = data['category']
|
|
135
|
+
@team = OpenStruct.new(data['team']) if data['team']
|
|
136
|
+
@nullified = data['nullified']
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def nullified?
|
|
140
|
+
@nullified.to_s == 'true'
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
class PlayPassingStatistics < Data
|
|
145
|
+
attr_accessor :attempt, :att_yards, :complete, :firstdown, :goaltogo, :inside_20, :interception, :sack, :sack_yards, :touchdown, :yards, :nullified, :team, :player
|
|
146
|
+
def initialize(data)
|
|
147
|
+
@attempt = data['attempt']
|
|
148
|
+
@att_yards = data['att_yards']
|
|
149
|
+
@complete = data['complete']
|
|
150
|
+
@firstdown = data['firstdown']
|
|
151
|
+
@goaltogo = data['goaltogo']
|
|
152
|
+
@inside_20 = data['inside_20']
|
|
153
|
+
@interception = data['interception']
|
|
154
|
+
@sack = data['sack']
|
|
155
|
+
@sack_yards = data['sack_yards']
|
|
156
|
+
@touchdown = data['touchdown']
|
|
157
|
+
@yards = data['yards']
|
|
158
|
+
@team = OpenStruct.new(data['team']) if data['team']
|
|
159
|
+
@player = OpenStruct.new(data['player']) if data['player']
|
|
160
|
+
@nullified = data['nullified']
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def nullified?
|
|
164
|
+
@nullified.to_s == 'true'
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
class PlayPenaltyStatistics < Data
|
|
169
|
+
attr_accessor :penalty, :yards, :nullified, :team, :player
|
|
170
|
+
def initialize(data)
|
|
171
|
+
@penalty = data['penalty'] if data['penalty']
|
|
172
|
+
@yards = data['yards'] if data['yards']
|
|
173
|
+
@team = OpenStruct.new(data['team']) if data['team']
|
|
174
|
+
@player = OpenStruct.new(data['player']) if data['player']
|
|
175
|
+
@nullified = data['nullified']
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def nullified?
|
|
179
|
+
@nullified.to_s == 'true'
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
class PlayPuntStatistics < Data
|
|
184
|
+
attr_accessor :attempt, :downed, :faircatch, :inside_20, :out_of_bounds, :touchback, :yards, :nullified, :team, :player
|
|
185
|
+
def initialize(data)
|
|
186
|
+
data = data.first if data.is_a?(Array)
|
|
187
|
+
@attempt = data['attempt']
|
|
188
|
+
@downed = data['downed']
|
|
189
|
+
@inside_20 = data['inside_20']
|
|
190
|
+
@out_of_bounds = data['out_of_bounds']
|
|
191
|
+
@touchback = data['touchback']
|
|
192
|
+
@yards = data['yards']
|
|
193
|
+
@team = OpenStruct.new(data['team']) if data['team']
|
|
194
|
+
@player = OpenStruct.new(data['player']) if data['player']
|
|
195
|
+
@nullified = data['nullified']
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def nullified?
|
|
199
|
+
@nullified.to_s == 'true'
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
class PlayReceiveStatistics < Data
|
|
204
|
+
attr_accessor :firstdown, :goaltogo, :inside_20, :reception, :target, :touchdown, :yards, :yards_after_catch, :nullified, :team, :player
|
|
205
|
+
def initialize(data)
|
|
206
|
+
@firstdown = data['firstdown']
|
|
207
|
+
@goaltogo = data['goaltogo']
|
|
208
|
+
@inside_20 = data['inside_20']
|
|
209
|
+
@reception = data['reception']
|
|
210
|
+
@target = data['target']
|
|
211
|
+
@touchdown = data['touchdown']
|
|
212
|
+
@yards = data['yards']
|
|
213
|
+
@yards_after_catch = data['yards_after_catch']
|
|
214
|
+
@team = OpenStruct.new(data['team']) if data['team']
|
|
215
|
+
@player = OpenStruct.new(data['player']) if data['player']
|
|
216
|
+
@nullified = data['nullified']
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def nullified?
|
|
220
|
+
@nullified.to_s == 'true'
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
class PlayFumbleStatistics < Data
|
|
225
|
+
attr_reader :own_rec, :own_rec_yards, :forced, :team, :player
|
|
226
|
+
def initialize(data)
|
|
227
|
+
@own_rec = data['own_rec']
|
|
228
|
+
@own_rec_yards = data['own_rec_yards']
|
|
229
|
+
@forced = data['forced']
|
|
230
|
+
|
|
231
|
+
@team = OpenStruct.new(data['team']) if data['team']
|
|
232
|
+
@player = OpenStruct.new(data['player']) if data['player']
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
class PlayRushStatistics < Data
|
|
237
|
+
attr_accessor :attempt, :firstdown, :tlost, :tlost_yards, :yards, :inside_20, :goal_to_go, :team, :player, :nullified, :touchdown
|
|
238
|
+
def initialize(data)
|
|
239
|
+
@attempt = data['attempt']
|
|
240
|
+
@firstdown = data['firstdown']
|
|
241
|
+
@goal_to_go = data['goal_to_go']
|
|
242
|
+
@inside_20 = data['inside_20']
|
|
243
|
+
@tlost = data['tlost']
|
|
244
|
+
@tlost_yards = data['tlost_yards']
|
|
245
|
+
@touchdown = data['touchdown']
|
|
246
|
+
@yards = data['yards']
|
|
247
|
+
|
|
248
|
+
@team = OpenStruct.new(data['team']) if data['team']
|
|
249
|
+
@player = OpenStruct.new(data['player']) if data['player']
|
|
250
|
+
@nullified = data['nullified']
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def nullified?
|
|
254
|
+
@nullified.to_s == 'true'
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
class PlayKickStatistics < Data
|
|
260
|
+
attr_accessor :attempt, :yards, :gross_yards, :touchback, :team, :player, :endzone, :inside_20, :nullified
|
|
261
|
+
def initialize(data)
|
|
262
|
+
@endzone = data['endzone']
|
|
263
|
+
@inside_20 = data['inside_20']
|
|
264
|
+
@attempt = data['attempt']
|
|
265
|
+
@yards = data['yards']
|
|
266
|
+
@gross_yards = data['gross_yards']
|
|
267
|
+
@touchback = data['touchback']
|
|
268
|
+
@team = OpenStruct.new(data['team']) if data['team']
|
|
269
|
+
@player = OpenStruct.new(data['player']) if data['player']
|
|
270
|
+
@nullified = data['nullified']
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
def nullified?
|
|
274
|
+
@nullified.to_s == 'true'
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
class ConversionStatistics < Data
|
|
279
|
+
attr_reader :stat_type, :attempt, :complete, :category, :player, :team
|
|
280
|
+
def initialize(data)
|
|
281
|
+
@stat_type = data['stat_type']
|
|
282
|
+
@attempt = data['attempt']
|
|
283
|
+
@complete = data['complete']
|
|
284
|
+
@category = data['category']
|
|
285
|
+
@player = data['player']
|
|
286
|
+
@team = data['team']
|
|
287
|
+
end
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
class PlayReturnStatistics < Data
|
|
291
|
+
attr_accessor :category, :downed, :faircatch, :out_of_bounds, :return, :touchback, :yards, :team, :nullified, :player, :touchdown
|
|
292
|
+
def initialize(data)
|
|
293
|
+
@category = data['category']
|
|
294
|
+
@downed = data['downed']
|
|
295
|
+
@faircatch = data['faircatch']
|
|
296
|
+
@out_of_bounds = data['out_of_bounds']
|
|
297
|
+
@return = data['return']
|
|
298
|
+
@touchback = data['touchback']
|
|
299
|
+
@touchdown = data['touchdown']
|
|
300
|
+
@yards = data['yards']
|
|
301
|
+
@team = OpenStruct.new(data['team']) if data['team']
|
|
302
|
+
@player = OpenStruct.new(data['player']) if data['player']
|
|
303
|
+
@nullified = data['nullified']
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
def nullified?
|
|
307
|
+
@nullified.to_s == 'true'
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
end
|
|
312
|
+
end
|
|
313
|
+
end
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
module Sportradar
|
|
2
|
+
module Api
|
|
3
|
+
module Football
|
|
4
|
+
class Player < Data
|
|
5
|
+
attr_accessor :response, :id, :preferred_name, :number, :name_full, :name_first, :name_last, :position, :birth_place, :college, :height, :weight, :averages, :totals, :draft, :depth, :api
|
|
6
|
+
|
|
7
|
+
def initialize(data, **opts)
|
|
8
|
+
@response = data
|
|
9
|
+
@api = opts[:api]
|
|
10
|
+
@team = opts[:team]
|
|
11
|
+
|
|
12
|
+
@id = data["id"]
|
|
13
|
+
|
|
14
|
+
update(data, **opts)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def first_name
|
|
18
|
+
@name_first || @first_name
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def last_name
|
|
22
|
+
@name_last || @last_name
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def name # to match api for NFL::Player
|
|
26
|
+
name_full
|
|
27
|
+
end
|
|
28
|
+
def display_name
|
|
29
|
+
preferred_name ? "#{preferred_name} #{last_name}" : name_full
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def birth_date # to match api for NFL::Player
|
|
33
|
+
@birthdate
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def jersey
|
|
37
|
+
@jersey_number
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def update(data, **opts)
|
|
41
|
+
@status = data['status'] if data['status']
|
|
42
|
+
@preferred_name = data['preferred_name'] || data['name_preferred'] || @preferred_name
|
|
43
|
+
@name_full = data['name_full'] || data['name'] || @name_full
|
|
44
|
+
@name_first = data['name_first'] || data['first_name'] || @name_first
|
|
45
|
+
@name_last = data['name_last'] || data['last_name'] || @name_last
|
|
46
|
+
@name_abbr = data['name_abbr'] || data['abbr_name'] || @name_abbr
|
|
47
|
+
@height = data['height'] if data['height']
|
|
48
|
+
@weight = data['weight'] if data['weight']
|
|
49
|
+
@position = data['position'] if data['position']
|
|
50
|
+
@primary_position = data['primary_position'] if data['primary_position']
|
|
51
|
+
@jersey_number = data['jersey_number'] || data['jersey'] || @jersey_number
|
|
52
|
+
@experience = data['experience'] if data['experience']
|
|
53
|
+
@birth_place = data['birth_place'].gsub(',,', ', ') if data['birth_place'] # "Benin City,, NGA",
|
|
54
|
+
@updated = data['updated'] if data['updated'] # "2016-07-08T12:11:59+00:00",
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@depth = data['depth'] if data['depth']
|
|
58
|
+
@games_started = data['games_started'] if data['games_started']
|
|
59
|
+
@games_played = data['games_played'] if data['games_played']
|
|
60
|
+
# NCAA specific below
|
|
61
|
+
|
|
62
|
+
# update_injuries(data)
|
|
63
|
+
# update_draft(data)
|
|
64
|
+
|
|
65
|
+
if stats = data['statistics']
|
|
66
|
+
@totals = stats
|
|
67
|
+
# binding.pry
|
|
68
|
+
@team.update_player_stats(self, stats.dup, opts[:game])
|
|
69
|
+
else
|
|
70
|
+
@totals = {}
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
self
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def injured?
|
|
77
|
+
# !!(@injury && @injury.out?)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def age
|
|
81
|
+
# if birth_date.present?
|
|
82
|
+
# now = Time.now.utc.to_date
|
|
83
|
+
# dob = birth_date.to_date
|
|
84
|
+
# now.year - dob.year - ((now.month > dob.month || (now.month == dob.month && now.day >= dob.day)) ? 0 : 1)
|
|
85
|
+
# end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def update_draft(data)
|
|
89
|
+
# @draft = data['draft'] if data['draft'] # {"team_id"=>"583ec825-fb46-11e1-82cb-f4ce4684ea4c", "year"=>"2012", "round"=>"1", "pick"=>"30"},
|
|
90
|
+
end
|
|
91
|
+
def update_injuries(data)
|
|
92
|
+
# @injury = Injury.new(data['injuries']) if data['injuries']
|
|
93
|
+
# {"injury"=>
|
|
94
|
+
# {"id"=>"06423591-3fc1-4d2b-8c60-a3f30d735345",
|
|
95
|
+
# "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.",
|
|
96
|
+
# "desc"=>"Knee",
|
|
97
|
+
# "status"=>"Out",
|
|
98
|
+
# "start_date"=>"2016-10-25",
|
|
99
|
+
# "update_date"=>"2016-11-09"}}}
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
__END__
|
|
108
|
+
|
|
109
|
+
ncaafb = Marshal.load(File.binread('ncaafb.bin'));
|
|
110
|
+
|
|
111
|
+
t = ncaafb.teams.first;
|
|
112
|
+
t.get_roster;
|
|
113
|
+
t.players.first
|
|
114
|
+
t.players.first.totals
|
|
115
|
+
|
|
116
|
+
ncaafb = Marshal.load(File.binread('ncaafb.bin'));
|
|
117
|
+
t = ncaafb.teams.sample
|
|
118
|
+
data = t.get_season_stats(2016);
|
|
119
|
+
t.get_roster;
|
|
120
|
+
t.players.sample
|
|
121
|
+
t.players.sample.totals
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
module Sportradar
|
|
2
|
+
module Api
|
|
3
|
+
module Football
|
|
4
|
+
class Quarter < Data
|
|
5
|
+
attr_accessor :response, :api, :id, :number, :sequence, :home_points, :away_points, :scoring
|
|
6
|
+
|
|
7
|
+
def initialize(data, **opts)
|
|
8
|
+
@response = data
|
|
9
|
+
@id = data["number"]
|
|
10
|
+
@api = opts[:api]
|
|
11
|
+
|
|
12
|
+
@drives_hash = {}
|
|
13
|
+
|
|
14
|
+
update(data, **opts)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def update(data, **opts)
|
|
18
|
+
@number = data["number"]
|
|
19
|
+
@sequence = data["sequence"]
|
|
20
|
+
@home_points = data["home_points"]
|
|
21
|
+
@away_points = data["away_points"]
|
|
22
|
+
|
|
23
|
+
@home_info = data["home"]
|
|
24
|
+
@away_info = data["away"]
|
|
25
|
+
|
|
26
|
+
create_data(@drives_hash, data['pbp'], klass: drive_class, api: api, quarter: self) if data['pbp']
|
|
27
|
+
|
|
28
|
+
self
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def overtime?
|
|
32
|
+
@number > 4
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def drives
|
|
36
|
+
@drives_hash.values
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def drive_class
|
|
40
|
+
Drive
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
module Sportradar
|
|
2
|
+
module Api
|
|
3
|
+
module Football
|
|
4
|
+
class Record < Data
|
|
5
|
+
attr_accessor :id, :team, :wins, :losses, :win_pct, :points_for, :points_against, :point_diff, :games_behind, :streak
|
|
6
|
+
|
|
7
|
+
def initialize(data, type: 'overall', **opts)
|
|
8
|
+
@team = opts[:team]
|
|
9
|
+
@type = type
|
|
10
|
+
|
|
11
|
+
update(data, **opts)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def update(data, **opts)
|
|
15
|
+
@wins = data['wins']
|
|
16
|
+
@losses = data['losses']
|
|
17
|
+
@win_pct = data['win_pct']
|
|
18
|
+
@points_for = data['points_for']
|
|
19
|
+
@points_against = data['points_against']
|
|
20
|
+
@point_diff = data['point_diff']
|
|
21
|
+
@games_behind = data['games_behind']
|
|
22
|
+
@streak = data['streak']
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def <=>(other)
|
|
26
|
+
self.win_pct <=> other.win_pct
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
__END__
|
|
35
|
+
|
|
36
|
+
"wins"=>14,
|
|
37
|
+
"losses"=>2,
|
|
38
|
+
"ties"=>0,
|
|
39
|
+
"win_pct"=>0.875,
|
|
40
|
+
"points_for"=>441,
|
|
41
|
+
"points_against"=>250,
|
|
42
|
+
"points_rank"=>4,
|
|
43
|
+
"touchdown_diff"=>24,
|
|
44
|
+
"conf_h2h"=>0,
|
|
45
|
+
"rank"=>{"conference"=>1, "division"=>1},
|
|
46
|
+
"streak"=>{"type"=>"win", "length"=>7, "desc"=>"Won 7"},
|
|
47
|
+
"strength_of_schedule"=>{"sos"=>0.439453, "wins"=>113, "total"=>256},
|
|
48
|
+
"strength_of_victory"=>{"sov"=>0.424, "wins"=>95, "total"=>224},
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
module Sportradar
|
|
2
|
+
module Api
|
|
3
|
+
module Football
|
|
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 :extended_box
|
|
22
|
+
parse_from_box(data)
|
|
23
|
+
when :pbp
|
|
24
|
+
parse_from_pbp(data)
|
|
25
|
+
when :summary
|
|
26
|
+
parse_from_summary(data)
|
|
27
|
+
when :statistics
|
|
28
|
+
parse_from_statistics(data)
|
|
29
|
+
else
|
|
30
|
+
if data['quarter'] || data['half']
|
|
31
|
+
parse_from_pbp(data)
|
|
32
|
+
elsif data['team']
|
|
33
|
+
parse_from_box(data)
|
|
34
|
+
else # schedule requests
|
|
35
|
+
{}
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
@scores.each { |k, v| v.merge!(new_scores.delete(k) || {} ) }
|
|
39
|
+
new_scores.each { |k, v| @scores.merge!(k => v) }
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def points(team_id)
|
|
43
|
+
@score[team_id].to_i
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
|
|
49
|
+
def parse_from_box(data)
|
|
50
|
+
# home
|
|
51
|
+
id = data.dig('home_team', 'id')
|
|
52
|
+
da = data.dig('home_team', 'scoring')
|
|
53
|
+
return {} unless da
|
|
54
|
+
home = da.map { |h| [h['quarter'].to_i, { id => h['points'].to_i }] }.to_h
|
|
55
|
+
# away
|
|
56
|
+
id = data.dig('away_team', 'id')
|
|
57
|
+
da = data.dig('away_team', 'scoring')
|
|
58
|
+
return {} unless da
|
|
59
|
+
away = da.map { |h| [h['quarter'].to_i, { id => h['points'].to_i }] }.to_h
|
|
60
|
+
|
|
61
|
+
home.each { |quarter, hash| hash.merge!(away[quarter]) }
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def parse_from_statistics(data)
|
|
65
|
+
{}
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def parse_from_pbp(data)
|
|
69
|
+
# period_name = data.key?('quarter') ? 'quarter' : 'half'
|
|
70
|
+
# period_name = 'periods'
|
|
71
|
+
# return {} unless data[period_name] # game hasn't started
|
|
72
|
+
# quarters = data[period_name]#[1..-1]
|
|
73
|
+
# overtimes = data['overtime']
|
|
74
|
+
# overtimes = [overtimes] if !overtimes.is_a?(Array)
|
|
75
|
+
# quarters = quarters[0] if (quarters.is_a?(Array) && (quarters.size == 1) && quarters.first.is_a?(Array))
|
|
76
|
+
# data = (quarters + overtimes).compact.map{|q| q['scoring'] }
|
|
77
|
+
# data.map.with_index(1) { |h, i| [i, { h.dig('home', 'id') => h.dig('home', 'points').to_i, h.dig('away', 'id') => h.dig('away', 'points').to_i }] }.to_h
|
|
78
|
+
{}
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# def period_name
|
|
82
|
+
# 'quarter'
|
|
83
|
+
# end
|
|
84
|
+
|
|
85
|
+
def parse_from_summary(data)
|
|
86
|
+
{} # nothing for college
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module Sportradar
|
|
2
|
+
module Api
|
|
3
|
+
module Football
|
|
4
|
+
class Situation < Data
|
|
5
|
+
attr_accessor :response, :clock, :down, :yfd, :possession, :location, :team_id
|
|
6
|
+
|
|
7
|
+
def initialize(data)
|
|
8
|
+
@response = data
|
|
9
|
+
@clock = data["clock"]
|
|
10
|
+
@down = data["down"]
|
|
11
|
+
@yfd = data["yfd"]
|
|
12
|
+
@possession = OpenStruct.new(data["possession"]) if data["possession"]
|
|
13
|
+
if data["location"]
|
|
14
|
+
@location = OpenStruct.new(data["location"])
|
|
15
|
+
elsif data['side'] && data['yard_line']
|
|
16
|
+
@location = OpenStruct.new(alias: data['side'], yardline: data['yard_line'])
|
|
17
|
+
end
|
|
18
|
+
@team_id = possession&.id || data["team"]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def spot
|
|
22
|
+
[location&.alias, location&.yardline].compact.join(' ')
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def down_distance
|
|
26
|
+
[@down, @distance].compact.join(' & ')
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|