Skip to content

Commit 70cb439

Browse files
Finish refactoring and fixing after refactoring
1 parent 31dd7d6 commit 70cb439

11 files changed

+53
-79
lines changed

Gemfile.lock

+9
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ PATH
22
remote: .
33
specs:
44
resol (1.0.0)
5+
dry-configurable
56
dry-container
67

78
GEM
@@ -37,8 +38,15 @@ GEM
3738
diff-lcs (1.5.1)
3839
docile (1.4.1)
3940
drb (2.2.1)
41+
dry-configurable (1.2.0)
42+
dry-core (~> 1.0, < 2)
43+
zeitwerk (~> 2.6)
4044
dry-container (0.11.0)
4145
concurrent-ruby (~> 1.0)
46+
dry-core (1.0.2)
47+
concurrent-ruby (~> 1.0)
48+
logger
49+
zeitwerk (~> 2.6)
4250
dry-inflector (1.1.0)
4351
dry-initializer (3.1.1)
4452
i18n (1.14.6)
@@ -134,6 +142,7 @@ GEM
134142
umbrellio-sequel-plugins (0.17.0)
135143
sequel
136144
unicode-display_width (2.6.0)
145+
zeitwerk (2.7.1)
137146

138147
PLATFORMS
139148
arm64-darwin-21

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -68,15 +68,15 @@ You can use both providers for a different services:
6868

6969
# Types is a namespace for all types, defined by smart_types.
7070
class FirstService < Resol::Service
71-
use_initializer! :smartcore
71+
inject_initializer :smartcore
7272

7373
param :first, Types::String
7474
param :second, Types::Integer
7575
end
7676

7777
# Types is a namespace for all types, defined by dry-types.
7878
class SecondService < Resol::Service
79-
use_initializer! :dry
79+
inject_initializer :dry
8080

8181
param :first, Types::Strict::String
8282
param :second, Types::Strict::Integer

lib/resol.rb

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
11
# frozen_string_literal: true
22

3+
require "dry-configurable"
34
require "dry-container"
45

56
require_relative "resol/version"
6-
require_relative "resol/configuration"
77

88
require_relative "resol/injector"
99
require_relative "resol/service"
1010
require_relative "resol/plugins"
11+
1112
require_relative "resol/dependency_container"
1213

1314
module Resol
1415
extend self
1516

16-
def config
17-
@config ||= Configuration.new
18-
end
17+
extend Dry::Configurable
18+
19+
setting :classes_allowed_to_patch, default: ["Resol::Service"]
1920

2021
# rubocop:disable Naming/MethodName
2122
def Success(...)

lib/resol/configuration.rb

-19
This file was deleted.

lib/resol/injector.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ def initialize(proc_register)
99
end
1010

1111
def inject!(service_class)
12-
error!("parent or this class already injected") if service_class.is_a?(InjectMarker)
12+
error!("parent or this class already injected") if service_class.include?(InjectMarker)
1313

1414
service_class.instance_eval(&proc_register)
1515
service_class.include(InjectMarker)
@@ -20,7 +20,7 @@ def inject!(service_class)
2020
attr_accessor :proc_register
2121

2222
def error!(msg)
23-
raise msg
23+
raise msg
2424
end
2525
end
2626
end

resol.gemspec

+1
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,6 @@ Gem::Specification.new do |spec|
1717
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.include?("spec") }
1818
spec.require_paths = ["lib"]
1919

20+
spec.add_dependency "dry-configurable"
2021
spec.add_dependency "dry-container"
2122
end

spec/configuration_spec.rb

-27
This file was deleted.

spec/manager_spec.rb

+14-10
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
# frozen_string_literal: true
22

33
RSpec.describe Resol::Plugins::Manager do
4-
let(:manager) { described_class.new(service_double) }
4+
before do
5+
Resol.config.classes_allowed_to_patch = %w[DummyService Resol::Service ReturnEngineService]
6+
end
7+
before { stub_const("DummyService", service_double) }
8+
9+
let(:manager) { described_class.new }
510

611
let(:service_double) do
712
class_double(
@@ -12,41 +17,40 @@
1217
let(:singleton_double) { double(prepend: true) }
1318

1419
it "skips all prepends" do
15-
manager.plugin(:dummy)
20+
manager.plugin(DummyService, :dummy)
1621

1722
expect(service_double).not_to receive(:prepend)
1823
expect(singleton_double).not_to receive(:prepend)
1924
end
2025

2126
context "when uses same plugin few times" do
22-
before { allow(manager).to receive(:resolve_module).and_return(Resol::Plugins::Dummy) }
23-
24-
before { manager.plugin(:dummy) }
27+
before { allow(described_class).to receive(:resolve_module).and_return(Resol::Plugins::Dummy) }
2528

2629
let(:manager_plugins) { manager.instance_variable_get(:@plugins) }
2730

2831
it "doesn't load plugin second time" do
29-
manager.plugin(:dummy)
32+
manager.plugin(DummyService, :dummy)
33+
manager.plugin(DummyService, :dummy)
3034

31-
expect(manager).to have_received(:resolve_module).once
35+
expect(described_class).to have_received(:resolve_module).once
3236
expect(manager_plugins).to eq(["dummy"])
3337
end
3438
end
3539

3640
context "when can't require plugin" do
3741
specify do
38-
expect { manager.plugin(:not_existed_plugin) }.to raise_error do |error|
42+
expect { manager.plugin(DummyService, :not_existed_plugin) }.to raise_error do |error|
3943
expect(error).to be_an_instance_of(ArgumentError)
4044
expect(error.message).to include("Failed to load plugin 'not_existed_plugin': ")
4145
end
4246
end
4347
end
4448

4549
context "when can't resolve module" do
46-
before { allow(manager).to receive(:resolve_module).and_raise(NameError, "msg") }
50+
before { allow(described_class).to receive(:resolve_module).and_raise(NameError, "msg") }
4751

4852
specify do
49-
expect { manager.plugin(:dummy) }.to raise_error do |error|
53+
expect { manager.plugin(DummyService, :dummy) }.to raise_error do |error|
5054
expect(error).to be_an_instance_of(ArgumentError)
5155
expect(error.message).to include("Failed to load plugin 'dummy': msg")
5256
end

spec/resol_spec.rb

-14
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,4 @@
44
it "has a version number" do
55
expect(Resol::VERSION).not_to be nil
66
end
7-
8-
describe "#config" do
9-
specify do
10-
expect(described_class.config).to eq(Resol::Configuration)
11-
end
12-
end
13-
14-
describe "#configure" do
15-
specify do
16-
Resol.configure do |config|
17-
expect(config.smart_config).to eq(SmartCore::Initializer::Configuration.config)
18-
end
19-
end
20-
end
217
end

spec/service_spec.rb

+12
Original file line numberDiff line numberDiff line change
@@ -330,4 +330,16 @@ def call
330330
expect(first_manager).to eq(second_manager)
331331
end
332332
end
333+
334+
context "when inherited from already injected service" do
335+
let(:child_service) { Class.new(SmartService) }
336+
let(:injecting_proc) { proc { inject_initializer!(:dry_injector) } }
337+
338+
it "tries to inject initializer" do
339+
expect { child_service.class_eval(&injecting_proc) }.to raise_error do |error|
340+
expect(error).to be_instance_of(RuntimeError)
341+
expect(error.message).to eq("parent or this class already injected")
342+
end
343+
end
344+
end
333345
end

spec/spec_helper.rb

+8-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
end
2424

2525
require "dry/container/stub"
26+
require "dry/configurable/test_interface"
2627
require "resol"
2728
require "pry"
2829

@@ -31,8 +32,12 @@
3132

3233
require "resol/plugins/dummy"
3334

35+
module Resol
36+
enable_test_interface
37+
end
38+
3439
Resol::DependencyContainer.enable_stubs!
35-
Resol.config.send(:data=, { classes_allowed_to_patch: ["Resol::Service", "ReturnEngineService"] })
40+
Resol.config.classes_allowed_to_patch = %w[Resol::Service ReturnEngineService]
3641

3742
class SmartService < Resol::Service
3843
inject_initializer! :smartcore_injector
@@ -53,4 +58,6 @@ class ReturnEngineService < Resol::Service
5358

5459
config.order = :random
5560
Kernel.srand config.seed
61+
62+
config.before { Resol.reset_config }
5663
end

0 commit comments

Comments
 (0)