evt-event_source 0.19.0.0 → 0.21.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|