complex_config 0.19.4 → 0.21.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d9912bf6cc72581ab1ac092dc366b4d9e1fa33b52420ffe7c6abc2a55ed7fc02
4
- data.tar.gz: 30553c4257559ab024d0fa901a493458b7876dff14e7d0e467a7125aa7c51f01
3
+ metadata.gz: 432209a0d29d4d47874c82ebe27f311e3a545b1aac932bcf31e0307f8b3dc1fb
4
+ data.tar.gz: 6ed546fc3bbb9032503dc501c7d8350e145255756ca5cbcea18c10758e982577
5
5
  SHA512:
6
- metadata.gz: fb28ff834517685f7fa1942d2ac0409b93bdca7a26f1bd211d63af3991e7bb99088f6027f6f532f5be191c040e43885a876176b6ba0566aa56146c78a41bc4d7
7
- data.tar.gz: 6702bd2669f2d91e326d81748207c4e90157c4ce860e1422d3e8700794b6cee2dd18b6e5066e8f1d015f1ca2141ceae18856005395cd9eae7b995f1b3be07748
6
+ metadata.gz: b7a1a956b49424098d206442242850356de73db068d715d1d9bcfa0659cb336043d6d65af530c7ef0c6d7a021a91122bcaf2baba1998bbc49c0ea7266b582b55
7
+ data.tar.gz: c07a01e3c26ce55862c34a9b42caff05dfa7ed7730be92684eb1eacd335f4badf82c2dcaabe042429610ba4ac3324a2b62b3903dc8c89e428568e4fa230ffe16
data/.all_images.yml CHANGED
@@ -6,12 +6,11 @@ script: &script |-
6
6
  echo -e "\e[1m"
7
7
  ruby -v
8
8
  echo -e "\e[0m"
9
- bundle
10
- rake test
9
+ bundle install --full-index
10
+ rake spec
11
11
 
12
12
  images:
13
+ ruby:3.3-alpine: *script
14
+ ruby:3.2-alpine: *script
13
15
  ruby:3.1-alpine: *script
14
16
  ruby:3.0-alpine: *script
15
- ruby:2.7-alpine: *script
16
- ruby:2.6-alpine: *script
17
- ruby:2.5-alpine: *script
data/CHANGES.md ADDED
@@ -0,0 +1,372 @@
1
+ # Changes
2
+
3
+ ## 2024-09-09 v0.21.0
4
+
5
+ * **Tree Representation**:
6
+ + Add `Tree` class to convert complex config objects into trees.
7
+ + Update `Settings` class to use `Tree` conversion in `to_tree` method.
8
+ + Update tests to reflect changes.
9
+ * **Components Array**: Add components array for flux capacitors
10
+ * **Rakefile and Gemspec**:
11
+ - Add clobber task for coverage to Rakefile
12
+ - Update all_images script: update `bundle` to `bundle install --full-index`
13
+ * **.gitignore**: Remove `.byebug_history` from ignored files
14
+ * **Complex Config**:
15
+ + Raise type error and add test for empty configuration file.
16
+ + Update gemspec to use GemHadar 1.17.0
17
+ + Add requirement for tins/xt/ask_and_send in complex_config/provider.rb
18
+ + Add check for hash type in ComplexConfig::Settings#build method
19
+ + Add test for reading from empty configuration file in provider_spec.rb
20
+ + Replace byebug with debug in spec_helper.rb
21
+
22
+ ## 2024-04-17 v0.20.0
23
+
24
+ #### Significant Changes
25
+
26
+ * **Add dependency to base64**: The code now depends on the `base64` library,
27
+ which will be extracted from Ruby 3.4.
28
+ * **Upgrade ruby and add debug gem**: The project has been upgraded to use a
29
+ newer version of Ruby and includes the `debug` gem for debugging purposes.
30
+ * **Use newest ruby, drop the older 2.5 version**: The code now targets the
31
+ latest version of Ruby and no longer supports Ruby 2.5.
32
+
33
+ #### Other Changes
34
+
35
+ * Run specs: The project now runs its specifications as part of its build
36
+ process.
37
+ * Test on newest ruby, on older ones don't: The project's tests are now run
38
+ only on the latest version of Ruby, with older versions being skipped.
39
+ * Align: The code has been aligned to follow best practices.
40
+
41
+ ## 2022-07-11 v0.19.4
42
+
43
+ * **Configuration File Handling Improvements**
44
+ + Replaced defaulting to `unsafe_load` with explicit usage, ensuring safer
45
+ handling of configuration files.
46
+
47
+ ## 2022-05-19 v0.19.3
48
+
49
+ * **New Feature**: Pass parameters to json generator, allowing for more dynamic
50
+ and customizable JSON output.
51
+ * **Improvement**: Use `all_images` for testing, improving the robustness and
52
+ accuracy of image-related tests.
53
+
54
+ ## 2021-10-28 v0.19.2
55
+
56
+ * **New Psych Support**
57
+ + Added support for newest Psych 4 library
58
+ + Defaults to disabling YAML alias feature
59
+ * **Psych API Update**
60
+ + Updated code to use new Psych/YAML API when Psych version < 4
61
+ + Retained behavior of evaluating aliases
62
+ * **Ruby Version Bump**
63
+ + Updated Ruby version in tool-versions to 3.0.2
64
+
65
+ ## 2021-04-09 v0.19.1
66
+
67
+ * **Breaking Change**: Updated code to adapt to the new keyword interface of
68
+ ERB for Ruby versions greater than or equal to 3.
69
+
70
+ ## 2021-01-05 v0.19.0
71
+
72
+ * Added two new methods:
73
+ + `get_attribute_by_name`
74
+ + `get_attributes_by_name`
75
+
76
+ ## 2020-08-26 v0.18.2
77
+
78
+ * **Bug Fix**: Resolved a similar issue, mirroring the fix introduced in
79
+ version 0.18.1.
80
+
81
+ ## 2020-08-26 v0.18.1
82
+
83
+ * **New Feature**: Added support for faking data, allowing users to simulate
84
+ scenarios without actual data.
85
+ + Implemented a new module `FakeIt` with methods for generating fake data.
86
+ + Updated relevant tests to include fake data scenarios.
87
+
88
+ ## 2020-01-07 v0.18.0
89
+
90
+ * **New Version Summary**
91
+ + Added support for Ruby 2.7.0
92
+ + Updated tests to include Ruby 2.7.0
93
+ + Refactored code to avoid string modifications
94
+ * Significant Changes:
95
+ * Support added for Ruby 2.7.0
96
+ * Tests updated to include Ruby 2.7.0
97
+ * String modification stopped
98
+
99
+ ## 2019-11-27 v0.17.1
100
+
101
+ * **Shared Settings Implementation**: The code now uses a more sane and
102
+ efficient approach for shared settings.
103
+
104
+ ## 2019-03-18 v0.17.0
105
+
106
+ * **Decoding Fix**: Corrected the decoding issue to ensure proper data
107
+ interpretation.
108
+
109
+ ## 2019-03-18 v0.16.2
110
+
111
+ * **New Feature**: Added support for handling complex scenarios
112
+ + Implemented a new logic to handle intricate cases
113
+ * Improved error handling and reporting
114
+ + Enhanced logging to provide more detailed information about errors
115
+ * Minor code refactoring
116
+ + Simplified some conditional statements
117
+
118
+ ## 2019-03-18 v0.16.1
119
+
120
+ * Improved error message for missing encryption key:
121
+ + Added more informative and user-friendly error message when encryption
122
+ key is not provided.
123
+
124
+ ## 2019-03-14 v0.16.0
125
+
126
+ * **New Features**
127
+ + Added support for `trim_mode` in legacy mode
128
+ + Enabled `trim_mode` by default
129
+ + Added `#to_json` method to settings objects
130
+ * **Changes**
131
+ + Updated code to use new `trim_mode` feature
132
+ + Modified settings objects to include `#to_json` method
133
+
134
+ ## 2019-03-14 v0.15.1
135
+
136
+ * **Fix**: Shared feature now works correctly even when the top-level settings
137
+ are empty.
138
+
139
+ ## 2018-12-07 v0.15.0
140
+
141
+ * **New Feature**: Allow recrypting a file in-place with options.
142
+ + Added functionality to enable recrypting a file without creating a new
143
+ copy.
144
+
145
+ ## 2018-12-07 v0.14.1
146
+
147
+ * **New Version**: Bumped version
148
+ * **Improved Error Handling**:
149
+ + Improved error handling if key isn't valid
150
+ + Raises `ComplexConfig::DecryptionFailed` for encrypted files
151
+ * **Compatibility**:
152
+ + Make this run on older rubies
153
+ * **Documentation**:
154
+ + Cleanup documentation
155
+ * **RubyGems**:
156
+ + Use newest rubygems
157
+
158
+ ## 2018-06-07 v0.14.0
159
+
160
+ * Added `complex_config` executable to handle configuration files.
161
+
162
+ ## 2018-02-23 v0.13.3
163
+
164
+ * **Changes in Evaluation Order**
165
+ + The evaluation order of key sources has been modified.
166
+
167
+ ## 2018-02-23 v0.13.2
168
+
169
+ * **Compatibility improvements**
170
+ + Be compatible with ancient rubies^3
171
+ + Be compatible with ancient rubies^2
172
+ + Be compatible with ancient rubies
173
+ * **Refactoring**
174
+ + Refactor key provision with source object
175
+
176
+ ## 2018-02-09 v0.13.1
177
+
178
+ * **New Features**
179
+ + Added information to README file
180
+ * **Significant Changes**
181
+ + Bumped version number
182
+ + Improved error reporting for encrypted files with missing keys
183
+
184
+ ## 2018-01-26 v0.13.0
185
+
186
+ * Improved the `write_config` interface
187
+ * Added more tests
188
+
189
+ ## 2017-11-17 v0.12.2
190
+
191
+ * **Output string keys on top level configs**:
192
+ * Added functionality to output string keys on top level configurations.
193
+
194
+ ## 2017-11-17 v0.12.1
195
+
196
+ * **New Feature**: Suppress newline output during encryption.
197
+
198
+ ## 2017-11-16 v0.12.0
199
+
200
+ * **New Features**
201
+ + Add support for writing configurations (encrypted or not)
202
+ * **Version Bump**
203
+ + Bump version to 0.12.0
204
+ * **Compatibility Improvements**
205
+ + Support older Rubies
206
+
207
+ ## 2017-11-02 v0.11.3
208
+
209
+ * **New Feature:** Added striping functionality.
210
+ * **Bug Fix:** Fixed issue where caches were not cleared when `deep_freeze` was
211
+ disabled.
212
+
213
+ ## 2017-10-30 v0.11.2
214
+
215
+ * **Behavioral Fix**:
216
+ * Fixed the behavior for incomplete key setup.
217
+
218
+ ## 2017-10-27 v0.11.1
219
+
220
+ * Added support for shared features.
221
+
222
+ ## 2017-10-27 v0.11.0
223
+
224
+ * **New Feature**: Support for encrypted YAML files, compatible with Rails'
225
+ encryption.
226
+ * **Test Update**: Added testing to ensure compatibility with Ruby 2.4.2.
227
+
228
+ ## 2017-02-02 v0.10.0
229
+
230
+ ## 2017-01-23 v0.9.2
231
+
232
+ * **New Version**: Released version 0.9.2.
233
+ * **Performance Improvement**:
234
+ + Memoized proxy object for improved performance.
235
+
236
+ ## 2016-11-23 v0.9.1
237
+
238
+ * **New Features**
239
+ + Use newest RubyGems
240
+ + Test on Ruby 2.3.3
241
+ * **Bug Fixes**
242
+ + Fix Travis builds
243
+ + travis fiddles with RAILS_ENV variable, breaking specs (resolved)
244
+ * **Testing Improvements**
245
+ + Test newer Rubies
246
+
247
+ ## 2016-11-22 v0.9.0
248
+
249
+ * **Gem Update**: Updated to newest gem_hadar.
250
+ * **Coverage Report**: Only send new coverage report on success.
251
+ * **Manual Run**: We are supposed to run this manually now.
252
+ * **Code Organization**: Moved provider shortcuts into its own module.
253
+
254
+ ## 2016-07-27 v0.8.0
255
+
256
+ * **New Feature**: Added support for replacing attributes in
257
+ `ComplexConfig::Settings` using the `#replace_attributes` method.
258
+
259
+ ## 2016-07-18 v0.7.0
260
+
261
+ * **New Features**
262
+ + Added new date functionality
263
+ * **Improvements**
264
+ + Simplified `ComplexConfig::Settings` interface by basing it on
265
+ `BasicObject` and reducing mixin usage
266
+ * **Documentation**
267
+ + Updated README.md with new changes
268
+
269
+ ## 2016-07-15 v0.6.0
270
+
271
+ * **Caching Improvements**
272
+ + Use `mize` for caching
273
+
274
+ ## 2016-06-23 v0.5.2
275
+
276
+ * **Index Access Feature**
277
+ + Fixed issue with incorrect indexing behavior (#56190d3)
278
+ + Improved performance and reliability of index access functionality
279
+
280
+ ## 2016-06-23 v0.5.1
281
+
282
+ * **New Features**
283
+ + Resolve index access via the plugin code path, making `foo.bar` and
284
+ `foo[:bar]` equivalent for a plugin key.
285
+ + Test on Ruby 2.3.1 and 2.4.0-preview1
286
+ * **Infrastructure Changes**
287
+ + Use new infrastructure
288
+ * **Bug Fixes**
289
+ + Fix typo
290
+
291
+ ## 2015-11-19 v0.5.0
292
+
293
+ * **New Features**
294
+ + Add configure method
295
+ + Add configuration example to README
296
+ * **Bug Fixes**
297
+ + Flush cache for every request in rails development
298
+ + Change the Changes
299
+ * **Improvements**
300
+ + Just always skip to avoid interference
301
+
302
+ ## 2015-11-17 v0.4.0
303
+
304
+ * **New Feature:** Implemented root object method call syntax.
305
+
306
+ ## 2015-11-03 v0.3.1
307
+
308
+ * **New Features**
309
+ + Add missing tins dependency
310
+ + Show improved settings output in README.md
311
+ + Adds a decent string representation for ComplexConfig::Settings objects
312
+ * **Dependency Updates**
313
+ + Use newest gem hadar
314
+ + Add some development_dependencies (including tins)
315
+ * **Code Improvements**
316
+ + Shorten codeclimate snippet
317
+
318
+ ## 2015-03-24 v0.3.0
319
+
320
+ ## 2015-03-24 v0.2.3
321
+
322
+ * **Typo Fix**: Corrected a typo in the `LoadErro(r)` method.
323
+ * **JRuby Update**: Updated JRuby version to use `jruby-head` and allowed it to
324
+ potentially fail.
325
+
326
+ ## 2015-02-25 v0.2.2
327
+
328
+ * Removed unnecessary `sprintf` format.
329
+
330
+ ## 2015-01-28 v0.2.1
331
+
332
+ * **New Version**:
333
+ * Added support for JRuby test target
334
+ * Removed always broken jruby-head
335
+ * Bumped version number to 0.2.0
336
+ * Bumped version to 0.2.1
337
+ * **Plugin Changes**:
338
+ * Skip the money plugin if monetize cannot be loaded (optional runtime
339
+ dependency)
340
+ * Remove require for plugins, allowing users to use the gem without requiring
341
+ the money gem
342
+ * Fixed requiring *with* plugins, enabling them to load correctly
343
+
344
+ ## 2015-01-27 v0.2.0
345
+
346
+ * **New Features**
347
+ + Added support for JRuby in tests
348
+ + Updated to newest Ruby 2.2
349
+ * **Improvements**
350
+ + Replaced mixin with delegation for Enumerable, allowing attribute names
351
+ like `zip`, `min`, or `max` without conflicts
352
+ * **Documentation**
353
+ + Added Apache license file
354
+
355
+ ## 2015-01-01 v0.1.1
356
+
357
+ * **New Version Summary**
358
+ + Use value from non-associative list arrays
359
+ + Fix `puts` method to call `to_ary` correctly
360
+ + Prevent cash leakage after flushing cache
361
+ + Add `to_ary` method for level on demand
362
+
363
+ ## 2014-12-15 v0.1.0
364
+
365
+ * **Significant Changes**:
366
+ + Freeze cached configuration by default (versioning)
367
+ + Add to-do list for future development
368
+ + Integrate CodeClimate for code analysis and improvement
369
+
370
+ ## 2014-12-12 v0.0.0
371
+
372
+ * Start
data/README.md CHANGED
@@ -30,21 +30,40 @@ Given a config file like this and named `config/products.yml`
30
30
  name: Flux Capacitor Version 2.0
31
31
  price_in_cents: 12_000_00
32
32
  manual_pdf_url: "http://brown-inc.com/manuals/fc_20.pdf"
33
+ components:
34
+ - Miniature Chrono-Levitation Chamber (mCLC)
35
+ - Single Gravitational Displacement Coil (SGDC)
36
+ - Simple Quantum Flux Transducer (SQFT)
37
+ - Basic Time-Space Navigation System (BTN)
33
38
  pro_version:
34
39
  name: Flux Capacitor Professional
35
40
  price_in_cents: 23_000_00
36
41
  manual_pdf_url: "http://brown-inc.com/manuals/fc_pro.pdf"
42
+ components:
43
+ - Advanced Chrono-Levitation Chamber (ACL)
44
+ - Dual Gravitational Displacement Coils (DGDCs)
45
+ - Advanced Quantum Flux Transducer (AQFT)
46
+ - Professional Time-Space Navigation System (PTNS)
37
47
  enterprise_version:
38
48
  name: Flux Capacitor Enterpise
39
49
  price_in_cents: 1_600_000_00
40
50
  manual_pdf_url: "http://brown-inc.com/manuals/fc_enterprise.pdf"
41
-
51
+ components:
52
+ - Super-Advanced Chrono-Levitation Chamber (SACL)
53
+ - Quadruple Gravitational Displacement Coils (QGDCs)
54
+ - Ultra-Advanced Quantum Flux Transducer (UAQFT)
55
+ - Enterprise Time-Space Navigation System (ETNS)
42
56
  test:
43
57
  flux_capacitor:
44
58
  test_version:
45
59
  name: Yadayada
46
60
  price_in_cents: 6_66
47
61
  manual_pdf_url: "http://staging.brown-inc.com/manuals/fc_10.pdf"
62
+ components:
63
+ - Experimental Chrono-Levitation Chamber (ECLC)
64
+ - Modular Gravitational Displacement Coils (MGDCs)
65
+ - Variable Quantum Flux Transducer (VQFT)
66
+ - Development Time-Space Navigation System (DTNS)
48
67
 
49
68
  and using `require "complex_config/rude"` in the `"development"` environment you
50
69
  can now access the configuration.
@@ -82,6 +101,10 @@ You can also fetch config settings from a different environment:
82
101
  products.flux_capacitor.test_version.name = "Yadayada"
83
102
  products.flux_capacitor.test_version.price_in_cents = 666
84
103
  products.flux_capacitor.test_version.manual_pdf_url = "http://staging.brown-inc.com/manuals/fc_10.pdf"
104
+ products.flux_capacitor.test_version.components[0] = "Experimental Chrono-Levitation Chamber (ECLC)"
105
+ products.flux_capacitor.test_version.components[1] = "Modular Gravitational Displacement Coils (MGDCs)"
106
+ products.flux_capacitor.test_version.components[2] = "Variable Quantum Flux Transducer (VQFT)"
107
+ products.flux_capacitor.test_version.components[3] = "Development Time-Space Navigation System (DTNS)"
85
108
 
86
109
  Calling `complex_config.products.` instead of `cc(…)` would skip the implicite
87
110
  namespacing via the `RAILS_ENV` environment, so
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', 'tags'
15
+ '.AppleDouble', '.DS_Store', 'errors.lst', 'tags'
16
16
  package_ignore '.all_images', '.utilsrc', '.rspec', '.tool-versions',
17
17
  '.gitignore'
18
18
 
@@ -20,14 +20,18 @@ GemHadar do
20
20
  title "#{name.camelize} -- configuration library"
21
21
  licenses << 'Apache-2.0'
22
22
 
23
+ clobber 'coverage'
24
+
23
25
  dependency 'json'
24
26
  dependency 'tins'
25
27
  dependency 'mize', '~> 0.3', '>= 0.3.4'
28
+ dependency 'base64'
26
29
  development_dependency 'rake'
27
30
  development_dependency 'simplecov'
28
31
  development_dependency 'rspec'
29
32
  development_dependency 'monetize'
30
33
  development_dependency 'utils'
34
+ development_dependency 'debug'
31
35
  end
32
36
 
33
37
  task :default => :spec
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.19.4
1
+ 0.21.0
@@ -1,49 +1,37 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: complex_config 0.19.4 ruby lib
2
+ # stub: complex_config 0.21.0 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "complex_config".freeze
6
- s.version = "0.19.4"
6
+ s.version = "0.21.0".freeze
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 = "2022-07-11"
11
+ s.date = "2024-09-09"
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
- 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 = [".all_images.yml".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/config_with_alias.yml".freeze, "spec/config/legacy_classes.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]
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/tree.rb".freeze, "lib/complex_config/version.rb".freeze]
16
+ s.files = [".all_images.yml".freeze, "CHANGES.md".freeze, "Gemfile".freeze, "LICENSE".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/tree.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/config_with_alias.yml".freeze, "spec/config/empty_config.yml".freeze, "spec/config/legacy_classes.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 = "3.3.17".freeze
20
+ s.rubygems_version = "3.5.18".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
- if s.respond_to? :specification_version then
25
- s.specification_version = 4
26
- end
24
+ s.specification_version = 4
27
25
 
28
- if s.respond_to? :add_runtime_dependency then
29
- s.add_development_dependency(%q<gem_hadar>.freeze, ["~> 1.12.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_development_dependency(%q<utils>.freeze, [">= 0"])
35
- s.add_runtime_dependency(%q<json>.freeze, [">= 0"])
36
- s.add_runtime_dependency(%q<tins>.freeze, [">= 0"])
37
- s.add_runtime_dependency(%q<mize>.freeze, ["~> 0.3", ">= 0.3.4"])
38
- else
39
- s.add_dependency(%q<gem_hadar>.freeze, ["~> 1.12.0"])
40
- s.add_dependency(%q<rake>.freeze, [">= 0"])
41
- s.add_dependency(%q<simplecov>.freeze, [">= 0"])
42
- s.add_dependency(%q<rspec>.freeze, [">= 0"])
43
- s.add_dependency(%q<monetize>.freeze, [">= 0"])
44
- s.add_dependency(%q<utils>.freeze, [">= 0"])
45
- s.add_dependency(%q<json>.freeze, [">= 0"])
46
- s.add_dependency(%q<tins>.freeze, [">= 0"])
47
- s.add_dependency(%q<mize>.freeze, ["~> 0.3", ">= 0.3.4"])
48
- end
26
+ s.add_development_dependency(%q<gem_hadar>.freeze, ["~> 1.17.0".freeze])
27
+ s.add_development_dependency(%q<rake>.freeze, [">= 0".freeze])
28
+ s.add_development_dependency(%q<simplecov>.freeze, [">= 0".freeze])
29
+ s.add_development_dependency(%q<rspec>.freeze, [">= 0".freeze])
30
+ s.add_development_dependency(%q<monetize>.freeze, [">= 0".freeze])
31
+ s.add_development_dependency(%q<utils>.freeze, [">= 0".freeze])
32
+ s.add_development_dependency(%q<debug>.freeze, [">= 0".freeze])
33
+ s.add_runtime_dependency(%q<json>.freeze, [">= 0".freeze])
34
+ s.add_runtime_dependency(%q<tins>.freeze, [">= 0".freeze])
35
+ s.add_runtime_dependency(%q<mize>.freeze, ["~> 0.3".freeze, ">= 0.3.4".freeze])
36
+ s.add_runtime_dependency(%q<base64>.freeze, [">= 0".freeze])
49
37
  end
data/config/products.yml CHANGED
@@ -4,18 +4,37 @@ development:
4
4
  name: Flux Capacitor Version 2.0
5
5
  price_in_cents: 12_000_00
6
6
  manual_pdf_url: "http://brown-inc.com/manuals/fc_20.pdf"
7
+ components:
8
+ - Miniature Chrono-Levitation Chamber (mCLC)
9
+ - Single Gravitational Displacement Coil (SGDC)
10
+ - Simple Quantum Flux Transducer (SQFT)
11
+ - Basic Time-Space Navigation System (BTN)
7
12
  pro_version:
8
13
  name: Flux Capacitor Professional
9
14
  price_in_cents: 23_000_00
10
15
  manual_pdf_url: "http://brown-inc.com/manuals/fc_pro.pdf"
16
+ components:
17
+ - Advanced Chrono-Levitation Chamber (ACL)
18
+ - Dual Gravitational Displacement Coils (DGDCs)
19
+ - Advanced Quantum Flux Transducer (AQFT)
20
+ - Professional Time-Space Navigation System (PTNS)
11
21
  enterprise_version:
12
22
  name: Flux Capacitor Enterpise
13
23
  price_in_cents: 1_600_000_00
14
24
  manual_pdf_url: "http://brown-inc.com/manuals/fc_enterprise.pdf"
15
-
25
+ components:
26
+ - Super-Advanced Chrono-Levitation Chamber (SACL)
27
+ - Quadruple Gravitational Displacement Coils (QGDCs)
28
+ - Ultra-Advanced Quantum Flux Transducer (UAQFT)
29
+ - Enterprise Time-Space Navigation System (ETNS)
16
30
  test:
17
31
  flux_capacitor:
18
32
  test_version:
19
33
  name: Yadayada
20
34
  price_in_cents: 6_66
21
35
  manual_pdf_url: "http://staging.brown-inc.com/manuals/fc_10.pdf"
36
+ components:
37
+ - Experimental Chrono-Levitation Chamber (ECLC)
38
+ - Modular Gravitational Displacement Coils (MGDCs)
39
+ - Variable Quantum Flux Transducer (VQFT)
40
+ - Development Time-Space Navigation System (DTNS)
@@ -4,14 +4,15 @@ require 'pathname'
4
4
  require 'yaml'
5
5
  require 'mize'
6
6
  require 'tins/xt/secure_write'
7
+ require 'tins/xt/ask_and_send'
7
8
 
8
9
  class ComplexConfig::Provider
9
10
  include Tins::SexySingleton
10
11
  include ComplexConfig::Provider::Shortcuts
11
12
 
12
13
  def initialize
13
- @plugins = Set.new
14
- @deep_freeze = true
14
+ @plugins = Set.new
15
+ @deep_freeze = true
15
16
  end
16
17
 
17
18
  attr_writer :master_key_pathname
@@ -28,6 +28,7 @@ class ComplexConfig::Settings < BasicObject
28
28
 
29
29
  def build(name, hash)
30
30
  name.nil? or self.name_prefix = name.to_sym
31
+ hash.respond_to?(:to_hash) or raise TypeError, 'require hash to build'
31
32
  from_hash(hash)
32
33
  ensure
33
34
  self.name_prefix = nil
@@ -122,6 +123,10 @@ class ComplexConfig::Settings < BasicObject
122
123
  to_h.to_json(*a)
123
124
  end
124
125
 
126
+ def to_tree
127
+ ::ComplexConfig::Tree.convert(name_prefix, self)
128
+ end
129
+
125
130
  def size
126
131
  each.count
127
132
  end
@@ -0,0 +1,80 @@
1
+ module ComplexConfig
2
+ class Tree
3
+ def self.convert(name, value)
4
+ case value
5
+ when ComplexConfig::Settings
6
+ convert(name, value.to_h)
7
+ when Hash
8
+ obj = new(name.to_s)
9
+ value.each do |name, value|
10
+ obj << convert(name, value)
11
+ end
12
+ obj
13
+ when Array
14
+ obj = new(name.to_s)
15
+ value.each_with_index do |value, i|
16
+ obj << convert(i, value)
17
+ end
18
+ obj
19
+ else
20
+ if name.is_a?(Integer)
21
+ new value.inspect
22
+ else
23
+ new "#{name} = #{value.inspect}"
24
+ end
25
+ end
26
+ end
27
+
28
+ def initialize(name)
29
+ @name = name
30
+ @children = []
31
+ end
32
+
33
+ private
34
+
35
+ def inner_child_prefix(i)
36
+ i.zero? ? "├─ " : "│ "
37
+ end
38
+
39
+ def last_child_prefix(i)
40
+ i.zero? ? "└─ " : " "
41
+ end
42
+
43
+ public
44
+
45
+ def to_enum
46
+ Enumerator.new do |y|
47
+ y.yield @name
48
+
49
+ @children.each_with_index do |child, child_index|
50
+ children_enum = child.to_enum
51
+ if child_index < @children.size - 1
52
+ children_enum.each_with_index do |setting, i|
53
+ y.yield "#{inner_child_prefix(i)}#{setting}"
54
+ end
55
+ else
56
+ children_enum.each_with_index do |setting, i|
57
+ y.yield "#{last_child_prefix(i)}#{setting}"
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ def <<(child)
65
+ @children << child
66
+ end
67
+
68
+ def to_ary
69
+ to_enum.to_a
70
+ end
71
+
72
+ alias to_a to_ary
73
+
74
+ def to_str
75
+ to_ary * ?\n
76
+ end
77
+
78
+ alias to_s to_str
79
+ end
80
+ end
@@ -1,6 +1,6 @@
1
1
  module ComplexConfig
2
2
  # ComplexConfig version
3
- VERSION = '0.19.4'
3
+ VERSION = '0.21.0'
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:
@@ -6,6 +6,7 @@ end
6
6
  require 'complex_config/version'
7
7
  require 'complex_config/errors'
8
8
  require 'complex_config/proxy'
9
+ require 'complex_config/tree'
9
10
  require 'complex_config/settings'
10
11
  require 'complex_config/config'
11
12
  require 'complex_config/key_source'
@@ -84,6 +84,12 @@ RSpec.describe ComplexConfig::Provider do
84
84
  ).to be_a ComplexConfig::Settings
85
85
  end
86
86
 
87
+ it 'cannot read from an empty configuration file' do
88
+ expect {
89
+ described_class.config(asset('empty_config.yml'))
90
+ }.to raise_error(TypeError)
91
+ end
92
+
87
93
  it 'has deep frozen settings' do
88
94
  settings = described_class.config(asset('config.yml'))
89
95
  expect(settings).to be_frozen
@@ -7,7 +7,7 @@ RSpec.describe ComplexConfig::Settings do
7
7
  end
8
8
 
9
9
  let :settings do
10
- described_class[
10
+ obj = described_class[
11
11
  foo: {
12
12
  bar: {
13
13
  baz: true
@@ -15,6 +15,8 @@ RSpec.describe ComplexConfig::Settings do
15
15
  qux: 'quux'
16
16
  }
17
17
  ]
18
+ obj.name_prefix = 'root'
19
+ obj
18
20
  end
19
21
 
20
22
  it 'can be initialized with a hash' do
@@ -79,15 +81,15 @@ RSpec.describe ComplexConfig::Settings do
79
81
 
80
82
  it 'can return a hash with pathes as keys' do
81
83
  expect(settings.pathes(path_sep: ?:)).to eq(
82
- 'foo:bar:baz' => true,
83
- 'foo:qux' => "quux"
84
+ 'root:foo:bar:baz' => true,
85
+ 'root:foo:qux' => "quux"
84
86
  )
85
87
  end
86
88
 
87
89
  it 'can be represented as a string' do
88
90
  expect(settings.to_s(pair_sep: ' → ', path_sep: ?/)).to eq <<EOT
89
- foo/bar/baz → true
90
- foo/qux → "quux"
91
+ root/foo/bar/baz → true
92
+ root/foo/qux → "quux"
91
93
  EOT
92
94
  end
93
95
 
@@ -98,17 +100,33 @@ EOT
98
100
  it 'can be represented as a string if it has arrays' do
99
101
  settings[:ary] = described_class[ [ 1, { nested: 2 }, 3 ] ]
100
102
  expect(settings.to_s).to eq <<EOT
101
- foo.bar.baz = true
102
- foo.qux = "quux"
103
- ary[0] = 1
104
- ary[1].nested = 2
105
- ary[2] = 3
103
+ root.foo.bar.baz = true
104
+ root.foo.qux = "quux"
105
+ root.ary[0] = 1
106
+ root.ary[1].nested = 2
107
+ root.ary[2] = 3
108
+ EOT
109
+ end
110
+
111
+ it 'can be represented as tree' do
112
+ settings[:ary] = described_class[ [ 1, { nested: 2 }, 3 ] ]
113
+ expect(settings.to_tree.to_s).to eq <<EOT.chomp
114
+ root
115
+ ├─ foo
116
+ │ ├─ bar
117
+ │ │ └─ baz = true
118
+ │ └─ qux = "quux"
119
+ └─ ary
120
+ ├─ 1
121
+ ├─ 1
122
+ │ └─ nested = 2
123
+ └─ 3
106
124
  EOT
107
125
  end
108
126
 
109
127
  it 'can be pretty printed' do
110
128
  q = double
111
- expect(q).to receive(:text).with("foo.bar.baz = true\nfoo.qux = \"quux\"\n")
129
+ expect(q).to receive(:text).with("root.foo.bar.baz = true\nroot.foo.qux = \"quux\"\n")
112
130
  settings.pretty_print(q)
113
131
  end
114
132
 
File without changes
data/spec/spec_helper.rb CHANGED
@@ -6,7 +6,7 @@ if ENV['START_SIMPLECOV'].to_i == 1
6
6
  end
7
7
  require 'rspec'
8
8
  begin
9
- require 'byebug'
9
+ require 'debug'
10
10
  rescue LoadError
11
11
  end
12
12
  require 'complex_config'
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.19.4
4
+ version: 0.21.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: 2022-07-11 00:00:00.000000000 Z
11
+ date: 2024-09-09 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.12.0
19
+ version: 1.17.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.12.0
26
+ version: 1.17.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: debug
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: json
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -142,6 +156,20 @@ dependencies:
142
156
  - - ">="
143
157
  - !ruby/object:Gem::Version
144
158
  version: 0.3.4
159
+ - !ruby/object:Gem::Dependency
160
+ name: base64
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :runtime
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
145
173
  description: This library allows you to access configuration files via a simple interface
146
174
  email: flori@ping.de
147
175
  executables:
@@ -165,11 +193,13 @@ extra_rdoc_files:
165
193
  - lib/complex_config/rude.rb
166
194
  - lib/complex_config/settings.rb
167
195
  - lib/complex_config/shortcuts.rb
196
+ - lib/complex_config/tree.rb
168
197
  - lib/complex_config/version.rb
169
198
  files:
170
199
  - ".all_images.yml"
171
- - COPYING
200
+ - CHANGES.md
172
201
  - Gemfile
202
+ - LICENSE
173
203
  - README.md
174
204
  - Rakefile
175
205
  - VERSION
@@ -192,6 +222,7 @@ files:
192
222
  - lib/complex_config/rude.rb
193
223
  - lib/complex_config/settings.rb
194
224
  - lib/complex_config/shortcuts.rb
225
+ - lib/complex_config/tree.rb
195
226
  - lib/complex_config/version.rb
196
227
  - spec/complex_config/config_spec.rb
197
228
  - spec/complex_config/encryption_spec.rb
@@ -203,6 +234,7 @@ files:
203
234
  - spec/config/broken_config.yml
204
235
  - spec/config/config.yml
205
236
  - spec/config/config_with_alias.yml
237
+ - spec/config/empty_config.yml
206
238
  - spec/config/legacy_classes.yml
207
239
  - spec/config/master.key
208
240
  - spec/config/with-key-file.yml.enc
@@ -232,7 +264,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
232
264
  - !ruby/object:Gem::Version
233
265
  version: '0'
234
266
  requirements: []
235
- rubygems_version: 3.3.17
267
+ rubygems_version: 3.5.18
236
268
  signing_key:
237
269
  specification_version: 4
238
270
  summary: configuration library
File without changes