summaryrefslogtreecommitdiffstats
path: root/lib/App/ArchLinux/PackagerTools/CPAN/PackagesDetailsFetcher.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/App/ArchLinux/PackagerTools/CPAN/PackagesDetailsFetcher.pm')
-rw-r--r--lib/App/ArchLinux/PackagerTools/CPAN/PackagesDetailsFetcher.pm73
1 files changed, 73 insertions, 0 deletions
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__