Acme-CPANAuthors
view release on metacpan or search on metacpan
lib/Acme/CPANAuthors/Utils/Packages.pm view on Meta::CPAN
package Acme::CPANAuthors::Utils::Packages;
use strict;
use warnings;
use CPAN::DistnameInfo;
use version;
use base 'Acme::CPANAuthors::Utils::CPANIndex';
sub _preambles {qw(
file url description columns intended_for
written_by line_count last_updated
)}
sub _mappings {+{
package => 'packages',
distribution => 'dists',
latest_distribution => 'latest_dists',
}}
sub _parse {
my ($self, $file) = @_;
my $handle = $self->_handle($file);
my $done_preambles = 0;
while (my $line = $handle->getline) {
$line =~ s/\r?\n$//;
unless ($done_preambles) {
if ($line =~ /^\s*$/) {
$done_preambles = 1;
}
elsif (my ($key, $value) = $line =~ /^([^:]+):\s*(.*)/) {
$key =~ tr/A-Z\-/a-z_/;
$self->{preambles}{$key} = $value;
}
next;
}
my ($package, $version, $path) = split ' ', $line;
my $dist = $self->_dist_from_path($path);
my $pkg = Acme::CPANAuthors::Utils::Packages::Package->new({
package => $package,
version => $version,
distribution => $dist,
});
push @{ $dist->{packages} ||= [] }, $pkg;
$self->{packages}{$package} = $pkg;
}
}
sub _dist_from_path {
my ($self, $path) = @_;
my $dist = $self->{dists}{$path};
return $dist if $dist;
my $info = CPAN::DistnameInfo->new($path);
$dist = Acme::CPANAuthors::Utils::Packages::Distribution->new({
prefix => $path,
dist => $info->dist,
version => $info->version,
maturity => $info->maturity,
filename => $info->filename,
cpanid => $info->cpanid,
distvname => $info->distvname,
});
$self->{dists}{$path} = $dist;
return unless defined $dist->version && $dist->dist;
( run in 1.704 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )