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.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/.env.sample +1 -1
  3. data/Gemfile.lock +2 -2
  4. data/README.md +1 -1
  5. data/lib/sportradar/api.rb +23 -1
  6. data/lib/sportradar/api/basketball.rb +21 -0
  7. data/lib/sportradar/api/basketball/bio.rb +33 -0
  8. data/lib/sportradar/api/basketball/broadcast.rb +15 -0
  9. data/lib/sportradar/api/basketball/nba.rb +123 -0
  10. data/lib/sportradar/api/basketball/nba/conference.rb +27 -0
  11. data/lib/sportradar/api/basketball/nba/division.rb +29 -0
  12. data/lib/sportradar/api/basketball/nba/game.rb +263 -0
  13. data/lib/sportradar/api/basketball/nba/hierarchy.rb +46 -0
  14. data/lib/sportradar/api/basketball/nba/overview.rb +64 -0
  15. data/lib/sportradar/api/basketball/nba/player.rb +146 -0
  16. data/lib/sportradar/api/basketball/nba/quarter.rb +51 -0
  17. data/lib/sportradar/api/basketball/nba/record.rb +34 -0
  18. data/lib/sportradar/api/basketball/nba/schedule.rb +32 -0
  19. data/lib/sportradar/api/basketball/nba/scoring.rb +89 -0
  20. data/lib/sportradar/api/basketball/nba/season.rb +42 -0
  21. data/lib/sportradar/api/basketball/nba/team.rb +166 -0
  22. data/lib/sportradar/api/basketball/overview.rb +74 -0
  23. data/lib/sportradar/api/basketball/play.rb +65 -0
  24. data/lib/sportradar/api/basketball/plays.rb +38 -0
  25. data/lib/sportradar/api/basketball/plays/assist.rb +11 -0
  26. data/lib/sportradar/api/basketball/plays/base.rb +88 -0
  27. data/lib/sportradar/api/basketball/plays/block.rb +11 -0
  28. data/lib/sportradar/api/basketball/plays/clear_path_foul.rb +9 -0
  29. data/lib/sportradar/api/basketball/plays/defensive_three_seconds.rb +8 -0
  30. data/lib/sportradar/api/basketball/plays/delay.rb +9 -0
  31. data/lib/sportradar/api/basketball/plays/ejection.rb +9 -0
  32. data/lib/sportradar/api/basketball/plays/end_period.rb +15 -0
  33. data/lib/sportradar/api/basketball/plays/flagrant_one.rb +9 -0
  34. data/lib/sportradar/api/basketball/plays/flagrant_two.rb +9 -0
  35. data/lib/sportradar/api/basketball/plays/foul.rb +14 -0
  36. data/lib/sportradar/api/basketball/plays/free_throw_made.rb +20 -0
  37. data/lib/sportradar/api/basketball/plays/free_throw_miss.rb +20 -0
  38. data/lib/sportradar/api/basketball/plays/jumpball.rb +9 -0
  39. data/lib/sportradar/api/basketball/plays/kickball.rb +9 -0
  40. data/lib/sportradar/api/basketball/plays/lineup_change.rb +9 -0
  41. data/lib/sportradar/api/basketball/plays/offensive_foul.rb +9 -0
  42. data/lib/sportradar/api/basketball/plays/official_timeout.rb +9 -0
  43. data/lib/sportradar/api/basketball/plays/open_inbound.rb +9 -0
  44. data/lib/sportradar/api/basketball/plays/open_tip.rb +9 -0
  45. data/lib/sportradar/api/basketball/plays/personal_foul.rb +9 -0
  46. data/lib/sportradar/api/basketball/plays/rebound.rb +15 -0
  47. data/lib/sportradar/api/basketball/plays/review.rb +8 -0
  48. data/lib/sportradar/api/basketball/plays/shooting_foul.rb +9 -0
  49. data/lib/sportradar/api/basketball/plays/shot_made.rb +21 -0
  50. data/lib/sportradar/api/basketball/plays/shot_miss.rb +21 -0
  51. data/lib/sportradar/api/basketball/plays/steal.rb +11 -0
  52. data/lib/sportradar/api/basketball/plays/team_timeout.rb +9 -0
  53. data/lib/sportradar/api/basketball/plays/technical_foul.rb +11 -0
  54. data/lib/sportradar/api/basketball/plays/three_point_made.rb +11 -0
  55. data/lib/sportradar/api/basketball/plays/three_point_miss.rb +8 -0
  56. data/lib/sportradar/api/basketball/plays/timeout.rb +15 -0
  57. data/lib/sportradar/api/basketball/plays/turnover.rb +16 -0
  58. data/lib/sportradar/api/basketball/plays/tv_timeout.rb +9 -0
  59. data/lib/sportradar/api/basketball/plays/two_point_made.rb +11 -0
  60. data/lib/sportradar/api/basketball/plays/two_point_miss.rb +8 -0
  61. data/lib/sportradar/api/basketball/profile.rb +48 -0
  62. data/lib/sportradar/api/basketball/season.rb +20 -0
  63. data/lib/sportradar/api/basketball/venue.rb +53 -0
  64. data/lib/sportradar/api/data.rb +42 -0
  65. data/lib/sportradar/api/mma.rb +195 -0
  66. data/lib/sportradar/api/mma/event.rb +111 -0
  67. data/lib/sportradar/api/mma/fight.rb +107 -0
  68. data/lib/sportradar/api/mma/fighter.rb +95 -0
  69. data/lib/sportradar/api/mma/judge.rb +70 -0
  70. data/lib/sportradar/api/mma/league.rb +63 -0
  71. data/lib/sportradar/api/mma/referee.rb +70 -0
  72. data/lib/sportradar/api/mma/result.rb +68 -0
  73. data/lib/sportradar/api/mma/roster.rb +72 -0
  74. data/lib/sportradar/api/mma/schedule.rb +53 -0
  75. data/lib/sportradar/api/mma/score.rb +83 -0
  76. data/lib/sportradar/api/mma/venue.rb +72 -0
  77. data/lib/sportradar/api/ncaafb.rb +185 -0
  78. data/lib/sportradar/api/ncaafb/drive.rb +89 -0
  79. data/lib/sportradar/api/ncaafb/game.rb +161 -0
  80. data/lib/sportradar/api/ncaafb/play.rb +39 -0
  81. data/lib/sportradar/api/ncaafb/player.rb +61 -0
  82. data/lib/sportradar/api/ncaafb/quarter.rb +37 -0
  83. data/lib/sportradar/api/ncaafb/season.rb +71 -0
  84. data/lib/sportradar/api/ncaafb/team.rb +69 -0
  85. data/lib/sportradar/api/ncaafb/week.rb +33 -0
  86. data/lib/sportradar/api/nfl.rb +6 -0
  87. data/lib/sportradar/api/nfl/conference.rb +2 -1
  88. data/lib/sportradar/api/request.rb +1 -0
  89. data/lib/sportradar/api/version.rb +1 -1
  90. metadata +81 -2
@@ -0,0 +1,46 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Nba
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["id"]
16
+ @name = data["name"]
17
+ @alias = data["alias"]
18
+ @conferences_hash = create_data({}, data['conference'], klass: Conference, hierarchy: self, api: @api)
19
+ end
20
+ def conferences
21
+ @conferences_hash.values
22
+ end
23
+ def divisions
24
+ conferences.flat_map(&:divisions)
25
+ end
26
+ def teams
27
+ divisions.flat_map(&:teams)
28
+ end
29
+
30
+ def api
31
+ @api || Sportradar::Api::Basketball::Nba.new
32
+ end
33
+
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ __END__
41
+
42
+ st = sr.standings;
43
+ sr = Sportradar::Api::Basketball::Nba.new
44
+ lh = sr.league_hierarchy;
45
+ t = lh.teams.first;
46
+ t.venue.id
@@ -0,0 +1,64 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Nba
5
+ class Overview < Basketball::Overview
6
+ attr_accessor :response, :api, :id, :game, :home, :away
7
+
8
+ # def initialize(game: )
9
+ # @game = game
10
+ # end
11
+
12
+ # def points(team_id)
13
+ # team_id.is_a?(Symbol) ? @score[@team_ids[team_id]] : @score[team_id]
14
+ # end
15
+ # def set_score(score)
16
+ # @score.merge!(score)
17
+ # end
18
+
19
+ # def update(data, **opts)
20
+
21
+ # @score = { }
22
+
23
+ # @status = data['status'] if data['status']
24
+ # @coverage = data['coverage'] if data['coverage']
25
+ # @home_team = data['home_team'] if data['home_team'] # GUID
26
+ # @away_team = data['away_team'] if data['away_team'] # GUID
27
+ # @team_ids = { home: @home_team, away: @away_team}
28
+ # @scheduled = Time.parse(data["scheduled"]) if data["scheduled"]
29
+ # @venue = data['venue'] if data['venue']
30
+ # # @home = Team.new(data['home'], api: api, game: self) if data['home']
31
+ # # @away = Team.new(data['away'], api: api, game: self) if data['away']
32
+ # @broadcast = data['broadcast']
33
+ # @duration = data['duration'] if data['duration']
34
+ # @clock = data['clock'] if data['clock']
35
+ # @attendance = data['attendance'] if data['attendance']
36
+ # @lead_changes = data['lead_changes'] if data['lead_changes']
37
+ # @times_tied = data['times_tied'] if data['times_tied']
38
+ # @scoring = data['scoring'] if data['scoring']
39
+
40
+ # end
41
+
42
+ # def path_base
43
+ # "games/#{ id }"
44
+ # end
45
+
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ __END__
53
+
54
+ ss = sr.schedule;
55
+ sr = Sportradar::Api::Basketball::Nba.new
56
+ sd = sr.daily_schedule;
57
+ g = sd.games.last;
58
+ box = g.get_box;
59
+ pbp = g.get_pbp;
60
+ g.quarters.size
61
+ g.plays.size
62
+
63
+ Sportradar::Api::Basketball::Nba::Team.all.size # => 32 - includes all star teams
64
+
@@ -0,0 +1,146 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Nba
5
+ class Player < Data
6
+ attr_accessor :response, :id, :number, :full_name, :position, :birth_date, :birth_place, :college
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
+
40
+ def birth_date # to match api for NFL::Player
41
+ @birthdate
42
+ end
43
+
44
+ def update(data, **opts)
45
+ @status = data['status'] if data['status'] # "ACT",
46
+ @full_name = data['full_name'] if data['full_name'] # "Festus Ezeli",
47
+ @first_name = data['first_name'] if data['first_name'] # "Festus",
48
+ @last_name = data['last_name'] if data['last_name'] # "Ezeli",
49
+ @abbr_name = data['abbr_name'] if data['abbr_name'] # "F.Ezeli",
50
+ @height = data['height'] if data['height'] # "83",
51
+ @weight = data['weight'] if data['weight'] # "265",
52
+ @position = data['position'] if data['position'] # "C",
53
+ @primary_position = data['primary_position'] if data['primary_position'] # "C",
54
+ @jersey_number = data['jersey_number'] if data['jersey_number'] # "31",
55
+ @experience = data['experience'] if data['experience'] # "3",
56
+ @college = data['college'] if data['college'] # "Vanderbilt",
57
+ @birth_place = data['birth_place'] if data['birth_place'] # "Benin City,, NGA",
58
+ @birthdate = data['birthdate'] if data['birthdate'] # "1989-10-21",
59
+ @updated = data['updated'] if data['updated'] # "2016-07-08T12:11:59+00:00",
60
+ update_injuries(data)
61
+ update_draft(data)
62
+
63
+ @team.update_player_stats(self, data['statistics'], opts[:game]) if data['statistics']
64
+ @team.update_player_stats(self, data.dig('overall', 'average')) if data.dig('overall', 'average')
65
+
66
+ self
67
+ end
68
+
69
+ def age
70
+ if birth_date.present?
71
+ now = Time.now.utc.to_date
72
+ dob = birth_date.to_date
73
+ now.year - dob.year - ((now.month > dob.month || (now.month == dob.month && now.day >= dob.day)) ? 0 : 1)
74
+ end
75
+ end
76
+
77
+ # def stats
78
+ # {
79
+ # "played"=>"true",
80
+ # "active"=>"true",
81
+ # "starter"=>"true",
82
+ # "statistics"=>
83
+ # {"minutes"=>"33:23",
84
+ # "field_goals_made"=>"5",
85
+ # "field_goals_att"=>"11",
86
+ # "field_goals_pct"=>"45.5",
87
+ # "three_points_made"=>"1",
88
+ # "three_points_att"=>"5",
89
+ # "three_points_pct"=>"20.0",
90
+ # "two_points_made"=>"4",
91
+ # "two_points_att"=>"6",
92
+ # "two_points_pct"=>"66.667",
93
+ # "blocked_att"=>"0",
94
+ # "free_throws_made"=>"2",
95
+ # "free_throws_att"=>"2",
96
+ # "free_throws_pct"=>"100.0",
97
+ # "offensive_rebounds"=>"1",
98
+ # "defensive_rebounds"=>"3",
99
+ # "rebounds"=>"4",
100
+ # "assists"=>"6",
101
+ # "turnovers"=>"2",
102
+ # "steals"=>"0",
103
+ # "blocks"=>"0",
104
+ # "assists_turnover_ratio"=>"3.0",
105
+ # "personal_fouls"=>"1",
106
+ # "tech_fouls"=>"0",
107
+ # "flagrant_fouls"=>"0",
108
+ # "pls_min"=>"4",
109
+ # "points"=>"13"}}
110
+ # end
111
+ def update_draft(data)
112
+ @draft = data['draft'] # {"team_id"=>"583ec825-fb46-11e1-82cb-f4ce4684ea4c", "year"=>"2012", "round"=>"1", "pick"=>"30"},
113
+ end
114
+ def update_injuries(data)
115
+ @injuries = data['injuries'] #
116
+ # {"injury"=>
117
+ # {"id"=>"06423591-3fc1-4d2b-8c60-a3f30d735345",
118
+ # "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.",
119
+ # "desc"=>"Knee",
120
+ # "status"=>"Out",
121
+ # "start_date"=>"2016-10-25",
122
+ # "update_date"=>"2016-11-09"}}}
123
+ end
124
+
125
+ def api
126
+ @api || Sportradar::Api::Basketball::Nba.new
127
+ end
128
+
129
+
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
135
+
136
+ __END__
137
+
138
+ ss = sr.schedule;
139
+ sr = Sportradar::Api::Basketball::Nba.new
140
+ sd = sr.daily_schedule;
141
+ g = sd.games.last;
142
+ g2 = sd.games.first;
143
+ t = g.home;
144
+ t.get_roster;
145
+ t.players.first
146
+
@@ -0,0 +1,51 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Nba
5
+ class Quarter < 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', 'event'), klass: Play, api: @api, quarter: self)
36
+ # rescue => e
37
+ # binding.pry
38
+ end
39
+
40
+ def plays
41
+ @plays_hash.values
42
+ end
43
+ alias :events :plays
44
+
45
+ private
46
+
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,34 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Nba
5
+ class Record < Data
6
+ attr_accessor :id, :team, :wins, :losses, :win_pct, :points_for, :points_against, :point_diff, :games_behind, :streak
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 profile
16
+ Profile.new(self)
17
+ end
18
+
19
+ def update(data, **opts)
20
+ @wins = data['wins'].to_i
21
+ @losses = data['losses'].to_i
22
+ @win_pct = data['win_pct'].to_f
23
+ @points_for = data['points_for']
24
+ @points_against = data['points_against']
25
+ @point_diff = data['point_diff']
26
+ @games_behind = data['games_behind']
27
+ @streak = data['streak']
28
+ end
29
+
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,32 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Nba
5
+ class Schedule < Data
6
+ attr_accessor :response, :matches
7
+
8
+ def initialize(data, **opts)
9
+ @response = data
10
+ @api = opts[:api]
11
+ @id = response['id']
12
+ @name = response['name']
13
+ @alias = response['alias']
14
+ @date = response.dig('daily_schedule', 'date')
15
+
16
+ @games_hash = {}
17
+ update_games(data.dig('daily_schedule', 'games', 'game'))
18
+ end
19
+
20
+ def games
21
+ @games_hash.values
22
+ end
23
+
24
+ def update_games(data)
25
+ create_data(@games_hash, data, klass: Game, api: @api, season: self)
26
+ end
27
+
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,89 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Nba
5
+ class Scoring < Data
6
+ attr_accessor :response, :api, :id, :home, :away, :scores
7
+
8
+ def initialize(data, **opts)
9
+ @api = opts[:api]
10
+ @game = opts[:game]
11
+
12
+ @scores = {
13
+ 1 => {},
14
+ 2 => {},
15
+ 3 => {},
16
+ 4 => {},
17
+ }
18
+ @id = data['id']
19
+
20
+ update(data, **opts)
21
+ end
22
+
23
+ def update(data, source: nil, **opts)
24
+ new_scores = case source
25
+ when :box
26
+ parse_from_box(data)
27
+ when :pbp
28
+ parse_from_pbp(data)
29
+ when :summary
30
+ parse_from_box(data)
31
+ else
32
+ if data['quarter']
33
+ parse_from_pbp(data)
34
+ elsif data['team']
35
+ parse_from_box(data)
36
+ else # schedule requests
37
+ {}
38
+ end
39
+ end
40
+ # parse data structure
41
+ # handle data from team (all quarters)
42
+ # handle data from quarter (both teams)
43
+ # handle data from game?
44
+ @scores.each { |k, v| v.merge!(new_scores.fetch(k, {})) }
45
+ end
46
+
47
+ def points(team_id)
48
+ @score[team_id].to_i
49
+ end
50
+
51
+
52
+ private
53
+
54
+ def parse_from_box(data)
55
+ id = data.dig('team', 0, 'id')
56
+ da = data.dig('team', 0, 'scoring', 'quarter')
57
+ a = [da].compact.flatten(1).each { |h| h[id] = h.delete('points').to_i }
58
+ id = data.dig('team', 1, 'id')
59
+ da = data.dig('team', 1, 'scoring', 'quarter')
60
+ b = [da].compact.flatten(1).each { |h| h[id] = h.delete('points').to_i }
61
+ a.zip(b).map{ |a, b| [a['number'].to_i, a.merge(b)] }.sort{ |(a,_), (b,_)| a <=> b }.to_h
62
+ rescue => e
63
+ binding.pry
64
+ end
65
+
66
+ def parse_from_pbp(data)
67
+ quarters = data['quarter'][1..-1]
68
+ quarters = quarters[0] if quarters.is_a?(Array)
69
+ data = quarters.map{|q| q['scoring'] }
70
+ 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
71
+ rescue => e
72
+ {}
73
+ end
74
+
75
+ def parse_from_summary(data)
76
+ #
77
+ end
78
+
79
+
80
+
81
+ KEYS_PBP = ["xmlns", "id", "status", "coverage", "home_team", "away_team", "scheduled", "duration", "attendance", "lead_changes", "times_tied", "clock", "quarter", "scoring"]
82
+
83
+ KEYS_BOX = ["xmlns", "id", "status", "coverage", "home_team", "away_team", "scheduled", "duration", "attendance", "lead_changes", "times_tied", "clock", "quarter", "team"]
84
+
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end