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 )