From 6b7d5e51610fb1d4ffbd1db899ce04979f7ad03d Mon Sep 17 00:00:00 2001 From: David Dollar Date: Thu, 27 Jan 2011 16:14:43 -0800 Subject: [PATCH] deprecate colon-less syntax, add check command --- Rakefile | 2 +- data/example/Procfile | 4 ++-- data/example/Procfile.without_colon | 2 ++ lib/foreman/cli.rb | 12 ++++++++++++ lib/foreman/engine.rb | 14 +++++++++++++- man/foreman.1.ronn | 4 ++++ spec/foreman/cli_spec.rb | 23 +++++++++++++++++++++++ spec/foreman/engine_spec.rb | 16 +++++++++++++++- spec/spec_helper.rb | 2 +- 9 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 data/example/Procfile.without_colon diff --git a/Rakefile b/Rakefile index 62f7b20..e6cd7c0 100644 --- a/Rakefile +++ b/Rakefile @@ -25,7 +25,7 @@ end Rspec::Core::RakeTask.new("rcov:build") do |t| t.pattern = 'spec/**/*_spec.rb' t.rcov = true - t.rcov_opts = [ "--exclude", Gem.default_dir , "--exclude", "spec" ] + t.rcov_opts = [ "--exclude", ".bundle", "--exclude", "spec" ] end desc 'Build the manual' diff --git a/data/example/Procfile b/data/example/Procfile index d6451a9..36b0efd 100644 --- a/data/example/Procfile +++ b/data/example/Procfile @@ -1,2 +1,2 @@ -ticker ./ticker $PORT -error ./error \ No newline at end of file +ticker: ./ticker $PORT +error : ./error diff --git a/data/example/Procfile.without_colon b/data/example/Procfile.without_colon new file mode 100644 index 0000000..d6451a9 --- /dev/null +++ b/data/example/Procfile.without_colon @@ -0,0 +1,2 @@ +ticker ./ticker $PORT +error ./error \ No newline at end of file diff --git a/lib/foreman/cli.rb b/lib/foreman/cli.rb index 2893088..6d7872b 100644 --- a/lib/foreman/cli.rb +++ b/lib/foreman/cli.rb @@ -48,6 +48,14 @@ class Foreman::CLI < Thor error ex.message end + desc "check", "Validate your application's Procfile" + + def check + processes = engine.processes_in_order.map { |p| p.first } + error "no processes defined" unless processes.length > 0 + display "valid procfile detected (#{processes.join(', ')})" + end + private ###################################################################### def check_procfile! @@ -64,6 +72,10 @@ private ###################################################################### private ###################################################################### + def display(message) + puts message + end + def error(message) puts "ERROR: #{message}" exit 1 diff --git a/lib/foreman/engine.rb b/lib/foreman/engine.rb index 187cea0..0a92e56 100644 --- a/lib/foreman/engine.rb +++ b/lib/foreman/engine.rb @@ -25,7 +25,11 @@ class Foreman::Engine @order = [] procfile.split("\n").inject({}) do |hash, line| next if line.strip == "" - name, command = line.split(/:? +/, 2) + name, command = line.split(/ *: +/, 2) + unless command + warn_deprecated_procfile! + name, command = line.split(/ +/, 2) + end process = Foreman::Process.new(name, command) process.color = next_color @order << process.name @@ -178,4 +182,12 @@ private ###################################################################### @current_color >= COLORS.length ? "" : COLORS[@current_color] end + def warn_deprecated_procfile! + return if @already_warned_deprecated + @already_warned_deprecated = true + puts "!!! This format of Procfile is deprecated, and will not work starting in v0.12" + puts "!!! Use a colon to separate the process name from the command" + puts "!!! e.g. web: thin start" + end + end diff --git a/man/foreman.1.ronn b/man/foreman.1.ronn index 52ef54c..e756e1e 100644 --- a/man/foreman.1.ronn +++ b/man/foreman.1.ronn @@ -115,6 +115,10 @@ to run it. web: bundle exec thin start job: bundle exec rake jobs:work +You can validate your Procfile format using the `check` command + + $ foreman check + ## EXAMPLES Start one instance of each process type, interleave the output on stdout: diff --git a/spec/foreman/cli_spec.rb b/spec/foreman/cli_spec.rb index a1b8305..8858ee3 100644 --- a/spec/foreman/cli_spec.rb +++ b/spec/foreman/cli_spec.rb @@ -58,4 +58,27 @@ describe "Foreman::CLI" do end end + describe "check" do + describe "with a valid Procfile" do + before { write_procfile } + + it "displays the jobs" do + mock(subject).display("valid procfile detected (alpha, bravo)") + subject.check + end + end + + describe "with a blank Procfile" do + before do + FileUtils.touch("Procfile") + end + + it "displays an error" do + mock_error(subject, "no processes defined") do + subject.check + end + end + end + end + end diff --git a/spec/foreman/engine_spec.rb b/spec/foreman/engine_spec.rb index 17075b8..f59c701 100644 --- a/spec/foreman/engine_spec.rb +++ b/spec/foreman/engine_spec.rb @@ -12,12 +12,26 @@ describe "Foreman::Engine" do end describe "with a Procfile" do + before { write_procfile } + it "reads the processes" do - write_procfile subject.processes["alpha"].command.should == "./alpha" subject.processes["bravo"].command.should == "./bravo" end end + + describe "with a deprecated Procfile" do + before do + File.open("Procfile", "w") do |file| + file.puts "name command" + end + end + + it "should print a deprecation warning" do + mock(subject).warn_deprecated_procfile! + subject.processes.length.should == 1 + end + end end describe "start" do diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index d308383..b666503 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -26,7 +26,7 @@ end def write_procfile(procfile="Procfile") File.open(procfile, "w") do |file| - file.puts "alpha ./alpha" + file.puts "alpha: ./alpha" file.puts "bravo: ./bravo" end end