tokuhirom's Blog

yet another cpanf

I wrote cpanf command clone using metacpan API.

#!/usr/bin/env perl
use strict;
use warnings;
use 5.008005;
use JSON;
use LWP::UserAgent;
use Pod::Usage;

our $VERSION = '0.01';

my $module = pop @ARGV || pod2usage(); # last one is module name

my $ua = LWP::UserAgent->new(agent => "$0/$VERSION");

my $release = get_json("http://api.beta.metacpan.org/module/$module", 'distribution');
my $url = get_json("http://api.beta.metacpan.org/release/$release", 'download_url');
warn $url;

system('cpanm', @ARGV, $url);

sub get_json {
    my ($api_url, $key) = @_;
    my $res = $ua->get($api_url);
    die "$api_url: " . $res->status_line . "\n" . $res->content unless $res->is_success;
    my $dat = decode_json($res->content);
    $dat->{$key} || die "Invalid json: " . $res->content;
}