evt-event_source 0.19.0.0 → 0.21.0.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 +4 -4
- data/lib/event_source.rb +1 -2
- data/lib/event_source/controls.rb +1 -1
- data/lib/event_source/controls/get.rb +25 -0
- data/lib/event_source/controls/read.rb +3 -3
- data/lib/event_source/event_data/read.rb +2 -2
- data/lib/event_source/get.rb +61 -0
- data/lib/event_source/iterator.rb +73 -51
- data/lib/event_source/read.rb +8 -10
- data/lib/event_source/stream_name.rb +4 -0
- metadata +4 -18
- data/lib/event_source/controls/stream.rb +0 -17
- data/lib/event_source/stream.rb +0 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c07ab23b9cdab1727b295c3a4c62852eaca8bd0e
|
4
|
+
data.tar.gz: b4a4eb08ca7951c7d2d9a5503ba675a7673e7525
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d991692faa442fc677b0bdf76caaa25aa4dfae4429ac3f3bcf731b5ec1e012b26e7adfbf556d14e46251eb1f1b63f5c2c2b5c5389232f3961966d85547fcc104
|
7
|
+
data.tar.gz: 2a9e1151cde3dc5b55bede1a631ea42c4c98a0a3ab9fb705b17699a18d6ceaa30045b56d9909103342f9f641a211fdbfd06c79bf3d2c3af418884c624de864f2
|
data/lib/event_source.rb
CHANGED
@@ -6,14 +6,12 @@ require 'identifier/uuid'
|
|
6
6
|
require 'schema'
|
7
7
|
require 'initializer'; Initializer.activate
|
8
8
|
require 'transform'
|
9
|
-
require 'cycle'
|
10
9
|
require 'virtual'; Virtual.activate
|
11
10
|
require 'async_invocation'
|
12
11
|
|
13
12
|
require 'event_source/expected_version'
|
14
13
|
require 'event_source/no_stream'
|
15
14
|
require 'event_source/stream_name'
|
16
|
-
require 'event_source/stream'
|
17
15
|
require 'event_source/event_data'
|
18
16
|
require 'event_source/event_data/hash'
|
19
17
|
require 'event_source/event_data/write'
|
@@ -21,6 +19,7 @@ require 'event_source/event_data/read'
|
|
21
19
|
|
22
20
|
require 'event_source/log'
|
23
21
|
|
22
|
+
require 'event_source/get'
|
24
23
|
require 'event_source/iterator'
|
25
24
|
require 'event_source/read'
|
26
25
|
require 'event_source/write'
|
@@ -7,7 +7,6 @@ require 'event_source/controls/time'
|
|
7
7
|
require 'event_source/controls/id'
|
8
8
|
require 'event_source/controls/category'
|
9
9
|
require 'event_source/controls/stream_name'
|
10
|
-
require 'event_source/controls/stream'
|
11
10
|
require 'event_source/controls/read'
|
12
11
|
require 'event_source/controls/event_data'
|
13
12
|
require 'event_source/controls/event_data/hash'
|
@@ -15,3 +14,4 @@ require 'event_source/controls/event_data/metadata'
|
|
15
14
|
require 'event_source/controls/event_data/write'
|
16
15
|
require 'event_source/controls/event_data/read'
|
17
16
|
require 'event_source/controls/write'
|
17
|
+
require 'event_source/controls/get'
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module EventSource
|
2
|
+
module Controls
|
3
|
+
module Get
|
4
|
+
def self.example(batch_size: nil, count: nil, global_position_offset: nil)
|
5
|
+
batch_size ||= 1
|
6
|
+
count ||= 1
|
7
|
+
global_position_offset ||= -> (x) { x ** 2 }
|
8
|
+
|
9
|
+
get = EventSource::Get::Substitute.build(batch_size: batch_size)
|
10
|
+
|
11
|
+
elements = (0..(count - 1)).to_a
|
12
|
+
|
13
|
+
elements.each do |e|
|
14
|
+
event_data = EventData::Read.example
|
15
|
+
event_data.position = e
|
16
|
+
event_data.global_position = global_position_offset.(event_data.position)
|
17
|
+
|
18
|
+
get.items << event_data
|
19
|
+
end
|
20
|
+
|
21
|
+
get
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module EventSource
|
2
|
+
module Get
|
3
|
+
def self.included(cls)
|
4
|
+
cls.class_exec do
|
5
|
+
include Log::Dependency
|
6
|
+
|
7
|
+
abstract :call
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class Substitute
|
12
|
+
include Get
|
13
|
+
|
14
|
+
initializer na(:batch_size)
|
15
|
+
|
16
|
+
def batch_size
|
17
|
+
@batch_size ||= 1
|
18
|
+
end
|
19
|
+
|
20
|
+
def items
|
21
|
+
@items ||= []
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.build(batch_size: nil, session: nil)
|
25
|
+
new(batch_size)
|
26
|
+
end
|
27
|
+
|
28
|
+
def call(stream_name=nil, position: nil)
|
29
|
+
position ||= 0
|
30
|
+
|
31
|
+
logger.trace(tag: :control) { "Getting (Position: #{position}, Batch Size: #{batch_size}, Stream Name: #{stream_name.inspect})" }
|
32
|
+
|
33
|
+
logger.debug(tags: [:control, :data]) { "Items: \n#{items.pretty_inspect}" }
|
34
|
+
logger.debug(tag: :control) { "Position: #{position.inspect}" }
|
35
|
+
logger.debug(tag: :control) { "Batch Size: #{batch_size.inspect}" }
|
36
|
+
|
37
|
+
unless EventSource::StreamName.category?(stream_name)
|
38
|
+
index = (items.index { |i| i.position >= position })
|
39
|
+
else
|
40
|
+
index = (items.index { |i| i.global_position >= position })
|
41
|
+
end
|
42
|
+
|
43
|
+
logger.debug(tag: :control) { "Index: #{index.inspect}" }
|
44
|
+
|
45
|
+
if index.nil?
|
46
|
+
items = []
|
47
|
+
else
|
48
|
+
range = index..(index + batch_size - 1)
|
49
|
+
logger.debug(tag: :control) { "Range: #{range.pretty_inspect}" }
|
50
|
+
|
51
|
+
items = self.items[range]
|
52
|
+
end
|
53
|
+
|
54
|
+
logger.info(tags: [:control, :data]) { "Got: \n#{items.pretty_inspect}" }
|
55
|
+
logger.info(tag: :control) { "Finished getting (Position: #{position}, Stream Name: #{stream_name.inspect})" }
|
56
|
+
|
57
|
+
items
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -2,101 +2,123 @@ module EventSource
|
|
2
2
|
class Iterator
|
3
3
|
include Log::Dependency
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
attr_accessor :position
|
5
|
+
attr_accessor :starting_position
|
8
6
|
attr_accessor :batch
|
9
7
|
|
10
|
-
def
|
11
|
-
@
|
12
|
-
end
|
13
|
-
attr_writer :batch_position
|
14
|
-
|
15
|
-
def stream_offset
|
16
|
-
@stream_offset ||= (position || 0)
|
8
|
+
def batch_index
|
9
|
+
@batch_index ||= 0
|
17
10
|
end
|
18
|
-
attr_writer :
|
11
|
+
attr_writer :batch_index
|
19
12
|
|
20
13
|
initializer :get, :stream_name
|
21
14
|
|
22
|
-
def self.build(get, stream_name, position: nil
|
15
|
+
def self.build(get, stream_name, position: nil)
|
23
16
|
new(get, stream_name).tap do |instance|
|
24
|
-
instance.
|
25
|
-
|
17
|
+
instance.starting_position = position
|
18
|
+
Log.get(self).debug { "Built Iterator (Stream Name: #{stream_name}, Starting Position: #{position.inspect})" }
|
26
19
|
end
|
27
20
|
end
|
28
21
|
|
29
|
-
def self.configure(receiver, get, stream_name, attr_name: nil, position: nil
|
22
|
+
def self.configure(receiver, get, stream_name, attr_name: nil, position: nil)
|
30
23
|
attr_name ||= :iterator
|
31
|
-
instance = build(get, stream_name, position: position
|
24
|
+
instance = build(get, stream_name, position: position)
|
32
25
|
receiver.public_send "#{attr_name}=", instance
|
33
26
|
end
|
34
27
|
|
35
28
|
def next
|
36
|
-
logger.trace { "Getting next event data (Batch Length: #{batch
|
29
|
+
logger.trace { "Getting next event data (Batch Length: #{(batch &.length).inspect}, Batch Index: #{batch_index})" }
|
37
30
|
|
38
|
-
resupply
|
31
|
+
resupply if batch_depleted?
|
39
32
|
|
40
|
-
event_data = batch[
|
33
|
+
event_data = batch[batch_index]
|
41
34
|
|
42
|
-
logger.debug
|
43
|
-
logger.debug
|
35
|
+
logger.debug(tags: [:data, :event_data]) { "Next event data: #{event_data.pretty_inspect}" }
|
36
|
+
logger.debug { "Done getting next event data (Batch Length: #{(batch &.length).inspect}, Batch Index: #{batch_index})" }
|
44
37
|
|
45
|
-
|
38
|
+
advance_batch_index
|
46
39
|
|
47
40
|
event_data
|
48
41
|
end
|
49
42
|
|
50
|
-
def
|
51
|
-
logger.trace { "
|
43
|
+
def advance_batch_index
|
44
|
+
logger.trace { "Advancing batch index (Batch Index: #{batch_index})" }
|
45
|
+
self.batch_index += 1
|
46
|
+
logger.debug { "Advanced batch index (Batch Index: #{batch_index})" }
|
47
|
+
end
|
52
48
|
|
49
|
+
def batch_depleted?
|
53
50
|
if batch.nil?
|
54
|
-
|
55
|
-
|
56
|
-
batch_log_text = "Batch Length: #{batch.length}"
|
51
|
+
logger.debug { "Batch is depleted (Batch is nil)" }
|
52
|
+
return true
|
57
53
|
end
|
58
54
|
|
59
|
-
if batch.
|
60
|
-
logger.debug { "
|
55
|
+
if batch.empty?
|
56
|
+
logger.debug { "Batch is depleted (Batch is empty)" }
|
57
|
+
return true
|
58
|
+
end
|
61
59
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
logger.debug { "Current batch not depleted (#{batch_log_text}, Batch Position: #{batch_position})" }
|
60
|
+
if batch_index == batch.length
|
61
|
+
logger.debug { "Batch is depleted (Batch Index: #{batch_index}, Batch Length: #{batch.length})" }
|
62
|
+
return true
|
66
63
|
end
|
67
64
|
|
68
|
-
|
65
|
+
false
|
69
66
|
end
|
70
67
|
|
71
|
-
def
|
72
|
-
logger.trace { "
|
68
|
+
def resupply
|
69
|
+
logger.trace { "Resupplying batch (Current Batch Length: #{(batch &.length).inspect})" }
|
73
70
|
|
74
|
-
|
75
|
-
|
71
|
+
batch = get_batch
|
72
|
+
reset(batch)
|
76
73
|
|
77
|
-
logger.debug { "
|
78
|
-
logger.debug(tags: [:data, :batch]) { "Batch: #{batch.pretty_inspect}" }
|
79
|
-
logger.debug(tags: [:data, :batch]) { "Batch Position: #{batch_position.inspect}" }
|
74
|
+
logger.debug { "Batch resupplied (Next Batch Length: #{(batch &.length).inspect})" }
|
80
75
|
end
|
81
76
|
|
82
77
|
def get_batch
|
83
|
-
|
78
|
+
position = next_batch_starting_position
|
84
79
|
|
85
|
-
batch
|
86
|
-
|
87
|
-
|
80
|
+
logger.trace "Getting batch (Position: #{position.inspect})"
|
81
|
+
|
82
|
+
batch = []
|
83
|
+
if position.nil? || position >= 0
|
84
|
+
batch = get.(stream_name, position: position)
|
88
85
|
end
|
89
86
|
|
90
|
-
logger.debug { "Finished getting batch (Count: #{batch.length})" }
|
87
|
+
logger.debug { "Finished getting batch (Count: #{batch.length}, Position: #{position.inspect})" }
|
91
88
|
|
92
89
|
batch
|
93
90
|
end
|
94
91
|
|
95
|
-
def
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
92
|
+
def next_batch_starting_position
|
93
|
+
if batch.nil?
|
94
|
+
logger.debug { "Batch is nil (Next batch starting position: #{starting_position.inspect})" }
|
95
|
+
return starting_position
|
96
|
+
end
|
97
|
+
|
98
|
+
previous_position = last_position
|
99
|
+
next_position = previous_position + 1
|
100
|
+
logger.debug { "End of batch (Next starting position: #{next_position}, Previous Position: #{previous_position})" }
|
101
|
+
|
102
|
+
next_position
|
103
|
+
end
|
104
|
+
|
105
|
+
def last_position
|
106
|
+
unless EventSource::StreamName.category?(stream_name)
|
107
|
+
batch.last.position
|
108
|
+
else
|
109
|
+
batch.last.global_position
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def reset(batch)
|
114
|
+
logger.trace { "Resetting batch" }
|
115
|
+
|
116
|
+
self.batch = batch
|
117
|
+
self.batch_index = 0
|
118
|
+
|
119
|
+
logger.debug(tags: [:data, :batch]) { "Batch set to: \n#{batch.pretty_inspect}" }
|
120
|
+
logger.debug(tags: [:data, :batch]) { "Batch position set to: #{batch_index.inspect}" }
|
121
|
+
logger.debug { "Done resetting batch" }
|
100
122
|
end
|
101
123
|
end
|
102
124
|
end
|
data/lib/event_source/read.rb
CHANGED
@@ -9,10 +9,10 @@ module EventSource
|
|
9
9
|
cls.extend Configure
|
10
10
|
|
11
11
|
dependency :iterator, Iterator
|
12
|
+
dependency :get, Get
|
12
13
|
|
13
14
|
initializer :stream_name
|
14
15
|
|
15
|
-
attr_accessor :get
|
16
16
|
abstract :configure
|
17
17
|
end
|
18
18
|
end
|
@@ -20,27 +20,25 @@ module EventSource
|
|
20
20
|
class Error < RuntimeError; end
|
21
21
|
|
22
22
|
module Build
|
23
|
-
def build(stream_name, position: nil, batch_size: nil,
|
24
|
-
cycle ||= Cycle.build(maximum_milliseconds: cycle_maximum_milliseconds, timeout_milliseconds: cycle_timeout_milliseconds)
|
25
|
-
|
23
|
+
def build(stream_name, position: nil, batch_size: nil, session: nil)
|
26
24
|
new(stream_name).tap do |instance|
|
27
|
-
instance.configure(batch_size: batch_size,
|
28
|
-
Iterator.configure instance, instance.get, stream_name, position: position
|
25
|
+
instance.configure(batch_size: batch_size, session: session)
|
26
|
+
Iterator.configure instance, instance.get, stream_name, position: position
|
29
27
|
end
|
30
28
|
end
|
31
29
|
end
|
32
30
|
|
33
31
|
module Call
|
34
|
-
def call(stream_name, position: nil, batch_size: nil,
|
35
|
-
instance = build(stream_name, position: position, batch_size: batch_size,
|
32
|
+
def call(stream_name, position: nil, batch_size: nil, session: nil, &action)
|
33
|
+
instance = build(stream_name, position: position, batch_size: batch_size, session: session)
|
36
34
|
instance.(&action)
|
37
35
|
end
|
38
36
|
end
|
39
37
|
|
40
38
|
module Configure
|
41
|
-
def configure(receiver, stream_name, attr_name: nil, position: nil, batch_size: nil,
|
39
|
+
def configure(receiver, stream_name, attr_name: nil, position: nil, batch_size: nil, session: nil)
|
42
40
|
attr_name ||= :read
|
43
|
-
instance = build(stream_name, position: position, batch_size: batch_size,
|
41
|
+
instance = build(stream_name, position: position, batch_size: batch_size, session: session)
|
44
42
|
receiver.public_send "#{attr_name}=", instance
|
45
43
|
end
|
46
44
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: evt-event_source
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.21.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- The Eventide Project
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-01
|
11
|
+
date: 2017-02-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: evt-casing
|
@@ -94,20 +94,6 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: evt-cycle
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
type: :runtime
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - ">="
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
111
97
|
- !ruby/object:Gem::Dependency
|
112
98
|
name: evt-async_invocation
|
113
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -150,10 +136,10 @@ files:
|
|
150
136
|
- lib/event_source/controls/event_data/metadata.rb
|
151
137
|
- lib/event_source/controls/event_data/read.rb
|
152
138
|
- lib/event_source/controls/event_data/write.rb
|
139
|
+
- lib/event_source/controls/get.rb
|
153
140
|
- lib/event_source/controls/id.rb
|
154
141
|
- lib/event_source/controls/random_value.rb
|
155
142
|
- lib/event_source/controls/read.rb
|
156
|
-
- lib/event_source/controls/stream.rb
|
157
143
|
- lib/event_source/controls/stream_name.rb
|
158
144
|
- lib/event_source/controls/time.rb
|
159
145
|
- lib/event_source/controls/write.rb
|
@@ -162,11 +148,11 @@ files:
|
|
162
148
|
- lib/event_source/event_data/read.rb
|
163
149
|
- lib/event_source/event_data/write.rb
|
164
150
|
- lib/event_source/expected_version.rb
|
151
|
+
- lib/event_source/get.rb
|
165
152
|
- lib/event_source/iterator.rb
|
166
153
|
- lib/event_source/log.rb
|
167
154
|
- lib/event_source/no_stream.rb
|
168
155
|
- lib/event_source/read.rb
|
169
|
-
- lib/event_source/stream.rb
|
170
156
|
- lib/event_source/stream_name.rb
|
171
157
|
- lib/event_source/write.rb
|
172
158
|
- lib/loader.rb
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module EventSource
|
2
|
-
module Controls
|
3
|
-
module Stream
|
4
|
-
def self.example(stream_name: nil, category: nil, id: nil, randomize_category: nil)
|
5
|
-
stream_name ||= StreamName.example category: category, id: id, randomize_category: randomize_category
|
6
|
-
EventSource::Stream.new stream_name
|
7
|
-
end
|
8
|
-
|
9
|
-
module Category
|
10
|
-
def self.example(category: nil, randomize_category: nil)
|
11
|
-
category ||= Controls::Category.example category: category, randomize_category: randomize_category
|
12
|
-
EventSource::Stream.new category
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
data/lib/event_source/stream.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
module EventSource
|
2
|
-
class Stream
|
3
|
-
initializer :name
|
4
|
-
|
5
|
-
def self.build(subject)
|
6
|
-
return subject if subject.is_a? self
|
7
|
-
new(subject)
|
8
|
-
end
|
9
|
-
|
10
|
-
def id
|
11
|
-
@id ||= StreamName.get_id(name)
|
12
|
-
end
|
13
|
-
|
14
|
-
def category
|
15
|
-
@category ||= StreamName.get_category(name)
|
16
|
-
end
|
17
|
-
|
18
|
-
def type
|
19
|
-
@type ||= StreamName.get_type(name)
|
20
|
-
end
|
21
|
-
|
22
|
-
def category?
|
23
|
-
@is_category ||= !name.include?('-')
|
24
|
-
end
|
25
|
-
|
26
|
-
def ==(stream)
|
27
|
-
name == stream.name
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|