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 )