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,26 @@
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 Packer < Base::DataTransformer
8
+ # @param event [EvilEvents::Core::Events::AbstractEvent]
9
+ # @raise [EvilEvents::HashSerializationError]
10
+ # @return [String]
11
+ #
12
+ # @see Base::DataTransformer
13
+ #
14
+ # @api private
15
+ # @since 0.4.0
16
+ def call(event)
17
+ unless event.is_a?(EvilEvents::Core::Events::AbstractEvent)
18
+ raise EvilEvents::HashSerializationError
19
+ end
20
+
21
+ serialization_state = build_serialization_state(event)
22
+ engine.dump(serialization_state)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,24 @@
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 Unpacker < Base::DataTransformer
8
+ # @param serialized_event [::Hash]
9
+ # @raise [EvilEvents::HashDeserializationError]
10
+ # @return [EvilEvents::Core::Events::AbstractEvent]
11
+ #
12
+ # @see Base::DataTransformer
13
+ #
14
+ # @api private
15
+ # @since 0.4.0
16
+ def call(serialized_event)
17
+ raise EvilEvents::HashDeserializationError unless serialized_event.is_a?(::Hash)
18
+ serialization_state = engine.load(serialized_event)
19
+ raise EvilEvents::HashDeserializationError unless serialization_state.valid?
20
+ restore_event_instance(serialization_state)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,63 +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 JSON
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
- ::JSON.generate(
22
- id: event.id,
23
- type: event.type,
24
- payload: event.payload,
25
- metadata: event.metadata
26
- )
27
- end
28
-
29
- # @param json [String]
30
- # @raise [EvilEvents::DeserializationError]
31
- # @return [EvilEvents::Core::Events::AbstractEvent]
32
- #
33
- # @since 0.1.0
34
- def deserialize(json)
35
- raise EvilEvents::DeserializationError unless json.is_a?(String)
36
-
37
- begin
38
- json_hash = ::JSON.parse(json, symbolize_names: true)
39
- event_id = json_hash[:id]
40
- event_type = json_hash[:type]
41
- event_payload = json_hash[:payload]
42
- event_metadata = json_hash[:metadata]
43
-
44
- unless event_type && event_payload && event_metadata
45
- raise EvilEvents::DeserializationError
46
- end
47
- rescue ::JSON::ParserError
48
- raise EvilEvents::DeserializationError
49
- end
50
-
51
- restore_event_instance(
52
- type: event_type,
53
- id: event_id,
54
- payload: event_payload,
55
- metadata: event_metadata
56
- )
57
- end
58
- end
59
- end
60
-
61
- # @since 0.1.0
62
- register(:json) { JSON }
4
+ # @api private
5
+ # @since 0.4.0
6
+ JSON = Class.new(Base)
63
7
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EvilEvents::Core::Events::Serializers
4
+ class JSON
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::JSON
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,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EvilEvents::Core::Events::Serializers::JSON::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 [String]
9
+ #
10
+ # @since 0.4.0
11
+ # @api private
12
+ def dump(serialization_state)
13
+ ::JSON.generate(
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 json_string [String]
22
+ # @raise [EvilEvents::SerializationEngineError]
23
+ # @return [EventSerializationState]
24
+ #
25
+ # @since 0.4.0
26
+ # @api private
27
+ def load(json_string)
28
+ json = ::JSON.parse(json_string, symbolize_names: true)
29
+
30
+ restore_serialization_state(
31
+ id: json[:id],
32
+ type: json[:type],
33
+ payload: json[:payload],
34
+ metadata: json[:metadata]
35
+ )
36
+ rescue ::JSON::ParserError, TypeError
37
+ raise EvilEvents::SerializationEngineError
38
+ end
39
+ end
40
+
41
+ # @since 0.4.0
42
+ register(:native, Native)
43
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EvilEvents::Core::Events::Serializers
4
+ class JSON
5
+ # @api private
6
+ # @since 0.4.0
7
+ class Factory < AbstractFactory
8
+ # @return [JSON::Config]
9
+ #
10
+ # @api private
11
+ # @since 0.4.0
12
+ def build_config
13
+ settings = EvilEvents::Core::Bootstrap[:config].serializers.json
14
+
15
+ Config.new do |config|
16
+ config.engine = settings.engine
17
+ end
18
+ end
19
+
20
+ # @param config [JSON::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 [JSON::Config]
34
+ # @return [JSON::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 [JSON::Config]
44
+ # @return [JSON::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 [JSON::Config]
54
+ # @param packer [JSON::Packer]
55
+ # @param unpacker [JSON::Unpacker]
56
+ # @return [JSON]
57
+ #
58
+ # @api private
59
+ # @since 0.4.0
60
+ def create_adapter(engine, config, packer, unpacker)
61
+ JSON.new(engine, config, packer, unpacker)
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EvilEvents::Core::Events::Serializers
4
+ class JSON
5
+ # @api private
6
+ # @since 0.4.0
7
+ class Packer < Base::DataTransformer
8
+ # @param event [EvilEvents::Core::Events::AbstractEvent]
9
+ # @raise [EvilEvents::JSONSerializationError]
10
+ # @return [String]
11
+ #
12
+ # @see Base::DataTransformer
13
+ #
14
+ # @api private
15
+ # @since 0.4.0
16
+ def call(event)
17
+ unless event.is_a?(EvilEvents::Core::Events::AbstractEvent)
18
+ raise EvilEvents::JSONSerializationError
19
+ end
20
+
21
+ serialization_state = build_serialization_state(event)
22
+ engine.dump(serialization_state)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EvilEvents::Core::Events::Serializers
4
+ class JSON
5
+ # @api private
6
+ # @since 0.4.0
7
+ class Unpacker < Base::DataTransformer
8
+ # @param serialized_event [String]
9
+ # @raise [EvilEvents::JSONDeserializationError]
10
+ # @return [EvilEvents::Core::Events::AbstractEvent]
11
+ #
12
+ # @see Base::DataTransformer
13
+ #
14
+ # @api private
15
+ # @since 0.4.0
16
+ def call(serialized_event)
17
+ raise EvilEvents::JSONDeserializationError unless serialized_event.is_a?(String)
18
+
19
+ begin
20
+ serialization_state = engine.load(serialized_event)
21
+ rescue EvilEvents::SerializationEngineError
22
+ raise EvilEvents::JSONDeserializationError
23
+ end
24
+
25
+ raise EvilEvents::JSONDeserializationError unless serialization_state.valid?
26
+
27
+ restore_event_instance(serialization_state)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EvilEvents::Core::Events::Serializers
4
+ # @api private
5
+ # @since 0.4.0
6
+ MessagePack = Class.new(Base)
7
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EvilEvents::Core::Events::Serializers
4
+ class MessagePack
5
+ # @api private
6
+ # @since 0.4.0
7
+ class Config < Base::GenericConfig
8
+ configure do
9
+ setting :engine, reader: true
10
+
11
+ setting :mpacker, reader: true do
12
+ setting :configurator, ->(engine) {}
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EvilEvents::Core::Events::Serializers::MessagePack
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,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EvilEvents::Core::Events::Serializers::MessagePack::Engines
4
+ # @api private
5
+ # @since 0.4.0
6
+ class Mpacker < EvilEvents::Core::Events::Serializers::Base::AbstractEngine
7
+ # @param config [EvilEvents::Core::Events::Serializers::MessagePack::Config]
8
+ # @raise [EvilEvents::SerializationEngineError]
9
+ #
10
+ # @api private
11
+ # @since 0.4.0
12
+ def initialize(config)
13
+ configurator = config.mpacker.configurator
14
+ raise EvilEvents::SerializationEngineError unless configurator.is_a?(Proc)
15
+ @factory = ::MessagePack::Factory.new.tap { |factory| configurator.call(factory) }
16
+ end
17
+
18
+ # @param serialization_state [Base::EventSerializationState]
19
+ # @return [String]
20
+ #
21
+ # @since 0.4.0
22
+ # @api private
23
+ def dump(serialization_state)
24
+ packer.pack(
25
+ id: serialization_state.id,
26
+ type: serialization_state.type,
27
+ payload: serialization_state.payload,
28
+ metadata: serialization_state.metadata
29
+ ).to_str
30
+ end
31
+
32
+ # @param message [String]
33
+ # @raise [EvilEvents::SerializationEngineError]
34
+ # @return [EventSerializationState]
35
+ #
36
+ # @since 0.4.0
37
+ # @api private
38
+ def load(message)
39
+ begin
40
+ event_data = unpacker.feed(message).unpack
41
+ raise EvilEvents::SerializationEngineError unless event_data.is_a?(::Hash)
42
+ rescue ::MessagePack::UnpackError, ArgumentError, TypeError
43
+ raise EvilEvents::SerializationEngineError
44
+ end
45
+
46
+ restore_serialization_state(
47
+ id: event_data[:id],
48
+ type: event_data[:type],
49
+ payload: event_data[:payload],
50
+ metadata: event_data[:metadata]
51
+ )
52
+ end
53
+
54
+ private
55
+
56
+ # @return [::MessagePack::Factory]
57
+ #
58
+ # @api private
59
+ # @since 0.4.0
60
+ attr_reader :factory
61
+
62
+ # @return [::MessagePack::Packer]
63
+ #
64
+ # @api private
65
+ # @since 0.4.0
66
+ def packer
67
+ factory.packer
68
+ end
69
+
70
+ # @return [::MessagePack::Unpacker]
71
+ #
72
+ # @api private
73
+ # @since 0.4.0
74
+ def unpacker
75
+ factory.unpacker(symbolize_keys: true)
76
+ end
77
+ end
78
+
79
+ # @since 0.4.0
80
+ register(:mpacker, Mpacker)
81
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EvilEvents::Core::Events::Serializers
4
+ class MessagePack
5
+ # @api private
6
+ # @since 0.4.0
7
+ class Factory < AbstractFactory
8
+ # @return [MessagePack::Config]
9
+ #
10
+ # @api private
11
+ # @since 0.4.0
12
+ def build_config
13
+ settings = EvilEvents::Core::Bootstrap[:config].serializers.msgpack
14
+
15
+ Config.new do |config|
16
+ config.engine = settings.engine
17
+ config.mpacker.configurator = settings.mpacker.configurator
18
+ end
19
+ end
20
+
21
+ # @param config [MessagePack::Config]
22
+ # @raise [EvilEvents::UnrecognizedSerializationEngineError]
23
+ # @return [Base::AbstractEngine]
24
+ #
25
+ # @api private
26
+ # @since 0.4.0
27
+ def build_engine(config)
28
+ Engines.resolve(config.engine).new(config)
29
+ rescue Dry::Container::Error
30
+ raise EvilEvents::UnrecognizedSerializationEngineError
31
+ end
32
+
33
+ # @param engine [Base::AbstractEngine]
34
+ # @param config [MessagePack::Config]
35
+ # @return [MessagePack::Packer]
36
+ #
37
+ # @api private
38
+ # @since 0.4.0
39
+ def build_packer(engine, _config)
40
+ Packer.new(engine)
41
+ end
42
+
43
+ # @param engine [Base::AbstractEngine]
44
+ # @param config [MessagePack::Config]
45
+ # @return [MessagePack::Unpacker]
46
+ #
47
+ # @api private
48
+ # @since 0.4.0
49
+ def build_unpacker(engine, _config)
50
+ Unpacker.new(engine)
51
+ end
52
+
53
+ # @param engine [Base::AbstractEngine]
54
+ # @param config [MessagePack::Config]
55
+ # @param packer [MessagePack::Packer]
56
+ # @param unpacker [MessagePack::Unpacker]
57
+ #
58
+ # @api private
59
+ # @since 0.4.0
60
+ def create_adapter(engine, config, packer, unpacker)
61
+ MessagePack.new(engine, config, packer, unpacker)
62
+ end
63
+ end
64
+ end
65
+ end