Scala 版 factory_girl みたいなのを作りました。
https://github.com/tototoshi/seedbed
Scala で factory_girl っぽいものを作りました。*1かなりお手軽な感じになっています。
依存ライブラリは特にありませんのでどのデータベースライブラリを使っていても大丈夫です。
動作は postgresql と h2 でのみ確認してますが、他のデータベースでも動くと思います。
とりあえず snapshot 版を sonatype にあげときました。
resolvers += "Sonatype snapshots" at "http://oss.sonatype.org/content/repositories/snapshots/" libraryDependencies += Seq( "com.github.tototoshi" %% "seedbed" % "0.1.0-SNAPSHOT" // and database driver )
使い方
以下のサンプルコードでなんとなくわかってもらえると思います。
define でテーブルごとのデフォルト値を定義、 create でデータを1件挿入、get/list はデータベースからレコードを取得するのに使用します。
データの取り扱いは割り切って Map[String, Any] でやってしまいます。基本的に型安全とかよりは手軽さを重視しています。動的言語な気分で使ってください。API は factory_girl より phactory (PHP の factory_girl 的なやつ) に近いです。
あくまでテスト用ライブラリなので、メインのプロダクトコードに入れるのはやめてください。
/* CREATE table beatles ( id serial primary key, first_name varchar(10) not null, middle_name varchar(10), last_name varchar(10) not null, birth_date date not null ); */ import seedbed._ // データベースの設定 trait TestDBConfiguration extends Configuration { val driver: String = "org.postgresql.Driver" val url: String = "jdbc:postgresql://localhost/seedbed_test" val user: String = "user" val password: String = "password" } // Seedbed クラスのインスタンスを生成 val s = new Seedbed with TestDBConfiguration // デフォルト値の設定 // めんどくさければ s.define("beatles") だけでも OK。DB のメタデータを見てよしなにしてくれます。 s.define("beatles", Map( "first_name" -> "John", "middle_name" -> "Winston", "last_name" -> "Lennon", "birth_date" -> new SimpleDateFormat("yyyy-MM-dd").parse("1940-10-09") )) // データベースへレコードを1件挿入 s.create("beatles") // デフォルト値を一部書き換えて挿入 s.create("beatles", Map("first_name" -> "Paul")) // データベースから first_name=Paul なデータを取得 s.get("beatles", Map("first_name" -> "Paul")) //=>Some(Map(first_name -> Paul, ...)) s.get("beatles", Map("first_name" -> "John")) //=>Some(Map(first_name -> John, ...)) // データベースからデータをまとめて取得する s.list("beatles")
予定、めも
- association とか sequence の機能はそのうち欲しくなったら実装します。
- joda-time くらいには依存してもいい気がしている。
*1:skinny には FactoryGirl http://skinny-framework.org/documentation/factory-girl.html があるけれど、skinny-orm 依存なので自分の用途には合わない。