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;
    }
}