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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.hound.yml +2 -0
  3. data/.rubocop.yml +12 -0
  4. data/.travis.yml +3 -2
  5. data/CHANGELOG.md +18 -0
  6. data/evil_events.gemspec +3 -3
  7. data/lib/evil_events/application.rb +7 -0
  8. data/lib/evil_events/core/broadcasting/emitter.rb +5 -7
  9. data/lib/evil_events/core/config.rb +16 -1
  10. data/lib/evil_events/core/events/abstract_event.rb +2 -0
  11. data/lib/evil_events/core/events/event_extensions/class_signature/signature.rb +1 -1
  12. data/lib/evil_events/core/events/event_extensions/class_signature.rb +1 -1
  13. data/lib/evil_events/core/events/event_extensions/emittable.rb +29 -0
  14. data/lib/evil_events/core/events/event_extensions/hookable/abstract_hook.rb +27 -0
  15. data/lib/evil_events/core/events/event_extensions/hookable/after_emit_hook.rb +11 -0
  16. data/lib/evil_events/core/events/event_extensions/hookable/before_emit_hook.rb +11 -0
  17. data/lib/evil_events/core/events/event_extensions/hookable/on_error_hook.rb +16 -0
  18. data/lib/evil_events/core/events/event_extensions/hookable.rb +93 -0
  19. data/lib/evil_events/core/events/event_extensions/type_aliasing.rb +6 -12
  20. data/lib/evil_events/core/events/event_factory.rb +4 -4
  21. data/lib/evil_events/core/events/manager.rb +14 -12
  22. data/lib/evil_events/core/events/manager_factory.rb +2 -7
  23. data/lib/evil_events/core/events/manager_registry.rb +8 -15
  24. data/lib/evil_events/core/events/notifier/abstract.rb +26 -0
  25. data/lib/evil_events/core/events/notifier/builder.rb +43 -0
  26. data/lib/evil_events/core/events/notifier/logging.rb +43 -0
  27. data/lib/evil_events/core/events/notifier/proxy.rb +33 -0
  28. data/lib/evil_events/core/events/notifier/sequential.rb +41 -0
  29. data/lib/evil_events/core/events/notifier/worker/executor.rb +102 -0
  30. data/lib/evil_events/core/events/notifier/worker/job.rb +35 -0
  31. data/lib/evil_events/core/events/notifier/worker.rb +71 -0
  32. data/lib/evil_events/core/events/notifier.rb +6 -0
  33. data/lib/evil_events/core/events/serializers/hash.rb +9 -7
  34. data/lib/evil_events/core/events/serializers/json.rb +11 -6
  35. data/lib/evil_events/core/events/serializers.rb +0 -7
  36. data/lib/evil_events/core/events/subscriber/mixin.rb +2 -2
  37. data/lib/evil_events/core/events.rb +14 -1
  38. data/lib/evil_events/core/system/broadcaster.rb +23 -1
  39. data/lib/evil_events/core/system/mock.rb +7 -0
  40. data/lib/evil_events/core/system.rb +3 -1
  41. data/lib/evil_events/core.rb +0 -1
  42. data/lib/evil_events/error.rb +96 -0
  43. data/lib/evil_events/plugins/{rails.rb → redis_adapter.rb} +2 -2
  44. data/lib/evil_events/plugins/{elastic_search.rb → sidekiq_adapter.rb} +2 -2
  45. data/lib/evil_events/plugins.rb +15 -13
  46. data/lib/evil_events/shared/extensions_mixin.rb +7 -0
  47. data/lib/evil_events/shared/type_converter/converter_registry.rb +2 -2
  48. data/lib/evil_events/shared.rb +1 -0
  49. data/lib/evil_events/version.rb +1 -1
  50. data/lib/evil_events.rb +1 -0
  51. metadata +27 -12
  52. data/lib/evil_events/core/error.rb +0 -8
  53. data/lib/evil_events/core/events/manager/notifier.rb +0 -79
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EvilEvents
4
+ # @since 0.3.0
5
+ Error = Class.new(StandardError)
6
+ # @since 0.3.0
7
+ ArgumentError = Class.new(ArgumentError)
8
+
9
+ # NOTE: see EvilEvents::Core::Broadcasting::Emitter
10
+ # @since 0.3.0
11
+ EmitterError = Class.new(Error)
12
+ # since 0.3.0
13
+ IncorrectEventForEmitError = Class.new(EmitterError)
14
+
15
+ # NOTE: see EvilEvents::Core::Events::EventExtensions::TypeAliasing
16
+ # @since 0.3.0
17
+ TypeAliasingError = Class.new(Error)
18
+ # @since 0.3.0
19
+ IncopatibleEventTypeError = Class.new(TypeAliasingError)
20
+ # @since 0.3.0
21
+ EventTypeNotDefinedError = Class.new(TypeAliasingError)
22
+ # @since 0.3.0
23
+ EventTypeAlreadyDefinedError = Class.new(TypeAliasingError)
24
+
25
+ # NOTE: see EvilEvents::Core::Events::Notifier::Builder
26
+ # @since 0.3.0
27
+ NotifierBuilderError = Class.new(Error)
28
+ # @since 0.3.0
29
+ UnknownNotifierTypeError = Class.new(NotifierBuilderError)
30
+
31
+ # NOTE: see EvilEvents::Core::Events::Manager
32
+ # @since 0.3.0
33
+ ManagerError = Class.new(Error)
34
+ # @since 0.3.0
35
+ InconsistentEventClassError = Class.new(ManagerError)
36
+ # @since 0.3.0
37
+ InvalidDelegatorTypeError = Class.new(ManagerError)
38
+
39
+ # NOTE: see EvilEvents::Core::Events::ManagerFactory
40
+ # @since 0.3.0
41
+ ManagerFactoryError = Class.new(Error)
42
+ # @since 0.3.0
43
+ IncorrectEventClassError = Class.new(ManagerFactoryError)
44
+
45
+ # NOTE: see EvilEvents::Core::Events::ManagerRegistry
46
+ # @since 0.3.0
47
+ ManagerRegistryError = Class.new(Error)
48
+ # @since 0.3.0
49
+ IncorrectManagerObjectError = Class.new(ManagerRegistryError)
50
+ # @since 0.3.0
51
+ NonManagedEventClassError = Class.new(ManagerRegistryError)
52
+ # @since 0.3.0
53
+ AlreadyManagedEventClassError = Class.new(ManagerRegistryError)
54
+
55
+ # NOTE: EvilEvents::Core::Events::Serializers
56
+ # @since 0.3.0
57
+ SerializersError = Class.new(Error)
58
+ # @since 0.3.0
59
+ SerializationError = Class.new(SerializersError)
60
+ # @since 0.3.0
61
+ DeserializationError = Class.new(SerializersError)
62
+
63
+ # NOTE: see EvilEvents::Core::Events::Notifier
64
+ # @since 0.3.0
65
+ NotifierError = Class.new(Error)
66
+ # @since 0.3.0
67
+ class FailedNotifiedSubscribersError < NotifierError
68
+ # @since 0.3.0
69
+ extend Forwardable
70
+
71
+ # @since 0.3.0
72
+ def_delegators :errors_stack, :<<, :empty?
73
+
74
+ # @return [Concurrent::Array]
75
+ #
76
+ # @api public
77
+ # @since 0.3.0
78
+ attr_reader :errors_stack
79
+
80
+ # @param message [NilClass, String]
81
+ #
82
+ # @since 0.3.0
83
+ def initialize(message = nil)
84
+ @errors_stack = Concurrent::Array.new
85
+ super
86
+ end
87
+ end
88
+
89
+ # NOTE: see EvilEvents::Core::Events::Notifier::Worker::Executor
90
+ # @since 0.3.0
91
+ WorkerError = Class.new(NotifierError)
92
+ # @since 0.3.0
93
+ IncorrectFallbackPolicyError = Class.new(WorkerError)
94
+ # @since 0.3.0
95
+ WorkerDisabledOrBusyError = Class.new(WorkerError)
96
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # @api public
4
- # @since 0.2.0
5
- module EvilEvents::Rails
4
+ # @since 0.3.0
5
+ module EvilEvents::RedisAdapter
6
6
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # @api public
4
- # @since 0.2.0
5
- module EvilEvents::ElasticSearch
4
+ # @since 0.3.0
5
+ module EvilEvents::SidekiqAdapter
6
6
  end
@@ -4,29 +4,31 @@ module EvilEvents
4
4
  # @api public
5
5
  # @since 0.2.0
6
6
  class Plugins
7
- # @since 0.2.0
8
- extend Shared::DependencyContainer::Mixin
7
+ # @since 0.3.0
8
+ extend Shared::ExtensionsMixin
9
9
 
10
- # @since 0.2.0
11
- register(:rails, 'plugins/rails')
12
- # @since 0.2.0
13
- register(:elastic_search, 'plugins/elastic_search')
10
+ # @since 0.3.0
11
+ register_extension(:redis_adapter) { require_relative 'plugins/redis_adapter' }
12
+ # @since 0.3.0
13
+ register_extension(:sidekiq_adapter) { require_relative 'plugins/sidekiq_adapter' }
14
14
 
15
15
  class << self
16
- # @return [Array<String>]
16
+ # @param plugins [Symbol,Symbol,Symbol,...]
17
+ # @raise [ArgumentError] When required plugin is not registered
18
+ # @return void
17
19
  #
20
+ # @api public
18
21
  # @since 0.2.0
19
- def names
20
- keys
22
+ def load!(*plugins)
23
+ load_extensions(*(plugins.empty? ? names : plugins))
21
24
  end
22
25
 
23
- # @param *plugins [String,Symbol]
24
- # @return void
26
+ # @return [Array<Symbol>]
25
27
  #
26
28
  # @api public
27
29
  # @since 0.2.0
28
- def load!(*plugins)
29
- (plugins.empty? ? names : plugins).each { |plugin| require_relative resolve(plugin) }
30
+ def names
31
+ @__available_extensions__.keys
30
32
  end
31
33
  end
32
34
  end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EvilEvents::Shared
4
+ # @api public
5
+ # @since 0.3.0
6
+ ExtensionsMixin = Dry::Core::Extensions
7
+ end
@@ -23,7 +23,7 @@ class EvilEvents::Shared::TypeConverter
23
23
 
24
24
  # @param type_name [Symbol]
25
25
  # @param coercer [Proc]
26
- # @raise ArgumentError
26
+ # @raise [ArgumentError]
27
27
  # @return [Converter]
28
28
  #
29
29
  # @api public
@@ -38,7 +38,7 @@ class EvilEvents::Shared::TypeConverter
38
38
  end
39
39
 
40
40
  # @param type [Mixed]
41
- # @raise ConverterNotRegisteredError
41
+ # @raise [ConverterNotRegisteredError]
42
42
  # @return [Mixed]
43
43
  #
44
44
  # @api public
@@ -13,6 +13,7 @@ module EvilEvents
13
13
  require_relative 'shared/combined_context/mixin'
14
14
  require_relative 'shared/delegator_resolver'
15
15
  require_relative 'shared/dependency_container'
16
+ require_relative 'shared/extensions_mixin'
16
17
  require_relative 'shared/clonable_module_builder'
17
18
  require_relative 'shared/type_converter'
18
19
  require_relative 'shared/type_converter/converter'
@@ -3,5 +3,5 @@
3
3
  module EvilEvents
4
4
  # @api public
5
5
  # @since 0.2.0
6
- VERSION = '0.2.0'
6
+ VERSION = '0.3.0'
7
7
  end
data/lib/evil_events.rb CHANGED
@@ -16,6 +16,7 @@ module EvilEvents
16
16
  require_relative 'evil_events/version'
17
17
  require_relative 'evil_events/shared'
18
18
  require_relative 'evil_events/types'
19
+ require_relative 'evil_events/error'
19
20
  require_relative 'evil_events/core'
20
21
  require_relative 'evil_events/config'
21
22
  require_relative 'evil_events/event'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: evil_events
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rustam Ibragimov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-18 00:00:00.000000000 Z
11
+ date: 2018-02-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-monads
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.12.1
33
+ version: 0.12.2
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.12.1
40
+ version: 0.12.2
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: dry-struct
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -142,14 +142,14 @@ dependencies:
142
142
  requirements:
143
143
  - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: 0.51.0
145
+ version: 0.52.1
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: 0.51.0
152
+ version: 0.52.1
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: rspec
155
155
  requirement: !ruby/object:Gem::Requirement
@@ -170,14 +170,14 @@ dependencies:
170
170
  requirements:
171
171
  - - "~>"
172
172
  - !ruby/object:Gem::Version
173
- version: 1.20.1
173
+ version: 1.23.0
174
174
  type: :development
175
175
  prerelease: false
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
178
  - - "~>"
179
179
  - !ruby/object:Gem::Version
180
- version: 1.20.1
180
+ version: 1.23.0
181
181
  - !ruby/object:Gem::Dependency
182
182
  name: pry
183
183
  requirement: !ruby/object:Gem::Requirement
@@ -229,6 +229,7 @@ extensions: []
229
229
  extra_rdoc_files: []
230
230
  files:
231
231
  - ".gitignore"
232
+ - ".hound.yml"
232
233
  - ".jrubyrc"
233
234
  - ".rspec"
234
235
  - ".rubocop.yml"
@@ -258,7 +259,6 @@ files:
258
259
  - lib/evil_events/core/broadcasting/dispatcher/mixin.rb
259
260
  - lib/evil_events/core/broadcasting/emitter.rb
260
261
  - lib/evil_events/core/config.rb
261
- - lib/evil_events/core/error.rb
262
262
  - lib/evil_events/core/events.rb
263
263
  - lib/evil_events/core/events/abstract_event.rb
264
264
  - lib/evil_events/core/events/event_extensions/adapter_customizable.rb
@@ -266,6 +266,11 @@ files:
266
266
  - lib/evil_events/core/events/event_extensions/class_signature/equalizer.rb
267
267
  - lib/evil_events/core/events/event_extensions/class_signature/signature.rb
268
268
  - lib/evil_events/core/events/event_extensions/emittable.rb
269
+ - lib/evil_events/core/events/event_extensions/hookable.rb
270
+ - lib/evil_events/core/events/event_extensions/hookable/abstract_hook.rb
271
+ - lib/evil_events/core/events/event_extensions/hookable/after_emit_hook.rb
272
+ - lib/evil_events/core/events/event_extensions/hookable/before_emit_hook.rb
273
+ - lib/evil_events/core/events/event_extensions/hookable/on_error_hook.rb
269
274
  - lib/evil_events/core/events/event_extensions/manageable.rb
270
275
  - lib/evil_events/core/events/event_extensions/metadata_extendable.rb
271
276
  - lib/evil_events/core/events/event_extensions/metadata_extendable/abstract_metadata.rb
@@ -276,10 +281,18 @@ files:
276
281
  - lib/evil_events/core/events/event_extensions/type_aliasing.rb
277
282
  - lib/evil_events/core/events/event_factory.rb
278
283
  - lib/evil_events/core/events/manager.rb
279
- - lib/evil_events/core/events/manager/notifier.rb
280
284
  - lib/evil_events/core/events/manager/subscriber_list.rb
281
285
  - lib/evil_events/core/events/manager_factory.rb
282
286
  - lib/evil_events/core/events/manager_registry.rb
287
+ - lib/evil_events/core/events/notifier.rb
288
+ - lib/evil_events/core/events/notifier/abstract.rb
289
+ - lib/evil_events/core/events/notifier/builder.rb
290
+ - lib/evil_events/core/events/notifier/logging.rb
291
+ - lib/evil_events/core/events/notifier/proxy.rb
292
+ - lib/evil_events/core/events/notifier/sequential.rb
293
+ - lib/evil_events/core/events/notifier/worker.rb
294
+ - lib/evil_events/core/events/notifier/worker/executor.rb
295
+ - lib/evil_events/core/events/notifier/worker/job.rb
283
296
  - lib/evil_events/core/events/serializers.rb
284
297
  - lib/evil_events/core/events/serializers/base.rb
285
298
  - lib/evil_events/core/events/serializers/hash.rb
@@ -295,10 +308,11 @@ files:
295
308
  - lib/evil_events/core/system/type_manager.rb
296
309
  - lib/evil_events/dispatcher_mixin.rb
297
310
  - lib/evil_events/emitter.rb
311
+ - lib/evil_events/error.rb
298
312
  - lib/evil_events/event.rb
299
313
  - lib/evil_events/plugins.rb
300
- - lib/evil_events/plugins/elastic_search.rb
301
- - lib/evil_events/plugins/rails.rb
314
+ - lib/evil_events/plugins/redis_adapter.rb
315
+ - lib/evil_events/plugins/sidekiq_adapter.rb
302
316
  - lib/evil_events/serializer.rb
303
317
  - lib/evil_events/shared.rb
304
318
  - lib/evil_events/shared/clonable_module_builder.rb
@@ -308,6 +322,7 @@ files:
308
322
  - lib/evil_events/shared/crypto.rb
309
323
  - lib/evil_events/shared/delegator_resolver.rb
310
324
  - lib/evil_events/shared/dependency_container.rb
325
+ - lib/evil_events/shared/extensions_mixin.rb
311
326
  - lib/evil_events/shared/logger.rb
312
327
  - lib/evil_events/shared/structure.rb
313
328
  - lib/evil_events/shared/type_converter.rb
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module EvilEvents::Core
4
- # @api private
5
- # @since 0.2.0
6
- Error = Class.new(StandardError)
7
- ArgumentError = Class.new(ArgumentError)
8
- end
@@ -1,79 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class EvilEvents::Core::Events::Manager
4
- # @api private
5
- # @since 0.1.0
6
- module Notifier
7
- # @since 0.1.0
8
- NotifierError = Class.new(EvilEvents::Core::Error)
9
- # @since 0.1.0
10
- InconsistentEventClassError = Class.new(NotifierError)
11
-
12
- # @since 0.1.0
13
- class FailedSubscribersError < NotifierError
14
- # @since 0.1.0
15
- extend Forwardable
16
-
17
- # @since 0.1.0
18
- def_delegators :errors_stack, :<<, :empty?
19
-
20
- # @return [Concurrent::Array]
21
- #
22
- # @api public
23
- # @since 0.1.0
24
- attr_reader :errors_stack
25
-
26
- # @param message [NilClass, String]
27
- #
28
- # @since 0.1.0
29
- def initialize(message = nil)
30
- @errors_stack = Concurrent::Array.new
31
- super
32
- end
33
- end
34
-
35
- class << self
36
- # @param manager [EvilEvents::Core::Events::Manager]
37
- # @param event [EvilEvents::Core::Events::AbstractEvent]
38
- # @raise [InconsistentEventClassError]
39
- # @raise [FailedSubscribersError]
40
- # @return void
41
- #
42
- # @since 0.1.0
43
- def run(manager, event)
44
- raise InconsistentEventClassError unless event.is_a?(manager.event_class)
45
-
46
- errors_stack = FailedSubscribersError.new
47
-
48
- manager.subscribers.each do |subscriber|
49
- begin
50
- subscriber.notify(event)
51
- log_activity(event, subscriber, :successful)
52
- rescue StandardError => error
53
- errors_stack << error
54
- log_activity(event, subscriber, :failed)
55
- end
56
- end
57
-
58
- raise errors_stack unless errors_stack.empty?
59
- end
60
-
61
- private
62
-
63
- # @param event [EvilEvents::Core::Events::AbstractEvent]
64
- # @param subscriber [EvilEvents::Core::Events::Subscriber]
65
- # @param status [String,Symbol]
66
- # @return void
67
- #
68
- # @since 0.1.1
69
- def log_activity(event, subscriber, status)
70
- activity = "EventProcessed(#{event.type})"
71
- message = "EVENT_ID: #{event.id} :: " \
72
- "STATUS: #{status} :: " \
73
- "SUBSCRIBER: #{subscriber.source_object}"
74
-
75
- EvilEvents::Core::ActivityLogger.log(activity: activity, message: message)
76
- end
77
- end
78
- end
79
- end