summaryrefslogtreecommitdiffstats
path: root/lib/puppet/interface.rb
diff options
context:
space:
mode:
authorDaniel Pittman <daniel@puppetlabs.com>2011-04-07 15:53:17 -0700
committerDaniel Pittman <daniel@puppetlabs.com>2011-04-07 15:53:17 -0700
commita35fa519c85a761ac8bed3be8fde2d6523cae474 (patch)
tree36f3583ee364ba1d68467a2b614a8dfcf9ed43ae /lib/puppet/interface.rb
parent3d5ec4f61fee08552767e950ac021752c202a599 (diff)
parent87ed3188e65d3f5f9c2c32a409b271d1b39684b9 (diff)
downloadpuppet-a35fa519c85a761ac8bed3be8fde2d6523cae474.tar.gz
puppet-a35fa519c85a761ac8bed3be8fde2d6523cae474.tar.xz
puppet-a35fa519c85a761ac8bed3be8fde2d6523cae474.zip
Merge branch 'refactor/master/7012-rename-strings-to-interfaces-and-faces'
Diffstat (limited to 'lib/puppet/interface.rb')
-rw-r--r--lib/puppet/interface.rb106
1 files changed, 106 insertions, 0 deletions
diff --git a/lib/puppet/interface.rb b/lib/puppet/interface.rb
new file mode 100644
index 000000000..70484adfc
--- /dev/null
+++ b/lib/puppet/interface.rb
@@ -0,0 +1,106 @@
+require 'puppet'
+require 'puppet/util/autoload'
+
+class Puppet::Interface
+ require 'puppet/interface/face_collection'
+
+ require 'puppet/interface/action_manager'
+ include Puppet::Interface::ActionManager
+ extend Puppet::Interface::ActionManager
+
+ require 'puppet/interface/option_manager'
+ include Puppet::Interface::OptionManager
+ extend Puppet::Interface::OptionManager
+
+ include Puppet::Util
+
+ class << self
+ # 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
+ def autoloader
+ @autoloader ||= Puppet::Util::Autoload.new(:application, "puppet/faces")
+ end
+
+ def faces
+ Puppet::Interface::FaceCollection.faces
+ end
+
+ def face?(name, version)
+ Puppet::Interface::FaceCollection.face?(name, version)
+ end
+
+ def register(instance)
+ Puppet::Interface::FaceCollection.register(instance)
+ end
+
+ def define(name, version, &block)
+ if face?(name, version)
+ face = Puppet::Interface::FaceCollection[name, version]
+ else
+ face = self.new(name, version)
+ Puppet::Interface::FaceCollection.register(face)
+ # REVISIT: Shouldn't this be delayed until *after* we evaluate the
+ # current block, not done before? --daniel 2011-04-07
+ face.load_actions
+ end
+
+ face.instance_eval(&block) if block_given?
+
+ return face
+ end
+
+ alias :[] :define
+ end
+
+ attr_accessor :default_format
+
+ def set_default_format(format)
+ self.default_format = format.to_sym
+ end
+
+ attr_accessor :type, :verb, :version, :arguments
+ attr_reader :name
+
+ def initialize(name, version, &block)
+ unless Puppet::Interface::FaceCollection.validate_version(version)
+ raise ArgumentError, "Cannot create face #{name.inspect} with invalid version number '#{version}'!"
+ end
+
+ @name = Puppet::Interface::FaceCollection.underscorize(name)
+ @version = version
+ @default_format = :pson
+
+ instance_eval(&block) if block_given?
+ end
+
+ # Try to find actions defined in other files.
+ def load_actions
+ path = "puppet/faces/#{name}"
+
+ loaded = []
+ [path, "#{name}@#{version}/#{path}"].each do |path|
+ Puppet::Interface.autoloader.search_directories.each do |dir|
+ fdir = ::File.join(dir, path)
+ next unless FileTest.directory?(fdir)
+
+ Dir.chdir(fdir) do
+ Dir.glob("*.rb").each do |file|
+ aname = file.sub(/\.rb/, '')
+ if loaded.include?(aname)
+ Puppet.debug "Not loading duplicate action '#{aname}' for '#{name}' from '#{fdir}/#{file}'"
+ next
+ end
+ loaded << aname
+ Puppet.debug "Loading action '#{aname}' for '#{name}' from '#{fdir}/#{file}'"
+ require "#{Dir.pwd}/#{aname}"
+ end
+ end
+ end
+ end
+ end
+
+ def to_s
+ "Puppet::Faces[#{name.inspect}, #{version.inspect}]"
+ end
+end