sports_data_api 0.0.3 → 0.1.0
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.
- checksums.yaml +7 -0
- data/.gitignore +7 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +2 -1
- data/Guardfile +1 -1
- data/README.md +20 -5
- data/lib/sports_data_api/exception.rb +5 -0
- data/lib/sports_data_api/mlb/boxscore.rb +36 -0
- data/lib/sports_data_api/mlb/broadcast.rb +14 -0
- data/lib/sports_data_api/mlb/game.rb +30 -0
- data/lib/sports_data_api/mlb/game_stat.rb +26 -0
- data/lib/sports_data_api/mlb/game_stats.rb +44 -0
- data/lib/sports_data_api/mlb/games.rb +29 -0
- data/lib/sports_data_api/mlb/player.rb +17 -0
- data/lib/sports_data_api/mlb/players.rb +42 -0
- data/lib/sports_data_api/mlb/season.rb +18 -0
- data/lib/sports_data_api/mlb/team.rb +35 -0
- data/lib/sports_data_api/mlb/teams.rb +42 -0
- data/lib/sports_data_api/mlb/venue.rb +15 -0
- data/lib/sports_data_api/mlb/venues.rb +37 -0
- data/lib/sports_data_api/mlb.rb +82 -0
- data/lib/sports_data_api/nba/broadcast.rb +14 -0
- data/lib/sports_data_api/nba/game.rb +54 -0
- data/lib/sports_data_api/nba/games.rb +26 -0
- data/lib/sports_data_api/nba/player.rb +22 -0
- data/lib/sports_data_api/nba/season.rb +28 -0
- data/lib/sports_data_api/nba/team.rb +40 -0
- data/lib/sports_data_api/nba/teams.rb +83 -0
- data/lib/sports_data_api/nba/venue.rb +20 -0
- data/lib/sports_data_api/nba.rb +71 -0
- data/lib/sports_data_api/nfl/broadcast.rb +15 -0
- data/lib/sports_data_api/nfl/game.rb +83 -0
- data/lib/sports_data_api/nfl/games.rb +29 -0
- data/lib/sports_data_api/nfl/injuries.rb +9 -0
- data/lib/sports_data_api/nfl/player.rb +15 -0
- data/lib/sports_data_api/nfl/player_season_stats.rb +26 -0
- data/lib/sports_data_api/nfl/season.rb +27 -0
- data/lib/sports_data_api/nfl/team.rb +46 -0
- data/lib/sports_data_api/nfl/team_roster.rb +17 -0
- data/lib/sports_data_api/nfl/team_season_stats.rb +19 -0
- data/lib/sports_data_api/nfl/teams.rb +84 -0
- data/lib/sports_data_api/nfl/venue.rb +22 -0
- data/lib/sports_data_api/nfl/weather.rb +17 -0
- data/lib/sports_data_api/nfl/week.rb +20 -0
- data/lib/sports_data_api/nfl.rb +98 -0
- data/lib/sports_data_api/stats.rb +13 -0
- data/lib/sports_data_api/version.rb +1 -1
- data/lib/sports_data_api.rb +37 -12
- data/spec/cassettes/sports_data_api_mlb_game.yml +20193 -0
- data/spec/cassettes/sports_data_api_mlb_game_boxscore.yml +225 -0
- data/spec/cassettes/sports_data_api_mlb_game_stats.yml +657 -0
- data/spec/cassettes/sports_data_api_mlb_games.yml +195 -0
- data/spec/cassettes/sports_data_api_mlb_player.yml +10891 -0
- data/spec/cassettes/sports_data_api_mlb_season.yml +20193 -0
- data/spec/cassettes/sports_data_api_mlb_team.yml +182 -0
- data/spec/cassettes/sports_data_api_mlb_team_roster.yml +10891 -0
- data/spec/cassettes/sports_data_api_mlb_teams.yml +403 -0
- data/spec/cassettes/sports_data_api_mlb_venues.yml +343 -0
- data/spec/cassettes/sports_data_api_nba.yml +74176 -0
- data/spec/cassettes/sports_data_api_nba_broadcast.yml +88 -0
- data/spec/cassettes/sports_data_api_nba_game.yml +21202 -0
- data/spec/cassettes/sports_data_api_nba_games.yml +128 -0
- data/spec/cassettes/sports_data_api_nba_league_hierarchy.yml +545 -0
- data/spec/cassettes/sports_data_api_nba_player.yml +244 -0
- data/spec/cassettes/sports_data_api_nba_season.yml +18228 -0
- data/spec/cassettes/sports_data_api_nba_team.yml +1398 -0
- data/spec/cassettes/sports_data_api_nba_team_roster.yml +244 -0
- data/spec/cassettes/sports_data_api_nba_venue.yml +88 -0
- data/spec/cassettes/sports_data_api_nfl.yml +19105 -0
- data/spec/cassettes/sports_data_api_nfl_broadcast.yml +112 -0
- data/spec/cassettes/sports_data_api_nfl_game.yml +16139 -0
- data/spec/cassettes/sports_data_api_nfl_games.yml +912 -0
- data/spec/cassettes/sports_data_api_nfl_player_season_stats.yml +997 -0
- data/spec/cassettes/sports_data_api_nfl_season.yml +14100 -0
- data/spec/cassettes/sports_data_api_nfl_team.yml +783 -0
- data/spec/cassettes/sports_data_api_nfl_team_hierarchy.yml +909 -0
- data/spec/cassettes/sports_data_api_nfl_team_roster.yml +618 -0
- data/spec/cassettes/sports_data_api_nfl_team_season_stats.yml +981 -0
- data/spec/cassettes/sports_data_api_nfl_venue.yml +112 -0
- data/spec/cassettes/sports_data_api_nfl_weather.yml +112 -0
- data/spec/cassettes/sports_data_api_nfl_week.yml +14100 -0
- data/spec/lib/sports_data_api/mlb/boxscore_spec.rb +63 -0
- data/spec/lib/sports_data_api/mlb/game_spec.rb +24 -0
- data/spec/lib/sports_data_api/mlb/game_stats_spec.rb +25 -0
- data/spec/lib/sports_data_api/mlb/games_spec.rb +24 -0
- data/spec/lib/sports_data_api/mlb/player_spec.rb +103 -0
- data/spec/lib/sports_data_api/mlb/players_spec.rb +17 -0
- data/spec/lib/sports_data_api/mlb/season_spec.rb +19 -0
- data/spec/lib/sports_data_api/mlb/team_spec.rb +24 -0
- data/spec/lib/sports_data_api/mlb/teams_spec.rb +30 -0
- data/spec/lib/sports_data_api/mlb/venues_spec.rb +17 -0
- data/spec/lib/sports_data_api/nba/broadcast_spec.rb +18 -0
- data/spec/lib/sports_data_api/nba/game_spec.rb +87 -0
- data/spec/lib/sports_data_api/nba/games_spec.rb +19 -0
- data/spec/lib/sports_data_api/nba/player_spec.rb +72 -0
- data/spec/lib/sports_data_api/nba/season_spec.rb +41 -0
- data/spec/lib/sports_data_api/nba/team_spec.rb +185 -0
- data/spec/lib/sports_data_api/nba/teams_spec.rb +76 -0
- data/spec/lib/sports_data_api/nba/venue_spec.rb +24 -0
- data/spec/lib/sports_data_api/nba_spec.rb +41 -0
- data/spec/lib/sports_data_api/nfl/broadcast_spec.rb +19 -0
- data/spec/lib/sports_data_api/nfl/game_spec.rb +126 -0
- data/spec/lib/sports_data_api/nfl/games_spec.rb +21 -0
- data/spec/lib/sports_data_api/nfl/player_season_stats.rb +28 -0
- data/spec/lib/sports_data_api/nfl/season_spec.rb +41 -0
- data/spec/lib/sports_data_api/nfl/team_roster_spec.rb +28 -0
- data/spec/lib/sports_data_api/nfl/team_season_stats.rb +19 -0
- data/spec/lib/sports_data_api/nfl/team_spec.rb +52 -0
- data/spec/lib/sports_data_api/nfl/teams_spec.rb +77 -0
- data/spec/lib/sports_data_api/nfl/venue_spec.rb +26 -0
- data/spec/lib/sports_data_api/nfl/weather_spec.rb +21 -0
- data/spec/lib/sports_data_api/nfl/week_spec.rb +21 -0
- data/spec/lib/sports_data_api/nfl_spec.rb +113 -0
- data/spec/lib/sports_data_api_spec.rb +8 -5
- data/spec/spec_helper.rb +30 -9
- data/sports_data_api.gemspec +19 -15
- metadata +267 -76
- data/.rvmrc +0 -38
- data/lib/nfl.rb +0 -149
- data/spec/lib/nfl_spec.rb +0 -125
- data/spec/xml/boxscore.xml +0 -93
- data/spec/xml/schedule.xml +0 -4067
- data/spec/xml/teams.xml +0 -119
@@ -0,0 +1,20 @@
|
|
1
|
+
module SportsDataApi
|
2
|
+
module Nfl
|
3
|
+
class Week
|
4
|
+
attr_reader :number, :games, :year, :season
|
5
|
+
|
6
|
+
def initialize(year, season, xml)
|
7
|
+
@games = []
|
8
|
+
@year = year
|
9
|
+
@season = season
|
10
|
+
|
11
|
+
if xml.is_a? Nokogiri::XML::Element
|
12
|
+
@number = xml["week"].to_i
|
13
|
+
@games = xml.xpath("game").map do |game_xml|
|
14
|
+
Game.new(@year, @season, @number, game_xml)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module SportsDataApi
|
2
|
+
module Nfl
|
3
|
+
|
4
|
+
class Exception < ::Exception
|
5
|
+
end
|
6
|
+
|
7
|
+
DIR = File.join(File.dirname(__FILE__), 'nfl')
|
8
|
+
BASE_URL = 'http://api.sportsdatallc.org/nfl-%{access_level}%{version}'
|
9
|
+
DEFAULT_VERSION = 1
|
10
|
+
SPORT = :nfl
|
11
|
+
|
12
|
+
autoload :Team, File.join(DIR, 'team')
|
13
|
+
autoload :Teams, File.join(DIR, 'teams')
|
14
|
+
autoload :TeamRoster, File.join(DIR, 'team_roster')
|
15
|
+
autoload :Player, File.join(DIR, 'player')
|
16
|
+
autoload :TeamSeasonStats, File.join(DIR, 'team_season_stats')
|
17
|
+
autoload :PlayerSeasonStats, File.join(DIR, 'player_season_stats')
|
18
|
+
autoload :Game, File.join(DIR, 'game')
|
19
|
+
autoload :Games, File.join(DIR, 'games')
|
20
|
+
autoload :Week, File.join(DIR, 'week')
|
21
|
+
autoload :Season, File.join(DIR, 'season')
|
22
|
+
autoload :Venue, File.join(DIR, 'venue')
|
23
|
+
autoload :Broadcast, File.join(DIR, 'broadcast')
|
24
|
+
autoload :Weather, File.join(DIR, 'weather')
|
25
|
+
|
26
|
+
##
|
27
|
+
# Fetches NFL season schedule for a given year and season
|
28
|
+
def self.schedule(year, season, version = DEFAULT_VERSION)
|
29
|
+
season = season.to_s.upcase.to_sym
|
30
|
+
raise SportsDataApi::Nfl::Exception.new("#{season} is not a valid season") unless Season.valid?(season)
|
31
|
+
|
32
|
+
response = self.response_xml(version, "/#{year}/#{season}/schedule.xml")
|
33
|
+
|
34
|
+
return Season.new(response.xpath("/season"))
|
35
|
+
end
|
36
|
+
|
37
|
+
##
|
38
|
+
# Fetch NFL team roster
|
39
|
+
def self.team_roster(team, version = DEFAULT_VERSION)
|
40
|
+
response = self.response_xml(version, "/teams/#{team}/roster.xml")
|
41
|
+
|
42
|
+
return TeamRoster.new(response.xpath("team"))
|
43
|
+
end
|
44
|
+
|
45
|
+
##
|
46
|
+
# Fetch NFL team seaon stats for a given team, season and season type
|
47
|
+
def self.team_season_stats(team, season, season_type, version = DEFAULT_VERSION)
|
48
|
+
response = self.response_xml(version, "/teams/#{team}/#{season}/#{season_type}/statistics.xml")
|
49
|
+
|
50
|
+
return TeamSeasonStats.new(response.xpath("/season").xpath("team"))
|
51
|
+
end
|
52
|
+
|
53
|
+
##
|
54
|
+
# Fetch NFL player seaon stats for a given team, season and season type
|
55
|
+
def self.player_season_stats(team, season, season_type, version = DEFAULT_VERSION)
|
56
|
+
response = self.response_xml(version, "/teams/#{team}/#{season}/#{season_type}/statistics.xml")
|
57
|
+
|
58
|
+
return PlayerSeasonStats.new(response.xpath("/season").xpath("team").xpath("players"))
|
59
|
+
end
|
60
|
+
|
61
|
+
##
|
62
|
+
# Fetches NFL boxscore for a given game
|
63
|
+
def self.boxscore(year, season, week, home, away, version = DEFAULT_VERSION)
|
64
|
+
season = season.to_s.upcase.to_sym
|
65
|
+
raise SportsDataApi::Nfl::Exception.new("#{season} is not a valid season") unless Season.valid?(season)
|
66
|
+
|
67
|
+
response = self.response_xml(version, "/#{year}/#{season}/#{week}/#{away}/#{home}/boxscore.xml")
|
68
|
+
|
69
|
+
return Game.new(year, season, week, response.xpath("/game"))
|
70
|
+
end
|
71
|
+
|
72
|
+
##
|
73
|
+
# Fetches all NFL teams
|
74
|
+
def self.teams(version = DEFAULT_VERSION)
|
75
|
+
response = self.response_xml(version, "/teams/hierarchy.xml")
|
76
|
+
|
77
|
+
return Teams.new(response.xpath('/league'))
|
78
|
+
end
|
79
|
+
|
80
|
+
##
|
81
|
+
# Fetches NFL weekly schedule for a given year, season and week
|
82
|
+
def self.weekly(year, season, week, version = DEFAULT_VERSION)
|
83
|
+
season = season.to_s.upcase.to_sym
|
84
|
+
raise SportsDataApi::Nfl::Exception.new("#{season} is not a valid season") unless Season.valid?(season)
|
85
|
+
|
86
|
+
response = self.response_xml(version, "/#{year}/#{season}/#{week}/schedule.xml")
|
87
|
+
|
88
|
+
return Games.new(response.xpath('/games'))
|
89
|
+
end
|
90
|
+
|
91
|
+
private
|
92
|
+
def self.response_xml(version, url)
|
93
|
+
base_url = BASE_URL % { access_level: SportsDataApi.access_level(SPORT), version: version }
|
94
|
+
response = SportsDataApi.generic_request("#{base_url}#{url}", SPORT)
|
95
|
+
Nokogiri::XML(response.to_s).remove_namespaces!
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module SportsDataApi
|
2
|
+
class Stats
|
3
|
+
def initialize(xml)
|
4
|
+
if xml.is_a? Nokogiri::XML::Element
|
5
|
+
stat_ivar = self.instance_variable_set("@#{xml.name}", {})
|
6
|
+
self.class.class_eval { attr_reader :"#{xml.name}" }
|
7
|
+
xml.attributes.each do | attr_name, attr_value|
|
8
|
+
stat_ivar[attr_name.to_sym] = attr_value.value
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/sports_data_api.rb
CHANGED
@@ -4,25 +4,50 @@ require "rest_client"
|
|
4
4
|
require "time"
|
5
5
|
|
6
6
|
module SportsDataApi
|
7
|
-
def self.key
|
8
|
-
@key ||=
|
9
|
-
@key
|
7
|
+
def self.key(sport)
|
8
|
+
@key ||= {}
|
9
|
+
@key[sport] ||= ''
|
10
|
+
@key[sport]
|
10
11
|
end
|
11
12
|
|
12
|
-
def self.
|
13
|
-
@key
|
13
|
+
def self.set_key(sport, new_key)
|
14
|
+
@key ||= {}
|
15
|
+
@key[sport] = new_key
|
14
16
|
end
|
15
17
|
|
16
|
-
def self.access_level
|
17
|
-
@access_level ||=
|
18
|
-
@access_level
|
18
|
+
def self.access_level(sport)
|
19
|
+
@access_level ||= {}
|
20
|
+
@access_level[sport] ||= "t"
|
21
|
+
@access_level[sport]
|
19
22
|
end
|
20
23
|
|
21
|
-
def self.
|
22
|
-
@access_level
|
24
|
+
def self.set_access_level(sport, new_level)
|
25
|
+
@access_level ||= {}
|
26
|
+
@access_level[sport] = new_level
|
23
27
|
end
|
24
28
|
|
25
|
-
|
29
|
+
def self.generic_request(url, sport)
|
30
|
+
begin
|
31
|
+
return RestClient.get(url, params: { api_key: SportsDataApi.key(sport) })
|
32
|
+
rescue RestClient::RequestTimeout => timeout
|
33
|
+
raise SportsDataApi::Exception, 'The API did not respond in a reasonable amount of time'
|
34
|
+
rescue RestClient::Exception => e
|
35
|
+
message = if e.response.headers.key? :x_server_error
|
36
|
+
JSON.parse(e.response.headers[:x_server_error], { symbolize_names: true })[:message]
|
37
|
+
elsif e.response.headers.key? :x_mashery_error_code
|
38
|
+
e.response.headers[:x_mashery_error_code]
|
39
|
+
else
|
40
|
+
"The server did not specify a message"
|
41
|
+
end
|
42
|
+
raise SportsDataApi::Exception, message
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
LIBRARY_PATH = File.join(File.dirname(__FILE__), 'sports_data_api')
|
26
47
|
|
27
|
-
|
48
|
+
autoload :Stats, File.join(LIBRARY_PATH, 'stats')
|
49
|
+
autoload :Nfl, File.join(LIBRARY_PATH, 'nfl')
|
50
|
+
autoload :Nba, File.join(LIBRARY_PATH, 'nba')
|
51
|
+
autoload :Mlb, File.join(LIBRARY_PATH, 'mlb')
|
52
|
+
autoload :Exception, File.join(LIBRARY_PATH, 'exception')
|
28
53
|
end
|