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.
- checksums.yaml +5 -5
- data/.gitignore +1 -0
- data/.rubocop.yml +10 -1
- data/.travis.yml +4 -5
- data/CHANGELOG.md +73 -0
- data/evil_events.gemspec +6 -3
- data/lib/evil_events.rb +3 -0
- data/lib/evil_events/core/broadcasting.rb +1 -0
- data/lib/evil_events/core/broadcasting/emitter.rb +19 -13
- data/lib/evil_events/core/broadcasting/emitter/adapter_proxy.rb +46 -0
- data/lib/evil_events/core/config.rb +37 -40
- data/lib/evil_events/core/events.rb +34 -3
- data/lib/evil_events/core/events/abstract_event.rb +4 -6
- data/lib/evil_events/core/events/event_extensions/class_signature.rb +13 -0
- data/lib/evil_events/core/events/event_extensions/class_signature/equalizer.rb +0 -2
- data/lib/evil_events/core/events/event_extensions/dispatchable.rb +74 -0
- data/lib/evil_events/core/events/event_extensions/observable.rb +2 -0
- data/lib/evil_events/core/events/event_extensions/serializable.rb +22 -2
- data/lib/evil_events/core/events/manager.rb +1 -1
- data/lib/evil_events/core/events/manager_registry.rb +16 -0
- data/lib/evil_events/core/events/manager_registry/scoped_event_type_matcher.rb +177 -0
- data/lib/evil_events/core/events/notifier/sequential.rb +2 -2
- data/lib/evil_events/core/events/serializers.rb +13 -2
- data/lib/evil_events/core/events/serializers/base.rb +56 -13
- data/lib/evil_events/core/events/serializers/base/abstract_engine.rb +47 -0
- data/lib/evil_events/core/events/serializers/base/abstract_factory.rb +60 -0
- data/lib/evil_events/core/events/serializers/base/data_transformer.rb +57 -0
- data/lib/evil_events/core/events/serializers/base/event_serialization_state.rb +80 -0
- data/lib/evil_events/core/events/serializers/base/generic_config.rb +7 -0
- data/lib/evil_events/core/events/serializers/hash.rb +3 -73
- data/lib/evil_events/core/events/serializers/hash/config.rb +11 -0
- data/lib/evil_events/core/events/serializers/hash/engines.rb +10 -0
- data/lib/evil_events/core/events/serializers/hash/engines/native.rb +60 -0
- data/lib/evil_events/core/events/serializers/hash/factory.rb +65 -0
- data/lib/evil_events/core/events/serializers/hash/packer.rb +26 -0
- data/lib/evil_events/core/events/serializers/hash/unpacker.rb +24 -0
- data/lib/evil_events/core/events/serializers/json.rb +3 -59
- data/lib/evil_events/core/events/serializers/json/config.rb +11 -0
- data/lib/evil_events/core/events/serializers/json/engines.rb +10 -0
- data/lib/evil_events/core/events/serializers/json/engines/native.rb +43 -0
- data/lib/evil_events/core/events/serializers/json/factory.rb +65 -0
- data/lib/evil_events/core/events/serializers/json/packer.rb +26 -0
- data/lib/evil_events/core/events/serializers/json/unpacker.rb +31 -0
- data/lib/evil_events/core/events/serializers/message_pack.rb +7 -0
- data/lib/evil_events/core/events/serializers/message_pack/config.rb +17 -0
- data/lib/evil_events/core/events/serializers/message_pack/engines.rb +10 -0
- data/lib/evil_events/core/events/serializers/message_pack/engines/mpacker.rb +81 -0
- data/lib/evil_events/core/events/serializers/message_pack/factory.rb +65 -0
- data/lib/evil_events/core/events/serializers/message_pack/packer.rb +26 -0
- data/lib/evil_events/core/events/serializers/message_pack/unpacker.rb +24 -0
- data/lib/evil_events/core/events/serializers/xml.rb +7 -0
- data/lib/evil_events/core/events/serializers/xml/config.rb +11 -0
- data/lib/evil_events/core/events/serializers/xml/engines.rb +10 -0
- data/lib/evil_events/core/events/serializers/xml/engines/ox.rb +31 -0
- data/lib/evil_events/core/events/serializers/xml/factory.rb +65 -0
- data/lib/evil_events/core/events/serializers/xml/packer.rb +26 -0
- data/lib/evil_events/core/events/serializers/xml/unpacker.rb +24 -0
- data/lib/evil_events/core/events/subscriber/mixin.rb +26 -3
- data/lib/evil_events/core/system.rb +28 -2
- data/lib/evil_events/core/system/broadcaster.rb +11 -5
- data/lib/evil_events/core/system/event_builder.rb +98 -34
- data/lib/evil_events/core/system/event_manager.rb +12 -0
- data/lib/evil_events/core/system/mock.rb +30 -2
- data/lib/evil_events/emitter.rb +4 -2
- data/lib/evil_events/error.rb +21 -1
- data/lib/evil_events/serializer.rb +14 -0
- data/lib/evil_events/shared.rb +1 -3
- data/lib/evil_events/shared/any_config.rb +60 -0
- data/lib/evil_events/version.rb +2 -2
- metadata +85 -14
- data/.jrubyrc +0 -1
- data/lib/evil_events/core/events/event_extensions/adapter_customizable.rb +0 -49
- data/lib/evil_events/core/events/event_extensions/emittable.rb +0 -41
- data/lib/evil_events/shared/combined_context.rb +0 -124
- data/lib/evil_events/shared/combined_context/mixin.rb +0 -43
- 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
|
@@ -1,77 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class EvilEvents::Core::Events::Serializers
|
4
|
-
# @api
|
5
|
-
# @since 0.
|
6
|
-
|
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,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
|