[libcatmandu-perl] 03/101: Adding support for concatenating variable length string, path arguments

Jonas Smedegaard dr at jones.dk
Tue Feb 23 13:43:48 UTC 2016


This is an automated email from the git hooks/post-receive script.

js pushed a commit to branch master
in repository libcatmandu-perl.

commit 255551e5621719742aa40da77fdc65da0889faae
Author: Patrick Hochstenbach <patrick.hochstenbach at ugent.be>
Date:   Thu Dec 10 11:21:32 2015 +0100

    Adding support for concatenating variable length string, path arguments
---
 lib/Catmandu/Fix/paste.pm | 102 ++++++++++++++++++++++++++++++++++++++++++++++
 t/Catmandu-Fix-paste.t    |  26 ++++++++++++
 2 files changed, 128 insertions(+)

diff --git a/lib/Catmandu/Fix/paste.pm b/lib/Catmandu/Fix/paste.pm
new file mode 100644
index 0000000..8c6cbba
--- /dev/null
+++ b/lib/Catmandu/Fix/paste.pm
@@ -0,0 +1,102 @@
+package Catmandu::Fix::paste;
+
+use Catmandu::Sane;
+
+our $VERSION = '0.9505';
+
+use Moo;
+use namespace::clean;
+use Catmandu::Fix::Has;
+
+with 'Catmandu::Fix::Base';
+
+has path      => (fix_arg => 1);
+has values    => (fix_arg => 'collect');
+
+sub emit {
+    my ($self, $fixer) = @_;
+    my $values   = $self->values;
+
+    my @parsed_values = ();
+    my $join_char     = ' ';
+
+    while (@$values) {
+        my $val = shift @$values;
+        if ($val eq 'join_char') {
+            $join_char = shift @$values;
+            last;
+        }
+        else {
+            push @parsed_values , $val;
+        }
+    }
+
+    $join_char   = $fixer->emit_string($join_char);
+      
+      my $vals_var = $fixer->generate_var;
+    my $perl     = $fixer->emit_declare_vars($vals_var, '[]');
+
+    for my $val (@parsed_values) {
+        my $vals_path = $fixer->split_path($val);
+        my $vals_key  = pop @$vals_path;
+
+        if ($val =~ /^~(.*)/) {
+            my $tmp = $fixer->emit_string($1);
+            $perl .= "push(\@{${vals_var}}, ${tmp});";
+        }
+        else {
+            $perl .= $fixer->emit_walk_path($fixer->var, $vals_path, sub {
+                my $var = shift;
+                $fixer->emit_get_key($var, $vals_key, sub {
+                    my $var = shift;
+                    "push(\@{${vals_var}}, ${var}) if is_value(${var});";
+                });
+            });
+        }
+    }
+
+    my $path = $fixer->split_path($self->path);
+
+    $perl .= $fixer->emit_create_path($fixer->var, $path, sub {
+        my $var = shift;
+        "${var} = join(${join_char}, \@{${vals_var}});";
+    });
+
+    $perl;
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+Catmandu::Fix::paste - concatenate path values
+
+=head1 SYNOPSIS
+
+   # If you data record is:
+   #   a: eeny
+   #   b: meeny
+   #   c: miny
+   #   d: moe
+   paste(my.string,a,b,c,d)                 # my.string: eeny meeny miny moe
+
+   # Use a join character
+   paste(my.string,a,b,c,d,join_char:", ")  # my.string: eeny, meeny, miny, moe
+
+   # Paste literal strings with a tilde sign
+   paste(my.string,~Hi,a,~,how are you?)    # my.string: Hi eeny ,how are you?
+
+=head1 DESCRIPTION
+
+Paste places a concatenation of all paths starting from the second path into the first path.
+Literal values can be pasted by prefixing them with a tilde (~) sign.
+
+=head1 SEE ALSO
+
+L<Catmandu::Fix>
+
+=cut
diff --git a/t/Catmandu-Fix-paste.t b/t/Catmandu-Fix-paste.t
new file mode 100644
index 0000000..699fd56
--- /dev/null
+++ b/t/Catmandu-Fix-paste.t
@@ -0,0 +1,26 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use Test::More;
+use Test::Exception;
+
+my $pkg;
+BEGIN {
+    $pkg = 'Catmandu::Fix::paste';
+    use_ok $pkg;
+}
+
+is_deeply
+    $pkg->new('my.field', 'a', 'b', 'c')->fix({a => 'A', b => 'B' , c => 'C'}),
+    {my => {field => 'A B C'}, a => 'A', b => 'B' , c => 'C'} , 'paste paths';
+
+is_deeply
+    $pkg->new('my.field', 'a', 'b', 'c', join_char => '/')->fix({a => 'A', b => 'B' , c => 'C'}),
+    {my => {field => 'A/B/C'}, a => 'A', b => 'B' , c => 'C'} , 'join_char';
+
+is_deeply
+    $pkg->new('my.field', 'a', '~b', 'c')->fix({a => 'A', b => 'B' , c => 'C'}),
+    {my => {field => 'A b C'}, a => 'A', b => 'B' , c => 'C'} , 'literal strings';
+
+done_testing 4;

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libcatmandu-perl.git



More information about the Pkg-perl-cvs-commits mailing list