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 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