evil_events 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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