Hatena::ブログ(Diary)

ちゃまぐの備忘録

2012-04-21

metacpanが便利すぎる。

metacpanが便利すぎる。

大事なことなので二回言いました。


何が便利かって、ソースコードのPODを除去しシンタックスハイライトつけた状態で表示してくれること。

最近、モジュールのソースコード見る機会が増えたので重宝してます。

2011-12-11

[] Test::Perl::Critic その3

Test::Perl::Criticは、Perlベストプラクティスのポリシーをどのていど厳格に守るのか設定が可能。

設定は、Perl::Criticと同じようにできる。

今回のエントリーは、その設定項目について。

設定方法

useにリストとして指定

use Test::Perl::Critic ( -profile => 't/perlcriticrc' );

または、importの引数として指定

Test::Perl::Critic->import( -profile => 't/perlcriticrc' );

-profile

コンフィグファイルへのパスを指定する。

もし、指定されたファイルがない場合はカレントディレクトリから.perlcriticrcを探す。


-severity

厳格さを数値もしくは、厳格さを反映した名前で設定する。

数値の場合、5が最も緩く、1が最も厳しい。デフォルトでは5が設定される。

gentleを指定した場合は、重大な違反のみを報告する。

brutalを指定した場合は、最も軽微な違反も報告する。

数値名前
5gentle *1
4stern *2
3harsh *3
2cruel *4
1brutal *5
Test::Perl::Critic->import( -severity => 'gentle' );

-theme

指定したテーマについてポリシーを適用する。

  • severityが指定されていない場合、-severityには1が設定される。

&&演算子や、||演算子を使い複雑なテーマの設定が可能。

使える演算子は、&&, ||, !, and, or, not。

演算子の優先順位はPerlのコードと同じ。

なお、テーマは大文字と小文字を区別されない。

また、テーマを指定しない場合はすべてのポリシーが適用される。

以下の例では、'bugs'と'pbp'のテーマを持っているポリシーが適用される。

Test::Perl::Critic->import( -theme => 'bugs && pbp' );
テーマとは

ポリシーには、1つ以上のテーマが設定されている。

これにより、テーマを設定することで好みのポリシーでPerl::Criticを走らせることができる。

テーマ内容
corePerl::Criticのすべてのポリシー
pbp"Perl Best Practices"由来のポリシー
bugsバグを防止または、明らかにするポリシー
maintenanceコードの長期的な健全さに影響するポリシー
cosmeticPolicies that only have a superficial effect*6
complexityコードの複雑さに関するポリシー
securityセキュリティ問題に関するポリシー
testsテストプログラムのためのポリシー

以下のコマンドで使用可能なポリシーとそれに関連付けられているテーマを確認することができる。

$ perlcritic -list

-include

適用させるポリシーを、文字列のリストリファレンスとして指定する。

指定した文字列がixmsオプション付きのパターンマッチにヒットした場合、ポリシーは適用される。

このとき、-severityで設定した厳格さ以上のポリシーも適用される。

Test::Perl::Critic->import(-include => ['layout'] -severity => 4);

-exclude

除外するポリシーを、文字列のリストリファレンスとして指定する。

指定した文字列がixmsオプション付きのパターンマッチにヒットした場合、ポリシーは除外される。

なお、-includeと共に使用した場合、-excludeで設定した項目が優先される。


-single-policy

指定した文字列がimxsオプション付きのパターンマッチに一致する1つのポリシーのみが適用される。

(複数のポリシーに一致しても、適用されるのは1つのみ)

この設定は、-severity, -theme, -include, -exclude, -only よりも優先される。


-top

表示される違反の最大数を設定する。

表示される違反はファイルで発生した順。

severityが指定されない場合は、最も厳格な1が設定される。


-force

コード内の"## no critic"を無視するかどうかの設定値。

真となる値を設定した場合、Perl::Criticはすべてのコードを分析する。

偽となる値を設定した場合は、"## no critic"がつけられたタグを無視する。


-verbose

1から11までの正の整数。もしくは、リテラルで書式を設定できる。

CPAN本によると、8がちょうどいいらしい。

*1:優しい、穏やかな

*2:厳格な、厳しい、断固たる、容赦のない、人を寄せ付けない、いかめしい

*3:厳しい、手厳しい、とげとげしい、辛辣な

*4:残酷な、むごい、残虐な、無慈悲な、非情な

*5:残忍な、厳しい、荒々しい

*6:コードの見た目に関するポリシーの模様

2011-12-05

[]Test::Perl::Critic その2

今日はサブルーチンについて。

critic_ok( $FILE [, $TEST_NAME ] )

# t/991_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 $@;

critic_ok( 'bin/get_tweet.pl' );

done_testing;
$ perl t/991_perlcritic.t
ok 1 - Test::Perl::Critic for "bin/get_tweet.pl"
1..1

ファイルを指定してテストする場合に使う。

複数のファイルを指定することはできない模様。


最も気をつけるべき点は、テスト数を明示して上げる必要がある。もしくはdone_testing;を記述する。


なお、第二引数にテスト名を指定することが可能。

デフォルトでは、"Perl::Critic test for $FILE"。

テスト名を'MyTest'とした場合は、以下のようになる。

perl t/991_perlcritic.t
ok 1 - MyTest
1..1

all_critic_ok( [ @DIRECTORIES ] )

# t/992_perlcriti_all_critic_ok.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();

指定したディレクトリ内のPerlファイルに対してテストを実行する。

ディレクトリが指定されなかった場合はblib以下ののPerlファイルを、

blibが存在しない場合は、lib以下のPerlファイルに対してテストを行う。


その1で書いたとおり、このサブルーチンを使用する場合はテスト数を明示する必要がない。

all_code_files ( [@DIRECTORIES] )

非推奨!

[12/7追記]

そもそもimportされないのでパッケージ名から指定しないと使えません。


Perlファイルのリストを返す。

ディレクトリを指定しない場合、blib以下から、

blibが存在しない場合は、lib以下から。

CVSやSubversionディレクトリ内のファイルはスキップされる。


ソースコードを見てみると、all_critic_okから呼び出されている。

また、このサブルーチン自体はディレクトリの設定をしてPerl::Critic::Utils::all_perl_filesを呼び出しているだけ。

したがって、このサブルーチンを使いたい場合は、ドキュメントに書いてあるとおりPerl::Critic::Utils::all_perl_filesを使うべき。


なお、Perlファイルの判断条件は以下の2つ

  1. 拡張子が .PL .pl .pm .t
  2. シバンに'perl'を含む

2011-12-04

[]Test::Perl::Critic その1

社内勉強会で発表するためのメモその1


概要

Test::Perl::Critic wraps the Perl::Critic engine in a convenient subroutine suitable for test programs written using the Test::More framework.

Test::Perl::Critic - search.cpan.org

(超意訳)Test::Perl::CriticはTest::More向けの、Perl::Criticのラッパーだよ!


このモジュールはテスト対象のコードがPBPに準拠しているかどうかをテストしてくれるモジュールです。 PBPとはDamian Conway氏の提唱するPerl Best PracticesというPerlのコードを書く際のスタイルです。

第4回 Test::Perl::Critic, Test::Pod, Test::Pod::Coverage, Test::Exception, Test::Warn, Devel::Coverの紹介:Happy Testing Perl|gihyo.jp … 技術評論社

使ってみる

# 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( qw/ bin lib /);

はじめ、done_testingをつけて実行したところ、テスト数が合わないと言われパスしなかった。

ドキュメントを見てみると、Test::Moreのテスト数はTest::Perl::Criticが設定してくれる云々と書いてある。


また、t/perlcriticrcを作ってない場合は、空ファイルでいいので作らないとパスしない。

もしくは、以下のようにコードを変更するか。

#eval { require Test::Perl::Critic; Test::Perl::Critic->import(-profile => "t/perlcriticrc") };
eval { require Test::Perl::Critic; Test::Perl::Critic->import };

とりあえず、自分が書いたコードでテストしてみたが、なんとパスした。

ちょっと驚いた。それほど難しいことしてないためだろうが。


参考

第4回 Test::Perl::Critic, Test::Pod, Test::Pod::Coverage, Test::Exception, Test::Warn, Devel::Coverの紹介:Happy Testing Perl|gihyo.jp … 技術評論社

Test::Perl::Critic - search.cpan.org

2011-11-26

[] /bin/shの実体

スマートな紳士のためのシェルスクリプト(1):シェルスクリプトはエレガントでなければならない (1/2) - @ITを読むまで、/bin/shの実体は各OSによって違うと知らなかった。

記事中に明記されていない、CentOS5.7で調べてみるとやはりbashへのシンボリックリンクが貼られていた。

$ cat /etc/redhat-release
CentOS release 5.7 (Final)
$ ls -al /bin/sh
lrwxrwxrwx 1 root root 4 Nov 19 21:52 /bin/sh -> bash

今後、自分が書くシェルスクリプトのシバンには/bin/shをではなく、実体のシェルを書くようにしようと思った。