dotanuki 0.0.4 → 0.1.0
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/dotanuki.gemspec +1 -1
- data/lib/dotanuki.rb +20 -26
- data/lib/dotanuki/version.rb +1 -1
- data/spec/dotanuki_spec.rb +0 -4
- metadata +9 -9
data/dotanuki.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
20
|
s.require_paths = ["lib"]
|
21
21
|
|
22
|
-
s.add_dependency "
|
22
|
+
s.add_dependency "posix-spawn"
|
23
23
|
|
24
24
|
s.add_development_dependency "rspec"
|
25
25
|
s.add_development_dependency "metric_fu"
|
data/lib/dotanuki.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'posix/spawn'
|
2
2
|
|
3
3
|
# Module intented to be included into classes which execute system commands
|
4
4
|
# @author Martin Englund
|
@@ -90,6 +90,7 @@ module Dotanuki
|
|
90
90
|
# execute "ls /does/not/exist"
|
91
91
|
# end
|
92
92
|
# @note this method isn't thread safe
|
93
|
+
# @todo pass an environment too
|
93
94
|
def guard(options={}, &block)
|
94
95
|
opts = @defaults.merge(options)
|
95
96
|
validate_options(opts)
|
@@ -108,48 +109,41 @@ module Dotanuki
|
|
108
109
|
# @param [String, Array] commands string or array containing the command to be executed
|
109
110
|
# @param [Hash] options (see #guard)
|
110
111
|
# @return [ExecResult]
|
112
|
+
# @todo pass an environment too
|
111
113
|
def execute(commands, options={})
|
112
114
|
validate_options(options)
|
113
115
|
|
114
116
|
result = ExecResult.new
|
115
117
|
|
116
118
|
[commands].flatten.each do |command|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
119
|
+
begin
|
120
|
+
child = POSIX::Spawn::Child.new(command)
|
121
|
+
stdout = child.out.strip
|
122
|
+
stderr = child.err.strip
|
123
|
+
result.add(stdout, stderr, child.status.exitstatus)
|
124
|
+
|
125
|
+
if child.status.exitstatus != 0
|
126
|
+
if options[:on_error] == :exception || @guard
|
127
|
+
@guard << result if @guard
|
128
|
+
raise ExecError, stderr
|
129
|
+
end
|
130
|
+
break
|
131
|
+
end
|
132
|
+
rescue Errno::ENOENT
|
133
|
+
result.add(nil, nil, nil)
|
134
|
+
if options[:on_error] == :exception
|
121
135
|
@guard << result if @guard
|
122
136
|
raise ExecError, "#{command}: command not found"
|
123
|
-
elsif exit_status != 0
|
124
|
-
@guard << result if @guard
|
125
|
-
raise ExecError, stderr
|
126
137
|
end
|
127
|
-
elsif exit_status.nil? || exit_status != 0
|
128
138
|
break
|
129
139
|
end
|
130
140
|
end
|
141
|
+
|
131
142
|
@guard << result if @guard
|
132
143
|
|
133
144
|
return result
|
134
145
|
end
|
135
146
|
|
136
|
-
# Execute a single command
|
137
|
-
#
|
138
|
-
# @param [String] command string containing the command to be executed
|
139
|
-
# @return [String, String, Fixnum] standard out, standard error and exit
|
140
|
-
# status of the command
|
141
|
-
def _execute(command)
|
142
|
-
stdout = stderr = ""
|
143
|
-
|
144
|
-
status =
|
145
|
-
POpen4::popen4(command) do |out, err, stdin, pid|
|
146
|
-
stdout = out.read.chomp
|
147
|
-
stderr = err.read.chomp
|
148
|
-
end
|
149
|
-
|
150
|
-
return stdout, stderr, status ? status.exitstatus : status
|
151
|
-
end
|
152
|
-
|
153
147
|
# Validates options for Dotanuki#execute or Dotanuki#guard
|
154
148
|
#
|
155
149
|
# @raise [ArgumentError] if an unknown option is given
|
data/lib/dotanuki/version.rb
CHANGED
data/spec/dotanuki_spec.rb
CHANGED
@@ -110,10 +110,6 @@ describe Dotanuki do
|
|
110
110
|
r.stderr.should == [""]
|
111
111
|
end
|
112
112
|
|
113
|
-
it "should execute a single command" do
|
114
|
-
_execute("echo 'foo'").should == ["foo", "", 0]
|
115
|
-
end
|
116
|
-
|
117
113
|
describe "with exception option should throw an exception" do
|
118
114
|
it "on missing command" do
|
119
115
|
lambda { execute(COMMAND_NOT_FOUND, {:on_error => :exception}) }.should raise_error Dotanuki::ExecError, "#{NON_EXISTING_PATH}: command not found"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dotanuki
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,12 +9,12 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-06-
|
12
|
+
date: 2011-06-06 00:00:00.000000000 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
17
|
-
requirement: &
|
16
|
+
name: posix-spawn
|
17
|
+
requirement: &2152082320 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '0'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *2152082320
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: rspec
|
28
|
-
requirement: &
|
28
|
+
requirement: &2151846680 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *2151846680
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: metric_fu
|
39
|
-
requirement: &
|
39
|
+
requirement: &2151810360 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ! '>='
|
@@ -44,7 +44,7 @@ dependencies:
|
|
44
44
|
version: '0'
|
45
45
|
type: :development
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *2151810360
|
48
48
|
description: A command executioner which doesn't blindly stumble on when a command
|
49
49
|
fails'
|
50
50
|
email:
|