Parse::CPAN::Packages::Fast - parse CPAN's package index
use Parse::CPAN::Packages::Fast; my $p = Parse::CPAN::Packages::Fast->new("/path/to/02packages.details.txt.gz"); ## Or alternatively, if CPAN.pm is configured #my $p = Parse::CPAN::Packages::Fast->new; my $m = $p->package("Kwalify"); # $m is a Parse::CPAN::Packages::Fast::Package object print $m->package, "\n"; # Kwalify print $m->version, "\n"; # 1.21 my $d = $m->distribution; # $d is a Parse::CPAN::Packages::Fast::Distribution object print $d->dist, "\n"; # Kwalify print $d->version, "\n"; # 1.21
This is a largely API compatible rewrite of Parse::CPAN::Packages.
Notable differences are
containsmethod. Likewise, a Parse::CPAN::Packages::Fast::Package object does not include the containing distribution in the data structure, but it's necessary to use the
newconstructor may be called without the path to the
02packages.details.txtfile. In this case CPAN.pm's logic is used to find an existing packages file. Note that this might be interactive (i.e. if CPAN.pm was never configured, or needs reconfiguration), so don't do this in batch systems.
Parse::CPAN::Packages' constructor is quite slow and takes about 10 seconds on my machine. In contrast, the reimplementation just takes a second.
I did some benchmarking of the original module and found no obvious weak point to speed it up. Moose is used here, but does not seem to cause the problem. I suspect that the real problem is just heavy use of method calls.
Also, this module does not have problems with circular references like the original. See "BUGS" in Parse::CPAN::Packages.