evil_events 0.2.0 → 0.3.0
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 +4 -4
- data/.hound.yml +2 -0
- data/.rubocop.yml +12 -0
- data/.travis.yml +3 -2
- data/CHANGELOG.md +18 -0
- data/evil_events.gemspec +3 -3
- data/lib/evil_events/application.rb +7 -0
- data/lib/evil_events/core/broadcasting/emitter.rb +5 -7
- data/lib/evil_events/core/config.rb +16 -1
- data/lib/evil_events/core/events/abstract_event.rb +2 -0
- data/lib/evil_events/core/events/event_extensions/class_signature/signature.rb +1 -1
- data/lib/evil_events/core/events/event_extensions/class_signature.rb +1 -1
- data/lib/evil_events/core/events/event_extensions/emittable.rb +29 -0
- data/lib/evil_events/core/events/event_extensions/hookable/abstract_hook.rb +27 -0
- data/lib/evil_events/core/events/event_extensions/hookable/after_emit_hook.rb +11 -0
- data/lib/evil_events/core/events/event_extensions/hookable/before_emit_hook.rb +11 -0
- data/lib/evil_events/core/events/event_extensions/hookable/on_error_hook.rb +16 -0
- data/lib/evil_events/core/events/event_extensions/hookable.rb +93 -0
- data/lib/evil_events/core/events/event_extensions/type_aliasing.rb +6 -12
- data/lib/evil_events/core/events/event_factory.rb +4 -4
- data/lib/evil_events/core/events/manager.rb +14 -12
- data/lib/evil_events/core/events/manager_factory.rb +2 -7
- data/lib/evil_events/core/events/manager_registry.rb +8 -15
- data/lib/evil_events/core/events/notifier/abstract.rb +26 -0
- data/lib/evil_events/core/events/notifier/builder.rb +43 -0
- data/lib/evil_events/core/events/notifier/logging.rb +43 -0
- data/lib/evil_events/core/events/notifier/proxy.rb +33 -0
- data/lib/evil_events/core/events/notifier/sequential.rb +41 -0
- data/lib/evil_events/core/events/notifier/worker/executor.rb +102 -0
- data/lib/evil_events/core/events/notifier/worker/job.rb +35 -0
- data/lib/evil_events/core/events/notifier/worker.rb +71 -0
- data/lib/evil_events/core/events/notifier.rb +6 -0
- data/lib/evil_events/core/events/serializers/hash.rb +9 -7
- data/lib/evil_events/core/events/serializers/json.rb +11 -6
- data/lib/evil_events/core/events/serializers.rb +0 -7
- data/lib/evil_events/core/events/subscriber/mixin.rb +2 -2
- data/lib/evil_events/core/events.rb +14 -1
- data/lib/evil_events/core/system/broadcaster.rb +23 -1
- data/lib/evil_events/core/system/mock.rb +7 -0
- data/lib/evil_events/core/system.rb +3 -1
- data/lib/evil_events/core.rb +0 -1
- data/lib/evil_events/error.rb +96 -0
- data/lib/evil_events/plugins/{rails.rb → redis_adapter.rb} +2 -2
- data/lib/evil_events/plugins/{elastic_search.rb → sidekiq_adapter.rb} +2 -2
- data/lib/evil_events/plugins.rb +15 -13
- data/lib/evil_events/shared/extensions_mixin.rb +7 -0
- data/lib/evil_events/shared/type_converter/converter_registry.rb +2 -2
- data/lib/evil_events/shared.rb +1 -0
- data/lib/evil_events/version.rb +1 -1
- data/lib/evil_events.rb +1 -0
- metadata +27 -12
- data/lib/evil_events/core/error.rb +0 -8
- data/lib/evil_events/core/events/manager/notifier.rb +0 -79
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e81af2ef5e25afbc5c4364b377c2b70720fa3d41
|
4
|
+
data.tar.gz: d9adbc345247a59247f3ac6b33ea09eefd604b4c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd67713c85af8fee6105d6df4d989a1060b527a125005e0fd7b113c73edbcfa9c033293b70798e0e2d33ebb3feb5a68044e0cadf71b49e773068b75f989de449
|
7
|
+
data.tar.gz: 67b06826b3ead1501c3b3c2b3d741d2addaf5a03d1752991ae176457f69c85f165adc65e7f4d6a857b912cb6557c772f3b5f70fa9ff101f20395aaf9d40a2e72
|
data/.hound.yml
ADDED
data/.rubocop.yml
CHANGED
@@ -53,9 +53,18 @@ Style/ParallelAssignment:
|
|
53
53
|
Style/CommentedKeyword:
|
54
54
|
Enabled: false
|
55
55
|
|
56
|
+
Style/EvalWithLocation:
|
57
|
+
Enabled: false
|
58
|
+
|
56
59
|
Lint/AmbiguousRegexpLiteral:
|
57
60
|
Enabled: false
|
58
61
|
|
62
|
+
Lint/HandleExceptions:
|
63
|
+
Enabled: false
|
64
|
+
|
65
|
+
Lint/UnusedBlockArgument:
|
66
|
+
Enabled: false
|
67
|
+
|
59
68
|
Naming/FileName:
|
60
69
|
Enabled: false
|
61
70
|
|
@@ -104,3 +113,6 @@ RSpec/LetSetup:
|
|
104
113
|
|
105
114
|
RSpec/AnyInstance:
|
106
115
|
Enabled: false
|
116
|
+
|
117
|
+
RSpec/ExpectChange:
|
118
|
+
Enabled: false
|
data/.travis.yml
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
|
+
- 2.2.8
|
3
4
|
- 2.3.5
|
4
5
|
- 2.4.2
|
5
|
-
- 2.
|
6
|
+
- 2.5.0
|
6
7
|
- ruby-head
|
7
8
|
- jruby-head
|
8
9
|
|
9
10
|
sudo: false
|
10
|
-
before_install: gem install bundler
|
11
|
+
before_install: gem install bundler
|
11
12
|
cache: bundler
|
12
13
|
script: bundle exec rspec
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,24 @@
|
|
1
1
|
# Changelog
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
|
4
|
+
## [0.3.0] - 2018-02-25
|
5
|
+
### Added
|
6
|
+
- Support for Ruby 2.5.0
|
7
|
+
- Introduce Event Emition Hooks API. Supported hooks (are decalred in an event class):
|
8
|
+
- `before_emit -> (event) {} # proc/lambda` - invoked once before an event emition process;
|
9
|
+
- `after_emit -> (event) {} # proc/lambda` - invoked once after an event emition process;
|
10
|
+
- `on_error -> (event, error) {} # proc/lambda` - invoked on each raised error due to emition process
|
11
|
+
(usually these errors are raised by subscribers and their's event processing methods)
|
12
|
+
- Added `AbstractEvent.emit!(**event_attributes)` method to provide an ability to emit events via event class constant.
|
13
|
+
|
14
|
+
### Changed
|
15
|
+
- New more convenient exception hierarchy: now all exceptions live under `EvilEvents` namespace.
|
16
|
+
- Full refactoring of the event notification abstraction. New types of notifying processes:
|
17
|
+
- `sequential` (single-threaded): ordered notification logic, subscribers are notified one after the other;
|
18
|
+
- `worker` (multi-threaded): unordered notification logic, each subscriber is notified in own thread (depending on the settings);
|
19
|
+
- Process type should be globally pre-configured before application startup (new configuration options for each type of process);
|
20
|
+
- Notifier can be restarted via `EvilEvents::Application.restart_event_notifier` (it would be convenient to have an ability to reload/restart notifier object in development mode interactively).
|
21
|
+
|
4
22
|
## [0.2.0] - 2017-11-19
|
5
23
|
### Added
|
6
24
|
- Support for custom coercive types:
|
data/evil_events.gemspec
CHANGED
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
|
|
27
27
|
end
|
28
28
|
|
29
29
|
spec.add_dependency 'dry-monads', '~> 0.4.0'
|
30
|
-
spec.add_dependency 'dry-types', '~> 0.12.
|
30
|
+
spec.add_dependency 'dry-types', '~> 0.12.2'
|
31
31
|
spec.add_dependency 'dry-struct', '~> 0.3.1'
|
32
32
|
spec.add_dependency 'dry-configurable', '~> 0.7.0'
|
33
33
|
spec.add_dependency 'dry-container', '~> 0.6.0'
|
@@ -36,9 +36,9 @@ Gem::Specification.new do |spec|
|
|
36
36
|
spec.add_development_dependency 'coveralls', '~> 0.8.21'
|
37
37
|
spec.add_development_dependency 'simplecov', '~> 0.14.1'
|
38
38
|
spec.add_development_dependency 'simplecov-json', '~> 0.2'
|
39
|
-
spec.add_development_dependency 'rubocop', '~> 0.
|
39
|
+
spec.add_development_dependency 'rubocop', '~> 0.52.1'
|
40
40
|
spec.add_development_dependency 'rspec', '~> 3.7.0'
|
41
|
-
spec.add_development_dependency 'rubocop-rspec', '~> 1.
|
41
|
+
spec.add_development_dependency 'rubocop-rspec', '~> 1.23.0'
|
42
42
|
|
43
43
|
spec.add_development_dependency 'pry'
|
44
44
|
spec.add_development_dependency 'rake'
|
@@ -11,6 +11,13 @@ module EvilEvents
|
|
11
11
|
def registered_events
|
12
12
|
EvilEvents::Core::Bootstrap[:event_system].registered_events
|
13
13
|
end
|
14
|
+
|
15
|
+
# @see EvilEvents::Core::System
|
16
|
+
# @api public
|
17
|
+
# @since 0.3.0
|
18
|
+
def restart_event_notifier
|
19
|
+
EvilEvents::Core::Bootstrap[:event_system].restart_event_notifier
|
20
|
+
end
|
14
21
|
end
|
15
22
|
end
|
16
23
|
end
|
@@ -4,18 +4,16 @@ module EvilEvents::Core::Broadcasting
|
|
4
4
|
# @api private
|
5
5
|
# @since 0.1.0
|
6
6
|
class Emitter
|
7
|
-
# @since 0.1.0
|
8
|
-
EmitterError = Class.new(EvilEvents::Core::Error)
|
9
|
-
# @since 0.1.0
|
10
|
-
IncorrectEventError = Class.new(EmitterError)
|
11
|
-
|
12
7
|
# @param event [EvilEvents::Core::Events::AbstractEvent]
|
13
|
-
# @raise [
|
8
|
+
# @raise [EvilEvents::IncorrectEventForEmitError]
|
14
9
|
# @return void
|
15
10
|
#
|
16
11
|
# @since 0.1.0
|
17
12
|
def emit(event)
|
18
|
-
|
13
|
+
unless event.is_a?(EvilEvents::Core::Events::AbstractEvent)
|
14
|
+
raise EvilEvents::IncorrectEventForEmitError
|
15
|
+
end
|
16
|
+
|
19
17
|
log_activity(event)
|
20
18
|
event.adapter.call(event)
|
21
19
|
end
|
@@ -14,7 +14,7 @@ module EvilEvents::Core
|
|
14
14
|
|
15
15
|
# @api private
|
16
16
|
# @since 0.1.0
|
17
|
-
def initialize
|
17
|
+
def initialize # rubocop:disable Metrics/AbcSize
|
18
18
|
@config = Module.new do
|
19
19
|
extend EvilEvents::Shared::Configurable
|
20
20
|
|
@@ -27,6 +27,21 @@ module EvilEvents::Core
|
|
27
27
|
end
|
28
28
|
|
29
29
|
setting :logger, EvilEvents::Shared::Logger.new(STDOUT), reader: true
|
30
|
+
|
31
|
+
setting :notifier, reader: true do
|
32
|
+
setting :type, :sequential
|
33
|
+
|
34
|
+
setting :sequential, reader: true do
|
35
|
+
# NOTE: place future settings here
|
36
|
+
end
|
37
|
+
|
38
|
+
setting :worker, reader: true do
|
39
|
+
setting :min_threads, 0
|
40
|
+
setting :max_threads, 5
|
41
|
+
setting :max_queue, 1000
|
42
|
+
setting :fallback_policy, :main_thread
|
43
|
+
end
|
44
|
+
end
|
30
45
|
end
|
31
46
|
end
|
32
47
|
|
@@ -23,6 +23,8 @@ module EvilEvents::Core::Events
|
|
23
23
|
include EventExtensions::MetadataExtendable
|
24
24
|
# @sicne 0.2.0
|
25
25
|
include EventExtensions::ClassSignature
|
26
|
+
# @since 0.3.0
|
27
|
+
include EventExtensions::Hookable
|
26
28
|
# @since 0.1.0
|
27
29
|
extend EvilEvents::Shared::CombinedContext::Mixin
|
28
30
|
|
@@ -34,7 +34,7 @@ module EvilEvents::Core::Events::EventExtensions::ClassSignature
|
|
34
34
|
#
|
35
35
|
# @since 0.2.0
|
36
36
|
def class_stamp
|
37
|
-
{ name: event_class.name, creation_strategy: event_class.
|
37
|
+
{ name: event_class.name, creation_strategy: event_class.__creation_strategy__ }
|
38
38
|
end
|
39
39
|
|
40
40
|
# @return [String]
|
@@ -4,9 +4,38 @@ module EvilEvents::Core::Events::EventExtensions
|
|
4
4
|
# @api private
|
5
5
|
# @since 0.1.0
|
6
6
|
module Emittable
|
7
|
+
class << self
|
8
|
+
# @param base_class [Class{AbstractEvent}]
|
9
|
+
#
|
10
|
+
# @api private
|
11
|
+
# @since 0.3.0
|
12
|
+
def included(base_class)
|
13
|
+
base_class.extend(ClassMethods)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return void
|
18
|
+
#
|
19
|
+
# @api public
|
7
20
|
# @since 0.1.0
|
8
21
|
def emit!
|
9
22
|
EvilEvents::Core::Bootstrap[:event_system].emit(self)
|
10
23
|
end
|
24
|
+
|
25
|
+
module ClassMethods
|
26
|
+
# @option id [NilClass, Object]
|
27
|
+
# @option payload [Hash]
|
28
|
+
# @option metadata [Hash]
|
29
|
+
# @return void
|
30
|
+
#
|
31
|
+
# @see EvilEvents::Core::Events::AbstractEvent#initialize
|
32
|
+
# @see EvilEvents::Core::Events::EventExtensions::Emittable#emit!
|
33
|
+
#
|
34
|
+
# @api public
|
35
|
+
# @since 0.3.0
|
36
|
+
def emit!(**event_attributes)
|
37
|
+
new(**event_attributes).emit!
|
38
|
+
end
|
39
|
+
end
|
11
40
|
end
|
12
41
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module EvilEvents::Core::Events::EventExtensions::Hookable
|
4
|
+
# @api private
|
5
|
+
# @since 0.3.0
|
6
|
+
class AbstractHook
|
7
|
+
# @return [#call]
|
8
|
+
#
|
9
|
+
# @since 0.3.0
|
10
|
+
attr_reader :callable
|
11
|
+
|
12
|
+
# @param callable [#call]
|
13
|
+
#
|
14
|
+
# @since 0.3.0
|
15
|
+
def initialize(callable)
|
16
|
+
@callable = callable
|
17
|
+
end
|
18
|
+
|
19
|
+
# @param source [Object]
|
20
|
+
# @return void
|
21
|
+
#
|
22
|
+
# @since 0.3.0
|
23
|
+
def call(source)
|
24
|
+
callable.call(source)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module EvilEvents::Core::Events::EventExtensions::Hookable
|
4
|
+
# @api private
|
5
|
+
# @since 0.3.0
|
6
|
+
class AfterEmitHook < AbstractHook
|
7
|
+
# @!method call(source)
|
8
|
+
# @param source [EvilEvents::Core::Events::AbstractEvent]
|
9
|
+
# @return void
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module EvilEvents::Core::Events::EventExtensions::Hookable
|
4
|
+
# @api private
|
5
|
+
# @since 0.3.0
|
6
|
+
class BeforeEmitHook < AbstractHook
|
7
|
+
# @!method call(source)
|
8
|
+
# @param source [EvilEvents::Core::Events::AbstractEvent]
|
9
|
+
# @return void
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module EvilEvents::Core::Events::EventExtensions::Hookable
|
4
|
+
# @api private
|
5
|
+
# @since 0.3.0
|
6
|
+
class OnErrorHook < AbstractHook
|
7
|
+
# @param event [EvilEvents::Core::Events::AbstractEvent]
|
8
|
+
# @param error [StandardError]
|
9
|
+
# @return void
|
10
|
+
#
|
11
|
+
# @since 0.3.0
|
12
|
+
def call(event, error)
|
13
|
+
callable.call(event, error)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module EvilEvents::Core::Events::EventExtensions
|
4
|
+
# @api private
|
5
|
+
# @since 0.3.0
|
6
|
+
module Hookable
|
7
|
+
class << self
|
8
|
+
# @param base_class [Class]
|
9
|
+
#
|
10
|
+
# @since 0.3.0
|
11
|
+
def included(base_class)
|
12
|
+
base_class.extend(ClassMethods)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# @param error [StandardError]
|
17
|
+
#
|
18
|
+
# @api private
|
19
|
+
# @since 0.3.0
|
20
|
+
def __call_on_error_hooks__(error)
|
21
|
+
self.class.__on_error_hooks__.each do |hook|
|
22
|
+
hook.call(self, error)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# @api private
|
27
|
+
# @since 0.3.0
|
28
|
+
def __call_before_hooks__
|
29
|
+
self.class.__before_emit_hooks__.each do |hook|
|
30
|
+
hook.call(self)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# @api private
|
35
|
+
# @since 0.3.0
|
36
|
+
def __call_after_hooks__
|
37
|
+
self.class.__after_emit_hooks__.each do |hook|
|
38
|
+
hook.call(self)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# @since 0.3.0
|
43
|
+
module ClassMethods
|
44
|
+
# @param hook [#call]
|
45
|
+
#
|
46
|
+
# @api public
|
47
|
+
# @since 0.3.0
|
48
|
+
def before_emit(hook)
|
49
|
+
__before_emit_hooks__ << BeforeEmitHook.new(hook)
|
50
|
+
end
|
51
|
+
|
52
|
+
# @param hook [#call]
|
53
|
+
#
|
54
|
+
# @api public
|
55
|
+
# @since 0.3.0
|
56
|
+
def after_emit(hook)
|
57
|
+
__after_emit_hooks__ << AfterEmitHook.new(hook)
|
58
|
+
end
|
59
|
+
|
60
|
+
# @param hook [#call]
|
61
|
+
#
|
62
|
+
# @api public
|
63
|
+
# @since 0.3.0
|
64
|
+
def on_error(hook)
|
65
|
+
__on_error_hooks__ << OnErrorHook.new(hook)
|
66
|
+
end
|
67
|
+
|
68
|
+
# @return [Concurrent::Array<BeforeHook>]
|
69
|
+
#
|
70
|
+
# @api private
|
71
|
+
# @since 0.3.0
|
72
|
+
def __before_emit_hooks__
|
73
|
+
@__before_emit_hooks__ ||= Concurrent::Array.new
|
74
|
+
end
|
75
|
+
|
76
|
+
# @return [Concurrent::Array<AfterHook>]
|
77
|
+
#
|
78
|
+
# @api private
|
79
|
+
# @since 0.3.0
|
80
|
+
def __after_emit_hooks__
|
81
|
+
@__after_emit_hooks__ ||= Concurrent::Array.new
|
82
|
+
end
|
83
|
+
|
84
|
+
# @return [Concurrent::Array<OnErrorHook>]
|
85
|
+
#
|
86
|
+
# @api private
|
87
|
+
# @since 0.3.0
|
88
|
+
def __on_error_hooks__
|
89
|
+
@__on_error_hooks__ ||= Concurrent::Array.new
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -4,15 +4,6 @@ module EvilEvents::Core::Events::EventExtensions
|
|
4
4
|
# @api private
|
5
5
|
# @since 0.1.0
|
6
6
|
module TypeAliasing
|
7
|
-
# @since 0.1.0
|
8
|
-
TypeAliasingError = Class.new(EvilEvents::Core::Error)
|
9
|
-
# @since 0.1.0
|
10
|
-
IncopatibleEventTypeError = Class.new(TypeAliasingError)
|
11
|
-
# @since 0.1.0
|
12
|
-
EventTypeNotDefinedError = Class.new(TypeAliasingError)
|
13
|
-
# @since 0.1.0
|
14
|
-
EventTypeAlreadyDefinedError = Class.new(TypeAliasingError)
|
15
|
-
|
16
7
|
class << self
|
17
8
|
# @param base_class [Class]
|
18
9
|
#
|
@@ -31,17 +22,20 @@ module EvilEvents::Core::Events::EventExtensions
|
|
31
22
|
|
32
23
|
module ClassMethods
|
33
24
|
# @param type_alias [String, NilClass]
|
25
|
+
# @raise [EvilEvents::IncopatibleEventTypeError]
|
26
|
+
# @raise [EvilEvents::EventTypeNotDefinedError]
|
27
|
+
# @raise [EvilEvents::EventTypeAlreadyDefinedError]
|
34
28
|
# @return [String]
|
35
29
|
#
|
36
30
|
# @since 0.1.0
|
37
31
|
def type(type_alias = nil)
|
38
32
|
case
|
39
33
|
when incompatible_type_alias_type?(type_alias)
|
40
|
-
raise IncopatibleEventTypeError
|
34
|
+
raise EvilEvents::IncopatibleEventTypeError
|
41
35
|
when fetching_type_alias_when_type_alias_not_defined?(type_alias)
|
42
|
-
raise EventTypeNotDefinedError
|
36
|
+
raise EvilEvents::EventTypeNotDefinedError
|
43
37
|
when providing_type_alias_when_type_alias_already_defined?(type_alias)
|
44
|
-
raise EventTypeAlreadyDefinedError
|
38
|
+
raise EvilEvents::EventTypeAlreadyDefinedError
|
45
39
|
when tries_to_define_type_alias_first_time?(type_alias)
|
46
40
|
@type = type_alias
|
47
41
|
end
|
@@ -19,14 +19,14 @@ module EvilEvents::Core::Events
|
|
19
19
|
def create_abstract_class(event_type)
|
20
20
|
Class.new(AbstractEvent).tap do |klass|
|
21
21
|
klass.type(event_type)
|
22
|
-
klass.
|
22
|
+
klass.__creation_strategy__ = CLASS_INHERITANCE_STRATEGY
|
23
23
|
|
24
24
|
class << klass
|
25
25
|
def inherited(child_class)
|
26
26
|
child_class.type(type)
|
27
|
-
child_class.
|
27
|
+
child_class.__creation_strategy__ = CLASS_INHERITANCE_STRATEGY
|
28
28
|
child_class.manage!
|
29
|
-
rescue EvilEvents::
|
29
|
+
rescue EvilEvents::AlreadyManagedEventClassError
|
30
30
|
EvilEvents::Core::Bootstrap[:event_system].unregister_event_class(child_class)
|
31
31
|
raise
|
32
32
|
end
|
@@ -44,7 +44,7 @@ module EvilEvents::Core::Events
|
|
44
44
|
def create_class(event_type, &event_class_definitions)
|
45
45
|
Class.new(AbstractEvent).tap do |klass|
|
46
46
|
begin
|
47
|
-
klass.
|
47
|
+
klass.__creation_strategy__ = PROC_EVAL_STRATEGY
|
48
48
|
klass.type(event_type)
|
49
49
|
klass.manage!
|
50
50
|
klass.evaluate(&event_class_definitions) if block_given?
|
@@ -4,13 +4,6 @@ module EvilEvents::Core::Events
|
|
4
4
|
# @api private
|
5
5
|
# @since 0.1.0
|
6
6
|
class Manager
|
7
|
-
# @since 0.1.0
|
8
|
-
ManagerError = Class.new(EvilEvents::Core::Error)
|
9
|
-
# @since 0.1.0
|
10
|
-
InconsistentEventClassError = Class.new(ManagerError)
|
11
|
-
# @since 0.1.0
|
12
|
-
InvalidDelegatorTypeError = Class.new(ManagerError)
|
13
|
-
|
14
7
|
# @return [EvilEvents::Core::Events::AbstractEvent]
|
15
8
|
#
|
16
9
|
# @since 0.1.0
|
@@ -31,7 +24,7 @@ module EvilEvents::Core::Events
|
|
31
24
|
|
32
25
|
# @param raw_subscriber [Object]
|
33
26
|
# @param delegator [Symbol, String, NilClass]
|
34
|
-
# @raise [InvalidDelegatorTypeError]
|
27
|
+
# @raise [EvilEvents::InvalidDelegatorTypeError]
|
35
28
|
# @return void
|
36
29
|
#
|
37
30
|
# @since 0.1.0
|
@@ -40,19 +33,20 @@ module EvilEvents::Core::Events
|
|
40
33
|
when NilClass, Symbol, String
|
41
34
|
subscribers.push(create_event_subscriber(raw_subscriber, delegator))
|
42
35
|
else
|
43
|
-
raise InvalidDelegatorTypeError
|
36
|
+
raise EvilEvents::InvalidDelegatorTypeError
|
44
37
|
end
|
45
38
|
end
|
46
39
|
|
47
40
|
# @param event [EvilEvents::Core::Events::AbstractEvent]
|
48
|
-
# @raise [
|
49
|
-
# @raise [
|
41
|
+
# @raise [EvilEvents::InconsistentEventClassError]
|
42
|
+
# @raise [EvilEvents::FailedNotifiedSubscribersError]
|
50
43
|
#
|
51
44
|
# @return void
|
52
45
|
#
|
53
46
|
# @since 0.1.0
|
54
47
|
def notify(event)
|
55
|
-
|
48
|
+
raise EvilEvents::InconsistentEventClassError unless supported_event?(event)
|
49
|
+
EvilEvents::Core::Bootstrap[:event_system].process_event_notification(self, event)
|
56
50
|
end
|
57
51
|
|
58
52
|
# @return [String, Symbol]
|
@@ -64,6 +58,14 @@ module EvilEvents::Core::Events
|
|
64
58
|
|
65
59
|
private
|
66
60
|
|
61
|
+
# @param event [EvilEvents::Core::Events::AbstractEvent]
|
62
|
+
# @return [Boolean]
|
63
|
+
#
|
64
|
+
# @since 0.3.0
|
65
|
+
def supported_event?(event)
|
66
|
+
event.is_a?(event_class)
|
67
|
+
end
|
68
|
+
|
67
69
|
# @param raw_subscriber [Object]
|
68
70
|
# @param delegator [Symbol, String, NilClass]
|
69
71
|
# @return [EvilEvents::Core::Events::Subscriber]
|
@@ -4,20 +4,15 @@ module EvilEvents::Core::Events
|
|
4
4
|
# @api private
|
5
5
|
# @since 0.1.0
|
6
6
|
module ManagerFactory
|
7
|
-
# @since 0.1.0
|
8
|
-
ManagerFactoryError = Class.new(EvilEvents::Core::Error)
|
9
|
-
# @since 0.1.0
|
10
|
-
IncorrectEventClassError = Class.new(ManagerFactoryError)
|
11
|
-
|
12
7
|
class << self
|
13
8
|
# @param event_class [Class{EvilEvents::Core::Events::AbstractEvent}]
|
14
|
-
# @raise [IncorrectEventClassError]
|
9
|
+
# @raise [EvilEvents::IncorrectEventClassError]
|
15
10
|
# @return [EvilEvents::Core::Events::Manager]
|
16
11
|
#
|
17
12
|
# @since 0.1.0
|
18
13
|
def create(event_class)
|
19
14
|
unless event_class.is_a?(Class) && event_class < EvilEvents::Core::Events::AbstractEvent
|
20
|
-
raise IncorrectEventClassError
|
15
|
+
raise EvilEvents::IncorrectEventClassError
|
21
16
|
end
|
22
17
|
|
23
18
|
Manager.new(event_class)
|
@@ -7,15 +7,6 @@ module EvilEvents::Core::Events
|
|
7
7
|
# @since 0.1.0
|
8
8
|
extend Forwardable
|
9
9
|
|
10
|
-
# @since 0.1.0
|
11
|
-
ManagerRegistryError = Class.new(EvilEvents::Core::Error)
|
12
|
-
# @since 0.1.0
|
13
|
-
IncorrectManagerObjectError = Class.new(ManagerRegistryError)
|
14
|
-
# @since 0.1.0
|
15
|
-
NonManagedEventClassError = Class.new(ManagerRegistryError)
|
16
|
-
# @since 0.1.0
|
17
|
-
AlreadyManagedEventClassError = Class.new(ManagerRegistryError)
|
18
|
-
|
19
10
|
# @since 0.1.0
|
20
11
|
def_delegators :managers, :empty?, :size
|
21
12
|
|
@@ -30,13 +21,13 @@ module EvilEvents::Core::Events
|
|
30
21
|
end
|
31
22
|
|
32
23
|
# @param event_class [Class{EvilEvents::Core::Events::AbstractEvent}]
|
33
|
-
# @raise [NonManagedEventClassError]
|
24
|
+
# @raise [EvilEvents::NonManagedEventClassError]
|
34
25
|
# @return [EvilEvents::Core::Events::Manager]
|
35
26
|
#
|
36
27
|
# @since 0.1.0
|
37
28
|
def manager_of_event(event_class)
|
38
29
|
# NOTE: raise exceptions to simplify runtime problems
|
39
|
-
managers[event_class] || (raise NonManagedEventClassError)
|
30
|
+
managers[event_class] || (raise EvilEvents::NonManagedEventClassError)
|
40
31
|
end
|
41
32
|
|
42
33
|
# @param event_type [String]
|
@@ -77,18 +68,20 @@ module EvilEvents::Core::Events
|
|
77
68
|
end
|
78
69
|
|
79
70
|
# @param manager [EvilEvents::Core::Events::Manager]
|
80
|
-
# @raise [IncorrectManagerObjectError]
|
81
|
-
# @raise [AlreadyManagedEventClassError]
|
71
|
+
# @raise [EvilEvents::IncorrectManagerObjectError]
|
72
|
+
# @raise [EvilEvents::AlreadyManagedEventClassError]
|
82
73
|
# @return void
|
83
74
|
#
|
84
75
|
# @since 0.1.0
|
85
76
|
def register(manager)
|
86
|
-
|
77
|
+
unless manager.is_a?(EvilEvents::Core::Events::Manager)
|
78
|
+
raise EvilEvents::IncorrectManagerObjectError
|
79
|
+
end
|
87
80
|
|
88
81
|
if potential_manager_duplicate?(manager) || !managed_event_type?(manager.event_type)
|
89
82
|
managers[manager.event_class] = manager
|
90
83
|
else
|
91
|
-
raise AlreadyManagedEventClassError
|
84
|
+
raise EvilEvents::AlreadyManagedEventClassError
|
92
85
|
end
|
93
86
|
end
|
94
87
|
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 0.3.0
|
5
|
+
class EvilEvents::Core::Events::Notifier::Abstract
|
6
|
+
# @param options [Hash]
|
7
|
+
#
|
8
|
+
# @api private
|
9
|
+
# @since 0.3.0
|
10
|
+
def initialize(**options); end
|
11
|
+
|
12
|
+
# @param manager [EvilEvents::Core::Events::Manager]
|
13
|
+
# @param event [EvilEvents::Core::Events::AbstractEvent]
|
14
|
+
#
|
15
|
+
# @api private
|
16
|
+
# @since 0.3.0
|
17
|
+
def notify(manager, event); end
|
18
|
+
|
19
|
+
# @api private
|
20
|
+
# @since 0.3.0
|
21
|
+
def restart!; end
|
22
|
+
|
23
|
+
# @api private
|
24
|
+
# @since 0.3.0
|
25
|
+
def shutdown!; end
|
26
|
+
end
|