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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d2023c4a4fded3ae97318f828482cfa3a1984560
4
- data.tar.gz: '07874a76c0b95e1bc4f7a7da7a3404e5738a7556'
3
+ metadata.gz: c07ab23b9cdab1727b295c3a4c62852eaca8bd0e
4
+ data.tar.gz: b4a4eb08ca7951c7d2d9a5503ba675a7673e7525
5
5
  SHA512:
6
- metadata.gz: d6c814ec4314887fb5a92b42d5588aa49cf22fe6434b5e9e89318bee444fb948eac1a1285da114d63f9a3d05840d418e4bc7fe6ff7b55fcdbc578f249ce1a393
7
- data.tar.gz: 6e84704a70a50dc4a4d854e9d2266d4b8394b4b4f0e94867a9c603293088520f9e61e7a665bf6bf0cab3debc0d7a1126c1de58b44fb6c1e6a7687ab5852b3b44
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
@@ -1,9 +1,9 @@
1
1
  module EventSource
2
2
  module Controls
3
3
  module Read
4
- def self.example(stream: nil)
5
- stream ||= Stream.example
6
- Example.new(stream)
4
+ def self.example(stream_name: nil)
5
+ stream_name ||= StreamName.example
6
+ Example.new(stream_name)
7
7
  end
8
8
 
9
9
  class Example
@@ -4,8 +4,8 @@ module EventSource
4
4
  include EventData
5
5
 
6
6
  attribute :stream_name, String
7
- attribute :position, Fixnum
8
- attribute :global_position, Fixnum
7
+ attribute :position, Integer
8
+ attribute :global_position, Integer
9
9
  attribute :time, Time
10
10
 
11
11
  def category
@@ -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
- dependency :cycle, Cycle
6
-
7
- attr_accessor :position
5
+ attr_accessor :starting_position
8
6
  attr_accessor :batch
9
7
 
10
- def batch_position
11
- @batch_position ||= 0
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 :stream_offset
11
+ attr_writer :batch_index
19
12
 
20
13
  initializer :get, :stream_name
21
14
 
22
- def self.build(get, stream_name, position: nil, cycle: nil)
15
+ def self.build(get, stream_name, position: nil)
23
16
  new(get, stream_name).tap do |instance|
24
- instance.position = position
25
- Cycle.configure instance, cycle: cycle
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, cycle: 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, cycle: cycle)
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.nil? ? '<none>' : batch.length}, Batch Position: #{batch_position}, Stream Offset: #{stream_offset})" }
29
+ logger.trace { "Getting next event data (Batch Length: #{(batch &.length).inspect}, Batch Index: #{batch_index})" }
37
30
 
38
- resupply(batch)
31
+ resupply if batch_depleted?
39
32
 
40
- event_data = batch[batch_position]
33
+ event_data = batch[batch_index]
41
34
 
42
- logger.debug { "Finished getting next event data (Batch Length: #{batch.nil? ? '<none>' : batch.length}, Batch Position: #{batch_position}, Stream Offset: #{stream_offset})" }
43
- logger.debug(tags: [:data, :event_data]) { "Event Data: #{event_data.pretty_inspect}" }
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
- advance_positions
38
+ advance_batch_index
46
39
 
47
40
  event_data
48
41
  end
49
42
 
50
- def resupply(batch)
51
- logger.trace { "Resupplying batch" }
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
- batch_log_text = "Batch: #{batch.inspect}"
55
- else
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.nil? || batch_position == batch.length
60
- logger.debug { "Current batch is depleted (#{batch_log_text}, Batch Position: #{batch_position})" }
55
+ if batch.empty?
56
+ logger.debug { "Batch is depleted (Batch is empty)" }
57
+ return true
58
+ end
61
59
 
62
- batch = get_batch
63
- reset(batch)
64
- else
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
- logger.debug { "Finished resupplying batch" }
65
+ false
69
66
  end
70
67
 
71
- def reset(batch)
72
- logger.trace { "Resetting batch" }
68
+ def resupply
69
+ logger.trace { "Resupplying batch (Current Batch Length: #{(batch &.length).inspect})" }
73
70
 
74
- self.batch = batch
75
- self.batch_position = 0
71
+ batch = get_batch
72
+ reset(batch)
76
73
 
77
- logger.debug { "Reset batch" }
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
- logger.trace "Getting batch"
78
+ position = next_batch_starting_position
84
79
 
85
- batch = nil
86
- cycle.() do
87
- batch = get.(stream_name, position: stream_offset)
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 advance_positions
96
- logger.trace { "Advancing positions (Batch Position: #{batch_position}, Stream Offset: #{stream_offset})" }
97
- self.batch_position += 1
98
- self.stream_offset += 1
99
- logger.debug { "Advanced positions (Batch Position: #{batch_position}, Stream Offset: #{stream_offset})" }
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
@@ -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, precedence: nil, cycle_maximum_milliseconds: nil, cycle_timeout_milliseconds: nil, cycle: nil, session: 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, precedence: precedence, session: session)
28
- Iterator.configure instance, instance.get, stream_name, position: position, cycle: cycle
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, precedence: nil, cycle_maximum_milliseconds: nil, cycle_timeout_milliseconds: nil, cycle: nil, session: nil, &action)
35
- instance = build(stream_name, position: position, batch_size: batch_size, precedence: precedence, cycle_maximum_milliseconds: cycle_maximum_milliseconds, cycle_timeout_milliseconds: cycle_timeout_milliseconds, cycle: cycle, session: session)
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, precedence: nil, cycle_maximum_milliseconds: nil, cycle_timeout_milliseconds: nil, cycle: nil, session: 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, precedence: precedence, cycle_maximum_milliseconds: cycle_maximum_milliseconds, cycle_timeout_milliseconds: cycle_timeout_milliseconds, cycle: cycle, session: session)
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
@@ -17,6 +17,10 @@ module EventSource
17
17
  stream_name.split('-')[0]
18
18
  end
19
19
 
20
+ def self.category?(stream_name)
21
+ !stream_name.include?('-')
22
+ end
23
+
20
24
  def self.get_type(name)
21
25
  type = name.split(':').last.split('-').first
22
26
 
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.19.0.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-25 00:00:00.000000000 Z
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
@@ -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