From 94ec85b051896ba028e475d6d7c8eb1d9e359ac4 Mon Sep 17 00:00:00 2001 From: Florian Pritz Date: Sun, 16 Dec 2018 23:01:17 +0100 Subject: Move CPAN 02packages code to dedicated class Signed-off-by: Florian Pritz --- .../PackagerTools/CPAN/PackagesDetailsFetcher.pm | 73 ++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 lib/App/ArchLinux/PackagerTools/CPAN/PackagesDetailsFetcher.pm (limited to 'lib/App/ArchLinux/PackagerTools/CPAN/PackagesDetailsFetcher.pm') diff --git a/lib/App/ArchLinux/PackagerTools/CPAN/PackagesDetailsFetcher.pm b/lib/App/ArchLinux/PackagerTools/CPAN/PackagesDetailsFetcher.pm new file mode 100644 index 0000000..7624836 --- /dev/null +++ b/lib/App/ArchLinux/PackagerTools/CPAN/PackagesDetailsFetcher.pm @@ -0,0 +1,73 @@ +package App::ArchLinux::PackagerTools::CPAN::PackagesDetailsFetcher; +use strictures; + +use autodie; +use Function::Parameters; +use Log::Any qw($log); +use IPC::Run qw(run); + +=head1 NAME + +App::ArchLinux::PackagerTools::CPAN::PackagesDetailsFetcher - Provide access to the 02packages.details CPAN file + +=head1 SYNOPSIS + + use App::ArchLinux::PackagerTools::CPAN::PackagesDetailsFetcher; + +=head1 DESCRIPTION + +Internal class that abstracts access to the 02packages file from CPAN. + +=head1 METHODS + +=head2 new + + my $fetcher = App::ArchLinux::PackagerTools::CPAN::PackagesDetailsFetcher->new(); + +Returns a new instance. + +=cut + +method new($class: $deps = {}) { + return $class->new_no_defaults($deps); +} + +method new_no_defaults($class: $deps = {}) { + my $self = {}; + bless $self, $class; + $self->{deps} = $deps; + return $self; +} + +=head2 Public Methods +=cut + +=head3 get_packages_data + + my $data = $fetcher->get_packages_data(); + +Return the uncompressed data of the 02packages.details.txt.gz file. + +=cut + +method get_packages_data() { + my $data; + my $use_cpanplus_index = 1; + # TODO put this in a dedicated module for testing + if ($use_cpanplus_index) { + # This is mostly for development so we don't go over the network on each run. + my $packages_file = "$ENV{HOME}/.cpanplus/02packages.details.txt.gz"; + run ['zcat', $packages_file], \undef, \$data or die $log->error("Failed to fetch and uncompress CPAN module index: $?")."\n"; + } else { + # TODO cache the details file locally + # TODO when we have a cache of this, remove the $use_cpanplus_index part since that is worse than having our own cache + # TODO make the cpan mirror configurable + run [qw(curl -s ), "https://cpan.metacpan.org/modules/02packages.details.txt.gz"], '|', ['zcat'], \$data or die $log->error("Failed to fetch and uncompress CPAN module index: $?")."\n"; + } + + return $data; +} + +1; + +__END__ -- cgit v1.2.3-24-g4f1b