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.
Files changed (215) hide show
  1. checksums.yaml +4 -4
  2. data/.env.sample +6 -0
  3. data/.travis.yml +1 -0
  4. data/Gemfile.lock +32 -30
  5. data/README.md +12 -9
  6. data/lib/sportradar/api/baseball/README.md +28 -0
  7. data/lib/sportradar/api/baseball/error.rb +25 -0
  8. data/lib/sportradar/api/baseball/event.rb +44 -0
  9. data/lib/sportradar/api/baseball/events/at_bat.rb +96 -0
  10. data/lib/sportradar/api/baseball/events/lineup.rb +41 -0
  11. data/lib/sportradar/api/baseball/events/warming_up.rb +35 -0
  12. data/lib/sportradar/api/baseball/fielder.rb +26 -0
  13. data/lib/sportradar/api/baseball/game.rb +472 -0
  14. data/lib/sportradar/api/baseball/half_inning.rb +69 -0
  15. data/lib/sportradar/api/baseball/inning.rb +42 -0
  16. data/lib/sportradar/api/baseball/lineup.rb +116 -0
  17. data/lib/sportradar/api/baseball/mlb/division.rb +32 -0
  18. data/lib/sportradar/api/baseball/mlb/hierarchy.rb +273 -0
  19. data/lib/sportradar/api/baseball/mlb/league.rb +27 -0
  20. data/lib/sportradar/api/baseball/mlb.rb +84 -0
  21. data/lib/sportradar/api/baseball/outcome.rb +87 -0
  22. data/lib/sportradar/api/baseball/pitch.rb +245 -0
  23. data/lib/sportradar/api/baseball/player.rb +119 -0
  24. data/lib/sportradar/api/baseball/record.rb +42 -0
  25. data/lib/sportradar/api/baseball/runner.rb +78 -0
  26. data/lib/sportradar/api/baseball/scoring.rb +86 -0
  27. data/lib/sportradar/api/baseball/team.rb +147 -0
  28. data/lib/sportradar/api/baseball/venue.rb +51 -0
  29. data/lib/sportradar/api/baseball.rb +46 -0
  30. data/lib/sportradar/api/basketball/broadcast.rb +15 -0
  31. data/lib/sportradar/api/basketball/game.rb +339 -0
  32. data/lib/sportradar/api/basketball/injury.rb +41 -0
  33. data/lib/sportradar/api/basketball/nba/conference.rb +27 -0
  34. data/lib/sportradar/api/basketball/nba/division.rb +30 -0
  35. data/lib/sportradar/api/basketball/nba/game.rb +62 -0
  36. data/lib/sportradar/api/basketball/nba/hierarchy.rb +47 -0
  37. data/lib/sportradar/api/basketball/nba/player.rb +160 -0
  38. data/lib/sportradar/api/basketball/nba/quarter.rb +51 -0
  39. data/lib/sportradar/api/basketball/nba/schedule.rb +43 -0
  40. data/lib/sportradar/api/basketball/nba/scoring.rb +15 -0
  41. data/lib/sportradar/api/basketball/nba/season.rb +54 -0
  42. data/lib/sportradar/api/basketball/nba/series.rb +82 -0
  43. data/lib/sportradar/api/basketball/nba/team.rb +74 -0
  44. data/lib/sportradar/api/basketball/nba.rb +129 -0
  45. data/lib/sportradar/api/basketball/ncaamb/bracket.rb +44 -0
  46. data/lib/sportradar/api/basketball/ncaamb/conference.rb +41 -0
  47. data/lib/sportradar/api/basketball/ncaamb/division.rb +42 -0
  48. data/lib/sportradar/api/basketball/ncaamb/game.rb +75 -0
  49. data/lib/sportradar/api/basketball/ncaamb/half.rb +49 -0
  50. data/lib/sportradar/api/basketball/ncaamb/hierarchy.rb +65 -0
  51. data/lib/sportradar/api/basketball/ncaamb/player.rb +162 -0
  52. data/lib/sportradar/api/basketball/ncaamb/round.rb +55 -0
  53. data/lib/sportradar/api/basketball/ncaamb/schedule.rb +41 -0
  54. data/lib/sportradar/api/basketball/ncaamb/season.rb +55 -0
  55. data/lib/sportradar/api/basketball/ncaamb/team.rb +61 -0
  56. data/lib/sportradar/api/basketball/ncaamb/tournament.rb +154 -0
  57. data/lib/sportradar/api/basketball/ncaamb.rb +149 -0
  58. data/lib/sportradar/api/basketball/play.rb +75 -0
  59. data/lib/sportradar/api/basketball/plays/assist.rb +14 -0
  60. data/lib/sportradar/api/basketball/plays/base.rb +126 -0
  61. data/lib/sportradar/api/basketball/plays/block.rb +14 -0
  62. data/lib/sportradar/api/basketball/plays/clear_path_foul.rb +11 -0
  63. data/lib/sportradar/api/basketball/plays/deadball.rb +11 -0
  64. data/lib/sportradar/api/basketball/plays/defensive_three_seconds.rb +11 -0
  65. data/lib/sportradar/api/basketball/plays/delay.rb +11 -0
  66. data/lib/sportradar/api/basketball/plays/ejection.rb +14 -0
  67. data/lib/sportradar/api/basketball/plays/end_period.rb +28 -0
  68. data/lib/sportradar/api/basketball/plays/flagrant_one.rb +11 -0
  69. data/lib/sportradar/api/basketball/plays/flagrant_two.rb +11 -0
  70. data/lib/sportradar/api/basketball/plays/foul.rb +17 -0
  71. data/lib/sportradar/api/basketball/plays/free_throw_made.rb +23 -0
  72. data/lib/sportradar/api/basketball/plays/free_throw_miss.rb +25 -0
  73. data/lib/sportradar/api/basketball/plays/jumpball.rb +12 -0
  74. data/lib/sportradar/api/basketball/plays/kickball.rb +11 -0
  75. data/lib/sportradar/api/basketball/plays/lineup_change.rb +11 -0
  76. data/lib/sportradar/api/basketball/plays/offensive_foul.rb +11 -0
  77. data/lib/sportradar/api/basketball/plays/official_timeout.rb +11 -0
  78. data/lib/sportradar/api/basketball/plays/open_inbound.rb +9 -0
  79. data/lib/sportradar/api/basketball/plays/open_tip.rb +11 -0
  80. data/lib/sportradar/api/basketball/plays/personal_foul.rb +9 -0
  81. data/lib/sportradar/api/basketball/plays/rebound.rb +28 -0
  82. data/lib/sportradar/api/basketball/plays/review.rb +11 -0
  83. data/lib/sportradar/api/basketball/plays/shooting_foul.rb +9 -0
  84. data/lib/sportradar/api/basketball/plays/shot_made.rb +22 -0
  85. data/lib/sportradar/api/basketball/plays/shot_miss.rb +22 -0
  86. data/lib/sportradar/api/basketball/plays/steal.rb +11 -0
  87. data/lib/sportradar/api/basketball/plays/team_timeout.rb +14 -0
  88. data/lib/sportradar/api/basketball/plays/technical_foul.rb +14 -0
  89. data/lib/sportradar/api/basketball/plays/three_point_made.rb +14 -0
  90. data/lib/sportradar/api/basketball/plays/three_point_miss.rb +11 -0
  91. data/lib/sportradar/api/basketball/plays/timeout.rb +24 -0
  92. data/lib/sportradar/api/basketball/plays/turnover.rb +19 -0
  93. data/lib/sportradar/api/basketball/plays/tv_timeout.rb +11 -0
  94. data/lib/sportradar/api/basketball/plays/two_point_made.rb +14 -0
  95. data/lib/sportradar/api/basketball/plays/two_point_miss.rb +11 -0
  96. data/lib/sportradar/api/basketball/plays.rb +39 -0
  97. data/lib/sportradar/api/basketball/record.rb +28 -0
  98. data/lib/sportradar/api/basketball/scoring.rb +103 -0
  99. data/lib/sportradar/api/basketball/season.rb +20 -0
  100. data/lib/sportradar/api/basketball/team.rb +136 -0
  101. data/lib/sportradar/api/basketball/venue.rb +54 -0
  102. data/lib/sportradar/api/basketball.rb +35 -0
  103. data/lib/sportradar/api/{nfl/broadcast.rb → broadcast.rb} +1 -1
  104. data/lib/sportradar/api/content/article.rb +1 -1
  105. data/lib/sportradar/api/content/article_list.rb +1 -1
  106. data/lib/sportradar/api/content.rb +17 -5
  107. data/lib/sportradar/api/data.rb +53 -0
  108. data/lib/sportradar/api/football/README.md +62 -0
  109. data/lib/sportradar/api/football/drive.rb +114 -0
  110. data/lib/sportradar/api/football/event.rb +36 -0
  111. data/lib/sportradar/api/football/game.rb +404 -0
  112. data/lib/sportradar/api/football/game_stats.rb +135 -0
  113. data/lib/sportradar/api/football/ncaafb/api.rb +81 -0
  114. data/lib/sportradar/api/football/ncaafb/conference.rb +53 -0
  115. data/lib/sportradar/api/football/ncaafb/division.rb +42 -0
  116. data/lib/sportradar/api/football/ncaafb/drive.rb +36 -0
  117. data/lib/sportradar/api/football/ncaafb/game.rb +130 -0
  118. data/lib/sportradar/api/football/ncaafb/play.rb +97 -0
  119. data/lib/sportradar/api/football/ncaafb/player.rb +31 -0
  120. data/lib/sportradar/api/football/ncaafb/quarter.rb +15 -0
  121. data/lib/sportradar/api/football/ncaafb/subdivision.rb +43 -0
  122. data/lib/sportradar/api/football/ncaafb/team.rb +49 -0
  123. data/lib/sportradar/api/football/ncaafb/week.rb +24 -0
  124. data/lib/sportradar/api/football/ncaafb.rb +273 -0
  125. data/lib/sportradar/api/football/nfl/api.rb +76 -0
  126. data/lib/sportradar/api/football/nfl/conference.rb +35 -0
  127. data/lib/sportradar/api/football/nfl/depth_chart.rb +53 -0
  128. data/lib/sportradar/api/football/nfl/division.rb +37 -0
  129. data/lib/sportradar/api/football/nfl/drive.rb +19 -0
  130. data/lib/sportradar/api/football/nfl/event.rb +19 -0
  131. data/lib/sportradar/api/football/nfl/game.rb +77 -0
  132. data/lib/sportradar/api/football/nfl/league_depth_chart.rb +41 -0
  133. data/lib/sportradar/api/football/nfl/play.rb +27 -0
  134. data/lib/sportradar/api/football/nfl/player.rb +31 -0
  135. data/lib/sportradar/api/football/nfl/quarter.rb +15 -0
  136. data/lib/sportradar/api/football/nfl/team.rb +42 -0
  137. data/lib/sportradar/api/football/nfl/team_depth_chart.rb +44 -0
  138. data/lib/sportradar/api/football/nfl/week.rb +24 -0
  139. data/lib/sportradar/api/football/nfl.rb +322 -0
  140. data/lib/sportradar/api/football/play.rb +116 -0
  141. data/lib/sportradar/api/football/play_statistics.rb +313 -0
  142. data/lib/sportradar/api/football/player.rb +121 -0
  143. data/lib/sportradar/api/football/quarter.rb +46 -0
  144. data/lib/sportradar/api/football/record.rb +48 -0
  145. data/lib/sportradar/api/football/scoring.rb +92 -0
  146. data/lib/sportradar/api/football/situation.rb +32 -0
  147. data/lib/sportradar/api/football/stat_pack/defense.rb +20 -20
  148. data/lib/sportradar/api/football/stat_pack/extra_points.rb +5 -4
  149. data/lib/sportradar/api/football/stat_pack/field_goals.rb +6 -5
  150. data/lib/sportradar/api/football/stat_pack/fumbles.rb +11 -9
  151. data/lib/sportradar/api/football/stat_pack/kick_returns.rb +8 -7
  152. data/lib/sportradar/api/football/stat_pack/kickoffs.rb +9 -7
  153. data/lib/sportradar/api/football/stat_pack/misc_returns.rb +1 -1
  154. data/lib/sportradar/api/football/stat_pack/passing.rb +13 -11
  155. data/lib/sportradar/api/football/stat_pack/penalties.rb +2 -2
  156. data/lib/sportradar/api/football/stat_pack/punt_returns.rb +7 -6
  157. data/lib/sportradar/api/football/stat_pack/punts.rb +12 -10
  158. data/lib/sportradar/api/football/stat_pack/receiving.rb +10 -9
  159. data/lib/sportradar/api/football/stat_pack/rushing.rb +11 -9
  160. data/lib/sportradar/api/football/stat_pack.rb +7 -3
  161. data/lib/sportradar/api/football/team.rb +160 -0
  162. data/lib/sportradar/api/football/venue.rb +25 -0
  163. data/lib/sportradar/api/football/week.rb +57 -0
  164. data/lib/sportradar/api/football.rb +47 -0
  165. data/lib/sportradar/api/images/asset.rb +2 -1
  166. data/lib/sportradar/api/images/ref.rb +15 -0
  167. data/lib/sportradar/api/images.rb +51 -9
  168. data/lib/sportradar/api/mma/event.rb +111 -0
  169. data/lib/sportradar/api/mma/fight.rb +107 -0
  170. data/lib/sportradar/api/mma/fighter.rb +95 -0
  171. data/lib/sportradar/api/mma/judge.rb +70 -0
  172. data/lib/sportradar/api/mma/league.rb +63 -0
  173. data/lib/sportradar/api/mma/referee.rb +70 -0
  174. data/lib/sportradar/api/mma/result.rb +68 -0
  175. data/lib/sportradar/api/mma/roster.rb +72 -0
  176. data/lib/sportradar/api/mma/schedule.rb +53 -0
  177. data/lib/sportradar/api/mma/score.rb +83 -0
  178. data/lib/sportradar/api/mma/venue.rb +72 -0
  179. data/lib/sportradar/api/mma.rb +195 -0
  180. data/lib/sportradar/api/poll.rb +40 -0
  181. data/lib/sportradar/api/request.rb +40 -8
  182. data/lib/sportradar/api/soccer/schedule.rb +1 -0
  183. data/lib/sportradar/api/version.rb +1 -1
  184. data/lib/sportradar/api.rb +20 -34
  185. metadata +157 -34
  186. data/lib/sportradar/api/nfl/.play_statistics.rb.swo +0 -0
  187. data/lib/sportradar/api/nfl/changelog.rb +0 -17
  188. data/lib/sportradar/api/nfl/coach.rb +0 -17
  189. data/lib/sportradar/api/nfl/conference.rb +0 -16
  190. data/lib/sportradar/api/nfl/depth_chart.rb +0 -47
  191. data/lib/sportradar/api/nfl/division.rb +0 -16
  192. data/lib/sportradar/api/nfl/draft.rb +0 -16
  193. data/lib/sportradar/api/nfl/drive.rb +0 -73
  194. data/lib/sportradar/api/nfl/event.rb +0 -19
  195. data/lib/sportradar/api/nfl/franchise.rb +0 -14
  196. data/lib/sportradar/api/nfl/game.rb +0 -94
  197. data/lib/sportradar/api/nfl/game_statistic.rb +0 -133
  198. data/lib/sportradar/api/nfl/hierarchy.rb +0 -19
  199. data/lib/sportradar/api/nfl/injury.rb +0 -16
  200. data/lib/sportradar/api/nfl/league_depth_chart.rb +0 -26
  201. data/lib/sportradar/api/nfl/play.rb +0 -39
  202. data/lib/sportradar/api/nfl/play_statistics.rb +0 -247
  203. data/lib/sportradar/api/nfl/player.rb +0 -49
  204. data/lib/sportradar/api/nfl/position.rb +0 -14
  205. data/lib/sportradar/api/nfl/quarter.rb +0 -29
  206. data/lib/sportradar/api/nfl/scoring.rb +0 -25
  207. data/lib/sportradar/api/nfl/season.rb +0 -23
  208. data/lib/sportradar/api/nfl/situation.rb +0 -18
  209. data/lib/sportradar/api/nfl/statistic.rb +0 -28
  210. data/lib/sportradar/api/nfl/summary.rb +0 -17
  211. data/lib/sportradar/api/nfl/team.rb +0 -56
  212. data/lib/sportradar/api/nfl/team_depth_chart.rb +0 -44
  213. data/lib/sportradar/api/nfl/venue.rb +0 -22
  214. data/lib/sportradar/api/nfl/week.rb +0 -16
  215. data/lib/sportradar/api/nfl.rb +0 -205
@@ -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,55 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Ncaamb
5
+ class Season < Basketball::Season
6
+ attr_accessor :response, :id, :name, :alias, :year
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
+ @year = data.dig('season', 'year')
17
+ @type = data.dig('season', 'type')
18
+
19
+ @games_hash = {}
20
+ @tournaments_hash = {}
21
+ update_games(data['games']) if data['games']
22
+ update_tournaments(data['tournaments']) if data['tournaments']
23
+ end
24
+
25
+ def games
26
+ @games_hash.values
27
+ end
28
+
29
+ def tournaments
30
+ @tournaments_hash.values
31
+ end
32
+
33
+ def tournament(id)
34
+ @tournaments_hash[id]
35
+ end
36
+
37
+ def update_games(data)
38
+ create_data(@games_hash, data, klass: Game, api: @api, season: self)
39
+ end
40
+
41
+ def update_tournaments(data)
42
+ create_data(@tournaments_hash, data, klass: Tournament, api: @api, season: self)
43
+ end
44
+
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ __END__
52
+
53
+ sr = Sportradar::Api::Basketball::Ncaamb.new
54
+ sd = sr.daily_schedule;
55
+ ss = sr.schedule;
@@ -0,0 +1,61 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Ncaamb
5
+ class Team < Sportradar::Api::Basketball::Team
6
+ attr_accessor :source, :source_id
7
+
8
+ @all_hash = {}
9
+ def self.new(data, **opts)
10
+ existing = @all_hash[data['id']]
11
+ if existing
12
+ existing.update(data, **opts)
13
+ existing
14
+ else
15
+ if data['id']
16
+ @all_hash[data['id']] = super
17
+ else # tournament placeholder
18
+ super.tap do |team|
19
+ team.source = data['source']
20
+ team.source_id = data.dig('source', 'id')
21
+ end
22
+ end
23
+ end
24
+ end
25
+ def self.all
26
+ @all_hash.values
27
+ end
28
+
29
+ def player_class
30
+ Player
31
+ end
32
+
33
+ def api
34
+ @api || Sportradar::Api::Basketball::Ncaamb.new
35
+ end
36
+
37
+ def good_guys?
38
+ id == "9b166a3f-e64b-4825-bb6b-92c6f0418263"
39
+ end
40
+
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ __END__
48
+ ss = sr.schedule;
49
+ sd = sr.daily_schedule;
50
+ sr = Sportradar::Api::Basketball::Nba.new
51
+ lh = sr.league_hierarchy;
52
+ t = lh.teams.first;
53
+ ss = t.get_season_stats;
54
+ g = sd.games.last;
55
+ t = g.home;
56
+ Sportradar::Api::Basketball::Nba::Team.all.size
57
+
58
+
59
+ # week_count = ss.weeks.count;
60
+ # w1 = ss.weeks.first;
61
+ # w1 = ss.weeks(1);
@@ -0,0 +1,154 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Ncaamb
5
+ class Tournament < Data
6
+ attr_accessor :response, :id, :name, :status, :location, :start, :end
7
+
8
+ def initialize(data, **opts)
9
+ # @response = data
10
+ @api = opts[:api]
11
+
12
+ @id = data['id']
13
+
14
+ @rounds_hash = {}
15
+ @brackets_hash = {}
16
+
17
+ update(data, **opts)
18
+ end
19
+
20
+ def update(data, **opts)
21
+
22
+ @season = opts[:season] if opts[:season]
23
+
24
+ @status = data['status'] if data['status']
25
+ @name = data['name'] if data['name']
26
+ @location = data['location'] if data['location']
27
+ @start = Date.parse(data['start_date']) if data['start_date']
28
+ @end = Date.parse(data['end_date']) if data['end_date']
29
+ @type = data.dig('season', 'type') if data.dig('season', 'type')
30
+
31
+ update_rounds(data['rounds']) if data['rounds'] # switch to rounds
32
+ update_brackets(data['brackets']) if data['brackets'] # switch to brackets
33
+ end
34
+
35
+ def games
36
+ rounds.flat_map(&:games)
37
+ end
38
+
39
+ def game(id)
40
+ games.detect { |g| g.id == id }
41
+ end
42
+
43
+ def year
44
+ @season&.year || (@start&.-120)&.year
45
+ end
46
+
47
+ def rounds
48
+ @rounds_hash.values
49
+ end
50
+
51
+ def brackets
52
+ @brackets_hash.values
53
+ end
54
+ def bracket(id)
55
+ @brackets_hash[id]
56
+ end
57
+ def update_bracket(id, data)
58
+ if @brackets_hash[id]
59
+ @brackets_hash[id].update(data)
60
+ else
61
+ @brackets_hash[id] = Bracket.new(data, tournament: self)
62
+ end
63
+ end
64
+ def update_brackets(data)
65
+ create_data(@brackets_hash, data, klass: Round, api: @api, tournament: self)
66
+ end
67
+
68
+ # switch to rounds
69
+ # rounds are either bracketed (bracketed) or not (games)
70
+ def update_rounds(data)
71
+ create_data(@rounds_hash, data, klass: Round, api: @api, tournament: self)
72
+ end
73
+
74
+ # url paths
75
+ def path_base
76
+ "tournaments/#{ id }"
77
+ end
78
+ def path_schedule
79
+ "#{ path_base }/schedule"
80
+ end
81
+
82
+ def path_summary
83
+ "#{ path_base }/summary"
84
+ end
85
+
86
+ # data retrieval
87
+ def sync
88
+ get_summary
89
+ get_schedule
90
+ end
91
+
92
+ # summary
93
+ def get_summary
94
+ data = api.get_data(path_summary)
95
+ ingest_summary(data)
96
+ end
97
+ def queue_summary
98
+ url, headers, options, timeout = api.get_request_info(path_summary)
99
+ {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_summary)}
100
+ end
101
+ def ingest_summary(data)
102
+ update(data, source: :summary)
103
+ data
104
+ end
105
+
106
+ # schedule
107
+ def get_schedule
108
+ data = api.get_data(path_schedule)
109
+ ingest_schedule(data)
110
+ end
111
+ def queue_schedule
112
+ url, headers, options, timeout = api.get_request_info(path_schedule)
113
+ {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_schedule)}
114
+ end
115
+ def ingest_schedule(data)
116
+ update(data, source: :schedule)
117
+ data
118
+ end
119
+
120
+ def api
121
+ @api ||= Sportradar::Api::Basketball::Ncaamb.new
122
+ end
123
+
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
129
+
130
+ __END__
131
+
132
+ sr = Sportradar::Api::Basketball::Ncaamb.new
133
+ ss = sr.tournaments(2015);
134
+ ss = sr.conference_tournaments(2015);
135
+ ts = sr.conference_tournaments;
136
+ ts = sr.tournaments;
137
+ t = ss.tournament("608152a4-cccc-4569-83ac-27062580099e") # => NCAA tourney 2015
138
+ t = ts.tournament("74db39e5-be49-4ec8-9169-0cc20ed9f792") # => NCAA tourney 2016
139
+ tt = Sportradar::Api::Basketball::Ncaamb::Tournament.new('id' => "608152a4-cccc-4569-83ac-27062580099e") # => NCAA tourney 2015
140
+ t = ss.tournament("1a4a1d3d-b734-4136-a7c2-711b4b3821a5") # => Pac12 tourney 2015
141
+ t = Sportradar::Api::Basketball::Ncaamb::Tournament.new('id' => "1a4a1d3d-b734-4136-a7c2-711b4b3821a5") # => NCAA tourney 2015
142
+ t = ts.first
143
+
144
+
145
+
146
+
147
+ sr = Sportradar::Api::Basketball::Ncaamb.new
148
+ ts = sr.conference_tournaments;
149
+ asun = "40e97e30-980c-4146-bf69-1791852c5527"
150
+ t = ts.tournament(asun);
151
+ t.get_schedule;
152
+ g = t.game("1fc9ea90-8145-47a6-86a7-9cd05513fb2c")
153
+
154
+
@@ -0,0 +1,149 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Ncaamb < Request
5
+ attr_accessor :league, :access_level, :simulation, :error
6
+
7
+ def initialize(access_level = default_access_level)
8
+ @league = 'ncaamb'
9
+ raise Sportradar::Api::Error::InvalidAccessLevel unless allowed_access_levels.include? access_level
10
+ @access_level = access_level
11
+ end
12
+
13
+ def schedule(season_year = default_year, ncaamb_season = default_season)
14
+ raise Sportradar::Api::Error::InvalidSeason unless allowed_seasons.include? ncaamb_season
15
+ response = get request_url("games/#{season_year}/#{ncaamb_season}/schedule")
16
+ if response.success?
17
+ Sportradar::Api::Basketball::Ncaamb::Season.new(response.to_h, api: self)
18
+ else
19
+ @error = response
20
+ end
21
+ end
22
+
23
+ def tournaments(season_year = default_year, ncaamb_season = 'pst')
24
+ raise Sportradar::Api::Error::InvalidSeason unless allowed_seasons.include? ncaamb_season
25
+ response = get request_url("tournaments/#{season_year}/#{ncaamb_season}/schedule")
26
+ if response.success?
27
+ Sportradar::Api::Basketball::Ncaamb::Season.new(response.to_h, api: self)
28
+ else
29
+ @error = response
30
+ end
31
+ end
32
+
33
+ def conference_tournaments(season_year = default_year)
34
+ tournaments(season_year, 'ct')
35
+ end
36
+
37
+ def daily_schedule(date = default_date)
38
+ response = get request_url("games/#{ date.year }/#{ date.month }/#{ date.day }/schedule")
39
+ if response.success?
40
+ Sportradar::Api::Basketball::Ncaamb::Schedule.new(response.to_h, api: self)
41
+ else
42
+ @error = response
43
+ end
44
+ end
45
+
46
+ def rankings(poll_name, ncaamb_week = nil, season_year = default_year)
47
+ # response = get request_url("polls/#{poll_name}/#{season_year}/rankings")
48
+ response = get request_url("polls/#{poll_name}/#{season_year}/#{ncaamb_week}/rankings")
49
+ if response.success?
50
+ Sportradar::Api::Poll.new(response.to_h)
51
+ else
52
+ @error = response
53
+ end
54
+ end
55
+
56
+ def hierarchy
57
+ response = get request_url("league/hierarchy")
58
+ if response.success?
59
+ Sportradar::Api::Basketball::Ncaamb::Hierarchy.new(response.to_h, api: self)
60
+ else
61
+ response
62
+ end
63
+ end
64
+
65
+ def standings(season_year = default_year, ncaamb_season = default_season)
66
+ response = get request_url("seasontd/#{season_year}/#{ncaamb_season}/standings")
67
+ if response.success?
68
+ Sportradar::Api::Basketball::Ncaamb::Division.new(response.to_h, api: self)
69
+ else
70
+ response
71
+ end
72
+ end
73
+
74
+ def get_data(url)
75
+ get request_url(url)
76
+ end
77
+
78
+ def default_year
79
+ 2016
80
+ end
81
+ def default_date
82
+ Date.today
83
+ end
84
+ def default_season
85
+ 'reg'
86
+ end
87
+ def default_access_level
88
+ if (ENV['SPORTRADAR_ENV'] || ENV['RACK_ENV'] || ENV['RAILS_ENV']) == 'production'
89
+ 'p'
90
+ else
91
+ 't'
92
+ end
93
+ end
94
+
95
+ def content_format
96
+ 'json'
97
+ end
98
+
99
+ private
100
+
101
+ def check_simulation(game_id)
102
+ @simulation = true if simulation_games.include?(game_id)
103
+ end
104
+
105
+ def request_url(path)
106
+ # puts "/ncaamb-#{access_level}#{version}/#{path}"
107
+ if simulation
108
+ # "/nfl-sim1/#{path}"
109
+ else
110
+ "/ncaamb-#{access_level}#{version}/#{path}"
111
+ end
112
+ end
113
+
114
+ def api_key
115
+ if !['t', 'sim'].include?(access_level)
116
+ Sportradar::Api.api_key_params('ncaamb', 'production')
117
+ else
118
+ Sportradar::Api.api_key_params('ncaamb')
119
+ end
120
+ end
121
+
122
+ def version
123
+ Sportradar::Api.version('nba')
124
+ end
125
+
126
+ def allowed_access_levels
127
+ %w[p t sim]
128
+ end
129
+
130
+ def allowed_seasons
131
+ ["pre", "reg", 'ct', "pst"]
132
+ end
133
+
134
+ end
135
+ end
136
+ end
137
+ end
138
+
139
+ __END__
140
+
141
+ sr = Sportradar::Api::Basketball::Ncaamb.new
142
+ ss = sr.schedule(2015, 'ct');
143
+ ss = sr.schedule(2015, 'pst');
144
+ rank = sr.rankings('US');
145
+ ds = sr.daily_schedule;
146
+
147
+ # not ready
148
+ lh = sr.league_hierarchy;
149
+ ls = sr.standings;
@@ -0,0 +1,75 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Play < Data
5
+ attr_accessor :response, :id, :clock, :event_type, :description, :statistics, :score, :team_id, :player_id, :quarter, :updated, :location, :possession, :on_court
6
+ alias :type :event_type
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
+ # klass = subclass(data['event_type'])
15
+ # @all_hash[data['id']] = klass.new(data, **opts) rescue (puts data['event_type']; binding.pry)
16
+ # end
17
+ # end
18
+ def self.new(data, **opts)
19
+ klass = subclass(data['event_type'])
20
+ klass.new(data, **opts)
21
+ # rescue => e
22
+ # binding.pry
23
+ end
24
+ # def self.all
25
+ # @all_hash.values
26
+ # end
27
+
28
+ def self.subclass(event_type)
29
+ subclasses[event_type]
30
+ end
31
+ def self.subclasses
32
+ @subclasses ||= {
33
+ "opentip" => OpenTip,
34
+ "twopointmiss" => TwoPointMiss,
35
+ "rebound" => Rebound,
36
+ "threepointmiss" => ThreePointMiss,
37
+ "twopointmade" => TwoPointMade,
38
+ "threepointmade" => ThreePointMade,
39
+ "turnover" => Turnover,
40
+ "personalfoul" => PersonalFoul,
41
+ "jumpball" => Jumpball,
42
+ "deadball" => Deadball,
43
+ "teamtimeout" => TeamTimeout,
44
+ "shootingfoul" => ShootingFoul,
45
+ "freethrowmade" => FreeThrowMade,
46
+ "freethrowmiss" => FreeThrowMiss,
47
+ "lineupchange" => LineupChange,
48
+ "offensivefoul" => OffensiveFoul,
49
+ "endperiod" => EndPeriod,
50
+ "openinbound" => OpenInbound,
51
+ "officialtimeout" => OfficialTimeout,
52
+ "kickball" => Kickball,
53
+ "tvtimeout" => TvTimeout,
54
+ "clearpathfoul" => ClearPathFoul,
55
+ "technicalfoul" => TechnicalFoul,
56
+ "review" => Review,
57
+ "defensivethreeseconds" => DefensiveThreeSeconds,
58
+ "flagrantone" => FlagrantOne,
59
+ "flagranttwo" => FlagrantTwo,
60
+ "delay" => Delay,
61
+ "ejection" => Ejection,
62
+ # abstract types, used for lookup purposes
63
+ "foul" => Foul,
64
+ "shotmade" => ShotMade,
65
+ "shotmiss" => ShotMiss,
66
+ }.freeze
67
+ end
68
+
69
+ # SHOT_TYPES = %w[driving pullup step back fadeaway putback floating finger roll turnaround reverse alley-oop]
70
+
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]
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,14 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Assist < Play::Base
5
+ def base_key
6
+ 'assist'
7
+ end
8
+ def display_type
9
+ 'Assist'
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,126 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Play
5
+ class Base < Data
6
+ attr_accessor :response, :id, :clock, :event_type, :description, :statistics, :score, :team_id, :player_id, :quarter, :half, :updated, :location, :possession, :on_court, :game_seconds, :identifier
7
+ alias :type :event_type
8
+
9
+ def initialize(data, **opts)
10
+ @response = data
11
+ @api = opts[:api]
12
+
13
+ @id = data['id']
14
+
15
+ @quarter = opts[:quarter].sequence.to_i rescue opts[:quarter].to_i
16
+ @half = opts[:half].sequence.to_i rescue opts[:half].to_i
17
+
18
+ update(data, **opts)
19
+ end
20
+
21
+ def period
22
+ @quarter.nonzero? || @half.nonzero?
23
+ end
24
+
25
+ # def game
26
+ # quarter.game
27
+ # end
28
+ def display_type
29
+ ''
30
+ end
31
+
32
+ def scoring_play?
33
+ points.nonzero?
34
+ end
35
+ def timeout?
36
+ false
37
+ end
38
+ def media_timeout?
39
+ false
40
+ end
41
+ def quarter_break?
42
+ false
43
+ end
44
+ def halftime?
45
+ false
46
+ end
47
+ def end_of_period?
48
+ false
49
+ end
50
+ def end_of_regulation?
51
+ false
52
+ end
53
+ def end_of_ot?
54
+ false
55
+ end
56
+ def base_key
57
+ nil
58
+ end
59
+
60
+ def points
61
+ 0
62
+ end
63
+
64
+ def ==(other)
65
+ id == other.id && description == other.description
66
+ end
67
+
68
+ def clock_seconds
69
+ m,s = @clock.split(':')
70
+ m.to_i * 60 + s.to_i
71
+ end
72
+ def nba_game_seconds
73
+ ([quarter, 4].min * 720) + ([quarter - 4, 0].max * 300) - clock_seconds # seconds elapsed in game, only works for NBA
74
+ end
75
+
76
+ private def ncaa_game_seconds
77
+ ([half, 2].min * 1200) + ([half - 2, 0].max * 300) - clock_seconds # seconds elapsed in game, only works for NBA
78
+ end
79
+
80
+ def update(data, **opts)
81
+ @event_type = data['event_type'] # "lineupchange",
82
+ @clock = data['clock'] # "12:00",
83
+ @updated = data['updated'] # "2016-10-26T00:07:52+00:00",
84
+ @description = data['description'] # "Cavaliers lineup change (Richard Jefferson, Kyrie Irving, Mike Dunleavy, Channing Frye, LeBron James)",
85
+ @attribution = data['attribution'] # {"name"=>"Cavaliers", "market"=>"Cleveland", "id"=>"583ec773-fb46-11e1-82cb-f4ce4684ea4c", "team_basket"=>"left"},
86
+ @team_id = data.dig('attribution', "id")
87
+ @location = data['location'] # {"coord_x"=>"0", "coord_y"=>"0"},
88
+ @possession = data['possession'] # {"name"=>"Knicks", "market"=>"New York", "id"=>"583ec70e-fb46-11e1-82cb-f4ce4684ea4c"},
89
+ # @on_court = data['on_court'] # hash
90
+
91
+ handle_time(data, **opts)
92
+ parse_statistics(data) if data['statistics']
93
+ end
94
+
95
+ def handle_time(data, **opts)
96
+ @game_seconds = if opts[:quarter]
97
+ @quarter = opts[:quarter].sequence.to_i rescue opts[:quarter].to_i
98
+ @identifier = "#{quarter}_#{(720 - clock_seconds).to_s.rjust(3, '0')}".to_i
99
+ nba_game_seconds
100
+ elsif opts[:half]
101
+ @half = opts[:half].sequence.to_i rescue opts[:half].to_i
102
+ @identifier = "#{half}_#{(1200 - clock_seconds).to_s.rjust(4, '0')}".to_i
103
+ ncaa_game_seconds
104
+ end
105
+ end
106
+
107
+ def parse_statistics(data)
108
+ return unless data['statistics']
109
+ @statistics = data['statistics']
110
+ stat = @statistics.detect { |hash| hash['type'] == base_key }
111
+ # stat = data.dig('statistics', base_key) rescue data.dig('statistics', 0, base_key)
112
+ # stat = stat[0] if stat.is_a?(Array) # sometimes SR has an array of identical assist hashes
113
+ @team = stat['team']
114
+ @team_id = @team['id'] if @team
115
+ @player = stat['player']
116
+ @player_id = @player['id'] if @player
117
+ rescue => e
118
+ puts e
119
+ # binding.pry
120
+ end
121
+
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,14 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Block < Play::Base
5
+ def base_key
6
+ 'block'
7
+ end
8
+ def display_type
9
+ 'Block'
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end