Acme-CPANAuthors

 view release on metacpan or  search on metacpan

lib/Acme/CPANAuthors/Utils/Packages.pm  view on Meta::CPAN


  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;

  # see if it's latest
  my $distname = $info->dist;
  my $latest = $self->{latest_dists}{$distname};
  unless ($latest) {
    $self->{latest_dists}{$distname} = $dist;
    return $dist;
  }
  my ($distv, $latestv);
  eval {
    no warnings;
    $distv   = version->new( $dist->version   || 0 );
    $latestv = version->new( $latest->version || 0 );
  };
  if ($distv && $latestv) {
    if ($distv > $latestv) {
      $self->{latest_dists}{$distname} = $dist;
    }
  }
  else {
    no warnings;
    if ($dist->version > $latest->version) {
      $self->{latest_dists}{$distname} = $dist;
    }
  }

  $dist;
}

package #
  Acme::CPANAuthors::Utils::Packages::Distribution;

use strict;
use warnings;
use base 'Class::Accessor::Fast';

__PACKAGE__->mk_ro_accessors(qw/
  prefix
  dist
  version
  maturity
  filename
  cpanid
  distvname
  packages
/);

*path    = *prefix;
*name    = *dist;
*pauseid = *cpanid;

sub contains { @{ shift->{packages} || [] } }

package #
  Acme::CPANAuthors::Utils::Packages::Package;

use strict;
use warnings;
use base 'Class::Accessor::Fast';

__PACKAGE__->mk_ro_accessors(qw/
  package
  version
  distribution
/);

*name = *package;

1;



( run in 1.346 second using v1.01-cache-2.11-cpan-ceb78f64989 )