Add "exec" action to allow execution of arbitrary commands with the app's environment.

This commit is contained in:
Matt Griffin
2012-01-04 14:45:49 -05:00
parent fff15bc627
commit a34bc59721
4 changed files with 88 additions and 0 deletions
+11
View File
@@ -53,7 +53,18 @@ class Foreman::CLI < Thor
error "no processes defined" unless engine.procfile.entries.length > 0
display "valid procfile detected (#{engine.procfile.process_names.join(', ')})"
end
desc "exec COMMAND", "Run a command using your application's environment"
def exec(*args)
engine.apply_environment!
Kernel.exec args.join(" ")
rescue Errno::EACCES
error "not executable: #{args.first}"
rescue Errno::ENOENT
error "command not found: #{args.first}"
end
private ######################################################################
def check_procfile!
+49
View File
@@ -89,5 +89,54 @@ describe "Foreman::CLI" do
end
end
end
describe "exec" do
describe "with a valid Procfile" do
before { write_procfile }
describe "and a command" do
let(:command) { ["ls", "-l"] }
before(:each) do
stub(Kernel).exec
end
it "should load the environment file" do
write_env
preserving_env do
subject.exec *command
ENV["FOO"].should == "bar"
end
ENV["FOO"].should be_nil
end
it "should execute the command as a string" do
mock(Kernel).exec(command.join(" "))
subject.exec *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.exec 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.exec command
end
end
end
end
end
end
+18
View File
@@ -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
+10
View File
@@ -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