App-Prove-Plugin-TraceUse

 view release on metacpan or  search on metacpan

lib/App/Prove/Plugin/TraceUse.pm  view on Meta::CPAN

    use List::Util qw/max/;

    use Term::ANSIColor;

    sub _uniquify_dependencies {

        my $self = shift;

        my %d;

        for ( @{ $self->{collected_dependencies} } ) {

            if ( version->new($_->[1]) > version->new($d{ $_->[0] } || 0) ) {
                $d{ $_->[0] } = $_->[1];
            }

        }

        my @d;
        while ( my ($k,$v) = each %d ) {
            push @d, [$k,$v];
        }

        $self->{collected_dependencies} = \@d;

    }

    sub present_dependencies {

        my $self = shift;

        my @d = sort {
            $a->[0] cmp $b->[0]
        } @{ $self->{collected_dependencies} };

        my $n = max( map {length $_->[0]} @d ) + 2;

        print "# TraceUse report:\n";

        if ( not @d ) {
            print "# no noncore dependencies found\n";
            return;
        }

        my $makefile_requirements = App::Prove::Plugin::TraceUse::_parse_makefile_pl();
        my $build_requirements = App::Prove::Plugin::TraceUse::_parse_build_pl();

        my $present_file_dep = sub {
            my ($dep_hash) = @_;

            my $hash_fails = 0;

            for (@d) {

                my($mod,$ver) = @$_;

                my $v = $dep_hash->{$mod};

                if ( not $v ) {
                    print "# ";
                    print colored ['bold red'], sprintf "%-${n}s => '%s',\n", "'".$_->[0]."'", $_->[1];
                    $hash_fails = 1;
                }
                elsif ( $v and qv($v) < qv($ver) ) {
                    print "# ";
                    print colored ['bold yellow'], sprintf "%-${n}s => '%s',\n", "'".$_->[0]."'", $_->[1];
                    $hash_fails = 1;
                }

            }

            if ( not $hash_fails ) {
                print "# - dependencies are ok\n";
            }

            return not $hash_fails;

        };

        my $dependencies_are_good = 1;

        if ( $makefile_requirements ) {

            print "# Makefile.PL:\n";
            my $ok = $present_file_dep->($makefile_requirements);
            $dependencies_are_good &&= $ok;

        }

        if ( $build_requirements ) {

            print "# Build.PL:\n";
            my $ok = $present_file_dep->($build_requirements);
            $dependencies_are_good &&= $ok;

        }

        if ( not $dependencies_are_good and 0 ) {
            print "# List of dependencies found during testing:\n";
            for ( @d ) {
                printf "# %-${n}s => '%s',\n", "'".$_->[0]."'", $_->[1];
            }
        }

    }

    sub new {

        my $self = shift;

        my $tf = File::Temp->new;
        my $fn = "$tf";

        ## add the traceuse option
        $_[0]->{switches} = ["-d:TraceUse=hidecore,output:$fn"];

        my $obj = $self->SUPER::new(@_);

        $obj->{collected_dependencies} = [];

        my $trace_use_sub = sub {

            my $dt = read_file( $fn );
            my $p = App::Prove::Plugin::TraceUse::_parse_traceuse($dt);
            my $deps = App::Prove::Plugin::TraceUse::_find_dependent_modules($p);
            push @{ $obj->{collected_dependencies} }, @$deps;



( run in 1.198 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )