evil_events 0.1.0rc4 → 0.1.0rc5
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 +4 -4
- data/README.md +0 -52
- data/lib/evil_events/config/adapters.rb +13 -0
- data/lib/evil_events/config.rb +2 -0
- data/lib/evil_events/core/broadcasting/adapters.rb +1 -0
- data/lib/evil_events/core/broadcasting/dispatcher/mixin.rb +2 -6
- data/lib/evil_events/core/broadcasting.rb +1 -0
- data/lib/evil_events/core/events/abstract_event.rb +2 -1
- data/lib/evil_events/core/events/event_extensions/metadata_extendable/abstract_metadata.rb +1 -19
- data/lib/evil_events/core/events/event_extensions/metadata_extendable.rb +0 -1
- data/lib/evil_events/core/events/event_extensions/payloadable/abstract_payload.rb +1 -19
- data/lib/evil_events/core/events/event_extensions/payloadable.rb +0 -1
- data/lib/evil_events/core/events/manager_factory.rb +1 -1
- data/lib/evil_events/core/events.rb +1 -0
- data/lib/evil_events/shared/clonable_module_builder.rb +25 -0
- data/lib/evil_events/shared/combined_context.rb +12 -5
- data/lib/evil_events/shared/structure.rb +17 -1
- data/lib/evil_events/shared.rb +1 -0
- data/lib/evil_events/system/broadcaster.rb +9 -0
- data/lib/evil_events/system/event_builder.rb +6 -10
- data/lib/evil_events/system/event_manager.rb +2 -1
- data/lib/evil_events/system/mock.rb +4 -0
- data/lib/evil_events/system.rb +2 -1
- data/lib/evil_events/version.rb +1 -1
- data/lib/evil_events.rb +18 -12
- metadata +4 -3
- data/.hound.yml +0 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 433dcd60c4b1a754d00e5a40051f8fce7f2b12c2
|
4
|
+
data.tar.gz: 01a0271699af053fdb782fc7cf45fa888ecb64bd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e1f5c5576c528da60b273de597037843801ba553e645895518595e8eeeb2b58b6c9136c392bdb12f657b813b755a4fc61d7f47fa9008a8b038d27b4f8b37f443
|
7
|
+
data.tar.gz: 1cb7b235ac6cbb07760cf6459f2e5848aabf35e9dcaf290b7c52d8d25c1a43ae313fe4706859c587f17745c66ea4792ac6b0c8fbebd781001aa4a8b4058d59f2
|
data/README.md
CHANGED
@@ -4,62 +4,10 @@
|
|
4
4
|
[](https://travis-ci.org/ergosploit/evil_events)
|
5
5
|
[](https://coveralls.io/github/ergosploit/evil_events?branch=master)
|
6
6
|
|
7
|
-
### Proof of Concept
|
8
|
-
|
9
|
-
```ruby
|
10
|
-
# 0. Subscribers:
|
11
|
-
EventStore = Concurrent::Array.new
|
12
|
-
ElasticStore = Concurrent::Array.new
|
13
|
-
|
14
|
-
# 1. Create events:
|
15
|
-
class UserRegistered < EvilEvents::Event['user_registered']
|
16
|
-
payload :user_id, EvilEvents::Types::Strict::Int
|
17
|
-
payload :ref_link, EvilEvents::Types::Strict::String.default('undefined')
|
18
|
-
|
19
|
-
metadata :uuid, EvilEvents::Types::String.default('shared-uuid')
|
20
|
-
metadata :timestamp, EvilEvents::Types::Time.default { Time.now }
|
21
|
-
|
22
|
-
observe EventStore, delegator: :push
|
23
|
-
observe ElasticStore, delegator: :<<
|
24
|
-
|
25
|
-
adapter :memory_async
|
26
|
-
end
|
27
|
-
|
28
|
-
MatchLost = EvilEvents::Event.define('match_lost') do
|
29
|
-
default_delegator :push
|
30
|
-
|
31
|
-
payload :player_id
|
32
|
-
payload :score
|
33
|
-
|
34
|
-
metadata :timestamp, EvilEvents::Types::Time.default { Time.now }
|
35
|
-
|
36
|
-
observe EventStore
|
37
|
-
|
38
|
-
adapter :memory_sync
|
39
|
-
end
|
40
|
-
|
41
|
-
# 2. Emit via object or via event attributes:
|
42
|
-
UserRegistered.new(payload: { user_id: 1, ref_id: 5 }, metadata: { uuid: 1_111 }).emit!
|
43
|
-
EvilEvents::Event.emit('user_registered', payload: { user_id: 2, ref_id: 7 })
|
44
|
-
EvilEvents::Event.emit('match_lost', payload: { player_id: 5, score: '2-1' })
|
45
|
-
|
46
|
-
# 3. Logs:
|
47
|
-
# => INFO -- [EvilEvents:EventEmitted(memory_async)]: Type: user_registered :: Payload: {:user_id=>1, :ref_id=>5} :: Metadata: {:uuid=>1111, :timestamp=>2017-10-15 20:08:09 +0300}
|
48
|
-
# => INFO -- [EvilEvents:EventEmitted(memory_async)]: Type: user_registered :: Payload: {:user_id=>2, :ref_id=>7} :: Metadata: {:uuid=>"shared-uuid", :timestamp=>2017-10-15 20:08:09 +0300}
|
49
|
-
# => INFO -- [EvilEvents:EventEmitted(memory_sync)]: Type: match_lost :: Payload: {:player_id=>5, :score=>"2-1"} :: Metadata: {:timestamp=>2017-10-15 20:08:09 +0300}
|
50
|
-
|
51
|
-
# 4. State of observers:
|
52
|
-
EventStore # => [#<UserRegistered...>, #<UserRegistered...>, <#MatchLost...>]
|
53
|
-
ElasticStore # => [#<UserRegistered...>, #<UserRegistered...>]
|
54
|
-
```
|
55
|
-
|
56
7
|
### ROADMAP
|
57
8
|
- Basic documentation (README) (0.1.0)
|
58
9
|
- FULL documentation (0.1.1)
|
59
10
|
- Notifier abstraction (0.2.0)
|
60
11
|
- Event sourcing (0.3.0)
|
61
|
-
- RSpec matchers (separated gem)
|
62
12
|
- Concrete error messages for exceptions (0.1.1)
|
63
13
|
- Hooks (0.2.0)
|
64
|
-
- Scheduling (0.2.0)
|
65
|
-
- Event logic (0.2.0)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api public
|
4
|
+
# @since 0.1.0
|
5
|
+
module EvilEvents::Config::Adapters
|
6
|
+
class << self
|
7
|
+
# @api public
|
8
|
+
# @since 0.1.0
|
9
|
+
def register(adapter_name, adapter_object)
|
10
|
+
EvilEvents::BootPoint[:event_system].register_adapter(adapter_name, adapter_object)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/evil_events/config.rb
CHANGED
@@ -2,13 +2,9 @@
|
|
2
2
|
|
3
3
|
module EvilEvents::Core::Broadcasting
|
4
4
|
class Dispatcher
|
5
|
-
# @api
|
5
|
+
# @api private
|
6
6
|
# @since 0.1.0
|
7
|
-
|
8
|
-
# @param event [EvilEvents::Core::Events::AbstractEvent]
|
9
|
-
# @return void
|
10
|
-
#
|
11
|
-
# @since 0.1.0
|
7
|
+
Mixin = EvilEvents::Shared::ClonableModuleBuilder.build do
|
12
8
|
def dispatch(event)
|
13
9
|
Dispatcher.dispatch(event)
|
14
10
|
end
|
@@ -24,7 +24,8 @@ module EvilEvents::Core::Events
|
|
24
24
|
# @since 0.1.0
|
25
25
|
extend EvilEvents::Shared::CombinedContextMixin
|
26
26
|
|
27
|
-
# @
|
27
|
+
# @option payload [Hash]
|
28
|
+
# @option metadata [Hash]
|
28
29
|
#
|
29
30
|
# @since 0.1.0
|
30
31
|
def initialize(payload: {}, metadata: {})
|
@@ -1,25 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# TODO: dry and refactor with AbstractPayload
|
4
3
|
module EvilEvents::Core::Events::EventExtensions::MetadataExtendable
|
5
|
-
# @abstract
|
6
4
|
# @api private
|
7
5
|
# @since 0.1.0
|
8
|
-
|
9
|
-
class << self
|
10
|
-
# @since 0.1.0
|
11
|
-
alias_method :_native_attribute, :attribute
|
12
|
-
|
13
|
-
# @param key [Symbol]
|
14
|
-
# @param type [EvilEvents::Shared::Types::Any]
|
15
|
-
#
|
16
|
-
# @since 0.1.0
|
17
|
-
def attribute(key, type = EvilEvents::Types::Any)
|
18
|
-
_native_attribute(key, type)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
# NOTE: dry-struct API + dry-initializer API
|
23
|
-
constructor_type :strict_with_defaults
|
24
|
-
end
|
6
|
+
AbstractMetadata = Class.new(EvilEvents::Shared::Structure)
|
25
7
|
end
|
@@ -1,25 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# TODO: dry and refactor with AbstractMetadata
|
4
3
|
module EvilEvents::Core::Events::EventExtensions::Payloadable
|
5
|
-
# @abstract
|
6
4
|
# @api private
|
7
5
|
# @since 0.1.0
|
8
|
-
|
9
|
-
class << self
|
10
|
-
# @since 0.1.0
|
11
|
-
alias_method :_native_attribute, :attribute
|
12
|
-
|
13
|
-
# @param key [Symbol]
|
14
|
-
# @param type [EvilEvents::Shared::Types::Any]
|
15
|
-
#
|
16
|
-
# @since 0.1.0
|
17
|
-
def attribute(key, type = EvilEvents::Types::Any)
|
18
|
-
_native_attribute(key, type)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
# NOTE: dry-struct API + dry-initializer API
|
23
|
-
constructor_type :strict_with_defaults
|
24
|
-
end
|
6
|
+
AbstractPayload = Class.new(EvilEvents::Shared::Structure)
|
25
7
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module EvilEvents::Shared
|
4
|
+
# @api public
|
5
|
+
# @since 0.1.0
|
6
|
+
module ClonableModuleBuilder
|
7
|
+
class << self
|
8
|
+
# @param module_definitions [Proc]
|
9
|
+
# @return [Module]
|
10
|
+
#
|
11
|
+
# @since 0.1.0
|
12
|
+
def build(&module_definitions)
|
13
|
+
Module.new do
|
14
|
+
class_eval(&module_definitions) if block_given?
|
15
|
+
|
16
|
+
singleton_class.instance_eval do
|
17
|
+
define_method :module do
|
18
|
+
Module.new { class_eval(&module_definitions) if block_given? }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -46,6 +46,11 @@ module EvilEvents
|
|
46
46
|
# @since 0.1.0
|
47
47
|
attr_reader :__outer_context__
|
48
48
|
|
49
|
+
# @return [::Kernel]
|
50
|
+
#
|
51
|
+
# @since 0.1.0
|
52
|
+
attr_reader :__kernel_context__
|
53
|
+
|
49
54
|
# @return [Proc]
|
50
55
|
#
|
51
56
|
# @since 0.1.0
|
@@ -60,6 +65,7 @@ module EvilEvents
|
|
60
65
|
|
61
66
|
@__required_context__ = required_context
|
62
67
|
@__outer_context__ = ::Kernel.eval('self', clojure.binding)
|
68
|
+
@__kernel_context__ = ::Kernel
|
63
69
|
@__clojure__ = clojure
|
64
70
|
end
|
65
71
|
|
@@ -81,8 +87,8 @@ module EvilEvents
|
|
81
87
|
__outer_context__.public_send(method_name, *arguments, &block)
|
82
88
|
when __required_context__.respond_to?(method_name)
|
83
89
|
__required_context__.public_send(method_name, *arguments, &block)
|
84
|
-
when
|
85
|
-
|
90
|
+
when __kernel_context__.respond_to?(method_name)
|
91
|
+
__kernel_context__.public_send(method_name, *arguments, &block)
|
86
92
|
else
|
87
93
|
super
|
88
94
|
end
|
@@ -93,7 +99,8 @@ module EvilEvents
|
|
93
99
|
# @since 0.1.0
|
94
100
|
def respond_to_missing?(method_name, include_private = false)
|
95
101
|
__outer_context__.respond_to?(method_name) ||
|
96
|
-
__required_context__.respond_to?(method_name) ||
|
102
|
+
__required_context__.respond_to?(method_name) ||
|
103
|
+
__kernel_context__.respond_to?(method_name) || super
|
97
104
|
end
|
98
105
|
|
99
106
|
# @see #method_missing
|
@@ -106,8 +113,8 @@ module EvilEvents
|
|
106
113
|
__outer_context__.method(method_name)
|
107
114
|
when __required_context__.respond_to?(method_name)
|
108
115
|
__required_context__.method(method_name)
|
109
|
-
when
|
110
|
-
|
116
|
+
when __kernel_context__.respond_to?(method_name)
|
117
|
+
__kernel_context__.method(method_name)
|
111
118
|
else
|
112
119
|
super
|
113
120
|
end
|
@@ -3,5 +3,21 @@
|
|
3
3
|
module EvilEvents::Shared
|
4
4
|
# @api public
|
5
5
|
# @since 0.1.0
|
6
|
-
Structure
|
6
|
+
class Structure < Dry::Struct
|
7
|
+
class << self
|
8
|
+
# @since 0.1.0
|
9
|
+
alias_method :_native_attribute, :attribute
|
10
|
+
|
11
|
+
# @param key [Symbol]
|
12
|
+
# @param type [EvilEvents::Shared::Types::Any]
|
13
|
+
#
|
14
|
+
# @since 0.1.0
|
15
|
+
def attribute(key, type = EvilEvents::Shared::Types::Any)
|
16
|
+
_native_attribute(key, type)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# NOTE: dry-struct API + dry-initializer API
|
21
|
+
constructor_type :strict_with_defaults
|
22
|
+
end
|
7
23
|
end
|
data/lib/evil_events/shared.rb
CHANGED
@@ -38,5 +38,14 @@ class EvilEvents::System
|
|
38
38
|
def resolve_adapter(adapter_name)
|
39
39
|
EvilEvents::Core::Broadcasting::Adapters.resolve(adapter_name)
|
40
40
|
end
|
41
|
+
|
42
|
+
# @param adapter_name [Symbol, String]
|
43
|
+
# @param adapter_object [Object]
|
44
|
+
# @return void
|
45
|
+
#
|
46
|
+
# @since 0.1.0
|
47
|
+
def register_adapter(adapter_name, adapter_object)
|
48
|
+
EvilEvents::Core::Broadcasting::Adapters.register(adapter_name, adapter_object)
|
49
|
+
end
|
41
50
|
end
|
42
51
|
end
|
@@ -11,9 +11,7 @@ class EvilEvents::System
|
|
11
11
|
#
|
12
12
|
# @since 0.1.0
|
13
13
|
def define_event_class(event_type, &event_class_definitions)
|
14
|
-
EvilEvents::Core::Events::EventClassFactory.create(
|
15
|
-
event_type, &event_class_definitions
|
16
|
-
)
|
14
|
+
EvilEvents::Core::Events::EventClassFactory.create(event_type, &event_class_definitions)
|
17
15
|
end
|
18
16
|
|
19
17
|
# @param event_type [String]
|
@@ -21,25 +19,23 @@ class EvilEvents::System
|
|
21
19
|
#
|
22
20
|
# @since 0.1.0
|
23
21
|
def define_abstract_event_class(event_type)
|
24
|
-
EvilEvents::Core::Events::EventClassFactory.create_abstract(
|
25
|
-
event_type
|
26
|
-
)
|
22
|
+
EvilEvents::Core::Events::EventClassFactory.create_abstract(event_type)
|
27
23
|
end
|
28
24
|
|
29
25
|
# @param serialized_event [String]
|
30
|
-
# @return [
|
26
|
+
# @return [EvilEvents::Core::Events::AbstractEvent]
|
31
27
|
#
|
32
28
|
# @since 0.1.0
|
33
29
|
def deserialize_from_json(serialized_event)
|
34
|
-
EvilEvents::Core::Events::
|
30
|
+
EvilEvents::Core::Events::Serializers.resolve(:json).deserialize(serialized_event)
|
35
31
|
end
|
36
32
|
|
37
33
|
# @param serialized_event [Hash]
|
38
|
-
# @return [
|
34
|
+
# @return [EvilEvents::Core::Events::AbstractEvent]
|
39
35
|
#
|
40
36
|
# @since 0.1.0
|
41
37
|
def deserialize_from_hash(serialized_event)
|
42
|
-
EvilEvents::Core::Events::
|
38
|
+
EvilEvents::Core::Events::Serializers.resolve(:hash).deserialize(serialized_event)
|
43
39
|
end
|
44
40
|
end
|
45
41
|
end
|
@@ -39,6 +39,10 @@ class EvilEvents::System
|
|
39
39
|
# @since 0.1.0
|
40
40
|
def resolve_adapter(adapter_name); end
|
41
41
|
|
42
|
+
# @see EvilEvents::System
|
43
|
+
# @since 0.1.0
|
44
|
+
def register_adapter(adapter_name, adapter_object); end
|
45
|
+
|
42
46
|
# @see EvilEvents::System
|
43
47
|
# @since 0.1.0
|
44
48
|
def register_event_class(event_class); end
|
data/lib/evil_events/system.rb
CHANGED
data/lib/evil_events/version.rb
CHANGED
data/lib/evil_events.rb
CHANGED
@@ -23,6 +23,10 @@ module EvilEvents
|
|
23
23
|
# @since 0.1.0
|
24
24
|
Types = Shared::Types
|
25
25
|
|
26
|
+
# @api public
|
27
|
+
# @since 0.1.0
|
28
|
+
DispatcherMixin = EvilEvents::Core::Broadcasting::Dispatcher::Mixin.module
|
29
|
+
|
26
30
|
# @api public
|
27
31
|
# @since 0.1.0
|
28
32
|
module Serializer
|
@@ -45,32 +49,34 @@ module EvilEvents
|
|
45
49
|
|
46
50
|
# @api public
|
47
51
|
# @since 0.1.0
|
48
|
-
module
|
52
|
+
module Emitter
|
49
53
|
class << self
|
50
54
|
# @see EvilEvents::System
|
51
55
|
# @api public
|
52
56
|
# @since 0.1.0
|
53
|
-
def
|
54
|
-
EvilEvents::BootPoint[:event_system].
|
55
|
-
event_type
|
56
|
-
)
|
57
|
+
def emit(event_type, **event_attributes)
|
58
|
+
EvilEvents::BootPoint[:event_system].raw_emit(event_type, **event_attributes)
|
57
59
|
end
|
60
|
+
end
|
61
|
+
end
|
58
62
|
|
63
|
+
# @api public
|
64
|
+
# @since 0.1.0
|
65
|
+
module Event
|
66
|
+
class << self
|
59
67
|
# @see EvilEvents::System
|
60
68
|
# @api public
|
61
69
|
# @since 0.1.0
|
62
|
-
def
|
63
|
-
EvilEvents::BootPoint[:event_system].
|
64
|
-
event_type, &event_class_definitions
|
65
|
-
)
|
70
|
+
def [](event_type)
|
71
|
+
EvilEvents::BootPoint[:event_system].define_abstract_event_class(event_type)
|
66
72
|
end
|
67
73
|
|
68
74
|
# @see EvilEvents::System
|
69
75
|
# @api public
|
70
76
|
# @since 0.1.0
|
71
|
-
def
|
72
|
-
EvilEvents::BootPoint[:event_system].
|
73
|
-
event_type,
|
77
|
+
def define(event_type, &event_class_definitions)
|
78
|
+
EvilEvents::BootPoint[:event_system].define_event_class(
|
79
|
+
event_type, &event_class_definitions
|
74
80
|
)
|
75
81
|
end
|
76
82
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: evil_events
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.0rc5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rustam Ibragimov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-10-
|
11
|
+
date: 2017-10-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dry-monads
|
@@ -229,7 +229,6 @@ extensions: []
|
|
229
229
|
extra_rdoc_files: []
|
230
230
|
files:
|
231
231
|
- ".gitignore"
|
232
|
-
- ".hound.yml"
|
233
232
|
- ".jrubyrc"
|
234
233
|
- ".rspec"
|
235
234
|
- ".rubocop.yml"
|
@@ -246,6 +245,7 @@ files:
|
|
246
245
|
- lib/evil_events.rb
|
247
246
|
- lib/evil_events/boot_point.rb
|
248
247
|
- lib/evil_events/config.rb
|
248
|
+
- lib/evil_events/config/adapters.rb
|
249
249
|
- lib/evil_events/core.rb
|
250
250
|
- lib/evil_events/core/activity_logger.rb
|
251
251
|
- lib/evil_events/core/broadcasting.rb
|
@@ -278,6 +278,7 @@ files:
|
|
278
278
|
- lib/evil_events/core/events/subscriber.rb
|
279
279
|
- lib/evil_events/core/events/subscriber/mixin.rb
|
280
280
|
- lib/evil_events/shared.rb
|
281
|
+
- lib/evil_events/shared/clonable_module_builder.rb
|
281
282
|
- lib/evil_events/shared/combined_context.rb
|
282
283
|
- lib/evil_events/shared/combined_context_mixin.rb
|
283
284
|
- lib/evil_events/shared/configurable.rb
|
data/.hound.yml
DELETED