command-runner 0.3.0 → 0.4.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/README.md +12 -0
- data/lib/command/runner.rb +15 -6
- data/lib/command/runner/backends/backticks.rb +9 -2
- data/lib/command/runner/backends/fake.rb +6 -3
- data/lib/command/runner/backends/spawn.rb +15 -3
- data/lib/command/runner/message.rb +1 -1
- data/lib/command/runner/version.rb +1 -1
- data/spec/messenger_spec.rb +13 -4
- metadata +1 -1
data/README.md
CHANGED
@@ -59,6 +59,18 @@ line.pass.no_command? # => true
|
|
59
59
|
|
60
60
|
it'll tell you.
|
61
61
|
|
62
|
+
It calls the given block...
|
63
|
+
|
64
|
+
```Ruby
|
65
|
+
line = Command::Runner.new("echo", "{something}")
|
66
|
+
|
67
|
+
line.pass(something: "hello") do |message|
|
68
|
+
message.stdout
|
69
|
+
end # => "hello\n"
|
70
|
+
```
|
71
|
+
|
72
|
+
and return the value.
|
73
|
+
|
62
74
|
## Compatibility
|
63
75
|
It works on
|
64
76
|
|
data/lib/command/runner.rb
CHANGED
@@ -89,14 +89,16 @@ module Command
|
|
89
89
|
# @note This method may not raise a {NoCommandError} and instead
|
90
90
|
# return a {Message} with the error code +127+, even if the
|
91
91
|
# command doesn't exist.
|
92
|
+
# @yield [Message] when the command finishes.
|
92
93
|
# @raise [NoCommandError] on no command.
|
93
94
|
# @param interops [Hash<Symbol, Object>] the interpolations to
|
94
95
|
# make.
|
95
96
|
# @param options [Hash<Symbol, Object>] the options for the
|
96
97
|
# backend.
|
97
|
-
# @return [Message]
|
98
|
-
|
99
|
-
|
98
|
+
# @return [Message, Object] message if no block was given, the
|
99
|
+
# return value of the block otherwise.
|
100
|
+
def pass!(interops = {}, options = {}, &block)
|
101
|
+
backend.call(*[contents(interops), options.delete(:env) || {}, options].flatten, &block)
|
100
102
|
|
101
103
|
rescue Errno::ENOENT
|
102
104
|
raise NoCommandError, @command
|
@@ -106,13 +108,20 @@ module Command
|
|
106
108
|
# defaults to no interpolations. Calls {#pass!}, but does not
|
107
109
|
# raise an error.
|
108
110
|
#
|
111
|
+
# @yield (see #pass!)
|
109
112
|
# @param (see #pass!)
|
110
113
|
# @return (see #pass!)
|
111
|
-
def pass(interops = {}, options = {})
|
112
|
-
pass! interops, options
|
114
|
+
def pass(interops = {}, options = {}, &block)
|
115
|
+
pass! interops, options, &block
|
113
116
|
|
114
117
|
rescue NoCommandError
|
115
|
-
Message.error(
|
118
|
+
message = Message.error(contents(interops).join(' '))
|
119
|
+
|
120
|
+
if block_given?
|
121
|
+
block.call(message)
|
122
|
+
else
|
123
|
+
message
|
124
|
+
end
|
116
125
|
end
|
117
126
|
|
118
127
|
# The command line being run by the runner. Interpolates the
|
@@ -25,7 +25,8 @@ module Command
|
|
25
25
|
# @param env [Hash] the enviornment to run the command
|
26
26
|
# under.
|
27
27
|
# @param options [Hash] the options to run the command under.
|
28
|
-
# @return [Message]
|
28
|
+
# @return [Message, Object] message if no block is given, the
|
29
|
+
# result of the block call otherwise.
|
29
30
|
def call(command, arguments, env = {}, options = {})
|
30
31
|
super
|
31
32
|
output = ""
|
@@ -38,7 +39,7 @@ module Command
|
|
38
39
|
end_time = Time.now
|
39
40
|
end
|
40
41
|
|
41
|
-
Message.new :process_id => $?.pid,
|
42
|
+
message = Message.new :process_id => $?.pid,
|
42
43
|
:exit_code => $?.exitstatus,
|
43
44
|
:finished => true,
|
44
45
|
:time => (end_time - start_time).abs,
|
@@ -48,6 +49,12 @@ module Command
|
|
48
49
|
:line => [command, arguments].join(' '),
|
49
50
|
:executed => true,
|
50
51
|
:status => $?
|
52
|
+
|
53
|
+
if block_given?
|
54
|
+
block.call(message)
|
55
|
+
else
|
56
|
+
message
|
57
|
+
end
|
51
58
|
end
|
52
59
|
|
53
60
|
private
|
@@ -28,17 +28,20 @@ module Command
|
|
28
28
|
# @abstract
|
29
29
|
# @note Does nothing.
|
30
30
|
# @raise [Errno::ENOENT] if the command doesn't exist.
|
31
|
+
# @yield [message] when the command finishes.
|
31
32
|
# @param command [String] the command to run.
|
32
33
|
# @param arguments [String] the arguments to pass to the
|
33
34
|
# command.
|
34
35
|
# @param env [Hash] the enviornment to run the command
|
35
36
|
# under.
|
36
37
|
# @param options [Hash] the options to run the command under.
|
37
|
-
# @return [Message]
|
38
|
-
|
38
|
+
# @return [Message, Object] message if no block is given, the
|
39
|
+
# result of the block call otherwise.
|
40
|
+
def call(command, arguments, env = {}, options = {}, &block)
|
39
41
|
@ran << [command, arguments]
|
40
42
|
|
41
|
-
Message.new :env => env, :options => options
|
43
|
+
message = Message.new :env => env, :options => options, :line =>
|
44
|
+
[command, arguments].join(' ')
|
42
45
|
end
|
43
46
|
|
44
47
|
# Determines whether or not the given command and arguments were
|
@@ -6,7 +6,9 @@ module Command
|
|
6
6
|
class Spawn < Fake
|
7
7
|
|
8
8
|
# Returns whether or not this backend is available on this
|
9
|
-
# platform.
|
9
|
+
# platform. Process.spawn doesn't work the way we want it to
|
10
|
+
# on JRuby 1.9 mode, so we prevent this from being used on
|
11
|
+
# that platform.
|
10
12
|
#
|
11
13
|
# @return [Boolean]
|
12
14
|
def self.available?
|
@@ -20,10 +22,14 @@ module Command
|
|
20
22
|
|
21
23
|
# Run the given command and arguments, in the given environment.
|
22
24
|
#
|
25
|
+
# @note The block is called in another thread, so in ruby
|
26
|
+
# versions other than MRI, make sure your code is
|
27
|
+
# thread-safe.
|
23
28
|
# @raise [Errno::ENOENT] if the command doesn't exist.
|
29
|
+
# @yield (see Fake#call)
|
24
30
|
# @param (see Fake#call)
|
25
31
|
# @return (see Fake#call)
|
26
|
-
def call(command, arguments, env = {}, options = {})
|
32
|
+
def call(command, arguments, env = {}, options = {}, &block)
|
27
33
|
super
|
28
34
|
stderr_r, stderr_w = IO.pipe
|
29
35
|
stdout_r, stdout_w = IO.pipe
|
@@ -49,7 +55,7 @@ module Command
|
|
49
55
|
|
50
56
|
[stdout_w, stderr_w].each(&:close)
|
51
57
|
|
52
|
-
Message.new :process_id => process_id,
|
58
|
+
message = Message.new :process_id => process_id,
|
53
59
|
:exit_code => status.exitstatus,
|
54
60
|
:finished => true,
|
55
61
|
:time => (start_time - end_time).abs,
|
@@ -60,6 +66,12 @@ module Command
|
|
60
66
|
:line => line,
|
61
67
|
:executed => true,
|
62
68
|
:status => status
|
69
|
+
|
70
|
+
if block_given?
|
71
|
+
block.call(message)
|
72
|
+
else
|
73
|
+
message
|
74
|
+
end
|
63
75
|
end
|
64
76
|
end
|
65
77
|
|
data/spec/messenger_spec.rb
CHANGED
@@ -47,7 +47,7 @@ describe Command::Runner do
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
context "
|
50
|
+
context "selecting backends" do
|
51
51
|
it "selects the best backend" do
|
52
52
|
Command::Runner::Backends::PosixSpawn.stub(:available?).and_return(false)
|
53
53
|
Command::Runner::Backends::Spawn.stub(:available?).and_return(true)
|
@@ -58,14 +58,23 @@ describe Command::Runner do
|
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
-
context "
|
61
|
+
context "bad commands" do
|
62
62
|
let(:command) { "some-non-existant-command" }
|
63
63
|
let(:arguments) { "" }
|
64
64
|
|
65
|
-
|
65
|
+
before :each do
|
66
66
|
subject.backend = Command::Runner::Backends::Backticks.new
|
67
|
+
end
|
68
|
+
|
69
|
+
its(:pass) { should be_no_command }
|
70
|
+
|
71
|
+
it "calls the block given" do
|
72
|
+
subject.backend = Command::Runner::Backends::Backticks.new
|
73
|
+
subject.pass do |message|
|
74
|
+
message.should be_no_command
|
67
75
|
|
68
|
-
|
76
|
+
message.line.should == "some-non-existant-command "
|
77
|
+
end
|
69
78
|
end
|
70
79
|
end
|
71
80
|
end
|