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

Pieter van de Bruggen pieter at puppetlabs.com
Tue May 10 08:06:50 UTC 2011


The following commit has been merged in the experimental branch:
commit a58bf959ec49c033e0498916a09e77e303c5792e
Author: Pieter van de Bruggen <pieter at puppetlabs.com>
Date:   Tue Mar 22 13:19:25 2011 -0700

    (#6786) Change interface storage and access.
    
    Ruby's namespace mechanism introduced a number of problems, including
    incorrect name resolution for common and simple cases.  Given that,
    we've refactored back to class-level data structures with accessor
    methods available.
    
    The current method names are unlikely to be the final UI.
    
    Reviewed-By: Daniel Pittman

diff --git a/lib/puppet/application/configurer.rb b/lib/puppet/application/configurer.rb
index 70d2481..3783644 100644
--- a/lib/puppet/application/configurer.rb
+++ b/lib/puppet/application/configurer.rb
@@ -17,7 +17,7 @@ class Puppet::Application::Configurer < Puppet::Application
   end
 
   def run_command
-    report = Puppet::Interface::Configurer.synchronize(Puppet[:certname])
-    Puppet::Interface::Report.submit(report)
+    report = Puppet::Interface.interface(:configurer).synchronize(Puppet[:certname])
+    Puppet::Interface.interface(:report).submit(report)
   end
 end
diff --git a/lib/puppet/application/interface_base.rb b/lib/puppet/application/interface_base.rb
index f2c147f..654674d 100644
--- a/lib/puppet/application/interface_base.rb
+++ b/lib/puppet/application/interface_base.rb
@@ -75,9 +75,10 @@ class Puppet::Application::InterfaceBase < Puppet::Application
 
     @type = self.class.name.to_s.sub(/.+:/, '').downcase.to_sym
 
-    unless @interface = Puppet::Interface.const_get(@type)
+    unless Puppet::Interface.interface?(@type)
       raise "Could not find interface '#{@type}'"
     end
+    @interface = Puppet::Interface.interface(@type)
     @format ||= @interface.default_format
 
     # We copy all of the app options to the interface.
diff --git a/lib/puppet/interface.rb b/lib/puppet/interface.rb
index 38841d9..0ec0f80 100644
--- a/lib/puppet/interface.rb
+++ b/lib/puppet/interface.rb
@@ -9,6 +9,8 @@ class Puppet::Interface
 
   include Puppet::Util
 
+  @interfaces = {}
+
   # This is just so we can search for actions.  We only use its
   # list of directories to search.
   # Can't we utilize an external autoloader, or simply use the $LOAD_PATH? -pvb
@@ -34,31 +36,33 @@ class Puppet::Interface
         end
       end
     end
-    Puppet::Interface.constants.map { |c| c.to_s.downcase }
+    return @interfaces.keys
   end
 
-  def self.const_missing(name)
-    require "puppet/interface/#{name.to_s.downcase}"
-    const_get(name) if const_defined?(name)
+  def self.interface?(name)
+    name = underscorize(name)
+    require "puppet/interface/#{name}" unless @interfaces.has_key? name
+    return @interfaces.has_key? name
   rescue LoadError
-    nil
+    return false
   end
 
-  def self.const_get(name)
-    name = constantize(name)
-    super(name)
+  def self.interface(name, &blk)
+    interface = interface?(name) ? @interfaces[underscorize(name)] : new(name)
+    interface.instance_eval(&blk) if block_given?
+    return interface
   end
 
   def self.register_interface(name, instance)
-    const_set(constantize(name), instance)
+    @interfaces[underscorize(name)] = instance
   end
 
-  def self.constantize(name)
+  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.split(/[-_]/).map { |x| x.capitalize }.join
+    name.to_s.downcase.split(/[-_]/).join('_').to_sym
   end
 
   attr_accessor :default_format
@@ -75,7 +79,7 @@ class Puppet::Interface
   attr_accessor :type, :verb, :name, :arguments, :options
 
   def initialize(name, options = {}, &block)
-    @name = name
+    @name = self.class.underscorize(name)
 
     @default_format = :pson
     options.each { |opt, val| send(opt.to_s + "=", val) }
@@ -118,6 +122,6 @@ class Puppet::Interface
   end
 
   def to_s
-    name.to_s
+    "Puppet::Interface(#{name})"
   end
 end
diff --git a/lib/puppet/interface/catalog.rb b/lib/puppet/interface/catalog.rb
index f99d088..34a1d81 100644
--- a/lib/puppet/interface/catalog.rb
+++ b/lib/puppet/interface/catalog.rb
@@ -25,7 +25,7 @@ Puppet::Interface::Indirector.new(:catalog) do
     facts_to_upload = {:facts_format => :b64_zlib_yaml, :facts => CGI.escape(facts.render(:b64_zlib_yaml))}
     catalog = nil
     retrieval_duration = thinmark do
-      catalog = Puppet::Interface::Catalog.find(certname, facts_to_upload)
+      catalog = Puppet::Interface.interface(:catalog).find(certname, facts_to_upload)
     end
     catalog = catalog.to_ral
     catalog.finalize
diff --git a/lib/puppet/interface/catalog/select.rb b/lib/puppet/interface/catalog/select.rb
index 4bb4931..082d93c 100644
--- a/lib/puppet/interface/catalog/select.rb
+++ b/lib/puppet/interface/catalog/select.rb
@@ -1,8 +1,10 @@
 # Select and show a list of resources of a given type.
-Puppet::Interface::Catalog.action :select do |*args|
-  host = args.shift
-  type = args.shift
-  catalog = Puppet::Resource::Catalog.indirection.find(host)
+Puppet::Interface.interface(:catalog) do
+  action :select do |*args|
+    host = args.shift
+    type = args.shift
+    catalog = Puppet::Resource::Catalog.indirection.find(host)
 
-  catalog.resources.reject { |res| res.type != type }.each { |res| puts res }
+    catalog.resources.reject { |res| res.type != type }.each { |res| puts res }
+  end
 end
diff --git a/lib/puppet/interface/configurer.rb b/lib/puppet/interface/configurer.rb
index 42e950f..c1a28b2 100644
--- a/lib/puppet/interface/configurer.rb
+++ b/lib/puppet/interface/configurer.rb
@@ -2,12 +2,9 @@ require 'puppet/interface'
 
 Puppet::Interface.new(:configurer) do
   action(:synchronize) do |certname|
-    facts = Puppet::Interface::Facts.find(certname)
-
-    catalog = Puppet::Interface::Catalog.download(certname, facts)
-
-    report = Puppet::Interface::Catalog.apply(catalog)
-
+    facts = Puppet::Interface.interface(:facts).find(certname)
+    catalog = Puppet::Interface.interface(:catalog).download(certname, facts)
+    report = Puppet::Interface.interface(:catalog).apply(catalog)
     report
   end
 end
diff --git a/spec/unit/interface/catalog_spec.rb b/spec/unit/interface/catalog_spec.rb
index 5748427..8eb0040 100644
--- a/spec/unit/interface/catalog_spec.rb
+++ b/spec/unit/interface/catalog_spec.rb
@@ -3,9 +3,9 @@
 require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/catalog'
 
-describe Puppet::Interface::Catalog do
+describe Puppet::Interface.interface(:catalog) do
   before do
-    @interface = Puppet::Interface::Catalog
+    @interface = Puppet::Interface.interface(:catalog)
   end
 
   it "should be a subclass of 'Indirection'" do
diff --git a/spec/unit/interface/certificate_request_spec.rb b/spec/unit/interface/certificate_request_spec.rb
index fa9e819..8a613e5 100644
--- a/spec/unit/interface/certificate_request_spec.rb
+++ b/spec/unit/interface/certificate_request_spec.rb
@@ -3,9 +3,9 @@
 require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/certificate_request'
 
-describe Puppet::Interface::CertificateRequest do
+describe Puppet::Interface.interface(:certificate_request) do
   before do
-    @interface = Puppet::Interface::CertificateRequest
+    @interface = Puppet::Interface.interface(:certificate_request)
   end
 
   it "should be a subclass of 'Indirection'" do
diff --git a/spec/unit/interface/certificate_revocation_list_spec.rb b/spec/unit/interface/certificate_revocation_list_spec.rb
index 3fc981b..8ee341b 100644
--- a/spec/unit/interface/certificate_revocation_list_spec.rb
+++ b/spec/unit/interface/certificate_revocation_list_spec.rb
@@ -3,9 +3,9 @@
 require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/certificate_revocation_list'
 
-describe Puppet::Interface::CertificateRevocationList do
+describe Puppet::Interface.interface(:certificate_revocation_list) do
   before do
-    @interface = Puppet::Interface::CertificateRevocationList
+    @interface = Puppet::Interface.interface(:certificate_revocation_list)
   end
 
   it "should be a subclass of 'Indirection'" do
diff --git a/spec/unit/interface/certificate_spec.rb b/spec/unit/interface/certificate_spec.rb
index 6b5f922..47ddcb5 100644
--- a/spec/unit/interface/certificate_spec.rb
+++ b/spec/unit/interface/certificate_spec.rb
@@ -3,9 +3,9 @@
 require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/certificate'
 
-describe Puppet::Interface::Certificate do
+describe Puppet::Interface.interface(:certificate) do
   before do
-    @interface = Puppet::Interface::Certificate
+    @interface = Puppet::Interface.interface(:certificate)
   end
 
   it "should be a subclass of 'Indirection'" do
diff --git a/spec/unit/interface/config_spec.rb b/spec/unit/interface/config_spec.rb
index 683e8ab..79c65f2 100644
--- a/spec/unit/interface/config_spec.rb
+++ b/spec/unit/interface/config_spec.rb
@@ -3,9 +3,9 @@
 require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/config'
 
-describe Puppet::Interface::Config do
+describe Puppet::Interface.interface(:config) do
   before do
-    @interface = Puppet::Interface::Config
+    @interface = Puppet::Interface.interface(:config)
   end
 
   it "should be a subclass of 'Indirection'" do
diff --git a/spec/unit/interface/configurer_spec.rb b/spec/unit/interface/configurer_spec.rb
index 99f5f7a..4b3532c 100644
--- a/spec/unit/interface/configurer_spec.rb
+++ b/spec/unit/interface/configurer_spec.rb
@@ -5,7 +5,7 @@ require 'puppet/interface/configurer'
 require 'puppet/indirector/catalog/rest'
 require 'tempfile'
 
-describe Puppet::Interface::Configurer do
+describe Puppet::Interface.interface(:configurer) do
   describe "#synchronize" do
     it "should retrieve and apply a catalog and return a report" do
       dirname = Dir.mktmpdir("puppetdir")
@@ -16,7 +16,7 @@ describe Puppet::Interface::Configurer do
       @catalog.add_resource(@file)
       Puppet::Resource::Catalog::Rest.any_instance.stubs(:find).returns(@catalog)
 
-      report = Puppet::Interface::Configurer.synchronize("foo")
+      report = Puppet::Interface.interface(:configurer).synchronize("foo")
 
       report.kind.should   == "apply"
       report.status.should == "changed"
diff --git a/spec/unit/interface/facts_spec.rb b/spec/unit/interface/facts_spec.rb
index c311b5d..03d6410 100644
--- a/spec/unit/interface/facts_spec.rb
+++ b/spec/unit/interface/facts_spec.rb
@@ -3,9 +3,9 @@
 require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/facts'
 
-describe Puppet::Interface::Facts do
+describe Puppet::Interface.interface(:facts) do
   before do
-    @interface = Puppet::Interface::Facts
+    @interface = Puppet::Interface.interface(:facts)
   end
 
   it "should define an 'upload' fact" do
diff --git a/spec/unit/interface/file_spec.rb b/spec/unit/interface/file_spec.rb
index 1d9e557..fc7accf 100644
--- a/spec/unit/interface/file_spec.rb
+++ b/spec/unit/interface/file_spec.rb
@@ -3,9 +3,9 @@
 require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/file'
 
-describe Puppet::Interface::File do
+describe Puppet::Interface.interface(:file) do
   before do
-    @interface = Puppet::Interface::File
+    @interface = Puppet::Interface.interface(:file)
   end
 
   it "should be a subclass of 'Indirection'" do
diff --git a/spec/unit/interface/key_spec.rb b/spec/unit/interface/key_spec.rb
index 9be0244..93a7c93 100644
--- a/spec/unit/interface/key_spec.rb
+++ b/spec/unit/interface/key_spec.rb
@@ -3,9 +3,9 @@
 require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/key'
 
-describe Puppet::Interface::Key do
+describe Puppet::Interface.interface(:key) do
   before do
-    @interface = Puppet::Interface::Key
+    @interface = Puppet::Interface.interface(:key)
   end
 
   it "should be a subclass of 'Indirection'" do
diff --git a/spec/unit/interface/node_spec.rb b/spec/unit/interface/node_spec.rb
index cfb15e3..6310930 100644
--- a/spec/unit/interface/node_spec.rb
+++ b/spec/unit/interface/node_spec.rb
@@ -3,9 +3,9 @@
 require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/node'
 
-describe Puppet::Interface::Node do
+describe Puppet::Interface.interface(:node) do
   before do
-    @interface = Puppet::Interface::Node
+    @interface = Puppet::Interface.interface(:node)
   end
 
   it "should be a subclass of 'Indirection'" do
diff --git a/spec/unit/interface/report_spec.rb b/spec/unit/interface/report_spec.rb
index 932fc5c..b5bee1a 100644
--- a/spec/unit/interface/report_spec.rb
+++ b/spec/unit/interface/report_spec.rb
@@ -3,9 +3,9 @@
 require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/report'
 
-describe Puppet::Interface::Report do
+describe Puppet::Interface.interface(:report) do
   before do
-    @interface = Puppet::Interface::Report
+    @interface = Puppet::Interface.interface(:report)
   end
 
   it "should be a subclass of 'Indirection'" do
diff --git a/spec/unit/interface/resource_spec.rb b/spec/unit/interface/resource_spec.rb
index b28b043..cad45b6 100644
--- a/spec/unit/interface/resource_spec.rb
+++ b/spec/unit/interface/resource_spec.rb
@@ -3,9 +3,9 @@
 require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/resource'
 
-describe Puppet::Interface::Resource do
+describe Puppet::Interface.interface(:resource) do
   before do
-    @interface = Puppet::Interface::Resource
+    @interface = Puppet::Interface.interface(:resource)
   end
 
   it "should be a subclass of 'Indirection'" do
diff --git a/spec/unit/interface/resource_type_spec.rb b/spec/unit/interface/resource_type_spec.rb
index 95b9ec7..6c437c4 100644
--- a/spec/unit/interface/resource_type_spec.rb
+++ b/spec/unit/interface/resource_type_spec.rb
@@ -3,9 +3,9 @@
 require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
 require 'puppet/interface/resource_type'
 
-describe Puppet::Interface::ResourceType do
+describe Puppet::Interface.interface(:resource_type) do
   before do
-    @interface = Puppet::Interface::ResourceType
+    @interface = Puppet::Interface.interface(:resource_type)
   end
 
   it "should be a subclass of 'Indirection'" do
diff --git a/spec/unit/interface_spec.rb b/spec/unit/interface_spec.rb
index 73f7a45..876c794 100755
--- a/spec/unit/interface_spec.rb
+++ b/spec/unit/interface_spec.rb
@@ -30,8 +30,8 @@ describe Puppet::Interface do
     end
   end
 
-  it "should use its name converted to a string as its string form" do
-    Puppet::Interface.new(:me).to_s.should == "me"
+  it "should stringify with its own name" do
+    Puppet::Interface.new(:me).to_s.should =~ /\bme\b/
   end
 
   it "should allow overriding of the default format" do
@@ -53,48 +53,34 @@ describe Puppet::Interface do
     Puppet::Interface.new(:me, :verb => "foo").verb.should == "foo"
   end
 
-  it "should create an associated constant when registering an interface" do
-    $stderr.stubs(:puts)
-    face = Puppet::Interface.new(:me)
-    Puppet::Interface.register_interface(:me, face)
-    Puppet::Interface::Me.should equal(face)
-  end
-
   it "should try to require interfaces that are not known" do
     Puppet::Interface.expects(:require).with "puppet/interface/foo"
-    Puppet::Interface.const_get(:Foo)
-  end
-
-  it "should not fail when requiring an interface fails" do
-    $stderr.stubs(:puts)
-    Puppet::Interface.expects(:require).with("puppet/interface/foo").raises LoadError
-    lambda { Puppet::Interface::Foo }.should_not raise_error
+    Puppet::Interface.interface(:foo)
   end
 
   it "should be able to load all actions in all search paths"
 
-  describe "#constantize" do
+  describe "#underscorize" do
     faulty = [1, "#foo", "$bar", "sturm und drang", :"sturm und drang"]
     valid  = {
-      "foo"      => "Foo",
-      :foo       => "Foo",
-      "foo_bar"  => "FooBar",
-      :foo_bar   => "FooBar",
-      "foo-bar"  => "FooBar",
-      :"foo-bar" => "FooBar",
+      "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}' to '#{expect}'" do
-        result = Puppet::Interface.constantize(input)
-        result.should be_a String
-        result.to_s.should == 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.constantize(input) }.
+        expect { Puppet::Interface.underscorize(input) }.
           should raise_error ArgumentError, /not a valid interface name/
       end
     end

-- 
Puppet packaging for Debian



More information about the Pkg-puppet-devel mailing list