dry-system 0.18.1 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
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