foreman 0.27.0 → 0.37.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.
Files changed (38) hide show
  1. data/README.md +39 -0
  2. data/bin/runner +36 -0
  3. data/data/export/bluepill/master.pill.erb +3 -3
  4. data/lib/foreman/cli.rb +34 -32
  5. data/lib/foreman/engine.rb +97 -78
  6. data/lib/foreman/export/base.rb +12 -5
  7. data/lib/foreman/export/bluepill.rb +5 -7
  8. data/lib/foreman/export/inittab.rb +11 -13
  9. data/lib/foreman/export/runit.rb +24 -25
  10. data/lib/foreman/export/upstart.rb +9 -11
  11. data/lib/foreman/export.rb +21 -0
  12. data/lib/foreman/helpers.rb +45 -0
  13. data/lib/foreman/process.rb +88 -6
  14. data/lib/foreman/procfile.rb +8 -7
  15. data/lib/foreman/procfile_entry.rb +22 -0
  16. data/lib/foreman/utils.rb +4 -1
  17. data/lib/foreman/version.rb +1 -1
  18. data/lib/foreman.rb +13 -1
  19. data/man/foreman.1 +5 -1
  20. data/spec/foreman/cli_spec.rb +77 -7
  21. data/spec/foreman/engine_spec.rb +13 -26
  22. data/spec/foreman/export/base_spec.rb +22 -0
  23. data/spec/foreman/export/bluepill_spec.rb +23 -7
  24. data/spec/foreman/export/inittab_spec.rb +40 -0
  25. data/spec/foreman/export/runit_spec.rb +18 -12
  26. data/spec/foreman/export/upstart_spec.rb +40 -8
  27. data/spec/foreman/export_spec.rb +22 -0
  28. data/spec/foreman/helpers_spec.rb +26 -0
  29. data/spec/foreman/process_spec.rb +131 -2
  30. data/spec/foreman_spec.rb +8 -7
  31. data/spec/helper_spec.rb +18 -0
  32. data/spec/resources/export/bluepill/app-concurrency.pill +47 -0
  33. data/spec/resources/export/bluepill/app.pill +1 -22
  34. data/spec/resources/export/inittab/inittab.concurrency +4 -0
  35. data/spec/resources/export/inittab/inittab.default +4 -0
  36. data/spec/spec_helper.rb +31 -3
  37. metadata +19 -15
  38. data/README.markdown +0 -49
@@ -3,33 +3,39 @@ require "foreman/engine"
3
3
  require "foreman/export/runit"
4
4
  require "tmpdir"
5
5
 
6
- describe Foreman::Export::Runit do
6
+ describe Foreman::Export::Runit, :fakefs do
7
7
  let(:procfile) { FileUtils.mkdir_p("/tmp/app"); write_procfile("/tmp/app/Procfile", 'bar=baz') }
8
8
  let(:engine) { Foreman::Engine.new(procfile) }
9
- let(:runit) { Foreman::Export::Runit.new(engine) }
10
-
9
+ let(:runit) { Foreman::Export::Runit.new('/tmp/init', engine, :concurrency => 'alpha=2,bravo=1') }
10
+
11
11
  before(:each) { load_export_templates_into_fakefs("runit") }
12
12
  before(:each) { stub(runit).say }
13
-
13
+ before(:each) { stub(FakeFS::FileUtils).chmod }
14
+
14
15
  it "exports to the filesystem" do
15
16
  FileUtils.mkdir_p('/tmp/init')
16
- runit.export('/tmp/init', :concurrency => 'alpha=2')
17
-
17
+
18
+ runit.export
19
+
18
20
  File.read("/tmp/init/app-alpha-1/run").should == example_export_file('runit/app-alpha-1-run')
19
- File.read("/tmp/init/app-alpha-1/log/run").should ==
21
+ File.read("/tmp/init/app-alpha-1/log/run").should ==
20
22
  example_export_file('runit/app-alpha-1-log-run')
21
23
  File.read("/tmp/init/app-alpha-1/env/PORT").should == "5000\n"
22
24
  File.read("/tmp/init/app-alpha-1/env/BAR").should == "baz\n"
23
-
25
+
24
26
  File.read("/tmp/init/app-alpha-2/run").should == example_export_file('runit/app-alpha-2-run')
25
- File.read("/tmp/init/app-alpha-2/log/run").should ==
27
+ File.read("/tmp/init/app-alpha-2/log/run").should ==
26
28
  example_export_file('runit/app-alpha-2-log-run')
27
29
  File.read("/tmp/init/app-alpha-2/env/PORT").should == "5001\n"
28
30
  File.read("/tmp/init/app-alpha-2/env/BAR").should == "baz\n"
29
-
31
+
30
32
  File.read("/tmp/init/app-bravo-1/run").should == example_export_file('runit/app-bravo-1-run')
31
- File.read("/tmp/init/app-bravo-1/log/run").should ==
33
+ File.read("/tmp/init/app-bravo-1/log/run").should ==
32
34
  example_export_file('runit/app-bravo-1-log-run')
33
35
  File.read("/tmp/init/app-bravo-1/env/PORT").should == "5100\n"
34
36
  end
35
- end
37
+
38
+ it "creates a full path to the export directory" do
39
+ expect { runit.export }.to_not raise_error(Errno::ENOENT)
40
+ end
41
+ end
@@ -3,27 +3,53 @@ require "foreman/engine"
3
3
  require "foreman/export/upstart"
4
4
  require "tmpdir"
5
5
 
6
- describe Foreman::Export::Upstart do
6
+ describe Foreman::Export::Upstart, :fakefs do
7
7
  let(:procfile) { FileUtils.mkdir_p("/tmp/app"); write_procfile("/tmp/app/Procfile") }
8
- let(:engine) { Foreman::Engine.new(procfile) }
9
- let(:upstart) { Foreman::Export::Upstart.new(engine) }
8
+ let(:engine) { Foreman::Engine.new(procfile) }
9
+ let(:options) { Hash.new }
10
+ let(:upstart) { Foreman::Export::Upstart.new("/tmp/init", engine, options) }
10
11
 
11
12
  before(:each) { load_export_templates_into_fakefs("upstart") }
12
13
  before(:each) { stub(upstart).say }
13
14
 
14
15
  it "exports to the filesystem" do
15
- upstart.export("/tmp/init", :concurrency => "alpha=2")
16
+ upstart.export
16
17
 
17
18
  File.read("/tmp/init/app.conf").should == example_export_file("upstart/app.conf")
18
19
  File.read("/tmp/init/app-alpha.conf").should == example_export_file("upstart/app-alpha.conf")
19
20
  File.read("/tmp/init/app-alpha-1.conf").should == example_export_file("upstart/app-alpha-1.conf")
20
- File.read("/tmp/init/app-alpha-2.conf").should == example_export_file("upstart/app-alpha-2.conf")
21
21
  File.read("/tmp/init/app-bravo.conf").should == example_export_file("upstart/app-bravo.conf")
22
22
  File.read("/tmp/init/app-bravo-1.conf").should == example_export_file("upstart/app-bravo-1.conf")
23
23
  end
24
24
 
25
+ it "cleans up if exporting into an existing dir" do
26
+ mock(FileUtils).rm("/tmp/init/app.conf")
27
+ mock(FileUtils).rm("/tmp/init/app-alpha.conf")
28
+ mock(FileUtils).rm("/tmp/init/app-alpha-1.conf")
29
+ mock(FileUtils).rm("/tmp/init/app-bravo.conf")
30
+ mock(FileUtils).rm("/tmp/init/app-bravo-1.conf")
31
+
32
+ upstart.export
33
+ upstart.export
34
+ end
35
+
36
+ context "with concurrency" do
37
+ let(:options) { Hash[:concurrency => "alpha=2"] }
38
+
39
+ it "exports to the filesystem with concurrency" do
40
+ upstart.export
41
+
42
+ File.read("/tmp/init/app.conf").should == example_export_file("upstart/app.conf")
43
+ File.read("/tmp/init/app-alpha.conf").should == example_export_file("upstart/app-alpha.conf")
44
+ File.read("/tmp/init/app-alpha-1.conf").should == example_export_file("upstart/app-alpha-1.conf")
45
+ File.read("/tmp/init/app-alpha-2.conf").should == example_export_file("upstart/app-alpha-2.conf")
46
+ File.exists?("/tmp/init/app-bravo-1.conf").should == false
47
+ end
48
+ end
49
+
25
50
  context "with alternate templates" do
26
51
  let(:template_root) { "/tmp/alternate" }
52
+ let(:upstart) { Foreman::Export::Upstart.new("/tmp/init", engine, :template => template_root) }
27
53
 
28
54
  before do
29
55
  FileUtils.mkdir_p template_root
@@ -31,22 +57,28 @@ describe Foreman::Export::Upstart do
31
57
  end
32
58
 
33
59
  it "can export with alternate template files" do
34
- upstart.export("/tmp/init", :template => template_root)
60
+ upstart.export
35
61
 
36
62
  File.read("/tmp/init/app.conf").should == "alternate_template\n"
37
63
  end
38
64
  end
39
65
 
40
66
  context "with alternate templates from home dir" do
41
- let(:default_template_root) {File.expand_path("~/.foreman/templates")}
67
+ let(:default_template_root) {File.expand_path("#{ENV['HOME']}/.foreman/templates")}
42
68
 
43
69
  before do
70
+ ENV['_FOREMAN_SPEC_HOME'] = ENV['HOME']
71
+ ENV['HOME'] = "/home/appuser"
44
72
  FileUtils.mkdir_p default_template_root
45
73
  File.open("#{default_template_root}/master.conf.erb", "w") { |f| f.puts "default_alternate_template" }
46
74
  end
47
75
 
76
+ after do
77
+ ENV['HOME'] = ENV.delete('_FOREMAN_SPEC_HOME')
78
+ end
79
+
48
80
  it "can export with alternate template files" do
49
- upstart.export("/tmp/init")
81
+ upstart.export
50
82
 
51
83
  File.read("/tmp/init/app.conf").should == "default_alternate_template\n"
52
84
  end
@@ -1,2 +1,24 @@
1
1
  require "spec_helper"
2
2
  require "foreman/export"
3
+
4
+ describe "Foreman::Export" do
5
+ subject { Foreman::Export }
6
+
7
+ describe "with a formatter that doesn't declare the appropriate class" do
8
+ it "prints an error" do
9
+ mock(subject).require("foreman/export/invalidformatter")
10
+ mock_export_error("Unknown export format: invalidformatter (no class Foreman::Export::Invalidformatter).") do
11
+ subject.formatter("invalidformatter")
12
+ end
13
+ end
14
+ end
15
+
16
+ describe "with an invalid formatter" do
17
+
18
+ it "prints an error" do
19
+ mock_export_error("Unknown export format: invalidformatter (unable to load file 'foreman/export/invalidformatter').") do
20
+ subject.formatter("invalidformatter")
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,26 @@
1
+ require "spec_helper"
2
+ require "foreman/helpers"
3
+
4
+ describe "Foreman::Helpers" do
5
+ before do
6
+ module Foo
7
+ class Bar; end
8
+ end
9
+ end
10
+
11
+ after do
12
+ Object.send(:remove_const, :Foo)
13
+ end
14
+
15
+ subject { o = Object.new; o.extend(Foreman::Helpers); o }
16
+
17
+ it "should classify words" do
18
+ subject.classify("foo").should == "Foo"
19
+ subject.classify("foo-bar").should == "FooBar"
20
+ end
21
+
22
+ it "should constantize words" do
23
+ subject.constantize("Object").should == Object
24
+ subject.constantize("Foo::Bar").should == Foo::Bar
25
+ end
26
+ end
@@ -1,2 +1,131 @@
1
- require "spec_helper"
2
- require "foreman/process"
1
+ require 'spec_helper'
2
+ require 'foreman/process'
3
+ require 'ostruct'
4
+ require 'timeout'
5
+ require 'tmpdir'
6
+
7
+ describe Foreman::Process do
8
+ subject { described_class.new entry, number, port }
9
+
10
+ let(:number) { 1 }
11
+ let(:port) { 777 }
12
+ let(:command) { "script" }
13
+ let(:name) { "foobar" }
14
+ let(:entry) { OpenStruct.new :name => name, :command => command }
15
+
16
+ its(:entry) { entry }
17
+ its(:num) { number }
18
+ its(:port) { port }
19
+ its(:name) { "#{name}.#{port}" }
20
+ its(:pid) { nil }
21
+
22
+ describe '#run' do
23
+ let(:pipe) { :pipe }
24
+ let(:basedir) { Dir.mktmpdir }
25
+ let(:env) {{ 'foo' => 'bar' }}
26
+ let(:init_delta) { 0.1 }
27
+
28
+ after { FileUtils.remove_entry_secure basedir }
29
+
30
+ def run(cmd=command)
31
+ entry.command = cmd
32
+ subject.run pipe, basedir, env
33
+ subject.detach && sleep(init_delta)
34
+ end
35
+
36
+ def run_file(executable, code)
37
+ file = File.open("#{basedir}/script", 'w') {|it| it << code }
38
+ run "#{executable} #{file.path}"
39
+ end
40
+
41
+ context 'options' do
42
+ it 'should set PORT for environment' do
43
+ mock(subject).run_process(basedir, command, pipe) do
44
+ ENV['PORT'].should == port.to_s
45
+ end
46
+ run
47
+ end
48
+
49
+ it 'should set custom variables for environment' do
50
+ mock(subject).run_process(basedir, command, pipe) do
51
+ ENV['foo'].should == 'bar'
52
+ end
53
+ run
54
+ end
55
+
56
+ it 'should restore environment afterwards' do
57
+ mock(subject).run_process(basedir, command, pipe)
58
+ run
59
+ ENV.should_not include('PORT', 'foo')
60
+ end
61
+ end
62
+
63
+ context 'process' do
64
+ around do |spec|
65
+ IO.pipe do |reader, writer|
66
+ @reader, @writer = reader, writer
67
+ spec.run
68
+ end
69
+ end
70
+
71
+ let(:pipe) { @writer }
72
+ let(:output) { @reader.read_nonblock 1024 }
73
+
74
+ it 'should not block' do
75
+ expect {
76
+ Timeout.timeout(2*init_delta) { run 'sleep 2' }
77
+ }.should_not raise_exception
78
+ end
79
+
80
+ it 'should be alive' do
81
+ run 'sleep 1'
82
+ subject.should be_alive
83
+ end
84
+
85
+ it 'should be dead' do
86
+ run 'exit'
87
+ subject.should be_dead
88
+ end
89
+
90
+ it 'should be killable' do
91
+ run 'sleep 1'
92
+ subject.kill 'TERM'
93
+ subject.should be_dead
94
+ end
95
+
96
+ it 'should send different signals' do
97
+ run_file 'ruby', <<-CODE
98
+ trap "TERM", "IGNORE"
99
+ loop { sleep 1 }
100
+ CODE
101
+ sleep 1 # wait for ruby to start
102
+ subject.should be_alive
103
+ subject.kill 'TERM'
104
+ subject.should be_alive
105
+ subject.kill 'KILL'
106
+ subject.should be_dead
107
+ end
108
+
109
+ it 'should redirect stdout' do
110
+ run 'echo hey'
111
+ output.should include('hey')
112
+ end
113
+
114
+ it 'should redirect stderr' do
115
+ run 'echo hey >2'
116
+ output.should include('hey')
117
+ end
118
+
119
+ it 'should handle variables' do
120
+ run 'echo $PORT'
121
+ output.should include('777')
122
+ end
123
+
124
+ it 'should handle arguments' do
125
+ pending
126
+ run %{ sh -c "trap '' TERM; sleep 10" }
127
+ subject.should be_alive
128
+ end
129
+ end
130
+ end
131
+ end
data/spec/foreman_spec.rb CHANGED
@@ -8,13 +8,8 @@ describe Foreman do
8
8
  it { should be_a String }
9
9
  end
10
10
 
11
- describe "::load_env!(env_file)" do
12
- before do
13
- FakeFS.activate!
14
- end
15
-
11
+ describe "::load_env!(env_file)", :fakefs do
16
12
  after do
17
- FakeFS.deactivate!
18
13
  ENV['FOO'] = nil
19
14
  end
20
15
 
@@ -22,7 +17,7 @@ describe Foreman do
22
17
  File.open("/tmp/env1", "w") { |f| f.puts("FOO=bar") }
23
18
  Foreman.load_env!("/tmp/env1")
24
19
  ENV['FOO'].should == 'bar'
25
- end
20
+ end
26
21
 
27
22
  it "should assume env_file in ./.env" do
28
23
  File.open("./.env", "w") { |f| f.puts("FOO=bar") }
@@ -30,4 +25,10 @@ describe Foreman do
30
25
  ENV['FOO'].should == 'bar'
31
26
  end
32
27
  end
28
+
29
+ describe "runner" do
30
+ it "should exist" do
31
+ File.exists?(Foreman.runner).should == true
32
+ end
33
+ end
33
34
  end
@@ -0,0 +1,18 @@
1
+ require "spec_helper"
2
+
3
+ describe "spec helpers" do
4
+ describe "#preserving_env" do
5
+ after { ENV.delete "FOO" }
6
+
7
+ it "should remove added environment vars" do
8
+ preserving_env { ENV["FOO"] = "baz" }
9
+ ENV["FOO"].should == nil
10
+ end
11
+
12
+ it "should reset modified environment vars" do
13
+ ENV["FOO"] = "bar"
14
+ preserving_env { ENV["FOO"] = "baz"}
15
+ ENV["FOO"].should == "bar"
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,47 @@
1
+ Bluepill.application("app", :foreground => false, :log_file => "/var/log/bluepill.log") do |app|
2
+
3
+ app.uid = "app"
4
+ app.gid = "app"
5
+
6
+
7
+
8
+
9
+ app.process("alpha-1") do |process|
10
+ process.start_command = "./alpha"
11
+
12
+ process.working_dir = "/tmp/app"
13
+ process.daemonize = true
14
+ process.environment = {"PORT" => "5000"}
15
+ process.stop_signals = [:quit, 30.seconds, :term, 5.seconds, :kill]
16
+
17
+ process.stdout = process.stderr = "/var/log/app/app-alpha-1.log"
18
+
19
+ process.monitor_children do |children|
20
+ children.stop_command "kill -QUIT {{PID}}"
21
+ end
22
+
23
+ process.group = "app-alpha"
24
+ end
25
+
26
+
27
+ app.process("alpha-2") do |process|
28
+ process.start_command = "./alpha"
29
+
30
+ process.working_dir = "/tmp/app"
31
+ process.daemonize = true
32
+ process.environment = {"PORT" => "5001"}
33
+ process.stop_signals = [:quit, 30.seconds, :term, 5.seconds, :kill]
34
+
35
+ process.stdout = process.stderr = "/var/log/app/app-alpha-2.log"
36
+
37
+ process.monitor_children do |children|
38
+ children.stop_command "kill -QUIT {{PID}}"
39
+ end
40
+
41
+ process.group = "app-alpha"
42
+ end
43
+
44
+
45
+
46
+
47
+ end
@@ -19,31 +19,10 @@ Bluepill.application("app", :foreground => false, :log_file => "/var/log/bluepil
19
19
  process.monitor_children do |children|
20
20
  children.stop_command "kill -QUIT {{PID}}"
21
21
  end
22
-
23
- process.group = "app-alpha"
24
- end
25
-
26
-
27
- app.process("alpha-2") do |process|
28
- process.start_command = "./alpha"
29
-
30
- process.working_dir = "/tmp/app"
31
- process.daemonize = true
32
- process.environment = {"PORT" => "5001"}
33
- process.stop_signals = [:quit, 30.seconds, :term, 5.seconds, :kill]
34
22
 
35
- process.stdout = process.stderr = "/var/log/app/app-alpha-2.log"
36
-
37
- process.monitor_children do |children|
38
- children.stop_command "kill -QUIT {{PID}}"
39
- end
40
-
41
23
  process.group = "app-alpha"
42
24
  end
43
25
 
44
-
45
-
46
-
47
26
  app.process("bravo-1") do |process|
48
27
  process.start_command = "./bravo"
49
28
 
@@ -57,7 +36,7 @@ Bluepill.application("app", :foreground => false, :log_file => "/var/log/bluepil
57
36
  process.monitor_children do |children|
58
37
  children.stop_command "kill -QUIT {{PID}}"
59
38
  end
60
-
39
+
61
40
  process.group = "app-bravo"
62
41
  end
63
42
 
@@ -0,0 +1,4 @@
1
+ # ----- foreman app processes -----
2
+ AP01:4:respawn:/bin/su - app -c 'PORT=5000 ./alpha >> /var/log/app/alpha-1.log 2>&1'
3
+ AP02:4:respawn:/bin/su - app -c 'PORT=5001 ./alpha >> /var/log/app/alpha-2.log 2>&1'
4
+ # ----- end foreman app processes -----
@@ -0,0 +1,4 @@
1
+ # ----- foreman app processes -----
2
+ AP01:4:respawn:/bin/su - app -c 'PORT=5000 ./alpha >> /var/log/app/alpha-1.log 2>&1'
3
+ AP02:4:respawn:/bin/su - app -c 'PORT=5100 ./bravo >> /var/log/app/bravo-1.log 2>&1'
4
+ # ----- end foreman app processes -----
data/spec/spec_helper.rb CHANGED
@@ -1,10 +1,20 @@
1
1
  require "rubygems"
2
+
3
+ require "simplecov"
4
+ SimpleCov.start do
5
+ add_filter "/spec/"
6
+ end
7
+
2
8
  require "rspec"
3
9
  require "fakefs/safe"
4
10
  require "fakefs/spec_helpers"
5
11
 
6
12
  $:.unshift File.expand_path("../../lib", __FILE__)
7
13
 
14
+ def mock_export_error(message)
15
+ lambda { yield }.should raise_error(Foreman::Export::Exception, message)
16
+ end
17
+
8
18
  def mock_error(subject, message)
9
19
  mock_exit do
10
20
  mock(subject).puts("ERROR: #{message}")
@@ -37,9 +47,11 @@ def write_procfile(procfile="Procfile", alpha_env="")
37
47
  File.expand_path(procfile)
38
48
  end
39
49
 
40
- def write_env(env=".env")
50
+ def write_env(env=".env", options={"FOO"=>"bar"})
41
51
  File.open(env, "w") do |file|
42
- file.puts "FOO=bar"
52
+ options.each do |key, val|
53
+ file.puts "#{key}=#{val}"
54
+ end
43
55
  end
44
56
  end
45
57
 
@@ -63,8 +75,24 @@ def example_export_file(filename)
63
75
  data
64
76
  end
65
77
 
78
+ def preserving_env
79
+ old_env = ENV.to_hash
80
+ begin
81
+ yield
82
+ ensure
83
+ ENV.clear
84
+ ENV.update(old_env)
85
+ end
86
+ end
87
+
88
+ def normalize_space(s)
89
+ s.gsub(/\n[\n\s]*/, "\n")
90
+ end
91
+
66
92
  RSpec.configure do |config|
93
+ config.treat_symbols_as_metadata_keys_with_true_values = true
67
94
  config.color_enabled = true
68
- config.include FakeFS::SpecHelpers
95
+ config.order = 'rand'
96
+ config.include FakeFS::SpecHelpers, :fakefs
69
97
  config.mock_with :rr
70
98
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.27.0
4
+ version: 0.37.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,22 +9,22 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-05 00:00:00.000000000Z
12
+ date: 2012-01-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: term-ansicolor
16
- requirement: &70283570808260 !ruby/object:Gem::Requirement
16
+ requirement: &70149919501700 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: 1.0.5
21
+ version: 1.0.7
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70283570808260
24
+ version_requirements: *70149919501700
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: thor
27
- requirement: &70283570807760 !ruby/object:Gem::Requirement
27
+ requirement: &70149919500700 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: 0.13.6
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70283570807760
35
+ version_requirements: *70149919500700
36
36
  description: Process manager for applications with multiple components
37
37
  email: ddollar@gmail.com
38
38
  executables:
@@ -41,6 +41,7 @@ extensions: []
41
41
  extra_rdoc_files: []
42
42
  files:
43
43
  - bin/foreman
44
+ - bin/runner
44
45
  - data/example/error
45
46
  - data/example/log/neverdie.log
46
47
  - data/example/Procfile
@@ -61,21 +62,30 @@ files:
61
62
  - lib/foreman/export/runit.rb
62
63
  - lib/foreman/export/upstart.rb
63
64
  - lib/foreman/export.rb
65
+ - lib/foreman/helpers.rb
64
66
  - lib/foreman/process.rb
65
67
  - lib/foreman/procfile.rb
68
+ - lib/foreman/procfile_entry.rb
66
69
  - lib/foreman/utils.rb
67
70
  - lib/foreman/version.rb
68
71
  - lib/foreman.rb
69
- - README.markdown
72
+ - README.md
70
73
  - spec/foreman/cli_spec.rb
71
74
  - spec/foreman/engine_spec.rb
75
+ - spec/foreman/export/base_spec.rb
72
76
  - spec/foreman/export/bluepill_spec.rb
77
+ - spec/foreman/export/inittab_spec.rb
73
78
  - spec/foreman/export/runit_spec.rb
74
79
  - spec/foreman/export/upstart_spec.rb
75
80
  - spec/foreman/export_spec.rb
81
+ - spec/foreman/helpers_spec.rb
76
82
  - spec/foreman/process_spec.rb
77
83
  - spec/foreman_spec.rb
84
+ - spec/helper_spec.rb
85
+ - spec/resources/export/bluepill/app-concurrency.pill
78
86
  - spec/resources/export/bluepill/app.pill
87
+ - spec/resources/export/inittab/inittab.concurrency
88
+ - spec/resources/export/inittab/inittab.default
79
89
  - spec/resources/export/runit/app-alpha-1-log-run
80
90
  - spec/resources/export/runit/app-alpha-1-run
81
91
  - spec/resources/export/runit/app-alpha-2-log-run
@@ -102,21 +112,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
102
112
  - - ! '>='
103
113
  - !ruby/object:Gem::Version
104
114
  version: '0'
105
- segments:
106
- - 0
107
- hash: -3613490576676930257
108
115
  required_rubygems_version: !ruby/object:Gem::Requirement
109
116
  none: false
110
117
  requirements:
111
118
  - - ! '>='
112
119
  - !ruby/object:Gem::Version
113
120
  version: '0'
114
- segments:
115
- - 0
116
- hash: -3613490576676930257
117
121
  requirements: []
118
122
  rubyforge_project:
119
- rubygems_version: 1.8.10
123
+ rubygems_version: 1.8.15
120
124
  signing_key:
121
125
  specification_version: 3
122
126
  summary: Process manager for applications with multiple components