-
-
Notifications
You must be signed in to change notification settings - Fork 55
/
Copy pathsettings.rb
108 lines (86 loc) · 2.12 KB
/
settings.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# frozen_string_literal: true
require "concurrent/map"
require "dry/core/equalizer"
require "dry/configurable/constants"
module Dry
module Configurable
# A settings map
#
# @api private
class Settings
include Dry::Equalizer(:elements)
include Enumerable
# @api private
attr_reader :elements
# @api private
def initialize(elements = EMPTY_ARRAY)
initialize_elements(elements)
end
def replace(settings)
ensure_arguments(settings)
settings.dup.each do |setting|
self << setting
end
end
def merge!(settings)
merge(settings).each do |setting|
self << setting
end
end
def merge(settings)
ensure_arguments(settings)
settings.dup.inject(dup) do |memo, setting|
memo << merge_setting(setting)
end
end
# @api private
def <<(setting)
elements[setting.name] = setting
self
end
# @api private
def [](name)
elements[name]
end
# @api private
def key?(name)
keys.include?(name)
end
# @api private
def keys
elements.keys
end
# @api private
def each(&block)
elements.values.each(&block)
end
# @api private
def pristine
self.class.new(map(&:pristine))
end
private
def merge_setting(setting)
if elements[setting.name].is_a?(Setting::Nested) && setting.is_a?(Setting::Nested)
elements[setting.name].merge(setting)
else
setting
end
end
def ensure_arguments(settings)
unless settings.is_a? Dry::Configurable::Settings
raise ArgumentError, "settings must be a Dry::Configurable::Settings"
end
end
# @api private
def initialize_copy(source)
initialize_elements(source.map(&:dup))
end
# @api private
def initialize_elements(elements)
@elements = elements.each_with_object(Concurrent::Map.new) { |s, m|
m[s.name] = s
}
end
end
end
end