Class: Puppet::Parser::TemplateWrapper Private

Inherits:
Object
  • Object
show all
Includes:
Util
Defined in:
lib/puppet/parser/templatewrapper.rb

Overview

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

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

Constant Summary

Constants included from Util

Util::AbsolutePathPosix, Util::AbsolutePathWindows, Util::DEFAULT_POSIX_MODE, Util::DEFAULT_WINDOWS_MODE

Constants included from Util::POSIX

Util::POSIX::LOCALE_ENV_VARS, Util::POSIX::USER_ENV_VARS

Constants included from Util::SymbolicFileMode

Util::SymbolicFileMode::SetGIDBit, Util::SymbolicFileMode::SetUIDBit, Util::SymbolicFileMode::StickyBit, Util::SymbolicFileMode::SymbolicMode, Util::SymbolicFileMode::SymbolicSpecialToBit

Instance Method Summary collapse

Methods included from Util

absolute_path?, activerecord_version, benchmark, binread, chuser, classproxy, deterministic_rand, execfail, execpipe, execute, exit_on_fail, logmethods, memory, path_to_uri, pretty_backtrace, proxy, replace_file, safe_posix_fork, symbolizehash, thinmark, uri_to_path, which, withenv, withumask

Methods included from Util::POSIX

#get_posix_field, #gid, #idfield, #methodbyid, #methodbyname, #search_posix_field, #uid

Methods included from Util::SymbolicFileMode

#normalize_symbolic_mode, #symbolic_mode_to_int, #valid_symbolic_mode?

Constructor Details

#initialize(scope) ⇒ TemplateWrapper

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a new instance of TemplateWrapper.



12
13
14
# File 'lib/puppet/parser/templatewrapper.rb', line 12

def initialize(scope)
  @__scope__ = scope
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

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.



73
74
75
76
77
78
79
80
81
82
83
# File 'lib/puppet/parser/templatewrapper.rb', line 73

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

Instance Method Details

#all_tagsArray<String>

Returns All the defined tags.

Returns:



57
58
59
# File 'lib/puppet/parser/templatewrapper.rb', line 57

def all_tags
  scope.catalog.tags
end

#classesArray<String>

Returns The list of defined classes.

Returns:



45
46
47
# File 'lib/puppet/parser/templatewrapper.rb', line 45

def classes
  scope.catalog.classes
end

#fileString

Returns The full path name of the template that is being executed.

Returns:

  • (String)

    The full path name of the template that is being executed



18
19
20
# File 'lib/puppet/parser/templatewrapper.rb', line 18

def file
  @__file__
end

#file=(filename) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



86
87
88
89
90
91
92
93
# File 'lib/puppet/parser/templatewrapper.rb', line 86

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) ⇒ Boolean

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

Returns:

  • (Boolean)


39
40
41
# File 'lib/puppet/parser/templatewrapper.rb', line 39

def has_variable?(name)
  scope.include?(name.to_s)
end

#result(string = nil) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/puppet/parser/templatewrapper.rb', line 96

def result(string = nil)
  if string
    template_source = "inline template"
  else
    string = File.read(@__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

#scopePuppet::Parser::Scope

Returns The scope in which the template is evaluated.

Returns:



24
25
26
# File 'lib/puppet/parser/templatewrapper.rb', line 24

def scope
  @__scope__
end

#tagsArray<String>

Returns The tags defined in the current scope.

Returns:

  • (Array<String>)

    The tags defined in the current scope



51
52
53
# File 'lib/puppet/parser/templatewrapper.rb', line 51

def tags
  scope.tags
end

#to_sObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



124
125
126
# File 'lib/puppet/parser/templatewrapper.rb', line 124

def to_s
  "template[#{(@__file__ ? @__file__ : "inline")}]"
end