module ConfigLoader

オブジェクトにデータ保存機能をつけるmix-in includeすると、key-value形で恒久的にデータを保存するためのメソッドが提供される。 mikutter, CHIのプラグインでは通常はUserConfigをつかうこと。

Constants

AVAILABLE_TYPES
PSTORE_FILE
STORAGE_FILE
TMP_FILE

Public Class Methods

boot() click to toggle source

一度だけ自動的に呼ばれる(このソースファイルの一番下の方) メモリ上に設定データを読み込む。 YAMLがなければ、旧データ形式(PStore)からデータを読み込む。

# File core/configloader.rb, line 40
def boot
  @@configloader_cache = if FileTest.exist?(STORAGE_FILE)
                           notice "load setting data from #{STORAGE_FILE}"
                           YAML.load_file(STORAGE_FILE)
                         elsif FileTest.exist?(PSTORE_FILE)
                           notice "load setting data from #{PSTORE_FILE}"
                           ConfigLoader.migration_from_pstore
                         else
                           notice "setting data not found"
                           Hash.new end end
migration_from_pstore() click to toggle source

旧データ形式(PStore)からデータを取得して返す

Return

設定データ(Hash)

# File core/configloader.rb, line 54
def migration_from_pstore
  require 'pstore'
  PStore.new(PSTORE_FILE).transaction(true) { |db|
    config = Hash.new
    db.roots.each { |key|
      config[key] = db[key] }
    config } end
validate(obj) click to toggle source

obj が保存可能な値なら obj を返す。そうでなければ ArgumentError 例外を投げる。

# File core/configloader.rb, line 63
def validate(obj)
  if AVAILABLE_TYPES.any?{|x| obj.is_a?(x)}
    if obj.is_a? Hash
      result = {}
      obj.each{ |key, value|
        result[self.validate(key)] = self.validate(value) }
      result.freeze
    elsif obj.is_a? Enumerable
      obj.map(&method(:validate)).freeze
    elsif not(obj.freezable?) or obj.frozen?
      obj
    else
      obj.dup.freeze end
  else
    emes = "ConfigLoader recordable class of #{AVAILABLE_TYPES.join(',')} only. but #{obj.class} given."
    error(emes)
    raise ArgumentError.new(emes)
  end
end

Public Instance Methods

at(key, ifnone=nil) click to toggle source

key に対応するオブジェクトを取り出す。 key が存在しない場合は nil か ifnone を返す

# File core/configloader.rb, line 97
def at(key, ifnone=nil)
  ckey = configloader_key(key)
  if @@configloader_cache.has_key? ckey
    @@configloader_cache[ckey]
  else
    ifnone end end
include?(key) click to toggle source

キーに対応する値が存在するかを調べる。 値が設定されていれば、それが nilfalse であっても true を返す

Args

key

Symbol キー

Return

true

存在する

false

存在しない

# File core/configloader.rb, line 92
def include?(key)
  @@configloader_cache.has_key? configloader_key(key) end
store(key, val) click to toggle source

key にたいして val を関連付ける。

# File core/configloader.rb, line 105
def store(key, val)
  ConfigLoader.validate(key)
  val = ConfigLoader.validate(val)
  ckey = configloader_key(key)
  @@configloader_cache[ckey] = val
  @@configloader_queue.push(ckey)
  val end