$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

DBIx::DataFactoryというモジュールをshipitしました

 以前http://d.hatena.ne.jp/shiba_yu36/20111021/1319209404でTest::Factory::DBIというモジュールを作ったと紹介したのですが、Prepanのここでレビューを求めたら、意見をもらえたので、DBIx::DataFactoryとして、インターフェースも少し変えて、shipitしました。

Repository

https://github.com/shibayu36/p5-Test-Factory-DBIに置いてあります。

Synopsis

# schema
CREATE TABLE test_factory (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `int` int,
  `double` double,
  `string` varchar(255),
  `text` text DEFAULT NULL,

  PRIMARY KEY (id)
) DEFAULT CHARSET=binary;

# in your t/*.t
use DBIx::DataFactory;
my $factory_maker = DBIx::DataFactory->new({
    username => 'nobody',
    password => 'nobody',
    dsn      => 'dbi:mysql:dbname=test_factory;host=localhost',
});
$factory_maker->create_factory_method(
    method   => 'create_factory_data',
    table    => 'test_factory',
    auto_inserted_columns => {
        int => {
            type => 'Int',
            size => 8,
        },
        double => sub { rand(100) },
        string => {
            type => 'Str',
            size => 10,
        },
    },
);

my $values = $factory_maker->create_factory_data(
    text => 'test text',
);
# or you can use DBIx::DataFactory->create_factory_data()
my $int  = $values->{int};
my $text = $values->{text};

# will insert following data
# +----+----------+------------------+------------+-----------+
# | id | int      | double           | string     | text      |
# +----+----------+------------------+------------+-----------+
# |  1 | 60194256 | 3.03977754238112 | fHt4X0JDr9 | test text |
# +----+----------+------------------+------------+-----------+

$values = $factory_maker->create_factory_data(
    int    => 1,
    string => 'test',
);

# will insert following data
# +----+------+-----------------+--------+------+
# | id | int  | double          | string | text |
# +----+------+-----------------+--------+------+
# |  2 |    1 | 71.159467713824 | test   | NULL |
# +----+------+-----------------+--------+------+

Description

 前の記事に書いた通り、テストデータを入れるためのメソッドを追加するためのモジュールとして作りました。
 複雑なことを結構するような、大きいプロジェクトだと使えないかもしれませんが、個人用の小さなプロジェクト用には結構便利な気はしているので、気に入った方は使ってください。

Typeの拡張

 前回とやり方は同じですが、こんな感じです。

package DBIx::DataFactory::Type::Set;

use strict;
use warnings;
use Carp;

use base qw(DBIx::DataFactory::Type);

use Smart::Args;

sub type_name { 'Set' }

sub make_value {
    args my $class => 'ClassName',
         my $set   => 'ArrayRef';
    return $set->[int rand(scalar @$set)];
}

1;
use DBIx::DataFactory;
DBIx::DataFactory->add_type('DBIx::DataFactory::Type::Set');

my $factory_maker = DBIx::DataFactory->new({
    username => 'nobody',
    password => 'nobody',
    dsn      => 'dbi:mysql:dbname=test_factory;host=localhost',
});
$factory_maker->create_factory_method(
    method   => 'create_user',
    dbi      => 'dbi:mysql:dbname=user_test;host=localhost',
    table    => 'user_test',
    columns => {
        user_id => {
            type => 'Int',
            size => 5,
        },
        user_type => sub { 0 },
        description => {
            type => 'Str',
            size => 10,
        },
        lang => {
            type => 'Set',
            set  => ['ja', 'en'],
        },
    },
);

my $values = $factory_maker->create_user();

まとめ

 というわけでPrePAN経由でモジュールをアップロードさせてもらいました。PrePAN経由第二弾(?)ですかね?
 実際PrePANを使ってみた感想なのですが、やっぱりCPANにアップロードする前に、PrePANを経由することで、CPANへ上げる敷居は少なくなるなーと感じました。今回みたいに指摘ももらえますし。
 PrePANはid:antipop:detailさんとid:kudakurage:detailさんが作られたのですが、僕も開発に参加させていただきました。要望がある方はhttps://github.com/prepan-developers/PrePAN/issues、もしくは#prepan@irc.perl.orgまで!