[libcatmandu-perl] 13/85: better document and extend Importer

Jonas Smedegaard dr at jones.dk
Tue May 20 09:56:15 UTC 2014


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

js pushed a commit to tag 0.91
in repository libcatmandu-perl.

commit 198d750f7a1be5b0ac6a39f7b7aa8066bbe440b9
Author: Jakob Voss <voss at gbv.de>
Date:   Fri May 9 12:28:10 2014 +0200

    better document and extend Importer
---
 lib/Catmandu/Importer.pm | 77 +++++++++++++++++++++++++++++++++---------------
 t/Catmandu-Importer.t    | 18 +++++++++--
 2 files changed, 70 insertions(+), 25 deletions(-)

diff --git a/lib/Catmandu/Importer.pm b/lib/Catmandu/Importer.pm
index b1d25f3..6fc0fc3 100644
--- a/lib/Catmandu/Importer.pm
+++ b/lib/Catmandu/Importer.pm
@@ -27,65 +27,96 @@ has file => (
 has fh => (
     is      => 'ro',
     lazy    => 1,
-    default => sub { io($_[0]->file, mode => 'r', binmode => $_[0]->encoding) },
+    builder => 1,
 );
 
 has encoding => (
     is       => 'ro',
-    builder  => 'default_encoding',
+    builder  => 1,
 );
 
-sub default_encoding {
+sub _build_encoding {
     ':utf8';
 }
 
+sub _build_fh {
+    # build from file. may be build from URL in a future version
+    io($_[0]->file, mode => 'r', binmode => $_[0]->encoding);
+}
+
+sub readline {
+    $_[0]->fh->getline;
+}
+
+sub readall {
+    join '', $_[0]->fh->getlines;
+}
+
 =head1 NAME
 
 Catmandu::Importer - Namespace for packages that can import
 
 =head1 SYNOPSIS
 
-    use Catmandu::Importer::JSON;
+    package Catmandu::Importer::Hello;
 
-    my $importer = Catmandu::Importer::JSON->new(file => "/foo/bar.json");
+    use Catmandu::Sane;
+    use Moo;
 
-    my $n = $importer->each(sub {
-        my $hashref = $_[0];
-        # ...
-    });
+    with 'Catmandu::Importer';
 
+    sub generator {
+        my ($self) = @_;
+        state $fh = $self->fh;
+        return sub {
+            my $name = $self->readline;
+            return defined $name ? { "hello" => $name } : undef;
+        };
+    } 
 
 =head1 DESCRIPTION
 
-A Catmandu::Importer is a stub for Perl packages that can import data from
-an external source (a file, the network, ...).
+A Catmandu::Importer is a Perl packages that can import data from an external
+source (a file, the network, ...). Most importers read from an input stream, 
+such as STDIN, a given file, or an URL to fetch data from, so this base class
+provides helper method for consuming the input stream once.
 
 Every Catmandu::Importer is a L<Catmandu::Fixable> and thus provides a 'fix'
 parameter that can be set in the constructor. For every item returned by the
 generator the given fixes will be applied first.
 
-=head1 METHODS
+Every Catmandu::Importer is a L<Catmandu::Iterable> and its methods (C<first>,
+C<each>, C<to_array>...) should be used to access items from the importer.
+
+=head1 CONFIGURATION
+
+=over
 
-=head2 new(file => $file , encoding => $encoding )
+=item file
 
-Create a new importer reading input from a local file: $file is a string containing the path to
-the file.
+Read input from a local file given by its path. Alternatively a scalar
+reference can be passed to read from a string.
 
-=head2 new(fh => $fh , encoding => $encoding)
+=item fh
 
-Create a new importer by reading from a IO::Handle. Optionally use Catmandu::Util::io to create IO::Handles.
+Read input from an L<IO::Handle>. If not specified, L<Catmandu::Util::io> is used to
+create the input stream from the C<file> argument or by using STDIN.
 
-=head2 count
+=item encoding
 
-=head2 each(&callback)
+Binmode of the input stream C<fh>. Set to C<:utf8> by default.
+
+=back
+
+=head1 METHODS
 
-=head2 ...
+=head2 readline
 
-Every Catmandu::Importer is a L<Catmandu::Iterable> all its methods are inherited.
+Read a line from the input stream. Equivalent to C<< $importer->fh->getline >>.
 
-=head2 log
+=head2 readall
 
-Return the current logger.
+Read the whole input stream as string.
 
 =head1 SEE ALSO
 
diff --git a/t/Catmandu-Importer.t b/t/Catmandu-Importer.t
index 246f94f..f9c560e 100644
--- a/t/Catmandu-Importer.t
+++ b/t/Catmandu-Importer.t
@@ -2,6 +2,7 @@
 
 use strict;
 use warnings;
+use v5.10.1;
 use Test::More;
 use Test::Exception;
 
@@ -17,11 +18,24 @@ require_ok $pkg;
     use Moo;
     with $pkg;
 
-    sub generator { sub {} }
+    sub generator {
+        my ($self) = @_;
+        state $fh = $self->fh;
+        return sub {
+            my $name = $self->readline;
+            return defined $name ? { "hello" => $name } : undef;
+        };
+    }
 }
 
 my $i = T::Importer->new;
 ok $i->does('Catmandu::Iterable');
 
-done_testing 3;
+$i = T::Importer->new( file => \"World" );
+is_deeply $i->to_array, [{ hello => "World"}], 'import from string reference';
+
+$i = T::Importer->new( file => \"Hello\nWorld" );
+is $i->readall, "Hello\nWorld", "import all";
+
+done_testing;
 

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