dry-system 0.7.3 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +17 -0
  3. data/lib/dry/system.rb +24 -0
  4. data/lib/dry/system/booter.rb +75 -43
  5. data/lib/dry/system/booter/component_registry.rb +37 -0
  6. data/lib/dry/system/component.rb +9 -4
  7. data/lib/dry/system/components.rb +6 -0
  8. data/lib/dry/system/components/bootable.rb +307 -0
  9. data/lib/dry/system/components/config.rb +33 -0
  10. data/lib/dry/system/constants.rb +2 -0
  11. data/lib/dry/system/container.rb +69 -22
  12. data/lib/dry/system/errors.rb +2 -2
  13. data/lib/dry/system/lifecycle.rb +40 -7
  14. data/lib/dry/system/provider.rb +46 -0
  15. data/lib/dry/system/provider_registry.rb +25 -0
  16. data/lib/dry/system/settings.rb +59 -0
  17. data/lib/dry/system/settings/file_loader.rb +28 -0
  18. data/lib/dry/system/settings/file_parser.rb +49 -0
  19. data/lib/dry/system/system_components/settings.rb +9 -0
  20. data/lib/dry/system/version.rb +1 -1
  21. metadata +27 -144
  22. data/.gitignore +0 -39
  23. data/.rspec +0 -3
  24. data/.travis.yml +0 -22
  25. data/.yardopts +0 -5
  26. data/CONTRIBUTING.md +0 -29
  27. data/Gemfile +0 -9
  28. data/Rakefile +0 -12
  29. data/dry-system.gemspec +0 -31
  30. data/examples/custom_configuration_auto_register/Gemfile +0 -5
  31. data/examples/custom_configuration_auto_register/lib/entities/user.rb +0 -7
  32. data/examples/custom_configuration_auto_register/lib/user_repo.rb +0 -5
  33. data/examples/custom_configuration_auto_register/run.rb +0 -8
  34. data/examples/custom_configuration_auto_register/system/boot/persistence.rb +0 -13
  35. data/examples/custom_configuration_auto_register/system/container.rb +0 -16
  36. data/examples/custom_configuration_auto_register/system/import.rb +0 -3
  37. data/examples/standalone/Gemfile +0 -5
  38. data/examples/standalone/lib/user_repo.rb +0 -5
  39. data/examples/standalone/run.rb +0 -8
  40. data/examples/standalone/system/boot/persistence.rb +0 -13
  41. data/examples/standalone/system/container.rb +0 -9
  42. data/examples/standalone/system/import.rb +0 -3
  43. data/spec/fixtures/components/bar.rb +0 -5
  44. data/spec/fixtures/components/bar/baz.rb +0 -4
  45. data/spec/fixtures/components/foo.rb +0 -2
  46. data/spec/fixtures/components/no_register.rb +0 -4
  47. data/spec/fixtures/import_test/config/application.yml +0 -2
  48. data/spec/fixtures/import_test/lib/test/bar.rb +0 -4
  49. data/spec/fixtures/import_test/lib/test/foo.rb +0 -5
  50. data/spec/fixtures/import_test/system/boot/bar.rb +0 -11
  51. data/spec/fixtures/lazytest/config/application.yml +0 -2
  52. data/spec/fixtures/lazytest/lib/test/dep.rb +0 -4
  53. data/spec/fixtures/lazytest/lib/test/foo.rb +0 -5
  54. data/spec/fixtures/lazytest/lib/test/models.rb +0 -4
  55. data/spec/fixtures/lazytest/lib/test/models/book.rb +0 -6
  56. data/spec/fixtures/lazytest/lib/test/models/user.rb +0 -6
  57. data/spec/fixtures/lazytest/system/boot/bar.rb +0 -15
  58. data/spec/fixtures/magic_comments/comments.rb +0 -17
  59. data/spec/fixtures/manual_registration/container/foo.rb +0 -6
  60. data/spec/fixtures/manual_registration/lib/test/foo.rb +0 -9
  61. data/spec/fixtures/multiple_namespaced_components/multiple/level/baz.rb +0 -7
  62. data/spec/fixtures/multiple_namespaced_components/multiple/level/foz.rb +0 -6
  63. data/spec/fixtures/namespaced_components/namespaced/bar.rb +0 -5
  64. data/spec/fixtures/namespaced_components/namespaced/foo.rb +0 -4
  65. data/spec/fixtures/other/config/boot/bar.rb +0 -11
  66. data/spec/fixtures/other/config/boot/hell.rb +0 -3
  67. data/spec/fixtures/other/lib/test/dep.rb +0 -4
  68. data/spec/fixtures/other/lib/test/foo.rb +0 -5
  69. data/spec/fixtures/other/lib/test/models.rb +0 -4
  70. data/spec/fixtures/other/lib/test/models/book.rb +0 -6
  71. data/spec/fixtures/other/lib/test/models/user.rb +0 -6
  72. data/spec/fixtures/stubbing/lib/test/car.rb +0 -7
  73. data/spec/fixtures/stubbing/system/boot/db.rb +0 -8
  74. data/spec/fixtures/test/config/application.yml +0 -2
  75. data/spec/fixtures/test/config/subapp.yml +0 -2
  76. data/spec/fixtures/test/lib/test/dep.rb +0 -4
  77. data/spec/fixtures/test/lib/test/foo.rb +0 -5
  78. data/spec/fixtures/test/lib/test/models.rb +0 -4
  79. data/spec/fixtures/test/lib/test/models/book.rb +0 -6
  80. data/spec/fixtures/test/lib/test/models/user.rb +0 -6
  81. data/spec/fixtures/test/lib/test/singleton_dep.rb +0 -7
  82. data/spec/fixtures/test/log/.gitkeep +0 -0
  83. data/spec/fixtures/test/system/boot/bar.rb +0 -11
  84. data/spec/fixtures/test/system/boot/client.rb +0 -7
  85. data/spec/fixtures/test/system/boot/db.rb +0 -1
  86. data/spec/fixtures/test/system/boot/hell.rb +0 -3
  87. data/spec/fixtures/test/system/boot/logger.rb +0 -5
  88. data/spec/fixtures/umbrella/system/boot/db.rb +0 -10
  89. data/spec/integration/boot_spec.rb +0 -18
  90. data/spec/integration/container/lazy_loading/manual_registration_spec.rb +0 -18
  91. data/spec/integration/import_spec.rb +0 -81
  92. data/spec/spec_helper.rb +0 -48
  93. data/spec/unit/auto_registrar/configuration_spec.rb +0 -26
  94. data/spec/unit/component_spec.rb +0 -121
  95. data/spec/unit/container/auto_register_spec.rb +0 -113
  96. data/spec/unit/container/config_spec.rb +0 -38
  97. data/spec/unit/container/finalize_spec.rb +0 -97
  98. data/spec/unit/container/import_spec.rb +0 -53
  99. data/spec/unit/container/injector_spec.rb +0 -29
  100. data/spec/unit/container_spec.rb +0 -244
  101. data/spec/unit/loader_spec.rb +0 -64
  102. data/spec/unit/magic_comments_parser_spec.rb +0 -41
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 94d4f0b0085ef8e7edf3938fe94d39f4c26d2ea9
4
- data.tar.gz: 15a9499b38c9d1a8ef109728d86b577616dad388
3
+ metadata.gz: e2b3c4fc9aed09b6920d6c285df0407e8cb506f2
4
+ data.tar.gz: 5034704e210f09cae4f54e7ddb67371fc31bba31
5
5
  SHA512:
6
- metadata.gz: 4979edbd2d31b3039bc25438a2340462ce94e946e9ceeded7003c488e8322209a07b1d58ccfd5419a922ac1a96cf326bf8dddc5fa22069b82387e9578564a944
7
- data.tar.gz: 887221bf029d0b6cf26f32e06ff8ac8d642e9cdc289cf8428351f8185a73161900ee26ee762d778f1912c0f7926c936e397cef28db3afb4b2d2c5ddda38518de
6
+ metadata.gz: cff3f64d9fe0762d3e59893caf4f8e7f85da8b17ed40f7b6970a4518950e1ab60ad99531ae20383c10915ed296895df21a149f872a3d8dc0da214f7ed5caeabc
7
+ data.tar.gz: 51092e33d452c9008ddba0a384a989420287c9fce19f730b85f5903a99f7da5f4b4aa626ee4c83d693434135f8793b33aea7df037682b408f8fcfe1b751a3e00
data/CHANGELOG.md CHANGED
@@ -1,3 +1,20 @@
1
+ # 0.8.0 - 2017-10-16
2
+
3
+ ### Added
4
+
5
+ * Support for external bootable components (solnic)
6
+ * Built-in `:system` components including `:settings` component (solnic)
7
+
8
+ ### Fixed
9
+
10
+ * Lazy-loading components work when a container has `default_namespace` configured (GustavoCaso)
11
+
12
+ ### Changed
13
+
14
+ * [BREAKING] Improved boot DSL with support for namespacing and lifecycle before/after callbacks (solnic)
15
+
16
+ [Compare v0.7.3...v0.8.0](https://github.com/dry-rb/dry-system/compare/v0.7.3...v0.8.0)
17
+
1
18
  # 0.7.3 - 2017-08-02
2
19
 
3
20
  ### Fixed
data/lib/dry/system.rb CHANGED
@@ -1,4 +1,28 @@
1
+ require 'dry/system/provider'
2
+ require 'dry/system/provider_registry'
3
+
1
4
  module Dry
2
5
  module System
6
+ # Register external component provider
7
+ #
8
+ # @api public
9
+ def self.register_provider(identifier, options)
10
+ providers.register(identifier, options)
11
+ providers[identifier].load_components
12
+ self
13
+ end
14
+
15
+ # Register an external component that can be booted within other systems
16
+ #
17
+ # @api public
18
+ def self.register_component(identifier, provider:, &block)
19
+ providers[provider].register_component(identifier, block)
20
+ self
21
+ end
22
+
23
+ # @api private
24
+ def self.providers
25
+ @__providers__ ||= ProviderRegistry.new
26
+ end
3
27
  end
4
28
  end
@@ -1,5 +1,7 @@
1
+ require 'dry/system/components/bootable'
1
2
  require 'dry/system/errors'
2
3
  require 'dry/system/lifecycle'
4
+ require 'dry/system/booter/component_registry'
3
5
 
4
6
  module Dry
5
7
  module System
@@ -13,93 +15,123 @@ module Dry
13
15
  class Booter
14
16
  attr_reader :path
15
17
 
16
- attr_reader :finalizers
17
-
18
18
  attr_reader :booted
19
19
 
20
+ attr_reader :components
21
+
20
22
  # @api private
21
23
  def initialize(path)
22
24
  @path = path
23
- @booted = {}
24
- @finalizers = {}
25
+ @booted = []
26
+ @components = ComponentRegistry.new
25
27
  end
26
28
 
27
29
  # @api private
28
- def []=(name, fn)
29
- @finalizers[name] = fn
30
+ def register_component(component)
31
+ components.register(component)
30
32
  self
31
33
  end
32
34
 
33
35
  # @api private
34
- def finalize!
35
- Dir[boot_files].each do |path|
36
- start(File.basename(path, '.rb').to_sym)
36
+ def load_component(path)
37
+ identifier = Pathname(path).basename('.rb').to_s.to_sym
38
+
39
+ unless components.exists?(identifier)
40
+ require path
37
41
  end
38
- freeze
42
+
43
+ self
39
44
  end
40
45
 
41
46
  # @api private
42
- def init(name)
43
- Kernel.require(path.join(name.to_s))
47
+ def finalize!
48
+ boot_files.each do |path|
49
+ load_component(path)
50
+ end
44
51
 
45
- call(name) do |lifecycle|
46
- lifecycle.(:init)
47
- yield(lifecycle) if block_given?
52
+ components.each do |component|
53
+ start(component)
48
54
  end
49
55
 
50
- self
56
+ freeze
51
57
  end
52
58
 
53
59
  # @api private
54
- def start(name)
55
- check_component_identifier(name)
60
+ def init(name_or_component)
61
+ with_component(name_or_component) do |component|
62
+ call(component) do
63
+ component.init
64
+ yield if block_given?
65
+ end
66
+
67
+ self
68
+ end
69
+ end
56
70
 
57
- return self if booted.key?(name)
71
+ # @api private
72
+ def start(name_or_component)
73
+ with_component(name_or_component) do |component|
74
+ return self if booted.include?(component)
58
75
 
59
- init(name) { |lifecycle| lifecycle.(:start) }
60
- booted[name] = true
76
+ init(name_or_component) do
77
+ component.start
78
+ end
61
79
 
62
- self
80
+ booted << component.finalize
81
+
82
+ self
83
+ end
63
84
  end
64
85
 
65
86
  # @api private
66
- def call(name)
67
- container, finalizer = finalizers[name]
87
+ def call(name_or_component)
88
+ with_component(name_or_component) do |component|
89
+ unless component
90
+ raise ComponentFileMismatchError.new(name, registered_booted_keys)
91
+ end
68
92
 
69
- raise ComponentFileMismatchError.new(name, registered_booted_keys) unless finalizer
93
+ yield(component) if block_given?
70
94
 
71
- lifecycle = Lifecycle.new(container, &finalizer)
72
- yield(lifecycle) if block_given?
73
- lifecycle
95
+ component
96
+ end
74
97
  end
75
98
 
76
99
  # @api private
77
- def boot_dependency(component)
78
- boot_file = component.boot_file(path)
79
- start(boot_file.basename('.*').to_s.to_sym) if boot_file.exist?
100
+ def lifecycle_container(container)
101
+ LifecycleContainer.new(container)
80
102
  end
81
103
 
82
- private
104
+ # @api private
105
+ def with_component(id_or_component)
106
+ component =
107
+ case id_or_component
108
+ when Symbol
109
+ require_boot_file(id_or_component) unless components.exists?(id_or_component)
110
+ components[id_or_component]
111
+ when Components::Bootable
112
+ id_or_component
113
+ end
114
+
115
+ raise InvalidComponentError, id_or_component unless component
116
+
117
+ yield(component)
118
+ end
83
119
 
84
120
  # @api private
85
- def registered_booted_keys
86
- finalizers.keys - booted.keys
121
+ def require_boot_file(identifier)
122
+ boot_file = boot_files.detect { |path| Pathname(path).basename('.rb').to_s == identifier.to_s }
123
+ require boot_file if boot_file
87
124
  end
88
125
 
89
126
  # @api private
90
127
  def boot_files
91
- path.join('**/*.rb').to_s
128
+ Dir["#{path}/**/*.rb"]
92
129
  end
93
130
 
94
131
  # @api private
95
- def check_component_identifier(name)
96
- unless name.is_a?(Symbol)
97
- raise InvalidComponentIdentifierTypeError, name
98
- end
99
-
100
- unless path.join("#{name}.rb").exist?
101
- raise InvalidComponentIdentifierError, name
102
- end
132
+ def boot_dependency(component)
133
+ boot_file = component.boot_file(path)
134
+ start(boot_file.basename('.*').to_s.to_sym) if boot_file.exist?
103
135
  end
104
136
  end
105
137
  end
@@ -0,0 +1,37 @@
1
+ module Dry
2
+ module System
3
+ class Booter
4
+ class ComponentRegistry
5
+ include Enumerable
6
+
7
+ attr_reader :components
8
+
9
+ def initialize
10
+ @components = []
11
+ end
12
+
13
+ def each(&block)
14
+ components.each(&block)
15
+ end
16
+
17
+ def register(component)
18
+ @components << component
19
+ end
20
+
21
+ def exists?(name)
22
+ components.any? { |component| component.identifier == name }
23
+ end
24
+
25
+ def [](name)
26
+ component = components.detect { |component| component.identifier == name }
27
+
28
+ if component
29
+ component
30
+ else
31
+ raise InvalidComponentIdentifierError, name
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -41,8 +41,8 @@ module Dry
41
41
  attr_reader :loader
42
42
 
43
43
  # @api private
44
- def self.new(*args)
45
- cache.fetch_or_store(args.hash) do
44
+ def self.new(*args, &block)
45
+ cache.fetch_or_store([*args, block].hash) do
46
46
  name, options = args
47
47
  options = DEFAULT_OPTIONS.merge(options || {})
48
48
 
@@ -67,8 +67,8 @@ module Dry
67
67
  # @api private
68
68
  def self.remove_namespace_from_path(name, ns)
69
69
  match_value = name.match(/^(?<remove_namespace>#{ns}).(?<identifier>.*)/)
70
- raise InvalidComponentError.new(name, "namespace +#{ns}+ not found in path") unless match_value
71
- match_value[:identifier]
70
+
71
+ match_value ? match_value[:identifier] : name
72
72
  end
73
73
 
74
74
  # @api private
@@ -108,6 +108,11 @@ module Dry
108
108
  loader.call(*args)
109
109
  end
110
110
 
111
+ # @api private
112
+ def boot?
113
+ false
114
+ end
115
+
111
116
  # @api private
112
117
  def bootable?(path)
113
118
  boot_file(path).exist?
@@ -0,0 +1,6 @@
1
+ require 'dry/system'
2
+
3
+ Dry::System.register_provider(
4
+ :system,
5
+ boot_path: Pathname(__dir__).join('system_components').realpath
6
+ )
@@ -0,0 +1,307 @@
1
+ require 'dry/system/lifecycle'
2
+ require 'dry/system/settings'
3
+ require 'dry/system/components/config'
4
+
5
+ module Dry
6
+ module System
7
+ module Components
8
+ # Bootable components can provide one or more objects and typically depend
9
+ # on 3rd-party code. A typical bootable component can be a database library,
10
+ # or an API client.
11
+ #
12
+ # These components can be registered via `Container.boot` and external component
13
+ # providers can register their components too, which then can be used and configured
14
+ # by your system.
15
+ #
16
+ # @example simple logger
17
+ # class App < Dry::System::Container
18
+ # boot(:logger) do
19
+ # init do
20
+ # require "logger"
21
+ # end
22
+ #
23
+ # start do
24
+ # register(:logger, Logger.new($stdout))
25
+ # end
26
+ # end
27
+ # end
28
+ #
29
+ # App[:logger] # returns configured logger
30
+ #
31
+ # @example using built-in system components
32
+ # class App < Dry::System::Container
33
+ # boot(:settings, from: :system) do
34
+ # settings do
35
+ # key :database_url, Types::String.constrained(filled: true)
36
+ # key :session_secret, Types::String.constrained(filled: true)
37
+ # end
38
+ # end
39
+ # end
40
+ #
41
+ # App[:settings] # returns loaded settings
42
+ #
43
+ # @api public
44
+ class Bootable
45
+ DEFAULT_FINALIZE = proc {}
46
+
47
+ # @!attribute [r] identifier
48
+ # @return [Symbol] component's unique identifier
49
+ attr_reader :identifier
50
+
51
+ # @!attribute [r] finalize
52
+ # @return [Proc] Finalization proc
53
+ attr_reader :finalize
54
+
55
+ # @!attribute [r] options
56
+ # @return [Hash] component's options
57
+ attr_reader :options
58
+
59
+ # @!attribute [r] triggers
60
+ # @return [Hash] lifecycle step after/before callbacks
61
+ attr_reader :triggers
62
+
63
+ # @!attribute [r] namespace
64
+ # @return [Symbol,String] default namespace for the container keys
65
+ attr_reader :namespace
66
+
67
+ # @api private
68
+ def initialize(identifier, options = {}, &block)
69
+ @identifier = identifier
70
+ @triggers = { before: Hash.new { |h, k| h[k] = [] }, after: Hash.new { |h, k| h[k] = [] } }
71
+ @options = block ? options.merge(block: block) : options
72
+ @namespace = options[:namespace]
73
+ finalize = options[:finalize] || DEFAULT_FINALIZE
74
+ instance_exec(&finalize)
75
+ end
76
+
77
+ # Execute `init` step
78
+ #
79
+ # @return [Bootable]
80
+ #
81
+ # @api public
82
+ def init
83
+ trigger(:before, :init)
84
+ lifecycle.(:init)
85
+ trigger(:after, :init)
86
+ self
87
+ end
88
+
89
+ # Execute `start` step
90
+ #
91
+ # @return [Bootable]
92
+ #
93
+ # @api public
94
+ def start
95
+ trigger(:before, :start)
96
+ lifecycle.(:start)
97
+ trigger(:after, :start)
98
+ self
99
+ end
100
+
101
+ # Execute `stop` step
102
+ #
103
+ # @return [Bootable]
104
+ #
105
+ # @api public
106
+ def stop
107
+ lifecycle.(:stop)
108
+ self
109
+ end
110
+
111
+ # Specify a before callback
112
+ #
113
+ # @return [Bootable]
114
+ #
115
+ # @api public
116
+ def before(event, &block)
117
+ triggers[:before][event] << block
118
+ self
119
+ end
120
+
121
+ # Specify an after callback
122
+ #
123
+ # @return [Bootable]
124
+ #
125
+ # @api public
126
+ def after(event, &block)
127
+ triggers[:after][event] << block
128
+ self
129
+ end
130
+
131
+ # Configure a component
132
+ #
133
+ # @return [Bootable]
134
+ #
135
+ # @api public
136
+ def configure(&block)
137
+ @config_block = block
138
+ end
139
+
140
+ # Define configuration settings with keys and types
141
+ #
142
+ # @return [Bootable]
143
+ #
144
+ # @api public
145
+ def settings(&block)
146
+ if block
147
+ @settings_block = block
148
+ elsif @settings_block
149
+ @settings = Settings::DSL.new(identifier, &@settings_block).call
150
+ else
151
+ @settings
152
+ end
153
+ end
154
+
155
+ # Return component's configuration
156
+ #
157
+ # @return [Dry::Struct]
158
+ #
159
+ # @api public
160
+ def config
161
+ if @config
162
+ @config
163
+ else
164
+ configure!
165
+ end
166
+ end
167
+
168
+ # Return a list of lifecycle steps that were executed
169
+ #
170
+ # @return [Array<Symbol>]
171
+ #
172
+ # @api public
173
+ def statuses
174
+ lifecycle.statuses
175
+ end
176
+
177
+ # Return system's container used by this component
178
+ #
179
+ # @return [Dry::Struct]
180
+ #
181
+ # @api public
182
+ def container
183
+ options.fetch(:container)
184
+ end
185
+
186
+ # Automatically called by the booter object after starting a component
187
+ #
188
+ # @return [Bootable]
189
+ #
190
+ # @api private
191
+ def finalize
192
+ lifecycle.container.each do |key, item|
193
+ container.register(key, item) unless container.key?(key)
194
+ end
195
+ self
196
+ end
197
+
198
+ # Trigger a callback
199
+ #
200
+ # @return [Bootable]
201
+ #
202
+ # @api private
203
+ def trigger(key, event)
204
+ triggers[key][event].each do |fn|
205
+ container.instance_exec(lifecycle.container, &fn)
206
+ end
207
+ self
208
+ end
209
+
210
+ # Return a new instance with updated options
211
+ #
212
+ # @return [Dry::Struct]
213
+ #
214
+ # @api private
215
+ def with(new_options)
216
+ self.class.new(identifier, options.merge(new_options))
217
+ end
218
+
219
+ # Return true
220
+ #
221
+ # @return [TrueClass]
222
+ #
223
+ # @api private
224
+ def boot?
225
+ true
226
+ end
227
+
228
+ # Return path to component's boot file
229
+ #
230
+ # @return [String]
231
+ #
232
+ # @api private
233
+ def boot_file
234
+ container_boot_files.
235
+ detect { |path| Pathname(path).basename('.rb').to_s == identifier.to_s }
236
+ end
237
+
238
+ # Return path to boot dir
239
+ #
240
+ # @return [String]
241
+ #
242
+ # @api private
243
+ def boot_path
244
+ container.boot_path
245
+ end
246
+
247
+ # Return all boot files defined under container's boot path
248
+ #
249
+ # @return [String]
250
+ #
251
+ # @api private
252
+ def container_boot_files
253
+ Dir[container.boot_path.join('**/*.rb')]
254
+ end
255
+
256
+ private
257
+
258
+ # Return lifecycle object used for this component
259
+ #
260
+ # @return [Lifecycle]
261
+ #
262
+ # @api private
263
+ def lifecycle
264
+ @lifecycle ||= Lifecycle.new(lf_container, component: self, &block)
265
+ end
266
+
267
+ # Return configured container for the lifecycle object
268
+ #
269
+ # @return [Dry::Container]
270
+ #
271
+ # @api private
272
+ def lf_container
273
+ container = Dry::Container.new
274
+
275
+ case namespace
276
+ when String, Symbol
277
+ container.namespace(namespace) { |c| return c }
278
+ when true
279
+ container.namespace(identifier) { |c| return c }
280
+ when nil
281
+ container
282
+ else
283
+ raise RuntimeError, "+namespace+ boot option must be true, string or symbol #{namespace.inspect} given."
284
+ end
285
+ end
286
+
287
+ # Set config object
288
+ #
289
+ # @return [Dry::Struct]
290
+ #
291
+ # @api private
292
+ def configure!
293
+ @config = settings.new(Config.new(&@config_block)) if settings
294
+ end
295
+
296
+ # Return block that will be evaluated in the lifecycle context
297
+ #
298
+ # @return [Proc]
299
+ #
300
+ # @api private
301
+ def block
302
+ options.fetch(:block)
303
+ end
304
+ end
305
+ end
306
+ end
307
+ end