Perl Best Practices 日本語版発売記念ということで、Plagger のユニットテストに Test::Perl::Critic を組み込んでみました。
組み込むといっても実装は簡単で、t/99-perlcritic.t なファイルをつくって、以下のように書き込むだけ。
use strict; use Test::More; eval { require Test::Perl::Critic; Test::Perl::Critic->import(-profile => "t/perlcriticrc") }; plan skip_all => "Test::Perl::Critic is not installed." if $@; all_critic_ok("lib");
lib ディレクトリ以下の .pm ファイルに対して、 Perl::Critic で PBP で推奨されたスタイルかどうかをチェックして、なければエラー (test failure) になる、というシンプルなコードです。Perl::Critic のデフォルト (PBP のデフォルト)だと厳しいルールがいくつかあるので、t/perlcriticrc なファイルをつくって、以下のようにしました。
# for mkdir $dir, 0777 [-ValuesAndExpressions::ProhibitLeadingZeros] # we do eval $asset_pl a lot [-BuiltinFunctions::ProhibitStringyEval] # no strict 'refs' [TestingAndDebugging::ProhibitNoStrict] allow = refs
コメントにある通りですが、filemask に使う leading zero, eval $string, no strict 'refs' を許容しています。
実際にこれでチェックしたところ、use strict してないファイルや 2引数の open を使っているコードがいくつかあったので、まとめて 修正。ポリシーでは許可しないけど、このコードだけでは使いたい、というようなときは、
my $value = $res->header($header) or return undef; ## no critic
のように no critic と ## を利用したスマートコメントに書けば Perl::Critic が無視してくれます。
これで、Plagger コードに perlcritic 非互換なコードをコミットすると Chimps Server で見つかって #plagger(-ja) に IRC でアナウンスされてしまうというわけ。これはベンリですね。