evil_events 0.1.1 → 0.2.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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +17 -1
  3. data/.travis.yml +1 -1
  4. data/CHANGELOG.md +29 -1
  5. data/evil_events.gemspec +17 -16
  6. data/lib/evil_events.rb +3 -1
  7. data/lib/evil_events/application.rb +16 -0
  8. data/lib/evil_events/config.rb +23 -6
  9. data/lib/evil_events/{adapters.rb → config/adapters.rb} +4 -4
  10. data/lib/evil_events/config/types.rb +24 -0
  11. data/lib/evil_events/core.rb +1 -0
  12. data/lib/evil_events/core/bootstrap.rb +1 -1
  13. data/lib/evil_events/core/broadcasting/emitter.rb +1 -1
  14. data/lib/evil_events/core/error.rb +8 -0
  15. data/lib/evil_events/core/events.rb +3 -0
  16. data/lib/evil_events/core/events/abstract_event.rb +2 -0
  17. data/lib/evil_events/core/events/event_extensions/class_signature.rb +30 -0
  18. data/lib/evil_events/core/events/event_extensions/class_signature/equalizer.rb +82 -0
  19. data/lib/evil_events/core/events/event_extensions/class_signature/signature.rb +70 -0
  20. data/lib/evil_events/core/events/event_extensions/metadata_extendable.rb +16 -4
  21. data/lib/evil_events/core/events/event_extensions/payloadable.rb +16 -4
  22. data/lib/evil_events/core/events/event_extensions/type_aliasing.rb +1 -1
  23. data/lib/evil_events/core/events/event_factory.rb +7 -2
  24. data/lib/evil_events/core/events/manager.rb +1 -1
  25. data/lib/evil_events/core/events/manager/notifier.rb +2 -1
  26. data/lib/evil_events/core/events/manager_factory.rb +1 -1
  27. data/lib/evil_events/core/events/manager_registry.rb +39 -2
  28. data/lib/evil_events/core/events/serializers.rb +2 -1
  29. data/lib/evil_events/core/events/subscriber/mixin.rb +20 -11
  30. data/lib/evil_events/core/system.rb +16 -0
  31. data/lib/evil_events/core/system/event_manager.rb +33 -3
  32. data/lib/evil_events/core/system/mock.rb +20 -0
  33. data/lib/evil_events/core/system/type_manager.rb +35 -0
  34. data/lib/evil_events/plugins.rb +33 -0
  35. data/lib/evil_events/plugins/elastic_search.rb +6 -0
  36. data/lib/evil_events/plugins/rails.rb +6 -0
  37. data/lib/evil_events/shared.rb +4 -0
  38. data/lib/evil_events/shared/crypto.rb +1 -1
  39. data/lib/evil_events/shared/type_converter.rb +43 -0
  40. data/lib/evil_events/shared/type_converter/converter.rb +45 -0
  41. data/lib/evil_events/shared/type_converter/converter_registry.rb +51 -0
  42. data/lib/evil_events/shared/type_converter/type_builder.rb +51 -0
  43. data/lib/evil_events/version.rb +2 -2
  44. metadata +73 -59
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ce935f449ea78c46b999cb78c539ebb0831ffe6c
4
- data.tar.gz: d95c3b341243285c82c1955f2cf09f44d5d5cbe1
3
+ metadata.gz: 6ca82399f2d2f7e433c6dd9c111d2a6c3c285940
4
+ data.tar.gz: 445c719e88bb2f1ff12720b8aec3fc62c451ef91
5
5
  SHA512:
6
- metadata.gz: 722725a362de968307d9ff12b9b46f60b044110eafc404d77f1e9a96ff5e19c37d00853c2deb0a940021a8f6632ef17cdfba04791ba0c1ce4db3c95e7dfb1b10
7
- data.tar.gz: 4bba1a00b98b3aa7f8ae62b5434698f8e71fa6ab6401ff167c73a5e8108a3fbd16beb06b698c54c26a4d82e7fafd62ebff2939cbe7c41fcc4b678d78fd947e38
6
+ metadata.gz: c3ea9dfd03ec8f792d926d83ed2f014cc22ce8bb42d8730e626473ffb48d28bbfe2d2bdb990b9d2d279d8a3fc7a3fcb32d8d0c0ac2304a94a1a1418d096d57c6
7
+ data.tar.gz: 4aa79a4f86765a4babbbc9aaea8c7a0947cc1f653a8c484b2496bc71daff8ce1a385b01c5665a265174f9f89a0f436a028a6b3f87022f17b9b6219bb69d27214
data/.rubocop.yml CHANGED
@@ -16,6 +16,10 @@ Style/SingleLineMethods:
16
16
  Exclude:
17
17
  - spec/**/*
18
18
 
19
+ Style/RescueModifier:
20
+ Exclude:
21
+ - spec/**/*
22
+
19
23
  Style/AsciiComments:
20
24
  Enabled: false
21
25
 
@@ -25,6 +29,9 @@ Style/Alias:
25
29
  Style/GuardClause:
26
30
  Enabled: false
27
31
 
32
+ Style/DoubleNegation:
33
+ Enabled: false
34
+
28
35
  Style/Documentation:
29
36
  Enabled: false
30
37
 
@@ -37,12 +44,18 @@ Style/EmptyCaseCondition:
37
44
  Style/FrozenStringLiteralComment:
38
45
  Enabled: true
39
46
 
47
+ Style/InverseMethods:
48
+ Enabled: false
49
+
40
50
  Style/ParallelAssignment:
41
51
  Enabled: false
42
52
 
43
53
  Style/CommentedKeyword:
44
54
  Enabled: false
45
55
 
56
+ Lint/AmbiguousRegexpLiteral:
57
+ Enabled: false
58
+
46
59
  Naming/FileName:
47
60
  Enabled: false
48
61
 
@@ -65,11 +78,14 @@ Metrics/PerceivedComplexity:
65
78
  Metrics/MethodLength:
66
79
  Max: 25
67
80
 
81
+ RSpec/ContextWording:
82
+ Enabled: false
83
+
68
84
  RSpec/HookArgument:
69
85
  Enabled: false
70
86
 
71
87
  RSpec/NestedGroups:
72
- Max: 5
88
+ Max: 6
73
89
 
74
90
  RSpec/MessageSpies:
75
91
  Enabled: false
data/.travis.yml CHANGED
@@ -2,7 +2,7 @@ language: ruby
2
2
  rvm:
3
3
  - 2.3.5
4
4
  - 2.4.2
5
- - 2.2.7
5
+ - 2.2.8
6
6
  - ruby-head
7
7
  - jruby-head
8
8
 
data/CHANGELOG.md CHANGED
@@ -1,6 +1,34 @@
1
1
  # Changelog
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
+ ## [0.2.0] - 2017-11-19
5
+ ### Added
6
+ - Support for custom coercive types:
7
+ - New utility for custom coercive types: `EvilEvents::Shared::TypeConverter`
8
+ - `AbstractEvent` supports new coercive types (metadata and payload are supported)
9
+ - Configuration point for coercive types: `EvilEvents::Config.setup_types { |types| ... }`
10
+ - Configuration point for adapters: `EvilEvents::Config.setup_adapters { |adapters| ... }`
11
+ - General class for internal errors: now all internal `*Error` classes inherits from `EvilEvents::Core::Error`
12
+ - Access to the list of registered event classes via `EvilEvents::Application.registered_events`
13
+ - Plugin ecosystem: see `EvilEvents::Plugins` (simple API example: `EvilEvents::Plugins.load!(:rails)`)
14
+ - Comparable event class signature object `<EventClass>.signature` with data about:
15
+ - class name
16
+ - class creation strategy
17
+ - adapter info (name and object)
18
+ - default delegator method name
19
+ - metadata attributes schema
20
+ - payload attributes schema
21
+ - string type alias
22
+ - Event subscriptions via event type alias pattern (Regexp) and conditional proc (Proc)
23
+ - The ability to subscribe to the list of events (via list of event type attributes)
24
+
25
+ ### Changed
26
+ - Renamed config opts aggregator: `EvilEvents::Config.config` => `EvilEvents::Config.options`
27
+ - Moved adapters config object: `EvilEvents::Adapters` => `EvilEvents::Config::Adapters`
28
+
29
+ ### Fixed
30
+ - Fixed a bug when an event created by an exceptional block still remains in the internal event registry
31
+
4
32
  ## [0.1.1] - 2017-10-29
5
- ### [Added]
33
+ ### Added
6
34
  - Serialization of event ids: support for using :id key in JSON/Hash serialization/deserialization.
data/evil_events.gemspec CHANGED
@@ -26,20 +26,21 @@ Gem::Specification.new do |spec|
26
26
  f.match(%r{^(spec|features)/})
27
27
  end
28
28
 
29
- spec.add_dependency 'dry-monads', '0.3.1'
30
- spec.add_dependency 'dry-types', '0.12.1'
31
- spec.add_dependency 'dry-struct', '0.3.1'
32
- spec.add_dependency 'dry-configurable', '0.7.0'
33
- spec.add_dependency 'dry-container', '0.6.0'
34
- spec.add_dependency 'concurrent-ruby', '1.0.5'
35
-
36
- spec.add_development_dependency 'coveralls', '0.8.21'
37
- spec.add_development_dependency 'pry', '0.11.2'
38
- spec.add_development_dependency 'simplecov', '0.14.1'
39
- spec.add_development_dependency 'simplecov-json', '0.2'
40
- spec.add_development_dependency 'rubocop', '0.51.0'
41
- spec.add_development_dependency 'bundler', '1.15.4'
42
- spec.add_development_dependency 'rake', '12.2.1'
43
- spec.add_development_dependency 'rspec', '3.7.0'
44
- spec.add_development_dependency 'rubocop-rspec', '1.19.0'
29
+ spec.add_dependency 'dry-monads', '~> 0.4.0'
30
+ spec.add_dependency 'dry-types', '~> 0.12.1'
31
+ spec.add_dependency 'dry-struct', '~> 0.3.1'
32
+ spec.add_dependency 'dry-configurable', '~> 0.7.0'
33
+ spec.add_dependency 'dry-container', '~> 0.6.0'
34
+ spec.add_dependency 'concurrent-ruby', '~> 1.0.5'
35
+
36
+ spec.add_development_dependency 'coveralls', '~> 0.8.21'
37
+ spec.add_development_dependency 'simplecov', '~> 0.14.1'
38
+ spec.add_development_dependency 'simplecov-json', '~> 0.2'
39
+ spec.add_development_dependency 'rubocop', '~> 0.51.0'
40
+ spec.add_development_dependency 'rspec', '~> 3.7.0'
41
+ spec.add_development_dependency 'rubocop-rspec', '~> 1.20.1'
42
+
43
+ spec.add_development_dependency 'pry'
44
+ spec.add_development_dependency 'rake'
45
+ spec.add_development_dependency 'bundler'
45
46
  end
data/lib/evil_events.rb CHANGED
@@ -6,6 +6,7 @@ require 'dry-struct'
6
6
  require 'dry-types'
7
7
  require 'concurrent/array'
8
8
  require 'concurrent/map'
9
+ require 'securerandom'
9
10
  require 'logger'
10
11
  require 'json'
11
12
 
@@ -19,8 +20,9 @@ module EvilEvents
19
20
  require_relative 'evil_events/config'
20
21
  require_relative 'evil_events/event'
21
22
  require_relative 'evil_events/serializer'
22
- require_relative 'evil_events/adapters'
23
23
  require_relative 'evil_events/emitter'
24
24
  require_relative 'evil_events/subscriber_mixin'
25
25
  require_relative 'evil_events/dispatcher_mixin'
26
+ require_relative 'evil_events/application'
27
+ require_relative 'evil_events/plugins'
26
28
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EvilEvents
4
+ # @api public
5
+ # @since 0.2.0
6
+ module Application
7
+ class << self
8
+ # @see EvilEvents::Core::System
9
+ # @api public
10
+ # @since 0.2.0
11
+ def registered_events
12
+ EvilEvents::Core::Bootstrap[:event_system].registered_events
13
+ end
14
+ end
15
+ end
16
+ end
@@ -4,19 +4,36 @@ module EvilEvents
4
4
  # @api public
5
5
  # @since 0.1.0
6
6
  module Config
7
+ require_relative 'config/adapters'
8
+ require_relative 'config/types'
9
+
7
10
  class << self
8
- # @see EvilEvents::Config
11
+ # @see EvilEvents::Core::Config
9
12
  # @api public
10
13
  # @since 0.1.0
11
- def configure
12
- config.configure { |conf| yield(conf) if block_given? }
14
+ def options
15
+ EvilEvents::Core::Bootstrap[:config]
13
16
  end
14
17
 
15
- # @see EvilEvents::Config
18
+ # @see EvilEvents::Core::Config
16
19
  # @api public
17
20
  # @since 0.1.0
18
- def config
19
- EvilEvents::Core::Bootstrap[:config]
21
+ def configure
22
+ options.configure { |conf| yield(conf) if block_given? }
23
+ end
24
+
25
+ # @see EvilEvents::Config::Types
26
+ # @api public
27
+ # @since 0.2.0
28
+ def setup_types
29
+ yield(Config::Types) if block_given?
30
+ end
31
+
32
+ # @see EvilEvents::Config::Adapters
33
+ # @api public
34
+ # @since 0.2.0
35
+ def setup_adapters
36
+ yield(Config::Adapters) if block_given?
20
37
  end
21
38
  end
22
39
  end
@@ -1,20 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module EvilEvents
3
+ module EvilEvents::Config
4
4
  # @api public
5
- # @since 0.1.0
5
+ # @since 0.2.0
6
6
  module Adapters
7
7
  class << self
8
8
  # @see EvilEvents::Core::System
9
9
  # @api public
10
- # @since 0.1.0
10
+ # @since 0.2.0
11
11
  def register(adapter_name, adapter_object)
12
12
  EvilEvents::Core::Bootstrap[:event_system].register_adapter(adapter_name, adapter_object)
13
13
  end
14
14
 
15
15
  # @see EvilEvents::Core::System
16
16
  # @api public
17
- # @since 0.1.0
17
+ # @since 0.2.0
18
18
  def resolve(adapter_name)
19
19
  EvilEvents::Core::Bootstrap[:event_system].resolve_adapter(adapter_name)
20
20
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EvilEvents::Config
4
+ # @api public
5
+ # @since 0.2.0
6
+ module Types
7
+ class << self
8
+ # @see EvilEvents::Core::System
9
+ # @api public
10
+ # @since 0.2.0
11
+ def define_converter(type, &coercer)
12
+ EvilEvents::Core::Bootstrap[:event_system].register_converter(type, coercer)
13
+ end
14
+
15
+ # @see EvilEvents::Core::System
16
+ # @api public
17
+ # @since 0.2.0
18
+ def resolve_type(type, **options)
19
+ EvilEvents::Core::Bootstrap[:event_system].resolve_type(type, **options)
20
+ end
21
+ alias_method :[], :resolve_type
22
+ end
23
+ end
24
+ end
@@ -4,6 +4,7 @@ module EvilEvents
4
4
  # @api private
5
5
  # @since 0.1.0
6
6
  module Core
7
+ require_relative 'core/error'
7
8
  require_relative 'core/activity_logger'
8
9
  require_relative 'core/broadcasting'
9
10
  require_relative 'core/events'
@@ -8,6 +8,6 @@ module EvilEvents::Core
8
8
  extend EvilEvents::Shared::DependencyContainer::Mixin
9
9
 
10
10
  register(:event_system, memoize: true) { EvilEvents::Core::System.new }
11
- register(:config, memoize: true) { EvilEvents::Config.new }
11
+ register(:config, memoize: true) { EvilEvents::Core::Config.new }
12
12
  end
13
13
  end
@@ -5,7 +5,7 @@ module EvilEvents::Core::Broadcasting
5
5
  # @since 0.1.0
6
6
  class Emitter
7
7
  # @since 0.1.0
8
- EmitterError = Class.new(StandardError)
8
+ EmitterError = Class.new(EvilEvents::Core::Error)
9
9
  # @since 0.1.0
10
10
  IncorrectEventError = Class.new(EmitterError)
11
11
 
@@ -0,0 +1,8 @@
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
@@ -18,6 +18,9 @@ module EvilEvents::Core
18
18
  require_relative 'events/event_extensions/metadata_extendable'
19
19
  require_relative 'events/event_extensions/metadata_extendable/abstract_metadata'
20
20
  require_relative 'events/event_extensions/emittable'
21
+ require_relative 'events/event_extensions/class_signature'
22
+ require_relative 'events/event_extensions/class_signature/signature'
23
+ require_relative 'events/event_extensions/class_signature/equalizer'
21
24
  require_relative 'events/abstract_event'
22
25
  require_relative 'events/manager'
23
26
  require_relative 'events/manager/notifier'
@@ -21,6 +21,8 @@ module EvilEvents::Core::Events
21
21
  include EventExtensions::Emittable
22
22
  # @since 0.1.0
23
23
  include EventExtensions::MetadataExtendable
24
+ # @sicne 0.2.0
25
+ include EventExtensions::ClassSignature
24
26
  # @since 0.1.0
25
27
  extend EvilEvents::Shared::CombinedContext::Mixin
26
28
 
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EvilEvents::Core::Events::EventExtensions
4
+ # @api private
5
+ # @since 0.2.0
6
+ module ClassSignature
7
+ class << self
8
+ # @param base_calss [Class{AbstractEvent}]
9
+ #
10
+ # @since 0.2.0
11
+ def included(base_class)
12
+ base_class.extend(ClassMethods)
13
+
14
+ base_class.singleton_class.class_eval do
15
+ attr_accessor :__creation_strategy
16
+ end
17
+ end
18
+ end
19
+
20
+ # @since 0.2.0
21
+ module ClassMethods
22
+ # @return [Signature]
23
+ #
24
+ # @since 0.2.0
25
+ def signature
26
+ Signature.new(self)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EvilEvents::Core::Events::EventExtensions::ClassSignature
4
+ # @api private
5
+ # @since 0.2.0
6
+ class Equalizer
7
+ # @rreturn [Signature]
8
+ #
9
+ # @since 0.2.0
10
+ attr_reader :signature_a
11
+ # @rreturn [Signature]
12
+ #
13
+ # @since 0.2.0
14
+ attr_reader :signature_b
15
+
16
+ # @param signature_a [Signature]
17
+ # @param signature_b [Signature]
18
+ #
19
+ # @since 0.2.0
20
+ def initialize(signature_a, signature_b)
21
+ @signature_a = signature_a
22
+ @signature_b = signature_b
23
+ end
24
+
25
+ # @return [Boolean]
26
+ #
27
+ # @since 0.2.0
28
+ def equal_payload?
29
+ signature_a.payload_stamp == signature_b.payload_stamp
30
+ end
31
+
32
+ # @return [Boolean]
33
+ #
34
+ # @since 0.2.0
35
+ def equal_metadata?
36
+ signature_a.metadata_stamp == signature_b.metadata_stamp
37
+ end
38
+
39
+ # @return [Boolean]
40
+ #
41
+ # @since 0.2.0
42
+ def equal_delegator?
43
+ signature_a.delegator_stamp == signature_b.delegator_stamp
44
+ end
45
+
46
+ # @return [Boolean]
47
+ #
48
+ # @since 0.2.0
49
+ def equal_adapter?
50
+ signature_a.adapter_stamp == signature_b.adapter_stamp
51
+ end
52
+
53
+ # @return [Boolean]
54
+ #
55
+ # @since 0.2.0
56
+ def equal_type_alias?
57
+ signature_a.type_alias_stamp == signature_b.type_alias_stamp
58
+ end
59
+
60
+ # @return [Boolean]
61
+ #
62
+ # @since 0.2.0
63
+ def equal_class?
64
+ signature_a.class_stamp == signature_b.class_stamp
65
+ end
66
+
67
+ # @option strict [Boolean]
68
+ # @return [Boolean]
69
+ #
70
+ # @since 0.2.0
71
+ def similar_signatures?
72
+ # rubocop:disable Layout/MultilineOperationIndentation
73
+ equal_type_alias? &&
74
+ equal_class? &&
75
+ equal_payload? &&
76
+ equal_metadata? &&
77
+ equal_delegator? &&
78
+ equal_adapter?
79
+ # rubocop:enable Layout/MultilineOperationIndentation
80
+ end
81
+ end
82
+ end