complex_config 0.16.0 → 0.18.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 114e86c26b5932221df1aa2ae61c248697a40162db12aac16673f2a204597a08
4
- data.tar.gz: cc4847658eff087770fa628015f2edb8e27f61fce248ba82e5087671ceb1cdd8
3
+ metadata.gz: 8a0d455caf5fdc57de73eafd6308920b5f0b1e5b0bf99b67e289fa4df83b54d6
4
+ data.tar.gz: 41948d2b4b6dfcddbcec801639b19a2c855b9c81d573281f098ccb954b9e5606
5
5
  SHA512:
6
- metadata.gz: aa4c8feae89efd54ad866f0ad98d68479b383a9fbce025de01f0db160a95210a7e894973ca5bd29a1491a146a7d611e1caa3398255203ac8fc8c0678e41a3608
7
- data.tar.gz: 047cd0f7ca2c59daaa8fd3ea03e978e8c2c06dcd14dd447762a4cad771b190533563d3dbf3e74d67682cada3c2ce0b17beb4abbceab8ff4267e2a03c67931b28
6
+ metadata.gz: 9ec0abc072a32b190f3982254f45a1475a28442d78ac03e80c111a589027bc34b3095f51187b264e17cc74147e1137680494d9c51e7b02b71b9c0ce86e41e6b6
7
+ data.tar.gz: be4f16643cb26822aa77d6e68fb82a125fa3b559d0eff6abdb0f0d34fdbe3b48778939392c68cc3747de7e4bf8b0f5b96888d1519414bcb4a64b80ef4f1db516
data/.gitignore CHANGED
@@ -7,3 +7,4 @@ Gemfile.lock
7
7
  coverage
8
8
  errors.lst
9
9
  pkg
10
+ tags
@@ -1,11 +1,11 @@
1
1
  rvm:
2
- - 2.0
3
2
  - 2.1
4
3
  - 2.2
5
4
  - 2.3
6
5
  - 2.4
7
6
  - 2.5
8
7
  - 2.6
8
+ - 2.7
9
9
  - ruby-head
10
10
  - jruby-head
11
11
  sudo: false
data/README.md CHANGED
@@ -144,6 +144,8 @@ Here is the `ComplexConfig::Plugins::MONEY` plugin for example:
144
144
 
145
145
  ## Changes
146
146
 
147
+ * 2019-03-18 Release 0.17.0
148
+ * Improve error message for missing encryption key
147
149
  * 2019-03-14 Release 0.16.0
148
150
  * Enable `- trim_mode` for ERB in yml files
149
151
  * Allow `to_json` calls on settings
data/Rakefile CHANGED
@@ -12,7 +12,7 @@ GemHadar do
12
12
  executables 'complex_config'
13
13
  test_dir 'spec'
14
14
  ignore '.*.sw[pon]', 'pkg', 'Gemfile.lock', 'coverage', '.rvmrc',
15
- '.AppleDouble', '.DS_Store', '.byebug_history', 'errors.lst'
15
+ '.AppleDouble', '.DS_Store', '.byebug_history', 'errors.lst', 'tags'
16
16
 
17
17
  readme 'README.md'
18
18
  title "#{name.camelize} -- configuration library"
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.16.0
1
+ 0.18.2
@@ -1,14 +1,14 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: complex_config 0.16.0 ruby lib
2
+ # stub: complex_config 0.18.2 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "complex_config".freeze
6
- s.version = "0.16.0"
6
+ s.version = "0.18.2"
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 = "2019-03-14"
11
+ s.date = "2020-08-26"
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]
@@ -17,34 +17,25 @@ Gem::Specification.new do |s|
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 = "3.0.3".freeze
20
+ s.rubygems_version = "3.1.2".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
 
24
24
  if s.respond_to? :specification_version then
25
25
  s.specification_version = 4
26
+ end
26
27
 
27
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
28
- s.add_development_dependency(%q<gem_hadar>.freeze, ["~> 1.9.1"])
29
- s.add_development_dependency(%q<rake>.freeze, [">= 0"])
30
- s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
31
- s.add_development_dependency(%q<rspec>.freeze, [">= 0"])
32
- s.add_development_dependency(%q<monetize>.freeze, [">= 0"])
33
- s.add_runtime_dependency(%q<json>.freeze, [">= 0"])
34
- s.add_runtime_dependency(%q<tins>.freeze, [">= 0"])
35
- s.add_runtime_dependency(%q<mize>.freeze, ["~> 0.3", ">= 0.3.4"])
36
- else
37
- s.add_dependency(%q<gem_hadar>.freeze, ["~> 1.9.1"])
38
- s.add_dependency(%q<rake>.freeze, [">= 0"])
39
- s.add_dependency(%q<simplecov>.freeze, [">= 0"])
40
- s.add_dependency(%q<rspec>.freeze, [">= 0"])
41
- s.add_dependency(%q<monetize>.freeze, [">= 0"])
42
- s.add_dependency(%q<json>.freeze, [">= 0"])
43
- s.add_dependency(%q<tins>.freeze, [">= 0"])
44
- s.add_dependency(%q<mize>.freeze, ["~> 0.3", ">= 0.3.4"])
45
- end
28
+ if s.respond_to? :add_runtime_dependency then
29
+ s.add_development_dependency(%q<gem_hadar>.freeze, ["~> 1.11.0"])
30
+ s.add_development_dependency(%q<rake>.freeze, [">= 0"])
31
+ s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
32
+ s.add_development_dependency(%q<rspec>.freeze, [">= 0"])
33
+ s.add_development_dependency(%q<monetize>.freeze, [">= 0"])
34
+ s.add_runtime_dependency(%q<json>.freeze, [">= 0"])
35
+ s.add_runtime_dependency(%q<tins>.freeze, [">= 0"])
36
+ s.add_runtime_dependency(%q<mize>.freeze, ["~> 0.3", ">= 0.3.4"])
46
37
  else
47
- s.add_dependency(%q<gem_hadar>.freeze, ["~> 1.9.1"])
38
+ s.add_dependency(%q<gem_hadar>.freeze, ["~> 1.11.0"])
48
39
  s.add_dependency(%q<rake>.freeze, [">= 0"])
49
40
  s.add_dependency(%q<simplecov>.freeze, [">= 0"])
50
41
  s.add_dependency(%q<rspec>.freeze, [">= 0"])
@@ -23,6 +23,9 @@ module ComplexConfig
23
23
  class EncryptionKeyInvalid < EncryptionError
24
24
  end
25
25
 
26
+ class EncryptionKeyMissing < EncryptionError
27
+ end
28
+
26
29
  class DecryptionFailed < EncryptionError
27
30
  end
28
31
  end
@@ -2,7 +2,7 @@ require 'uri'
2
2
 
3
3
  module ComplexConfig::Plugins
4
4
  URI = -> id do
5
- url = id.to_s
5
+ url = id.to_s.dup
6
6
  if url.sub!(/uri\z/, 'url') and url = ask_and_send(url)
7
7
  ::URI.parse(url)
8
8
  else
@@ -65,7 +65,7 @@ class ComplexConfig::Provider
65
65
  end
66
66
 
67
67
  def config_dir
68
- @config_dir || (defined?(Rails) && Rails.root || Pathname.pwd) + 'config'
68
+ @config_dir || (defined?(Rails) && Rails.respond_to?(:root) && Rails.root || Pathname.pwd) + 'config'
69
69
  end
70
70
 
71
71
  def pathname(name)
@@ -73,12 +73,7 @@ class ComplexConfig::Provider
73
73
  end
74
74
 
75
75
  def decrypt_config(pathname)
76
- enc_pathname = pathname.to_s + '.enc'
77
- my_ks = key_source(pathname)
78
- if File.exist?(enc_pathname) && my_ks.ask_and_send(:key)
79
- text = IO.binread(enc_pathname)
80
- ComplexConfig::Encryption.new(my_ks.key_bytes).decrypt(text)
81
- end
76
+ decrypt_config_case(pathname).first
82
77
  end
83
78
 
84
79
  def encrypt_config(pathname, config)
@@ -88,14 +83,21 @@ class ComplexConfig::Provider
88
83
 
89
84
  def config(pathname, name = nil)
90
85
  datas = []
91
- if File.exist?(pathname)
86
+ path_exist = File.exist?(pathname)
87
+ if path_exist
92
88
  datas << IO.binread(pathname)
93
89
  end
94
- if decrypted = decrypt_config(pathname)
90
+ decrypted, reason, enc_pathname = decrypt_config_case(pathname)
91
+ case reason
92
+ when :ok
95
93
  datas << decrypted
94
+ when :key_missing
95
+ datas.empty? and raise ComplexConfig::EncryptionKeyMissing,
96
+ "encryption key for #{enc_pathname.to_s.inspect} is missing"
97
+ when :file_missing
98
+ datas.empty? and raise ComplexConfig::ConfigurationFileMissing,
99
+ "configuration file #{pathname.to_s.inspect} is missing"
96
100
  end
97
- datas.empty? and raise ComplexConfig::ConfigurationFileMissing,
98
- "configuration file #{pathname.to_s.inspect} is missing"
99
101
  results = datas.map { |d| evaluate(pathname, d) }
100
102
  hashes = results.map { |r| ::YAML.load(r, pathname) }
101
103
  settings = ComplexConfig::Settings.build(name, hashes.shift)
@@ -104,7 +106,7 @@ class ComplexConfig::Provider
104
106
  shared = shared.to_h
105
107
  settings.each do |key, value|
106
108
  if value.is_a? ComplexConfig::Settings
107
- value.attributes_update(shared)
109
+ value.attributes_update_if_nil(shared)
108
110
  elsif value.nil?
109
111
  settings[key] = ComplexConfig::Settings.build(nil, shared.dup)
110
112
  end
@@ -153,7 +155,7 @@ class ComplexConfig::Provider
153
155
 
154
156
  def exist?(name)
155
157
  !!config(pathname(name), name)
156
- rescue ComplexConfig::ConfigurationFileMissing
158
+ rescue ComplexConfig::ConfigurationFileMissing, ComplexConfig::EncryptionKeyMissing
157
159
  false
158
160
  end
159
161
 
@@ -174,7 +176,9 @@ class ComplexConfig::Provider
174
176
  end
175
177
 
176
178
  def env
177
- @env || defined?(Rails) && Rails.env || ENV['RAILS_ENV'] || 'development'
179
+ @env || defined?(Rails) && Rails.respond_to?(:env) && Rails.env ||
180
+ ENV['RAILS_ENV'] ||
181
+ 'development'
178
182
  end
179
183
 
180
184
  attr_writer :env
@@ -211,6 +215,21 @@ class ComplexConfig::Provider
211
215
 
212
216
  private
213
217
 
218
+ def decrypt_config_case(pathname)
219
+ enc_pathname = pathname.to_s + '.enc'
220
+ my_ks = key_source(pathname)
221
+ if File.exist?(enc_pathname)
222
+ if my_ks.ask_and_send(:key)
223
+ text = IO.binread(enc_pathname)
224
+ decrypted = ComplexConfig::Encryption.new(my_ks.key_bytes).decrypt(text)
225
+ return decrypted, :ok, enc_pathname
226
+ else
227
+ return nil, :key_missing, enc_pathname
228
+ end
229
+ end
230
+ return nil, :file_missing, enc_pathname
231
+ end
232
+
214
233
  def interpret_name_value(name, value)
215
234
  if ComplexConfig::Settings === name
216
235
  if value
@@ -76,6 +76,15 @@ class ComplexConfig::Settings < BasicObject
76
76
  @table.update(other.table)
77
77
  end
78
78
 
79
+ def attributes_update_if_nil(other)
80
+ unless other.is_a? self.class
81
+ other = self.class.from_hash(other)
82
+ end
83
+ @table.update(other.table) do |key, oldval, newval|
84
+ @table.key?(key) ? oldval : newval
85
+ end
86
+ end
87
+
79
88
  def replace_attributes(hash)
80
89
  @table = self.class.from_hash(hash).table
81
90
  self
@@ -124,7 +133,7 @@ class ComplexConfig::Settings < BasicObject
124
133
  def to_s(pair_sep: ' = ', path_sep: ?.)
125
134
  empty? and return self.class.name
126
135
  pathes(path_sep: path_sep).inject('') do |result, (path, value)|
127
- result << "#{path}#{pair_sep}#{value.inspect}\n"
136
+ result + "#{path}#{pair_sep}#{value.inspect}\n"
128
137
  end
129
138
  end
130
139
 
@@ -1,6 +1,6 @@
1
1
  module ComplexConfig
2
2
  # ComplexConfig version
3
- VERSION = '0.16.0'
3
+ VERSION = '0.18.2'
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:
@@ -314,8 +314,8 @@ RSpec.describe ComplexConfig::Provider do
314
314
 
315
315
  it 'can share values' do
316
316
  expect(described_class['config'].development.shared).to eq true
317
- expect(described_class['config'].test.shared).to eq true
318
- expect(described_class['config'].staging.shared).to eq true
317
+ expect(described_class['config'].test.shared).to eq nil
318
+ expect(described_class['config'].staging.shared).to eq false
319
319
  end
320
320
  end
321
321
  end
@@ -9,8 +9,10 @@ development:
9
9
  pi: <%= Math::PI %>
10
10
 
11
11
  staging:
12
+ shared: false
12
13
 
13
14
  test:
15
+ shared: null
14
16
  config:
15
17
  foo: false
16
18
  bar: true
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.16.0
4
+ version: 0.18.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Frank
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-14 00:00:00.000000000 Z
11
+ date: 2020-08-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gem_hadar
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.9.1
19
+ version: 1.11.0
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.9.1
26
+ version: 1.11.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -200,7 +200,7 @@ homepage: https://github.com/flori/complex_config
200
200
  licenses:
201
201
  - Apache-2.0
202
202
  metadata: {}
203
- post_install_message:
203
+ post_install_message:
204
204
  rdoc_options:
205
205
  - "--title"
206
206
  - ComplexConfig -- configuration library
@@ -219,8 +219,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
219
219
  - !ruby/object:Gem::Version
220
220
  version: '0'
221
221
  requirements: []
222
- rubygems_version: 3.0.3
223
- signing_key:
222
+ rubygems_version: 3.1.2
223
+ signing_key:
224
224
  specification_version: 4
225
225
  summary: configuration library
226
226
  test_files: