complex_config 0.15.1 → 0.18.1

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: c1e763c9e01b185d769813152c88136e781ad3eb40d38c346243ec8a7575dd40
4
- data.tar.gz: 6c7bde800225c7ae218e9fa45629e3fb924ad7e8688ae560944e36de64cc8af8
3
+ metadata.gz: e73e68945dd80153f4d2b7bdf6230188c2f818116b1be2b5d15275f6a60bd4cf
4
+ data.tar.gz: 9b26daedb74a7ec7b964949157b090e132f2578caee5bc5017a8e9846e0737ae
5
5
  SHA512:
6
- metadata.gz: d84a316f63eb06734322d3231e4eb049539fb7ff74ed1829e706dafc269721d402081a05829e5a34019baacfed1ddea339d2b5496826781dcf28580b4cf36ad6
7
- data.tar.gz: a126471e9ba5052c670aaa5c01e9f932dfa365209686f87a89d97c3f1d55404955623aa1d149468d1fe608729c078bc8e0a8682d3d3ec7df63bf071552dcb4f9
6
+ metadata.gz: 34f7301a12996a624fda778cf814601324e7241fd955bd19b32d37cec572ee3cf0550ac2868851094bc2badfa86b79ede0614beb2f3f90c9c24a2d6535985b63
7
+ data.tar.gz: 62dd718af441e486f1ccf0c54201f4ca34cc46e02dd853956d331e8fbe903b3025e94734c84ec3cb854ae273cc009bcb3aefa874c48a4c0d786c6bbf16d0e807
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
@@ -143,6 +143,16 @@ Here is the `ComplexConfig::Plugins::MONEY` plugin for example:
143
143
  end
144
144
 
145
145
  ## Changes
146
+
147
+ * 2019-03-18 Release 0.17.0
148
+ * Improve error message for missing encryption key
149
+ * 2019-03-14 Release 0.16.0
150
+ * Enable `- trim_mode` for ERB in yml files
151
+ * Allow `to_json` calls on settings
152
+ * 2019-03-14 Release 0.15.1
153
+ * Fix shared feature for empy top level settings
154
+ * 2018-12-07 Release 0.15.0
155
+ * Allow inplace recrypt for encrypted files
146
156
  * 2018-07-06 Release 0.14.0
147
157
  * Better support for rails encryption
148
158
  * Adds `complex_config` executable.
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.15.1
1
+ 0.18.1
@@ -1,14 +1,14 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: complex_config 0.15.1 ruby lib
2
+ # stub: complex_config 0.18.1 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "complex_config".freeze
6
- s.version = "0.15.1"
6
+ s.version = "0.18.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 = "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
@@ -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
 
@@ -168,13 +170,15 @@ class ComplexConfig::Provider
168
170
  end
169
171
 
170
172
  def evaluate(pathname, data)
171
- erb = ::ERB.new(data)
173
+ erb = ::ERB.new(data, nil, '-')
172
174
  erb.filename = pathname.to_s
173
175
  erb.result
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
@@ -109,6 +118,10 @@ class ComplexConfig::Settings < BasicObject
109
118
  to_h.to_yaml
110
119
  end
111
120
 
121
+ def to_json
122
+ to_h.to_json
123
+ end
124
+
112
125
  def size
113
126
  each.count
114
127
  end
@@ -120,7 +133,7 @@ class ComplexConfig::Settings < BasicObject
120
133
  def to_s(pair_sep: ' = ', path_sep: ?.)
121
134
  empty? and return self.class.name
122
135
  pathes(path_sep: path_sep).inject('') do |result, (path, value)|
123
- result << "#{path}#{pair_sep}#{value.inspect}\n"
136
+ result + "#{path}#{pair_sep}#{value.inspect}\n"
124
137
  end
125
138
  end
126
139
 
@@ -1,6 +1,6 @@
1
1
  module ComplexConfig
2
2
  # ComplexConfig version
3
- VERSION = '0.15.1'
3
+ VERSION = '0.18.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:
@@ -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.15.1
4
+ version: 0.18.1
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: