diff options
62 files changed, 2130 insertions, 1565 deletions
@@ -19,7 +19,7 @@ a44cbb1 (#7264) Docs: Clarify that subscribe/notify imply require/before 3722520 Fix #7299 - do not require net/ssh for running rake spec 2.7.0rc2 -=== +======== 61edff9 (#7353) Remove :for_humans format entirely. d2b5ec6 Adding test for ticket 7139 6f2a129 add clean-up step to test for ticket_5477 to prevent site.pp from leaking to other tests @@ -182,7 +182,7 @@ fc18591 Adding pkgutil support. 2.7.0rc1 -==== +======== 5915814 Revert "(#6928) Removed --ignoreimport" 24a277c (#6928) Removed --ignoreimport fc36e8d (#6928) Remove --parseonly @@ -687,8 +687,11 @@ d532e6d Fixing #3185 Rakefile is loading puppet.rb twice 3457b87 Added time module to tagmail report -2.6.8rc1 -==== +2.6.8 +===== +c1edcb2 add test for ticket 7101 +db26326 Move tests from puppet-acceptance repo +bee1ef7 Updated CHANGELOG for 2.6.8rc1 8b7444d (#2331) Remove darwinports pkg provider, replace with rewritten macports provider 65c4e14 Fixed #7082 - Added system support for groups b7f4ff7 (#7018) Give more context on the service type's assumptions. Wording tweaks. diff --git a/acceptance/pending/ticket_3360_allow_duplicate_csr_with_option_set.rb b/acceptance/pending/ticket_3360_allow_duplicate_csr_with_option_set.rb new file mode 100644 index 000000000..ba02227ea --- /dev/null +++ b/acceptance/pending/ticket_3360_allow_duplicate_csr_with_option_set.rb @@ -0,0 +1,50 @@ +test_name "#3360: Allow duplicate CSR when allow_duplicate_certs is on" + +agent_hostnames = agents.map {|a| a.to_s} + +# Kill running Puppet Master -- should not be running at this point +step "Master: kill running Puppet Master" +on master, "ps -U puppet | awk '/puppet/ { print \$1 }' | xargs kill || echo \"Puppet Master not running\"" + +step "Master: Start Puppet Master" +on master, puppet_master("--allow_duplicate_certs --certdnsnames=\"puppet:$(hostname -s):$(hostname -f)\" --verbose --noop") + +step "Generate a certificate request for the agent" +on agents, "puppet certificate generate `hostname -f` --ca-location remote --server #{master}" + +step "Collect the original certs" +on master, puppet_cert("--sign --all") +original_certs = on master, puppet_cert("--list --all") + +old_certs = {} +original_certs.stdout.each_line do |line| + if line =~ /^\+ (\S+) \((.+)\)$/ + old_certs[$1] = $2 + puts "old cert: #{$1} #{$2}" + end +end + +step "Make another request with the same certname" +on agents, "puppet certificate generate `hostname -f` --ca-location remote --server #{master}" + +step "Collect the new certs" + +on master, puppet_cert("--sign --all") +new_cert_list = on master, puppet_cert("--list --all") + +new_certs = {} +new_cert_list.stdout.each_line do |line| + if line =~ /^\+ (\S+) \((.+)\)$/ + new_certs[$1] = $2 + puts "new cert: #{$1} #{$2}" + end +end + +step "Verify the certs have changed" +# using the agent name as the key may cause errors; +# agent name from cfg file is likely to have short name +# where certs might be signed with long names. +old_certs.each_key { |key| + next if key.include? master # skip the masters cert, only care about agents + fail_test("#{key} does not have a new signed certificate") if old_certs[key] == new_certs[key] +} diff --git a/acceptance/pending/ticket_3360_reject_duplicate_csr_with_option_unset.rb b/acceptance/pending/ticket_3360_reject_duplicate_csr_with_option_unset.rb new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/acceptance/pending/ticket_3360_reject_duplicate_csr_with_option_unset.rb diff --git a/acceptance/pending/ticket_5027_warn_on_dynamic_scope.rb b/acceptance/pending/ticket_5027_warn_on_dynamic_scope.rb new file mode 100644 index 000000000..762116ce9 --- /dev/null +++ b/acceptance/pending/ticket_5027_warn_on_dynamic_scope.rb @@ -0,0 +1,28 @@ +test_name "#5027: Issue warnings when using dynamic scope" + +step "Apply dynamic scoping manifest on agents" +apply_manifest_on agents, %q{ + $foo = 'foo_value' + + class a { + $bar = 'bar_value' + + include b + } + + class b inherits c { + notify { $baz: } # should not generate a warning -- inherited from class c + notify { $bar: } # should generate a warning -- uses dynamic scoping + notify { $foo: } # should not generate a warning -- comes from top scope + } + + class c { + $baz = 'baz_value' + } + + include a +} + +step "Verify deprecation warning" +fail_test "Deprecation warning not issued" unless + stdout.include? 'warning: Dynamic lookup of $bar will not be supported in future versions. Use a fully-qualified variable name or parameterized classes.' diff --git a/acceptance/pending/ticket_6928_puppet_master_parse_fails.rb b/acceptance/pending/ticket_6928_puppet_master_parse_fails.rb new file mode 100644 index 000000000..aac53138a --- /dev/null +++ b/acceptance/pending/ticket_6928_puppet_master_parse_fails.rb @@ -0,0 +1,38 @@ +test_name "#6928: Puppet --parseonly should return deprication message" + +# Create good and bad formatted manifests +step "Master: create valid, invalid formatted manifests" +create_remote_file(master, '/tmp/good.pp', %w{notify{good:}} ) +create_remote_file(master, '/tmp/bad.pp', 'notify{bad:') + +step "Master: use --parseonly on an invalid manifest, should return 1 and issue deprecation warning" +on master, puppet_master( %w{--parseonly /tmp/bad.pp} ), :acceptable_exit_codes => [ 1 ] + fail_test "Deprecation warning not issued for --parseonly" unless + stdout.include? '--parseonly has been removed. Please use \'puppet parser validate <manifest>\'' + +step "Agents: create valid, invalid formatted manifests" +agents.each do |host| + create_remote_file(host, '/tmp/good.pp', %w{notify{good:}} ) + create_remote_file(host, '/tmp/bad.pp', 'notify{bad:') +end + +step "Agents: use --parseonly on an invalid manifest, should return 1 and issue deprecation warning" +agents.each do |host| + on(host, "puppet --parseonly /tmp/bad.pp}", :acceptable_exit_codes => [ 1 ]) do + fail_test "Deprecation warning not issued for --parseonly" unless + stdout.include? '--parseonly has been removed. Please use \'puppet parser validate <manifest>\'' + end +end + +step "Test Face for ‘parser validate’ with good manifest -- should pass" +agents.each do |host| + on(host, "puppet parser validate /tmp/good.pp", :acceptable_exit_codes => [ 0 ]) +end + +step "Test Face for ‘parser validate’ with bad manifest -- should fail" +agents.each do |host| + on(host, "puppet parser validate /tmp/bad.pp", :acceptable_exit_codes => [ 1 ]) do + fail_test "Bad manifest detection failed" unless + stderr.include? 'Could not run: Could not parse for environment production' + end +end diff --git a/acceptance/tests/stages/ticket_4655_default_stage_for_classes.rb b/acceptance/tests/stages/ticket_4655_default_stage_for_classes.rb new file mode 100644 index 000000000..1b0b537bf --- /dev/null +++ b/acceptance/tests/stages/ticket_4655_default_stage_for_classes.rb @@ -0,0 +1,39 @@ +test_name "#4655: Allow setting the default stage for parameterized classes" + +temp_file_name = "/tmp/4655-stage-in-parameterized-class.#{$$}" +test_manifest = <<HERE +stage { one: before => Stage[two] } +stage { two: before => Stage[three] } +stage { three: before => Stage[main] } + +class in_one { + exec { "echo 'in_one' > #{temp_file_name}": + path => '/usr/bin:/bin', + } +} +class { in_one: stage => "one" } + +class in_two( $stage=two ){ + exec { "echo 'in_two' >> #{temp_file_name}": + path => '/usr/bin:/bin', + } +} +class { in_two: } + +class in_three { + exec { "echo 'in_three' >> #{temp_file_name}": + path => '/usr/bin:/bin', + } +} +class { "in_three": stage => "three" } +HERE + +expected_results = "in_one +in_two +in_three +" +apply_manifest_on agents, test_manifest + +on(agents, "cat #{temp_file_name}").each do |result| + assert_equal(expected_results, "#{result.stdout}", "Unexpected result for host '#{result.host}'") +end diff --git a/ext/vim/README b/ext/vim/README index 776bb1eb2..7fd2934fb 100644 --- a/ext/vim/README +++ b/ext/vim/README @@ -1,2 +1,3 @@ To install these files, copy them into ~/.vim, or the relevant -system-wide location. +system-wide location. To use the ftplugin and indenting, you may need +to enable them with "filetype plugin indent on" in your vimrc. diff --git a/ext/vim/ftplugin/puppet.vim b/ext/vim/ftplugin/puppet.vim new file mode 100644 index 000000000..b6491554b --- /dev/null +++ b/ext/vim/ftplugin/puppet.vim @@ -0,0 +1,94 @@ +" Vim filetype plugin +" Language: Puppet +" Maintainer: Todd Zullinger <tmz@pobox.com> +" Last Change: 2009 Aug 19 +" vim: set sw=4 sts=4: + +if exists("b:did_ftplugin") + finish +endif +let b:did_ftplugin = 1 + +if !exists("no_plugin_maps") && !exists("no_puppet_maps") + if !hasmapto("<Plug>AlignRange") + map <buffer> <LocalLeader>= <Plug>AlignRange + endif +endif + +noremap <buffer> <unique> <script> <Plug>AlignArrows :call <SID>AlignArrows()<CR> +noremap <buffer> <unique> <script> <Plug>AlignRange :call <SID>AlignRange()<CR> + +iabbrev => =><C-R>=<SID>AlignArrows('=>')<CR> +iabbrev +> +><C-R>=<SID>AlignArrows('+>')<CR> + +if exists('*s:AlignArrows') + finish +endif + +let s:arrow_re = '[=+]>' +let s:selector_re = '[=+]>\s*\$.*\s*?\s*{\s*$' + +function! s:AlignArrows(op) + let cursor_pos = getpos('.') + let lnum = line('.') + let line = getline(lnum) + if line !~ s:arrow_re + return + endif + let pos = stridx(line, a:op) + let start = lnum + let end = lnum + let pnum = lnum - 1 + while 1 + let pline = getline(pnum) + if pline !~ s:arrow_re || pline =~ s:selector_re + break + endif + let start = pnum + let pnum -= 1 + endwhile + let cnum = end + while 1 + let cline = getline(cnum) + if cline !~ s:arrow_re || + \ (indent(cnum) != indent(cnum+1) && getline(cnum+1) !~ '\s*}') + break + endif + let end = cnum + let cnum += 1 + endwhile + call s:AlignSection(start, end) + let cursor_pos[2] = stridx(getline('.'), a:op) + strlen(a:op) + 1 + call setpos('.', cursor_pos) + return '' +endfunction + +function! s:AlignRange() range + call s:AlignSection(a:firstline, a:lastline) +endfunction + +" AlignSection and AlignLine are from the vim wiki: +" http://vim.wikia.com/wiki/Regex-based_text_alignment +function! s:AlignSection(start, end) + let extra = 1 + let sep = s:arrow_re + let maxpos = 0 + let section = getline(a:start, a:end) + for line in section + let pos = match(line, ' *'.sep) + if maxpos < pos + let maxpos = pos + endif + endfor + call map(section, 's:AlignLine(v:val, sep, maxpos, extra)') + call setline(a:start, section) +endfunction + +function! s:AlignLine(line, sep, maxpos, extra) + let m = matchlist(a:line, '\(.\{-}\) \{-}\('.a:sep.'.*\)') + if empty(m) + return a:line + endif + let spaces = repeat(' ', a:maxpos - strlen(m[1]) + a:extra) + return m[1] . spaces . m[2] +endfunction diff --git a/ext/vim/indent/puppet.vim b/ext/vim/indent/puppet.vim new file mode 100644 index 000000000..689e06879 --- /dev/null +++ b/ext/vim/indent/puppet.vim @@ -0,0 +1,76 @@ +" Vim indent file +" Language: Puppet +" Maintainer: Todd Zullinger <tmz@pobox.com> +" Last Change: 2009 Aug 19 +" vim: set sw=4 sts=4: + +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +setlocal autoindent smartindent +setlocal indentexpr=GetPuppetIndent() +setlocal indentkeys+=0],0) + +if exists("*GetPuppetIndent") + finish +endif + +" Check if a line is part of an include 'block', e.g.: +" include foo, +" bar, +" baz +function! s:PartOfInclude(lnum) + let lnum = a:lnum + while lnum + let lnum = lnum - 1 + let line = getline(lnum) + if line !~ ',$' + break + endif + if line =~ '^\s*include\s\+[^,]\+,$' + return 1 + endif + endwhile + return 0 +endfunction + +function! s:OpenBrace(lnum) + call cursor(a:lnum, 1) + return searchpair('{\|\[\|(', '', '}\|\]\|)', 'nbW') +endfunction + +function! GetPuppetIndent() + let pnum = prevnonblank(v:lnum - 1) + if pnum == 0 + return 0 + endif + + let line = getline(v:lnum) + let pline = getline(pnum) + let ind = indent(pnum) + + if pline =~ '^\s*#' + return ind + endif + + if pline =~ '\({\|\[\|(\|:\)$' + let ind += &sw + elseif pline =~ ';$' && pline !~ '[^:]\+:.*[=+]>.*' + let ind -= &sw + elseif pline =~ '^\s*include\s\+.*,$' + let ind += &sw + endif + + if pline !~ ',$' && s:PartOfInclude(pnum) + let ind -= &sw + endif + + " Match } }, }; ] ]: ) + if line =~ '^\s*\(}\(,\|;\)\?$\|]:\?$\|)\)' + let ind = indent(s:OpenBrace(v:lnum)) + endif + + return ind +endfunction diff --git a/lib/puppet.rb b/lib/puppet.rb index e20874b61..bcac94d45 100644 --- a/lib/puppet.rb +++ b/lib/puppet.rb @@ -59,8 +59,7 @@ module Puppet # configuration parameter access and stuff def self.[](param) - case param - when :debug + if param == :debug return Puppet::Util::Log.level == :debug else return @@settings[param] diff --git a/lib/puppet/application/agent.rb b/lib/puppet/application/agent.rb index fc8616817..19849c57a 100644 --- a/lib/puppet/application/agent.rb +++ b/lib/puppet/application/agent.rb @@ -378,8 +378,8 @@ Copyright (c) 2011 Puppet Labs, LLC Licensed under the Apache 2.0 License end def setup_listen - unless FileTest.exists?(Puppet[:authconfig]) - Puppet.err "Will not start without authorization file #{Puppet[:authconfig]}" + unless FileTest.exists?(Puppet[:rest_authconfig]) + Puppet.err "Will not start without authorization file #{Puppet[:rest_authconfig]}" exit(14) end diff --git a/lib/puppet/indirector/exec.rb b/lib/puppet/indirector/exec.rb index 4683eda0f..8ea13ff95 100644 --- a/lib/puppet/indirector/exec.rb +++ b/lib/puppet/indirector/exec.rb @@ -16,8 +16,8 @@ class Puppet::Indirector::Exec < Puppet::Indirector::Terminus private # Proxy the execution, so it's easier to test. - def execute(command) - Puppet::Util.execute(command) + def execute(command, arguments) + Puppet::Util.execute(command,arguments) end # Call the external command and see if it returns our output. @@ -33,7 +33,7 @@ class Puppet::Indirector::Exec < Puppet::Indirector::Terminus # Add our name to it. external_command << name begin - output = execute(external_command) + output = execute(external_command, :combine => false) rescue Puppet::ExecutionFailure => detail raise Puppet::Error, "Failed to find #{name} via exec: #{detail}" end diff --git a/lib/puppet/parser/compiler.rb b/lib/puppet/parser/compiler.rb index a891f1a11..613fcae74 100644 --- a/lib/puppet/parser/compiler.rb +++ b/lib/puppet/parser/compiler.rb @@ -56,23 +56,20 @@ class Puppet::Parser::Compiler # Note that this will fail if the resource is not unique. @catalog.add_resource(resource) + if resource.type.to_s.downcase != "class" && resource[:stage] + raise ArgumentError, "Only classes can set 'stage'; normal resources like #{resource} cannot change run stage" + end - # Add our container edge. If we're a class, then we get treated specially - we can - # control the stage that the class is applied in. Otherwise, we just - # get added to our parent container. + # Stages should not be inside of classes. They are always a + # top-level container, regardless of where they appear in the + # manifest. return if resource.type.to_s.downcase == "stage" + # This adds a resource to the class it lexically appears in in the + # manifest. if resource.type.to_s.downcase != "class" - raise ArgumentError, "Only classes can set 'stage'; normal resources like #{resource} cannot change run stage" if resource[:stage] return @catalog.add_edge(scope.resource, resource) end - - unless stage = @catalog.resource(:stage, resource[:stage] || (scope && scope.resource && scope.resource[:stage]) || :main) - raise ArgumentError, "Could not find stage #{resource[:stage] || :main} specified by #{resource}" - end - - resource[:stage] ||= stage.title unless stage.title == :main - @catalog.add_edge(stage, resource) end # Do we use nodes found in the code, vs. the external node sources? diff --git a/lib/puppet/parser/grammar.ra b/lib/puppet/parser/grammar.ra index d2bd06e94..d68c2f163 100644 --- a/lib/puppet/parser/grammar.ra +++ b/lib/puppet/parser/grammar.ra @@ -9,7 +9,7 @@ token LBRACK RBRACK LBRACE RBRACE SYMBOL FARROW COMMA TRUE token FALSE EQUALS APPENDS LESSEQUAL NOTEQUAL DOT COLON LLCOLLECT RRCOLLECT token QMARK LPAREN RPAREN ISEQUAL GREATEREQUAL GREATERTHAN LESSTHAN token IF ELSE IMPORT DEFINE ELSIF VARIABLE CLASS INHERITS NODE BOOLEAN -token NAME SEMIC CASE DEFAULT AT LCOLLECT RCOLLECT CLASSNAME CLASSREF +token NAME SEMIC CASE DEFAULT AT LCOLLECT RCOLLECT CLASSREF token NOT OR AND UNDEF PARROW PLUS MINUS TIMES DIV LSHIFT RSHIFT UMINUS token MATCH NOMATCH REGEX IN_EDGE OUT_EDGE IN_EDGE_SUB OUT_EDGE_SUB token IN @@ -80,14 +80,14 @@ relationship_side: resource | resourceref | collection edge: IN_EDGE | OUT_EDGE | IN_EDGE_SUB | OUT_EDGE_SUB -fstatement: NAME LPAREN funcvalues RPAREN { +fstatement: NAME LPAREN expressions RPAREN { result = ast AST::Function, :name => val[0][:value], :line => val[0][:line], :arguments => val[2], :ftype => :statement } -| NAME LPAREN funcvalues COMMA RPAREN { +| NAME LPAREN expressions COMMA RPAREN { result = ast AST::Function, :name => val[0][:value], :line => val[0][:line], @@ -108,30 +108,27 @@ fstatement: NAME LPAREN funcvalues RPAREN { :ftype => :statement } -funcvalues: namestring { result = aryfy(val[0]) } - | resourceref { result = aryfy(val[0]) } - | funcvalues COMMA namestring { - val[0].push(val[2]) - result = val[0] -} - | funcvalues COMMA resourceref { +funcvalues: rvalue { result = aryfy(val[0]) } +# This rvalue could be an expression + | funcvalues COMMA rvalue { val[0].push(val[2]) result = val[0] } -# This is *almost* an rvalue, but I couldn't get a full -# rvalue to work without scads of shift/reduce conflicts. -namestring: name - | variable +expressions: expression { result = aryfy(val[0]) } + | expressions comma expression { result = val[0].push(val[2]) } + +rvalue: quotedtext + | name | type | boolean - | funcrvalue | selector - | quotedtext + | variable + | array | hasharrayaccesses - | CLASSNAME { - result = ast AST::Name, :value => val[0][:value] - } + | resourceref + | funcrvalue + | undef resource: classname LBRACE resourceinstances endsemi RBRACE { @lexer.commentpop @@ -249,12 +246,12 @@ collstatement: collexpr colljoin: AND { result=val[0][:value] } | OR { result=val[0][:value] } -collexpr: colllval ISEQUAL simplervalue { +collexpr: colllval ISEQUAL expression { result = ast AST::CollExpr, :test1 => val[0], :oper => val[1][:value], :test2 => val[2] #result = ast AST::CollExpr #result.push *val } - | colllval NOTEQUAL simplervalue { + | colllval NOTEQUAL expression { result = ast AST::CollExpr, :test1 => val[0], :oper => val[1][:value], :test2 => val[2] #result = ast AST::CollExpr #result.push *val @@ -321,11 +318,11 @@ params: # nothing result = val[0] } -param: NAME FARROW rvalue { +param: NAME FARROW expression { result = ast AST::ResourceParam, :param => val[0][:value], :line => val[0][:line], :value => val[2] } -addparam: NAME PARROW rvalue { +addparam: NAME PARROW expression { result = ast AST::ResourceParam, :param => val[0][:value], :line => val[0][:line], :value => val[2], :add => true } @@ -343,31 +340,8 @@ anyparams: # nothing result = val[0] } -rvalues: rvalue { result = aryfy(val[0]) } - | rvalues comma rvalue { result = val[0].push(val[2]) } - -simplervalue: quotedtext - | name - | type - | boolean - | selector - | variable - -rvalue: quotedtext - | name - | type - | boolean - | selector - | variable - | array - | hash - | hasharrayaccesses - | resourceref - | funcrvalue - | undef - # We currently require arguments in these functions. -funcrvalue: NAME LPAREN funcvalues RPAREN { +funcrvalue: NAME LPAREN expressions RPAREN { result = ast AST::Function, :name => val[0][:value], :line => val[0][:line], :arguments => val[2], @@ -391,10 +365,10 @@ boolean: BOOLEAN { result = ast AST::Boolean, :value => val[0][:value], :line => val[0][:line] } -resourceref: NAME LBRACK rvalues RBRACK { +resourceref: NAME LBRACK expressions RBRACK { Puppet.warning addcontext("Deprecation notice: Resource references should now be capitalized") result = ast AST::ResourceReference, :type => val[0][:value], :line => val[0][:line], :title => val[2] -} | classref LBRACK rvalues RBRACK { +} | classref LBRACK expressions RBRACK { result = ast AST::ResourceReference, :type => val[0], :title => val[2] } @@ -451,7 +425,8 @@ else: # nothing # per operator :-( expression: rvalue - | expression IN rvalue { + | hash + | expression IN expression { result = ast AST::InOperator, :lval => val[0], :rval => val[2] } | expression MATCH regex { @@ -512,7 +487,7 @@ expression: rvalue result = val[1] } -casestatement: CASE rvalue LBRACE caseopts RBRACE { +casestatement: CASE expression LBRACE caseopts RBRACE { @lexer.commentpop result = ast AST::CaseStatement, :test => val[1], :options => val[3] } @@ -639,8 +614,7 @@ nodedef: NODE hostnames nodeparent LBRACE statements RBRACE { classref: CLASSREF { result = val[0][:value] } -classname: NAME { result = val[0][:value] } - | CLASSNAME { result = val[0][:value] } +classname: NAME { result = val[0][:value] } | CLASS { result = "class" } # Multiple hostnames, as used for node names. These are all literal @@ -686,14 +660,14 @@ arguments: argument result << val[2] } -argument: NAME EQUALS rvalue { +argument: NAME EQUALS expression { Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype") result = [val[0][:value], val[2]] } | NAME { Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype") result = [val[0][:value]] -} | VARIABLE EQUALS rvalue { +} | VARIABLE EQUALS expression { result = [val[0][:value], val[2]] } | VARIABLE { result = [val[0][:value]] @@ -715,8 +689,8 @@ variable: VARIABLE { result = ast AST::Variable, :value => val[0][:value], :line => val[0][:line] } -array: LBRACK rvalues RBRACK { result = val[1] } - | LBRACK rvalues COMMA RBRACK { result = val[1] } +array: LBRACK expressions RBRACK { result = val[1] } + | LBRACK expressions COMMA RBRACK { result = val[1] } | LBRACK RBRACK { result = ast AST::ASTArray } comma: FARROW @@ -756,19 +730,19 @@ hashpairs: hashpair end } -hashpair: key FARROW rvalue { +hashpair: key FARROW expression { result = ast AST::ASTHash, { :value => { val[0] => val[2] } } } key: NAME { result = val[0][:value] } | quotedtext { result = val[0] } -hasharrayaccess: VARIABLE LBRACK rvalue RBRACK { +hasharrayaccess: VARIABLE LBRACK expression RBRACK { result = ast AST::HashOrArrayAccess, :variable => val[0][:value], :key => val[2] } hasharrayaccesses: hasharrayaccess - | hasharrayaccesses LBRACK rvalue RBRACK { + | hasharrayaccesses LBRACK expression RBRACK { result = ast AST::HashOrArrayAccess, :variable => val[0], :key => val[2] } diff --git a/lib/puppet/parser/lexer.rb b/lib/puppet/parser/lexer.rb index 2f416615e..cb1ff4536 100644 --- a/lib/puppet/parser/lexer.rb +++ b/lib/puppet/parser/lexer.rb @@ -152,7 +152,6 @@ class Puppet::Parser::Lexer '>>' => :RSHIFT, '=~' => :MATCH, '!~' => :NOMATCH, - %r{([a-z][-\w]*)?(::[a-z][-\w]*)+} => :CLASSNAME, # Require '::' in the class name, else we'd compete with NAME %r{((::){0,1}[A-Z][-\w]*)+} => :CLASSREF, "<string>" => :STRING, "<dqstring up to first interpolation>" => :DQPRE, @@ -161,6 +160,7 @@ class Puppet::Parser::Lexer "<boolean>" => :BOOLEAN ) + # Numbers are treated separately from names, so that they may contain dots. TOKENS.add_token :NUMBER, %r{\b(?:0[xX][0-9A-Fa-f]+|0?\d+(?:\.\d+)?(?:[eE]-?\d+)?)\b} do |lexer, value| [TOKENS[:NAME], value] end @@ -170,7 +170,7 @@ class Puppet::Parser::Lexer end #:startdoc: - TOKENS.add_token :NAME, %r{[a-z0-9][-\w]*} do |lexer, value| + TOKENS.add_token :NAME, %r{((::)?[a-z0-9][-\w]*)(::[a-z0-9][-\w]*)*} do |lexer, value| string_token = self # we're looking for keywords here if tmp = KEYWORDS.lookup(value) @@ -240,11 +240,11 @@ class Puppet::Parser::Lexer end #:startdoc: - TOKENS.add_token :DOLLAR_VAR, %r{\$(\w*::)*\w+} do |lexer, value| + TOKENS.add_token :DOLLAR_VAR, %r{\$(::)?([-\w]+::)*[-\w]+} do |lexer, value| [TOKENS[:VARIABLE],value[1..-1]] end - TOKENS.add_token :VARIABLE, %r{(\w*::)*\w+} + TOKENS.add_token :VARIABLE, %r{(::)?([-\w]+::)*[-\w]+} #:stopdoc: # Issue #4161 def (TOKENS[:VARIABLE]).acceptable?(context={}) [:DQPRE,:DQMID].include? context[:after] @@ -549,7 +549,7 @@ class Puppet::Parser::Lexer token_queue << [TOKENS[token_type[terminator]],preamble+value] if terminator != '$' or @scanner.scan(/\{/) token_queue.shift - elsif var_name = @scanner.scan(%r{(\w*::)*\w+|[0-9]}) + elsif var_name = @scanner.scan(TOKENS[:VARIABLE].regex) token_queue << [TOKENS[:VARIABLE],var_name] tokenize_interpolated_string(DQ_continuation_token_types) else diff --git a/lib/puppet/parser/parser.rb b/lib/puppet/parser/parser.rb index 611398d14..f46d20d9f 100644 --- a/lib/puppet/parser/parser.rb +++ b/lib/puppet/parser/parser.rb @@ -21,7 +21,7 @@ module Puppet module Parser class Parser < Racc::Parser -module_eval(<<'...end grammar.ra/module_eval...', 'grammar.ra', 789) +module_eval(<<'...end grammar.ra/module_eval...', 'grammar.ra', 763) # It got too annoying having code in a file that needs to be compiled. require 'puppet/parser/parser_support' @@ -33,640 +33,439 @@ require 'puppet/parser/parser_support' ...end grammar.ra/module_eval... ##### State transition tables begin ### -racc_action_table = [ - 242, 243, 55, 68, 71, 299, 157, 55, 78, 117, - 199, 68, 71, 181, 186, -169, 36, 112, 341, 113, - 38, 55, 177, 179, 182, 185, 170, 10, 68, 71, - 231, 158, 114, 292, 293, 356, 257, 368, 68, 71, - 59, 198, 100, 61, 103, 59, 180, 184, 61, 198, - 189, 172, 173, 174, 176, 178, 111, 183, 187, 59, - 95, 66, 61, 60, 175, 79, 253, 154, 60, 88, - 345, 66, 233, 229, 139, 79, 81, 231, 84, 88, - 68, 71, 60, 225, 74, 99, 68, 71, 84, 60, - 100, 90, 103, 203, 203, 292, 293, 223, 296, 60, - 203, 117, 231, 78, 202, 202, 295, 240, 95, 209, - 209, 202, 166, 66, 186, 170, 209, 79, 253, 66, - 241, 88, 177, 79, 81, 334, 139, 88, 68, 71, - 84, 310, 74, 99, 68, 71, 84, 357, 100, 90, - 103, 60, 183, 187, 311, 358, 307, 60, 308, 175, - 189, 172, 173, 174, 176, 178, 95, 183, 187, 36, - 309, 66, 288, 38, 175, 79, 253, 66, 218, 88, - 10, 79, 81, 219, 139, 88, 338, 312, 84, 336, - 74, 99, 68, 71, 84, 218, 100, 90, 103, 60, - 219, 173, 174, 217, 285, 60, 183, 187, 257, 284, - 203, 68, 71, 175, 95, 100, 36, 103, 68, 71, - 127, 202, 100, 316, 103, 66, 209, 10, 15, 79, - 81, 173, 174, 88, 183, 187, 183, 187, 74, 99, - 95, 175, 84, 175, 66, 90, 113, 338, 79, 81, - 336, 66, 88, 60, 213, 79, 81, 74, 319, 88, - 216, 84, 68, 71, 74, 99, 213, 49, 84, 68, - 71, 90, 60, 100, 215, 103, 47, 48, 287, 60, - 154, 286, 189, 172, 173, 174, 324, 68, 71, 183, - 187, 100, 213, 103, 36, 66, 175, 327, 38, 79, - 253, 314, 66, 88, 200, 10, 79, 81, 139, 95, - 88, -171, 84, 68, 71, 74, 330, 78, 170, 84, - 66, -172, 259, 60, 79, 81, 257, 258, 88, -173, - 60, -168, -170, 74, 99, 70, 228, 84, 68, 71, - 90, 36, 100, -167, 103, 127, 66, -167, 60, 161, - 79, 81, 10, 15, 88, -169, -171, 297, 72, 74, - 95, 257, 258, 84, 68, 71, 36, -172, 100, -168, - 38, 66, 112, -170, 60, 79, 81, 10, 15, 88, - -22, -22, -22, -22, 74, 99, 68, 71, 84, 290, - 100, 90, 103, 292, 293, -167, 167, 66, 166, 60, - 335, 79, 253, 229, -187, 88, 339, 68, 71, 161, - 139, 100, 49, 103, 84, 43, 44, 40, 41, 66, - 234, -169, -174, 79, 81, 60, 156, 88, 154, 68, - 71, 354, 74, 100, 122, 103, 84, 122, 359, 161, - 66, 60, -170, 53, 79, 81, 229, 60, 88, 366, - 68, 71, 52, 74, 100, -168, 103, 84, 43, 44, - 40, 41, 66, 232, 51, 373, 79, 81, 60, 374, - 88, -169, 95, -167, -170, 74, 68, 71, -168, 84, - 100, -172, 103, 66, 60, 376, 45, 79, 81, -222, - 60, 88, -24, -24, -24, -24, 74, 99, 95, 234, - 84, 379, 238, 90, 39, 384, 68, 71, 385, 66, - 100, 60, 103, 79, 81, nil, nil, 88, nil, nil, - nil, nil, 74, 99, nil, nil, 84, nil, 95, 90, - nil, nil, 68, 71, nil, nil, 100, 60, 103, 66, - nil, nil, nil, 79, 81, nil, nil, 88, nil, nil, - nil, nil, 74, 99, 95, nil, 84, nil, nil, 90, - nil, nil, 68, 71, nil, 66, 100, 60, 103, 79, - 81, nil, nil, 88, nil, nil, nil, nil, 74, 99, - nil, nil, 84, nil, 95, 90, nil, nil, 68, 71, - nil, nil, 100, 60, 103, 66, nil, nil, nil, 79, - 81, nil, nil, 88, nil, nil, nil, nil, 74, 99, - 95, nil, 84, nil, nil, 90, nil, nil, 68, 71, - nil, 66, 100, 60, 103, 79, 81, nil, nil, 88, - nil, nil, nil, nil, 74, 99, nil, nil, 84, nil, - 95, 90, nil, nil, 68, 71, nil, nil, 100, 60, - 103, 66, nil, nil, nil, 79, 81, nil, nil, 88, - 68, 71, nil, nil, 74, 99, 68, 71, 84, nil, - 100, 90, 103, nil, nil, nil, nil, 66, nil, 60, - nil, 79, 81, nil, nil, 88, nil, nil, 95, nil, - 74, 68, 71, 66, 84, 100, nil, 79, 253, 66, - nil, 88, nil, 79, 81, 60, 139, 88, nil, nil, - 84, nil, 74, 99, nil, nil, 84, 68, 71, 90, - nil, 60, nil, nil, 66, nil, nil, 60, 79, 144, - nil, nil, 88, nil, nil, nil, nil, 139, 68, 71, - nil, 84, 100, nil, 103, nil, nil, nil, nil, nil, - 66, nil, 60, nil, 79, 253, 68, 71, 88, nil, - 100, nil, 103, 139, nil, nil, nil, 84, nil, nil, - nil, 66, nil, nil, nil, 79, 81, nil, 60, 88, - nil, 68, 71, nil, 74, nil, nil, nil, 84, 66, - nil, nil, nil, 79, 81, nil, nil, 88, nil, 60, - nil, nil, 74, nil, 261, nil, 84, 68, 71, nil, - nil, 100, nil, 103, 66, nil, nil, 60, 79, 81, - nil, nil, 88, nil, nil, nil, 72, 74, 68, 71, - nil, 84, 100, nil, 103, nil, nil, nil, nil, nil, - 66, nil, 60, nil, 79, 81, nil, nil, 88, nil, - 95, nil, nil, 74, 68, 71, nil, 84, nil, nil, - nil, 66, nil, nil, nil, 79, 81, nil, 60, 88, - nil, nil, nil, nil, 74, 99, nil, 162, 84, 68, - 71, 90, nil, 100, nil, 103, nil, 66, nil, 60, - nil, 79, 81, nil, nil, 88, nil, nil, nil, 72, - 74, 95, nil, nil, 84, 68, 71, nil, nil, 100, - nil, 103, 66, nil, nil, 60, 79, 81, nil, nil, - 88, nil, nil, nil, nil, 74, 99, 95, nil, 84, - 68, 71, 90, nil, 100, nil, 103, nil, 66, nil, - 60, nil, 79, 81, 68, 71, 88, nil, nil, nil, - 255, 74, 99, nil, nil, 84, nil, nil, 90, nil, - nil, nil, nil, 66, nil, nil, 60, 79, 81, 68, - 71, 88, nil, 100, nil, 103, 74, 66, nil, nil, - 84, 79, 253, nil, nil, 88, nil, nil, 68, 71, - 139, 60, nil, nil, 84, nil, nil, nil, nil, nil, - nil, nil, 66, nil, nil, 60, 79, 81, nil, nil, - 88, 328, nil, 68, 71, 74, nil, nil, nil, 84, - nil, 66, nil, nil, nil, 79, 81, nil, nil, 88, - 60, 68, 71, 72, 74, 100, 193, 103, 84, nil, - nil, nil, nil, nil, nil, nil, 66, nil, nil, 60, - 79, 253, 68, 71, 88, nil, 100, nil, 103, 139, - nil, nil, nil, 84, 66, nil, nil, nil, 79, 81, - nil, nil, 88, nil, 60, nil, nil, 74, 68, 71, - nil, 84, 100, nil, 103, 66, nil, nil, nil, 79, - 81, nil, 60, 88, nil, nil, nil, nil, 74, nil, - 95, nil, 84, nil, 68, 71, nil, nil, 100, nil, - 103, 66, nil, 60, nil, 79, 81, nil, nil, 88, - nil, nil, nil, nil, 74, 99, 95, nil, 84, 68, - 71, 90, nil, 100, nil, 103, nil, 66, nil, 60, - nil, 79, 81, 68, 71, 88, nil, nil, nil, nil, - 74, 99, nil, nil, 84, nil, nil, 90, nil, nil, - nil, nil, 66, nil, nil, 60, 79, 81, nil, nil, - 88, nil, nil, nil, nil, 74, 66, nil, nil, 84, - 79, 81, nil, nil, 88, nil, nil, nil, 72, 74, - 60, 68, 71, 84, nil, 100, nil, 103, 189, 172, - 173, 174, 176, 178, 60, 183, 187, nil, 189, 172, - 173, 174, 175, 95, nil, 183, 187, 68, 71, nil, - nil, 100, 175, 103, 66, nil, nil, nil, 79, 81, - nil, nil, 88, nil, nil, nil, nil, 74, 99, 95, - nil, 84, nil, nil, 90, nil, nil, 68, 71, nil, - 66, 100, 60, 103, 79, 81, nil, nil, 88, nil, - nil, nil, nil, 74, 99, nil, nil, 84, nil, 95, - 90, nil, nil, 68, 71, nil, nil, 100, 60, 103, - 66, nil, nil, nil, 79, 81, nil, nil, 88, nil, - nil, nil, nil, 74, 99, 95, nil, 84, nil, nil, - 90, nil, nil, nil, nil, nil, 66, nil, 60, nil, - 79, 81, 188, nil, 88, nil, nil, nil, nil, 74, - 99, 181, 186, 84, nil, nil, 90, nil, nil, nil, - 177, 179, 182, 185, 60, nil, 181, 186, nil, nil, - nil, nil, nil, nil, nil, 177, 179, 182, 185, nil, - nil, nil, nil, nil, 180, 184, nil, nil, 189, 172, - 173, 174, 176, 178, nil, 183, 187, nil, nil, 180, - 184, nil, 175, 189, 172, 173, 174, 176, 178, nil, - 183, 187, 181, 186, nil, nil, nil, 175, nil, nil, - 283, 177, 179, 182, 185, nil, nil, 181, 186, nil, - nil, nil, nil, nil, nil, nil, 177, 179, 182, 185, - nil, nil, nil, nil, nil, 180, 184, nil, nil, 189, - 172, 173, 174, 176, 178, nil, 183, 187, nil, nil, - nil, 184, nil, 175, 189, 172, 173, 174, 176, 178, - nil, 183, 187, 181, 186, nil, nil, nil, 175, nil, - nil, nil, 177, 179, 182, 185, nil, nil, 181, 186, - nil, nil, nil, nil, nil, nil, nil, 177, 179, 182, - 185, nil, nil, nil, nil, nil, 180, 184, nil, nil, - 189, 172, 173, 174, 176, 178, nil, 183, 187, nil, - nil, 180, 184, nil, 175, 189, 172, 173, 174, 176, - 178, nil, 183, 187, 181, 186, nil, nil, nil, 175, - nil, nil, nil, 177, 179, 182, 185, nil, nil, 26, - 186, 32, 1, nil, 8, 11, nil, 18, 177, 23, - nil, 29, nil, 2, nil, nil, 10, 15, nil, 186, - nil, 189, 172, 173, 174, 176, 178, 177, 183, 187, - nil, nil, nil, nil, 186, 175, 189, 172, 173, 174, - 176, 178, 177, 183, 187, nil, nil, nil, nil, nil, - 175, nil, nil, nil, nil, 189, 172, 173, 174, 176, - 178, nil, 183, 187, 281, nil, nil, nil, nil, 175, - 189, 172, 173, 174, 176, 178, nil, 183, 187, nil, - nil, nil, nil, 377, 175, 26, nil, 32, 1, nil, - 8, 11, nil, 18, nil, 23, nil, 29, nil, 2, - nil, nil, 10, 15, 26, 364, 32, 1, nil, 8, - 11, nil, 18, nil, 23, nil, 29, nil, 2, nil, - nil, 10, 15, nil, 383, nil, 26, nil, 32, 1, - nil, 8, 11, nil, 18, nil, 23, nil, 29, nil, - 2, nil, nil, 10, 15, 26, 306, 32, 1, nil, - 8, 11, nil, 18, nil, 23, nil, 29, nil, 2, - nil, nil, 10, 15, nil, 381, nil, 26, nil, 32, - 1, nil, 8, 11, nil, 18, nil, 23, nil, 29, - nil, 2, nil, nil, 10, 15, 26, 326, 32, 1, - nil, 8, 11, nil, 18, nil, 23, nil, 29, nil, - 2, nil, nil, 10, 15, nil, nil, nil, 26, nil, - 32, 1, nil, 8, 11, nil, 18, nil, 23, nil, - 29, nil, 2, nil, nil, 10, 15, 26, nil, 32, - 1, nil, 8, 11, nil, 18, nil, 23, nil, 29, - nil, 2, nil, nil, 10, 15, 26, nil, 32, 1, - nil, 8, 11, nil, 18, nil, 23, nil, 29, nil, - 2, nil, nil, 10, 15, 189, 172, 173, 174, 176, - 178, nil, 183, 187, nil, nil, nil, nil, nil, 175 ] - -racc_action_check = [ - 164, 164, 18, 103, 103, 214, 56, 157, 81, 32, - 103, 286, 286, 164, 164, 136, 11, 27, 286, 27, - 11, 158, 164, 164, 164, 164, 81, 11, 300, 300, - 154, 56, 27, 214, 214, 300, 332, 332, 189, 189, - 18, 103, 189, 18, 189, 157, 164, 164, 157, 286, - 164, 164, 164, 164, 164, 164, 27, 164, 164, 158, - 189, 300, 158, 18, 164, 300, 300, 200, 157, 300, - 294, 189, 154, 212, 300, 189, 189, 213, 300, 189, - 369, 369, 158, 134, 189, 189, 186, 186, 189, 300, - 186, 189, 186, 203, 291, 294, 294, 133, 206, 189, - 111, 216, 144, 127, 203, 291, 206, 163, 186, 203, - 291, 111, 262, 369, 273, 144, 111, 369, 369, 186, - 163, 369, 273, 186, 186, 262, 369, 186, 357, 357, - 369, 221, 186, 186, 185, 185, 186, 302, 185, 186, - 185, 369, 264, 264, 221, 302, 218, 186, 219, 264, - 273, 273, 273, 273, 273, 273, 185, 273, 273, 1, - 220, 357, 197, 1, 273, 357, 357, 185, 122, 357, - 1, 185, 185, 122, 357, 185, 281, 224, 357, 281, - 185, 185, 176, 176, 185, 310, 176, 185, 176, 357, - 310, 282, 282, 121, 192, 185, 282, 282, 192, 192, - 114, 175, 175, 282, 176, 175, 46, 175, 336, 336, - 46, 114, 336, 227, 336, 176, 114, 46, 46, 176, - 176, 263, 263, 176, 265, 265, 263, 263, 176, 176, - 336, 265, 176, 263, 175, 176, 119, 335, 175, 175, - 335, 336, 175, 176, 229, 336, 336, 175, 230, 336, - 116, 175, 215, 215, 336, 336, 232, 8, 336, 330, - 330, 336, 175, 330, 115, 330, 8, 8, 194, 336, - 234, 194, 267, 267, 267, 267, 235, 184, 184, 267, - 267, 184, 113, 184, 225, 215, 267, 239, 225, 215, - 215, 225, 330, 215, 110, 225, 330, 330, 215, 184, - 330, 108, 215, 23, 23, 330, 250, 23, 253, 330, - 184, 107, 169, 215, 184, 184, 169, 169, 184, 106, - 330, 105, 102, 184, 184, 23, 140, 184, 26, 26, - 184, 42, 26, 141, 26, 42, 23, 101, 184, 96, - 23, 23, 42, 42, 23, 94, 89, 211, 23, 23, - 26, 211, 211, 23, 228, 228, 33, 87, 228, 85, - 33, 26, 83, 82, 23, 26, 26, 33, 33, 26, - 31, 31, 31, 31, 26, 26, 29, 29, 26, 201, - 29, 26, 29, 201, 201, 80, 77, 228, 75, 26, - 280, 228, 228, 142, 74, 228, 284, 308, 308, 69, - 228, 308, 66, 308, 228, 6, 6, 6, 6, 29, - 289, 65, 64, 29, 29, 228, 53, 29, 52, 307, - 307, 298, 29, 307, 50, 307, 29, 37, 305, 138, - 308, 187, 143, 17, 308, 308, 321, 29, 308, 325, - 174, 174, 13, 308, 174, 146, 174, 308, 3, 3, - 3, 3, 307, 147, 12, 338, 307, 307, 308, 343, - 307, 347, 174, 348, 350, 307, 179, 179, 351, 307, - 179, 352, 179, 174, 183, 358, 5, 174, 174, 368, - 307, 174, 4, 4, 4, 4, 174, 174, 179, 155, - 174, 370, 159, 174, 2, 380, 173, 173, 382, 179, - 173, 174, 173, 179, 179, nil, nil, 179, nil, nil, - nil, nil, 179, 179, nil, nil, 179, nil, 173, 179, - nil, nil, 45, 45, nil, nil, 45, 179, 45, 173, - nil, nil, nil, 173, 173, nil, nil, 173, nil, nil, - nil, nil, 173, 173, 45, nil, 173, nil, nil, 173, - nil, nil, 172, 172, nil, 45, 172, 173, 172, 45, - 45, nil, nil, 45, nil, nil, nil, nil, 45, 45, - nil, nil, 45, nil, 172, 45, nil, nil, 47, 47, - nil, nil, 47, 45, 47, 172, nil, nil, nil, 172, - 172, nil, nil, 172, nil, nil, nil, nil, 172, 172, - 47, nil, 172, nil, nil, 172, nil, nil, 48, 48, - nil, 47, 48, 172, 48, 47, 47, nil, nil, 47, - nil, nil, nil, nil, 47, 47, nil, nil, 47, nil, - 48, 47, nil, nil, 49, 49, nil, nil, 49, 47, - 49, 48, nil, nil, nil, 48, 48, nil, nil, 48, - 296, 296, nil, nil, 48, 48, 177, 177, 48, nil, - 177, 48, 177, nil, nil, nil, nil, 49, nil, 48, - nil, 49, 49, nil, nil, 49, nil, nil, 177, nil, - 49, 51, 51, 296, 49, 51, nil, 296, 296, 177, - nil, 296, nil, 177, 177, 49, 296, 177, nil, nil, - 296, nil, 177, 177, nil, nil, 177, 295, 295, 177, - nil, 296, nil, nil, 51, nil, nil, 177, 51, 51, - nil, nil, 51, nil, nil, nil, nil, 51, 231, 231, - nil, 51, 231, nil, 231, nil, nil, nil, nil, nil, - 295, nil, 51, nil, 295, 295, 233, 233, 295, nil, - 233, nil, 233, 295, nil, nil, nil, 295, nil, nil, - nil, 231, nil, nil, nil, 231, 231, nil, 295, 231, - nil, 170, 170, nil, 231, nil, nil, nil, 231, 233, - nil, nil, nil, 233, 233, nil, nil, 233, nil, 231, - nil, nil, 233, nil, 170, nil, 233, 288, 288, nil, - nil, 288, nil, 288, 170, nil, nil, 233, 170, 170, - nil, nil, 170, nil, nil, nil, 170, 170, 182, 182, - nil, 170, 182, nil, 182, nil, nil, nil, nil, nil, - 288, nil, 170, nil, 288, 288, nil, nil, 288, nil, - 182, nil, nil, 288, 70, 70, nil, 288, nil, nil, - nil, 182, nil, nil, nil, 182, 182, nil, 288, 182, - nil, nil, nil, nil, 182, 182, nil, 70, 182, 71, - 71, 182, nil, 71, nil, 71, nil, 70, nil, 182, - nil, 70, 70, nil, nil, 70, nil, nil, nil, 70, - 70, 71, nil, nil, 70, 180, 180, nil, nil, 180, - nil, 180, 71, nil, nil, 70, 71, 71, nil, nil, - 71, nil, nil, nil, nil, 71, 71, 180, nil, 71, - 112, 112, 71, nil, 112, nil, 112, nil, 180, nil, - 71, nil, 180, 180, 167, 167, 180, nil, nil, nil, - 167, 180, 180, nil, nil, 180, nil, nil, 180, nil, - nil, nil, nil, 112, nil, nil, 180, 112, 112, 78, - 78, 112, nil, 78, nil, 78, 112, 167, nil, nil, - 112, 167, 167, nil, nil, 167, nil, nil, 240, 240, - 167, 112, nil, nil, 167, nil, nil, nil, nil, nil, - nil, nil, 78, nil, nil, 167, 78, 78, nil, nil, - 78, 240, nil, 255, 255, 78, nil, nil, nil, 78, - nil, 240, nil, nil, nil, 240, 240, nil, nil, 240, - 78, 100, 100, 240, 240, 100, 100, 100, 240, nil, - nil, nil, nil, nil, nil, nil, 255, nil, nil, 240, - 255, 255, 260, 260, 255, nil, 260, nil, 260, 255, - nil, nil, nil, 255, 100, nil, nil, nil, 100, 100, - nil, nil, 100, nil, 255, nil, nil, 100, 181, 181, - nil, 100, 181, nil, 181, 260, nil, nil, nil, 260, - 260, nil, 100, 260, nil, nil, nil, nil, 260, nil, - 181, nil, 260, nil, 90, 90, nil, nil, 90, nil, - 90, 181, nil, 260, nil, 181, 181, nil, nil, 181, - nil, nil, nil, nil, 181, 181, 90, nil, 181, 161, - 161, 181, nil, 161, nil, 161, nil, 90, nil, 181, - nil, 90, 90, 166, 166, 90, nil, nil, nil, nil, - 90, 90, nil, nil, 90, nil, nil, 90, nil, nil, - nil, nil, 161, nil, nil, 90, 161, 161, nil, nil, - 161, nil, nil, nil, nil, 161, 166, nil, nil, 161, - 166, 166, nil, nil, 166, nil, nil, nil, 166, 166, - 161, 95, 95, 166, nil, 95, nil, 95, 277, 277, - 277, 277, 277, 277, 166, 277, 277, nil, 269, 269, - 269, 269, 277, 95, nil, 269, 269, 178, 178, nil, - nil, 178, 269, 178, 95, nil, nil, nil, 95, 95, - nil, nil, 95, nil, nil, nil, nil, 95, 95, 178, - nil, 95, nil, nil, 95, nil, nil, 99, 99, nil, - 178, 99, 95, 99, 178, 178, nil, nil, 178, nil, - nil, nil, nil, 178, 178, nil, nil, 178, nil, 99, - 178, nil, nil, 242, 242, nil, nil, 242, 178, 242, - 99, nil, nil, nil, 99, 99, nil, nil, 99, nil, - nil, nil, nil, 99, 99, 242, nil, 99, nil, nil, - 99, nil, nil, nil, nil, nil, 242, nil, 99, nil, - 242, 242, 91, nil, 242, nil, nil, nil, nil, 242, - 242, 91, 91, 242, nil, nil, 242, nil, nil, nil, - 91, 91, 91, 91, 242, nil, 129, 129, nil, nil, - nil, nil, nil, nil, nil, 129, 129, 129, 129, nil, - nil, nil, nil, nil, 91, 91, nil, nil, 91, 91, - 91, 91, 91, 91, nil, 91, 91, nil, nil, 129, - 129, nil, 91, 129, 129, 129, 129, 129, 129, nil, - 129, 129, 190, 190, nil, nil, nil, 129, nil, nil, - 190, 190, 190, 190, 190, nil, nil, 271, 271, nil, - nil, nil, nil, nil, nil, nil, 271, 271, 271, 271, - nil, nil, nil, nil, nil, 190, 190, nil, nil, 190, - 190, 190, 190, 190, 190, nil, 190, 190, nil, nil, - nil, 271, nil, 190, 271, 271, 271, 271, 271, 271, - nil, 271, 271, 131, 131, nil, nil, nil, 271, nil, - nil, nil, 131, 131, 131, 131, nil, nil, 132, 132, - nil, nil, nil, nil, nil, nil, nil, 132, 132, 132, - 132, nil, nil, nil, nil, nil, 131, 131, nil, nil, - 131, 131, 131, 131, 131, 131, nil, 131, 131, nil, - nil, 132, 132, nil, 131, 132, 132, 132, 132, 132, - 132, nil, 132, 132, 275, 275, nil, nil, nil, 132, - nil, nil, nil, 275, 275, 275, 275, nil, nil, 279, - 276, 279, 279, nil, 279, 279, nil, 279, 276, 279, - nil, 279, nil, 279, nil, nil, 279, 279, nil, 270, - nil, 275, 275, 275, 275, 275, 275, 270, 275, 275, - nil, nil, nil, nil, 272, 275, 276, 276, 276, 276, - 276, 276, 272, 276, 276, nil, nil, nil, nil, nil, - 276, nil, nil, nil, nil, 270, 270, 270, 270, 270, - 270, nil, 270, 270, 188, nil, nil, nil, nil, 270, - 272, 272, 272, 272, 272, 272, nil, 272, 272, nil, - nil, nil, nil, 363, 272, 188, nil, 188, 188, nil, - 188, 188, nil, 188, nil, 188, nil, 188, nil, 188, - nil, nil, 188, 188, 363, 312, 363, 363, nil, 363, - 363, nil, 363, nil, 363, nil, 363, nil, 363, nil, - nil, 363, 363, nil, 376, nil, 312, nil, 312, 312, - nil, 312, 312, nil, 312, nil, 312, nil, 312, nil, - 312, nil, nil, 312, 312, 376, 217, 376, 376, nil, - 376, 376, nil, 376, nil, 376, nil, 376, nil, 376, - nil, nil, 376, 376, nil, 373, nil, 217, nil, 217, - 217, nil, 217, 217, nil, 217, nil, 217, nil, 217, - nil, 217, nil, nil, 217, 217, 373, 238, 373, 373, - nil, 373, 373, nil, 373, nil, 373, nil, 373, nil, - 373, nil, nil, 373, 373, nil, nil, nil, 238, nil, - 238, 238, nil, 238, 238, nil, 238, nil, 238, nil, - 238, nil, 238, nil, nil, 238, 238, 20, nil, 20, - 20, nil, 20, 20, nil, 20, nil, 20, nil, 20, - nil, 20, nil, nil, 20, 20, 0, nil, 0, 0, - nil, 0, 0, nil, 0, nil, 0, nil, 0, nil, - 0, nil, nil, 0, 0, 268, 268, 268, 268, 268, - 268, nil, 268, 268, nil, nil, nil, nil, nil, 268 ] +clist = [ +'222,221,209,61,62,249,204,209,127,323,192,317,322,184,179,109,214,251', +'301,330,126,106,180,182,181,183,126,329,184,179,302,206,245,244,335', +'245,244,180,182,181,183,195,126,210,106,186,185,334,85,173,174,176,175', +'177,178,275,171,172,276,105,186,185,107,170,173,174,176,175,177,178', +'308,171,172,61,62,157,81,94,170,95,80,71,105,61,62,107,162,94,77,95', +'73,161,309,61,62,93,157,94,81,95,-106,-157,114,76,71,93,70,162,288,34', +'63,59,161,287,68,93,70,311,60,92,63,59,58,151,68,91,70,75,60,92,63,59', +'58,71,68,91,157,151,60,92,61,62,58,71,94,91,95,162,314,288,61,62,161', +'71,287,-106,-106,-106,-106,248,61,62,93,157,94,81,95,247,81,80,106,208', +'80,70,162,341,34,63,59,161,81,68,93,70,80,60,92,63,225,58,151,68,91', +'70,132,138,77,63,59,58,71,68,-170,61,62,60,92,64,105,58,71,107,91,61', +'62,61,62,94,323,95,71,322,324,61,62,44,152,94,242,95,71,245,244,61,62', +'93,70,94,81,95,63,59,114,320,68,93,70,299,60,34,63,59,58,195,68,93,70', +'73,60,92,63,59,58,71,68,91,70,198,60,92,63,59,58,71,68,91,61,62,60,92', +'214,212,58,71,117,91,61,62,295,85,94,201,95,71,211,201,61,62,83,84,94', +'292,95,291,171,172,61,62,93,70,94,170,95,63,225,171,172,68,93,70,-156', +'138,170,63,59,58,-154,68,93,70,125,60,92,63,59,58,71,68,91,70,-153,60', +'92,63,59,58,71,68,91,214,346,60,92,61,62,58,71,94,91,95,-155,-151,-150', +'61,62,-152,71,94,124,95,283,117,333,61,62,93,274,94,97,95,214,224,336', +'61,62,93,70,94,250,337,63,59,214,251,68,93,70,338,60,92,63,59,58,127', +'68,91,70,277,60,92,63,59,58,71,68,91,70,208,60,92,63,59,58,71,68,91', +'305,236,60,238,61,62,58,71,94,239,95,238,349,-152,61,62,97,71,94,-150', +'95,86,352,-151,61,62,93,223,94,303,95,214,224,214,251,353,93,70,82,355', +'-153,63,59,125,72,68,93,70,43,60,92,63,59,58,361,68,91,70,362,60,92', +'63,59,58,71,68,91,238,-204,60,92,61,62,58,71,94,91,95,38,39,40,41,209', +'117,71,176,175,71,61,62,171,172,94,93,95,71,35,170,38,39,40,41,369,370', +'70,,61,62,63,59,93,122,68,327,,,60,92,,,58,70,,91,,63,59,,,68,,71,,60', +'92,61,62,58,,70,91,228,,63,225,,,68,71,,,138,61,62,,58,94,,95,176,175', +',,,171,172,71,,70,,,170,63,225,93,,68,61,62,,138,94,,95,58,70,,,,63', +'59,,,68,,71,,60,92,93,,58,61,62,91,,94,,95,,70,,71,,63,59,,,68,,,,60', +'92,93,218,58,61,62,91,,94,,95,,70,,71,,63,59,,,68,,,,60,92,93,,58,61', +'62,91,,94,,95,,70,,71,,63,59,,,68,,,,60,92,93,,58,61,62,91,,94,,,,70', +',71,,63,59,,,68,,,,60,92,,,58,61,62,91,,94,,95,,70,,71,,63,59,,,68,61', +'62,,60,,93,,58,,61,62,,,94,,95,70,,71,,63,59,,,68,,,,60,92,,93,58,70', +',91,,63,225,,,68,70,71,,138,63,59,,58,68,,61,62,60,92,94,,58,,71,91', +'61,62,,,94,,95,71,,,61,62,,,94,131,95,,,,61,62,93,70,94,,95,63,225,', +',68,93,70,,138,,63,59,58,,68,93,70,,60,92,63,59,58,71,68,91,70,,60,92', +'63,59,58,71,68,91,61,62,60,92,,,58,71,,91,61,62,,,94,,,71,,,61,62,,', +'94,,95,,,,61,62,,70,94,,95,63,225,,,68,93,70,,138,,63,137,58,,68,93', +'70,,138,,63,59,58,71,68,,70,,60,92,63,59,58,71,68,91,252,,60,92,,,58', +'71,,91,184,179,-24,-24,-24,-24,,71,,180,182,181,183,,,173,174,176,175', +',61,62,171,172,94,131,95,,,170,,,186,185,,,173,174,176,175,177,178,93', +'171,172,61,62,,,94,170,95,,70,,,,63,59,,,68,,,,60,92,93,,58,61,62,91', +',94,,95,,70,,71,,63,59,,,68,,,,60,92,93,,58,61,62,91,,94,,95,,70,,71', +',63,59,,,68,,,,60,92,93,,58,61,62,91,,94,,95,,70,,71,,63,59,,,68,,,', +'60,92,93,,58,61,62,91,,94,,95,,70,,71,,63,59,,,68,,,,60,92,93,,58,61', +'62,91,,94,,95,,70,,71,,63,59,,,68,,,,60,92,93,,58,61,62,91,,94,,95,', +'70,,71,,63,59,,,68,,,,60,92,93,,58,61,62,91,,94,,95,,70,,71,,63,59,', +',68,,,,60,92,93,,58,61,62,91,,94,,95,,70,,71,,63,59,,,68,,,,60,92,93', +',58,61,62,91,,94,,95,,70,,71,,63,59,,,68,,,,60,92,93,,58,,,91,-22,-22', +'-22,-22,,70,,71,,63,59,,,68,,,169,60,92,,,58,,,91,184,179,,,,,197,71', +',180,182,181,183,,,184,179,,,,,,,,180,182,181,183,,,,,186,185,,,173', +'174,176,175,177,178,,171,172,,,186,185,,170,173,174,176,175,177,178', +',171,172,184,179,,,,170,,,,180,182,181,183,,,184,179,,,,,,,,180,182', +'181,183,,,,,186,185,,,173,174,176,175,177,178,,171,172,,,186,185,,170', +'173,174,176,175,177,178,,171,172,184,179,,,,170,,,,180,182,181,183,', +',184,179,,,,,,,,180,182,181,183,,,,,186,185,,,173,174,176,175,177,178', +',171,172,,,186,185,,170,173,174,176,175,177,178,,171,172,184,179,,,', +'170,,,273,180,182,181,183,,,184,179,,,,,,,,180,182,181,183,,,,,186,185', +',,173,174,176,175,177,178,,171,172,,,186,185,,170,173,174,176,175,177', +'178,,171,172,184,179,,,,170,,,,180,182,181,183,,,184,179,,,,,,,,180', +'182,181,183,,,,,186,185,,,173,174,176,175,177,178,,171,172,,,186,185', +',170,173,174,176,175,177,178,,171,172,184,179,,,,170,,,,180,182,181', +'183,,,184,179,,,,,,,,180,182,181,183,,,,,186,185,,,173,174,176,175,177', +'178,,171,172,,,,,,170,173,174,176,175,177,178,,171,172,184,179,,,,170', +',,,180,182,181,183,,,184,179,,,,,,,,180,182,181,183,,,,,,,,,173,174', +'176,175,177,178,,171,172,,,186,185,,170,173,174,176,175,177,178,,171', +'172,184,179,,,,170,,,,180,182,181,183,,,184,179,,,,,,,,180,182,181,183', +',,,,,,,,173,174,176,175,177,178,,171,172,,,,185,,170,173,174,176,175', +'177,178,,171,172,184,179,,,,170,,,,180,182,181,183,,,,179,,,,,,,,180', +',,,,,,,186,185,179,,173,174,176,175,177,178,180,171,172,,,,,179,170', +'173,174,176,175,177,178,180,171,172,,,,,,170,,179,,173,174,176,175,177', +'178,180,171,172,,,,,,170,173,174,176,175,177,178,,171,172,,332,,,,170', +',,,173,174,176,175,177,178,,171,172,,360,,,28,170,30,31,,26,32,,33,', +'21,,29,368,25,,,34,28,,30,31,,26,32,,33,,21,367,29,,25,,28,34,30,31', +',26,32,,33,,21,343,29,,25,,28,34,30,31,,26,32,,33,,21,255,29,,25,,28', +'34,30,31,,26,32,,33,,21,365,29,,25,,28,34,30,31,,26,32,,33,,21,,29,', +'25,,28,34,30,31,,26,32,,33,,21,,29,28,25,30,31,34,26,32,,33,,21,,29', +'28,25,30,31,34,26,32,,33,,21,,29,28,25,30,31,34,26,32,,33,,21,,29,,25', +',,34,173,174,176,175,177,178,,171,172,,,,,,170,173,174,176,175,177,178', +',171,172,173,174,176,175,,170,,171,172,,,,,,170' ] + racc_action_table = arr = Array.new(2065, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'129,129,117,95,95,163,102,137,59,255,95,246,255,129,129,35,217,217,216', +'280,137,33,129,129,129,129,59,280,216,216,217,102,163,163,285,246,246', +'216,216,216,216,95,225,117,204,129,129,285,70,129,129,129,129,129,129', +'191,129,129,191,33,216,216,33,129,216,216,216,216,216,216,229,216,216', +'170,170,243,31,170,216,170,31,33,204,173,173,204,243,173,23,173,23,243', +'235,174,174,170,157,174,37,174,223,67,37,23,204,173,170,157,201,37,170', +'170,157,201,170,174,173,237,170,170,173,173,170,238,173,170,174,23,173', +'173,174,174,173,170,174,173,75,239,174,174,175,175,174,173,175,174,175', +'75,240,335,345,345,75,174,335,223,223,223,223,158,176,176,175,76,176', +'24,176,158,291,24,206,241,291,175,76,291,24,175,175,76,32,175,176,345', +'32,175,175,345,345,175,73,345,175,176,66,345,65,176,176,345,175,176', +'60,21,21,176,176,21,206,176,345,206,176,337,337,276,276,337,320,337', +'176,320,276,177,177,21,74,177,153,177,206,153,153,336,336,337,21,336', +'42,336,21,21,42,254,21,177,337,212,21,42,337,337,21,276,337,336,177', +'78,337,337,177,177,337,21,177,337,336,99,177,177,336,336,177,337,336', +'177,330,330,336,336,121,121,336,177,208,336,178,178,207,26,178,100,178', +'336,121,101,322,322,26,26,322,203,322,202,261,261,28,28,178,330,28,261', +'28,330,330,262,262,330,322,178,57,330,262,178,178,330,56,178,28,322', +'54,178,178,322,322,178,330,322,178,28,52,322,322,28,28,322,178,28,322', +'306,306,28,28,29,29,28,322,29,28,29,50,49,48,179,179,47,28,179,45,179', +'199,43,284,180,180,29,190,180,198,180,190,190,287,308,308,179,29,308', +'164,288,29,29,164,164,29,180,179,289,29,29,179,179,29,114,179,29,180', +'194,179,179,180,180,179,29,180,179,308,116,180,180,308,308,180,179,308', +'180,224,133,308,134,181,181,308,180,181,135,181,313,315,139,182,182', +'30,308,182,140,182,27,323,141,183,183,181,130,183,219,183,130,130,219', +'219,329,182,181,25,331,143,181,181,145,22,181,183,182,20,181,181,182', +'182,181,342,182,181,183,344,182,182,183,183,182,181,183,182,150,346', +'183,183,184,184,183,182,184,183,184,19,19,19,19,151,152,183,260,260', +'172,44,44,260,260,44,184,44,171,1,260,18,18,18,18,364,366,184,,278,278', +'184,184,44,44,184,278,,,184,184,,,184,44,,184,,44,44,,,44,,184,,44,44', +'132,132,44,,278,44,132,,278,278,,,278,44,,,278,277,277,,278,277,,277', +'259,259,,,,259,259,278,,132,,,259,132,132,277,,132,185,185,,132,185', +',185,132,277,,,,277,277,,,277,,132,,277,277,185,,277,126,126,277,,126', +',126,,185,,277,,185,185,,,185,,,,185,185,126,126,185,127,127,185,,127', +',127,,126,,185,,126,126,,,126,,,,126,126,127,,126,125,125,126,,125,', +'125,,127,,126,,127,127,,,127,,,,127,127,125,,127,124,124,127,,124,,', +',125,,127,,125,125,,,125,,,,125,125,,,125,186,186,125,,186,,186,,124', +',125,,124,124,,,124,197,197,,124,,186,,124,,248,248,,,248,,248,186,', +'124,,186,186,,,186,,,,186,186,,248,186,197,,186,,197,197,,,197,248,186', +',197,248,248,,197,248,,236,236,248,248,236,,248,,197,248,62,62,,,62', +',62,248,,,64,64,,,64,64,64,,,,247,247,62,236,247,,247,236,236,,,236', +'64,62,,236,,62,62,236,,62,247,64,,62,62,64,64,62,236,64,62,247,,64,64', +'247,247,64,62,247,64,228,228,247,247,,,247,64,,247,72,72,,,72,,,247', +',,209,209,,,209,,209,,,,222,222,,228,222,,222,228,228,,,228,209,72,', +'228,,72,72,228,,72,222,209,,72,,209,209,72,228,209,,222,,209,209,222', +'222,209,72,222,209,167,,222,222,,,222,209,,222,167,167,7,7,7,7,,222', +',167,167,167,167,,,263,263,263,263,,94,94,263,263,94,94,94,,,263,,,167', +'167,,,167,167,167,167,167,167,94,167,167,77,77,,,77,167,77,,94,,,,94', +'94,,,94,,,,94,94,77,,94,210,210,94,,210,,210,,77,,94,,77,77,,,77,,,', +'77,77,210,,77,83,83,77,,83,,83,,210,,77,,210,210,,,210,,,,210,210,83', +',210,84,84,210,,84,,84,,83,,210,,83,83,,,83,,,,83,83,84,,83,85,85,83', +',85,,85,,84,,83,,84,84,,,84,,,,84,84,85,,84,86,86,84,,86,,86,,85,,84', +',85,85,,,85,,,,85,85,86,,85,91,91,85,,91,,91,,86,,85,,86,86,,,86,,,', +'86,86,91,,86,92,92,86,,92,,92,,91,,86,,91,91,,,91,,,,91,91,92,,91,93', +'93,91,,93,,93,,92,,91,,92,92,,,92,,,,92,92,93,,92,213,213,92,,213,,213', +',93,,92,,93,93,,,93,,,,93,93,213,,93,,,93,5,5,5,5,,213,,93,,213,213', +',,213,,,88,213,213,,,213,,,213,88,88,,,,,96,213,,88,88,88,88,,,96,96', +',,,,,,,96,96,96,96,,,,,88,88,,,88,88,88,88,88,88,,88,88,,,96,96,,88', +'96,96,96,96,96,96,,96,96,300,300,,,,96,,,,300,300,300,300,,,166,166', +',,,,,,,166,166,166,166,,,,,300,300,,,300,300,300,300,300,300,,300,300', +',,166,166,,300,166,166,166,166,166,166,,166,166,165,165,,,,166,,,,165', +'165,165,165,,,168,168,,,,,,,,168,168,168,168,,,,,165,165,,,165,165,165', +'165,165,165,,165,165,,,168,168,,165,168,168,168,168,168,168,,168,168', +'189,189,,,,168,,,189,189,189,189,189,,,358,358,,,,,,,,358,358,358,358', +',,,,189,189,,,189,189,189,189,189,189,,189,189,,,358,358,,189,358,358', +'358,358,358,358,,358,358,357,357,,,,358,,,,357,357,357,357,,,123,123', +',,,,,,,123,123,123,123,,,,,357,357,,,357,357,357,357,357,357,,357,357', +',,123,123,,357,123,123,123,123,123,123,,123,123,326,326,,,,123,,,,326', +'326,326,326,,,319,319,,,,,,,,319,319,319,319,,,,,326,326,,,326,326,326', +'326,326,326,,326,326,,,,,,326,319,319,319,319,319,319,,319,319,318,318', +',,,319,,,,318,318,318,318,,,298,298,,,,,,,,298,298,298,298,,,,,,,,,318', +'318,318,318,318,318,,318,318,,,298,298,,318,298,298,298,298,298,298', +',298,298,271,271,,,,298,,,,271,271,271,271,,,272,272,,,,,,,,272,272', +'272,272,,,,,,,,,271,271,271,271,271,271,,271,271,,,,272,,271,272,272', +'272,272,272,272,,272,272,297,297,,,,272,,,,297,297,297,297,,,,269,,', +',,,,,269,,,,,,,,297,297,268,,297,297,297,297,297,297,268,297,297,,,', +',267,297,269,269,269,269,269,269,267,269,269,,,,,,269,,270,,268,268', +'268,268,268,268,270,268,268,,,,,,268,267,267,267,267,267,267,,267,267', +',283,,,,267,,,,270,270,270,270,270,270,,270,270,,338,,,283,270,283,283', +',283,283,,283,,283,,283,359,283,,,283,338,,338,338,,338,338,,338,,338', +'353,338,,338,,359,338,359,359,,359,359,,359,,359,292,359,,359,,353,359', +'353,353,,353,353,,353,,353,169,353,,353,,292,353,292,292,,292,292,,292', +',292,352,292,,292,,169,292,169,169,,169,169,,169,,169,,169,,169,,352', +'169,352,352,,352,352,,352,,352,,352,0,352,0,0,352,0,0,,0,,0,,0,253,0', +'253,253,0,253,253,,253,,253,,253,2,253,2,2,253,2,2,,2,,2,,2,,2,,,2,266', +'266,266,266,266,266,,266,266,,,,,,266,265,265,265,265,265,265,,265,265', +'264,264,264,264,,265,,264,264,,,,,,264' ] + racc_action_check = arr = Array.new(2065, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end racc_action_pointer = [ - 1726, 123, 450, 384, 418, 461, 341, nil, 251, nil, - nil, -20, 446, 434, nil, nil, nil, 433, 0, nil, - 1707, nil, nil, 301, nil, nil, 326, 11, nil, 374, - nil, 306, 7, 320, nil, nil, nil, 403, nil, nil, - nil, nil, 295, nil, nil, 520, 170, 576, 606, 632, - 400, 679, 378, 416, nil, nil, -6, nil, nil, nil, - nil, nil, nil, nil, 389, 388, 396, nil, nil, 393, - 842, 867, nil, nil, 388, 376, nil, 363, 957, nil, - 362, 2, 340, 356, nil, 336, nil, 334, nil, 323, - 1092, 1294, nil, nil, 322, 1179, 333, nil, nil, 1235, - 1019, 314, 299, 1, nil, 298, 296, 288, 278, nil, - 286, 76, 918, 242, 176, 256, 238, nil, nil, 228, - nil, 185, 133, nil, nil, nil, nil, 97, nil, 1309, - nil, 1416, 1431, 90, 46, nil, -8, nil, 423, nil, - 285, 310, 381, 409, 91, nil, 422, 433, nil, nil, - nil, nil, nil, nil, 19, 477, nil, 5, 19, 484, - nil, 1117, nil, 95, -4, nil, 1131, 932, nil, 305, - 769, nil, 550, 494, 438, 199, 180, 654, 1205, 464, - 893, 1066, 816, 411, 275, 132, 84, 368, 1565, 36, - 1355, nil, 187, nil, 259, nil, nil, 151, nil, nil, - 27, 333, nil, 69, nil, nil, 80, nil, nil, nil, - nil, 340, 61, 66, -17, 250, 99, 1647, 131, 133, - 135, 119, nil, nil, 169, 248, nil, 204, 352, 204, - 239, 726, 216, 744, 230, 267, nil, nil, 1688, 280, - 976, nil, 1261, nil, nil, nil, nil, nil, nil, nil, - 295, nil, nil, 284, nil, 1001, nil, nil, nil, nil, - 1040, nil, 100, 165, 81, 163, nil, 218, 1721, 1144, - 1511, 1370, 1526, 96, nil, 1477, 1492, 1134, nil, 1479, - 381, 145, 135, nil, 389, nil, 9, nil, 795, 398, - nil, 70, nil, nil, 45, 705, 648, nil, 412, nil, - 26, nil, 125, nil, nil, 419, nil, 417, 395, nil, - 150, nil, 1606, nil, nil, nil, nil, nil, nil, nil, - nil, 424, nil, nil, nil, 430, nil, nil, nil, nil, - 257, nil, 25, nil, nil, 206, 206, nil, 447, nil, - nil, nil, nil, 450, nil, nil, nil, 438, 440, nil, - 441, 445, 448, nil, nil, nil, nil, 126, 467, nil, - nil, nil, nil, 1584, nil, nil, nil, nil, 470, 78, - 482, nil, nil, 1666, nil, nil, 1625, nil, nil, nil, - 486, nil, 489, nil, nil, nil ] + 1952, 522, 1978, nil, nil, 1188, nil, 892, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 461, 441, + 466, 201, 462, 82, 129, 420, 283, 432, 304, 351, + 440, 40, 144, 19, nil, 15, nil, 62, nil, nil, + nil, nil, 202, 331, 512, 356, nil, 342, 339, 338, + 337, nil, 317, nil, 324, nil, 303, 297, nil, 2, + 196, nil, 805, nil, 815, 190, 171, 78, nil, nil, + 42, nil, 878, 150, 218, 112, 139, 996, 249, nil, + nil, nil, nil, 1046, 1071, 1096, 1121, nil, 1259, nil, + nil, 1146, 1171, 1196, 971, 1, 1274, nil, nil, 255, + 267, 271, -6, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 397, nil, 405, -9, nil, nil, + nil, 269, nil, 1514, 701, 676, 626, 651, nil, -4, + 446, nil, 559, 386, 417, 415, nil, -4, nil, 416, + 422, 426, nil, 443, nil, 463, nil, nil, nil, nil, + 481, 497, 469, 182, nil, nil, nil, 72, 141, nil, + nil, nil, nil, -17, 381, 1379, 1334, 936, 1394, 1923, + 71, 459, 451, 81, 91, 138, 158, 221, 284, 361, + 371, 428, 438, 448, 495, 601, 726, nil, nil, 1439, + 369, 46, nil, nil, 396, nil, nil, 743, 376, 362, + nil, 73, 266, 293, 42, nil, 168, 279, 244, 888, + 1021, nil, 222, 1221, nil, nil, 11, 5, nil, 448, + nil, nil, 898, 92, 419, 18, nil, nil, 868, 59, + nil, nil, nil, nil, nil, 83, 795, 108, 83, 97, + 139, 159, nil, 51, nil, nil, -14, 825, 752, nil, + nil, nil, nil, 1965, 234, -22, nil, nil, nil, 530, + 456, 244, 255, 915, 1997, 1988, 1973, 1787, 1772, 1754, + 1805, 1679, 1694, nil, nil, nil, 213, 576, 530, nil, + 7, nil, nil, 1841, 347, 22, nil, 367, 374, 389, + nil, 132, 1907, nil, nil, nil, nil, 1739, 1634, nil, + 1319, nil, nil, nil, nil, nil, 338, nil, 381, nil, + nil, nil, nil, 425, nil, 429, nil, nil, 1619, 1574, + 187, nil, 294, 440, nil, nil, 1559, nil, nil, 453, + 274, 456, nil, nil, nil, 114, 231, 211, 1859, nil, + nil, nil, 471, nil, 475, 148, 485, nil, nil, nil, + nil, nil, 1939, 1891, nil, nil, nil, 1499, 1454, 1875, + nil, nil, nil, nil, 519, nil, 520, nil, nil, nil, + nil ] racc_action_default = [ - -198, -235, -51, -19, -8, -235, -235, -9, -235, -10, - -189, -190, -235, -23, -11, -187, -12, -235, -235, -13, - -1, -14, -2, -188, -15, -3, -235, -235, -16, -235, - -17, -6, -235, -235, -18, -7, -190, -198, -188, -52, - -27, -28, -235, -25, -26, -235, -235, -235, -235, -235, - -198, -86, -93, -235, -197, -195, -198, -191, -193, -194, - -223, -196, -4, -42, -233, -43, -215, -176, -118, -44, - -235, -235, -45, -34, -75, -32, -33, -235, -235, -123, - -37, -74, -38, -235, -73, -39, -173, -40, -175, -41, - -235, -235, -126, -108, -104, -235, -112, -133, -113, -235, - -235, -105, -109, -235, -111, -106, -115, -107, -114, -110, - -54, -198, -235, -86, -198, -235, -180, -177, -178, -235, - -50, -235, -199, -200, -24, -21, -23, -188, -22, -84, - -20, -83, -85, -235, -198, -79, -76, -87, -82, -75, - -71, -77, -221, -80, -74, -69, -78, -235, -172, -171, - -81, -91, -92, -94, -235, -221, 386, -235, -235, -235, - -209, -235, -31, -235, -235, -119, -235, -235, -96, -235, - -235, -143, -235, -235, -235, -235, -235, -235, -235, -235, - -235, -235, -235, -235, -235, -235, -235, -235, -235, -235, - -235, -150, -235, -218, -235, -231, -227, -235, -230, -226, - -93, -235, -215, -198, -58, -60, -235, -67, -57, -74, - -66, -235, -221, -235, -235, -235, -235, -235, -208, -206, - -235, -235, -203, -232, -235, -235, -211, -235, -72, -222, - -235, -235, -86, -235, -222, -235, -192, -210, -235, -235, - -235, -29, -235, -121, -120, -36, -35, -174, -169, -167, - -235, -170, -161, -74, -168, -235, -162, -219, -220, -124, - -235, -117, -235, -138, -140, -139, -134, -141, -145, -142, - -147, -152, -149, -146, -135, -151, -148, -144, -136, -5, - -235, -129, -137, -153, -220, -216, -235, -224, -235, -221, - -55, -235, -63, -62, -235, -235, -235, -125, -235, -56, - -235, -155, -235, -159, -179, -235, -182, -235, -235, -201, - -235, -202, -235, -213, -214, -212, -46, -70, -88, -47, - -89, -221, -90, -95, -49, -235, -186, -234, -30, -122, - -235, -164, -221, -97, -116, -129, -235, -128, -235, -217, - -228, -225, -229, -235, -59, -61, -102, -98, -99, -64, - -103, -100, -101, -65, -48, -156, -154, -235, -235, -181, - -207, -205, -204, -235, -184, -68, -185, -166, -220, -235, - -235, -127, -130, -235, -53, -160, -235, -183, -165, -163, - -235, -132, -235, -158, -131, -157 ] + -180, -217, -1, -2, -3, -6, -7, -8, -9, -10, + -11, -12, -13, -14, -15, -16, -17, -18, -19, -217, + -23, -171, -217, -217, -217, -53, -217, -217, -217, -217, + -217, -217, -172, -217, -170, -217, -4, -217, -25, -26, + -27, -28, -217, -95, -217, -32, -33, -37, -38, -39, + -40, -41, -42, -43, -44, -45, -46, -47, -75, -76, + -77, -100, -217, -105, -217, -217, -217, -215, -158, -159, + -197, -205, -88, -88, -56, -180, -180, -217, -217, -52, + -171, -172, -54, -217, -217, -217, -217, -108, -217, -115, + -116, -217, -217, -217, -217, -217, -217, -160, -161, -163, + -180, -180, -180, -173, -175, -176, -177, -178, -179, 371, + -21, -22, -23, -24, -171, -20, -203, -217, -93, -94, + -96, -217, -31, -35, -217, -217, -217, -217, -101, -217, + -217, -200, -217, -73, -203, -217, -71, -76, -77, -78, + -79, -80, -81, -82, -83, -84, -89, -154, -155, -156, + -203, -217, -95, -217, -59, -60, -62, -180, -217, -68, + -69, -76, -197, -217, -217, -85, -87, -217, -86, -217, + -217, -217, -217, -217, -217, -217, -217, -217, -217, -217, + -217, -217, -217, -217, -217, -217, -217, -126, -133, -217, + -217, -217, -208, -209, -217, -212, -213, -217, -217, -217, + -182, -181, -180, -217, -217, -191, -217, -217, -204, -217, + -217, -29, -202, -217, -201, -34, -217, -217, -99, -217, + -102, -103, -217, -198, -202, -76, -144, -145, -217, -217, + -150, -151, -152, -153, -157, -217, -74, -217, -204, -88, + -217, -203, -57, -217, -64, -65, -217, -217, -217, -58, + -107, -202, -214, -5, -217, -111, -117, -118, -119, -120, + -121, -122, -123, -124, -125, -127, -128, -129, -130, -131, + -132, -134, -135, -136, -198, -206, -217, -217, -217, -138, + -217, -142, -162, -217, -217, -217, -185, -188, -190, -217, + -193, -217, -217, -174, -192, -51, -97, -91, -92, -30, + -36, -216, -98, -106, -104, -199, -203, -147, -217, -48, + -72, -49, -90, -203, -50, -217, -61, -63, -66, -67, + -111, -110, -217, -217, -207, -210, -211, -137, -139, -217, + -217, -217, -165, -183, -184, -217, -217, -217, -217, -194, + -195, -196, -217, -169, -217, -217, -202, -149, -70, -55, + -109, -112, -217, -217, -143, -164, -186, -187, -189, -217, + -167, -168, -146, -148, -217, -114, -217, -141, -166, -113, + -140 ] racc_goto_table = [ - 27, 13, 20, 222, 89, 92, 115, 37, 62, 5, - 65, 196, 256, 145, 230, 150, 118, 50, 155, 301, - 27, 13, 246, 75, 73, 57, 133, 235, 201, 5, - 250, 214, 149, 119, 337, 165, 121, 344, 136, 69, - 169, 120, 27, 126, 142, 22, 27, 126, 300, 134, - 128, 89, 63, 151, 128, 168, 125, 65, 280, 124, - 130, 42, 192, 124, 46, 349, 353, 138, 244, 87, - 163, 73, 252, 369, 211, 332, 323, 168, 303, 116, - 135, 140, 123, 224, 298, 56, 69, 305, 371, 168, - 195, 159, 227, 237, 220, 123, 246, 148, 221, 63, - 331, 160, 110, 315, 355, 194, 212, 17, 325, nil, - nil, 86, nil, nil, nil, nil, 87, nil, 250, nil, - 294, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, nil, 239, 86, - nil, nil, nil, nil, nil, nil, nil, 89, 149, nil, - nil, 89, 266, 65, 248, nil, nil, 65, 86, nil, - nil, 343, nil, 303, 236, nil, 289, 245, nil, nil, - 262, 73, nil, nil, nil, 82, 247, nil, nil, 226, - nil, nil, 69, nil, nil, nil, 69, nil, 27, 13, - 317, 362, 150, 365, 340, 63, 149, 5, nil, 63, - 304, 151, 248, 143, 370, 85, 329, nil, 320, 149, - 322, nil, 87, 148, 378, 136, 87, 27, 13, nil, - 375, 89, 82, nil, 247, 321, 5, 65, nil, 54, - 318, 313, 250, 146, nil, 151, 149, 333, 27, 13, - nil, 245, 248, 380, 138, nil, 382, 5, nil, nil, - nil, nil, 85, nil, 86, 86, 69, 135, 86, nil, - nil, 148, nil, 210, 247, 342, 210, 62, nil, 63, - 80, nil, nil, 195, 148, nil, 149, 149, nil, 27, - 13, 149, 347, 347, 360, 361, 87, 248, 5, nil, - nil, nil, nil, nil, nil, nil, nil, nil, 141, nil, - nil, 148, nil, 86, 247, 247, nil, 367, nil, 247, - nil, nil, 27, 13, 363, 372, 86, 80, 82, 251, - nil, 5, 82, nil, 346, 346, nil, nil, 86, nil, - nil, nil, nil, nil, nil, nil, nil, nil, 149, nil, - nil, 352, 352, 86, 248, nil, 148, nil, 85, 254, - 149, 62, 85, nil, nil, 210, 248, nil, 207, nil, - nil, 207, nil, 27, 13, nil, 247, 251, 54, 54, - nil, nil, 5, 27, 13, nil, 27, 13, 247, nil, - 143, nil, 5, 86, 86, 5, nil, nil, 86, nil, - nil, nil, 82, nil, 274, nil, nil, 254, 278, nil, - nil, nil, nil, 148, nil, nil, nil, 251, nil, nil, - 146, nil, nil, 80, 249, 148, nil, 80, nil, nil, - nil, nil, 85, nil, nil, nil, nil, nil, nil, 129, - nil, 131, 132, nil, nil, nil, nil, 254, nil, nil, - nil, nil, nil, 210, nil, 86, nil, 350, 350, nil, - 207, nil, 251, nil, nil, 164, nil, 86, nil, nil, - nil, nil, 249, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, 171, 141, nil, 351, 351, 190, - nil, nil, 254, 191, nil, nil, nil, 80, nil, nil, + 23, 36, 23, 27, 2, 27, 46, 87, 20, 193, + 20, 139, 149, 103, 148, 140, 108, 98, 160, 160, + 100, 101, 227, 286, 78, 3, 279, 229, 145, 146, + 146, 128, 134, 150, 196, 116, 207, 23, 321, 110, + 153, 163, 23, 113, 115, 112, 121, 133, 113, 79, + 112, 278, 136, 220, 237, 235, 88, 96, 37, 42, + 254, 226, 111, 296, 142, 144, 130, 111, 199, 202, + 240, 232, 149, 306, 148, 230, 345, 99, 316, 164, + 289, 102, 203, 74, 294, 284, 285, 45, 339, 191, + 129, 1, 281, nil, nil, nil, 190, nil, nil, nil, + 160, nil, nil, 350, nil, nil, nil, 328, nil, 215, + nil, 165, 166, 167, 168, nil, nil, nil, 307, 187, + 188, 189, 246, 229, nil, 200, 200, 205, 217, 219, + nil, nil, nil, 147, 141, 234, 232, 149, nil, 148, + 230, nil, nil, nil, 241, nil, nil, nil, nil, nil, + nil, nil, nil, 216, 257, 258, nil, 356, nil, nil, + nil, 315, nil, nil, nil, nil, nil, 232, 149, 23, + 148, 230, 27, 281, 331, 139, 149, 20, 148, 140, + nil, nil, nil, 342, 293, 282, 160, 108, nil, 108, + 325, 304, 145, 147, 231, 312, 146, nil, 256, 313, + 234, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 196, 310, 232, 149, 143, + 148, 230, 159, 159, nil, 354, 344, 290, 142, 144, + nil, 234, nil, 348, nil, 363, nil, 297, 298, nil, + 229, 300, nil, 364, 366, nil, nil, nil, nil, nil, + 129, nil, 36, 23, nil, nil, 27, nil, 147, 231, + nil, 20, nil, nil, nil, nil, nil, nil, nil, 232, + 149, nil, 148, 230, nil, 318, 319, nil, nil, 233, + 340, 234, nil, 23, 232, 149, 27, 148, 230, 147, + 231, 20, 23, 347, nil, 27, nil, 147, 141, nil, + 20, 351, nil, nil, 159, 326, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, 249, nil, nil, nil, nil, nil, nil, 251, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, 251, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, nil, 207, 254, - nil, nil, 348, 348, nil, nil, nil, 249, nil, nil, - nil, 254, nil, nil, nil, nil, 263, 264, 265, nil, - 267, 268, 269, 270, 271, 272, 273, nil, 275, 276, - 277, nil, nil, 282, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 234, nil, nil, nil, nil, 23, 147, + 231, 27, 359, nil, 233, nil, 20, nil, 234, nil, + 88, nil, 23, 23, nil, 27, 27, nil, 36, 23, + 20, 20, 27, nil, 357, 358, nil, 20, nil, nil, + nil, nil, nil, nil, nil, 233, nil, nil, nil, nil, + nil, nil, nil, 143, nil, nil, nil, nil, nil, nil, + 159, 147, 231, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 147, 231, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 233, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, 249, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, 249, nil, nil, nil, - nil, nil, nil, nil, nil, nil, 164 ] + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 233, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 233 ] racc_goto_check = [ - 38, 22, 2, 83, 29, 63, 55, 33, 4, 53, - 31, 86, 71, 48, 37, 51, 73, 33, 39, 67, - 38, 22, 24, 23, 22, 79, 55, 37, 42, 53, - 69, 42, 29, 38, 64, 61, 75, 43, 31, 32, - 58, 6, 38, 22, 36, 3, 38, 22, 66, 75, - 6, 29, 30, 54, 6, 55, 20, 31, 5, 8, - 20, 21, 58, 8, 21, 47, 47, 32, 62, 28, - 23, 22, 70, 59, 58, 72, 57, 55, 69, 74, - 30, 34, 3, 76, 37, 77, 32, 5, 64, 55, - 31, 78, 35, 80, 81, 3, 24, 28, 82, 30, - 71, 3, 41, 84, 67, 85, 36, 1, 5, nil, - nil, 50, nil, nil, nil, nil, 28, nil, 69, nil, - 42, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, nil, 55, 50, - nil, nil, nil, nil, nil, nil, nil, 29, 29, nil, - nil, 29, 55, 31, 31, nil, nil, 31, 50, nil, - nil, 37, nil, 69, 79, nil, 39, 22, nil, nil, - 23, 22, nil, nil, nil, 26, 53, nil, nil, 3, - nil, nil, 32, nil, nil, nil, 32, nil, 38, 22, - 48, 83, 51, 37, 86, 30, 29, 53, nil, 30, - 73, 54, 31, 26, 37, 27, 61, nil, 55, 29, - 55, nil, 28, 28, 71, 31, 28, 38, 22, nil, - 69, 29, 26, nil, 53, 36, 53, 31, nil, 65, - 54, 33, 69, 27, nil, 54, 29, 55, 38, 22, - nil, 22, 31, 5, 32, nil, 5, 53, nil, nil, - nil, nil, 27, nil, 50, 50, 32, 30, 50, nil, - nil, 28, nil, 26, 53, 55, 26, 4, nil, 30, - 25, nil, nil, 31, 28, nil, 29, 29, nil, 38, - 22, 29, 31, 31, 55, 55, 28, 31, 53, nil, - nil, nil, nil, nil, nil, nil, nil, nil, 25, nil, - nil, 28, nil, 50, 53, 53, nil, 55, nil, 53, - nil, nil, 38, 22, 2, 63, 50, 25, 26, 26, - nil, 53, 26, nil, 30, 30, nil, nil, 50, nil, - nil, nil, nil, nil, nil, nil, nil, nil, 29, nil, - nil, 28, 28, 50, 31, nil, 28, nil, 27, 27, - 29, 4, 27, nil, nil, 26, 31, nil, 25, nil, - nil, 25, nil, 38, 22, nil, 53, 26, 65, 65, - nil, nil, 53, 38, 22, nil, 38, 22, 53, nil, - 26, nil, 53, 50, 50, 53, nil, nil, 50, nil, - nil, nil, 26, nil, 65, nil, nil, 27, 65, nil, - nil, nil, nil, 28, nil, nil, nil, 26, nil, nil, - 27, nil, nil, 25, 25, 28, nil, 25, nil, nil, - nil, nil, 27, nil, nil, nil, nil, nil, nil, 52, - nil, 52, 52, nil, nil, nil, nil, 27, nil, nil, - nil, nil, nil, 26, nil, 50, nil, 26, 26, nil, - 25, nil, 26, nil, nil, 52, nil, 50, nil, nil, - nil, nil, 25, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, 52, 25, nil, 27, 27, 52, - nil, nil, 27, 52, nil, nil, nil, 25, nil, nil, + 43, 4, 43, 54, 2, 54, 25, 60, 22, 84, + 22, 28, 37, 77, 31, 29, 63, 71, 29, 29, + 38, 38, 69, 81, 43, 3, 65, 67, 35, 55, + 55, 58, 41, 41, 28, 44, 42, 43, 61, 20, + 47, 47, 43, 8, 20, 22, 23, 39, 8, 6, + 22, 64, 52, 59, 42, 40, 26, 26, 21, 21, + 5, 68, 6, 57, 32, 34, 23, 6, 73, 73, + 42, 28, 37, 70, 31, 29, 27, 72, 48, 23, + 74, 75, 76, 46, 78, 79, 80, 24, 82, 83, + 26, 1, 67, nil, nil, nil, 23, nil, nil, nil, + 29, nil, nil, 61, nil, nil, nil, 65, nil, 25, + nil, 26, 26, 26, 26, nil, nil, nil, 69, 26, + 26, 26, 47, 67, nil, 3, 3, 3, 23, 23, + nil, nil, nil, 36, 30, 54, 28, 37, nil, 31, + 29, nil, nil, nil, 44, nil, nil, nil, nil, nil, + nil, nil, nil, 26, 63, 63, nil, 81, nil, nil, + nil, 42, nil, nil, nil, nil, nil, 28, 37, 43, + 31, 29, 54, 67, 5, 28, 37, 22, 31, 29, + nil, nil, nil, 5, 77, 71, 29, 63, nil, 63, + 84, 58, 35, 36, 30, 55, 55, nil, 26, 41, + 54, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 28, 52, 28, 37, 33, + 31, 29, 33, 33, nil, 67, 42, 3, 32, 34, + nil, 54, nil, 42, nil, 69, nil, 26, 26, nil, + 67, 26, nil, 5, 5, nil, nil, nil, nil, nil, + 26, nil, 4, 43, nil, nil, 54, nil, 36, 30, + nil, 22, nil, nil, nil, nil, nil, nil, nil, 28, + 37, nil, 31, 29, nil, 26, 26, nil, nil, 33, + 38, 54, nil, 43, 28, 37, 54, 31, 29, 36, + 30, 22, 43, 25, nil, 54, nil, 36, 30, nil, + 22, 60, nil, nil, 33, 26, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 54, nil, nil, nil, nil, 43, 36, + 30, 54, 2, nil, 33, nil, 22, nil, 54, nil, + 26, nil, 43, 43, nil, 54, 54, nil, 4, 43, + 22, 22, 54, nil, 26, 26, nil, 22, nil, nil, + nil, nil, nil, nil, nil, 33, nil, nil, nil, nil, + nil, nil, nil, 33, nil, nil, nil, nil, nil, nil, + 33, 36, 30, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 36, 30, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, 25, nil, nil, nil, nil, nil, nil, 26, + nil, nil, nil, nil, nil, 33, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, 26, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, nil, 25, 27, - nil, nil, 25, 25, nil, nil, nil, 25, nil, nil, - nil, 27, nil, nil, nil, nil, 52, 52, 52, nil, - 52, 52, 52, 52, 52, 52, 52, nil, 52, 52, - 52, nil, nil, 52, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, 25, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, 25, nil, nil, nil, - nil, nil, nil, nil, nil, nil, 52 ] + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 33, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 33 ] racc_goto_pointer = [ - nil, 107, 2, 45, -12, -130, 8, nil, 17, nil, + nil, 91, 4, 25, -1, -109, 25, nil, 6, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - 14, 58, 1, 0, -144, 247, 152, 182, 46, -19, - 29, -13, 16, 6, 30, -48, -7, -128, 0, -34, - nil, 75, -83, -254, nil, nil, nil, -230, -38, nil, - 88, -36, 384, 9, 1, -23, nil, -158, -38, -259, - nil, -36, -96, -21, -247, 211, -167, -196, nil, -137, - -95, -155, -180, -16, 47, -1, -51, 67, 35, 7, - -65, -28, -24, -119, -122, 2, -92, nil ] + 2, 40, 8, 2, 66, -15, 28, -230, -61, -57, + 62, -58, -8, 147, -7, -44, 61, -60, -11, -25, + -78, -40, -80, 0, -8, nil, 60, -35, -165, nil, + nil, nil, -20, nil, 3, -43, nil, -145, -31, -76, + -21, -217, nil, -17, -146, -171, nil, -105, -71, -110, + -155, -13, 47, -32, -122, 48, -20, -20, -122, -116, + -115, -178, -203, -6, -86, nil ] racc_goto_default = [ - nil, nil, 279, 208, 25, nil, 31, 35, 4, 7, - 9, 14, 16, 19, 21, 24, 28, 30, 34, 3, - 6, nil, 98, nil, 76, 101, 102, 105, 107, 108, - 93, 94, 96, 12, nil, nil, nil, nil, 83, nil, - 33, nil, nil, 204, 291, 205, 206, nil, nil, 147, - 106, 109, 91, 64, 137, 97, 152, 153, nil, 260, - 104, nil, nil, nil, nil, 67, nil, nil, 302, 77, - nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - 58, nil, nil, nil, nil, nil, nil, 197 ] + nil, nil, 253, 154, 4, nil, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, nil, 55, nil, nil, 89, 123, 213, 47, 48, + 49, 50, 51, 52, 53, 54, 56, 57, 22, nil, + nil, nil, nil, 65, nil, 24, nil, nil, 155, 243, + 156, 158, nil, 135, 67, 118, 119, 120, nil, nil, + nil, nil, 90, 69, nil, nil, 280, 66, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 104, nil, + nil, nil, nil, nil, nil, 194 ] racc_reduce_table = [ 0, 0, :racc_error, - 1, 70, :_reduce_none, - 1, 70, :_reduce_none, - 1, 71, :_reduce_3, - 2, 71, :_reduce_4, - 1, 74, :_reduce_5, - 1, 73, :_reduce_none, - 1, 73, :_reduce_none, - 1, 73, :_reduce_none, - 1, 73, :_reduce_none, - 1, 73, :_reduce_none, - 1, 73, :_reduce_none, - 1, 73, :_reduce_none, - 1, 73, :_reduce_none, - 1, 73, :_reduce_none, - 1, 73, :_reduce_none, - 1, 73, :_reduce_none, - 1, 73, :_reduce_none, - 1, 73, :_reduce_none, - 1, 73, :_reduce_none, - 3, 88, :_reduce_20, - 3, 88, :_reduce_21, + 1, 69, :_reduce_none, + 1, 69, :_reduce_none, + 1, 70, :_reduce_3, + 2, 70, :_reduce_4, + 1, 73, :_reduce_5, + 1, 72, :_reduce_none, + 1, 72, :_reduce_none, + 1, 72, :_reduce_none, + 1, 72, :_reduce_none, + 1, 72, :_reduce_none, + 1, 72, :_reduce_none, + 1, 72, :_reduce_none, + 1, 72, :_reduce_none, + 1, 72, :_reduce_none, + 1, 72, :_reduce_none, + 1, 72, :_reduce_none, + 1, 72, :_reduce_none, + 1, 72, :_reduce_none, + 1, 72, :_reduce_none, + 3, 87, :_reduce_20, + 3, 87, :_reduce_21, + 1, 88, :_reduce_none, + 1, 88, :_reduce_none, + 1, 88, :_reduce_none, 1, 89, :_reduce_none, 1, 89, :_reduce_none, 1, 89, :_reduce_none, - 1, 90, :_reduce_none, - 1, 90, :_reduce_none, - 1, 90, :_reduce_none, - 1, 90, :_reduce_none, - 4, 82, :_reduce_29, - 5, 82, :_reduce_30, - 3, 82, :_reduce_31, - 2, 82, :_reduce_32, + 1, 89, :_reduce_none, + 4, 81, :_reduce_29, + 5, 81, :_reduce_30, + 3, 81, :_reduce_31, + 2, 81, :_reduce_32, 1, 92, :_reduce_33, - 1, 92, :_reduce_34, - 3, 92, :_reduce_35, - 3, 92, :_reduce_36, + 3, 92, :_reduce_34, + 1, 91, :_reduce_35, + 3, 91, :_reduce_36, + 1, 93, :_reduce_none, 1, 93, :_reduce_none, 1, 93, :_reduce_none, 1, 93, :_reduce_none, @@ -675,200 +474,181 @@ racc_reduce_table = [ 1, 93, :_reduce_none, 1, 93, :_reduce_none, 1, 93, :_reduce_none, - 1, 93, :_reduce_45, - 5, 75, :_reduce_46, - 5, 75, :_reduce_47, - 5, 75, :_reduce_48, - 5, 86, :_reduce_49, - 2, 76, :_reduce_50, - 1, 109, :_reduce_51, - 2, 109, :_reduce_52, - 6, 77, :_reduce_53, - 2, 77, :_reduce_54, - 3, 110, :_reduce_55, - 3, 110, :_reduce_56, - 1, 111, :_reduce_none, - 1, 111, :_reduce_none, - 3, 111, :_reduce_59, - 1, 112, :_reduce_none, - 3, 112, :_reduce_61, - 1, 113, :_reduce_62, - 1, 113, :_reduce_63, - 3, 114, :_reduce_64, - 3, 114, :_reduce_65, + 1, 93, :_reduce_none, + 1, 93, :_reduce_none, + 5, 74, :_reduce_48, + 5, 74, :_reduce_49, + 5, 74, :_reduce_50, + 5, 85, :_reduce_51, + 2, 75, :_reduce_52, + 1, 113, :_reduce_53, + 2, 113, :_reduce_54, + 6, 76, :_reduce_55, + 2, 76, :_reduce_56, + 3, 114, :_reduce_57, + 3, 114, :_reduce_58, 1, 115, :_reduce_none, 1, 115, :_reduce_none, - 4, 117, :_reduce_68, - 1, 103, :_reduce_69, - 3, 103, :_reduce_70, - 0, 104, :_reduce_none, - 1, 104, :_reduce_none, - 1, 119, :_reduce_73, - 1, 94, :_reduce_74, - 1, 96, :_reduce_75, - 1, 118, :_reduce_none, - 1, 118, :_reduce_none, - 1, 118, :_reduce_none, - 1, 118, :_reduce_none, - 1, 118, :_reduce_none, - 1, 118, :_reduce_none, - 1, 118, :_reduce_none, - 3, 78, :_reduce_83, - 3, 78, :_reduce_84, - 3, 87, :_reduce_85, - 0, 105, :_reduce_86, - 1, 105, :_reduce_87, - 3, 105, :_reduce_88, - 3, 123, :_reduce_89, - 3, 125, :_reduce_90, - 1, 126, :_reduce_none, - 1, 126, :_reduce_none, - 0, 108, :_reduce_93, - 1, 108, :_reduce_94, - 3, 108, :_reduce_95, - 1, 127, :_reduce_96, - 3, 127, :_reduce_97, - 1, 116, :_reduce_none, - 1, 116, :_reduce_none, - 1, 116, :_reduce_none, + 3, 115, :_reduce_61, 1, 116, :_reduce_none, - 1, 116, :_reduce_none, - 1, 116, :_reduce_none, - 1, 124, :_reduce_none, - 1, 124, :_reduce_none, - 1, 124, :_reduce_none, - 1, 124, :_reduce_none, - 1, 124, :_reduce_none, - 1, 124, :_reduce_none, - 1, 124, :_reduce_none, - 1, 124, :_reduce_none, - 1, 124, :_reduce_none, - 1, 124, :_reduce_none, - 1, 124, :_reduce_none, - 1, 124, :_reduce_none, - 4, 98, :_reduce_116, - 3, 98, :_reduce_117, - 1, 100, :_reduce_118, - 2, 100, :_reduce_119, - 2, 130, :_reduce_120, - 1, 131, :_reduce_121, - 2, 131, :_reduce_122, - 1, 97, :_reduce_123, - 4, 91, :_reduce_124, - 4, 91, :_reduce_125, - 2, 80, :_reduce_126, - 5, 132, :_reduce_127, - 4, 132, :_reduce_128, - 0, 133, :_reduce_none, - 2, 133, :_reduce_130, - 4, 133, :_reduce_131, - 3, 133, :_reduce_132, + 3, 116, :_reduce_63, + 1, 117, :_reduce_64, + 1, 117, :_reduce_65, + 3, 118, :_reduce_66, + 3, 118, :_reduce_67, + 1, 119, :_reduce_none, + 1, 119, :_reduce_none, + 4, 120, :_reduce_70, + 1, 107, :_reduce_71, + 3, 107, :_reduce_72, + 0, 108, :_reduce_none, + 1, 108, :_reduce_none, + 1, 105, :_reduce_75, + 1, 97, :_reduce_76, + 1, 98, :_reduce_77, 1, 121, :_reduce_none, - 3, 121, :_reduce_134, - 3, 121, :_reduce_135, - 3, 121, :_reduce_136, - 3, 121, :_reduce_137, - 3, 121, :_reduce_138, - 3, 121, :_reduce_139, - 3, 121, :_reduce_140, - 3, 121, :_reduce_141, - 3, 121, :_reduce_142, - 2, 121, :_reduce_143, - 3, 121, :_reduce_144, - 3, 121, :_reduce_145, - 3, 121, :_reduce_146, - 3, 121, :_reduce_147, - 3, 121, :_reduce_148, - 3, 121, :_reduce_149, - 2, 121, :_reduce_150, - 3, 121, :_reduce_151, - 3, 121, :_reduce_152, - 3, 121, :_reduce_153, - 5, 79, :_reduce_154, - 1, 135, :_reduce_155, - 2, 135, :_reduce_156, - 5, 136, :_reduce_157, - 4, 136, :_reduce_158, - 1, 137, :_reduce_159, - 3, 137, :_reduce_160, - 3, 99, :_reduce_161, - 1, 139, :_reduce_none, - 4, 139, :_reduce_163, - 1, 141, :_reduce_none, - 3, 141, :_reduce_165, - 3, 140, :_reduce_166, - 1, 138, :_reduce_none, - 1, 138, :_reduce_none, - 1, 138, :_reduce_none, - 1, 138, :_reduce_none, - 1, 138, :_reduce_none, - 1, 138, :_reduce_none, - 1, 138, :_reduce_none, - 1, 138, :_reduce_none, - 1, 138, :_reduce_175, + 1, 121, :_reduce_none, + 1, 121, :_reduce_none, + 1, 121, :_reduce_none, + 1, 121, :_reduce_none, + 1, 121, :_reduce_none, + 1, 121, :_reduce_none, + 3, 77, :_reduce_85, + 3, 77, :_reduce_86, + 3, 86, :_reduce_87, + 0, 109, :_reduce_88, + 1, 109, :_reduce_89, + 3, 109, :_reduce_90, + 3, 123, :_reduce_91, + 3, 124, :_reduce_92, + 1, 125, :_reduce_none, + 1, 125, :_reduce_none, + 0, 112, :_reduce_95, + 1, 112, :_reduce_96, + 3, 112, :_reduce_97, + 4, 104, :_reduce_98, + 3, 104, :_reduce_99, + 1, 96, :_reduce_100, + 2, 96, :_reduce_101, + 2, 126, :_reduce_102, + 1, 127, :_reduce_103, + 2, 127, :_reduce_104, + 1, 99, :_reduce_105, + 4, 90, :_reduce_106, + 4, 90, :_reduce_107, + 2, 79, :_reduce_108, + 5, 128, :_reduce_109, + 4, 128, :_reduce_110, + 0, 129, :_reduce_none, + 2, 129, :_reduce_112, + 4, 129, :_reduce_113, + 3, 129, :_reduce_114, + 1, 94, :_reduce_none, + 1, 94, :_reduce_none, + 3, 94, :_reduce_117, + 3, 94, :_reduce_118, + 3, 94, :_reduce_119, + 3, 94, :_reduce_120, + 3, 94, :_reduce_121, + 3, 94, :_reduce_122, + 3, 94, :_reduce_123, + 3, 94, :_reduce_124, + 3, 94, :_reduce_125, + 2, 94, :_reduce_126, + 3, 94, :_reduce_127, + 3, 94, :_reduce_128, + 3, 94, :_reduce_129, + 3, 94, :_reduce_130, + 3, 94, :_reduce_131, + 3, 94, :_reduce_132, + 2, 94, :_reduce_133, + 3, 94, :_reduce_134, + 3, 94, :_reduce_135, + 3, 94, :_reduce_136, + 5, 78, :_reduce_137, + 1, 132, :_reduce_138, + 2, 132, :_reduce_139, + 5, 133, :_reduce_140, + 4, 133, :_reduce_141, + 1, 134, :_reduce_142, + 3, 134, :_reduce_143, + 3, 100, :_reduce_144, + 1, 136, :_reduce_none, + 4, 136, :_reduce_146, 1, 138, :_reduce_none, - 1, 142, :_reduce_177, - 1, 143, :_reduce_none, - 3, 143, :_reduce_179, - 2, 81, :_reduce_180, - 6, 83, :_reduce_181, - 5, 83, :_reduce_182, - 7, 84, :_reduce_183, - 6, 84, :_reduce_184, - 6, 85, :_reduce_185, - 5, 85, :_reduce_186, - 1, 107, :_reduce_187, - 1, 102, :_reduce_188, - 1, 102, :_reduce_189, - 1, 102, :_reduce_190, - 1, 146, :_reduce_191, - 3, 146, :_reduce_192, - 1, 148, :_reduce_193, - 1, 149, :_reduce_194, - 1, 149, :_reduce_195, - 1, 149, :_reduce_196, - 1, 149, :_reduce_none, - 0, 72, :_reduce_198, - 0, 150, :_reduce_199, + 3, 138, :_reduce_148, + 3, 137, :_reduce_149, + 1, 135, :_reduce_none, + 1, 135, :_reduce_none, + 1, 135, :_reduce_none, + 1, 135, :_reduce_none, + 1, 135, :_reduce_none, + 1, 135, :_reduce_none, + 1, 135, :_reduce_none, + 1, 135, :_reduce_none, + 1, 135, :_reduce_158, + 1, 135, :_reduce_none, + 1, 139, :_reduce_160, + 1, 140, :_reduce_none, + 3, 140, :_reduce_162, + 2, 80, :_reduce_163, + 6, 82, :_reduce_164, + 5, 82, :_reduce_165, + 7, 83, :_reduce_166, + 6, 83, :_reduce_167, + 6, 84, :_reduce_168, + 5, 84, :_reduce_169, + 1, 111, :_reduce_170, + 1, 106, :_reduce_171, + 1, 106, :_reduce_172, + 1, 143, :_reduce_173, + 3, 143, :_reduce_174, + 1, 145, :_reduce_175, + 1, 146, :_reduce_176, + 1, 146, :_reduce_177, + 1, 146, :_reduce_178, + 1, 146, :_reduce_none, + 0, 71, :_reduce_180, + 0, 147, :_reduce_181, + 1, 141, :_reduce_none, + 3, 141, :_reduce_183, + 3, 141, :_reduce_184, + 1, 148, :_reduce_none, + 3, 148, :_reduce_186, + 3, 149, :_reduce_187, + 1, 149, :_reduce_188, + 3, 149, :_reduce_189, + 1, 149, :_reduce_190, 1, 144, :_reduce_none, - 3, 144, :_reduce_201, - 3, 144, :_reduce_202, + 2, 144, :_reduce_192, + 1, 142, :_reduce_none, + 2, 142, :_reduce_194, + 1, 150, :_reduce_none, + 1, 150, :_reduce_none, + 1, 101, :_reduce_197, + 3, 102, :_reduce_198, + 4, 102, :_reduce_199, + 2, 102, :_reduce_200, + 1, 95, :_reduce_none, + 1, 95, :_reduce_none, + 0, 110, :_reduce_none, + 1, 110, :_reduce_204, + 1, 131, :_reduce_205, + 3, 130, :_reduce_206, + 4, 130, :_reduce_207, + 2, 130, :_reduce_208, 1, 151, :_reduce_none, - 3, 151, :_reduce_204, - 3, 152, :_reduce_205, - 1, 152, :_reduce_206, - 3, 152, :_reduce_207, - 1, 152, :_reduce_208, - 1, 147, :_reduce_none, - 2, 147, :_reduce_210, - 1, 145, :_reduce_none, - 2, 145, :_reduce_212, - 1, 153, :_reduce_none, - 1, 153, :_reduce_none, - 1, 95, :_reduce_215, - 3, 120, :_reduce_216, - 4, 120, :_reduce_217, - 2, 120, :_reduce_218, - 1, 128, :_reduce_none, - 1, 128, :_reduce_none, - 0, 106, :_reduce_none, - 1, 106, :_reduce_222, - 1, 134, :_reduce_223, - 3, 129, :_reduce_224, - 4, 129, :_reduce_225, - 2, 129, :_reduce_226, - 1, 154, :_reduce_none, - 3, 154, :_reduce_228, - 3, 155, :_reduce_229, - 1, 156, :_reduce_230, - 1, 156, :_reduce_231, - 4, 122, :_reduce_232, - 1, 101, :_reduce_none, - 4, 101, :_reduce_234 ] - -racc_reduce_n = 235 - -racc_shift_n = 386 + 3, 151, :_reduce_210, + 3, 152, :_reduce_211, + 1, 153, :_reduce_212, + 1, 153, :_reduce_213, + 4, 122, :_reduce_214, + 1, 103, :_reduce_none, + 4, 103, :_reduce_216 ] + +racc_reduce_n = 217 + +racc_shift_n = 371 racc_token_table = { false => 0, @@ -918,30 +698,29 @@ racc_token_table = { :AT => 44, :LCOLLECT => 45, :RCOLLECT => 46, - :CLASSNAME => 47, - :CLASSREF => 48, - :NOT => 49, - :OR => 50, - :AND => 51, - :UNDEF => 52, - :PARROW => 53, - :PLUS => 54, - :MINUS => 55, - :TIMES => 56, - :DIV => 57, - :LSHIFT => 58, - :RSHIFT => 59, - :UMINUS => 60, - :MATCH => 61, - :NOMATCH => 62, - :REGEX => 63, - :IN_EDGE => 64, - :OUT_EDGE => 65, - :IN_EDGE_SUB => 66, - :OUT_EDGE_SUB => 67, - :IN => 68 } - -racc_nt_base = 69 + :CLASSREF => 47, + :NOT => 48, + :OR => 49, + :AND => 50, + :UNDEF => 51, + :PARROW => 52, + :PLUS => 53, + :MINUS => 54, + :TIMES => 55, + :DIV => 56, + :LSHIFT => 57, + :RSHIFT => 58, + :UMINUS => 59, + :MATCH => 60, + :NOMATCH => 61, + :REGEX => 62, + :IN_EDGE => 63, + :OUT_EDGE => 64, + :IN_EDGE_SUB => 65, + :OUT_EDGE_SUB => 66, + :IN => 67 } + +racc_nt_base = 68 racc_use_result_var = true @@ -1009,7 +788,6 @@ Racc_token_to_s_table = [ "AT", "LCOLLECT", "RCOLLECT", - "CLASSNAME", "CLASSREF", "NOT", "OR", @@ -1054,16 +832,21 @@ Racc_token_to_s_table = [ "relationship_side", "edge", "resourceref", + "expressions", "funcvalues", - "namestring", + "rvalue", + "expression", + "comma", + "quotedtext", "name", - "variable", "type", "boolean", - "funcrvalue", "selector", - "quotedtext", + "variable", + "array", "hasharrayaccesses", + "funcrvalue", + "undef", "classname", "resourceinstances", "endsemi", @@ -1078,24 +861,17 @@ Racc_token_to_s_table = [ "colljoin", "collexpr", "colllval", - "simplervalue", "resourceinst", "resourcename", - "undef", - "array", - "expression", "hasharrayaccess", "param", - "rvalue", "addparam", "anyparam", - "rvalues", - "comma", - "hash", "dqrval", "dqtail", "ifstatement", "else", + "hash", "regex", "caseopts", "caseopt", @@ -1276,27 +1052,25 @@ module_eval(<<'.,.,', 'grammar.ra', 110) end .,., -module_eval(<<'.,.,', 'grammar.ra', 111) +module_eval(<<'.,.,', 'grammar.ra', 113) def _reduce_34(val, _values, result) - result = aryfy(val[0]) + val[0].push(val[2]) + result = val[0] + result end .,., -module_eval(<<'.,.,', 'grammar.ra', 113) +module_eval(<<'.,.,', 'grammar.ra', 117) def _reduce_35(val, _values, result) - val[0].push(val[2]) - result = val[0] - + result = aryfy(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.ra', 117) +module_eval(<<'.,.,', 'grammar.ra', 118) def _reduce_36(val, _values, result) - val[0].push(val[2]) - result = val[0] - + result = val[0].push(val[2]) result end .,., @@ -1317,16 +1091,14 @@ module_eval(<<'.,.,', 'grammar.ra', 117) # reduce 44 omitted -module_eval(<<'.,.,', 'grammar.ra', 132) - def _reduce_45(val, _values, result) - result = ast AST::Name, :value => val[0][:value] - - result - end -.,., +# reduce 45 omitted -module_eval(<<'.,.,', 'grammar.ra', 136) - def _reduce_46(val, _values, result) +# reduce 46 omitted + +# reduce 47 omitted + +module_eval(<<'.,.,', 'grammar.ra', 133) + def _reduce_48(val, _values, result) @lexer.commentpop result = ast(AST::Resource, :type => val[0], :instances => val[2]) @@ -1334,8 +1106,8 @@ module_eval(<<'.,.,', 'grammar.ra', 136) end .,., -module_eval(<<'.,.,', 'grammar.ra', 139) - def _reduce_47(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 136) + def _reduce_49(val, _values, result) # This is a deprecated syntax. error "All resource specifications require names" @@ -1343,8 +1115,8 @@ module_eval(<<'.,.,', 'grammar.ra', 139) end .,., -module_eval(<<'.,.,', 'grammar.ra', 142) - def _reduce_48(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 139) + def _reduce_50(val, _values, result) # a defaults setting for a type @lexer.commentpop result = ast(AST::ResourceDefaults, :type => val[0], :parameters => val[2]) @@ -1353,8 +1125,8 @@ module_eval(<<'.,.,', 'grammar.ra', 142) end .,., -module_eval(<<'.,.,', 'grammar.ra', 149) - def _reduce_49(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 146) + def _reduce_51(val, _values, result) @lexer.commentpop result = ast AST::ResourceOverride, :object => val[0], :parameters => val[2] @@ -1362,8 +1134,8 @@ module_eval(<<'.,.,', 'grammar.ra', 149) end .,., -module_eval(<<'.,.,', 'grammar.ra', 156) - def _reduce_50(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 153) + def _reduce_52(val, _values, result) type = val[0] if (type == :exported and ! Puppet[:storeconfigs]) @@ -1383,22 +1155,22 @@ module_eval(<<'.,.,', 'grammar.ra', 156) end .,., -module_eval(<<'.,.,', 'grammar.ra', 172) - def _reduce_51(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 169) + def _reduce_53(val, _values, result) result = :virtual result end .,., -module_eval(<<'.,.,', 'grammar.ra', 173) - def _reduce_52(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 170) + def _reduce_54(val, _values, result) result = :exported result end .,., -module_eval(<<'.,.,', 'grammar.ra', 178) - def _reduce_53(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 175) + def _reduce_55(val, _values, result) @lexer.commentpop Puppet.warning addcontext("Collection names must now be capitalized") if val[0] =~ /^[a-z]/ type = val[0].downcase @@ -1421,8 +1193,8 @@ module_eval(<<'.,.,', 'grammar.ra', 178) end .,., -module_eval(<<'.,.,', 'grammar.ra', 197) - def _reduce_54(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 194) + def _reduce_56(val, _values, result) if val[0] =~ /^[a-z]/ Puppet.warning addcontext("Collection names must now be capitalized") end @@ -1445,8 +1217,8 @@ module_eval(<<'.,.,', 'grammar.ra', 197) end .,., -module_eval(<<'.,.,', 'grammar.ra', 218) - def _reduce_55(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 215) + def _reduce_57(val, _values, result) if val[1] result = val[1] result.form = :virtual @@ -1458,8 +1230,8 @@ module_eval(<<'.,.,', 'grammar.ra', 218) end .,., -module_eval(<<'.,.,', 'grammar.ra', 226) - def _reduce_56(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 223) + def _reduce_58(val, _values, result) if val[1] result = val[1] result.form = :exported @@ -1471,22 +1243,22 @@ module_eval(<<'.,.,', 'grammar.ra', 226) end .,., -# reduce 57 omitted +# reduce 59 omitted -# reduce 58 omitted +# reduce 60 omitted -module_eval(<<'.,.,', 'grammar.ra', 239) - def _reduce_59(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 236) + def _reduce_61(val, _values, result) result = ast AST::CollExpr, :test1 => val[0], :oper => val[1], :test2 => val[2] result end .,., -# reduce 60 omitted +# reduce 62 omitted -module_eval(<<'.,.,', 'grammar.ra', 244) - def _reduce_61(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 241) + def _reduce_63(val, _values, result) result = val[1] result.parens = true @@ -1494,22 +1266,22 @@ module_eval(<<'.,.,', 'grammar.ra', 244) end .,., -module_eval(<<'.,.,', 'grammar.ra', 248) - def _reduce_62(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 245) + def _reduce_64(val, _values, result) result=val[0][:value] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 249) - def _reduce_63(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 246) + def _reduce_65(val, _values, result) result=val[0][:value] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 252) - def _reduce_64(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 249) + def _reduce_66(val, _values, result) result = ast AST::CollExpr, :test1 => val[0], :oper => val[1][:value], :test2 => val[2] #result = ast AST::CollExpr #result.push *val @@ -1518,8 +1290,8 @@ module_eval(<<'.,.,', 'grammar.ra', 252) end .,., -module_eval(<<'.,.,', 'grammar.ra', 257) - def _reduce_65(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 254) + def _reduce_67(val, _values, result) result = ast AST::CollExpr, :test1 => val[0], :oper => val[1][:value], :test2 => val[2] #result = ast AST::CollExpr #result.push *val @@ -1528,27 +1300,27 @@ module_eval(<<'.,.,', 'grammar.ra', 257) end .,., -# reduce 66 omitted +# reduce 68 omitted -# reduce 67 omitted +# reduce 69 omitted -module_eval(<<'.,.,', 'grammar.ra', 266) - def _reduce_68(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 263) + def _reduce_70(val, _values, result) result = ast AST::ResourceInstance, :title => val[0], :parameters => val[2] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 269) - def _reduce_69(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 266) + def _reduce_71(val, _values, result) result = aryfy(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.ra', 271) - def _reduce_70(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 268) + def _reduce_72(val, _values, result) val[0].push val[2] result = val[0] @@ -1556,38 +1328,34 @@ module_eval(<<'.,.,', 'grammar.ra', 271) end .,., -# reduce 71 omitted +# reduce 73 omitted -# reduce 72 omitted +# reduce 74 omitted -module_eval(<<'.,.,', 'grammar.ra', 279) - def _reduce_73(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 276) + def _reduce_75(val, _values, result) result = ast AST::Undef, :value => :undef result end .,., -module_eval(<<'.,.,', 'grammar.ra', 283) - def _reduce_74(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 280) + def _reduce_76(val, _values, result) result = ast AST::Name, :value => val[0][:value], :line => val[0][:line] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 287) - def _reduce_75(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 284) + def _reduce_77(val, _values, result) result = ast AST::Type, :value => val[0][:value], :line => val[0][:line] result end .,., -# reduce 76 omitted - -# reduce 77 omitted - # reduce 78 omitted # reduce 79 omitted @@ -1598,8 +1366,12 @@ module_eval(<<'.,.,', 'grammar.ra', 287) # reduce 82 omitted -module_eval(<<'.,.,', 'grammar.ra', 299) - def _reduce_83(val, _values, result) +# reduce 83 omitted + +# reduce 84 omitted + +module_eval(<<'.,.,', 'grammar.ra', 296) + def _reduce_85(val, _values, result) raise Puppet::ParseError, "Cannot assign to variables in other namespaces" if val[0][:value] =~ /::/ # this is distinct from referencing a variable variable = ast AST::Name, :value => val[0][:value], :line => val[0][:line] @@ -1609,16 +1381,16 @@ module_eval(<<'.,.,', 'grammar.ra', 299) end .,., -module_eval(<<'.,.,', 'grammar.ra', 305) - def _reduce_84(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 302) + def _reduce_86(val, _values, result) result = ast AST::VarDef, :name => val[0], :value => val[2] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 309) - def _reduce_85(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 306) + def _reduce_87(val, _values, result) variable = ast AST::Name, :value => val[0][:value], :line => val[0][:line] result = ast AST::VarDef, :name => variable, :value => val[2], :append => true, :line => val[0][:line] @@ -1626,23 +1398,23 @@ module_eval(<<'.,.,', 'grammar.ra', 309) end .,., -module_eval(<<'.,.,', 'grammar.ra', 315) - def _reduce_86(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 312) + def _reduce_88(val, _values, result) result = ast AST::ASTArray result end .,., -module_eval(<<'.,.,', 'grammar.ra', 317) - def _reduce_87(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 314) + def _reduce_89(val, _values, result) result = aryfy(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.ra', 319) - def _reduce_88(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 316) + def _reduce_90(val, _values, result) val[0].push(val[2]) result = val[0] @@ -1650,16 +1422,16 @@ module_eval(<<'.,.,', 'grammar.ra', 319) end .,., -module_eval(<<'.,.,', 'grammar.ra', 324) - def _reduce_89(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 321) + def _reduce_91(val, _values, result) result = ast AST::ResourceParam, :param => val[0][:value], :line => val[0][:line], :value => val[2] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 328) - def _reduce_90(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 325) + def _reduce_92(val, _values, result) result = ast AST::ResourceParam, :param => val[0][:value], :line => val[0][:line], :value => val[2], :add => true @@ -1667,27 +1439,27 @@ module_eval(<<'.,.,', 'grammar.ra', 328) end .,., -# reduce 91 omitted +# reduce 93 omitted -# reduce 92 omitted +# reduce 94 omitted -module_eval(<<'.,.,', 'grammar.ra', 337) - def _reduce_93(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 334) + def _reduce_95(val, _values, result) result = ast AST::ASTArray result end .,., -module_eval(<<'.,.,', 'grammar.ra', 339) - def _reduce_94(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 336) + def _reduce_96(val, _values, result) result = aryfy(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.ra', 341) - def _reduce_95(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 338) + def _reduce_97(val, _values, result) val[0].push(val[2]) result = val[0] @@ -1695,58 +1467,8 @@ module_eval(<<'.,.,', 'grammar.ra', 341) end .,., -module_eval(<<'.,.,', 'grammar.ra', 345) - def _reduce_96(val, _values, result) - result = aryfy(val[0]) - result - end -.,., - -module_eval(<<'.,.,', 'grammar.ra', 346) - def _reduce_97(val, _values, result) - result = val[0].push(val[2]) - result - end -.,., - -# reduce 98 omitted - -# reduce 99 omitted - -# reduce 100 omitted - -# reduce 101 omitted - -# reduce 102 omitted - -# reduce 103 omitted - -# reduce 104 omitted - -# reduce 105 omitted - -# reduce 106 omitted - -# reduce 107 omitted - -# reduce 108 omitted - -# reduce 109 omitted - -# reduce 110 omitted - -# reduce 111 omitted - -# reduce 112 omitted - -# reduce 113 omitted - -# reduce 114 omitted - -# reduce 115 omitted - -module_eval(<<'.,.,', 'grammar.ra', 370) - def _reduce_116(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 344) + def _reduce_98(val, _values, result) result = ast AST::Function, :name => val[0][:value], :line => val[0][:line], :arguments => val[2], @@ -1756,8 +1478,8 @@ module_eval(<<'.,.,', 'grammar.ra', 370) end .,., -module_eval(<<'.,.,', 'grammar.ra', 375) - def _reduce_117(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 349) + def _reduce_99(val, _values, result) result = ast AST::Function, :name => val[0][:value], :line => val[0][:line], :arguments => AST::ASTArray.new({}), @@ -1767,51 +1489,51 @@ module_eval(<<'.,.,', 'grammar.ra', 375) end .,., -module_eval(<<'.,.,', 'grammar.ra', 381) - def _reduce_118(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 355) + def _reduce_100(val, _values, result) result = ast AST::String, :value => val[0][:value], :line => val[0][:line] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 382) - def _reduce_119(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 356) + def _reduce_101(val, _values, result) result = ast AST::Concat, :value => [ast(AST::String,val[0])]+val[1], :line => val[0][:line] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 384) - def _reduce_120(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 358) + def _reduce_102(val, _values, result) result = [val[0]] + val[1] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 386) - def _reduce_121(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 360) + def _reduce_103(val, _values, result) result = [ast(AST::String,val[0])] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 387) - def _reduce_122(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 361) + def _reduce_104(val, _values, result) result = [ast(AST::String,val[0])] + val[1] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 390) - def _reduce_123(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 364) + def _reduce_105(val, _values, result) result = ast AST::Boolean, :value => val[0][:value], :line => val[0][:line] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 394) - def _reduce_124(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 368) + def _reduce_106(val, _values, result) Puppet.warning addcontext("Deprecation notice: Resource references should now be capitalized") result = ast AST::ResourceReference, :type => val[0][:value], :line => val[0][:line], :title => val[2] @@ -1819,24 +1541,24 @@ module_eval(<<'.,.,', 'grammar.ra', 394) end .,., -module_eval(<<'.,.,', 'grammar.ra', 397) - def _reduce_125(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 371) + def _reduce_107(val, _values, result) result = ast AST::ResourceReference, :type => val[0], :title => val[2] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 401) - def _reduce_126(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 375) + def _reduce_108(val, _values, result) result = val[1] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 405) - def _reduce_127(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 379) + def _reduce_109(val, _values, result) @lexer.commentpop args = { :test => val[0], @@ -1851,8 +1573,8 @@ module_eval(<<'.,.,', 'grammar.ra', 405) end .,., -module_eval(<<'.,.,', 'grammar.ra', 416) - def _reduce_128(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 390) + def _reduce_110(val, _values, result) @lexer.commentpop args = { :test => val[0], @@ -1867,18 +1589,18 @@ module_eval(<<'.,.,', 'grammar.ra', 416) end .,., -# reduce 129 omitted +# reduce 111 omitted -module_eval(<<'.,.,', 'grammar.ra', 429) - def _reduce_130(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 403) + def _reduce_112(val, _values, result) result = ast AST::Else, :statements => val[1] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 432) - def _reduce_131(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 406) + def _reduce_113(val, _values, result) @lexer.commentpop result = ast AST::Else, :statements => val[2] @@ -1886,8 +1608,8 @@ module_eval(<<'.,.,', 'grammar.ra', 432) end .,., -module_eval(<<'.,.,', 'grammar.ra', 436) - def _reduce_132(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 410) + def _reduce_114(val, _values, result) @lexer.commentpop result = ast AST::Else, :statements => ast(AST::Nop) @@ -1895,170 +1617,172 @@ module_eval(<<'.,.,', 'grammar.ra', 436) end .,., -# reduce 133 omitted +# reduce 115 omitted -module_eval(<<'.,.,', 'grammar.ra', 454) - def _reduce_134(val, _values, result) +# reduce 116 omitted + +module_eval(<<'.,.,', 'grammar.ra', 429) + def _reduce_117(val, _values, result) result = ast AST::InOperator, :lval => val[0], :rval => val[2] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 457) - def _reduce_135(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 432) + def _reduce_118(val, _values, result) result = ast AST::MatchOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 460) - def _reduce_136(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 435) + def _reduce_119(val, _values, result) result = ast AST::MatchOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 463) - def _reduce_137(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 438) + def _reduce_120(val, _values, result) result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 466) - def _reduce_138(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 441) + def _reduce_121(val, _values, result) result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 469) - def _reduce_139(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 444) + def _reduce_122(val, _values, result) result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 472) - def _reduce_140(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 447) + def _reduce_123(val, _values, result) result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 475) - def _reduce_141(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 450) + def _reduce_124(val, _values, result) result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 478) - def _reduce_142(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 453) + def _reduce_125(val, _values, result) result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 481) - def _reduce_143(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 456) + def _reduce_126(val, _values, result) result = ast AST::Minus, :value => val[1] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 484) - def _reduce_144(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 459) + def _reduce_127(val, _values, result) result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 487) - def _reduce_145(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 462) + def _reduce_128(val, _values, result) result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 490) - def _reduce_146(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 465) + def _reduce_129(val, _values, result) result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 493) - def _reduce_147(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 468) + def _reduce_130(val, _values, result) result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 496) - def _reduce_148(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 471) + def _reduce_131(val, _values, result) result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 499) - def _reduce_149(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 474) + def _reduce_132(val, _values, result) result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 502) - def _reduce_150(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 477) + def _reduce_133(val, _values, result) result = ast AST::Not, :value => val[1] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 505) - def _reduce_151(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 480) + def _reduce_134(val, _values, result) result = ast AST::BooleanOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 508) - def _reduce_152(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 483) + def _reduce_135(val, _values, result) result = ast AST::BooleanOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 511) - def _reduce_153(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 486) + def _reduce_136(val, _values, result) result = val[1] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 515) - def _reduce_154(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 490) + def _reduce_137(val, _values, result) @lexer.commentpop result = ast AST::CaseStatement, :test => val[1], :options => val[3] @@ -2066,15 +1790,15 @@ module_eval(<<'.,.,', 'grammar.ra', 515) end .,., -module_eval(<<'.,.,', 'grammar.ra', 519) - def _reduce_155(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 494) + def _reduce_138(val, _values, result) result = aryfy(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.ra', 521) - def _reduce_156(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 496) + def _reduce_139(val, _values, result) val[0].push val[1] result = val[0] @@ -2082,8 +1806,8 @@ module_eval(<<'.,.,', 'grammar.ra', 521) end .,., -module_eval(<<'.,.,', 'grammar.ra', 526) - def _reduce_157(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 501) + def _reduce_140(val, _values, result) @lexer.commentpop result = ast AST::CaseOpt, :value => val[0], :statements => val[3] @@ -2091,8 +1815,8 @@ module_eval(<<'.,.,', 'grammar.ra', 526) end .,., -module_eval(<<'.,.,', 'grammar.ra', 529) - def _reduce_158(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 504) + def _reduce_141(val, _values, result) @lexer.commentpop result = ast( @@ -2106,15 +1830,15 @@ module_eval(<<'.,.,', 'grammar.ra', 529) end .,., -module_eval(<<'.,.,', 'grammar.ra', 539) - def _reduce_159(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 514) + def _reduce_142(val, _values, result) result = aryfy(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.ra', 541) - def _reduce_160(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 516) + def _reduce_143(val, _values, result) val[0].push(val[2]) result = val[0] @@ -2122,18 +1846,18 @@ module_eval(<<'.,.,', 'grammar.ra', 541) end .,., -module_eval(<<'.,.,', 'grammar.ra', 546) - def _reduce_161(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 521) + def _reduce_144(val, _values, result) result = ast AST::Selector, :param => val[0], :values => val[2] result end .,., -# reduce 162 omitted +# reduce 145 omitted -module_eval(<<'.,.,', 'grammar.ra', 551) - def _reduce_163(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 526) + def _reduce_146(val, _values, result) @lexer.commentpop result = val[1] @@ -2141,10 +1865,10 @@ module_eval(<<'.,.,', 'grammar.ra', 551) end .,., -# reduce 164 omitted +# reduce 147 omitted -module_eval(<<'.,.,', 'grammar.ra', 557) - def _reduce_165(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 532) + def _reduce_148(val, _values, result) if val[0].instance_of?(AST::ASTArray) val[0].push(val[2]) result = val[0] @@ -2156,58 +1880,58 @@ module_eval(<<'.,.,', 'grammar.ra', 557) end .,., -module_eval(<<'.,.,', 'grammar.ra', 566) - def _reduce_166(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 541) + def _reduce_149(val, _values, result) result = ast AST::ResourceParam, :param => val[0], :value => val[2] result end .,., -# reduce 167 omitted +# reduce 150 omitted -# reduce 168 omitted +# reduce 151 omitted -# reduce 169 omitted +# reduce 152 omitted -# reduce 170 omitted +# reduce 153 omitted -# reduce 171 omitted +# reduce 154 omitted -# reduce 172 omitted +# reduce 155 omitted -# reduce 173 omitted +# reduce 156 omitted -# reduce 174 omitted +# reduce 157 omitted -module_eval(<<'.,.,', 'grammar.ra', 578) - def _reduce_175(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 553) + def _reduce_158(val, _values, result) result = ast AST::Default, :value => val[0][:value], :line => val[0][:line] result end .,., -# reduce 176 omitted +# reduce 159 omitted -module_eval(<<'.,.,', 'grammar.ra', 583) - def _reduce_177(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 558) + def _reduce_160(val, _values, result) result = [val[0][:value]] result end .,., -# reduce 178 omitted +# reduce 161 omitted -module_eval(<<'.,.,', 'grammar.ra', 585) - def _reduce_179(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 560) + def _reduce_162(val, _values, result) result = val[0] += val[2] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 588) - def _reduce_180(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 563) + def _reduce_163(val, _values, result) val[1].each do |file| import(file) end @@ -2218,8 +1942,8 @@ module_eval(<<'.,.,', 'grammar.ra', 588) end .,., -module_eval(<<'.,.,', 'grammar.ra', 598) - def _reduce_181(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 573) + def _reduce_164(val, _values, result) @lexer.commentpop result = Puppet::Parser::AST::Definition.new(classname(val[1]), ast_context(true).merge(:arguments => val[2], :code => val[4], @@ -2232,8 +1956,8 @@ module_eval(<<'.,.,', 'grammar.ra', 598) end .,., -module_eval(<<'.,.,', 'grammar.ra', 606) - def _reduce_182(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 581) + def _reduce_165(val, _values, result) @lexer.commentpop result = Puppet::Parser::AST::Definition.new(classname(val[1]), ast_context(true).merge(:arguments => val[2], :line => val[0][:line])) @@ -2243,8 +1967,8 @@ module_eval(<<'.,.,', 'grammar.ra', 606) end .,., -module_eval(<<'.,.,', 'grammar.ra', 614) - def _reduce_183(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 589) + def _reduce_166(val, _values, result) @lexer.commentpop # Our class gets defined in the parent namespace, not our own. @lexer.namepop @@ -2256,8 +1980,8 @@ module_eval(<<'.,.,', 'grammar.ra', 614) end .,., -module_eval(<<'.,.,', 'grammar.ra', 621) - def _reduce_184(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 596) + def _reduce_167(val, _values, result) @lexer.commentpop # Our class gets defined in the parent namespace, not our own. @lexer.namepop @@ -2269,8 +1993,8 @@ module_eval(<<'.,.,', 'grammar.ra', 621) end .,., -module_eval(<<'.,.,', 'grammar.ra', 630) - def _reduce_185(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 605) + def _reduce_168(val, _values, result) @lexer.commentpop result = Puppet::Parser::AST::Node.new(val[1], ast_context(true).merge(:parent => val[2], :code => val[4], @@ -2280,8 +2004,8 @@ module_eval(<<'.,.,', 'grammar.ra', 630) end .,., -module_eval(<<'.,.,', 'grammar.ra', 635) - def _reduce_186(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 610) + def _reduce_169(val, _values, result) @lexer.commentpop result = Puppet::Parser::AST::Node.new(val[1], ast_context(true).merge(:parent => val[2], :line => val[0][:line])) @@ -2289,44 +2013,37 @@ module_eval(<<'.,.,', 'grammar.ra', 635) end .,., -module_eval(<<'.,.,', 'grammar.ra', 639) - def _reduce_187(val, _values, result) - result = val[0][:value] - result - end -.,., - -module_eval(<<'.,.,', 'grammar.ra', 641) - def _reduce_188(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 614) + def _reduce_170(val, _values, result) result = val[0][:value] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 642) - def _reduce_189(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 616) + def _reduce_171(val, _values, result) result = val[0][:value] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 643) - def _reduce_190(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 617) + def _reduce_172(val, _values, result) result = "class" result end .,., -module_eval(<<'.,.,', 'grammar.ra', 648) - def _reduce_191(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 622) + def _reduce_173(val, _values, result) result = [result] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 651) - def _reduce_192(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 625) + def _reduce_174(val, _values, result) result = val[0] result << val[2] @@ -2334,65 +2051,65 @@ module_eval(<<'.,.,', 'grammar.ra', 651) end .,., -module_eval(<<'.,.,', 'grammar.ra', 656) - def _reduce_193(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 630) + def _reduce_175(val, _values, result) result = ast AST::HostName, :value => val[0] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 659) - def _reduce_194(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 633) + def _reduce_176(val, _values, result) result = val[0][:value] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 660) - def _reduce_195(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 634) + def _reduce_177(val, _values, result) result = val[0][:value] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 661) - def _reduce_196(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 635) + def _reduce_178(val, _values, result) result = val[0][:value] result end .,., -# reduce 197 omitted +# reduce 179 omitted -module_eval(<<'.,.,', 'grammar.ra', 665) - def _reduce_198(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 639) + def _reduce_180(val, _values, result) result = nil result end .,., -module_eval(<<'.,.,', 'grammar.ra', 669) - def _reduce_199(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 643) + def _reduce_181(val, _values, result) result = ast AST::ASTArray, :children => [] result end .,., -# reduce 200 omitted +# reduce 182 omitted -module_eval(<<'.,.,', 'grammar.ra', 674) - def _reduce_201(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 648) + def _reduce_183(val, _values, result) result = nil result end .,., -module_eval(<<'.,.,', 'grammar.ra', 677) - def _reduce_202(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 651) + def _reduce_184(val, _values, result) result = val[1] result = [result] unless result[0].is_a?(Array) @@ -2400,10 +2117,10 @@ module_eval(<<'.,.,', 'grammar.ra', 677) end .,., -# reduce 203 omitted +# reduce 185 omitted -module_eval(<<'.,.,', 'grammar.ra', 683) - def _reduce_204(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 657) + def _reduce_186(val, _values, result) result = val[0] result = [result] unless result[0].is_a?(Array) result << val[2] @@ -2412,8 +2129,8 @@ module_eval(<<'.,.,', 'grammar.ra', 683) end .,., -module_eval(<<'.,.,', 'grammar.ra', 689) - def _reduce_205(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 663) + def _reduce_187(val, _values, result) Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype") result = [val[0][:value], val[2]] @@ -2421,8 +2138,8 @@ module_eval(<<'.,.,', 'grammar.ra', 689) end .,., -module_eval(<<'.,.,', 'grammar.ra', 693) - def _reduce_206(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 667) + def _reduce_188(val, _values, result) Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype") result = [val[0][:value]] @@ -2430,98 +2147,98 @@ module_eval(<<'.,.,', 'grammar.ra', 693) end .,., -module_eval(<<'.,.,', 'grammar.ra', 696) - def _reduce_207(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 670) + def _reduce_189(val, _values, result) result = [val[0][:value], val[2]] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 698) - def _reduce_208(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 672) + def _reduce_190(val, _values, result) result = [val[0][:value]] result end .,., -# reduce 209 omitted +# reduce 191 omitted -module_eval(<<'.,.,', 'grammar.ra', 703) - def _reduce_210(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 677) + def _reduce_192(val, _values, result) result = val[1] result end .,., -# reduce 211 omitted +# reduce 193 omitted -module_eval(<<'.,.,', 'grammar.ra', 708) - def _reduce_212(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 682) + def _reduce_194(val, _values, result) result = val[1] result end .,., -# reduce 213 omitted +# reduce 195 omitted -# reduce 214 omitted +# reduce 196 omitted -module_eval(<<'.,.,', 'grammar.ra', 714) - def _reduce_215(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 688) + def _reduce_197(val, _values, result) result = ast AST::Variable, :value => val[0][:value], :line => val[0][:line] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 717) - def _reduce_216(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 691) + def _reduce_198(val, _values, result) result = val[1] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 718) - def _reduce_217(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 692) + def _reduce_199(val, _values, result) result = val[1] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 719) - def _reduce_218(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 693) + def _reduce_200(val, _values, result) result = ast AST::ASTArray result end .,., -# reduce 219 omitted +# reduce 201 omitted -# reduce 220 omitted +# reduce 202 omitted -# reduce 221 omitted +# reduce 203 omitted -module_eval(<<'.,.,', 'grammar.ra', 725) - def _reduce_222(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 699) + def _reduce_204(val, _values, result) result = nil result end .,., -module_eval(<<'.,.,', 'grammar.ra', 728) - def _reduce_223(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 702) + def _reduce_205(val, _values, result) result = ast AST::Regex, :value => val[0][:value] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 732) - def _reduce_224(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 706) + def _reduce_206(val, _values, result) if val[1].instance_of?(AST::ASTHash) result = val[1] else @@ -2532,8 +2249,8 @@ module_eval(<<'.,.,', 'grammar.ra', 732) end .,., -module_eval(<<'.,.,', 'grammar.ra', 739) - def _reduce_225(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 713) + def _reduce_207(val, _values, result) if val[1].instance_of?(AST::ASTHash) result = val[1] else @@ -2544,18 +2261,18 @@ module_eval(<<'.,.,', 'grammar.ra', 739) end .,., -module_eval(<<'.,.,', 'grammar.ra', 745) - def _reduce_226(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 719) + def _reduce_208(val, _values, result) result = ast AST::ASTHash result end .,., -# reduce 227 omitted +# reduce 209 omitted -module_eval(<<'.,.,', 'grammar.ra', 750) - def _reduce_228(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 724) + def _reduce_210(val, _values, result) if val[0].instance_of?(AST::ASTHash) result = val[0].merge(val[2]) else @@ -2567,40 +2284,40 @@ module_eval(<<'.,.,', 'grammar.ra', 750) end .,., -module_eval(<<'.,.,', 'grammar.ra', 759) - def _reduce_229(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 733) + def _reduce_211(val, _values, result) result = ast AST::ASTHash, { :value => { val[0] => val[2] } } result end .,., -module_eval(<<'.,.,', 'grammar.ra', 762) - def _reduce_230(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 736) + def _reduce_212(val, _values, result) result = val[0][:value] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 763) - def _reduce_231(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 737) + def _reduce_213(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.ra', 766) - def _reduce_232(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 740) + def _reduce_214(val, _values, result) result = ast AST::HashOrArrayAccess, :variable => val[0][:value], :key => val[2] result end .,., -# reduce 233 omitted +# reduce 215 omitted -module_eval(<<'.,.,', 'grammar.ra', 771) - def _reduce_234(val, _values, result) +module_eval(<<'.,.,', 'grammar.ra', 745) + def _reduce_216(val, _values, result) result = ast AST::HashOrArrayAccess, :variable => val[0], :key => val[2] result diff --git a/lib/puppet/parser/resource.rb b/lib/puppet/parser/resource.rb index ace01bb4b..3bb5f8601 100644 --- a/lib/puppet/parser/resource.rb +++ b/lib/puppet/parser/resource.rb @@ -62,13 +62,30 @@ class Puppet::Parser::Resource < Puppet::Resource scope.environment end + # Process the stage metaparameter for a class. A containment edge + # is drawn from the class to the stage. The stage for containment + # defaults to main, if none is specified. + def add_edge_to_stage + return unless self.type.to_s.downcase == "class" + + unless stage = catalog.resource(:stage, self[:stage] || (scope && scope.resource && scope.resource[:stage]) || :main) + raise ArgumentError, "Could not find stage #{self[:stage] || :main} specified by #{self}" + end + + self[:stage] ||= stage.title unless stage.title == :main + catalog.add_edge(stage, self) + end + # Retrieve the associated definition and evaluate it. def evaluate return if evaluated? @evaluated = true if klass = resource_type and ! builtin_type? finish - return klass.evaluate_code(self) + evaluated_code = klass.evaluate_code(self) + add_edge_to_stage + + return evaluated_code elsif builtin? devfail "Cannot evaluate a builtin type (#{type})" else diff --git a/lib/puppet/parser/scope.rb b/lib/puppet/parser/scope.rb index a8bb4418a..ed67cd141 100644 --- a/lib/puppet/parser/scope.rb +++ b/lib/puppet/parser/scope.rb @@ -101,7 +101,7 @@ class Puppet::Parser::Scope # Remove this when rebasing def environment - compiler.environment + compiler ? compiler.environment : nil end def find_hostclass(name) @@ -443,6 +443,6 @@ class Puppet::Parser::Scope def extend_with_functions_module extend Puppet::Parser::Functions.environment_module(Puppet::Node::Environment.root) - extend Puppet::Parser::Functions.environment_module(compiler ? environment : nil) + extend Puppet::Parser::Functions.environment_module(environment) end end diff --git a/lib/puppet/provider/mount/parsed.rb b/lib/puppet/provider/mount/parsed.rb index 11c5e21a9..8d48dad57 100755 --- a/lib/puppet/provider/mount/parsed.rb +++ b/lib/puppet/provider/mount/parsed.rb @@ -18,7 +18,7 @@ Puppet::Type.type(:mount).provide( commands :mountcmd => "mount", :umount => "umount" - case Facter["operatingsystem"] + case Facter.value(:operatingsystem) when "Solaris" @fields = [:device, :blockdevice, :name, :fstype, :pass, :atboot, :options] else @@ -47,6 +47,24 @@ Puppet::Type.type(:mount).provide( end end + def self.instances + providers = super + mounts = mountinstances.dup + + # Update fstab entries that are mounted + providers.each do |prov| + if mounts.delete({:name => prov.get(:name), :mounted => :yes}) then + prov.set(:ensure => :mounted) + end + end + + # Add mounts that are not in fstab but mounted + mounts.each do |mount| + providers << new(:ensure => :ghost, :name => mount[:name]) + end + providers + end + def self.prefetch(resources = nil) # Get providers for all resources the user defined and that match # a record in /etc/fstab. diff --git a/lib/puppet/provider/naginator.rb b/lib/puppet/provider/naginator.rb index 5c610fb31..17cc24086 100644 --- a/lib/puppet/provider/naginator.rb +++ b/lib/puppet/provider/naginator.rb @@ -30,7 +30,15 @@ class Puppet::Provider::Naginator < Puppet::Provider::ParsedFile end def self.to_file(records) - header + records.collect { |record| record.to_s }.join("\n").gsub("_naginator_name", NAME_STRING) + header + records.collect { |record| + # Remap the TYPE_name or _naginator_name params to the + # name if the record is a template (register == 0) + if record.to_s =~ /register\s+0/ + record.to_s.sub("_naginator_name", "name").sub(record.type.to_s + "_name", "name") + else + record.to_s.sub("_naginator_name", NAME_STRING) + end + }.join("\n") end def self.skip_record?(record) diff --git a/lib/puppet/provider/nameservice/directoryservice.rb b/lib/puppet/provider/nameservice/directoryservice.rb index c1139a679..35ac8d76a 100644 --- a/lib/puppet/provider/nameservice/directoryservice.rb +++ b/lib/puppet/provider/nameservice/directoryservice.rb @@ -221,11 +221,12 @@ class DirectoryService < Puppet::Provider::NameService # have a lot of choice. Ultimately this should all be done using Ruby # to access the DirectoryService APIs directly, but that's simply not # feasible for a while yet. - case self.get_macosx_version_major - when "10.4" - dscl_plist = self.parse_dscl_url_data(dscl_output) - when "10.5", "10.6" + if self.get_macosx_version_major > "10.4" dscl_plist = self.parse_dscl_plist_data(dscl_output) + elsif self.get_macosx_version_major == "10.4" + dscl_plist = self.parse_dscl_url_data(dscl_output) + else + fail("Puppet does not support OS X versions < 10.4") end self.generate_attribute_hash(dscl_plist, *type_properties) @@ -243,12 +244,14 @@ class DirectoryService < Puppet::Provider::NameService # different format for the -url output with objects with spaces in # their values. *sigh*. Use -url for 10.4 in the hope this can be # deprecated one day, and use -plist for 10.5 and higher. - case self.get_macosx_version_major - when "10.4" - command_vector = [ command(:dscl), "-url", "." ] - when "10.5", "10.6" + if self.get_macosx_version_major > "10.4" command_vector = [ command(:dscl), "-plist", "." ] + elsif self.get_macosx_version_major == "10.4" + command_vector = [ command(:dscl), "-url", "." ] + else + fail("Puppet does not support OS X versions < 10.4") end + # JJM: The actual action to perform. See "man dscl" # Common actiosn: -create, -delete, -merge, -append, -passwd command_vector << ds_action diff --git a/lib/puppet/provider/network_device.rb b/lib/puppet/provider/network_device.rb index b178df977..46be27968 100644 --- a/lib/puppet/provider/network_device.rb +++ b/lib/puppet/provider/network_device.rb @@ -65,4 +65,4 @@ class Puppet::Provider::NetworkDevice < Puppet::Provider def properties @property_hash.dup end -end
\ No newline at end of file +end diff --git a/lib/puppet/provider/package/aptitude.rb b/lib/puppet/provider/package/aptitude.rb index 8bdf984e6..2eafd3ef8 100755 --- a/lib/puppet/provider/package/aptitude.rb +++ b/lib/puppet/provider/package/aptitude.rb @@ -12,6 +12,7 @@ Puppet::Type.type(:package).provide :aptitude, :parent => :apt, :source => :dpkg args.flatten! # Apparently aptitude hasn't always supported a -q flag. args.delete("-q") if args.include?("-q") + args.delete("--force-yes") if args.include?("--force-yes") output = aptitude(*args) # Yay, stupid aptitude doesn't throw an error when the package is missing. diff --git a/lib/puppet/provider/ssh_authorized_key/parsed.rb b/lib/puppet/provider/ssh_authorized_key/parsed.rb index 6a3855c0e..81b1fbcfa 100644 --- a/lib/puppet/provider/ssh_authorized_key/parsed.rb +++ b/lib/puppet/provider/ssh_authorized_key/parsed.rb @@ -42,12 +42,6 @@ require 'puppet/provider/parsedfile' 0600 end - def target - @resource.should(:target) || File.expand_path("~#{@resource.should(:user)}/.ssh/authorized_keys") - rescue - raise Puppet::Error, "Target not defined and/or specified user does not exist yet" - end - def user uid = File.stat(target).uid Etc.getpwuid(uid).name diff --git a/lib/puppet/rails/host.rb b/lib/puppet/rails/host.rb index b9dea2a3d..e5360217c 100644 --- a/lib/puppet/rails/host.rb +++ b/lib/puppet/rails/host.rb @@ -1,3 +1,4 @@ +require 'puppet/node/environment' require 'puppet/rails' require 'puppet/rails/resource' require 'puppet/rails/fact_name' @@ -28,6 +29,12 @@ class Puppet::Rails::Host < ActiveRecord::Base host end + # Override the setter for environment to force it to be a string, lest it + # be YAML encoded. See #4487. + def environment=(value) + super value.to_s + end + # returns a hash of fact_names.name => [ fact_values ] for this host. # Note that 'fact_values' is actually a list of the value instances, not # just actual values. diff --git a/lib/puppet/type/file.rb b/lib/puppet/type/file.rb index 715836b22..1790c5e92 100644 --- a/lib/puppet/type/file.rb +++ b/lib/puppet/type/file.rb @@ -257,11 +257,17 @@ Puppet::Type.newtype(:file) do newvalues(:first, :all) end - # Autorequire any parent directories. + # Autorequire the nearest ancestor directory found in the catalog. autorequire(:file) do basedir = ::File.dirname(self[:path]) if basedir != self[:path] - basedir + parents = [] + until basedir == parents.last + parents << basedir + basedir = File.dirname(basedir) + end + # The filename of the first ancestor found, or nil + parents.find { |dir| catalog.resource(:file, dir) } else nil end diff --git a/lib/puppet/type/ssh_authorized_key.rb b/lib/puppet/type/ssh_authorized_key.rb index 8338e2d64..170dc8383 100644 --- a/lib/puppet/type/ssh_authorized_key.rb +++ b/lib/puppet/type/ssh_authorized_key.rb @@ -14,6 +14,10 @@ module Puppet system-wide primary key and therefore has to be unique." isnamevar + + validate do |value| + raise Puppet::Error, "Resourcename must not contain whitespace: #{value}" if value =~ /\s/ + end end newproperty(:type) do @@ -28,6 +32,10 @@ module Puppet newproperty(:key) do desc "The key itself; generally a long string of hex digits." + + validate do |value| + raise Puppet::Error, "Key must not contain whitespace: #{value}" if value =~ /\s/ + end end newproperty(:user) do @@ -82,6 +90,10 @@ module Puppet value.join(",") end end + + validate do |value| + raise Puppet::Error, "Options must be provided as an array, not a comma separated list" if value != :absent and value.include?(',') + end end autorequire(:user) do diff --git a/lib/puppet/util/network_device.rb b/lib/puppet/util/network_device.rb index a650670ce..7fb8e2ff3 100644 --- a/lib/puppet/util/network_device.rb +++ b/lib/puppet/util/network_device.rb @@ -10,8 +10,8 @@ class Puppet::Util::NetworkDevice raise "Can't load #{device.provider} for #{device.name}: #{detail}" end - # for tests reset - def self.clear + # Should only be used in tests + def self.teardown @current = nil end -end
\ No newline at end of file +end diff --git a/spec/integration/parser/parser_spec.rb b/spec/integration/parser/parser_spec.rb index 65c9ee302..b55aa04ce 100755 --- a/spec/integration/parser/parser_spec.rb +++ b/spec/integration/parser/parser_spec.rb @@ -117,5 +117,36 @@ describe Puppet::Parser::Parser do $out = $hash['a']['b']['c'] }.should parse_with { |v| v.value.is_a?(Puppet::Parser::AST::ASTHash) } end + + it "should fail if asked to parse '$foo::::bar'" do + expect { @parser.parse("$foo::::bar") }.should raise_error(Puppet::ParseError, /Syntax error at ':'/) + end + + describe "function calls" do + it "should be able to pass an array to a function" do + "my_function([1,2,3])".should parse_with { |fun| + fun.is_a?(Puppet::Parser::AST::Function) && + fun.arguments.first.evaluate(stub 'scope') == ['1','2','3'] + } + end + + it "should be able to pass a hash to a function" do + "my_function({foo => bar})".should parse_with { |fun| + fun.is_a?(Puppet::Parser::AST::Function) && + fun.arguments.first.evaluate(stub 'scope') == {'foo' => 'bar'} + } + end + end + + describe "collections" do + it "should find resources according to an expression" do + %q{ + File <| mode == 0700 + 0050 + 0050 |> + }.should parse_with { |coll| + coll.is_a?(Puppet::Parser::AST::Collection) && + coll.query.evaluate(stub 'scope').first == "param_values.value = '528' and param_names.name = 'mode'" + } + end + end end end diff --git a/spec/integration/provider/ssh_authorized_key_spec.rb b/spec/integration/provider/ssh_authorized_key_spec.rb new file mode 100644 index 000000000..902f9ad22 --- /dev/null +++ b/spec/integration/provider/ssh_authorized_key_spec.rb @@ -0,0 +1,207 @@ +#!/usr/bin/env ruby + +require 'spec_helper' +require 'puppet/file_bucket/dipper' + +describe "ssh_authorized_key provider (integration)" do + include PuppetSpec::Files + + before :each do + @fake_userfile = tmpfile('authorized_keys.user') + @fake_rootfile = tmpfile('authorized_keys.root') + + # few testkeys generated with ssh-keygen + @sample_rsa_keys = [ + 'AAAAB3NzaC1yc2EAAAADAQABAAAAgQCi18JBZOq10X3w4f67nVhO0O3s5Y1vHH4UgMSM3ZnQwbC5hjGyYSi9UULOoQQoQynI/a0I9NL423/Xk/XJVIKCHcS8q6V2Wmjd+fLNelOjxxoW6mbIytEt9rDvwgq3Mof3/m21L3t2byvegR00a+ikKbmInPmKwjeWZpexCIsHzQ==', # 1024 bit + 'AAAAB3NzaC1yc2EAAAADAQABAAAAgQDLClyvi3CsJw5Id6khZs2/+s11qOH4Gdp6iDioDsrIp0m8kSiPr71VGyQYAfPzzvHemHS7Xg0NkG1Kc8u9tRqBQfTvz7ubq0AT/g01+4P2hQ/soFkuwlUG/HVnnaYb6N0Qp5SHWvD5vBE2nFFQVpP5GrSctPtHSjzJq/i+6LYhmQ==', # 1024 bit + 'AAAAB3NzaC1yc2EAAAADAQABAAABAQDLygAO6txXkh9FNV8xSsBkATeqLbHzS7sFjGI3gt0Dx6q3LjyKwbhQ1RLf28kd5G6VWiXmClU/RtiPdUz8nrGuun++2mrxzrXrvpR9dq1lygLQ2wn2cI35dN5bjRMtXy3decs6HUhFo9MoNwX250rUWfdCyNPhGIp6OOfmjdy+UeLGNxq9wDx6i4bT5tVVSqVRtsEfw9+ICXchzl85QudjneVVpP+thriPZXfXA5eaGwAo/dmoKOIhUwF96gpdLqzNtrGQuxPbV80PTbGv9ZtAtTictxaDz8muXO7he9pXmchUpxUKtMFjHkL0FAZ9tRPmv3RA30sEr2fZ8+LKvnE50w0' #2048 Bit + ] + @sample_dsa_keys = [ + 'AAAAB3NzaC1kc3MAAACBAOPck2O8MIDSqxPSnvENt6tzRrKJ5oOhB6Nc6oEcWm+VEH1gvuxdiRqwoMgRwyEf1yUd+UAcLw3a6Jn+EtFyEBN/5WF+4Tt4xTxZ0Pfik2Wc5uqHbQ2dkmOoXiAOYPiD3JUQ1Xwm/J0CgetjitoLfzAGdCNhMqguqAuHcVJ78ZZbAAAAFQCIBKFYZ+I18I+dtgteirXh+VVEEwAAAIEAs1yvQ/wnLLrRCM660pF4kBiw3D6dJfMdCXWQpn0hZmkBQSIzZv4Wuk3giei5luxscDxNc+y3CTXtnyG4Kt1Yi2sOdvhRI3rX8tD+ejn8GHazM05l5VIo9uu4AQPIE32iV63IqgApSBbJ6vDJW91oDH0J492WdLCar4BS/KE3cRwAAACBAN0uSDyJqYLRsfYcFn4HyVf6TJxQm1IcwEt6GcJVzgjri9VtW7FqY5iBqa9B9Zdh5XXAYJ0XLsWQCcrmMHM2XGHGpA4gL9VlCJ/0QvOcXxD2uK7IXwAVUA7g4V4bw8EVnFv2Flufozhsp+4soo1xiYc5jiFVHwVlk21sMhAtKAeF' # 1024 Bit + ] + + @sample_lines = [ + "ssh-rsa #{@sample_rsa_keys[1]} root@someotherhost", + "ssh-dss #{@sample_dsa_keys[0]} root@anywhere", + "ssh-rsa #{@sample_rsa_keys[2]} paul" + ] + + end + + after :each do + Puppet::Type::Ssh_authorized_key::ProviderParsed.clear # Work around bug #6628 + end + + def create_fake_key(username, content) + filename = (username == :root ? @fake_rootfile : @fake_userfile ) + File.open(filename, 'w') do |f| + content.each do |line| + f.puts line + end + end + end + + def check_fake_key(username, expected_content) + filename = (username == :root ? @fake_rootfile : @fake_userfile ) + content = File.readlines(filename).map(&:chomp).sort.reject{ |x| x =~ /^#|^$/ } + content.join("\n").should == expected_content.sort.join("\n") + end + + def run_in_catalog(*resources) + Puppet::FileBucket::Dipper.any_instance.stubs(:backup) # Don't backup to the filebucket + catalog = Puppet::Resource::Catalog.new + catalog.host_config = false + resources.each do |resource| + resource.expects(:err).never + catalog.add_resource(resource) + end + catalog.apply + end + + describe "when managing one resource" do + + before :each do + # We are not running as root so chown/chmod is not possible + File.stubs(:chown) + File.stubs(:chmod) + Puppet::Util::SUIDManager.stubs(:asuser).yields + end + + describe "with ensure set to absent" do + + before :each do + @example = Puppet::Type.type(:ssh_authorized_key).new( + :name => 'root@hostname', + :type => :rsa, + :key => @sample_rsa_keys[0], + :target => @fake_rootfile, + :user => 'root', + :ensure => :absent + ) + end + + it "should not modify root's keyfile if resource is currently not present" do + create_fake_key(:root, @sample_lines) + run_in_catalog(@example) + check_fake_key(:root, @sample_lines) + end + + it "remove the key from root's keyfile if resource is currently present" do + create_fake_key(:root, @sample_lines + ["ssh-rsa #{@sample_rsa_keys[0]} root@hostname"]) + run_in_catalog(@example) + check_fake_key(:root, @sample_lines) + end + + end + + describe "when ensure is present" do + + before :each do + @example = Puppet::Type.type(:ssh_authorized_key).new( + :name => 'root@hostname', + :type => :rsa, + :key => @sample_rsa_keys[0], + :target => @fake_rootfile, + :user => 'root', + :ensure => :present + ) + + # just a dummy so the parsedfile provider is aware + # of the user's authorized_keys file + @dummy = Puppet::Type.type(:ssh_authorized_key).new( + :name => 'dummy', + :target => @fake_userfile, + :user => 'nobody', + :ensure => :absent + ) + end + + it "should add the key if it is not present" do + create_fake_key(:root, @sample_lines) + run_in_catalog(@example) + check_fake_key(:root, @sample_lines + ["ssh-rsa #{@sample_rsa_keys[0]} root@hostname" ]) + end + + it "should modify the type if type is out of sync" do + create_fake_key(:root,@sample_lines + [ "ssh-dss #{@sample_rsa_keys[0]} root@hostname" ]) + run_in_catalog(@example) + check_fake_key(:root, @sample_lines + [ "ssh-rsa #{@sample_rsa_keys[0]} root@hostname" ]) + end + + it "should modify the key if key is out of sync" do + create_fake_key(:root,@sample_lines + [ "ssh-rsa #{@sample_rsa_keys[1]} root@hostname" ]) + run_in_catalog(@example) + check_fake_key(:root, @sample_lines + [ "ssh-rsa #{@sample_rsa_keys[0]} root@hostname" ]) + end + + it "should remove the key from old file if target is out of sync" do + create_fake_key(:user, [ @sample_lines[0], "ssh-rsa #{@sample_rsa_keys[0]} root@hostname" ]) + create_fake_key(:root, [ @sample_lines[1], @sample_lines[2] ]) + run_in_catalog(@example, @dummy) + check_fake_key(:user, [ @sample_lines[0] ]) + #check_fake_key(:root, [ @sample_lines[1], @sample_lines[2], "ssh-rsa #{@sample_rsa_keys[0]} root@hostname" ]) + end + + it "should add the key to new file if target is out of sync" do + create_fake_key(:user, [ @sample_lines[0], "ssh-rsa #{@sample_rsa_keys[0]} root@hostname" ]) + create_fake_key(:root, [ @sample_lines[1], @sample_lines[2] ]) + run_in_catalog(@example, @dummy) + #check_fake_key(:user, [ @sample_lines[0] ]) + check_fake_key(:root, [ @sample_lines[1], @sample_lines[2], "ssh-rsa #{@sample_rsa_keys[0]} root@hostname" ]) + end + + it "should modify options if options are out of sync" do + @example[:options]=[ 'from="correct.domain.com"', 'no-port-forwarding', 'no-pty' ] + create_fake_key(:root, @sample_lines + [ "from=\"incorrect.domain.com\",no-port-forwarding,no-pty ssh-rsa #{@sample_rsa_keys[0]} root@hostname"]) + run_in_catalog(@example) + check_fake_key(:root, @sample_lines + [ "from=\"correct.domain.com\",no-port-forwarding,no-pty ssh-rsa #{@sample_rsa_keys[0]} root@hostname"] ) + end + + end + + end + + describe "when managing two resource" do + + before :each do + # We are not running as root so chown/chmod is not possible + File.stubs(:chown) + File.stubs(:chmod) + Puppet::Util::SUIDManager.stubs(:asuser).yields + @example_one = Puppet::Type.type(:ssh_authorized_key).new( + :name => 'root@hostname', + :type => :rsa, + :key => @sample_rsa_keys[0], + :target => @fake_rootfile, + :user => 'root', + :ensure => :present + ) + + @example_two = Puppet::Type.type(:ssh_authorized_key).new( + :name => 'user@hostname', + :key => @sample_rsa_keys[1], + :type => :rsa, + :target => @fake_userfile, + :user => 'nobody', + :ensure => :present + ) + end + + describe "and both keys are absent" do + + before :each do + create_fake_key(:root, @sample_lines) + create_fake_key(:user, @sample_lines) + end + + it "should add both keys" do + run_in_catalog(@example_one, @example_two) + check_fake_key(:root, @sample_lines + [ "ssh-rsa #{@sample_rsa_keys[0]} root@hostname" ]) + check_fake_key(:user, @sample_lines + [ "ssh-rsa #{@sample_rsa_keys[1]} user@hostname" ]) + end + + end + + end + +end diff --git a/spec/unit/application/agent_spec.rb b/spec/unit/application/agent_spec.rb index 2e946e6bb..c4f8e7176 100755 --- a/spec/unit/application/agent_spec.rb +++ b/spec/unit/application/agent_spec.rb @@ -411,7 +411,7 @@ describe Puppet::Application::Agent do it "should exit if no authorization file" do Puppet.stubs(:err) - FileTest.stubs(:exists?).with(Puppet[:authconfig]).returns(false) + FileTest.stubs(:exists?).with(Puppet[:rest_authconfig]).returns(false) expect { @puppetd.setup_listen }.to exit_with 14 end diff --git a/spec/unit/application/device_spec.rb b/spec/unit/application/device_spec.rb index df8cd3eaf..464827e3c 100755 --- a/spec/unit/application/device_spec.rb +++ b/spec/unit/application/device_spec.rb @@ -1,6 +1,5 @@ -#!/usr/bin/env ruby - -require File.dirname(__FILE__) + '/../../spec_helper' +#!/usr/bin/env rspec +require 'spec_helper' require 'puppet/application/device' require 'puppet/util/network_device/config' diff --git a/spec/unit/indirector/exec_spec.rb b/spec/unit/indirector/exec_spec.rb index 1050ed4cc..87778cdeb 100755 --- a/spec/unit/indirector/exec_spec.rb +++ b/spec/unit/indirector/exec_spec.rb @@ -32,22 +32,22 @@ describe Puppet::Indirector::Exec do end it "should execute the command with the object name as the only argument" do - @searcher.expects(:execute).with(%w{/echo foo}) + @searcher.expects(:execute).with(%w{/echo foo}, :combine => false) @searcher.find(@request) end it "should return the output of the script" do - @searcher.expects(:execute).with(%w{/echo foo}).returns("whatever") + @searcher.expects(:execute).with(%w{/echo foo}, :combine => false).returns("whatever") @searcher.find(@request).should == "whatever" end it "should return nil when the command produces no output" do - @searcher.expects(:execute).with(%w{/echo foo}).returns(nil) + @searcher.expects(:execute).with(%w{/echo foo}, :combine => false).returns(nil) @searcher.find(@request).should be_nil end it "should raise an exception if there's an execution failure" do - @searcher.expects(:execute).with(%w{/echo foo}).raises(Puppet::ExecutionFailure.new("message")) + @searcher.expects(:execute).with(%w{/echo foo}, :combine => false).raises(Puppet::ExecutionFailure.new("message")) lambda {@searcher.find(@request)}.should raise_exception(Puppet::Error, 'Failed to find foo via exec: message') end diff --git a/spec/unit/indirector/facts/network_device_spec.rb b/spec/unit/indirector/facts/network_device_spec.rb index 302a810e8..93cd35d77 100644..100755 --- a/spec/unit/indirector/facts/network_device_spec.rb +++ b/spec/unit/indirector/facts/network_device_spec.rb @@ -1,9 +1,5 @@ -#!/usr/bin/env ruby -# -# Created by Luke Kanies on 2007-9-23. -# Copyright (c) 2007. All rights reserved. - -require File.dirname(__FILE__) + '/../../../spec_helper' +#!/usr/bin/env rspec +require 'spec_helper' require 'puppet/indirector/facts/network_device' diff --git a/spec/unit/indirector/node/exec_spec.rb b/spec/unit/indirector/node/exec_spec.rb index f14990cd5..1dbfcd13a 100755 --- a/spec/unit/indirector/node/exec_spec.rb +++ b/spec/unit/indirector/node/exec_spec.rb @@ -31,7 +31,7 @@ describe Puppet::Node::Exec do @result = {} # Use a local variable so the reference is usable in the execute definition. result = @result - @searcher.meta_def(:execute) do |command| + @searcher.meta_def(:execute) do |command, arguments| return YAML.dump(result) end diff --git a/spec/unit/parser/compiler_spec.rb b/spec/unit/parser/compiler_spec.rb index 9ad754ad8..fcce9f6f4 100755 --- a/spec/unit/parser/compiler_spec.rb +++ b/spec/unit/parser/compiler_spec.rb @@ -32,6 +32,14 @@ class CompilerTestResource def evaluate end + + def file + "/fake/file/goes/here" + end + + def line + "42" + end end describe Puppet::Parser::Compiler do @@ -420,52 +428,6 @@ describe Puppet::Parser::Compiler do @compiler.catalog.should be_edge(@scope.resource, resource) end - it "should add an edge to any specified stage for class resources" do - other_stage = resource(:stage, "other") - @compiler.add_resource(@scope, other_stage) - resource = resource(:class, "foo") - resource[:stage] = 'other' - - @compiler.add_resource(@scope, resource) - - @compiler.catalog.edge?(other_stage, resource).should be_true - end - - it "should fail if a non-class resource attempts to set a stage" do - other_stage = resource(:stage, "other") - @compiler.add_resource(@scope, other_stage) - resource = resource(:file, "foo") - resource[:stage] = 'other' - - lambda { @compiler.add_resource(@scope, resource) }.should raise_error(ArgumentError) - end - - it "should fail if an unknown stage is specified" do - resource = resource(:class, "foo") - resource[:stage] = 'other' - - lambda { @compiler.add_resource(@scope, resource) }.should raise_error(ArgumentError) - end - - it "should add edges from the class resources to the parent's stage if no stage is specified" do - main = @compiler.catalog.resource(:stage, :main) - foo_stage = resource(:stage, :foo_stage) - @compiler.add_resource(@scope, foo_stage) - resource = resource(:class, "foo") - @scope.stubs(:resource).returns(:stage => :foo_stage) - @compiler.add_resource(@scope, resource) - - @compiler.catalog.should be_edge(foo_stage, resource) - end - - it "should add edges from top-level class resources to the main stage if no stage is specified" do - main = @compiler.catalog.resource(:stage, :main) - resource = resource(:class, "foo") - @compiler.add_resource(@scope, resource) - - @compiler.catalog.should be_edge(main, resource) - end - it "should not add non-class resources that don't specify a stage to the 'main' stage" do main = @compiler.catalog.resource(:stage, :main) resource = resource(:file, "foo") diff --git a/spec/unit/parser/lexer_spec.rb b/spec/unit/parser/lexer_spec.rb index 6cdb0553a..48f7304b4 100755 --- a/spec/unit/parser/lexer_spec.rb +++ b/spec/unit/parser/lexer_spec.rb @@ -230,22 +230,6 @@ describe Puppet::Parser::Lexer::TOKENS do end end -describe Puppet::Parser::Lexer::TOKENS[:CLASSNAME] do - before { @token = Puppet::Parser::Lexer::TOKENS[:CLASSNAME] } - - it "should match against lower-case alpha-numeric terms separated by double colons" do - @token.regex.should =~ "one::two" - end - - it "should match against many lower-case alpha-numeric terms separated by double colons" do - @token.regex.should =~ "one::two::three::four::five" - end - - it "should match against lower-case alpha-numeric terms prefixed by double colons" do - @token.regex.should =~ "::one" - end -end - describe Puppet::Parser::Lexer::TOKENS[:CLASSREF] do before { @token = Puppet::Parser::Lexer::TOKENS[:CLASSREF] } @@ -295,6 +279,22 @@ describe Puppet::Parser::Lexer::TOKENS[:NAME] do Puppet::Parser::Lexer::KEYWORDS.expects(:lookup).returns(keyword) @token.convert(stub('lexer'), "false").should == [Puppet::Parser::Lexer::TOKENS[:BOOLEAN], false] end + + it "should match against lower-case alpha-numeric terms separated by double colons" do + @token.regex.should =~ "one::two" + end + + it "should match against many lower-case alpha-numeric terms separated by double colons" do + @token.regex.should =~ "one::two::three::four::five" + end + + it "should match against lower-case alpha-numeric terms prefixed by double colons" do + @token.regex.should =~ "::one" + end + + it "should match against nested terms starting with numbers" do + @token.regex.should =~ "::1one::2two::3three" + end end describe Puppet::Parser::Lexer::TOKENS[:NUMBER] do @@ -445,6 +445,9 @@ describe Puppet::Parser::Lexer,"when lexing strings" do %q["foo$bar$"] => [[:DQPRE,"foo"],[:VARIABLE,"bar"],[:DQPOST,"$"]], %q["foo$$bar"] => [[:DQPRE,"foo$"],[:VARIABLE,"bar"],[:DQPOST,""]], %q[""] => [[:STRING,""]], + %q["123 456 789 0"] => [[:STRING,"123 456 789 0"]], + %q["${123} 456 $0"] => [[:DQPRE,""],[:VARIABLE,"123"],[:DQMID," 456 "],[:VARIABLE,"0"],[:DQPOST,""]], + %q["$foo::::bar"] => [[:DQPRE,""],[:VARIABLE,"foo"],[:DQPOST,"::::bar"]] }.each { |src,expected_result| it "should handle #{src} correctly" do tokens_scanned_from(src).should be_like(*expected_result) @@ -660,10 +663,17 @@ describe "Puppet::Parser::Lexer in the old tests" do end it "should correctly lex variables" do - ["$variable", "$::variable", "$qualified::variable", "$further::qualified::variable"].each do |string| + ["$variable", "$::variable", "$qualified::variable", "$further::qualified::variable", "$hyphenated-variable", "$-variable-with-leading-dash"].each do |string| tokens_scanned_from(string).should be_like([:VARIABLE,string.sub(/^\$/,'')]) end end + + it "should not include whitespace in a variable" do + tokens_scanned_from("$foo bar").should_not be_like([:VARIABLE, "foo bar"]) + end + it "should not include excess colons in a variable" do + tokens_scanned_from("$foo::::bar").should_not be_like([:VARIABLE, "foo::::bar"]) + end end describe "Puppet::Parser::Lexer in the old tests when lexing example files" do diff --git a/spec/unit/parser/resource_spec.rb b/spec/unit/parser/resource_spec.rb index 064f27514..365c4e9c5 100755 --- a/spec/unit/parser/resource_spec.rb +++ b/spec/unit/parser/resource_spec.rb @@ -131,9 +131,19 @@ describe Puppet::Parser::Resource do end describe "when evaluating" do + before do + @node = Puppet::Node.new "test-node" + @compiler = Puppet::Parser::Compiler.new @node + @catalog = Puppet::Resource::Catalog.new + source = stub('source') + source.stubs(:module_name) + @scope = Puppet::Parser::Scope.new(:compiler => @compiler, :source => source) + @catalog.add_resource(Puppet::Parser::Resource.new("stage", :main, :scope => @scope)) + end + it "should evaluate the associated AST definition" do definition = newdefine "mydefine" - res = Puppet::Parser::Resource.new("mydefine", "whatever", :scope => @scope, :source => @source) + res = Puppet::Parser::Resource.new("mydefine", "whatever", :scope => @scope, :source => @source, :catalog => @catalog) definition.expects(:evaluate_code).with(res) res.evaluate @@ -141,17 +151,65 @@ describe Puppet::Parser::Resource do it "should evaluate the associated AST class" do @class = newclass "myclass" - res = Puppet::Parser::Resource.new("class", "myclass", :scope => @scope, :source => @source) + res = Puppet::Parser::Resource.new("class", "myclass", :scope => @scope, :source => @source, :catalog => @catalog) @class.expects(:evaluate_code).with(res) res.evaluate end it "should evaluate the associated AST node" do nodedef = newnode("mynode") - res = Puppet::Parser::Resource.new("node", "mynode", :scope => @scope, :source => @source) + res = Puppet::Parser::Resource.new("node", "mynode", :scope => @scope, :source => @source, :catalog => @catalog) nodedef.expects(:evaluate_code).with(res) res.evaluate end + + it "should add an edge to any specified stage for class resources" do + @compiler.known_resource_types.add Puppet::Resource::Type.new(:hostclass, "foo", '') + + other_stage = Puppet::Parser::Resource.new(:stage, "other", :scope => @scope, :catalog => @catalog) + @compiler.add_resource(@scope, other_stage) + resource = Puppet::Parser::Resource.new(:class, "foo", :scope => @scope, :catalog => @catalog) + resource[:stage] = 'other' + @compiler.add_resource(@scope, resource) + + resource.evaluate + + @compiler.catalog.edge?(other_stage, resource).should be_true + end + + it "should fail if an unknown stage is specified" do + @compiler.known_resource_types.add Puppet::Resource::Type.new(:hostclass, "foo", '') + + resource = Puppet::Parser::Resource.new(:class, "foo", :scope => @scope, :catalog => @catalog) + resource[:stage] = 'other' + + lambda { resource.evaluate }.should raise_error(ArgumentError, /Could not find stage other specified by/) + end + + it "should add edges from the class resources to the parent's stage if no stage is specified" do + main = @compiler.catalog.resource(:stage, :main) + foo_stage = Puppet::Parser::Resource.new(:stage, :foo_stage, :scope => @scope, :catalog => @catalog) + @compiler.add_resource(@scope, foo_stage) + @compiler.known_resource_types.add Puppet::Resource::Type.new(:hostclass, "foo", '') + resource = Puppet::Parser::Resource.new(:class, "foo", :scope => @scope, :catalog => @catalog) + resource[:stage] = 'foo_stage' + @compiler.add_resource(@scope, resource) + + resource.evaluate + + @compiler.catalog.should be_edge(foo_stage, resource) + end + + it "should add edges from top-level class resources to the main stage if no stage is specified" do + main = @compiler.catalog.resource(:stage, :main) + @compiler.known_resource_types.add Puppet::Resource::Type.new(:hostclass, "foo", '') + resource = Puppet::Parser::Resource.new(:class, "foo", :scope => @scope, :catalog => @catalog) + @compiler.add_resource(@scope, resource) + + resource.evaluate + + @compiler.catalog.should be_edge(main, resource) + end end describe "when finishing" do diff --git a/spec/unit/parser/scope_spec.rb b/spec/unit/parser/scope_spec.rb index bf4d1e29e..5308856ed 100755 --- a/spec/unit/parser/scope_spec.rb +++ b/spec/unit/parser/scope_spec.rb @@ -121,7 +121,11 @@ describe Puppet::Parser::Scope do def create_class_scope(name) klass = newclass(name) - Puppet::Parser::Resource.new("class", name, :scope => @scope, :source => mock('source')).evaluate + + catalog = Puppet::Resource::Catalog.new + catalog.add_resource(Puppet::Parser::Resource.new("stage", :main, :scope => Puppet::Parser::Scope.new)) + + Puppet::Parser::Resource.new("class", name, :scope => @scope, :source => mock('source'), :catalog => catalog).evaluate @scope.class_scope(klass) end diff --git a/spec/unit/provider/cisco_spec.rb b/spec/unit/provider/cisco_spec.rb index 08320731c..0696221c4 100644..100755 --- a/spec/unit/provider/cisco_spec.rb +++ b/spec/unit/provider/cisco_spec.rb @@ -1,6 +1,5 @@ -#!/usr/bin/env ruby - -require File.dirname(__FILE__) + '/../../spec_helper' +#!/usr/bin/env rspec +require 'spec_helper' require 'puppet/provider/cisco' @@ -13,4 +12,4 @@ describe Puppet::Provider::Cisco do Puppet::Util::NetworkDevice::Cisco::Device.expects(:new).returns :device Puppet::Provider::Cisco.device(:url).should == :device end -end
\ No newline at end of file +end diff --git a/spec/unit/provider/interface/cisco_spec.rb b/spec/unit/provider/interface/cisco_spec.rb index c18f87cf8..3d400ea4b 100755 --- a/spec/unit/provider/interface/cisco_spec.rb +++ b/spec/unit/provider/interface/cisco_spec.rb @@ -1,6 +1,5 @@ #!/usr/bin/env rspec - -require File.dirname(__FILE__) + '/../../../spec_helper' +require 'spec_helper' require 'puppet/provider/interface/cisco' diff --git a/spec/unit/provider/mount/parsed_spec.rb b/spec/unit/provider/mount/parsed_spec.rb index c38a3cfcb..7831dae3a 100755 --- a/spec/unit/provider/mount/parsed_spec.rb +++ b/spec/unit/provider/mount/parsed_spec.rb @@ -193,6 +193,47 @@ FSTAB my_fixtures('*.fstab').each do |fstab| platform = File.basename(fstab, '.fstab') + + describe "when calling instances on #{platform}" do + before :each do + if Facter[:operatingsystem] == "Solaris" then + platform == 'solaris' or + pending "We need to stub the operatingsystem fact at load time, but can't" + else + platform != 'solaris' or + pending "We need to stub the operatingsystem fact at load time, but can't" + end + + # Stub the mount output to our fixture. + begin + mount = my_fixture(platform + '.mount') + @provider.stubs(:mountcmd).returns File.read(mount) + rescue + pending "is #{platform}.mount missing at this point?" + end + + # Note: we have to stub default_target before creating resources + # because it is used by Puppet::Type::Mount.new to populate the + # :target property. + @provider.stubs(:default_target).returns fstab + @retrieve = @provider.instances.collect { |prov| {:name => prov.get(:name), :ensure => prov.get(:ensure)}} + end + + # Following mountpoint are present in all fstabs/mountoutputs + it "should include unmounted resources" do + @retrieve.should include(:name => '/', :ensure => :mounted) + end + + it "should include mounted resources" do + @retrieve.should include(:name => '/boot', :ensure => :unmounted) + end + + it "should include ghost resources" do + @retrieve.should include(:name => '/ghost', :ensure => :ghost) + end + + end + describe "when prefetching on #{platform}" do before :each do if Facter[:operatingsystem] == "Solaris" then diff --git a/spec/unit/provider/nameservice/directoryservice_spec.rb b/spec/unit/provider/nameservice/directoryservice_spec.rb index 47f2ad0cd..7a83d7f20 100755 --- a/spec/unit/provider/nameservice/directoryservice_spec.rb +++ b/spec/unit/provider/nameservice/directoryservice_spec.rb @@ -35,3 +35,63 @@ require 'spec_helper' end end end + +describe 'DirectoryService.single_report' do + it 'should fail on OS X < 10.4' do + Puppet::Provider::NameService::DirectoryService.stubs(:get_macosx_version_major).returns("10.3") + + lambda { + Puppet::Provider::NameService::DirectoryService.single_report('resource_name') + }.should raise_error(RuntimeError, "Puppet does not support OS X versions < 10.4") + end + + it 'should use url data on 10.4' do + Puppet::Provider::NameService::DirectoryService.stubs(:get_macosx_version_major).returns("10.4") + Puppet::Provider::NameService::DirectoryService.stubs(:get_ds_path).returns('Users') + Puppet::Provider::NameService::DirectoryService.stubs(:list_all_present).returns( + ['root', 'user1', 'user2', 'resource_name'] + ) + Puppet::Provider::NameService::DirectoryService.stubs(:generate_attribute_hash) + Puppet::Provider::NameService::DirectoryService.stubs(:execute) + Puppet::Provider::NameService::DirectoryService.expects(:parse_dscl_url_data) + + Puppet::Provider::NameService::DirectoryService.single_report('resource_name') + end + + it 'should use plist data on > 10.4' do + Puppet::Provider::NameService::DirectoryService.stubs(:get_macosx_version_major).returns("10.5") + Puppet::Provider::NameService::DirectoryService.stubs(:get_ds_path).returns('Users') + Puppet::Provider::NameService::DirectoryService.stubs(:list_all_present).returns( + ['root', 'user1', 'user2', 'resource_name'] + ) + Puppet::Provider::NameService::DirectoryService.stubs(:generate_attribute_hash) + Puppet::Provider::NameService::DirectoryService.stubs(:execute) + Puppet::Provider::NameService::DirectoryService.expects(:parse_dscl_plist_data) + + Puppet::Provider::NameService::DirectoryService.single_report('resource_name') + end +end + +describe 'DirectoryService.get_exec_preamble' do + it 'should fail on OS X < 10.4' do + Puppet::Provider::NameService::DirectoryService.stubs(:get_macosx_version_major).returns("10.3") + + lambda { + Puppet::Provider::NameService::DirectoryService.get_exec_preamble('-list') + }.should raise_error(RuntimeError, "Puppet does not support OS X versions < 10.4") + end + + it 'should use url data on 10.4' do + Puppet::Provider::NameService::DirectoryService.stubs(:get_macosx_version_major).returns("10.4") + Puppet::Provider::NameService::DirectoryService.stubs(:get_ds_path).returns('Users') + + Puppet::Provider::NameService::DirectoryService.get_exec_preamble('-list').should include("-url") + end + + it 'should use plist data on > 10.4' do + Puppet::Provider::NameService::DirectoryService.stubs(:get_macosx_version_major).returns("10.5") + Puppet::Provider::NameService::DirectoryService.stubs(:get_ds_path).returns('Users') + + Puppet::Provider::NameService::DirectoryService.get_exec_preamble('-list').should include("-plist") + end +end diff --git a/spec/unit/provider/network_device_spec.rb b/spec/unit/provider/network_device_spec.rb index e2a87cf4e..aae6ad68a 100755 --- a/spec/unit/provider/network_device_spec.rb +++ b/spec/unit/provider/network_device_spec.rb @@ -1,6 +1,5 @@ #!/usr/bin/env rspec - -require File.dirname(__FILE__) + '/../../spec_helper' +require 'spec_helper' require 'puppet/provider/network_device' require 'ostruct' diff --git a/spec/unit/provider/package/pkgutil_spec.rb b/spec/unit/provider/package/pkgutil_spec.rb index 5549b3f6d..dcae21250 100755 --- a/spec/unit/provider/package/pkgutil_spec.rb +++ b/spec/unit/provider/package/pkgutil_spec.rb @@ -1,6 +1,5 @@ -#!/usr/bin/env ruby - -require File.dirname(__FILE__) + '/../../../spec_helper' +#!/usr/bin/env rspec +require 'spec_helper' provider = Puppet::Type.type(:package).provider(:pkgutil) diff --git a/spec/unit/provider/ssh_authorized_key/parsed_spec.rb b/spec/unit/provider/ssh_authorized_key/parsed_spec.rb index 69d29c674..bd5e55a9e 100755 --- a/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +++ b/spec/unit/provider/ssh_authorized_key/parsed_spec.rb @@ -9,23 +9,19 @@ describe provider_class do include PuppetSpec::Files before :each do - @sshauthkey_class = Puppet::Type.type(:ssh_authorized_key) - @provider = @sshauthkey_class.provider(:parsed) @keyfile = tmpfile('authorized_keys') - @provider.any_instance.stubs(:target).returns @keyfile + @provider_class = provider_class + @provider_class.initvars + @provider_class.any_instance.stubs(:target).returns @keyfile @user = 'random_bob' Puppet::Util.stubs(:uid).with(@user).returns 12345 end - after :each do - @provider.initvars - end - def mkkey(args) args[:target] = @keyfile args[:user] = @user resource = Puppet::Type.type(:ssh_authorized_key).new(args) - key = @provider.new(resource) + key = @provider_class.new(resource) args.each do |p,v| key.send(p.to_s + "=", v) end @@ -33,26 +29,26 @@ describe provider_class do end def genkey(key) - @provider.stubs(:filetype).returns(Puppet::Util::FileType::FileTypeRam) + @provider_class.stubs(:filetype).returns(Puppet::Util::FileType::FileTypeRam) File.stubs(:chown) File.stubs(:chmod) Puppet::Util::SUIDManager.stubs(:asuser).yields key.flush - @provider.target_object(@keyfile).read + @provider_class.target_object(@keyfile).read end it_should_behave_like "all parsedfile providers", provider_class it "should be able to generate a basic authorized_keys file" do - key = mkkey(:name => "Just Testing", + key = mkkey(:name => "Just_Testing", :key => "AAAAfsfddsjldjgksdflgkjsfdlgkj", :type => "ssh-dss", :ensure => :present, :options => [:absent] ) - genkey(key).should == "ssh-dss AAAAfsfddsjldjgksdflgkjsfdlgkj Just Testing\n" + genkey(key).should == "ssh-dss AAAAfsfddsjldjgksdflgkjsfdlgkj Just_Testing\n" end it "should be able to generate a authorized_keys file with options" do @@ -71,25 +67,25 @@ describe provider_class do options = %w{from="host1.reductlivelabs.com,host.reductivelabs.com" command="/usr/local/bin/run" ssh-pty} optionstr = options.join(", ") - @provider.parse_options(optionstr).should == options + @provider_class.parse_options(optionstr).should == options end it "should use '' as name for entries that lack a comment" do line = "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAut8aOSxenjOqF527dlsdHWV4MNoAsX14l9M297+SQXaQ5Z3BedIxZaoQthkDALlV/25A1COELrg9J2MqJNQc8Xe9XQOIkBQWWinUlD/BXwoOTWEy8C8zSZPHZ3getMMNhGTBO+q/O+qiJx3y5cA4MTbw2zSxukfWC87qWwcZ64UUlegIM056vPsdZWFclS9hsROVEa57YUMrehQ1EGxT4Z5j6zIopufGFiAPjZigq/vqgcAqhAKP6yu4/gwO6S9tatBeEjZ8fafvj1pmvvIplZeMr96gHE7xS3pEEQqnB3nd4RY7AF6j9kFixnsytAUO7STPh/M3pLiVQBN89TvWPQ==" - @provider.parse(line)[0][:name].should == "" + @provider_class.parse(line)[0][:name].should == "" end end describe provider_class do before :each do - @resource = stub("resource", :name => "foo") - @resource.stubs(:[]).returns "foo" - @resource.class.stubs(:key_attributes).returns( [:name] ) + @resource = Puppet::Type.type(:ssh_authorized_key).new(:name => "foo", :user => "random_bob") @provider = provider_class.new(@resource) provider_class.stubs(:filetype).returns(Puppet::Util::FileType::FileTypeRam) Puppet::Util::SUIDManager.stubs(:asuser).yields + + provider_class.initvars end describe "when flushing" do @@ -103,9 +99,9 @@ describe provider_class do describe "and both a user and a target have been specified" do before :each do Puppet::Util.stubs(:uid).with("random_bob").returns 12345 - @resource.stubs(:should).with(:user).returns "random_bob" + @resource[:user] = "random_bob" target = "/tmp/.ssh_dir/place_to_put_authorized_keys" - @resource.stubs(:should).with(:target).returns target + @resource[:target] = target end it "should create the directory" do @@ -134,8 +130,7 @@ describe provider_class do describe "and a user has been specified with no target" do before :each do - @resource.stubs(:should).with(:user).returns "nobody" - @resource.stubs(:should).with(:target).returns nil + @resource[:user] = "nobody" # # I'd like to use random_bob here and something like # @@ -186,26 +181,20 @@ describe provider_class do end describe "and a target has been specified with no user" do - before :each do - @resource.stubs(:should).with(:user).returns nil - @resource.stubs(:should).with(:target).returns("/tmp/.ssh_dir/place_to_put_authorized_keys") - end - it "should raise an error" do + @resource = Puppet::Type.type(:ssh_authorized_key).new(:name => "foo", :target => "/tmp/.ssh_dir/place_to_put_authorized_keys") + @provider = provider_class.new(@resource) + proc { @provider.flush }.should raise_error end end describe "and a invalid user has been specified with no target" do - before :each do - @resource.stubs(:should).with(:user).returns "thisusershouldnotexist" - @resource.stubs(:should).with(:target).returns nil - end - it "should catch an exception and raise a Puppet error" do + @resource[:user] = "thisusershouldnotexist" + lambda { @provider.flush }.should raise_error(Puppet::Error) end end - end end diff --git a/spec/unit/provider/vlan/cisco_spec.rb b/spec/unit/provider/vlan/cisco_spec.rb index a67290eb4..4753cea21 100755 --- a/spec/unit/provider/vlan/cisco_spec.rb +++ b/spec/unit/provider/vlan/cisco_spec.rb @@ -1,6 +1,5 @@ #!/usr/bin/env rspec - -require File.dirname(__FILE__) + '/../../../spec_helper' +require 'spec_helper' require 'puppet/provider/vlan/cisco' diff --git a/spec/unit/rails/host_spec.rb b/spec/unit/rails/host_spec.rb index df0b2fa1d..98541c0a8 100755 --- a/spec/unit/rails/host_spec.rb +++ b/spec/unit/rails/host_spec.rb @@ -1,6 +1,8 @@ #!/usr/bin/env rspec require 'spec_helper' +require 'puppet/node/environment' + describe "Puppet::Rails::Host", :if => Puppet.features.rails? do def column(name, type) ActiveRecord::ConnectionAdapters::Column.new(name, nil, type, false) @@ -42,6 +44,12 @@ describe "Puppet::Rails::Host", :if => Puppet.features.rails? do Puppet::Rails::Host.from_puppet(@node) end + it "should stringify the environment" do + host = Puppet::Rails::Host.new + host.environment = Puppet::Node::Environment.new("production") + host.environment.class.should == String + end + it "should copy the ipaddress from the Puppet instance" do Puppet::Rails::Host.expects(:find_by_name).with("foo").returns @host diff --git a/spec/unit/type/file_spec.rb b/spec/unit/type/file_spec.rb index 4c58cc47a..3a01d09c1 100755 --- a/spec/unit/type/file_spec.rb +++ b/spec/unit/type/file_spec.rb @@ -168,6 +168,25 @@ describe Puppet::Type.type(:file) do reqs[0].target.must == file end + it "should autorequire its nearest ancestor directory" do + file = Puppet::Type::File.new(:path => "/foo/bar/baz") + dir = Puppet::Type::File.new(:path => "/foo") + root = Puppet::Type::File.new(:path => "/") + @catalog.add_resource file + @catalog.add_resource dir + @catalog.add_resource root + reqs = file.autorequire + reqs.length.must == 1 + reqs[0].source.must == dir + reqs[0].target.must == file + end + + it "should not autorequire anything when there is no nearest ancestor directory" do + file = Puppet::Type::File.new(:path => "/foo/bar/baz") + @catalog.add_resource file + file.autorequire.should be_empty + end + it "should not autorequire its parent dir if its parent dir is itself" do file = Puppet::Type::File.new(:path => "/") @catalog.add_resource file @@ -241,6 +260,25 @@ describe Puppet::Type.type(:file) do reqs[0].target.must == file end + it "should autorequire its nearest ancestor directory" do + file = Puppet::Type::File.new(:path => "X:/foo/bar/baz") + dir = Puppet::Type::File.new(:path => "X:/foo") + root = Puppet::Type::File.new(:path => "X:/") + @catalog.add_resource file + @catalog.add_resource dir + @catalog.add_resource root + reqs = file.autorequire + reqs.length.must == 1 + reqs[0].source.must == dir + reqs[0].target.must == file + end + + it "should not autorequire anything when there is no nearest ancestor directory" do + file = Puppet::Type::File.new(:path => "X:/foo/bar/baz") + @catalog.add_resource file + file.autorequire.should be_empty + end + it "should not autorequire its parent dir if its parent dir is itself" do file = Puppet::Type::File.new(:path => "X:/") @catalog.add_resource file @@ -302,6 +340,25 @@ describe Puppet::Type.type(:file) do reqs[0].target.must == file end + it "should autorequire its nearest ancestor directory" do + file = Puppet::Type::File.new(:path => "//server/foo/bar/baz/qux") + dir = Puppet::Type::File.new(:path => "//server/foo/bar") + root = Puppet::Type::File.new(:path => "//server/foo") + @catalog.add_resource file + @catalog.add_resource dir + @catalog.add_resource root + reqs = file.autorequire + reqs.length.must == 1 + reqs[0].source.must == dir + reqs[0].target.must == file + end + + it "should not autorequire anything when there is no nearest ancestor directory" do + file = Puppet::Type::File.new(:path => "//server/foo/bar/baz/qux") + @catalog.add_resource file + file.autorequire.should be_empty + end + it "should not autorequire its parent dir if its parent dir is itself" do file = Puppet::Type::File.new(:path => "//server/foo") @catalog.add_resource file diff --git a/spec/unit/type/interface_spec.rb b/spec/unit/type/interface_spec.rb index 12ba225d9..74e3257f6 100755 --- a/spec/unit/type/interface_spec.rb +++ b/spec/unit/type/interface_spec.rb @@ -1,6 +1,5 @@ #!/usr/bin/env rspec - -require File.dirname(__FILE__) + '/../../spec_helper' +require 'spec_helper' describe Puppet::Type.type(:interface) do diff --git a/spec/unit/type/ssh_authorized_key_spec.rb b/spec/unit/type/ssh_authorized_key_spec.rb index a5f167165..71b8a9ab0 100755 --- a/spec/unit/type/ssh_authorized_key_spec.rb +++ b/spec/unit/type/ssh_authorized_key_spec.rb @@ -16,115 +16,223 @@ describe ssh_authorized_key do @catalog = Puppet::Resource::Catalog.new end - it "should have a name parameter" do - @class.attrtype(:name).should == :param - end - it "should have :name be its namevar" do @class.key_attributes.should == [:name] end - it "should have a :provider parameter" do - @class.attrtype(:provider).should == :param - end + describe "when validating attributes" do - it "should have an ensure property" do - @class.attrtype(:ensure).should == :property - end + [:name, :provider].each do |param| + it "should have a #{param} parameter" do + @class.attrtype(param).should == :param + end + end - it "should support :present as a value for :ensure" do - proc { @class.new(:name => "whev", :ensure => :present, :user => "nobody") }.should_not raise_error - end + [:type, :key, :user, :target, :options, :ensure].each do |property| + it "should have a #{property} property" do + @class.attrtype(property).should == :property + end + end - it "should support :absent as a value for :ensure" do - proc { @class.new(:name => "whev", :ensure => :absent, :user => "nobody") }.should_not raise_error end - it "should have an type property" do - @class.attrtype(:type).should == :property - end - it "should support ssh-dss as an type value" do - proc { @class.new(:name => "whev", :type => "ssh-dss", :user => "nobody") }.should_not raise_error - end - it "should support ssh-rsa as an type value" do - proc { @class.new(:name => "whev", :type => "ssh-rsa", :user => "nobody") }.should_not raise_error - end - it "should support :dsa as an type value" do - proc { @class.new(:name => "whev", :type => :dsa, :user => "nobody") }.should_not raise_error - end - it "should support :rsa as an type value" do - proc { @class.new(:name => "whev", :type => :rsa, :user => "nobody") }.should_not raise_error - end + describe "when validating values" do - it "should not support values other than ssh-dss, ssh-rsa, dsa, rsa in the ssh_authorized_key_type" do - proc { @class.new(:name => "whev", :type => :something) }.should raise_error(Puppet::Error) - end + describe "for name" do - it "should have an key property" do - @class.attrtype(:key).should == :property - end + it "should support valid names" do + proc { @class.new(:name => "username", :ensure => :present, :user => "nobody") }.should_not raise_error + proc { @class.new(:name => "username@hostname", :ensure => :present, :user => "nobody") }.should_not raise_error + end - it "should have an user property" do - @class.attrtype(:user).should == :property - end + it "should not support whitespaces" do + proc { @class.new(:name => "my test", :ensure => :present, :user => "nobody") }.should raise_error(Puppet::Error,/Resourcename must not contain whitespace/) + proc { @class.new(:name => "my\ttest", :ensure => :present, :user => "nobody") }.should raise_error(Puppet::Error,/Resourcename must not contain whitespace/) + end - it "should have an options property" do - @class.attrtype(:options).should == :property - end + end - it "'s options property should return well formed string of arrays from is_to_s" do - resource = @class.new(:name => "whev", :type => :rsa, :user => "nobody", :options => ["a","b","c"]) + describe "for ensure" do - resource.property(:options).is_to_s(["a","b","c"]).should == "a,b,c" - end + it "should support :present" do + proc { @class.new(:name => "whev", :ensure => :present, :user => "nobody") }.should_not raise_error + end - it "'s options property should return well formed string of arrays from is_to_s" do - resource = @class.new(:name => "whev", :type => :rsa, :user => "nobody", :options => ["a","b","c"]) + it "should support :absent" do + proc { @class.new(:name => "whev", :ensure => :absent, :user => "nobody") }.should_not raise_error + end - resource.property(:options).should_to_s(["a","b","c"]).should == "a,b,c" - end + it "should not support other values" do + proc { @class.new(:name => "whev", :ensure => :foo, :user => "nobody") }.should raise_error(Puppet::Error, /Invalid value/) + end + + end + + describe "for type" do + + + it "should support ssh-dss" do + proc { @class.new(:name => "whev", :type => "ssh-dss", :user => "nobody") }.should_not raise_error + end + + it "should support ssh-rsa" do + proc { @class.new(:name => "whev", :type => "ssh-rsa", :user => "nobody") }.should_not raise_error + end + + it "should support :dsa" do + proc { @class.new(:name => "whev", :type => :dsa, :user => "nobody") }.should_not raise_error + end + + it "should support :rsa" do + proc { @class.new(:name => "whev", :type => :rsa, :user => "nobody") }.should_not raise_error + end + + it "should alias :rsa to :ssh-rsa" do + key = @class.new(:name => "whev", :type => :rsa, :user => "nobody") + key.should(:type).should == :'ssh-rsa' + end + + it "should alias :dsa to :ssh-dss" do + key = @class.new(:name => "whev", :type => :dsa, :user => "nobody") + key.should(:type).should == :'ssh-dss' + end + + it "should not support values other than ssh-dss, ssh-rsa, dsa, rsa" do + proc { @class.new(:name => "whev", :type => :something) }.should raise_error(Puppet::Error,/Invalid value/) + end + + end + + describe "for key" do + + it "should support a valid key like a 1024 bit rsa key" do + proc { @class.new(:name => "whev", :type => :rsa, :user => "nobody", :key => 'AAAAB3NzaC1yc2EAAAADAQABAAAAgQDCPfzW2ry7XvMc6E5Kj2e5fF/YofhKEvsNMUogR3PGL/HCIcBlsEjKisrY0aYgD8Ikp7ZidpXLbz5dBsmPy8hJiBWs5px9ZQrB/EOQAwXljvj69EyhEoGawmxQMtYw+OAIKHLJYRuk1QiHAMHLp5piqem8ZCV2mLb9AsJ6f7zUVw==')}.should_not raise_error + end + + it "should support a valid key like a 4096 bit rsa key" do + proc { @class.new(:name => "whev", :type => :rsa, :user => "nobody", :key => 'AAAAB3NzaC1yc2EAAAADAQABAAACAQDEY4pZFyzSfRc9wVWI3DfkgT/EL033UZm/7x1M+d+lBD00qcpkZ6CPT7lD3Z+vylQlJ5S8Wcw6C5Smt6okZWY2WXA9RCjNJMIHQbJAzwuQwgnwU/1VMy9YPp0tNVslg0sUUgpXb13WW4mYhwxyGmIVLJnUrjrQmIFhtfHsJAH8ZVqCWaxKgzUoC/YIu1u1ScH93lEdoBPLlwm6J0aiM7KWXRb7Oq1nEDZtug1zpX5lhgkQWrs0BwceqpUbY+n9sqeHU5e7DCyX/yEIzoPRW2fe2Gx1Iq6JKM/5NNlFfaW8rGxh3Z3S1NpzPHTRjw8js3IeGiV+OPFoaTtM1LsWgPDSBlzIdyTbSQR7gKh0qWYCNV/7qILEfa0yIFB5wIo4667iSPZw2pNgESVtenm8uXyoJdk8iWQ4mecdoposV/znknNb2GPgH+n/2vme4btZ0Sl1A6rev22GQjVgbWOn8zaDglJ2vgCN1UAwmq41RXprPxENGeLnWQppTnibhsngu0VFllZR5kvSIMlekLRSOFLFt92vfd+tk9hZIiKm9exxcbVCGGQPsf6dZ27rTOmg0xM2Sm4J6RRKuz79HQgA4Eg18+bqRP7j/itb89DmtXEtoZFAsEJw8IgIfeGGDtHTkfAlAC92mtK8byeaxGq57XCTKbO/r5gcOMElZHy1AcB8kw==')}.should_not raise_error + end + + it "should support a valid key like a 1024 bit dsa key" do + proc { @class.new(:name => "whev", :type => :dsa, :user => "nobody", :key => 'AAAAB3NzaC1kc3MAAACBAI80iR78QCgpO4WabVqHHdEDigOjUEHwIjYHIubR/7u7DYrXY+e+TUmZ0CVGkiwB/0yLHK5dix3Y/bpj8ZiWCIhFeunnXccOdE4rq5sT2V3l1p6WP33RpyVYbLmeuHHl5VQ1CecMlca24nHhKpfh6TO/FIwkMjghHBfJIhXK+0w/AAAAFQDYzLupuMY5uz+GVrcP+Kgd8YqMmwAAAIB3SVN71whLWjFPNTqGyyIlMy50624UfNOaH4REwO+Of3wm/cE6eP8n75vzTwQGBpJX3BPaBGW1S1Zp/DpTOxhCSAwZzAwyf4WgW7YyAOdxN3EwTDJZeyiyjWMAOjW9/AOWt9gtKg0kqaylbMHD4kfiIhBzo31ZY81twUzAfN7angAAAIBfva8sTSDUGKsWWIXkdbVdvM4X14K4gFdy0ZJVzaVOtZ6alysW6UQypnsl6jfnbKvsZ0tFgvcX/CPyqNY/gMR9lyh/TCZ4XQcbqeqYPuceGehz+jL5vArfqsW2fJYFzgCcklmr/VxtP5h6J/T0c9YcDgc/xIfWdZAlznOnphI/FA==')}.should_not raise_error + end + + it "should not support whitespaces" do + proc { @class.new(:name => "whev", :type => :rsa, :user => "nobody", :key => 'AAA FA==')}.should raise_error(Puppet::Error,/Key must not contain whitespace/) + end + + end + + describe "for options" do + + it "should support flags as options" do + proc { @class.new(:name => "whev", :type => :rsa, :user => "nobody", :options => 'cert-authority')}.should_not raise_error + proc { @class.new(:name => "whev", :type => :rsa, :user => "nobody", :options => 'no-port-forwarding')}.should_not raise_error + end + + it "should support key-value pairs as options" do + proc { @class.new(:name => "whev", :type => :rsa, :user => "nobody", :options => 'command="command"')}.should_not raise_error + end + + it "should support environments as options" do + proc { @class.new(:name => "whev", :type => :rsa, :user => "nobody", :options => 'environment="NAME=value"')}.should_not raise_error + end + + it "should support multiple options as an array" do + proc { @class.new(:name => "whev", :type => :rsa, :user => "nobody", :options => ['cert-authority','environment="NAME=value"'])}.should_not raise_error + end + + it "should not support a comma separated lists" do + proc { @class.new(:name => "whev", :type => :rsa, :user => "nobody", :options => 'cert-authority,no-port-forwarding')}.should raise_error(Puppet::Error, /must be provided as an array/) + end + + it "should use :absent as a default value" do + @class.new(:name => "whev", :type => :rsa, :user => "nobody").should(:options).should == [:absent] + end + + it "property should return well formed string of arrays from is_to_s" do + resource = @class.new(:name => "whev", :type => :rsa, :user => "nobody", :options => ["a","b","c"]) + resource.property(:options).is_to_s(["a","b","c"]).should == "a,b,c" + end + + it "property should return well formed string of arrays from is_to_s" do + resource = @class.new(:name => "whev", :type => :rsa, :user => "nobody", :options => ["a","b","c"]) + resource.property(:options).should_to_s(["a","b","c"]).should == "a,b,c" + end + + end + + describe "for user" do + + it "should support present users" do + proc { @class.new(:name => "whev", :type => :rsa, :user => "root") }.should_not raise_error + end + + it "should support absent users" do + proc { @class.new(:name => "whev", :type => :rsa, :user => "ihopeimabsent") }.should_not raise_error + end + + end + + describe "for target" do + + it "should support absolute paths" do + proc { @class.new(:name => "whev", :type => :rsa, :target => "/tmp/here") }.should_not raise_error + end + + it "should use the user's path if not explicitly specified" do + @class.new(:name => "whev", :user => 'root').should(:target).should == File.expand_path("~root/.ssh/authorized_keys") + end + + it "should not consider the user's path if explicitly specified" do + @class.new(:name => "whev", :user => 'root', :target => '/tmp/here').should(:target).should == '/tmp/here' + end + + it "should inform about an absent user" do + Puppet::Log.level = :debug + @class.new(:name => "whev", :user => 'idontexist').should(:target) + @logs.map(&:message).should include("The required user is not yet present on the system") + end + + end - it "should have a target property" do - @class.attrtype(:target).should == :property end describe "when neither user nor target is specified" do + it "should raise an error" do proc do - - @class.create( - + @class.new( :name => "Test", :key => "AAA", :type => "ssh-rsa", - :ensure => :present) - end.should raise_error(Puppet::Error) + end.should raise_error(Puppet::Error,/user.*or.*target.*mandatory/) end + end describe "when both target and user are specified" do - it "should use target" do - - resource = @class.create( + it "should use target" do + resource = @class.new( :name => "Test", :user => "root", - - :target => "/tmp/blah") + :target => "/tmp/blah" + ) resource.should(:target).should == "/tmp/blah" end + end describe "when user is specified" do - it "should determine target" do + it "should determine target" do resource = @class.create( - :name => "Test", - - :user => "root") + :user => "root" + ) target = File.expand_path("~root/.ssh/authorized_keys") resource.should(:target).should == target end @@ -135,17 +243,19 @@ describe ssh_authorized_key do target = File.expand_path("~root/.ssh/authorized_keys") resource.property(:target).safe_insync?(target).should == true end + end describe "when calling validate" do - it "should not crash on a non-existant user" do + it "should not crash on a non-existant user" do resource = @class.create( - :name => "Test", - - :user => "ihopesuchuserdoesnotexist") + :user => "ihopesuchuserdoesnotexist" + ) proc { resource.validate }.should_not raise_error end + end + end diff --git a/spec/unit/type/vlan_spec.rb b/spec/unit/type/vlan_spec.rb index 3bee14bbd..7d7a0b178 100755 --- a/spec/unit/type/vlan_spec.rb +++ b/spec/unit/type/vlan_spec.rb @@ -1,6 +1,5 @@ #!/usr/bin/env rspec - -require File.dirname(__FILE__) + '/../../spec_helper' +require 'spec_helper' describe Puppet::Type.type(:vlan) do diff --git a/spec/unit/util/network_device/cisco/device_spec.rb b/spec/unit/util/network_device/cisco/device_spec.rb index 8971205d3..1c5a1a6c5 100755 --- a/spec/unit/util/network_device/cisco/device_spec.rb +++ b/spec/unit/util/network_device/cisco/device_spec.rb @@ -1,6 +1,5 @@ #!/usr/bin/env rspec - -require File.dirname(__FILE__) + '/../../../../spec_helper' +require 'spec_helper' require 'puppet/util/network_device/cisco/device' diff --git a/spec/unit/util/network_device/cisco/facts_spec.rb b/spec/unit/util/network_device/cisco/facts_spec.rb index bb29ac292..66842fdf0 100644..100755 --- a/spec/unit/util/network_device/cisco/facts_spec.rb +++ b/spec/unit/util/network_device/cisco/facts_spec.rb @@ -1,6 +1,5 @@ -#!/usr/bin/env ruby - -require File.dirname(__FILE__) + '/../../../../spec_helper' +#!/usr/bin/env rspec +require 'spec_helper' require 'puppet/util/network_device' require 'puppet/util/network_device/cisco/facts' diff --git a/spec/unit/util/network_device/cisco/interface_spec.rb b/spec/unit/util/network_device/cisco/interface_spec.rb index 24217750c..b0561c6fd 100755 --- a/spec/unit/util/network_device/cisco/interface_spec.rb +++ b/spec/unit/util/network_device/cisco/interface_spec.rb @@ -1,6 +1,5 @@ #!/usr/bin/env rspec - -require File.dirname(__FILE__) + '/../../../../spec_helper' +require 'spec_helper' require 'puppet/util/network_device' require 'puppet/util/network_device/cisco/interface' diff --git a/spec/unit/util/network_device/config_spec.rb b/spec/unit/util/network_device/config_spec.rb index 52796f30b..d69358a92 100644..100755 --- a/spec/unit/util/network_device/config_spec.rb +++ b/spec/unit/util/network_device/config_spec.rb @@ -1,6 +1,5 @@ -#!/usr/bin/env ruby - -require File.dirname(__FILE__) + '/../../../spec_helper' +#!/usr/bin/env rspec +require 'spec_helper' require 'puppet/util/network_device/config' @@ -99,4 +98,4 @@ describe Puppet::Util::NetworkDevice::Config do end end -end
\ No newline at end of file +end diff --git a/spec/unit/util/network_device/ipcalc_spec.rb b/spec/unit/util/network_device/ipcalc_spec.rb index 0418c6a84..82c5390a4 100755 --- a/spec/unit/util/network_device/ipcalc_spec.rb +++ b/spec/unit/util/network_device/ipcalc_spec.rb @@ -1,6 +1,5 @@ #!/usr/bin/env rspec - -require File.dirname(__FILE__) + '/../../../spec_helper' +require 'spec_helper' require 'puppet/util/network_device/ipcalc' diff --git a/spec/unit/util/network_device/transport/base_spec.rb b/spec/unit/util/network_device/transport/base_spec.rb index c186d72e5..f05a62fbb 100755 --- a/spec/unit/util/network_device/transport/base_spec.rb +++ b/spec/unit/util/network_device/transport/base_spec.rb @@ -1,6 +1,5 @@ #!/usr/bin/env rspec - -require File.dirname(__FILE__) + '/../../../../spec_helper' +require 'spec_helper' require 'puppet/util/network_device/transport/base' diff --git a/spec/unit/util/network_device/transport/ssh_spec.rb b/spec/unit/util/network_device/transport/ssh_spec.rb index 8fc357db3..04a86ba3f 100755 --- a/spec/unit/util/network_device/transport/ssh_spec.rb +++ b/spec/unit/util/network_device/transport/ssh_spec.rb @@ -1,6 +1,5 @@ #!/usr/bin/env rspec - -require File.dirname(__FILE__) + '/../../../../spec_helper' +require 'spec_helper' require 'puppet/util/network_device/transport/ssh' diff --git a/spec/unit/util/network_device/transport/telnet_spec.rb b/spec/unit/util/network_device/transport/telnet_spec.rb index 7528e0740..cea5ab79a 100755 --- a/spec/unit/util/network_device/transport/telnet_spec.rb +++ b/spec/unit/util/network_device/transport/telnet_spec.rb @@ -1,6 +1,5 @@ #!/usr/bin/env rspec - -require File.dirname(__FILE__) + '/../../../../spec_helper' +require 'spec_helper' require 'puppet/util/network_device/transport/telnet' diff --git a/spec/unit/util/network_device_spec.rb b/spec/unit/util/network_device_spec.rb index 347986ac6..0f7c6036b 100644 --- a/spec/unit/util/network_device_spec.rb +++ b/spec/unit/util/network_device_spec.rb @@ -11,7 +11,7 @@ describe Puppet::Util::NetworkDevice do end after(:each) do - Puppet::Util::NetworkDevice.clear + Puppet::Util::NetworkDevice.teardown end class Puppet::Util::NetworkDevice::Test @@ -47,4 +47,4 @@ describe Puppet::Util::NetworkDevice do Puppet::Util::NetworkDevice.current.should == device end end -end
\ No newline at end of file +end diff --git a/test/lib/puppettest/railstesting.rb b/test/lib/puppettest/railstesting.rb index e05511e3b..f5666f2c4 100644 --- a/test/lib/puppettest/railstesting.rb +++ b/test/lib/puppettest/railstesting.rb @@ -14,39 +14,5 @@ module PuppetTest::RailsTesting def railsinit Puppet::Rails.init end - - def railsteardown - Puppet::Rails.teardown if Puppet[:dbadapter] != "sqlite3" - end - - def railsresource(type = "file", title = "/tmp/testing", params = {}) - railsteardown - railsinit - - # We need a host for resources - #host = Puppet::Rails::Host.new(:name => Facter.value("hostname")) - - # Now build a resource - resources = [] - - resources << mkresource( - :type => type, :title => title, :exported => true, - - :parameters => params) - - # Now collect our facts - facts = Facter.to_hash - - # Now try storing our crap - host = nil - node = mknode(facts["hostname"]) - node.parameters = facts - assert_nothing_raised { - host = Puppet::Rails::Host.store(node, resources) - } - - # Now save the whole thing - host.save - end end |