CPAN-Releases-Latest
view release on metacpan or search on metacpan
lib/CPAN/Releases/Latest.pm view on Meta::CPAN
package CPAN::Releases::Latest;
$CPAN::Releases::Latest::VERSION = '0.08';
use 5.006;
use Moo;
use File::HomeDir;
use File::Spec::Functions 'catfile';
use MetaCPAN::Client 1.001001;
use Module::Runtime qw/ is_module_name require_module /;
use CPAN::DistnameInfo;
use Carp;
use autodie;
my $FORMAT_REVISION = 1;
has 'max_age' => (is => 'ro', default => sub { '1 day' });
has 'cache_path' => (is => 'rw');
has 'basename' => (is => 'ro', default => sub { 'latest-releases.txt' });
has 'path' => (is => 'ro');
has 'source' => (is => 'ro', default => sub { 'MetaCPAN' });
has '_indexer' => (is => 'lazy');
sub BUILD
{
my $self = shift;
if ($self->path) {
if (-f $self->path) {
return;
}
else {
croak "the file you specified with 'path' doesn't exist";
}
}
if (not $self->cache_path) {
my $classid = __PACKAGE__;
$classid =~ s/::/-/g;
$self->cache_path(
catfile(File::HomeDir->my_dist_data($classid, { create => 1 }),
$self->basename)
);
}
if (-f $self->cache_path) {
require Time::Duration::Parse;
my $max_age_in_seconds = Time::Duration::Parse::parse_duration(
$self->max_age
);
return unless time() - $max_age_in_seconds
> (stat($self->cache_path))[9];
}
$self->_build_cached_index();
}
sub _build_cached_index
{
my $self = shift;
my $indexer = $self->_indexer;
my $distdata = $indexer->get_release_info();
$self->_write_cache_file($distdata);
}
sub _build__indexer
{
my $self = shift;
my $base_module_name = $self->source;
if (not is_module_name($base_module_name)) {
croak "source '$base_module_name' is not a valid module name";
}
my $full_class_name = "CPAN::Releases::Latest::Source::$base_module_name";
require_module($full_class_name);
return $full_class_name->new();
}
sub _write_cache_file
{
my $self = shift;
my $distdata = shift;
my %seen;
$seen{$_} = 1 for keys(%{ $distdata->{released} });
$seen{$_} = 1 for keys(%{ $distdata->{developer} });
open(my $fh, '>', $self->cache_path);
print $fh "#FORMAT: $FORMAT_REVISION\n";
foreach my $distname (sort { lc($a) cmp lc($b) } keys %seen) {
my ($stable_release, $developer_release);
if (defined($stable_release = $distdata->{released}->{$distname})) {
printf $fh "%s %s %d %d\n",
$distname,
$stable_release->{path},
$stable_release->{time},
$stable_release->{size};
}
if ( defined($developer_release = $distdata->{developer}->{$distname})
&& ( !defined($stable_release)
|| $developer_release->{time} > $stable_release->{time}
)
)
{
printf $fh "%s %s %d %d\n",
$distname,
$developer_release->{path},
( run in 1.552 second using v1.01-cache-2.11-cpan-524268b4103 )