FrontPage  Index  Search  Changes  RSS  Login

[Ruby] Configatron

概要

Ruby の Configatron について、どんなものか感触を掴むための調査結果を記録します。

  • Rails でアプリケーション固有の設定情報を取り扱う目的で利用可能
  • Hash ではなく、オブジェクトの様な扱いが可能

実際の利用の際は、RDocなどを参照してください。

configatron-rails

Configatron を Rails で利用する際に便利なプラグイン。

$ sudo gem install configatron
# => config/environment.rb に config.gem "configatron" を記述
$ script/plugin install git://github.com/cmaggard/configatron-rails.git
$ script/generate config

プラグインの内容

configatron-rails/
  - MIT-LICENSE
  - README.textile
  - Rakefile
  + generators/
    + config/
      - USAGE
      - config_generator.rb
      + templates/
        - INSTALL
        - config.yml.erb
        - load_config.rb
  - install.rb
  + tasks/
    - configatron_rails_tasks.rake
  + test/
    - configatron_rails_test.rb
    - test_helper.rb
  - uninstall.rb
  • Configatron のセットアップを行うジェネレータを追加する

ジェネレータ

generators/config/config_generator.rb
class ConfigGenerator < Rails::Generator::Base
  def manifest
    record do |m|
      #m.file "config.yml", "config/config.yml"
      m.template "config.yml.erb", "config/config.yml", :assigns => { :env => get_environments }
      m.file "load_config.rb", "config/initializers/load_config.rb"
      m.readme "INSTALL"
    end
  end

  def get_environments
    YAML.load_file("config/database.yml").keys
  end
end

ジェネレータを実行すると、以下のファイルが追加される。

  • config/config.yml
  • config/initializers/load_config.rb

Rails アプリ起動時の処理

config/initializers/load_config.rb
configatron.configure_from_yaml("config/config.yml", :hash => Rails.env)

configatron.configure_from_yaml を実行して設定ファイル(YAML)を読み込む。

設定ファイル(初期状態)

config/config.yml
# This file was auto-generated.  Feel free to customize it to your whim.

production:
    site_name: Test Site
    admin_email: admin@test.com
    site_url: http://localhost:3000/

development:
    site_name: Test Site
    admin_email: admin@test.com
    site_url: http://localhost:3000/

test:
    site_name: Test Site
    admin_email: admin@test.com
    site_url: http://localhost:3000/

ジェネレータのソースから分かる様に、config/database.yml から RAILS_ENV を取り出して、それぞれに関する設定ブロックが書き出されている。

小まとめ

  • Configatron を Rails で利用する際にはプラグインが利用できる
  • プラグインはジェネレータを追加してくれる
  • ジェネレータは設定ファイルの雛形と起動スクリプトを作成してくれる
  • config/config.yml に書いた内容が自動的に起動時に読み込まれ利用可能になる

configatron

設定情報を上手く扱うためのパッケージ。

$ sudo gem install configatron

パッケージの内容

+ doc/ (略)
+ lib
  + configatron/
    - configatron.rb
    - errors.rb
    - kernel.rb
    - store.rb
  - configatron.rb
+ spec/ (略)
- README
- Rakefile

ロード時の処理

lib/configatron.rb
base = File.join(File.dirname(__FILE__), 'configatron')
require 'yaml'
require File.join(base, 'kernel')
require File.join(base, 'configatron')
require File.join(base, 'store')
require File.join(base, 'errors')

Kernel.configatron

lib/configatron/kernel.rb
module Kernel
  
  # Provides access to the Configatron storage system.
  def configatron
    Configatron.instance
  end
  
end

グローバルスコープで設定情報オブジェクトを取り出せ得る様に、Kernel.configatron メソッドを定義している。

※ Configatron のインスタンスはシングルトン。

例外オブジェクト

  • Configatron::ProtectedParameter
    • パラメータの変更不可
  • Configatron::LockedNamespace
    • ネームスペースへの追加不可

設定情報の読み込み

Configatron::Store
  • configure_from_hash
    • Hash から読み込む
  • configure_from_yaml
    • YAML ファイルから読み込む

また、method_missing によって、パラメータの代入も行える様になっています。

configatron.<name> = "value"

設定情報の保護

Configatron::Store

編集不可(パラメータ)

  • protect
  • protect_all!
  • unprotect
  • unprotect_all!

追加不可(ネームスペース)

  • lock
  • unlock

そのほか、ストアの操作

  • retrieve
    • 指定した名前の設定値を取り出す
    • デフォルト値をオプションで指定でき、該当項目が無ければそれを返す
  • remove
    • 指定した名前の項目を削除する(Hash#delete)
  • set_default
    • 指定した名前がまだ存在しなければ、指定したデフォルト値を代入する
  • ほか

利用例など

require 'rubygems'
require 'configatron'

# ひたすら代入
configatron.param1 = "p1"
configatron.param2 = [1, 2, 3]
configatron.to_hash # => {:param1=>"p1", :param2=>[1, 2, 3]}

# ネームスペースによるネスト
configatron.block1.param1 = "bp1"
configatron.to_hash # => {:param1=>"p1", :param2=>[1, 2, 3], :block1=>configatron.block1.param1 = "bp1"}

# 特定の範囲内でだけ値を変更する
configatron.temp(:param1 => "temporary") do
  configatron.param1 # => "temporary"
end
configatron.param1 # => "p1"

configatron.temp do
  configatron.param1 = "temporary"
  configatron.param1 # => "temporary"
end
configatron.param1 # => "p1"

configatron.temp_start
configatron.param1 = "temporary"
configatron.param1 # => "temporary"
configatron.temp_end
configatron.param1 # => "p1"

# 存在しないキーへのアクセス
configatron.no.no.no.no
configatron.no.no.no.no.class # => Configatron::Session
configatron.no.no.no.no.nil? # => true
configatron.to_hash # => {:param1=>"p1", :no=>, :param2=>[1, 2, 3], :block1=>configatron.block1.param1 = "bp1"}

補足

  • configatron の gem バージョン
    • 2.1.1
  • configatron のリビジョン
    • 80f65c07c213eae27da622d94410b2495b3875a0
  • configatron-rails のリビジョン
    • 9297d5f38b5c93b1c99c7a00060e677fcf0e91ed

※ git でもリビジョンというのか知りません。 ※ 最終コミットを表す記号的なものを書きました。

参考

Last modified:2009/01/17 00:16:13
Keyword(s):[ruby]
References: