Skip to content

Commit

Permalink
Add eager loading during finalization (#276)
Browse files Browse the repository at this point in the history
* Add eager_loading as opton to Container#finalize!

Default is false for now

* Change eager_load: true by default

* Inline conditional

* Make spec file for eager loading

---------

Co-authored-by: Nikita Shilnikov <[email protected]>
  • Loading branch information
cllns and flash-gordon authored Jan 7, 2025
1 parent 3fbb624 commit 57b1e05
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 1 deletion.
4 changes: 3 additions & 1 deletion lib/dry/system/container.rb
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,7 @@ def finalized?
# @return [self] frozen container
#
# @api public
def finalize!(freeze: true, &)
def finalize!(freeze: true, eager_load: true, &)
return self if finalized?

configured!
Expand All @@ -327,6 +327,8 @@ def finalize!(freeze: true, &)
manifest_registrar.finalize!
importer.finalize!

keys.each { |key| resolve(key) } if eager_load

@__finalized__ = true

self.freeze if freeze
Expand Down
31 changes: 31 additions & 0 deletions spec/integration/container/auto_registration/eager_loading_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# frozen_string_literal: true

RSpec.describe "Eager loading during finalization" do
it "raises error when component cannot be found, due to missing inflection" do
class Test::Container < Dry::System::Container
configure do |config|
config.root = SPEC_ROOT.join("fixtures").realpath

config.component_dirs.add "components" do |dir|
dir.namespaces.add "test", key: nil
end
end
end
expect { Test::Container.finalize! }.to raise_error(Dry::System::ComponentNotLoadableError)
end

it "does not raise error when constant can be found" do
class Test::Container < Dry::System::Container
configure do |config|
config.root = SPEC_ROOT.join("fixtures").realpath

config.component_dirs.add "components" do |dir|
dir.namespaces.add "test", key: nil
end

config.inflector = Dry::Inflector.new { |i| i.acronym("ABC") }
end
end
expect { Test::Container.finalize! }.to_not raise_error
end
end
4 changes: 4 additions & 0 deletions spec/integration/container/auto_registration/memoize_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ class Test::Container < Dry::System::Container
dir.namespaces.add "test", key: nil
dir.memoize = true
end

config.inflector = Dry::Inflector.new { |i| i.acronym("ABC") }
end
end
end
Expand Down Expand Up @@ -52,6 +54,8 @@ class Test::Container < Dry::System::Container
!component.key.match?(/bar/)
end
end

config.inflector = Dry::Inflector.new { |i| i.acronym("ABC") }
end
end
end
Expand Down
24 changes: 24 additions & 0 deletions spec/unit/container/configuration_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -175,5 +175,29 @@ def hooks_trace
.from([])
.to [:after_configure]
end

it "raises error for undefined constant (due to inflector missing acronym)" do
expect {
container.configure do |config|
config.root = SPEC_ROOT.join("fixtures").realpath
config.component_dirs.add "components" do |dir|
dir.namespaces.add "test", key: nil
end
end
container.finalize!
}.to raise_error(Dry::System::ComponentNotLoadableError)
end

it "does not raises error for undefined constant when eager_load is false" do
expect {
container.configure do |config|
config.root = SPEC_ROOT.join("fixtures").realpath
config.component_dirs.add "components" do |dir|
dir.namespaces.add "test", key: nil
end
end
container.finalize!(eager_load: false)
}.to_not raise_error
end
end
end

0 comments on commit 57b1e05

Please sign in to comment.