caliph 0.1.1 → 0.1.2
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/doc/Caliph/CommandChain.html +532 -0
- data/doc/Caliph/CommandLine.html +2541 -0
- data/doc/Caliph/CommandLineDSL.html +230 -0
- data/doc/Caliph/CommandLineExampleGroup/MockingExecute.html +174 -0
- data/doc/Caliph/CommandLineExampleGroup.html +366 -0
- data/doc/Caliph/CommandRunResult.html +1124 -0
- data/doc/Caliph/DefineOp/ClassMethods.html +250 -0
- data/doc/Caliph/DefineOp.html +188 -0
- data/doc/Caliph/MockCommandResult.html +465 -0
- data/doc/Caliph/PipelineChain.html +242 -0
- data/doc/Caliph/PrereqChain.html +242 -0
- data/doc/Caliph/ShellEscaped.html +445 -0
- data/doc/Caliph/WrappingChain.html +242 -0
- data/doc/Caliph.html +119 -0
- data/doc/_index.html +241 -0
- data/doc/class_list.html +54 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +57 -0
- data/doc/css/style.css +339 -0
- data/doc/file.README.html +235 -0
- data/doc/file_list.html +56 -0
- data/doc/frames.html +26 -0
- data/doc/index.html +235 -0
- data/doc/js/app.js +219 -0
- data/doc/js/full_list.js +178 -0
- data/doc/js/jquery.js +4 -0
- data/doc/method_list.html +503 -0
- data/doc/top-level-namespace.html +112 -0
- data/lib/caliph/command-chain.rb +4 -1
- data/lib/caliph/command-line.rb +24 -81
- data/lib/caliph/command-run-result.rb +48 -7
- data/lib/caliph/shell.rb +172 -0
- data/lib/caliph.rb +9 -0
- data/spec/command-line-dsl.rb +15 -15
- data/spec/command-line.rb +16 -18
- data/spec_help/spec_helper.rb +9 -3
- metadata +63 -6
data/lib/caliph/command-line.rb
CHANGED
@@ -9,29 +9,30 @@ module Caliph
|
|
9
9
|
attr_accessor :output_stream
|
10
10
|
end
|
11
11
|
|
12
|
-
def initialize(executable, *options)
|
12
|
+
def initialize(executable = nil, *options)
|
13
13
|
@output_stream = self.class.output_stream || $stderr
|
14
|
-
@executable = executable.to_s
|
14
|
+
@executable = executable.to_s unless executable.nil?
|
15
15
|
@options = options
|
16
16
|
@redirections = []
|
17
17
|
@env = {}
|
18
|
+
@verbose = false
|
18
19
|
yield self if block_given?
|
19
20
|
end
|
20
21
|
|
21
|
-
attr_accessor :name, :executable, :options, :env, :output_stream
|
22
|
+
attr_accessor :name, :executable, :options, :env, :output_stream, :verbose
|
22
23
|
attr_reader :redirections
|
23
24
|
|
24
25
|
alias_method :command_environment, :env
|
25
26
|
|
27
|
+
def valid?
|
28
|
+
!@executable.nil?
|
29
|
+
end
|
30
|
+
|
26
31
|
def set_env(name, value)
|
27
32
|
command_environment[name] = value
|
28
33
|
return self
|
29
34
|
end
|
30
35
|
|
31
|
-
def verbose
|
32
|
-
#::Rake.verbose && ::Rake.verbose != ::Rake::FileUtilsExt::DEFAULT
|
33
|
-
end
|
34
|
-
|
35
36
|
def name
|
36
37
|
@name || executable
|
37
38
|
end
|
@@ -58,6 +59,8 @@ module Caliph
|
|
58
59
|
self
|
59
60
|
end
|
60
61
|
|
62
|
+
# Waits for the process to complete. If this takes longer that
|
63
|
+
# {consume_timeout},
|
61
64
|
def redirect_from(path, stream)
|
62
65
|
@redirections << "#{stream}<#{path}"
|
63
66
|
end
|
@@ -82,104 +85,44 @@ module Caliph
|
|
82
85
|
redirect_stdout(path).redirect_stderr(path)
|
83
86
|
end
|
84
87
|
|
85
|
-
|
86
|
-
|
87
|
-
# and exit code of the command.
|
88
|
-
#
|
89
|
-
# This version adds some information to STDOUT to document that the
|
90
|
-
# command is running. For a terser version, call #execute directly
|
88
|
+
#:nocov:
|
89
|
+
#@deprecated (see: Shell)
|
91
90
|
def run
|
92
|
-
|
93
|
-
result = execute
|
94
|
-
report "=> #{result.exit_code}"
|
95
|
-
report result.format_streams if verbose
|
96
|
-
return result
|
97
|
-
ensure
|
98
|
-
report "" if verbose
|
91
|
+
Caliph.new.run(self)
|
99
92
|
end
|
100
93
|
|
101
|
-
|
94
|
+
#@deprecated (see: Shell)
|
102
95
|
def run_as_replacement
|
103
|
-
|
104
|
-
output_stream.puts string_format
|
105
|
-
Process.exec(command_environment, command)
|
96
|
+
Caliph.new.run_as_replacement(self)
|
106
97
|
end
|
107
98
|
alias replace_us run_as_replacement
|
108
99
|
|
109
|
-
|
100
|
+
#@deprecated (see: Shell)
|
110
101
|
def run_detached
|
111
|
-
|
112
|
-
Process.detach(pid)
|
113
|
-
return pid, out, err
|
102
|
+
Caliph.new.run_detached(self)
|
114
103
|
end
|
115
104
|
alias spin_off run_detached
|
116
105
|
|
117
|
-
|
118
|
-
# Returns an instance of CommandRunResult that contains the output
|
119
|
-
# and exit code of the command.
|
120
|
-
#
|
106
|
+
#@deprecated (see: Shell)
|
121
107
|
def execute
|
122
|
-
|
108
|
+
Caliph.new.execute(self)
|
123
109
|
end
|
124
110
|
|
125
|
-
|
126
|
-
# outlasts us
|
111
|
+
#@deprecated (see: Shell)
|
127
112
|
def run_in_background
|
128
|
-
|
129
|
-
Process.detach(pid)
|
130
|
-
at_exit do
|
131
|
-
kill_process(pid)
|
132
|
-
end
|
133
|
-
return pid, out, err
|
113
|
+
Caliph.new.run_in_background(self)
|
134
114
|
end
|
135
115
|
alias background run_in_background
|
136
116
|
|
137
|
-
|
138
|
-
# streams, records the results of the command and returns them in a
|
139
|
-
# CommandRunResult instance.
|
140
|
-
def collect_result(pid, host_stdout, host_stderr)
|
141
|
-
result = CommandRunResult.new(pid, self)
|
142
|
-
result.streams = {1 => host_stdout, 2 => host_stderr}
|
143
|
-
result.wait
|
144
|
-
return result
|
145
|
-
end
|
146
|
-
|
147
|
-
|
148
|
-
def kill_process(pid)
|
149
|
-
Process.kill("INT", pid)
|
150
|
-
end
|
151
|
-
|
152
|
-
def complete(pid, out, err)
|
153
|
-
kill_process(pid)
|
154
|
-
collect_result(pid, out, err)
|
155
|
-
end
|
156
|
-
|
157
|
-
def report(message, newline=true)
|
158
|
-
output_stream.print(message + (newline ? "\n" : ""))
|
159
|
-
end
|
160
|
-
|
161
|
-
|
117
|
+
#@deprecated
|
162
118
|
def succeeds?
|
163
119
|
run.succeeded?
|
164
120
|
end
|
165
121
|
|
122
|
+
#@deprecated
|
166
123
|
def must_succeed!
|
167
124
|
run.must_succeed!
|
168
125
|
end
|
169
|
-
|
170
|
-
def spawn_process
|
171
|
-
host_stdout, cmd_stdout = IO.pipe
|
172
|
-
host_stderr, cmd_stderr = IO.pipe
|
173
|
-
|
174
|
-
pid = Process.spawn(command_environment, command, :out => cmd_stdout, :err => cmd_stderr)
|
175
|
-
cmd_stdout.close
|
176
|
-
cmd_stderr.close
|
177
|
-
|
178
|
-
return pid, host_stdout, host_stderr
|
179
|
-
end
|
180
|
-
|
181
|
-
|
126
|
+
#:nocov:
|
182
127
|
end
|
183
|
-
|
184
|
-
|
185
128
|
end
|
@@ -1,30 +1,55 @@
|
|
1
1
|
module Caliph
|
2
|
+
# This is the Caliph handle on a run process - it can be used to send signals
|
3
|
+
# to running processes, wait for them to complete, get their exit status once
|
4
|
+
# they have, and watch their streams in either case.
|
2
5
|
class CommandRunResult
|
3
|
-
def initialize(pid, command)
|
6
|
+
def initialize(pid, command, shell)
|
4
7
|
@command = command
|
5
8
|
@pid = pid
|
9
|
+
@shell = shell
|
6
10
|
|
7
11
|
#####
|
8
12
|
@process_status = nil
|
9
13
|
@streams = {}
|
10
14
|
@consume_timeout = nil
|
11
15
|
end
|
12
|
-
|
16
|
+
|
17
|
+
attr_reader :process_status
|
18
|
+
|
19
|
+
attr_reader :pid, :command
|
13
20
|
attr_accessor :consume_timeout, :streams
|
14
21
|
|
22
|
+
# Access the stdout of the process
|
15
23
|
def stdout
|
16
24
|
@streams[1]
|
17
25
|
end
|
18
26
|
|
27
|
+
# Access the stderr of the process
|
19
28
|
def stderr
|
20
29
|
@streams[2]
|
21
30
|
end
|
22
31
|
|
32
|
+
# @return [exit_code] the raw exit of the process
|
33
|
+
# @return [nil] the process is still running
|
23
34
|
def exit_code
|
24
|
-
@process_status.
|
35
|
+
if @process_status.nil?
|
36
|
+
return nil
|
37
|
+
else
|
38
|
+
@process_status.exitstatus
|
39
|
+
end
|
25
40
|
end
|
26
41
|
alias exit_status exit_code
|
27
42
|
|
43
|
+
# Check whether the process is still running
|
44
|
+
# @return [true] the process is still running
|
45
|
+
# @return [false] the process has completed
|
46
|
+
def running?
|
47
|
+
!@process_status.nil?
|
48
|
+
end
|
49
|
+
|
50
|
+
# Confirm that the process exited with a successful exit code (i.e. 0).
|
51
|
+
# This is pretty reliable, but many applications return bad exit statuses -
|
52
|
+
# 0 when they failed, usually.
|
28
53
|
def succeeded?
|
29
54
|
must_succeed!
|
30
55
|
return true
|
@@ -32,11 +57,14 @@ module Caliph
|
|
32
57
|
return false
|
33
58
|
end
|
34
59
|
|
60
|
+
# Nicely formatted output of stdout and stderr - won't be intermixed, which
|
61
|
+
# may be different than what you'd see live in the shell
|
35
62
|
def format_streams
|
36
63
|
"stdout:#{stdout.nil? || stdout.empty? ? "[empty]\n" : "\n#{stdout}"}" +
|
37
64
|
"stderr:#{stderr.nil? || stderr.empty? ? "[empty]\n" : "\n#{stderr}"}---"
|
38
65
|
end
|
39
66
|
|
67
|
+
# Demands that the process succeed, or else raises and error
|
40
68
|
def must_succeed!
|
41
69
|
case exit_code
|
42
70
|
when 0
|
@@ -46,6 +74,19 @@ module Caliph
|
|
46
74
|
end
|
47
75
|
end
|
48
76
|
|
77
|
+
# Stop a running process. Sends SIGINT by default which about like hitting
|
78
|
+
# Control-C.
|
79
|
+
# @param signal the Unix signal to send to the process
|
80
|
+
def kill(signal = nil)
|
81
|
+
Process.kill(signal || "INT", pid)
|
82
|
+
rescue Errno::ESRCH
|
83
|
+
warn "Couldn't find process #{pid} to kill it"
|
84
|
+
end
|
85
|
+
|
86
|
+
# Waits for the process to complete. If this takes longer that
|
87
|
+
# {consume_timeout}, output on the process's streams will be output via
|
88
|
+
# {Shell#report} - very useful when compilation or network transfers are
|
89
|
+
# taking a long time.
|
49
90
|
def wait
|
50
91
|
@accumulators = {}
|
51
92
|
waits = {}
|
@@ -73,9 +114,9 @@ module Caliph
|
|
73
114
|
if !@buffered_echo.nil?
|
74
115
|
timeout = begin_echoing - Time.now
|
75
116
|
if timeout < 0
|
76
|
-
@
|
77
|
-
@
|
78
|
-
@
|
117
|
+
@shell.report ""
|
118
|
+
@shell.report "Long running command output:"
|
119
|
+
@shell.report @buffered_echo.join
|
79
120
|
@buffered_echo = nil
|
80
121
|
end
|
81
122
|
end
|
@@ -112,7 +153,7 @@ module Caliph
|
|
112
153
|
begin
|
113
154
|
while chunk = io.read_nonblock(4096)
|
114
155
|
if @buffered_echo.nil?
|
115
|
-
@
|
156
|
+
@shell.report chunk, false
|
116
157
|
else
|
117
158
|
@buffered_echo << chunk
|
118
159
|
end
|
data/lib/caliph/shell.rb
ADDED
@@ -0,0 +1,172 @@
|
|
1
|
+
module Caliph
|
2
|
+
class Error < StandardError; end
|
3
|
+
class IncompleteCommand < Error; end
|
4
|
+
class InvalidCommand < Error; end
|
5
|
+
|
6
|
+
# Operates something like a command line shell, except from a Ruby object
|
7
|
+
# perspective.
|
8
|
+
#
|
9
|
+
# Basically, a Shell operates as your handle on creating, running and killing
|
10
|
+
# commands in Caliph.
|
11
|
+
#
|
12
|
+
class Shell
|
13
|
+
attr_accessor :verbose, :output_stream
|
14
|
+
|
15
|
+
def output_stream
|
16
|
+
@output_stream ||= $stderr
|
17
|
+
end
|
18
|
+
|
19
|
+
def verbose
|
20
|
+
@verbose ||= false
|
21
|
+
end
|
22
|
+
|
23
|
+
# Reports messages if verbose is true. Used internally to print messages
|
24
|
+
# about running commands
|
25
|
+
def report_verbose(message)
|
26
|
+
report(message) if verbose
|
27
|
+
end
|
28
|
+
|
29
|
+
# Prints information to {output_stream} which defaults to $stderr.
|
30
|
+
def report(message, newline=true)
|
31
|
+
output_stream.print(message + (newline ? "\n" : ""))
|
32
|
+
end
|
33
|
+
|
34
|
+
# Kill processes given a raw pid. In general, prefer
|
35
|
+
# {CommandRunResult#kill}
|
36
|
+
# @param pid the process id to kill
|
37
|
+
def kill_process(pid)
|
38
|
+
Process.kill("INT", pid)
|
39
|
+
rescue Errno::ESRCH
|
40
|
+
warn "Couldn't find process #{pid} to kill it"
|
41
|
+
end
|
42
|
+
|
43
|
+
def normalize_command_line(*args, &block)
|
44
|
+
command_line = nil
|
45
|
+
if args.empty? or args.first == nil
|
46
|
+
command_line = CommandLine.new
|
47
|
+
elsif args.all?{|arg| arg.is_a? String}
|
48
|
+
command_line = CommandLine.new(*args)
|
49
|
+
else
|
50
|
+
command_line = args.first
|
51
|
+
end
|
52
|
+
yield command_line if block_given?
|
53
|
+
#raise InvalidCommand, "not a command line: #{command_line.inspect}"
|
54
|
+
#unless command_line.is_a? CommandLine
|
55
|
+
raise IncompleteCommand, "cannot run #{command_line}" unless command_line.valid?
|
56
|
+
command_line
|
57
|
+
end
|
58
|
+
protected :normalize_command_line
|
59
|
+
|
60
|
+
# Given a process ID for a running command and a pair of stdout/stdin
|
61
|
+
# streams, records the results of the command and returns them in a
|
62
|
+
# CommandRunResult instance.
|
63
|
+
def collect_result(command, pid, host_stdout, host_stderr)
|
64
|
+
result = CommandRunResult.new(pid, command, self)
|
65
|
+
result.streams = {1 => host_stdout, 2 => host_stderr}
|
66
|
+
return result
|
67
|
+
end
|
68
|
+
|
69
|
+
# Creates a process to run a command. Handles connecting pipes to stardard
|
70
|
+
# streams, launching the process and returning a pid for it.
|
71
|
+
# @return [pid, host_stdout, host_stderr] the process id and streams
|
72
|
+
# associated with the child process
|
73
|
+
def spawn_process(command_line)
|
74
|
+
host_stdout, cmd_stdout = IO.pipe
|
75
|
+
host_stderr, cmd_stderr = IO.pipe
|
76
|
+
|
77
|
+
pid = Process.spawn(command_line.command_environment, command_line.command, :out => cmd_stdout, :err => cmd_stderr)
|
78
|
+
cmd_stdout.close
|
79
|
+
cmd_stderr.close
|
80
|
+
|
81
|
+
return pid, host_stdout, host_stderr
|
82
|
+
end
|
83
|
+
|
84
|
+
# Run the command, wait for termination, and collect the results.
|
85
|
+
# Returns an instance of CommandRunResult that contains the output
|
86
|
+
# and exit code of the command.
|
87
|
+
#
|
88
|
+
def execute(command_line)
|
89
|
+
result = collect_result(command_line, *spawn_process(command_line))
|
90
|
+
result.wait
|
91
|
+
result
|
92
|
+
end
|
93
|
+
|
94
|
+
# @!group Running Commands
|
95
|
+
# Run the command, wait for termination, and collect the results.
|
96
|
+
# Returns an instance of CommandRunResult that contains the output
|
97
|
+
# and exit code of the command. This version {#report}s some information to document that the
|
98
|
+
# command is running. For a terser version, call {#execute} directly
|
99
|
+
#
|
100
|
+
# @!macro normalized
|
101
|
+
# @yield [CommandLine] command about to be run (for configuration)
|
102
|
+
# @return [CommandRunResult] used to refer to and inspect the resulting
|
103
|
+
# process
|
104
|
+
# @overload $0(&block)
|
105
|
+
# @overload $0(cmd, &block)
|
106
|
+
# @param [CommandLine] execute
|
107
|
+
# @overload $0(*cmd_strings, &block)
|
108
|
+
# @param [Array<String>] a set of strings to parse into a {CommandLine}
|
109
|
+
def run(*args, &block)
|
110
|
+
command_line = normalize_command_line(*args, &block)
|
111
|
+
|
112
|
+
report command_line.string_format + " ", false
|
113
|
+
result = execute(command_line)
|
114
|
+
report "=> #{result.exit_code}"
|
115
|
+
report_verbose result.format_streams
|
116
|
+
return result
|
117
|
+
ensure
|
118
|
+
report_verbose ""
|
119
|
+
end
|
120
|
+
|
121
|
+
# Completely replace the running process with a command. Good for setting
|
122
|
+
# up a command and then running it, without worrying about what happens
|
123
|
+
# after that. Uses `exec` under the hood.
|
124
|
+
# @macro normalized
|
125
|
+
# @example Using replace_us
|
126
|
+
# # The last thing we'll ever do:
|
127
|
+
# shell.run_as_replacement('echo', "Everything is okay")
|
128
|
+
# # don't worry, we never get here.
|
129
|
+
# shell.run("sudo", "shutdown -h now")
|
130
|
+
def run_as_replacement(*args, &block)
|
131
|
+
command_line = normalize_command_line(*args, &block)
|
132
|
+
|
133
|
+
report "Ceding execution to: "
|
134
|
+
report command_line.string_format
|
135
|
+
Process.exec(command_line.command_environment, command_line.command)
|
136
|
+
end
|
137
|
+
alias replace_us run_as_replacement
|
138
|
+
|
139
|
+
# Run the command in the background. The command can survive the caller.
|
140
|
+
# Works, for instance, to kick off some long running processes that we
|
141
|
+
# don't care about. Note that this isn't quite full daemonization - we
|
142
|
+
# don't close the streams of the other process, or scrub its environment or
|
143
|
+
# anything.
|
144
|
+
# @macro normalized
|
145
|
+
def run_detached(*args, &block)
|
146
|
+
command_line = normalize_command_line(*args, &block)
|
147
|
+
|
148
|
+
pid, out, err = spawn_process(command_line)
|
149
|
+
Process.detach(pid)
|
150
|
+
return collect_result(command_line, pid, out, err)
|
151
|
+
end
|
152
|
+
alias spin_off run_detached
|
153
|
+
|
154
|
+
# Run the command in parallel with the parent process - will kill it if it
|
155
|
+
# outlasts us. Good for running e.g. a web server that we need to interact
|
156
|
+
# with, or the like, without cluttering the system with a bunch of zombies.
|
157
|
+
# @macro normalized
|
158
|
+
def run_in_background(*args, &block)
|
159
|
+
command_line = normalize_command_line(*args, &block)
|
160
|
+
|
161
|
+
pid, out, err = spawn_process(command_line)
|
162
|
+
Process.detach(pid)
|
163
|
+
at_exit do
|
164
|
+
kill_process(pid)
|
165
|
+
end
|
166
|
+
return collect_result(command_line, pid, out, err)
|
167
|
+
end
|
168
|
+
alias background run_in_background
|
169
|
+
|
170
|
+
# !@endgroup
|
171
|
+
end
|
172
|
+
end
|
data/lib/caliph.rb
CHANGED
@@ -1,4 +1,13 @@
|
|
1
|
+
module Caliph
|
2
|
+
# Returns an instance of the default {Shell}
|
3
|
+
# @todo add alternative shells - e.g. SSHShell
|
4
|
+
def self.new
|
5
|
+
Shell.new
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
1
9
|
require 'caliph/command-line'
|
2
10
|
require 'caliph/command-chain'
|
3
11
|
require 'caliph/command-line-dsl'
|
4
12
|
require 'caliph/shell-escaped'
|
13
|
+
require 'caliph/shell'
|
data/spec/command-line-dsl.rb
CHANGED
@@ -9,11 +9,11 @@ describe Caliph::CommandLineDSL do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
it "should define commands" do
|
12
|
-
command.
|
13
|
-
command.
|
14
|
-
command.commands[0].
|
15
|
-
command.commands[1].
|
16
|
-
command.command.
|
12
|
+
expect(command).to be_an_instance_of(Caliph::WrappingChain)
|
13
|
+
expect(command.commands.size).to eq(2)
|
14
|
+
expect(command.commands[0]).to be_an_instance_of(Caliph::CommandLine)
|
15
|
+
expect(command.commands[1]).to be_an_instance_of(Caliph::CommandLine)
|
16
|
+
expect(command.command).to eq("sudo -- gem install bundler")
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
@@ -23,11 +23,11 @@ describe Caliph::CommandLineDSL do
|
|
23
23
|
end
|
24
24
|
|
25
25
|
it "should define commands" do
|
26
|
-
command.
|
27
|
-
command.
|
28
|
-
command.commands[0].
|
29
|
-
command.commands[1].
|
30
|
-
command.command.
|
26
|
+
expect(command).to be_an_instance_of(Caliph::PipelineChain)
|
27
|
+
expect(command.commands.size).to eq(2)
|
28
|
+
expect(command.commands[0]).to be_an_instance_of(Caliph::CommandLine)
|
29
|
+
expect(command.commands[1]).to be_an_instance_of(Caliph::CommandLine)
|
30
|
+
expect(command.command).to eq("cat /etc/passwd | grep root")
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
@@ -38,11 +38,11 @@ describe Caliph::CommandLineDSL do
|
|
38
38
|
end
|
39
39
|
|
40
40
|
it "should define commands" do
|
41
|
-
command.
|
42
|
-
command.
|
43
|
-
command.commands[0].
|
44
|
-
command.commands[1].
|
45
|
-
command.command.
|
41
|
+
expect(command).to be_an_instance_of(Caliph::PrereqChain)
|
42
|
+
expect(command.commands.size).to eq(2)
|
43
|
+
expect(command.commands[0]).to be_an_instance_of(Caliph::CommandLine)
|
44
|
+
expect(command.commands[1]).to be_an_instance_of(Caliph::CommandLine)
|
45
|
+
expect(command.command).to eq("cd /tmp/trash && rm -rf *")
|
46
46
|
end
|
47
47
|
end
|
48
48
|
end
|
data/spec/command-line.rb
CHANGED
@@ -13,15 +13,15 @@ describe Caliph::CommandLine do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
it "should have a name set" do
|
16
|
-
commandline.name.
|
16
|
+
expect(commandline.name).to eq("echo")
|
17
17
|
end
|
18
18
|
|
19
19
|
it "should produce a command string" do
|
20
|
-
commandline.command.
|
20
|
+
expect(commandline.command).to eq("echo -n Some text")
|
21
21
|
end
|
22
22
|
|
23
23
|
it "should succeed" do
|
24
|
-
commandline.succeeds
|
24
|
+
expect(commandline.succeeds?).to be_truthy
|
25
25
|
end
|
26
26
|
|
27
27
|
it "should not complain about success" do
|
@@ -44,11 +44,11 @@ describe Caliph::CommandLine, "setting environment variables" do
|
|
44
44
|
end
|
45
45
|
|
46
46
|
it "should succeed" do
|
47
|
-
result.succeeded
|
47
|
+
expect(result.succeeded?).to be_truthy
|
48
48
|
end
|
49
49
|
|
50
50
|
it "should alter the command's environment variables" do
|
51
|
-
result.stdout.
|
51
|
+
expect(result.stdout).to match(/TEST_ENV.*indubitably/)
|
52
52
|
end
|
53
53
|
|
54
54
|
end
|
@@ -64,24 +64,24 @@ describe Caliph::CommandLine, 'redirecting' do
|
|
64
64
|
|
65
65
|
it 'should allow redirect stdout' do
|
66
66
|
commandline.redirect_stdout('some_file')
|
67
|
-
result.
|
67
|
+
expect(result).to match(/1>some_file$/)
|
68
68
|
end
|
69
69
|
|
70
70
|
it 'should allow redirect stderr' do
|
71
71
|
commandline.redirect_stderr('some_file')
|
72
|
-
result.
|
72
|
+
expect(result).to match(/2>some_file$/)
|
73
73
|
end
|
74
74
|
|
75
75
|
it 'should allow chain redirects' do
|
76
76
|
commandline.redirect_stdout('stdout_file').redirect_stderr('stderr_file')
|
77
|
-
result.
|
78
|
-
result.
|
77
|
+
expect(result).to match(/\b1>stdout_file\b/)
|
78
|
+
expect(result).to match(/\b2>stderr_file\b/)
|
79
79
|
end
|
80
80
|
|
81
81
|
it 'should redirect both' do
|
82
82
|
commandline.redirect_both('output_file')
|
83
|
-
result.
|
84
|
-
result.
|
83
|
+
expect(result).to match(/\b1>output_file\b/)
|
84
|
+
expect(result).to match(/\b2>output_file\b/)
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
@@ -100,31 +100,29 @@ describe Caliph::PipelineChain do
|
|
100
100
|
end
|
101
101
|
|
102
102
|
it "should produce the right command" do
|
103
|
-
commandline.command.
|
103
|
+
expect(commandline.command).to eq('env | cat')
|
104
104
|
end
|
105
105
|
|
106
106
|
it "should produce a runnable command with format_string" do
|
107
|
-
commandline.string_format.
|
107
|
+
expect(commandline.string_format).to eq('TEST_ENV=indubitably env | cat')
|
108
108
|
end
|
109
109
|
|
110
110
|
it "should succeed" do
|
111
|
-
result.succeeded
|
111
|
+
expect(result.succeeded?).to be_truthy
|
112
112
|
end
|
113
113
|
|
114
114
|
it "should alter the command's environment variables" do
|
115
|
-
result.stdout.
|
115
|
+
expect(result.stdout).to match(/TEST_ENV.*indubitably/)
|
116
116
|
end
|
117
117
|
end
|
118
118
|
|
119
|
-
|
120
|
-
|
121
119
|
describe Caliph::CommandLine, "that fails" do
|
122
120
|
let :commandline do
|
123
121
|
Caliph::CommandLine.new("false")
|
124
122
|
end
|
125
123
|
|
126
124
|
it "should not succeed" do
|
127
|
-
commandline.succeeds
|
125
|
+
expect(commandline.succeeds?).to eq(false)
|
128
126
|
end
|
129
127
|
|
130
128
|
it "should raise error if succeed demanded" do
|
data/spec_help/spec_helper.rb
CHANGED
@@ -1,11 +1,17 @@
|
|
1
|
+
require "codeclimate-test-reporter"
|
2
|
+
CodeClimate::TestReporter.start
|
3
|
+
|
1
4
|
require 'rspec'
|
2
5
|
require 'rspec/core/formatters/base_formatter'
|
3
6
|
|
7
|
+
$:.unshift("./lib")
|
8
|
+
|
4
9
|
require 'caliph'
|
5
|
-
require 'cadre/
|
10
|
+
require 'cadre/rspec3'
|
6
11
|
|
7
12
|
RSpec.configure do |config|
|
13
|
+
config.backtrace_inclusion_patterns = []
|
8
14
|
config.run_all_when_everything_filtered = true
|
9
|
-
config.add_formatter(Cadre::
|
10
|
-
config.add_formatter(Cadre::
|
15
|
+
config.add_formatter(Cadre::RSpec3::NotifyOnCompleteFormatter)
|
16
|
+
config.add_formatter(Cadre::RSpec3::QuickfixFormatter)
|
11
17
|
end
|