complex_config 0.14.0 → 0.14.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c28ccee05d5a9ac6940f0b73babaca1a93c21e0f55f048bbc77ec000ccabb9f9
4
- data.tar.gz: 053fca226196c715755fa82921eb43602d176faa3eb402b783b49d1b7113705e
3
+ metadata.gz: c28053b61dff2ae48b2da22e7bd5e8f2bcc80f48fdeaf490c9a2a607d4e876c9
4
+ data.tar.gz: cadf63913aeebf969f0f99d76a6be2e6c06cad5304f40699b96dce0fcd77e8f5
5
5
  SHA512:
6
- metadata.gz: 7ba5fa43f39da3bef7c836a3ce6df235e1876a47981adb845139b7361118641780b62c5defc1610aa6b5f27d6a1027f337e10e426b8e184fb07363e74ec98449
7
- data.tar.gz: 2551fe15c77f3442f99240d86097f3b28b2968e91ca36116ff51517caf12c66ddb096c0136aa968d091e79bc01947c70f3b9656b0ae13d9751c92b77c202d3a8
6
+ metadata.gz: e00cb460bb319128e56fa2ea8607bdaa93a16bf64c279d2480d417633688e80eb8fc6e2ea905345862dbc8ad2174ef6d30b218742addb055108b9933c07142ee
7
+ data.tar.gz: 49a16f1422acee6f938c09e4de0fee07861b765c1ada576ecad07bb957f35fc0d6d35119287717af7ad8c4936de874d15a3c661a5069212af763dbfcc7022102
data/README.md CHANGED
@@ -143,7 +143,9 @@ Here is the `ComplexConfig::Plugins::MONEY` plugin for example:
143
143
  end
144
144
 
145
145
  ## Changes
146
-
146
+ * 2018-07-06 Release 0.14.0
147
+ * Better support for rails encryption
148
+ * Adds `complex_config` executable.
147
149
  * 2018-02-23 Release 0.13.3
148
150
  Change evaluation order of key sources
149
151
  * 2018-02-23 Release 0.13.2
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.14.0
1
+ 0.14.1
@@ -1,23 +1,23 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: complex_config 0.14.0 ruby lib
2
+ # stub: complex_config 0.14.1 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "complex_config".freeze
6
- s.version = "0.14.0"
6
+ s.version = "0.14.1"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Florian Frank".freeze]
11
- s.date = "2018-06-07"
11
+ s.date = "2018-12-07"
12
12
  s.description = "This library allows you to access configuration files via a simple interface".freeze
13
13
  s.email = "flori@ping.de".freeze
14
14
  s.executables = ["complex_config".freeze]
15
15
  s.extra_rdoc_files = ["README.md".freeze, "lib/complex_config.rb".freeze, "lib/complex_config/config.rb".freeze, "lib/complex_config/encryption.rb".freeze, "lib/complex_config/errors.rb".freeze, "lib/complex_config/key_source.rb".freeze, "lib/complex_config/plugins.rb".freeze, "lib/complex_config/plugins/enable.rb".freeze, "lib/complex_config/plugins/money.rb".freeze, "lib/complex_config/plugins/uri.rb".freeze, "lib/complex_config/provider.rb".freeze, "lib/complex_config/provider/shortcuts.rb".freeze, "lib/complex_config/proxy.rb".freeze, "lib/complex_config/railtie.rb".freeze, "lib/complex_config/rude.rb".freeze, "lib/complex_config/settings.rb".freeze, "lib/complex_config/shortcuts.rb".freeze, "lib/complex_config/version.rb".freeze]
16
- s.files = [".gitignore".freeze, ".rspec".freeze, ".travis.yml".freeze, ".utilsrc".freeze, "COPYING".freeze, "Gemfile".freeze, "README.md".freeze, "Rakefile".freeze, "TODO.md".freeze, "VERSION".freeze, "bin/complex_config".freeze, "complex_config.gemspec".freeze, "config/products.yml".freeze, "lib/complex_config.rb".freeze, "lib/complex_config/config.rb".freeze, "lib/complex_config/encryption.rb".freeze, "lib/complex_config/errors.rb".freeze, "lib/complex_config/key_source.rb".freeze, "lib/complex_config/plugins.rb".freeze, "lib/complex_config/plugins/enable.rb".freeze, "lib/complex_config/plugins/money.rb".freeze, "lib/complex_config/plugins/uri.rb".freeze, "lib/complex_config/provider.rb".freeze, "lib/complex_config/provider/shortcuts.rb".freeze, "lib/complex_config/proxy.rb".freeze, "lib/complex_config/railtie.rb".freeze, "lib/complex_config/rude.rb".freeze, "lib/complex_config/settings.rb".freeze, "lib/complex_config/shortcuts.rb".freeze, "lib/complex_config/version.rb".freeze, "spec/complex_config/config_spec.rb".freeze, "spec/complex_config/encryption_spec.rb".freeze, "spec/complex_config/key_source_spec.rb".freeze, "spec/complex_config/plugins_spec.rb".freeze, "spec/complex_config/provider_spec.rb".freeze, "spec/complex_config/settings_spec.rb".freeze, "spec/complex_config/shortcuts_spec.rb".freeze, "spec/config/broken_config.yml".freeze, "spec/config/config.yml".freeze, "spec/config/master.key".freeze, "spec/config/with-key-file.yml.enc".freeze, "spec/config/with-key-file.yml.key".freeze, "spec/config/without-key-file.yml.enc".freeze, "spec/spec_helper.rb".freeze]
16
+ s.files = [".gitignore".freeze, ".rspec".freeze, ".travis.yml".freeze, ".utilsrc".freeze, "COPYING".freeze, "Gemfile".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "bin/complex_config".freeze, "complex_config.gemspec".freeze, "config/products.yml".freeze, "lib/complex_config.rb".freeze, "lib/complex_config/config.rb".freeze, "lib/complex_config/encryption.rb".freeze, "lib/complex_config/errors.rb".freeze, "lib/complex_config/key_source.rb".freeze, "lib/complex_config/plugins.rb".freeze, "lib/complex_config/plugins/enable.rb".freeze, "lib/complex_config/plugins/money.rb".freeze, "lib/complex_config/plugins/uri.rb".freeze, "lib/complex_config/provider.rb".freeze, "lib/complex_config/provider/shortcuts.rb".freeze, "lib/complex_config/proxy.rb".freeze, "lib/complex_config/railtie.rb".freeze, "lib/complex_config/rude.rb".freeze, "lib/complex_config/settings.rb".freeze, "lib/complex_config/shortcuts.rb".freeze, "lib/complex_config/version.rb".freeze, "spec/complex_config/config_spec.rb".freeze, "spec/complex_config/encryption_spec.rb".freeze, "spec/complex_config/key_source_spec.rb".freeze, "spec/complex_config/plugins_spec.rb".freeze, "spec/complex_config/provider_spec.rb".freeze, "spec/complex_config/settings_spec.rb".freeze, "spec/complex_config/shortcuts_spec.rb".freeze, "spec/config/broken_config.yml".freeze, "spec/config/config.yml".freeze, "spec/config/master.key".freeze, "spec/config/with-key-file.yml.enc".freeze, "spec/config/with-key-file.yml.key".freeze, "spec/config/without-key-file.yml.enc".freeze, "spec/spec_helper.rb".freeze]
17
17
  s.homepage = "https://github.com/flori/complex_config".freeze
18
18
  s.licenses = ["Apache-2.0".freeze]
19
19
  s.rdoc_options = ["--title".freeze, "ComplexConfig -- configuration library".freeze, "--main".freeze, "README.md".freeze]
20
- s.rubygems_version = "2.7.6".freeze
20
+ s.rubygems_version = "2.7.8".freeze
21
21
  s.summary = "configuration library".freeze
22
22
  s.test_files = ["spec/complex_config/config_spec.rb".freeze, "spec/complex_config/encryption_spec.rb".freeze, "spec/complex_config/key_source_spec.rb".freeze, "spec/complex_config/plugins_spec.rb".freeze, "spec/complex_config/provider_spec.rb".freeze, "spec/complex_config/settings_spec.rb".freeze, "spec/complex_config/shortcuts_spec.rb".freeze, "spec/spec_helper.rb".freeze]
23
23
 
@@ -32,7 +32,7 @@ Gem::Specification.new do |s|
32
32
  s.add_development_dependency(%q<monetize>.freeze, [">= 0"])
33
33
  s.add_runtime_dependency(%q<json>.freeze, [">= 0"])
34
34
  s.add_runtime_dependency(%q<tins>.freeze, [">= 0"])
35
- s.add_runtime_dependency(%q<mize>.freeze, [">= 0.3.4", "~> 0.3"])
35
+ s.add_runtime_dependency(%q<mize>.freeze, ["~> 0.3", ">= 0.3.4"])
36
36
  else
37
37
  s.add_dependency(%q<gem_hadar>.freeze, ["~> 1.9.1"])
38
38
  s.add_dependency(%q<rake>.freeze, [">= 0"])
@@ -41,7 +41,7 @@ Gem::Specification.new do |s|
41
41
  s.add_dependency(%q<monetize>.freeze, [">= 0"])
42
42
  s.add_dependency(%q<json>.freeze, [">= 0"])
43
43
  s.add_dependency(%q<tins>.freeze, [">= 0"])
44
- s.add_dependency(%q<mize>.freeze, [">= 0.3.4", "~> 0.3"])
44
+ s.add_dependency(%q<mize>.freeze, ["~> 0.3", ">= 0.3.4"])
45
45
  end
46
46
  else
47
47
  s.add_dependency(%q<gem_hadar>.freeze, ["~> 1.9.1"])
@@ -51,6 +51,6 @@ Gem::Specification.new do |s|
51
51
  s.add_dependency(%q<monetize>.freeze, [">= 0"])
52
52
  s.add_dependency(%q<json>.freeze, [">= 0"])
53
53
  s.add_dependency(%q<tins>.freeze, [">= 0"])
54
- s.add_dependency(%q<mize>.freeze, [">= 0.3.4", "~> 0.3"])
54
+ s.add_dependency(%q<mize>.freeze, ["~> 0.3", ">= 0.3.4"])
55
55
  end
56
56
  end
@@ -30,7 +30,7 @@ class ComplexConfig::Encryption
30
30
  encrypted, iv, auth_tag = text.split('--').map { |v| base64_decode(v) }
31
31
 
32
32
  auth_tag.nil? || auth_tag.bytes.length != 16 and
33
- raise ComplexConfig::DecryptionFailed, "auth_tag #{auth_tag.inspect} invalid"
33
+ raise ComplexConfig::DecryptionFailed, "auth_tag was invalid"
34
34
 
35
35
  @cipher.decrypt
36
36
  @cipher.key = @secret
@@ -42,6 +42,8 @@ class ComplexConfig::Encryption
42
42
  decrypted_data << @cipher.final
43
43
 
44
44
  Marshal.load(decrypted_data)
45
+ rescue OpenSSL::Cipher::CipherError
46
+ raise ComplexConfig::DecryptionFailed, "decryption failed with this key"
45
47
  end
46
48
 
47
49
  private
@@ -113,7 +113,12 @@ class ComplexConfig::Settings < BasicObject
113
113
  each.count
114
114
  end
115
115
 
116
+ def empty?
117
+ size == 0
118
+ end
119
+
116
120
  def to_s(pair_sep: ' = ', path_sep: ?.)
121
+ empty? and return self.class.name
117
122
  pathes(path_sep: path_sep).inject('') do |result, (path, value)|
118
123
  result << "#{path}#{pair_sep}#{value.inspect}\n"
119
124
  end
@@ -1,6 +1,6 @@
1
1
  module ComplexConfig
2
2
  # ComplexConfig version
3
- VERSION = '0.14.0'
3
+ VERSION = '0.14.1'
4
4
  VERSION_ARRAY = VERSION.split('.').map(&:to_i) # :nodoc:
5
5
  VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
6
  VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
@@ -24,4 +24,12 @@ RSpec.describe ComplexConfig::Encryption do
24
24
  it 'can decrypt' do
25
25
  expect(enc.decrypt(encrypted)).to eq value
26
26
  end
27
+
28
+ it 'raises exception if key is invalid' do
29
+ enc = described_class.new Tins::Token.new(
30
+ alphabet: (0..255).map(&:chr).join, bits: secret.size * 8
31
+ )
32
+ expect { enc.decrypt(encrypted) }.to\
33
+ raise_error ComplexConfig::DecryptionFailed
34
+ end
27
35
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
  require 'complex_config/plugins/enable'
3
3
 
4
- RSpec.describe ComplexConfig::Settings do
4
+ RSpec.describe ComplexConfig::Plugins do
5
5
  let :provider do
6
6
  ComplexConfig::Provider
7
7
  end
@@ -15,7 +15,7 @@ RSpec.describe ComplexConfig::Settings do
15
15
  ]
16
16
  end
17
17
 
18
- context ComplexConfig::Plugins::URI do
18
+ context described_class::URI do
19
19
  it 'can return an URL string' do
20
20
  expect(settings.foo.test_url).to eq 'http://www.ping.de'
21
21
  end
@@ -33,7 +33,7 @@ RSpec.describe ComplexConfig::Settings do
33
33
  end
34
34
  end
35
35
 
36
- context ComplexConfig::Plugins::MONEY do
36
+ context described_class::MONEY do
37
37
  it 'can return a Fixnum' do
38
38
  expect(settings.foo.cash_in_cents).to eq 100_00
39
39
  end
@@ -2,23 +2,19 @@ require 'spec_helper'
2
2
  require 'fileutils'
3
3
 
4
4
  RSpec.describe ComplexConfig::Provider do
5
- let :provider do
6
- ComplexConfig::Provider
7
- end
8
-
9
5
  reset_new_config = -> * {
10
- provider.config_dir = Pathname.new(__FILE__).dirname.dirname + 'config'
11
- provider.key = nil
6
+ described_class.config_dir = Pathname.new(__FILE__).dirname.dirname + 'config'
7
+ described_class.key = nil
12
8
  ENV['COMPLEX_CONFIG_KEY'] = nil
13
9
  ENV['RAILS_MASTER_KEY'] = nil
14
- FileUtils.rm_f(provider.config_dir + 'new_config.yml')
15
- FileUtils.rm_f(provider.config_dir + 'new_config.yml.enc')
16
- FileUtils.rm_f(provider.config_dir + 'new_config.yml.key')
10
+ FileUtils.rm_f(described_class.config_dir + 'new_config.yml')
11
+ FileUtils.rm_f(described_class.config_dir + 'new_config.yml.enc')
12
+ FileUtils.rm_f(described_class.config_dir + 'new_config.yml.key')
17
13
  }
18
14
 
19
15
  after do
20
16
  instance_eval(&reset_new_config)
21
- provider.flush_cache
17
+ described_class.flush_cache
22
18
  end
23
19
 
24
20
  context 'plugin' do
@@ -37,17 +33,17 @@ RSpec.describe ComplexConfig::Provider do
37
33
  end
38
34
 
39
35
  before do
40
- provider.plugins.clear
36
+ described_class.plugins.clear
41
37
  end
42
38
 
43
39
  it 'can add one' do
44
- expect { provider.add_plugin plugin }.to change { provider.plugins.size }.by(1)
40
+ expect { described_class.add_plugin plugin }.to change { described_class.plugins.size }.by(1)
45
41
  end
46
42
 
47
43
  it 'can apply plugins' do
48
- provider.add_plugin plugin
44
+ described_class.add_plugin plugin
49
45
  allow(setting).to receive(:skip).and_throw :skip
50
- expect(provider.apply_plugins(setting, :evaluate_plugin)).to eq :evaluated
46
+ expect(described_class.apply_plugins(setting, :evaluate_plugin)).to eq :evaluated
51
47
  end
52
48
  end
53
49
 
@@ -57,161 +53,161 @@ RSpec.describe ComplexConfig::Provider do
57
53
  def self.root
58
54
  end
59
55
  end
60
- provider.config_dir = nil
56
+ described_class.config_dir = nil
61
57
  end
62
58
 
63
59
  it 'can derive rails root from Rails.root if present' do
64
60
  allow(::Rails).to receive(:root).and_return Pathname.new('bar')
65
61
  dir = Pathname.new('bar/config')
66
- expect(provider.config_dir).to eq dir
62
+ expect(described_class.config_dir).to eq dir
67
63
  end
68
64
 
69
65
  it 'falls back to current working directory by default' do
70
- expect(provider.config_dir).to eq Pathname.pwd + 'config'
66
+ expect(described_class.config_dir).to eq Pathname.pwd + 'config'
71
67
  end
72
68
 
73
69
  it 'can derive master_key_pathname' do
74
- expect(provider.master_key_pathname).to eq\
70
+ expect(described_class.master_key_pathname).to eq\
75
71
  Pathname.pwd.join('config/master.key')
76
72
  end
77
73
 
78
74
  it 'can set master_key_pathname' do
79
- provider.master_key_pathname = 'foo'
80
- expect(provider.master_key_pathname).to eq 'foo'
75
+ described_class.master_key_pathname = 'foo'
76
+ expect(described_class.master_key_pathname).to eq 'foo'
81
77
  end
82
78
  end
83
79
 
84
80
  context 'reading configurations' do
85
81
  it 'can read a configuration file' do
86
82
  expect(
87
- provider.config(asset('config.yml'))
83
+ described_class.config(asset('config.yml'))
88
84
  ).to be_a ComplexConfig::Settings
89
85
  end
90
86
 
91
87
  it 'has deep frozen settings' do
92
- settings = provider.config(asset('config.yml'))
88
+ settings = described_class.config(asset('config.yml'))
93
89
  expect(settings).to be_frozen
94
90
  end
95
91
 
96
92
  it 'deep freezing can be disabled' do
97
93
  begin
98
- provider.deep_freeze = false
99
- settings = provider.config(asset('config.yml'))
94
+ described_class.deep_freeze = false
95
+ settings = described_class.config(asset('config.yml'))
100
96
  expect(settings).not_to be_frozen
101
97
  ensure
102
- provider.deep_freeze = true
98
+ described_class.deep_freeze = true
103
99
  end
104
100
  end
105
101
 
106
102
  it 'handles missing configuration files' do
107
- expect { provider.config(asset('nix_config.yml')) }.to\
103
+ expect { described_class.config(asset('nix_config.yml')) }.to\
108
104
  raise_error(ComplexConfig::ConfigurationFileMissing)
109
105
  end
110
106
 
111
107
  it 'handles syntax errors in configuration files' do
112
- expect { provider.config(asset('broken_config.yml')) }.to\
108
+ expect { described_class.config(asset('broken_config.yml')) }.to\
113
109
  raise_error(ComplexConfig::ConfigurationSyntaxError)
114
110
  end
115
111
  end
116
112
 
117
113
  context 'writing configurations' do
118
114
  before do
119
- provider.config_dir = Pathname.new(__FILE__).dirname.dirname + 'config'
115
+ described_class.config_dir = Pathname.new(__FILE__).dirname.dirname + 'config'
120
116
  end
121
117
 
122
118
  let :config do
123
- provider.config(asset('config.yml'))
119
+ described_class.config(asset('config.yml'))
124
120
  end
125
121
 
126
122
  it 'can be written' do
127
- provider.write_config('new_config', value: config)
128
- expect(provider.config(asset('new_config.yml'))).to eq config
123
+ described_class.write_config('new_config', value: config)
124
+ expect(described_class.config(asset('new_config.yml'))).to eq config
129
125
  end
130
126
 
131
127
  it 'can be changed and written' do
132
- provider.deep_freeze = false
128
+ described_class.deep_freeze = false
133
129
  config.development.config.baz = 'something else'
134
- provider.write_config('new_config', value: config)
135
- expect(provider.config(asset('new_config.yml')).development.config.baz).to eq 'something else'
130
+ described_class.write_config('new_config', value: config)
131
+ expect(described_class.config(asset('new_config.yml')).development.config.baz).to eq 'something else'
136
132
  end
137
133
  end
138
134
 
139
135
  context 'reading encrypted configurations' do
140
136
  before do
141
- provider.config_dir = Pathname.new(__FILE__).dirname.dirname + 'config'
137
+ described_class.config_dir = Pathname.new(__FILE__).dirname.dirname + 'config'
142
138
  end
143
139
 
144
140
  let :key do
145
- IO.binread(provider.config_dir + 'with-key-file.yml.key')
141
+ IO.binread(described_class.config_dir + 'with-key-file.yml.key')
146
142
  end
147
143
 
148
144
  it 'can read when key is set by accessor' do
149
- provider.key = key
150
- expect(provider.key).to eq key.chomp
151
- expect(provider['without-key-file'].development.foo.bar).to eq 'baz'
145
+ described_class.key = key
146
+ expect(described_class.key).to eq key.chomp
147
+ expect(described_class['without-key-file'].development.foo.bar).to eq 'baz'
152
148
  end
153
149
 
154
150
  it 'can read when key is in ENV var' do
155
151
  ENV['RAILS_MASTER_KEY'] = key
156
- expect(provider['without-key-file'].development.foo.bar).to eq 'baz'
152
+ expect(described_class['without-key-file'].development.foo.bar).to eq 'baz'
157
153
  ENV['RAILS_MASTER_KEY'] = nil
158
154
  end
159
155
 
160
156
  it 'can read when key is stored in file' do
161
- expect(provider['with-key-file'].development.foo.bar).to eq 'baz'
157
+ expect(described_class['with-key-file'].development.foo.bar).to eq 'baz'
162
158
  end
163
159
  end
164
160
 
165
161
  context 'writing encrypted configurations' do
166
162
  before do
167
- provider.config_dir = Pathname.new(__FILE__).dirname.dirname + 'config'
163
+ described_class.config_dir = Pathname.new(__FILE__).dirname.dirname + 'config'
168
164
  instance_eval(&reset_new_config)
169
165
  end
170
166
 
171
167
  let :config do
172
- provider.config(asset('config.yml'))
168
+ described_class.config(asset('config.yml'))
173
169
  end
174
170
 
175
171
  it 'can be written with random key' do
176
- key = provider.write_config('new_config', value: config, encrypt: :random, store_key: false)
177
- provider.key = key
178
- expect(provider.config(asset('new_config.yml'))).to eq config
172
+ key = described_class.write_config('new_config', value: config, encrypt: :random, store_key: false)
173
+ described_class.key = key
174
+ expect(described_class.config(asset('new_config.yml'))).to eq config
179
175
  end
180
176
 
181
177
  it 'can be written with random key and store key' do
182
- provider.write_config('new_config', value: config, encrypt: :random, store_key: true)
183
- expect(provider.config(asset('new_config.yml'))).to eq config
178
+ described_class.write_config('new_config', value: config, encrypt: :random, store_key: true)
179
+ expect(described_class.config(asset('new_config.yml'))).to eq config
184
180
  end
185
181
 
186
182
  it 'can be written with passed key' do
187
183
  key = SecureRandom.hex(16)
188
- provider.write_config('new_config', value: config, encrypt: key)
189
- provider.key = key
190
- expect(provider.config(asset('new_config.yml'))).to eq config
184
+ described_class.write_config('new_config', value: config, encrypt: key)
185
+ described_class.key = key
186
+ expect(described_class.config(asset('new_config.yml'))).to eq config
191
187
  end
192
188
 
193
189
  it 'can be written with configured key' do
194
- provider.write_config('new_config', value: config)
195
- expect(provider.config(asset('new_config.yml'))).to eq config
190
+ described_class.write_config('new_config', value: config)
191
+ expect(described_class.config(asset('new_config.yml'))).to eq config
196
192
  end
197
193
 
198
194
  it 'can be written with COMPLEX_CONFIG_KEY key' do
199
195
  ENV['COMPLEX_CONFIG_KEY'] = SecureRandom.hex(16)
200
- k = provider.write_config('new_config', value: config, encrypt: true)
196
+ k = described_class.write_config('new_config', value: config, encrypt: true)
201
197
  expect(k).to eq ENV['COMPLEX_CONFIG_KEY']
202
- expect(provider.config(asset('new_config.yml'))).to eq config
198
+ expect(described_class.config(asset('new_config.yml'))).to eq config
203
199
  end
204
200
 
205
201
  it 'can be written with RAILS_MASTER_KEY key' do
206
202
  ENV['RAILS_MASTER_KEY'] = SecureRandom.hex(16)
207
- k = provider.write_config('new_config', value: config, encrypt: true)
203
+ k = described_class.write_config('new_config', value: config, encrypt: true)
208
204
  expect(k).to eq ENV['RAILS_MASTER_KEY']
209
- expect(provider.config(asset('new_config.yml'))).to eq config
205
+ expect(described_class.config(asset('new_config.yml'))).to eq config
210
206
  end
211
207
 
212
208
  it 'can encrypt file content with RAILS_MASTER_KEY key' do
213
209
  ENV['RAILS_MASTER_KEY'] = SecureRandom.hex(16)
214
- encrypted = provider.encrypt_config(asset('new_config.yml'), 'test')
210
+ encrypted = described_class.encrypt_config(asset('new_config.yml'), 'test')
215
211
  expect(encrypted).not_to be_empty
216
212
  ks = ComplexConfig::KeySource.new(env_var: 'RAILS_MASTER_KEY')
217
213
  expect(
@@ -220,58 +216,58 @@ RSpec.describe ComplexConfig::Provider do
220
216
  end
221
217
 
222
218
  it 'can be changed and written' do
223
- provider.deep_freeze = false
224
- expect(provider.config(asset('config.yml')).development.config.baz).to eq 'something'
219
+ described_class.deep_freeze = false
220
+ expect(described_class.config(asset('config.yml')).development.config.baz).to eq 'something'
225
221
  config.development.config.baz = 'something else'
226
- provider.write_config('new_config', value: config)
227
- expect(provider.config(asset('new_config.yml')).development.config.baz).to eq 'something else'
222
+ described_class.write_config('new_config', value: config)
223
+ expect(described_class.config(asset('new_config.yml')).development.config.baz).to eq 'something else'
228
224
  #
229
- new_config = provider.config(asset('new_config.yml'), :new_config)
225
+ new_config = described_class.config(asset('new_config.yml'), :new_config)
230
226
  new_config.development.config.baz = 'something else else'
231
- provider.write_config new_config
232
- expect(provider.config(asset('new_config.yml')).development.config.baz).to eq 'something else else'
227
+ described_class.write_config new_config
228
+ expect(described_class.config(asset('new_config.yml')).development.config.baz).to eq 'something else else'
233
229
  #
234
- new_config = provider.config(asset('new_config.yml'), :new_config)
235
- provider.write_config(new_config, value: { development: { config: { baz: 'even more else' } } })
236
- #expect(provider.config(asset('new_config.yml')).development.config.baz).to eq 'something else else'
230
+ new_config = described_class.config(asset('new_config.yml'), :new_config)
231
+ described_class.write_config(new_config, value: { development: { config: { baz: 'even more else' } } })
232
+ #expect(described_class.config(asset('new_config.yml')).development.config.baz).to eq 'something else else'
237
233
  end
238
234
  end
239
235
 
240
236
  context 'handling configuration files with []' do
241
237
  before do
242
- provider.config_dir = Pathname.new(__FILE__).dirname.dirname + 'config'
238
+ described_class.config_dir = Pathname.new(__FILE__).dirname.dirname + 'config'
243
239
  end
244
240
 
245
241
  it 'returns the correct configuration' do
246
- expect(provider['config']).to be_a ComplexConfig::Settings
242
+ expect(described_class['config']).to be_a ComplexConfig::Settings
247
243
  end
248
244
 
249
245
  it 'caches the configuration after first use' do
250
246
  expect {
251
- expect(provider['config']).to be_a ComplexConfig::Settings
247
+ expect(described_class['config']).to be_a ComplexConfig::Settings
252
248
  }.to change {
253
- provider.instance.__send__(:__mize_cache__).instance_variable_get(:@data).size
249
+ described_class.instance.__send__(:__mize_cache__).instance_variable_get(:@data).size
254
250
  }.by(1)
255
- expect(provider).not_to receive(:config)
256
- expect(provider['config']).to be_a ComplexConfig::Settings
251
+ expect(described_class).not_to receive(:config)
252
+ expect(described_class['config']).to be_a ComplexConfig::Settings
257
253
  end
258
254
 
259
255
  it 'can flush loaded configurations' do
260
- expect(provider['config']).to be_a ComplexConfig::Settings
256
+ expect(described_class['config']).to be_a ComplexConfig::Settings
261
257
  result = nil
262
258
  expect {
263
- result = provider.flush_cache
259
+ result = described_class.flush_cache
264
260
  }.to change {
265
- provider.instance.__send__(:__mize_cache__).instance_variable_get(:@data).size
261
+ described_class.instance.__send__(:__mize_cache__).instance_variable_get(:@data).size
266
262
  }.by(-1)
267
- expect(result).to be_a ComplexConfig::Provider
263
+ expect(result).to be_a described_class
268
264
  end
269
265
  end
270
266
 
271
267
  context 'evaluating configuration files with ERB' do
272
268
  it 'evaluates a config file correctly' do
273
269
  expect(
274
- provider.config(asset('config.yml')).development.config.pi
270
+ described_class.config(asset('config.yml')).development.config.pi
275
271
  ).to be_within(1e-6).of Math::PI
276
272
  end
277
273
  end
@@ -287,33 +283,33 @@ RSpec.describe ComplexConfig::Provider do
287
283
  end
288
284
 
289
285
  after do
290
- provider.env = nil
286
+ described_class.env = nil
291
287
  end
292
288
 
293
289
  it 'can be set manually' do
294
- provider.env = 'foobar'
295
- expect(provider.env).to eq 'foobar'
290
+ described_class.env = 'foobar'
291
+ expect(described_class.env).to eq 'foobar'
296
292
  end
297
293
 
298
294
  it 'can derive environments from Rails.env if present' do
299
295
  expect(Rails).to receive(:env).and_return('foobar')
300
- expect(provider.env).to eq 'foobar'
296
+ expect(described_class.env).to eq 'foobar'
301
297
  end
302
298
 
303
299
  it 'falls back to "development" as a default' do
304
- expect(provider.env).to eq 'development'
300
+ expect(described_class.env).to eq 'development'
305
301
  end
306
302
 
307
303
  end
308
304
 
309
305
  context 'shared' do
310
306
  before do
311
- provider.config_dir = Pathname.new(__FILE__).dirname.dirname + 'config'
307
+ described_class.config_dir = Pathname.new(__FILE__).dirname.dirname + 'config'
312
308
  end
313
309
 
314
310
  it 'can share values' do
315
- expect(provider['config'].development.shared).to eq true
316
- expect(provider['config'].test.shared).to eq true
311
+ expect(described_class['config'].development.shared).to eq true
312
+ expect(described_class['config'].test.shared).to eq true
317
313
  end
318
314
  end
319
315
  end
@@ -7,7 +7,7 @@ RSpec.describe ComplexConfig::Settings do
7
7
  end
8
8
 
9
9
  let :settings do
10
- ComplexConfig::Settings[
10
+ described_class[
11
11
  foo: {
12
12
  bar: {
13
13
  baz: true
@@ -18,12 +18,12 @@ RSpec.describe ComplexConfig::Settings do
18
18
  end
19
19
 
20
20
  it 'can be initialized with a hash' do
21
- s = ComplexConfig::Settings.new(foo: 'bar')
21
+ s = described_class.new(foo: 'bar')
22
22
  expect(s.foo).to eq 'bar'
23
23
  end
24
24
 
25
25
  it 'can be duped and changed' do
26
- s = ComplexConfig::Settings.new(foo: 'bar')
26
+ s = described_class.new(foo: 'bar')
27
27
  t = s.dup
28
28
  expect(s.foo).to eq 'bar'
29
29
  t.foo = 'baz'
@@ -43,6 +43,10 @@ RSpec.describe ComplexConfig::Settings do
43
43
  expect(settings.size).to eq 1
44
44
  end
45
45
 
46
+ it 'can be empty' do
47
+ expect(described_class.new).to be_empty
48
+ end
49
+
46
50
  it 'can set its attributes via index method' do
47
51
  expect {
48
52
  settings['blub'] = 'blub'
@@ -87,8 +91,12 @@ foo/qux → "quux"
87
91
  EOT
88
92
  end
89
93
 
94
+ it 'responds with class name if #to_s is called on empty settigs' do
95
+ expect(described_class.new.to_s).to eq described_class.name
96
+ end
97
+
90
98
  it 'can be represented as a string if it has arrays' do
91
- settings[:ary] = ComplexConfig::Settings[ [ 1, { nested: 2 }, 3 ] ]
99
+ settings[:ary] = described_class[ [ 1, { nested: 2 }, 3 ] ]
92
100
  expect(settings.to_s).to eq <<EOT
93
101
  foo.bar.baz = true
94
102
  foo.qux = "quux"
@@ -126,12 +134,12 @@ EOT
126
134
  end
127
135
 
128
136
  it 'handles arrays correctly' do
129
- settings = ComplexConfig::Settings[ary: [ 1, { hsh: 2 }, 3 ]]
137
+ settings = described_class[ary: [ 1, { hsh: 2 }, 3 ]]
130
138
  expect(settings.to_h).to eq(ary: [ 1, { hsh: 2 }, 3 ])
131
139
  end
132
140
 
133
141
  it 'returns zip if it was set' do
134
- settings = ComplexConfig::Settings[zip: 'a string']
142
+ settings = described_class[zip: 'a string']
135
143
  expect(settings.zip).to eq 'a string'
136
144
  end
137
145
 
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.14.0
4
+ version: 0.14.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Frank
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-07 00:00:00.000000000 Z
11
+ date: 2018-12-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gem_hadar
@@ -161,7 +161,6 @@ files:
161
161
  - Gemfile
162
162
  - README.md
163
163
  - Rakefile
164
- - TODO.md
165
164
  - VERSION
166
165
  - bin/complex_config
167
166
  - complex_config.gemspec
@@ -221,7 +220,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
221
220
  version: '0'
222
221
  requirements: []
223
222
  rubyforge_project:
224
- rubygems_version: 2.7.6
223
+ rubygems_version: 2.7.8
225
224
  signing_key:
226
225
  specification_version: 4
227
226
  summary: configuration library
data/TODO.md DELETED
@@ -1,4 +0,0 @@
1
- # TODO
2
-
3
- - Figure out why rspec don't like my double dispatch.
4
-