Module: Hanami::Slice::ClassMethods
- Defined in:
- lib/hanami/slice.rb
Overview
rubocop:disable Metrics/ModuleLength
Instance Attribute Summary collapse
-
#autoloader ⇒ Zeitwerk::Loader
readonly
Returns the slice’s autoloader.
-
#container ⇒ Object
readonly
Returns the slice’s container.
-
#parent ⇒ Hanami::Slice
readonly
Returns the slice’s parent.
Instance Method Summary collapse
-
#[](key) ⇒ Object
Resolves the component with the given key from the container.
-
#app ⇒ Hanami::App
Returns the Hanami app.
-
#app? ⇒ Boolean
Returns true if the slice is Hanami.app.
-
#boot ⇒ self
Boots the slice.
-
#booted? ⇒ Boolean
Returns true if the slice has been booted.
-
#call(rack_env) ⇒ Array
Calls the slice’s [Rack] app and returns a Rack-compatible response object.
-
#config ⇒ Hanami::Config
Returns the slice’s config.
- #configure_provider(*args, **kwargs, &block) ⇒ Object
-
#environment(env_name, &block) ⇒ self
Evaluates the block for a given app environment only.
-
#export(keys) ⇒ self
Specifies the components to export from the slice.
-
#import(from: , as: nil, keys: nil) ⇒ Object
Specifies components to import from another slice.
-
#inflector ⇒ Dry::Inflector
Returns the slice’s configured inflector.
-
#key?(key) ⇒ Boolean
Returns true if the component with the given key is registered in the container.
-
#keys ⇒ Array<String>
Returns an array of keys for all currently registered components in the container.
-
#namespace ⇒ Module
Returns the constant for the slice’s module namespace.
- #prepare(provider_name = nil) ⇒ Object
-
#prepare_container {|container| ... } ⇒ self
Captures the given block to be called with the slice’s container during the slice’s ‘prepare` step, after the slice has already configured the container.
-
#prepared? ⇒ Boolean
Returns true if the slice has been prepared.
-
#rack_app ⇒ #call?
Returns a [Rack] app for the slice, or nil if no routes are defined.
-
#register ⇒ container
Registers a component in the slice’s container.
-
#register_provider(name, namespace: nil, from: nil, source: nil) ⇒ container
Registers a provider and its lifecycle hooks.
- #register_slice ⇒ slices
-
#registered? ⇒ Boolean
Required for the slice to act as a provider target.
- #resolve ⇒ Object
-
#root ⇒ Pathname
Returns the slice’s root, either the root as explicitly configured, or a default fallback of the slice’s name within the app’s ‘slices/` dir.
-
#router(inspector: nil) ⇒ Hanami::Slice::Router?
Returns the slice’s router, if or nil if no routes are defined.
-
#routes ⇒ Hanami::Routes?
Returns the slice’s routes, or nil if no routes are defined.
-
#settings ⇒ Hanami::Settings?
Returns the slice’s settings, or nil if no settings are defined.
-
#shutdown ⇒ self
Shuts down the slice’s providers, as well as the providers in any nested slices.
-
#slice_name ⇒ SliceName
Returns a Hanami::SliceName for the slice, an object with methods returning the name of the slice in various formats.
-
#slices ⇒ SliceRegistrar
Returns the slice’s collection of nested slices.
-
#source_path ⇒ Pathname
Returns the slice’s root component directory, accounting for App as a special case.
-
#start(provider_name) ⇒ container
Starts a provider.
-
#stop(provider_name) ⇒ container
Stops a provider.
Instance Attribute Details
#autoloader ⇒ Zeitwerk::Loader (readonly)
Returns the slice’s autoloader.
Each slice has its own ‘Zeitwerk::Loader` autoloader instance, which is setup when the slice is prepared.
76 77 78 |
# File 'lib/hanami/slice.rb', line 76 def autoloader @autoloader end |
#container ⇒ Object (readonly)
Returns the slice’s container.
This is a ‘Dry::System::Container` that is already configured for the slice.
In ordinary usage, you shouldn’t need direct access the container at all, since the slice provides its own methods for interacting with the container (such as #[], #keys, #key? #register, #register_provider, #prepare, #start, #stop).
If you need to configure the container directly, use #prepare_container.
92 93 94 |
# File 'lib/hanami/slice.rb', line 92 def container @container end |
#parent ⇒ Hanami::Slice (readonly)
Returns the slice’s parent.
For top-level slices defined in ‘slices/` or `config/slices/`, this will be the Hanami app itself (`Hanami.app`). For nested slices, this will be the slice in which they were registered.
63 64 65 |
# File 'lib/hanami/slice.rb', line 63 def parent @parent end |
Instance Method Details
#[](key) ⇒ Object
623 624 625 |
# File 'lib/hanami/slice.rb', line 623 def [](...) container.[](...) end |
#app ⇒ Hanami::App
Returns the Hanami app.
100 101 102 |
# File 'lib/hanami/slice.rb', line 100 def app Hanami.app end |
#app? ⇒ Boolean
Returns true if the slice is Hanami.app
110 111 112 |
# File 'lib/hanami/slice.rb', line 110 def app? eql?(app) end |
#boot ⇒ self
Boots the slice.
This will prepare the slice (if not already prepared), start each of its providers, register all the slice’s components from its Ruby source files, and import components from any other slices. It will also boot any of the slice’s own registered nested slices. It will then freeze its container so no further components can be registered.
Call ‘boot` if you want to fully load a slice and incur all load time up front, such as when preparing an app to serve web requests. Booting slices is the approach taken when running Hanami’s standard Puma setup (see ‘config.ru`).
325 326 327 328 329 330 331 332 333 334 335 336 |
# File 'lib/hanami/slice.rb', line 325 def boot return self if booted? prepare container.finalize! slices.each(&:boot) @booted = true self end |
#booted? ⇒ Boolean
Returns true if the slice has been booted.
370 371 372 |
# File 'lib/hanami/slice.rb', line 370 def booted? !!@booted end |
#call(rack_env) ⇒ Array
790 791 792 |
# File 'lib/hanami/slice.rb', line 790 def call(...) rack_app.call(...) end |
#config ⇒ Hanami::Config
Returns the slice’s config.
A slice’s config is copied from the app config at time of first access.
124 125 126 127 128 129 |
# File 'lib/hanami/slice.rb', line 124 def config @config ||= app.config.dup.tap do |slice_config| # Unset config from app that does not apply to ordinary slices slice_config.root = nil end end |
#configure_provider(*args, **kwargs, &block) ⇒ Object
532 533 534 |
# File 'lib/hanami/slice.rb', line 532 def configure_provider(*args, **kwargs, &block) container.register_provider(*args, **kwargs, from: :hanami, &block) end |
#environment(env_name) ⇒ self #environment(env_name) {|slice| ... } ⇒ self
Evaluates the block for a given app environment only.
If the given ‘env_name` matches Hanami.env, then the block will be evaluated in the context of `self` (the slice) via `instance_eval`. The slice is also passed as the block’s optional argument.
If the env does not match, then the block is not evaluated at all.
161 162 163 164 |
# File 'lib/hanami/slice.rb', line 161 def environment(env_name, &block) instance_eval(&block) if env_name == config.env self end |
#export(keys) ⇒ self
Specifies the components to export from the slice.
Slices importing from this slice can import the specified components only.
652 653 654 655 |
# File 'lib/hanami/slice.rb', line 652 def export(keys) container.config.exports = keys self end |
#import(from: , as: nil, keys: nil) ⇒ Object
690 691 692 693 694 695 696 697 698 699 700 701 702 703 |
# File 'lib/hanami/slice.rb', line 690 def import(from:, **kwargs) slice = self container.after(:configure) do if from.is_a?(Symbol) || from.is_a?(String) slice_name = from from = slice.parent.slices[from.to_sym].container end as = kwargs[:as] || slice_name import(from: from, as: as, **kwargs) end end |
#inflector ⇒ Dry::Inflector
Returns the slice’s configured inflector.
Unless explicitly re-configured for the slice, this will be the app’s inflector.
237 238 239 |
# File 'lib/hanami/slice.rb', line 237 def inflector config.inflector end |
#key?(key) ⇒ Boolean
584 585 586 |
# File 'lib/hanami/slice.rb', line 584 def key?(...) container.key?(...) end |
#keys ⇒ Array<String>
Returns an array of keys for all currently registered components in the container.
For a prepared slice, this will be the set of components that have been previously resolved. For a booted slice, this will be all components available for the slice.
604 605 606 |
# File 'lib/hanami/slice.rb', line 604 def keys container.keys end |
#namespace ⇒ Module
Returns the constant for the slice’s module namespace.
188 189 190 |
# File 'lib/hanami/slice.rb', line 188 def namespace slice_name.namespace end |
#prepare ⇒ self #prepare(provider_name) ⇒ self
270 271 272 273 274 275 276 277 278 |
# File 'lib/hanami/slice.rb', line 270 def prepare(provider_name = nil) if provider_name container.prepare(provider_name) else prepare_slice end self end |
#prepare_container {|container| ... } ⇒ self
Captures the given block to be called with the slice’s container during the slice’s ‘prepare` step, after the slice has already configured the container.
This is intended for advanced usage only and should not be needed for ordinary slice configuration and usage.
303 304 305 306 |
# File 'lib/hanami/slice.rb', line 303 def prepare_container(&block) @prepare_container_block = block self end |
#prepared? ⇒ Boolean
Returns true if the slice has been prepared.
358 359 360 |
# File 'lib/hanami/slice.rb', line 358 def prepared? !!@prepared end |
#rack_app ⇒ #call?
Returns a [Rack] app for the slice, or nil if no routes are defined.
The rack app will be memoized on first access.
[rack]: github.com/rack/rack
771 772 773 774 775 |
# File 'lib/hanami/slice.rb', line 771 def rack_app return unless router @rack_app ||= router.to_rack_app end |
#register(key, object) ⇒ container #register(key, memoize: false, &block) ⇒ container #register(key, call: true, &block) ⇒ container
Registers a component in the slice’s container.
462 463 464 |
# File 'lib/hanami/slice.rb', line 462 def register(...) container.register(...) end |
#register_provider(name, namespace: nil, from: nil, source: nil) ⇒ container
526 527 528 |
# File 'lib/hanami/slice.rb', line 526 def register_provider(...) container.register_provider(...) end |
#register_slice(name) {|slice| ... } ⇒ slices #register_slice(name, slice_class) ⇒ slices
414 415 416 |
# File 'lib/hanami/slice.rb', line 414 def register_slice(...) slices.register(...) end |
#registered? ⇒ Boolean
Required for the slice to act as a provider target
591 592 593 |
# File 'lib/hanami/slice.rb', line 591 def registered?(...) container.registered?(...) end |
#resolve ⇒ Object
631 632 633 |
# File 'lib/hanami/slice.rb', line 631 def resolve(...) container.resolve(...) end |
#root ⇒ Pathname
Returns the slice’s root, either the root as explicitly configured, or a default fallback of the slice’s name within the app’s ‘slices/` dir.
201 202 203 204 205 206 207 208 209 210 211 212 213 214 |
# File 'lib/hanami/slice.rb', line 201 def root # Provides a best guess for a root when it is not yet configured. # # This is particularly useful for user-defined slice classes that access `settings` inside # the class body (since the root needed to find the settings file). In this case, # `configuration.root` may be nil when `settings` is called, since the root is configured by # `SliceRegistrar#configure_slice` _after_ the class is loaded. # # In common cases, this best guess will be correct since most Hanami slices will be expected # to live in the app SLICES_DIR. For advanced cases, the correct slice root should be # explicitly configured at the beginning of the slice class body, before any calls to # `settings`. config.root || app.root.join(SLICES_DIR, slice_name.to_s) end |
#router(inspector: nil) ⇒ Hanami::Slice::Router?
Returns the slice’s router, if or nil if no routes are defined.
An optional ‘inspector`, implementing the `Hanami::Router::Inspector` interface, may be provided at first call (the router is then memoized for subsequent accesses). An inspector is used by the `hanami routes` CLI comment to provide a list of available routes.
The returned router is a Router, which provides all ‘Hanami::Router` functionality, with the addition of support for slice mounting with the Router#slice.
750 751 752 753 754 755 756 |
# File 'lib/hanami/slice.rb', line 750 def router(inspector: nil) raise SliceLoadError, "#{self} must be prepared before loading the router" unless prepared? @_mutex.synchronize do @_router ||= load_router(inspector: inspector) end end |
#routes ⇒ Hanami::Routes?
Returns the slice’s routes, or nil if no routes are defined.
You can define your routes in ‘config/routes.rb`.
731 732 733 |
# File 'lib/hanami/slice.rb', line 731 def routes @routes ||= load_routes end |
#settings ⇒ Hanami::Settings?
Returns the slice’s settings, or nil if no settings are defined.
You can define your settings in ‘config/settings.rb`.
715 716 717 718 719 |
# File 'lib/hanami/slice.rb', line 715 def settings return @settings if instance_variable_defined?(:@settings) @settings = Settings.load_for_slice(self) end |
#shutdown ⇒ self
Shuts down the slice’s providers, as well as the providers in any nested slices.
344 345 346 347 348 |
# File 'lib/hanami/slice.rb', line 344 def shutdown slices.each(&:shutdown) container.shutdown! self end |
#slice_name ⇒ SliceName
Returns a Hanami::SliceName for the slice, an object with methods returning the name of the slice in various formats.
173 174 175 |
# File 'lib/hanami/slice.rb', line 173 def slice_name @slice_name ||= SliceName.new(self, inflector: method(:inflector)) end |
#slices ⇒ SliceRegistrar
Returns the slice’s collection of nested slices.
382 383 384 |
# File 'lib/hanami/slice.rb', line 382 def slices @slices ||= SliceRegistrar.new(self) end |
#source_path ⇒ Pathname
Returns the slice’s root component directory, accounting for App as a special case.
222 223 224 |
# File 'lib/hanami/slice.rb', line 222 def source_path app? ? root.join(APP_DIR) : root end |
#start(provider_name) ⇒ container
550 551 552 |
# File 'lib/hanami/slice.rb', line 550 def start(...) container.start(...) end |
#stop(provider_name) ⇒ container
568 569 570 |
# File 'lib/hanami/slice.rb', line 568 def stop(...) container.stop(...) end |