confrider 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/.gitignore CHANGED
@@ -9,3 +9,4 @@ spec/reports
9
9
  test/tmp
10
10
  test/version_tmp
11
11
  tmp
12
+ .rvmrc
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- confrider (0.0.1)
4
+ confrider (0.0.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -1,6 +1,42 @@
1
1
  # Confrider
2
2
 
3
- TODO: Write a gem description
3
+ Configuration managment system with i18n like syntax
4
+
5
+ ## Usage
6
+
7
+ ### little helper(to render yaml files with ERB)
8
+
9
+ require "erb"
10
+ require "yaml"
11
+ def load_yml(yml_path)
12
+ YAML.load(ERB.new(File.read(yml_path)).result(binding))
13
+ end
14
+
15
+ ### settings.yml (example)
16
+
17
+ app:
18
+ name: some app name
19
+ version: <%= File.read('VERSION') %>
20
+ subnamespace:
21
+ another_key: value
22
+
23
+ ### using Confrider
24
+
25
+ $cfg = Confrider.from_hash(load_yml('/path/to/settings.yml'))
26
+ # or short form
27
+ $cfg = Confrider(load_yml('/path/to/settings.yml'))
28
+ $cfg['app.name'] # => 'some app name'
29
+ $cfg['app.version'] # will be rendered through ERB
30
+ $cfg['app.subnamespace'] # => {'another_key' => 'value'}
31
+ $cfg['app.subnamespace.another_key'] # => 'value'
32
+ $cfg['non.existent.key'] # => nil
33
+ $cfg['non.existent.key', 'default'] # => 'default'
34
+
35
+ ### deep merge hashes
36
+
37
+ # load additional hash that will be deeply merged
38
+ $cfg.from_hash(load_yml('/path/to/settings_local.yml'))
39
+
4
40
 
5
41
  ## Installation
6
42
 
@@ -16,10 +52,6 @@ Or install it yourself as:
16
52
 
17
53
  $ gem install confrider
18
54
 
19
- ## Usage
20
-
21
- TODO: Write usage instructions here
22
-
23
55
  ## Contributing
24
56
 
25
57
  1. Fork it
@@ -27,3 +59,4 @@ TODO: Write usage instructions here
27
59
  3. Commit your changes (`git commit -am 'Added some feature'`)
28
60
  4. Push to the branch (`git push origin my-new-feature`)
29
61
  5. Create new Pull Request
62
+
@@ -1,29 +1,38 @@
1
1
  class Confrider::Core
2
- def initialize(hash)
2
+ def initialize
3
3
  @vault = {}
4
- save_hash(nil, hash)
5
4
  end
6
5
 
7
6
  def [](key, default_value = nil)
8
7
  @vault.fetch(key, default_value)
9
8
  end
10
9
 
10
+ def from_hash(hash)
11
+ save_hash(nil, hash)
12
+ end
13
+
14
+ def normalize_keys(*keys)
15
+ keys.join('.').gsub(/^\./, '')
16
+ end
17
+
18
+ private
19
+
11
20
  def save(key, value)
12
21
  @vault[key] = value
13
22
  end
14
23
 
15
24
  def save_hash(key, hash)
16
- @vault[key] = hash if key
25
+ if key
26
+ @vault[key] ||= {}
27
+ @vault[key].deep_merge!(hash)
28
+ end
17
29
  hash.each do |inner_key, value|
18
30
  normalized_key = normalize_keys(key, inner_key)
19
- case value
20
- when Hash then save_hash(normalized_key, value)
21
- else save(normalized_key, value)
31
+ if value.is_a? Hash
32
+ save_hash(normalized_key, value)
33
+ else
34
+ save(normalized_key, value)
22
35
  end
23
36
  end
24
37
  end
25
-
26
- def normalize_keys(*keys)
27
- keys.join('.').gsub(/^\./, '')
28
- end
29
38
  end
@@ -0,0 +1,18 @@
1
+ # ported from active_support/core_ext/hash/deep_merge
2
+
3
+ class Hash
4
+ # Returns a new hash with +self+ and +other_hash+ merged recursively.
5
+ def deep_merge(other_hash)
6
+ dup.deep_merge!(other_hash)
7
+ end
8
+
9
+ # Returns a new hash with +self+ and +other_hash+ merged recursively.
10
+ # Modifies the receiver in place.
11
+ def deep_merge!(other_hash)
12
+ other_hash.each_pair do |k,v|
13
+ tv = self[k]
14
+ self[k] = tv.is_a?(Hash) && v.is_a?(Hash) ? tv.deep_merge(v) : v
15
+ end
16
+ self
17
+ end
18
+ end
@@ -1,3 +1,3 @@
1
1
  module Confrider
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
data/lib/confrider.rb CHANGED
@@ -1,8 +1,15 @@
1
1
  require 'confrider/version'
2
+ require 'confrider/deep_merge'
2
3
  require 'confrider/core'
3
4
 
4
5
  module Confrider
5
6
  def self.from_hash(hash)
6
- Confrider::Core.new hash
7
+ Confrider::Core.new.tap do |o|
8
+ o.from_hash hash
9
+ end
7
10
  end
8
11
  end
12
+
13
+ def Confrider(hash)
14
+ Confrider.from_hash(hash)
15
+ end
@@ -1,23 +1,37 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Confrider::Core do
4
- let(:cfg) { Confrider::Core.new :foo => 'bar' }
4
+ let(:cfg) { Confrider::Core.new.tap { |o| o.from_hash :foo => 'bar'} }
5
5
 
6
- context '#initialize' do
6
+ describe '#initialize' do
7
7
  it 'should init @vault' do
8
- cfg.instance_variable_get('@vault').should be
8
+ cfg.instance_variable_get('@vault').should be_a Hash
9
9
  end
10
10
  end
11
11
 
12
- context '#save_hash' do
13
- let(:cfg) { Confrider::Core.new 'foo' => {'bar' => {'baz' => 'value'}} }
12
+ describe '#from_hash' do
13
+ let(:cfg) do
14
+ Confrider::Core.new.tap do |o|
15
+ o.from_hash 'foo' => {'bar' => {'baz' => 'value'}}
16
+ end
17
+ end
14
18
 
15
19
  it 'should flatten hash keys' do
16
20
  cfg['foo.bar.baz'].should == 'value'
17
21
  end
22
+
23
+ it 'should merge nested hashes' do
24
+ cfg.from_hash 'foo' => {'bar' => {'kii' => 'kiivalue'}}
25
+ cfg['foo.bar.baz'].should == 'value'
26
+ cfg['foo.bar.kii'].should == 'kiivalue'
27
+
28
+ # hash should be merged
29
+ cfg['foo.bar'].should include('kii' => 'kiivalue')
30
+ cfg['foo.bar'].should include('baz' => 'value')
31
+ end
18
32
  end
19
33
 
20
- context '#[]' do
34
+ describe '#[]' do
21
35
  it 'should return value' do
22
36
  cfg['foo'].should == 'bar'
23
37
  end
@@ -27,7 +41,7 @@ describe Confrider::Core do
27
41
  end
28
42
  end
29
43
 
30
- context '#normalize_keys' do
44
+ describe '#normalize_keys' do
31
45
  it 'should join keys with "."' do
32
46
  cfg.normalize_keys('q', 'a', 'z').should == 'q.a.z'
33
47
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: confrider
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:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-19 00:00:00.000000000 Z
12
+ date: 2012-05-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -44,6 +44,7 @@ files:
44
44
  - confrider.gemspec
45
45
  - lib/confrider.rb
46
46
  - lib/confrider/core.rb
47
+ - lib/confrider/deep_merge.rb
47
48
  - lib/confrider/version.rb
48
49
  - spec/lib/confrider/core_spec.rb
49
50
  - spec/lib/confrider/version_spec.rb
@@ -63,7 +64,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
63
64
  version: '0'
64
65
  segments:
65
66
  - 0
66
- hash: -2599701976609297857
67
+ hash: -3148026561097312103
67
68
  required_rubygems_version: !ruby/object:Gem::Requirement
68
69
  none: false
69
70
  requirements:
@@ -72,10 +73,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
72
73
  version: '0'
73
74
  segments:
74
75
  - 0
75
- hash: -2599701976609297857
76
+ hash: -3148026561097312103
76
77
  requirements: []
77
78
  rubyforge_project:
78
- rubygems_version: 1.8.23
79
+ rubygems_version: 1.8.18
79
80
  signing_key:
80
81
  specification_version: 3
81
82
  summary: manage config options like i18n