summaryrefslogtreecommitdiffstats
path: root/lib/puppet/module.rb
diff options
context:
space:
mode:
authorluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2007-07-06 22:22:10 +0000
committerluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2007-07-06 22:22:10 +0000
commitaa741354a75c0d3b4f4b7f37a736a0154d45234c (patch)
treef048ad40c86425eabe76fccd07345f1cc63b9fa8 /lib/puppet/module.rb
parentd0680c8ed3f1e0df864c25a3f21e73383095629b (diff)
downloadpuppet-aa741354a75c0d3b4f4b7f37a736a0154d45234c.tar.gz
puppet-aa741354a75c0d3b4f4b7f37a736a0154d45234c.tar.xz
puppet-aa741354a75c0d3b4f4b7f37a736a0154d45234c.zip
Fixing #596 -- classes in modules now autoload
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@2655 980ebf18-57e1-0310-9a29-db15c13687c0
Diffstat (limited to 'lib/puppet/module.rb')
-rw-r--r--lib/puppet/module.rb115
1 files changed, 115 insertions, 0 deletions
diff --git a/lib/puppet/module.rb b/lib/puppet/module.rb
new file mode 100644
index 000000000..87f849d17
--- /dev/null
+++ b/lib/puppet/module.rb
@@ -0,0 +1,115 @@
+# Support for modules
+class Puppet::Module
+
+ TEMPLATES = "templates"
+ FILES = "files"
+ MANIFESTS = "manifests"
+
+ # Return an array of paths by splitting the +modulepath+ config
+ # parameter. Only consider paths that are absolute and existing
+ # directories
+ def self.modulepath
+ dirs = Puppet[:modulepath].split(":")
+ if ENV["PUPPETLIB"]
+ dirs = ENV["PUPPETLIB"].split(":") + dirs
+ end
+ dirs.select do |p|
+ p =~ /^#{File::SEPARATOR}/ && File::directory?(p)
+ end
+ 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(path)
+ if path =~ %r/^#{File::SEPARATOR}/
+ return nil
+ end
+
+ modname, rest = path.split(File::SEPARATOR, 2)
+ return nil if modname.nil? || modname.empty?
+
+ modpath = modulepath.collect { |p|
+ File::join(p, modname)
+ }.find { |f| File::directory?(f) }
+ return nil unless modpath
+
+ return self.new(modname, modpath)
+ end
+
+ # Instance methods
+
+ # Find the concrete file denoted by +file+. If +file+ is absolute,
+ # return it directly. Otherwise try to find it as a template in a
+ # module. If that fails, return it relative to the +templatedir+ config
+ # param.
+ # In all cases, an absolute path is returned, which does not
+ # necessarily refer to an existing file
+ def self.find_template(file)
+ if file =~ /^#{File::SEPARATOR}/
+ return file
+ end
+
+ mod = find(file)
+ if mod
+ return mod.template(file)
+ else
+ return File.join(Puppet[:templatedir], file)
+ end
+ end
+
+ # Return a list of manifests (as absolute filenames) that match +pat+
+ # with the current directory set to +cwd+. If the first component of
+ # +pat+ does not contain any wildcards and is an existing module, return
+ # a list of manifests in that module matching the rest of +pat+
+ # Otherwise, try to find manifests matching +pat+ relative to +cwd+
+ def self.find_manifests(pat, cwd = nil)
+ cwd ||= Dir.getwd
+ mod = find(pat)
+ if mod
+ return mod.manifests(pat)
+ else
+ abspat = File::expand_path(pat, cwd)
+ files = Dir.glob(abspat).reject { |f| FileTest.directory?(f) }
+ if files.size == 0
+ files = Dir.glob(abspat + ".pp").reject { |f| FileTest.directory?(f) }
+ end
+ return files
+ end
+ end
+
+ attr_reader :name, :path
+ def initialize(name, path)
+ @name = name
+ @path = path
+ end
+
+ def strip(file)
+ n, rest = file.split(File::SEPARATOR, 2)
+ rest = nil if rest && rest.empty?
+ return rest
+ end
+
+ def template(file)
+ return File::join(path, TEMPLATES, strip(file))
+ end
+
+ def files
+ return File::join(path, FILES)
+ end
+
+ def manifests(pat)
+ rest = strip(pat)
+ rest ||= "init.pp"
+ p = File::join(path, MANIFESTS, rest)
+ files = Dir.glob(p)
+ if files.size == 0
+ files = Dir.glob(p + ".pp")
+ end
+ return files
+ end
+
+ private :initialize
+end
+
+# $Id$