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.
Files changed (124) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +7 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/.travis.yml +2 -1
  6. data/Guardfile +1 -1
  7. data/README.md +20 -5
  8. data/lib/sports_data_api/exception.rb +5 -0
  9. data/lib/sports_data_api/mlb/boxscore.rb +36 -0
  10. data/lib/sports_data_api/mlb/broadcast.rb +14 -0
  11. data/lib/sports_data_api/mlb/game.rb +30 -0
  12. data/lib/sports_data_api/mlb/game_stat.rb +26 -0
  13. data/lib/sports_data_api/mlb/game_stats.rb +44 -0
  14. data/lib/sports_data_api/mlb/games.rb +29 -0
  15. data/lib/sports_data_api/mlb/player.rb +17 -0
  16. data/lib/sports_data_api/mlb/players.rb +42 -0
  17. data/lib/sports_data_api/mlb/season.rb +18 -0
  18. data/lib/sports_data_api/mlb/team.rb +35 -0
  19. data/lib/sports_data_api/mlb/teams.rb +42 -0
  20. data/lib/sports_data_api/mlb/venue.rb +15 -0
  21. data/lib/sports_data_api/mlb/venues.rb +37 -0
  22. data/lib/sports_data_api/mlb.rb +82 -0
  23. data/lib/sports_data_api/nba/broadcast.rb +14 -0
  24. data/lib/sports_data_api/nba/game.rb +54 -0
  25. data/lib/sports_data_api/nba/games.rb +26 -0
  26. data/lib/sports_data_api/nba/player.rb +22 -0
  27. data/lib/sports_data_api/nba/season.rb +28 -0
  28. data/lib/sports_data_api/nba/team.rb +40 -0
  29. data/lib/sports_data_api/nba/teams.rb +83 -0
  30. data/lib/sports_data_api/nba/venue.rb +20 -0
  31. data/lib/sports_data_api/nba.rb +71 -0
  32. data/lib/sports_data_api/nfl/broadcast.rb +15 -0
  33. data/lib/sports_data_api/nfl/game.rb +83 -0
  34. data/lib/sports_data_api/nfl/games.rb +29 -0
  35. data/lib/sports_data_api/nfl/injuries.rb +9 -0
  36. data/lib/sports_data_api/nfl/player.rb +15 -0
  37. data/lib/sports_data_api/nfl/player_season_stats.rb +26 -0
  38. data/lib/sports_data_api/nfl/season.rb +27 -0
  39. data/lib/sports_data_api/nfl/team.rb +46 -0
  40. data/lib/sports_data_api/nfl/team_roster.rb +17 -0
  41. data/lib/sports_data_api/nfl/team_season_stats.rb +19 -0
  42. data/lib/sports_data_api/nfl/teams.rb +84 -0
  43. data/lib/sports_data_api/nfl/venue.rb +22 -0
  44. data/lib/sports_data_api/nfl/weather.rb +17 -0
  45. data/lib/sports_data_api/nfl/week.rb +20 -0
  46. data/lib/sports_data_api/nfl.rb +98 -0
  47. data/lib/sports_data_api/stats.rb +13 -0
  48. data/lib/sports_data_api/version.rb +1 -1
  49. data/lib/sports_data_api.rb +37 -12
  50. data/spec/cassettes/sports_data_api_mlb_game.yml +20193 -0
  51. data/spec/cassettes/sports_data_api_mlb_game_boxscore.yml +225 -0
  52. data/spec/cassettes/sports_data_api_mlb_game_stats.yml +657 -0
  53. data/spec/cassettes/sports_data_api_mlb_games.yml +195 -0
  54. data/spec/cassettes/sports_data_api_mlb_player.yml +10891 -0
  55. data/spec/cassettes/sports_data_api_mlb_season.yml +20193 -0
  56. data/spec/cassettes/sports_data_api_mlb_team.yml +182 -0
  57. data/spec/cassettes/sports_data_api_mlb_team_roster.yml +10891 -0
  58. data/spec/cassettes/sports_data_api_mlb_teams.yml +403 -0
  59. data/spec/cassettes/sports_data_api_mlb_venues.yml +343 -0
  60. data/spec/cassettes/sports_data_api_nba.yml +74176 -0
  61. data/spec/cassettes/sports_data_api_nba_broadcast.yml +88 -0
  62. data/spec/cassettes/sports_data_api_nba_game.yml +21202 -0
  63. data/spec/cassettes/sports_data_api_nba_games.yml +128 -0
  64. data/spec/cassettes/sports_data_api_nba_league_hierarchy.yml +545 -0
  65. data/spec/cassettes/sports_data_api_nba_player.yml +244 -0
  66. data/spec/cassettes/sports_data_api_nba_season.yml +18228 -0
  67. data/spec/cassettes/sports_data_api_nba_team.yml +1398 -0
  68. data/spec/cassettes/sports_data_api_nba_team_roster.yml +244 -0
  69. data/spec/cassettes/sports_data_api_nba_venue.yml +88 -0
  70. data/spec/cassettes/sports_data_api_nfl.yml +19105 -0
  71. data/spec/cassettes/sports_data_api_nfl_broadcast.yml +112 -0
  72. data/spec/cassettes/sports_data_api_nfl_game.yml +16139 -0
  73. data/spec/cassettes/sports_data_api_nfl_games.yml +912 -0
  74. data/spec/cassettes/sports_data_api_nfl_player_season_stats.yml +997 -0
  75. data/spec/cassettes/sports_data_api_nfl_season.yml +14100 -0
  76. data/spec/cassettes/sports_data_api_nfl_team.yml +783 -0
  77. data/spec/cassettes/sports_data_api_nfl_team_hierarchy.yml +909 -0
  78. data/spec/cassettes/sports_data_api_nfl_team_roster.yml +618 -0
  79. data/spec/cassettes/sports_data_api_nfl_team_season_stats.yml +981 -0
  80. data/spec/cassettes/sports_data_api_nfl_venue.yml +112 -0
  81. data/spec/cassettes/sports_data_api_nfl_weather.yml +112 -0
  82. data/spec/cassettes/sports_data_api_nfl_week.yml +14100 -0
  83. data/spec/lib/sports_data_api/mlb/boxscore_spec.rb +63 -0
  84. data/spec/lib/sports_data_api/mlb/game_spec.rb +24 -0
  85. data/spec/lib/sports_data_api/mlb/game_stats_spec.rb +25 -0
  86. data/spec/lib/sports_data_api/mlb/games_spec.rb +24 -0
  87. data/spec/lib/sports_data_api/mlb/player_spec.rb +103 -0
  88. data/spec/lib/sports_data_api/mlb/players_spec.rb +17 -0
  89. data/spec/lib/sports_data_api/mlb/season_spec.rb +19 -0
  90. data/spec/lib/sports_data_api/mlb/team_spec.rb +24 -0
  91. data/spec/lib/sports_data_api/mlb/teams_spec.rb +30 -0
  92. data/spec/lib/sports_data_api/mlb/venues_spec.rb +17 -0
  93. data/spec/lib/sports_data_api/nba/broadcast_spec.rb +18 -0
  94. data/spec/lib/sports_data_api/nba/game_spec.rb +87 -0
  95. data/spec/lib/sports_data_api/nba/games_spec.rb +19 -0
  96. data/spec/lib/sports_data_api/nba/player_spec.rb +72 -0
  97. data/spec/lib/sports_data_api/nba/season_spec.rb +41 -0
  98. data/spec/lib/sports_data_api/nba/team_spec.rb +185 -0
  99. data/spec/lib/sports_data_api/nba/teams_spec.rb +76 -0
  100. data/spec/lib/sports_data_api/nba/venue_spec.rb +24 -0
  101. data/spec/lib/sports_data_api/nba_spec.rb +41 -0
  102. data/spec/lib/sports_data_api/nfl/broadcast_spec.rb +19 -0
  103. data/spec/lib/sports_data_api/nfl/game_spec.rb +126 -0
  104. data/spec/lib/sports_data_api/nfl/games_spec.rb +21 -0
  105. data/spec/lib/sports_data_api/nfl/player_season_stats.rb +28 -0
  106. data/spec/lib/sports_data_api/nfl/season_spec.rb +41 -0
  107. data/spec/lib/sports_data_api/nfl/team_roster_spec.rb +28 -0
  108. data/spec/lib/sports_data_api/nfl/team_season_stats.rb +19 -0
  109. data/spec/lib/sports_data_api/nfl/team_spec.rb +52 -0
  110. data/spec/lib/sports_data_api/nfl/teams_spec.rb +77 -0
  111. data/spec/lib/sports_data_api/nfl/venue_spec.rb +26 -0
  112. data/spec/lib/sports_data_api/nfl/weather_spec.rb +21 -0
  113. data/spec/lib/sports_data_api/nfl/week_spec.rb +21 -0
  114. data/spec/lib/sports_data_api/nfl_spec.rb +113 -0
  115. data/spec/lib/sports_data_api_spec.rb +8 -5
  116. data/spec/spec_helper.rb +30 -9
  117. data/sports_data_api.gemspec +19 -15
  118. metadata +267 -76
  119. data/.rvmrc +0 -38
  120. data/lib/nfl.rb +0 -149
  121. data/spec/lib/nfl_spec.rb +0 -125
  122. data/spec/xml/boxscore.xml +0 -93
  123. data/spec/xml/schedule.xml +0 -4067
  124. 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
@@ -1,3 +1,3 @@
1
1
  module SportsDataApi
2
- VERSION = "0.0.3"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -4,25 +4,50 @@ require "rest_client"
4
4
  require "time"
5
5
 
6
6
  module SportsDataApi
7
- def self.key
8
- @key ||= "garbage"
9
- @key
7
+ def self.key(sport)
8
+ @key ||= {}
9
+ @key[sport] ||= ''
10
+ @key[sport]
10
11
  end
11
12
 
12
- def self.key=(new_key)
13
- @key = new_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 ||= "t"
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.access_level=(new_level)
22
- @access_level = new_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
- autoload :Nfl, File.join(File.dirname(__FILE__), 'nfl')
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
- class Exception < ::Exception; end
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