App-Dothe

 view release on metacpan or  search on metacpan

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

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

use Ref::Util qw/ is_arrayref is_hashref /;

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 }
    }

    return $self->template($template)->fill_in(HASH => $vars );
}

sub _build_vars($self) {
    my %vars;

    %vars = (
        %vars,
        pairmap { $a => $self->render( $b, \%vars ) } $self->raw_vars->%*
    );

    return \%vars;
}

has tasks => (
    is => 'ro',
    lazy => 1,
    traits => [ 'Hash' ],
    default => sub($self) { +{} },
);

sub task($self,$name) {
    return $self->{tasks}{$name} ||= App::Dothe::Task->new(
        name => $name, tasks => $self, $self->config->{tasks}{$name}->%* );
}

option file => (
    is => 'ro',
    documentation => 'configuration file',
    isa => 'Str',
    default => './Dothe.yml',
);

has config => (
    is => 'ro',
    lazy => 1,
    default => sub($self) { LoadFile( $self->file ) },
);

sub run( $self ) {

    if ( my $code = $self->config->{code} ) {
        eval join '', 'package App::Dothe::Sandbox;', @$code;
    }

    $self->task($self->target)->run;

}

sub template ($self,$source) {

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


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 );

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


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 }
    }

    no warnings 'uninitialized';
    $self->template( $template )->fill_in( HASH => $vars,
        PACKAGE => 'App::Dothe::Sandbox',
    );
}

sub _build_vars($self) {
    my %vars = ( $self->tasks->vars->%*, $self->raw_vars->%* );

    %vars = (
        %vars,
        pairmap { $a => $self->render( $b, \%vars ) }
            $self->raw_vars->%*
    );

    return \%vars;
}

has foreach => (
    is	    => 'ro',
    isa 	=> 'Str',
);

sub foreach_vars($self) {
    my $foreach = $self->foreach or return;

    $self->sources;
    $self->generates;

    return map { +{ item => $_ } } $self->vars->{$foreach}->@*;
}

has deps => (
    is	    => 'ro',
    isa 	=> 'ArrayRef',
    default => sub {
        []
    },
);

sub dependency_tree($self, $graph = undef ) {
    require Graph::Directed;

    $graph ||= Graph::Directed->new;

    return $graph
        if $graph->get_vertex_attribute( $self->name, 'done' );

    $graph->set_vertex_attribute( $self->name, 'done', 1 );

    for my $dep ( $self->deps->@* ) {
        $graph->add_edge( $dep => $self->name );
        $self->tasks->task($dep)->dependency_tree($graph);
    }

    return $graph;
}

sub dependencies($self) {
    return grep { $_ ne $self->name } $self->dependency_tree->topological_sort;
}

sub run($self) {
    my @deps = $self->dependencies;

    $self->tasks->task($_)->run for @deps;

    $log->infof( "running task %s", $self->name );

    if ( $self->is_uptodate ) {
        $log->infof( '%s is up-to-date', $self->name );
        return;
    }

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

        }
        return;
    }

    for my $command ( $self->commands ) {
            $self->run_command( $command, $vars );
    }

}

sub run_command($self,$command,$vars) {

    if( !ref $command ) {
        $command = { cmd => $command };
    }

    if( my $subtask = $command->{task} ) {
            my $t = $self->tasks->task($subtask);
            my $newt = App::Dothe::Task->new(
                name => $t->name,
                tasks => $t->tasks,



( run in 0.622 second using v1.01-cache-2.11-cpan-65fba6d93b7 )