lib/puppet/parser/templatewrapper.rb in puppet-0.25.5 vs lib/puppet/parser/templatewrapper.rb in puppet-2.6.0

- old
+ new

@@ -1,116 +1,114 @@ # 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_writer :scope - attr_reader :file - attr_accessor :string - include Puppet::Util - Puppet::Util.logmethods(self) + attr_writer :scope + attr_reader :file + attr_accessor :string + include Puppet::Util + Puppet::Util.logmethods(self) - def initialize(scope) - @__scope__ = scope - end + def initialize(scope) + @__scope__ = scope + end - def scope - @__scope__ - end + def scope + @__scope__ + end - # Should return true if a variable is defined, false if it is not - def has_variable?(name) - if scope.lookupvar(name.to_s, false) != :undefined - true - else - false - end + # Should return true if a variable is defined, false if it is not + def has_variable?(name) + if scope.lookupvar(name.to_s, false) != :undefined + true + else + false end + end - # Allow templates to access the defined classes - def classes - return scope.catalog.classes - end + # Allow templates to access the defined classes + def classes + scope.catalog.classes + end - # Allow templates to access the tags defined in the current scope - def tags - return scope.tags - end + # Allow templates to access the tags defined in the current scope + def tags + scope.tags + end - # Allow templates to access the all the defined tags - def all_tags - return scope.catalog.tags + # Allow templates to access the all the defined tags + def all_tags + scope.catalog.tags + end + + # Ruby treats variables like methods, so we used to expose variables + # within scope to the ERB code via method_missing. As per RedMine #1427, + # though, this means that conflicts between methods in our inheritance + # tree (Kernel#fork) and variable names (fork => "yes/no") could arise. + # + # Worse, /new/ conflicts could pop up when a new kernel or object method + # was added to Ruby, causing templates to suddenly fail mysteriously when + # Ruby was upgraded. + # + # To ensure that legacy templates using unqualified names work we retain + # the missing_method definition here until we declare the syntax finally + # dead. + def method_missing(name, *args) + # We have to tell lookupvar to return :undefined to us when + # appropriate; otherwise it converts to "". + value = scope.lookupvar(name.to_s, false) + if value != :undefined + return value + else + # Just throw an error immediately, instead of searching for + # other missingmethod things or whatever. + raise Puppet::ParseError, "Could not find value for '#{name}'" end + end - # Ruby treats variables like methods, so we used to expose variables - # within scope to the ERB code via method_missing. As per RedMine #1427, - # though, this means that conflicts between methods in our inheritance - # tree (Kernel#fork) and variable names (fork => "yes/no") could arise. - # - # Worse, /new/ conflicts could pop up when a new kernel or object method - # was added to Ruby, causing templates to suddenly fail mysteriously when - # Ruby was upgraded. - # - # To ensure that legacy templates using unqualified names work we retain - # the missing_method definition here until we declare the syntax finally - # dead. - def method_missing(name, *args) - # We have to tell lookupvar to return :undefined to us when - # appropriate; otherwise it converts to "". - value = scope.lookupvar(name.to_s, false) - if value != :undefined - return value - else - # Just throw an error immediately, instead of searching for - # other missingmethod things or whatever. - raise Puppet::ParseError, "Could not find value for '%s'" % name - end + def file=(filename) + unless @file = Puppet::Parser::Files.find_template(filename, scope.compiler.environment.to_s) + raise Puppet::ParseError, "Could not find template '#{filename}'" end - def file=(filename) - unless @file = Puppet::Parser::Files.find_template(filename, scope.compiler.environment) - raise Puppet::ParseError, "Could not find template '%s'" % filename - end + # We'll only ever not have a parser in testing, but, eh. + scope.known_resource_types.watch_file(file) - # We'll only ever not have a parser in testing, but, eh. - if scope.parser - scope.parser.watch_file(file) - end + @string = File.read(file) + end - @string = File.read(file) + def result(string = nil) + if string + self.string = string + template_source = "inline template" + else + template_source = file end - def result(string = nil) - if string - self.string = string - template_source = "inline template" + # Expose all the variables in our scope as instance variables of the + # current object, making it possible to access them without conflict + # to the regular methods. + benchmark(:debug, "Bound template variables for #{template_source}") do + scope.to_hash.each { |name, value| + if name.kind_of?(String) + realname = name.gsub(/[^\w]/, "_") else - template_source = file + realname = name end - - # Expose all the variables in our scope as instance variables of the - # current object, making it possible to access them without conflict - # to the regular methods. - benchmark(:debug, "Bound template variables for #{template_source}") do - scope.to_hash.each { |name, value| - if name.kind_of?(String) - realname = name.gsub(/[^\w]/, "_") - else - realname = name - end - instance_variable_set("@#{realname}", value) - } - end - - result = nil - benchmark(:debug, "Interpolated template #{template_source}") do - template = ERB.new(self.string, 0, "-") - result = template.result(binding) - end - - result + instance_variable_set("@#{realname}", value) + } end - def to_s - "template[%s]" % (file ? file : "inline") + result = nil + benchmark(:debug, "Interpolated template #{template_source}") do + template = ERB.new(self.string, 0, "-") + result = template.result(binding) end + + result + end + + def to_s + "template[#{(file ? file : "inline")}]" + end end