sportradar-api 0.9.24 → 0.9.25
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.env.sample +1 -1
- data/Gemfile.lock +2 -2
- data/README.md +1 -1
- data/lib/sportradar/api.rb +23 -1
- data/lib/sportradar/api/basketball.rb +21 -0
- data/lib/sportradar/api/basketball/bio.rb +33 -0
- data/lib/sportradar/api/basketball/broadcast.rb +15 -0
- data/lib/sportradar/api/basketball/nba.rb +123 -0
- data/lib/sportradar/api/basketball/nba/conference.rb +27 -0
- data/lib/sportradar/api/basketball/nba/division.rb +29 -0
- data/lib/sportradar/api/basketball/nba/game.rb +263 -0
- data/lib/sportradar/api/basketball/nba/hierarchy.rb +46 -0
- data/lib/sportradar/api/basketball/nba/overview.rb +64 -0
- data/lib/sportradar/api/basketball/nba/player.rb +146 -0
- data/lib/sportradar/api/basketball/nba/quarter.rb +51 -0
- data/lib/sportradar/api/basketball/nba/record.rb +34 -0
- data/lib/sportradar/api/basketball/nba/schedule.rb +32 -0
- data/lib/sportradar/api/basketball/nba/scoring.rb +89 -0
- data/lib/sportradar/api/basketball/nba/season.rb +42 -0
- data/lib/sportradar/api/basketball/nba/team.rb +166 -0
- data/lib/sportradar/api/basketball/overview.rb +74 -0
- data/lib/sportradar/api/basketball/play.rb +65 -0
- data/lib/sportradar/api/basketball/plays.rb +38 -0
- data/lib/sportradar/api/basketball/plays/assist.rb +11 -0
- data/lib/sportradar/api/basketball/plays/base.rb +88 -0
- data/lib/sportradar/api/basketball/plays/block.rb +11 -0
- data/lib/sportradar/api/basketball/plays/clear_path_foul.rb +9 -0
- data/lib/sportradar/api/basketball/plays/defensive_three_seconds.rb +8 -0
- data/lib/sportradar/api/basketball/plays/delay.rb +9 -0
- data/lib/sportradar/api/basketball/plays/ejection.rb +9 -0
- data/lib/sportradar/api/basketball/plays/end_period.rb +15 -0
- data/lib/sportradar/api/basketball/plays/flagrant_one.rb +9 -0
- data/lib/sportradar/api/basketball/plays/flagrant_two.rb +9 -0
- data/lib/sportradar/api/basketball/plays/foul.rb +14 -0
- data/lib/sportradar/api/basketball/plays/free_throw_made.rb +20 -0
- data/lib/sportradar/api/basketball/plays/free_throw_miss.rb +20 -0
- data/lib/sportradar/api/basketball/plays/jumpball.rb +9 -0
- data/lib/sportradar/api/basketball/plays/kickball.rb +9 -0
- data/lib/sportradar/api/basketball/plays/lineup_change.rb +9 -0
- data/lib/sportradar/api/basketball/plays/offensive_foul.rb +9 -0
- data/lib/sportradar/api/basketball/plays/official_timeout.rb +9 -0
- data/lib/sportradar/api/basketball/plays/open_inbound.rb +9 -0
- data/lib/sportradar/api/basketball/plays/open_tip.rb +9 -0
- data/lib/sportradar/api/basketball/plays/personal_foul.rb +9 -0
- data/lib/sportradar/api/basketball/plays/rebound.rb +15 -0
- data/lib/sportradar/api/basketball/plays/review.rb +8 -0
- data/lib/sportradar/api/basketball/plays/shooting_foul.rb +9 -0
- data/lib/sportradar/api/basketball/plays/shot_made.rb +21 -0
- data/lib/sportradar/api/basketball/plays/shot_miss.rb +21 -0
- data/lib/sportradar/api/basketball/plays/steal.rb +11 -0
- data/lib/sportradar/api/basketball/plays/team_timeout.rb +9 -0
- data/lib/sportradar/api/basketball/plays/technical_foul.rb +11 -0
- data/lib/sportradar/api/basketball/plays/three_point_made.rb +11 -0
- data/lib/sportradar/api/basketball/plays/three_point_miss.rb +8 -0
- data/lib/sportradar/api/basketball/plays/timeout.rb +15 -0
- data/lib/sportradar/api/basketball/plays/turnover.rb +16 -0
- data/lib/sportradar/api/basketball/plays/tv_timeout.rb +9 -0
- data/lib/sportradar/api/basketball/plays/two_point_made.rb +11 -0
- data/lib/sportradar/api/basketball/plays/two_point_miss.rb +8 -0
- data/lib/sportradar/api/basketball/profile.rb +48 -0
- data/lib/sportradar/api/basketball/season.rb +20 -0
- data/lib/sportradar/api/basketball/venue.rb +53 -0
- data/lib/sportradar/api/data.rb +42 -0
- data/lib/sportradar/api/mma.rb +195 -0
- 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/ncaafb.rb +185 -0
- data/lib/sportradar/api/ncaafb/drive.rb +89 -0
- data/lib/sportradar/api/ncaafb/game.rb +161 -0
- data/lib/sportradar/api/ncaafb/play.rb +39 -0
- data/lib/sportradar/api/ncaafb/player.rb +61 -0
- data/lib/sportradar/api/ncaafb/quarter.rb +37 -0
- data/lib/sportradar/api/ncaafb/season.rb +71 -0
- data/lib/sportradar/api/ncaafb/team.rb +69 -0
- data/lib/sportradar/api/ncaafb/week.rb +33 -0
- data/lib/sportradar/api/nfl.rb +6 -0
- data/lib/sportradar/api/nfl/conference.rb +2 -1
- data/lib/sportradar/api/request.rb +1 -0
- data/lib/sportradar/api/version.rb +1 -1
- metadata +81 -2
@@ -0,0 +1,89 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
class Ncaafb
|
4
|
+
class Drive < Data
|
5
|
+
attr_accessor :response, :id, :sequence, :start_reason, :end_reason, :play_count, :duration, :first_downs, :gain, :penalty_yards, :scoring_drive, :quarter, :team, :plays, :events
|
6
|
+
|
7
|
+
def initialize(data, **opts)
|
8
|
+
@response = data
|
9
|
+
@api = opts[:api]
|
10
|
+
@game = opts[:game] # scoring drives directly from game via boxscore
|
11
|
+
@quarter = opts[:quarter] || response['quarter'] # via pbp as Quarter || via scoring_drives as number
|
12
|
+
|
13
|
+
@id = response['id']
|
14
|
+
@clock = response['clock']
|
15
|
+
@team = response['team']
|
16
|
+
@sequence = response['sequence'] # via scoring_drives
|
17
|
+
@score = response['score']
|
18
|
+
|
19
|
+
# @sequence = data["sequence"]
|
20
|
+
# @start_reason = data["start_reason"]
|
21
|
+
# @end_reason = data["end_reason"]
|
22
|
+
# @play_count = data["play_count"]
|
23
|
+
# @duration = data["duration"]
|
24
|
+
# @first_downs = data["first_downs"]
|
25
|
+
# @gain = data["gain"]
|
26
|
+
# @penalty_yards = data["penalty_yards"]
|
27
|
+
# @scoring_drive = data["scoring_drive"]
|
28
|
+
# @quarter = Sportradar::Api::Nfl::Quarter.new data["quarter"] if data["quarter"]
|
29
|
+
# @team = Sportradar::Api::Nfl::Team.new data["team"] if data["team"]
|
30
|
+
# @plays = parse_into_array(selector: response["play"], klass: Sportradar::Api::Nfl::Play) if response["play"]
|
31
|
+
# @plays ||= parse_into_array(selector: response["plays"]["play"], klass: Sportradar::Api::Nfl::Play) if response["plays"] && response["plays"]["play"]
|
32
|
+
# @events = parse_into_array(selector: response["event"], klass: Sportradar::Api::Nfl::Event) if response["event"]
|
33
|
+
end
|
34
|
+
|
35
|
+
def plays
|
36
|
+
@plays ||= parse_into_array_with_options(selector: response['play'], klass: Sportradar::Api::Ncaafb::Play, api: @api, drive: self)
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
def self.end_reason_possibilities
|
41
|
+
[
|
42
|
+
'UNKNOWN',
|
43
|
+
'Touchdown',
|
44
|
+
'Safety',
|
45
|
+
'Field Goal',
|
46
|
+
'Missed FG',
|
47
|
+
'Blocked FG',
|
48
|
+
'Blocked FG, Downs',
|
49
|
+
'Blocked FG, Safety',
|
50
|
+
'Punt',
|
51
|
+
'Blocked Punt',
|
52
|
+
'Blocked Punt, Downs',
|
53
|
+
'Blocked Punt, Safety',
|
54
|
+
'Downs',
|
55
|
+
'Interception',
|
56
|
+
'Fumble',
|
57
|
+
'Fumble, Safety',
|
58
|
+
'Muffed FG',
|
59
|
+
'Muffed Punt',
|
60
|
+
'Muffed Kickoff',
|
61
|
+
'Kickoff',
|
62
|
+
'Own Kickoff',
|
63
|
+
'Onside Kick',
|
64
|
+
'Kickoff, No Play',
|
65
|
+
'End of Half',
|
66
|
+
'End of Game',
|
67
|
+
]
|
68
|
+
end
|
69
|
+
def self.normalized_end_reason
|
70
|
+
case end_reason
|
71
|
+
when 'Touchdown'
|
72
|
+
'Touchdown'
|
73
|
+
when 'Field Goal'
|
74
|
+
'Field Goal'
|
75
|
+
when 'Downs'
|
76
|
+
'Downs'
|
77
|
+
when 'Interception', 'Fumble'
|
78
|
+
'Turnover'
|
79
|
+
when 'Punt'
|
80
|
+
'Punt'
|
81
|
+
else
|
82
|
+
'Other'
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,161 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
class Ncaafb
|
4
|
+
class Game < Data
|
5
|
+
# attr_accessor :response, :id, :status, :reference, :number, :scheduled, :entry_mode, :venue, :home, :away, :broadcast, :number, :attendance, :utc_offset, :weather, :clock, :quarter, :summary, :situation, :last_event, :scoring, :scoring_drives, :quarters, :stats, :week, :season
|
6
|
+
attr_accessor :response, :id, :scheduled, :coverage, :home_rotation, :away_rotation, :home, :away, :status, :neutral_site, :home_points, :away_points, :venue, :weather, :broadcast, :links, :summary, :scoring_drives, :teams
|
7
|
+
|
8
|
+
def initialize(data, **opts)
|
9
|
+
@response = data
|
10
|
+
@api = opts[:api]
|
11
|
+
@week = opts[:week]
|
12
|
+
|
13
|
+
@id = response["id"]
|
14
|
+
@year = response['year'] || @week&.season.year
|
15
|
+
@type = response['type'] || @week&.season.type
|
16
|
+
@week_number = response['week'] || @week&.sequence
|
17
|
+
@coverage = response['coverage']
|
18
|
+
@scheduled = Time.parse(response["scheduled"]) if response["scheduled"]
|
19
|
+
@home = Team.new(response['home'], api: api, game: self)
|
20
|
+
@away = Team.new(response['away'], api: api, game: self)
|
21
|
+
@status = response['status']
|
22
|
+
@home_rotation = response['home_rotation']
|
23
|
+
@away_rotation = response['away_rotation']
|
24
|
+
@neutral_site = response['neutral_site'] == 'true'
|
25
|
+
@home_points = response['home_points']
|
26
|
+
@away_points = response['away_points']
|
27
|
+
@venue = response['venue']
|
28
|
+
# @venue = Sportradar::Api::Ncaafb::Venue.new(response["venue"]) if response["venue"]
|
29
|
+
@weather = response['weather']
|
30
|
+
@broadcast = response['broadcast']
|
31
|
+
@links = structure_links response.dig('links', 'link')
|
32
|
+
|
33
|
+
@teams_hash = { @home.id => @home, @away.id => @away }
|
34
|
+
end
|
35
|
+
|
36
|
+
# def current_score
|
37
|
+
# "#{summary.home.points}-#{summary.away.points}" if summary
|
38
|
+
# end
|
39
|
+
|
40
|
+
def box
|
41
|
+
@box ||= get_boxscore
|
42
|
+
end
|
43
|
+
|
44
|
+
def pbp
|
45
|
+
@pbp ||= drives
|
46
|
+
end
|
47
|
+
|
48
|
+
def roster
|
49
|
+
@roster ||= get_roster
|
50
|
+
end
|
51
|
+
|
52
|
+
def quarters
|
53
|
+
@quarters ||= get_pbp
|
54
|
+
end
|
55
|
+
|
56
|
+
def drives
|
57
|
+
@drives ||= quarters.flat_map(&:drives)
|
58
|
+
end
|
59
|
+
|
60
|
+
def plays
|
61
|
+
@plays ||= quarters.flat_map(&:plays)
|
62
|
+
end
|
63
|
+
|
64
|
+
def teams(id = nil)
|
65
|
+
id ? @teams_hash[id.to_i] : @teams_hash.values
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
def update(data)
|
70
|
+
@attendance = data['attendance'] if data['attendance']
|
71
|
+
@summary = data['summary'] if data['summary']
|
72
|
+
@scheduled = Time.parse(data["scheduled"]) if data["scheduled"]
|
73
|
+
home.update(data['home']) if data['home']
|
74
|
+
away.update(data['away']) if data['away']
|
75
|
+
@status = data['status'] if data['status']
|
76
|
+
|
77
|
+
@completed = Time.parse(data['completed']) if data['completed']
|
78
|
+
@quarter = data['quarter'] if data['quarter']
|
79
|
+
@clock = data['clock'] if data['clock']
|
80
|
+
@scoring_drives = set_scoring_drives(data['scoring_drives']) if data['scoring_drives']
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
def set_scoring_drives(data)
|
86
|
+
parse_into_array_with_options(selector: data, klass: Sportradar::Api::Ncaafb::Drive, api: api, game: self)
|
87
|
+
end
|
88
|
+
# def set_team_rosters(data)
|
89
|
+
# update_data(@teams, data)
|
90
|
+
# end
|
91
|
+
|
92
|
+
def path_base
|
93
|
+
"#{ year }/#{ type }/#{ week_number }/#{ away }/#{ home }"
|
94
|
+
end
|
95
|
+
def path_box
|
96
|
+
links['boxscore'] || "#{ path_base }/boxscore"
|
97
|
+
end
|
98
|
+
def path_extended_box
|
99
|
+
"#{ path_base }/extended-boxscore"
|
100
|
+
end
|
101
|
+
def path_pbp
|
102
|
+
links['pbp'] || "#{ path_base }/pbp"
|
103
|
+
end
|
104
|
+
def path_roster
|
105
|
+
links['roster'] || "#{ path_base }/roster"
|
106
|
+
end
|
107
|
+
def path_summary
|
108
|
+
links['summary'] || "#{ path_base }/summary"
|
109
|
+
end
|
110
|
+
|
111
|
+
def get_boxscore
|
112
|
+
data = api.get_data(path_box)['game']
|
113
|
+
update(data)
|
114
|
+
self
|
115
|
+
end
|
116
|
+
def get_pbp
|
117
|
+
data = api.get_data(path_pbp)['game']
|
118
|
+
update(data)
|
119
|
+
@pbp = set_pbp(data['quarter'])
|
120
|
+
end
|
121
|
+
def get_roster
|
122
|
+
data = api.get_data(path_roster)['game']
|
123
|
+
update_data(@teams_hash, data['team'])
|
124
|
+
end
|
125
|
+
|
126
|
+
def set_pbp(data)
|
127
|
+
@quarters = parse_into_array_with_options(selector: data, klass: Sportradar::Api::Ncaafb::Quarter, api: api, game: self)
|
128
|
+
@drives = nil # to clear empty array empty
|
129
|
+
@plays = nil # to clear empty array empty
|
130
|
+
@quarters
|
131
|
+
end
|
132
|
+
|
133
|
+
def api
|
134
|
+
@api || Sportradar::Api::Ncaafb.new
|
135
|
+
end
|
136
|
+
# def set_scoring_drives
|
137
|
+
# if response["scoring_drives"] && response["scoring_drives"]["drive"]
|
138
|
+
# if response["scoring_drives"]["drive"].is_a?(Array)
|
139
|
+
# @scoring_drives = response["scoring_drives"]["drive"].map {|scoring_drive| Sportradar::Api::Nfl::Drive.new scoring_drive }
|
140
|
+
# elsif response["scoring_drives"]["drive"].is_a?(Hash)
|
141
|
+
# @scoring_drives = [ Sportradar::Api::Nfl::Drive.new(response["scoring_drives"]["drive"]) ]
|
142
|
+
# end
|
143
|
+
# end
|
144
|
+
# end
|
145
|
+
KEYS_SCHEDULE = ["id", "scheduled", "coverage", "home_rotation", "away_rotation", "home", "away", "status", "neutral_site", "home_points", "away_points", "venue", "weather", "broadcast", "links"]
|
146
|
+
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
__END__
|
153
|
+
|
154
|
+
sr = Sportradar::Api::Ncaafb.new;
|
155
|
+
ss = sr.schedule;
|
156
|
+
g = ss.weeks.first.games.first;
|
157
|
+
r = g.roster;
|
158
|
+
box = g.box;
|
159
|
+
pbp = g.pbp;
|
160
|
+
pbp.first.class # => Quarter
|
161
|
+
pbp.first.plays.count # => 9
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
class Ncaafb
|
4
|
+
class Play < Data
|
5
|
+
attr_accessor :response, :id, :sequence, :reference, :clock, :home_points, :away_points, :type, :play_clock, :wall_clock, :start_situation, :end_situation, :description, :alt_description, :statistics, :score, :scoring_play, :team_id, :player_id
|
6
|
+
|
7
|
+
def initialize(data, **opts)
|
8
|
+
@response = data
|
9
|
+
@api = opts[:api]
|
10
|
+
@drive = opts[:drive]
|
11
|
+
|
12
|
+
@id = response['id'] # "4ddaf72b-c959-40c1-8bbb-0cd7ee6a32d9",
|
13
|
+
@clock = response['clock'] # "15:00",
|
14
|
+
@type = response['type'] # "kick",
|
15
|
+
@sequence = response['sequence'] # "2",
|
16
|
+
@updated = response['updated'] # "2016-08-27T21:19:31+00:00",
|
17
|
+
@side = response['side'] # "HAW",
|
18
|
+
@yard_line = response['yard_line'] # "48",
|
19
|
+
@down = response['down'] # "1",
|
20
|
+
@yfd = response['yfd'] # "10",
|
21
|
+
@summary = response['summary'] # "kicks 13 yards from HAW 35 to the HAW 48, downed by 28-P.Laird to HAW 48 for no gain (28-C.Hayes).",
|
22
|
+
@links = structure_links(response['links']) # {"link"=>{"rel"=>"summary", "href"=>"/2016/REG/1/HAW/CAL/plays/4ddaf72b-c959-40c1-8bbb-0cd7ee6a32d9.xml", "type"=>"application/xml"}}}
|
23
|
+
@participants = response['participants'] # {"player"=>[{"id"=>"5062ed5a-c920-4350-8be4-e32ac7b0b27b", "name"=>"Patrick Laird", "jersey"=>"28", "position"=>"RB", "team"=>"CAL"}, {"id"=>"0b0548c8-456f-4d6a-b3d1-f4f386b952e7", "name"=>"Cameron Hayes", "jersey"=>"28", "position"=>"DB", "team"=>"HAW"}]},
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
def parse_player
|
28
|
+
# TODO: Currently there is an issue where we are only mapping one player_id to a play, but there are plays with multiple players involved.
|
29
|
+
play_stats = @statistics.penalty || @statistics.rush || @statistics.return || @statistics.receive
|
30
|
+
if play_stats.is_a?(Array)
|
31
|
+
play_stats = play_stats.first
|
32
|
+
end
|
33
|
+
@player_id = play_stats.dig('player', 'id') if play_stats
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
class Ncaafb
|
4
|
+
class Player < Data
|
5
|
+
attr_accessor :response, :id, :name, :name_abbr, :birthdate, :height, :weight, :position, :jersey_number, :status
|
6
|
+
|
7
|
+
def initialize(data, **opts)
|
8
|
+
@response = data
|
9
|
+
@api = opts[:api]
|
10
|
+
@team = opts[:team]
|
11
|
+
|
12
|
+
# case response
|
13
|
+
# when String
|
14
|
+
# @id = response
|
15
|
+
# when Hash
|
16
|
+
# @id = data['id']
|
17
|
+
# update(response)
|
18
|
+
# end
|
19
|
+
|
20
|
+
@id = response['id'] # => "83aa1cc4-9e79-432f-9178-6583fc1cc598",
|
21
|
+
@name_full = response['name_full'] # => "Raymond Davison",
|
22
|
+
@name_first = response['name_first'] # => "Raymond",
|
23
|
+
@name_last = response['name_last'] # => "Davison",
|
24
|
+
@name_abbr = response['name_abbr'] # => "R.Davison",
|
25
|
+
@birthdate = response['birthdate'] # => "",
|
26
|
+
@height = response['height'] # => "74",
|
27
|
+
@weight = response['weight'] # => "225",
|
28
|
+
@position = response['position'] # => "LB",
|
29
|
+
@jersey_number = response['jersey_number'] # => "31",
|
30
|
+
@status = response['status'] # => "ACT",
|
31
|
+
end
|
32
|
+
def full_name
|
33
|
+
# (market || name) ? [market, name].join(' ') : id
|
34
|
+
name_full || [name_first, name_last].join(' ')
|
35
|
+
end
|
36
|
+
def update(data)
|
37
|
+
@name_full = data['name_full'] if data['name_full']
|
38
|
+
@name_first = data['name_first'] if data['name_first']
|
39
|
+
@name_last = data['name_last'] if data['name_last']
|
40
|
+
@name_abbr = data['name_abbr'] if data['name_abbr']
|
41
|
+
@birthdate = data['birthdate'] if data['birthdate']
|
42
|
+
@height = data['height'] if data['height']
|
43
|
+
@weight = data['weight'] if data['weight']
|
44
|
+
@position = data['position'] if data['position']
|
45
|
+
@jersey_number = data['jersey_number'] if data['jersey_number']
|
46
|
+
@status = data['status'] if data['status']
|
47
|
+
end
|
48
|
+
def parse_players(data)
|
49
|
+
# @players = parse_into_array_with_options(data)
|
50
|
+
# data
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
def api
|
55
|
+
@api || Sportradar::Api::Ncaafb.new
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
class Ncaafb
|
4
|
+
class Quarter < Data
|
5
|
+
attr_accessor :response, :id, :number, :sequence, :home_points, :away_points, :drives
|
6
|
+
|
7
|
+
def initialize(data, **opts)
|
8
|
+
@response = data
|
9
|
+
@api = opts[:api]
|
10
|
+
@game = opts[:game]
|
11
|
+
|
12
|
+
@id = response["id"]
|
13
|
+
@number = response['number']
|
14
|
+
@event = response['event']
|
15
|
+
|
16
|
+
# @number = data["number"]
|
17
|
+
# @sequence = data["sequence"]
|
18
|
+
# @home_points = data["home_points"]
|
19
|
+
# # @home_points = response['scoring']['home']['points'] # from play_by_play
|
20
|
+
# @away_points = data["away_points"]
|
21
|
+
# # @away_points = response['scoring']['away']['points'] # from play_by_play
|
22
|
+
# @drives = parse_into_array(selector: response["play_by_play"]["drive"], klass: Sportradar::Api::Nfl::Drive) if response["play_by_play"] && response["play_by_play"]["drive"]
|
23
|
+
end
|
24
|
+
|
25
|
+
def drives
|
26
|
+
@drives ||= parse_into_array_with_options(selector: response['drive'], klass: Sportradar::Api::Ncaafb::Drive, api: @api, quarter: self)
|
27
|
+
end
|
28
|
+
def plays
|
29
|
+
@plays ||= drives.flat_map(&:plays)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
class Ncaafb
|
4
|
+
class Season < Data
|
5
|
+
attr_accessor :response, :id, :year, :type, :name, :injuries, :team, :conferences, :divisions, :teams
|
6
|
+
|
7
|
+
def initialize(data, **opts)
|
8
|
+
@response = data
|
9
|
+
@api = opts[:api]
|
10
|
+
# @season = response['season'] # removing this to reduce ambiguity
|
11
|
+
@year = response['season']
|
12
|
+
@type = response['type']
|
13
|
+
|
14
|
+
# weeks
|
15
|
+
# set_conferences
|
16
|
+
# set_divisions
|
17
|
+
# set_teams
|
18
|
+
end
|
19
|
+
|
20
|
+
# private
|
21
|
+
|
22
|
+
def weeks(number = nil)
|
23
|
+
@weeks_hash ||= parse_into_array_with_options(selector: response["week"], klass: Sportradar::Api::Ncaafb::Week, api: @api, season: self).map { |w| [w.sequence.to_i, w] }.to_h
|
24
|
+
number ? @weeks_hash[number.to_i] : @weeks_hash.values
|
25
|
+
end
|
26
|
+
|
27
|
+
# set_(conferences|divisions|teams) are all identical to the same methods in Hierarchy
|
28
|
+
# There is likely more overlap between Sportradar's NFL standings and NFL hierarchy APIs
|
29
|
+
# Eventually, these should be shared between classes
|
30
|
+
# def set_conferences
|
31
|
+
# @conferences ||= parse_into_array(selector: response["week"], klass: Sportradar::Api::Ncaafb::Week)
|
32
|
+
# if response["conference"]
|
33
|
+
# if response["conference"].is_a?(Array)
|
34
|
+
# @conferences = response["conference"].map {|conference| Sportradar::Api::Nfl::Conference.new conference }
|
35
|
+
# elsif response["conference"].is_a?(Hash)
|
36
|
+
# @conferences = [ Sportradar::Api::Nfl::Conference.new(response["conference"]) ]
|
37
|
+
# end
|
38
|
+
# end
|
39
|
+
# end
|
40
|
+
|
41
|
+
# def set_divisions
|
42
|
+
# if conferences&.all? { |conference| conference.divisions }
|
43
|
+
# @divisions = conferences.flat_map(&:divisions)
|
44
|
+
# elsif response["division"]
|
45
|
+
# if response["division"].is_a?(Array)
|
46
|
+
# @divisions = response["division"].map {|division| Sportradar::Api::Nfl::Division.new division }
|
47
|
+
# elsif response["division"].is_a?(Hash)
|
48
|
+
# @divisions = [ Sportradar::Api::Nfl::Division.new(response["division"]) ]
|
49
|
+
# end
|
50
|
+
# end
|
51
|
+
# end
|
52
|
+
|
53
|
+
# def set_teams
|
54
|
+
# @teams = @divisions.flat_map(&:teams) if divisions&.all? {|division| division.teams }
|
55
|
+
# end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
__END__
|
64
|
+
|
65
|
+
sr = Sportradar::Api::Ncaafb.new;
|
66
|
+
ss = sr.schedule;
|
67
|
+
week_count = ss.weeks.count;
|
68
|
+
w1 = ss.weeks.first;
|
69
|
+
w1 = ss.weeks(1);
|
70
|
+
teams = ss.weeks(1).games.flat_map(&:teams);
|
71
|
+
t = teams.first;
|