command_exec 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +52 -0
- data/Gemfile +24 -0
- data/Gemfile.lock +101 -0
- data/Guardfile +9 -0
- data/README.md +6 -0
- data/Rakefile +1 -0
- data/command_exec.gemspec +22 -0
- data/lib/command_exec/command.rb +238 -0
- data/lib/command_exec/exceptions.rb +20 -0
- data/lib/command_exec/spec_helper_module.rb +19 -0
- data/lib/command_exec/version.rb +3 -0
- data/lib/command_exec.rb +6 -0
- data/spec/command/command_spec.rb +100 -0
- data/spec/spec_helper.rb +19 -0
- metadata +84 -0
data/.gitignore
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
.$*$
|
2
|
+
.*
|
3
|
+
*.*~
|
4
|
+
*.acn
|
5
|
+
*.acr
|
6
|
+
*.alg
|
7
|
+
*.aux
|
8
|
+
*.auxlock
|
9
|
+
*.bak
|
10
|
+
*.bbl
|
11
|
+
*.blg
|
12
|
+
.bundle
|
13
|
+
coverage/
|
14
|
+
doc/yardoc/
|
15
|
+
*.dvi
|
16
|
+
*.fdb_latexmk
|
17
|
+
*.fls
|
18
|
+
*.gem
|
19
|
+
!.git*
|
20
|
+
*.glg
|
21
|
+
*.glo
|
22
|
+
*.gls
|
23
|
+
*.htm
|
24
|
+
*.html
|
25
|
+
*.idx
|
26
|
+
*.ilg
|
27
|
+
*.ind
|
28
|
+
*.ist
|
29
|
+
*.loc
|
30
|
+
*.lof
|
31
|
+
*.log
|
32
|
+
*.log
|
33
|
+
*.lol
|
34
|
+
*.lot
|
35
|
+
*.nlo
|
36
|
+
*.nls
|
37
|
+
nohup*
|
38
|
+
*.old
|
39
|
+
*.out
|
40
|
+
pkg/
|
41
|
+
pkg/*
|
42
|
+
.rvmrc
|
43
|
+
*.s??
|
44
|
+
*.s*p
|
45
|
+
*.synctex.gz*
|
46
|
+
*.tex.meta
|
47
|
+
*.toc
|
48
|
+
.yardoc
|
49
|
+
tmp/
|
50
|
+
*.pdf
|
51
|
+
!doc/*/*.pdf
|
52
|
+
*.pid
|
data/Gemfile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
source "https://rubygems.org"
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in ruby-pdflatex.gemspec
|
4
|
+
gemspec
|
5
|
+
|
6
|
+
group :development do
|
7
|
+
gem 'cucumber'
|
8
|
+
gem 'fakefs'
|
9
|
+
gem 'fuubar'
|
10
|
+
gem 'github-markup'
|
11
|
+
gem 'guard'
|
12
|
+
gem 'guard-cucumber'
|
13
|
+
gem 'guard-rspec'
|
14
|
+
gem 'guard-yard'
|
15
|
+
gem 'libnotify'
|
16
|
+
gem 'pry'
|
17
|
+
gem 'rb-inotify'
|
18
|
+
gem 'rb-readline'
|
19
|
+
gem 'redcarpet' , '~>1.17.2'
|
20
|
+
gem 'rspec'
|
21
|
+
gem 'simplecov'
|
22
|
+
gem 'terminal_multiplexer'
|
23
|
+
gem 'yard'
|
24
|
+
end
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
command_exec (0.0.1)
|
5
|
+
POpen4
|
6
|
+
colored
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
POpen4 (0.1.4)
|
12
|
+
Platform (>= 0.4.0)
|
13
|
+
open4
|
14
|
+
Platform (0.4.0)
|
15
|
+
builder (3.0.0)
|
16
|
+
coderay (1.0.5)
|
17
|
+
colored (1.2)
|
18
|
+
cucumber (1.1.9)
|
19
|
+
builder (>= 2.1.2)
|
20
|
+
diff-lcs (>= 1.1.2)
|
21
|
+
gherkin (~> 2.9.0)
|
22
|
+
json (>= 1.4.6)
|
23
|
+
term-ansicolor (>= 1.0.6)
|
24
|
+
diff-lcs (1.1.3)
|
25
|
+
fakefs (0.4.0)
|
26
|
+
ffi (1.0.11)
|
27
|
+
fuubar (1.0.0)
|
28
|
+
rspec (~> 2.0)
|
29
|
+
rspec-instafail (~> 0.2.0)
|
30
|
+
ruby-progressbar (~> 0.0.10)
|
31
|
+
gherkin (2.9.1)
|
32
|
+
json (>= 1.4.6)
|
33
|
+
github-markup (0.7.1)
|
34
|
+
guard (1.0.1)
|
35
|
+
ffi (>= 0.5.0)
|
36
|
+
thor (~> 0.14.6)
|
37
|
+
guard-cucumber (0.7.5)
|
38
|
+
cucumber (>= 0.10)
|
39
|
+
guard (>= 0.8.3)
|
40
|
+
guard-rspec (0.6.0)
|
41
|
+
guard (>= 0.10.0)
|
42
|
+
guard-yard (1.0.2)
|
43
|
+
guard (>= 0.2.2)
|
44
|
+
yard (>= 0.7.0)
|
45
|
+
highline (1.6.11)
|
46
|
+
json (1.6.5)
|
47
|
+
libnotify (0.7.2)
|
48
|
+
method_source (0.7.1)
|
49
|
+
multi_json (1.1.0)
|
50
|
+
open4 (1.3.0)
|
51
|
+
pry (0.9.8.4)
|
52
|
+
coderay (~> 1.0.5)
|
53
|
+
method_source (~> 0.7.1)
|
54
|
+
slop (>= 2.4.4, < 3)
|
55
|
+
rb-inotify (0.8.8)
|
56
|
+
ffi (>= 0.5.0)
|
57
|
+
rb-readline (0.4.2)
|
58
|
+
redcarpet (1.17.2)
|
59
|
+
rspec (2.9.0)
|
60
|
+
rspec-core (~> 2.9.0)
|
61
|
+
rspec-expectations (~> 2.9.0)
|
62
|
+
rspec-mocks (~> 2.9.0)
|
63
|
+
rspec-core (2.9.0)
|
64
|
+
rspec-expectations (2.9.0)
|
65
|
+
diff-lcs (~> 1.1.3)
|
66
|
+
rspec-instafail (0.2.2)
|
67
|
+
rspec-mocks (2.9.0)
|
68
|
+
ruby-progressbar (0.0.10)
|
69
|
+
simplecov (0.6.1)
|
70
|
+
multi_json (~> 1.0)
|
71
|
+
simplecov-html (~> 0.5.3)
|
72
|
+
simplecov-html (0.5.3)
|
73
|
+
slop (2.4.4)
|
74
|
+
term-ansicolor (1.0.7)
|
75
|
+
terminal_multiplexer (1.0.2)
|
76
|
+
highline
|
77
|
+
thor (0.14.6)
|
78
|
+
yard (0.7.5)
|
79
|
+
|
80
|
+
PLATFORMS
|
81
|
+
ruby
|
82
|
+
|
83
|
+
DEPENDENCIES
|
84
|
+
command_exec!
|
85
|
+
cucumber
|
86
|
+
fakefs
|
87
|
+
fuubar
|
88
|
+
github-markup
|
89
|
+
guard
|
90
|
+
guard-cucumber
|
91
|
+
guard-rspec
|
92
|
+
guard-yard
|
93
|
+
libnotify
|
94
|
+
pry
|
95
|
+
rb-inotify
|
96
|
+
rb-readline
|
97
|
+
redcarpet (~> 1.17.2)
|
98
|
+
rspec
|
99
|
+
simplecov
|
100
|
+
terminal_multiplexer
|
101
|
+
yard
|
data/Guardfile
ADDED
data/README.md
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "command_exec/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "command_exec"
|
7
|
+
s.version = CommandExec::VERSION
|
8
|
+
s.authors = ["Max Meyer"]
|
9
|
+
s.email = ["dev@fedux.org"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{Helper gem to exectue arbitrary shell commands}
|
12
|
+
s.description = %q{This adds bells and whistles to ease shell command execution}
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
|
+
s.require_paths = ['lib']
|
18
|
+
|
19
|
+
# specify any dependencies here; for example:
|
20
|
+
s.add_runtime_dependency 'POpen4'
|
21
|
+
s.add_runtime_dependency 'colored'
|
22
|
+
end
|
@@ -0,0 +1,238 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'popen4'
|
4
|
+
require 'colored'
|
5
|
+
require 'logger'
|
6
|
+
|
7
|
+
# Classes concerning command execution
|
8
|
+
module CommandExec
|
9
|
+
# Run commands
|
10
|
+
class Command
|
11
|
+
|
12
|
+
attr_accessor :logfile, :options , :parameter, :error_keywords
|
13
|
+
attr_reader :result, :path, :working_directory
|
14
|
+
|
15
|
+
# Create a new command to execute
|
16
|
+
#
|
17
|
+
# @param [Symbol] name name of command
|
18
|
+
# @param [optional,Hash] opts options for the command
|
19
|
+
# @option opts [String] :options options for binary
|
20
|
+
# @option opts [String] :parameter parameter for binary
|
21
|
+
# @option opts [String] :error_keywords keyword indicating an error on stdout
|
22
|
+
# @option opts [String] :working_directory working directory where the process should run in
|
23
|
+
# @option opts [String] :logfile file path to log file of process
|
24
|
+
def initialize(name,opts={})
|
25
|
+
|
26
|
+
@name = name
|
27
|
+
@opts = {
|
28
|
+
:logger => Logger.new($stderr),
|
29
|
+
:options => '',
|
30
|
+
:parameter => '',
|
31
|
+
:error_keywords => [],
|
32
|
+
:working_directory => Dir.pwd,
|
33
|
+
:logfile => '',
|
34
|
+
:debug => false,
|
35
|
+
}.update opts
|
36
|
+
|
37
|
+
@logger = @opts[:logger]
|
38
|
+
@options = @opts[:options]
|
39
|
+
@parameter = @opts[:parameter]
|
40
|
+
@path = resolve_cmd_name(name)
|
41
|
+
@error_keywords = @opts[:error_keywords]
|
42
|
+
@logfile = @opts[:logfile]
|
43
|
+
|
44
|
+
@working_directory = @opts[:working_directory]
|
45
|
+
Dir.chdir(working_directory)
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
# Find utility path
|
52
|
+
#
|
53
|
+
# @param [Symbol] name Name of utility
|
54
|
+
# @return [Path] Returns the path to the binary of the binary
|
55
|
+
def resolve_cmd_name(name)
|
56
|
+
path=''
|
57
|
+
path = %x[which #{name} 2>/dev/null].chomp
|
58
|
+
|
59
|
+
if path.empty?
|
60
|
+
@logger.fatal("Command not found #{name}")
|
61
|
+
raise Exceptions::CommandNotFound
|
62
|
+
end
|
63
|
+
|
64
|
+
return path
|
65
|
+
end
|
66
|
+
|
67
|
+
# Build string to execute command
|
68
|
+
#
|
69
|
+
# @return [String] Returns to whole command with parameters and options
|
70
|
+
def build_cmd_string
|
71
|
+
cmd = ''
|
72
|
+
cmd += path
|
73
|
+
cmd += options.empty? ? "" : " #{options}"
|
74
|
+
cmd += parameter.empty? ? "" : " #{parameter}"
|
75
|
+
|
76
|
+
return cmd
|
77
|
+
end
|
78
|
+
|
79
|
+
# Checks for errors
|
80
|
+
#
|
81
|
+
# @raise [String]
|
82
|
+
|
83
|
+
public
|
84
|
+
|
85
|
+
# Output the textual representation of a command
|
86
|
+
#
|
87
|
+
# @return [String] command in text form
|
88
|
+
def to_txt
|
89
|
+
return build_cmd_string
|
90
|
+
end
|
91
|
+
|
92
|
+
# Run the program
|
93
|
+
#
|
94
|
+
def run
|
95
|
+
|
96
|
+
_stdout = ''
|
97
|
+
_stderr = ''
|
98
|
+
|
99
|
+
status = POpen4::popen4(build_cmd_string) do |stdout, stderr, stdin, pid|
|
100
|
+
_stdout = stdout.read.strip
|
101
|
+
_stderr = stderr.read.strip
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
error_in_stdout_found = error_in_string_found?(error_keywords,_stdout)
|
106
|
+
@result = run_successful?( status.success? , error_in_stdout_found )
|
107
|
+
|
108
|
+
if @result == false
|
109
|
+
msg = message(
|
110
|
+
@result,
|
111
|
+
help_output(
|
112
|
+
{
|
113
|
+
:error_in_exec => not(status.success?),
|
114
|
+
:error_in_stdout => error_in_stdout_found
|
115
|
+
}, {
|
116
|
+
:stdout => StringIO.new(_stdout),
|
117
|
+
:stderr => StringIO.new(_stderr),
|
118
|
+
:logfile => read_logfile(logfile),
|
119
|
+
}
|
120
|
+
)
|
121
|
+
)
|
122
|
+
else
|
123
|
+
msg = message(@result)
|
124
|
+
end
|
125
|
+
|
126
|
+
@logger.info "#{@name.to_s}: #{msg}"
|
127
|
+
|
128
|
+
return @result
|
129
|
+
|
130
|
+
end
|
131
|
+
|
132
|
+
# Read the content of the logfile
|
133
|
+
#
|
134
|
+
# @param [Path] file path to logfile
|
135
|
+
# @param [Integer num_of_lines the number of lines which should be read -- e.g. 30 lines = -30
|
136
|
+
def read_logfile(file, num_of_lines=-30)
|
137
|
+
content = StringIO.new
|
138
|
+
|
139
|
+
unless file.empty?
|
140
|
+
begin
|
141
|
+
content << File.readlines(logfile)[num_of_lines..-1].join("")
|
142
|
+
rescue Errno::ENOENT
|
143
|
+
@logger.warn "Warning: logfile not found!"
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
return content
|
148
|
+
end
|
149
|
+
|
150
|
+
# Decide if a program run was successful
|
151
|
+
#
|
152
|
+
# @return [Boolean] Returns the decision
|
153
|
+
def run_successful?(success,error_in_stdout)
|
154
|
+
if success == false or error_in_stdout == true
|
155
|
+
return false
|
156
|
+
else
|
157
|
+
return true
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
# Decide which output to return to the user
|
162
|
+
# to help him with debugging
|
163
|
+
#
|
164
|
+
# @return [Array] Returns lines of log/stdout/stderr
|
165
|
+
def help_output(error_indicators={},output={})
|
166
|
+
error_in_exec = error_indicators[:error_in_exec]
|
167
|
+
error_in_stdout = error_indicators[:error_in_stdout]
|
168
|
+
|
169
|
+
logfile = output[:logfile].string
|
170
|
+
stdout = output[:stdout].string
|
171
|
+
stderr = output[:stderr].string
|
172
|
+
|
173
|
+
result = []
|
174
|
+
|
175
|
+
if error_in_exec == true
|
176
|
+
result << '================== LOGFILE ================== '
|
177
|
+
result << logfile if logfile.empty? == false
|
178
|
+
result << '================== STDOUT ================== '
|
179
|
+
result << stdout if stdout.empty? == false
|
180
|
+
result << '================== STDERR ================== '
|
181
|
+
result << stderr if stderr.empty? == false
|
182
|
+
elsif error_in_stdout == true
|
183
|
+
result << '================== STDOUT ================== '
|
184
|
+
result << stdout
|
185
|
+
end
|
186
|
+
|
187
|
+
return result
|
188
|
+
|
189
|
+
end
|
190
|
+
|
191
|
+
# Find error in stdout
|
192
|
+
#
|
193
|
+
# @return [Boolean] Returns true if it finds an error
|
194
|
+
def error_in_string_found? (keywords=[], string )
|
195
|
+
return false if keywords.empty? or not keywords.is_a? Array
|
196
|
+
return false if string.nil? or not string.is_a? String
|
197
|
+
|
198
|
+
error_found = false
|
199
|
+
keywords.each do |word|
|
200
|
+
if string.include? word
|
201
|
+
error_found = true
|
202
|
+
break
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
return error_found
|
207
|
+
|
208
|
+
end
|
209
|
+
|
210
|
+
# Generate the message which is return to the user
|
211
|
+
#
|
212
|
+
# @param [Boolean] run_successful true if a positive message should be returned
|
213
|
+
# @param [Array] msg Message which should be returned
|
214
|
+
def message(run_successful, *msg)
|
215
|
+
|
216
|
+
message = []
|
217
|
+
if run_successful
|
218
|
+
message << 'OK'.green.bold
|
219
|
+
else
|
220
|
+
message << 'FAILED'.red.bold
|
221
|
+
message.concat msg.flatten
|
222
|
+
end
|
223
|
+
|
224
|
+
return message.join("\n")
|
225
|
+
end
|
226
|
+
|
227
|
+
# Constructur to initiate a new command and run it later
|
228
|
+
#
|
229
|
+
# @see #initialize
|
230
|
+
def Command.execute(name,opts={})
|
231
|
+
command = new(name,opts)
|
232
|
+
command.run
|
233
|
+
|
234
|
+
return command
|
235
|
+
end
|
236
|
+
|
237
|
+
end
|
238
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# Main
|
2
|
+
module CommandExec
|
3
|
+
# Classed concerning pdflatex exceptions
|
4
|
+
module Exceptions
|
5
|
+
# Class used to indicate that a command
|
6
|
+
# could not be found in file system
|
7
|
+
class CommandNotFound < RuntimeError
|
8
|
+
end
|
9
|
+
|
10
|
+
# Class used to indicate that a command run
|
11
|
+
# ended with a failure
|
12
|
+
class ExecuteCommandFailed < RuntimeError
|
13
|
+
end
|
14
|
+
|
15
|
+
# Class used to indicate that a logfile
|
16
|
+
# could not be found in file system
|
17
|
+
class LogfileNotFound < RuntimeError
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module CommandExec
|
2
|
+
module SpecHelper
|
3
|
+
def capture_stderr(&block)
|
4
|
+
previous_stderr, $stderr = $stderr, StringIO.new
|
5
|
+
block.call
|
6
|
+
return $stderr.string
|
7
|
+
ensure
|
8
|
+
$stderr = previous_stderr
|
9
|
+
end
|
10
|
+
|
11
|
+
def capture_stdout(&block)
|
12
|
+
previous_stdout, $stdout = $stdout, StringIO.new
|
13
|
+
block.call
|
14
|
+
return $stdout.string
|
15
|
+
ensure
|
16
|
+
$stdout = previous_stdout
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/command_exec.rb
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Command do
|
4
|
+
let(:logger) {Logger.new('/dev/null')}
|
5
|
+
#let(:logger) {Logger.new($stdout)}
|
6
|
+
let(:debug) {false}
|
7
|
+
#let(:debug) {true}
|
8
|
+
let(:command) { Command.new(:echo , :debug=>debug, :logger => logger, :parameter => "hello world" , :error_keywords => %q[abc def], :working_directory => '/tmp' ) }
|
9
|
+
|
10
|
+
|
11
|
+
it "has a path" do
|
12
|
+
command.path.should == '/bin/echo'
|
13
|
+
end
|
14
|
+
|
15
|
+
it "has parameter" do
|
16
|
+
command.parameter.should == 'hello world'
|
17
|
+
end
|
18
|
+
|
19
|
+
it "has options" do
|
20
|
+
command.options.should == ''
|
21
|
+
end
|
22
|
+
|
23
|
+
it "offers the possibility to change the working directory of the process" do
|
24
|
+
command.working_directory.should == '/tmp'
|
25
|
+
Dir.pwd.should == '/tmp'
|
26
|
+
end
|
27
|
+
|
28
|
+
it "has special keywords indicating errors in stdout" do
|
29
|
+
command.error_keywords.should == %q[abc def]
|
30
|
+
end
|
31
|
+
|
32
|
+
it "can be used to construct a command string, which can be executed" do
|
33
|
+
command = Command.new(:pdflatex, :debug => debug, :logger => logger, :parameter => "index.tex blub.tex", :options => "-a -b")
|
34
|
+
command.send(:build_cmd_string).should == "/usr/bin/pdflatex -a -b index.tex blub.tex"
|
35
|
+
end
|
36
|
+
|
37
|
+
it "runs programms" do
|
38
|
+
command.run
|
39
|
+
command.result.should == true
|
40
|
+
end
|
41
|
+
|
42
|
+
it "returns the textual rep of a command" do
|
43
|
+
command.to_txt.should == '/bin/echo hello world'
|
44
|
+
end
|
45
|
+
|
46
|
+
it "execute existing programs" do
|
47
|
+
command = Command.execute(:echo, :debug => debug, :logger => logger ,:parameter => "index.tex blub.tex", :options => "-- -a -b")
|
48
|
+
command.result.should == true
|
49
|
+
end
|
50
|
+
|
51
|
+
it "does not execute non-existing programs" do
|
52
|
+
command = Command.execute(:grep, :debug => debug, :logger => logger, :parameter => "index.tex blub.tex", :options => "-- -a -b")
|
53
|
+
command.result.should == false
|
54
|
+
end
|
55
|
+
|
56
|
+
it "checks if errors have happend during execution" do
|
57
|
+
lambda { Command.new(:echo1, :debug => debug, :logger => logger, :parameter => "index.tex blub.tex", :options => "-- -a -b") }.should raise_error CommandNotFound
|
58
|
+
end
|
59
|
+
|
60
|
+
it "decides which output should be returned to the user" do
|
61
|
+
logfile = StringIO.new
|
62
|
+
logfile << 'Error in ... found'
|
63
|
+
|
64
|
+
stderr = StringIO.new
|
65
|
+
stderr << 'Error found'
|
66
|
+
|
67
|
+
stdout = StringIO.new
|
68
|
+
stdout << 'Error found'
|
69
|
+
|
70
|
+
#result = command.send(:help_logger)({ :error_in_exec => true , :error_in_stdout => false} , { :logfile => logfile, :stderr => stderr , :stdout => stdout })
|
71
|
+
result = command.send(:help_output, { :error_in_exec => true , :error_in_stdout => false} , { :logfile => logfile, :stderr => stderr , :stdout => stdout })
|
72
|
+
result.should == ["================== LOGFILE ================== ", "Error in ... found", "================== STDOUT ================== ", "Error found", "================== STDERR ================== ", "Error found"]
|
73
|
+
|
74
|
+
result = command.send(:help_output, { :error_in_exec => false , :error_in_stdout => true} , { :logfile => logfile, :stderr => stderr , :stdout => stdout })
|
75
|
+
result.should == ["================== STDOUT ================== ", "Error found"]
|
76
|
+
|
77
|
+
result = command.send(:help_output, { :error_in_exec => true , :error_in_stdout => true} , { :logfile => logfile, :stderr => stderr , :stdout => stdout })
|
78
|
+
result.should == ["================== LOGFILE ================== ", "Error in ... found", "================== STDOUT ================== ", "Error found", "================== STDERR ================== ", "Error found"]
|
79
|
+
|
80
|
+
|
81
|
+
result = command.send(:help_output, { :error_in_exec => false , :error_in_stdout => false} , { :logfile => logfile, :stderr => stderr , :stdout => stdout })
|
82
|
+
result.should == []
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
it "finds errors in stdout" do
|
87
|
+
command.send(:error_in_string_found?, ['error'] , 'long string witherror inside' ).should == true
|
88
|
+
command.send(:error_in_string_found?, ['long', 'inside'] , 'long string witherror inside' ).should == true
|
89
|
+
command.send(:error_in_string_found?, ['error'] , 'long string with erro inside' ).should == false
|
90
|
+
end
|
91
|
+
|
92
|
+
it "output a message" do
|
93
|
+
command.send(:message, false, 'Hello_world').should == "\e[1m\e[31mFAILED\e[0m\e[0m\nHello_world"
|
94
|
+
command.send(:message, true, 'Hello_world').should == "\e[1m\e[32mOK\e[0m\e[0m"
|
95
|
+
command.send(:message, true ).should == "\e[1m\e[32mOK\e[0m\e[0m"
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
|
100
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
$LOAD_PATH << File.expand_path('../lib' , File.dirname(__FILE__))
|
3
|
+
|
4
|
+
require 'pry'
|
5
|
+
require 'stringio'
|
6
|
+
|
7
|
+
require 'simplecov'
|
8
|
+
SimpleCov.start
|
9
|
+
|
10
|
+
require 'command_exec'
|
11
|
+
require 'command_exec/spec_helper_module'
|
12
|
+
|
13
|
+
include CommandExec
|
14
|
+
include CommandExec::Exceptions
|
15
|
+
|
16
|
+
RSpec.configure do |c|
|
17
|
+
c.include CommandExec::SpecHelper
|
18
|
+
end
|
19
|
+
|
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: command_exec
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Max Meyer
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-03-21 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: POpen4
|
16
|
+
requirement: &21841820 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *21841820
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: colored
|
27
|
+
requirement: &21889840 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *21889840
|
36
|
+
description: This adds bells and whistles to ease shell command execution
|
37
|
+
email:
|
38
|
+
- dev@fedux.org
|
39
|
+
executables: []
|
40
|
+
extensions: []
|
41
|
+
extra_rdoc_files: []
|
42
|
+
files:
|
43
|
+
- .gitignore
|
44
|
+
- Gemfile
|
45
|
+
- Gemfile.lock
|
46
|
+
- Guardfile
|
47
|
+
- README.md
|
48
|
+
- Rakefile
|
49
|
+
- command_exec.gemspec
|
50
|
+
- lib/command_exec.rb
|
51
|
+
- lib/command_exec/command.rb
|
52
|
+
- lib/command_exec/exceptions.rb
|
53
|
+
- lib/command_exec/spec_helper_module.rb
|
54
|
+
- lib/command_exec/version.rb
|
55
|
+
- spec/command/command_spec.rb
|
56
|
+
- spec/spec_helper.rb
|
57
|
+
homepage: ''
|
58
|
+
licenses: []
|
59
|
+
post_install_message:
|
60
|
+
rdoc_options: []
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ! '>='
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
requirements: []
|
76
|
+
rubyforge_project:
|
77
|
+
rubygems_version: 1.8.17
|
78
|
+
signing_key:
|
79
|
+
specification_version: 3
|
80
|
+
summary: Helper gem to exectue arbitrary shell commands
|
81
|
+
test_files:
|
82
|
+
- spec/command/command_spec.rb
|
83
|
+
- spec/spec_helper.rb
|
84
|
+
has_rdoc:
|