ERBでソースコード生成
- テンプレートはeRuby(任意の文書にRubyスクリプトを埋め込む書式)で記述します。
- モデルにはBindingを指定します。テンプレート内では、Bindingに封入されたローカル変数や関数にアクセスできます。
require 'erb' # モデル model = { :name => "mii", :age => 1 } # テンプレート template = <<TEMPLATE <%= model[:name] %> : <%= model[:age] %> TEMPLATE # テンプレートを処理 erb = ERB.new(template, nil, "%" ) puts erb.result(binding) # 引数でバインディングを渡す。 # 現在使用可能な変数がテンプレート内でも使用できる。
実行結果です。
mii : 1
ソースコード生成
近辺ではソースコードの自動生成で活躍してます。YAMLと組み合わせると吉です。以下はYAMLファイルの定義からJavaBeanを作成するサンプルです。
# YAML から JavaBeanを作る。 require 'yaml' require "javautils" require "fileutils" require 'erb' ROOT = './out' # 出力先 BEAN_YAML = './models.yaml' # YAMLの定義ファイル # erb のテンプレートを作成 erb = ERB.new(IO.read("./bean.erb"), nil, "%" ) # yamlファイルをロード beans = YAML.load_file( BEAN_YAML ); beans.each { |model| out = ROOT + "/" + model['package'].gsub("\.", "/") + "/" FileUtils.mkdir_p out out = out + JavaUtils.capitalize(model['name']) + ".java" File.open( out, "w" ) { |f| # 処理 f.write( erb.result(binding) ) puts out + " is created." } }
models.yaml:
--- - name: kitten package: com.example display-name: "猫。" fields: - &kitten-name name: name display-name: "名前" type: String default: "\"\"" - &kitten-age name: age display-name: "年齢" type: int default: "0" constructors: - args: [*kitten-name, *kitten-age]
出力:
package com.example; /** * 猫。 * * @version $Revision:$ * @author $Author:$ */ public class Kitten { /** * 名前 */ private String name = ""; /** * 年齢 */ private int age = 0; /** * コンストラクタ */ public Kitten (){} /** * コンストラクタ * * @param name * 名前 * @param age * 年齢 */ public Kitten ( String name, int age ) { this.name = name; this.age = age; } /** * 名前を取得する。 * @return 名前 */ public String getName () { return name; } /** * 名前を設定する。 * @param name 名前 */ public void setName ( String name ) { this.name = name; } /** * 年齢を取得する。 * @return 年齢 */ public int getAge () { return age; } /** * 年齢を設定する。 * @param age 年齢 */ public void setAge ( int age ) { this.age = age; } }
javautils.rbとbean.erbは長いのでリンクで。