App-Dothe

 view release on metacpan or  search on metacpan

lib/App/Dothe/Task.pm  view on Meta::CPAN

package App::Dothe::Task;
our $AUTHORITY = 'cpan:YANICK';
$App::Dothe::Task::VERSION = '0.0.1';
use 5.20.0;
use warnings;

use Moose;

use Log::Any qw($log);
use Types::Standard qw/ ArrayRef InstanceOf /;
use Type::Tiny;
use List::AllUtils qw/ min pairmap /;
use Ref::Util qw/ is_arrayref is_hashref /;
use PerlX::Maybe;
use Text::Template;
use Path::Tiny;
use File::Wildcard;


use experimental qw/
    signatures
    postderef
/;

has name => (
    is       => 'ro',
    required => 1,
);


has cmds => (
    is => 'ro',
    lazy => 1,
    default => sub { [] },
    traits => [ 'Array' ],
    handles => {
        commands => 'elements',
    },
);

has raw_sources => (
    is => 'ro',
    init_arg => 'sources',
    default => sub { [] },
);

has raw_generates => (
    is => 'ro',
    init_arg => 'generates',
    default => sub { [] },
);

has sources => (
    is => 'ro',
    init_arg => undef,
    lazy => 1,
    default => sub($self) {
        $self->vars->{sources} = $self->expand_files( $self->raw_sources )
    },
);

has generates => (
    is => 'ro',
    init_arg => undef,
    lazy => 1,
    default => sub ($self){
        $self->vars->{generates} = $self->expand_files( $self->raw_generates )
    },
);

sub expand_files($self, $list ) {
    $list = [ $list ] unless ref $list;

    [
    map { File::Wildcard->new( path=> $_ )->all }
    map { s!\*\*!/!gr }
    map { $self->render( $_, $self->vars ) }
    @$list ]
}


has tasks => (
    is	    => 'ro',
    required => 1,
);



sub latest_source_mod($self) {
    return min map { -M "".$_ } $self->sources->@*;
}

sub latest_generate_mod($self) {
    return min map { -M "".$_ } $self->generates->@*;
}

sub is_uptodate ($self) {
    return 0 if $self->tasks->force;

    my $source = $self->latest_source_mod;
    my $gen = $self->latest_generate_mod;

    return ( $gen and $source >= $gen );
};

has raw_vars => (
    is	    => 'ro',
    isa 	=> 'HashRef',
    init_arg => 'vars',
    default => sub {
        +{}
    },
);

has vars => (
    is => 'ro',
    lazy => 1,
    init_arg => undef,
    isa => 'HashRef',
    builder => '_build_vars',
);


sub render($self,$template,$vars) {
    if( is_arrayref $template ) {
        return [ map { $self->render($_,$vars) } @$template ];
    }

    if( is_hashref $template ) {
        return { pairmap { $a => $self->render($b,$vars) } %$template }
    }



( run in 0.831 second using v1.01-cache-2.11-cpan-5b529ec07f3 )