| Acme-CPANAuthors documentation | Contained in the Acme-CPANAuthors distribution. |
Acme::CPANAuthors::Utils
This may export several utility functions to use internally.
returns a (probably cached) Parse::CPAN::Packages object.
clears cached Parse::CPAN::Authors/Packages objects.
Kenichi Ishigaki, <ishigaki at cpan.org>
Copyright (C) 2007 by Kenichi Ishigaki.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
| Acme-CPANAuthors documentation | Contained in the Acme-CPANAuthors distribution. |
package Acme::CPANAuthors::Utils; use strict; use warnings; use Carp; use base qw( Exporter ); use File::Spec; our $VERSION = '0.14'; # see RT #43388 our @EXPORT_OK = qw( cpan_authors cpan_packages ); my $CPANFiles = {}; sub clear_cached_cpan_files () { $CPANFiles = {}; } sub cpan_authors () { unless ( $CPANFiles->{authors} ) { require Acme::CPANAuthors::Utils::Authors; $CPANFiles->{authors} = Acme::CPANAuthors::Utils::Authors->new( _cpan_authors_file() ); } return $CPANFiles->{authors}; } sub cpan_packages () { unless ( $CPANFiles->{packages} ) { require Acme::CPANAuthors::Utils::Packages; $CPANFiles->{packages} = Acme::CPANAuthors::Utils::Packages->new( _cpan_packages_file() ); } return $CPANFiles->{packages}; } sub _cpan_authors_file () { _cpan_file( authors => '01mailrc.txt.gz' ); } sub _cpan_packages_file () { _cpan_file( modules => '02packages.details.txt.gz' ); } sub _cpan_file { my ($dir, $basename) = @_; my $file; if ($ENV{ACME_CPANAUTHORS_HOME}) { $file = _catfile($ENV{ACME_CPANAUTHORS_HOME}, $dir, $basename); return $file if $file && -r $file; } require File::Path; for my $parent (File::Spec->tmpdir, '.') { my $tmpdir = File::Spec->catdir($parent, '.acmecpanauthors', $dir); eval { File::Path::mkpath($tmpdir) }; next unless -d $tmpdir && -r _; $file = _catfile($tmpdir, $basename); my $how_old = -M $file; if (!-r $file or !$how_old or $how_old > 1) { require LWP::UserAgent; my $ua = LWP::UserAgent->new(env_proxy => 1); my $res = $ua->mirror('http://www.cpan.org/'.$dir.'/'.$basename, $file); next if $res->is_error; } return $file if -r $file; } croak "$basename not found"; } sub _catfile { File::Spec->canonpath( File::Spec->catfile( @_ ) ); } 1; __END__