tarot 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,4 @@
1
- TAROT = Tarot::Config.new(File.join(Rails.root, "config", "tarot.yml"), Rails.env)
1
+ Config = Tarot::Config.new(File.join(Rails.root, "config", "tarot.yml"), Rails.env)
2
2
  def config *args
3
- TAROT.get *args
3
+ Config.get *args
4
4
  end
data/lib/tarot.rb CHANGED
@@ -3,10 +3,16 @@ require "active_support/core_ext"
3
3
 
4
4
  module Tarot
5
5
  class Config
6
- attr_accessor :config_file, :yaml, :env
7
- def initialize(file, env)
8
- @config_file = file
9
- @yaml = YAML::load(File.open(file).read.untaint).stringify_keys!
6
+ attr_accessor :config_files, :yaml, :env
7
+ def initialize(files, env)
8
+ @config_files = files
9
+ @config_files = [@config_files] if @config_files.is_a? String
10
+ @yaml = {}
11
+ @config_files.each do |file|
12
+ yaml = YAML::load(File.open(file).read.untaint).stringify_keys!
13
+ recursive_merge @yaml, yaml
14
+ end
15
+ add_mm @yaml
10
16
  @config_cache = {}
11
17
  @env = env
12
18
  end
@@ -15,5 +21,42 @@ module Tarot
15
21
  @config_cache[env] ||= {}
16
22
  @config_cache[env][key] ||= key.split('.').inject(@yaml[env || @env]) {|e, part| e.try(:[], part) } || default
17
23
  end
24
+
25
+ private
26
+
27
+ def recursive_merge(left, right)
28
+ left.merge!(right) do |key, oldval, newval|
29
+ oldval.class == left.class ? recursive_merge(oldval, newval) : newval
30
+ end
31
+ end
32
+
33
+ def add_mm(hsh)
34
+ hsh.instance_eval do
35
+ def method_missing(method, *args)
36
+ self[method.to_s] || args.first
37
+ end
38
+ end
39
+
40
+ hsh.each do |key, val|
41
+ if val.class == hsh.class
42
+ add_mm val
43
+ end
44
+ end
45
+ end
46
+
47
+ def method_missing(method, *args)
48
+ @yaml[args[1] || @env].send method, *args
49
+ end
50
+ end
51
+
52
+ module MethodMissingForHash
53
+ def self.included(obj)
54
+ obj.each do |key, val|
55
+ if obj.class == val.class
56
+ val.extend MethodMissingForHash
57
+ end
58
+ end
59
+ end
60
+
18
61
  end
19
62
  end
data/lib/tarot/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Tarot
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -0,0 +1,4 @@
1
+ ---
2
+ development:
3
+ foo: fizzle
4
+ mah: rizzle
data/spec/tarot_spec.rb CHANGED
@@ -1,27 +1,46 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Tarot do
4
- before :all do
5
- @tarot = Tarot::Config.new("spec/data/test.yml", "development")
6
- end
4
+ context "Given a single file" do
5
+ before :all do
6
+ @tarot = Tarot::Config.new("spec/data/test.yml", "development")
7
+ end
7
8
 
8
- it "should load a YAML file" do
9
- @tarot.should_not == nil
10
- @tarot.yaml.should be_a(Hash)
11
- end
9
+ it "should load a YAML file from a string" do
10
+ @tarot.should_not == nil
11
+ @tarot.yaml.should be_a(Hash)
12
+ @tarot.config_files.should == ["spec/data/test.yml"]
13
+ end
14
+
15
+ it "should accept a default value for a key" do
16
+ @tarot.get("bad key").should == nil
17
+ @tarot.get("bad key", "with default").should == "with default"
18
+ end
19
+
20
+ it "should walk a nested tree" do
21
+ @tarot.get( "nested.tree.with.value" ).should == 42
22
+ @tarot.get( "nested.tree.with.bad.key" ).should == nil
23
+ end
12
24
 
13
- it "should accept a default value for a key" do
14
- @tarot.get("bad key").should == nil
15
- @tarot.get("bad key", "with default").should == "with default"
16
- end
25
+ it "should accept an override environment" do
26
+ @tarot.get("fizz").should == "buzz"
27
+ @tarot.get("fizz", nil, "production").should == "bang"
28
+ end
17
29
 
18
- it "should walk a nested tree" do
19
- @tarot.get( "nested.tree.with.value" ).should == 42
20
- @tarot.get( "nested.tree.with.bad.key" ).should == nil
30
+ it "should accept a method_missing chain" do
31
+ @tarot.nested.tree.with.value.should == 42
32
+ @tarot.nested.tree.with.bad_value(1234).should == 1234
33
+ @tarot.fizz.should == "buzz"
34
+ @tarot.fizz(nil, "production").should == "bang"
35
+ end
21
36
  end
22
37
 
23
- it "should accept an override environment" do
24
- @tarot.get("fizz").should == "buzz"
25
- @tarot.get("fizz", nil, "production").should == "bang"
38
+ context "Given multiple config files" do
39
+ it "should produce a recursively merged hash when given multiple files to load" do
40
+ @tarot = Tarot::Config.new(["spec/data/test.yml", "spec/data/recursive.yml"], "development")
41
+ @tarot.get("foo").should == "fizzle"
42
+ @tarot.get("mah").should == "rizzle"
43
+ @tarot.get("fizz").should == "buzz"
44
+ end
26
45
  end
27
46
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tarot
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 31
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 1
10
- version: 0.1.1
9
+ - 2
10
+ version: 0.1.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Chris Heald
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-06-28 00:00:00 -07:00
18
+ date: 2011-06-29 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -53,6 +53,7 @@ files:
53
53
  - generators/templates/initializer.rb
54
54
  - lib/tarot.rb
55
55
  - lib/tarot/version.rb
56
+ - spec/data/recursive.yml
56
57
  - spec/data/test.yml
57
58
  - spec/spec_helper.rb
58
59
  - spec/tarot_spec.rb
@@ -92,6 +93,7 @@ signing_key:
92
93
  specification_version: 3
93
94
  summary: Tarot is a small, concise configuration library for Rails apps.
94
95
  test_files:
96
+ - spec/data/recursive.yml
95
97
  - spec/data/test.yml
96
98
  - spec/spec_helper.rb
97
99
  - spec/tarot_spec.rb