right_popen 1.0.21-x86-mswin32-60 → 1.1.3-x86-mswin32-60

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.
@@ -22,103 +22,195 @@
22
22
  #++
23
23
 
24
24
  module RightScale
25
- class Runner
26
- class RunnerStatus
27
- def initialize(command, options={}, &callback)
28
- options = {:force_yield=>nil, :timeout=>nil, :expect_timeout=>false}.merge(options)
29
- @output_text = ""
30
- @error_text = ""
31
- @status = nil
32
- @did_timeout = false
33
- @callback = callback
34
- @pid = nil
35
- @force_yield = options[:force_yield]
36
- EM.next_tick do
37
- @timeout = EM::Timer.new(options[:timeout] || 2) do
38
- puts "\n** Failed to run #{command.inspect}: Timeout" unless options[:expect_timeout]
39
- @did_timeout = true
40
- @callback.call(self) if options[:expect_timeout]
41
- end
25
+ module RightPopen
26
+ class Runner
27
+ class RunnerStatus
28
+ def initialize(command, options={}, &callback)
29
+ options = {:repeats=>1, :force_yield=>nil, :timeout=>nil, :expect_timeout=>false}.merge(options)
30
+
31
+ @command = command
32
+ @output_text = ""
33
+ @error_text = ""
34
+ @status = nil
35
+ @did_timeout = false
36
+ @callback = callback
37
+ @pid = nil
38
+ @force_yield = options[:force_yield]
39
+
40
+ @expect_timeout = options[:expect_timeout]
41
+ @expect_size_limit = options[:expect_size_limit]
42
42
  end
43
- end
44
43
 
45
- attr_accessor :output_text, :error_text, :status, :did_timeout, :pid
44
+ attr_accessor :output_text, :error_text, :status, :pid
45
+ attr_accessor :did_timeout, :did_size_limit
46
46
 
47
- def on_read_stdout(data)
48
- sleep @force_yield if @force_yield
49
- @output_text << data
50
- end
47
+ def on_read_stdout(data)
48
+ sleep @force_yield if @force_yield
49
+ @output_text << data
50
+ end
51
51
 
52
- def on_read_stderr(data)
53
- sleep @force_yield if @force_yield
54
- @error_text << data
55
- end
52
+ def on_read_stderr(data)
53
+ sleep @force_yield if @force_yield
54
+ @error_text << data
55
+ end
56
+
57
+ def on_pid(pid)
58
+ raise "PID already set!" unless @pid.nil?
59
+ @pid = pid
60
+ end
61
+
62
+ def on_timeout
63
+ puts "\n** Failed to run #{@command.inspect}: Timeout" unless @expect_timeout
64
+ @did_timeout = true
65
+ @callback.call(self) if @expect_timeout
66
+ end
67
+
68
+ def on_size_limit
69
+ puts "\n** Failed to run #{@command.inspect}: Size limit" unless @expect_size_limit
70
+ @did_size_limit = true
71
+ @callback.call(self) if @expect_size_limit
72
+ end
56
73
 
57
- def on_pid(pid)
58
- raise "PID already set!" unless @pid.nil?
59
- @pid = pid
74
+ def on_exit(status)
75
+ @status = status
76
+ @callback.call(self)
77
+ end
60
78
  end
61
79
 
62
- def on_exit(status)
63
- @timeout.cancel if @timeout
64
- @status = status
65
- @callback.call(self)
80
+ def initialize
81
+ @count = 0
82
+ @done = false
83
+ @last_exception = nil
84
+ @last_iteration = 0
66
85
  end
67
- end
68
86
 
69
- def initialize
70
- @count = 0
71
- @done = false
72
- @last_exception = nil
73
- @last_iteration = 0
74
- end
87
+ def run_right_popen3(synchronicity, command, runner_options={}, &callback)
88
+ runner_options = {
89
+ :repeats => 1,
90
+ :expect_timeout => false,
91
+ :expect_size_limit => false
92
+ }.merge(runner_options)
93
+ popen3_options = {
94
+ :input => runner_options[:input],
95
+ :environment => runner_options[:env],
96
+ :timeout_seconds => runner_options.has_key?(:timeout) ? runner_options[:timeout] : 2,
97
+ :size_limit_bytes => runner_options[:size_limit_bytes],
98
+ :watch_directory => runner_options[:watch_directory]
99
+ }
100
+ case synchronicity
101
+ when :sync
102
+ run_right_popen3_sync(command, runner_options, popen3_options, &callback)
103
+ when :async
104
+ run_right_popen3_async(command, runner_options, popen3_options, &callback)
105
+ else
106
+ raise "unknown synchronicity = #{synchronicity.inspect}"
107
+ end
108
+ end
75
109
 
76
- def do_right_popen(command, options={}, &callback)
77
- options = {:env=>nil, :input=>nil, :timeout=>nil, :force_yield=>nil, :expect_timeout=>false}.merge(options)
78
- status = RunnerStatus.new(command, options, &callback)
79
- RightScale.popen3(:command => command,
80
- :input => options[:input],
81
- :target => status,
82
- :environment => options[:env],
83
- :stdout_handler => :on_read_stdout,
84
- :stderr_handler => :on_read_stderr,
85
- :pid_handler => :on_pid,
86
- :exit_handler => :on_exit)
87
- status
88
- end
110
+ def run_right_popen3_sync(command, runner_options, popen3_options, &callback)
111
+ begin
112
+ @iterations = 0
113
+ @repeats = runner_options[:repeats]
114
+ @stats = []
115
+ while @iterations < @repeats
116
+ @iterations += 1
117
+ do_right_popen3_sync(command, runner_options, popen3_options) do |runner_status|
118
+ @stats << runner_status
119
+ callback.call(runner_status) if callback
120
+ if @repeats > 1
121
+ puts if 1 == (@iterations % 64)
122
+ print '+'
123
+ puts if @iterations == @repeats
124
+ end
125
+ end
126
+ end
127
+ @stats.uniq!
128
+ @stats.size < 2 ? @stats.first : @stats
129
+ rescue Exception => e
130
+ puts "\n** Failed: #{e.message} FROM\n#{e.backtrace.join("\n")}"
131
+ raise e
132
+ end
133
+ end
89
134
 
90
- def run_right_popen(command, options={}, &callback)
91
- options = {:repeats=>1, :env=>nil, :input=>nil, :timeout=>nil, :force_yield=>nil, :expect_timeout=>false}.merge(options)
92
- begin
93
- @iterations = 0
94
- @repeats = options[:repeats]
95
- @stats = []
96
- EM.run do
97
- EM.defer do
98
- do_right_popen(command, options) do |status|
99
- maybe_continue(status, command, options, &callback)
135
+ def run_right_popen3_async(command, runner_options, popen3_options, &callback)
136
+ begin
137
+ @iterations = 0
138
+ @repeats = runner_options[:repeats]
139
+ @stats = []
140
+ EM.run do
141
+ EM.defer do
142
+ begin
143
+ do_right_popen3_async(command, runner_options, popen3_options) do |runner_status|
144
+ maybe_continue_popen3_async(runner_status, command, runner_options, popen3_options, &callback)
145
+ end
146
+ rescue Exception => e
147
+ puts e.class, e.message, e.backtrace.join("\n")
148
+ EM.stop
149
+ end
100
150
  end
101
151
  end
152
+ @stats.uniq!
153
+ @stats.size < 2 ? @stats.first : @stats
154
+ rescue Exception => e
155
+ puts "\n** Failed: #{e.message} FROM\n#{e.backtrace.join("\n")}"
156
+ raise e
102
157
  end
103
- @stats.size < 2 ? @stats.first : @stats
104
- rescue Exception => e
105
- puts "\n** Failed: #{e.message} FROM\n#{e.backtrace.join("\n")}"
106
- raise e
107
158
  end
108
- end
109
159
 
110
- def maybe_continue(status, command, options, &callback)
111
- @iterations += 1
112
- @stats << status
113
- callback.call(status) if callback
114
- if @iterations < @repeats
115
- EM.defer do
116
- do_right_popen(command, options) do |status|
117
- maybe_continue(status, command, options, &callback)
160
+ def do_right_popen3(synchronicity, command, runner_options, popen3_options, &callback)
161
+ runner_status = RunnerStatus.new(command, runner_options, &callback)
162
+ popen3_options = {
163
+ :target => runner_status,
164
+ :stdout_handler => :on_read_stdout,
165
+ :stderr_handler => :on_read_stderr,
166
+ :pid_handler => :on_pid,
167
+ :timeout_handler => :on_timeout,
168
+ :size_limit_handler => :on_size_limit,
169
+ :exit_handler => :on_exit
170
+ }.merge(popen3_options)
171
+ case synchronicity
172
+ when :sync
173
+ result = ::RightScale::RightPopen.popen3_sync(command, popen3_options)
174
+ when :async
175
+ result = ::RightScale::RightPopen.popen3_async(command, popen3_options)
176
+ else
177
+ raise "Uknown synchronicity = #{synchronicity.inspect}"
178
+ end
179
+ result.should == true
180
+ true
181
+ end
182
+
183
+ def do_right_popen3_sync(command, runner_options, popen3_options, &callback)
184
+ do_right_popen3(:sync, command, runner_options, popen3_options, &callback)
185
+ end
186
+
187
+ def do_right_popen3_async(command, runner_options, popen3_options, &callback)
188
+ do_right_popen3(:async, command, runner_options, popen3_options, &callback)
189
+ end
190
+
191
+ def maybe_continue_popen3_async(runner_status, command, runner_options, popen3_options, &callback)
192
+ @iterations += 1
193
+ @stats << runner_status
194
+ callback.call(runner_status) if callback
195
+ if @iterations < @repeats
196
+ if @repeats > 1
197
+ puts if 1 == (@iterations % 64)
198
+ print '+'
199
+ puts if @iterations == @repeats
200
+ end
201
+ EM.defer do
202
+ begin
203
+ do_right_popen3_async(command, runner_options, popen3_options) do |runner_status2|
204
+ maybe_continue_popen3_async(runner_status2, command, runner_options, popen3_options, &callback)
205
+ end
206
+ rescue Exception => e
207
+ puts e.class, e.message, e.backtrace.join("\n")
208
+ EM.stop
209
+ end
118
210
  end
211
+ else
212
+ EM.stop
119
213
  end
120
- else
121
- EM.stop
122
214
  end
123
215
  end
124
216
  end
@@ -0,0 +1,35 @@
1
+ #-- -*- mode: ruby; encoding: utf-8 -*-
2
+ # Copyright: Copyright (c) 2011 RightScale, Inc.
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # 'Software'), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18
+ # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19
+ # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21
+ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ REPEATS = (ARGV[0] || '4').to_i
25
+
26
+ STDOUT.sync = true
27
+ STDERR.sync = true
28
+ REPEATS.times do |i|
29
+ STDOUT.puts "To sleep... #{i}"
30
+ STDERR.puts "Perchance to dream... #{i}"
31
+ sleep 1
32
+ end
33
+ STDOUT.puts "The sleeper must awaken."
34
+
35
+ exit 0
@@ -23,6 +23,6 @@
23
23
 
24
24
  $stderr.puts "Closing stdout"
25
25
  STDOUT.close
26
- sleep 3
26
+ sleep 15
27
27
  $stderr.puts "Exiting"
28
28
  exit 0
@@ -0,0 +1,34 @@
1
+ #-- -*- mode: ruby; encoding: utf-8 -*-
2
+ # Copyright: Copyright (c) 2011 RightScale, Inc.
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # 'Software'), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18
+ # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19
+ # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21
+ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ watched_dir = ARGV[0]
25
+
26
+ 10.times do |i|
27
+ path = ::File.join(watched_dir, "file#{i}.txt")
28
+ ::File.open(path, 'w') do |f|
29
+ f.write 'x' * 100
30
+ end
31
+ sleep 0.2
32
+ end
33
+
34
+ exit 0
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: right_popen
3
3
  version: !ruby/object:Gem::Version
4
- hash: 61
5
- prerelease: false
4
+ hash: 21
5
+ prerelease:
6
6
  segments:
7
7
  - 1
8
- - 0
9
- - 21
10
- version: 1.0.21
8
+ - 1
9
+ - 3
10
+ version: 1.1.3
11
11
  platform: x86-mswin32-60
12
12
  authors:
13
13
  - Scott Messier
@@ -17,8 +17,7 @@ autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
19
 
20
- date: 2012-04-25 00:00:00 -07:00
21
- default_executable:
20
+ date: 2013-07-17 00:00:00 Z
22
21
  dependencies:
23
22
  - !ruby/object:Gem::Dependency
24
23
  name: eventmachine
@@ -28,13 +27,13 @@ dependencies:
28
27
  requirements:
29
28
  - - ">="
30
29
  - !ruby/object:Gem::Version
31
- hash: 57
30
+ hash: 23
32
31
  segments:
32
+ - 1
33
33
  - 0
34
- - 12
35
- - 11
36
- version: 0.12.11
37
- type: :runtime
34
+ - 0
35
+ version: 1.0.0
36
+ type: :development
38
37
  version_requirements: *id001
39
38
  - !ruby/object:Gem::Dependency
40
39
  name: win32-process
@@ -118,8 +117,15 @@ files:
118
117
  - ext/win32/right_popen.c
119
118
  - ext/win32/right_popen.h
120
119
  - lib/right_popen.rb
120
+ - lib/right_popen/process_base.rb
121
+ - lib/right_popen/process_status.rb
122
+ - lib/right_popen/safe_output_buffer.rb
123
+ - lib/right_popen/target_proxy.rb
121
124
  - lib/right_popen/version.rb
122
- - lib/right_popen/win32/right_popen.rb
125
+ - lib/right_popen/win32/popen3_async.rb
126
+ - lib/right_popen/win32/popen3_sync.rb
127
+ - lib/right_popen/win32/process.rb
128
+ - lib/right_popen/win32/right_popen_ex.rb
123
129
  - lib/win32/right_popen.so
124
130
  - right_popen.gemspec
125
131
  - spec/background.rb
@@ -130,11 +136,13 @@ files:
130
136
  - spec/produce_status.rb
131
137
  - spec/produce_stderr_only.rb
132
138
  - spec/produce_stdout_only.rb
139
+ - spec/right_popen/safe_output_buffer_spec.rb
133
140
  - spec/right_popen_spec.rb
134
141
  - spec/runner.rb
142
+ - spec/sleeper.rb
135
143
  - spec/spec_helper.rb
136
144
  - spec/stdout.rb
137
- has_rdoc: true
145
+ - spec/writer.rb
138
146
  homepage: https://github.com/rightscale/right_popen
139
147
  licenses: []
140
148
 
@@ -169,7 +177,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
169
177
  requirements: []
170
178
 
171
179
  rubyforge_project: right_popen
172
- rubygems_version: 1.3.7
180
+ rubygems_version: 1.8.25
173
181
  signing_key:
174
182
  specification_version: 3
175
183
  summary: Provides a platform-independent popen implementation