以前http://d.hatena.ne.jp/shiba_yu36/20111021/1319209404でTest::Factory::DBIというモジュールを作ったと紹介したのですが、Prepanのここでレビューを求めたら、意見をもらえたので、DBIx::DataFactoryとして、インターフェースも少し変えて、shipitしました。
Repository
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さんとid:kudakurageさんが作られたのですが、僕も開発に参加させていただきました。要望がある方はhttps://github.com/prepan-developers/PrePAN/issues、もしくは#prepan@irc.perl.orgまで!