File Coverage

blib/lib/Catmandu.pm
Criterion Covered Total %
statement 103 112 91.9
branch 17 28 60.7
condition 4 6 66.6
subroutine 32 33 96.9
pod 0 24 0.0
total 156 203 76.8


line stmt bran cond sub pod time code
1             package Catmandu;
2              
3 154     154   425594 use Catmandu::Sane;
  154         402  
  154         1070  
4              
5             our $VERSION = '1.2020';
6              
7 154     154   66390 use Catmandu::Env;
  154         654  
  154         7219  
8 154     154   1208 use Catmandu::Util qw(:is);
  154         342  
  154         41139  
9 154     154   1359 use File::Spec;
  154         408  
  154         3742  
10 154     154   905 use namespace::clean;
  154         500  
  154         883  
11 154     154   178554 use Sub::Exporter::Util qw(curry_method);
  154         294157  
  154         954  
12 154         725 use Sub::Exporter -setup => {
13             exports => [
14             config => curry_method,
15             log => curry_method,
16             store => curry_method,
17             fixer => curry_method,
18             importer => curry_method,
19             exporter => curry_method,
20             validator => curry_method,
21             export => curry_method,
22             export_to_string => curry_method,
23             import_from_string => curry_method
24             ],
25             collectors => {'-load' => \'_import_load', ':load' => \'_import_load',},
26 154     154   51408 };
  154         389  
27              
28             sub _import_load {
29 0     0   0 my ($self, $value, $data) = @_;
30 0 0       0 if (is_array_ref $value) {
31 0         0 $self->load(@$value);
32             }
33             else {
34 0         0 $self->load;
35             }
36 0         0 1;
37             }
38              
39             sub _env {
40 227     227   585 my ($class, $env) = @_;
41 227         360 state $loaded_env;
42 227 100       1460 $loaded_env = $env if defined $env;
43 227   66     1735 $loaded_env
44             ||= Catmandu::Env->new(load_paths => $class->default_load_path);
45             }
46              
47 12     12 0 10270 sub log {$_[0]->_env->log}
48              
49             sub default_load_path { # TODO move to Catmandu::Env
50 69     69 0 745 my ($class, $path) = @_;
51 69         124 state $default_path;
52 69 100       214 $default_path = $path if defined $path;
53 69   66     315 $default_path //= do {
54 29         1449 my $script = File::Spec->rel2abs($0);
55 29         640 my ($script_vol, $script_path, $script_name)
56             = File::Spec->splitpath($script);
57 29         407 my @dirs = grep length, File::Spec->splitdir($script_path);
58 29 50       178 if ($dirs[-1] eq 'bin') {
59 0         0 pop @dirs;
60 0         0 File::Spec->catdir(File::Spec->rootdir, @dirs);
61             }
62             else {
63 29         289 $script_path;
64             }
65             };
66             }
67              
68             sub load {
69 49     49 0 119 my $class = shift;
70 49 50       302 my $paths = [@_ ? @_ : $class->default_load_path];
71 49         1261 my $env = Catmandu::Env->new(load_paths => $paths);
72 49         6466 $class->_env($env);
73 49         171 $class;
74             }
75              
76             sub roots {
77 5     5 0 19 $_[0]->_env->roots;
78             }
79              
80             sub root {
81 1     1 0 975 $_[0]->_env->root;
82             }
83              
84             sub config {
85 22     22 0 5659 my ($class, $config) = @_;
86 22 100       69 if ($config) {
87 1         6 my $env = Catmandu::Env->new(load_paths => $class->_env->load_paths);
88 1         159 $env->_set_config($config);
89 1         11 $class->_env($env);
90             }
91 22         67 $class->_env->config;
92             }
93              
94 1     1 0 4 sub default_store {$_[0]->_env->default_store}
95              
96             sub store {
97 27     27 0 709 my $class = shift;
98 27         101 $class->_env->store(@_);
99             }
100              
101 1     1 0 5 sub default_fixer {$_[0]->_env->default_fixer}
102              
103             sub fixer {
104 10     10 0 12215 my $class = shift;
105 10         54 $class->_env->fixer(@_);
106             }
107              
108 1     1 0 5 sub default_importer {$_[0]->_env->default_importer}
109              
110 1     1 0 6 sub default_importer_package {$_[0]->_env->default_importer_package}
111              
112             sub importer {
113 33     33 0 3716 my $class = shift;
114 33         133 $class->_env->importer(@_);
115             }
116              
117 1     1 0 5 sub default_exporter {$_[0]->_env->default_exporter}
118              
119 1     1 0 5 sub default_exporter_package {$_[0]->_env->default_exporter_package}
120              
121             sub exporter {
122 45     45 0 124 my $class = shift;
123 45         221 $class->_env->exporter(@_);
124             }
125              
126             sub validator {
127 1     1 0 2119 my $class = shift;
128 1         4 $class->_env->validator(@_);
129             }
130              
131             sub export {
132 1     1 0 20 my $class = shift;
133 1         3 my $data = shift;
134 1         5 my $exporter = $class->_env->exporter(@_);
135 1 50       29 is_hash_ref($data) ? $exporter->add($data) : $exporter->add_many($data);
136 1         23 $exporter->commit;
137 1         2 return;
138             }
139              
140             sub export_to_string {
141 7     7 0 350 my $class = shift;
142 7         11 my $data = shift;
143 7         15 my $name = shift;
144 7 50       40 my %opts = ref $_[0] ? %{$_[0]} : @_;
  0         0  
145 7         14 my $str = "";
146 7         22 my $exporter = $class->_env->exporter($name, %opts, file => \$str);
147 7 100       160 is_hash_ref($data) ? $exporter->add($data) : $exporter->add_many($data);
148 7         147 $exporter->commit;
149 7         30 $str;
150             }
151              
152             sub import_from_string {
153 6     6 0 15 my $class = shift;
154 6         8 my $str = shift;
155 6         13 my $name = shift;
156 6 50       18 my %opts = ref $_[0] ? %{$_[0]} : @_;
  0         0  
157 6         20 $class->_env->importer($name, %opts, file => \$str)->to_array();
158             }
159              
160             sub define_importer {
161 1     1 0 3 my $class = shift;
162 1         2 my $name = shift;
163 1         2 my $package = shift;
164 1 50       6 my $options = ref $_[0] ? $_[0] : {@_};
165 1         7 $class->config->{importer}{$name}
166             = {package => $package, options => $options};
167             }
168              
169             sub define_exporter {
170 1     1 0 4 my $class = shift;
171 1         3 my $name = shift;
172 1         3 my $package = shift;
173 1 50       7 my $options = ref $_[0] ? $_[0] : {@_};
174 1         8 $class->config->{exporter}{$name}
175             = {package => $package, options => $options};
176             }
177              
178             sub define_store {
179 1     1 0 4 my $class = shift;
180 1         3 my $name = shift;
181 1         2 my $package = shift;
182 1 50       6 my $options = ref $_[0] ? $_[0] : {@_};
183 1         7 $class->config->{store}{$name}
184             = {package => $package, options => $options};
185             }
186              
187             sub define_fixer {
188 1     1 0 3 my $class = shift;
189 1         2 my $name = shift;
190 1 50       5 my $fixes = ref $_[0] ? $_[0] : [@_];
191 1         5 $class->config->{fixer}{$name} = $fixes;
192             }
193              
194             1;
195              
196             __END__
197              
198             =pod
199              
200             =head1 NAME
201              
202             Catmandu - a data toolkit
203              
204             =head1 SYNOPSIS
205              
206             # From the command line
207              
208             # Convert data from one format to another
209             $ catmandu convert JSON to CSV < data.json
210             $ catmandu convert CSV to YAML < data.csv
211             $ catmandu convert MARC to YAML < data.mrc
212              
213             # Fix data, add, delete, change fields
214             $ catmandu convert JSON --fix 'move_field(title,my_title)' < data.json
215             $ catmandu convert JSON --fix all_my_fixes.txt < data.json
216              
217             # Use a moustache preprocessor on the fix script
218             $ catmandu convert JSON --fix all_my_fixes.txt --var opt1=foo --var opt2=bar < data.json
219              
220             # run a fix script
221             $ catmandu run myfixes.fix
222              
223             # or, create an executable fix script
224             $ cat myfixes.fix
225             #!/usr/local/bin/catmandu run
226             do importer(OAI,url:"http://biblio.ugent.be/oai")
227             retain(_id)
228             end
229             $ chmod 755 myfixes.fix
230             $ ./myfixes.fix
231              
232             =head1 DESCRIPTION
233              
234             Catmandu provides a command line tools for the conversion of various data
235             formats including: JSON, YAML, RDF, CSV, TSV, XML and even Excel. Using
236             extension modules, specialized conversions for metadata formats using
237             in libraries, archives and museums is also supports. We provide support
238             for MARC, MAB, MODS, OAI-PMH, PICA, PNX, RIS, LIDO, SRU and Z39.50.
239              
240             Specialized conversions require a mapping language. This is implemented in
241             Catmandu using the `Fix` language. For a short introduction read
242             L<Catmandu::Introduction>. Online tutorials can be found at the end of this document.
243              
244             =head1 INSTALL
245              
246             =head2 From Source
247              
248             # Clone the directory
249             git clone https://github.com/LibreCat/Catmandu
250              
251             # Build
252             cd Catmandu
253             cpanm -n -q --installdeps --skip-satisfied .
254             perl Build.PL && ./Build && ./Build install
255              
256             =head2 Using Docker
257              
258             docker build -t librecat/catmandu .
259            
260             # Run catmandu with access to you local files at <YourDrive>
261             docker run -v <YourDrive>:/home/catmandu/Home -it librecat/catmandu
262              
263             # E.g.
264             docker run -v C:\Users\alice:/home/catmandu/Home -it librecat/catmandu
265              
266             =head1 INSTALL EXTENSIONS
267              
268             cpanm install <PackageName>
269              
270             # E.g.
271             cpanm install Catmandu::MARC
272              
273             =head1 POPULAR EXTENSIONS
274              
275             L<Catmandu::Breaker>
276              
277             L<Catmandu::Identifier>
278              
279             L<Catmandu::MARC>
280              
281             L<Catmandu::OAI>
282              
283             L<Catmandu::PICA>
284              
285             L<Catmandu::RDF>
286              
287             L<Catmandu::SRU>
288              
289             L<Catmandu::Stat>
290              
291             L<Catmandu::Template>
292              
293             L<Catmandu::Validator>
294              
295             L<Catmandu::XLS>
296              
297             L<Catmandu::XSD>
298              
299             L<Catmandu::Z3950>
300              
301             =head1 SEE ALSO
302              
303             =over 4
304              
305             =item introduction
306              
307             L<Catmandu::Introduction>
308              
309             =item documentation
310              
311             L<http://librecat.org/>
312              
313             =item blog
314              
315             L<https://librecatproject.wordpress.com/>
316              
317             =item step-by-step introduction from basics
318              
319             L<https://librecatproject.wordpress.com/2014/12/01/day-1-getting-catmandu/>
320              
321             =item command line client
322              
323             L<catmandu>
324              
325             =item Perl API
326              
327             L<Catmandu::PerlAPI>
328              
329             =back
330              
331             =head1 AUTHOR
332              
333             Nicolas Steenlant, C<< <nicolas.steenlant at ugent.be> >>
334              
335             =head1 CONTRIBUTORS
336              
337             Patrick Hochstenbach, C<< patrick.hochstenbach at ugent.be >>
338              
339             Nicolas Franck, C<< nicolas.franck at ugent.be >>
340              
341             Johann Rolschewski, C<< jorol at cpan.org >>
342              
343             Vitali Peil, C<< vitali.peil at uni-bielefeld.de >>
344              
345             Jakob Voss, C<< nichtich at cpan.org >>
346              
347             Magnus Enger, C<< magnus at enger.priv.no >>
348              
349             Christian Pietsch, C<< christian.pietsch at uni-bielefeld.de >>
350              
351             Dave Sherohman, C<< dave.sherohman at ub.lu.se >>
352              
353             Snorri Briem, C<< snorri.briem at ub.lu.se >>
354              
355             Pieter De Praetere, C<< pieter.de.praetere at helptux.be >>
356              
357             Doug Bell
358              
359             Upsana, C<< me at upasana.me >>
360              
361             Stefan Weil
362              
363             Tom Hukins
364              
365             =head1 QUESTIONS, ISSUES & BUG REPORTS
366              
367             For any questions on the use of our modules please join our mailing list at:
368              
369             librecat-dev@lists.uni-bielefeld.de
370              
371             or send in your bug reports or feature requests to our issue tracker at:
372              
373             https://github.com/LibreCat/Catmandu/issues
374              
375             =head1 LICENSE AND COPYRIGHT
376              
377             This program is free software; you can redistribute it and/or modify it
378             under the terms of either: the GNU General Public License as published
379             by the Free Software Foundation; or the Artistic License.
380              
381             See L<http://dev.perl.org/licenses/> for more information.
382              
383             =cut