• このエントリーをはてなブックマークに追加

2012-11-20 14:40 追記
@punytan さんからありがたい情報をいただきました:

@issm App::cpanlistchanges とかありますよ
Twitter / punytan: @issm App::cpanlistchanges …

まさしくこれですね.ありがとうございます!

2012-11-20 12:45 追記
「ChangeLog」という名前にも対応できるよう修正してみました.他にもいろいろありそうだなぁ><

はじめに

「あ,この CPAN モジュール,バージョン上がってた.どんな変更があったのかなー?」なんて感じで,そのモジュールの「Changes」の内容をさくっとチェックしたくなったので,そのためだけのスクリプトを,MetaCPAN::API を使ってさくっと書いてみました.

こんな感じ

スクリプトを pm-changes とかいう名前でパスのとおるところに置いておけば,こんな感じで使えます:

% pm-changes Amon2
3.63
 
    - Plugin::Web::JSON: micro optimization(cache user_agent value)
 
3.62
 
    - switch to Module::Build.
 
3.61
 
    - doc enhancements.
 
3.60
 
    - depend to latest Amon2::DBI
      (latest Amon2::DBI have incompatible change. check it first.)
    - Dropped dotcloud support in setup script.
 
3.57
 
    - upgrade es5shim.js to HEAD
    - [Plugin::Web::HTTPSession] do not use '__PACKAGE__' as a capsuling key.
      use +__PACKAGE__!
      (reported by anazawa++)
 
3.56
 
    - minor test fix(tokuhirom)
    - restrict return stmt in setup flavor(tokuhirom)
    - better startup page(tokuhirom)
 
3.55
 
    - use jshint instead of jsl, for testing application.
      in setup script.
 
3.54
 
    - jquery 1.8.0 => 1.8.2
    - bootstrap v2.0.4 => v2.1.1
    - add a context parameter ($c) to A::W::WebSocket::{on_error, on_eof}
      (hatyuki++)
 
...

ソースコード

#!/usr/bin/env perl
use strict;
use warnings;
use MetaCPAN::API;
use Pod::Usage;
use LWP::UserAgent;
 
my ($module) = @ARGV;
pod2usage()  unless $module;
 
my $agent = 'pm-changes/0.01';
(my $modname = $module) =~ s/::/-/g;
my $mc = MetaCPAN::API->new(
    ua_args => [ agent => $agent ],
);
my $dist= $mc->release( distribution => $modname );
 
my $changes;
my $ua = LWP::UserAgent->new( agent => $agent );
my @resources = qw/Changes CHANGES ChangeLog CHANGELOG/;
for my $resource ( @resources ) {
    my $res = $ua->get( $mc->base_url . "/source/$dist->{author}/$dist->{name}/$resource" );
    next  unless $res->code == 200;
    $changes = $res->content;
}
print $changes || "could not find\n";
 
__END__
 
=head1 NAME pm-changes - view Changes of module
 
=head1 SYNOPSIS
 
  pm-changes <module>

おわりに

とりあえず App::pmchanges とかいう名前で書きなおしてみようかな.