evil_events 0.1.0rc3 → 0.1.0rc4
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 +49 -2
- data/evil_events.gemspec +5 -4
- data/lib/evil_events/shared/types.rb +1 -0
- data/lib/evil_events/system/event_builder.rb +16 -0
- data/lib/evil_events/system/mock.rb +8 -0
- data/lib/evil_events/system.rb +3 -1
- data/lib/evil_events/version.rb +1 -1
- data/lib/evil_events.rb +48 -23
- metadata +22 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c736b2f681a527cc5c3f01b2463954b8206864a2
|
4
|
+
data.tar.gz: 5de17389672409a9a313820d9b1dbdbdbc86d17e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c570fc9dedbdf9b8ee66cbf735a59d89cfe2ffc33e70c6a0b1e6866388379a06acd9ccd836e718ab9530d4626e04cb0d679891dbdd97b66c69d28f6cf1207079
|
7
|
+
data.tar.gz: 0c65ec58f6114b0a469307920ba246eea79f0642b9e68ba8be75b2267886bb6778b1b9c2aeeb8b64b200ba4119c60cd5545b42ed0aabd5546adab7cff68fb848
|
data/README.md
CHANGED
@@ -1,10 +1,57 @@
|
|
1
|
-
# EvilEvents - event subsystem for ruby applications
|
1
|
+
# EvilEvents :imp: - event subsystem for ruby applications (work in progress!)
|
2
2
|
|
3
3
|
[](https://badge.fury.io/rb/evil_events)
|
4
4
|
[](https://travis-ci.org/ergosploit/evil_events)
|
5
5
|
[](https://coveralls.io/github/ergosploit/evil_events?branch=master)
|
6
6
|
|
7
|
-
|
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
|
+
```
|
8
55
|
|
9
56
|
### ROADMAP
|
10
57
|
- Basic documentation (README) (0.1.0)
|
data/evil_events.gemspec
CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |spec|
|
|
16
16
|
spec.summary = 'Event subsystem for ruby applications'
|
17
17
|
spec.description = 'Ultra simple, but very flexible and fully customizable event subsystem ' \
|
18
18
|
'for ruby applications with a wide set of customization interfaces ' \
|
19
|
-
'
|
19
|
+
'and smart event definition DSL.'
|
20
20
|
|
21
21
|
spec.bindir = 'bin'
|
22
22
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
@@ -26,15 +26,16 @@ Gem::Specification.new do |spec|
|
|
26
26
|
f.match(%r{^(spec|features)/})
|
27
27
|
end
|
28
28
|
|
29
|
-
spec.add_dependency 'dry-
|
29
|
+
spec.add_dependency 'dry-monads', '0.3.1'
|
30
|
+
spec.add_dependency 'dry-types', '0.12.1'
|
30
31
|
spec.add_dependency 'dry-struct', '0.3.1'
|
31
32
|
spec.add_dependency 'dry-configurable', '0.7.0'
|
32
33
|
spec.add_dependency 'dry-container', '0.6.0'
|
33
34
|
spec.add_dependency 'concurrent-ruby', '1.0.5'
|
34
35
|
|
35
|
-
spec.add_development_dependency 'coveralls', '0.
|
36
|
+
spec.add_development_dependency 'coveralls', '0.8.21'
|
36
37
|
spec.add_development_dependency 'pry', '0.11.1'
|
37
|
-
spec.add_development_dependency 'simplecov', '0.
|
38
|
+
spec.add_development_dependency 'simplecov', '0.14.1'
|
38
39
|
spec.add_development_dependency 'simplecov-json', '0.2'
|
39
40
|
spec.add_development_dependency 'rubocop', '0.50.0'
|
40
41
|
spec.add_development_dependency 'bundler', '1.15.4'
|
@@ -25,6 +25,22 @@ class EvilEvents::System
|
|
25
25
|
event_type
|
26
26
|
)
|
27
27
|
end
|
28
|
+
|
29
|
+
# @param serialized_event [String]
|
30
|
+
# @return [Class{EvilEvents::Core::Events::AbstractEvent}]
|
31
|
+
#
|
32
|
+
# @since 0.1.0
|
33
|
+
def deserialize_from_json(serialized_event)
|
34
|
+
EvilEvents::Core::Events::Serializer.resolve[:json].deserialize(serialized_event)
|
35
|
+
end
|
36
|
+
|
37
|
+
# @param serialized_event [Hash]
|
38
|
+
# @return [Class{EvilEvents::Core::Events::AbstractEvent}]
|
39
|
+
#
|
40
|
+
# @since 0.1.0
|
41
|
+
def deserialize_from_hash(serialized_event)
|
42
|
+
EvilEvents::Core::Events::Serializer.resolve[:hash].deserialize(serialized_event)
|
43
|
+
end
|
28
44
|
end
|
29
45
|
end
|
30
46
|
end
|
@@ -67,6 +67,14 @@ class EvilEvents::System
|
|
67
67
|
# @since 0.1.0
|
68
68
|
def define_abstract_event_class(event_type); end
|
69
69
|
|
70
|
+
# @see EvilEvents::System
|
71
|
+
# @since 0.1.0
|
72
|
+
def deserialize_from_json(serialized_event); end
|
73
|
+
|
74
|
+
# @see EvilEvents::System
|
75
|
+
# @since 0.1.0
|
76
|
+
def deserialize_from_hash(serialized_event); end
|
77
|
+
|
70
78
|
# @see EvilEvents::System
|
71
79
|
# @since 0.1.0
|
72
80
|
def managed_event?(event_class); end
|
data/lib/evil_events/system.rb
CHANGED
@@ -38,7 +38,9 @@ class EvilEvents::System
|
|
38
38
|
# @since 0.1.0
|
39
39
|
def_delegators 'EvilEvents::System::EventBuilder',
|
40
40
|
:define_event_class,
|
41
|
-
:define_abstract_event_class
|
41
|
+
:define_abstract_event_class,
|
42
|
+
:deserialize_from_json,
|
43
|
+
:deserialize_from_hash
|
42
44
|
|
43
45
|
# @return [EvilEvents::System::Broadcaster]
|
44
46
|
#
|
data/lib/evil_events/version.rb
CHANGED
data/lib/evil_events.rb
CHANGED
@@ -19,35 +19,60 @@ module EvilEvents
|
|
19
19
|
require_relative 'evil_events/boot_point'
|
20
20
|
require_relative 'evil_events/version'
|
21
21
|
|
22
|
+
# @api public
|
22
23
|
# @since 0.1.0
|
23
24
|
Types = Shared::Types
|
24
25
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
)
|
33
|
-
|
26
|
+
# @api public
|
27
|
+
# @since 0.1.0
|
28
|
+
module Serializer
|
29
|
+
class << self
|
30
|
+
# @see EvilEvents::System
|
31
|
+
# @api public
|
32
|
+
# @since 0.1.0
|
33
|
+
def load_from_json(serialized_event)
|
34
|
+
EvilEvents::BootPoint[:event_system].deserialize_from_json(serialized_event)
|
35
|
+
end
|
34
36
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
)
|
37
|
+
# @see EvilEvents::System
|
38
|
+
# @api public
|
39
|
+
# @since 0.1.0
|
40
|
+
def load_from_hash(serialized_event)
|
41
|
+
EvilEvents::BootPoint[:event_system].deserialize_from_hash(serialized_event)
|
42
|
+
end
|
42
43
|
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# @api public
|
47
|
+
# @since 0.1.0
|
48
|
+
module Event
|
49
|
+
class << self
|
50
|
+
# @see EvilEvents::System
|
51
|
+
# @api public
|
52
|
+
# @since 0.1.0
|
53
|
+
def [](event_type)
|
54
|
+
EvilEvents::BootPoint[:event_system].define_abstract_event_class(
|
55
|
+
event_type
|
56
|
+
)
|
57
|
+
end
|
58
|
+
|
59
|
+
# @see EvilEvents::System
|
60
|
+
# @api public
|
61
|
+
# @since 0.1.0
|
62
|
+
def define(event_type, &event_class_definitions)
|
63
|
+
EvilEvents::BootPoint[:event_system].define_event_class(
|
64
|
+
event_type, &event_class_definitions
|
65
|
+
)
|
66
|
+
end
|
43
67
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
68
|
+
# @see EvilEvents::System
|
69
|
+
# @api public
|
70
|
+
# @since 0.1.0
|
71
|
+
def emit(event_type, **event_attributes)
|
72
|
+
EvilEvents::BootPoint[:event_system].raw_emit(
|
73
|
+
event_type, **event_attributes
|
74
|
+
)
|
75
|
+
end
|
51
76
|
end
|
52
77
|
end
|
53
78
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
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.0rc4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rustam Ibragimov
|
@@ -10,20 +10,34 @@ bindir: bin
|
|
10
10
|
cert_chain: []
|
11
11
|
date: 2017-10-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: dry-monads
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.3.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.3.1
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: dry-types
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
31
|
- - '='
|
18
32
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.12.
|
33
|
+
version: 0.12.1
|
20
34
|
type: :runtime
|
21
35
|
prerelease: false
|
22
36
|
version_requirements: !ruby/object:Gem::Requirement
|
23
37
|
requirements:
|
24
38
|
- - '='
|
25
39
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.12.
|
40
|
+
version: 0.12.1
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: dry-struct
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,14 +100,14 @@ dependencies:
|
|
86
100
|
requirements:
|
87
101
|
- - '='
|
88
102
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0.
|
103
|
+
version: 0.8.21
|
90
104
|
type: :development
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
108
|
- - '='
|
95
109
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0.
|
110
|
+
version: 0.8.21
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: pry
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -114,14 +128,14 @@ dependencies:
|
|
114
128
|
requirements:
|
115
129
|
- - '='
|
116
130
|
- !ruby/object:Gem::Version
|
117
|
-
version: 0.
|
131
|
+
version: 0.14.1
|
118
132
|
type: :development
|
119
133
|
prerelease: false
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
121
135
|
requirements:
|
122
136
|
- - '='
|
123
137
|
- !ruby/object:Gem::Version
|
124
|
-
version: 0.
|
138
|
+
version: 0.14.1
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
140
|
name: simplecov-json
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -207,7 +221,7 @@ dependencies:
|
|
207
221
|
- !ruby/object:Gem::Version
|
208
222
|
version: 1.18.0
|
209
223
|
description: Ultra simple, but very flexible and fully customizable event subsystem
|
210
|
-
for ruby applications with a wide set of customization interfaces
|
224
|
+
for ruby applications with a wide set of customization interfaces and smart event
|
211
225
|
definition DSL.
|
212
226
|
email: iamdaiver@icloud.com
|
213
227
|
executables: []
|