dry-configurable 0.11.6 → 1.0.1
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 +4 -4
- data/CHANGELOG.md +187 -2
- data/LICENSE +1 -1
- data/README.md +5 -4
- data/dry-configurable.gemspec +16 -16
- data/lib/dry/configurable/class_methods.rb +40 -31
- data/lib/dry/configurable/compiler.rb +5 -12
- data/lib/dry/configurable/config.rb +133 -47
- data/lib/dry/configurable/constants.rb +0 -2
- data/lib/dry/configurable/dsl.rb +35 -23
- data/lib/dry/configurable/errors.rb +3 -2
- data/lib/dry/configurable/extension.rb +48 -0
- data/lib/dry/configurable/instance_methods.rb +20 -12
- data/lib/dry/configurable/methods.rb +3 -7
- data/lib/dry/configurable/setting.rb +44 -91
- data/lib/dry/configurable/settings.rb +30 -37
- data/lib/dry/configurable/test_interface.rb +1 -1
- data/lib/dry/configurable/version.rb +1 -1
- data/lib/dry/configurable.rb +27 -19
- data/lib/dry-configurable.rb +1 -1
- metadata +15 -29
- data/lib/dry/configurable/dsl/args.rb +0 -58
@@ -1,71 +1,64 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'concurrent/map'
|
4
|
-
|
5
|
-
require 'dry/equalizer'
|
6
|
-
require 'dry/configurable/constants'
|
7
|
-
|
8
3
|
module Dry
|
9
4
|
module Configurable
|
10
|
-
# A settings
|
5
|
+
# A collection of defined settings on a given class.
|
11
6
|
#
|
12
7
|
# @api private
|
13
8
|
class Settings
|
14
|
-
include Dry::Equalizer(:
|
9
|
+
include Dry::Equalizer(:settings)
|
15
10
|
|
16
11
|
include Enumerable
|
17
12
|
|
18
13
|
# @api private
|
19
|
-
attr_reader :
|
14
|
+
attr_reader :settings
|
15
|
+
|
16
|
+
# @api private
|
17
|
+
def initialize(settings = EMPTY_ARRAY)
|
18
|
+
@settings = settings.each_with_object({}) { |s, m| m[s.name] = s }
|
19
|
+
end
|
20
20
|
|
21
21
|
# @api private
|
22
|
-
def
|
23
|
-
|
22
|
+
private def initialize_copy(source)
|
23
|
+
@settings = source.settings.dup
|
24
24
|
end
|
25
25
|
|
26
26
|
# @api private
|
27
27
|
def <<(setting)
|
28
|
-
|
28
|
+
settings[setting.name] = setting
|
29
29
|
self
|
30
30
|
end
|
31
31
|
|
32
|
-
#
|
32
|
+
# Returns the setting for the given name, if found.
|
33
|
+
#
|
34
|
+
# @return [Setting, nil] the setting, or nil if not found
|
35
|
+
#
|
36
|
+
# @api public
|
33
37
|
def [](name)
|
34
|
-
|
38
|
+
settings[name]
|
35
39
|
end
|
36
40
|
|
37
|
-
#
|
41
|
+
# Returns true if a setting for the given name is defined.
|
42
|
+
#
|
43
|
+
# @return [Boolean]
|
44
|
+
#
|
45
|
+
# @api public
|
38
46
|
def key?(name)
|
39
47
|
keys.include?(name)
|
40
48
|
end
|
41
49
|
|
42
|
-
#
|
50
|
+
# Returns the list of defined setting names.
|
51
|
+
#
|
52
|
+
# @return [Array<Symbol>]
|
53
|
+
#
|
54
|
+
# @api public
|
43
55
|
def keys
|
44
|
-
|
56
|
+
settings.keys
|
45
57
|
end
|
46
58
|
|
47
|
-
# @api
|
59
|
+
# @api public
|
48
60
|
def each(&block)
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
# @api private
|
53
|
-
def pristine
|
54
|
-
self.class.new(map(&:pristine))
|
55
|
-
end
|
56
|
-
|
57
|
-
private
|
58
|
-
|
59
|
-
# @api private
|
60
|
-
def initialize_copy(source)
|
61
|
-
initialize_elements(source.map(&:dup))
|
62
|
-
end
|
63
|
-
|
64
|
-
# @api private
|
65
|
-
def initialize_elements(elements)
|
66
|
-
@elements = elements.each_with_object(Concurrent::Map.new) { |s, m|
|
67
|
-
m[s.name] = s
|
68
|
-
}
|
61
|
+
settings.each_value(&block)
|
69
62
|
end
|
70
63
|
end
|
71
64
|
end
|
data/lib/dry/configurable.rb
CHANGED
@@ -1,15 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "zeitwerk"
|
4
4
|
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require 'dry/configurable/config'
|
9
|
-
require 'dry/configurable/setting'
|
10
|
-
require 'dry/configurable/errors'
|
5
|
+
require "dry/core"
|
6
|
+
require "dry/configurable/constants"
|
7
|
+
require "dry/configurable/errors"
|
11
8
|
|
12
9
|
module Dry
|
10
|
+
# @api public
|
11
|
+
def self.Configurable(**options)
|
12
|
+
Configurable::Extension.new(**options)
|
13
|
+
end
|
14
|
+
|
13
15
|
# A simple configuration mixin
|
14
16
|
#
|
15
17
|
# @example class-level configuration
|
@@ -44,26 +46,32 @@ module Dry
|
|
44
46
|
#
|
45
47
|
# @api public
|
46
48
|
module Configurable
|
49
|
+
def self.loader
|
50
|
+
@loader ||= Zeitwerk::Loader.new.tap do |loader|
|
51
|
+
root = File.expand_path("..", __dir__)
|
52
|
+
loader.tag = "dry-configurable"
|
53
|
+
loader.inflector = Zeitwerk::GemInflector.new("#{root}/dry-configurable.rb")
|
54
|
+
loader.push_dir(root)
|
55
|
+
loader.ignore(
|
56
|
+
"#{root}/dry-configurable.rb",
|
57
|
+
"#{root}/dry/configurable/{constants,errors,version}.rb"
|
58
|
+
)
|
59
|
+
loader.inflector.inflect("dsl" => "DSL")
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
47
63
|
# @api private
|
48
64
|
def self.extended(klass)
|
49
65
|
super
|
50
|
-
klass.extend(
|
66
|
+
klass.extend(Extension.new)
|
51
67
|
end
|
52
68
|
|
53
69
|
# @api private
|
54
70
|
def self.included(klass)
|
55
|
-
raise AlreadyIncluded if klass.include?(InstanceMethods)
|
56
|
-
|
57
71
|
super
|
58
|
-
klass.
|
59
|
-
extend(ClassMethods)
|
60
|
-
include(InstanceMethods)
|
61
|
-
|
62
|
-
class << self
|
63
|
-
undef :config
|
64
|
-
undef :configure
|
65
|
-
end
|
66
|
-
end
|
72
|
+
klass.include(Extension.new)
|
67
73
|
end
|
74
|
+
|
75
|
+
loader.setup
|
68
76
|
end
|
69
77
|
end
|
data/lib/dry-configurable.rb
CHANGED
metadata
CHANGED
@@ -1,63 +1,49 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dry-configurable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Holland
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: concurrent-ruby
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '1.0'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: dry-core
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
30
16
|
requirements:
|
31
17
|
- - "~>"
|
32
18
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0
|
34
|
-
- - "
|
19
|
+
version: '1.0'
|
20
|
+
- - "<"
|
35
21
|
- !ruby/object:Gem::Version
|
36
|
-
version:
|
22
|
+
version: '2'
|
37
23
|
type: :runtime
|
38
24
|
prerelease: false
|
39
25
|
version_requirements: !ruby/object:Gem::Requirement
|
40
26
|
requirements:
|
41
27
|
- - "~>"
|
42
28
|
- !ruby/object:Gem::Version
|
43
|
-
version: '0
|
44
|
-
- - "
|
29
|
+
version: '1.0'
|
30
|
+
- - "<"
|
45
31
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
32
|
+
version: '2'
|
47
33
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
34
|
+
name: zeitwerk
|
49
35
|
requirement: !ruby/object:Gem::Requirement
|
50
36
|
requirements:
|
51
37
|
- - "~>"
|
52
38
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
39
|
+
version: '2.6'
|
54
40
|
type: :runtime
|
55
41
|
prerelease: false
|
56
42
|
version_requirements: !ruby/object:Gem::Requirement
|
57
43
|
requirements:
|
58
44
|
- - "~>"
|
59
45
|
- !ruby/object:Gem::Version
|
60
|
-
version: '
|
46
|
+
version: '2.6'
|
61
47
|
- !ruby/object:Gem::Dependency
|
62
48
|
name: bundler
|
63
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -118,8 +104,8 @@ files:
|
|
118
104
|
- lib/dry/configurable/config.rb
|
119
105
|
- lib/dry/configurable/constants.rb
|
120
106
|
- lib/dry/configurable/dsl.rb
|
121
|
-
- lib/dry/configurable/dsl/args.rb
|
122
107
|
- lib/dry/configurable/errors.rb
|
108
|
+
- lib/dry/configurable/extension.rb
|
123
109
|
- lib/dry/configurable/instance_methods.rb
|
124
110
|
- lib/dry/configurable/methods.rb
|
125
111
|
- lib/dry/configurable/setting.rb
|
@@ -131,7 +117,7 @@ licenses:
|
|
131
117
|
- MIT
|
132
118
|
metadata:
|
133
119
|
allowed_push_host: https://rubygems.org
|
134
|
-
changelog_uri: https://github.com/dry-rb/dry-configurable/blob/
|
120
|
+
changelog_uri: https://github.com/dry-rb/dry-configurable/blob/main/CHANGELOG.md
|
135
121
|
source_code_uri: https://github.com/dry-rb/dry-configurable
|
136
122
|
bug_tracker_uri: https://github.com/dry-rb/dry-configurable/issues
|
137
123
|
post_install_message:
|
@@ -142,14 +128,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
142
128
|
requirements:
|
143
129
|
- - ">="
|
144
130
|
- !ruby/object:Gem::Version
|
145
|
-
version: 2.
|
131
|
+
version: 2.7.0
|
146
132
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
147
133
|
requirements:
|
148
134
|
- - ">="
|
149
135
|
- !ruby/object:Gem::Version
|
150
136
|
version: '0'
|
151
137
|
requirements: []
|
152
|
-
rubygems_version: 3.
|
138
|
+
rubygems_version: 3.1.6
|
153
139
|
signing_key:
|
154
140
|
specification_version: 4
|
155
141
|
summary: A mixin to add configuration functionality to your classes
|
@@ -1,58 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'dry/configurable/constants'
|
4
|
-
require 'dry/configurable/setting'
|
5
|
-
|
6
|
-
module Dry
|
7
|
-
module Configurable
|
8
|
-
class DSL
|
9
|
-
# @api private
|
10
|
-
class Args
|
11
|
-
# @api private
|
12
|
-
attr_reader :args
|
13
|
-
|
14
|
-
# @api private
|
15
|
-
attr_reader :size
|
16
|
-
|
17
|
-
# @api private
|
18
|
-
attr_reader :opts
|
19
|
-
|
20
|
-
# @api private
|
21
|
-
def initialize(args)
|
22
|
-
@args = args
|
23
|
-
@size = args.size
|
24
|
-
@opts = Setting::OPTIONS
|
25
|
-
end
|
26
|
-
|
27
|
-
# @api private
|
28
|
-
def ensure_valid_options
|
29
|
-
return unless options
|
30
|
-
|
31
|
-
keys = options.keys - opts
|
32
|
-
raise ArgumentError, "Invalid options: #{keys.inspect}" unless keys.empty?
|
33
|
-
end
|
34
|
-
|
35
|
-
# @api private
|
36
|
-
def to_ary
|
37
|
-
[default, options || EMPTY_HASH]
|
38
|
-
end
|
39
|
-
|
40
|
-
# @api private
|
41
|
-
def default
|
42
|
-
if size.equal?(1) && options.nil?
|
43
|
-
args[0]
|
44
|
-
elsif size > 1 && options
|
45
|
-
args[0]
|
46
|
-
else
|
47
|
-
Undefined
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
# @api private
|
52
|
-
def options
|
53
|
-
args.detect { |arg| arg.is_a?(Hash) && (opts & arg.keys).any? }
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|