summaryrefslogtreecommitdiffstats
path: root/lib/puppet/module.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/puppet/module.rb')
-rw-r--r--lib/puppet/module.rb394
1 files changed, 197 insertions, 197 deletions
diff --git a/lib/puppet/module.rb b/lib/puppet/module.rb
index b4184dde5..83561449a 100644
--- a/lib/puppet/module.rb
+++ b/lib/puppet/module.rb
@@ -2,203 +2,203 @@ require 'puppet/util/logging'
# Support for modules
class Puppet::Module
- class Error < Puppet::Error; end
- class MissingModule < Error; end
- class IncompatibleModule < Error; end
- class UnsupportedPlatform < Error; end
- class IncompatiblePlatform < Error; end
- class MissingMetadata < Error; end
- class InvalidName < Error; end
-
- include Puppet::Util::Logging
-
- TEMPLATES = "templates"
- FILES = "files"
- MANIFESTS = "manifests"
- PLUGINS = "plugins"
-
- FILETYPES = [MANIFESTS, FILES, TEMPLATES, PLUGINS]
-
- # Return an array of paths by splitting the +modulepath+ config
- # parameter. Only consider paths that are absolute and existing
- # directories
- def self.modulepath(environment = nil)
- Puppet::Node::Environment.new(environment).modulepath
- end
-
- # Find and return the +module+ that +path+ belongs to. If +path+ is
- # absolute, or if there is no module whose name is the first component
- # of +path+, return +nil+
- def self.find(modname, environment = nil)
- return nil unless modname
- Puppet::Node::Environment.new(environment).module(modname)
- end
-
- attr_reader :name, :environment
- attr_writer :environment
-
- attr_accessor :source, :author, :version, :license, :puppetversion, :summary, :description, :project_page
-
- def has_metadata?
- return false unless metadata_file
-
- FileTest.exist?(metadata_file)
- end
-
- def initialize(name, environment = nil)
- @name = name
-
- assert_validity
-
- if environment.is_a?(Puppet::Node::Environment)
- @environment = environment
- else
- @environment = Puppet::Node::Environment.new(environment)
- end
-
- load_metadata if has_metadata?
-
- validate_puppet_version
- validate_dependencies
- end
+ class Error < Puppet::Error; end
+ class MissingModule < Error; end
+ class IncompatibleModule < Error; end
+ class UnsupportedPlatform < Error; end
+ class IncompatiblePlatform < Error; end
+ class MissingMetadata < Error; end
+ class InvalidName < Error; end
+
+ include Puppet::Util::Logging
+
+ TEMPLATES = "templates"
+ FILES = "files"
+ MANIFESTS = "manifests"
+ PLUGINS = "plugins"
+
+ FILETYPES = [MANIFESTS, FILES, TEMPLATES, PLUGINS]
+
+ # Return an array of paths by splitting the +modulepath+ config
+ # parameter. Only consider paths that are absolute and existing
+ # directories
+ def self.modulepath(environment = nil)
+ Puppet::Node::Environment.new(environment).modulepath
+ end
+
+ # Find and return the +module+ that +path+ belongs to. If +path+ is
+ # absolute, or if there is no module whose name is the first component
+ # of +path+, return +nil+
+ def self.find(modname, environment = nil)
+ return nil unless modname
+ Puppet::Node::Environment.new(environment).module(modname)
+ end
+
+ attr_reader :name, :environment
+ attr_writer :environment
+
+ attr_accessor :source, :author, :version, :license, :puppetversion, :summary, :description, :project_page
+
+ def has_metadata?
+ return false unless metadata_file
+
+ FileTest.exist?(metadata_file)
+ end
+
+ def initialize(name, environment = nil)
+ @name = name
+
+ assert_validity
+
+ if environment.is_a?(Puppet::Node::Environment)
+ @environment = environment
+ else
+ @environment = Puppet::Node::Environment.new(environment)
+ end
+
+ load_metadata if has_metadata?
+
+ validate_puppet_version
+ validate_dependencies
+ end
+
+ FILETYPES.each do |type|
+ # A boolean method to let external callers determine if
+ # we have files of a given type.
+ define_method(type +'?') do
+ return false unless path
+ return false unless FileTest.exist?(subpath(type))
+ return true
+ end
+
+ # A method for returning a given file of a given type.
+ # e.g., file = mod.manifest("my/manifest.pp")
+ #
+ # If the file name is nil, then the base directory for the
+ # file type is passed; this is used for fileserving.
+ define_method(type.to_s.sub(/s$/, '')) do |file|
+ return nil unless path
+
+ # If 'file' is nil then they're asking for the base path.
+ # This is used for things like fileserving.
+ if file
+ full_path = File.join(subpath(type), file)
+ else
+ full_path = subpath(type)
+ end
+
+ return nil unless FileTest.exist?(full_path)
+ return full_path
+ end
+ end
+
+ def exist?
+ ! path.nil?
+ end
+
+ # Find the first 'files' directory. This is used by the XMLRPC fileserver.
+ def file_directory
+ subpath("files")
+ end
+
+ def license_file
+ return @license_file if defined?(@license_file)
+
+ return @license_file = nil unless path
+ @license_file = File.join(path, "License")
+ end
- FILETYPES.each do |type|
- # A boolean method to let external callers determine if
- # we have files of a given type.
- define_method(type +'?') do
- return false unless path
- return false unless FileTest.exist?(subpath(type))
- return true
+ def load_metadata
+ data = PSON.parse File.read(metadata_file)
+ [:source, :author, :version, :license, :puppetversion].each do |attr|
+ unless value = data[attr.to_s]
+ unless attr == :puppetversion
+ raise MissingMetadata, "No #{attr} module metadata provided for #{self.name}"
end
-
- # A method for returning a given file of a given type.
- # e.g., file = mod.manifest("my/manifest.pp")
- #
- # If the file name is nil, then the base directory for the
- # file type is passed; this is used for fileserving.
- define_method(type.to_s.sub(/s$/, '')) do |file|
- return nil unless path
-
- # If 'file' is nil then they're asking for the base path.
- # This is used for things like fileserving.
- if file
- full_path = File.join(subpath(type), file)
- else
- full_path = subpath(type)
- end
-
- return nil unless FileTest.exist?(full_path)
- return full_path
- end
- end
-
- def exist?
- ! path.nil?
- end
-
- # Find the first 'files' directory. This is used by the XMLRPC fileserver.
- def file_directory
- subpath("files")
- end
-
- def license_file
- return @license_file if defined?(@license_file)
-
- return @license_file = nil unless path
- @license_file = File.join(path, "License")
- end
-
- def load_metadata
- data = PSON.parse File.read(metadata_file)
- [:source, :author, :version, :license, :puppetversion].each do |attr|
- unless value = data[attr.to_s]
- unless attr == :puppetversion
- raise MissingMetadata, "No #{attr} module metadata provided for #{self.name}"
- end
- end
- send(attr.to_s + "=", value)
- end
- end
-
- # Return the list of manifests matching the given glob pattern,
- # defaulting to 'init.{pp,rb}' for empty modules.
- def match_manifests(rest)
- pat = File.join(path, MANIFESTS, rest || 'init')
- Dir.
- glob(pat + (File.extname(pat).empty? ? '.{pp,rb}' : '')).
- reject { |f| FileTest.directory?(f) }
- end
-
- def metadata_file
- return @metadata_file if defined?(@metadata_file)
-
- return @metadata_file = nil unless path
- @metadata_file = File.join(path, "metadata.json")
- end
-
- # Find this module in the modulepath.
- def path
- environment.modulepath.collect { |path| File.join(path, name) }.find { |d| FileTest.exist?(d) }
- end
-
- # Find all plugin directories. This is used by the Plugins fileserving mount.
- def plugin_directory
- subpath("plugins")
- end
-
- def requires(name, version = nil)
- @requires ||= []
- @requires << [name, version]
- end
-
- def supports(name, version = nil)
- @supports ||= []
- @supports << [name, version]
- end
-
- def to_s
- result = "Module #{name}"
- result += "(#{path})" if path
- result
- end
-
- def validate_dependencies
- return unless defined?(@requires)
-
- @requires.each do |name, version|
- unless mod = environment.module(name)
- raise MissingModule, "Missing module #{name} required by #{self.name}"
- end
-
- if version and mod.version != version
- raise IncompatibleModule, "Required module #{name} is version #{mod.version} but #{self.name} requires #{version}"
- end
- end
- end
-
- def validate_puppet_version
- return unless puppetversion and puppetversion != Puppet.version
- raise IncompatibleModule, "Module #{self.name} is only compatible with Puppet version #{puppetversion}, not #{Puppet.version}"
- end
-
- private
-
- def subpath(type)
- return File.join(path, type) unless type.to_s == "plugins"
-
- backward_compatible_plugins_dir
- end
-
- def backward_compatible_plugins_dir
- if dir = File.join(path, "plugins") and FileTest.exist?(dir)
- warning "using the deprecated 'plugins' directory for ruby extensions; please move to 'lib'"
- return dir
- else
- return File.join(path, "lib")
- end
- end
-
- def assert_validity
- raise InvalidName, "Invalid module name; module names must be alphanumeric (plus '-'), not '#{name}'" unless name =~ /^[-\w]+$/
- end
+ end
+ send(attr.to_s + "=", value)
+ end
+ end
+
+ # Return the list of manifests matching the given glob pattern,
+ # defaulting to 'init.{pp,rb}' for empty modules.
+ def match_manifests(rest)
+ pat = File.join(path, MANIFESTS, rest || 'init')
+ Dir.
+ glob(pat + (File.extname(pat).empty? ? '.{pp,rb}' : '')).
+ reject { |f| FileTest.directory?(f) }
+ end
+
+ def metadata_file
+ return @metadata_file if defined?(@metadata_file)
+
+ return @metadata_file = nil unless path
+ @metadata_file = File.join(path, "metadata.json")
+ end
+
+ # Find this module in the modulepath.
+ def path
+ environment.modulepath.collect { |path| File.join(path, name) }.find { |d| FileTest.exist?(d) }
+ end
+
+ # Find all plugin directories. This is used by the Plugins fileserving mount.
+ def plugin_directory
+ subpath("plugins")
+ end
+
+ def requires(name, version = nil)
+ @requires ||= []
+ @requires << [name, version]
+ end
+
+ def supports(name, version = nil)
+ @supports ||= []
+ @supports << [name, version]
+ end
+
+ def to_s
+ result = "Module #{name}"
+ result += "(#{path})" if path
+ result
+ end
+
+ def validate_dependencies
+ return unless defined?(@requires)
+
+ @requires.each do |name, version|
+ unless mod = environment.module(name)
+ raise MissingModule, "Missing module #{name} required by #{self.name}"
+ end
+
+ if version and mod.version != version
+ raise IncompatibleModule, "Required module #{name} is version #{mod.version} but #{self.name} requires #{version}"
+ end
+ end
+ end
+
+ def validate_puppet_version
+ return unless puppetversion and puppetversion != Puppet.version
+ raise IncompatibleModule, "Module #{self.name} is only compatible with Puppet version #{puppetversion}, not #{Puppet.version}"
+ end
+
+ private
+
+ def subpath(type)
+ return File.join(path, type) unless type.to_s == "plugins"
+
+ backward_compatible_plugins_dir
+ end
+
+ def backward_compatible_plugins_dir
+ if dir = File.join(path, "plugins") and FileTest.exist?(dir)
+ warning "using the deprecated 'plugins' directory for ruby extensions; please move to 'lib'"
+ return dir
+ else
+ return File.join(path, "lib")
+ end
+ end
+
+ def assert_validity
+ raise InvalidName, "Invalid module name; module names must be alphanumeric (plus '-'), not '#{name}'" unless name =~ /^[-\w]+$/
+ end
end