The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl

use Catmandu;
use Catmandu::CLI;
use Cwd ();

Catmandu->default_load_path(Cwd::getcwd);
Catmandu::CLI->run // exit(2);

=head1 NAME

catmandu - LibreCat command line tools

=head1 SYNOPSIS

 catmandu [-D|-D2|-D3] [-I path] [-L path] [COMMAND] [-?hqv] [long options...] [ARGS]

 catmandu --version

 catmandu help

 # convert
 catmandu convert JSON to YAML < file.json
 catmandu convert YAML to JSON < file.yaml
 catmandu convert YAML < file.yaml # 'to JSON' is implicit
 catmandu convert MARC < records.mrc 
 catmandu convert MARC --fix 'marc_map(245,title)' < records.mrc
 catmandu convert OAI --url https://biblio.ugent.be/oai 
 catmandu convert SRU --base http://www.unicat.be/sru --query dna 

 # import
 catmandu import JSON to MongoDB --database_name mydb < records.json
 catmandu import MARC to MongoDB --database_name mydb < records.mrc
 catmandu import MARC to ElasticSearch --index_name mydb < records.mrc
 catmandu import MARC to ElasticSearch --index_name mydb --fix 'marc_map("245a","title")' < records.mrc

 # export
 catmandu export MongoDB --database_name mydb --bag data to JSON
 catmandu export MongoDB --database_name mydb --bag data to JSON --fix 'retain("_id")'
 catmandu export Solr --url http://localhost:8983/solr to JSON
 catmandu export ElasticSearch --index_name mydb to JSON

 # configuration
 $ cat catmandu.yml
 ---
 store:
  test1:
   package: MongoDB
   options:
    database_name: mydb

 catmandu import JSON to test1 < records.json 

 catmandu config   # show the contents of catmandu.yml

 catmandu count test1 
 catmandu delete test1 -q 'title:"My Rabbit"'

=head1 COMMANDS

=head2 help COMMAND

Documentation about command line options. 

=head2 config

Display the contents of the catmandu.yml files in your project.

=head2 convert IMPORTER [OPTIONS] [[--fix FIX]] to EXPORTER [OPTIONS]

Convert data from one format to another format with help of L<Catmandu::Importer>s and 
L<Catmandu::Exporter>s. All options given on the command line will be send to the Importer 
or Exporter as initialization parameters. E.g.

 catmandu convert OAI --url BASEURL --metadataPrefx PREFIX \
                  to \
                  CSV --header 1 --sep_char '|'

Look at the documentation of all the importers and exporters to see which options are
available.

All importers accept one or more --fix options with the name of a fix file or file command.

 catmandu convert JSON --fix fixes.txt
 catmandu convert JSON --fix 'remove_field(abc)'

The JSON exporter is implicit and is optional.

 catmandu convert YAML to JSON  
 catmandu convert YAML # shorter 

=head2 count STORE [OPTIONS]

Count the number of items in a L<Catmandu::Store>. All options given on the command line 
will be send to the store as initialization parameters. E.g.

 catmandu count MongoDB --database_name mydb --bag data

=head2 delete STORE [OPTIONS] [-q QUERY]

Delete items from a L<Catmandu::Store>. All options given on the command line 
will be send to the store as initialization parameters. Optionally a QUERY can
be provided to select the items to delete. E.g.

 catmandu delete MongoDB --database_name mydb --bag data -q "title:Delete me"

=head2 export STORE [OPTIONS] [-q QUERY] [--limit LIMIT] [[--fix FIX]] to EXPORTER [OPTIONS]

Export items from a L<Catmandu::Store> using a L<Catmandu::Exporter>. All options given 
on the command line will be send to the Store or Exporter as initialization parameters.
Optionally a QUERY and LIMIT can be provided to selectively export items from the Store.
Optionally a FIX can be provided to be executed on all the items before they are 
exporter by the exporter.

E.g.

 catmandu export MongoDB --database_name mydb --bag data -q "title:Perl"

=head2 import IMPORTER [OPTIONS] [[--fix FIX]] to STORE [OPTIONS]

Import items from a L<Catmandu::Importer> to a L<Catmandu::Store>. All options given 
on the command line will be send to the Importer or Store as initialization parameters.
Optionally a FIX can be provided to be executed on all the items before they are
stored into the Store.

 catmandu import JSON to MongoDB --database_name mydb < records.json

=head2 move STORE [OPTIONS] [-q QUERY] [--limit LIMIT] [[--fix FIX]] to STORE [OPTIONS]

Move items from one L<Catmandu::Store> to another. All options given 
on the command line will be send to the Stores as initialization parameters.
Optionally a QUERY and LIMIT can be provided to selectively export items from the Store.
Optionally a FIX can be provided to be executed on all the items before they are 
stored.

=head2 data [LONG_OPTIONS]

Low level data manipulation command. See DATA OPTIONS below for full documentation.

=head1 OPTIONS

=over 4

=item -v

Verbose output.

=item -h

=item -?

=item --lib-path PATH

=item -I

Specifies Perl library include paths, like perl's -I option. This option is
repeatable.

=item --load-path PATH

=item -L PATH

Search upwards from this path for configuration files and accompanying lib
directories. This option is repeatable.

=item --debug [LEVEL]

=item -D[LEVEL]

Set the debugging level for Catmandu. LEVEL is one of:

    1 - WARN messages
    2 - INFO messages
    3 - DEBUG messages

Requires an installation of L<Log::Log4perl> and L<Log::Any::Adapter::Log4perl>. By
default an internal log4perl configuration file is used that sends all debug messages
to stderr. Optionally in the catmandu.yml the path to a log4perl configuration file
can be set. E.g.

    catmandu.yml:

    log4perl: /etc/log4perl.conf

    or

    log4perl: "
     log4perl.category.Catmandu=$level,$appender

	 log4perl.appender.STDOUT=Log::Log4perl::Appender::Screen
	 log4perl.appender.STDOUT.stderr=0
	 log4perl.appender.STDOUT.utf8=1

	 log4perl.appender.STDOUT.layout=PatternLayout
	 log4perl.appender.STDOUT.layout.ConversionPattern=%d [%P] - %p %l %M time=%r : %m%n

	 log4perl.appender.STDERR=Log::Log4perl::Appender::Screen
	 log4perl.appender.STDERR.stderr=0
	 log4perl.appender.STDERR.utf8=1

	 log4perl.appender.STDERR.layout=PatternLayout
	 log4perl.appender.STDERR.layout.ConversionPattern=%d [%P] - %l : %m%n
    "

See also L<Catmandu::Logger> to enable logging for your own Catmandu packages.

=back

=head1 DATA OPTIONS

These low level options are available to the "catmandu data" command.

=over 4

=item --from-store STORE

Read items from a Catmandu::Store such as: DBI, MongoDB, Solr, ElasticSearch, ...

=item --from-importer IMPORTER

Read items from a Catmandu::Importer such as: YAML, JSON, CSV, MARC, OAI ...

=item --from-bag BAG_NAME

This option should be used in combination with a --from-store. Select from the Store
only the items belonging to the bag BAG_NAME.

=item --from-OPTION OPTION_VALUE

To include configuration options to a Catmandu::Store or Catmandu::Importer an
argument with prefix '--from-' can be used. E.g. to provide an 'file' to an Importer
use:

  --from-file /my/path/to/file.txt

=item --into-exporter EXPORTER

Add each item read into a Catmandu::Exporter such as: JSON, YAML, Template, XLS, ...

=item --into-store STORE

Add each item read into a Catmandu::Store such as: DBI, MongoDB, Solr, ElasticSearch, ...

=item --into-bag BAG_NAME

This option should be used in combination with a --into-store. Add each item into the
Store with bag BAG_NAME.

=item --into-OPTION OPTION_VALUE

To include configuration options to a Catmandu::Store or Catmandu::Exporter an
argument with prefix '--into-' can be used. E.g. to provide an 'file' to an Exporter
use:

  --into-file /tmp/file.txt

=item --fix EXPRESSION

=item --fix FILE

When exporting or storing apply a fix EXPRESSION or all the fixes in FILE on
each item. This option is repeatable. FILE can also be an arbitrary executable
if Catmandu::Fix::cmd is installed.

=item --start NUM

When exporting or storing data skip the first NUM items.

=item --total NUM

When exporting of storing data process only a total NUM of items.

=item --replace

When storing data first delete all the items in the Store or Bag.

=item --query QUERY

=item --cql-query QUERY | -q QUERY

When a Store is searchable execute and return the results. Using the --cql-query or -q
option the CQL query language can be used (if supported).

=item --limit NUM

Limit the number of results returned from the searchable results to NUM.

=item --count

Report the number of items processed.

=item --version

Return the installed version of Catmandu.

=back

=head1 SEE ALSO

L<Catmandu::Importer>
L<Catmandu::Exporter>
L<Catmandu::Store>
L<Catmandu::MARC>
L<Catmandu::OAI>
L<Catmandu::MongoDB>
L<Catmandu::Solr>
L<Catmandu::ElasticSearch>

=cut