mixlib-config 2.2.11 → 3.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mixlib/config.rb +65 -44
- data/lib/mixlib/config/configurable.rb +40 -23
- data/lib/mixlib/config/version.rb +1 -1
- metadata +7 -72
- data/Gemfile +0 -3
- data/README.md +0 -304
- data/Rakefile +0 -32
- data/mixlib-config.gemspec +0 -32
- data/spec/mixlib/config_spec.rb +0 -1273
- data/spec/spec_helper.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 542f1c9f7daff1297b70799397e6f44dba7896522e89334e71496db690802013
|
4
|
+
data.tar.gz: f2383ad0c71049dab95ceeac81d39d7b8ed1d8cb2e9a6ed45ac29acaa0d63838
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d4137a9a0747261ad42cc1f3035ab6136823ee3c89666e7adf041e36190cd24179e0eee5711686011ab7c1e7efead2242aef88c6f9c0e03bfee8ef41509492be
|
7
|
+
data.tar.gz: 22248d0a227c55598fa81debb29a0eaa9436d27192bfbd45beb091b0ace555b4abd4783f09ef7c1febca965b386320268dada9fe5f45a94485cc266695144a9b
|
data/lib/mixlib/config.rb
CHANGED
@@ -33,11 +33,11 @@ module Mixlib
|
|
33
33
|
class << base; attr_accessor :config_context_lists; end
|
34
34
|
class << base; attr_accessor :config_context_hashes; end
|
35
35
|
class << base; attr_accessor :config_parent; end
|
36
|
-
base.configuration =
|
37
|
-
base.configurables =
|
38
|
-
base.config_contexts =
|
39
|
-
base.config_context_lists =
|
40
|
-
base.config_context_hashes =
|
36
|
+
base.configuration = ({})
|
37
|
+
base.configurables = ({})
|
38
|
+
base.config_contexts = ({})
|
39
|
+
base.config_context_lists = ({})
|
40
|
+
base.config_context_hashes = ({})
|
41
41
|
base.initialize_mixlib_config
|
42
42
|
end
|
43
43
|
|
@@ -70,7 +70,7 @@ module Mixlib
|
|
70
70
|
# filename<String>:: A filename to read from
|
71
71
|
def from_yaml(filename)
|
72
72
|
require "yaml"
|
73
|
-
from_hash(YAML.load(IO.read(filename))
|
73
|
+
from_hash(YAML.load(IO.read(filename)))
|
74
74
|
end
|
75
75
|
|
76
76
|
# Parses valid JSON structure into Ruby
|
@@ -79,7 +79,7 @@ module Mixlib
|
|
79
79
|
# filename<String>:: A filename to read from
|
80
80
|
def from_json(filename)
|
81
81
|
require "json"
|
82
|
-
from_hash(JSON.parse(IO.read(filename))
|
82
|
+
from_hash(JSON.parse(IO.read(filename)))
|
83
83
|
end
|
84
84
|
|
85
85
|
def from_toml(filename)
|
@@ -91,20 +91,8 @@ module Mixlib
|
|
91
91
|
#
|
92
92
|
# === Parameters
|
93
93
|
# hash<Hash>:: A Hash containing configuration
|
94
|
-
def from_hash(hash
|
95
|
-
|
96
|
-
|
97
|
-
to_dotted_hash(hash).each do |k, v|
|
98
|
-
if v.is_a? Array
|
99
|
-
ruby_translation << "#{k} #{v}"
|
100
|
-
elsif v.is_a? String
|
101
|
-
ruby_translation << "#{k} \"#{v}\""
|
102
|
-
else
|
103
|
-
ruby_translation << "#{k} #{v}"
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
instance_eval(ruby_translation.join("\n"), filename, 1)
|
94
|
+
def from_hash(hash)
|
95
|
+
apply_nested_hash(hash)
|
108
96
|
end
|
109
97
|
|
110
98
|
# Pass Mixlib::Config.configure() a block, and it will yield itself
|
@@ -153,11 +141,20 @@ module Mixlib
|
|
153
141
|
# <True>:: If the config option exists
|
154
142
|
# <False>:: If the config option does not exist
|
155
143
|
def key?(key)
|
156
|
-
configuration.
|
144
|
+
configuration.key?(key.to_sym) || config_contexts.key?(key.to_sym)
|
157
145
|
end
|
158
146
|
|
159
147
|
alias_method :has_key?, :key?
|
160
148
|
|
149
|
+
def is_default?(key)
|
150
|
+
symbol = key.to_sym
|
151
|
+
if configurables.key?(symbol)
|
152
|
+
configurables[symbol].is_default?(configuration)
|
153
|
+
else
|
154
|
+
raise ArgumentError, "config option must exist, and not be a context to check for default values"
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
161
158
|
# Resets a config option to its default.
|
162
159
|
#
|
163
160
|
# === Parameters
|
@@ -168,8 +165,8 @@ module Mixlib
|
|
168
165
|
|
169
166
|
# Resets all config options to their defaults.
|
170
167
|
def reset
|
171
|
-
self.configuration =
|
172
|
-
config_contexts.values.each
|
168
|
+
self.configuration = ({})
|
169
|
+
config_contexts.values.each(&:reset)
|
173
170
|
end
|
174
171
|
|
175
172
|
# Makes a copy of any non-default values.
|
@@ -253,9 +250,9 @@ module Mixlib
|
|
253
250
|
# === Returns
|
254
251
|
# self
|
255
252
|
def restore(hash)
|
256
|
-
self.configuration = hash.reject { |key, value| config_contexts.
|
253
|
+
self.configuration = hash.reject { |key, value| config_contexts.key?(key) }
|
257
254
|
config_contexts.each do |key, config_context|
|
258
|
-
if hash.
|
255
|
+
if hash.key?(key)
|
259
256
|
config_context.restore(hash[key])
|
260
257
|
else
|
261
258
|
config_context.reset
|
@@ -263,7 +260,7 @@ module Mixlib
|
|
263
260
|
end
|
264
261
|
config_context_lists.each do |key, meta|
|
265
262
|
meta[:values] = []
|
266
|
-
if hash.
|
263
|
+
if hash.key?(key)
|
267
264
|
hash[key].each do |val|
|
268
265
|
context = define_context(meta[:definition_blocks])
|
269
266
|
context.restore(val)
|
@@ -273,7 +270,7 @@ module Mixlib
|
|
273
270
|
end
|
274
271
|
config_context_hashes.each do |key, meta|
|
275
272
|
meta[:values] = {}
|
276
|
-
if hash.
|
273
|
+
if hash.key?(key)
|
277
274
|
hash[key].each do |vkey, val|
|
278
275
|
context = define_context(meta[:definition_blocks])
|
279
276
|
context.restore(val)
|
@@ -292,7 +289,7 @@ module Mixlib
|
|
292
289
|
# self
|
293
290
|
def merge!(hash)
|
294
291
|
hash.each do |key, value|
|
295
|
-
if config_contexts.
|
292
|
+
if config_contexts.key?(key)
|
296
293
|
# Grab the config context and let internal_get cache it if so desired
|
297
294
|
config_contexts[key].restore(value)
|
298
295
|
else
|
@@ -372,9 +369,10 @@ module Mixlib
|
|
372
369
|
# The value of the config option.
|
373
370
|
def configurable(symbol, &block)
|
374
371
|
unless configurables[symbol]
|
375
|
-
if config_contexts.
|
372
|
+
if config_contexts.key?(symbol)
|
376
373
|
raise ReopenedConfigContextWithConfigurableError, "Cannot redefine config_context #{symbol} as a configurable value"
|
377
374
|
end
|
375
|
+
|
378
376
|
configurables[symbol] = Configurable.new(symbol)
|
379
377
|
define_attr_accessor_methods(symbol)
|
380
378
|
end
|
@@ -400,11 +398,11 @@ module Mixlib
|
|
400
398
|
# block<Block>: a block that will be run in the context of this new config
|
401
399
|
# class.
|
402
400
|
def config_context(symbol, &block)
|
403
|
-
if configurables.
|
401
|
+
if configurables.key?(symbol)
|
404
402
|
raise ReopenedConfigurableWithConfigContextError, "Cannot redefine config value #{symbol} with a config context"
|
405
403
|
end
|
406
404
|
|
407
|
-
if config_contexts.
|
405
|
+
if config_contexts.key?(symbol)
|
408
406
|
context = config_contexts[symbol]
|
409
407
|
else
|
410
408
|
context = Class.new
|
@@ -438,11 +436,11 @@ module Mixlib
|
|
438
436
|
# block<Block>: a block that will be run in the context of this new config
|
439
437
|
# class.
|
440
438
|
def config_context_list(plural_symbol, singular_symbol, &block)
|
441
|
-
if configurables.
|
439
|
+
if configurables.key?(plural_symbol)
|
442
440
|
raise ReopenedConfigurableWithConfigContextError, "Cannot redefine config value #{plural_symbol} with a config context"
|
443
441
|
end
|
444
442
|
|
445
|
-
unless config_context_lists.
|
443
|
+
unless config_context_lists.key?(plural_symbol)
|
446
444
|
config_context_lists[plural_symbol] = {
|
447
445
|
definition_blocks: [],
|
448
446
|
values: [],
|
@@ -470,11 +468,11 @@ module Mixlib
|
|
470
468
|
# block<Block>: a block that will be run in the context of this new config
|
471
469
|
# class.
|
472
470
|
def config_context_hash(plural_symbol, singular_symbol, &block)
|
473
|
-
if configurables.
|
471
|
+
if configurables.key?(plural_symbol)
|
474
472
|
raise ReopenedConfigurableWithConfigContextError, "Cannot redefine config value #{plural_symbol} with a config context"
|
475
473
|
end
|
476
474
|
|
477
|
-
unless config_context_hashes.
|
475
|
+
unless config_context_hashes.key?(plural_symbol)
|
478
476
|
config_context_hashes[plural_symbol] = {
|
479
477
|
definition_blocks: [],
|
480
478
|
values: {},
|
@@ -534,9 +532,10 @@ module Mixlib
|
|
534
532
|
# <ArgumentError>:: if value is set to something other than true, false, or :warn
|
535
533
|
#
|
536
534
|
def config_strict_mode=(value)
|
537
|
-
|
535
|
+
unless [ true, false, :warn, nil ].include?(value)
|
538
536
|
raise ArgumentError, "config_strict_mode must be true, false, nil or :warn"
|
539
537
|
end
|
538
|
+
|
540
539
|
@config_strict_mode = value
|
541
540
|
end
|
542
541
|
|
@@ -558,6 +557,28 @@ module Mixlib
|
|
558
557
|
internal_get_or_set(method_symbol, *args)
|
559
558
|
end
|
560
559
|
|
560
|
+
protected
|
561
|
+
|
562
|
+
# Given a (nested) Hash, apply it to the config object and any contexts.
|
563
|
+
#
|
564
|
+
# This is preferable to converting it to the string representation with
|
565
|
+
# the #to_dotted_hash method above.
|
566
|
+
#
|
567
|
+
# === Parameters
|
568
|
+
# hash<Hash>:: The hash to apply to the config oject
|
569
|
+
def apply_nested_hash(hash)
|
570
|
+
hash.each do |k, v|
|
571
|
+
if v.is_a? Hash
|
572
|
+
# If loading from hash, and we reference a context that doesn't exist
|
573
|
+
# and warning/strict is off, we need to create the config context that we expected to be here.
|
574
|
+
context = internal_get(k.to_sym) || config_context(k.to_sym)
|
575
|
+
context.apply_nested_hash(v)
|
576
|
+
else
|
577
|
+
internal_set(k.to_sym, v)
|
578
|
+
end
|
579
|
+
end
|
580
|
+
end
|
581
|
+
|
561
582
|
private
|
562
583
|
|
563
584
|
# Given a (nested) Hash, turn it into a single top-level hash using dots as
|
@@ -588,9 +609,9 @@ module Mixlib
|
|
588
609
|
# value<Object>:: Value to be set in config hash
|
589
610
|
#
|
590
611
|
def internal_set(symbol, value)
|
591
|
-
if configurables.
|
612
|
+
if configurables.key?(symbol)
|
592
613
|
configurables[symbol].set(configuration, value)
|
593
|
-
elsif config_contexts.
|
614
|
+
elsif config_contexts.key?(symbol)
|
594
615
|
config_contexts[symbol].restore(value.to_hash)
|
595
616
|
else
|
596
617
|
if config_strict_mode == :warn
|
@@ -603,13 +624,13 @@ module Mixlib
|
|
603
624
|
end
|
604
625
|
|
605
626
|
def internal_get(symbol)
|
606
|
-
if configurables.
|
627
|
+
if configurables.key?(symbol)
|
607
628
|
configurables[symbol].get(configuration)
|
608
|
-
elsif config_contexts.
|
629
|
+
elsif config_contexts.key?(symbol)
|
609
630
|
config_contexts[symbol]
|
610
|
-
elsif config_context_lists.
|
631
|
+
elsif config_context_lists.key?(symbol)
|
611
632
|
config_context_lists[symbol]
|
612
|
-
elsif config_context_hashes.
|
633
|
+
elsif config_context_hashes.key?(symbol)
|
613
634
|
config_context_hashes[symbol]
|
614
635
|
else
|
615
636
|
if config_strict_mode == :warn
|
@@ -686,7 +707,7 @@ module Mixlib
|
|
686
707
|
# Adds a single new context to the list
|
687
708
|
meta.send :define_method, singular_symbol do |key, &block|
|
688
709
|
context_hash_details = internal_get(plural_symbol)
|
689
|
-
context = if context_hash_details[:values].
|
710
|
+
context = if context_hash_details[:values].key? key
|
690
711
|
context_hash_details[:values][key]
|
691
712
|
else
|
692
713
|
new_context = define_context(context_hash_details[:definition_blocks])
|
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
2
|
# Author:: John Keiser (<jkeiser@chef.io>)
|
3
|
-
# Copyright:: Copyright (c) 2013-
|
3
|
+
# Copyright:: Copyright (c) 2013-2018, Chef Software Inc.
|
4
4
|
# License:: Apache License, Version 2.0
|
5
5
|
#
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -19,20 +19,31 @@
|
|
19
19
|
module Mixlib
|
20
20
|
module Config
|
21
21
|
class Configurable
|
22
|
+
attr_reader :symbol
|
23
|
+
attr_reader :default_value
|
24
|
+
attr_reader :default_block
|
25
|
+
|
22
26
|
def initialize(symbol)
|
23
27
|
@symbol = symbol
|
24
|
-
@default_block = nil
|
25
|
-
@has_default = false
|
26
|
-
@default_value = nil
|
27
|
-
@writes_value = nil
|
28
28
|
end
|
29
29
|
|
30
|
-
|
30
|
+
def has_default?
|
31
|
+
instance_variable_defined?(:@default_value)
|
32
|
+
end
|
33
|
+
|
34
|
+
def writes_value?
|
35
|
+
instance_variable_defined?(:@writes_value)
|
36
|
+
end
|
37
|
+
|
38
|
+
def default_block?
|
39
|
+
instance_variable_defined?(:@default_block)
|
40
|
+
end
|
41
|
+
|
42
|
+
alias_method :has_default, :has_default?
|
31
43
|
|
32
44
|
def defaults_to(default_value = nil, &block)
|
33
|
-
@has_default = true
|
34
|
-
@default_block = block
|
35
45
|
@default_value = default_value
|
46
|
+
@default_block = block if block_given?
|
36
47
|
self
|
37
48
|
end
|
38
49
|
|
@@ -42,32 +53,38 @@ module Mixlib
|
|
42
53
|
end
|
43
54
|
|
44
55
|
def get(config)
|
45
|
-
if config.
|
46
|
-
config[
|
47
|
-
elsif
|
48
|
-
|
56
|
+
if config.key?(symbol)
|
57
|
+
config[symbol]
|
58
|
+
elsif default_block?
|
59
|
+
default_block.call
|
49
60
|
else
|
50
|
-
|
51
|
-
# Some things cannot be dup'd, and you won't know this till after the fact
|
52
|
-
# because all values implement dup
|
53
|
-
config[@symbol] = @default_value.dup
|
54
|
-
rescue TypeError
|
55
|
-
@default_value
|
56
|
-
end
|
61
|
+
config[symbol] = safe_dup(default_value)
|
57
62
|
end
|
58
63
|
end
|
59
64
|
|
60
65
|
def set(config, value)
|
61
|
-
config[
|
66
|
+
config[symbol] = writes_value? ? @writes_value.call(value) : value
|
62
67
|
end
|
63
68
|
|
64
69
|
def default
|
65
|
-
if
|
66
|
-
|
70
|
+
if default_block?
|
71
|
+
default_block.call
|
67
72
|
else
|
68
|
-
|
73
|
+
default_value
|
69
74
|
end
|
70
75
|
end
|
76
|
+
|
77
|
+
def is_default?(config)
|
78
|
+
!config.key?(symbol) || config[symbol] == default_value
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def safe_dup(e)
|
84
|
+
e.dup
|
85
|
+
rescue TypeError
|
86
|
+
e
|
87
|
+
end
|
71
88
|
end
|
72
89
|
end
|
73
90
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mixlib-config
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chef Software, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-11-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: tomlrb
|
@@ -24,85 +24,21 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rake
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: rspec
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '3.0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '3.0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: chefstyle
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rdoc
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
27
|
description: A class based configuration library
|
84
|
-
email:
|
28
|
+
email: info@chef.io
|
85
29
|
executables: []
|
86
30
|
extensions: []
|
87
|
-
extra_rdoc_files:
|
88
|
-
- LICENSE
|
89
|
-
- README.md
|
31
|
+
extra_rdoc_files: []
|
90
32
|
files:
|
91
|
-
- Gemfile
|
92
33
|
- LICENSE
|
93
34
|
- NOTICE
|
94
|
-
- README.md
|
95
|
-
- Rakefile
|
96
35
|
- lib/mixlib/config.rb
|
97
36
|
- lib/mixlib/config/configurable.rb
|
98
37
|
- lib/mixlib/config/reopened_config_context_with_configurable_error.rb
|
99
38
|
- lib/mixlib/config/reopened_configurable_with_config_context_error.rb
|
100
39
|
- lib/mixlib/config/unknown_config_option_error.rb
|
101
40
|
- lib/mixlib/config/version.rb
|
102
|
-
|
103
|
-
- spec/mixlib/config_spec.rb
|
104
|
-
- spec/spec_helper.rb
|
105
|
-
homepage: https://www.chef.io
|
41
|
+
homepage: https://github.com/chef/mixlib-config
|
106
42
|
licenses:
|
107
43
|
- Apache-2.0
|
108
44
|
metadata: {}
|
@@ -114,15 +50,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
114
50
|
requirements:
|
115
51
|
- - ">="
|
116
52
|
- !ruby/object:Gem::Version
|
117
|
-
version: '2.
|
53
|
+
version: '2.4'
|
118
54
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
55
|
requirements:
|
120
56
|
- - ">="
|
121
57
|
- !ruby/object:Gem::Version
|
122
58
|
version: '0'
|
123
59
|
requirements: []
|
124
|
-
|
125
|
-
rubygems_version: 2.7.6
|
60
|
+
rubygems_version: 3.0.3
|
126
61
|
signing_key:
|
127
62
|
specification_version: 4
|
128
63
|
summary: A class based configuration library
|