From fa65cdb7b6df12a94beecbfebd3e63cce74b5dad Mon Sep 17 00:00:00 2001 From: dima Date: Fri, 30 Mar 2012 21:53:40 +0200 Subject: [PATCH 1/3] add ability change settings --- lib/yettings.rb | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/lib/yettings.rb b/lib/yettings.rb index 396c894..1b345b7 100644 --- a/lib/yettings.rb +++ b/lib/yettings.rb @@ -5,27 +5,34 @@ module Yettings class UndefinedYetting < StandardError; end + class << self def setup! find_ymls.each do |yml| create_yetting_class(yml) end end - + def find_ymls main_file = "#{Rails.root.to_s}/config/yetting.yml" yettings_main_file = File.exists?(main_file) ? [main_file] : [] yettings_namespaced_files = Dir.glob("#{Rails.root.to_s}/config/yettings/**/*.yml") yettings_main_file.concat(yettings_namespaced_files) end - + def create_yetting_class(yml_file) hash = load_yml(yml_file) klass_name = File.basename(yml_file).gsub(".yml","").camelize klass_name = "#{klass_name}Yetting" unless klass_name=="Yetting" klass = Object.const_set(klass_name,Class.new) hash.each do |key,value| - klass.define_singleton_method(key){ value } + @@key = key + klass.class_eval do + class << self + attr_accessor @@key.to_sym + end + end + klass.instance_variable_set("@#{key}",value) end klass.class_eval do def self.method_missing(method_id,*args) @@ -33,10 +40,10 @@ def self.method_missing(method_id,*args) end end end - + def load_yml(yml_file) erb = ERB.new(File.read(yml_file)).result YAML.load(erb).to_hash[Rails.env] end end # class << self -end \ No newline at end of file +end From 1cdd3e7c168d6687c96bb8337a8a98472fa65520 Mon Sep 17 00:00:00 2001 From: dima Date: Sun, 1 Apr 2012 08:26:55 +0200 Subject: [PATCH 2/3] test for ability change setting --- test_app/spec/yettings_spec.rb | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/test_app/spec/yettings_spec.rb b/test_app/spec/yettings_spec.rb index 01ff5d7..44149af 100644 --- a/test_app/spec/yettings_spec.rb +++ b/test_app/spec/yettings_spec.rb @@ -3,48 +3,52 @@ describe Yettings do YETTINGS_DIR = "#{Rails.root}/config/yettings" YETTING_FILE = "#{Rails.root}/config/yetting.yml" - + it "should load yettings in the rails app" do assert defined?(Yettings) end - + it "should find only default yml file if no others exist" do FileUtils.mv(YETTINGS_DIR,"#{YETTINGS_DIR}_tmp") if File.directory?(YETTINGS_DIR) Yettings.find_ymls.should eq ["#{Rails.root}/config/yetting.yml"] FileUtils.mv("#{YETTINGS_DIR}_tmp",YETTINGS_DIR) if File.directory?("#{YETTINGS_DIR}_tmp") end - + it "should find main and 2 yettings dir files" do - Yettings.find_ymls.should eq ["#{Rails.root}/config/yetting.yml", + Yettings.find_ymls.sort.should eq ["#{Rails.root}/config/yetting.yml", "#{Rails.root}/config/yettings/hendrix.yml", - "#{Rails.root}/config/yettings/jimi.yml"] + "#{Rails.root}/config/yettings/jimi.yml"].sort end - + it "should find 2 yettings dir files if there is no main file" do FileUtils.mv("#{YETTING_FILE}","#{YETTING_FILE}_tmp") if File.exists?("#{YETTING_FILE}") - Yettings.find_ymls.should eq ["#{Rails.root}/config/yettings/hendrix.yml", - "#{Rails.root}/config/yettings/jimi.yml"] + Yettings.find_ymls.sort.should eq ["#{Rails.root}/config/yettings/hendrix.yml", + "#{Rails.root}/config/yettings/jimi.yml"].sort FileUtils.mv("#{YETTING_FILE}_tmp","#{YETTING_FILE}") if File.exists?("#{YETTING_FILE}_tmp") end - + it "should load the yml and return hash" do Yettings.load_yml("#{YETTING_FILE}").should eq "yetting1"=>"what", "yetting2"=>999, "yetting3"=>"this is erb", "yetting4"=>["element1", "element2"] end - + it "should create the classes and class methods" do Yettings.create_yetting_class("#{YETTING_FILE}") Yetting.yetting1.should eq "what" Yetting.yetting2.should eq 999 Yetting.yetting3.should eq "this is erb" Yetting.yetting4.should eq ["element1", "element2"] + # ability change configurations(using for test) + Yetting.yetting2 = 'hello123' + Yetting.yetting2.should eq 'hello123' end - + + it "should pass the integration test, since rails will run the initializer" do Yetting.yetting1.should eq "what" JimiYetting.yetting1.should eq "hendrix" HendrixYetting.yetting1.should eq "jimi" end - + it "should issue a warning for method_missing" do begin Yetting.whatwhat @@ -53,10 +57,10 @@ e.message.should =~ /whatwhat is not defined in Yetting/ end end - + it "should print the performance of setup method" do start = Time.now - Yettings.setup! + Yettings.setup! puts "Load time for Yettings.setup! = #{Time.now - start} seconds" end -end \ No newline at end of file +end From 02c01460b5927a0962d6a442a3e2e36b46cabfc4 Mon Sep 17 00:00:00 2001 From: Philipp Langer Date: Tue, 18 Sep 2012 20:39:21 +0300 Subject: [PATCH 3/3] Update lib/yettings.rb Avoiding undefined method `each' for nil:NilClass error if Yetting is used in one of the non default environments (anything else than production, test and development). For example this will let you run migrations in a non default environment, e.g. rake db:migrate RAILS_ENV=myenv --- lib/yettings.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/yettings.rb b/lib/yettings.rb index 0ad1ee3..2ddf20c 100644 --- a/lib/yettings.rb +++ b/lib/yettings.rb @@ -26,7 +26,7 @@ def create_yetting_class(yml_file) klass = Object.const_set(klass_name,Class.new) hash.each do |key,value| klass.define_singleton_method(key){ value } - end + end unless hash.nil? klass.class_eval do def self.method_missing(method_id,*args) raise UndefinedYetting, "#{method_id} is not defined in #{self.to_s}"