mlb_terminal 0.0.4 → 0.0.5

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.
@@ -1,8 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mlb_terminal (0.0.4)
4
+ mlb_terminal (0.0.5)
5
5
  activesupport (~> 3.2.8)
6
+ chronic (~> 0.8.0)
6
7
  commander (~> 4.1.2)
7
8
  nokogiri (~> 1.5.5)
8
9
 
@@ -12,6 +13,7 @@ GEM
12
13
  activesupport (3.2.8)
13
14
  i18n (~> 0.6)
14
15
  multi_json (~> 1.0)
16
+ chronic (0.8.0)
15
17
  commander (4.1.2)
16
18
  highline (~> 1.6.11)
17
19
  highline (1.6.15)
data/README.md CHANGED
@@ -1,14 +1,76 @@
1
- nal
1
+ # MLB Terminal
2
2
 
3
- Access to MLB baseball scores in the terminal.
3
+ Access to historical and real-time MLB baseball scores and stats in the terminal.
4
4
 
5
5
  ## Overview
6
6
 
7
7
  Don't you just wish you could have a little terminal app to stream out real-time stats for a MLB baseball game? Look no further! _Please note, the use of this data is subjected to the terms put forth by the MLB. More information can be found here: [http://gdx.mlb.com/components/copyright.txt](http://gdx.mlb.com/components/copyright.txt). You're okay if you're using this data for individual use!_
8
8
 
9
- ### Syntax
9
+ Although there are several other gems out there that provide access to MLB Gamday data, `mlb_terminal` provides a one-stop shop for streaming data and piping it to other processes. For the true sports hacker in us all!
10
10
 
11
- #### Commands
11
+ ## Installation
12
+
13
+ To install MLB Terminal, please [install Ruby 1.9.3 and RubyGems](http://docs.cloudfoundry.com/frameworks/ruby/installing-ruby.html). Then install MLB Terminal via:
14
+
15
+ gem install mlb_terminal
16
+
17
+ For more information regarding this gem, please visit the RubyGems page for [mlb_terminal](https://rubygems.org/gems/mlb_terminal).
18
+
19
+ ## Syntax
20
+
21
+ Typical usage starts off by scanning the games for a specific date:
22
+
23
+ > mlb games --date yesterday
24
+
25
+ 0 Athletics (0-2) @ Tigers (2-0) 12:00 ET (Final) 4-5
26
+ 1 Nationals (1-0) @ Cardinals (0-1) 3:00 ET (Final) 3-2
27
+ 2 Yankees (1-0) @ Orioles (0-1) 6:00 ET (Final) 7-2
28
+ 3 Reds (2-0) @ Giants (0-2) 9:30 ET (Final) 9-0
29
+
30
+ If the `--date` flag isn't used, all commands will assume today.
31
+
32
+ Then you can use the index in the first column to pull out additional data, such as game events, pitches and hits.
33
+
34
+ > mlb game --date yesterday --pitches 1 | head | cut -f 1,4-6
35
+
36
+ 2012-10-07 15:08:11 -0400 Adam Wainwright Jayson Werth B
37
+ 2012-10-07 15:08:29 -0400 Adam Wainwright Jayson Werth S
38
+ 2012-10-07 15:08:53 -0400 Adam Wainwright Jayson Werth B
39
+ 2012-10-07 15:09:08 -0400 Adam Wainwright Jayson Werth S
40
+ 2012-10-07 15:09:53 -0400 Adam Wainwright Jayson Werth S
41
+ 2012-10-07 15:10:40 -0400 Adam Wainwright Bryce Harper X
42
+ 2012-10-07 15:10:55 -0400 Adam Wainwright Ryan Zimmerman S
43
+ 2012-10-07 15:11:13 -0400 Adam Wainwright Ryan Zimmerman B
44
+ 2012-10-07 15:11:33 -0400 Adam Wainwright Ryan Zimmerman S
45
+ 2012-10-07 15:12:16 -0400 Adam Wainwright Ryan Zimmerman S
46
+
47
+ > mlb game --date yesterday --hits 1 | head
48
+
49
+ 1 Top Adam Wainwright Bryce Harper O Groundout 140.56 163.65
50
+ 1 Bottom Gio Gonzalez Carlos Beltran O Groundout 140.56 162.65
51
+ 1 Bottom Gio Gonzalez Allen Craig O Flyout 128.51 82.33
52
+ 2 Top Adam Wainwright Ian Desmond H Single 134.54 87.35
53
+ 2 Top Adam Wainwright Kurt Suzuki H Single 87.35 132.53
54
+ 2 Top Adam Wainwright Jayson Werth O Groundout 111.45 164.66
55
+ 2 Bottom Gio Gonzalez David Freese O Flyout 125.5 47.19
56
+ 2 Bottom Gio Gonzalez Jon Jay O Flyout 73.29 108.43
57
+ 2 Bottom Gio Gonzalez Carlos Beltran O Flyout 145.58 71.29
58
+ 3 Top Adam Wainwright Ryan Zimmerman H Single 113.45 98.39
59
+
60
+ > mlb game --date yesterday --pitches 1 | head
61
+
62
+ 2012-10-07 1 Top 1 2/3/1 Jayson Werth strikes out swinging.
63
+ 2012-10-07 1 Top 2 0/0/2 Bryce Harper grounds out, second baseman Daniel Descalso to first baseman Allen Craig.
64
+ 2012-10-07 1 Top 3 1/3/3 Ryan Zimmerman strikes out swinging.
65
+ 2012-10-07 1 Bottom 4 1/3/1 Jon Jay called out on strikes.
66
+ 2012-10-07 1 Bottom 5 2/1/2 Carlos Beltran grounds out, second baseman Danny Espinosa to first baseman Adam LaRoche.
67
+ 2012-10-07 1 Bottom 6 4/1/2 Matt Holliday walks.
68
+ 2012-10-07 1 Bottom 7 2/2/3 Allen Craig flies out to center fielder Bryce Harper.
69
+ 2012-10-07 2 Top 8 4/1/0 Adam LaRoche walks.
70
+ 2012-10-07 2 Top 9 0/3/1 Michael Morse strikes out swinging.
71
+ 2012-10-07 2 Top 10 0/1/1 Ian Desmond singles on a line drive to center fielder Jon Jay. Adam LaRoche to 3rd.
72
+
73
+ ### Commands
12
74
 
13
75
  To find out more about a specific command, use `mlb [command] --help` to view the appropriate documentation.
14
76
 
@@ -16,7 +78,7 @@ To find out more about a specific command, use `mlb [command] --help` to view th
16
78
  * `games [options]`: Print out a list of scheduled games for the specified date
17
79
  * `game [options] [game_number]`: Print out play-by-play events for a specific game. Use `--pitches` to output realtime pitch trajectory data.
18
80
 
19
- #### Global options
81
+ ### Global options
20
82
 
21
83
  * -h, --help: Display help documentation
22
84
 
@@ -24,29 +86,30 @@ To find out more about a specific command, use `mlb [command] --help` to view th
24
86
 
25
87
  * -t, --trace: Display backtrace when an error occurs
26
88
 
27
- ### Data Output Format
89
+ ## Data Output Format
28
90
 
29
91
  Each command outputs data in tab-separated format. When outputting data for a game in progress, the application will continue to pipe in data as it is made available.
30
92
 
31
- #### `games` (Game listings)
93
+ ### `games` (Game listings)
32
94
 
33
95
  1. Game index. A numbered value unique to the specified date that is referenced in the `game` command.
34
96
  2. Opposing teams. A string containing: `<Away Team> (Wins - Losses) @ <Home Team> (Wins - Losses).
35
97
  3. Starting time and status.
36
98
  4. Current score.
37
99
 
38
- #### `game` (Game events)
100
+ ### `game` (Game events)
39
101
 
40
102
  1. Event time.
41
103
  2. Inning.
42
- 3. Event number.
43
- 4. Event description.
104
+ 3. Top or bottom of inning.
105
+ 4. Event number.
106
+ 5. Event description.
44
107
 
45
- #### `game --pitches` (Pitch events)
108
+ ### `game --pitches` (Pitch events)
46
109
 
47
110
  1. Pitch time.
48
111
  2. Inning.
49
- 3. Top/Bottom of inning.
112
+ 3. Top or bottom of inning.
50
113
  4. Pitcher name.
51
114
  5. Batter name.
52
115
  6. Pitch type. (S-Strike, B-Ball, X-hit)
@@ -93,10 +156,25 @@ Each command outputs data in tab-separated format. When outputting data for a ga
93
156
 
94
157
  For more information regarding PITCHf/x tracjectory data, please visit [http://fastballs.wordpress.com/category/pitchfx-glossary/](http://fastballs.wordpress.com/category/pitchfx-glossary/).
95
158
 
96
- ### Examples
159
+ ### `game --hits` (Hit events)
160
+
161
+ You also have access to hit locations for each batter. However, the coordinate system that is used relies on a 250-by-250 pixel image where the corresponding scale depends on which stadium the hit was made at. See the examples of how hits can be plotted on a generic baseball field.
162
+
163
+ 1. Inning.
164
+ 2. Top or bottom of inning.
165
+ 3. Pitcher.
166
+ 4. Batter.
167
+ 5. Hit / Out / Error.
168
+ 6. Description of hit.
169
+ 7. X-coordinate.
170
+ 8. Y-coordinate.
171
+
172
+ ## Examples
173
+
174
+ List todays games:
97
175
 
98
- > # List todays games
99
176
  > mlb games
177
+
100
178
  0 Red Sox (69-88) @ Orioles (90-67) 7:05 ET (F) 1-9
101
179
  1 Reds (95-62) @ Pirates (76-81) 7:05 ET (F) 1-0
102
180
  2 Royals (70-87) @ Indians (66-91) 7:05 ET (F) 5-8
@@ -113,12 +191,16 @@ For more information regarding PITCHf/x tracjectory data, please visit [http://f
113
191
  13 Giants (92-65) @ Padres (74-83) 10:05 ET (F) 3-1
114
192
  14 Rockies (62-95) @ Dodgers (82-75) 10:10 ET (F) 0-8
115
193
 
116
- # How did the Nationals do on 5/30/2012?
194
+ How did the Nationals do on 5/30/2012?
195
+
117
196
  > mlb games --date 2012-05-30 | grep -i nationals | cut -f 2,4
197
+
118
198
  Nationals (29-21) @ Marlins (29-22) 3-5
119
199
 
120
- > # How did Bryce Harper do tonight?
200
+ How did Bryce Harper do tonight?
201
+
121
202
  > mlb games | grep Nationals | cut -f 1 | xargs mlb game | grep Harper
203
+
122
204
  2012-09-29 19:18:00 1 2 1/2/1 Bryce Harper singles on a soft line drive to center fielder Jon Jay.
123
205
  2012-09-29 19:20:11 1 3 1/2/1 Ryan Zimmerman doubles (36) on a fly ball to left fielder Matt Holliday. Bryce Harper to 3rd.
124
206
  2012-09-29 19:26:56 1 5 0/0/1 Play reviewed and overturned: Michael Morse hits a grand slam (17) to right field. Bryce Harper scores. Ryan Zimmerman scores. Adam LaRoche scores.
@@ -133,13 +215,78 @@ For more information regarding PITCHf/x tracjectory data, please visit [http://f
133
215
  2012-09-29 22:10:49 9 71 1/0/2 Bryce Harper doubles (25) on a line drive to left fielder Matt Holliday.
134
216
  2012-09-29 22:21:20 9 76 0/0/2 Jon Jay out on a sacrifice fly to center fielder Bryce Harper. Pete Kozma scores.
135
217
 
136
- > # Visualize pitch speed for Gio Gonzalez on his full game on August 8, 2012.
218
+ Visualize pitch speed for Gio Gonzalez on his full game on August 8, 2012.
219
+
137
220
  > mlb games --date 2012-08-08 \
138
221
  | grep Nationals \
139
222
  | cut -f 1 \
140
223
  | xargs mlb game --pitches --date 2012-08-08 \
141
224
  | awk 'BEGIN{FS="\t"}{ if ($4=="Gio Gonzalez") print}' \
142
225
  | cut -f 1,9,6 \
143
- | Rscript -e 'library(ggplot2); library(scales); d <- read.csv("stdin", header=F, sep="\\t", col.names=c("time", "type", "pitch_speed")); png("gio-pitch-speed.png"); ggplot(d, aes(x=as.POSIXct(time), y=pitch_speed, colour=type, shape=type)) + geom_point() + opts(title="Pitch Speed Over Time for Gio Gonzalez") + scale_x_datetime(breaks=date_breaks("1 hour"), minor_breaks=date_breaks("15 min"), labels=date_format("%H:%M")) + scale_colour_discrete(name = "Pitch Type") + scale_shape_discrete(name = "Pitch Type") + xlab("Time") + ylab("Pitch Speed"); dev.off()'
144
- > open gio-pitch-speed.png
226
+ | Rscript -e "
227
+ library(ggplot2); \
228
+ library(scales); \
229
+ d <- read.csv('stdin', header=F, sep='\\\\t', col.names=c('time', 'type', 'pitch_speed')); \
230
+ png('gio-pitch-speed.png'); \
231
+ ggplot(d, aes(x=as.POSIXlt(time), y=pitch_speed, colour=type, shape=type)) \
232
+ + geom_point() \
233
+ + labs(title='Pitch Speed Over Time for Gio Gonzalez', x='Time', y='Pitch Speed') \
234
+ + scale_x_datetime(breaks=date_breaks('1 hour'), minor_breaks=date_breaks('15 min'), labels=date_format('%H:%M')) \
235
+ + scale_colour_discrete(name = 'Pitch Type') \
236
+ + scale_shape_discrete(name = 'Pitch Type'); \
237
+ dev.off()"
238
+
239
+
240
+
145
241
  ![gio-pitch-speed.png](http://i.imgur.com/WFw3J.png)
242
+
243
+ Get a breakdown of pitch types for Ross Detwiler in this season up until 9/30/2012.
244
+
245
+ > mlb pitchers --date 2012-09-30 11 \
246
+ | grep "Ross Detwiler" \
247
+ | cut -f 2 \
248
+ | xargs mlb pitcher --date 2012-09-30 11 \
249
+ | cut -f 8,9 \
250
+ | awk 'BEGIN{FS="\t"}{arr[$1]+=$2} END {for (i in arr) {print i,arr[i]}}' \
251
+ | sort
252
+ Changeup 172
253
+ Four-seam Fastball 1136
254
+ Sinker 838
255
+ Slider 314
256
+
257
+ What is Adam LaRoche's last 30-day spray pattern compared to that of 60-90 days ago?
258
+
259
+ > for DAY in `seq 1 30; seq 60 90`
260
+ do
261
+ mlb games --date "$DAY days ago" \
262
+ | grep Nationals \
263
+ | cut -f 1 \
264
+ | xargs mlb game --date "$DAY days ago" --hits \
265
+ | grep "Adam LaRoche" \
266
+ | cut -f 5-8 \
267
+ | sed -e "s/^/Day #DAY /"
268
+ done \
269
+ | Rscript -e " \
270
+ library(ggplot2); \
271
+ library(png); \
272
+ library(gridExtra); \
273
+ field_url <- 'http://i.imgur.com/0phAi.png'; \
274
+ download.file(field_url, '/tmp/baseball-field.png', mode = 'wb'); \
275
+ m <- readPNG('/tmp/baseball-field.png', FALSE); \
276
+ w <- matrix(rgb(m[,,1],m[,,2],m[,,3], m[,,4] * 0.2), nrow=dim(m)[1]); \
277
+ d <- read.csv('stdin', header=F, sep='\\\\t', col.names=c('time', 'type', 'desc', 'x', 'y')); \
278
+ png('laroche-spray-chart.png', width=600, height=1200); \
279
+ ggplot(d, aes(x,y, shape=type, colour=type)) \
280
+ + geom_point() \
281
+ + annotation_custom(xmin=-Inf, ymin=-Inf, xmax=Inf, ymax=Inf, rasterGrob(w)) \
282
+ + labs(title='Hit Locations For Adam LaRoche', x='', y='') \
283
+ + scale_x_continuous(breaks=c(), limits = c(0,250)) \
284
+ + scale_y_continuous(breaks=c(), limits = c(0,250)) \
285
+ + theme(panel.grid.minor = element_blank(), \
286
+ panel.grid.minor = element_blank(), \
287
+ panel.background = element_blank(), \
288
+ axis.ticks = element_blank()) \
289
+ + facet_grid(time ~ .); \
290
+ dev.off();"
291
+
292
+ ![laroach-spray-chart.png](http://i.imgur.com/Jj3L9.png)
data/bin/mlb CHANGED
@@ -4,6 +4,7 @@ require 'rubygems'
4
4
  require 'commander/import'
5
5
  require 'mlb_terminal'
6
6
  require 'date'
7
+ require 'chronic'
7
8
 
8
9
  program :version, MLBTerminal::VERSION
9
10
  program :description, 'Stream MLB games into the terminal'
@@ -13,11 +14,11 @@ command :games do |c|
13
14
  c.summary = 'Print out a list of scheduled games for the specified date.'
14
15
  c.description = 'Print out a tab-seperated value list to STDOUT wih columns ' \
15
16
  'for index, team names, game status, and current score.'
16
- c.example 'description', 'mlb --date "2012-09-28" | grep Nationals'
17
+ c.example 'description', 'mlb --date "3 days ago" | grep Nationals'
17
18
  c.option '--date STRING', String, 'List games for specified dates (Default: today)'
18
19
  c.action do |args, options|
19
20
  options.default :date => Time.now.to_date.to_s
20
- MLBTerminal::Game.list(Date.parse options.date).each_with_index do |game, index|
21
+ MLBTerminal::Game.list(Chronic.parse(options.date)).each_with_index do |game, index|
21
22
  puts [
22
23
  index,
23
24
  "#{game[:away_team][:name]} " \
@@ -52,7 +53,7 @@ command :pitchers do |c|
52
53
 
53
54
  game_number = args.first.to_i
54
55
 
55
- gameday_id = MLBTerminal::Game.list(Date.parse options.date)[game_number][:game_id]
56
+ gameday_id = MLBTerminal::Game.list(Chronic.parse(options.date))[game_number][:game_id]
56
57
 
57
58
  MLBTerminal::Pitcher.list(gameday_id).each_pair do |pitcher_id, pitcher_info|
58
59
  puts [
@@ -96,7 +97,7 @@ command :pitcher do |c|
96
97
  end
97
98
 
98
99
  game_number = game_number.to_i
99
- games = MLBTerminal::Game.list(Date.parse options.date)
100
+ games = MLBTerminal::Game.list(Chronic.parse(options.date))
100
101
  gameday_id = games[game_number][:game_id]
101
102
  pitcher = MLBTerminal::Pitcher.new(gameday_id, pitcher_id)
102
103
 
@@ -124,15 +125,15 @@ end
124
125
  command :game do |c|
125
126
  c.syntax = 'mlb game [options] [game-number]'
126
127
  c.summary = 'Print game events'
127
- c.description = 'Print play-by-play action for the corresponding game. Columns: time, inning, balls/strikes/outs/description.'
128
- c.example 'description', 'command example'
128
+ c.description = 'Print play-by-play action for the corresponding game. Columns: time, inning, balls/strikes/outs/description. When the --pitches flag is used, columns include: time, inning, inning location, pitcher, batter, pitch type, x (old), y (old), start speed, end speed, top of strike zone, bottom of strike zone, horizontal movement, vertical movement, x-location at plate, y-location at plate, initial horizontal location, initial distance from home plate, initial height position, initial x-velocity, initial y-velocity, initial z-velocity, breaking point, breaking angle, breaking length, pitch type, pitch type confidence, pitch zone, nasty factor, spin direction, spin rate, comments and an unknown field. When --hits is specified, fields include: inning, inning location, pitcher, batter, Hit/Out/Error designation, description of hit, x-location (in pixels based on 250x250 image), y-location (in pixels based on 250x250 image).'
129
129
  c.option '--date STRING', String, 'Specify the date for the corresponding game number.'
130
130
  c.option '--pitches', 'Print pitch-by-pitch action'
131
+ c.option '--hits', 'Print hit locations'
131
132
  c.action do |args, options|
132
133
  options.default :date => Time.now.to_date.to_s
133
134
 
134
135
  # Input validation.
135
- date = (Date.parse(options.date) rescue Time.now.to_date)
136
+ date = (Chronic.parse(options.date) rescue Time.now)
136
137
  if (Float(args.first) rescue nil).nil?
137
138
  puts "Error: Game number must be a valid integer"
138
139
  break
@@ -152,7 +153,7 @@ command :game do |c|
152
153
  if options.pitches
153
154
  game.pitches.each do |pitch|
154
155
  puts [
155
- pitch[:time].getlocal.strftime("%Y-%m-%d %H:%M:%S"),
156
+ pitch[:time].getlocal,
156
157
  pitch[:inning],
157
158
  pitch[:inning_loc],
158
159
  pitch[:pitcher],
@@ -189,17 +190,30 @@ command :game do |c|
189
190
  pitch[:cc],
190
191
  pitch[:mt]].join("\t")
191
192
  end
193
+ elsif options.hits
194
+ game.hits.each do |hit|
195
+ puts [
196
+ hit[:inning],
197
+ hit[:inning_loc],
198
+ hit[:pitcher],
199
+ hit[:batter],
200
+ hit[:type],
201
+ hit[:desc],
202
+ hit[:x],
203
+ hit[:y]].join("\t")
204
+ end
192
205
  else
193
206
  game.events.each do |event|
194
207
  puts [
195
- event[:time].getlocal.strftime("%Y-%m-%d %H:%M:%S"),
208
+ event[:time].getlocal.to_date.to_s,
196
209
  event[:inning],
210
+ event[:inning_loc],
197
211
  event[:num],
198
212
  "#{event[:balls]}/#{event[:strikes]}/#{event[:outs]}",
199
213
  event[:desc]].join("\t")
200
214
  end
201
215
  end
202
- rescue SystemExit, Interrupt
216
+ rescue SystemExit, Interrupt, Errno::EPIPE
203
217
  # Do nothing if a user issues ctrl-c.
204
218
  end
205
219
  end
@@ -33,15 +33,19 @@ module MLBTerminal
33
33
  @base_url = Game.parse_gameday_id_to_url gameday
34
34
  end
35
35
 
36
- def events(delay = 5, &block)
36
+ def events(delay = 2, &block)
37
37
  last_atbat = 0
38
38
 
39
39
  Enumerator.new do |y|
40
40
  begin
41
41
  doc = Nokogiri::HTML(open "#{@base_url}/game_events.xml")
42
+
43
+ if doc.xpath("//game/inning/*/atbat").count == 0
44
+ break
45
+ end
42
46
 
43
47
  doc.xpath("//game/inning[*/atbat/@num > #{last_atbat}]").each do |inning|
44
- inning.xpath("*/atbat").each do |at_bat|
48
+ inning.xpath("*/atbat[@num > #{last_atbat}]").each do |at_bat|
45
49
  y.yield({
46
50
  :inning => inning["num"],
47
51
  :inning_loc => at_bat.xpath("..").first.name.camelcase,
@@ -56,21 +60,45 @@ module MLBTerminal
56
60
 
57
61
  last_atbat = doc.xpath("//game/inning/*/atbat/@num").map(&:value).map(&:to_i).max
58
62
 
59
- if doc.xpath("//game").first["ind"] != "F"
63
+ if game_status != "F"
64
+ sleep delay
65
+ end
66
+ end while game_status != "F"
67
+ end.each(&block)
68
+ end
69
+
70
+ def hits(delay = 2, &block)
71
+ players = player_lookup
72
+ next_hit = 0
73
+ Enumerator.new do |y|
74
+ begin
75
+ doc = Nokogiri::HTML(open "#{@base_url}/inning/inning_hit.xml")
76
+ doc.xpath("//hitchart/hip").slice(next_hit..-1).each do |hit|
77
+ y.yield({
78
+ :inning => hit["inning"],
79
+ :inning_loc => (hit["team"]=="A" ? "Top" : "Bottom"),
80
+ :batter => players[hit["batter"]],
81
+ :pitcher => players[hit["pitcher"]],
82
+ :type => hit["type"],
83
+ :desc => hit["des"],
84
+ :x => hit["x"].to_f,
85
+ :y => hit["y"].to_f})
86
+ end
87
+ if game_status != "F"
60
88
  sleep delay
61
- doc = Nokogiri::HTML(open "#{@base_url}/inning/inning_all.xml")
62
89
  end
90
+ next_hit = doc.xpath("//hitchart/hip").count
63
91
  end while game_status != "F"
64
92
  end.each(&block)
65
93
  end
66
94
 
67
- def pitches(delay = 5, &block)
95
+ def pitches(delay = 2, &block)
68
96
  last_pitch = 0
69
97
  players = player_lookup
70
- doc = Nokogiri::HTML(open "#{@base_url}/inning/inning_all.xml")
71
98
 
72
99
  Enumerator.new do |y|
73
100
  begin
101
+ doc = Nokogiri::HTML(open "#{@base_url}/inning/inning_all.xml")
74
102
  doc.xpath("//game/inning[*/*/pitch/@id > #{last_pitch}]").each do |inning|
75
103
 
76
104
  inning.xpath("*/atbat").each do |at_bat|
@@ -123,7 +151,6 @@ module MLBTerminal
123
151
 
124
152
  if doc.xpath("//game").first["ind"] != "F"
125
153
  sleep delay
126
- doc = Nokogiri::HTML(open "#{@base_url}/inning/inning_all.xml")
127
154
  end
128
155
  end while game_status != "F"
129
156
  end.each(&block)
@@ -1,3 +1,3 @@
1
1
  module MLBTerminal
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -20,4 +20,7 @@ Gem::Specification.new do |s|
20
20
  s.add_dependency "commander", "~> 4.1.2"
21
21
  s.add_dependency "nokogiri", "~> 1.5.5"
22
22
  s.add_dependency "activesupport", "~> 3.2.8"
23
+ s.add_dependency "chronic", "~> 0.8.0"
24
+
25
+ s.required_ruby_version = '>= 1.9'
23
26
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mlb_terminal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-01 00:00:00.000000000 Z
12
+ date: 2012-10-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: commander
@@ -59,6 +59,22 @@ dependencies:
59
59
  - - ~>
60
60
  - !ruby/object:Gem::Version
61
61
  version: 3.2.8
62
+ - !ruby/object:Gem::Dependency
63
+ name: chronic
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 0.8.0
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 0.8.0
62
78
  description: A small terminal app to pipe formatted MLB baseball feeds into the terminal
63
79
  for easy manipulation. Includes access to both historic and real-time baseball feeds
64
80
  including play-by-play and pitch-by-pitch data. Visit the homepage for examples!
@@ -92,7 +108,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
92
108
  requirements:
93
109
  - - ! '>='
94
110
  - !ruby/object:Gem::Version
95
- version: '0'
111
+ version: '1.9'
96
112
  required_rubygems_version: !ruby/object:Gem::Requirement
97
113
  none: false
98
114
  requirements: