#!/usr/bin/env perl # vim: sts=3 ts=3 sw=3 et ai : use strict; use warnings; use 5.010; use HTTP::Tiny; use JSON::PP qw< decode_json >; use Data::Tubes qw< pipeline >; pipeline( [ 'Plumbing::cache' => \&all_pages_uris, cache => ['!Data::Tubes::Util::Cache', repository => './'], key => sub { (my $key = shift) =~ s{\W+}{-}gmxs; return 'cache-apu-' . $key; }, ], [ 'Plumbing::cache' => \&get_uri, cache => ['!Data::Tubes::Util::Cache', repository => './'], key => sub { (my $key = shift) =~ s{\W+}{-}gmxs; return 'cache-' . $key; }, ], sub { return (records => decode_json(shift)); }, sub { return {structured => shift}; }, ['Renderer::with_template_perlish' => "Thank you, [% login %]!\n"], 'Writer::to_files', {tap => 'sink'}, )->("https://api.github.com/orgs/perl6/public_members"); sub all_pages_uris { my $uri = shift; my $response = HTTP::Tiny->new()->head($uri); die "error in HEAD($uri): $response->{status} $response->{reason}" unless $response->{success}; my $headers = $response->{headers}; my @link_headers = !exists($headers->{link}) ? () : ref($headers->{link}) ? (@{$headers->{link}}) : ($headers->{link}); my @uris = ($uri); for my $lh (@link_headers) { for my $link (split /,\s+/, $lh) { my ($uri) = $link =~ m{\A\s*<(.*)>;}mxs; push @uris, $uri; } } return (records => \@uris); } ## end sub all_pages_uris sub get_uri { state $ua = HTTP::Tiny->new(); my $uri = shift; my $response = $ua->get($uri); die "error in HEAD($uri): $response->{status} $response->{reason}" unless $response->{success}; return $response->{content}; }