foreman 0.40.0 → 0.41.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.
@@ -0,0 +1,21 @@
1
+ <%
2
+ engine.procfile.entries.each do |process|
3
+ next if (conc = self.concurrency[process.name]) < 1
4
+ 1.upto(self.concurrency[process.name]) do |num|
5
+ port = engine.port_for(process, num, self.port)
6
+ name = if (conc > 1); "#{process.name}-#{num}" else process.name; end
7
+ environment = (engine.environment.each_pair { |var,env| "#{var.upcase}=#{env}" }.to_a << "PORT=#{port}")
8
+ %>
9
+ [program:<%= app %>-<%= name %>]
10
+ command=<%= process.command %>
11
+ autostart=true
12
+ autorestart=true
13
+ stopsignal=QUIT
14
+ stdout_logfile=<%= log_root %>/<%=process.name%>-<%=num%>-out.log
15
+ stderr_logfile=<%= log_root %>/<%=process.name%>-<%=num%>-err.log
16
+ user=<%= user %>
17
+ directory=<%= engine.directory %>
18
+ environment=<%= environment.join(',') %><%
19
+ end
20
+ end
21
+ %>
@@ -0,0 +1,40 @@
1
+ require "foreman"
2
+
3
+ module Foreman::Color
4
+
5
+ ANSI = {
6
+ :reset => 0,
7
+ :black => 30,
8
+ :red => 31,
9
+ :green => 32,
10
+ :yellow => 33,
11
+ :blue => 34,
12
+ :magenta => 35,
13
+ :cyan => 36,
14
+ :white => 37,
15
+ :bright_black => 30,
16
+ :bright_red => 31,
17
+ :bright_green => 32,
18
+ :bright_yellow => 33,
19
+ :bright_blue => 34,
20
+ :bright_magenta => 35,
21
+ :bright_cyan => 36,
22
+ :bright_white => 37,
23
+ }
24
+
25
+ def self.enable(io)
26
+ io.extend(self)
27
+ end
28
+
29
+ def color?
30
+ return false unless self.respond_to?(:isatty)
31
+ self.isatty && ENV["TERM"]
32
+ end
33
+
34
+ def color(name)
35
+ return "" unless color?
36
+ return "" unless ansi = ANSI[name.to_sym]
37
+ "\e[#{ansi}m"
38
+ end
39
+
40
+ end
@@ -1,10 +1,10 @@
1
1
  require "foreman"
2
+ require "foreman/color"
2
3
  require "foreman/process"
3
4
  require "foreman/procfile"
4
5
  require "foreman/utils"
5
6
  require "tempfile"
6
7
  require "timeout"
7
- require "term/ansicolor"
8
8
  require "fileutils"
9
9
  require "thread"
10
10
 
@@ -15,11 +15,10 @@ class Foreman::Engine
15
15
  attr_reader :directory
16
16
  attr_reader :options
17
17
 
18
- extend Term::ANSIColor
18
+ COLORS = %w( cyan yellow green magenta red blue intense_cyan intense_yellow
19
+ intense_green intense_magenta intense_red, intense_blue )
19
20
 
20
- COLORS = [ cyan, yellow, green, magenta, red, blue,
21
- intense_cyan, intense_yellow, intense_green, intense_magenta,
22
- intense_red, intense_blue ]
21
+ Foreman::Color.enable($stdout)
23
22
 
24
23
  def initialize(procfile, options={})
25
24
  @procfile = Foreman::Procfile.new(procfile)
@@ -128,11 +127,11 @@ private ######################################################################
128
127
  rescue Errno::ECHILD
129
128
  end
130
129
 
131
- def info(message, name="system", color=Term::ANSIColor.white)
130
+ def info(message, name="system", color=:white)
132
131
  output = ""
133
- output += color
132
+ output += $stdout.color(color)
134
133
  output += "#{Time.now.strftime("%H:%M:%S")} #{pad_process_name(name)} | "
135
- output += Term::ANSIColor.reset
134
+ output += $stdout.color(:reset)
136
135
  output += message.chomp
137
136
  puts output
138
137
  end
@@ -182,8 +181,8 @@ private ######################################################################
182
181
  end
183
182
 
184
183
  def assign_colors
185
- procfile.entries.each do |entry|
186
- colors[entry.name] = next_color
184
+ procfile.entries.each_with_index do |entry, idx|
185
+ colors[entry.name] = COLORS[idx % COLORS.length]
187
186
  end
188
187
  end
189
188
 
@@ -191,13 +190,6 @@ private ######################################################################
191
190
  readers.invert[reader]
192
191
  end
193
192
 
194
- def next_color
195
- @current_color ||= -1
196
- @current_color += 1
197
- @current_color = 0 if COLORS.length < @current_color
198
- COLORS[@current_color]
199
- end
200
-
201
193
  def read_environment_files(filenames)
202
194
  environment = {}
203
195
 
@@ -30,3 +30,5 @@ require "foreman/export/inittab"
30
30
  require "foreman/export/upstart"
31
31
  require "foreman/export/bluepill"
32
32
  require "foreman/export/runit"
33
+ require "foreman/export/supervisord"
34
+
@@ -0,0 +1,26 @@
1
+ require "erb"
2
+ require "foreman/export"
3
+
4
+ class Foreman::Export::Supervisord < Foreman::Export::Base
5
+
6
+ def export
7
+ error("Must specify a location") unless location
8
+
9
+ FileUtils.mkdir_p location
10
+
11
+ app = self.app || File.basename(engine.directory)
12
+ user = self.user || app
13
+ log_root = self.log || "/var/log/#{app}"
14
+ template_root = self.template
15
+
16
+ Dir["#{location}/#{app}*.conf"].each do |file|
17
+ say "cleaning up: #{file}"
18
+ FileUtils.rm(file)
19
+ end
20
+
21
+ app_template = export_template("supervisord", "app.conf.erb", template_root)
22
+ app_config = ERB.new(app_template, 0, '<').result(binding)
23
+ write_file "#{location}/#{app}.conf", app_config
24
+ end
25
+
26
+ end
@@ -1,5 +1,5 @@
1
1
  module Foreman
2
2
 
3
- VERSION = "0.40.0"
3
+ VERSION = "0.41.0"
4
4
 
5
5
  end
@@ -0,0 +1,31 @@
1
+ require "spec_helper"
2
+ require "foreman/color"
3
+
4
+ describe Foreman::Color do
5
+
6
+ let(:io) { Object.new }
7
+
8
+ it "should extend an object with colorization" do
9
+ Foreman::Color.enable(io)
10
+ io.should respond_to(:color)
11
+ end
12
+
13
+ it "should not colorize if the object does not respond to isatty" do
14
+ mock(io).respond_to?(:isatty) { false }
15
+ Foreman::Color.enable(io)
16
+ io.color(:white).should == ""
17
+ end
18
+
19
+ it "should not colorize if the object is not a tty" do
20
+ mock(io).isatty { false }
21
+ Foreman::Color.enable(io)
22
+ io.color(:white).should == ""
23
+ end
24
+
25
+ it "should colorize if the object is a tty" do
26
+ mock(io).isatty { true }
27
+ Foreman::Color.enable(io)
28
+ io.color(:white).should == "\e[37m"
29
+ end
30
+
31
+ end
@@ -0,0 +1,75 @@
1
+ require "spec_helper"
2
+ require "foreman/engine"
3
+ require "foreman/export/supervisord"
4
+ require "tmpdir"
5
+
6
+ describe Foreman::Export::Supervisord, :fakefs do
7
+ let(:procfile) { FileUtils.mkdir_p("/tmp/app"); write_procfile("/tmp/app/Procfile") }
8
+ let(:engine) { Foreman::Engine.new(procfile) }
9
+ let(:options) { Hash.new }
10
+ let(:supervisord) { Foreman::Export::Supervisord.new("/tmp/init", engine, options) }
11
+
12
+ before(:each) { load_export_templates_into_fakefs("supervisord") }
13
+ before(:each) { stub(supervisord).say }
14
+
15
+ it "exports to the filesystem" do
16
+ supervisord.export
17
+
18
+ File.read("/tmp/init/app.conf").should == example_export_file("supervisord/app.conf")
19
+ end
20
+
21
+ it "cleans up if exporting into an existing dir" do
22
+ mock(FileUtils).rm("/tmp/init/app.conf")
23
+
24
+ supervisord.export
25
+ supervisord.export
26
+ end
27
+
28
+ context "with concurrency" do
29
+ let(:options) { Hash[:concurrency => "alpha=2"] }
30
+
31
+ it "exports to the filesystem with concurrency" do
32
+ supervisord.export
33
+
34
+ File.read("/tmp/init/app.conf").should == example_export_file("supervisord/app-alpha-2.conf")
35
+ end
36
+ end
37
+
38
+ context "with alternate templates" do
39
+ let(:template_root) { "/tmp/alternate" }
40
+ let(:supervisord) { Foreman::Export::Supervisord.new("/tmp/init", engine, :template => template_root) }
41
+
42
+ before do
43
+ FileUtils.mkdir_p template_root
44
+ File.open("#{template_root}/app.conf.erb", "w") { |f| f.puts "alternate_template" }
45
+ end
46
+
47
+ it "can export with alternate template files" do
48
+ supervisord.export
49
+
50
+ File.read("/tmp/init/app.conf").should == "alternate_template\n"
51
+ end
52
+ end
53
+
54
+ context "with alternate templates from home dir" do
55
+ let(:default_template_root) {File.expand_path("#{ENV['HOME']}/.foreman/templates")}
56
+
57
+ before do
58
+ ENV['_FOREMAN_SPEC_HOME'] = ENV['HOME']
59
+ ENV['HOME'] = "/home/appuser"
60
+ FileUtils.mkdir_p default_template_root
61
+ File.open("#{default_template_root}/app.conf.erb", "w") { |f| f.puts "default_alternate_template" }
62
+ end
63
+
64
+ after do
65
+ ENV['HOME'] = ENV.delete('_FOREMAN_SPEC_HOME')
66
+ end
67
+
68
+ it "can export with alternate template files" do
69
+ supervisord.export
70
+
71
+ File.read("/tmp/init/app.conf").should == "default_alternate_template\n"
72
+ end
73
+ end
74
+
75
+ end
@@ -0,0 +1,21 @@
1
+
2
+ [program:app-alpha-1]
3
+ command=./alpha
4
+ autostart=true
5
+ autorestart=true
6
+ stopsignal=QUIT
7
+ stdout_logfile=/var/log/app/alpha-1-out.log
8
+ stderr_logfile=/var/log/app/alpha-1-err.log
9
+ user=app
10
+ directory=/tmp/app
11
+ environment=PORT=5000
12
+ [program:app-alpha-2]
13
+ command=./alpha
14
+ autostart=true
15
+ autorestart=true
16
+ stopsignal=QUIT
17
+ stdout_logfile=/var/log/app/alpha-2-out.log
18
+ stderr_logfile=/var/log/app/alpha-2-err.log
19
+ user=app
20
+ directory=/tmp/app
21
+ environment=PORT=5001
@@ -0,0 +1,21 @@
1
+
2
+ [program:app-alpha]
3
+ command=./alpha
4
+ autostart=true
5
+ autorestart=true
6
+ stopsignal=QUIT
7
+ stdout_logfile=/var/log/app/alpha-1-out.log
8
+ stderr_logfile=/var/log/app/alpha-1-err.log
9
+ user=app
10
+ directory=/tmp/app
11
+ environment=PORT=5000
12
+ [program:app-bravo]
13
+ command=./bravo
14
+ autostart=true
15
+ autorestart=true
16
+ stopsignal=QUIT
17
+ stdout_logfile=/var/log/app/bravo-1-out.log
18
+ stderr_logfile=/var/log/app/bravo-1-err.log
19
+ user=app
20
+ directory=/tmp/app
21
+ environment=PORT=5100
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.40.0
4
+ version: 0.41.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,22 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-24 00:00:00.000000000 Z
12
+ date: 2012-03-16 00:00:00.000000000 Z
13
13
  dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: term-ansicolor
16
- requirement: &70330442658940 !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ~>
20
- - !ruby/object:Gem::Version
21
- version: 1.0.7
22
- type: :runtime
23
- prerelease: false
24
- version_requirements: *70330442658940
25
14
  - !ruby/object:Gem::Dependency
26
15
  name: thor
27
- requirement: &70330442658420 !ruby/object:Gem::Requirement
16
+ requirement: &70166560574240 !ruby/object:Gem::Requirement
28
17
  none: false
29
18
  requirements:
30
19
  - - ! '>='
@@ -32,7 +21,7 @@ dependencies:
32
21
  version: 0.13.6
33
22
  type: :runtime
34
23
  prerelease: false
35
- version_requirements: *70330442658420
24
+ version_requirements: *70166560574240
36
25
  description: Process manager for applications with multiple components
37
26
  email: ddollar@gmail.com
38
27
  executables:
@@ -51,16 +40,19 @@ files:
51
40
  - data/export/bluepill/master.pill.erb
52
41
  - data/export/runit/log_run.erb
53
42
  - data/export/runit/run.erb
43
+ - data/export/supervisord/app.conf.erb
54
44
  - data/export/upstart/master.conf.erb
55
45
  - data/export/upstart/process.conf.erb
56
46
  - data/export/upstart/process_master.conf.erb
57
47
  - lib/foreman/cli.rb
48
+ - lib/foreman/color.rb
58
49
  - lib/foreman/distribution.rb
59
50
  - lib/foreman/engine.rb
60
51
  - lib/foreman/export/base.rb
61
52
  - lib/foreman/export/bluepill.rb
62
53
  - lib/foreman/export/inittab.rb
63
54
  - lib/foreman/export/runit.rb
55
+ - lib/foreman/export/supervisord.rb
64
56
  - lib/foreman/export/upstart.rb
65
57
  - lib/foreman/export.rb
66
58
  - lib/foreman/helpers.rb
@@ -72,11 +64,13 @@ files:
72
64
  - lib/foreman.rb
73
65
  - README.md
74
66
  - spec/foreman/cli_spec.rb
67
+ - spec/foreman/color_spec.rb
75
68
  - spec/foreman/engine_spec.rb
76
69
  - spec/foreman/export/base_spec.rb
77
70
  - spec/foreman/export/bluepill_spec.rb
78
71
  - spec/foreman/export/inittab_spec.rb
79
72
  - spec/foreman/export/runit_spec.rb
73
+ - spec/foreman/export/supervisord_spec.rb
80
74
  - spec/foreman/export/upstart_spec.rb
81
75
  - spec/foreman/export_spec.rb
82
76
  - spec/foreman/helpers_spec.rb
@@ -94,6 +88,8 @@ files:
94
88
  - spec/resources/export/runit/app-alpha-2-run
95
89
  - spec/resources/export/runit/app-bravo-1-log-run
96
90
  - spec/resources/export/runit/app-bravo-1-run
91
+ - spec/resources/export/supervisord/app-alpha-2.conf
92
+ - spec/resources/export/supervisord/app.conf
97
93
  - spec/resources/export/upstart/app-alpha-1.conf
98
94
  - spec/resources/export/upstart/app-alpha-2.conf
99
95
  - spec/resources/export/upstart/app-alpha.conf
@@ -116,7 +112,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
116
112
  version: '0'
117
113
  segments:
118
114
  - 0
119
- hash: 4516446218853691019
115
+ hash: 4054055636504419796
120
116
  required_rubygems_version: !ruby/object:Gem::Requirement
121
117
  none: false
122
118
  requirements:
@@ -125,7 +121,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
125
121
  version: '0'
126
122
  segments:
127
123
  - 0
128
- hash: 4516446218853691019
124
+ hash: 4054055636504419796
129
125
  requirements: []
130
126
  rubyforge_project:
131
127
  rubygems_version: 1.8.11