midnight-business_logic 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: