evil_events 0.3.1 → 0.4.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 (76) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +10 -1
  4. data/.travis.yml +4 -5
  5. data/CHANGELOG.md +73 -0
  6. data/evil_events.gemspec +6 -3
  7. data/lib/evil_events.rb +3 -0
  8. data/lib/evil_events/core/broadcasting.rb +1 -0
  9. data/lib/evil_events/core/broadcasting/emitter.rb +19 -13
  10. data/lib/evil_events/core/broadcasting/emitter/adapter_proxy.rb +46 -0
  11. data/lib/evil_events/core/config.rb +37 -40
  12. data/lib/evil_events/core/events.rb +34 -3
  13. data/lib/evil_events/core/events/abstract_event.rb +4 -6
  14. data/lib/evil_events/core/events/event_extensions/class_signature.rb +13 -0
  15. data/lib/evil_events/core/events/event_extensions/class_signature/equalizer.rb +0 -2
  16. data/lib/evil_events/core/events/event_extensions/dispatchable.rb +74 -0
  17. data/lib/evil_events/core/events/event_extensions/observable.rb +2 -0
  18. data/lib/evil_events/core/events/event_extensions/serializable.rb +22 -2
  19. data/lib/evil_events/core/events/manager.rb +1 -1
  20. data/lib/evil_events/core/events/manager_registry.rb +16 -0
  21. data/lib/evil_events/core/events/manager_registry/scoped_event_type_matcher.rb +177 -0
  22. data/lib/evil_events/core/events/notifier/sequential.rb +2 -2
  23. data/lib/evil_events/core/events/serializers.rb +13 -2
  24. data/lib/evil_events/core/events/serializers/base.rb +56 -13
  25. data/lib/evil_events/core/events/serializers/base/abstract_engine.rb +47 -0
  26. data/lib/evil_events/core/events/serializers/base/abstract_factory.rb +60 -0
  27. data/lib/evil_events/core/events/serializers/base/data_transformer.rb +57 -0
  28. data/lib/evil_events/core/events/serializers/base/event_serialization_state.rb +80 -0
  29. data/lib/evil_events/core/events/serializers/base/generic_config.rb +7 -0
  30. data/lib/evil_events/core/events/serializers/hash.rb +3 -73
  31. data/lib/evil_events/core/events/serializers/hash/config.rb +11 -0
  32. data/lib/evil_events/core/events/serializers/hash/engines.rb +10 -0
  33. data/lib/evil_events/core/events/serializers/hash/engines/native.rb +60 -0
  34. data/lib/evil_events/core/events/serializers/hash/factory.rb +65 -0
  35. data/lib/evil_events/core/events/serializers/hash/packer.rb +26 -0
  36. data/lib/evil_events/core/events/serializers/hash/unpacker.rb +24 -0
  37. data/lib/evil_events/core/events/serializers/json.rb +3 -59
  38. data/lib/evil_events/core/events/serializers/json/config.rb +11 -0
  39. data/lib/evil_events/core/events/serializers/json/engines.rb +10 -0
  40. data/lib/evil_events/core/events/serializers/json/engines/native.rb +43 -0
  41. data/lib/evil_events/core/events/serializers/json/factory.rb +65 -0
  42. data/lib/evil_events/core/events/serializers/json/packer.rb +26 -0
  43. data/lib/evil_events/core/events/serializers/json/unpacker.rb +31 -0
  44. data/lib/evil_events/core/events/serializers/message_pack.rb +7 -0
  45. data/lib/evil_events/core/events/serializers/message_pack/config.rb +17 -0
  46. data/lib/evil_events/core/events/serializers/message_pack/engines.rb +10 -0
  47. data/lib/evil_events/core/events/serializers/message_pack/engines/mpacker.rb +81 -0
  48. data/lib/evil_events/core/events/serializers/message_pack/factory.rb +65 -0
  49. data/lib/evil_events/core/events/serializers/message_pack/packer.rb +26 -0
  50. data/lib/evil_events/core/events/serializers/message_pack/unpacker.rb +24 -0
  51. data/lib/evil_events/core/events/serializers/xml.rb +7 -0
  52. data/lib/evil_events/core/events/serializers/xml/config.rb +11 -0
  53. data/lib/evil_events/core/events/serializers/xml/engines.rb +10 -0
  54. data/lib/evil_events/core/events/serializers/xml/engines/ox.rb +31 -0
  55. data/lib/evil_events/core/events/serializers/xml/factory.rb +65 -0
  56. data/lib/evil_events/core/events/serializers/xml/packer.rb +26 -0
  57. data/lib/evil_events/core/events/serializers/xml/unpacker.rb +24 -0
  58. data/lib/evil_events/core/events/subscriber/mixin.rb +26 -3
  59. data/lib/evil_events/core/system.rb +28 -2
  60. data/lib/evil_events/core/system/broadcaster.rb +11 -5
  61. data/lib/evil_events/core/system/event_builder.rb +98 -34
  62. data/lib/evil_events/core/system/event_manager.rb +12 -0
  63. data/lib/evil_events/core/system/mock.rb +30 -2
  64. data/lib/evil_events/emitter.rb +4 -2
  65. data/lib/evil_events/error.rb +21 -1
  66. data/lib/evil_events/serializer.rb +14 -0
  67. data/lib/evil_events/shared.rb +1 -3
  68. data/lib/evil_events/shared/any_config.rb +60 -0
  69. data/lib/evil_events/version.rb +2 -2
  70. metadata +85 -14
  71. data/.jrubyrc +0 -1
  72. data/lib/evil_events/core/events/event_extensions/adapter_customizable.rb +0 -49
  73. data/lib/evil_events/core/events/event_extensions/emittable.rb +0 -41
  74. data/lib/evil_events/shared/combined_context.rb +0 -124
  75. data/lib/evil_events/shared/combined_context/mixin.rb +0 -43
  76. data/lib/evil_events/shared/configurable.rb +0 -7
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EvilEvents::Core::Events::Serializers::Base
4
+ # @api private
5
+ # @since 0.4.0
6
+ class AbstractEngine
7
+ # @param config [GenericConfig]
8
+ #
9
+ # @api private
10
+ # @since 0.4.0
11
+ def initialize(config); end
12
+
13
+ # @param data [EventSerializationState]
14
+ # @return [Object]
15
+ #
16
+ # @api private
17
+ # @since 0.4.0
18
+ def dump(serialization_state); end
19
+
20
+ # @param data [Object]
21
+ # @return [EventSerializationState]
22
+ #
23
+ # @api private
24
+ # @since 0.4.0
25
+ def load(data); end
26
+
27
+ private
28
+
29
+ # @option id [String,Integer,Object]
30
+ # @option type [String]
31
+ # @option payload [::Hash]
32
+ # @option metadata [::Hash]
33
+ #
34
+ # @return [EventSerializationState]
35
+ #
36
+ # @api private
37
+ # @since 0.4.0
38
+ def restore_serialization_state(id:, type:, payload:, metadata:)
39
+ EventSerializationState.build_from_options(
40
+ id: id,
41
+ type: type,
42
+ payload: payload,
43
+ metadata: metadata
44
+ )
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EvilEvents::Core::Events::Serializers::Base
4
+ # @api private
5
+ # @since 0.4.0
6
+ class AbstractFactory
7
+ # @return [Base]
8
+ #
9
+ # @api private
10
+ # @since 0.4.0
11
+ def create!
12
+ config = build_config
13
+ engine = build_engine(config)
14
+
15
+ packer = build_packer(engine, config)
16
+ unpacker = build_unpacker(engine, config)
17
+
18
+ create_adapter(engine, config, packer, unpacker)
19
+ end
20
+
21
+ # @return [Base::GenericConfig]
22
+ #
23
+ # @api private
24
+ # @since 0.4.0
25
+ def build_config; end
26
+
27
+ # @param config [Base::GenericConfig]
28
+ # @return [Base::Engines::Abstract]
29
+ #
30
+ # @api private
31
+ # @since 0.4.0
32
+ def build_engine(config); end
33
+
34
+ # @param engine [Base::Engines::Abstract]
35
+ # @param config [Base::GenericConfig]
36
+ # @return [Base::Dumper]
37
+ #
38
+ # @api private
39
+ # @since 0.4.0
40
+ def build_packer(engine, config); end
41
+
42
+ # @param engine [Base::Engines::Abstract]
43
+ # @param config [Base::GenericConfig]
44
+ # @return [Base::Dumper]
45
+ #
46
+ # @api private
47
+ # @since 0.4.0
48
+ def build_unpacker(engine, config); end
49
+
50
+ # @param engine [Base::AbstractEngine]
51
+ # @param config [Base::GenericConfig]
52
+ # @param packer [Base::DataTransformer]
53
+ # @param unpacker [Base::DataTransformer]
54
+ # @return [Base]
55
+ #
56
+ # @api private
57
+ # @since 0.4.0
58
+ def create_adapter(engine, config, packer, unpacker); end
59
+ end
60
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EvilEvents::Core::Events::Serializers::Base
4
+ # @api private
5
+ # @since 0.4.0
6
+ class DataTransformer
7
+ # @param engine [Base::Engine::Abstract]
8
+ #
9
+ # @api private
10
+ # @since 0.4.0
11
+ def initialize(engine)
12
+ @engine = engine
13
+ end
14
+
15
+ # @param event [EvilEvents::Core::Events::AbstractEvent]
16
+ # @return [Object]
17
+ #
18
+ # @api private
19
+ # @since 0.4.0
20
+ def call(event); end
21
+
22
+ private
23
+
24
+ # @return [Base::Engine::Abstract]
25
+ #
26
+ # @api private
27
+ # @since 0.4.0
28
+ attr_reader :engine
29
+
30
+ # @param event [EvilEvents::Core::Events::AbstractEvent]
31
+ # @return [EventSerializationState]
32
+ #
33
+ # @api private
34
+ # @since 0.4.0
35
+ def build_serialization_state(event)
36
+ EventSerializationState.build_from_event(event)
37
+ end
38
+
39
+ # @param serialization_state [EventSerializationState]
40
+ # @return [EvilEvents::Core::Events::AbstractEvent]
41
+ #
42
+ # @api private
43
+ # @since 0.4.0
44
+ def restore_event_instance(serialization_state)
45
+ event_class = EvilEvents::Core::Bootstrap[:event_system].resolve_event_class(
46
+ serialization_state.type
47
+ )
48
+
49
+ EvilEvents::Core::Events::EventFactory.restore_instance(
50
+ event_class,
51
+ id: serialization_state.id,
52
+ payload: serialization_state.payload,
53
+ metadata: serialization_state.metadata
54
+ )
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EvilEvents::Core::Events::Serializers::Base
4
+ # @api private
5
+ # @since 0.4.0
6
+ class EventSerializationState
7
+ class << self
8
+ # @param event [EvilEvents::Core::Event::AbstractEvent]
9
+ # @return [EventSerializationState]
10
+ #
11
+ # @api private
12
+ # @since 0.4.0
13
+ def build_from_event(event)
14
+ new(id: event.id, type: event.type, payload: event.payload, metadata: event.metadata)
15
+ end
16
+
17
+ # @option id [String,Integer,Object]
18
+ # @option type [String]
19
+ # @option payload [::Hash]
20
+ # @option metadata [::Hash]
21
+ # @return [EventSerializationState]
22
+ #
23
+ # @api private
24
+ # @since 0.4.0
25
+ def build_from_options(**options)
26
+ new(**options)
27
+ end
28
+ end
29
+
30
+ # @return [String, Integer, Object]
31
+ #
32
+ # @api private
33
+ # @since 0.4.0
34
+ attr_reader :id
35
+
36
+ # @return [String]
37
+ #
38
+ # @api private
39
+ # @since 0.4.0
40
+ attr_reader :type
41
+
42
+ # @return [::Hash]
43
+ #
44
+ # @api private
45
+ # @since 0.4.0
46
+ attr_reader :payload
47
+
48
+ # @return [::Hash]
49
+ #
50
+ # @api private
51
+ # @since 0.4.0
52
+ attr_reader :metadata
53
+
54
+ # @option id [String,Integer,Object]
55
+ # @option type [String]
56
+ # @option payload [::Hash]
57
+ # @option metadata [::Hash]
58
+ #
59
+ # @api private
60
+ # @since 0.4.0
61
+ def initialize(id:, type:, payload:, metadata:)
62
+ @id = id
63
+ @type = type
64
+ @payload = payload
65
+ @metadata = metadata
66
+ end
67
+
68
+ # @return [Boolean]
69
+ #
70
+ # @api private
71
+ # @since 0.4.0
72
+ def valid?
73
+ return false unless type && payload && metadata
74
+ return false unless payload.is_a?(::Hash)
75
+ return false unless metadata.is_a?(::Hash)
76
+ return false unless type.is_a?(String)
77
+ true
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EvilEvents::Core::Events::Serializers::Base
4
+ # @api private
5
+ # @since 0.4.0
6
+ GenericConfig = Class.new(EvilEvents::Shared::AnyConfig)
7
+ end
@@ -1,77 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class EvilEvents::Core::Events::Serializers
4
- # @api public
5
- # @since 0.1.0
6
- module Hash
7
- # @since 0.1.1
8
- extend Base
9
-
10
- class << self
11
- # @param event [EvilEvents::Core::Events::AbstractEvent]
12
- # @raise [EvilEvents::SerializationError]
13
- # @return [::Hash]
14
- #
15
- # @since 0.1.0
16
- def serialize(event)
17
- unless event.is_a?(EvilEvents::Core::Events::AbstractEvent)
18
- raise EvilEvents::SerializationError
19
- end
20
-
21
- {
22
- id: event.id,
23
- type: event.type,
24
- payload: event.payload,
25
- metadata: event.metadata
26
- }
27
- end
28
-
29
- # rubocop:disable Metrics/AbcSize
30
- # rubocop:disable Metrics/CyclomaticComplexity
31
- # rubocop:disable Metrics/PerceivedComplexity
32
-
33
- # @param hash [::Hash]
34
- # @raise [EvilEvents::DeserializationError]
35
- # @return [EvilEvents::Core::Events::AbstractEvent]
36
- #
37
- # @since 0.1.0
38
- def deserialize(hash)
39
- raise EvilEvents::DeserializationError unless hash.is_a?(::Hash)
40
-
41
- event_id = hash[:id] || hash['id']
42
- event_type = hash[:type] || hash['type']
43
- event_payload = hash[:payload] || hash['payload']
44
- event_metadata = hash[:metadata] || hash['metadata']
45
-
46
- raise EvilEvents::DeserializationError unless event_type && event_payload && event_metadata
47
- raise EvilEvents::DeserializationError unless event_payload.is_a?(::Hash)
48
- raise EvilEvents::DeserializationError unless event_metadata.is_a?(::Hash)
49
-
50
- restore_event_instance(
51
- type: event_type,
52
- id: event_id,
53
- payload: symbolized_event_data(event_payload),
54
- metadata: symbolized_event_data(event_metadata)
55
- )
56
- end
57
- # rubocop:enable Metrics/AbcSize
58
- # rubocop:enable Metrics/CyclomaticComplexity
59
- # rubocop:enable Metrics/PerceivedComplexity
60
-
61
- private
62
-
63
- # @param payload_hash [::Hash]
64
- # @return [::Hash]
65
- #
66
- # @since 0.1.0
67
- def symbolized_event_data(payload_hash)
68
- payload_hash.each_pair.each_with_object({}) do |(key, value), result_hash|
69
- result_hash[key.to_sym] = value
70
- end
71
- end
72
- end
73
- end
74
-
75
- # @since 0.1.0
76
- register(:hash) { Hash }
4
+ # @api private
5
+ # @since 0.4.0
6
+ Hash = Class.new(Base)
77
7
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EvilEvents::Core::Events::Serializers
4
+ class Hash
5
+ # @api private
6
+ # @since 0.4.0
7
+ class Config < Base::GenericConfig
8
+ configure { setting :engine, reader: true }
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EvilEvents::Core::Events::Serializers::Hash
4
+ # @since 0.4.0
5
+ # @api private
6
+ class Engines
7
+ # @since 0.4.0
8
+ extend EvilEvents::Shared::DependencyContainer::Mixin
9
+ end
10
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EvilEvents::Core::Events::Serializers::Hash::Engines
4
+ # @api private
5
+ # @since 0.4.0
6
+ class Native < EvilEvents::Core::Events::Serializers::Base::AbstractEngine
7
+ # @param serialization_state [Base::EventSerializationState]
8
+ # @return [::Hash]
9
+ #
10
+ # @since 0.4.0
11
+ # @api private
12
+ def dump(serialization_state)
13
+ {
14
+ id: serialization_state.id,
15
+ type: serialization_state.type,
16
+ payload: serialization_state.payload,
17
+ metadata: serialization_state.metadata
18
+ }
19
+ end
20
+
21
+ # @param hash [::Hash]
22
+ # @raise [EvilEvents::SerializationEngineError]
23
+ # @return [EventSerializationState]
24
+ #
25
+ # @since 0.4.0
26
+ # @api private
27
+ def load(hash)
28
+ begin
29
+ event_id = hash[:id] || hash['id']
30
+ event_type = hash[:type] || hash['type']
31
+ event_payload = hash[:payload] || hash['payload']
32
+ event_metadata = hash[:metadata] || hash['metadata']
33
+ rescue NoMethodError, TypeError, ArgumentError
34
+ raise EvilEvents::SerializationEngineError
35
+ end
36
+
37
+ restore_serialization_state(
38
+ id: event_id,
39
+ type: event_type,
40
+ payload: (symbolized_hash(event_payload) if event_payload),
41
+ metadata: (symbolized_hash(event_metadata) if event_metadata)
42
+ )
43
+ end
44
+
45
+ private
46
+
47
+ # @param hash [::Hash]
48
+ # @return [::Hash]
49
+ #
50
+ # @since 0.1.0
51
+ def symbolized_hash(hash)
52
+ hash.each_pair.each_with_object({}) do |(key, value), result_hash|
53
+ result_hash[key.to_sym] = value
54
+ end
55
+ end
56
+ end
57
+
58
+ # @since 0.4.0
59
+ register(:native, Native)
60
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EvilEvents::Core::Events::Serializers
4
+ class Hash
5
+ # @api private
6
+ # @since 0.4.0
7
+ class Factory < AbstractFactory
8
+ # @return [Hash::Config]
9
+ #
10
+ # @api private
11
+ # @since 0.4.0
12
+ def build_config
13
+ settings = EvilEvents::Core::Bootstrap[:config].serializers.hashing
14
+
15
+ Config.new do |config|
16
+ config.engine = settings.engine
17
+ end
18
+ end
19
+
20
+ # @param config [Hash::Config]
21
+ # @raise [EvilEvents::UnrecognizedSerializationEngineError]
22
+ # @return [Base::AbstractEngine]
23
+ #
24
+ # @api private
25
+ # @since 0.4.0
26
+ def build_engine(config)
27
+ Engines.resolve(config.engine).new(config)
28
+ rescue Dry::Container::Error
29
+ raise EvilEvents::UnrecognizedSerializationEngineError
30
+ end
31
+
32
+ # @param engine [Base::AbstractEngine]
33
+ # @param config [Hash::Config]
34
+ # @return [Hash::Packer]
35
+ #
36
+ # @api private
37
+ # @since 0.4.0
38
+ def build_packer(engine, _config)
39
+ Packer.new(engine)
40
+ end
41
+
42
+ # @param engine [Base::AbstractEngine]
43
+ # @param config [Hash::Config]
44
+ # @return [Hash::Unpacker]
45
+ #
46
+ # @api private
47
+ # @since 0.4.0
48
+ def build_unpacker(engine, _config)
49
+ Unpacker.new(engine)
50
+ end
51
+
52
+ # @param engine [Base::AbstractEngine]
53
+ # @param config [Hash::Config]
54
+ # @param packer [Hash::Packer]
55
+ # @param unpacker [Hash::Unpacker]
56
+ # @return [Hash]
57
+ #
58
+ # @api private
59
+ # @since 0.4.0
60
+ def create_adapter(engine, config, packer, unpacker)
61
+ Hash.new(engine, config, packer, unpacker)
62
+ end
63
+ end
64
+ end
65
+ end