On May 15, 2009, at 4:26 AM, Thomas Bellman wrote:

>
> James Turnbull wrote:
>
>> Thomas Bellman wrote:
>>> I suggest that we make split() take a regular expression instead  
>>> of a
>>> fixed string to split on.  That would make it more powerful.
>
>> Can you post the code to the list please.
>
> Here goes:
>
> From: Thomas Bellman <[email protected]>
> Date: Thu, 14 May 2009 14:37:21 +0200
> Subject: [PATCH] Make the split() function split on regexps.
>
> Change the second parameter to split() into a regular expression
> instead of a fixed string, making it more flexible.
>
> This is a non-backwards compatible change, but since no release
> has been made containing split(), it should not be a problem.
>
> Unit tests for split() are also added.
>
> Signed-off-by: Thomas Bellman <[email protected]>
> ---
>  lib/puppet/parser/functions/split.rb |   28 ++++++++++++++----
>  spec/unit/parser/functions/split.rb  |   51 ++++++++++++++++++++++++ 
> ++++++++++
>  2 files changed, 73 insertions(+), 6 deletions(-)
>  create mode 100755 spec/unit/parser/functions/split.rb
>
> diff --git a/lib/puppet/parser/functions/split.rb b/lib/puppet/ 
> parser/functions/split.rb
> index cfb3ab5..53991d5 100644
> --- a/lib/puppet/parser/functions/split.rb
> +++ b/lib/puppet/parser/functions/split.rb
> @@ -1,13 +1,29 @@
>  module Puppet::Parser::Functions
> -  newfunction(:split, :type => :rvalue,
> -      :doc => "Split a string variable into an array using the  
> specified split character.
> +  newfunction(:split, :type => :rvalue,
> +      :doc => "\
> +Split a string variable into an array using the specified split  
> regexp.
>
>  Usage::
>
> -    $string    = 'value1,value2'
> -    $array_var = split($string, ',')
> +    $string     = 'v1.v2:v3.v4'
> +    $array_var1 = split($string, ':')
> +    $array_var2 = split($string, '[.]')
> +    $array_var3 = split($string, '[.:]')

I'd really prefer we add a regex token type and AST leaf class if  
we're going to support regexes to any significant extent.  Using  
strings as regexes is just painful.

You should find it relatively easy to add the regex support, and I'd  
prefer we stick to strings until we have it.

I know there are a couple of other places people have used regexes as  
strings, but *shudder* those should go away, too.

>
> -$array_var holds the result ['value1', 'value2']") do |args|
> -    return args[0].split(args[1])
> +$array_var1 now holds the result ['v1.v2', 'v3.v4'],
> +while $array_var2 holds ['v1', 'v2:v3', 'v4'], and
> +$array_var3 holds ['v1', 'v2', 'v3', 'v4'].
> +
> +Note that in the second example, we split on a string that contains
> +a regexp meta-character (.), and that needs protection.  A simple
> +way to do that for a single character is to enclose it in square
> +brackets.") do |args|
> +
> +    if args.length != 2
> +     raise Puppet::ParseError, ("split(): wrong number of arguments" +
> +                                " (#{args.length}; must be 2)")
> +    end
> +
> +    return args[0].split(Regexp.compile(args[1]))
>    end
>  end
> diff --git a/spec/unit/parser/functions/split.rb b/spec/unit/parser/ 
> functions/split.rb
> new file mode 100755
> index 0000000..8aa031d
> --- /dev/null
> +++ b/spec/unit/parser/functions/split.rb
> @@ -0,0 +1,51 @@
> +#! /usr/bin/env ruby
> +
> +require File.dirname(__FILE__) + '/../../../spec_helper'
> +
> +describe "the split function" do
> +
> +    before :each do
> +        @scope = Puppet::Parser::Scope.new()
> +    end
> +
> +    it "should exist" do
> +        Puppet::Parser::Functions.function("split").should ==  
> "function_split"
> +    end
> +
> +    it "should raise a ParseError if there is less than 2  
> arguments" do
> +        lambda { @scope.function_split(["foo"]) }.should(
> +             raise_error(Puppet::ParseError))
> +    end
> +
> +    it "should raise a ParseError if there is more than 2  
> arguments" do
> +        lambda { @scope.function_split(["foo", "bar",  
> "gazonk"]) }.should(
> +             raise_error(Puppet::ParseError))
> +    end
> +
> +    it "should raise a RegexpError if the regexp is malformed" do
> +        lambda { @scope.function_split(["foo", "("]) }.should(
> +             raise_error(RegexpError))
> +    end
> +
> +
> +    it "should handle simple string without metacharacters" do
> +     result = @scope.function_split([ "130;236;254;10", ";"])
> +     result.should(eql(["130", "236", "254", "10"]))
> +    end
> +
> +    it "should handle simple regexps" do
> +     result = @scope.function_split([ "130.236;254.;10", "[.;]+"])
> +     result.should(eql(["130", "236", "254", "10"]))
> +    end
> +
> +    it "should handle groups" do
> +     result = @scope.function_split([ "130.236;254.;10", "([.;]+)"])
> +     result.should(eql(["130", ".", "236", ";", "254", ".;", "10"]))
> +    end
> +
> +    it "should handle simple string without metacharacters" do
> +     result = @scope.function_split([ "130.236.254.10", ";"])
> +     result.should(eql(["130.236.254.10"]))
> +    end
> +
> +end
> -- 
> 1.6.0.6
>
> >


-- 
Barondes' First Law:
     Science abhors contradictions; scientists' minds are replete with
     them.
---------------------------------------------------------------------
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