evt-entity_projection 0.1.0.1
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 +7 -0
- data/lib/entity_projection.rb +4 -0
- data/lib/entity_projection/controls.rb +6 -0
- data/lib/entity_projection/controls/entity.rb +22 -0
- data/lib/entity_projection/controls/event_data.rb +5 -0
- data/lib/entity_projection/controls/message.rb +5 -0
- data/lib/entity_projection/controls/projection.rb +49 -0
- data/lib/entity_projection/entity_projection.rb +163 -0
- data/lib/entity_projection/log.rb +9 -0
- metadata +79 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 39536db3a78c2916a9811527e360a5f148367bb5
|
4
|
+
data.tar.gz: 8cb4baf8f48e0f2cc53ac1ed00ce87611d1e89c6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9a075b12f7826133d817a6065d06fdb4fd0e16dc67c8372494fadd975aaea29a5c04f7425fd351e27d03133ba80a99c4ad41029637e6f8cf1926c9e4956dfebc
|
7
|
+
data.tar.gz: ca7048d95bed2e41b6296287372777d67846a234c15b0b1f4eb0c756f15d03b020607b76ec07ac3fd128e30c0baaf9d83bafd9d8850c3bdb60c07ae86a732998
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module EntityProjection
|
2
|
+
module Controls
|
3
|
+
module Entity
|
4
|
+
def self.example
|
5
|
+
SomeEntity.build
|
6
|
+
end
|
7
|
+
|
8
|
+
class SomeEntity
|
9
|
+
include Schema::DataStructure
|
10
|
+
|
11
|
+
attribute :some_attribute
|
12
|
+
attribute :other_attribute
|
13
|
+
end
|
14
|
+
|
15
|
+
module New
|
16
|
+
def self.example
|
17
|
+
Entity::SomeEntity.new
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module EntityProjection
|
2
|
+
module Controls
|
3
|
+
module Projection
|
4
|
+
class Example
|
5
|
+
include EntityProjection
|
6
|
+
include Controls::Message
|
7
|
+
|
8
|
+
entity_name :some_entity
|
9
|
+
|
10
|
+
apply SomeMessage do |some_message|
|
11
|
+
some_entity.some_attribute = some_message.some_attribute
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module ApplyMethod
|
16
|
+
class Example
|
17
|
+
include EntityProjection
|
18
|
+
|
19
|
+
def apply(event_data)
|
20
|
+
entity.some_attribute = event_data.data[:attribute]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
module BlockAndApplyMethod
|
26
|
+
class Example
|
27
|
+
include EntityProjection
|
28
|
+
include Controls::Message
|
29
|
+
|
30
|
+
apply SomeMessage do |some_message|
|
31
|
+
entity.some_attribute = 'some attribute value set by apply block'
|
32
|
+
end
|
33
|
+
|
34
|
+
def apply(event_data)
|
35
|
+
event_data.data = 'some data value set by apply method'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
module Anomaly
|
41
|
+
module NoApply
|
42
|
+
class Example
|
43
|
+
include EntityProjection
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,163 @@
|
|
1
|
+
module EntityProjection
|
2
|
+
def self.included(cls)
|
3
|
+
cls.class_exec do
|
4
|
+
include Log::Dependency
|
5
|
+
|
6
|
+
cls.extend Build
|
7
|
+
cls.extend Call
|
8
|
+
cls.extend Info
|
9
|
+
cls.extend ApplyMacro
|
10
|
+
cls.extend MessageRegistry
|
11
|
+
cls.extend EntityNameMacro
|
12
|
+
|
13
|
+
virtual :configure
|
14
|
+
|
15
|
+
initializer :entity
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module Build
|
20
|
+
def build(entity)
|
21
|
+
instance = new(entity)
|
22
|
+
instance.configure
|
23
|
+
instance
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
module Info
|
28
|
+
extend self
|
29
|
+
|
30
|
+
def handler(message_or_event_data)
|
31
|
+
name = handler_name(message_or_event_data)
|
32
|
+
|
33
|
+
if method_defined?(name)
|
34
|
+
return name
|
35
|
+
else
|
36
|
+
return nil
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def handles?(message_or_event_data)
|
41
|
+
method_defined? handler_name(message_or_event_data)
|
42
|
+
end
|
43
|
+
|
44
|
+
def handler_name(message_or_event_data)
|
45
|
+
name = nil
|
46
|
+
|
47
|
+
if message_or_event_data.is_a? EventSource::EventData::Read
|
48
|
+
name = Messaging::Message::Info.canonize_name(message_or_event_data.type)
|
49
|
+
else
|
50
|
+
name = message_or_event_data.message_name
|
51
|
+
end
|
52
|
+
|
53
|
+
"apply_#{name}"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
module ApplyMacro
|
58
|
+
class Error < RuntimeError; end
|
59
|
+
|
60
|
+
def logger
|
61
|
+
@logger ||= Log.get(self)
|
62
|
+
end
|
63
|
+
|
64
|
+
def apply_macro(message_class, &blk)
|
65
|
+
define_apply_method(message_class, &blk)
|
66
|
+
message_registry.register(message_class)
|
67
|
+
end
|
68
|
+
alias :apply :apply_macro
|
69
|
+
|
70
|
+
def define_apply_method(message_class, &blk)
|
71
|
+
apply_method_name = handler_name(message_class)
|
72
|
+
|
73
|
+
if blk.nil?
|
74
|
+
error_msg = "Handler for #{message_class.name} is not correctly defined. It must have a block."
|
75
|
+
logger.error { error_msg }
|
76
|
+
raise Error, error_msg
|
77
|
+
end
|
78
|
+
|
79
|
+
send(:define_method, apply_method_name, &blk)
|
80
|
+
|
81
|
+
apply_method = instance_method(apply_method_name)
|
82
|
+
|
83
|
+
unless apply_method.arity == 1
|
84
|
+
error_msg = "Handler for #{message_class.name} is not correctly defined. It can only have a single parameter."
|
85
|
+
logger.error { error_msg }
|
86
|
+
raise Error, error_msg
|
87
|
+
end
|
88
|
+
|
89
|
+
apply_method_name
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
module Call
|
94
|
+
def call(entity, message_or_event_data)
|
95
|
+
instance = build(entity)
|
96
|
+
instance.(message_or_event_data)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
module MessageRegistry
|
101
|
+
def message_registry
|
102
|
+
@message_registry ||= Messaging::MessageRegistry.new
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
module EntityNameMacro
|
107
|
+
def entity_name_macro(entity_name)
|
108
|
+
send(:define_method, entity_name) do
|
109
|
+
entity
|
110
|
+
end
|
111
|
+
end
|
112
|
+
alias :entity_name :entity_name_macro
|
113
|
+
end
|
114
|
+
|
115
|
+
def call(message_or_event_data)
|
116
|
+
if message_or_event_data.is_a? Messaging::Message
|
117
|
+
handle_message(message_or_event_data)
|
118
|
+
else
|
119
|
+
handle_event_data(message_or_event_data)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def handle_message(message)
|
124
|
+
logger.trace(tags: [:handle, :message]) { "Applying message (Message class: #{message.class.name})" }
|
125
|
+
logger.trace(tags: [:data, :message, :handle]) { message.pretty_inspect }
|
126
|
+
|
127
|
+
handler = self.class.handler(message)
|
128
|
+
|
129
|
+
unless handler.nil?
|
130
|
+
public_send(handler, message)
|
131
|
+
end
|
132
|
+
|
133
|
+
logger.info(tags: [:handle, :message]) { "Applied message (Message class: #{message.class.name})" }
|
134
|
+
logger.trace(tags: [:data, :message, :handle]) { message.pretty_inspect }
|
135
|
+
|
136
|
+
message
|
137
|
+
end
|
138
|
+
|
139
|
+
def handle_event_data(event_data)
|
140
|
+
logger.trace(tags: [:handle, :event_data]) { "Applying event data (Type: #{event_data.type})" }
|
141
|
+
logger.trace(tags: [:data, :event_data, :handle]) { event_data.pretty_inspect }
|
142
|
+
|
143
|
+
res = nil
|
144
|
+
|
145
|
+
handler = self.class.handler(event_data)
|
146
|
+
|
147
|
+
unless handler.nil?
|
148
|
+
message_name = Messaging::Message::Info.canonize_name(event_data.type)
|
149
|
+
message_class = self.class.message_registry.get(message_name)
|
150
|
+
res = Messaging::Message::Import.(event_data, message_class)
|
151
|
+
public_send(handler, res)
|
152
|
+
else
|
153
|
+
if respond_to?(:apply)
|
154
|
+
res = apply(event_data)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
logger.info(tags: [:handle, :event_data]) { "Applied event data (Type: #{event_data.type})" }
|
159
|
+
logger.info(tags: [:data, :event_data, :handle]) { event_data.pretty_inspect }
|
160
|
+
|
161
|
+
res
|
162
|
+
end
|
163
|
+
end
|
metadata
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: evt-entity_projection
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- The Eventide Project
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-12-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: evt-messaging
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: ntl-test_bench
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: " "
|
42
|
+
email: opensource@eventide-project.org
|
43
|
+
executables: []
|
44
|
+
extensions: []
|
45
|
+
extra_rdoc_files: []
|
46
|
+
files:
|
47
|
+
- lib/entity_projection.rb
|
48
|
+
- lib/entity_projection/controls.rb
|
49
|
+
- lib/entity_projection/controls/entity.rb
|
50
|
+
- lib/entity_projection/controls/event_data.rb
|
51
|
+
- lib/entity_projection/controls/message.rb
|
52
|
+
- lib/entity_projection/controls/projection.rb
|
53
|
+
- lib/entity_projection/entity_projection.rb
|
54
|
+
- lib/entity_projection/log.rb
|
55
|
+
homepage: https://github.com/eventide-project/entity-projection
|
56
|
+
licenses:
|
57
|
+
- MIT
|
58
|
+
metadata: {}
|
59
|
+
post_install_message:
|
60
|
+
rdoc_options: []
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 2.3.3
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
requirements: []
|
74
|
+
rubyforge_project:
|
75
|
+
rubygems_version: 2.5.2
|
76
|
+
signing_key:
|
77
|
+
specification_version: 4
|
78
|
+
summary: Projects event data into an entity
|
79
|
+
test_files: []
|