dry-system 0.24.0 → 0.26.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +25 -0
- data/dry-system.gemspec +2 -3
- data/lib/dry/system/component.rb +8 -4
- data/lib/dry/system/component_dir.rb +6 -1
- data/lib/dry/system/config/component_dir.rb +0 -24
- data/lib/dry/system/config/namespaces.rb +3 -0
- data/lib/dry/system/container.rb +27 -27
- data/lib/dry/system/importer.rb +9 -2
- data/lib/dry/system/manifest_registrar.rb +1 -1
- data/lib/dry/system/provider/source.rb +8 -3
- data/lib/dry/system/version.rb +1 -1
- metadata +11 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3817891e298713d98e37ad2f3fae19f0d63e2aaa0ed7fa43a084f4530a8c97b5
|
4
|
+
data.tar.gz: d438cfec3270bd3abff042fa8a1b145517548300d79159a62be6b82e8f8d8df6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d7a26bf48ab9318e359780ce83f0d2cd3ea541a2546dcc88c8fa0637d801b513bff9b1d8b64ce9c28e7307343ddea66d03f299ae4f1909c775ac1e478e7648af
|
7
|
+
data.tar.gz: 5bc0286acd96dfaca17099c1a29d14417ba547cf4cb286a5f3951aa38bb9527d3ed2a966b959e658222a645f91a39caa094cdd2c63a4c2209f603b575a017792
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,30 @@
|
|
1
1
|
<!--- DO NOT EDIT THIS FILE - IT'S AUTOMATICALLY GENERATED VIA DEVTOOLS --->
|
2
2
|
|
3
|
+
## 0.26.0 2022-10-08
|
4
|
+
|
5
|
+
|
6
|
+
### Changed
|
7
|
+
|
8
|
+
- Update dry-configurable dependency to 0.16.0 and make internal adjustments to suit (@timriley in #249)
|
9
|
+
- Remove now-unused concurrent-ruby gem dependency (@timriley in #250)
|
10
|
+
|
11
|
+
[Compare v0.25.0...v0.26.0](https://github.com/dry-rb/dry-system/compare/v0.25.0...v0.26.0)
|
12
|
+
|
13
|
+
## 0.25.0 2022-07-10
|
14
|
+
|
15
|
+
|
16
|
+
### Fixed
|
17
|
+
|
18
|
+
- Fix incorrect type in `ManifestRegistrar#finalize!` (@alassek)
|
19
|
+
|
20
|
+
### Changed
|
21
|
+
|
22
|
+
- Import root components via `nil` import namespace (via #236) (@timriley)
|
23
|
+
- Allow deeper `Provider::Source` hierarchies (via #240) (@timriley + @solnic)
|
24
|
+
- Prefer local components when importing (via #241) (@timriley + @solnic)
|
25
|
+
|
26
|
+
[Compare v0.24.0...v0.25.0](https://github.com/dry-rb/dry-system/compare/v0.24.0...v0.25.0)
|
27
|
+
|
3
28
|
## 0.24.0
|
4
29
|
|
5
30
|
|
data/dry-system.gemspec
CHANGED
@@ -29,10 +29,9 @@ Gem::Specification.new do |spec|
|
|
29
29
|
spec.required_ruby_version = ">= 2.7.0"
|
30
30
|
|
31
31
|
# to update dependencies edit project.yml
|
32
|
-
spec.add_runtime_dependency "concurrent-ruby", "~> 1.0"
|
33
32
|
spec.add_runtime_dependency "dry-auto_inject", ">= 0.4.0"
|
34
|
-
spec.add_runtime_dependency "dry-configurable", "~> 0.
|
35
|
-
spec.add_runtime_dependency "dry-container", "~> 0.
|
33
|
+
spec.add_runtime_dependency "dry-configurable", "~> 0.16", ">= 0.16.0"
|
34
|
+
spec.add_runtime_dependency "dry-container", "~> 0.10", ">= 0.10.0"
|
36
35
|
spec.add_runtime_dependency "dry-core", "~> 0.5", ">= 0.5"
|
37
36
|
spec.add_runtime_dependency "dry-inflector", "~> 0.1", ">= 0.1.2"
|
38
37
|
|
data/lib/dry/system/component.rb
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "concurrent/map"
|
4
|
-
|
5
3
|
require "dry/core/equalizer"
|
6
4
|
require "dry/inflector"
|
7
5
|
require "dry/system/loader"
|
8
6
|
require "dry/system/errors"
|
9
7
|
require "dry/system/constants"
|
8
|
+
require "pathname"
|
10
9
|
require_relative "identifier"
|
11
10
|
|
12
11
|
module Dry
|
@@ -17,7 +16,7 @@ module Dry
|
|
17
16
|
#
|
18
17
|
# @api public
|
19
18
|
class Component
|
20
|
-
include Dry::Equalizer(:identifier, :namespace, :options)
|
19
|
+
include Dry::Equalizer(:identifier, :file_path, :namespace, :options)
|
21
20
|
|
22
21
|
DEFAULT_OPTIONS = {
|
23
22
|
inflector: Dry::Inflector.new,
|
@@ -28,6 +27,10 @@ module Dry
|
|
28
27
|
# @return [String] the component's unique identifier
|
29
28
|
attr_reader :identifier
|
30
29
|
|
30
|
+
# @!attribute [r] file_path
|
31
|
+
# @return [Pathname] the component's source file path
|
32
|
+
attr_reader :file_path
|
33
|
+
|
31
34
|
# @!attribute [r] namespace
|
32
35
|
# @return [Dry::System::Config::Namespace] the component's namespace
|
33
36
|
attr_reader :namespace
|
@@ -37,8 +40,9 @@ module Dry
|
|
37
40
|
attr_reader :options
|
38
41
|
|
39
42
|
# @api private
|
40
|
-
def initialize(identifier, namespace:, **options)
|
43
|
+
def initialize(identifier, file_path:, namespace:, **options)
|
41
44
|
@identifier = identifier
|
45
|
+
@file_path = Pathname(file_path)
|
42
46
|
@namespace = namespace
|
43
47
|
@options = DEFAULT_OPTIONS.merge(options)
|
44
48
|
end
|
@@ -141,7 +141,12 @@ module Dry
|
|
141
141
|
**MagicCommentsParser.(file_path)
|
142
142
|
}
|
143
143
|
|
144
|
-
Component.new(
|
144
|
+
Component.new(
|
145
|
+
identifier,
|
146
|
+
namespace: namespace,
|
147
|
+
file_path: file_path,
|
148
|
+
**options
|
149
|
+
)
|
145
150
|
end
|
146
151
|
|
147
152
|
def component_options
|
@@ -247,30 +247,6 @@ module Dry
|
|
247
247
|
!!config.auto_register
|
248
248
|
end
|
249
249
|
|
250
|
-
# Returns true if the given setting has been explicitly configured by the user
|
251
|
-
#
|
252
|
-
# This is used when determining whether to apply system-wide default values to a
|
253
|
-
# component dir (explicitly configured settings will not be overridden by
|
254
|
-
# defaults)
|
255
|
-
#
|
256
|
-
# @param key [Symbol] the setting name
|
257
|
-
#
|
258
|
-
# @return [Boolean]
|
259
|
-
#
|
260
|
-
# @see Dry::System::Config::ComponentDirs#apply_defaults_to_dir
|
261
|
-
# @api private
|
262
|
-
def configured?(key)
|
263
|
-
case key
|
264
|
-
when :namespaces
|
265
|
-
# Because we mutate the default value for the `namespaces` setting, rather
|
266
|
-
# than assign a new one, to check if it's configured we must see whether any
|
267
|
-
# namespaces have been added
|
268
|
-
!config.namespaces.empty?
|
269
|
-
else
|
270
|
-
config._settings[key].input_defined?
|
271
|
-
end
|
272
|
-
end
|
273
|
-
|
274
250
|
private
|
275
251
|
|
276
252
|
def method_missing(name, *args, &block)
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "dry/core/deprecations"
|
4
|
+
require "dry/core/equalizer"
|
4
5
|
require "dry/system/errors"
|
5
6
|
require_relative "namespace"
|
6
7
|
|
@@ -13,6 +14,8 @@ module Dry
|
|
13
14
|
#
|
14
15
|
# @api private
|
15
16
|
class Namespaces
|
17
|
+
include Dry::Equalizer(:namespaces)
|
18
|
+
|
16
19
|
# @api private
|
17
20
|
attr_reader :namespaces
|
18
21
|
|
data/lib/dry/system/container.rb
CHANGED
@@ -2,9 +2,9 @@
|
|
2
2
|
|
3
3
|
require "pathname"
|
4
4
|
|
5
|
-
require "dry
|
6
|
-
require "dry
|
7
|
-
require "dry
|
5
|
+
require "dry/configurable"
|
6
|
+
require "dry/auto_inject"
|
7
|
+
require "dry/container"
|
8
8
|
require "dry/core/deprecations"
|
9
9
|
require "dry/inflector"
|
10
10
|
|
@@ -70,12 +70,11 @@ module Dry
|
|
70
70
|
#
|
71
71
|
# @api public
|
72
72
|
class Container
|
73
|
-
extend Dry::Configurable
|
74
73
|
extend Dry::Container::Mixin
|
75
74
|
extend Dry::System::Plugins
|
76
75
|
|
77
76
|
setting :name
|
78
|
-
setting :root, default: Pathname.pwd.freeze, constructor: ->
|
77
|
+
setting :root, default: Pathname.pwd.freeze, constructor: ->(path) { Pathname(path) }
|
79
78
|
setting :provider_dirs, default: ["system/providers"]
|
80
79
|
setting :bootable_dirs # Deprecated for provider_dirs, see .provider_paths below
|
81
80
|
setting :registrations_dir, default: "system/registrations"
|
@@ -87,8 +86,7 @@ module Dry
|
|
87
86
|
setting :provider_registrar, default: Dry::System::ProviderRegistrar
|
88
87
|
setting :importer, default: Dry::System::Importer
|
89
88
|
|
90
|
-
#
|
91
|
-
# user-configurable.
|
89
|
+
# Expect "." as key namespace separator. This is not intended to be user-configurable.
|
92
90
|
config.namespace_separator = KEY_SEPARATOR
|
93
91
|
|
94
92
|
class << self
|
@@ -128,14 +126,7 @@ module Dry
|
|
128
126
|
# @api public
|
129
127
|
def configure(finalize_config: true, &block)
|
130
128
|
super(&block)
|
131
|
-
|
132
|
-
unless configured?
|
133
|
-
hooks[:after_configure].each { |hook| instance_eval(&hook) }
|
134
|
-
config.finalize! if finalize_config
|
135
|
-
@__configured__ = true
|
136
|
-
end
|
137
|
-
|
138
|
-
self
|
129
|
+
configured!(finalize_config: finalize_config)
|
139
130
|
end
|
140
131
|
|
141
132
|
# Marks the container as configured, runs the after-`configured` hooks, then
|
@@ -157,12 +148,19 @@ module Dry
|
|
157
148
|
return self if configured?
|
158
149
|
|
159
150
|
hooks[:after_configure].each { |hook| instance_eval(&hook) }
|
160
|
-
|
151
|
+
|
152
|
+
_configurable_finalize! if finalize_config
|
153
|
+
|
161
154
|
@__configured__ = true
|
162
155
|
|
163
156
|
self
|
164
157
|
end
|
165
158
|
|
159
|
+
# Finalizes the config for this container
|
160
|
+
#
|
161
|
+
# @api private
|
162
|
+
alias_method :_configurable_finalize!, :finalize!
|
163
|
+
|
166
164
|
def configured?
|
167
165
|
@__configured__.equal?(true)
|
168
166
|
end
|
@@ -193,7 +191,7 @@ module Dry
|
|
193
191
|
# @param other [Hash, Dry::Container::Namespace]
|
194
192
|
#
|
195
193
|
# @api public
|
196
|
-
def import(keys: nil, from:
|
194
|
+
def import(keys: nil, from: Undefined, as: Undefined, **deprecated_import_hash)
|
197
195
|
if deprecated_import_hash.any?
|
198
196
|
Dry::Core::Deprecations.announce(
|
199
197
|
"Dry::System::Container.import with {namespace => container} hash",
|
@@ -206,7 +204,7 @@ module Dry
|
|
206
204
|
importer.register(container: container, namespace: namespace)
|
207
205
|
end
|
208
206
|
return self
|
209
|
-
elsif from
|
207
|
+
elsif from == Undefined || as == Undefined
|
210
208
|
# These keyword arguments can become properly required in the params list once
|
211
209
|
# we remove the deprecation shim above
|
212
210
|
raise ArgumentError, "required keyword arguments: :from, :as"
|
@@ -376,10 +374,10 @@ module Dry
|
|
376
374
|
hooks[:before_finalize].each { |hook| instance_eval(&hook) }
|
377
375
|
yield(self) if block
|
378
376
|
|
379
|
-
importer.finalize!
|
380
377
|
providers.finalize!
|
381
|
-
manifest_registrar.finalize!
|
382
378
|
auto_registrar.finalize!
|
379
|
+
manifest_registrar.finalize!
|
380
|
+
importer.finalize!
|
383
381
|
|
384
382
|
@__finalized__ = true
|
385
383
|
|
@@ -659,6 +657,7 @@ module Dry
|
|
659
657
|
|
660
658
|
protected
|
661
659
|
|
660
|
+
# rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity
|
662
661
|
# @api private
|
663
662
|
def load_component(key)
|
664
663
|
return self if registered?(key)
|
@@ -678,11 +677,14 @@ module Dry
|
|
678
677
|
elsif manifest_registrar.file_exists?(component)
|
679
678
|
manifest_registrar.(component)
|
680
679
|
elsif importer.namespace?(component.identifier.root_key)
|
681
|
-
load_imported_component(component.identifier)
|
680
|
+
load_imported_component(component.identifier, namespace: component.identifier.root_key)
|
681
|
+
elsif importer.namespace?(nil)
|
682
|
+
load_imported_component(component.identifier, namespace: nil)
|
682
683
|
end
|
683
684
|
|
684
685
|
self
|
685
686
|
end
|
687
|
+
# rubocop:enable Metrics/AbcSize, Metrics/PerceivedComplexity
|
686
688
|
|
687
689
|
private
|
688
690
|
|
@@ -692,14 +694,12 @@ module Dry
|
|
692
694
|
end
|
693
695
|
end
|
694
696
|
|
695
|
-
def load_imported_component(identifier)
|
696
|
-
|
697
|
-
|
698
|
-
return unless importer.namespace?(import_namespace)
|
697
|
+
def load_imported_component(identifier, namespace:)
|
698
|
+
return unless importer.namespace?(namespace)
|
699
699
|
|
700
|
-
import_key = identifier.namespaced(from:
|
700
|
+
import_key = identifier.namespaced(from: namespace, to: nil).key
|
701
701
|
|
702
|
-
importer.import(
|
702
|
+
importer.import(namespace, keys: [import_key])
|
703
703
|
end
|
704
704
|
|
705
705
|
def find_component(key)
|
data/lib/dry/system/importer.rb
CHANGED
@@ -84,7 +84,7 @@ module Dry
|
|
84
84
|
end
|
85
85
|
|
86
86
|
def import_keys(other, namespace, keys)
|
87
|
-
|
87
|
+
merge(container, build_merge_container(other, keys), namespace: namespace)
|
88
88
|
end
|
89
89
|
|
90
90
|
def import_all(other, namespace)
|
@@ -95,7 +95,14 @@ module Dry
|
|
95
95
|
build_merge_container(other.finalize!, other.keys)
|
96
96
|
end
|
97
97
|
|
98
|
-
|
98
|
+
merge(container, merge_container, namespace: namespace)
|
99
|
+
end
|
100
|
+
|
101
|
+
# Merges `other` into `container`, favoring the container's existing registrations
|
102
|
+
def merge(container, other, namespace:)
|
103
|
+
container.merge(other, namespace: namespace) { |_key, old_item, new_item|
|
104
|
+
old_item || new_item
|
105
|
+
}
|
99
106
|
end
|
100
107
|
|
101
108
|
def build_merge_container(other, keys)
|
@@ -53,9 +53,14 @@ module Dry
|
|
53
53
|
def inherited(subclass)
|
54
54
|
super
|
55
55
|
|
56
|
-
#
|
57
|
-
#
|
58
|
-
|
56
|
+
# Include Dry::Configurable only when first subclassing to ensure that
|
57
|
+
# distinct Source subclasses do not share settings.
|
58
|
+
#
|
59
|
+
# The superclass check here allows deeper Source class hierarchies to be
|
60
|
+
# created without running into a Dry::Configurable::AlreadyIncluded error.
|
61
|
+
if subclass.superclass == Source
|
62
|
+
subclass.include Dry::Configurable
|
63
|
+
end
|
59
64
|
end
|
60
65
|
|
61
66
|
# @api private
|
data/lib/dry/system/version.rb
CHANGED
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dry-system
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.26.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Solnica
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-10-08 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-auto_inject
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,40 +30,40 @@ dependencies:
|
|
44
30
|
requirements:
|
45
31
|
- - "~>"
|
46
32
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0.
|
33
|
+
version: '0.16'
|
48
34
|
- - ">="
|
49
35
|
- !ruby/object:Gem::Version
|
50
|
-
version: 0.
|
36
|
+
version: 0.16.0
|
51
37
|
type: :runtime
|
52
38
|
prerelease: false
|
53
39
|
version_requirements: !ruby/object:Gem::Requirement
|
54
40
|
requirements:
|
55
41
|
- - "~>"
|
56
42
|
- !ruby/object:Gem::Version
|
57
|
-
version: '0.
|
43
|
+
version: '0.16'
|
58
44
|
- - ">="
|
59
45
|
- !ruby/object:Gem::Version
|
60
|
-
version: 0.
|
46
|
+
version: 0.16.0
|
61
47
|
- !ruby/object:Gem::Dependency
|
62
48
|
name: dry-container
|
63
49
|
requirement: !ruby/object:Gem::Requirement
|
64
50
|
requirements:
|
65
51
|
- - "~>"
|
66
52
|
- !ruby/object:Gem::Version
|
67
|
-
version: '0.
|
53
|
+
version: '0.10'
|
68
54
|
- - ">="
|
69
55
|
- !ruby/object:Gem::Version
|
70
|
-
version: 0.
|
56
|
+
version: 0.10.0
|
71
57
|
type: :runtime
|
72
58
|
prerelease: false
|
73
59
|
version_requirements: !ruby/object:Gem::Requirement
|
74
60
|
requirements:
|
75
61
|
- - "~>"
|
76
62
|
- !ruby/object:Gem::Version
|
77
|
-
version: '0.
|
63
|
+
version: '0.10'
|
78
64
|
- - ">="
|
79
65
|
- !ruby/object:Gem::Version
|
80
|
-
version: 0.
|
66
|
+
version: 0.10.0
|
81
67
|
- !ruby/object:Gem::Dependency
|
82
68
|
name: dry-core
|
83
69
|
requirement: !ruby/object:Gem::Requirement
|
@@ -236,7 +222,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
236
222
|
- !ruby/object:Gem::Version
|
237
223
|
version: '0'
|
238
224
|
requirements: []
|
239
|
-
rubygems_version: 3.
|
225
|
+
rubygems_version: 3.3.7
|
240
226
|
signing_key:
|
241
227
|
specification_version: 4
|
242
228
|
summary: Organize your code into reusable components
|