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
-~----------~----~----~----~------~----~------~--~---

Reply via email to