Parse::PMFile 0.01

遅ればせながらQA Hackathonの成果のひとつとして、Parse::PMFileというモジュールをCPANにアップしました。これは2013年4月時点のPAUSEの中に埋もれているパッケージ/バージョン情報を抽出するコードをほとんどそのまま独立したモジュールとして抜き出したものです。

主目的はCPANTSのバージョン情報抽出精度の向上なので、現状ではPAUSEがやっているようなパッケージの解凍や索引の作成、またパーミッション情報の確認(PAUSEでは不適切なパーミッションを持つディストリビューションは索引に含めないようになっています)などはできないようになっています(パーミッションについてはTODOとして今後なんらかの方法で対応できないか検討する予定です)。また、そもそもがCPANの索引づくりを行うためのものなので、索引に載せないように工夫されたパッケージの情報も取得できません。

使い方は以下の通りです。単に.pmファイルのパッケージ/バージョン情報を取りたいだけならMETA.ymlの情報は渡さなくてもかまいませんが、META.ymlにprovidesフィールドが存在している場合(より厳密にはそのMETA.ymlが過去の壊れていたModule::Buildが生成したものではない、という条件もつきます)、その実際に.pmファイルの中身を精査せず、providesフィールドの情報を返すようになっています。

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

# サンプルなので横着していますが、本当はCPAN::Meta::YAMLを使うところです
my $metadata = LoadFile('META.yml');
my $parser = Parse::PMFile->new($metadata);
my $packages_info = $parser->parse('lib/Foo.pm');

print Dumper $packages_info;

# $VAR1 = {
#   'Foo' => {
#     'parsed' => 1,
#     'filemtime' => 1234567890,
#     'version' => '0.01',
#     'infile' => 'lib/Foo.pm',
#     'simile' => 'lib/Foo.pm',
#   }
# };