cocaine 0.5.4 → 0.5.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.
- 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 [](http://travis-ci.org/thoughtbot/cocaine)
|
1
|
+
# Cocaine [](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
|