Test::DummyGeneratorの現行バージョン
主にルール周りを色々変更してます。
- $_は$_のまま
- コールバックを設定してない値でもevalして$_を評価
- String::Randomを黙らせる(localで$SIG{__WARN__}を弄ってます)
- add_rule関数を設けて、どこからでも追加できるように
- ルールの複数追加に対応
多分、ルール設定部分とか、スキーマ定義関係は、ころころ仕様が変わるだろうなぁ…
自分で使ってて思ったのが、単にループインデックスに合わせて値が線形に変わってくだけでなく、確率的に値を決められるのがいいと思った。
つまり例えば、A、B、Cの3つのパラメータがあったとき、Aの出現確率が45%、Bの出現確率が37%、Cの出現確率が18%、みたいな。
この辺りのメタ情報をもっと色々扱えるようになれば、より使い物になると思う。
なお、自分の使い方としては、DBIx::MoCo::Fixtureのload_fixtureの書き換えて、以下のYAMLを本来の形式に整形するようにしてます。
--- model: MyApp::MoCo::Infomation records: loop: 3 data: career: __range(0,9)__ id: $_ latitude: 36.5626 longitude: 136.362305 message: __str(\w{10,60})__ type: __range(0,2)__ site: __str(http://www\.google\.com/?q=\w{1,60})__
これをDBIx::MoCo::Fixtureのload_fixtureに食わせると…
model: MyApp::MoCo::Information records: info_1: career: 3 id: 1 latitude: 36.5626 longitude: 136.362305 message: MzOJAXOzYmB1IPAdjuFU1eoE6DwRnl site: http://www.google.com/q=6k0hMo_n7DduSWWi66YBNvy type: 2 info_2: career: 8 id: 2 latitude: 36.5626 longitude: 136.362305 message: hkKrqsfuELW6OVmM8XV809zgSZVOKimD49D site: http://www.google.comq=iuGTbqzOYbOqX5K_CSNlaUWtwRLZFsS2J1_pgTpUrjo type: 1 info_3: career: 9 id: 3 latitude: 36.5626 longitude: 136.362305 message: C5GQWJoi6Wf9pszCbZmuO site: http://www.google.comq=mx type: 0
こんな感じで返ってくる。これを実現してるコードはこちら
{ package DBIx::MoCo::Fixture; use Test::DummyGenerator; no warnings 'redefine'; sub load_fixture { my $file = shift; my $filename = "$file"; if($filename =~ /\/([^\/]+?)\.yml/) { $filename = $1; } my $yaml = $file->slurp or die $!; no warnings 'once'; local $YAML::Syck::ImplictUnicode = 1; utf8::decode($yaml); $yaml = YAML::Syck::Load($yaml); if ( exists $yaml->{records}{loop} && exists $yaml->{records}{data} ) { my $records = delete $yaml->{records}; my $loop = $records->{loop}; my $data = $records->{data}; my $dummy = Test::DummyGenerator->new( schema => $data ); $data = $dummy->generate($loop); my $count = 0; $records = +{ map { $count++; "${filename}_${count}" => $_ } @{$data} }; $yaml->{records} = $records; } return $yaml; } }