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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e22d8c206502869ef140bab3d401952ccadec27a
4
- data.tar.gz: bf23f2f7aa1472326a9bda336d4b7f547215646a
3
+ metadata.gz: bd6d7916dd9fc049204233084a6a7ce5b10673ef
4
+ data.tar.gz: 6fe2b2da4640b71028828be5a4fd108642b38768
5
5
  SHA512:
6
- metadata.gz: fbd904fcfde2c4fe794750e5020bdc21dc78cd5517a9b7996eb056b3b3eb126be90ab1bbc02a47710137d04bebfaac6793e23924b919dc0465692e53cd84af23
7
- data.tar.gz: 91e7808c39a65a011d78cc9c00b00505e8c756be8331a8663916e5b7d65303ef338b9a449086ba664d2562cc6ffa302dcea65c0739cd4ca0617c570f7bccbc53
6
+ metadata.gz: 6045f549f1e54a084fb3303b50bb8ef9fa8cbabcf512068dd5332cf2c3a5773ebed64b340cb6e3b7feeba4e191cf3de72e23dc4ca5f52083bf3dee13d86f79d5
7
+ data.tar.gz: 0de364ca8a0f659c78b7daa35d3850b555bb8728e3910c7deba4f16ee62acd6d64d4bfe9ec2787de30d1d97ae63b18a18af115b395effc85f763b5402f9a070a
data/.env.sample CHANGED
@@ -14,7 +14,7 @@ SPORTRADAR_MLB: your-mlb-api-key
14
14
  SPORTRADAR_MMA: your-mma-api-key
15
15
  SPORTRADAR_NASCAR: your-nascar-api-key
16
16
  SPORTRADAR_NBA: your-nba-api-key
17
- SPORTRADAR_NCAAF: your-ncaaf-api-key
17
+ SPORTRADAR_NCAAFB: your-ncaaf-api-key
18
18
  SPORTRADAR_NCAAMB: your-ncaamb-api-key
19
19
  SPORTRADAR_NCAAWB: your-ncaawb-api-key
20
20
  SPORTRADAR_NFL: your-nfl-api-key
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sportradar-api (0.9.23)
4
+ sportradar-api (0.9.25)
5
5
  activesupport
6
6
  httparty (>= 0.14.0)
7
7
 
@@ -57,7 +57,7 @@ GEM
57
57
  minitest (5.9.1)
58
58
  minitest-focus (1.1.2)
59
59
  minitest (>= 4, < 6)
60
- multi_xml (0.5.5)
60
+ multi_xml (0.6.0)
61
61
  nenv (0.3.0)
62
62
  notiffany (0.1.1)
63
63
  nenv (~> 0.1)
data/README.md CHANGED
@@ -25,7 +25,7 @@ Our goal is to incrementally integrate with them. **Contributions are welcome**
25
25
  | NFL | 1 | [📚](http://developer.sportradar.us/page/NFL_Official) | ✅ | 👍 |
26
26
  | MLB | 5 | [📚](http://developer.sportradar.us/docs/MLB_API) | - | - |
27
27
  | NHL | 3 | [📚](http://developer.sportradar.us/docs/NHL_API) | - | - |
28
- | NBA | 3 | [📚](http://developer.sportradar.us/docs/NBA_API) | - | - |
28
+ | NBA | 3 | [📚](http://developer.sportradar.us/docs/NBA_API) | | - |
29
29
  | NCAAMB | 3 | [📚](http://developer.sportradar.us/docs/NCAA_Mens_Basketball) | - | - |
30
30
  | NCAAFB | 1 | [📚](http://developer.sportradar.us/docs/NCAA_Football_API) | - | - |
31
31
  | Golf | 2 | [📚](http://developer.sportradar.us/docs/Golf_API) | - | - |
@@ -28,6 +28,15 @@ require "sportradar/api/soccer/tournament_group"
28
28
  require "sportradar/api/soccer/venue"
29
29
 
30
30
  require "sportradar/api/football"
31
+ require "sportradar/api/ncaafb"
32
+ require "sportradar/api/ncaafb/season"
33
+ require "sportradar/api/ncaafb/week"
34
+ require "sportradar/api/ncaafb/game"
35
+ require "sportradar/api/ncaafb/team"
36
+ require "sportradar/api/ncaafb/player"
37
+ require "sportradar/api/ncaafb/quarter"
38
+ require "sportradar/api/ncaafb/drive"
39
+ require "sportradar/api/ncaafb/play"
31
40
 
32
41
  require "sportradar/api/nfl"
33
42
  require "sportradar/api/nfl/broadcast"
@@ -60,6 +69,8 @@ require "sportradar/api/nfl/team_depth_chart"
60
69
  require "sportradar/api/nfl/venue"
61
70
  require "sportradar/api/nfl/week"
62
71
 
72
+ require "sportradar/api/basketball"
73
+
63
74
 
64
75
  require "sportradar/api/live_images"
65
76
  require "sportradar/api/images"
@@ -68,7 +79,18 @@ require "sportradar/api/images/asset"
68
79
  require "sportradar/api/images/link"
69
80
  require "sportradar/api/images/tag"
70
81
 
71
-
82
+ require "sportradar/api/mma"
83
+ require "sportradar/api/mma/schedule"
84
+ require "sportradar/api/mma/roster"
85
+ require "sportradar/api/mma/fighter"
86
+ require "sportradar/api/mma/event"
87
+ require "sportradar/api/mma/fight"
88
+ require "sportradar/api/mma/judge"
89
+ require "sportradar/api/mma/referee"
90
+ require "sportradar/api/mma/result"
91
+ require "sportradar/api/mma/score"
92
+ require "sportradar/api/mma/venue"
93
+ require "sportradar/api/mma/league"
72
94
 
73
95
 
74
96
  require "sportradar/api/content"
@@ -0,0 +1,21 @@
1
+ require_relative 'basketball/season'
2
+ require_relative 'basketball/overview'
3
+ require_relative 'basketball/venue'
4
+ require_relative 'basketball/broadcast'
5
+ require_relative 'basketball/profile'
6
+ require_relative 'basketball/bio'
7
+ require_relative 'basketball/plays'
8
+
9
+ require_relative 'basketball/nba'
10
+ require_relative 'basketball/nba/hierarchy'
11
+ require_relative 'basketball/nba/conference'
12
+ require_relative 'basketball/nba/division'
13
+ require_relative 'basketball/nba/record'
14
+ require_relative 'basketball/nba/season'
15
+ require_relative 'basketball/nba/schedule'
16
+ require_relative 'basketball/nba/game'
17
+ require_relative 'basketball/nba/scoring'
18
+ require_relative 'basketball/nba/overview'
19
+ require_relative 'basketball/nba/team'
20
+ require_relative 'basketball/nba/player'
21
+ require_relative 'basketball/nba/quarter'
@@ -0,0 +1,33 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Bio < Data
5
+ attr_accessor :player, :name
6
+
7
+ def initialize(player)
8
+ # @player = player
9
+ @id = player.id
10
+ @status = player.status
11
+ @full_name = player.full_name
12
+ @first_name = player.first_name
13
+ @last_name = player.last_name
14
+ @abbr_name = player.abbr_name
15
+ @height = player.height
16
+ @weight = player.weight
17
+ @position = player.position
18
+ @primary_position = player.primary_position
19
+ @jersey_number = player.jersey_number
20
+ @experience = player.experience
21
+ @college = player.college
22
+ @birth_place = player.birth_place
23
+ @birthdate = player.birthdate
24
+ end
25
+
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ __END__
32
+
33
+ sr = Sportradar::Api::Nba.new
@@ -0,0 +1,15 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Broadcast < Data
5
+ attr_accessor :response, :network
6
+
7
+ def initialize(data)
8
+ @response = data
9
+ @network = data["network"]
10
+ end
11
+
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,123 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Nba < Request
5
+ attr_accessor :league, :access_level, :simulation, :error
6
+
7
+ def initialize(access_level = 't')
8
+ @league = 'nba'
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, nba_season = default_season)
14
+ raise Sportradar::Api::Error::InvalidSeason unless allowed_seasons.include? nba_season
15
+ response = get request_url("games/#{season_year}/#{nba_season}/schedule")
16
+ if response.success? && response['league']
17
+ Sportradar::Api::Basketball::Nba::Season.new(response['league'], api: self)
18
+ else
19
+ @error = response
20
+ end
21
+ end
22
+
23
+ def daily_schedule(date = default_date, nba_season = default_season)
24
+ response = get request_url("games/#{ date.year }/#{ date.month }/#{ date.day }/schedule")
25
+ if response.success? && response['league']
26
+ Sportradar::Api::Basketball::Nba::Schedule.new(response['league'], api: self)
27
+ else
28
+ @error = response
29
+ end
30
+ end
31
+
32
+ def league_hierarchy
33
+ response = get request_url("league/hierarchy")
34
+ if response.success? && response["league"]
35
+ Sportradar::Api::Basketball::Nba::Hierarchy.new(response["league"], api: self)
36
+ else
37
+ response
38
+ end
39
+ end
40
+
41
+ def team_stats(season_year = default_year, nba_season = default_season, team_id)
42
+ response = get request_url("seasontd/#{season_year}/#{nba_season}/teams/#{team_id}/statistics")
43
+ if response.success? && response["season"]
44
+ # Sportradar::Api::Basketball::Nba::Team.new response["season"]
45
+ response
46
+ else
47
+ response
48
+ end
49
+ end
50
+
51
+ def standings(season_year = default_year, nba_season = default_season)
52
+ response = get request_url("seasontd/#{season_year}/#{nba_season}/standings")
53
+ if response.success? && response["league"]
54
+ Sportradar::Api::Basketball::Nba::Hierarchy.new(response['league']["season"], api: self)
55
+ else
56
+ response
57
+ end
58
+ end
59
+
60
+ def get_data(url)
61
+ get request_url(url)
62
+ end
63
+
64
+ def get_pbp(*args)
65
+ 'pbp'
66
+ end
67
+
68
+
69
+ def default_year
70
+ 2016
71
+ end
72
+ def default_date
73
+ Date.today
74
+ end
75
+ def default_season
76
+ 'reg'
77
+ end
78
+
79
+ private
80
+
81
+ def check_simulation(game_id)
82
+ @simulation = true if simulation_games.include?(game_id)
83
+ end
84
+
85
+ def request_url(path)
86
+ puts "/nba-#{access_level}#{version}/#{path}"
87
+ if simulation
88
+ # "/nfl-sim1/#{path}"
89
+ else
90
+ "/nba-#{access_level}#{version}/#{path}"
91
+ end
92
+ end
93
+
94
+ def api_key
95
+ if access_level != 't'
96
+ Sportradar::Api.api_key_params('nba', 'production')
97
+ else
98
+ Sportradar::Api.api_key_params('nba')
99
+ end
100
+ end
101
+
102
+ def version
103
+ Sportradar::Api.version('nba')
104
+ end
105
+
106
+ def allowed_access_levels
107
+ %w[p t]
108
+ end
109
+
110
+ def allowed_seasons
111
+ ["pre", "reg", "pst"]
112
+ end
113
+
114
+ end
115
+ end
116
+ end
117
+ end
118
+
119
+ __END__
120
+
121
+ sr = Sportradar::Api::Basketball::Nba.new
122
+ lh = sr.league_hierarchy;
123
+ ls = sr.standings;
@@ -0,0 +1,27 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Nba
5
+ class Conference < Data
6
+ attr_accessor :response, :id, :name, :alias
7
+
8
+ def initialize(data, **opts)
9
+ @response = data
10
+ @api = opts[:api]
11
+
12
+ @id = data["id"]
13
+ @name = data["name"]
14
+ @alias = data["alias"]
15
+ @divisions_hash = create_data({}, response["division"], klass: Division, conference: self, api: @api) # if response["division"]
16
+ end
17
+
18
+ def divisions
19
+ @divisions_hash.values
20
+ end
21
+
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+
@@ -0,0 +1,29 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Nba
5
+ class Division < Data
6
+ attr_accessor :response, :id, :name, :alias
7
+
8
+ def initialize(data, **opts)
9
+ @response = data
10
+ @api = opts[:api]
11
+
12
+ @id = data["id"]
13
+ @name = data["name"]
14
+ @alias = data["alias"]
15
+ @teams_hash = create_data({}, response["team"], klass: Team, division: self, api: @api) # if response["team"]
16
+ end
17
+
18
+ def teams
19
+ @assigned_teams || @teams_hash.values
20
+ end
21
+ def teams=(array)
22
+ @assigned_teams = array
23
+ end
24
+
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,263 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Nba
5
+ class Game < Data
6
+ attr_accessor :response, :id, :home, :away, :home_id, :away_id, :score, :scoring, :status, :scheduled, :venue, :broadcast, :clock, :duration, :attendance, :quarter, :team_stats, :player_stats, :changes, :media_timeouts
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
+ # @season = opts[:season]
25
+ @updates = {}
26
+ @changes = {}
27
+
28
+ @score = {}
29
+ @team_stats = {}
30
+ @player_stats = {}
31
+ @scoring_raw = Scoring.new(data, game: self)
32
+ @teams_hash = {}
33
+ @quarters_hash = {}
34
+
35
+ @id = data['id']
36
+
37
+ update(data, **opts)
38
+ end
39
+ def timeouts
40
+ {}
41
+ end
42
+
43
+ def overview
44
+ Overview.new(self)
45
+ end
46
+ def points(team_id)
47
+ team_id.is_a?(Symbol) ? @score[@team_ids[team_id]].to_i : @score[team_id].to_i
48
+ end
49
+ def stats(team_id)
50
+ team_id.is_a?(Symbol) ? @team_stats[@team_ids[team_id]].to_i : @team_stats[team_id].to_i
51
+ end
52
+
53
+ def scoring
54
+ @scoring_raw.scores
55
+ end
56
+ def update_score(score)
57
+ @score.merge!(score)
58
+ end
59
+ def update_stats(team, stats)
60
+ @team_stats.merge!(team.id => stats.merge!(team: team))
61
+ end
62
+ def update_player_stats(player, stats)
63
+ @player_stats.merge!(player.id => stats.merge!(player: player))
64
+ end
65
+
66
+ def parse_score(data)
67
+ update_score(data.dig('home', 'id') => data.dig('home', 'points').to_i)
68
+ update_score(data.dig('away', 'id') => data.dig('away', 'points').to_i)
69
+ end
70
+ def clock_seconds
71
+ return unless @clock
72
+ m,s = @clock.split(':')
73
+ m.to_i * 60 + s.to_i
74
+ end
75
+
76
+ def update(data, source: nil, **opts)
77
+ # via pbp
78
+ @status = data['status'] if data['status']
79
+ @coverage = data['coverage'] if data['coverage']
80
+ @home_id = data['home_team'] if data['home_team'] # GUID
81
+ @away_id = data['away_team'] if data['away_team'] # GUID
82
+ @home_points = data['home_points'].to_i if data['home_points']
83
+ @away_points = data['away_points'].to_i if data['away_points']
84
+
85
+ @scheduled = Time.parse(data["scheduled"]) if data["scheduled"]
86
+ @venue = Venue.new(data['venue']) if data['venue']
87
+ @broadcast = Broadcast.new(data['broadcast']) if data['broadcast']
88
+ @home = Team.new(data['home'], api: api, game: self) if data['home']
89
+ @away = Team.new(data['away'], api: api, game: self) if data['away']
90
+
91
+ @duration = data['duration'] if data['duration']
92
+ @clock = data['clock'] if data['clock']
93
+ @attendance = data['attendance'] if data['attendance']
94
+ @lead_changes = data['lead_changes'] if data['lead_changes']
95
+ @times_tied = data['times_tied'] if data['times_tied']
96
+
97
+ @team_ids = { home: @home_id, away: @away_id}
98
+
99
+ update_score(@home_id => @home_points.to_i) if @home_points
100
+ update_score(@away_id => @away_points.to_i) if @away_points
101
+ parse_score(data['scoring']) if data['scoring']
102
+ @scoring_raw.update(data, source: source)
103
+
104
+ create_data(@teams_hash, data['team'], klass: Team, api: api, game: self) if data['team']
105
+ end
106
+
107
+ def box
108
+ @box ||= get_box
109
+ end
110
+ def pbp
111
+ if !future? && quarters.empty?
112
+ get_pbp
113
+ end
114
+ @pbp ||= quarters
115
+ end
116
+ def plays
117
+ quarters.flat_map(&:plays)
118
+ end
119
+ def summary
120
+ @summary ||= get_summary
121
+ end
122
+ alias :events :plays
123
+
124
+ def quarters
125
+ @quarters_hash.values
126
+ end
127
+
128
+
129
+ # tracking updates
130
+ def remember(key, object)
131
+ @updates[key] = object
132
+ end
133
+ def not_updated?(key, object)
134
+ @updates[key] == object
135
+ end
136
+ def changed?(key)
137
+ @changes[key]
138
+ end
139
+ def check_newness(key, new_object)
140
+ @changes[key] = !not_updated?(key, new_object)
141
+ remember(key, new_object)
142
+ end
143
+
144
+ # url paths
145
+ def path_base
146
+ "games/#{ id }"
147
+ end
148
+ def path_box
149
+ "#{ path_base }/boxscore"
150
+ end
151
+ def path_pbp
152
+ "#{ path_base }/pbp"
153
+ end
154
+ def path_summary
155
+ "#{ path_base }/summary"
156
+ end
157
+
158
+ # status helpers
159
+ def future?
160
+ ['scheduled', 'delayed', 'created'].include? status
161
+ end
162
+ def started?
163
+ ['inprogress', 'halftime', 'delayed'].include? status
164
+ end
165
+ def finished?
166
+ ['completed', 'closed'].include? status
167
+ end
168
+ def completed?
169
+ 'complete' == status
170
+ end
171
+ def closed?
172
+ 'closed' == status
173
+ end
174
+
175
+ # data retrieval
176
+ def sync
177
+ g.get_pbp
178
+ g.get_box
179
+ g.get_summary if finished?
180
+ end
181
+
182
+ def get_box
183
+ api_res = api.get_data(path_box)
184
+ data = api_res['game']
185
+ update(data, source: :box)
186
+ @quarter = data.delete('quarter').to_i
187
+ check_newness(:box, @clock)
188
+ data
189
+ end
190
+
191
+ def get_pbp
192
+ api_res = api.get_data(path_pbp)
193
+ data = api_res['game']
194
+ update(data, source: :pbp)
195
+ quarter_data = if data['quarter']
196
+ @quarter = data['quarter'].first.to_i
197
+ quarts = data['quarter'][1..-1]
198
+ quarts.is_a?(Array) ? quarts[0] : quarts
199
+ else
200
+ @quarter = nil
201
+ []
202
+ end
203
+ set_pbp(quarter_data)
204
+ @pbp = @quarters_hash.values
205
+ check_newness(:pbp, plays.last)
206
+ data
207
+ end
208
+
209
+ def get_summary
210
+ api_res = api.get_data(path_summary)
211
+ data = api_res['game']
212
+ update(data, source: :summary)
213
+ @quarter = data.delete('quarter').to_i
214
+ check_newness(:box, @clock)
215
+ data
216
+ end
217
+
218
+ def set_pbp(data)
219
+ create_data(@quarters_hash, data, klass: Quarter, api: api, game: self)
220
+ @plays = nil # to clear empty array empty
221
+ @quarters_hash
222
+ end
223
+
224
+ def api
225
+ @api || Sportradar::Api::Basketball::Nba.new
226
+ end
227
+
228
+
229
+ KEYS_PBP = ["xmlns", "id", "status", "coverage", "home_team", "away_team", "scheduled", "duration", "attendance", "lead_changes", "times_tied", "clock", "quarter", "scoring"]
230
+
231
+ KEYS_BOX = ["xmlns", "id", "status", "coverage", "home_team", "away_team", "scheduled", "duration", "attendance", "lead_changes", "times_tied", "clock", "quarter", "team"]
232
+
233
+ end
234
+ end
235
+ end
236
+ end
237
+ end
238
+
239
+ __END__
240
+
241
+ ss = sr.schedule;
242
+ sr = Sportradar::Api::Basketball::Nba.new
243
+ sd = sr.daily_schedule;
244
+ sd = sr.daily_schedule(Date.yesterday)
245
+ g = sd.games.last;
246
+ box = g.get_box;
247
+ pbp = g.get_pbp;
248
+ g.quarters.size
249
+ g.plays.size
250
+
251
+ Sportradar::Api::Basketball::Nba::Team.all.size # => 32 - includes all star teams
252
+
253
+ g1 = sd.games.first;
254
+ sd = sr.schedule;
255
+ sd = sr.daily_schedule;
256
+ sr = Sportradar::Api::Basketball::Nba.new
257
+ sd = sr.daily_schedule(Date.yesterday);
258
+ g = sd.games.last;
259
+ g.get_summary;
260
+ g.get_pbp;
261
+ g.get_box;
262
+ g.scoring
263
+ g.get_pbp; g.changed? :pbp