sportradar-api 0.9.59 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.env.sample +5 -1
  3. data/Gemfile.lock +4 -4
  4. data/README.md +1 -1
  5. data/lib/sportradar/api.rb +1 -0
  6. data/lib/sportradar/api/basketball.rb +15 -6
  7. data/lib/sportradar/api/basketball/game.rb +285 -0
  8. data/lib/sportradar/api/basketball/injury.rb +6 -6
  9. data/lib/sportradar/api/basketball/nba.rb +22 -25
  10. data/lib/sportradar/api/basketball/nba/conference.rb +1 -1
  11. data/lib/sportradar/api/basketball/nba/division.rb +2 -1
  12. data/lib/sportradar/api/basketball/nba/game.rb +12 -249
  13. data/lib/sportradar/api/basketball/nba/hierarchy.rb +5 -4
  14. data/lib/sportradar/api/basketball/nba/player.rb +8 -8
  15. data/lib/sportradar/api/basketball/nba/quarter.rb +1 -1
  16. data/lib/sportradar/api/basketball/nba/schedule.rb +17 -6
  17. data/lib/sportradar/api/basketball/nba/scoring.rb +15 -95
  18. data/lib/sportradar/api/basketball/nba/season.rb +6 -5
  19. data/lib/sportradar/api/basketball/nba/team.rb +5 -122
  20. data/lib/sportradar/api/basketball/ncaamb.rb +133 -0
  21. data/lib/sportradar/api/basketball/ncaamb/conference.rb +41 -0
  22. data/lib/sportradar/api/basketball/ncaamb/division.rb +42 -0
  23. data/lib/sportradar/api/basketball/ncaamb/game.rb +60 -0
  24. data/lib/sportradar/api/basketball/ncaamb/half.rb +49 -0
  25. data/lib/sportradar/api/basketball/ncaamb/hierarchy.rb +65 -0
  26. data/lib/sportradar/api/basketball/ncaamb/player.rb +162 -0
  27. data/lib/sportradar/api/basketball/ncaamb/schedule.rb +41 -0
  28. data/lib/sportradar/api/basketball/ncaamb/season.rb +42 -0
  29. data/lib/sportradar/api/basketball/ncaamb/team.rb +40 -0
  30. data/lib/sportradar/api/basketball/play.rb +15 -5
  31. data/lib/sportradar/api/basketball/plays.rb +1 -0
  32. data/lib/sportradar/api/basketball/plays/base.rb +30 -6
  33. data/lib/sportradar/api/basketball/plays/deadball.rb +11 -0
  34. data/lib/sportradar/api/basketball/plays/end_period.rb +2 -2
  35. data/lib/sportradar/api/basketball/plays/free_throw_miss.rb +3 -1
  36. data/lib/sportradar/api/basketball/plays/rebound.rb +5 -1
  37. data/lib/sportradar/api/basketball/plays/shot_made.rb +4 -3
  38. data/lib/sportradar/api/basketball/plays/shot_miss.rb +4 -3
  39. data/lib/sportradar/api/basketball/plays/timeout.rb +0 -3
  40. data/lib/sportradar/api/basketball/plays/turnover.rb +1 -1
  41. data/lib/sportradar/api/basketball/record.rb +32 -0
  42. data/lib/sportradar/api/basketball/scoring.rb +103 -0
  43. data/lib/sportradar/api/basketball/team.rb +148 -0
  44. data/lib/sportradar/api/data.rb +2 -0
  45. data/lib/sportradar/api/poll.rb +40 -0
  46. data/lib/sportradar/api/request.rb +15 -6
  47. data/lib/sportradar/api/version.rb +1 -1
  48. metadata +18 -7
  49. data/lib/sportradar/api/basketball/bio.rb +0 -33
  50. data/lib/sportradar/api/basketball/nba/overview.rb +0 -64
  51. data/lib/sportradar/api/basketball/nba/record.rb +0 -34
  52. data/lib/sportradar/api/basketball/overview.rb +0 -74
  53. data/lib/sportradar/api/basketball/profile.rb +0 -48
@@ -0,0 +1,49 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Ncaamb
5
+ class Half < Data
6
+ attr_accessor :response, :id, :game, :number, :sequence, :home_points, :away_points, :drives
7
+ # @all_hash = {}
8
+ # def self.new(data, **opts)
9
+ # existing = @all_hash[data['id']]
10
+ # if existing
11
+ # existing.update(data, **opts)
12
+ # existing
13
+ # else
14
+ # @all_hash[data['id']] = super
15
+ # end
16
+ # end
17
+ # def self.all
18
+ # @all_hash.values
19
+ # end
20
+
21
+ def initialize(data, **opts)
22
+ @response = data
23
+ @api = opts[:api]
24
+ # @game = opts[:game]
25
+
26
+ @id = response["id"]
27
+ @number = response['number']
28
+ @sequence = response['sequence']
29
+
30
+ @plays_hash = {}
31
+
32
+ update(data)
33
+ end
34
+ def update(data, **opts)
35
+ create_data(@plays_hash, data.dig('events'), klass: Play, api: @api, half: self)
36
+ end
37
+
38
+ def plays
39
+ @plays_hash.values
40
+ end
41
+ alias :events :plays
42
+
43
+ private
44
+
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,65 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Ncaamb
5
+ class Hierarchy < Data
6
+ attr_accessor :response, :id, :name, :alias
7
+ def all_attributes
8
+ [:name, :alias, :conferences, :divisions, :teams]
9
+ end
10
+
11
+ def initialize(data, **opts)
12
+ # @response = data
13
+ @api = opts[:api]
14
+
15
+ @id = data.dig('league', 'id')
16
+ @name = data.dig('league', 'name')
17
+ @alias = data.dig('league', 'alias')
18
+
19
+ @divisions_hash = create_data({}, data['divisions'], klass: Division, hierarchy: self, api: @api)
20
+ end
21
+ def divisions
22
+ @divisions_hash.values
23
+ end
24
+ def division(code_name)
25
+ divisions_by_name[code_name]
26
+ end
27
+ private def divisions_by_name
28
+ @divisions_by_name ||= divisions.map { |d| [d.alias, d] }.to_h
29
+ end
30
+ def conferences
31
+ divisions.flat_map(&:conferences)
32
+ end
33
+ def teams
34
+ conferences.flat_map(&:teams)
35
+ end
36
+
37
+ def api
38
+ @api || Sportradar::Api::Basketball::Ncaamb.new
39
+ end
40
+
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ __END__
48
+
49
+ st = sr.standings;
50
+
51
+ st = sr.standings;
52
+ sr = Sportradar::Api::Basketball::Ncaamb.new;
53
+ lh = sr.hierarchy;
54
+ div = lh.division('D1');
55
+ div.teams.count
56
+ div.conferences.count
57
+ div.conferences.first;
58
+ p12 = div.conference('PAC12');
59
+ t = p12.team('ARIZ') # => 'id' => "9b166a3f-e64b-4825-bb6b-92c6f0418263"
60
+ t = div.teams.sample
61
+ res = t.get_roster;
62
+ res = t.get_season_stats;
63
+
64
+ t = lh.teams.first;
65
+ t.venue.id
@@ -0,0 +1,162 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Ncaamb
5
+ class Player < Data
6
+ attr_accessor :response, :id, :number, :full_name, :first_name, :last_name, :position, :birth_place, :college, :height, :weight, :averages, :totals, :draft
7
+ # @all_hash = {}
8
+ # def self.new(data, **opts)
9
+ # existing = @all_hash[data['id']]
10
+ # if existing
11
+ # existing.update(data, **opts)
12
+ # existing
13
+ # else
14
+ # @all_hash[data['id']] = super
15
+ # end
16
+ # end
17
+ # def self.all
18
+ # @all_hash.values
19
+ # end
20
+
21
+
22
+ def initialize(data, **opts)
23
+ @response = data
24
+ @api = opts[:api]
25
+ @team = opts[:team]
26
+
27
+ @id = data["id"]
28
+
29
+ update(data, **opts)
30
+ end
31
+
32
+ def bio
33
+ Bio.new(self)
34
+ end
35
+
36
+ def name # to match api for NFL::Player
37
+ full_name
38
+ end
39
+ def display_name
40
+ full_name
41
+ end
42
+ def jersey
43
+ @jersey_number
44
+ end
45
+
46
+ def birth_date # to match api for NFL::Player
47
+ @birthdate
48
+ end
49
+
50
+ def update(data, **opts)
51
+ @status = data['status'] if data['status'] # "ACT",
52
+ @full_name = data['full_name'] if data['full_name'] # "Festus Ezeli",
53
+ @first_name = data['first_name'] if data['first_name'] # "Festus",
54
+ @last_name = data['last_name'] if data['last_name'] # "Ezeli",
55
+ @abbr_name = data['abbr_name'] if data['abbr_name'] # "F.Ezeli",
56
+ @height = data['height'] if data['height'] # "83",
57
+ @weight = data['weight'] if data['weight'] # "265",
58
+ @position = data['position'] if data['position'] # "C",
59
+ @primary_position = data['primary_position'] if data['primary_position'] # "C",
60
+ @jersey_number = data['jersey_number'] if data['jersey_number'] # "31",
61
+ @experience = data['experience'] if data['experience'] # "3",
62
+ @birth_place = data['birth_place'].gsub(',,', ', ') if data['birth_place'] # "Benin City,, NGA",
63
+ @updated = data['updated'] if data['updated'] # "2016-07-08T12:11:59+00:00",
64
+
65
+
66
+ # NCAA specific below
67
+
68
+ # update_injuries(data)
69
+ # update_draft(data)
70
+
71
+ @team.update_player_stats(self, data['statistics'], opts[:game]) if data['statistics']
72
+ if avgs = data['average']
73
+ @totals = data['total']
74
+ @averages = avgs.except(:player)
75
+ @team.update_player_stats(self, avgs)
76
+ end
77
+
78
+ self
79
+ end
80
+
81
+ def injured?
82
+ # !!(@injury && @injury.out?)
83
+ end
84
+
85
+ def age
86
+ # if birth_date.present?
87
+ # now = Time.now.utc.to_date
88
+ # dob = birth_date.to_date
89
+ # now.year - dob.year - ((now.month > dob.month || (now.month == dob.month && now.day >= dob.day)) ? 0 : 1)
90
+ # end
91
+ end
92
+
93
+ # def stats
94
+ # {
95
+ # "played"=>"true",
96
+ # "active"=>"true",
97
+ # "starter"=>"true",
98
+ # "statistics"=>
99
+ # {"minutes"=>"33:23",
100
+ # "field_goals_made"=>"5",
101
+ # "field_goals_att"=>"11",
102
+ # "field_goals_pct"=>"45.5",
103
+ # "three_points_made"=>"1",
104
+ # "three_points_att"=>"5",
105
+ # "three_points_pct"=>"20.0",
106
+ # "two_points_made"=>"4",
107
+ # "two_points_att"=>"6",
108
+ # "two_points_pct"=>"66.667",
109
+ # "blocked_att"=>"0",
110
+ # "free_throws_made"=>"2",
111
+ # "free_throws_att"=>"2",
112
+ # "free_throws_pct"=>"100.0",
113
+ # "offensive_rebounds"=>"1",
114
+ # "defensive_rebounds"=>"3",
115
+ # "rebounds"=>"4",
116
+ # "assists"=>"6",
117
+ # "turnovers"=>"2",
118
+ # "steals"=>"0",
119
+ # "blocks"=>"0",
120
+ # "assists_turnover_ratio"=>"3.0",
121
+ # "personal_fouls"=>"1",
122
+ # "tech_fouls"=>"0",
123
+ # "flagrant_fouls"=>"0",
124
+ # "pls_min"=>"4",
125
+ # "points"=>"13"}}
126
+ # end
127
+ def update_draft(data)
128
+ # @draft = data['draft'] if data['draft'] # {"team_id"=>"583ec825-fb46-11e1-82cb-f4ce4684ea4c", "year"=>"2012", "round"=>"1", "pick"=>"30"},
129
+ end
130
+ def update_injuries(data)
131
+ # @injury = Injury.new(data['injuries']) if data['injuries']
132
+ # {"injury"=>
133
+ # {"id"=>"06423591-3fc1-4d2b-8c60-a3f30d735345",
134
+ # "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.",
135
+ # "desc"=>"Knee",
136
+ # "status"=>"Out",
137
+ # "start_date"=>"2016-10-25",
138
+ # "update_date"=>"2016-11-09"}}}
139
+ end
140
+
141
+ def api
142
+ @api || Sportradar::Api::Basketball::Nba.new
143
+ end
144
+
145
+
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
151
+
152
+ __END__
153
+
154
+ ss = sr.schedule;
155
+ sr = Sportradar::Api::Basketball::Nba.new
156
+ sd = sr.daily_schedule;
157
+ g = sd.games.last;
158
+ g2 = sd.games.first;
159
+ t = g.home;
160
+ t.get_roster;
161
+ t.players.first
162
+
@@ -0,0 +1,41 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Ncaamb
5
+ class Schedule < Data
6
+ attr_accessor :response, :id, :name, :alias, :date
7
+
8
+ def initialize(data, **opts)
9
+ @response = data
10
+ @api = opts[:api]
11
+
12
+ @id = data.dig('league', 'id')
13
+ @name = data.dig('league', 'name')
14
+ @alias = data.dig('league', 'alias')
15
+ @date = data['date']
16
+
17
+ @games_hash = {}
18
+ update_games(data['games']) if data['games']
19
+ end
20
+
21
+ def games
22
+ @games_hash.values
23
+ end
24
+
25
+ def update_games(data)
26
+ create_data(@games_hash, data, klass: Game, api: @api, season: self)
27
+ end
28
+
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ __END__
36
+
37
+ sr = Sportradar::Api::Basketball::Ncaamb.new
38
+ sd = sr.daily_schedule(Date.new(2017, 1, 21));
39
+ g = sd.games.sample
40
+
41
+ ss = sr.schedule;
@@ -0,0 +1,42 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Ncaamb
5
+ class Season < Basketball::Season
6
+ attr_accessor :response, :id, :name, :alias
7
+
8
+ def initialize(data, **opts)
9
+ @response = data
10
+ @api = opts[:api]
11
+
12
+ @id = data.dig('league', 'id')
13
+ @name = data.dig('league', 'name')
14
+ @alias = data.dig('league', 'alias')
15
+
16
+ @games_hash = {}
17
+ update_games(data['games'])
18
+ end
19
+
20
+ def games
21
+ @games_hash.values
22
+ end
23
+
24
+ def year
25
+ 2016 # what is this doing here?
26
+ end
27
+
28
+ def update_games(data)
29
+ create_data(@games_hash, data, klass: Game, api: @api, season: self)
30
+ end
31
+
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ __END__
39
+
40
+ sr = Sportradar::Api::Basketball::Ncaamb.new
41
+ sd = sr.daily_schedule;
42
+ ss = sr.schedule;
@@ -0,0 +1,40 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Ncaamb
5
+ class Team < Sportradar::Api::Basketball::Team
6
+ @all_hash = {}
7
+
8
+ def player_class
9
+ Player
10
+ end
11
+
12
+ def api
13
+ @api || Sportradar::Api::Basketball::Ncaamb.new
14
+ end
15
+
16
+ def good_guys?
17
+ id == "9b166a3f-e64b-4825-bb6b-92c6f0418263"
18
+ end
19
+
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ __END__
27
+ ss = sr.schedule;
28
+ sd = sr.daily_schedule;
29
+ sr = Sportradar::Api::Basketball::Nba.new
30
+ lh = sr.league_hierarchy;
31
+ t = lh.teams.first;
32
+ ss = t.get_season_stats;
33
+ g = sd.games.last;
34
+ t = g.home;
35
+ Sportradar::Api::Basketball::Nba::Team.all.size
36
+
37
+
38
+ # week_count = ss.weeks.count;
39
+ # w1 = ss.weeks.first;
40
+ # w1 = ss.weeks(1);
@@ -17,14 +17,19 @@ module Sportradar
17
17
  # end
18
18
  def self.new(data, **opts)
19
19
  klass = subclass(data['event_type'])
20
- klass.new(data, **opts) rescue nil
20
+ klass.new(data, **opts)
21
+ # rescue => e
22
+ # binding.pry
21
23
  end
22
24
  # def self.all
23
25
  # @all_hash.values
24
26
  # end
25
27
 
26
28
  def self.subclass(event_type)
27
- {
29
+ subclasses[event_type]
30
+ end
31
+ def self.subclasses
32
+ @subclasses ||= {
28
33
  "opentip" => OpenTip,
29
34
  "twopointmiss" => TwoPointMiss,
30
35
  "rebound" => Rebound,
@@ -34,6 +39,7 @@ module Sportradar
34
39
  "turnover" => Turnover,
35
40
  "personalfoul" => PersonalFoul,
36
41
  "jumpball" => Jumpball,
42
+ "deadball" => Deadball,
37
43
  "teamtimeout" => TeamTimeout,
38
44
  "shootingfoul" => ShootingFoul,
39
45
  "freethrowmade" => FreeThrowMade,
@@ -53,12 +59,16 @@ module Sportradar
53
59
  "flagranttwo" => FlagrantTwo,
54
60
  "delay" => Delay,
55
61
  "ejection" => Ejection,
56
- }[event_type]
62
+ # abstract types, used for lookup purposes
63
+ "foul" => Foul,
64
+ "shotmade" => ShotMade,
65
+ "shotmiss" => ShotMiss,
66
+ }.freeze
57
67
  end
58
68
 
59
- SHOT_TYPES = %w[driving pullup step back fadeaway putback floating finger roll turnaround reverse alley-oop]
69
+ # SHOT_TYPES = %w[driving pullup step back fadeaway putback floating finger roll turnaround reverse alley-oop]
60
70
 
61
- PLAY_TYPES = %w[clearpathfoul defensivethreeseconds delay ejection endperiod flagrantone flagranttwo freethrowmade freethrowmiss jumpball kickball offensivefoul officialtimeout openinbound opentip personalfoul possession rebound review shootingfoul teamtimeout technicalfoul threepointmade threepointmiss turnover tvtimeout twopointmade twopointmiss warning]
71
+ # PLAY_TYPES = %w[clearpathfoul defensivethreeseconds delay ejection endperiod flagrantone flagranttwo freethrowmade freethrowmiss jumpball kickball offensivefoul officialtimeout openinbound opentip personalfoul possession rebound review shootingfoul teamtimeout technicalfoul threepointmade threepointmiss turnover tvtimeout twopointmade twopointmiss warning]
62
72
  end
63
73
  end
64
74
  end