mlb_gameday 0.0.1.alpha1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cdae658439dfe994e1f03e2e6c38169be5518fc4
4
+ data.tar.gz: ad73fcb5ec67661ebd7e60273eb0e99ebeb37c8e
5
+ SHA512:
6
+ metadata.gz: 3c3f072edb92e46635ae7c47631503a11956747db40aaea8266f45f8e8f1e3e1d257babc7aa67d44f2303e4644231896c8fee72320a89d13f22be19860835167
7
+ data.tar.gz: ca178b27d76e3d64122550e8f090a3722961bf9c995f719bc54b5745e2cfe56322cba75986350d9f62ca952348311b79602f08a17e9f66d2bc3647a5d75f82b5
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Steven Hoffman
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # MlbGameday
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'mlb_gameday'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install mlb_gameday
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,123 @@
1
+ require 'httparty'
2
+ require 'nokogiri'
3
+ require 'open-uri'
4
+ require 'yaml'
5
+
6
+ %w{version league division team game player pitcher batter}.each do |file|
7
+ require "mlb_gameday/#{file}"
8
+ end
9
+
10
+ module MLBGameday
11
+ API_URL = "http://gd2.mlb.com/components/game/mlb"
12
+
13
+ class API
14
+ def initialize
15
+ # File File File File File File File File File File File File File File File
16
+ @leagues = YAML.load File.open(File.join(File.dirname(File.expand_path(__FILE__)), '../resources/data.yml'))
17
+ end
18
+
19
+ def leagues
20
+ @leagues
21
+ end
22
+
23
+ def league(name)
24
+ return name if name.is_a? MLBGameday::League
25
+
26
+ @leagues[name]
27
+ end
28
+
29
+ def team(name)
30
+ return name if name.is_a? MLBGameday::Team
31
+
32
+ teams.each do |team|
33
+ return team if team.names.include? name.downcase
34
+ end
35
+
36
+ nil
37
+ end
38
+
39
+ def teams
40
+ @teams ||= divisions.map(&:teams).map(&:values).flatten
41
+ end
42
+
43
+ def division(league, name)
44
+ @leagues[league][name]
45
+ end
46
+
47
+ def divisions
48
+ @divisions ||= @leagues[:AL].divisions.values + @leagues[:NL].divisions.values
49
+ end
50
+
51
+ def pitcher(id)
52
+ return nil if id.empty?
53
+
54
+ MLBGameday::Pitcher.new(self, fetch_pitcher_xml(id))
55
+ end
56
+
57
+ def batter(id)
58
+ return nil if id.empty?
59
+
60
+ MLBGameday::Batter.new(self, fetch_batter_xml(id))
61
+ end
62
+
63
+ def game(gid)
64
+ date = /\A(\d+)_(\d+)_(\d+)_/.match(gid)
65
+
66
+ MLBGameday::Game.new(self, fetch_gameday_xml(DateTime.new(date[1].to_i, date[2].to_i, date[3].to_i), gid))
67
+ end
68
+
69
+ def find_games(team: nil, date: nil)
70
+ date = Date.today if date.nil?
71
+
72
+ doc = fetch_scoreboard_xml(date)
73
+
74
+ if team.nil?
75
+ doc.xpath("//games/game").map do |game|
76
+ MLBGameday::Game.new(self, fetch_gameday_xml(date, game.xpath("@gameday_link").first.value))
77
+ end
78
+ else
79
+ team = team(team)
80
+
81
+ doc.xpath("//games/game").map do |game|
82
+ if [game.xpath("@home_name_abbrev").first.value, game.xpath("@away_name_abbrev").first.value].include? team.code
83
+ MLBGameday::Game.new(self, fetch_gameday_xml(date, game.xpath("@gameday_link")))
84
+ end
85
+ end.compact!
86
+ end
87
+ end
88
+
89
+ private
90
+
91
+ def fetch_scoreboard_xml(date)
92
+ Nokogiri::XML(open(API_URL + date.strftime("/year_%Y/month_%m/day_%d/miniscoreboard.xml")))
93
+ end
94
+
95
+ def fetch_gameday_xml(date, gameday_link)
96
+ Nokogiri::XML(open(API_URL + date.strftime("/year_%Y/month_%m/day_%d/gid_#{ gameday_link }/linescore.xml")))
97
+ end
98
+
99
+ def fetch_batter_xml(id, year: nil)
100
+ year = Date.today.year if year.nil?
101
+
102
+ # We only really want one piece of data from this file...
103
+ year_data = Nokogiri::XML(open(API_URL + "/year_#{ year }/batters/#{ id }.xml"))
104
+
105
+ game = year_data.xpath("//pitching/@game_id").first.value
106
+ year, month, day, _ = game.split("/")
107
+
108
+ Nokogiri::XML(open(MLBGameday::API_URL + "/year_#{ year }/month_#{ month }/day_#{ day }/gid_#{ game.gsub(/[^a-z0-9]/, "_") }/batters/#{ id }.xml"))
109
+ end
110
+
111
+ def fetch_pitcher_xml(id, year: nil)
112
+ year = Date.today.year if year.nil?
113
+
114
+ # We only really want one piece of data from this file...
115
+ year_data = Nokogiri::XML(open(API_URL + "/year_#{ year }/pitchers/#{ id }.xml"))
116
+
117
+ game = year_data.xpath("//pitching/@game_id").first.value
118
+ year, month, day, _ = game.split("/")
119
+
120
+ Nokogiri::XML(open(MLBGameday::API_URL + "/year_#{ year }/month_#{ month }/day_#{ day }/gid_#{ game.gsub(/[^a-z0-9]/, "_") }/pitchers/#{ id }.xml"))
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,4 @@
1
+ module MLBGameday
2
+ class Batter < Player
3
+ end
4
+ end
@@ -0,0 +1,21 @@
1
+ module MLBGameday
2
+ class Division
3
+ def initialize(league, name, teams)
4
+ @league = league
5
+ @name = name
6
+ @teams = teams
7
+ end
8
+
9
+ def league
10
+ @league
11
+ end
12
+
13
+ def name
14
+ @name
15
+ end
16
+
17
+ def teams
18
+ @teams
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,164 @@
1
+ module MLBGameday
2
+ class Game
3
+ def initialize(api, data)
4
+ @api = api
5
+ @data = data
6
+
7
+ @home = @api.team(@data.xpath("//game/@home_name_abbrev").first.value)
8
+ @away = @api.team(@data.xpath("//game/@away_name_abbrev").first.value)
9
+ end
10
+
11
+ def teams
12
+ [@home, @away]
13
+ end
14
+
15
+ def home_team
16
+ @home
17
+ end
18
+
19
+ def away_team
20
+ @away
21
+ end
22
+
23
+ def venue
24
+ xpath("//game/@venue")
25
+ end
26
+
27
+ def start_time(team = nil)
28
+ return "#{ xpath("//game/@away_time") } #{ xpath("//game/@away_time_zone") }" if team == @away
29
+
30
+ "#{ xpath("//game/@home_time") } #{ xpath("//game/@home_time_zone") }"
31
+ end
32
+
33
+ # Preview, Pre-Game, In Progress, Final
34
+ def status
35
+ @status ||= @data.xpath("//game/@status").first.value
36
+ end
37
+
38
+ # [3, Top/Middle/Bottom/End]
39
+ def inning
40
+ [@data.xpath("//game/@inning"), @data.xpath("//game/@inning_state")]
41
+ end
42
+
43
+ def runners
44
+ first, second, third = [nil, nil, nil]
45
+
46
+ [first, second, third]
47
+ end
48
+
49
+ def over?
50
+ status == "Final"
51
+ end
52
+ alias_method :fat_lady_has_sung?, :over?
53
+
54
+ def in_progress?
55
+ status == "In Progress"
56
+ end
57
+
58
+ def home_record
59
+ [xpath("//game/@home_win"), xpath("//game/@home_loss")].map(&:to_i)
60
+ end
61
+
62
+ def away_record
63
+ [xpath("//game/@away_win"), xpath("//game/@away_loss")].map(&:to_i)
64
+ end
65
+
66
+ def current_pitcher
67
+ return nil if !in_progress?
68
+
69
+ @api.pitcher xpath("//game/current_pitcher/@id")
70
+ end
71
+
72
+ def opposing_pitcher
73
+ return nil if !in_progress?
74
+
75
+ @api.pitcher xpath("//game/opposing_pitcher/@id")
76
+ end
77
+
78
+ def winning_pitcher
79
+ return nil if !over?
80
+
81
+ @api.pitcher xpath("//game/winning_pitcher/@id")
82
+ end
83
+
84
+ def losing_pitcher
85
+ return nil if !over?
86
+
87
+ @api.pitcher xpath("//game/losing_pitcher/@id")
88
+ end
89
+
90
+ def save_pitcher
91
+ return nil if !over?
92
+
93
+ @api.pitcher xpath("//game/save_pitcher/@id")
94
+ end
95
+
96
+ def score
97
+ return [0, 0] if !in_progress? && !over?
98
+
99
+ [xpath("//game/@home_team_runs"), xpath("//game/@away_team_runs")].map(&:to_i)
100
+ end
101
+
102
+ def home_pitcher
103
+ case status
104
+ when "In Progress"
105
+ # The xpath changes based on which half of the inning it is
106
+ if xpath("//game/@top_inning") == "Y"
107
+ opposing_pitcher
108
+ else
109
+ current_pitcher
110
+ end
111
+ when "Preview", "Warmup", "Pre-Game"
112
+ @api.pitcher xpath("//game/home_probable_pitcher/@id")
113
+ when "Final"
114
+ home, away = score
115
+
116
+ if home > away
117
+ winning_pitcher
118
+ elsif away > home
119
+ losing_pitcher
120
+ else
121
+ # Spring training games can end in ties, in which case there's really no pitching data
122
+ # See: http://gd2.mlb.com/components/game/mlb/year_2013/month_03/day_07/gid_2013_03_07_texmlb_lanmlb_1/linescore.xml
123
+ # This should really give a null object pitcher back
124
+ nil
125
+ end
126
+ else
127
+ end
128
+ end
129
+
130
+ def away_pitcher
131
+ case status
132
+ when "In Progress"
133
+ # The xpath changes based on which half of the inning it is
134
+ if xpath("//game/@top_inning") == "Y"
135
+ current_pitcher
136
+ else
137
+ opposing_pitcher
138
+ end
139
+ when "Preview", "Warmup", "Pre-Game"
140
+ @api.pitcher xpath("//game/away_probable_pitcher/@id")
141
+ when "Final"
142
+ home, away = score
143
+
144
+ if home > away
145
+ losing_pitcher
146
+ elsif away > home
147
+ winning_pitcher
148
+ else
149
+ # Spring training games can end in ties, in which case there's really no pitching data
150
+ # See: http://gd2.mlb.com/components/game/mlb/year_2013/month_03/day_07/gid_2013_03_07_texmlb_lanmlb_1/linescore.xml
151
+ # This should really give a null object pitcher back
152
+ nil
153
+ end
154
+ else
155
+ end
156
+ end
157
+
158
+ private
159
+
160
+ def xpath(path)
161
+ @data.xpath(path).first.value
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,22 @@
1
+ module MLBGameday
2
+ class League
3
+ def initialize(name, divisions)
4
+ @name = name
5
+ @divisions = divisions
6
+ end
7
+
8
+ def name
9
+ @name
10
+ end
11
+
12
+ def divisions
13
+ @divisions
14
+ end
15
+
16
+ def division(name)
17
+ raise "Invalid division" if ![:East, :Central, :West].include?(name)
18
+
19
+ @divisions[name]
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,44 @@
1
+ module MLBGameday
2
+ class Pitcher < Player
3
+ def name
4
+ xpath("//Player//@first_name") + " " + xpath("//Player//@last_name")
5
+ end
6
+
7
+ def era
8
+ xpath("//Player/season/@era")
9
+ end
10
+
11
+ def wins
12
+ xpath("//Player/season/@w")
13
+ end
14
+
15
+ def losses
16
+ xpath("//Player/season/@l")
17
+ end
18
+
19
+ def innings
20
+ xpath("//Player/season/@ip")
21
+ end
22
+
23
+ def saves
24
+ xpath("//Player/season/@sv")
25
+ end
26
+
27
+ def whip
28
+ xpath("//Player/season/@whip")
29
+ end
30
+
31
+ def strikeouts
32
+ xpath("//Player/season/@so")
33
+ end
34
+
35
+ def walks
36
+ xpath("//Player/season/@bb")
37
+ end
38
+
39
+ # Returns a Nokogiri::XML object
40
+ def data
41
+ @data
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,14 @@
1
+ module MLBGameday
2
+ class Player
3
+ def initialize(api, data)
4
+ @api = api
5
+ @data = data
6
+ end
7
+
8
+ protected
9
+
10
+ def xpath(path)
11
+ @data.xpath(path).first.value
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,41 @@
1
+ module MLBGameday
2
+ class Team
3
+ def initialize(opts = {})
4
+ @name = opts[:name]
5
+ @city = opts[:city]
6
+ @league = opts[:league]
7
+ @division = opts[:division]
8
+ @names = opts[:names]
9
+ @code = opts[:code]
10
+ end
11
+
12
+ # So we don't get huge printouts
13
+ def inspect
14
+ %Q{#<MLBGameday::Team @name="#{@name}">}
15
+ end
16
+
17
+ def name
18
+ @name
19
+ end
20
+
21
+ def city
22
+ @city
23
+ end
24
+
25
+ def league
26
+ @league
27
+ end
28
+
29
+ def division
30
+ @division
31
+ end
32
+
33
+ def names
34
+ @names
35
+ end
36
+
37
+ def code
38
+ @code
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,3 @@
1
+ module MLBGameday
2
+ VERSION = "0.0.1.alpha1"
3
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'mlb_gameday/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "mlb_gameday"
8
+ spec.version = MLBGameday::VERSION
9
+ spec.authors = ["Steven Hoffman"]
10
+ spec.email = ["git@fustrate.com"]
11
+ spec.description = %q{Access data about games and players from the official MLB Gameday API}
12
+ spec.summary = %q{Fetches gameday data from the MLB Gameday API}
13
+ spec.homepage = "http://github.com/fustrate/mlb_gameday"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
24
+
25
+ spec.add_dependency "httparty"
26
+ spec.add_dependency "nokogiri"
27
+ end
@@ -0,0 +1,391 @@
1
+ ---
2
+ :AL: &al !ruby/object:MLBGameday::League
3
+ name: American
4
+ divisions:
5
+ :East: &aleast !ruby/object:MLBGameday::Division
6
+ name: East
7
+ teams:
8
+ :BAL: !ruby/object:MLBGameday::Team
9
+ name: Orioles
10
+ city: Baltimore
11
+ league: *al
12
+ division: *aleast
13
+ code: BAL
14
+ names:
15
+ - bal
16
+ - orioles
17
+ - oriole
18
+ - baltimore
19
+ :BOS: !ruby/object:MLBGameday::Team
20
+ name: Red Sox
21
+ city: Boston
22
+ league: *al
23
+ division: *aleast
24
+ code: BOS
25
+ names:
26
+ - bos
27
+ - red sox
28
+ - redsox
29
+ - boston
30
+ - bosox
31
+ :NYY: !ruby/object:MLBGameday::Team
32
+ name: Yankees
33
+ city: New York
34
+ league: *al
35
+ division: *aleast
36
+ code: NYY
37
+ names:
38
+ - nyy
39
+ - yankees
40
+ - yankee
41
+ - new york yankees
42
+ - new york yankee
43
+ :TB: !ruby/object:MLBGameday::Team
44
+ name: Rays
45
+ city: Tampa Bay
46
+ league: *al
47
+ division: *aleast
48
+ code: TB
49
+ names:
50
+ - tb
51
+ - rays
52
+ - ray
53
+ - devil rays
54
+ - devil ray
55
+ - tampa
56
+ - tampa bay
57
+ :TOR: !ruby/object:MLBGameday::Team
58
+ name: Blue Jays
59
+ city: Toronto
60
+ league: *al
61
+ division: *aleast
62
+ code: TOR
63
+ names:
64
+ - tor
65
+ - blue jays
66
+ - blue jay
67
+ - bluejays
68
+ - bluejay
69
+ - jays
70
+ - jay
71
+ - toronto
72
+ :Central: &alcentral !ruby/object:MLBGameday::Division
73
+ name: Central
74
+ teams:
75
+ :CLE: !ruby/object:MLBGameday::Team
76
+ name: Indians
77
+ city: Cleveland
78
+ league: *al
79
+ division: *alcentral
80
+ code: CLE
81
+ names:
82
+ - cle
83
+ - indians
84
+ - indian
85
+ - cleveland
86
+ :CWS: !ruby/object:MLBGameday::Team
87
+ name: White Sox
88
+ city: Chicago
89
+ league: *al
90
+ division: *alcentral
91
+ code: CWS
92
+ names:
93
+ - cws
94
+ - white sox
95
+ - chicago white sox
96
+ :DET: !ruby/object:MLBGameday::Team
97
+ name: Tigers
98
+ city: Detroit
99
+ league: *al
100
+ division: *alcentral
101
+ code: DET
102
+ names:
103
+ - det
104
+ - tigers
105
+ - tiger
106
+ - detroit
107
+ :KC: !ruby/object:MLBGameday::Team
108
+ name: Royals
109
+ city: Kansas City
110
+ league: *al
111
+ division: *alcentral
112
+ code: KC
113
+ names:
114
+ - kc
115
+ - royals
116
+ - royal
117
+ - kansas city
118
+ - kansas
119
+ :MIN: !ruby/object:MLBGameday::Team
120
+ name: Twins
121
+ city: Minnesota
122
+ league: *al
123
+ division: *alcentral
124
+ code: MIN
125
+ names:
126
+ - min
127
+ - twins
128
+ - twin
129
+ - minnesota
130
+ :West: &alwest !ruby/object:MLBGameday::Division
131
+ name: West
132
+ teams:
133
+ :ANA: !ruby/object:MLBGameday::Team
134
+ name: Angels
135
+ city: Anaheim
136
+ league: *al
137
+ division: *alwest
138
+ code: ANA
139
+ names:
140
+ - ana
141
+ - angels
142
+ - angel
143
+ - anaheim
144
+ - ana
145
+ - los angeles angel
146
+ - los angeles angels
147
+ - la angels
148
+ - la angel
149
+ - laa
150
+ - laaa
151
+ - los angeles angels of anaheim
152
+ :HOU: !ruby/object:MLBGameday::Team
153
+ name: Astros
154
+ city: Houston
155
+ league: *al
156
+ division: *alwest
157
+ code: HOU
158
+ names:
159
+ - hou
160
+ - astros
161
+ - astro
162
+ - houston
163
+ :OAK: !ruby/object:MLBGameday::Team
164
+ name: Athletics
165
+ city: Oakland
166
+ league: *al
167
+ division: *alwest
168
+ code: OAK
169
+ names:
170
+ - oak
171
+ - athletics
172
+ - athletic
173
+ - as
174
+ - oakland
175
+ :SEA: !ruby/object:MLBGameday::Team
176
+ name: Mariners
177
+ city: Seattle
178
+ league: *al
179
+ division: *alwest
180
+ code: SEA
181
+ names:
182
+ - sea
183
+ - mariners
184
+ - mariner
185
+ - seattle
186
+ :TEX: !ruby/object:MLBGameday::Team
187
+ name: Rangers
188
+ city: Texas
189
+ league: *al
190
+ division: *alwest
191
+ code: TEX
192
+ names:
193
+ - tex
194
+ - rangers
195
+ - ranger
196
+ - texas
197
+ :NL: &nl !ruby/object:MLBGameday::League
198
+ name: National
199
+ divisions:
200
+ :East: &nleast !ruby/object:MLBGameday::Division
201
+ name: East
202
+ teams:
203
+ :ATL: !ruby/object:MLBGameday::Team
204
+ name: Braves
205
+ city: Atlanta
206
+ league: *nl
207
+ division: *nleast
208
+ code: ATL
209
+ names:
210
+ - atl
211
+ - braves
212
+ - brave
213
+ - atlanta
214
+ :MIA: !ruby/object:MLBGameday::Team
215
+ name: Marlins
216
+ city: Miami
217
+ league: *nl
218
+ division: *nleast
219
+ code: MIA
220
+ names:
221
+ - mia
222
+ - marlins
223
+ - marlin
224
+ - miami
225
+ - florida
226
+ :NYM: !ruby/object:MLBGameday::Team
227
+ name: Mets
228
+ city: New York
229
+ league: *nl
230
+ division: *nleast
231
+ code: NYM
232
+ names:
233
+ - nym
234
+ - mets
235
+ - met
236
+ - new york mets
237
+ - new york met
238
+ :PHI: !ruby/object:MLBGameday::Team
239
+ name: Phillies
240
+ city: Philadelphia
241
+ league: *nl
242
+ division: *nleast
243
+ code: PHI
244
+ names:
245
+ - phi
246
+ - phillies
247
+ - phillie
248
+ - philly
249
+ - philadelphia
250
+ :WSH: !ruby/object:MLBGameday::Team
251
+ name: Nationals
252
+ city: Washington
253
+ league: *nl
254
+ division: *nleast
255
+ code: WSH
256
+ names:
257
+ - wsh
258
+ - nationals
259
+ - natinals
260
+ - national
261
+ - washington
262
+ :Central: &nlcentral !ruby/object:MLBGameday::Division
263
+ name: Central
264
+ teams:
265
+ :CHC: !ruby/object:MLBGameday::Team
266
+ name: Cubs
267
+ city: Chicago
268
+ league: *nl
269
+ division: *nlcentral
270
+ code: CHC
271
+ names:
272
+ - chc
273
+ - cubs
274
+ - cub
275
+ - chicago cubs
276
+ - chicago cub
277
+ :CIN: !ruby/object:MLBGameday::Team
278
+ name: Reds
279
+ city: Cincinnati
280
+ league: *nl
281
+ division: *nlcentral
282
+ code: CIN
283
+ names:
284
+ - cin
285
+ - reds
286
+ - red
287
+ - cincinnati
288
+ :MIL: !ruby/object:MLBGameday::Team
289
+ name: Brewers
290
+ city: Milwaukee
291
+ league: *nl
292
+ division: *nlcentral
293
+ code: MIL
294
+ names:
295
+ - mil
296
+ - brewers
297
+ - brewer
298
+ - milwaukee
299
+ :PIT: !ruby/object:MLBGameday::Team
300
+ name: Pirates
301
+ city: Pittsburgh
302
+ league: *nl
303
+ division: *nlcentral
304
+ code: PIT
305
+ names:
306
+ - pit
307
+ - pirates
308
+ - pirate
309
+ - buccos
310
+ - bucco
311
+ - pittsburgh
312
+ :STL: !ruby/object:MLBGameday::Team
313
+ name: Cardinals
314
+ city: St. Louis
315
+ league: *nl
316
+ division: *nlcentral
317
+ code: STL
318
+ names:
319
+ - stl
320
+ - cardinals
321
+ - cardinal
322
+ - st louis
323
+ - st. louis
324
+ :West: &nlwest !ruby/object:MLBGameday::Division
325
+ name: West
326
+ teams:
327
+ :ARI: !ruby/object:MLBGameday::Team
328
+ name: Diamondbacks
329
+ city: Arizona
330
+ league: *nl
331
+ division: *nlwest
332
+ code: ARI
333
+ names:
334
+ - ari
335
+ - diamondbacks
336
+ - diamondback
337
+ - dbacks
338
+ - dback
339
+ - arizona
340
+ - az
341
+ :COL: !ruby/object:MLBGameday::Team
342
+ name: Rockies
343
+ city: Colorado
344
+ league: *nl
345
+ division: *nlwest
346
+ code: COL
347
+ names:
348
+ - col
349
+ - rockies
350
+ - rockie
351
+ - colorado
352
+ :LAD: !ruby/object:MLBGameday::Team
353
+ name: Dodgers
354
+ city: Los Angeles
355
+ league: *nl
356
+ division: *nlwest
357
+ code: LAD
358
+ names:
359
+ - lad
360
+ - dodgers
361
+ - dodger
362
+ - los angeles
363
+ - la
364
+ - los angeles dodgers
365
+ - los angeles dodger
366
+ - la dodger
367
+ - la dodgers
368
+ :SD: !ruby/object:MLBGameday::Team
369
+ name: Padres
370
+ city: San Diego
371
+ league: *nl
372
+ division: *nlwest
373
+ code: SD
374
+ names:
375
+ - sd
376
+ - padres
377
+ - padre
378
+ - san diego
379
+ :SF: !ruby/object:MLBGameday::Team
380
+ name: Giants
381
+ city: San Francisco
382
+ league: *nl
383
+ division: *nlwest
384
+ code: SF
385
+ names:
386
+ - sf
387
+ - giants
388
+ - giant
389
+ - san fran
390
+ - san francisco
391
+ - gigantes
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe "The basic MLB Gameday API object" do
4
+ before :all do
5
+ @api = MLBGameday::API.new
6
+ end
7
+
8
+ it "should be created" do
9
+ expect(@api).to_not eq(nil)
10
+ end
11
+
12
+ it "should have 2 leagues" do
13
+ expect(@api.leagues.count).to eq(2)
14
+ end
15
+
16
+ it "should have 6 divisions" do
17
+ expect(@api.divisions.count).to eq(6)
18
+ end
19
+
20
+ it "should have 30 teams" do
21
+ expect(@api.teams.count).to eq(30)
22
+ end
23
+
24
+ it "should find the Dodgers by initials" do
25
+ expect(@api.team("LAD").city).to eq("Los Angeles")
26
+ end
27
+
28
+ it "should find the Dodgers by name" do
29
+ expect(@api.team("Dodgers").city).to eq("Los Angeles")
30
+ end
31
+
32
+ it "should have 5 teams in the Dodgers' division" do
33
+ expect(@api.team("Dodgers").division.teams.count).to eq(5)
34
+ end
35
+
36
+ it "should have the Astros in the AL... West" do
37
+ expect(@api.team("Astros").league.name).to eq("American")
38
+ expect(@api.team("Astros").division.name).to eq("West")
39
+ end
40
+
41
+ it "should find one game for the Dodgers on 2013-04-01" do
42
+ dodgers = @api.team("Dodgers")
43
+
44
+ games = @api.find_games(team: dodgers, date: Date.parse("2013-04-01"))
45
+
46
+ expect(games.count).to eq(1)
47
+ end
48
+
49
+ it "should find a game by gid" do
50
+ game = @api.game("2013_04_01_sfnmlb_lanmlb_1")
51
+
52
+ expect(game.home_team.name).to eq("Dodgers")
53
+ end
54
+ end
data/spec/game_spec.rb ADDED
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ # TODO: Mock or stub out the JSON files
4
+
5
+ describe "An MLB Gameday Game object" do
6
+ before :all do
7
+ @api = MLBGameday::API.new
8
+
9
+ @dodgers = @api.team("Dodgers")
10
+ @giants = @api.team("Giants")
11
+
12
+ @games = @api.find_games(team: @dodgers, date: Date.parse("2013-04-01"))
13
+ end
14
+
15
+ it "should have two starting pitchers" do
16
+ game = @games[0]
17
+
18
+ expect(game.teams.count).to eq(2)
19
+ end
20
+
21
+ it "should have the correct venue" do
22
+ game = @games[0]
23
+
24
+ expect(game.venue).to eq("Dodger Stadium")
25
+ end
26
+
27
+ it "should start at the correct time for the home team" do
28
+ game = @games[0]
29
+
30
+ expect(game.start_time).to eq("1:10 PT")
31
+ end
32
+
33
+ # TODO: Pick another game, LA and SF are both Pacific
34
+ it "should start at the correct time for the away team" do
35
+ game = @games[0]
36
+
37
+ expect(game.start_time(@giants)).to eq("1:10 PT")
38
+ end
39
+
40
+ it "should have Clayton Kershaw starting" do
41
+ game = @games[0]
42
+
43
+ expect(game.home_pitcher.name).to eq("Clayton Kershaw")
44
+ end
45
+ end
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ require 'mlb_gameday'
5
+
6
+ RSpec.configure do |config|
7
+ end
@@ -0,0 +1,116 @@
1
+ {
2
+ "subject": "linescore_mlb_2013_03_24_gid_2013_03_24_lanmlb_oakmlb_1",
3
+ "copyright" : "Copyright 2013 MLB Advanced Media, L.P. Use of any content on this page acknowledges agreement to the terms posted here http://gdx.mlb.com/components/copyright.txt",
4
+ "data" : {
5
+ "game":{
6
+ "game_type":"S",
7
+ "double_header_sw":"N",
8
+ "away_time":"1:05",
9
+ "away_league_id_spring":"114",
10
+ "time":"4:05",
11
+ "home_time":"1:05",
12
+ "home_team_name":"Athletics",
13
+ "ind":"S",
14
+ "original_date":"2013/03/24",
15
+ "home_team_city":"Oakland",
16
+ "venue_id":"2524",
17
+ "gameday_sw":"Y",
18
+ "away_win":"11",
19
+ "away_probable_pitcher":{
20
+ "last":"Beckett",
21
+ "name_display_roster":"Beckett",
22
+ "number":"61",
23
+ "era":"0.96",
24
+ "id":"277417",
25
+ "first_name":"Josh",
26
+ "s_losses":"0",
27
+ "s_era":"-.--",
28
+ "last_name":"Beckett",
29
+ "losses":"0",
30
+ "first":"Josh",
31
+ "s_wins":"0",
32
+ "wins":"0"
33
+ },
34
+ "home_league_id_spring":"114",
35
+ "away_team_id":"119",
36
+ "tz_hm_lg_gen":"ET",
37
+ "status":"Preview",
38
+ "home_loss":"12",
39
+ "home_code":"oak",
40
+ "away_sport_code":"mlb",
41
+ "home_win":"11",
42
+ "time_hm_lg":"4:05",
43
+ "away_name_abbrev":"LAD",
44
+ "league":"NA",
45
+ "time_zone_aw_lg":"-4",
46
+ "home_file_code":"oak",
47
+ "away_split_squad":"N",
48
+ "game_data_directory":"/gameday/components/game/mlb/gid_2013_03_24_lanmlb_oakmlb_1",
49
+ "time_zone":"ET",
50
+ "away_league_id":"104",
51
+ "home_team_id":"133",
52
+ "time_aw_lg":"4:05",
53
+ "away_team_city":"LA Dodgers",
54
+ "day":"SUN",
55
+ "tz_aw_lg_gen":"ET",
56
+ "away_code":"lan",
57
+ "game_media":{
58
+ "media":{
59
+ "free":"NO",
60
+ "title":"LAD @ OAK",
61
+ "thumbnail":"http://mediadownloads.mlb.com/mlbam/preview/lanoak_363403_th_7_preview.jpg",
62
+ "media_state":"media_off",
63
+ "start":"2013-03-24T16:05:00-0400",
64
+ "has_mlbtv":"true",
65
+ "calendar_event_id":"14-363403-2013-03-24",
66
+ "type":"game"
67
+ }
68
+ },
69
+ "time_date_aw_lg":"2013/03/24 4:05",
70
+ "scheduled_innings":"9",
71
+ "venue_w_chan_loc":"USAZ0166",
72
+ "first_pitch_et":"",
73
+ "away_team_name":"Dodgers",
74
+ "gameday_link":"2013_03_24_lanmlb_oakmlb_1",
75
+ "time_date_hm_lg":"2013/03/24 4:05",
76
+ "id":"2013/03/24/lanmlb-oakmlb-1",
77
+ "home_name_abbrev":"OAK",
78
+ "tiebreaker_sw":"N",
79
+ "ampm":"PM",
80
+ "home_division":"W",
81
+ "home_split_squad":"N",
82
+ "home_time_zone":"PT",
83
+ "tv_station":"CSNCA, MLBN (delay)",
84
+ "away_time_zone":"PT",
85
+ "hm_lg_ampm":"PM",
86
+ "home_sport_code":"mlb",
87
+ "time_date":"2013/03/24 4:05",
88
+ "inning_state":"",
89
+ "home_ampm":"PM",
90
+ "game_pk":"363403",
91
+ "venue":"Phoenix Municipal Stadium",
92
+ "home_probable_pitcher":{
93
+ "last":"Griffin",
94
+ "name_display_roster":"Griffin",
95
+ "number":"64",
96
+ "era":"5.23",
97
+ "id":"456167",
98
+ "first_name":"A.J.",
99
+ "s_losses":"0",
100
+ "s_era":"-.--",
101
+ "last_name":"Griffin",
102
+ "losses":"1",
103
+ "first":"A.J.",
104
+ "s_wins":"0",
105
+ "wins":"1"
106
+ },
107
+ "home_league_id":"103",
108
+ "away_loss":"15",
109
+ "away_file_code":"la",
110
+ "aw_lg_ampm":"PM",
111
+ "time_zone_hm_lg":"-4",
112
+ "away_ampm":"PM",
113
+ "away_division":"W"
114
+ }
115
+ }
116
+ }
metadata ADDED
@@ -0,0 +1,138 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mlb_gameday
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1.alpha1
5
+ platform: ruby
6
+ authors:
7
+ - Steven Hoffman
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-03-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: httparty
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: nokogiri
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Access data about games and players from the official MLB Gameday API
84
+ email:
85
+ - git@fustrate.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - .gitignore
91
+ - Gemfile
92
+ - LICENSE.txt
93
+ - README.md
94
+ - Rakefile
95
+ - lib/mlb_gameday.rb
96
+ - lib/mlb_gameday/batter.rb
97
+ - lib/mlb_gameday/division.rb
98
+ - lib/mlb_gameday/game.rb
99
+ - lib/mlb_gameday/league.rb
100
+ - lib/mlb_gameday/pitcher.rb
101
+ - lib/mlb_gameday/player.rb
102
+ - lib/mlb_gameday/team.rb
103
+ - lib/mlb_gameday/version.rb
104
+ - mlb_gameday.gemspec
105
+ - resources/data.yml
106
+ - spec/basic_spec.rb
107
+ - spec/game_spec.rb
108
+ - spec/spec_helper.rb
109
+ - spec/stubs/linescore.json
110
+ homepage: http://github.com/fustrate/mlb_gameday
111
+ licenses:
112
+ - MIT
113
+ metadata: {}
114
+ post_install_message:
115
+ rdoc_options: []
116
+ require_paths:
117
+ - lib
118
+ required_ruby_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - '>='
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ required_rubygems_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - '>'
126
+ - !ruby/object:Gem::Version
127
+ version: 1.3.1
128
+ requirements: []
129
+ rubyforge_project:
130
+ rubygems_version: 2.0.3
131
+ signing_key:
132
+ specification_version: 4
133
+ summary: Fetches gameday data from the MLB Gameday API
134
+ test_files:
135
+ - spec/basic_spec.rb
136
+ - spec/game_spec.rb
137
+ - spec/spec_helper.rb
138
+ - spec/stubs/linescore.json