Small comment below (not worth re-reviewing); otherwise, +1. On Jul 26, 2009, at 9:03 AM, Brice Figureau wrote:
> > Add a regex rule (unused for the moment) to the parser. > > Signed-off-by: Brice Figureau <[email protected]> > --- > lib/puppet/parser/ast/leaf.rb | 42 ++++++++++++++ > lib/puppet/parser/grammar.ra | 4 ++ > lib/puppet/parser/parser.rb | 85 ++++++++++++++++------------- > spec/unit/parser/ast/leaf.rb | 121 ++++++++++++++++++++++++++++++++ > ++++++++- > 4 files changed, 213 insertions(+), 39 deletions(-) > > diff --git a/lib/puppet/parser/ast/leaf.rb b/lib/puppet/parser/ast/ > leaf.rb > index d089380..de5876e 100644 > --- a/lib/puppet/parser/ast/leaf.rb > +++ b/lib/puppet/parser/ast/leaf.rb > @@ -10,6 +10,15 @@ class Puppet::Parser::AST > return @value > end > > + # evaluate ourselves, and match > + def evaluate_match(value, scope, options = {}) > + obj = self.safeevaluate(scope) > + if ! options[:sensitive] && obj.respond_to?(:downcase) > + obj = obj.downcase > + end > + obj == value > + end > + > def to_s > return @value.to_s unless @value.nil? > end > @@ -99,4 +108,37 @@ class Puppet::Parser::AST > end > end > end > + > + class Regex < AST::Leaf > + def initialize(hash) > + super > + @value = Regexp.new(@value) unless @value.is_a?(Regexp) > + end > + > + # we're returning self here to wrap the regexp and to be > used in places > + # where a string would have been used, without modifying > any client code. > + # For instance, in many places we have the following code > snippet: > + # val = @val.safeevaluate(@scope) > + # if val.match(otherval) > + # ... > + # end > + # this way, we don't have to modify this test specifically > for handling > + # regexes. > + def evaluate(scope) > + return self > + end > + > + def evaluate_match(value, scope, options = {}) > + value = value.is_a?(String) ? value : value.to_s > + > + if matched = @value.match(value) > + scope.ephemeral_from(matched, options[:file], > options[:line]) > + end > + matched > + end > + > + def to_s > + return @value.source This would probably be better as @value.inspect. That gives you the //, otherwise you have to add it yourself. > > + end > + end > end > diff --git a/lib/puppet/parser/grammar.ra b/lib/puppet/parser/ > grammar.ra > index bb75ecf..68acf35 100644 > --- a/lib/puppet/parser/grammar.ra > +++ b/lib/puppet/parser/grammar.ra > @@ -765,6 +765,10 @@ comma: FARROW > endcomma: # nothing > | COMMA { result = nil } > > +regex: REGEX { > + result = ast AST::Regex, :value => val[0][:value] > +} > + > end > ---- header ---- > require 'puppet' > diff --git a/lib/puppet/parser/parser.rb b/lib/puppet/parser/parser.rb > index 6f4895a..ef08d6e 100644 > --- a/lib/puppet/parser/parser.rb > +++ b/lib/puppet/parser/parser.rb > <Patch elided> > diff --git a/spec/unit/parser/ast/leaf.rb b/spec/unit/parser/ast/ > leaf.rb > index 5ca7bc6..8315b80 100755 > --- a/spec/unit/parser/ast/leaf.rb > +++ b/spec/unit/parser/ast/leaf.rb > @@ -3,6 +3,41 @@ > require File.dirname(__FILE__) + '/../../../spec_helper' > > describe Puppet::Parser::AST::Leaf do > + before :each do > + @scope = stub 'scope' > + end > + > + it "should have a evaluate_match method" do > + Puppet::Parser::AST::Leaf.new(:value => "value").should > respond_to(:evaluate_match) > + end > + > + describe "when evaluate_match is called" do > + before :each do > + @value = stub 'value' > + @leaf = Puppet::Parser::AST::Leaf.new(:value => @value) > + end > + > + it "should evaluate itself" do > + @leaf.expects(:safeevaluate).with(@scope) > + > + @leaf.evaluate_match("value", @scope) > + end > + > + it "should match values by equality" do > + @leaf.stubs(:safeevaluate).with(@scope).returns(@value) > + @value.expects(:==).with("value") > + > + @leaf.evaluate_match("value", @scope) > + end > + > + it "should downcase the evaluated value if wanted" do > + @leaf.stubs(:safeevaluate).with(@scope).returns(@value) > + @value.expects(:downcase).returns("value") > + > + @leaf.evaluate_match("value", @scope, :insensitive => > true) > + end > + end > + > describe "when converting to string" do > it "should transform its value to string" do > value = stub 'value', :is_a? => true > @@ -21,7 +56,7 @@ describe Puppet::Parser::AST::FlatString do > end > end > > -describe Puppet::Parser::AST::FlatString do > +describe Puppet::Parser::AST::String do > describe "when converting to string" do > it "should transform its value to a quoted string" do > value = stub 'value', :is_a? => true, :to_s => "ab" > @@ -29,3 +64,87 @@ describe Puppet::Parser::AST::FlatString do > end > end > end > + > +describe Puppet::Parser::AST::Regex do > + before :each do > + @scope = stub 'scope' > + end > + > + describe "when initializing" do > + it "should create a Regexp with its content when value is > not a Regexp" do > + Regexp.expects(:new).with("/ab/") > + > + Puppet::Parser::AST::Regex.new :value => "/ab/" > + end > + > + it "should not create a Regexp with its content when value > is a Regexp" do > + value = Regexp.new("/ab/") > + Regexp.expects(:new).with("/ab/").never > + > + Puppet::Parser::AST::Regex.new :value => value > + end > + end > + > + describe "when evaluating" do > + it "should return self" do > + val = Puppet::Parser::AST::Regex.new :value => "/ab/" > + > + val.evaluate(@scope).should === val > + end > + end > + > + describe "when evaluate_match" do > + before :each do > + @value = stub 'regex' > + @value.stubs(:match).with("value").returns(true) > + Regexp.stubs(:new).returns(@value) > + @regex = Puppet::Parser::AST::Regex.new :value => "/ab/" > + end > + > + it "should issue the regexp match" do > + @value.expects(:match).with("value") > + > + @regex.evaluate_match("value", @scope) > + end > + > + it "should set ephemeral scope vars if there is a match" do > + @scope.expects(:ephemeral_from).with(true, nil, nil) > + > + @regex.evaluate_match("value", @scope) > + end > + > + it "should return the match to the caller" do > + @value.stubs(:match).with("value").returns(:match) > + @scope.stubs(:ephemeral_from) > + > + @regex.evaluate_match("value", @scope) > + end > + end > + > + it "should return the regex source with to_s" do > + regex = stub 'regex' > + Regexp.stubs(:new).returns(regex) > + > + val = Puppet::Parser::AST::Regex.new :value => "/ab/" > + > + regex.expects(:source) > + > + val.to_s > + end > +end > + > +describe Puppet::Parser::AST::HostName do > + before :each do > + @scope = stub 'scope' > + @value = stub 'value', :is_a? => true, :=~ => true > + @host = Puppet::Parser::AST::HostName.new( :value => @value) > + end > + > + it "should raise an error if hostname is not valid" do > + lambda { Puppet::Parser::AST::HostName.new( :value => "not > an hostname!" ) }.should raise_error > + end > + > + it "should evaluate to its value" do > + @host.evaluate(@scope).should == @value > + end > +end > -- > 1.6.0.2 > > > > -- It is curious that physical courage should be so common in the world and moral courage so rare. -- Mark Twain --------------------------------------------------------------------- Luke Kanies | http://reductivelabs.com | http://madstop.com --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Puppet Developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/puppet-dev?hl=en -~----------~----~----~----~------~----~------~--~---
