scalagenでソースコード生成

scalagenというDBのスキーマから主にORMで使用する定型的なソースコードを生成するツールを作っています。Javaでいうとmiddlegenをかなりシンプルにしたようなものです(middlegen懐かしい!)。

ソースコードの自動生成はScala 2.10になったらマクロで解決してしまうフレームワークが出てきそうですが(実際SLICKとかありますし)、現状のScalaでORMを使うのであれば必須ですよね、ということで。
scalagenは単体のツールとして実行することも出来ますが、sbtプラグインとしても利用可能で、今のところScalaQueryとAnormに対応しています。sbtプラグインとして使用するにはまずproject/plugins.sbtに以下の記述を追加します。

resolvers += ("amateras snapshot" at "http://amateras.sourceforge.jp/mvn-snapshot/")

addSbtPlugin("jp.sf.amateras.scalagen" % "scalagen-sbtplugin" % "0.1-SNAPSHOT")

libraryDependencies ++= Seq(
  // for ScalaQuery
  "jp.sf.amateras.scalagen" %% "scalagen-scalaquery" % "0.1-SNAPSHOT",
  // for Anorm
  //"jp.sf.amateras.scalagen" %% "scalagen-anorm" % "0.1-SNAPSHOT",
  // JDBC driver for your database
  "org.hsqldb" % "hsqldb" % "2.2.8"
)

続いてbuild.sbtに以下の記述を追加します。

seq(jp.sf.amateras.scalagen.ScalagenPlugin.scalagenSettings: _*)

scalagenConfiguration := jp.sf.amateras.scalagen.Settings(
  // for ScalaQuery
  generator = new jp.sf.amateras.scalagen.ScalaQueryGenerator(),
  // for Anorm
  //generator = new jp.sf.amateras.scalagen.ScalaQueryGenerator(),
  driver = "org.hsqldb.jdbcDriver",
  url = "jdbc:hsqldb:hsql://localhost/",
  username = "sa",
  password = "",
  catalog = null,
  schemaPattern = null,
  tablePattern = null
)

「sbt scalagen」を実行するとScalaQueryのテーブル定義オブジェクトとテーブルをマッピングするためのケースクラスがsrc/main/scala/modelsディレクトリに生成されます。
Settingsに指定しているジェネレータを差し替えることで別のORMに対応したり、独自にカスタマイズしたソースコードを生成することが可能です。scalagenは元々は業務で使用するために作り始めたものなのですが、実際のプロジェクトではScalaQueryをカスタマイズしているので、独自のジェネレータを作って使う予定です。
それと、ソースコードは当初はScalateテンプレートで生成するようにしていたのですが、sbtプラグイン化したところScalaコンパイラのクラスパスの順番(?)が問題らしく動かなくなってしまったので今はとりあえず文字列連結で生成するようになっています。このへんはイマイチですね。Scalateのプリコンパイルプラグインとかもあるので動かす方法はあると思うのですが…。それかVelocityやFreeMarkerを使うのもありかもしれません。