CPAN-Audit
view release on metacpan or search on metacpan
lib/CPAN/Audit.pm view on Meta::CPAN
package CPAN::Audit;
use v5.10.1;
use strict;
use warnings;
use version;
use Carp qw(carp);
use Module::CoreList;
use CPAN::Audit::Installed;
use CPAN::Audit::Discover;
use CPAN::Audit::Filter;
use CPAN::Audit::Version;
use CPAN::Audit::Query;
use CPANSA::DB;
our $VERSION = '20260308.002';
sub new {
my( $class, %params ) = @_;
my @allowed_keys = qw(ascii db exclude exclude_file include_perl interactive no_corelist quiet verbose version);
my %args = map { $_, $params{$_} } @allowed_keys;
my $self = bless \%args, $class;
$self->_handle_exclude_file if $self->{exclude_file};
$self->{db} //= $self->_get_db(%args);
$self->{filter} = CPAN::Audit::Filter->new( exclude => $args{exclude} );
$self->{query} = CPAN::Audit::Query->new( db => $self->{db} );
$self->{discover} = CPAN::Audit::Discover->new( db => $self->{db} );
return $self;
}
sub _get_db {
my( $self, %params ) = @_;
if ( $params{'json_db'} ) {
my $data = do {
local $/;
open my($fh), '<:raw', $params{'json_db'}
or die "could not read file <$params{json_db}>\n";
<$fh>;
};
state $rc = require JSON;
my $decoded = eval { JSON::decode_json($data) };
die "could not decode JSON from <$params{json_db}>: @_\n" unless defined $decoded;
return $decoded;
}
my $rc = eval { require CPANSA::DB };
if ( $rc ) {
return CPANSA::DB->db;
}
$rc = eval {
warn "CPAN::Audit::DB is deprecated. Use CPANSA::DB instead.\n";
require CPAN::Audit::DB
};
if ( $rc ) {
return CPAN::Audit::DB->db;
}
die "could not find a CPANSA database in CPANSA::DB or CPAN::Audit::DB\n";
}
sub _handle_exclude_file {
my( $self ) = @_;
foreach my $file (@{$self->{exclude_file}}) {
my $fh;
unless( open $fh, "<", $file ) {
carp "unable to open exclude_file [$file]: $!\n";
return;
}
my @excludes =
grep { !/^\s*$/ } # no blank lines
map { s{^\s+|\s+$}{}g; $_ } # strip leading/trailing whitespace
map { s{#.*}{}; $_ } # strip comments
<$fh>;
push @{$self->{exclude}}, @excludes;
}
}
sub command_module {
my ( $self, $dists, $queried, $module, $version_range ) = @_;
return "Usage: module <module> [version-range]" unless $module;
my $distname = $self->{db}->{module2dist}->{$module};
if ( !$distname ) {
return "Module '$module' is not in database";
}
push @{ $queried->{$distname} }, $module;
$dists->{$distname} = $version_range // '';
return;
}
sub command_release {
my ( $self, $dists, $queried, $distname, $version_range ) = @_;
return "Usage: dist|release <module> [version-range]"
unless $distname;
( run in 1.694 second using v1.01-cache-2.11-cpan-5a3173703d6 )