class Puppet::Parser::TemplateWrapper

A simple wrapper for templates, so they don’t have full access to the scope objects.

@api private

Public Instance Methods

all_tags() click to toggle source

@return [Array<String>] All the defined tags @api public

# File lib/puppet/parser/templatewrapper.rb, line 58
def all_tags
  scope.catalog.tags
end
classes() click to toggle source

@return [Array<String>] The list of defined classes @api public

# File lib/puppet/parser/templatewrapper.rb, line 46
def classes
  scope.catalog.classes
end
file() click to toggle source

@return [String] The full path name of the template that is being executed @api public

# File lib/puppet/parser/templatewrapper.rb, line 19
def file
  @__file__
end
file=(filename) click to toggle source

@api private

# File lib/puppet/parser/templatewrapper.rb, line 87
def file=(filename)
  unless @__file__ = Puppet::Parser::Files.find_template(filename, scope.compiler.environment)
    raise Puppet::ParseError, "Could not find template '#{filename}'"
  end

  # We'll only ever not have a parser in testing, but, eh.
  scope.known_resource_types.watch_file(@__file__)
end
has_variable?(name) click to toggle source

Should return true if a variable is defined, false if it is not @api public

# File lib/puppet/parser/templatewrapper.rb, line 40
def has_variable?(name)
  scope.include?(name.to_s)
end
method_missing(name, *args) click to toggle source

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.

# File lib/puppet/parser/templatewrapper.rb, line 74
def method_missing(name, *args)
  line_number = script_line
  if scope.include?(name.to_s)
    Puppet.deprecation_warning("Variable access via '#{name}' is deprecated. Use '@#{name}' instead. #{to_s}:#{line_number}")
    return scope[name.to_s, { :file => @__file__, :line => line_number }]
  else
    # Just throw an error immediately, instead of searching for
    # other missingmethod things or whatever.
    raise Puppet::ParseError.new("Could not find value for '#{name}'", @__file__, line_number)
  end
end
result(string = nil) click to toggle source

@api private

# File lib/puppet/parser/templatewrapper.rb, line 97
def result(string = nil)
  if string
    template_source = "inline template"
  else
    string = Puppet::FileSystem.read_preserve_line_endings(@__file__)
    template_source = @__file__
  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 do |name, value|
      realname = name.gsub(/[^\w]/, "_")
      instance_variable_set("@#{realname}", value)
    end
  end

  result = nil
  benchmark(:debug, "Interpolated template #{template_source}") do
    template = ERB.new(string, 0, "-")
    template.filename = @__file__
    result = template.result(binding)
  end

  result
end
scope() click to toggle source

@return [Puppet::Parser::Scope] The scope in which the template is evaluated @api public

# File lib/puppet/parser/templatewrapper.rb, line 25
def scope
  @__scope__
end
tags() click to toggle source

@return [Array<String>] The tags defined in the current scope @api public

# File lib/puppet/parser/templatewrapper.rb, line 52
def tags
  scope.tags
end
to_s() click to toggle source
# File lib/puppet/parser/templatewrapper.rb, line 125
def to_s
  "template[#{(@__file__ ? @__file__ : "inline")}]"
end

Public Class Methods

new(scope) click to toggle source
# File lib/puppet/parser/templatewrapper.rb, line 13
def initialize(scope)
  @__scope__ = scope
end