diff options
author | luke <luke@980ebf18-57e1-0310-9a29-db15c13687c0> | 2007-05-03 20:45:25 +0000 |
---|---|---|
committer | luke <luke@980ebf18-57e1-0310-9a29-db15c13687c0> | 2007-05-03 20:45:25 +0000 |
commit | 0c07125397428a0c1ca9a4a4d0176f45d8be0979 (patch) | |
tree | 1b390027a563b47a26341b439288b81473c6cdcf /lib/puppet/parser | |
parent | 8d7ec14836809f1433e645c3069691d2f6c70e52 (diff) | |
download | puppet-0c07125397428a0c1ca9a4a4d0176f45d8be0979.tar.gz puppet-0c07125397428a0c1ca9a4a4d0176f45d8be0979.tar.xz puppet-0c07125397428a0c1ca9a4a4d0176f45d8be0979.zip |
Fixing #615 (subclasses with similar names) by getting rid of the class "type" and "fqname", and instead using "classname" everywhere. You should no longer see unqualified class/definition names anywhere. Also, rewriting how snippet tests work, to avoid creating all of the files, since the point was the parsing tests, not functional tests.
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@2458 980ebf18-57e1-0310-9a29-db15c13687c0
Diffstat (limited to 'lib/puppet/parser')
-rw-r--r-- | lib/puppet/parser/ast/component.rb | 20 | ||||
-rw-r--r-- | lib/puppet/parser/grammar.ra | 28 | ||||
-rw-r--r-- | lib/puppet/parser/interpreter.rb | 48 | ||||
-rw-r--r-- | lib/puppet/parser/parser.rb | 18 | ||||
-rw-r--r-- | lib/puppet/parser/scope.rb | 14 |
5 files changed, 61 insertions, 67 deletions
diff --git a/lib/puppet/parser/ast/component.rb b/lib/puppet/parser/ast/component.rb index 058d8d871..6a309ac8c 100644 --- a/lib/puppet/parser/ast/component.rb +++ b/lib/puppet/parser/ast/component.rb @@ -15,8 +15,8 @@ class Puppet::Parser::AST # The class name @name = :definition - attr_accessor :type, :arguments, :code, :scope, :keyword - attr_accessor :exported, :namespace, :fqname, :interp + attr_accessor :classname, :arguments, :code, :scope, :keyword + attr_accessor :exported, :namespace, :interp # These are retrieved when looking up the superclass attr_accessor :name @@ -27,7 +27,6 @@ class Puppet::Parser::AST def evaluate(hash) origscope = hash[:scope] - objtype = hash[:type] title = hash[:title] args = symbolize_options(hash[:arguments] || {}) @@ -44,8 +43,8 @@ class Puppet::Parser::AST # Additionally, add a tag for whatever kind of class # we are - if @type != "" and ! @type.nil? - scope.tag(@type) + if @classname != "" and ! @classname.nil? + @classname.split(/::/).each { |tag| scope.tag(tag) } end [name, title].each do |str| @@ -68,7 +67,7 @@ class Puppet::Parser::AST # [default.inspect, arg.inspect, @name.inspect] else parsefail "Must pass %s to %s of type %s" % - [arg,title,@type] + [arg,title,@classname] end end } @@ -78,7 +77,7 @@ class Puppet::Parser::AST # component's scope. args.each { |arg,value| unless validattr?(arg) - parsefail "%s does not accept attribute %s" % [@type, arg] + parsefail "%s does not accept attribute %s" % [@classname, arg] end exceptwrap do @@ -142,7 +141,7 @@ class Puppet::Parser::AST # Set our parent class, with a little check to avoid some potential # weirdness. def parentclass=(name) - if name == self.type + if name == self.classname parsefail "Parent classes must have dissimilar names" end @@ -173,13 +172,12 @@ class Puppet::Parser::AST # Create a new subscope in which to evaluate our code. def subscope(scope, name = nil) args = { - :type => @type, + :type => self.classname, :keyword => self.keyword, :namespace => self.namespace } args[:name] = name if name - args[:type] = self.type if self.type scope = scope.newscope(args) scope.source = self @@ -187,7 +185,7 @@ class Puppet::Parser::AST end def to_s - fqname + classname end # Check whether a given argument is valid. Searches up through diff --git a/lib/puppet/parser/grammar.ra b/lib/puppet/parser/grammar.ra index 2a962822b..16aa10459 100644 --- a/lib/puppet/parser/grammar.ra +++ b/lib/puppet/parser/grammar.ra @@ -111,7 +111,7 @@ resourcerefs: resourceref result = val[0] } -resource: fqname LBRACE resourceinstances endsemi RBRACE { +resource: classname LBRACE resourceinstances endsemi RBRACE { array = val[2] if array.instance_of?(AST::ResourceInst) array = [array] @@ -130,7 +130,7 @@ resource: fqname LBRACE resourceinstances endsemi RBRACE { :title => instance[0], :params => instance[1]) } -} | fqname LBRACE params endcomma RBRACE { +} | classname LBRACE params endcomma RBRACE { # This is a deprecated syntax. error "All resource specifications require names" } | TYPE LBRACE params endcomma RBRACE { @@ -466,28 +466,28 @@ import: IMPORT qtexts { # Disable definition inheritance for now. 8/27/06, luke #definition: DEFINE NAME argumentlist parent LBRACE statements RBRACE { -definition: DEFINE fqname argumentlist LBRACE statements RBRACE { - interp.newdefine fqname(val[1]), :arguments => val[2], :code => val[4] +definition: DEFINE classname argumentlist LBRACE statements RBRACE { + interp.newdefine classname(val[1]), :arguments => val[2], :code => val[4] @lexer.indefine = false result = nil #} | DEFINE NAME argumentlist parent LBRACE RBRACE { -} | DEFINE fqname argumentlist LBRACE RBRACE { - interp.newdefine fqname(val[1]), :arguments => val[2] +} | DEFINE classname argumentlist LBRACE RBRACE { + interp.newdefine classname(val[1]), :arguments => val[2] @lexer.indefine = false result = nil } #hostclass: CLASS NAME argumentlist parent LBRACE statements RBRACE { -hostclass: CLASS fqname classparent LBRACE statements RBRACE { +hostclass: CLASS classname classparent LBRACE statements RBRACE { # Our class gets defined in the parent namespace, not our own. @lexer.namepop - interp.newclass fqname(val[1]), :code => val[4], :parent => val[2] + interp.newclass classname(val[1]), :code => val[4], :parent => val[2] result = nil -} | CLASS fqname classparent LBRACE RBRACE { +} | CLASS classname classparent LBRACE RBRACE { # Our class gets defined in the parent namespace, not our own. @lexer.namepop - interp.newclass fqname(val[1]), :parent => val[2] + interp.newclass classname(val[1]), :parent => val[2] result = nil } @@ -499,7 +499,7 @@ nodedef: NODE hostnames nodeparent LBRACE statements RBRACE { result = nil } -fqname: NAME +classname: NAME | CLASSNAME # Multiple hostnames, as used for node names. These are all literal @@ -558,12 +558,12 @@ nodeparent: nil } classparent: nil - | INHERITS fqnameordefault { + | INHERITS classnameordefault { result = val[1] } nameordefault: NAME | DEFAULT -fqnameordefault: fqname | DEFAULT +classnameordefault: classname | DEFAULT variable: VARIABLE { result = ast AST::Variable, :value => val[0] @@ -746,7 +746,7 @@ def initvars end # The fully qualifed name, with the full namespace. -def fqname(name) +def classname(name) [@lexer.namespace, name].join("::").sub(/^::/, '') end diff --git a/lib/puppet/parser/interpreter.rb b/lib/puppet/parser/interpreter.rb index 641e69cf3..9391ec866 100644 --- a/lib/puppet/parser/interpreter.rb +++ b/lib/puppet/parser/interpreter.rb @@ -321,7 +321,7 @@ class Puppet::Parser::Interpreter arghash = { :name => name, :interp => self, - :fqname => name + :classname => name } if (classes.is_a?(Array) and classes.empty?) or classes.nil? @@ -528,20 +528,20 @@ class Puppet::Parser::Interpreter end # Create a new class, or merge with an existing class. - def newclass(fqname, options = {}) - fqname = fqname.downcase - if @definetable.include?(fqname) + def newclass(name, options = {}) + name = name.downcase + if @definetable.include?(name) raise Puppet::ParseError, "Cannot redefine class %s as a definition" % - fqname + name end code = options[:code] parent = options[:parent] # If the class is already defined, then add code to it. - if other = @classtable[fqname] + if other = @classtable[name] # Make sure the parents match if parent and other.parentclass and (parent != other.parentclass) - @parser.error("Class %s is already defined at %s:%s; cannot redefine" % [fqname, other.file, other.line]) + @parser.error("Class %s is already defined at %s:%s; cannot redefine" % [name, other.file, other.line]) end # This might be dangerous... @@ -551,7 +551,7 @@ class Puppet::Parser::Interpreter # This might just be an empty, stub class. if code - tmp = fqname + tmp = name if tmp == "" tmp = "main" end @@ -566,46 +566,43 @@ class Puppet::Parser::Interpreter end else # Define it anew. - ns, name = namesplit(fqname) - # Note we're doing something somewhat weird here -- we're setting # the class's namespace to its fully qualified name. This means # anything inside that class starts looking in that namespace first. - args = {:type => name, :namespace => fqname, :fqname => fqname, :interp => self} + args = {:namespace => name, :classname => name, :interp => self} args[:code] = code if code args[:parentclass] = parent if parent - @classtable[fqname] = @parser.ast AST::HostClass, args + @classtable[name] = @parser.ast AST::HostClass, args end - return @classtable[fqname] + return @classtable[name] end # Create a new definition. - def newdefine(fqname, options = {}) - fqname = fqname.downcase - if @classtable.include?(fqname) + def newdefine(name, options = {}) + name = name.downcase + if @classtable.include?(name) raise Puppet::ParseError, "Cannot redefine class %s as a definition" % - fqname + name end # Make sure our definition doesn't already exist - if other = @definetable[fqname] - @parser.error("%s is already defined at %s:%s; cannot redefine" % [fqname, other.file, other.line]) + if other = @definetable[name] + @parser.error("%s is already defined at %s:%s; cannot redefine" % [name, other.file, other.line]) end - ns, name = namesplit(fqname) + ns, whatever = namesplit(name) args = { - :type => name, :namespace => ns, :arguments => options[:arguments], :code => options[:code], - :fqname => fqname + :classname => name } [:code, :arguments].each do |param| args[param] = options[param] if options[param] end - @definetable[fqname] = @parser.ast AST::Component, args + @definetable[name] = @parser.ast AST::Component, args end # Create a new node. Nodes are special, because they're stored in a global @@ -628,8 +625,7 @@ class Puppet::Parser::Interpreter args[:parentclass] = options[:parent] end @nodetable[name] = @parser.ast(AST::Node, args) - @nodetable[name].fqname = name - @nodetable[name] + @nodetable[name].classname = name @nodetable[name].interp = self @nodetable[name] end @@ -700,7 +696,7 @@ class Puppet::Parser::Interpreter end if output =~ /\A\s+\Z/ # all whitespace - puts "empty response for %s" % name + Puppet.debug "Empty response for %s from external node source" % name return nil end diff --git a/lib/puppet/parser/parser.rb b/lib/puppet/parser/parser.rb index eb296de31..ee8470a26 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..id2ea020a302', 'grammar.ra', 606 +module_eval <<'..end grammar.ra modeval..id70ce3bc052', 'grammar.ra', 606 require 'puppet/parser/functions' attr_reader :file, :interp @@ -173,7 +173,7 @@ def initvars end # The fully qualifed name, with the full namespace. -def fqname(name) +def classname(name) [@lexer.namespace, name].join("::").sub(/^::/, '') end @@ -254,7 +254,7 @@ end # $Id$ -..end grammar.ra modeval..id2ea020a302 +..end grammar.ra modeval..id70ce3bc052 ##### racc 1.4.5 generates ### @@ -829,7 +829,7 @@ Racc_token_to_s_table = [ 'variable', 'quotedtext', 'resourceref', -'fqname', +'classname', 'resourceinstances', 'endsemi', 'params', @@ -873,7 +873,7 @@ Racc_token_to_s_table = [ 'arguments', 'argument', 'nameordefault', -'fqnameordefault'] +'classnameordefault'] Racc_debug_parser = false @@ -1570,7 +1570,7 @@ module_eval <<'.,.,', 'grammar.ra', 465 module_eval <<'.,.,', 'grammar.ra', 475 def _reduce_122( val, _values, result ) - interp.newdefine fqname(val[1]), :arguments => val[2], :code => val[4] + interp.newdefine classname(val[1]), :arguments => val[2], :code => val[4] @lexer.indefine = false result = nil @@ -1581,7 +1581,7 @@ module_eval <<'.,.,', 'grammar.ra', 475 module_eval <<'.,.,', 'grammar.ra', 479 def _reduce_123( val, _values, result ) - interp.newdefine fqname(val[1]), :arguments => val[2] + interp.newdefine classname(val[1]), :arguments => val[2] @lexer.indefine = false result = nil result @@ -1592,7 +1592,7 @@ module_eval <<'.,.,', 'grammar.ra', 487 def _reduce_124( val, _values, result ) # Our class gets defined in the parent namespace, not our own. @lexer.namepop - interp.newclass fqname(val[1]), :code => val[4], :parent => val[2] + interp.newclass classname(val[1]), :code => val[4], :parent => val[2] result = nil result end @@ -1602,7 +1602,7 @@ module_eval <<'.,.,', 'grammar.ra', 492 def _reduce_125( val, _values, result ) # Our class gets defined in the parent namespace, not our own. @lexer.namepop - interp.newclass fqname(val[1]), :parent => val[2] + interp.newclass classname(val[1]), :parent => val[2] result = nil result end diff --git a/lib/puppet/parser/scope.rb b/lib/puppet/parser/scope.rb index 25a6551af..709884296 100644 --- a/lib/puppet/parser/scope.rb +++ b/lib/puppet/parser/scope.rb @@ -123,8 +123,8 @@ class Puppet::Parser::Scope # that subclasses can set their parent scopes to be the scope of # their parent class. def class_scope(klass) - if klass.respond_to?(:fqname) - @classtable[klass.fqname] + if klass.respond_to?(:classname) + @classtable[klass.classname] else @classtable[klass] end @@ -406,7 +406,7 @@ class Puppet::Parser::Scope 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 + raise Puppet::ParseError, "Class %s has not been evaluated so its variables cannot be referenced" % klass.classname end return kscope.lookupvar(shortname, usestring) end @@ -459,8 +459,8 @@ class Puppet::Parser::Scope end def setclass?(obj) - if obj.respond_to?(:fqname) - @classtable.has_key?(obj.fqname) + if obj.respond_to?(:classname) + @classtable.has_key?(obj.classname) else @classtable[obj] end @@ -472,11 +472,11 @@ class Puppet::Parser::Scope # can support multiple unrelated classes with the same name. def setclass(obj) if obj.is_a?(AST::HostClass) - unless obj.fqname + unless obj.classname raise Puppet::DevError, "Got a %s with no fully qualified name" % obj.class end - @classtable[obj.fqname] = self + @classtable[obj.classname] = self else raise Puppet::DevError, "Invalid class %s" % obj.inspect end |