right_popen 1.0.5 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -41,8 +41,13 @@ to report issues.
41
41
 
42
42
  EM.run do
43
43
  EM.next_tick do
44
- cmd = "ruby -e \"puts 'some stdout text'; $stderr.puts 'some stderr text'\; exit 99\""
45
- RightScale.popen3(cmd, self, :on_read_stdout, :on_read_stderr, :on_exit)
44
+ command = "ruby -e \"puts 'some stdout text'; $stderr.puts 'some stderr text'\; exit 99\""
45
+ RightScale.popen3(:command => command,
46
+ :target => self,
47
+ :environment => nil,
48
+ :stdout_handler => :on_read_stdout,
49
+ :stderr_handler => :on_read_stderr,
50
+ :exit_handler => :on_exit)
46
51
  end
47
52
  timer = EM::PeriodicTimer.new(0.1) do
48
53
  if @exit_status
@@ -90,7 +95,7 @@ The build can be tested using the RSpec gem. Create a link to the installed
90
95
  under Windows) and run the following command from the gem directory to execute
91
96
  the RightPopen tests:
92
97
 
93
- spec spec/right_popen_spec.rb
98
+ rake spec
94
99
 
95
100
 
96
101
  == LICENSE
@@ -34,16 +34,18 @@ module RightScale
34
34
  module StdOutHandler
35
35
 
36
36
  # === Parameters
37
- # target(Object):: Object defining handler methods to be called.
38
- # stdout_handler(String):: Token for stdout handler method name.
39
- # exit_handler(String):: Token for exit handler method name.
37
+ # options[:target](Object):: Object defining handler methods to be called.
38
+ # options[:stdout_handler(String):: Token for stdout handler method name.
39
+ # options[:exit_handler(String):: Token for exit handler method name.
40
+ # options[:exec_file](String):: Path to executed file
40
41
  # stderr_eventable(Connector):: EM object representing stderr handler.
41
42
  # read_fd(IO):: Standard output read file descriptor.
42
43
  # write_fd(IO):: Standard output write file descriptor.
43
- def initialize(target, stdout_handler, exit_handler, stderr_eventable, read_fd, write_fd)
44
- @target = target
45
- @stdout_handler = stdout_handler
46
- @exit_handler = exit_handler
44
+ def initialize(options, stderr_eventable, read_fd, write_fd)
45
+ @target = options[:target]
46
+ @stdout_handler = options[:stdout_handler]
47
+ @exit_handler = options[:exit_handler]
48
+ @exec_file = options[:exec_file]
47
49
  @stderr_eventable = stderr_eventable
48
50
  # Just so they don't get GCed before the process goes away
49
51
  @read_fd = read_fd
@@ -59,6 +61,7 @@ module RightScale
59
61
  def unbind
60
62
  # We force the attached stderr handler to go away so that
61
63
  # we don't end up with a broken pipe
64
+ File.delete(@exec_file) if File.file?(@exec_file)
62
65
  @stderr_eventable.force_detach if @stderr_eventable
63
66
  @target.method(@exit_handler).call(get_status) if @exit_handler
64
67
  end
@@ -99,9 +102,19 @@ module RightScale
99
102
  # Forks process to run given command asynchronously, hooking all three
100
103
  # standard streams of the child process.
101
104
  #
105
+ # === Parameters
106
+ # options[:temp_dir]:: Path to temporary directory where executable files are
107
+ # created, default to /tmp if not specified
108
+ #
102
109
  # See RightScale.popen3
103
110
  def self.popen3_imp(options)
104
- cmd = options[:command].dup
111
+ # First write command to file so that it's possible to use popen3 with
112
+ # a bash command line (e.g. 'for i in 1 2 3 4 5; ...')
113
+ temp_dir = options[:temp_dir] || '/tmp'
114
+ exec_file = File.join(temp_dir, Time.new.to_i.to_s)
115
+ options[:exec_file] = exec_file
116
+ File.open(exec_file, 'w') { |f| f.puts options[:command] }
117
+ File.chmod(0700, exec_file)
105
118
  GC.start # To garbage collect open file descriptors from passed executions
106
119
  EM.next_tick do
107
120
  saved_stderr = $stderr.dup
@@ -120,7 +133,7 @@ module RightScale
120
133
  end
121
134
 
122
135
  # Launch child process
123
- EM.popen(cmd, StdOutHandler, options[:target], options[:stdout_handler], options[:exit_handler], c, r, w)
136
+ EM.popen(exec_file, StdOutHandler, options, c, r, w)
124
137
 
125
138
  # Restore environment variables
126
139
  unless envs.empty?
data/right_popen.gemspec CHANGED
@@ -1,14 +1,16 @@
1
1
  require 'rubygems'
2
2
 
3
- spec = Gem::Specification.new do |spec|
4
- is_windows = RUBY_PLATFORM =~ /mswin/
3
+ def is_windows?
4
+ return RUBY_PLATFORM =~ /mswin/
5
+ end
5
6
 
7
+ spec = Gem::Specification.new do |spec|
6
8
  spec.name = 'right_popen'
7
- spec.version = '1.0.5'
9
+ spec.version = '1.0.6'
8
10
  spec.authors = ['Scott Messier', 'Raphael Simon']
9
11
  spec.email = 'scott@rightscale.com'
10
12
  spec.homepage = 'https://github.com/rightscale/right_popen'
11
- if is_windows
13
+ if is_windows?
12
14
  spec.platform = 'x86-mswin32-60'
13
15
  else
14
16
  spec.platform = Gem::Platform::RUBY
@@ -27,7 +29,7 @@ of its internal mechanisms. The Linux implementation is valid for any Linux
27
29
  platform but there is also a native implementation for Windows platforms.
28
30
  EOF
29
31
 
30
- if is_windows
32
+ if is_windows?
31
33
  extension_dir = "ext,"
32
34
  else
33
35
  extension_dir = ""
@@ -38,7 +40,7 @@ EOF
38
40
  item.include?("Makefile") || item.include?(".obj") || item.include?(".pdb") || item.include?(".def") || item.include?(".exp") || item.include?(".lib")
39
41
  end
40
42
  candidates = candidates.delete_if do |item|
41
- if is_windows
43
+ if is_windows?
42
44
  item.include?("/linux/")
43
45
  else
44
46
  item.include?("/win32/")
@@ -46,9 +48,13 @@ EOF
46
48
  end
47
49
  spec.files = candidates.sort!
48
50
 
49
- # Current implementation supports > 0.12.8
51
+ # Current implementation supports >= 0.12.8
50
52
  spec.add_runtime_dependency(%q<eventmachine>, [">= 0.12.8"])
51
- if is_windows
53
+ if is_windows?
54
+ # Windows implementation currently depends on deprecated behavior from
55
+ # 0.12.8, but we also need to support the 0.12.8.1 patch version. the Linux
56
+ # side is free to use 0.12.10+
57
+ spec.add_runtime_dependency(%q<eventmachine>, ["< 0.12.9"])
52
58
  spec.add_runtime_dependency(%q<win32-process>, [">= 0.6.1"])
53
59
  end
54
60
  end
data/spec/print_env.rb CHANGED
@@ -1 +1,2 @@
1
- ENV.each { |k, v| $stdout.puts "#{k}=#{v}\n" }
1
+ puts "__test__=#{ENV['__test__']}" if ENV['__test__']
2
+ puts "PATH=#{ENV['PATH']}"
@@ -12,6 +12,10 @@ LARGE_OUTPUT_COUNTER = 1000
12
12
  # bump up count for most exhaustive leak detection.
13
13
  REPEAT_TEST_COUNTER = 256
14
14
 
15
+ def is_windows?
16
+ return RUBY_PLATFORM =~ /mswin/
17
+ end
18
+
15
19
  describe 'RightScale::popen3' do
16
20
 
17
21
  module RightPopenSpec
@@ -191,6 +195,26 @@ describe 'RightScale::popen3' do
191
195
  old_envs.each { |k, v| ENV[k].should == v }
192
196
  end
193
197
 
198
+ if is_windows?
199
+ # FIX: this behavior is currently specific to Windows but should probably be
200
+ # implemented for Linux.
201
+ it 'should merge the PATH variable instead of overriding it' do
202
+ command = "\"#{RUBY_CMD}\" \"#{File.expand_path(File.join(File.dirname(__FILE__), 'print_env.rb'))}\""
203
+ runner = RightPopenSpec::Runner.new
204
+ runner.run_right_popen(command, 'PATH' => "c:/bogus\\bin")
205
+ runner.status.exitstatus.should == 0
206
+ runner.output_text.should include('PATH=c:\\bogus\\bin;')
207
+ end
208
+ else
209
+ it 'should allow running bash command lines starting with a built-in command' do
210
+ command = "for i in 1 2 3 4 5; do echo $i;done"
211
+ runner = RightPopenSpec::Runner.new
212
+ runner.run_right_popen(command)
213
+ runner.status.exitstatus.should == 0
214
+ runner.output_text.should == "1\n2\n3\n4\n5\n"
215
+ end
216
+ end
217
+
194
218
  it 'should run repeatedly without leaking resources' do
195
219
  command = "\"#{RUBY_CMD}\" \"#{File.expand_path(File.join(File.dirname(__FILE__), 'produce_output.rb'))}\" \"#{STANDARD_MESSAGE}\" \"#{ERROR_MESSAGE}\""
196
220
  runner = RightPopenSpec::Runner.new
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: right_popen
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.5
4
+ version: 1.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Messier
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2010-02-19 00:00:00 -08:00
13
+ date: 2010-03-18 00:00:00 -07:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency