#!/usr/bin/env perl

use common::sense;

use Getopt::Long qw(:config no_ignore_case bundling);
use Pod::Usage;
use Term::ANSIColor qw/:constants/;

use Liveman;

my $parse_options_ok = GetOptions(
    'help|h'      => \( my $help = 0 ),
    'man'         => \( my $man  = 0 ),
    'O|options=s' => \( my $options ),
    'p|prove!'    => \( my $prove = 0 ),
    'o|open!'     => \( my $open = 0 ),
    'c|compile!'  => \( my $compile_only = 0 ),
    'f|force!'    => \( my $compile_force = 0 ),
    'a|append!'   => \( my $append = 0 ),
);

if ( !$parse_options_ok ) {
    pod2usage(2);
}
elsif ($help) {
    pod2usage(
        -sections => "NAME|SYNOPSIS|DESCRIPTION|OPTIONS",
        -verbose  => 99
    );
}
elsif ($man) {
    pod2usage( -exitval => 0, -verbose => 2 );
}
elsif($append) {
    my $liveman = Liveman->new(files => \@ARGV)->appends;
    exit $liveman->{count} > 0? 0: 1;
}
else {
    my $liveman = Liveman->new(
        files => \@ARGV,
        options => $options,
        prove => $prove,
        open => $open,
        compile_force => $compile_force,
    );
    $liveman->transforms;
    exit 0 if $compile_only;
    exit $liveman->tests->{exit_code};
}

__END__

=encoding utf-8

=head1 NAME

B<liveman> - "живой мануал". Утилита для преобразования B<lib/**.md>-файлов в файлы тестов (B<t/**.t>) и документацию (B<POD>), которая помещается в соответствующий модуль B<lib/**.pm>

=head1 VERSION

Version 1.0

=head1 SYNOPSIS

    liveman [-h] [--man] [-o][-c][-f][-s] [<files> ...]

=head1 DESCRIPTION

Проблема современных проектов в том, что документация оторвана от тестирования.
Это означает, что примеры в документации могут быть нерабочими, а сама документация — отставать от кода.

Метод одновременного документирования и тестирования решает данную проблему.

Для документирования выбран формат md, как наиболее лёгкий для ввода и широкораспространённый. 
Секции кода B<perl>, описанные в нём, транслируются в тест. А докуметация транслируется в B<POD> и добавляется в секцию B<__END__> модуля perl.

Другими словами B<liveman> преобразует B<lib/**.md>-файлы в файлы тестов (B<t/**.t>) и документацию, которая помещается в соответствующий модуль B<lib/**.pm>. 
И сразу же запускает тесты с покрытием.

Покрытие можно посмотреть в файле cover_db/coverage.html.

Примечание: в B<.gitignore> лучше сразу же поместить B<cover_db/>.


=head1 OPTIONS

=over 4

=item B<-h>, B<--help>

Показать помощь и выйти.

=item B<--man>

Распечатать мануал и завершиться.

=item B<-o>, B<--open>

Открыть в браузере покрытие.

=item B<-c>, B<--compile>

Только компилировать, тесты не запускаем.

=item B<-f>, B<--force>

Трансформировать файлы lib/**.md даже если они не изменились.

=item B<-p>, B<--prove>

Запустить тесты в prove, а не yath.

=item B<-o> OPTIONS, B<--options> OPTIONS

Передать строку с опциями в yath или prove. Эти опции добавятся к опциям по умолчанию.

Опции по умолчанию у yath:

    yath test -j4 --cover

Опции по умолчанию у prove:

    prove -Ilib -r t

=item B<-а>, B<--append>

Добавить разделы функций в *.md из *.pm и завершиться.

=back

=head1 LICENSE

⚖ B<GPLv3>

B<liveman>  Copyright (C) 2007  Yaroslav O. Kosmina E<lt>darviarush@mail.ruE<gt>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.

=head1 AUTHOR

Yaroslav O. Kosmina E<lt>darviarush@mail.ruE<gt>

=cut
