complex_config 0.3.1 → 0.4.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.
- checksums.yaml +4 -4
- data/README.md +17 -11
- data/VERSION +1 -1
- data/complex_config.gemspec +6 -6
- data/config/products.yml +21 -0
- data/lib/complex_config.rb +1 -0
- data/lib/complex_config/provider.rb +8 -3
- data/lib/complex_config/proxy.rb +32 -0
- data/lib/complex_config/settings.rb +22 -1
- data/lib/complex_config/shortcuts.rb +12 -4
- data/lib/complex_config/version.rb +1 -1
- data/spec/complex_config/provider_spec.rb +1 -1
- data/spec/complex_config/shortcuts_spec.rb +27 -6
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ce05b6145a1404ee49c681b56299be1ea31fb1e4
|
4
|
+
data.tar.gz: 8056f3a0946139f199c27d2f72bfef27f9b7c4eb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0e333940bdbf7bc28857ecddde5986b754cc90e388ed077faa53608fee1e9440b64890893581a906da8e0b53d4eb50459b25afeef382dc8eaef87cef5d696842
|
7
|
+
data.tar.gz: 2cc771c28cdbdb6ada774b87f63b20b8f46b94074571b808c5179dc52ce55a2fb7d8c9b057b25f7e98f047aff893404879fac80b14a835fe2dccc454eb8e82e2
|
data/README.md
CHANGED
@@ -17,7 +17,8 @@ You can also put this line into your Gemfile
|
|
17
17
|
gem 'complex_config', require: 'complex_config/rude'
|
18
18
|
|
19
19
|
and bundle. This command will enable all the default plugins and make the `cc`
|
20
|
-
and `complex_config` shortcuts available.
|
20
|
+
and `complex_config` shortcuts available. The configurations are expected to be
|
21
|
+
in the `config` subdirectory according to the rails convention.
|
21
22
|
|
22
23
|
## Usage
|
23
24
|
|
@@ -52,34 +53,37 @@ can now access the configuration.
|
|
52
53
|
|
53
54
|
Fetching the name of a product:
|
54
55
|
|
55
|
-
> cc
|
56
|
+
> cc.products.flux_capacitor.enterprise_version.name => "Flux Capacitor Enterpise"
|
57
|
+
|
58
|
+
If the name of configuration file isn't valid ruby method name syntax you can also
|
59
|
+
use `cc(:products).flux_capacitor…` to avoid this problem.
|
56
60
|
|
57
61
|
Fetching the price of a product in cents:
|
58
62
|
|
59
|
-
>
|
63
|
+
> c.products.flux_capacitor.enterprise_version.price_in_cents => 160000000
|
60
64
|
|
61
65
|
Fetching the price of a product and using the ComplexConfig::Plugins::MONEY
|
62
66
|
plugin to format it:
|
63
67
|
|
64
|
-
>
|
68
|
+
> c.products.flux_capacitor.enterprise_version.price.format => "€1,600,000.00"
|
65
69
|
|
66
70
|
Fetching the URL of a product manual as a string:
|
67
71
|
|
68
|
-
>
|
72
|
+
> c.products.flux_capacitor.enterprise_version.manual_pdf_url => "http://brown-inc.com/manuals/fc_enterprise.pdf"
|
69
73
|
|
70
74
|
Fetching the URL of a product manual and using the ComplexConfig::Plugins::URI
|
71
75
|
plugin return an URI instance:
|
72
76
|
|
73
|
-
>
|
77
|
+
> c.products.flux_capacitor.enterprise_version.manual_pdf_uri => #<URI::HTTP:0x007ff626d2a2e8 URL:http://brown-inc.com/manuals/fc_enterprise.pdf>
|
74
78
|
|
75
79
|
You can also fetch config settings from a different environment:
|
76
80
|
|
77
|
-
>> pp cc(:
|
78
|
-
flux_capacitor.test_version.name = "Yadayada"
|
79
|
-
flux_capacitor.test_version.price_in_cents = 666
|
80
|
-
flux_capacitor.test_version.manual_pdf_url = "http://staging.brown-inc.com/manuals/fc_10.pdf"
|
81
|
+
>> pp cc.products(:test); nil
|
82
|
+
products.flux_capacitor.test_version.name = "Yadayada"
|
83
|
+
products.flux_capacitor.test_version.price_in_cents = 666
|
84
|
+
products.flux_capacitor.test_version.manual_pdf_url = "http://staging.brown-inc.com/manuals/fc_10.pdf"
|
81
85
|
|
82
|
-
Calling `complex_config
|
86
|
+
Calling `complex_config.products.` instead of `cc(…)` would skip the implicite
|
83
87
|
namespacing via the `RAILS_ENV` environment, so
|
84
88
|
`complex_config(:products).test.flux_capacitor` returns the same settings
|
85
89
|
object.
|
@@ -112,6 +116,8 @@ Here is the `ComplexConfig::Plugins::MONEY` plugin for example:
|
|
112
116
|
end
|
113
117
|
|
114
118
|
## Changes
|
119
|
+
* 2015-11-17 Release 0.4.0
|
120
|
+
* Add root object for configuration, e. g. cc.name instead of cc(name).
|
115
121
|
* 2015-11-03 Release 0.3.1
|
116
122
|
* Add missing dependency to tins.
|
117
123
|
* 2015-11-03 Release 0.3.0
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
data/complex_config.gemspec
CHANGED
@@ -1,22 +1,22 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: complex_config 0.
|
2
|
+
# stub: complex_config 0.4.0 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "complex_config"
|
6
|
-
s.version = "0.
|
6
|
+
s.version = "0.4.0"
|
7
7
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
9
9
|
s.require_paths = ["lib"]
|
10
10
|
s.authors = ["Florian Frank"]
|
11
|
-
s.date = "2015-11-
|
11
|
+
s.date = "2015-11-17"
|
12
12
|
s.description = "This library allows you to access configuration files via a simple interface"
|
13
13
|
s.email = "flori@ping.de"
|
14
|
-
s.extra_rdoc_files = ["README.md", "lib/complex_config.rb", "lib/complex_config/errors.rb", "lib/complex_config/plugins.rb", "lib/complex_config/plugins/enable.rb", "lib/complex_config/plugins/money.rb", "lib/complex_config/plugins/uri.rb", "lib/complex_config/provider.rb", "lib/complex_config/rude.rb", "lib/complex_config/settings.rb", "lib/complex_config/shortcuts.rb", "lib/complex_config/version.rb"]
|
15
|
-
s.files = [".gitignore", ".rspec", ".travis.yml", ".utilsrc", "COPYING", "Gemfile", "README.md", "Rakefile", "TODO.md", "VERSION", "complex_config.gemspec", "lib/complex_config.rb", "lib/complex_config/errors.rb", "lib/complex_config/plugins.rb", "lib/complex_config/plugins/enable.rb", "lib/complex_config/plugins/money.rb", "lib/complex_config/plugins/uri.rb", "lib/complex_config/provider.rb", "lib/complex_config/rude.rb", "lib/complex_config/settings.rb", "lib/complex_config/shortcuts.rb", "lib/complex_config/version.rb", "spec/complex_config/plugins_spec.rb", "spec/complex_config/provider_spec.rb", "spec/complex_config/settings_spec.rb", "spec/complex_config/shortcuts_spec.rb", "spec/config/broken_config.yml", "spec/config/config.yml", "spec/spec_helper.rb"]
|
14
|
+
s.extra_rdoc_files = ["README.md", "lib/complex_config.rb", "lib/complex_config/errors.rb", "lib/complex_config/plugins.rb", "lib/complex_config/plugins/enable.rb", "lib/complex_config/plugins/money.rb", "lib/complex_config/plugins/uri.rb", "lib/complex_config/provider.rb", "lib/complex_config/proxy.rb", "lib/complex_config/rude.rb", "lib/complex_config/settings.rb", "lib/complex_config/shortcuts.rb", "lib/complex_config/version.rb"]
|
15
|
+
s.files = [".gitignore", ".rspec", ".travis.yml", ".utilsrc", "COPYING", "Gemfile", "README.md", "Rakefile", "TODO.md", "VERSION", "complex_config.gemspec", "config/products.yml", "lib/complex_config.rb", "lib/complex_config/errors.rb", "lib/complex_config/plugins.rb", "lib/complex_config/plugins/enable.rb", "lib/complex_config/plugins/money.rb", "lib/complex_config/plugins/uri.rb", "lib/complex_config/provider.rb", "lib/complex_config/proxy.rb", "lib/complex_config/rude.rb", "lib/complex_config/settings.rb", "lib/complex_config/shortcuts.rb", "lib/complex_config/version.rb", "spec/complex_config/plugins_spec.rb", "spec/complex_config/provider_spec.rb", "spec/complex_config/settings_spec.rb", "spec/complex_config/shortcuts_spec.rb", "spec/config/broken_config.yml", "spec/config/config.yml", "spec/spec_helper.rb"]
|
16
16
|
s.homepage = "https://github.com/flori/complex_config"
|
17
17
|
s.licenses = ["Apache-2.0"]
|
18
18
|
s.rdoc_options = ["--title", "ComplexConfig -- configuration library", "--main", "README.md"]
|
19
|
-
s.rubygems_version = "2.
|
19
|
+
s.rubygems_version = "2.5.0"
|
20
20
|
s.summary = "configuration library"
|
21
21
|
s.test_files = ["spec/complex_config/plugins_spec.rb", "spec/complex_config/provider_spec.rb", "spec/complex_config/settings_spec.rb", "spec/complex_config/shortcuts_spec.rb", "spec/spec_helper.rb"]
|
22
22
|
|
data/config/products.yml
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
development:
|
2
|
+
flux_capacitor:
|
3
|
+
version_20:
|
4
|
+
name: Flux Capacitor Version 2.0
|
5
|
+
price_in_cents: 12_000_00
|
6
|
+
manual_pdf_url: "http://brown-inc.com/manuals/fc_20.pdf"
|
7
|
+
pro_version:
|
8
|
+
name: Flux Capacitor Professional
|
9
|
+
price_in_cents: 23_000_00
|
10
|
+
manual_pdf_url: "http://brown-inc.com/manuals/fc_pro.pdf"
|
11
|
+
enterprise_version:
|
12
|
+
name: Flux Capacitor Enterpise
|
13
|
+
price_in_cents: 1_600_000_00
|
14
|
+
manual_pdf_url: "http://brown-inc.com/manuals/fc_enterprise.pdf"
|
15
|
+
|
16
|
+
test:
|
17
|
+
flux_capacitor:
|
18
|
+
test_version:
|
19
|
+
name: Yadayada
|
20
|
+
price_in_cents: 6_66
|
21
|
+
manual_pdf_url: "http://staging.brown-inc.com/manuals/fc_10.pdf"
|
data/lib/complex_config.rb
CHANGED
@@ -37,9 +37,10 @@ class ComplexConfig::Provider
|
|
37
37
|
root + "config/#{name}.yml"
|
38
38
|
end
|
39
39
|
|
40
|
-
def config(pathname)
|
40
|
+
def config(pathname, name = nil)
|
41
41
|
result = evaluate(pathname)
|
42
|
-
|
42
|
+
hash = ::YAML.load(result, pathname)
|
43
|
+
ComplexConfig::Settings.build(name, hash).tap do |settings|
|
43
44
|
deep_freeze? and settings.deep_freeze
|
44
45
|
end
|
45
46
|
rescue ::Errno::ENOENT => e
|
@@ -49,10 +50,14 @@ class ComplexConfig::Provider
|
|
49
50
|
end
|
50
51
|
|
51
52
|
def [](name)
|
52
|
-
config pathname(name)
|
53
|
+
config pathname(name), name
|
53
54
|
end
|
54
55
|
memoize_method :[]
|
55
56
|
|
57
|
+
def proxy(env = nil)
|
58
|
+
ComplexConfig::Proxy.new(env)
|
59
|
+
end
|
60
|
+
|
56
61
|
def flush_cache
|
57
62
|
memoize_cache_clear
|
58
63
|
self
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module ComplexConfig
|
2
|
+
class Proxy < BasicObject
|
3
|
+
def initialize(env = nil)
|
4
|
+
@env = env
|
5
|
+
end
|
6
|
+
|
7
|
+
def to_s
|
8
|
+
'ComplexConfig::Proxy'
|
9
|
+
end
|
10
|
+
|
11
|
+
def inspect
|
12
|
+
"#<#{to_s}>"
|
13
|
+
end
|
14
|
+
|
15
|
+
def reload
|
16
|
+
::ComplexConfig::Provider.flush_cache
|
17
|
+
self
|
18
|
+
end
|
19
|
+
|
20
|
+
def method_missing(name, *args)
|
21
|
+
config = ::ComplexConfig::Provider[name]
|
22
|
+
env, = args
|
23
|
+
if env
|
24
|
+
config[env]
|
25
|
+
elsif @env
|
26
|
+
config[@env]
|
27
|
+
else
|
28
|
+
config
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -1,11 +1,32 @@
|
|
1
1
|
require 'json'
|
2
2
|
require 'tins/xt/ask_and_send'
|
3
|
+
require 'tins/thread_local'
|
3
4
|
|
4
5
|
class ComplexConfig::Settings < JSON::GenericObject
|
5
6
|
def self.[](*a)
|
6
7
|
from_hash *a
|
7
8
|
end
|
8
9
|
|
10
|
+
class << self
|
11
|
+
extend Tins::ThreadLocal
|
12
|
+
|
13
|
+
thread_local :name_prefix
|
14
|
+
end
|
15
|
+
|
16
|
+
attr_accessor :name_prefix
|
17
|
+
|
18
|
+
def self.build(name, hash)
|
19
|
+
name.nil? or self.name_prefix = name.to_sym
|
20
|
+
self[hash]
|
21
|
+
ensure
|
22
|
+
self.name_prefix = nil
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize(*)
|
26
|
+
self.name_prefix = self.class.name_prefix
|
27
|
+
super
|
28
|
+
end
|
29
|
+
|
9
30
|
def attribute_set?(name)
|
10
31
|
table.key?(name.to_sym)
|
11
32
|
end
|
@@ -37,7 +58,7 @@ class ComplexConfig::Settings < JSON::GenericObject
|
|
37
58
|
end
|
38
59
|
end
|
39
60
|
|
40
|
-
def pathes(hash = table, path_sep: ?., prefix:
|
61
|
+
def pathes(hash = table, path_sep: ?., prefix: name_prefix.to_s, result: {})
|
41
62
|
hash.each do |key, value|
|
42
63
|
path = prefix.empty? ? key.to_s : "#{prefix}#{path_sep}#{key}"
|
43
64
|
case value
|
@@ -1,10 +1,18 @@
|
|
1
1
|
require 'complex_config'
|
2
2
|
|
3
|
-
def complex_config_with_env(name, env = ComplexConfig::Provider.env)
|
4
|
-
|
3
|
+
def complex_config_with_env(name = nil, env = ComplexConfig::Provider.env)
|
4
|
+
if name
|
5
|
+
ComplexConfig::Provider[name][env.to_s]
|
6
|
+
else
|
7
|
+
ComplexConfig::Provider.proxy(env.to_s)
|
8
|
+
end
|
5
9
|
end
|
6
10
|
alias cc complex_config_with_env
|
7
11
|
|
8
|
-
def complex_config(name)
|
9
|
-
|
12
|
+
def complex_config(name = nil)
|
13
|
+
if name
|
14
|
+
ComplexConfig::Provider[name]
|
15
|
+
else
|
16
|
+
ComplexConfig::Provider.proxy
|
17
|
+
end
|
10
18
|
end
|
@@ -107,8 +107,8 @@ RSpec.describe ComplexConfig::Provider do
|
|
107
107
|
}.to change {
|
108
108
|
provider.instance.__send__(:__memoize_cache__).size
|
109
109
|
}.by(1)
|
110
|
-
expect(provider['config']).to be_a ComplexConfig::Settings
|
111
110
|
expect(provider).not_to receive(:config)
|
111
|
+
expect(provider['config']).to be_a ComplexConfig::Settings
|
112
112
|
end
|
113
113
|
|
114
114
|
it 'can flush loaded configurations' do
|
@@ -10,35 +10,56 @@ RSpec.describe 'shortcuts' do
|
|
10
10
|
provider.root = Pathname.new(__FILE__).dirname.dirname
|
11
11
|
end
|
12
12
|
|
13
|
+
it 'returns a proxy object for the shortcuts' do
|
14
|
+
expect(complex_config_with_env.to_s).to eq 'ComplexConfig::Proxy'
|
15
|
+
expect(cc.inspect).to eq '#<ComplexConfig::Proxy>'
|
16
|
+
expect(complex_config.to_s).to eq 'ComplexConfig::Proxy'
|
17
|
+
expect(cc.config.name_prefix).to eq :config
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'can be reloaded via shortcut' do
|
21
|
+
expect(ComplexConfig::Provider).to receive(:flush_cache)
|
22
|
+
complex_config.reload
|
23
|
+
end
|
24
|
+
|
13
25
|
it 'has the complex_config_with_env "shortcut"' do
|
14
|
-
settings = complex_config_with_env('
|
26
|
+
settings = complex_config_with_env.config('development')
|
15
27
|
expect(settings).to be_a ComplexConfig::Settings
|
16
28
|
expect(settings.config.baz).to eq 'something'
|
17
|
-
settings = complex_config_with_env('
|
29
|
+
settings = complex_config_with_env.config('test')
|
18
30
|
expect(settings).to be_a ComplexConfig::Settings
|
19
31
|
expect(settings.config.baz).to eq 'something else'
|
20
32
|
end
|
21
33
|
|
22
34
|
it 'has the alias cc for complex_config_with_env' do
|
23
|
-
settings = cc(:
|
35
|
+
settings = cc.config(:development)
|
24
36
|
expect(settings).to be_a ComplexConfig::Settings
|
25
37
|
expect(settings.config.baz).to eq 'something'
|
26
38
|
end
|
27
39
|
|
28
40
|
it 'considers the environment for complex_config_with_env' do
|
29
|
-
settings = complex_config_with_env
|
41
|
+
settings = complex_config_with_env.config
|
30
42
|
expect(settings).to be_a ComplexConfig::Settings
|
31
43
|
expect(settings.config.baz).to eq 'something'
|
32
44
|
allow(provider).to receive(:env).and_return('test')
|
33
|
-
settings = complex_config_with_env
|
45
|
+
settings = complex_config_with_env.config
|
34
46
|
expect(settings).to be_a ComplexConfig::Settings
|
35
47
|
expect(settings.config.baz).to eq 'something else'
|
36
48
|
end
|
37
49
|
|
38
50
|
it 'has the complex_config shortcut' do
|
39
|
-
settings = complex_config
|
51
|
+
settings = complex_config.config
|
40
52
|
expect(settings).to be_a ComplexConfig::Settings
|
41
53
|
expect(settings.development.config.baz).to eq 'something'
|
42
54
|
expect(settings.test.config.baz).to eq 'something else'
|
43
55
|
end
|
56
|
+
|
57
|
+
it 'has alternatives instead of method syntax' do
|
58
|
+
settings = complex_config_with_env(:config, :development)
|
59
|
+
expect(settings).to be_a ComplexConfig::Settings
|
60
|
+
settings = cc(:config)
|
61
|
+
expect(settings).to be_a ComplexConfig::Settings
|
62
|
+
settings = complex_config(:config)
|
63
|
+
expect(settings).to be_a ComplexConfig::Settings
|
64
|
+
end
|
44
65
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: complex_config
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florian Frank
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gem_hadar
|
@@ -135,6 +135,7 @@ extra_rdoc_files:
|
|
135
135
|
- lib/complex_config/plugins/money.rb
|
136
136
|
- lib/complex_config/plugins/uri.rb
|
137
137
|
- lib/complex_config/provider.rb
|
138
|
+
- lib/complex_config/proxy.rb
|
138
139
|
- lib/complex_config/rude.rb
|
139
140
|
- lib/complex_config/settings.rb
|
140
141
|
- lib/complex_config/shortcuts.rb
|
@@ -151,6 +152,7 @@ files:
|
|
151
152
|
- TODO.md
|
152
153
|
- VERSION
|
153
154
|
- complex_config.gemspec
|
155
|
+
- config/products.yml
|
154
156
|
- lib/complex_config.rb
|
155
157
|
- lib/complex_config/errors.rb
|
156
158
|
- lib/complex_config/plugins.rb
|
@@ -158,6 +160,7 @@ files:
|
|
158
160
|
- lib/complex_config/plugins/money.rb
|
159
161
|
- lib/complex_config/plugins/uri.rb
|
160
162
|
- lib/complex_config/provider.rb
|
163
|
+
- lib/complex_config/proxy.rb
|
161
164
|
- lib/complex_config/rude.rb
|
162
165
|
- lib/complex_config/settings.rb
|
163
166
|
- lib/complex_config/shortcuts.rb
|
@@ -193,7 +196,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
193
196
|
version: '0'
|
194
197
|
requirements: []
|
195
198
|
rubyforge_project:
|
196
|
-
rubygems_version: 2.
|
199
|
+
rubygems_version: 2.5.0
|
197
200
|
signing_key:
|
198
201
|
specification_version: 4
|
199
202
|
summary: configuration library
|