summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/puppet/application/faces.rb6
-rw-r--r--lib/puppet/indirector/terminus.rb9
-rw-r--r--lib/puppet/util/autoload.rb30
-rwxr-xr-xspec/unit/application/indirection_base_spec.rb3
-rwxr-xr-xspec/unit/indirector/terminus_spec.rb6
-rwxr-xr-xspec/unit/util/autoload_spec.rb4
6 files changed, 30 insertions, 28 deletions
diff --git a/lib/puppet/application/faces.rb b/lib/puppet/application/faces.rb
index e7fce66b1..3145da821 100644
--- a/lib/puppet/application/faces.rb
+++ b/lib/puppet/application/faces.rb
@@ -66,7 +66,7 @@ Copyright (c) 2011 Puppet Labs, LLC Licensed under the Apache 2.0 License
str = "#{name}:\n"
if arguments.include?("terminuses")
begin
- terms = terminus_classes(name.to_sym)
+ terms = Puppet::Indirector::Face.terminus_classes(name.to_sym)
str << "\tTerminuses: #{terms.join(", ")}\n"
rescue => detail
puts detail.backtrace if Puppet[:trace]
@@ -107,10 +107,6 @@ Copyright (c) 2011 Puppet Labs, LLC Licensed under the Apache 2.0 License
Puppet::Face.faces
end
- def terminus_classes(indirection)
- Puppet::Indirector::Terminus.terminus_classes(indirection).collect { |t| t.to_s }.sort
- end
-
def actions(indirection)
return [] unless face = Puppet::Face[indirection, '0.0.1']
face.load_actions
diff --git a/lib/puppet/indirector/terminus.rb b/lib/puppet/indirector/terminus.rb
index 4ebd0d004..d488869d1 100644
--- a/lib/puppet/indirector/terminus.rb
+++ b/lib/puppet/indirector/terminus.rb
@@ -111,12 +111,9 @@ class Puppet::Indirector::Terminus
# Return all terminus classes for a given indirection.
def terminus_classes(indirection_name)
setup_instance_loading indirection_name
-
- # Load them all.
- instance_loader(indirection_name).loadall
-
- # And return the list of names.
- loaded_instances(indirection_name)
+ instance_loader(indirection_name).files_to_load.map do |file|
+ File.basename(file).chomp(".rb").intern
+ end
end
private
diff --git a/lib/puppet/util/autoload.rb b/lib/puppet/util/autoload.rb
index f0dd0a5c5..6537a4a4e 100644
--- a/lib/puppet/util/autoload.rb
+++ b/lib/puppet/util/autoload.rb
@@ -105,26 +105,28 @@ class Puppet::Util::Autoload
# so that already-loaded files don't get reloaded unnecessarily.
def loadall
# Load every instance of everything we can find.
- searchpath.each do |dir|
- Dir.glob("#{dir}/*.rb").each do |file|
- name = File.basename(file).sub(".rb", '').intern
- next if loaded?(name)
- begin
- Kernel.require file
- loaded(name, file)
- rescue SystemExit,NoMemoryError
- raise
- rescue Exception => detail
- puts detail.backtrace if Puppet[:trace]
- raise Puppet::Error, "Could not autoload #{file}: #{detail}"
- end
+ files_to_load.each do |file|
+ name = File.basename(file).chomp(".rb").intern
+ next if loaded?(name)
+ begin
+ Kernel.require file
+ loaded(name, file)
+ rescue SystemExit,NoMemoryError
+ raise
+ rescue Exception => detail
+ puts detail.backtrace if Puppet[:trace]
+ raise Puppet::Error, "Could not autoload #{file}: #{detail}"
end
end
end
+ def files_to_load
+ searchpath.map { |dir| Dir.glob("#{dir}/*.rb") }.flatten
+ end
+
# The list of directories to search through for loadable plugins.
def searchpath(env=nil)
- search_directories(env).collect { |d| File.join(d, @path) }.find_all { |d| FileTest.directory?(d) }
+ search_directories(env).uniq.collect { |d| File.join(d, @path) }.find_all { |d| FileTest.directory?(d) }
end
def module_directories(env=nil)
diff --git a/spec/unit/application/indirection_base_spec.rb b/spec/unit/application/indirection_base_spec.rb
index d72def6cf..8a5eee2c6 100755
--- a/spec/unit/application/indirection_base_spec.rb
+++ b/spec/unit/application/indirection_base_spec.rb
@@ -19,7 +19,6 @@ face.instance_variable_set('@version', :current)
Puppet::Face.register(face)
########################################################################
-
describe Puppet::Application::IndirectionBase do
subject { Puppet::Application::TestIndirection.new }
@@ -27,6 +26,8 @@ describe Puppet::Application::IndirectionBase do
# It would be nice not to have to stub this, but whatever... writing an
# entire indirection stack would cause us more grief. --daniel 2011-03-31
terminus = stub_everything("test indirection terminus")
+ terminus.stubs(:name).returns(:testindirection)
+
Puppet::Indirector::Indirection.expects(:instance).
with(:testindirection).returns(terminus)
diff --git a/spec/unit/indirector/terminus_spec.rb b/spec/unit/indirector/terminus_spec.rb
index 33932cfca..2f37c1ff5 100755
--- a/spec/unit/indirector/terminus_spec.rb
+++ b/spec/unit/indirector/terminus_spec.rb
@@ -242,3 +242,9 @@ describe Puppet::Indirector::Terminus, " when creating terminus class types", :'
end
end
+describe Puppet::Indirector::Terminus, " when listing terminus classes" do
+ it "should list the terminus files available to load" do
+ Puppet::Util::Autoload.any_instance.stubs(:files_to_load).returns ["/foo/bar/baz", "/max/runs/marathon"]
+ Puppet::Indirector::Terminus.terminus_classes('my_stuff').should == [:baz, :marathon]
+ end
+end
diff --git a/spec/unit/util/autoload_spec.rb b/spec/unit/util/autoload_spec.rb
index 512f06c75..d61b7689e 100755
--- a/spec/unit/util/autoload_spec.rb
+++ b/spec/unit/util/autoload_spec.rb
@@ -51,9 +51,9 @@ describe Puppet::Util::Autoload do
@autoload.search_directories.should == %w{/one /two /libdir1 /lib/dir/two /third/lib/dir} + $LOAD_PATH
end
- it "should include in its search path all of the search directories that have a subdirectory matching the autoload path" do
+ it "should include in its search path all of the unique search directories that have a subdirectory matching the autoload path" do
@autoload = Puppet::Util::Autoload.new("foo", "loaddir")
- @autoload.expects(:search_directories).returns %w{/one /two /three}
+ @autoload.expects(:search_directories).returns %w{/one /two /three /three}
FileTest.expects(:directory?).with("/one/loaddir").returns true
FileTest.expects(:directory?).with("/two/loaddir").returns false
FileTest.expects(:directory?).with("/three/loaddir").returns true