complex_config 0.16.0 → 0.18.2

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