sports_data_api 0.1.0 → 0.2.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 (80) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +1 -0
  4. data/README.md +6 -6
  5. data/lib/sports_data_api.rb +2 -0
  6. data/lib/sports_data_api/nfl.rb +28 -16
  7. data/lib/sports_data_api/nfl/broadcast.rb +6 -7
  8. data/lib/sports_data_api/nfl/game.rb +17 -22
  9. data/lib/sports_data_api/nfl/games.rb +7 -8
  10. data/lib/sports_data_api/nfl/player.rb +5 -7
  11. data/lib/sports_data_api/nfl/player_season_stats.rb +3 -13
  12. data/lib/sports_data_api/nfl/season.rb +5 -7
  13. data/lib/sports_data_api/nfl/team.rb +50 -11
  14. data/lib/sports_data_api/nfl/team_roster.rb +2 -5
  15. data/lib/sports_data_api/nfl/team_season_stats.rb +4 -9
  16. data/lib/sports_data_api/nfl/teams.rb +9 -15
  17. data/lib/sports_data_api/nfl/venue.rb +12 -13
  18. data/lib/sports_data_api/nfl/weather.rb +7 -8
  19. data/lib/sports_data_api/nfl/week.rb +4 -6
  20. data/lib/sports_data_api/nhl.rb +71 -0
  21. data/lib/sports_data_api/nhl/broadcast.rb +14 -0
  22. data/lib/sports_data_api/nhl/game.rb +54 -0
  23. data/lib/sports_data_api/nhl/games.rb +26 -0
  24. data/lib/sports_data_api/nhl/player.rb +31 -0
  25. data/lib/sports_data_api/nhl/season.rb +28 -0
  26. data/lib/sports_data_api/nhl/team.rb +40 -0
  27. data/lib/sports_data_api/nhl/teams.rb +83 -0
  28. data/lib/sports_data_api/nhl/venue.rb +20 -0
  29. data/lib/sports_data_api/stats.rb +6 -2
  30. data/lib/sports_data_api/version.rb +1 -1
  31. data/spec/cassettes/sports_data_api_mlb_game.yml +19926 -19688
  32. data/spec/cassettes/sports_data_api_mlb_game_boxscore.yml +24 -18
  33. data/spec/cassettes/sports_data_api_mlb_game_stats.yml +576 -574
  34. data/spec/cassettes/sports_data_api_mlb_games.yml +152 -147
  35. data/spec/cassettes/sports_data_api_mlb_player.yml +8459 -10660
  36. data/spec/cassettes/sports_data_api_mlb_season.yml +19926 -19688
  37. data/spec/cassettes/sports_data_api_mlb_team.yml +47 -44
  38. data/spec/cassettes/sports_data_api_mlb_team_roster.yml +8459 -10660
  39. data/spec/cassettes/sports_data_api_mlb_teams.yml +94 -130
  40. data/spec/cassettes/sports_data_api_mlb_venues.yml +16 -16
  41. data/spec/cassettes/sports_data_api_nfl.yml +5331 -18893
  42. data/spec/cassettes/sports_data_api_nfl_broadcast.yml +35 -84
  43. data/spec/cassettes/sports_data_api_nfl_game.yml +7702 -15956
  44. data/spec/cassettes/sports_data_api_nfl_games.yml +211 -884
  45. data/spec/cassettes/sports_data_api_nfl_player_season_stats.yml +1002 -959
  46. data/spec/cassettes/sports_data_api_nfl_season.yml +3168 -14065
  47. data/spec/cassettes/sports_data_api_nfl_team.yml +1264 -715
  48. data/spec/cassettes/sports_data_api_nfl_team_hierarchy.yml +462 -846
  49. data/spec/cassettes/sports_data_api_nfl_team_roster.yml +796 -580
  50. data/spec/cassettes/sports_data_api_nfl_team_season_stats.yml +1004 -945
  51. data/spec/cassettes/sports_data_api_nfl_venue.yml +35 -84
  52. data/spec/cassettes/sports_data_api_nfl_weather.yml +35 -84
  53. data/spec/cassettes/sports_data_api_nfl_week.yml +3168 -14065
  54. data/spec/cassettes/sports_data_api_nhl.yml +18999 -0
  55. data/spec/cassettes/sports_data_api_nhl_broadcast.yml +226 -0
  56. data/spec/cassettes/sports_data_api_nhl_game.yml +23261 -0
  57. data/spec/cassettes/sports_data_api_nhl_games.yml +226 -0
  58. data/spec/cassettes/sports_data_api_nhl_league_hierarchy.yml +535 -0
  59. data/spec/cassettes/sports_data_api_nhl_player.yml +396 -0
  60. data/spec/cassettes/sports_data_api_nhl_season.yml +18961 -0
  61. data/spec/cassettes/sports_data_api_nhl_team.yml +1962 -0
  62. data/spec/cassettes/sports_data_api_nhl_venue.yml +226 -0
  63. data/spec/lib/sports_data_api/mlb/players_spec.rb +1 -1
  64. data/spec/lib/sports_data_api/nfl/game_spec.rb +33 -9
  65. data/spec/lib/sports_data_api/nfl/team_spec.rb +62 -32
  66. data/spec/lib/sports_data_api/nfl/teams_spec.rb +5 -6
  67. data/spec/lib/sports_data_api/nfl/venue_spec.rb +3 -3
  68. data/spec/lib/sports_data_api/nfl_spec.rb +3 -3
  69. data/spec/lib/sports_data_api/nhl/broadcast_spec.rb +18 -0
  70. data/spec/lib/sports_data_api/nhl/game_spec.rb +87 -0
  71. data/spec/lib/sports_data_api/nhl/games_spec.rb +19 -0
  72. data/spec/lib/sports_data_api/nhl/player_spec.rb +56 -0
  73. data/spec/lib/sports_data_api/nhl/season_spec.rb +41 -0
  74. data/spec/lib/sports_data_api/nhl/team_spec.rb +240 -0
  75. data/spec/lib/sports_data_api/nhl/teams_spec.rb +76 -0
  76. data/spec/lib/sports_data_api/nhl/venue_spec.rb +24 -0
  77. data/spec/lib/sports_data_api/nhl_spec.rb +41 -0
  78. data/spec/spec_helper.rb +2 -0
  79. data/sports_data_api.gemspec +1 -0
  80. metadata +62 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4d8be1761997f03cc4d7aa1b666c29982fbbb2e2
4
- data.tar.gz: ae0d4e0bee91e4549235ad79c196fccead66a429
3
+ metadata.gz: 62aab7aee23b0a730d1134d17519b149c0094327
4
+ data.tar.gz: f95759783b3b4d34a87f79db7e6e5be0d0ed414c
5
5
  SHA512:
6
- metadata.gz: 1bfc851b3033f99db197871765983dc185aeddba7636e284efb150c3eb3af6eeb83b5000b08a57e3d4bbde38abeec0b3195029646ceced18fd3d307226240d04
7
- data.tar.gz: 255550917ad90c562706c64d36d9a01344ce37657db4afeb41e6e30ca045947bd620ef12e625872dcd70512ca0465b573b83f13a25fb9a7cddab31444d2433af
6
+ metadata.gz: 9152043f7a7d85ef9245dd0466f83d7f970d23c60a3a0ecb2007edda75623f01b3b7ec4781d2e16fd38aa010dbd90f1b7d6ba898d3148d8bd393ad8d018512b5
7
+ data.tar.gz: a2f99223b3092b2639a04ad843fd12e60f55af1388a3d937e550922e49bc6ae24f7457c9396c5d72ab35359815bc6452b4d73da1e57e59f742623a84793c3939
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-2.1.2
1
+ ruby-2.1
data/.travis.yml CHANGED
@@ -3,3 +3,4 @@ rvm:
3
3
  - 1.9.3
4
4
  - 2.0.0
5
5
  - 2.1.0
6
+ - ruby-head
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # SportsDataApi [![Build Status](https://travis-ci.org/RLovelett/sports_data_api.png?branch=master)](https://travis-ci.org/RLovelett/sports_data_api) [![Coverage Status](https://coveralls.io/repos/RLovelett/sports_data_api/badge.png?branch=master)](https://coveralls.io/r/RLovelett/sports_data_api?branch=master)
1
+ # SportsDataApi [![Build Status](https://travis-ci.org/RLovelett/sports_data_api.png?branch=master)](https://travis-ci.org/RLovelett/sports_data_api) [![Coverage Status](https://coveralls.io/repos/RLovelett/sports_data_api/badge.png?branch=master)](https://coveralls.io/r/RLovelett/sports_data_api?branch=master) [![Gem Version](https://badge.fury.io/rb/sports_data_api.svg)](http://badge.fury.io/rb/sports_data_api) [![Code Climate](https://codeclimate.com/github/RLovelett/sports_data_api/badges/gpa.svg)](https://codeclimate.com/github/RLovelett/sports_data_api)
2
2
 
3
3
  SportsDataApi is an attempt to make a Ruby interface to the
4
4
  [SportsData](http://www.sportsdatallc.com/) API. The goal is to
@@ -22,11 +22,11 @@ log](https://github.com/rlovelett/sports_data_api/issues).
22
22
 
23
23
  * [NFL](http://developer.sportsdatallc.com/docs/NFL_API)
24
24
  * [NBA](http://developer.sportsdatallc.com/docs/NBA_API)
25
+ * [MLB](http://developer.sportsdatallc.com/docs/MLB_API)
26
+ * [NHL](http://developer.sportsdatallc.com/docs/NHL_API)
25
27
  * TODO
26
- 1. [MLB](http://developer.sportsdatallc.com/docs/MLB_API)
27
- 2. [NHL](http://developer.sportsdatallc.com/docs/NHL_API)
28
- 3. [NCAA Basketball](http://developer.sportsdatallc.com/docs/NCAA_Mens_Basketball)
29
- 4. [NCAA Football](http://developer.sportsdatallc.com/docs/NCAA_Football_API)
28
+ 2. [NCAA Basketball](http://developer.sportsdatallc.com/docs/NCAA_Mens_Basketball)
29
+ 3. [NCAA Football](http://developer.sportsdatallc.com/docs/NCAA_Football_API)
30
30
 
31
31
  ## Installation
32
32
 
@@ -61,7 +61,7 @@ However, if you want to refresh the actual server API responses you will need to
61
61
  This can be achieved simply by performing the following two steps:
62
62
 
63
63
  1. Delete all the cassettes (`rm spec/cassettes/*.yml`)
64
- 2. Run specs passing the API key as environment variable (`SPORTS_DATA_<NBA|NFL>_API_KEY=realapikey bundle exec rake spec`)
64
+ 2. Run specs passing the API key as environment variable (`SPORTS_DATA_<NFL|NBA|MLB|NHL>_API_KEY=realapikey bundle exec rake spec`)
65
65
 
66
66
  ## Contributing
67
67
 
@@ -2,6 +2,7 @@ require "sports_data_api/version"
2
2
  require "nokogiri"
3
3
  require "rest_client"
4
4
  require "time"
5
+ require "multi_json"
5
6
 
6
7
  module SportsDataApi
7
8
  def self.key(sport)
@@ -49,5 +50,6 @@ module SportsDataApi
49
50
  autoload :Nfl, File.join(LIBRARY_PATH, 'nfl')
50
51
  autoload :Nba, File.join(LIBRARY_PATH, 'nba')
51
52
  autoload :Mlb, File.join(LIBRARY_PATH, 'mlb')
53
+ autoload :Nhl, File.join(LIBRARY_PATH, 'nhl')
52
54
  autoload :Exception, File.join(LIBRARY_PATH, 'exception')
53
55
  end
@@ -29,33 +29,33 @@ module SportsDataApi
29
29
  season = season.to_s.upcase.to_sym
30
30
  raise SportsDataApi::Nfl::Exception.new("#{season} is not a valid season") unless Season.valid?(season)
31
31
 
32
- response = self.response_xml(version, "/#{year}/#{season}/schedule.xml")
32
+ response = self.response_json(version, "/#{year}/#{season}/schedule.json")
33
33
 
34
- return Season.new(response.xpath("/season"))
34
+ return Season.new(response)
35
35
  end
36
36
 
37
37
  ##
38
38
  # Fetch NFL team roster
39
39
  def self.team_roster(team, version = DEFAULT_VERSION)
40
- response = self.response_xml(version, "/teams/#{team}/roster.xml")
40
+ response = self.response_json(version, "/teams/#{team}/roster.json")
41
41
 
42
- return TeamRoster.new(response.xpath("team"))
42
+ return TeamRoster.new(response)
43
43
  end
44
44
 
45
45
  ##
46
46
  # Fetch NFL team seaon stats for a given team, season and season type
47
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")
48
+ response = self.response_json(version, "/teams/#{team}/#{season}/#{season_type}/statistics.json")
49
49
 
50
- return TeamSeasonStats.new(response.xpath("/season").xpath("team"))
50
+ return TeamSeasonStats.new(response)
51
51
  end
52
52
 
53
53
  ##
54
54
  # Fetch NFL player seaon stats for a given team, season and season type
55
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")
56
+ response = self.response_json(version, "/teams/#{team}/#{season}/#{season_type}/statistics.json")
57
57
 
58
- return PlayerSeasonStats.new(response.xpath("/season").xpath("team").xpath("players"))
58
+ return PlayerSeasonStats.new(response)
59
59
  end
60
60
 
61
61
  ##
@@ -64,17 +64,28 @@ module SportsDataApi
64
64
  season = season.to_s.upcase.to_sym
65
65
  raise SportsDataApi::Nfl::Exception.new("#{season} is not a valid season") unless Season.valid?(season)
66
66
 
67
- response = self.response_xml(version, "/#{year}/#{season}/#{week}/#{away}/#{home}/boxscore.xml")
67
+ response = self.response_json(version, "/#{year}/#{season}/#{week}/#{away}/#{home}/boxscore.json")
68
68
 
69
- return Game.new(year, season, week, response.xpath("/game"))
69
+ return Game.new(year, season, week, response)
70
+ end
71
+
72
+ ##
73
+ # Fetches statistics for a given NFL game
74
+ def self.game_statistics(year, season, week, home, away, version = DEFAULT_VERSION)
75
+ season = season.to_s.upcase.to_sym
76
+ raise SportsDataApi::Nfl::Exception.new("#{season} is not a valid season") unless Season.valid?(season)
77
+
78
+ response = self.response_json(version, "/#{year}/#{season}/#{week}/#{away}/#{home}/statistics.json")
79
+
80
+ return Game.new(year, season, week, response)
70
81
  end
71
82
 
72
83
  ##
73
84
  # Fetches all NFL teams
74
85
  def self.teams(version = DEFAULT_VERSION)
75
- response = self.response_xml(version, "/teams/hierarchy.xml")
86
+ response = self.response_json(version, "/teams/hierarchy.json")
76
87
 
77
- return Teams.new(response.xpath('/league'))
88
+ return Teams.new(response)
78
89
  end
79
90
 
80
91
  ##
@@ -83,16 +94,17 @@ module SportsDataApi
83
94
  season = season.to_s.upcase.to_sym
84
95
  raise SportsDataApi::Nfl::Exception.new("#{season} is not a valid season") unless Season.valid?(season)
85
96
 
86
- response = self.response_xml(version, "/#{year}/#{season}/#{week}/schedule.xml")
97
+ response = self.response_json(version, "/#{year}/#{season}/#{week}/schedule.json")
87
98
 
88
- return Games.new(response.xpath('/games'))
99
+ return Games.new(year, season, week, response)
89
100
  end
90
101
 
91
102
  private
92
- def self.response_xml(version, url)
103
+
104
+ def self.response_json(version, url)
93
105
  base_url = BASE_URL % { access_level: SportsDataApi.access_level(SPORT), version: version }
94
106
  response = SportsDataApi.generic_request("#{base_url}#{url}", SPORT)
95
- Nokogiri::XML(response.to_s).remove_namespaces!
107
+ MultiJson.load(response.to_s)
96
108
  end
97
109
  end
98
110
  end
@@ -2,14 +2,13 @@ module SportsDataApi
2
2
  module Nfl
3
3
  class Broadcast
4
4
  attr_reader :network, :satellite, :internet
5
- def initialize(xml)
6
- xml = xml.first if xml.is_a? Nokogiri::XML::NodeSet
7
- if xml.is_a? Nokogiri::XML::Element
8
- @network = xml['network']
9
- @satellite = xml['satellite']
10
- @internet = xml['internet']
5
+ def initialize(broadcast_hash)
6
+ if broadcast_hash
7
+ @network = broadcast_hash['network']
8
+ @satellite = broadcast_hash['satellite'] || ''
9
+ @internet = broadcast_hash['internet']
11
10
  end
12
11
  end
13
12
  end
14
13
  end
15
- end
14
+ end
@@ -5,35 +5,30 @@ module SportsDataApi
5
5
  :away_team, :status, :quarter, :clock, :venue, :broadcast, :weather,
6
6
  :year, :season, :week
7
7
 
8
- def initialize(year, season, week, xml)
9
- @year = year.to_i
10
- @season = season.to_sym
11
- @week = week.to_i
8
+ def initialize(year, season, week, game_hash)
9
+ @year = year
10
+ @season = season
11
+ @week = week
12
12
 
13
- xml = xml.first if xml.is_a? Nokogiri::XML::NodeSet
14
- if xml.is_a? Nokogiri::XML::Element
15
- @id = xml['id']
16
- @scheduled = Time.parse xml['scheduled']
17
- @home = xml['home']
18
- @away = xml['away']
19
- @status = xml['status']
20
- @quarter = xml['quarter'].to_i
21
- @clock = xml['clock']
13
+ @id = game_hash['id']
14
+ @scheduled = Time.parse game_hash['scheduled']
15
+ @home = game_hash['home'] || game_hash['home_team']['id']
16
+ @away = game_hash['away'] || game_hash['away_team']['id']
17
+ @status = game_hash['status']
18
+ @quarter = game_hash['quarter'].to_i
19
+ @clock = game_hash['clock']
22
20
 
23
- team_xml = xml.xpath('team')
24
- @home_team = Team.new(team_xml.first)
25
- @away_team = Team.new(team_xml.last)
26
- @venue = Venue.new(xml.xpath('venue'))
27
- @broadcast = Broadcast.new(xml.xpath('broadcast'))
28
- @weather = Weather.new(xml.xpath('weather'))
29
- end
21
+ @home_team = Team.new(game_hash['home_team'])
22
+ @away_team = Team.new(game_hash['away_team'])
23
+ @venue = Venue.new(game_hash['venue'])
24
+ @broadcast = Broadcast.new(game_hash['broadcast'])
25
+ @weather = Weather.new(game_hash['weather'])
30
26
  end
31
27
 
32
28
  ##
33
29
  # Wrapper for Nfl.statistics
34
- # TODO
35
30
  def statistics
36
- raise NotImplementedError
31
+ Nfl.game_statistics(year, season, week, home, away, 1)
37
32
  end
38
33
 
39
34
  ##
@@ -4,13 +4,13 @@ module SportsDataApi
4
4
  include Enumerable
5
5
  attr_reader :games, :year, :season, :week
6
6
 
7
- def initialize(xml)
8
- @year = xml.first['season'].to_i
9
- @season = xml.first['type'].to_sym
10
- @week = xml.first['week'].to_i
7
+ def initialize(year, season, week, games_hash)
8
+ @year = year
9
+ @season = season
10
+ @week = week
11
11
 
12
- @games = xml.xpath("game").map do |game_xml|
13
- Game.new(@year, @season, @week, game_xml)
12
+ @games = games_hash['games'].map do |game_hash|
13
+ Game.new(@year, @season, @week, game_hash)
14
14
  end
15
15
  end
16
16
 
@@ -23,7 +23,6 @@ module SportsDataApi
23
23
  end
24
24
  end
25
25
  end
26
-
27
26
  end
28
27
  end
29
- end
28
+ end
@@ -1,13 +1,11 @@
1
1
  module SportsDataApi
2
2
  module Nfl
3
3
  class Player
4
- def initialize(xml)
5
- if xml.is_a? Nokogiri::XML::Element
6
- player_ivar = self.instance_variable_set("@#{xml.name}", {})
7
- self.class.class_eval { attr_reader :"#{xml.name}" }
8
- xml.attributes.each do | attr_name, attr_value|
9
- player_ivar[attr_name.to_sym] = attr_value.value
10
- end
4
+ def initialize(json)
5
+ player_ivar = self.instance_variable_set("@player", {})
6
+ self.class.class_eval { attr_reader :"player" }
7
+ json.each_pair do | attr_name, attr_value|
8
+ player_ivar[attr_name.to_sym] = attr_value
11
9
  end
12
10
  end
13
11
  end
@@ -2,22 +2,12 @@ module SportsDataApi
2
2
  module Nfl
3
3
  class PlayerSeasonStats
4
4
  attr_reader :stats, :id, :players
5
- def initialize(xml)
6
- xml = xml.first if xml.is_a? Nokogiri::XML::NodeSet
5
+ def initialize(json)
7
6
  @players = []
8
- xml.xpath("player").each do | p |
7
+ json['players'].each do | p |
9
8
  player = {}
10
- stats = []
11
-
12
- p.children.each do | stat |
13
- if stat.name == "text"
14
- next
15
- end
16
- stats << SportsDataApi::Stats.new(stat)
17
- end
18
-
19
9
  player[:id] = p['id']
20
- player[:stats] = stats
10
+ player[:stats] = p['statistics']
21
11
  @players << player
22
12
  end
23
13
  end
@@ -3,14 +3,12 @@ module SportsDataApi
3
3
  class Season
4
4
  attr_reader :year, :type, :weeks
5
5
 
6
- def initialize(xml)
6
+ def initialize(season_hash)
7
7
  @weeks = []
8
- if xml.is_a? Nokogiri::XML::NodeSet
9
- @year = xml.first["season"].to_i
10
- @type = xml.first["type"].to_sym
11
- @weeks = xml.first.xpath("week").map do |week_xml|
12
- Week.new(@year, @type, week_xml)
13
- end
8
+ @year = season_hash['season']
9
+ @type = season_hash['type'].to_sym
10
+ @weeks = season_hash['weeks'].map do |week_hash|
11
+ Week.new(@year, @type, week_hash)
14
12
  end
15
13
  end
16
14
 
@@ -1,22 +1,36 @@
1
1
  module SportsDataApi
2
2
  module Nfl
3
3
  class Team
4
- attr_reader :id, :name, :conference, :division, :market, :remaining_challenges, :remaining_timeouts, :score, :quarters
4
+ attr_reader :id, :name, :conference, :division, :market, :remaining_challenges,
5
+ :remaining_timeouts, :score, :quarters, :venue, :points, :statistics, :players
5
6
 
6
- def initialize(xml, conference = nil, division = nil)
7
- xml = xml.first if xml.is_a? Nokogiri::XML::NodeSet
8
- if xml.is_a? Nokogiri::XML::Element
9
- @id = xml['id']
10
- @name = xml['name']
7
+ def initialize(team_hash, conference = nil, division = nil)
8
+ if team_hash
9
+ @id = team_hash['id']
10
+ @name = team_hash['name']
11
11
  @conference = conference
12
12
  @division = division
13
- @market = xml['market']
14
- @remaining_challenges = xml['remaining_challenges'].to_i
15
- @remaining_timeouts = xml['remaining_timeouts'].to_i
16
- @quarters = xml.xpath('scoring/quarter').map do |quarter|
17
- quarter['points'].to_i
13
+ @market = team_hash['market']
14
+ @remaining_challenges = team_hash['remaining_challenges']
15
+ @remaining_timeouts = team_hash['remaining_timeouts']
16
+ @quarters = []
17
+ if team_hash['scoring']
18
+ team_hash['scoring'].each do |scoring_hash|
19
+ @quarters[scoring_hash['quarter']-1] = scoring_hash['points']
20
+ end
18
21
  end
19
22
  @quarters = @quarters.fill(0, @quarters.size, 4 - @quarters.size)
23
+
24
+ # Parse the Venue data if it exists
25
+ if team_hash.key?('venue')
26
+ @venue = Venue.new(team_hash['venue'])
27
+ end
28
+
29
+ if team_hash['statistics']
30
+ @statistics = parse_team_statistics(team_hash['statistics'])
31
+ @players = parse_player_statistics(team_hash['statistics'])
32
+ end
33
+ @points = team_hash['points'] || score
20
34
  end
21
35
  end
22
36
 
@@ -41,6 +55,31 @@ module SportsDataApi
41
55
  end
42
56
  end
43
57
 
58
+ private
59
+
60
+ def parse_team_statistics(stats_hash)
61
+ stats = {}
62
+ stats_hash.keys.each do |key|
63
+ stats[key] = stats_hash[key]['team']
64
+ end
65
+ stats
66
+ end
67
+
68
+ def parse_player_statistics(stats_hash)
69
+ players = []
70
+ stats_hash.keys.each do |key|
71
+ next if !stats_hash[key]['players']
72
+ stats_hash[key]['players'].each do |p|
73
+ player = players.select{|a| a['id'] == p['id']}.first || {}
74
+ players << player if !players.select{|a| a['id'] == p['id']}.first
75
+ ['id', 'name', 'jersey', 'position'].each do |k|
76
+ player[k] = p.delete(k)
77
+ end
78
+ player[key] = p
79
+ end
80
+ end
81
+ players
82
+ end
44
83
  end
45
84
  end
46
85
  end
@@ -3,12 +3,9 @@ module SportsDataApi
3
3
  class TeamRoster
4
4
  attr_reader :players
5
5
 
6
- def initialize(xml)
6
+ def initialize(json)
7
7
  @players = []
8
- xml.children.each do | player |
9
- if player.name == "text"
10
- next
11
- end
8
+ json['players'].each do | player |
12
9
  @players << Player.new(player)
13
10
  end
14
11
  end
@@ -2,16 +2,11 @@ module SportsDataApi
2
2
  module Nfl
3
3
  class TeamSeasonStats
4
4
  attr_reader :id, :stats
5
- def initialize(xml)
6
- xml = xml.first if xml.is_a? Nokogiri::XML::NodeSet
7
- @id = xml['id']
5
+ def initialize(json)
6
+ @id = json['id']
8
7
  @stats = []
9
- xml.xpath("players").remove
10
- xml.children.each do | stat |
11
- if stat.name == "text"
12
- next
13
- end
14
- @stats << SportsDataApi::Stats.new(stat)
8
+ json['statistics'].each_pair do | key, val |
9
+ @stats << { key: val }
15
10
  end
16
11
  end
17
12
  end