sportradar-api 0.9.24 → 0.9.25

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 (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