midnight-business_logic 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7a1af7d6b0800d421c4e51312f0cc207f610c818596e70b3564e28549d996bba
4
- data.tar.gz: 3e831d94f32cad68264a501a7fd85edfe108a230bdd509ffe08321c2b3561a25
3
+ metadata.gz: 0746f394c8c1334e4eaf674bdfc9abe158d0a32485735515a739e43ff868f3f5
4
+ data.tar.gz: eff166d26277b30bf653685654ad49777f61a19906a8951e865a8aa9972655b8
5
5
  SHA512:
6
- metadata.gz: 96151418d23b9a579d78819d9da9ffb200e10cdbd821dde1e07653efa0f88c75f42ba3cc7dc7ffde3f7c55053da1bbf48035f3b006ed170da85dbf60a4c0b496
7
- data.tar.gz: ecf9209ffc37101ab74e6989069e317c11f9b9254f24a82a0526cc16997312324f77525ab43b79abb6c9eca2c3fc37e45c9808a036197e7f1ec8a1da7a2fd46c
6
+ metadata.gz: 12fe01a09e3892b7d1de16a79c6a02b31758703150517b7672e706858328b41f361ed5f472a89c8a0b9457c6fcc7874ef7f95b34413ad2cc2aeafc0a69d039d0
7
+ data.tar.gz: 1ae7d14bde5fbadff1a429b78d1fb1575b3eb5168a91284a62e367fa6fd490b3208bc88884b8d8e1664f15d878b01701f091319a04d22dc32ed39054f28353c6
@@ -15,5 +15,7 @@ module Midnight
15
15
  autoload :AggregateRoot
16
16
  autoload :Event
17
17
  autoload :EventDispatcher
18
+ autoload :EventQueue
19
+ autoload :EventRouter
18
20
  end
19
21
  end
@@ -1,70 +1,40 @@
1
- require 'active_support/core_ext/object/blank'
2
-
3
1
  module Midnight
4
2
  module BusinessLogic
5
3
  class EventDispatcher
6
- class InvalidHandlerSupplied < ArgumentError
7
- end
8
-
9
- def initialize(handlers_map = {})
10
- handlers_map.each do |_event_class, handler_list|
11
- handler_list.each do |handler|
12
- raise InvalidHandlerSupplied unless handler.respond_to?(:call)
13
- # correct construction example:
14
- # EventDispatcher.new(SomeEvent => [
15
- # method(:puts)
16
- # ])
4
+ def initialize(*handlers)
5
+ handlers = handlers.map do |handler|
6
+ if handler.respond_to?(:arity)
7
+ handler
8
+ else
9
+ handler.method(:call)
17
10
  end
11
+ rescue ::NameError
12
+ reject_handlers
18
13
  end
19
- @_handlers_map = handlers_map
14
+ @handlers = handlers
15
+ @arity_mismatched = /wrong\s+number\s+of\s+arguments/i
20
16
  freeze
21
17
  end
22
18
 
23
- def once(event, **_)
24
- handler_list = @_handlers_map[event.class]
25
- unless handler_list.blank?
26
- handler_list.each do |handler|
27
- handler.call(event)
28
- end
19
+ def call(\
20
+ events,
21
+ # consumers are forbidden
22
+ # to pass metadata with _event_handlers as a key
23
+ _event_handlers: @handlers,
24
+ **metadata
25
+ )
26
+ _event_handlers.each do |handler|
27
+ handler.call(events, **metadata)
28
+ rescue ::ArgumentError => e
29
+ raise e unless @arity_mismatched =~ e.message
30
+ handler.call(events)
29
31
  end
30
32
  end
31
33
 
32
- def batch(events, **_)
33
- events.each(&method(:once))
34
- end
35
- end
34
+ private
36
35
 
37
- class CompositeEventDispatcher # quack like EventDispatcher
38
- def initialize(*dispatchers)
39
- @_dispatchers = dispatchers
40
- freeze
41
- end
42
-
43
- def once(event, **metadata)
44
- @_dispatchers.each do |dispatcher|
45
- dispatcher.once(event, metadata)
46
- end
47
- end
48
-
49
- def batch(events, **metadata)
50
- events.each do |event|
51
- once(event, metadata)
52
- end
53
- end
54
- end
55
- private_constant :CompositeEventDispatcher
56
-
57
- class EventDispatcher
58
- class InvalidDispatcherSupplied < ArgumentError;
59
- end
60
-
61
- class << self
62
- def merge(*dispatchers)
63
- raise InvalidDispatcherSupplied unless dispatchers.all? do |dispatcher|
64
- dispatcher.respond_to?(:once)
65
- end
66
- CompositeEventDispatcher.new(*dispatchers)
67
- end
36
+ def reject_handlers
37
+ raise ::ArgumentError, 'Invalid event handler'
68
38
  end
69
39
  end
70
40
  end
@@ -0,0 +1,11 @@
1
+ module Midnight
2
+ module BusinessLogic
3
+ class EventQueue < EventDispatcher
4
+ def call(events, **metadata)
5
+ events.each do |event|
6
+ super(event, **metadata)
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,37 @@
1
+ require 'active_support/core_ext/object/blank'
2
+
3
+ module Midnight
4
+ module BusinessLogic
5
+ class EventRouter < EventDispatcher
6
+ def initialize(handlers_map = {})
7
+ # construction example:
8
+ # EventRouter.new(SomeEvent => [
9
+ # method(:puts)
10
+ # ])
11
+ begin
12
+ handlers_map.each do |_event_class, handlers|
13
+ Array(handlers).each do |handler|
14
+ reject_handlers unless handler.respond_to?(:call)
15
+ end
16
+ end
17
+ rescue ::NoMethodError => e
18
+ raise e unless e.name == :each
19
+ reject_handlers
20
+ end
21
+ @handlers_map = handlers_map
22
+ @arity_mismatched = /wrong\s+number\s+of\s+arguments/i
23
+ freeze
24
+ end
25
+
26
+ def call(event, **metadata)
27
+ handlers = @handlers_map[event.class]
28
+ return if handlers.blank?
29
+ super(
30
+ event,
31
+ _event_handlers: Array(handlers),
32
+ **metadata
33
+ )
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,5 +1,5 @@
1
1
  module Midnight
2
2
  module BusinessLogic
3
- VERSION = '0.0.3'
3
+ VERSION = '0.0.4'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: midnight-business_logic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sarun Rattanasiri
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-12 00:00:00.000000000 Z
11
+ date: 2019-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -36,6 +36,8 @@ files:
36
36
  - lib/midnight/business_logic/aggregate_root.rb
37
37
  - lib/midnight/business_logic/event.rb
38
38
  - lib/midnight/business_logic/event_dispatcher.rb
39
+ - lib/midnight/business_logic/event_queue.rb
40
+ - lib/midnight/business_logic/event_router.rb
39
41
  - lib/midnight/business_logic/version.rb
40
42
  - lib/midnight/commons/concurrent_write_error.rb
41
43
  - lib/midnight/commons/constants.rb
@@ -43,7 +45,7 @@ homepage: https://gitlab.com/slime-systems/midnight-enterprise-toolkit/tree/mast
43
45
  licenses:
44
46
  - BSD-3-Clause
45
47
  metadata:
46
- source_code_uri: https://gitlab.com/slime-systems/midnight-enterprise-toolkit/tree/v0.0.3/midnight-business_logic
48
+ source_code_uri: https://gitlab.com/slime-systems/midnight-enterprise-toolkit/tree/v0.0.4/midnight-business_logic
47
49
  post_install_message:
48
50
  rdoc_options: []
49
51
  require_paths: