cocaine 0.5.4 → 0.5.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -4
- data/NEWS.md +8 -0
- data/README.md +9 -15
- data/lib/cocaine.rb +1 -0
- data/lib/cocaine/command_line.rb +29 -15
- data/lib/cocaine/command_line/runners/popen_runner.rb +21 -1
- data/lib/cocaine/command_line/runners/posix_runner.rb +9 -15
- data/lib/cocaine/command_line/runners/process_runner.rb +7 -13
- data/lib/cocaine/os_detector.rb +27 -0
- data/lib/cocaine/version.rb +1 -1
- data/spec/cocaine/command_line/runners/fake_runner_spec.rb +3 -3
- data/spec/cocaine/command_line_spec.rb +11 -26
- data/spec/cocaine/errors_spec.rb +1 -1
- data/spec/cocaine/os_detector_spec.rb +23 -0
- data/spec/cocaine/runners_spec.rb +9 -7
- data/spec/spec_helper.rb +3 -1
- data/spec/support/stub_os.rb +7 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 750b34929d7740b3106549975bb0700c807130f1
|
4
|
+
data.tar.gz: a063b0294e34258351f5b1bfe792cec481004e5e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c83f8e5119643be599f791f60051a208cd07549a63088f3b6700949b834a79d8cc82285281f4a94aa71a232fd642f22c4a328b19cc7ac7444558247f54091fce
|
7
|
+
data.tar.gz: 1912dd9fe81df0f2ceb52378b0f95df326747ba1f6f831af9ae5a7c4f74aa83237e5ceddf40885b23de3eb9c2d61dc831cc8289cf2b8af0d562060502aef9dc3
|
data/.travis.yml
CHANGED
data/NEWS.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
New for 0.5.5:
|
2
|
+
|
3
|
+
* Bug Fix: Posix- and ProcessRunner respect paths *and* are thread safe!
|
4
|
+
* Bug Fix: `exitstatus` should always be set, even if command doesn't run.
|
5
|
+
* Test Fix: Do not try to test Runners if they don't run on this system.
|
6
|
+
* Improvement: Pass the Errno::ENOENT message through to the exception.
|
7
|
+
* Improvement: Improve documentation
|
8
|
+
|
1
9
|
New for 0.5.4:
|
2
10
|
|
3
11
|
* Bug Fix: PosixRunner and ProcessRunner respect supplemental paths now.
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Cocaine [![Build Status](https://secure.travis-ci.org/thoughtbot/cocaine.png)](http://travis-ci.org/thoughtbot/cocaine)
|
1
|
+
# Cocaine [![Build Status](https://secure.travis-ci.org/thoughtbot/cocaine.png?branch=master)](http://travis-ci.org/thoughtbot/cocaine)
|
2
2
|
|
3
3
|
A small library for doing (command) lines.
|
4
4
|
|
@@ -10,8 +10,8 @@ The basic, normal stuff:
|
|
10
10
|
|
11
11
|
```ruby
|
12
12
|
line = Cocaine::CommandLine.new("echo", "hello 'world'")
|
13
|
-
line.command # => "echo hello 'world'"
|
14
|
-
line.run # => "hello world\n"
|
13
|
+
line.command # => "echo hello 'world'"
|
14
|
+
line.run # => "hello world\n"
|
15
15
|
```
|
16
16
|
|
17
17
|
Interpolated arguments:
|
@@ -180,19 +180,13 @@ try to use `PopenRunner`:
|
|
180
180
|
Cocaine::CommandLine.runner = Cocaine::CommandLine::PopenRunner.new
|
181
181
|
```
|
182
182
|
|
183
|
+
## Thread Safety
|
183
184
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
debugger: the process that REE kicks off in the tests reads and writes
|
190
|
-
surprisingly slowly. For this reason, we cannot recommend using Cocaine with
|
191
|
-
REE anymore.
|
192
|
-
|
193
|
-
It's not something we like, so if anyone has any insight into this problem,
|
194
|
-
we'd love to hear about it. But, for the time being, we'll consider it more
|
195
|
-
appropriate to just not use it anymore. Upgrade to 1.9.3, people.
|
185
|
+
Cocaine should be thread safe. As discussed [here, in this climate_control
|
186
|
+
thread](https://github.com/thoughtbot/climate_control/pull/11), climate_control,
|
187
|
+
which modifies the environment under which commands are run for the
|
188
|
+
BackticksRunner and PopenRunner, is thread-safe but not reentrant. Please let us
|
189
|
+
know if you find this is ever not the case.
|
196
190
|
|
197
191
|
## Feedback
|
198
192
|
|
data/lib/cocaine.rb
CHANGED
data/lib/cocaine/command_line.rb
CHANGED
@@ -10,9 +10,9 @@ module Cocaine
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def path=(supplemental_path)
|
13
|
-
@supplemental_path = supplemental_path
|
14
|
-
|
15
|
-
|
13
|
+
@supplemental_path = Array(supplemental_path).
|
14
|
+
flatten.
|
15
|
+
join(OS.path_separator)
|
16
16
|
end
|
17
17
|
|
18
18
|
def environment
|
@@ -35,10 +35,6 @@ module Cocaine
|
|
35
35
|
@runner = nil
|
36
36
|
end
|
37
37
|
|
38
|
-
def java?
|
39
|
-
RUBY_PLATFORM =~ /java/
|
40
|
-
end
|
41
|
-
|
42
38
|
private
|
43
39
|
|
44
40
|
def best_runner
|
@@ -65,7 +61,7 @@ module Cocaine
|
|
65
61
|
end
|
66
62
|
|
67
63
|
def command(interpolations = {})
|
68
|
-
cmd = [@binary, interpolate(@params, interpolations)]
|
64
|
+
cmd = [path_prefix, @binary, interpolate(@params, interpolations)]
|
69
65
|
cmd << bit_bucket if @swallow_stderr
|
70
66
|
cmd.join(" ").strip
|
71
67
|
end
|
@@ -80,7 +76,7 @@ module Cocaine
|
|
80
76
|
rescue Errno::ENOENT => e
|
81
77
|
raise Cocaine::CommandNotFoundError, e.message
|
82
78
|
ensure
|
83
|
-
@exit_status = $?.
|
79
|
+
@exit_status = $?.respond_to?(:exitstatus) ? $?.exitstatus : 0
|
84
80
|
end
|
85
81
|
|
86
82
|
if @exit_status == 127
|
@@ -98,10 +94,6 @@ module Cocaine
|
|
98
94
|
output
|
99
95
|
end
|
100
96
|
|
101
|
-
def unix?
|
102
|
-
RbConfig::CONFIG['host_os'] !~ /mswin|mingw/
|
103
|
-
end
|
104
|
-
|
105
97
|
private
|
106
98
|
|
107
99
|
def colored(text, ansi_color = "\e[32m")
|
@@ -118,6 +110,28 @@ module Cocaine
|
|
118
110
|
end
|
119
111
|
end
|
120
112
|
|
113
|
+
def path_prefix
|
114
|
+
if !self.class.path.nil? && !self.class.path.empty?
|
115
|
+
os_path_prefix
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def os_path_prefix
|
120
|
+
if OS.unix?
|
121
|
+
unix_path_prefix
|
122
|
+
else
|
123
|
+
windows_path_prefix
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def unix_path_prefix
|
128
|
+
"PATH=#{self.class.path}#{OS.path_separator}$PATH"
|
129
|
+
end
|
130
|
+
|
131
|
+
def windows_path_prefix
|
132
|
+
"SET PATH=#{self.class.path}#{OS.path_separator}%PATH% &"
|
133
|
+
end
|
134
|
+
|
121
135
|
def execute(command)
|
122
136
|
runner.call(command, environment, runner_options)
|
123
137
|
end
|
@@ -152,7 +166,7 @@ module Cocaine
|
|
152
166
|
|
153
167
|
def shell_quote(string)
|
154
168
|
return "" if string.nil?
|
155
|
-
if unix?
|
169
|
+
if OS.unix?
|
156
170
|
if string.empty?
|
157
171
|
"''"
|
158
172
|
else
|
@@ -164,7 +178,7 @@ module Cocaine
|
|
164
178
|
end
|
165
179
|
|
166
180
|
def bit_bucket
|
167
|
-
unix? ? "2>/dev/null" : "2>NUL"
|
181
|
+
OS.unix? ? "2>/dev/null" : "2>NUL"
|
168
182
|
end
|
169
183
|
end
|
170
184
|
end
|
@@ -13,7 +13,7 @@ module Cocaine
|
|
13
13
|
|
14
14
|
def call(command, env = {}, options = {})
|
15
15
|
with_modified_environment(env) do
|
16
|
-
IO.popen(command, "r", options) do |pipe|
|
16
|
+
IO.popen(env_command(command), "r", options) do |pipe|
|
17
17
|
pipe.read
|
18
18
|
end
|
19
19
|
end
|
@@ -21,6 +21,26 @@ module Cocaine
|
|
21
21
|
|
22
22
|
private
|
23
23
|
|
24
|
+
def env_command(command)
|
25
|
+
windows_command(command) || java_command(command) || default_command(command)
|
26
|
+
end
|
27
|
+
|
28
|
+
def windows_command(command)
|
29
|
+
if OS.windows?
|
30
|
+
command
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def java_command(command)
|
35
|
+
if OS.java?
|
36
|
+
"env #{command}"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def default_command(command)
|
41
|
+
command
|
42
|
+
end
|
43
|
+
|
24
44
|
def with_modified_environment(env, &block)
|
25
45
|
ClimateControl.modify(env, &block)
|
26
46
|
end
|
@@ -11,7 +11,7 @@ module Cocaine
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def self.supported?
|
14
|
-
available? && !
|
14
|
+
available? && !OS.java?
|
15
15
|
end
|
16
16
|
|
17
17
|
def supported?
|
@@ -21,17 +21,15 @@ module Cocaine
|
|
21
21
|
def call(command, env = {}, options = {})
|
22
22
|
input, output = IO.pipe
|
23
23
|
options[:out] = output
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
result << partial_result
|
30
|
-
end
|
31
|
-
waitpid(pid)
|
32
|
-
input.close
|
33
|
-
result
|
24
|
+
pid = spawn(env, command, options)
|
25
|
+
output.close
|
26
|
+
result = ""
|
27
|
+
while partial_result = input.read(8192)
|
28
|
+
result << partial_result
|
34
29
|
end
|
30
|
+
waitpid(pid)
|
31
|
+
input.close
|
32
|
+
result
|
35
33
|
end
|
36
34
|
|
37
35
|
private
|
@@ -44,10 +42,6 @@ module Cocaine
|
|
44
42
|
Process.waitpid(pid)
|
45
43
|
end
|
46
44
|
|
47
|
-
def with_modified_environment(env, &block)
|
48
|
-
ClimateControl.modify(env, &block)
|
49
|
-
end
|
50
|
-
|
51
45
|
end
|
52
46
|
end
|
53
47
|
end
|
@@ -8,7 +8,7 @@ module Cocaine
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def self.supported?
|
11
|
-
available? && !
|
11
|
+
available? && !OS.java?
|
12
12
|
end
|
13
13
|
|
14
14
|
def supported?
|
@@ -18,14 +18,12 @@ module Cocaine
|
|
18
18
|
def call(command, env = {}, options = {})
|
19
19
|
input, output = IO.pipe
|
20
20
|
options[:out] = output
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
result
|
28
|
-
end
|
21
|
+
pid = spawn(env, command, options)
|
22
|
+
output.close
|
23
|
+
result = input.read
|
24
|
+
waitpid(pid)
|
25
|
+
input.close
|
26
|
+
result
|
29
27
|
end
|
30
28
|
|
31
29
|
private
|
@@ -40,10 +38,6 @@ module Cocaine
|
|
40
38
|
# In JRuby, waiting on a finished pid raises.
|
41
39
|
end
|
42
40
|
|
43
|
-
def with_modified_environment(env, &block)
|
44
|
-
ClimateControl.modify(env, &block)
|
45
|
-
end
|
46
|
-
|
47
41
|
end
|
48
42
|
end
|
49
43
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: UTF-8
|
2
|
+
|
3
|
+
module Cocaine
|
4
|
+
class OSDetector
|
5
|
+
def java?
|
6
|
+
arch =~ /java/
|
7
|
+
end
|
8
|
+
|
9
|
+
def unix?
|
10
|
+
RbConfig::CONFIG['host_os'] !~ /mswin|mingw/
|
11
|
+
end
|
12
|
+
|
13
|
+
def windows?
|
14
|
+
!unix?
|
15
|
+
end
|
16
|
+
|
17
|
+
def path_separator
|
18
|
+
File::PATH_SEPARATOR
|
19
|
+
end
|
20
|
+
|
21
|
+
def arch
|
22
|
+
RUBY_PLATFORM
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
OS = OSDetector.new
|
27
|
+
end
|
data/lib/cocaine/version.rb
CHANGED
@@ -10,13 +10,13 @@ describe Cocaine::CommandLine::FakeRunner do
|
|
10
10
|
it 'can tell if a command was run' do
|
11
11
|
subject.call("some command", :environment)
|
12
12
|
subject.call("other command", :other_environment)
|
13
|
-
subject.ran?("some command").should
|
14
|
-
subject.ran?("no command").should
|
13
|
+
subject.ran?("some command").should eq true
|
14
|
+
subject.ran?("no command").should eq false
|
15
15
|
end
|
16
16
|
|
17
17
|
it 'can tell if a command was run even if shell options were set' do
|
18
18
|
subject.call("something 2>/dev/null", :environment)
|
19
|
-
subject.ran?("something").should
|
19
|
+
subject.ran?("something").should eq true
|
20
20
|
end
|
21
21
|
|
22
22
|
end
|
@@ -11,18 +11,17 @@ describe Cocaine::CommandLine do
|
|
11
11
|
cmd.command.should == "convert a.jpg b.png"
|
12
12
|
end
|
13
13
|
|
14
|
-
it "specifies the $PATH where the command can be found" do
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
end
|
14
|
+
it "specifies the $PATH where the command can be found on unix" do
|
15
|
+
Cocaine::CommandLine.path = ["/path/to/command/dir", "/"]
|
16
|
+
cmd = Cocaine::CommandLine.new("ls")
|
17
|
+
cmd.command.should == "PATH=/path/to/command/dir:/:$PATH ls"
|
18
|
+
end
|
19
|
+
|
20
|
+
it "specifies the %PATH% where the command can be found on windows" do
|
21
|
+
on_windows!
|
22
|
+
Cocaine::CommandLine.path = ['C:\system32', 'D:\\']
|
23
|
+
cmd = Cocaine::CommandLine.new("dir")
|
24
|
+
cmd.command.should == 'SET PATH=C:\system32;D:\;%PATH% & dir'
|
26
25
|
end
|
27
26
|
|
28
27
|
it "specifies more than one path where the command can be found" do
|
@@ -152,20 +151,6 @@ describe Cocaine::CommandLine do
|
|
152
151
|
end
|
153
152
|
end
|
154
153
|
|
155
|
-
it "detects that the system is unix" do
|
156
|
-
Cocaine::CommandLine.new("convert").should be_unix
|
157
|
-
end
|
158
|
-
|
159
|
-
it "detects that the system is windows" do
|
160
|
-
on_windows!
|
161
|
-
Cocaine::CommandLine.new("convert").should_not be_unix
|
162
|
-
end
|
163
|
-
|
164
|
-
it "detects that the system is windows (mingw)" do
|
165
|
-
on_mingw!
|
166
|
-
Cocaine::CommandLine.new("convert").should_not be_unix
|
167
|
-
end
|
168
|
-
|
169
154
|
it "colorizes the output to a tty" do
|
170
155
|
logger = FakeLogger.new(:tty => true)
|
171
156
|
Cocaine::CommandLine.new("echo", "'Logging!' :foo", :logger => logger).run(:foo => "bar")
|
data/spec/cocaine/errors_spec.rb
CHANGED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Cocaine::OSDetector do
|
4
|
+
it "detects that the system is unix" do
|
5
|
+
on_unix!
|
6
|
+
Cocaine::OS.should be_unix
|
7
|
+
end
|
8
|
+
|
9
|
+
it "detects that the system is windows" do
|
10
|
+
on_windows!
|
11
|
+
Cocaine::OS.should be_windows
|
12
|
+
end
|
13
|
+
|
14
|
+
it "detects that the system is windows (mingw)" do
|
15
|
+
on_mingw!
|
16
|
+
Cocaine::OS.should be_windows
|
17
|
+
end
|
18
|
+
|
19
|
+
it "detects that the current Ruby is on Java" do
|
20
|
+
on_java!
|
21
|
+
Cocaine::OS.should be_java
|
22
|
+
end
|
23
|
+
end
|
@@ -72,7 +72,7 @@ describe 'When running an executable in the supplemental path' do
|
|
72
72
|
end
|
73
73
|
|
74
74
|
after do
|
75
|
-
FileUtils.rm_f(Cocaine::CommandLine.path
|
75
|
+
FileUtils.rm_f("#{Cocaine::CommandLine.path}/ls")
|
76
76
|
end
|
77
77
|
|
78
78
|
[
|
@@ -81,12 +81,14 @@ describe 'When running an executable in the supplemental path' do
|
|
81
81
|
Cocaine::CommandLine::PosixRunner,
|
82
82
|
Cocaine::CommandLine::ProcessRunner
|
83
83
|
].each do |runner_class|
|
84
|
-
|
85
|
-
describe
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
84
|
+
if runner_class.supported?
|
85
|
+
describe runner_class do
|
86
|
+
describe '#run' do
|
87
|
+
it 'finds the correct executable' do
|
88
|
+
Cocaine::CommandLine.runner = runner_class.new
|
89
|
+
result = Cocaine::CommandLine.new('ls').run
|
90
|
+
expect(result.strip).to eq('overridden-ls')
|
91
|
+
end
|
90
92
|
end
|
91
93
|
end
|
92
94
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -5,9 +5,11 @@ require 'cocaine'
|
|
5
5
|
require 'timeout'
|
6
6
|
require 'tempfile'
|
7
7
|
require 'pry'
|
8
|
-
require 'active_support/buffered_logger'
|
9
8
|
require 'thread'
|
10
9
|
|
10
|
+
begin; require 'active_support/logger'; rescue LoadError; end
|
11
|
+
begin; require 'active_support/buffered_logger'; rescue LoadError; end
|
12
|
+
|
11
13
|
Dir[File.dirname(__FILE__) + "/support/**.rb"].each{|support_file| require support_file }
|
12
14
|
|
13
15
|
RSpec.configure do |config|
|
data/spec/support/stub_os.rb
CHANGED
@@ -1,14 +1,21 @@
|
|
1
1
|
module StubOS
|
2
2
|
def on_windows!
|
3
3
|
stub_os('mswin')
|
4
|
+
Cocaine::OS.stubs(:path_separator).returns(";")
|
4
5
|
end
|
5
6
|
|
6
7
|
def on_unix!
|
7
8
|
stub_os('darwin11.0.0')
|
9
|
+
Cocaine::OS.stubs(:path_separator).returns(":")
|
8
10
|
end
|
9
11
|
|
10
12
|
def on_mingw!
|
11
13
|
stub_os('mingw')
|
14
|
+
Cocaine::OS.stubs(:path_separator).returns(";")
|
15
|
+
end
|
16
|
+
|
17
|
+
def on_java!
|
18
|
+
Cocaine::OS.stubs(:arch).returns("universal-java1.7")
|
12
19
|
end
|
13
20
|
|
14
21
|
def stub_os(host_string)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cocaine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jon Yurek
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: climate_control
|
@@ -144,6 +144,7 @@ files:
|
|
144
144
|
- lib/cocaine/command_line/runners/posix_runner.rb
|
145
145
|
- lib/cocaine/command_line/runners/process_runner.rb
|
146
146
|
- lib/cocaine/exceptions.rb
|
147
|
+
- lib/cocaine/os_detector.rb
|
147
148
|
- lib/cocaine/version.rb
|
148
149
|
- spec/cocaine/command_line/runners/backticks_runner_spec.rb
|
149
150
|
- spec/cocaine/command_line/runners/fake_runner_spec.rb
|
@@ -152,6 +153,7 @@ files:
|
|
152
153
|
- spec/cocaine/command_line/runners/process_runner_spec.rb
|
153
154
|
- spec/cocaine/command_line_spec.rb
|
154
155
|
- spec/cocaine/errors_spec.rb
|
156
|
+
- spec/cocaine/os_detector_spec.rb
|
155
157
|
- spec/cocaine/runners_spec.rb
|
156
158
|
- spec/spec_helper.rb
|
157
159
|
- spec/support/fake_logger.rb
|
@@ -191,6 +193,7 @@ test_files:
|
|
191
193
|
- spec/cocaine/command_line/runners/process_runner_spec.rb
|
192
194
|
- spec/cocaine/command_line_spec.rb
|
193
195
|
- spec/cocaine/errors_spec.rb
|
196
|
+
- spec/cocaine/os_detector_spec.rb
|
194
197
|
- spec/cocaine/runners_spec.rb
|
195
198
|
- spec/spec_helper.rb
|
196
199
|
- spec/support/fake_logger.rb
|