WorePAN 0.02

Parse::PMFileのテストに多用したWorePANの方も、内部の索引生成をCPAN::ParseDistributionからParse::PMFile(+PAUSE由来のもろもろのコード)に切り替えて0.02としてリリースしました。

また、0.02ではCPANミラーの中身の調査を楽にできるよう、walkというメソッドを追加しました。使い方は以下の通りです。

use strict;
use warnings;
use WorePAN;
use Parse::PMFile;
use YAML::Tiny qw/LoadFile/;

my $worepan = WorePAN->new(root => '/path/to/minicpan');

$worepan->walk(callback => sub {
  my ($dir, $path, $dist) = @_;

  my $mtime = $dist->mtime;
  my $metadata = LoadFile($dir->file('META.yml'));
  my $parser = Parse::PMFile->new($metadata);

  $dir->recurse(callback => sub {
    my $file = shift;
    return unless $file =~ /\.pm$/;

    my $packages_info = $parser->parse($file);
    ...
  });
});

walkメソッドのコールバックには、WorePANミラー内の各ディストリビューションを展開した一時ディレクトリ(を格納しているPath::Extended::Dirオブジェクト)、識別用のパス(F/FO/FOO/Foo-Bar-1.24.tar.gzなど)、展開前のディストリビューションを格納しているPath::Extended::Fileオブジェクトが渡ります。

この例ではさらにその一時ディレクトリの中身をなめて個々の.pmファイルに対して処理を行っていますが、もちろん特定のファイルのテストさえ行えればよいのであれば、META.ymlの情報をロードしている箇所のように、$dirから直接ファイルを指定すればよいでしょう。以下の例は指定した各ディストリビューションがModule::Installを使っているか確認するテストです。

use strict;
use warnings;
use WorePAN;
use Test::More;

my @files = qw(
  F/FO/FOO/Foo-Bar-1.23.tar.gz
);

my $worepan = WorePAN->new(
  files => \@files,
  local_mirror => '/path/to/darkpan'
  no_network => 0,
  use_backpan => 1,
  cleanup => 1,
);

$worepan->walk(callback => sub {
  my ($dir, $path) = @_;
  ok -f $dir->file('inc/Module/Install.pm'), "$path: Module::Install exists";
});

done_testing;

以上、author test用のツールとしてお役に立てばさいわいです。