foreman 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/foreman.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Foreman
2
2
 
3
- VERSION = "0.6.0"
3
+ VERSION = "0.7.0"
4
4
 
5
5
  class AppDoesNotExist < Exception; end
6
6
 
data/lib/foreman/cli.rb CHANGED
@@ -9,17 +9,16 @@ class Foreman::CLI < Thor
9
9
 
10
10
  desc "start [PROCESS]", "Start the application, or a specific process"
11
11
 
12
- method_option :screen, :type => :boolean, :aliases => "-s"
12
+ method_option :concurrency, :type => :string, :aliases => "-c",
13
+ :banner => '"alpha=5,bar=3"'
13
14
 
14
15
  def start(process=nil)
15
16
  check_procfile!
16
17
 
17
18
  if process
18
- engine.execute(process)
19
- elsif options[:screen]
20
- engine.screen
19
+ engine.execute(process, options)
21
20
  else
22
- engine.start
21
+ engine.start(options)
23
22
  end
24
23
  end
25
24
 
@@ -1,5 +1,6 @@
1
1
  require "foreman"
2
2
  require "foreman/process"
3
+ require "foreman/utils"
3
4
  require "pty"
4
5
  require "tempfile"
5
6
  require "term/ansicolor"
@@ -12,28 +13,42 @@ class Foreman::Engine
12
13
 
13
14
  extend Term::ANSIColor
14
15
 
15
- COLORS = [ cyan, yellow, green, magenta, on_blue ]
16
+ COLORS = [ cyan, yellow, green, magenta, red ]
16
17
 
17
18
  def initialize(procfile)
18
19
  @procfile = read_procfile(procfile)
19
20
  @directory = File.expand_path(File.dirname(procfile))
20
21
  end
21
22
 
22
- def processes
23
+ def processes(concurrency=nil)
23
24
  @processes ||= begin
25
+ concurrency = Foreman::Utils.parse_concurrency(concurrency)
26
+
24
27
  procfile.split("\n").inject({}) do |hash, line|
25
28
  next if line.strip == ""
26
- process = Foreman::Process.new(*line.split(" ", 2))
27
- process.color = next_color
28
- hash.update(process.name => process)
29
+ name, command = line.split(" ", 2)
30
+
31
+ if concurrency[name] > 1 then
32
+ 1.upto(concurrency[name]) do |num|
33
+ process = Foreman::Process.new("#{name}.#{num}", command)
34
+ process.color = next_color
35
+ hash[process.name] = process
36
+ end
37
+ else
38
+ process = Foreman::Process.new(name, command)
39
+ process.color = next_color
40
+ hash[process.name] = process
41
+ end
42
+
43
+ hash
29
44
  end
30
45
  end
31
46
  end
32
47
 
33
- def start
48
+ def start(options={})
34
49
  proctitle "ruby: foreman master"
35
50
 
36
- processes.each do |name, process|
51
+ processes(options[:concurrency]).each do |name, process|
37
52
  fork process
38
53
  end
39
54
 
@@ -43,21 +58,17 @@ class Foreman::Engine
43
58
  watch_for_termination
44
59
  end
45
60
 
46
- def screen
47
- tempfile = Tempfile.new("foreman")
48
- tempfile.puts "sessionname foreman"
49
- processes.each do |name, process|
50
- tempfile.puts "screen -t #{name} #{process.command}"
61
+ def execute(name, options={})
62
+ processes(options[:concurrency]).values.select do |process|
63
+ process.name =~ /\A#{name}\.?\d*\Z/
64
+ end.each do |process|
65
+ fork process
51
66
  end
52
- tempfile.close
53
67
 
54
- system "screen -c #{tempfile.path}"
55
-
56
- tempfile.delete
57
- end
68
+ trap("TERM") { kill_and_exit("TERM") }
69
+ trap("INT") { kill_and_exit("INT") }
58
70
 
59
- def execute(name)
60
- run(processes[name], false)
71
+ watch_for_termination
61
72
  end
62
73
 
63
74
  private ######################################################################
@@ -1,4 +1,5 @@
1
1
  require "foreman/export"
2
+ require "foreman/utils"
2
3
 
3
4
  class Foreman::Export::Base
4
5
 
@@ -26,16 +27,6 @@ private ######################################################################
26
27
  File.read(File.expand_path("../../../../export/#{name}", __FILE__))
27
28
  end
28
29
 
29
- def parse_concurrency(concurrency)
30
- @concurrency ||= begin
31
- pairs = concurrency.to_s.gsub(/\s/, "").split(",")
32
- pairs.inject(Hash.new(1)) do |hash, pair|
33
- process, amount = pair.split("=")
34
- hash.update(process => amount.to_i)
35
- end
36
- end
37
- end
38
-
39
30
  def port_for(base_port, app, num)
40
31
  base_port ||= 5000
41
32
  offset = engine.processes.keys.sort.index(app) * 100
@@ -0,0 +1,15 @@
1
+ require "foreman"
2
+
3
+ class Foreman::Utils
4
+
5
+ def self.parse_concurrency(concurrency)
6
+ @concurrency ||= begin
7
+ pairs = concurrency.to_s.gsub(/\s/, "").split(",")
8
+ pairs.inject(Hash.new(1)) do |hash, pair|
9
+ process, amount = pair.split("=")
10
+ hash.update(process => amount.to_i)
11
+ end
12
+ end
13
+ end
14
+
15
+ end
@@ -19,7 +19,7 @@ describe "Foreman::CLI" do
19
19
 
20
20
  it "runs successfully" do
21
21
  dont_allow(subject).error
22
- mock.instance_of(Foreman::Engine).start
22
+ mock.instance_of(Foreman::Engine).start({})
23
23
  subject.start
24
24
  end
25
25
  end
@@ -51,10 +51,7 @@ describe "Foreman::CLI" do
51
51
 
52
52
  it "runs successfully" do
53
53
  dont_allow(subject).error
54
- mock.instance_of(Foreman::Export::Upstart).export("/tmp/foo", {
55
- :concurrency => nil,
56
- :name => nil
57
- })
54
+ mock.instance_of(Foreman::Export::Upstart).export("/tmp/foo", {})
58
55
  subject.export("upstart", "/tmp/foo")
59
56
  end
60
57
  end
@@ -10,7 +10,7 @@ describe "Foreman::Engine" do
10
10
  lambda { subject }.should raise_error
11
11
  end
12
12
  end
13
-
13
+
14
14
  describe "with a Procfile" do
15
15
  it "reads the processes" do
16
16
  write_procfile
@@ -19,7 +19,7 @@ describe "Foreman::Engine" do
19
19
  end
20
20
  end
21
21
  end
22
-
22
+
23
23
  describe "start" do
24
24
  it "forks the processes" do
25
25
  write_procfile
@@ -33,7 +33,8 @@ describe "Foreman::Engine" do
33
33
  describe "execute" do
34
34
  it "runs the processes" do
35
35
  write_procfile
36
- mock(subject).run(subject.processes["alpha"], false)
36
+ mock(subject).fork(subject.processes["alpha"])
37
+ mock(subject).watch_for_termination
37
38
  subject.execute("alpha")
38
39
  end
39
40
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman
3
3
  version: !ruby/object:Gem::Version
4
- hash: 7
4
+ hash: 3
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 6
8
+ - 7
9
9
  - 0
10
- version: 0.6.0
10
+ version: 0.7.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - David Dollar
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-07-06 00:00:00 -04:00
18
+ date: 2010-07-19 00:00:00 -07:00
19
19
  default_executable: foreman
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -152,6 +152,7 @@ files:
152
152
  - lib/foreman/export/inittab.rb
153
153
  - lib/foreman/export/upstart.rb
154
154
  - lib/foreman/process.rb
155
+ - lib/foreman/utils.rb
155
156
  - spec/foreman/cli_spec.rb
156
157
  - spec/foreman/engine_spec.rb
157
158
  - spec/foreman/export/upstart_spec.rb
@@ -160,7 +161,7 @@ files:
160
161
  - spec/foreman_spec.rb
161
162
  - spec/spec_helper.rb
162
163
  - README.markdown
163
- has_rdoc: false
164
+ has_rdoc: true
164
165
  homepage: http://github.com/ddollar/foreman
165
166
  licenses: []
166
167