childprocess 0.1.9 → 0.2.0
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.
- data/{README.rdoc → README.md} +21 -16
- data/childprocess.gemspec +1 -0
- data/lib/childprocess/version.rb +1 -1
- data/lib/childprocess/windows/process.rb +18 -4
- data/spec/childprocess_spec.rb +13 -0
- metadata +18 -33
data/{README.rdoc → README.md}
RENAMED
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
childprocess
|
2
|
+
============
|
2
3
|
|
3
4
|
This gem aims at being a simple and reliable solution for controlling
|
4
5
|
external programs running in the background on any Ruby / OS combination.
|
@@ -6,26 +7,29 @@ external programs running in the background on any Ruby / OS combination.
|
|
6
7
|
The code originated in the selenium-webdriver gem, but should prove useful as
|
7
8
|
a standalone library.
|
8
9
|
|
9
|
-
|
10
|
+
Usage
|
11
|
+
-----
|
12
|
+
```ruby
|
13
|
+
process = ChildProcess.build("ruby", "-e", "sleep")
|
10
14
|
|
11
|
-
|
15
|
+
# inherit stdout/stderr from parent
|
16
|
+
process.io.inherit!
|
12
17
|
|
13
|
-
|
14
|
-
|
18
|
+
# or pass an IO
|
19
|
+
process.io.stdout = Tempfile.new("child-output")
|
15
20
|
|
16
|
-
|
17
|
-
process.io.stdout = Tempfile.new("child-output")
|
21
|
+
process.start
|
18
22
|
|
19
|
-
|
23
|
+
process.alive? #=> true
|
24
|
+
process.exited? #=> false
|
20
25
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
process.stop
|
26
|
+
process.stop
|
27
|
+
```
|
25
28
|
|
26
29
|
The object returned from ChildProcess.build will implement ChildProcess::AbstractProcess.
|
27
30
|
|
28
|
-
|
31
|
+
Implementation
|
32
|
+
--------------
|
29
33
|
|
30
34
|
How the process is launched and killed depends on the platform:
|
31
35
|
|
@@ -34,8 +38,8 @@ How the process is launched and killed depends on the platform:
|
|
34
38
|
* JRuby : java.lang.{Process,ProcessBuilder}
|
35
39
|
* IronRuby : System.Diagnostics.Process
|
36
40
|
|
37
|
-
|
38
|
-
|
41
|
+
Note on Patches/Pull Requests
|
42
|
+
-----------------------------
|
39
43
|
|
40
44
|
* Fork the project.
|
41
45
|
* Make your feature addition or bug fix.
|
@@ -45,6 +49,7 @@ How the process is launched and killed depends on the platform:
|
|
45
49
|
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
46
50
|
* Send me a pull request. Bonus points for topic branches.
|
47
51
|
|
48
|
-
|
52
|
+
Copyright
|
53
|
+
---------
|
49
54
|
|
50
55
|
Copyright (c) 2010-2011 Jari Bakken. See LICENSE for details.
|
data/childprocess.gemspec
CHANGED
data/lib/childprocess/version.rb
CHANGED
@@ -52,10 +52,7 @@ module ChildProcess
|
|
52
52
|
opts[:stderr] = @io.stderr
|
53
53
|
end
|
54
54
|
|
55
|
-
|
56
|
-
command = @args.join ' '
|
57
|
-
|
58
|
-
@pid = Lib.create_proc(command, opts)
|
55
|
+
@pid = Lib.create_proc(command_string, opts)
|
59
56
|
@handle = Handle.open(@pid)
|
60
57
|
|
61
58
|
if duplex?
|
@@ -65,6 +62,23 @@ module ChildProcess
|
|
65
62
|
self
|
66
63
|
end
|
67
64
|
|
65
|
+
def command_string
|
66
|
+
@command_string ||= (
|
67
|
+
@args.map { |arg| quote_if_necessary(arg.to_s) }.join ' '
|
68
|
+
)
|
69
|
+
end
|
70
|
+
|
71
|
+
def quote_if_necessary(str)
|
72
|
+
quote = str.start_with?('"') ? "'" : '"'
|
73
|
+
|
74
|
+
case str
|
75
|
+
when /[\s\\'"]/
|
76
|
+
%{#{quote}#{str}#{quote}}
|
77
|
+
else
|
78
|
+
str
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
68
82
|
end # Process
|
69
83
|
end # Windows
|
70
84
|
end # ChildProcess
|
data/spec/childprocess_spec.rb
CHANGED
@@ -165,4 +165,17 @@ describe ChildProcess do
|
|
165
165
|
Dir.rmdir(path) if File.exist?(path)
|
166
166
|
end
|
167
167
|
end
|
168
|
+
|
169
|
+
it "can handle whitespace, special characters and quotes in arguments" do
|
170
|
+
args = ["foo bar", 'foo\bar', "'i-am-quoted'", '"i am double quoted"']
|
171
|
+
|
172
|
+
Tempfile.open("argv-spec") do |file|
|
173
|
+
process = write_argv(file.path, *args).start
|
174
|
+
process.poll_for_exit(EXIT_TIMEOUT)
|
175
|
+
|
176
|
+
file.rewind
|
177
|
+
file.read.should == args.inspect
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
168
181
|
end
|
metadata
CHANGED
@@ -1,13 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: childprocess
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 9
|
10
|
-
version: 0.1.9
|
4
|
+
prerelease:
|
5
|
+
version: 0.2.0
|
11
6
|
platform: ruby
|
12
7
|
authors:
|
13
8
|
- Jari Bakken
|
@@ -15,8 +10,7 @@ autorequire:
|
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
12
|
|
18
|
-
date: 2011-
|
19
|
-
default_executable:
|
13
|
+
date: 2011-07-20 00:00:00 Z
|
20
14
|
dependencies:
|
21
15
|
- !ruby/object:Gem::Dependency
|
22
16
|
name: rspec
|
@@ -26,11 +20,6 @@ dependencies:
|
|
26
20
|
requirements:
|
27
21
|
- - ">="
|
28
22
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 15
|
30
|
-
segments:
|
31
|
-
- 2
|
32
|
-
- 0
|
33
|
-
- 0
|
34
23
|
version: 2.0.0
|
35
24
|
type: :development
|
36
25
|
version_requirements: *id001
|
@@ -42,28 +31,31 @@ dependencies:
|
|
42
31
|
requirements:
|
43
32
|
- - ">="
|
44
33
|
- !ruby/object:Gem::Version
|
45
|
-
hash: 3
|
46
|
-
segments:
|
47
|
-
- 0
|
48
34
|
version: "0"
|
49
35
|
type: :development
|
50
36
|
version_requirements: *id002
|
51
37
|
- !ruby/object:Gem::Dependency
|
52
|
-
name:
|
38
|
+
name: rake
|
53
39
|
prerelease: false
|
54
40
|
requirement: &id003 !ruby/object:Gem::Requirement
|
55
41
|
none: false
|
56
42
|
requirements:
|
57
43
|
- - ~>
|
58
44
|
- !ruby/object:Gem::Version
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
45
|
+
version: 0.8.7
|
46
|
+
type: :development
|
47
|
+
version_requirements: *id003
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: ffi
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ~>
|
55
|
+
- !ruby/object:Gem::Version
|
64
56
|
version: 1.0.6
|
65
57
|
type: :runtime
|
66
|
-
version_requirements: *
|
58
|
+
version_requirements: *id004
|
67
59
|
description: This gem aims at being a simple and reliable solution for controlling external programs running in the background on any Ruby / OS combination.
|
68
60
|
email:
|
69
61
|
- jari.bakken@gmail.com
|
@@ -79,7 +71,7 @@ files:
|
|
79
71
|
- .rspec
|
80
72
|
- Gemfile
|
81
73
|
- LICENSE
|
82
|
-
- README.
|
74
|
+
- README.md
|
83
75
|
- Rakefile
|
84
76
|
- childprocess.gemspec
|
85
77
|
- lib/childprocess.rb
|
@@ -111,7 +103,6 @@ files:
|
|
111
103
|
- spec/spec_helper.rb
|
112
104
|
- spec/unix_spec.rb
|
113
105
|
- spec/windows_spec.rb
|
114
|
-
has_rdoc: true
|
115
106
|
homepage: http://github.com/jarib/childprocess
|
116
107
|
licenses: []
|
117
108
|
|
@@ -125,23 +116,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
125
116
|
requirements:
|
126
117
|
- - ">="
|
127
118
|
- !ruby/object:Gem::Version
|
128
|
-
hash: 3
|
129
|
-
segments:
|
130
|
-
- 0
|
131
119
|
version: "0"
|
132
120
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
133
121
|
none: false
|
134
122
|
requirements:
|
135
123
|
- - ">="
|
136
124
|
- !ruby/object:Gem::Version
|
137
|
-
hash: 3
|
138
|
-
segments:
|
139
|
-
- 0
|
140
125
|
version: "0"
|
141
126
|
requirements: []
|
142
127
|
|
143
128
|
rubyforge_project: childprocess
|
144
|
-
rubygems_version: 1.
|
129
|
+
rubygems_version: 1.8.5
|
145
130
|
signing_key:
|
146
131
|
specification_version: 3
|
147
132
|
summary: This gem aims at being a simple and reliable solution for controlling external programs running in the background on any Ruby / OS combination.
|