Skip to content

Commit c57604b

Browse files
committed
Get rid of dubious meta-apply method handlers
* no sane way to support event type scheme for extract last part * no sane way to normalize every event type to method name
1 parent a17f34e commit c57604b

File tree

7 files changed

+26
-57
lines changed

7 files changed

+26
-57
lines changed

aggregate_root/lib/aggregate_root.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# frozen_string_literal: true
22

33
require_relative "aggregate_root/version"
4-
require_relative "aggregate_root/transform"
54
require_relative "aggregate_root/default_apply_strategy"
65
require_relative "aggregate_root/repository"
76
require_relative "aggregate_root/instrumented_repository"

aggregate_root/lib/aggregate_root/default_apply_strategy.rb

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,32 @@
22

33
module AggregateRoot
44
MissingHandler = Class.new(StandardError)
5+
NullHandler = Proc.new {}
56

67
class DefaultApplyStrategy
78
def initialize(strict: true)
89
@strict = strict
910
end
1011

1112
def call(aggregate, event)
12-
name = handler_name(aggregate, event)
13-
if aggregate.respond_to?(name, true)
14-
aggregate.method(name).call(event)
15-
else
16-
raise MissingHandler.new("Missing handler method #{name} on aggregate #{aggregate.class}") if strict
17-
end
13+
on_handler(aggregate, event.event_type)[event]
1814
end
1915

2016
private
2117

22-
def handler_name(aggregate, event)
23-
on_dsl_handler_name(aggregate, event.event_type) || apply_handler_name(event.event_type)
24-
end
25-
26-
def on_dsl_handler_name(aggregate, event_type)
27-
aggregate.class.on_methods[event_type] if aggregate.class.respond_to?(:on_methods)
18+
def on_handler(aggregate, event_type)
19+
on_method_name = aggregate.class.on_methods.fetch(event_type)
20+
aggregate.method(on_method_name)
21+
rescue KeyError
22+
missing_handler(aggregate, event_type)
2823
end
2924

30-
def apply_handler_name(event_type)
31-
"apply_#{Transform.to_snake_case(event_type(event_type))}"
32-
end
33-
34-
def event_type(event_type)
35-
event_type.split(/::|\./).last
25+
def missing_handler(aggregate, event_type)
26+
if strict
27+
lambda { |event| raise MissingHandler.new("Missing handler method on aggregate #{aggregate.class} for #{event_type}") }
28+
else
29+
NullHandler
30+
end
3631
end
3732

3833
attr_reader :strict, :on_methods

aggregate_root/lib/aggregate_root/transform.rb

Lines changed: 0 additions & 9 deletions
This file was deleted.

aggregate_root/spec/aggregate_root_spec.rb

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ def expire
2626

2727
private
2828

29-
def apply_order_created(_event)
29+
on Orders::Events::OrderCreated do |_event|
3030
@status = :created
3131
end
3232

33-
def apply_order_expired(_event)
33+
on Orders::Events::OrderExpired do |_event|
3434
@status = :expired
3535
end
3636
end
@@ -39,9 +39,8 @@ def apply_order_expired(_event)
3939
it "should have ability to apply event on itself" do
4040
order = order_klass.new(uuid)
4141
order_created = Orders::Events::OrderCreated.new
42-
43-
expect(order).to receive(:"apply_order_created").with(order_created).and_call_original
4442
order.apply(order_created)
43+
4544
expect(order.status).to eq :created
4645
expect(order.unpublished_events.to_a).to eq([order_created])
4746
end
@@ -51,6 +50,12 @@ def apply_order_expired(_event)
5150
expect(order.unpublished_events.to_a).to be_empty
5251
end
5352

53+
it "should raise error for missing apply method based on a default apply strategy" do
54+
order = order_klass.new(uuid)
55+
spanish_inquisition = Orders::Events::SpanishInquisition.new
56+
expect { order.apply(spanish_inquisition) }.to raise_error(AggregateRoot::MissingHandler, "Missing handler method on aggregate #{order_klass} for Orders::Events::SpanishInquisition")
57+
end
58+
5459
it "should receive a method call based on a default apply strategy" do
5560
order = order_klass.new(uuid)
5661
order_created = Orders::Events::OrderCreated.new
@@ -59,15 +64,6 @@ def apply_order_expired(_event)
5964
expect(order.status).to eq :created
6065
end
6166

62-
it "should raise error for missing apply method based on a default apply strategy" do
63-
order = order_klass.new(uuid)
64-
spanish_inquisition = Orders::Events::SpanishInquisition.new
65-
expect { order.apply(spanish_inquisition) }.to raise_error(
66-
AggregateRoot::MissingHandler,
67-
"Missing handler method apply_spanish_inquisition on aggregate #{order_klass}"
68-
)
69-
end
70-
7167
it "should ignore missing apply method based on a default non-strict apply strategy" do
7268
klass =
7369
Class.new { include AggregateRoot.with_strategy(-> { AggregateRoot::DefaultApplyStrategy.new(strict: false) }) }

aggregate_root/spec/instrumented_repository_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ def expire
2727

2828
private
2929

30-
def apply_order_created(_event)
30+
on Orders::Events::OrderCreated do |_event|
3131
@status = :created
3232
end
3333

34-
def apply_order_expired(_event)
34+
on Orders::Events::OrderExpired do |_event|
3535
@status = :expired
3636
end
3737
end

aggregate_root/spec/repository_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ def expire
2929

3030
private
3131

32-
def apply_order_created(_event)
32+
on Orders::Events::OrderCreated do |_event|
3333
@status = :created
3434
end
3535

36-
def apply_order_expired(_event)
36+
on Orders::Events::OrderExpired do |_event|
3737
@status = :expired
3838
end
3939
end

aggregate_root/spec/transform_spec.rb

Lines changed: 0 additions & 12 deletions
This file was deleted.

0 commit comments

Comments
 (0)