Not so much commenting on your patch, but:

I've got a conflicting patch to this in my data_app branch that also tries to 
load missing applications:

diff --git a/lib/puppet/application.rb b/lib/puppet/application.rb
index f0159a6..211daf8 100644
--- a/lib/puppet/application.rb
+++ b/lib/puppet/application.rb
@@ -212,9 +212,10 @@ class Application
     end
 
     def find(name)
+        require "puppet/application/#{name.to_s.downcase}"
         self.const_get(name.to_s.capitalize)
-    rescue
-        puts "Unable to find application '#{name.to_s}'."
+    rescue SystemError
+        $stderr.puts "Unable to find application '#{name.to_s}'."
         Kernel::exit(1)
     end

I think the two patches together are even better.

On Jan 16, 2011, at 2:43 PM, Mitchell Hashimoto wrote:

> Puppet::Application.find now only looks in the Puppet::Application
> namespace for the given constant.
> 
> Signed-off-by: Mitchell Hashimoto <[email protected]>
> ---
> lib/puppet/application.rb     |   11 +++++++++--
> spec/unit/application_spec.rb |   19 +++++++++++++++++++
> 2 files changed, 28 insertions(+), 2 deletions(-)
> 
> diff --git a/lib/puppet/application.rb b/lib/puppet/application.rb
> index f0159a6..17ad69c 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 f68a7e2..c0f9733 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
> -- 
> 1.7.3.2
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "Puppet Developers" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to 
> [email protected].
> For more options, visit this group at 
> http://groups.google.com/group/puppet-dev?hl=en.
> 


-- 
There is no expedient to which a man will not go to avoid the labor
of thinking.        --Thomas A. Edison
---------------------------------------------------------------------
Luke Kanies  -|-   http://puppetlabs.com   -|-   +1(615)594-8199




-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.

Reply via email to