configa 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -132,9 +132,33 @@ config.videos.tarantool.space
132
132
  #=> 1
133
133
  config.videos.tarantool.type
134
134
  #=> :em
135
+ ```
136
+
137
+ All properties that defined higher in the tree will rewrite root properties:
138
+
139
+ ```yaml
140
+ database:
141
+ adapter: sqlite
142
+ user: root
135
143
 
144
+ development:
145
+ database:
146
+ db: dev_sqlite
147
+
148
+ staging:
149
+ database:
150
+ adapter: mysql
151
+ internal_servers:
152
+ database:
153
+ db: internal_db
154
+ external_servers:
155
+ database:
156
+ db: external_db
157
+ user: external_root
136
158
  ```
137
159
 
160
+ So you can see how for whole staging node we rewrite database adapter, then for each subnode we specify other properties.
161
+
138
162
  ## Contributing
139
163
 
140
164
  1. Fork it
data/lib/configa.rb CHANGED
@@ -18,6 +18,10 @@ module Configa
18
18
  parser
19
19
  end
20
20
 
21
+ def to_s
22
+ @yaml
23
+ end
24
+
21
25
  def parser(env=nil)
22
26
  env ||= @base_env
23
27
  env = env.to_s
@@ -40,24 +44,28 @@ module Configa
40
44
  base = ymls.delete(@base_env)
41
45
  yaml = base
42
46
  ymls.each do |env, data|
43
- yaml[env] = base.merge(data)
47
+ yaml[env] = data
44
48
  end
45
49
  yaml = merge_yaml(yaml)
46
- ymls.each do |env, data|
47
- yaml[env] = merge_yaml(yaml[env])
48
- end
49
50
  yaml
50
51
  end
51
52
 
52
- def merge_yaml(yaml)
53
- root_keys = yaml.keys
53
+ # Tree traverse
54
+ def merge_yaml(yaml, cache={})
55
+ cache = cache.dup
56
+ yaml.each do |k,v|
57
+ next unless Hash === v
58
+ cache[k] ||= {}
59
+ cache[k] = cache[k].merge v if cache[k] != v
60
+ end
54
61
  yaml.each do |k,v|
55
62
  next unless Hash === v
56
63
  v.each do |key, data|
57
- if root_keys.include? key
58
- yaml[k][key] = yaml[key].merge data
64
+ if cache[key]
65
+ yaml[k][key] = cache[key].merge data if cache[key] != data
59
66
  end
60
67
  end
68
+ yaml[k] = merge_yaml(yaml[k], cache)
61
69
  end
62
70
  yaml
63
71
  end
@@ -1,3 +1,3 @@
1
1
  module Configa
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/spec/config.yml CHANGED
@@ -16,4 +16,15 @@ production:
16
16
  mysql:
17
17
  database: mysql_prod
18
18
  username: admin
19
- password: strongone
19
+ password: strongone
20
+
21
+ staging:
22
+ prestaging:
23
+ mysql:
24
+ username: test
25
+ users:
26
+ mysql:
27
+ database: users
28
+ blogs:
29
+ mysql:
30
+ database: blogs
@@ -11,6 +11,11 @@ describe Configa do
11
11
  dev = configa.instance_variable_get(:"@yaml")["development"]
12
12
  dev["mysql"]["adapter"].must_equal mysql["adapter"]
13
13
  dev["mysql"]["database"].must_equal "mysql_dev"
14
+ proc{ configa.staging.prestaging.mysql.database}.must_raise Configa::UnknownKey
15
+ configa.staging.prestaging.mysql.adapter.must_equal "mysql"
16
+ configa.staging.prestaging.users.mysql.adapter.must_equal "mysql"
17
+ configa.staging.prestaging.users.mysql.username.must_equal "test"
18
+ configa.staging.prestaging.users.mysql.database.must_equal "users"
14
19
  end
15
20
 
16
21
  it "basic test for multi file config" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: configa
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: