Skip to content
Browse files

Merge pull request #121 from Viximo/feature/run

Add "exec" action to allow execution of commands within the app environment
  • Loading branch information...
2 parents 07e8ca4 + 33d738b commit 98337c92e1803977c25f4f871ea59f2ed5559cf5 @ddollar ddollar committed Jan 9, 2012
Showing with 101 additions and 4 deletions.
  1. +24 −4 lib/foreman/cli.rb
  2. +49 −0 spec/foreman/cli_spec.rb
  3. +18 −0 spec/helper_spec.rb
  4. +10 −0 spec/spec_helper.rb
View
28 lib/foreman/cli.rb
@@ -5,15 +5,23 @@
require "yaml"
class Foreman::CLI < Thor
-
+
class_option :procfile, :type => :string, :aliases => "-f", :desc => "Default: Procfile"
-
+
desc "start", "Start the application"
method_option :env, :type => :string, :aliases => "-e", :desc => "Specify an environment file to load, defaults to .env"
method_option :port, :type => :numeric, :aliases => "-p"
method_option :concurrency, :type => :string, :aliases => "-c", :banner => '"alpha=5,bar=3"'
+ class << self
+ # Hackery. Take the run method away from Thor so that we can redefine it.
+ def is_thor_reserved_word?(word, type)
+ return false if word == 'run'
+ super
+ end
+ end
+
def start
check_procfile!
engine.start
@@ -53,7 +61,20 @@ def check
error "no processes defined" unless engine.procfile.entries.length > 0
display "valid procfile detected (#{engine.procfile.process_names.join(', ')})"
end
-
+
+ desc "run COMMAND", "Run a command using your application's environment"
+
+ def run(*args)
+ engine.apply_environment!
+ begin
+ exec args.join(" ")
+ rescue Errno::EACCES
+ error "not executable: #{args.first}"
+ rescue Errno::ENOENT
+ error "command not found: #{args.first}"
+ end
+ end
+
private ######################################################################
def check_procfile!
@@ -87,5 +108,4 @@ def options
defaults = YAML::load_file(".foreman") || {}
Thor::CoreExt::HashWithIndifferentAccess.new(defaults.merge(original_options))
end
-
end
View
49 spec/foreman/cli_spec.rb
@@ -89,5 +89,54 @@
end
end
end
+
+ describe "run" do
+ describe "with a valid Procfile" do
+ before { write_procfile }
+
+ describe "and a command" do
+ let(:command) { ["ls", "-l"] }
+
+ before(:each) do
+ stub(subject).exec
+ end
+
+ it "should load the environment file" do
+ write_env
+ preserving_env do
+ subject.run *command
+ ENV["FOO"].should == "bar"
+ end
+
+ ENV["FOO"].should be_nil
+ end
+
+ it "should runute the command as a string" do
+ mock(subject).exec(command.join(" "))
+ subject.run *command
+ end
+ end
+
+ describe "and a non-existent command" do
+ let(:command) { "iuhtngrglhulhdfg" }
+
+ it "should print an error" do
+ mock_error(subject, "command not found: #{command}") do
+ subject.run command
+ end
+ end
+ end
+
+ describe "and a non-executable command" do
+ let(:command) { __FILE__ }
+
+ it "should print an error" do
+ mock_error(subject, "not executable: #{command}") do
+ subject.run command
+ end
+ end
+ end
+ end
+ end
end
View
18 spec/helper_spec.rb
@@ -0,0 +1,18 @@
+require "spec_helper"
+
+describe "spec helpers" do
+ describe "#preserving_env" do
+ after { ENV.delete "FOO" }
+
+ it "should remove added environment vars" do
+ preserving_env { ENV["FOO"] = "baz" }
+ ENV["FOO"].should == nil
+ end
+
+ it "should reset modified environment vars" do
+ ENV["FOO"] = "bar"
+ preserving_env { ENV["FOO"] = "baz"}
+ ENV["FOO"].should == "bar"
+ end
+ end
+end
View
10 spec/spec_helper.rb
@@ -63,6 +63,16 @@ def example_export_file(filename)
data
end
+def preserving_env
+ old_env = ENV.to_hash
+ begin
+ yield
+ ensure
+ ENV.clear
+ ENV.update(old_env)
+ end
+end
+
RSpec.configure do |config|
config.color_enabled = true
config.include FakeFS::SpecHelpers

0 comments on commit 98337c9

Please sign in to comment.
Something went wrong with that request. Please try again.