mlb_terminal 0.0.1 → 0.0.2
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.
- data/Gemfile.lock +8 -2
- data/bin/mlb +34 -8
- data/lib/mlb_terminal/client.rb +59 -7
- data/lib/mlb_terminal/version.rb +1 -1
- data/mlb_terminal.gemspec +3 -2
- metadata +26 -10
data/Gemfile.lock
CHANGED
|
@@ -2,15 +2,21 @@ PATH
|
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
4
|
mlb_terminal (0.0.1)
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
activesupport (~> 3.2.8)
|
|
6
|
+
commander (~> 4.1.2)
|
|
7
|
+
nokogiri (~> 1.5.5)
|
|
7
8
|
|
|
8
9
|
GEM
|
|
9
10
|
remote: http://rubygems.org/
|
|
10
11
|
specs:
|
|
12
|
+
activesupport (3.2.8)
|
|
13
|
+
i18n (~> 0.6)
|
|
14
|
+
multi_json (~> 1.0)
|
|
11
15
|
commander (4.1.2)
|
|
12
16
|
highline (~> 1.6.11)
|
|
13
17
|
highline (1.6.15)
|
|
18
|
+
i18n (0.6.1)
|
|
19
|
+
multi_json (1.3.6)
|
|
14
20
|
nokogiri (1.5.5)
|
|
15
21
|
|
|
16
22
|
PLATFORMS
|
data/bin/mlb
CHANGED
|
@@ -8,8 +8,8 @@ require 'date'
|
|
|
8
8
|
program :version, MLBTerminal::VERSION
|
|
9
9
|
program :description, 'Stream MLB games into the terminal'
|
|
10
10
|
|
|
11
|
-
command :
|
|
12
|
-
c.syntax = 'mlb
|
|
11
|
+
command :games do |c|
|
|
12
|
+
c.syntax = 'mlb games [options] [date]'
|
|
13
13
|
c.summary = 'Print out a list of scheduled games for the specified date'
|
|
14
14
|
c.description = 'Print out a tab-seperated value list to STDOUT wih columns ' \
|
|
15
15
|
'for index, team names, game status, and current score.'
|
|
@@ -30,14 +30,40 @@ command :list do |c|
|
|
|
30
30
|
end
|
|
31
31
|
end
|
|
32
32
|
|
|
33
|
-
command :
|
|
34
|
-
c.syntax = 'mlb
|
|
35
|
-
c.summary = ''
|
|
36
|
-
c.description = ''
|
|
33
|
+
command :game do |c|
|
|
34
|
+
c.syntax = 'mlb game [options] [game-number]'
|
|
35
|
+
c.summary = 'Print game events'
|
|
36
|
+
c.description = 'Print play-by-play action for the corresponding game. Columns: time, inning, balls/strikes/outs/description.'
|
|
37
37
|
c.example 'description', 'command example'
|
|
38
|
-
c.option '--
|
|
38
|
+
c.option '--date STRING', String, 'Specify the date for the corresponding game number.'
|
|
39
39
|
c.action do |args, options|
|
|
40
|
-
|
|
40
|
+
options.default :date => Time.now.to_date.to_s
|
|
41
|
+
|
|
42
|
+
# Input validation.
|
|
43
|
+
date = (Date.parse(options.date) rescue Time.now.to_date)
|
|
44
|
+
if (Float(args.first) rescue nil).nil?
|
|
45
|
+
puts "Error: Game number must be a valid integer"
|
|
46
|
+
break
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
game_number = args.first.to_i
|
|
50
|
+
game_info = MLBTerminal::Client.list_games(date)[game_number]
|
|
51
|
+
|
|
52
|
+
if game_info.nil?
|
|
53
|
+
puts "Error: Game does not exist"
|
|
54
|
+
break
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
game = MLBTerminal::Client.new(game_info[:game_id])
|
|
58
|
+
|
|
59
|
+
game.events.each do |event|
|
|
60
|
+
puts [
|
|
61
|
+
event[:time].getlocal.strftime("%Y-%m-%d %H:%M:%S"),
|
|
62
|
+
event[:inning],
|
|
63
|
+
event[:num],
|
|
64
|
+
"#{event[:balls]}/#{event[:strikes]}/#{event[:outs]}",
|
|
65
|
+
event[:desc]].join("\t")
|
|
66
|
+
end
|
|
41
67
|
end
|
|
42
68
|
end
|
|
43
69
|
|
data/lib/mlb_terminal/client.rb
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
require 'date'
|
|
2
2
|
require 'nokogiri'
|
|
3
3
|
require 'open-uri'
|
|
4
|
+
require 'active_support/core_ext/integer/inflections'
|
|
4
5
|
|
|
5
6
|
module MLBTerminal
|
|
6
7
|
MLB_BASE_URL = 'http://gd2.mlb.com/components/game/mlb'
|
|
7
8
|
|
|
8
9
|
class Client
|
|
9
10
|
def self.list_games(date = Time.now.to_date)
|
|
10
|
-
doc = Nokogiri::HTML(open "#{base_url_for_date date}/
|
|
11
|
-
doc.xpath("//
|
|
11
|
+
doc = Nokogiri::HTML(open "#{base_url_for_date date}/epg.xml")
|
|
12
|
+
doc.xpath("//epg/game").map{|game|
|
|
12
13
|
{:home_team => {
|
|
13
14
|
:name => game["home_team_name"],
|
|
14
15
|
:wins => game["home_win"],
|
|
@@ -18,16 +19,67 @@ module MLBTerminal
|
|
|
18
19
|
:wins => game["away_win"],
|
|
19
20
|
:losses => game["away_loss"]},
|
|
20
21
|
:score => {
|
|
21
|
-
:home =>
|
|
22
|
-
:away =>
|
|
22
|
+
:home => game["home_team_runs"],
|
|
23
|
+
:away => game["away_team_runs"]},
|
|
23
24
|
:starts => "#{game["time"]} #{game["time_zone"]}",
|
|
24
|
-
:status => game
|
|
25
|
+
:status => "#{game["status"]}" \
|
|
26
|
+
"#{game["status"] == "In Progress" ?
|
|
27
|
+
", #{game["top_inning"]=="Y" ? "Top" : "Bot"} of #{game["inning"].to_i.ordinalize}" :
|
|
28
|
+
""}",
|
|
29
|
+
:game_id => game["gameday"]}}
|
|
25
30
|
end
|
|
26
31
|
|
|
27
|
-
|
|
32
|
+
def initialize(gameday)
|
|
33
|
+
@gameday = gameday
|
|
34
|
+
year, month, day, game_name = /([0-9]{4})_([0-9]{2})_([0-9]{2})_(.*)/.match(@gameday).to_a.slice(1,4)
|
|
35
|
+
@base_url = "#{Client.base_url_for_date(Date.new(year.to_i, month.to_i, day.to_i))}/gid_#{@gameday}"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def events(start_inning = 1, end_inning = 9, delay = 5, &block)
|
|
39
|
+
current_inning = start_inning
|
|
40
|
+
current_inning_loc= "top"
|
|
41
|
+
|
|
42
|
+
innings = ["top", "bottom"]
|
|
43
|
+
|
|
44
|
+
Enumerator.new do |y|
|
|
45
|
+
while current_inning <= end_inning and not current_inning_loc.nil?
|
|
46
|
+
doc = Nokogiri::HTML(open "#{@base_url}/game_events.xml")
|
|
47
|
+
|
|
48
|
+
doc.xpath("//game/inning[@num >= #{current_inning}]").each do |inning|
|
|
49
|
+
|
|
50
|
+
current_inning_loc ||= "top"
|
|
51
|
+
|
|
52
|
+
innings.slice(innings.index(current_inning_loc), 2).each do |inning_loc|
|
|
53
|
+
if inning.xpath(inning_loc).nil?
|
|
54
|
+
break
|
|
55
|
+
else
|
|
56
|
+
inning.xpath("#{inning_loc}/atbat").each do |atbat|
|
|
57
|
+
y.yield({:inning => current_inning,
|
|
58
|
+
:num => atbat["num"],
|
|
59
|
+
:balls => atbat["b"],
|
|
60
|
+
:strikes => atbat["s"],
|
|
61
|
+
:outs => atbat["o"],
|
|
62
|
+
:time => Time.parse(atbat["start_tfs_zulu"], "%Y-%m-%dT%H:%M:%SZ"),
|
|
63
|
+
:desc => atbat["des"]})
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
current_inning_loc = innings[innings.index(current_inning_loc) + 1]
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
current_inning += 1
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# If we had to break early, wait before trying again.
|
|
73
|
+
if current_inning != end_inning and not current_inning_loc.nil?
|
|
74
|
+
sleep delay
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
end
|
|
78
|
+
end.each(&block)
|
|
79
|
+
end
|
|
28
80
|
|
|
29
81
|
def self.base_url_for_date(date = Time.now.to_date)
|
|
30
|
-
"#{MLB_BASE_URL}/year_#{date.year}/month_#{"%02d" % date.month}/day_#{"%02d" % date.day}
|
|
82
|
+
"#{MLB_BASE_URL}/year_#{date.year}/month_#{"%02d" % date.month}/day_#{"%02d" % date.day}"
|
|
31
83
|
end
|
|
32
84
|
end
|
|
33
85
|
end
|
data/lib/mlb_terminal/version.rb
CHANGED
data/mlb_terminal.gemspec
CHANGED
|
@@ -17,6 +17,7 @@ Gem::Specification.new do |s|
|
|
|
17
17
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
18
18
|
s.require_paths = ["lib"]
|
|
19
19
|
|
|
20
|
-
s.add_dependency "commander"
|
|
21
|
-
s.add_dependency "nokogiri"
|
|
20
|
+
s.add_dependency "commander", "~> 4.1.2"
|
|
21
|
+
s.add_dependency "nokogiri", "~> 1.5.5"
|
|
22
|
+
s.add_dependency "activesupport", "~> 3.2.8"
|
|
22
23
|
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
|
+
version: 0.0.2
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,40 +9,56 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2012-09-
|
|
12
|
+
date: 2012-09-30 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: commander
|
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
|
17
17
|
none: false
|
|
18
18
|
requirements:
|
|
19
|
-
- -
|
|
19
|
+
- - ~>
|
|
20
20
|
- !ruby/object:Gem::Version
|
|
21
|
-
version:
|
|
21
|
+
version: 4.1.2
|
|
22
22
|
type: :runtime
|
|
23
23
|
prerelease: false
|
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
|
25
25
|
none: false
|
|
26
26
|
requirements:
|
|
27
|
-
- -
|
|
27
|
+
- - ~>
|
|
28
28
|
- !ruby/object:Gem::Version
|
|
29
|
-
version:
|
|
29
|
+
version: 4.1.2
|
|
30
30
|
- !ruby/object:Gem::Dependency
|
|
31
31
|
name: nokogiri
|
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
|
33
33
|
none: false
|
|
34
34
|
requirements:
|
|
35
|
-
- -
|
|
35
|
+
- - ~>
|
|
36
36
|
- !ruby/object:Gem::Version
|
|
37
|
-
version:
|
|
37
|
+
version: 1.5.5
|
|
38
38
|
type: :runtime
|
|
39
39
|
prerelease: false
|
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
|
41
41
|
none: false
|
|
42
42
|
requirements:
|
|
43
|
-
- -
|
|
43
|
+
- - ~>
|
|
44
44
|
- !ruby/object:Gem::Version
|
|
45
|
-
version:
|
|
45
|
+
version: 1.5.5
|
|
46
|
+
- !ruby/object:Gem::Dependency
|
|
47
|
+
name: activesupport
|
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
|
49
|
+
none: false
|
|
50
|
+
requirements:
|
|
51
|
+
- - ~>
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: 3.2.8
|
|
54
|
+
type: :runtime
|
|
55
|
+
prerelease: false
|
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
57
|
+
none: false
|
|
58
|
+
requirements:
|
|
59
|
+
- - ~>
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: 3.2.8
|
|
46
62
|
description: A small terminal app to translate MLB baseball feeds into the terminal
|
|
47
63
|
for easy manipulation.
|
|
48
64
|
email:
|