evt-entity_store 0.3.2.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: '09d77f9286b431a0b97ec389c2b2947c15121fd5'
4
+ data.tar.gz: ca49812c868ff10f425bef7aed92d9c83a24f76a
5
+ SHA512:
6
+ metadata.gz: ea8c3e111aad9eca62a0be47fea1268dbcaf115daf8c88d25e2f593b2fea094536b37c570ddd31d55763ad2b0250a32728560c540d497362f732c64de2718444
7
+ data.tar.gz: 926e7cd6460e7240e5877f7d5f3b2d6005643f6c2759455e1dc4bb5200a78dfac213ebe6e98d75af08bc61b75d0633fa0e89e1f1acd5edbfd1f2c7e4082567cc
@@ -0,0 +1,6 @@
1
+ require 'entity_cache'
2
+ require 'entity_projection'
3
+
4
+ require 'entity_store/log'
5
+ require 'entity_store/entity_store'
6
+ require 'entity_store/substitute'
@@ -0,0 +1,14 @@
1
+ require 'entity_projection/controls'
2
+ require 'entity_cache/controls'
3
+
4
+ require 'entity_store/controls/id'
5
+ require 'entity_store/controls/category'
6
+ require 'entity_store/controls/stream_name'
7
+ require 'entity_store/controls/version'
8
+ require 'entity_store/controls/message'
9
+ require 'entity_store/controls/entity'
10
+ require 'entity_store/controls/projection'
11
+ require 'entity_store/controls/snapshot_interval'
12
+ require 'entity_store/controls/snapshot'
13
+ require 'entity_store/controls/reader'
14
+ require 'entity_store/controls/entity_store'
@@ -0,0 +1,5 @@
1
+ module EntityStore
2
+ module Controls
3
+ Category = EventSource::Controls::Category
4
+ end
5
+ end
@@ -0,0 +1,54 @@
1
+ module EntityStore
2
+ module Controls
3
+ module Entity
4
+ def self.example
5
+ Current.example
6
+ end
7
+
8
+ class Example
9
+ include Schema::DataStructure
10
+
11
+ attribute :sum
12
+
13
+ module Transformer
14
+ def self.raw_data(instance)
15
+ instance.to_h
16
+ end
17
+
18
+ def self.instance(raw_data)
19
+ Example.build(raw_data)
20
+ end
21
+ end
22
+ end
23
+
24
+ module Cached
25
+ def self.example
26
+ Example.build :sum => sum
27
+ end
28
+
29
+ def self.add(id, store)
30
+ entity = self.example
31
+ version = Version::Cached.example
32
+
33
+ store.cache.add(id, entity, version, persisted_version: version)
34
+
35
+ return entity, version
36
+ end
37
+
38
+ def self.sum
39
+ 1
40
+ end
41
+ end
42
+
43
+ module Current
44
+ def self.example
45
+ Example.build :sum => sum
46
+ end
47
+
48
+ def self.sum
49
+ 12
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,60 @@
1
+ module EntityStore
2
+ module Controls
3
+ module EntityStore
4
+ def self.example(category: nil, entity_class: nil, projection_class: nil, reader_class: nil, snapshot_class: nil, snapshot_interval: nil)
5
+ if category.nil? && entity_class.nil? && projection_class.nil? && reader_class.nil? && snapshot_class.nil? && snapshot_interval.nil?
6
+ store_class = Example
7
+ else
8
+ store_class = example_class(category: category, entity_class: entity_class, projection_class: projection_class, reader_class: reader_class, snapshot_class: snapshot_class, snapshot_interval: snapshot_interval)
9
+ end
10
+
11
+ instance = store_class.build
12
+ instance
13
+ end
14
+
15
+ def self.example_class(category: nil, entity_class: nil, projection_class: nil, reader_class: nil, snapshot_class: nil, snapshot_interval: nil)
16
+ if category == :none
17
+ category = nil
18
+ else
19
+ category ||= Controls::Category.example
20
+ end
21
+
22
+ if entity_class == :none
23
+ entity_class = nil
24
+ else
25
+ entity_class ||= Controls::Entity::Example
26
+ end
27
+
28
+ if projection_class == :none
29
+ projection_class = nil
30
+ else
31
+ projection_class ||= Controls::Projection::Example
32
+ end
33
+
34
+ if reader_class == :none
35
+ reader_class = nil
36
+ else
37
+ reader_class ||= Controls::Reader::Example
38
+ end
39
+
40
+ Class.new do
41
+ include ::EntityStore
42
+
43
+ category category
44
+ entity entity_class
45
+ projection projection_class
46
+ reader reader_class
47
+ snapshot snapshot_class, snapshot_interval
48
+ end
49
+ end
50
+
51
+ module Category
52
+ def self.example
53
+ :some_category
54
+ end
55
+ end
56
+
57
+ Example = self.example_class
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,5 @@
1
+ module EntityStore
2
+ module Controls
3
+ ID = EntityCache::Controls::ID
4
+ end
5
+ end
@@ -0,0 +1,23 @@
1
+ module EntityStore
2
+ module Controls
3
+ module Message
4
+ def self.example
5
+ first
6
+ end
7
+
8
+ def self.first
9
+ Example.build :number => 1
10
+ end
11
+
12
+ def self.second
13
+ Example.build :number => 11
14
+ end
15
+
16
+ class Example
17
+ include Messaging::Message
18
+
19
+ attribute :number
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,14 @@
1
+ module EntityStore
2
+ module Controls
3
+ module Projection
4
+ class Example
5
+ include EntityProjection
6
+
7
+ apply Message::Example do |message|
8
+ entity.sum ||= 0
9
+ entity.sum += message.number
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ module EntityStore
2
+ module Controls
3
+ module Reader
4
+ def self.example
5
+ Example.build
6
+ end
7
+
8
+ class Example
9
+ include EventSource::Read
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ module EntityStore
2
+ module Controls
3
+ module Snapshot
4
+ Example = EntityCache::Controls::Storage::Persistent::Example
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ module EntityStore
2
+ module Controls
3
+ SnapshotInterval = EntityCache::Controls::PersistInterval
4
+
5
+ module SnapshotInterval
6
+ def self.example
7
+ 11
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ module EntityStore
2
+ module Controls
3
+ StreamName = Messaging::Controls::StreamName
4
+ end
5
+ end
@@ -0,0 +1,27 @@
1
+ module EntityStore
2
+ module Controls
3
+ module Version
4
+ def self.example
5
+ Current.example
6
+ end
7
+
8
+ module NotCached
9
+ def self.example
10
+ nil
11
+ end
12
+ end
13
+
14
+ module Cached
15
+ def self.example
16
+ 0
17
+ end
18
+ end
19
+
20
+ module Current
21
+ def self.example
22
+ 1
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,224 @@
1
+ module EntityStore
2
+ Error = Class.new(RuntimeError)
3
+
4
+ def self.included(cls)
5
+ cls.class_exec do
6
+ include Log::Dependency
7
+ include Messaging::StreamName
8
+
9
+ substitute_class = Class.new(Substitute)
10
+
11
+ substitute_class.send :define_method, :entity_class do
12
+ cls.entity_class
13
+ end
14
+
15
+ const_set :Substitute, substitute_class
16
+
17
+ attr_accessor :session
18
+ attr_accessor :new_entity_probe
19
+
20
+ dependency :cache, EntityCache
21
+
22
+ configure :store
23
+
24
+ virtual :category
25
+ virtual :reader_class
26
+ virtual :projection_class
27
+ virtual :snapshot_class
28
+ virtual :snapshot_interval
29
+
30
+ extend Build
31
+ extend EntityMacro
32
+ extend ProjectionMacro
33
+ extend ReaderMacro
34
+ extend SnapshotMacro
35
+ end
36
+ end
37
+
38
+ module Build
39
+ def build(snapshot_interval: nil, session: nil)
40
+ instance = new
41
+
42
+ Build.assure(instance)
43
+
44
+ instance.session = session
45
+
46
+ EntityCache.configure(
47
+ instance,
48
+ entity_class,
49
+ persistent_store: instance.snapshot_class,
50
+ persist_interval: instance.snapshot_interval,
51
+ session: session
52
+ )
53
+
54
+ instance
55
+ end
56
+
57
+ def self.assure(instance)
58
+ if instance.category.nil?
59
+ raise Error, "Category is not declared"
60
+ end
61
+
62
+ if instance.entity_class.nil?
63
+ raise Error, "Entity is not declared"
64
+ end
65
+
66
+ if instance.projection_class.nil?
67
+ raise Error, "Reader is not declared"
68
+ end
69
+
70
+ if instance.reader_class.nil?
71
+ raise Error, "Reader is not declared"
72
+ end
73
+ end
74
+ end
75
+
76
+ def get(id, include: nil, &probe_action)
77
+ logger.trace { "Getting entity (ID: #{id.inspect}, Entity Class: #{entity_class.name}, Include: #{include.inspect})" }
78
+
79
+ record = cache.get id
80
+
81
+ if record
82
+ entity = record.entity
83
+ version = record.version
84
+ persisted_version = record.persisted_version
85
+ persisted_time = record.persisted_time
86
+ else
87
+ entity = new_entity
88
+ end
89
+
90
+ current_version = refresh(entity, id, version, &probe_action)
91
+
92
+ unless current_version.nil?
93
+ record = cache.put(
94
+ id,
95
+ entity,
96
+ current_version,
97
+ persisted_version,
98
+ persisted_time
99
+ )
100
+ end
101
+
102
+ logger.info { "Get entity done (ID: #{id.inspect}, Entity Class: #{entity_class.name}, Include: #{include.inspect}, Version: #{record&.version.inspect}, Time: #{record&.time.inspect})" }
103
+ logger.info(tags: [:data, :entity]) { entity.pretty_inspect }
104
+
105
+ if record
106
+ record.destructure include
107
+ else
108
+ EntityCache::Record::NoStream.destructure include
109
+ end
110
+ end
111
+
112
+ def refresh(entity, id, current_position, &probe_action)
113
+ logger.trace { "Refreshing (ID: #{id.inspect}, Entity Class: #{entity_class.name}, Current Position #{current_position.inspect})" }
114
+ logger.trace(tags: [:data, :entity]) { entity.pretty_inspect }
115
+
116
+ stream_name = self.stream_name(id)
117
+
118
+ start_position = next_position(current_position)
119
+
120
+ project = projection_class.build(entity)
121
+
122
+ logger.trace { "Reading (Stream Name: #{stream_name}, Position: #{current_position}" }
123
+ reader_class.(stream_name, position: start_position, session: session) do |event_data|
124
+ project.(event_data)
125
+ current_position = event_data.position
126
+
127
+ unless probe_action.nil?
128
+ probe_action.(event_data)
129
+ end
130
+ end
131
+ logger.debug { "Read (Stream Name: #{stream_name}, Position: #{current_position}" }
132
+
133
+ logger.debug { "Refreshed (ID: #{id.inspect}, Entity Class: #{entity_class.name}, Current Position: #{current_position.inspect})" }
134
+ logger.debug(tags: [:data, :entity]) { entity.pretty_inspect }
135
+
136
+ current_position
137
+ end
138
+
139
+ def next_position(position)
140
+ unless position.nil?
141
+ position + 1
142
+ else
143
+ nil
144
+ end
145
+ end
146
+
147
+ def get_version(id)
148
+ _, version = get id, include: :version
149
+ version
150
+ end
151
+
152
+ def fetch(id, include: nil)
153
+ res = get(id, include: include)
154
+
155
+ if res.nil?
156
+ res = new_entity
157
+ end
158
+
159
+ if res.is_a?(Array) && res[0].nil?
160
+ res[0] = new_entity
161
+ end
162
+
163
+ res
164
+ end
165
+
166
+ def new_entity
167
+ entity = nil
168
+ if entity_class.respond_to? :build
169
+ entity = entity_class.build
170
+ else
171
+ entity = entity_class.new
172
+ end
173
+
174
+ unless new_entity_probe.nil?
175
+ new_entity_probe.(entity)
176
+ end
177
+
178
+ entity
179
+ end
180
+
181
+ module EntityMacro
182
+ def entity_macro(cls)
183
+ define_singleton_method :entity_class do
184
+ cls
185
+ end
186
+
187
+ define_method :entity_class do
188
+ self.class.entity_class
189
+ end
190
+ end
191
+ alias_method :entity, :entity_macro
192
+ end
193
+
194
+ module ProjectionMacro
195
+ def projection_macro(cls)
196
+ define_method :projection_class do
197
+ cls
198
+ end
199
+ end
200
+ alias_method :projection, :projection_macro
201
+ end
202
+
203
+ module ReaderMacro
204
+ def reader_macro(cls)
205
+ define_method :reader_class do
206
+ cls
207
+ end
208
+ end
209
+ alias_method :reader, :reader_macro
210
+ end
211
+
212
+ module SnapshotMacro
213
+ def snapshot_macro(cls, interval)
214
+ define_method :snapshot_class do
215
+ cls
216
+ end
217
+
218
+ define_method :snapshot_interval do
219
+ interval
220
+ end
221
+ end
222
+ alias_method :snapshot, :snapshot_macro
223
+ end
224
+ end
@@ -0,0 +1,9 @@
1
+ module EntityStore
2
+ class Log < ::Log
3
+ def tag!(tags)
4
+ tags << :entity_store
5
+ tags << :library
6
+ tags << :verbose
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,37 @@
1
+ module EntityStore
2
+ class Substitute
3
+ include EntityStore
4
+
5
+ def self.build
6
+ new
7
+ end
8
+
9
+ def get(id, include: nil)
10
+ record = records[id]
11
+
12
+ if record
13
+ record.destructure include
14
+ else
15
+ EntityCache::Record::NoStream.destructure include
16
+ end
17
+ end
18
+
19
+ def get_version(id)
20
+ _, version = get id, include: :version
21
+ version
22
+ end
23
+
24
+ def add(id, entity, version=nil)
25
+ version ||= 0
26
+
27
+ record = EntityCache::Record.new id, entity, version
28
+
29
+ records[id] = record
30
+ end
31
+ alias :put :add
32
+
33
+ def records
34
+ @records ||= {}
35
+ end
36
+ end
37
+ end
data/lib/loader.rb ADDED
@@ -0,0 +1 @@
1
+ entity_store.rb
metadata ADDED
@@ -0,0 +1,102 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: evt-entity_store
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.2.0
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: entity_projection
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: entity_cache
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: test_bench
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: " "
56
+ email: opensource@eventide-project.org
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - lib/entity_store.rb
62
+ - lib/entity_store/controls.rb
63
+ - lib/entity_store/controls/category.rb
64
+ - lib/entity_store/controls/entity.rb
65
+ - lib/entity_store/controls/entity_store.rb
66
+ - lib/entity_store/controls/id.rb
67
+ - lib/entity_store/controls/message.rb
68
+ - lib/entity_store/controls/projection.rb
69
+ - lib/entity_store/controls/reader.rb
70
+ - lib/entity_store/controls/snapshot.rb
71
+ - lib/entity_store/controls/snapshot_interval.rb
72
+ - lib/entity_store/controls/stream_name.rb
73
+ - lib/entity_store/controls/version.rb
74
+ - lib/entity_store/entity_store.rb
75
+ - lib/entity_store/log.rb
76
+ - lib/entity_store/substitute.rb
77
+ - lib/loader.rb
78
+ homepage: https://github.com/eventide-project/entity-store
79
+ licenses:
80
+ - MIT
81
+ metadata: {}
82
+ post_install_message:
83
+ rdoc_options: []
84
+ require_paths:
85
+ - lib
86
+ required_ruby_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: 2.3.3
91
+ required_rubygems_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ requirements: []
97
+ rubyforge_project:
98
+ rubygems_version: 2.5.2
99
+ signing_key:
100
+ specification_version: 4
101
+ summary: Store of entities that are projected from streams
102
+ test_files: []