diff options
| author | luke <luke@980ebf18-57e1-0310-9a29-db15c13687c0> | 2007-04-19 18:34:03 +0000 |
|---|---|---|
| committer | luke <luke@980ebf18-57e1-0310-9a29-db15c13687c0> | 2007-04-19 18:34:03 +0000 |
| commit | f8a0e99380a9a57e67363b33fb5ad54619244257 (patch) | |
| tree | d5ea5946ced9de1f0446c2cc017d1231facd6511 /lib/puppet/parser | |
| parent | 9946249255a69431349185807f4291745b15ca7f (diff) | |
Adding the functionality requested in http://mail.madstop.com/pipermail/puppet-users/2007-April/002398.html .
You can now retrieve qualified variables by specifying the full class path.
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@2393 980ebf18-57e1-0310-9a29-db15c13687c0
Diffstat (limited to 'lib/puppet/parser')
| -rw-r--r-- | lib/puppet/parser/ast/component.rb | 2 | ||||
| -rw-r--r-- | lib/puppet/parser/grammar.ra | 3 | ||||
| -rw-r--r-- | lib/puppet/parser/lexer.rb | 2 | ||||
| -rw-r--r-- | lib/puppet/parser/parser.rb | 107 | ||||
| -rw-r--r-- | lib/puppet/parser/scope.rb | 32 |
5 files changed, 87 insertions, 59 deletions
diff --git a/lib/puppet/parser/ast/component.rb b/lib/puppet/parser/ast/component.rb index 9e3179edb..058d8d871 100644 --- a/lib/puppet/parser/ast/component.rb +++ b/lib/puppet/parser/ast/component.rb @@ -58,8 +58,6 @@ class Puppet::Parser::AST if self.arguments # Verify that all required arguments are either present or # have been provided with defaults. - # FIXME This should probably also require each parent - # class's arguments... self.arguments.each { |arg, default| arg = symbolize(arg) unless args.include?(arg) diff --git a/lib/puppet/parser/grammar.ra b/lib/puppet/parser/grammar.ra index 6bca6495e..2a962822b 100644 --- a/lib/puppet/parser/grammar.ra +++ b/lib/puppet/parser/grammar.ra @@ -277,6 +277,9 @@ resourcename: quotedtext | array assignment: VARIABLE EQUALS rvalue { + if val[0] =~ /::/ + raise Puppet::ParseError, "Cannot assign to variables in other namespaces" + end # this is distinct from referencing a variable variable = ast AST::Name, :value => val[0] result = ast AST::VarDef, :name => variable, :value => val[2] diff --git a/lib/puppet/parser/lexer.rb b/lib/puppet/parser/lexer.rb index 7f537eafc..0c9594563 100644 --- a/lib/puppet/parser/lexer.rb +++ b/lib/puppet/parser/lexer.rb @@ -51,7 +51,7 @@ module Puppet %r{([A-Z][-\w]*::)+[A-Z][-\w]*} => :CLASSREF, %r{[A-Z][-\w]*} => :TYPE, %r{[0-9]+} => :NUMBER, - %r{\$\w+} => :VARIABLE + %r{\$(\w*::)*\w+} => :VARIABLE } @@keywords = { diff --git a/lib/puppet/parser/parser.rb b/lib/puppet/parser/parser.rb index 8b75200b5..eb296de31 100644 --- a/lib/puppet/parser/parser.rb +++ b/lib/puppet/parser/parser.rb @@ -29,7 +29,7 @@ module Puppet class Parser < Racc::Parser -module_eval <<'..end grammar.ra modeval..idde6e0009a9', 'grammar.ra', 603 +module_eval <<'..end grammar.ra modeval..id2ea020a302', 'grammar.ra', 606 require 'puppet/parser/functions' attr_reader :file, :interp @@ -254,7 +254,7 @@ end # $Id$ -..end grammar.ra modeval..idde6e0009a9 +..end grammar.ra modeval..id2ea020a302 ##### racc 1.4.5 generates ### @@ -1259,8 +1259,11 @@ module_eval <<'.,.,', 'grammar.ra', 270 # reduce 65 omitted -module_eval <<'.,.,', 'grammar.ra', 283 +module_eval <<'.,.,', 'grammar.ra', 286 def _reduce_66( val, _values, result ) + if val[0] =~ /::/ + raise Puppet::ParseError, "Cannot assign to variables in other namespaces" + end # this is distinct from referencing a variable variable = ast AST::Name, :value => val[0] result = ast AST::VarDef, :name => variable, :value => val[2] @@ -1268,21 +1271,21 @@ module_eval <<'.,.,', 'grammar.ra', 283 end .,., -module_eval <<'.,.,', 'grammar.ra', 288 +module_eval <<'.,.,', 'grammar.ra', 291 def _reduce_67( val, _values, result ) result = ast AST::ASTArray result end .,., -module_eval <<'.,.,', 'grammar.ra', 288 +module_eval <<'.,.,', 'grammar.ra', 291 def _reduce_68( val, _values, result ) result = val[0] result end .,., -module_eval <<'.,.,', 'grammar.ra', 297 +module_eval <<'.,.,', 'grammar.ra', 300 def _reduce_69( val, _values, result ) if val[0].instance_of?(AST::ASTArray) val[0].push(val[2]) @@ -1294,7 +1297,7 @@ module_eval <<'.,.,', 'grammar.ra', 297 end .,., -module_eval <<'.,.,', 'grammar.ra', 301 +module_eval <<'.,.,', 'grammar.ra', 304 def _reduce_70( val, _values, result ) result = ast AST::ResourceParam, :param => val[0], :value => val[2] result @@ -1303,7 +1306,7 @@ module_eval <<'.,.,', 'grammar.ra', 301 # reduce 71 omitted -module_eval <<'.,.,', 'grammar.ra', 310 +module_eval <<'.,.,', 'grammar.ra', 313 def _reduce_72( val, _values, result ) if val[0].instance_of?(AST::ASTArray) result = val[0].push(val[2]) @@ -1344,7 +1347,7 @@ module_eval <<'.,.,', 'grammar.ra', 310 # reduce 87 omitted -module_eval <<'.,.,', 'grammar.ra', 336 +module_eval <<'.,.,', 'grammar.ra', 339 def _reduce_88( val, _values, result ) args = aryfy(val[2]) result = ast AST::Function, @@ -1355,7 +1358,7 @@ module_eval <<'.,.,', 'grammar.ra', 336 end .,., -module_eval <<'.,.,', 'grammar.ra', 341 +module_eval <<'.,.,', 'grammar.ra', 344 def _reduce_89( val, _values, result ) result = ast AST::Function, :name => val[0], @@ -1365,28 +1368,28 @@ module_eval <<'.,.,', 'grammar.ra', 341 end .,., -module_eval <<'.,.,', 'grammar.ra', 345 +module_eval <<'.,.,', 'grammar.ra', 348 def _reduce_90( val, _values, result ) result = ast AST::String, :value => val[0] result end .,., -module_eval <<'.,.,', 'grammar.ra', 347 +module_eval <<'.,.,', 'grammar.ra', 350 def _reduce_91( val, _values, result ) result = ast AST::FlatString, :value => val[0] result end .,., -module_eval <<'.,.,', 'grammar.ra', 351 +module_eval <<'.,.,', 'grammar.ra', 354 def _reduce_92( val, _values, result ) result = ast AST::Boolean, :value => val[0] result end .,., -module_eval <<'.,.,', 'grammar.ra', 356 +module_eval <<'.,.,', 'grammar.ra', 359 def _reduce_93( val, _values, result ) Puppet.warning addcontext("Deprecation notice: Resource references should now be capitalized") result = ast AST::ResourceRef, :type => val[0], :title => val[2] @@ -1394,14 +1397,14 @@ module_eval <<'.,.,', 'grammar.ra', 356 end .,., -module_eval <<'.,.,', 'grammar.ra', 358 +module_eval <<'.,.,', 'grammar.ra', 361 def _reduce_94( val, _values, result ) result = ast AST::ResourceRef, :type => val[0], :title => val[2] result end .,., -module_eval <<'.,.,', 'grammar.ra', 371 +module_eval <<'.,.,', 'grammar.ra', 374 def _reduce_95( val, _values, result ) args = { :test => val[1], @@ -1419,7 +1422,7 @@ module_eval <<'.,.,', 'grammar.ra', 371 # reduce 96 omitted -module_eval <<'.,.,', 'grammar.ra', 376 +module_eval <<'.,.,', 'grammar.ra', 379 def _reduce_97( val, _values, result ) result = ast AST::Else, :statements => val[2] result @@ -1428,7 +1431,7 @@ module_eval <<'.,.,', 'grammar.ra', 376 # reduce 98 omitted -module_eval <<'.,.,', 'grammar.ra', 388 +module_eval <<'.,.,', 'grammar.ra', 391 def _reduce_99( val, _values, result ) options = val[3] unless options.instance_of?(AST::ASTArray) @@ -1441,7 +1444,7 @@ module_eval <<'.,.,', 'grammar.ra', 388 # reduce 100 omitted -module_eval <<'.,.,', 'grammar.ra', 398 +module_eval <<'.,.,', 'grammar.ra', 401 def _reduce_101( val, _values, result ) if val[0].instance_of?(AST::ASTArray) val[0].push val[1] @@ -1453,14 +1456,14 @@ module_eval <<'.,.,', 'grammar.ra', 398 end .,., -module_eval <<'.,.,', 'grammar.ra', 402 +module_eval <<'.,.,', 'grammar.ra', 405 def _reduce_102( val, _values, result ) result = ast AST::CaseOpt, :value => val[0], :statements => val[3] result end .,., -module_eval <<'.,.,', 'grammar.ra', 407 +module_eval <<'.,.,', 'grammar.ra', 410 def _reduce_103( val, _values, result ) result = ast(AST::CaseOpt, :value => val[0], @@ -1472,7 +1475,7 @@ module_eval <<'.,.,', 'grammar.ra', 407 # reduce 104 omitted -module_eval <<'.,.,', 'grammar.ra', 417 +module_eval <<'.,.,', 'grammar.ra', 420 def _reduce_105( val, _values, result ) if val[0].instance_of?(AST::ASTArray) val[0].push(val[2]) @@ -1484,7 +1487,7 @@ module_eval <<'.,.,', 'grammar.ra', 417 end .,., -module_eval <<'.,.,', 'grammar.ra', 421 +module_eval <<'.,.,', 'grammar.ra', 424 def _reduce_106( val, _values, result ) result = ast AST::Selector, :param => val[0], :values => val[2] result @@ -1493,7 +1496,7 @@ module_eval <<'.,.,', 'grammar.ra', 421 # reduce 107 omitted -module_eval <<'.,.,', 'grammar.ra', 423 +module_eval <<'.,.,', 'grammar.ra', 426 def _reduce_108( val, _values, result ) result = val[1] result @@ -1502,7 +1505,7 @@ module_eval <<'.,.,', 'grammar.ra', 423 # reduce 109 omitted -module_eval <<'.,.,', 'grammar.ra', 434 +module_eval <<'.,.,', 'grammar.ra', 437 def _reduce_110( val, _values, result ) if val[0].instance_of?(AST::ASTArray) val[0].push(val[2]) @@ -1514,7 +1517,7 @@ module_eval <<'.,.,', 'grammar.ra', 434 end .,., -module_eval <<'.,.,', 'grammar.ra', 438 +module_eval <<'.,.,', 'grammar.ra', 441 def _reduce_111( val, _values, result ) result = ast AST::ResourceParam, :param => val[0], :value => val[2] result @@ -1533,28 +1536,28 @@ module_eval <<'.,.,', 'grammar.ra', 438 # reduce 117 omitted -module_eval <<'.,.,', 'grammar.ra', 448 +module_eval <<'.,.,', 'grammar.ra', 451 def _reduce_118( val, _values, result ) result = ast AST::Default, :value => val[0] result end .,., -module_eval <<'.,.,', 'grammar.ra', 450 +module_eval <<'.,.,', 'grammar.ra', 453 def _reduce_119( val, _values, result ) result = [val[0].value] result end .,., -module_eval <<'.,.,', 'grammar.ra', 454 +module_eval <<'.,.,', 'grammar.ra', 457 def _reduce_120( val, _values, result ) results = val[0] << val[2].value result end .,., -module_eval <<'.,.,', 'grammar.ra', 462 +module_eval <<'.,.,', 'grammar.ra', 465 def _reduce_121( val, _values, result ) val[1].each do |file| import(file) @@ -1565,7 +1568,7 @@ module_eval <<'.,.,', 'grammar.ra', 462 end .,., -module_eval <<'.,.,', 'grammar.ra', 472 +module_eval <<'.,.,', 'grammar.ra', 475 def _reduce_122( val, _values, result ) interp.newdefine fqname(val[1]), :arguments => val[2], :code => val[4] @lexer.indefine = false @@ -1576,7 +1579,7 @@ module_eval <<'.,.,', 'grammar.ra', 472 end .,., -module_eval <<'.,.,', 'grammar.ra', 476 +module_eval <<'.,.,', 'grammar.ra', 479 def _reduce_123( val, _values, result ) interp.newdefine fqname(val[1]), :arguments => val[2] @lexer.indefine = false @@ -1585,7 +1588,7 @@ module_eval <<'.,.,', 'grammar.ra', 476 end .,., -module_eval <<'.,.,', 'grammar.ra', 484 +module_eval <<'.,.,', 'grammar.ra', 487 def _reduce_124( val, _values, result ) # Our class gets defined in the parent namespace, not our own. @lexer.namepop @@ -1595,7 +1598,7 @@ module_eval <<'.,.,', 'grammar.ra', 484 end .,., -module_eval <<'.,.,', 'grammar.ra', 489 +module_eval <<'.,.,', 'grammar.ra', 492 def _reduce_125( val, _values, result ) # Our class gets defined in the parent namespace, not our own. @lexer.namepop @@ -1605,7 +1608,7 @@ module_eval <<'.,.,', 'grammar.ra', 489 end .,., -module_eval <<'.,.,', 'grammar.ra', 494 +module_eval <<'.,.,', 'grammar.ra', 497 def _reduce_126( val, _values, result ) interp.newnode val[1], :parent => val[2], :code => val[4] result = nil @@ -1613,7 +1616,7 @@ module_eval <<'.,.,', 'grammar.ra', 494 end .,., -module_eval <<'.,.,', 'grammar.ra', 497 +module_eval <<'.,.,', 'grammar.ra', 500 def _reduce_127( val, _values, result ) interp.newnode val[1], :parent => val[2] result = nil @@ -1627,7 +1630,7 @@ module_eval <<'.,.,', 'grammar.ra', 497 # reduce 130 omitted -module_eval <<'.,.,', 'grammar.ra', 509 +module_eval <<'.,.,', 'grammar.ra', 512 def _reduce_131( val, _values, result ) result = val[0] result = [result] unless result.is_a?(Array) @@ -1642,14 +1645,14 @@ module_eval <<'.,.,', 'grammar.ra', 509 # reduce 134 omitted -module_eval <<'.,.,', 'grammar.ra', 517 +module_eval <<'.,.,', 'grammar.ra', 520 def _reduce_135( val, _values, result ) result = nil result end .,., -module_eval <<'.,.,', 'grammar.ra', 521 +module_eval <<'.,.,', 'grammar.ra', 524 def _reduce_136( val, _values, result ) result = ast AST::ASTArray, :children => [] result @@ -1658,14 +1661,14 @@ module_eval <<'.,.,', 'grammar.ra', 521 # reduce 137 omitted -module_eval <<'.,.,', 'grammar.ra', 526 +module_eval <<'.,.,', 'grammar.ra', 529 def _reduce_138( val, _values, result ) result = nil result end .,., -module_eval <<'.,.,', 'grammar.ra', 530 +module_eval <<'.,.,', 'grammar.ra', 533 def _reduce_139( val, _values, result ) result = val[1] result = [result] unless result[0].is_a?(Array) @@ -1675,7 +1678,7 @@ module_eval <<'.,.,', 'grammar.ra', 530 # reduce 140 omitted -module_eval <<'.,.,', 'grammar.ra', 537 +module_eval <<'.,.,', 'grammar.ra', 540 def _reduce_141( val, _values, result ) result = val[0] result = [result] unless result[0].is_a?(Array) @@ -1684,7 +1687,7 @@ module_eval <<'.,.,', 'grammar.ra', 537 end .,., -module_eval <<'.,.,', 'grammar.ra', 542 +module_eval <<'.,.,', 'grammar.ra', 545 def _reduce_142( val, _values, result ) Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype") result = [val[0], val[2]] @@ -1692,7 +1695,7 @@ module_eval <<'.,.,', 'grammar.ra', 542 end .,., -module_eval <<'.,.,', 'grammar.ra', 546 +module_eval <<'.,.,', 'grammar.ra', 549 def _reduce_143( val, _values, result ) Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype") result = [val[0]] @@ -1700,14 +1703,14 @@ module_eval <<'.,.,', 'grammar.ra', 546 end .,., -module_eval <<'.,.,', 'grammar.ra', 548 +module_eval <<'.,.,', 'grammar.ra', 551 def _reduce_144( val, _values, result ) result = [val[0], val[2]] result end .,., -module_eval <<'.,.,', 'grammar.ra', 550 +module_eval <<'.,.,', 'grammar.ra', 553 def _reduce_145( val, _values, result ) result = [val[0]] result @@ -1716,7 +1719,7 @@ module_eval <<'.,.,', 'grammar.ra', 550 # reduce 146 omitted -module_eval <<'.,.,', 'grammar.ra', 555 +module_eval <<'.,.,', 'grammar.ra', 558 def _reduce_147( val, _values, result ) result = val[1] result @@ -1725,7 +1728,7 @@ module_eval <<'.,.,', 'grammar.ra', 555 # reduce 148 omitted -module_eval <<'.,.,', 'grammar.ra', 560 +module_eval <<'.,.,', 'grammar.ra', 563 def _reduce_149( val, _values, result ) result = val[1] result @@ -1740,14 +1743,14 @@ module_eval <<'.,.,', 'grammar.ra', 560 # reduce 153 omitted -module_eval <<'.,.,', 'grammar.ra', 567 +module_eval <<'.,.,', 'grammar.ra', 570 def _reduce_154( val, _values, result ) result = ast AST::Variable, :value => val[0] result end .,., -module_eval <<'.,.,', 'grammar.ra', 575 +module_eval <<'.,.,', 'grammar.ra', 578 def _reduce_155( val, _values, result ) if val[1].instance_of?(AST::ASTArray) result = val[1] @@ -1758,7 +1761,7 @@ module_eval <<'.,.,', 'grammar.ra', 575 end .,., -module_eval <<'.,.,', 'grammar.ra', 577 +module_eval <<'.,.,', 'grammar.ra', 580 def _reduce_156( val, _values, result ) result = ast AST::ASTArray result @@ -1771,7 +1774,7 @@ module_eval <<'.,.,', 'grammar.ra', 577 # reduce 159 omitted -module_eval <<'.,.,', 'grammar.ra', 582 +module_eval <<'.,.,', 'grammar.ra', 585 def _reduce_160( val, _values, result ) result = nil result diff --git a/lib/puppet/parser/scope.rb b/lib/puppet/parser/scope.rb index ef5e9b003..02192c572 100644 --- a/lib/puppet/parser/scope.rb +++ b/lib/puppet/parser/scope.rb @@ -243,9 +243,13 @@ class Puppet::Parser::Scope @type = nil @name = nil @finished = false - if n = hash[:namespace] - @namespaces = [n] + if hash.include?(:namespace) + if n = hash[:namespace] + @namespaces = [n] + end hash.delete(:namespace) + else + @namespaces = [""] end hash.each { |name, val| method = name.to_s + "=" @@ -393,9 +397,29 @@ class Puppet::Parser::Scope finddefine(name) || findclass(name) end + def lookup_qualified_var(name, usestring) + parts = name.split(/::/) + shortname = parts.pop + klassname = parts.join("::") + klass = findclass(klassname) + unless klass + raise Puppet::ParseError, "Could not find class %s" % klassname + end + unless kscope = class_scope(klass) + raise Puppet::ParseError, "Class %s has not been evaluated so its variables cannot be referenced" % klass.fqname + end + return kscope.lookupvar(shortname, usestring) + end + + private :lookup_qualified_var + # Look up a variable. The simplest value search we do. Default to returning # an empty string for missing values, but support returning a constant. def lookupvar(name, usestring = true) + # If the variable is qualified, then find the specified scope and look the variable up there instead. + if name =~ /::/ + return lookup_qualified_var(name, usestring) + end # We can't use "if @symtable[name]" here because the value might be false if @symtable.include?(name) return @symtable[name] @@ -547,12 +571,12 @@ class Puppet::Parser::Scope ss = StringScanner.new(string) out = "" while not ss.eos? - if ss.scan(/^\$\{(\w+)\}|^\$(\w+)/) + if ss.scan(/^\$\{((\w*::)*\w+)\}|^\$((\w*::)*\w+)/) # If it matches the backslash, then just retun the dollar sign. if ss.matched == '\\$' out << '$' else # look the variable up - out << lookupvar(ss[1] || ss[2]).to_s || "" + out << lookupvar(ss[1] || ss[3]).to_s || "" end elsif ss.scan(/^\\(.)/) # Puppet.debug("Got escape: pos:%d; m:%s" % [ss.pos, ss.matched]) |
