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


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