Posted at

Rubyで自由な形式のConfigファイルを読み込めるようにしてみる

More than 5 years have passed since last update.

RubyでConfigファイルを扱う場合 YAML や JSON で記述したり、Mixlib::Config(https://github.com/opscode/mixlib-config) 等が利用出来ると思いますが、形式に捕われないConfigファイルを利用したくなったのでそれっぽいModuleを書いてみた。


appconfig.rb

require 'hashie'

module AppConfig
extend self

AppConfig.load(File.read(File.expand_path('~/.config.rb')))

def load(file)
# default
config = Hashie::Mash.new
config.user = {
name: 'foo',
age: 25
}

# overwirte
instance_eval(file)

config.each do |key, value|
attr_accessor key
send("#{key}=", value)
end
end
end



利用方法


例1


~/.config.rb

config.user.age = 18



main.rb

require '/path/to/appconfig.rb'

AppConfig.user.name # 'foo'
AppConfig.user.age # 18


設定した箇所だけ変更され、デフォルトで設定した値も利用できる。


例2


~/.config.rb

config.user = {

name: 'bar',
age: 18,
gender: 'men'
}


main.rb

require '/path/to/appconfig.rb'

AppConfig.user.name # 'bar'
AppConfig.user.age # 18
AppConfig.user.gender # 'men'


ハッシュで設定することが可能。


例3


~/.config.rb

config.user.todo = %w(

'パーフェクトRubyを読む',
'録り貯めたアニメを見る',
'ブログを書く'
)



main.rb

require '/path/to/appconfig.rb'

AppConfig.user.todo.each do |t|
puts t
end


Array を渡して each で回してみたり。


例4


~/.config.rb

class User

def hello
puts 'Hello World!'
end
end
config.user = User.new


main.rb

require '/path/to/appconfig.rb'

AppConfig.user.hello


Class を渡してみたりとやりたい放題。


さいごに

こんなコードおかしいよ!もっと簡単な方法あるよ!等ありましたら教えて頂けると幸いです。