PODカバレッジを取得する。

そのディレクトリにある lib 以下のモジュールを根こそぎ拾ってきて、PODカバレッジを表示します。そのままだと上手く取得できないモジュールがあったりしたので、ちょっとテクっています。

みんなで使うライブラリなら、平均値で70%以上はとりたい欲しいところです。

#!/usr/bin/perl

use strict;
use warnings;
use FindBin;
use File::Spec;
use File::Find::Iterator;
use Pod::Coverage;

my @libs = ( "$FindBin::Bin/lib" );

if ( $ARGV[0] ) {

    # モジュール一覧を取得する
    my @modules;
    foreach (@libs) {
        my $dir = File::Spec->catdir($_, '');
        my $it = File::Find::Iterator->create( 'dir' => [$dir] );
        while ( my $file = $it->next ) {
            next if $file !~ /\.pm$/;
            my $module = $file;
            $module =~ s/$dir//g;
            $module =~ s/^\///g;
            $module =~ s/\.pm$//g;
            $module =~ s/\//::/g;
            push( @modules, $module );
        }
    }

    # PODカバレッジとその平均値を取得する
    my $total = 0;
    foreach (@modules) {
        eval "use $_";
        my $pod = Pod::Coverage->new( package => $_ );
        my $value = $pod->coverage || 0.0;
        $value *= 100;
        $total += $value;
        printf( "%s,%.2f\n", $_, $value );
    }
    printf( "AVERAGE,%.2f\n", ( $total / scalar(@modules) ) );
}
else {

    # PERL5LIB を再設定して自分自身を再実行
    $ENV{'PERL5LIB'} = join( ':', @libs );
    system("$FindBin::Bin/$0 retry");
}

よくはまるのが、Perl の数値は int じゃなくて double なので、my $a = 5; $a / 2; は 2 じゃなくて、2.5 になるんですよね。2 にしたいときは int($a / 2); と書かなければいけません。