diff options
| author | Luke Kanies <luke@madstop.com> | 2009-04-17 12:47:41 -0500 |
|---|---|---|
| committer | James Turnbull <james@lovedthanlost.net> | 2009-05-15 10:01:26 +1000 |
| commit | c6084093e67b1e415e49c192b3ac6f6b9aebc4ba (patch) | |
| tree | dcff2f7076b8e5f16d727e926bf3c0b72e45e215 /lib | |
| parent | 83ba0e5efe4514201c1a627ceffdaef992431734 (diff) | |
| download | puppet-c6084093e67b1e415e49c192b3ac6f6b9aebc4ba.tar.gz puppet-c6084093e67b1e415e49c192b3ac6f6b9aebc4ba.tar.xz puppet-c6084093e67b1e415e49c192b3ac6f6b9aebc4ba.zip | |
Moving file-searching code out of Puppet::Module
The Module class had a bunch of code for finding
manifests and templates even when not in a module,
and it complicated the class unnecessarily. This
moves that code to a new, hackish-but-sufficient
module for just that purpose.
Signed-off-by: Luke Kanies <luke@madstop.com>
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/puppet/module.rb | 89 | ||||
| -rw-r--r-- | lib/puppet/parser/files.rb | 94 | ||||
| -rw-r--r-- | lib/puppet/parser/parser_support.rb | 3 | ||||
| -rw-r--r-- | lib/puppet/parser/templatewrapper.rb | 5 |
4 files changed, 100 insertions, 91 deletions
diff --git a/lib/puppet/module.rb b/lib/puppet/module.rb index 45b40698b..e4bdd16e6 100644 --- a/lib/puppet/module.rb +++ b/lib/puppet/module.rb @@ -37,15 +37,6 @@ class Puppet::Module Puppet::Node::Environment.new(environment).modulepath end - # Return an array of paths by splitting the +templatedir+ config - # parameter. - def self.templatepath(environment = nil) - dirs = Puppet.settings.value(:templatedir, environment).split(":") - dirs.select do |p| - 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+ @@ -53,85 +44,6 @@ class Puppet::Module Puppet::Node::Environment.new(environment).module(modname) 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(template, environment = nil) - if template =~ /^#{File::SEPARATOR}/ - return template - end - - if template_paths = templatepath(environment) - # If we can find the template in :templatedir, we return that. - td_file = template_paths.collect { |path| - File::join(path, template) - }.each do |f| - return f if FileTest.exist?(f) - end - end - - # check in the default template dir, if there is one - unless td_file = find_template_for_module(template, environment) - raise Puppet::Error, "No valid template directory found, please check templatedir settings" if template_paths.nil? - td_file = File::join(template_paths.first, template) - end - td_file - end - - def self.find_template_for_module(template, environment = nil) - path, file = split_path(template) - - # Because templates don't have an assumed template name, like manifests do, - # we treat templates with no name as being templates in the main template - # directory. - return nil unless file - - if mod = find(path, environment) and t = mod.template(file) - return t - end - nil - end - - private_class_method :find_template_for_module - - # 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(start, options = {}) - cwd = options[:cwd] || Dir.getwd - module_name, pattern = split_path(start) - if module_name and mod = find(module_name, options[:environment]) - return mod.match_manifests(pattern) - else - abspat = File::expand_path(start, 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 - - # Split the path into the module and the rest of the path. - # This method can and often does return nil, so anyone calling - # it needs to handle that. - def self.split_path(path) - if path =~ %r/^#{File::SEPARATOR}/ - return nil - end - - modname, rest = path.split(File::SEPARATOR, 2) - return nil if modname.nil? || modname.empty? - return modname, rest - end - attr_reader :name, :path def initialize(name, path) @name = name @@ -144,6 +56,7 @@ class Puppet::Module define_method(type.to_s) do File.join(path, type.to_s) end + # Create a boolean method for testing whether our module has # files of a given type. define_method(type.to_s + "?") do diff --git a/lib/puppet/parser/files.rb b/lib/puppet/parser/files.rb new file mode 100644 index 000000000..2cd163f97 --- /dev/null +++ b/lib/puppet/parser/files.rb @@ -0,0 +1,94 @@ +require 'puppet/module' +require 'puppet/parser/parser' + +# This is a silly central module for finding +# different kinds of files while parsing. This code +# doesn't really belong in the Puppet::Module class, +# but it doesn't really belong anywhere else, either. +module Puppet::Parser::Files + module_function + + # 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 find_manifests(start, options = {}) + cwd = options[:cwd] || Dir.getwd + module_name, pattern = split_file_path(start) + if module_name and mod = Puppet::Module.find(module_name, options[:environment]) + return mod.match_manifests(pattern) + else + abspat = File::expand_path(start, 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 + + # 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 find_template(template, environment = nil) + if template =~ /^#{File::SEPARATOR}/ + return template + end + + if template_paths = templatepath(environment) + # If we can find the template in :templatedir, we return that. + td_file = template_paths.collect { |path| + File::join(path, template) + }.each do |f| + return f if FileTest.exist?(f) + end + end + + # check in the default template dir, if there is one + unless td_file = find_template_in_module(template, environment) + raise Puppet::Error, "No valid template directory found, please check templatedir settings" if template_paths.nil? + td_file = File::join(template_paths.first, template) + end + td_file + end + + def find_template_in_module(template, environment = nil) + path, file = split_file_path(template) + + # Because templates don't have an assumed template name, like manifests do, + # we treat templates with no name as being templates in the main template + # directory. + return nil unless file + + if mod = Puppet::Module.find(path, environment) and t = mod.template(file) + return t + end + nil + end + + # Return an array of paths by splitting the +templatedir+ config + # parameter. + def templatepath(environment = nil) + dirs = Puppet.settings.value(:templatedir, environment).split(":") + dirs.select do |p| + File::directory?(p) + end + end + + # Split the path into the module and the rest of the path. + # This method can and often does return nil, so anyone calling + # it needs to handle that. + def split_file_path(path) + if path =~ %r/^#{File::SEPARATOR}/ + return nil + end + + modname, rest = path.split(File::SEPARATOR, 2) + return nil if modname.nil? || modname.empty? + return modname, rest + end +end diff --git a/lib/puppet/parser/parser_support.rb b/lib/puppet/parser/parser_support.rb index d59093799..3a6853f27 100644 --- a/lib/puppet/parser/parser_support.rb +++ b/lib/puppet/parser/parser_support.rb @@ -2,6 +2,7 @@ # tired of rebuilding the parser.rb file all the time. class Puppet::Parser::Parser require 'puppet/parser/functions' + require 'puppet/parser/files' ASTSet = Struct.new(:classes, :definitions, :nodes) @@ -183,7 +184,7 @@ class Puppet::Parser::Parser "in file #{@lexer.file} at line #{@lexer.line}" ) end - files = Puppet::Module::find_manifests(pat, :cwd => dir, :environment => @environment) + files = Puppet::Parser::Files.find_manifests(pat, :cwd => dir, :environment => @environment) if files.size == 0 raise Puppet::ImportError.new("No file(s) found for import " + "of '#{pat}'") diff --git a/lib/puppet/parser/templatewrapper.rb b/lib/puppet/parser/templatewrapper.rb index 55c7745ba..8b333a0b6 100644 --- a/lib/puppet/parser/templatewrapper.rb +++ b/lib/puppet/parser/templatewrapper.rb @@ -1,5 +1,7 @@ # A simple wrapper for templates, so they don't have full access to # the scope objects. +require 'puppet/parser/files' + class Puppet::Parser::TemplateWrapper attr_accessor :scope, :file, :string include Puppet::Util @@ -63,7 +65,7 @@ class Puppet::Parser::TemplateWrapper end def file=(filename) - @file = Puppet::Module::find_template(filename, scope.compiler.environment) + @file = Puppet::Parser::Files.find_template(filename, scope.compiler.environment) unless FileTest.exists?(file) raise Puppet::ParseError, @@ -113,4 +115,3 @@ class Puppet::Parser::TemplateWrapper "template[%s]" % (file ? file : "inline") end end - |
