[Pkg-puppet-devel] [SCM] Puppet packaging for Debian branch, experimental, updated. debian/2.6.8-1-844-g7ec39d5

Nick Lewis nick at puppetlabs.com
Tue May 10 08:07:16 UTC 2011


The following commit has been merged in the experimental branch:
commit 847ac203f9c0b5fce299e87a63b0de5d3ef416f6
Author: Nick Lewis <nick at puppetlabs.com>
Date:   Tue Mar 22 16:44:01 2011 -0700

    maint: Implement an InterfaceCollection class to manage interfaces
    
    Having an instance variable on class Interface is insufficient for
    Interface::Indirector. This also changes the semantics of "Interface.interface"
    to handle registration and loading actions, and for "Interface.new" to only
    instantiate an Interface. Thus, consumers of the API should typically use
    "Interface.interface", unless they have reasons to not want an interface
    automatically registered.
    
    Paired-With: Pieter van de Bruggen

diff --git a/lib/puppet/application/interface_base.rb b/lib/puppet/application/interface_base.rb
index 654674d..7a31ce3 100644
--- a/lib/puppet/application/interface_base.rb
+++ b/lib/puppet/application/interface_base.rb
@@ -1,4 +1,5 @@
 require 'puppet/application'
+require 'puppet/interface'
 
 class Puppet::Application::InterfaceBase < Puppet::Application
   should_parse_config
@@ -40,11 +41,6 @@ class Puppet::Application::InterfaceBase < Puppet::Application
     @exit_code || 0
   end
 
-  def initialize(*args)
-    require 'puppet/interface'
-    super
-  end
-
   def main
     # Call the method associated with the provided action (e.g., 'find').
     if result = interface.send(verb, *arguments)
diff --git a/lib/puppet/interface.rb b/lib/puppet/interface.rb
index 0ec0f80..f82d623 100644
--- a/lib/puppet/interface.rb
+++ b/lib/puppet/interface.rb
@@ -3,6 +3,7 @@ require 'puppet/util/autoload'
 
 class Puppet::Interface
   require 'puppet/interface/action_manager'
+  require 'puppet/interface/interface_collection'
 
   include Puppet::Interface::ActionManager
   extend Puppet::Interface::ActionManager
@@ -19,50 +20,27 @@ class Puppet::Interface
   end
 
   def self.interfaces
-    unless @loaded
-      @loaded = true
-      $LOAD_PATH.each do |dir|
-        next unless FileTest.directory?(dir)
-        Dir.chdir(dir) do
-          Dir.glob("puppet/interface/*.rb").collect { |f| f.sub(/\.rb/, '') }.each do |file|
-            iname = file.sub(/\.rb/, '')
-            begin
-              require iname
-            rescue Exception => detail
-              puts detail.backtrace if Puppet[:trace]
-              raise "Could not load #{iname} from #{dir}/#{file}: #{detail}"
-            end
-          end
-        end
-      end
-    end
-    return @interfaces.keys
+    Puppet::Interface::InterfaceCollection.interfaces
   end
 
   def self.interface?(name)
-    name = underscorize(name)
-    require "puppet/interface/#{name}" unless @interfaces.has_key? name
-    return @interfaces.has_key? name
-  rescue LoadError
-    return false
-  end
-
-  def self.interface(name, &blk)
-    interface = interface?(name) ? @interfaces[underscorize(name)] : new(name)
-    interface.instance_eval(&blk) if block_given?
-    return interface
+    Puppet::Interface::InterfaceCollection.interface?(name)
   end
 
-  def self.register_interface(name, instance)
-    @interfaces[underscorize(name)] = instance
+  def self.register(instance)
+    Puppet::Interface::InterfaceCollection.register(instance)
   end
 
-  def self.underscorize(name)
-    unless name.to_s =~ /^[-_a-z]+$/i then
-      raise ArgumentError, "#{name.inspect} (#{name.class}) is not a valid interface name"
+  def self.interface(name, &blk)
+    if interface?(name)
+      interface = Puppet::Interface::InterfaceCollection[name]
+      interface.instance_eval(&blk) if blk
+    else
+      interface = new(name, &blk)
+      Puppet::Interface::InterfaceCollection.register(interface)
+      interface.load_actions
     end
-
-    name.to_s.downcase.split(/[-_]/).join('_').to_sym
+    return interface
   end
 
   attr_accessor :default_format
@@ -71,30 +49,16 @@ class Puppet::Interface
     self.default_format = format.to_sym
   end
 
-  # Return the interface name.
-  def name
-    @name || self.to_s.sub(/.+::/, '').downcase
-  end
-
-  attr_accessor :type, :verb, :name, :arguments, :options
+  attr_accessor :type, :verb, :arguments, :options
+  attr_reader :name
 
   def initialize(name, options = {}, &block)
-    @name = self.class.underscorize(name)
+    @name = Puppet::Interface::InterfaceCollection.underscorize(name)
 
     @default_format = :pson
     options.each { |opt, val| send(opt.to_s + "=", val) }
 
-    # We have to register before loading actions,
-    # since the actions require the registration
-    # Use the full class name, so this works with
-    # subclasses.
-    Puppet::Interface.register_interface(name, self)
-
-    load_actions
-
-    if block_given?
-      instance_eval(&block)
-    end
+    instance_eval(&block) if block
   end
 
   # Try to find actions defined in other files.
@@ -102,7 +66,7 @@ class Puppet::Interface
     path = "puppet/interface/#{name}"
 
     loaded = []
-    self.class.autoloader.search_directories.each do |dir|
+    Puppet::Interface.autoloader.search_directories.each do |dir|
       fdir = ::File.join(dir, path)
       next unless FileTest.directory?(fdir)
 
diff --git a/lib/puppet/interface/catalog.rb b/lib/puppet/interface/catalog.rb
index c0af53b..defe321 100644
--- a/lib/puppet/interface/catalog.rb
+++ b/lib/puppet/interface/catalog.rb
@@ -1,6 +1,6 @@
 require 'puppet/interface/indirector'
 
-Puppet::Interface::Indirector.new(:catalog) do
+Puppet::Interface::Indirector.interface(:catalog) do
   action(:apply) do
     invoke do |catalog|
       report = Puppet::Transaction::Report.new("apply")
diff --git a/lib/puppet/interface/certificate.rb b/lib/puppet/interface/certificate.rb
index 52ba4e3..09da0a6 100644
--- a/lib/puppet/interface/certificate.rb
+++ b/lib/puppet/interface/certificate.rb
@@ -1,4 +1,4 @@
 require 'puppet/interface/indirector'
 
-Puppet::Interface::Indirector.new(:certificate) do
+Puppet::Interface::Indirector.interface(:certificate) do
 end
diff --git a/lib/puppet/interface/certificate_request.rb b/lib/puppet/interface/certificate_request.rb
index 77b485f..b85c15f 100644
--- a/lib/puppet/interface/certificate_request.rb
+++ b/lib/puppet/interface/certificate_request.rb
@@ -1,4 +1,4 @@
 require 'puppet/interface/indirector'
 
-Puppet::Interface::Indirector.new(:certificate_request) do
+Puppet::Interface::Indirector.interface(:certificate_request) do
 end
diff --git a/lib/puppet/interface/certificate_revocation_list.rb b/lib/puppet/interface/certificate_revocation_list.rb
index ee1e6a8..956fb64 100644
--- a/lib/puppet/interface/certificate_revocation_list.rb
+++ b/lib/puppet/interface/certificate_revocation_list.rb
@@ -1,4 +1,4 @@
 require 'puppet/interface/indirector'
 
-Puppet::Interface::Indirector.new(:certificate_revocation_list) do
+Puppet::Interface::Indirector.interface(:certificate_revocation_list) do
 end
diff --git a/lib/puppet/interface/config.rb b/lib/puppet/interface/config.rb
index 0aecc26..79d2ee7 100644
--- a/lib/puppet/interface/config.rb
+++ b/lib/puppet/interface/config.rb
@@ -1,6 +1,6 @@
 require 'puppet/interface'
 
-Puppet::Interface.new(:config) do
+Puppet::Interface.interface(:config) do
   action(:print) do
     invoke do |*args|
       Puppet.settings[:configprint] = args.join(",")
diff --git a/lib/puppet/interface/configurer.rb b/lib/puppet/interface/configurer.rb
index 2fbde27..0d21c4d 100644
--- a/lib/puppet/interface/configurer.rb
+++ b/lib/puppet/interface/configurer.rb
@@ -1,6 +1,6 @@
 require 'puppet/interface'
 
-Puppet::Interface.new(:configurer) do
+Puppet::Interface.interface(:configurer) do
   action(:synchronize) do
     invoke do |certname|
       facts = Puppet::Interface.interface(:facts).find(certname)
diff --git a/lib/puppet/interface/facts.rb b/lib/puppet/interface/facts.rb
index 8843d29..97e2271 100644
--- a/lib/puppet/interface/facts.rb
+++ b/lib/puppet/interface/facts.rb
@@ -1,7 +1,7 @@
 require 'puppet/interface/indirector'
 require 'puppet/node/facts'
 
-Puppet::Interface::Indirector.new(:facts) do
+Puppet::Interface::Indirector.interface(:facts) do
   set_default_format :yaml
 
   # Upload our facts to the server
diff --git a/lib/puppet/interface/file.rb b/lib/puppet/interface/file.rb
index 859f92c..f38af2b 100644
--- a/lib/puppet/interface/file.rb
+++ b/lib/puppet/interface/file.rb
@@ -1,5 +1,5 @@
 require 'puppet/interface/indirector'
 
-Puppet::Interface::Indirector.new(:file) do
+Puppet::Interface::Indirector.interface(:file) do
   set_indirection_name :file_bucket_file
 end
diff --git a/lib/puppet/interface/interface_collection.rb b/lib/puppet/interface/interface_collection.rb
new file mode 100644
index 0000000..47ed702
--- /dev/null
+++ b/lib/puppet/interface/interface_collection.rb
@@ -0,0 +1,50 @@
+require 'puppet/interface'
+
+module Puppet::Interface::InterfaceCollection
+  @interfaces = {}
+
+  def self.interfaces
+    unless @loaded
+      @loaded = true
+      $LOAD_PATH.each do |dir|
+        next unless FileTest.directory?(dir)
+        Dir.chdir(dir) do
+          Dir.glob("puppet/interface/*.rb").collect { |f| f.sub(/\.rb/, '') }.each do |file|
+            iname = file.sub(/\.rb/, '')
+            begin
+              require iname
+            rescue Exception => detail
+              puts detail.backtrace if Puppet[:trace]
+              raise "Could not load #{iname} from #{dir}/#{file}: #{detail}"
+            end
+          end
+        end
+      end
+    end
+    return @interfaces.keys
+  end
+
+  def self.[](name)
+    @interfaces[underscorize(name)] if interface?(name)
+  end
+
+  def self.interface?(name)
+    name = underscorize(name)
+    require "puppet/interface/#{name}" unless @interfaces.has_key? name
+    return @interfaces.has_key? name
+  rescue LoadError
+    return false
+  end
+
+  def self.register(interface)
+    @interfaces[underscorize(interface.name)] = interface
+  end
+
+  def self.underscorize(name)
+    unless name.to_s =~ /^[-_a-z]+$/i then
+      raise ArgumentError, "#{name.inspect} (#{name.class}) is not a valid interface name"
+    end
+
+    name.to_s.downcase.split(/[-_]/).join('_').to_sym
+  end
+end
diff --git a/lib/puppet/interface/key.rb b/lib/puppet/interface/key.rb
index 9343891..5751988 100644
--- a/lib/puppet/interface/key.rb
+++ b/lib/puppet/interface/key.rb
@@ -1,4 +1,4 @@
 require 'puppet/interface/indirector'
 
-Puppet::Interface::Indirector.new(:key) do
+Puppet::Interface::Indirector.interface(:key) do
 end
diff --git a/lib/puppet/interface/node.rb b/lib/puppet/interface/node.rb
index 0a0f57a..8940fd7 100644
--- a/lib/puppet/interface/node.rb
+++ b/lib/puppet/interface/node.rb
@@ -1,5 +1,5 @@
 require 'puppet/interface/indirector'
 
-Puppet::Interface::Indirector.new(:node) do
+Puppet::Interface::Indirector.interface(:node) do
   set_default_format :yaml
 end
diff --git a/lib/puppet/interface/report.rb b/lib/puppet/interface/report.rb
index e785ae2..56a58f6 100644
--- a/lib/puppet/interface/report.rb
+++ b/lib/puppet/interface/report.rb
@@ -1,6 +1,6 @@
 require 'puppet/interface/indirector'
 
-Puppet::Interface::Indirector.new(:report) do
+Puppet::Interface::Indirector.interface(:report) do
   action(:submit) do
     invoke do |report|
       begin
diff --git a/lib/puppet/interface/resource.rb b/lib/puppet/interface/resource.rb
index 65f2dec..130f40f 100644
--- a/lib/puppet/interface/resource.rb
+++ b/lib/puppet/interface/resource.rb
@@ -1,4 +1,4 @@
 require 'puppet/interface/indirector'
 
-Puppet::Interface::Indirector.new(:resource) do
+Puppet::Interface::Indirector.interface(:resource) do
 end
diff --git a/lib/puppet/interface/resource_type.rb b/lib/puppet/interface/resource_type.rb
index bf16652..70bf3b9 100644
--- a/lib/puppet/interface/resource_type.rb
+++ b/lib/puppet/interface/resource_type.rb
@@ -1,4 +1,4 @@
 require 'puppet/interface/indirector'
 
-Puppet::Interface::Indirector.new(:resource_type) do
+Puppet::Interface::Indirector.interface(:resource_type) do
 end
diff --git a/lib/puppet/interface/status.rb b/lib/puppet/interface/status.rb
index 1a1d349..432d1ce 100644
--- a/lib/puppet/interface/status.rb
+++ b/lib/puppet/interface/status.rb
@@ -1,4 +1,4 @@
 require 'puppet/interface/indirector'
 
-Puppet::Interface::Indirector.new(:status) do
+Puppet::Interface::Indirector.interface(:status) do
 end
diff --git a/spec/unit/application/interface_base_spec.rb b/spec/unit/application/interface_base_spec.rb
index ba1e6ab..3e7c04f 100644
--- a/spec/unit/application/interface_base_spec.rb
+++ b/spec/unit/application/interface_base_spec.rb
@@ -4,7 +4,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/application/interface_base'
 require 'puppet/application/interface_base'
 
-base_interface = Puppet::Interface.new(:basetest)
+base_interface = Puppet::Interface.interface(:basetest)
 class Puppet::Application::InterfaceBase::Basetest < Puppet::Application::InterfaceBase
 end
 
diff --git a/spec/unit/interface/action_manager_spec.rb b/spec/unit/interface/action_manager_spec.rb
index 0b12db3..bf101b3 100644
--- a/spec/unit/interface/action_manager_spec.rb
+++ b/spec/unit/interface/action_manager_spec.rb
@@ -10,65 +10,60 @@ class ActionManagerTester
 end
 
 describe Puppet::Interface::ActionManager do
-  before do
-    @tester = ActionManagerTester.new
-  end
+  subject { ActionManagerTester.new }
 
   describe "when included in a class" do
     it "should be able to define an action" do
-      @tester.action(:foo) do
+      subject.action(:foo) do
         invoke { "something "}
       end
     end
 
     it "should be able to list defined actions" do
-      @tester.action(:foo) do
+      subject.action(:foo) do
         invoke { "something" }
       end
-      @tester.action(:bar) do
+      subject.action(:bar) do
         invoke { "something" }
       end
 
-      @tester.actions.should include(:bar)
-      @tester.actions.should include(:foo)
+      subject.actions.should include(:bar)
+      subject.actions.should include(:foo)
     end
 
     it "should be able to indicate when an action is defined" do
-      @tester.action(:foo) do
+      subject.action(:foo) do
         invoke { "something" }
       end
 
-      @tester.should be_action(:foo)
+      subject.should be_action(:foo)
     end
   end
 
   describe "when used to extend a class" do
-    before do
-      @tester = Class.new
-      @tester.extend(Puppet::Interface::ActionManager)
-    end
+    subject { Class.new.extend(Puppet::Interface::ActionManager) }
 
     it "should be able to define an action" do
-      @tester.action(:foo) do
+      subject.action(:foo) do
         invoke { "something "}
       end
     end
 
     it "should be able to list defined actions" do
-      @tester.action(:foo) do
+      subject.action(:foo) do
         invoke { "something" }
       end
-      @tester.action(:bar) do
+      subject.action(:bar) do
         invoke { "something" }
       end
 
-      @tester.actions.should include(:bar)
-      @tester.actions.should include(:foo)
+      subject.actions.should include(:bar)
+      subject.actions.should include(:foo)
     end
 
     it "should be able to indicate when an action is defined" do
-      @tester.action(:foo) { "something" }
-      @tester.should be_action(:foo)
+      subject.action(:foo) { "something" }
+      subject.should be_action(:foo)
     end
   end
 
diff --git a/spec/unit/interface/catalog_spec.rb b/spec/unit/interface/catalog_spec.rb
index 8eb0040..78d6211 100644
--- a/spec/unit/interface/catalog_spec.rb
+++ b/spec/unit/interface/catalog_spec.rb
@@ -3,22 +3,5 @@
 require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/catalog'
 
-describe Puppet::Interface.interface(:catalog) do
-  before do
-    @interface = Puppet::Interface.interface(:catalog)
-  end
-
-  it "should be a subclass of 'Indirection'" do
-    @interface.should be_instance_of(Puppet::Interface::Indirector)
-  end
-
-  it "should refer to the 'catalog' indirection" do
-    @interface.indirection.name.should == :catalog
-  end
-
-  [:find, :save, :search, :save].each do |method|
-    it "should have  #{method} action defined" do
-      @interface.should be_action(method)
-    end
-  end
+describe Puppet::Interface::Indirector.interface(:catalog) do
 end
diff --git a/spec/unit/interface/certificate_request_spec.rb b/spec/unit/interface/certificate_request_spec.rb
index 8a613e5..a6ab8d1 100644
--- a/spec/unit/interface/certificate_request_spec.rb
+++ b/spec/unit/interface/certificate_request_spec.rb
@@ -3,22 +3,5 @@
 require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/certificate_request'
 
-describe Puppet::Interface.interface(:certificate_request) do
-  before do
-    @interface = Puppet::Interface.interface(:certificate_request)
-  end
-
-  it "should be a subclass of 'Indirection'" do
-    @interface.should be_instance_of(Puppet::Interface::Indirector)
-  end
-
-  it "should refer to the 'certificate_request' indirection" do
-    @interface.indirection.name.should == :certificate_request
-  end
-
-  [:find, :save, :search, :save].each do |method|
-    it "should have  #{method} action defined" do
-      @interface.should be_action(method)
-    end
-  end
+describe Puppet::Interface::Indirector.interface(:certificate_request) do
 end
diff --git a/spec/unit/interface/certificate_revocation_list_spec.rb b/spec/unit/interface/certificate_revocation_list_spec.rb
index 8ee341b..a98b48d 100644
--- a/spec/unit/interface/certificate_revocation_list_spec.rb
+++ b/spec/unit/interface/certificate_revocation_list_spec.rb
@@ -3,22 +3,5 @@
 require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/certificate_revocation_list'
 
-describe Puppet::Interface.interface(:certificate_revocation_list) do
-  before do
-    @interface = Puppet::Interface.interface(:certificate_revocation_list)
-  end
-
-  it "should be a subclass of 'Indirection'" do
-    @interface.should be_instance_of(Puppet::Interface::Indirector)
-  end
-
-  it "should refer to the 'certificate_revocation_list' indirection" do
-    @interface.indirection.name.should == :certificate_revocation_list
-  end
-
-  [:find, :save, :search, :save].each do |method|
-    it "should have  #{method} action defined" do
-      @interface.should be_action(method)
-    end
-  end
+describe Puppet::Interface::Indirector.interface(:certificate_revocation_list) do
 end
diff --git a/spec/unit/interface/certificate_spec.rb b/spec/unit/interface/certificate_spec.rb
index 47ddcb5..6a32534 100644
--- a/spec/unit/interface/certificate_spec.rb
+++ b/spec/unit/interface/certificate_spec.rb
@@ -3,22 +3,5 @@
 require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/certificate'
 
-describe Puppet::Interface.interface(:certificate) do
-  before do
-    @interface = Puppet::Interface.interface(:certificate)
-  end
-
-  it "should be a subclass of 'Indirection'" do
-    @interface.should be_instance_of(Puppet::Interface::Indirector)
-  end
-
-  it "should refer to the 'certificate' indirection" do
-    @interface.indirection.name.should == :certificate
-  end
-
-  [:find, :save, :search, :save].each do |method|
-    it "should have  #{method} action defined" do
-      @interface.should be_action(method)
-    end
-  end
+describe Puppet::Interface::Indirector.interface(:certificate) do
 end
diff --git a/spec/unit/interface/config_spec.rb b/spec/unit/interface/config_spec.rb
index 79c65f2..e8aafd4 100644
--- a/spec/unit/interface/config_spec.rb
+++ b/spec/unit/interface/config_spec.rb
@@ -4,24 +4,16 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/config'
 
 describe Puppet::Interface.interface(:config) do
-  before do
-    @interface = Puppet::Interface.interface(:config)
-  end
-
-  it "should be a subclass of 'Indirection'" do
-    @interface.should be_instance_of(Puppet::Interface)
-  end
-
   it "should use Settings#print_config_options when asked to print" do
     Puppet.settings.stubs(:puts)
     Puppet.settings.expects(:print_config_options)
-    @interface.print
+    subject.print
   end
 
   it "should set 'configprint' to all desired values and call print_config_options when a specific value is provided" do
     Puppet.settings.stubs(:puts)
     Puppet.settings.expects(:print_config_options)
-    @interface.print("libdir", "ssldir")
+    subject.print("libdir", "ssldir")
     Puppet.settings[:configprint].should == "libdir,ssldir"
   end
 end
diff --git a/spec/unit/interface/facts_spec.rb b/spec/unit/interface/facts_spec.rb
index 03d6410..d0f87d3 100644
--- a/spec/unit/interface/facts_spec.rb
+++ b/spec/unit/interface/facts_spec.rb
@@ -3,17 +3,13 @@
 require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/facts'
 
-describe Puppet::Interface.interface(:facts) do
-  before do
-    @interface = Puppet::Interface.interface(:facts)
-  end
-
+describe Puppet::Interface::Indirector.interface(:facts) do
   it "should define an 'upload' fact" do
-    @interface.should be_action(:upload)
+    subject.should be_action(:upload)
   end
 
   it "should set its default format to :yaml" do
-    @interface.default_format.should == :yaml
+    subject.default_format.should == :yaml
   end
 
   describe "when uploading" do
diff --git a/spec/unit/interface/file_spec.rb b/spec/unit/interface/file_spec.rb
index fc7accf..54427a2 100644
--- a/spec/unit/interface/file_spec.rb
+++ b/spec/unit/interface/file_spec.rb
@@ -3,22 +3,5 @@
 require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/file'
 
-describe Puppet::Interface.interface(:file) do
-  before do
-    @interface = Puppet::Interface.interface(:file)
-  end
-
-  it "should be a subclass of 'Indirection'" do
-    @interface.should be_instance_of(Puppet::Interface::Indirector)
-  end
-
-  it "should refer to the 'file' indirection" do
-    @interface.indirection.name.should == :file_bucket_file
-  end
-
-  [:find, :save, :search, :save].each do |method|
-    it "should have  #{method} action defined" do
-      @interface.should be_action(method)
-    end
-  end
+describe Puppet::Interface::Indirector.interface(:file) do
 end
diff --git a/spec/unit/interface/indirector_spec.rb b/spec/unit/interface/indirector_spec.rb
index c4d93ad..0eb7a9a 100644
--- a/spec/unit/interface/indirector_spec.rb
+++ b/spec/unit/interface/indirector_spec.rb
@@ -12,10 +12,6 @@ describe Puppet::Interface::Indirector do
     @instance.stubs(:indirection).returns @indirection
   end
 
-  it "should be a subclass of Interface" do
-    Puppet::Interface::Indirector.superclass.should equal(Puppet::Interface)
-  end
-
   it "should be able to return a list of indirections" do
     Puppet::Interface::Indirector.indirections.should be_include("catalog")
   end
diff --git a/spec/unit/interface/interface_collection_spec.rb b/spec/unit/interface/interface_collection_spec.rb
new file mode 100644
index 0000000..536e694
--- /dev/null
+++ b/spec/unit/interface/interface_collection_spec.rb
@@ -0,0 +1,97 @@
+require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
+
+require 'puppet/interface/interface_collection'
+
+describe Puppet::Interface::InterfaceCollection do
+  before :each do
+    subject.instance_variable_set("@interfaces", {})
+  end
+
+  after :all do
+    subject.instance_variable_set("@interfaces", {})
+  end
+
+  describe "::interfaces" do
+  end
+
+  describe "::[]" do
+    before :each do
+      subject.instance_variable_set("@interfaces", {:foo => 10})
+    end
+
+    it "should return the interface with the given name" do
+      subject["foo"].should == 10
+    end
+
+    it "should attempt to load the interface if it isn't found" do
+      subject.expects(:require).with('puppet/interface/bar')
+      subject["bar"]
+    end
+  end
+
+  describe "::interface?" do
+    before :each do
+      subject.instance_variable_set("@interfaces", {:foo => 10})
+    end
+
+    it "should return true if the interface specified is registered" do
+      subject.interface?("foo").should == true
+    end
+
+    it "should attempt to require the interface if it is not registered" do
+      subject.expects(:require).with('puppet/interface/bar')
+      subject.interface?("bar")
+    end
+
+    it "should return true if requiring the interface registered it" do
+      subject.stubs(:require).with do
+        subject.instance_variable_set("@interfaces", {:bar => 20})
+      end
+      subject.interface?("bar").should == true
+    end
+
+    it "should return false if the interface is not registered" do
+      subject.stubs(:require).returns(true)
+      subject.interface?("bar").should == false
+    end
+
+    it "should return false if there is a LoadError requiring the interface" do
+      subject.stubs(:require).raises(LoadError)
+      subject.interface?("bar").should == false
+    end
+  end
+
+  describe "::register" do
+    it "should store the interface by name" do
+      interface = Puppet::Interface.new(:my_interface)
+      subject.register(interface)
+      subject.instance_variable_get("@interfaces").should == {:my_interface => interface}
+    end
+  end
+
+  describe "::underscorize" do
+    faulty = [1, "#foo", "$bar", "sturm und drang", :"sturm und drang"]
+    valid  = {
+      "Foo"      => :foo,
+      :Foo       => :foo,
+      "foo_bar"  => :foo_bar,
+      :foo_bar   => :foo_bar,
+      "foo-bar"  => :foo_bar,
+      :"foo-bar" => :foo_bar,
+    }
+
+    valid.each do |input, expect|
+      it "should map #{input.inspect} to #{expect.inspect}" do
+        result = subject.underscorize(input)
+        result.should == expect
+      end
+    end
+
+    faulty.each do |input|
+      it "should fail when presented with #{input.inspect} (#{input.class})" do
+        expect { subject.underscorize(input) }.
+          should raise_error ArgumentError, /not a valid interface name/
+      end
+    end
+  end
+end
diff --git a/spec/unit/interface/key_spec.rb b/spec/unit/interface/key_spec.rb
index 93a7c93..4b331d1 100644
--- a/spec/unit/interface/key_spec.rb
+++ b/spec/unit/interface/key_spec.rb
@@ -3,22 +3,5 @@
 require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/key'
 
-describe Puppet::Interface.interface(:key) do
-  before do
-    @interface = Puppet::Interface.interface(:key)
-  end
-
-  it "should be a subclass of 'Indirection'" do
-    @interface.should be_instance_of(Puppet::Interface::Indirector)
-  end
-
-  it "should refer to the 'key' indirection" do
-    @interface.indirection.name.should == :key
-  end
-
-  [:find, :save, :search, :save].each do |method|
-    it "should have  #{method} action defined" do
-      @interface.should be_action(method)
-    end
-  end
+describe Puppet::Interface::Indirector.interface(:key) do
 end
diff --git a/spec/unit/interface/node_spec.rb b/spec/unit/interface/node_spec.rb
index 6310930..b1b4ad4 100644
--- a/spec/unit/interface/node_spec.rb
+++ b/spec/unit/interface/node_spec.rb
@@ -3,26 +3,8 @@
 require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/node'
 
-describe Puppet::Interface.interface(:node) do
-  before do
-    @interface = Puppet::Interface.interface(:node)
-  end
-
-  it "should be a subclass of 'Indirection'" do
-    @interface.should be_instance_of(Puppet::Interface::Indirector)
-  end
-
+describe Puppet::Interface::Indirector.interface(:node) do
   it "should set its default format to :yaml" do
-    @interface.default_format.should == :yaml
-  end
-
-  it "should refer to the 'node' indirection" do
-    @interface.indirection.name.should == :node
-  end
-
-  [:find, :save, :search, :save].each do |method|
-    it "should have  #{method} action defined" do
-      @interface.should be_action(method)
-    end
+    subject.default_format.should == :yaml
   end
 end
diff --git a/spec/unit/interface/report_spec.rb b/spec/unit/interface/report_spec.rb
index b5bee1a..c424880 100644
--- a/spec/unit/interface/report_spec.rb
+++ b/spec/unit/interface/report_spec.rb
@@ -3,22 +3,5 @@
 require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/report'
 
-describe Puppet::Interface.interface(:report) do
-  before do
-    @interface = Puppet::Interface.interface(:report)
-  end
-
-  it "should be a subclass of 'Indirection'" do
-    @interface.should be_instance_of(Puppet::Interface::Indirector)
-  end
-
-  it "should refer to the 'report' indirection" do
-    @interface.indirection.name.should == :report
-  end
-
-  [:find, :save, :search, :save].each do |method|
-    it "should have  #{method} action defined" do
-      @interface.should be_action(method)
-    end
-  end
+describe Puppet::Interface::Indirector.interface(:report) do
 end
diff --git a/spec/unit/interface/resource_spec.rb b/spec/unit/interface/resource_spec.rb
index cad45b6..aab2753 100644
--- a/spec/unit/interface/resource_spec.rb
+++ b/spec/unit/interface/resource_spec.rb
@@ -3,22 +3,5 @@
 require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/resource'
 
-describe Puppet::Interface.interface(:resource) do
-  before do
-    @interface = Puppet::Interface.interface(:resource)
-  end
-
-  it "should be a subclass of 'Indirection'" do
-    @interface.should be_instance_of(Puppet::Interface::Indirector)
-  end
-
-  it "should refer to the 'resource' indirection" do
-    @interface.indirection.name.should == :resource
-  end
-
-  [:find, :save, :search, :save].each do |method|
-    it "should have  #{method} action defined" do
-      @interface.should be_action(method)
-    end
-  end
+describe Puppet::Interface::Indirector.interface(:resource) do
 end
diff --git a/spec/unit/interface/resource_type_spec.rb b/spec/unit/interface/resource_type_spec.rb
index 6c437c4..6e973c9 100644
--- a/spec/unit/interface/resource_type_spec.rb
+++ b/spec/unit/interface/resource_type_spec.rb
@@ -3,22 +3,5 @@
 require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/resource_type'
 
-describe Puppet::Interface.interface(:resource_type) do
-  before do
-    @interface = Puppet::Interface.interface(:resource_type)
-  end
-
-  it "should be a subclass of 'Indirection'" do
-    @interface.should be_instance_of(Puppet::Interface::Indirector)
-  end
-
-  it "should refer to the 'resource_type' indirection" do
-    @interface.indirection.name.should == :resource_type
-  end
-
-  [:find, :save, :search, :save].each do |method|
-    it "should have  #{method} action defined" do
-      @interface.should be_action(method)
-    end
-  end
+describe Puppet::Interface::Indirector.interface(:resource_type) do
 end
diff --git a/spec/unit/interface_spec.rb b/spec/unit/interface_spec.rb
index 876c794..e35da6b 100755
--- a/spec/unit/interface_spec.rb
+++ b/spec/unit/interface_spec.rb
@@ -4,32 +4,32 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper.rb')
 require 'puppet/interface'
 
 describe Puppet::Interface do
-  describe "at initialization" do
-    it "should require a name" do
-      Puppet::Interface.new(:me).name.should == :me
-    end
-
-    it "should register itself" do
-      Puppet::Interface.expects(:register_interface).with do |name, inst|
-        name == :me and inst.is_a?(Puppet::Interface)
-      end
-      Puppet::Interface.new(:me)
+  describe "#interface" do
+    it "should register the interface" do
+      interface = Puppet::Interface.interface(:interface_test_register)
+      interface.should == Puppet::Interface.interface(:interface_test_register)
     end
 
     it "should load actions" do
       Puppet::Interface.any_instance.expects(:load_actions)
-      Puppet::Interface.new(:me)
+      Puppet::Interface.interface(:interface_test_load_actions)
     end
 
     it "should instance-eval any provided block" do
-      face = Puppet::Interface.new(:me) do
-        action(:something) { "foo" }
+      face = Puppet::Interface.new(:interface_test_block) do
+        action(:something) do
+          invoke { "foo" }
+        end
       end
 
-      face.should be_action(:something)
+      face.something.should == "foo"
     end
   end
 
+  it "should have a name" do
+    Puppet::Interface.new(:me).name.should == :me
+  end
+
   it "should stringify with its own name" do
     Puppet::Interface.new(:me).to_s.should =~ /\bme\b/
   end
@@ -54,35 +54,9 @@ describe Puppet::Interface do
   end
 
   it "should try to require interfaces that are not known" do
-    Puppet::Interface.expects(:require).with "puppet/interface/foo"
+    Puppet::Interface::InterfaceCollection.expects(:require).with "puppet/interface/foo"
     Puppet::Interface.interface(:foo)
   end
 
   it "should be able to load all actions in all search paths"
-
-  describe "#underscorize" do
-    faulty = [1, "#foo", "$bar", "sturm und drang", :"sturm und drang"]
-    valid  = {
-      "Foo"      => :foo,
-      :Foo       => :foo,
-      "foo_bar"  => :foo_bar,
-      :foo_bar   => :foo_bar,
-      "foo-bar"  => :foo_bar,
-      :"foo-bar" => :foo_bar,
-    }
-
-    valid.each do |input, expect|
-      it "should map #{input.inspect} to #{expect.inspect}" do
-        result = Puppet::Interface.underscorize(input)
-        result.should == expect
-      end
-    end
-
-    faulty.each do |input|
-      it "should fail when presented with #{input.inspect} (#{input.class})" do
-        expect { Puppet::Interface.underscorize(input) }.
-          should raise_error ArgumentError, /not a valid interface name/
-      end
-    end
-  end
 end

-- 
Puppet packaging for Debian



More information about the Pkg-puppet-devel mailing list