Class: Dry::System::Booter Private
- Inherits:
-
Object
- Object
- Dry::System::Booter
- Defined in:
- lib/dry/system/booter.rb,
lib/dry/system/booter/component_registry.rb
Overview
This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.
Default booter implementation
This is currently configured by default for every System::Container. Booter objects are responsible for loading system/boot files and expose an API for calling lifecycle triggers.
Defined Under Namespace
Classes: ComponentRegistry
Instance Attribute Summary collapse
- #booted ⇒ Object readonly private
- #components ⇒ Object readonly private
- #path ⇒ Object readonly private
Instance Method Summary collapse
- #boot_dependency(component) ⇒ Object private
- #boot_file(name) ⇒ Object private
- #boot_files ⇒ Object private
- #bootable?(component) ⇒ Boolean private
- #call(name_or_component) ⇒ Object private
- #finalize! ⇒ Object private
- #init(name_or_component) ⇒ Object private
-
#initialize(path) ⇒ Booter
constructor
private
A new instance of Booter.
- #lifecycle_container(container) ⇒ Object private
- #load_component(path) ⇒ Object private
- #register_component(component) ⇒ Object private
- #require_boot_file(identifier) ⇒ Object private
- #shutdown ⇒ Object private
- #start(name_or_component) ⇒ Object private
- #stop(name_or_component) ⇒ Object private
- #with_component(id_or_component) {|component| ... } ⇒ Object private
Constructor Details
#initialize(path) ⇒ Booter
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns a new instance of Booter.
24 25 26 27 28 |
# File 'lib/dry/system/booter.rb', line 24 def initialize(path) @path = path @booted = [] @components = ComponentRegistry.new end |
Instance Attribute Details
#booted ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
19 20 21 |
# File 'lib/dry/system/booter.rb', line 19 def booted @booted end |
#components ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
21 22 23 |
# File 'lib/dry/system/booter.rb', line 21 def components @components end |
#path ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
17 18 19 |
# File 'lib/dry/system/booter.rb', line 17 def path @path end |
Instance Method Details
#boot_dependency(component) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
166 167 168 169 |
# File 'lib/dry/system/booter.rb', line 166 def boot_dependency(component) boot_file = boot_file(component) start(boot_file.basename('.*').to_s.to_sym) if boot_file.exist? end |
#boot_file(name) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
36 37 38 39 40 |
# File 'lib/dry/system/booter.rb', line 36 def boot_file(name) name = name.respond_to?(:root_key) ? name.root_key.to_s : name path.join("#{name}#{RB_EXT}") end |
#boot_files ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
161 162 163 |
# File 'lib/dry/system/booter.rb', line 161 def boot_files Dir["#{path}/**/#{RB_GLOB}"] end |
#bootable?(component) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
31 32 33 |
# File 'lib/dry/system/booter.rb', line 31 def bootable?(component) boot_file(component).exist? end |
#call(name_or_component) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
121 122 123 124 125 126 127 128 129 130 131 |
# File 'lib/dry/system/booter.rb', line 121 def call(name_or_component) with_component(name_or_component) do |component| unless component raise ComponentFileMismatchError.new(name, registered_booted_keys) end yield(component) if block_given? component end end |
#finalize! ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/dry/system/booter.rb', line 60 def finalize! boot_files.each do |path| load_component(path) end components.each do |component| start(component) end freeze end |
#init(name_or_component) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
82 83 84 85 86 87 88 89 90 91 |
# File 'lib/dry/system/booter.rb', line 82 def init(name_or_component) with_component(name_or_component) do |component| call(component) do component.init.finalize yield if block_given? end self end end |
#lifecycle_container(container) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
134 135 136 |
# File 'lib/dry/system/booter.rb', line 134 def lifecycle_container(container) LifecycleContainer.new(container) end |
#load_component(path) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
49 50 51 52 53 54 55 56 57 |
# File 'lib/dry/system/booter.rb', line 49 def load_component(path) identifier = Pathname(path).basename(RB_EXT).to_s.to_sym unless components.exists?(identifier) require path end self end |
#register_component(component) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
43 44 45 46 |
# File 'lib/dry/system/booter.rb', line 43 def register_component(component) components.register(component) self end |
#require_boot_file(identifier) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
155 156 157 158 |
# File 'lib/dry/system/booter.rb', line 155 def require_boot_file(identifier) boot_file = boot_files.detect { |path| Pathname(path).basename(RB_EXT).to_s == identifier.to_s } require boot_file if boot_file end |
#shutdown ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
73 74 75 76 77 78 79 |
# File 'lib/dry/system/booter.rb', line 73 def shutdown components.each do |component| next unless booted.include?(component) stop(component) end end |
#start(name_or_component) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
94 95 96 97 98 99 100 101 102 103 104 105 106 |
# File 'lib/dry/system/booter.rb', line 94 def start(name_or_component) with_component(name_or_component) do |component| return self if booted.include?(component) init(name_or_component) do component.start end booted << component.finalize self end end |
#stop(name_or_component) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
109 110 111 112 113 114 115 116 117 118 |
# File 'lib/dry/system/booter.rb', line 109 def stop(name_or_component) call(name_or_component) do |component| raise ComponentNotStartedError.new(name_or_component) unless booted.include?(component) component.stop booted.delete(component) yield if block_given? end end |
#with_component(id_or_component) {|component| ... } ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
# File 'lib/dry/system/booter.rb', line 139 def with_component(id_or_component) component = case id_or_component when Symbol require_boot_file(id_or_component) unless components.exists?(id_or_component) components[id_or_component] when Components::Bootable id_or_component end raise InvalidComponentError, id_or_component unless component yield(component) end |