confrider 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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