sportradar 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +563 -25
  3. data/lib/sportradar.rb +37 -0
  4. data/lib/sportradar/client/api_request.rb +8 -0
  5. data/lib/sportradar/client/client.rb +10 -4
  6. data/lib/sportradar/client/configuration.rb +7 -2
  7. data/lib/sportradar/feeds/league_hierarchy.rb +12 -0
  8. data/lib/sportradar/feeds/league_schedule.rb +18 -0
  9. data/lib/sportradar/mlb/league_hierarchy.rb +1 -7
  10. data/lib/sportradar/mlb/league_schedule.rb +7 -12
  11. data/lib/sportradar/mlb/models/scoring_play.rb +2 -2
  12. data/lib/sportradar/nfl/boxscore.rb +9 -0
  13. data/lib/sportradar/nfl/extended_boxscore.rb +9 -0
  14. data/lib/sportradar/nfl/game_depth_chart.rb +9 -0
  15. data/lib/sportradar/nfl/game_injuries.rb +9 -0
  16. data/lib/sportradar/nfl/game_request.rb +24 -0
  17. data/lib/sportradar/nfl/game_roster.rb +9 -0
  18. data/lib/sportradar/nfl/game_statistics.rb +9 -0
  19. data/lib/sportradar/nfl/game_summary.rb +9 -0
  20. data/lib/sportradar/nfl/league_hierarchy.rb +9 -0
  21. data/lib/sportradar/nfl/league_schedule.rb +33 -0
  22. data/lib/sportradar/nfl/parsers/boxscore_parser.rb +124 -0
  23. data/lib/sportradar/nfl/play_by_play.rb +9 -0
  24. data/lib/sportradar/nfl/play_summary.rb +27 -0
  25. data/lib/sportradar/nfl/rankings.rb +9 -0
  26. data/lib/sportradar/nfl/season_statistics.rb +28 -0
  27. data/lib/sportradar/nfl/standings.rb +9 -0
  28. data/lib/sportradar/nfl/team_depth_chart.rb +17 -0
  29. data/lib/sportradar/nfl/team_depth_charts.rb +17 -0
  30. data/lib/sportradar/nfl/team_roster.rb +17 -0
  31. data/lib/sportradar/nfl/team_rosters.rb +17 -0
  32. data/lib/sportradar/nfl/team_statistics.rb +18 -0
  33. data/lib/sportradar/nfl/teams_request.rb +39 -0
  34. data/lib/sportradar/nfl/weekly_boxscore.rb +9 -0
  35. data/lib/sportradar/nfl/weekly_extended_boxscores.rb +20 -0
  36. data/lib/sportradar/nfl/weekly_game_depth_charts.rb +20 -0
  37. data/lib/sportradar/nfl/weekly_game_statistics.rb +21 -0
  38. data/lib/sportradar/nfl/weekly_game_summary.rb +21 -0
  39. data/lib/sportradar/nfl/weekly_leaders.rb +9 -0
  40. data/lib/sportradar/nfl/weekly_play_by_play.rb +21 -0
  41. data/lib/sportradar/nfl/weekly_schedule.rb +26 -0
  42. data/lib/sportradar/version.rb +1 -1
  43. data/sample.env +7 -0
  44. data/sportradar.gemspec +1 -1
  45. metadata +36 -4
@@ -1,3 +1,4 @@
1
+ require 'active_support/core_ext/hash'
1
2
  require 'active_support/core_ext/string'
2
3
  require 'active_support/inflector'
3
4
 
@@ -5,6 +6,7 @@ require 'addressable/uri'
5
6
  require 'addressable/template'
6
7
 
7
8
  require 'dotenv'
9
+ require 'fileutils'
8
10
  require 'net/https'
9
11
  require 'oj'
10
12
 
@@ -15,6 +17,9 @@ require 'sportradar/client/daily_api_request'
15
17
  require 'sportradar/client/client'
16
18
  require 'sportradar/client/configuration'
17
19
 
20
+ require 'sportradar/feeds/league_schedule'
21
+ require 'sportradar/feeds/league_hierarchy'
22
+
18
23
  require 'sportradar/mlb/models/at_bat'
19
24
  require 'sportradar/mlb/models/pitch'
20
25
  require 'sportradar/mlb/models/pitch_outcome'
@@ -43,6 +48,38 @@ require 'sportradar/mlb/team_profile'
43
48
  require 'sportradar/mlb/team_rosters'
44
49
  require 'sportradar/mlb/venues'
45
50
 
51
+ require 'sportradar/nfl/parsers/boxscore_parser'
52
+
53
+ require 'sportradar/nfl/league_hierarchy'
54
+ require 'sportradar/nfl/league_schedule'
55
+ require 'sportradar/nfl/weekly_schedule'
56
+ require 'sportradar/nfl/weekly_game_depth_charts'
57
+ require 'sportradar/nfl/weekly_game_statistics'
58
+ require 'sportradar/nfl/weekly_game_summary'
59
+ require 'sportradar/nfl/weekly_play_by_play'
60
+ require 'sportradar/nfl/game_request'
61
+ require 'sportradar/nfl/game_depth_chart'
62
+ require 'sportradar/nfl/game_injuries'
63
+ require 'sportradar/nfl/game_roster'
64
+ require 'sportradar/nfl/game_statistics'
65
+ require 'sportradar/nfl/game_summary'
66
+ require 'sportradar/nfl/play_by_play'
67
+ require 'sportradar/nfl/play_summary'
68
+ require 'sportradar/nfl/boxscore'
69
+ require 'sportradar/nfl/extended_boxscore'
70
+ require 'sportradar/nfl/weekly_boxscore'
71
+ require 'sportradar/nfl/weekly_extended_boxscores'
72
+ require 'sportradar/nfl/teams_request'
73
+ require 'sportradar/nfl/team_roster'
74
+ require 'sportradar/nfl/team_rosters'
75
+ require 'sportradar/nfl/team_depth_chart'
76
+ require 'sportradar/nfl/team_depth_charts'
77
+ require 'sportradar/nfl/team_statistics'
78
+ require 'sportradar/nfl/weekly_leaders'
79
+ require 'sportradar/nfl/rankings'
80
+ require 'sportradar/nfl/standings'
81
+ require 'sportradar/nfl/season_statistics'
82
+
46
83
  Oj.default_options = {}
47
84
 
48
85
  Dotenv.load
@@ -6,10 +6,18 @@ module Sportradar
6
6
  endpoint: endpoint)
7
7
  end
8
8
 
9
+ def self.fetch
10
+ new.fetch
11
+ end
12
+
9
13
  def fetch
10
14
  client.fetch
11
15
  end
12
16
 
17
+ def self.save
18
+ new.save
19
+ end
20
+
13
21
  def save
14
22
  client.save
15
23
  end
@@ -21,11 +21,11 @@ module Sportradar
21
21
  when '403'
22
22
  raise 'Forbidden'
23
23
  else
24
- raise 'Error in HTTP request'
24
+ raise "#{res.code} Error in HTTP request for #{path}"
25
25
  end
26
26
  end
27
27
  rescue StandardError => e
28
- puts "HTTP Request failed (#{e.message})"
28
+ puts "HTTP Request for #{path} failed (#{e.message})"
29
29
  raise e
30
30
  end
31
31
 
@@ -60,7 +60,9 @@ module Sportradar
60
60
  end
61
61
 
62
62
  def filepath
63
- "#{Sportradar.configuration.filepath.freeze}/#{sport}/#{league}/#{endpoint}"
63
+ "#{Sportradar.configuration.filepath.freeze}/#{sport}/#{league}/#{endpoint}".tap do |path|
64
+ FileUtils.mkpath(path)
65
+ end
64
66
  end
65
67
 
66
68
  def url
@@ -80,7 +82,7 @@ module Sportradar
80
82
 
81
83
  def access_level
82
84
  Sportradar.configuration.
83
- access_level.
85
+ access_levels[league].
84
86
  freeze
85
87
  end
86
88
 
@@ -94,6 +96,8 @@ module Sportradar
94
96
  case league
95
97
  when 'mlb'
96
98
  '5'
99
+ when 'nfl'
100
+ '1'
97
101
  else
98
102
  '5'
99
103
  end
@@ -107,6 +111,8 @@ module Sportradar
107
111
  case league
108
112
  when 'mlb'
109
113
  'baseball'
114
+ when 'nfl'
115
+ 'football'
110
116
  else
111
117
  'baseball'
112
118
  end
@@ -31,8 +31,13 @@ module Sportradar
31
31
  }
32
32
  end
33
33
 
34
- def access_level
35
- @access_level || ENV['SPORTRADAR_ACCESS_LEVEL'] || 't'
34
+ def access_levels
35
+ {
36
+ 'mlb' => ENV['SPORTRADAR_ACCESS_LEVEL_MLB'],
37
+ 'nba' => ENV['SPORTRADAR_ACCESS_LEVEL_NBA'],
38
+ 'nfl' => ENV['SPORTRADAR_ACCESS_LEVEL_NFL'],
39
+ 'nhl' => ENV['SPORTRADAR_ACCESS_LEVEL_NHL'],
40
+ }
36
41
  end
37
42
 
38
43
  def base_uri
@@ -0,0 +1,12 @@
1
+ module Sportradar
2
+ module Feeds
3
+ class LeagueHierarchy < Sportradar::ApiRequest
4
+ def initialize
5
+ end
6
+
7
+ def path
8
+ "league/hierarchy.json"
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,18 @@
1
+ module Sportradar
2
+ module Feeds
3
+ class LeagueSchedule < Sportradar::ApiRequest
4
+ def initialize(year: nil, interval_type: nil)
5
+ @year = year || Date.today.strftime('%Y')
6
+ @interval_type = interval_type || 'reg'
7
+ end
8
+
9
+ def path
10
+ "games/#{year}/#{interval_type}/schedule.json"
11
+ end
12
+
13
+ private
14
+
15
+ attr_reader :interval_type, :year
16
+ end
17
+ end
18
+ end
@@ -1,12 +1,6 @@
1
1
  module Sportradar
2
2
  module Mlb
3
- class LeagueHierarchy < Sportradar::ApiRequest
4
- def initialize
5
- end
6
-
7
- def path
8
- "league/hierarchy.json"
9
- end
3
+ class LeagueHierarchy < Sportradar::Feeds::LeagueHierarchy
10
4
  end
11
5
  end
12
6
  end
@@ -1,18 +1,13 @@
1
1
  module Sportradar
2
2
  module Mlb
3
- class LeagueSchedule < Sportradar::ApiRequest
4
- def initialize(year: nil, interval_type: nil)
5
- @year = year || Date.today.strftime('%Y')
6
- @interval_type = interval_type || 'reg'
3
+ class LeagueSchedule < Sportradar::Feeds::LeagueSchedule
4
+ def self.games(json:)
5
+ [].tap do |games|
6
+ (json['league']['season']['games'] || []).each do |game_json|
7
+ games << game_json
8
+ end
9
+ end
7
10
  end
8
-
9
- def path
10
- "games/#{year}/#{interval_type}/schedule.json"
11
- end
12
-
13
- private
14
-
15
- attr_reader :interval_type, :year
16
11
  end
17
12
  end
18
13
  end
@@ -24,7 +24,7 @@ module Sportradar
24
24
  event['inning']
25
25
  end
26
26
 
27
- def oridinal_inning
27
+ def ordinal_inning
28
28
  ActiveSupport::Inflector.ordinalize(inning)
29
29
  end
30
30
 
@@ -45,7 +45,7 @@ module Sportradar
45
45
 
46
46
  def inning_label
47
47
  if inning
48
- "#{inning_half_label} #{oridinal_inning}"
48
+ "#{inning_half_label} #{ordinal_inning}"
49
49
  end
50
50
  end
51
51
 
@@ -0,0 +1,9 @@
1
+ module Sportradar
2
+ module Nfl
3
+ class Boxscore < Sportradar::Nfl::GameRequest
4
+ def path
5
+ "#{game_path}/boxscore.json"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sportradar
2
+ module Nfl
3
+ class ExtendedBoxscore < Sportradar::Nfl::GameRequest
4
+ def path
5
+ "#{game_path}/extended-boxscore.json"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sportradar
2
+ module Nfl
3
+ class GameDepthChart < Sportradar::Nfl::GameRequest
4
+ def path
5
+ "#{game_path}/depthchart.json"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sportradar
2
+ module Nfl
3
+ class GameInjuries < Sportradar::Nfl::GameRequest
4
+ def path
5
+ "#{game_path}/injuries.json"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,24 @@
1
+ module Sportradar
2
+ module Nfl
3
+ class GameRequest < Sportradar::Nfl::WeeklySchedule
4
+ def initialize(year: nil,
5
+ interval_type: nil,
6
+ week: 1,
7
+ away_team_abbreviation:,
8
+ home_team_abbreviation:)
9
+ super(year: year, interval_type: interval_type, week: week)
10
+
11
+ @away_team_abbreviation = away_team_abbreviation
12
+ @home_team_abbreviation = home_team_abbreviation
13
+ end
14
+
15
+ def game_path
16
+ "#{year}/#{interval_type}/#{week}/#{away_team_abbreviation}/#{home_team_abbreviation}"
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :away_team_abbreviation, :home_team_abbreviation
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,9 @@
1
+ module Sportradar
2
+ module Nfl
3
+ class GameRoster < Sportradar::Nfl::GameRequest
4
+ def path
5
+ "#{game_path}/roster.json"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sportradar
2
+ module Nfl
3
+ class GameStatistics < Sportradar::Nfl::GameRequest
4
+ def path
5
+ "#{game_path}/statistics.json"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sportradar
2
+ module Nfl
3
+ class GameSummary < Sportradar::Nfl::GameRequest
4
+ def path
5
+ "#{game_path}/summary.json"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sportradar
2
+ module Nfl
3
+ class LeagueHierarchy < Sportradar::Feeds::LeagueHierarchy
4
+ def path
5
+ "teams/hierarchy.json"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,33 @@
1
+ module Sportradar
2
+ module Nfl
3
+ class LeagueSchedule < Sportradar::Feeds::LeagueSchedule
4
+ def fetch
5
+ super.tap do |json|
6
+ season = json['season']
7
+ interval_type = json['type']
8
+ (json['weeks'] || []).each do |week_json|
9
+ (week_json['games'] || []).each do |game_json|
10
+ game_json['season'] = season
11
+ game_json['interval_type'] = interval_type
12
+ game_json['week'] = week_json['number']
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ def self.games(json:)
19
+ [].tap do |games|
20
+ (json['weeks'] || []).each do |week_json|
21
+ (week_json['games'] || []).each do |game_json|
22
+ games << game_json
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ def path
29
+ "#{year}/#{interval_type}/schedule.json"
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,124 @@
1
+ module Sportradar
2
+ module Nfl
3
+ module Parsers
4
+ class BoxscoreParser
5
+ def initialize(json: {})
6
+ @json = json['game'] || json
7
+ end
8
+
9
+ def game_id
10
+ json['id']
11
+ end
12
+
13
+ def quarter
14
+ json['quarter'].to_i
15
+ end
16
+
17
+ def clock
18
+ json['clock']
19
+ end
20
+
21
+ def completed
22
+ json['completed'] && json['completed'].to_datetime
23
+ end
24
+
25
+ def clock_attributes
26
+ {
27
+ clock: clock,
28
+ clock_secs: clock_secs,
29
+ period: quarter,
30
+ ended_at: completed,
31
+ }.compact
32
+ end
33
+
34
+ def clock_secs
35
+ begin
36
+ if clock && clock.include?(':')
37
+ mins, secs = clock.split(':').map(&:to_i)
38
+ Time.parse("00:#{mins}:#{secs}").
39
+ seconds_since_midnight.to_i
40
+ end
41
+ rescue => e
42
+ puts e
43
+ return 0
44
+ end
45
+ end
46
+
47
+ def home_team_json
48
+ json['home_team'] || {}
49
+ end
50
+
51
+ def home_team_id
52
+ home_team_json['id']
53
+ end
54
+
55
+ def home_team_scoring_data
56
+ home_team_json['scoring'] || {}
57
+ end
58
+
59
+ def home_team_scoring
60
+ {
61
+ points: home_team_json['points'],
62
+ remaining_challenges: home_team_json['remaining_challenges'],
63
+ remaining_timeouts: home_team_json['remaining_timeouts'],
64
+ }.merge(home_team_scoring_quarters).
65
+ compact
66
+ end
67
+
68
+ def home_team_scoring_quarters
69
+ team_scoring_quarters(data: home_team_scoring_data)
70
+ end
71
+
72
+ def away_team_json
73
+ json['away_team'] || {}
74
+ end
75
+
76
+ def away_team_id
77
+ away_team_json['id']
78
+ end
79
+
80
+ def away_team_scoring_data
81
+ away_team_json['scoring'] || {}
82
+ end
83
+
84
+ def away_team_scoring
85
+ {
86
+ points: away_team_json['points'],
87
+ remaining_challenges: away_team_json['remaining_challenges'],
88
+ remaining_timeouts: away_team_json['remaining_timeouts'],
89
+ }.merge(away_team_scoring_quarters).
90
+ compact
91
+ end
92
+
93
+ def away_team_scoring_quarters
94
+ team_scoring_quarters(data: away_team_scoring_data)
95
+ end
96
+
97
+ def team_scoring_quarters(data:)
98
+ {}.tap do |scoring_quarters|
99
+ overtime_points = 0
100
+ data.map do |scoring_data|
101
+ if quarter = scoring_data['quarter'].to_i
102
+ if quarter > 0 && quarter <= 4
103
+ key = "points_quarter_#{quarter}".to_sym
104
+ scoring_quarters[key] =
105
+ scoring_data['points'].to_i
106
+ elsif quarter > 4
107
+ key = "points_overtime_#{quarter - 4}".to_sym
108
+ scoring_quarters[key] =
109
+ scoring_data['points'].to_i
110
+ overtime_points += scoring_data['points'].to_i
111
+ end
112
+ end
113
+ end
114
+ scoring_quarters[:points_overtime] = overtime_points
115
+ end
116
+ end
117
+
118
+ private
119
+
120
+ attr_reader :json
121
+ end
122
+ end
123
+ end
124
+ end