command_utils 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 55fdf974b8fe587df928b134b85230d1e2444658
4
+ data.tar.gz: 0972d50cb9c28dddfbf24e1fe2af7fd91efe716e
5
+ SHA512:
6
+ metadata.gz: 1cf38a61eea8bc39a2a4a229f90e74642e3d6022514215ec7d0093f70cb1761299a5ca901b4ae0af46954afa05bdda0c940003d561c5c2c611123df535050095
7
+ data.tar.gz: 74ed7398ded2e1cc63041a832ccdb9d7ecefd2a230a0a04921095ec38028c518b50181339744a72a253a816ae79a69bbbb8acdb989f21d99514ce26211976fe7
@@ -0,0 +1,18 @@
1
+ class CommandUtils
2
+
3
+ # Raised when executed command does not return 0
4
+ class NonZeroStatus < RuntimeError
5
+
6
+ # Command exit status
7
+ attr_accessor :status
8
+ # Command as passed to Process#spawn
9
+ attr_accessor :command
10
+
11
+ def initialize message, status, command
12
+ super message
13
+ @status, @command = status, command
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -0,0 +1,86 @@
1
+ require_relative 'command_utils/non_zero_status'
2
+
3
+ # Class to assist calling external commands, while processing its output and return code.
4
+ # All methods which execute given command, raise NonZeroStatus if its return is not 0.
5
+ class CommandUtils
6
+
7
+ # Takes command in same format supported by Process#spawn
8
+ def initialize *command
9
+ @command = command
10
+ end
11
+
12
+ # Execute command, yielding to given block, each time there is output.
13
+ # stream:: either +:stdout+ or +:stderr+.
14
+ # data:: data read from respective stream.
15
+ def each_output # :yields: stream, data
16
+ run do
17
+ loop do
18
+ io_list = [@stdout_read, @stderr_read].keep_if{|io| not io.closed?}
19
+ break if io_list.empty?
20
+ IO.select(io_list).first.each do |io|
21
+ if io.eof?
22
+ io.close
23
+ next
24
+ end
25
+ label = case io
26
+ when @stdout_read
27
+ :stdout
28
+ when @stderr_read
29
+ :stderr
30
+ end
31
+ yield label, io.read
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ # Execute command, logging its output to given Logger object.
38
+ # Must receive a hash, containing at least:
39
+ # +:logger+:: Logger instance.
40
+ # +:stdout_level+:: Logger level to log stdout.
41
+ # +:stderr_level+:: Logger level to log stderr.
42
+ # and optionally:
43
+ # +:stdout_prefix+:: Prefix to use for all stdout messages.
44
+ # +:stderr_prefix+:: Prefix to use for all stderr messages.
45
+ def logger_exec options
46
+ logger = options[:logger]
47
+ each_output do |stream, data|
48
+ level = options["#{stream}_level".to_sym]
49
+ prefix = options["#{stream}_prefix".to_sym]
50
+ logger.send(level, "#{prefix}#{data}")
51
+ end
52
+ end
53
+
54
+ private
55
+
56
+ def run
57
+ spawn
58
+ yield
59
+ process_status
60
+ end
61
+
62
+ def spawn
63
+ @stdout_read, @stdout_write = IO.pipe
64
+ @stderr_read, @stderr_write = IO.pipe
65
+ @pid = Process.spawn(
66
+ *@command,
67
+ in: :close,
68
+ out: @stdout_write.fileno,
69
+ err: @stderr_write.fileno,
70
+ close_others: true,
71
+ )
72
+ @stdout_write.close
73
+ @stderr_write.close
74
+ end
75
+
76
+ def process_status
77
+ Process.wait @pid
78
+ unless (status = $?.exitstatus) == 0
79
+ raise NonZeroStatus.new(
80
+ "Command exited with #{status}.",
81
+ status,
82
+ @command
83
+ )
84
+ end
85
+ end
86
+ end
metadata ADDED
@@ -0,0 +1,94 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: command_utils
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Fabio Pugliese Ornellas
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-04-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.2'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: guard-rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '4.5'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '4.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: guard-rdoc
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 1.0.3
51
+ type: :development
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '1.0'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 1.0.3
61
+ description: This Gem will help you call external commands, process its stdout and
62
+ stderr, to your own fit, and at the end, validate its return code.
63
+ email: fabio.ornellas@gmail.com
64
+ executables: []
65
+ extensions: []
66
+ extra_rdoc_files: []
67
+ files:
68
+ - lib/command_utils.rb
69
+ - lib/command_utils/non_zero_status.rb
70
+ homepage: https://github.com/fornellas/command_utils
71
+ licenses:
72
+ - GPL
73
+ metadata: {}
74
+ post_install_message:
75
+ rdoc_options: []
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ requirements: []
89
+ rubyforge_project:
90
+ rubygems_version: 2.4.5
91
+ signing_key:
92
+ specification_version: 4
93
+ summary: Simple Gem to assist running external commands an processing its outputs.
94
+ test_files: []