configa 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: