cocaine 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +25 -1
- data/lib/cocaine.rb +1 -0
- data/lib/cocaine/command_line.rb +5 -3
- data/lib/cocaine/version.rb +1 -1
- data/spec/cocaine/command_line_spec.rb +78 -51
- data/spec/spec_helper.rb +2 -0
- data/spec/support/stub_os.rb +14 -0
- data/spec/support/with_exitstatus.rb +2 -2
- metadata +8 -7
data/README.md
CHANGED
@@ -75,7 +75,17 @@ But don't fear, you can specify where to look for the command.
|
|
75
75
|
```ruby
|
76
76
|
Cocaine::CommandLine.path = "/opt/bin"
|
77
77
|
line = Cocaine::CommandLine.new("lolwut")
|
78
|
-
line.command # => "/opt/bin
|
78
|
+
line.command # => "lolwut", but it looks in /opt/bin for it.
|
79
|
+
```
|
80
|
+
|
81
|
+
You can even give it a bunch of places to look.
|
82
|
+
|
83
|
+
```ruby
|
84
|
+
FileUtils.rm("/opt/bin/lolwut")
|
85
|
+
`echo 'echo Hello' > /usr/local/bin/lolwut`
|
86
|
+
Cocaine::CommandLine.path = ["/opt/bin", "/usr/local/bin"]
|
87
|
+
line = Cocaine::CommandLine.new("lolwut")
|
88
|
+
line.run # => prints 'Hello', because it searches the path
|
79
89
|
```
|
80
90
|
|
81
91
|
Or, just, you know, put it in the command.
|
@@ -96,6 +106,20 @@ rescue Cocaine::ExitStatusError => e
|
|
96
106
|
end
|
97
107
|
```
|
98
108
|
|
109
|
+
You can see what's getting run. The 'Command' part it logs is in green for visibility!
|
110
|
+
|
111
|
+
```ruby
|
112
|
+
line = Cocaine::CommandLine.new("echo", ":var", :var => "LOL!", :logger => Logger.new(STDOUT))
|
113
|
+
line.run # => Logs this with #info -> Command :: echo 'LOL!'
|
114
|
+
```
|
115
|
+
|
116
|
+
But you don't have to, as you saw above where it doesn't use this. But you CAN log every command!
|
117
|
+
|
118
|
+
```ruby
|
119
|
+
Cocaine::CommandLine.logger = Logger.new(STDOUT)
|
120
|
+
Cocaine::CommandLine.new("date").run # => Logs this -> Command :: date
|
121
|
+
```
|
122
|
+
|
99
123
|
## License
|
100
124
|
|
101
125
|
Copyright 2011 Jon Yurek and thoughtbot, inc. This is free software, and may be redistributed under the terms specified in the LICENSE file.
|
data/lib/cocaine.rb
CHANGED
data/lib/cocaine/command_line.rb
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
module Cocaine
|
2
2
|
class CommandLine
|
3
3
|
class << self
|
4
|
-
attr_accessor :path
|
4
|
+
attr_accessor :path, :logger
|
5
5
|
end
|
6
6
|
|
7
7
|
def initialize(binary, params = "", options = {})
|
8
8
|
@binary = binary.dup
|
9
9
|
@params = params.dup
|
10
10
|
@options = options.dup
|
11
|
+
@logger = @options.delete(:logger) || self.class.logger
|
11
12
|
@swallow_stderr = @options.delete(:swallow_stderr)
|
12
13
|
@expected_outcodes = @options.delete(:expected_outcodes)
|
13
14
|
@expected_outcodes ||= [0]
|
@@ -25,6 +26,7 @@ module Cocaine
|
|
25
26
|
output = ''
|
26
27
|
begin
|
27
28
|
with_modified_path do
|
29
|
+
@logger.info("\e[32mCommand\e[0m :: #{command}") if @logger
|
28
30
|
output = self.class.send(:'`', command)
|
29
31
|
end
|
30
32
|
rescue Errno::ENOENT
|
@@ -66,7 +68,7 @@ module Cocaine
|
|
66
68
|
end
|
67
69
|
|
68
70
|
def invalid_variables
|
69
|
-
%w(expected_outcodes swallow_stderr)
|
71
|
+
%w(expected_outcodes swallow_stderr logger)
|
70
72
|
end
|
71
73
|
|
72
74
|
def interpolation(vars, key)
|
@@ -89,7 +91,7 @@ module Cocaine
|
|
89
91
|
end
|
90
92
|
|
91
93
|
def self.unix?
|
92
|
-
|
94
|
+
(Config::CONFIG['host_os'] =~ /mswin|mingw/).nil?
|
93
95
|
end
|
94
96
|
end
|
95
97
|
end
|
data/lib/cocaine/version.rb
CHANGED
@@ -3,15 +3,15 @@ require 'spec_helper'
|
|
3
3
|
describe Cocaine::CommandLine do
|
4
4
|
before do
|
5
5
|
Cocaine::CommandLine.path = nil
|
6
|
-
|
6
|
+
on_unix! # Assume we're on unix unless otherwise specified.
|
7
7
|
end
|
8
8
|
|
9
|
-
it "takes a command and parameters and
|
9
|
+
it "takes a command and parameters and produces a Bash command line" do
|
10
10
|
cmd = Cocaine::CommandLine.new("convert", "a.jpg b.png", :swallow_stderr => false)
|
11
11
|
cmd.command.should == "convert a.jpg b.png"
|
12
12
|
end
|
13
13
|
|
14
|
-
it "specifies the
|
14
|
+
it "specifies the $PATH where the command can be found" do
|
15
15
|
Cocaine::CommandLine.path = "/path/to/command/dir"
|
16
16
|
cmd = Cocaine::CommandLine.new("ruby", "-e 'puts ENV[%{PATH}]'")
|
17
17
|
cmd.command.should == "ruby -e 'puts ENV[%{PATH}]'"
|
@@ -19,7 +19,7 @@ describe Cocaine::CommandLine do
|
|
19
19
|
output.should match(%r{/path/to/command/dir})
|
20
20
|
end
|
21
21
|
|
22
|
-
it "specifies more than one path where the command
|
22
|
+
it "specifies more than one path where the command can be found" do
|
23
23
|
Cocaine::CommandLine.path = ["/path/to/command/dir", "/some/other/path"]
|
24
24
|
cmd = Cocaine::CommandLine.new("ruby", "-e 'puts ENV[%{PATH}]'")
|
25
25
|
output = cmd.run
|
@@ -27,41 +27,41 @@ describe Cocaine::CommandLine do
|
|
27
27
|
output.should match(%r{/some/other/path})
|
28
28
|
end
|
29
29
|
|
30
|
-
it "can interpolate quoted variables into the parameters" do
|
30
|
+
it "can interpolate quoted variables into the command line's parameters" do
|
31
31
|
cmd = Cocaine::CommandLine.new("convert",
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
32
|
+
":one :{two}",
|
33
|
+
:one => "a.jpg",
|
34
|
+
:two => "b.png",
|
35
|
+
:swallow_stderr => false)
|
36
36
|
cmd.command.should == "convert 'a.jpg' 'b.png'"
|
37
37
|
end
|
38
38
|
|
39
39
|
it "quotes command line options differently if we're on windows" do
|
40
|
-
|
40
|
+
on_windows!
|
41
41
|
cmd = Cocaine::CommandLine.new("convert",
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
42
|
+
":one :{two}",
|
43
|
+
:one => "a.jpg",
|
44
|
+
:two => "b.png",
|
45
|
+
:swallow_stderr => false)
|
46
46
|
cmd.command.should == 'convert "a.jpg" "b.png"'
|
47
47
|
end
|
48
48
|
|
49
49
|
it "can quote and interpolate dangerous variables" do
|
50
50
|
cmd = Cocaine::CommandLine.new("convert",
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
51
|
+
":one :two",
|
52
|
+
:one => "`rm -rf`.jpg",
|
53
|
+
:two => "ha'ha.png",
|
54
|
+
:swallow_stderr => false)
|
55
55
|
cmd.command.should == "convert '`rm -rf`.jpg' 'ha'\\''ha.png'"
|
56
56
|
end
|
57
57
|
|
58
58
|
it "can quote and interpolate dangerous variables even on windows" do
|
59
|
-
|
59
|
+
on_windows!
|
60
60
|
cmd = Cocaine::CommandLine.new("convert",
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
61
|
+
":one :two",
|
62
|
+
:one => "`rm -rf`.jpg",
|
63
|
+
:two => "ha'ha.png",
|
64
|
+
:swallow_stderr => false)
|
65
65
|
cmd.command.should == %{convert "`rm -rf`.jpg" "ha'ha.png"}
|
66
66
|
end
|
67
67
|
|
@@ -70,36 +70,39 @@ describe Cocaine::CommandLine do
|
|
70
70
|
cmd.command.should == "convert 'a.jpg' xc:black 'b.jpg'"
|
71
71
|
end
|
72
72
|
|
73
|
-
it "
|
74
|
-
File.stubs(:exist?).with("/dev/null").returns(true)
|
73
|
+
it "can redirect stderr to the bit bucket if requested" do
|
75
74
|
cmd = Cocaine::CommandLine.new("convert",
|
76
|
-
|
77
|
-
|
75
|
+
"a.jpg b.png",
|
76
|
+
:swallow_stderr => true)
|
78
77
|
|
79
78
|
cmd.command.should == "convert a.jpg b.png 2>/dev/null"
|
80
79
|
end
|
81
80
|
|
82
|
-
it "
|
83
|
-
|
81
|
+
it "can redirect stderr to the bit bucket on windows" do
|
82
|
+
on_windows!
|
84
83
|
cmd = Cocaine::CommandLine.new("convert",
|
85
|
-
|
86
|
-
|
84
|
+
"a.jpg b.png",
|
85
|
+
:swallow_stderr => true)
|
87
86
|
|
88
87
|
cmd.command.should == "convert a.jpg b.png 2>NUL"
|
89
88
|
end
|
90
89
|
|
91
|
-
it "raises if trying to interpolate :swallow_stderr
|
92
|
-
cmd = Cocaine::CommandLine.new("convert",
|
93
|
-
|
94
|
-
|
95
|
-
|
90
|
+
it "raises if trying to interpolate :swallow_stderr" do
|
91
|
+
cmd = Cocaine::CommandLine.new("convert", ":swallow_stderr", :swallow_stderr => false)
|
92
|
+
lambda { cmd.command }.should raise_error(Cocaine::CommandLineError)
|
93
|
+
end
|
94
|
+
|
95
|
+
it "raises if trying to interpolate :expected_outcodes" do
|
96
|
+
cmd = Cocaine::CommandLine.new("convert", ":expected_outcodes", :expected_outcodes => [0])
|
97
|
+
lambda { cmd.command }.should raise_error(Cocaine::CommandLineError)
|
98
|
+
end
|
96
99
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
+
it "raises if trying to interpolate :logger" do
|
101
|
+
cmd = Cocaine::CommandLine.new("convert", ":logger", :logger => stub)
|
102
|
+
lambda { cmd.command }.should raise_error(Cocaine::CommandLineError)
|
100
103
|
end
|
101
104
|
|
102
|
-
it "runs the
|
105
|
+
it "runs the command it's given and return the output" do
|
103
106
|
cmd = Cocaine::CommandLine.new("convert", "a.jpg b.png", :swallow_stderr => false)
|
104
107
|
cmd.class.stubs(:"`").with("convert a.jpg b.png").returns(:correct_value)
|
105
108
|
with_exitstatus_returning(0) do
|
@@ -107,7 +110,7 @@ describe Cocaine::CommandLine do
|
|
107
110
|
end
|
108
111
|
end
|
109
112
|
|
110
|
-
it "raises a CommandLineError if the result code isn't expected" do
|
113
|
+
it "raises a CommandLineError if the result code from the command isn't expected" do
|
111
114
|
cmd = Cocaine::CommandLine.new("convert", "a.jpg b.png", :swallow_stderr => false)
|
112
115
|
cmd.class.stubs(:"`").with("convert a.jpg b.png").returns(:correct_value)
|
113
116
|
with_exitstatus_returning(1) do
|
@@ -117,11 +120,11 @@ describe Cocaine::CommandLine do
|
|
117
120
|
end
|
118
121
|
end
|
119
122
|
|
120
|
-
it "does not raise
|
123
|
+
it "does not raise if the result code is expected, even if nonzero" do
|
121
124
|
cmd = Cocaine::CommandLine.new("convert",
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
+
"a.jpg b.png",
|
126
|
+
:expected_outcodes => [0, 1],
|
127
|
+
:swallow_stderr => false)
|
125
128
|
cmd.class.stubs(:"`").with("convert a.jpg b.png").returns(:correct_value)
|
126
129
|
with_exitstatus_returning(1) do
|
127
130
|
lambda do
|
@@ -130,13 +133,37 @@ describe Cocaine::CommandLine do
|
|
130
133
|
end
|
131
134
|
end
|
132
135
|
|
133
|
-
it "detects that the system is unix
|
134
|
-
|
135
|
-
|
136
|
+
it "detects that the system is unix" do
|
137
|
+
Cocaine::CommandLine.unix?.should be_true
|
138
|
+
end
|
139
|
+
|
140
|
+
it "detects that the system is windows" do
|
141
|
+
on_windows!
|
142
|
+
Cocaine::CommandLine.unix?.should be_false
|
143
|
+
end
|
144
|
+
|
145
|
+
it "detects that the system is windows (mingw)" do
|
146
|
+
on_windows!("mingw")
|
147
|
+
Cocaine::CommandLine.unix?.should be_false
|
148
|
+
end
|
149
|
+
|
150
|
+
it "logs the command to a supplied logger" do
|
151
|
+
logger = stub
|
152
|
+
logger.stubs(:info).with(anything).returns(nil)
|
153
|
+
Cocaine::CommandLine.new("echo", "'Logging!'", :logger => logger).run
|
154
|
+
logger.should have_received(:info).with("\e[32mCommand\e[0m :: echo 'Logging!'")
|
155
|
+
end
|
156
|
+
|
157
|
+
it "logs the command to a default logger" do
|
158
|
+
Cocaine::CommandLine.logger = stub
|
159
|
+
Cocaine::CommandLine.logger.stubs(:info).with(anything).returns(nil)
|
160
|
+
Cocaine::CommandLine.new("echo", "'Logging!'").run
|
161
|
+
Cocaine::CommandLine.logger.should have_received(:info).with("\e[32mCommand\e[0m :: echo 'Logging!'")
|
136
162
|
end
|
137
163
|
|
138
|
-
it "
|
139
|
-
|
140
|
-
Cocaine::CommandLine.
|
164
|
+
it "is fine if no logger is supplied" do
|
165
|
+
Cocaine::CommandLine.logger = nil
|
166
|
+
cmd = Cocaine::CommandLine.new("echo", "'Logging!'", :logger => nil)
|
167
|
+
lambda { cmd.run }.should_not raise_error
|
141
168
|
end
|
142
169
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'rspec'
|
2
2
|
require './spec/support/with_exitstatus'
|
3
|
+
require './spec/support/stub_os'
|
3
4
|
require 'mocha'
|
4
5
|
require 'bourne'
|
5
6
|
require 'cocaine'
|
@@ -7,4 +8,5 @@ require 'cocaine'
|
|
7
8
|
RSpec.configure do |config|
|
8
9
|
config.mock_with :mocha
|
9
10
|
config.include WithExitstatus
|
11
|
+
config.include StubOS
|
10
12
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module StubOS
|
2
|
+
def on_windows!(host_string = 'mswin')
|
3
|
+
stub_os(host_string)
|
4
|
+
end
|
5
|
+
|
6
|
+
def on_unix!(host_string = 'darwin11.0.0')
|
7
|
+
stub_os(host_string)
|
8
|
+
end
|
9
|
+
|
10
|
+
def stub_os(host_string)
|
11
|
+
# http://blog.emptyway.com/2009/11/03/proper-way-to-detect-windows-platform-in-ruby/
|
12
|
+
Config::CONFIG.stubs(:[]).with('host_os').returns(host_string)
|
13
|
+
end
|
14
|
+
end
|
@@ -2,10 +2,10 @@ module WithExitstatus
|
|
2
2
|
def with_exitstatus_returning(code)
|
3
3
|
saved_exitstatus = $?.nil? ? 0 : $?.exitstatus
|
4
4
|
begin
|
5
|
-
`ruby -e
|
5
|
+
`ruby -e "exit #{code.to_i}"`
|
6
6
|
yield
|
7
7
|
ensure
|
8
|
-
`ruby -e
|
8
|
+
`ruby -e "exit #{saved_exitstatus.to_i}"`
|
9
9
|
end
|
10
10
|
end
|
11
11
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cocaine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 2
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jon Yurek
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-08-17 00:00:00 -04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -72,12 +72,13 @@ files:
|
|
72
72
|
- README.md
|
73
73
|
- LICENSE
|
74
74
|
- Rakefile
|
75
|
-
- lib/cocaine.rb
|
76
75
|
- lib/cocaine/command_line.rb
|
77
76
|
- lib/cocaine/exceptions.rb
|
78
77
|
- lib/cocaine/version.rb
|
79
|
-
-
|
78
|
+
- lib/cocaine.rb
|
80
79
|
- spec/cocaine/command_line_spec.rb
|
80
|
+
- spec/spec_helper.rb
|
81
|
+
- spec/support/stub_os.rb
|
81
82
|
- spec/support/with_exitstatus.rb
|
82
83
|
has_rdoc: true
|
83
84
|
homepage: http://www.thoughtbot.com/projects/cocaine
|
@@ -109,7 +110,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
109
110
|
requirements: []
|
110
111
|
|
111
112
|
rubyforge_project:
|
112
|
-
rubygems_version: 1.
|
113
|
+
rubygems_version: 1.6.2
|
113
114
|
signing_key:
|
114
115
|
specification_version: 3
|
115
116
|
summary: A small library for doing (command) lines
|