Config読み込み用クラス

Configをファイルから読むためのクラス。Rubyのおもちゃを作るときに作ったのだが、いつも忘れてしまうので、メモとしてここに記す。

module SSHILIB 

  class Config 

    def initialize(create_flag = false,config_filename = default_filename) 

      instance_eval default_values 

      vars = instance_variables 

      self.class.class_eval{ 

        vars.each do  | var |  

          attr_reader(var[1..-1].to_sym) 

        end 

      } 

      return if config_filename == nil 

      if FileTest.exist?(config_filename) 

        instance_eval File.read(config_filename) 

      elsif create_flag 

        open(config_filename,"w"do  | f |  

          f.puts default_values 

        end 

      end 

    end 

     

    def default_filename 

      nil 

    end 

     

    def default_values 

      return<<EOS  

      @config1 = 1  

      @config2 = [1]  

EOS 

    end 

     

  end 

end 

default_filenameに記述したものがデフォルトのConfigファイル名、default_valuesに記述したものがデフォルト設定になる。default_valuesのほうは、ソース文字列を返すように書こう。適当に書きかえるなり継承してdefault_(filename|values)をオーバーライドするなりして利用する。

Configファイルはこんな感じにインスタンス変数の定義だけ書く。

@config1 = 100
@config2 = [1,2,3]

使い方はこんなかんじ。

config = Config.new(create_flag,filename)
puts config.config1

単にインスタンス作ってインスタンス変数を参照するだけ。default_valuesに記述したインスタンス変数は自動的に読み出し許可が与えられる仕組み。ちなみに、newのたびにConfigファイルから値を読みこむ仕様。なんて安直。
create_flagをtrueにするとConfigファイルがない場合にデフォルト設定の内容でConfigファイルを作成する。省略するとfalseになってファイルは作成されない。filenameはConfigファイルのファイル名。省略するとdefault_filenameに記述されたファイル名が利用される。あんまり必要ないかな。

Configファイルからの変数の取り込みにevalを使っているのが嫌な気もする*1けど、お手軽に使う分には十分。

*1:1行に一つの定義という制約をもうけて、正規表現で取りこめば、値のチェックもやりつつeval無しにできそうだけど、そこまでこるのもなあ。