summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMitchell Hashimoto <mitchell.hashimoto@gmail.com>2011-01-16 14:27:24 -0800
committerMitchell Hashimoto <mitchell.hashimoto@gmail.com>2011-01-16 14:28:13 -0800
commitc1b5c7f515a0add663fb532859d91e28ef37a971 (patch)
tree0583622c86b3242ad8a1cc2d5c70d31030cc781c
parent76d1c2aefb32cc3688e3f7c0a5c8bbf713a123ed (diff)
downloadpuppet-c1b5c7f515a0add663fb532859d91e28ef37a971.tar.gz
puppet-c1b5c7f515a0add663fb532859d91e28ef37a971.tar.xz
puppet-c1b5c7f515a0add663fb532859d91e28ef37a971.zip
(#5913) Fix Puppet::Application.find constant lookup behavior
Puppet::Application.find now only looks in the Puppet::Application namespace for the given constant.
-rw-r--r--lib/puppet/application.rb11
-rwxr-xr-xspec/unit/application_spec.rb19
2 files changed, 28 insertions, 2 deletions
diff --git a/lib/puppet/application.rb b/lib/puppet/application.rb
index f0159a65d..17ad69cee 100644
--- a/lib/puppet/application.rb
+++ b/lib/puppet/application.rb
@@ -212,10 +212,17 @@ class Application
end
def find(name)
- self.const_get(name.to_s.capitalize)
- rescue
+ klass = name.to_s.capitalize
+
+ # const_defined? is used before const_get since const_defined? will only
+ # check within our namespace, whereas const_get will check ancestor
+ # trees as well, resulting in unexpected behaviour.
+ if !self.const_defined?(klass)
puts "Unable to find application '#{name.to_s}'."
Kernel::exit(1)
+ end
+
+ self.const_get(klass)
end
def [](name)
diff --git a/spec/unit/application_spec.rb b/spec/unit/application_spec.rb
index f68a7e209..c0f97336c 100755
--- a/spec/unit/application_spec.rb
+++ b/spec/unit/application_spec.rb
@@ -16,6 +16,25 @@ describe Puppet::Application do
Puppet.settings.stubs(:parse)
end
+ describe "finding" do
+ before do
+ @klass = Puppet::Application
+ @klass.stubs(:puts)
+ end
+
+ it "should find classes in the namespace" do
+ @klass.find("Agent").should == @klass::Agent
+ end
+
+ it "should not find classes outside the namespace" do
+ lambda { @klass.find("String") }.should raise_error(SystemExit)
+ end
+
+ it "should exit if it can't find a class" do
+ lambda { @klass.find("ThisShallNeverEverEverExistAsdf") }.should raise_error(SystemExit)
+ end
+ end
+
describe ".run_mode" do
it "should default to user" do
@appclass.run_mode.name.should == :user