procession 0.0.1 → 0.0.2
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.md +13 -0
- data/lib/procession/process.rb +12 -11
- data/lib/procession/version.rb +1 -1
- data/procession.gemspec +2 -1
- data/spec/procession/example_app_with_child.rb +4 -0
- data/spec/procession/example_child_app.rb +10 -0
- data/spec/procession/procession_spec.rb +22 -7
- metadata +22 -3
data/README.md
CHANGED
@@ -1,3 +1,16 @@
|
|
1
1
|
# Procession
|
2
2
|
|
3
3
|
Runs a [child process](https://github.com/jarib/childprocess) and blocks until it writes something specific to stdout. Terminates the child process at exit time.
|
4
|
+
|
5
|
+
The following example blocks until __Server Started__ comes out of STDOUT as a result of executing __PORT=3455 /home/me/my\_project/bin/server__
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
require 'procession'
|
9
|
+
|
10
|
+
Procession::Process.new(
|
11
|
+
working_dir: '/home/me/my_project/bin',
|
12
|
+
command: './server',
|
13
|
+
environment: { PORT: 3455 },
|
14
|
+
await: /Server Started/
|
15
|
+
).start
|
16
|
+
```
|
data/lib/procession/process.rb
CHANGED
@@ -7,8 +7,9 @@ module Procession
|
|
7
7
|
@await = options.delete(:await)
|
8
8
|
@working_dir = options.delete(:working_dir)
|
9
9
|
@environment = options.delete(:environment)
|
10
|
+
@inherit_output = options.delete(:inherit_output)
|
10
11
|
end
|
11
|
-
|
12
|
+
|
12
13
|
def start
|
13
14
|
args = @command.split(' ')
|
14
15
|
@proc = ChildProcess.build(*args)
|
@@ -19,17 +20,17 @@ module Procession
|
|
19
20
|
r, w = IO.pipe
|
20
21
|
|
21
22
|
@proc.io.stdout = @proc.io.stderr = w
|
22
|
-
|
23
|
+
@proc.leader = true
|
23
24
|
@proc.start
|
24
25
|
w.close
|
25
|
-
|
26
|
+
|
26
27
|
all_output = ""
|
27
|
-
|
28
|
+
|
28
29
|
begin
|
29
30
|
started = false
|
30
31
|
until started
|
31
32
|
partial = r.readpartial(8192)
|
32
|
-
puts partial if
|
33
|
+
puts partial if @inherit_output
|
33
34
|
all_output << partial
|
34
35
|
if (all_output =~ @await)
|
35
36
|
started = true
|
@@ -38,20 +39,20 @@ module Procession
|
|
38
39
|
rescue EOFError
|
39
40
|
raise ProcessExitedError.new "The app process exited\nSTDOUT:\n#{all_output}"
|
40
41
|
end
|
41
|
-
|
42
|
+
|
42
43
|
Thread.new do
|
43
44
|
while true
|
44
45
|
partial = r.readpartial(8192)
|
45
|
-
puts partial if
|
46
|
+
puts partial if @inherit_output
|
46
47
|
end
|
47
48
|
end
|
48
|
-
|
49
|
+
|
49
50
|
at_exit do
|
50
51
|
@proc.stop
|
51
52
|
end
|
52
|
-
|
53
|
+
|
53
54
|
@proc.io.inherit!
|
54
|
-
|
55
|
+
|
55
56
|
@proc
|
56
57
|
end
|
57
58
|
|
@@ -65,6 +66,6 @@ module Procession
|
|
65
66
|
@proc.cwd = @working_dir unless @working_dir.nil?
|
66
67
|
end
|
67
68
|
end
|
68
|
-
|
69
|
+
|
69
70
|
class ProcessExitedError < RuntimeError; end
|
70
71
|
end
|
data/lib/procession/version.rb
CHANGED
data/procession.gemspec
CHANGED
@@ -14,7 +14,8 @@ Gem::Specification.new do |s|
|
|
14
14
|
s.platform = Gem::Platform::RUBY
|
15
15
|
|
16
16
|
s.add_runtime_dependency 'childprocess', '>= 0.3.8'
|
17
|
-
|
17
|
+
|
18
|
+
s.add_development_dependency 'rspec-core', '>= 3.1.0'
|
18
19
|
s.add_development_dependency 'rspec-expectations', '>= 2.0.1'
|
19
20
|
s.add_development_dependency 'rack', '>= 1.5.2'
|
20
21
|
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# creates a file called delete_me.txt after 0.5s
|
2
|
+
|
3
|
+
temp_filename = File.expand_path("../delete_me.txt", __FILE__)
|
4
|
+
|
5
|
+
sleep 0.5
|
6
|
+
|
7
|
+
File.open(temp_filename, 'w') do |f|
|
8
|
+
f.write("""This file is created by example_child_app.rb, which should
|
9
|
+
never actually happen, because the child process is killed.""")
|
10
|
+
end
|
@@ -3,23 +3,27 @@ require_relative '../../lib/procession/process'
|
|
3
3
|
module Procession
|
4
4
|
|
5
5
|
describe Process do
|
6
|
-
|
6
|
+
|
7
7
|
def example_app_path
|
8
8
|
File.join(File.dirname(__FILE__), "example_app.rb")
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
|
+
def example_app_with_child_path
|
12
|
+
File.join(File.dirname(__FILE__), "example_app_with_child.rb")
|
13
|
+
end
|
14
|
+
|
11
15
|
it 'runs a process and awaits some output' do
|
12
16
|
process = Process.new(command: "ruby #{example_app_path}", await: /#{Dir.pwd}/).start
|
13
17
|
process.should be_alive
|
14
18
|
process.stop
|
15
19
|
end
|
16
|
-
|
20
|
+
|
17
21
|
it 'sets environment variables' do
|
18
22
|
process = Process.new(command: "ruby #{example_app_path}", environment: { FOO: 'omg' }, await: /omg/).start
|
19
23
|
process.should be_alive
|
20
24
|
process.stop
|
21
25
|
end
|
22
|
-
|
26
|
+
|
23
27
|
it 'accepts a working directory' do
|
24
28
|
dir = File.dirname(__FILE__)
|
25
29
|
Dir.chdir dir do
|
@@ -29,14 +33,25 @@ module Procession
|
|
29
33
|
end
|
30
34
|
end
|
31
35
|
|
36
|
+
it 'kills the whole process tree' do
|
37
|
+
temp_path = File.join(File.dirname(__FILE__), "delete_me.txt")
|
38
|
+
File.delete(temp_path) if File.exist?(temp_path)
|
39
|
+
process = Process.new(command: "ruby #{example_app_with_child_path}",
|
40
|
+
await: /Starting child app/).start
|
41
|
+
sleep 0.2
|
42
|
+
process.stop
|
43
|
+
sleep 0.4
|
44
|
+
expect(File.exist?(temp_path)).to be_false
|
45
|
+
end
|
46
|
+
|
32
47
|
describe 'when the process exits' do
|
33
48
|
it 'raises an exception with the stdout output' do
|
34
|
-
lambda {
|
49
|
+
expect(lambda {
|
35
50
|
Process.new(command: 'pwd').start
|
36
|
-
}.
|
51
|
+
}).to raise_error("The app process exited\nSTDOUT:\n#{Dir.pwd}\n")
|
37
52
|
end
|
38
53
|
end
|
39
|
-
|
54
|
+
|
40
55
|
end
|
41
56
|
|
42
57
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: procession
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-12-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: childprocess
|
@@ -27,6 +27,22 @@ dependencies:
|
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: 0.3.8
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rspec-core
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 3.1.0
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 3.1.0
|
30
46
|
- !ruby/object:Gem::Dependency
|
31
47
|
name: rspec-expectations
|
32
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,6 +88,8 @@ files:
|
|
72
88
|
- lib/procession/version.rb
|
73
89
|
- procession.gemspec
|
74
90
|
- spec/procession/example_app.rb
|
91
|
+
- spec/procession/example_app_with_child.rb
|
92
|
+
- spec/procession/example_child_app.rb
|
75
93
|
- spec/procession/procession_spec.rb
|
76
94
|
homepage: http://github.com/featurist/procession
|
77
95
|
licenses: []
|
@@ -97,5 +115,6 @@ rubyforge_project:
|
|
97
115
|
rubygems_version: 1.8.24
|
98
116
|
signing_key:
|
99
117
|
specification_version: 3
|
100
|
-
summary: procession-0.0.
|
118
|
+
summary: procession-0.0.2
|
101
119
|
test_files: []
|
120
|
+
has_rdoc:
|