omniconf 0.0.2 → 0.1.0
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 +5 -3
- data/lib/omniconf.rb +7 -2
- data/lib/omniconf/blank_state.rb +5 -3
- data/lib/omniconf/configuration.rb +5 -22
- data/lib/omniconf/version.rb +1 -1
- data/omniconf.gemspec +4 -4
- data/spec/fixtures/omniconf/adapters/yaml/config/settings.yml +11 -3
- data/spec/omniconf/adapters/yaml_spec.rb +11 -0
- data/spec/omniconf/configuration_spec.rb +5 -0
- data/spec/omniconf/helpers_spec.rb +1 -1
- data/spec/omniconf_spec.rb +2 -6
- metadata +35 -15
data/README.md
CHANGED
@@ -36,10 +36,12 @@ $ rails c
|
|
36
36
|
=> 123
|
37
37
|
> Omniconf.configuration.api.username # it works with nested values too
|
38
38
|
=> "root"
|
39
|
-
> Omniconf.configuration.api #
|
39
|
+
> Omniconf.configuration.api # returns a hash if nested
|
40
40
|
=> {"username"=>"root"}
|
41
|
+
> Omniconf.configuration.non_existant # returns nil
|
42
|
+
=> nil
|
41
43
|
> Omniconf.configuration.non_existant.config_value # raises an exception
|
42
|
-
=>
|
44
|
+
=> NoMethodError: undefined method `config_value' for nil:NilClass
|
43
45
|
```
|
44
46
|
|
45
47
|
## Setting values
|
@@ -52,7 +54,7 @@ $ rails c
|
|
52
54
|
> Omniconf.configuration.api.username = "admin" # it works with nested values too
|
53
55
|
=> "admin"
|
54
56
|
> Omniconf.configuration.brand_new_value = "whatever" # raises an exception because you've got to tell which back-end will store the new value
|
55
|
-
=> Omniconf::UnknownConfigurationValue: cannot set a configuration value with no
|
57
|
+
=> Omniconf::UnknownConfigurationValue: cannot set a configuration value with no parents
|
56
58
|
> Omniconf.sources[:database].brand_new_value = "whatever" # adds a new record in ConfigValue model
|
57
59
|
=> "whatever"
|
58
60
|
```
|
data/lib/omniconf.rb
CHANGED
@@ -43,13 +43,14 @@ module Omniconf
|
|
43
43
|
params[:adapter].load_configuration!
|
44
44
|
Omniconf.logger.info "Loaded configuration from #{source_id.inspect} source"
|
45
45
|
end
|
46
|
+
Omniconf.logger.info "Global configuration: #{configuration.inspect}"
|
46
47
|
end
|
47
48
|
|
48
49
|
alias_method :reload_configuration!, :load_configuration!
|
49
50
|
|
50
51
|
def merge_configuration! source_id
|
51
|
-
Omniconf.logger.debug "Merging from #{source_id.inspect} source"
|
52
52
|
source_config = Omniconf.sources[source_id].to_hash
|
53
|
+
Omniconf.logger.debug "Merging #{source_config.inspect} from #{source_id.inspect} source"
|
53
54
|
global_config = Omniconf.configuration.to_hash
|
54
55
|
global_config.recursive_merge!(source_config) do |key, old_val, new_val|
|
55
56
|
Omniconf.logger.warn \
|
@@ -74,7 +75,7 @@ module Omniconf
|
|
74
75
|
end
|
75
76
|
end
|
76
77
|
raise UnknownConfigurationValue,
|
77
|
-
"cannot set a configuration value with no
|
78
|
+
"cannot set a configuration value with no parents" unless found
|
78
79
|
end
|
79
80
|
|
80
81
|
private
|
@@ -82,12 +83,16 @@ module Omniconf
|
|
82
83
|
return unless @settings.sources
|
83
84
|
@settings.sources.each do |source_id, params|
|
84
85
|
adapter_file = params[:type].to_s
|
86
|
+
|
85
87
|
require "omniconf/adapters/#{adapter_file}"
|
88
|
+
|
86
89
|
adapter_class = adapter_file.split('_').map {|w| w.capitalize}.join
|
87
90
|
raise unless params[:adapter].nil?
|
91
|
+
|
88
92
|
params[:adapter] = Omniconf::Adapter.class_eval do
|
89
93
|
const_get(adapter_class).new(source_id, params)
|
90
94
|
end
|
95
|
+
|
91
96
|
Omniconf.logger.debug "Registered #{adapter_class}::#{source_id} source"
|
92
97
|
end
|
93
98
|
end
|
data/lib/omniconf/blank_state.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
module Omniconf
|
2
2
|
class BlankSlate
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
# do not undef these methods
|
4
|
+
WHITELIST = %w(inspect object_id)
|
5
|
+
|
6
|
+
instance_methods.map(&:to_s).each do |method|
|
7
|
+
undef_method method unless method.start_with?('__') || WHITELIST.include?(method)
|
6
8
|
end
|
7
9
|
end
|
8
10
|
end
|
@@ -27,13 +27,11 @@ module Omniconf
|
|
27
27
|
|
28
28
|
def method_missing(method, *args)
|
29
29
|
raise NoMethodError, "undefined method `#{method}' for #{self}" \
|
30
|
-
if method.to_s
|
30
|
+
if method.to_s.start_with? '__' # will save hours tracking down heisenbugs
|
31
31
|
|
32
32
|
len = args.length
|
33
|
-
if
|
34
|
-
|
35
|
-
key, value = new_key, args[0]
|
36
|
-
else
|
33
|
+
if key = method.to_s.chomp!('=') # write
|
34
|
+
unless len == 1 # args[0] is the value
|
37
35
|
raise ArgumentError, "wrong number of arguments (#{len} for 1)"
|
38
36
|
end
|
39
37
|
|
@@ -45,12 +43,12 @@ module Omniconf
|
|
45
43
|
parent = parent[:object].__parent
|
46
44
|
end
|
47
45
|
|
48
|
-
@__adapter.set_value(full_key,
|
46
|
+
@__adapter.set_value(full_key, args[0]) # notify the adapter
|
49
47
|
else
|
50
48
|
Omniconf.logger.warn "No adapter to notify"
|
51
49
|
end
|
52
50
|
|
53
|
-
@__table[key] =
|
51
|
+
@__table[key] = args[0] # update our internal config hash
|
54
52
|
|
55
53
|
if @__adapter.is_a? Omniconf::Adapter::Base
|
56
54
|
# we need to merge the global config
|
@@ -63,21 +61,6 @@ module Omniconf
|
|
63
61
|
if value.is_a?(Hash)
|
64
62
|
Configuration.new(@__adapter, value, {:root => key, :object => self})
|
65
63
|
else
|
66
|
-
unless value
|
67
|
-
# add a catch-all exception
|
68
|
-
# (more descriptive than "undefined method `xxx' for nil:NilClass")
|
69
|
-
class << value
|
70
|
-
def method_missing method, *args
|
71
|
-
if method == :to_str
|
72
|
-
# need to raise NoMethodError here for Ruby 1.9.2 compatibility
|
73
|
-
raise NoMethodError, "undefined method `#{method}' for #{self}"
|
74
|
-
else
|
75
|
-
raise UnknownConfigurationValue,
|
76
|
-
"cannot get a configuration value with no parent"
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
64
|
value
|
82
65
|
end
|
83
66
|
|
data/lib/omniconf/version.rb
CHANGED
data/omniconf.gemspec
CHANGED
@@ -5,9 +5,9 @@ require "omniconf/version"
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = "omniconf"
|
7
7
|
s.version = Omniconf::VERSION
|
8
|
-
s.authors = ["
|
9
|
-
s.email = ["cedric@
|
10
|
-
s.homepage = "https://github.com/
|
8
|
+
s.authors = ["Cédric Félizard"]
|
9
|
+
s.email = ["cedric@felizard.fr"]
|
10
|
+
s.homepage = "https://github.com/infertux/omniconf"
|
11
11
|
s.summary = %q{Merge multiple configuration sources into one.}
|
12
12
|
s.description = %q{Merge configurations from multiple back-ends for easy use in a complex application.}
|
13
13
|
|
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
|
21
21
|
s.add_development_dependency 'rake', '~> 0.9'
|
22
|
-
s.add_development_dependency 'rspec', '~> 2.
|
22
|
+
s.add_development_dependency 'rspec', '~> 2.10'
|
23
23
|
s.add_development_dependency 'sqlite3', '~> 1.3'
|
24
24
|
s.add_development_dependency 'activerecord', '~> 3.2'
|
25
25
|
end
|
@@ -1,10 +1,18 @@
|
|
1
|
+
common: &common
|
2
|
+
common_key: common_value
|
3
|
+
override_key: override_me
|
4
|
+
|
1
5
|
test:
|
6
|
+
<<: *common
|
2
7
|
yaml_key: yaml_value
|
3
|
-
|
4
|
-
yaml_key: nested_yaml_value
|
5
|
-
overridden: by_yaml
|
8
|
+
override_key: override_value
|
6
9
|
some_integer: 1337
|
7
10
|
some_float: 3.14
|
8
11
|
some_array: [1, 2, 3]
|
12
|
+
nested:
|
13
|
+
yaml_key: nested_yaml_value
|
14
|
+
|
9
15
|
development:
|
16
|
+
<<: *common
|
10
17
|
yaml_key: yaml_value_dev
|
18
|
+
|
@@ -86,6 +86,17 @@ describe Omniconf::Adapter::Yaml do
|
|
86
86
|
config.yaml_key.should == 'yaml_value_dev'
|
87
87
|
end
|
88
88
|
|
89
|
+
it "merges common values" do
|
90
|
+
%w(test development).each do |env|
|
91
|
+
load_configuration env
|
92
|
+
config.common_key.should == 'common_value'
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
it "overrides common values" do
|
97
|
+
config.override_key.should == 'override_value'
|
98
|
+
end
|
99
|
+
|
89
100
|
it "keeps value types" do
|
90
101
|
config.some_integer.should == 1337
|
91
102
|
config.some_float.should == 3.14
|
@@ -17,6 +17,11 @@ describe Omniconf::Configuration do
|
|
17
17
|
}
|
18
18
|
end
|
19
19
|
|
20
|
+
it "is blank slated" do
|
21
|
+
# check we don't have the 40-ish methods inherited from the Object class
|
22
|
+
Omniconf::Configuration.new(nil).hash.should be_nil
|
23
|
+
end
|
24
|
+
|
20
25
|
describe "#initialize" do
|
21
26
|
it "takes a hash as argument" do
|
22
27
|
expect { Omniconf::Configuration.new nil, hash }.to_not raise_error
|
@@ -3,7 +3,7 @@ require 'omniconf/helpers'
|
|
3
3
|
|
4
4
|
describe Hash do
|
5
5
|
describe "#recursive_stringify_keys!" do
|
6
|
-
it "stringify hash
|
6
|
+
it "stringify hash keys recursively" do
|
7
7
|
hash = {:a => 1, :b => {:aa => {:aaa => 'AAA', 'bbb' => nil}}}
|
8
8
|
hash.recursive_stringify_keys!
|
9
9
|
hash.should == {'a' => 1, 'b' => {'aa' => {'aaa' => 'AAA', 'bbb' => nil}}}
|
data/spec/omniconf_spec.rb
CHANGED
@@ -53,10 +53,6 @@ describe Omniconf do
|
|
53
53
|
Omniconf.configuration
|
54
54
|
end
|
55
55
|
|
56
|
-
it "returns an instance of Omniconf::Configuration" do
|
57
|
-
config.should be_an_instance_of Omniconf::Configuration
|
58
|
-
end
|
59
|
-
|
60
56
|
describe "getting values" do
|
61
57
|
it "loads and merges all configurations" do
|
62
58
|
config.yaml_key.should == 'yaml_value'
|
@@ -89,7 +85,7 @@ describe Omniconf do
|
|
89
85
|
end
|
90
86
|
|
91
87
|
it "fails to create a new value with no sources" do
|
92
|
-
#
|
88
|
+
# since we cannot know in which source to save it
|
93
89
|
config.no.should be_nil
|
94
90
|
expect {
|
95
91
|
config.no = 'whatever'
|
@@ -102,7 +98,7 @@ describe Omniconf do
|
|
102
98
|
|
103
99
|
expect {
|
104
100
|
Omniconf.sources[:database].no.no = 'new_ar_value'
|
105
|
-
}.to raise_error
|
101
|
+
}.to raise_error NoMethodError
|
106
102
|
end
|
107
103
|
end
|
108
104
|
end
|
metadata
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omniconf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
|
-
-
|
8
|
+
- Cédric Félizard
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-06-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,21 +21,31 @@ dependencies:
|
|
21
21
|
version: '0.9'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0.9'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: rspec
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ~>
|
31
36
|
- !ruby/object:Gem::Version
|
32
|
-
version: '2.
|
37
|
+
version: '2.10'
|
33
38
|
type: :development
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '2.10'
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: sqlite3
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ~>
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: '1.3'
|
44
54
|
type: :development
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.3'
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: activerecord
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ~>
|
@@ -54,11 +69,16 @@ dependencies:
|
|
54
69
|
version: '3.2'
|
55
70
|
type: :development
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '3.2'
|
58
78
|
description: Merge configurations from multiple back-ends for easy use in a complex
|
59
79
|
application.
|
60
80
|
email:
|
61
|
-
- cedric@
|
81
|
+
- cedric@felizard.fr
|
62
82
|
executables: []
|
63
83
|
extensions: []
|
64
84
|
extra_rdoc_files: []
|
@@ -95,7 +115,7 @@ files:
|
|
95
115
|
- spec/omniconf/helpers_spec.rb
|
96
116
|
- spec/omniconf_spec.rb
|
97
117
|
- spec/spec_helper.rb
|
98
|
-
homepage: https://github.com/
|
118
|
+
homepage: https://github.com/infertux/omniconf
|
99
119
|
licenses: []
|
100
120
|
post_install_message:
|
101
121
|
rdoc_options: []
|
@@ -115,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
115
135
|
version: '0'
|
116
136
|
requirements: []
|
117
137
|
rubyforge_project: omniconf
|
118
|
-
rubygems_version: 1.8.
|
138
|
+
rubygems_version: 1.8.24
|
119
139
|
signing_key:
|
120
140
|
specification_version: 3
|
121
141
|
summary: Merge multiple configuration sources into one.
|