App-CPANTS-Lint
view release on metacpan or search on metacpan
lib/App/CPANTS/Lint.pm view on Meta::CPAN
$report .= "Ignored metrics: " . join(', ', @{$res->{ignored}}) . "\n";
}
if ($res->{ok}) {
$report .= "Congratulations for building a 'perfect' distribution!\n";
}
for my $type (qw/core extra experimental/) {
if (my $fails = $res->{fails}{$type}) {
$report .=
"\n" .
"Failed $type Kwalitee metrics and\n" .
"what you can do to solve them:\n\n";
for my $fail (@$fails) {
$report .=
"Name: $fail->{name}\n" .
"Remedy: $fail->{remedy}\n";
if ($fail->{error}) {
$report .= "Error: $fail->{error}\n";
}
$report .= "\n";
}
}
}
$report;
}
sub _supports_colour {
my $self = shift;
eval {
require Term::ANSIColor;
require Win32::Console::ANSI if $^O eq 'MSWin32';
1
}
}
sub _colour_scheme {
my $self = shift;
my %scheme = (
heading => "bright_white",
title => "blue",
fail => "bright_red",
pass => "bright_green",
warn => "bright_yellow",
error => "red",
summary => "blue",
);
if ($^O eq 'MSWin32') {
$scheme{$_} =~ s/bright_// for keys %scheme;
}
\%scheme;
}
sub _colour {
my ($self) = @_;
my $scheme = $self->_colour_scheme;
my $icon = $^O eq 'MSWin32'
? {pass => 'o', fail => 'x'}
: {pass => "\x{2713}", fail => "\x{2717}"};
my $report = Term::ANSIColor::colored("Distribution: ", "bold $scheme->{heading}")
. Term::ANSIColor::colored($self->result->{dist}, "bold $scheme->{title}")
. "\n";
my %failed;
for my $arr (values %{$self->result->{fails}}) {
for my $fail (@$arr) {
$failed{$fail->{name}} = $fail;
}
}
my $core_fails = 0;
for my $type (qw/ Core Optional Experimental /) {
$report .= Term::ANSIColor::colored("\n$type\n", "bold $scheme->{heading}");
my @inds = $self->{mca}->mck->get_indicators(lc $type);
my @fails;
for my $ind (@inds) {
if ($failed{ $ind->{name} }) {
push @fails, $ind;
$core_fails++ if $type eq 'Core';
$report .= Term::ANSIColor::colored(" $icon->{fail} ", $scheme->{fail}) . $ind->{name};
$report .= ": " . Term::ANSIColor::colored($failed{ $ind->{name} }{error}, $scheme->{error})
if $failed{ $ind->{name} }{error};
} else {
$report .= Term::ANSIColor::colored(" $icon->{pass} ", $scheme->{pass}) . $ind->{name};
}
$report .= "\n";
}
for my $fail (@fails) {
$report .= "\n"
. Term::ANSIColor::colored("Name: ", "bold $scheme->{summary}")
. Term::ANSIColor::colored("$fail->{name}\n", $scheme->{summary})
. Term::ANSIColor::colored("Remedy: ", "bold $scheme->{summary}")
. Term::ANSIColor::colored("$fail->{remedy}\n", $scheme->{summary});
}
}
my $scorecolour = $scheme->{pass};
$scorecolour = $scheme->{warn} if keys %failed;
$scorecolour = $scheme->{fail} if $core_fails;
$report .= "\n"
. Term::ANSIColor::colored("Score: ", "bold $scheme->{heading}")
. Term::ANSIColor::colored($self->result->{score}, "bold $scorecolour")
. "\n";
$report;
}
sub output_report {
my $self = shift;
if ($self->{opts}{save}) {
my $file = $self->report_file;
open my $fh, '>:utf8', $file or croak "Cannot write to $file: $!";
print $fh $self->report;
} else {
binmode(STDOUT, ':utf8');
print $self->report;
}
}
sub report_file {
my $self = shift;
my $dir = $self->{opts}{dir} || '.';
my $vname = $self->{mca}->d->{vname};
if (!$vname) {
require File::Basename;
$vname = File::Basename::basename($self->{res}{dist});
}
my $extension =
$self->{opts}{yaml} ? '.yml' :
$self->{opts}{json} ? '.json' :
$self->{opts}{dump} ? '.dmp' :
'.txt';
require File::Spec;
File::Spec->catfile($dir, "$vname$extension");
}
1;
__END__
=encoding utf-8
=head1 NAME
App::CPANTS::Lint - front-end to Module::CPANTS::Analyse
=head1 SYNOPSIS
use App::CPANTS::Lint;
my $app = App::CPANTS::Lint->new(verbose => 1);
$app->lint('path/to/Foo-Dist-1.42.tgz') or print $app->report;
# if you need raw data
$app->lint('path/to/Foo-Dist-1.42.tgz') or return $app->result;
# if you need to look at the details of analysis
$app->lint('path/to/Foo-Dist-1.42.tgz');
print Data::Dumper::Dumper($app->stash);
=head1 DESCRIPTION
( run in 0.594 second using v1.01-cache-2.11-cpan-d7f47b0818f )