dry-system 0.18.1 → 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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +678 -0
  3. data/LICENSE +1 -1
  4. data/README.md +5 -4
  5. data/dry-system.gemspec +18 -21
  6. data/lib/dry/system/auto_registrar.rb +9 -64
  7. data/lib/dry/system/component.rb +124 -104
  8. data/lib/dry/system/component_dir.rb +171 -0
  9. data/lib/dry/system/config/component_dir.rb +228 -0
  10. data/lib/dry/system/config/component_dirs.rb +289 -0
  11. data/lib/dry/system/config/namespace.rb +75 -0
  12. data/lib/dry/system/config/namespaces.rb +196 -0
  13. data/lib/dry/system/constants.rb +2 -4
  14. data/lib/dry/system/container.rb +305 -345
  15. data/lib/dry/system/errors.rb +73 -56
  16. data/lib/dry/system/identifier.rb +176 -0
  17. data/lib/dry/system/importer.rb +89 -12
  18. data/lib/dry/system/indirect_component.rb +63 -0
  19. data/lib/dry/system/loader/autoloading.rb +24 -0
  20. data/lib/dry/system/loader.rb +49 -41
  21. data/lib/dry/system/{manual_registrar.rb → manifest_registrar.rb} +13 -14
  22. data/lib/dry/system/plugins/bootsnap.rb +3 -2
  23. data/lib/dry/system/plugins/dependency_graph/strategies.rb +38 -2
  24. data/lib/dry/system/plugins/dependency_graph.rb +25 -21
  25. data/lib/dry/system/plugins/env.rb +3 -2
  26. data/lib/dry/system/plugins/logging.rb +9 -8
  27. data/lib/dry/system/plugins/monitoring.rb +1 -2
  28. data/lib/dry/system/plugins/notifications.rb +1 -1
  29. data/lib/dry/system/plugins/plugin.rb +61 -0
  30. data/lib/dry/system/plugins/zeitwerk/compat_inflector.rb +22 -0
  31. data/lib/dry/system/plugins/zeitwerk.rb +109 -0
  32. data/lib/dry/system/plugins.rb +5 -73
  33. data/lib/dry/system/provider/source.rb +276 -0
  34. data/lib/dry/system/provider/source_dsl.rb +55 -0
  35. data/lib/dry/system/provider.rb +261 -23
  36. data/lib/dry/system/provider_registrar.rb +251 -0
  37. data/lib/dry/system/provider_source_registry.rb +56 -0
  38. data/lib/dry/system/provider_sources/settings/config.rb +73 -0
  39. data/lib/dry/system/provider_sources/settings/loader.rb +44 -0
  40. data/lib/dry/system/provider_sources/settings.rb +40 -0
  41. data/lib/dry/system/provider_sources.rb +5 -0
  42. data/lib/dry/system/stubs.rb +6 -2
  43. data/lib/dry/system/version.rb +1 -1
  44. data/lib/dry/system.rb +35 -13
  45. metadata +48 -97
  46. data/lib/dry/system/auto_registrar/configuration.rb +0 -43
  47. data/lib/dry/system/booter/component_registry.rb +0 -35
  48. data/lib/dry/system/booter.rb +0 -181
  49. data/lib/dry/system/components/bootable.rb +0 -289
  50. data/lib/dry/system/components/config.rb +0 -35
  51. data/lib/dry/system/components.rb +0 -8
  52. data/lib/dry/system/lifecycle.rb +0 -135
  53. data/lib/dry/system/provider_registry.rb +0 -27
  54. data/lib/dry/system/settings/file_loader.rb +0 -30
  55. data/lib/dry/system/settings/file_parser.rb +0 -51
  56. data/lib/dry/system/settings.rb +0 -67
  57. data/lib/dry/system/system_components/settings.rb +0 -11
metadata CHANGED
@@ -1,22 +1,25 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-system
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.1
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-25 00:00:00.000000000 Z
11
+ date: 2022-11-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: concurrent-ruby
14
+ name: dry-auto_inject
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '2'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -24,128 +27,69 @@ dependencies:
24
27
  - - "~>"
25
28
  - !ruby/object:Gem::Version
26
29
  version: '1.0'
27
- - !ruby/object:Gem::Dependency
28
- name: dry-auto_inject
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: 0.4.0
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
30
+ - - "<"
39
31
  - !ruby/object:Gem::Version
40
- version: 0.4.0
32
+ version: '2'
41
33
  - !ruby/object:Gem::Dependency
42
34
  name: dry-configurable
43
35
  requirement: !ruby/object:Gem::Requirement
44
36
  requirements:
45
37
  - - "~>"
46
38
  - !ruby/object:Gem::Version
47
- version: '0.11'
48
- - - ">="
49
- - !ruby/object:Gem::Version
50
- version: 0.11.1
51
- type: :runtime
52
- prerelease: false
53
- version_requirements: !ruby/object:Gem::Requirement
54
- requirements:
55
- - - "~>"
56
- - !ruby/object:Gem::Version
57
- version: '0.11'
58
- - - ">="
59
- - !ruby/object:Gem::Version
60
- version: 0.11.1
61
- - !ruby/object:Gem::Dependency
62
- name: dry-container
63
- requirement: !ruby/object:Gem::Requirement
64
- requirements:
65
- - - "~>"
66
- - !ruby/object:Gem::Version
67
- version: '0.7'
68
- - - ">="
39
+ version: '1.0'
40
+ - - "<"
69
41
  - !ruby/object:Gem::Version
70
- version: 0.7.2
42
+ version: '2'
71
43
  type: :runtime
72
44
  prerelease: false
73
45
  version_requirements: !ruby/object:Gem::Requirement
74
46
  requirements:
75
47
  - - "~>"
76
48
  - !ruby/object:Gem::Version
77
- version: '0.7'
78
- - - ">="
49
+ version: '1.0'
50
+ - - "<"
79
51
  - !ruby/object:Gem::Version
80
- version: 0.7.2
52
+ version: '2'
81
53
  - !ruby/object:Gem::Dependency
82
54
  name: dry-core
83
55
  requirement: !ruby/object:Gem::Requirement
84
56
  requirements:
85
57
  - - "~>"
86
58
  - !ruby/object:Gem::Version
87
- version: '0.3'
88
- - - ">="
59
+ version: '1.0'
60
+ - - "<"
89
61
  - !ruby/object:Gem::Version
90
- version: 0.3.1
62
+ version: '2'
91
63
  type: :runtime
92
64
  prerelease: false
93
65
  version_requirements: !ruby/object:Gem::Requirement
94
66
  requirements:
95
67
  - - "~>"
96
68
  - !ruby/object:Gem::Version
97
- version: '0.3'
98
- - - ">="
99
- - !ruby/object:Gem::Version
100
- version: 0.3.1
101
- - !ruby/object:Gem::Dependency
102
- name: dry-equalizer
103
- requirement: !ruby/object:Gem::Requirement
104
- requirements:
105
- - - "~>"
106
- - !ruby/object:Gem::Version
107
- version: '0.2'
108
- type: :runtime
109
- prerelease: false
110
- version_requirements: !ruby/object:Gem::Requirement
111
- requirements:
112
- - - "~>"
69
+ version: '1.0'
70
+ - - "<"
113
71
  - !ruby/object:Gem::Version
114
- version: '0.2'
72
+ version: '2'
115
73
  - !ruby/object:Gem::Dependency
116
74
  name: dry-inflector
117
75
  requirement: !ruby/object:Gem::Requirement
118
76
  requirements:
119
77
  - - "~>"
120
78
  - !ruby/object:Gem::Version
121
- version: '0.1'
122
- - - ">="
79
+ version: '1.0'
80
+ - - "<"
123
81
  - !ruby/object:Gem::Version
124
- version: 0.1.2
82
+ version: '2'
125
83
  type: :runtime
126
84
  prerelease: false
127
85
  version_requirements: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: '0.1'
132
- - - ">="
133
- - !ruby/object:Gem::Version
134
- version: 0.1.2
135
- - !ruby/object:Gem::Dependency
136
- name: dry-struct
137
- requirement: !ruby/object:Gem::Requirement
138
86
  requirements:
139
87
  - - "~>"
140
88
  - !ruby/object:Gem::Version
141
89
  version: '1.0'
142
- type: :runtime
143
- prerelease: false
144
- version_requirements: !ruby/object:Gem::Requirement
145
- requirements:
146
- - - "~>"
90
+ - - "<"
147
91
  - !ruby/object:Gem::Version
148
- version: '1.0'
92
+ version: '2'
149
93
  - !ruby/object:Gem::Dependency
150
94
  name: bundler
151
95
  requirement: !ruby/object:Gem::Requirement
@@ -202,21 +146,22 @@ files:
202
146
  - lib/dry-system.rb
203
147
  - lib/dry/system.rb
204
148
  - lib/dry/system/auto_registrar.rb
205
- - lib/dry/system/auto_registrar/configuration.rb
206
- - lib/dry/system/booter.rb
207
- - lib/dry/system/booter/component_registry.rb
208
149
  - lib/dry/system/component.rb
209
- - lib/dry/system/components.rb
210
- - lib/dry/system/components/bootable.rb
211
- - lib/dry/system/components/config.rb
150
+ - lib/dry/system/component_dir.rb
151
+ - lib/dry/system/config/component_dir.rb
152
+ - lib/dry/system/config/component_dirs.rb
153
+ - lib/dry/system/config/namespace.rb
154
+ - lib/dry/system/config/namespaces.rb
212
155
  - lib/dry/system/constants.rb
213
156
  - lib/dry/system/container.rb
214
157
  - lib/dry/system/errors.rb
158
+ - lib/dry/system/identifier.rb
215
159
  - lib/dry/system/importer.rb
216
- - lib/dry/system/lifecycle.rb
160
+ - lib/dry/system/indirect_component.rb
217
161
  - lib/dry/system/loader.rb
162
+ - lib/dry/system/loader/autoloading.rb
218
163
  - lib/dry/system/magic_comments_parser.rb
219
- - lib/dry/system/manual_registrar.rb
164
+ - lib/dry/system/manifest_registrar.rb
220
165
  - lib/dry/system/plugins.rb
221
166
  - lib/dry/system/plugins/bootsnap.rb
222
167
  - lib/dry/system/plugins/dependency_graph.rb
@@ -226,20 +171,26 @@ files:
226
171
  - lib/dry/system/plugins/monitoring.rb
227
172
  - lib/dry/system/plugins/monitoring/proxy.rb
228
173
  - lib/dry/system/plugins/notifications.rb
174
+ - lib/dry/system/plugins/plugin.rb
175
+ - lib/dry/system/plugins/zeitwerk.rb
176
+ - lib/dry/system/plugins/zeitwerk/compat_inflector.rb
229
177
  - lib/dry/system/provider.rb
230
- - lib/dry/system/provider_registry.rb
231
- - lib/dry/system/settings.rb
232
- - lib/dry/system/settings/file_loader.rb
233
- - lib/dry/system/settings/file_parser.rb
178
+ - lib/dry/system/provider/source.rb
179
+ - lib/dry/system/provider/source_dsl.rb
180
+ - lib/dry/system/provider_registrar.rb
181
+ - lib/dry/system/provider_source_registry.rb
182
+ - lib/dry/system/provider_sources.rb
183
+ - lib/dry/system/provider_sources/settings.rb
184
+ - lib/dry/system/provider_sources/settings/config.rb
185
+ - lib/dry/system/provider_sources/settings/loader.rb
234
186
  - lib/dry/system/stubs.rb
235
- - lib/dry/system/system_components/settings.rb
236
187
  - lib/dry/system/version.rb
237
188
  homepage: https://dry-rb.org/gems/dry-system
238
189
  licenses:
239
190
  - MIT
240
191
  metadata:
241
192
  allowed_push_host: https://rubygems.org
242
- changelog_uri: https://github.com/dry-rb/dry-system/blob/master/CHANGELOG.md
193
+ changelog_uri: https://github.com/dry-rb/dry-system/blob/main/CHANGELOG.md
243
194
  source_code_uri: https://github.com/dry-rb/dry-system
244
195
  bug_tracker_uri: https://github.com/dry-rb/dry-system/issues
245
196
  post_install_message:
@@ -250,14 +201,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
250
201
  requirements:
251
202
  - - ">="
252
203
  - !ruby/object:Gem::Version
253
- version: 2.4.0
204
+ version: 2.7.0
254
205
  required_rubygems_version: !ruby/object:Gem::Requirement
255
206
  requirements:
256
207
  - - ">="
257
208
  - !ruby/object:Gem::Version
258
209
  version: '0'
259
210
  requirements: []
260
- rubygems_version: 3.0.3
211
+ rubygems_version: 3.1.6
261
212
  signing_key:
262
213
  specification_version: 4
263
214
  summary: Organize your code into reusable components
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Dry
4
- module System
5
- class AutoRegistrar
6
- # Default auto_registrar configuration
7
- #
8
- # This is currently configured by default for every System::Container.
9
- # Configuration allows to define custom initialization as well as exclusion
10
- # logic, for each component that is being registered by Dry::System
11
- # auto-registration.
12
- #
13
- # @api private
14
- class Configuration
15
- DEFAULT_INSTANCE = -> component { component.instance }.freeze
16
- FALSE_PROC = -> * { false }.freeze
17
-
18
- def self.setting(name)
19
- define_method(name) do |&block|
20
- ivar = "@#{name}"
21
- if block
22
- instance_variable_set(ivar, block)
23
- else
24
- instance_variable_get(ivar)
25
- end
26
- end
27
- end
28
-
29
- setting :exclude
30
- setting :instance
31
-
32
- attr_accessor :memoize
33
-
34
- # @api private
35
- def initialize
36
- @instance = DEFAULT_INSTANCE
37
- @exclude = FALSE_PROC
38
- @memoize = false
39
- end
40
- end
41
- end
42
- end
43
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Dry
4
- module System
5
- class Booter
6
- class ComponentRegistry
7
- include Enumerable
8
-
9
- attr_reader :components
10
-
11
- def initialize
12
- @components = []
13
- end
14
-
15
- def each(&block)
16
- components.each(&block)
17
- end
18
-
19
- def register(component)
20
- @components << component
21
- end
22
-
23
- def exists?(name)
24
- components.any? { |component| component.identifier == name }
25
- end
26
-
27
- def [](name)
28
- component = components.detect { |component| component.identifier == name }
29
-
30
- component || raise(InvalidComponentIdentifierError, name)
31
- end
32
- end
33
- end
34
- end
35
- end
@@ -1,181 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "dry/system/components/bootable"
4
- require "dry/system/errors"
5
- require "dry/system/constants"
6
- require "dry/system/lifecycle"
7
- require "dry/system/booter/component_registry"
8
- require "pathname"
9
-
10
- module Dry
11
- module System
12
- # Default booter implementation
13
- #
14
- # This is currently configured by default for every System::Container.
15
- # Booter objects are responsible for loading system/boot files and expose
16
- # an API for calling lifecycle triggers.
17
- #
18
- # @api private
19
- class Booter
20
- attr_reader :paths
21
-
22
- attr_reader :booted
23
-
24
- attr_reader :components
25
-
26
- # @api private
27
- def initialize(paths)
28
- @paths = paths
29
- @booted = []
30
- @components = ComponentRegistry.new
31
- end
32
-
33
- # @api private
34
- def bootable?(component)
35
- !boot_file(component).nil?
36
- end
37
-
38
- # @api private
39
- def register_component(component)
40
- components.register(component)
41
- self
42
- end
43
-
44
- # @api private
45
- def finalize!
46
- boot_files.each do |path|
47
- load_component(path)
48
- end
49
-
50
- components.each do |component|
51
- start(component)
52
- end
53
-
54
- freeze
55
- end
56
-
57
- # @api private
58
- def shutdown
59
- components.each do |component|
60
- next unless booted.include?(component)
61
-
62
- stop(component)
63
- end
64
- end
65
-
66
- # @api private
67
- def init(name_or_component)
68
- with_component(name_or_component) do |component|
69
- call(component) do
70
- component.init.finalize
71
- yield if block_given?
72
- end
73
-
74
- self
75
- end
76
- end
77
-
78
- # @api private
79
- def start(name_or_component)
80
- with_component(name_or_component) do |component|
81
- return self if booted.include?(component)
82
-
83
- init(name_or_component) do
84
- component.start
85
- end
86
-
87
- booted << component.finalize
88
-
89
- self
90
- end
91
- end
92
-
93
- # @api private
94
- def stop(name_or_component)
95
- call(name_or_component) do |component|
96
- raise ComponentNotStartedError, name_or_component unless booted.include?(component)
97
-
98
- component.stop
99
- booted.delete(component)
100
-
101
- yield if block_given?
102
- end
103
- end
104
-
105
- # @api private
106
- def call(name_or_component)
107
- with_component(name_or_component) do |component|
108
- raise ComponentFileMismatchError, name unless component
109
-
110
- yield(component) if block_given?
111
-
112
- component
113
- end
114
- end
115
-
116
- # @api private
117
- def boot_dependency(component)
118
- boot_file = boot_file(component)
119
-
120
- start(boot_file.basename(".*").to_s.to_sym) if boot_file
121
- end
122
-
123
- # @api private
124
- def boot_files
125
- @boot_files ||= paths.each_with_object([[], []]) { |path, (boot_files, loaded)|
126
- files = Dir["#{path}/#{RB_GLOB}"].sort
127
-
128
- files.each do |file|
129
- basename = File.basename(file)
130
-
131
- unless loaded.include?(basename)
132
- boot_files << Pathname(file)
133
- loaded << basename
134
- end
135
- end
136
- }.first
137
- end
138
-
139
- private
140
-
141
- def with_component(id_or_component)
142
- component =
143
- case id_or_component
144
- when Symbol
145
- require_boot_file(id_or_component) unless components.exists?(id_or_component)
146
- components[id_or_component]
147
- when Components::Bootable
148
- id_or_component
149
- end
150
-
151
- raise InvalidComponentError, id_or_component unless component
152
-
153
- yield(component)
154
- end
155
-
156
- def load_component(path)
157
- identifier = Pathname(path).basename(RB_EXT).to_s.to_sym
158
-
159
- Kernel.require path unless components.exists?(identifier)
160
-
161
- self
162
- end
163
-
164
- def boot_file(name)
165
- name = name.respond_to?(:root_key) ? name.root_key.to_s : name
166
-
167
- find_boot_file(name)
168
- end
169
-
170
- def require_boot_file(identifier)
171
- boot_file = find_boot_file(identifier)
172
-
173
- Kernel.require boot_file if boot_file
174
- end
175
-
176
- def find_boot_file(name)
177
- boot_files.detect { |file| File.basename(file, RB_EXT) == name.to_s }
178
- end
179
- end
180
- end
181
- end