evt-consumer 0.9.0.3 → 0.10.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/consumer.rb +1 -3
- data/lib/consumer/actor.rb +1 -1
- data/lib/consumer/consumer.rb +36 -31
- data/lib/consumer/controls.rb +5 -1
- data/lib/consumer/controls/consumer.rb +51 -8
- data/lib/consumer/controls/consumer/error_handler.rb +40 -0
- data/lib/consumer/controls/consumer/incrementing.rb +22 -7
- data/lib/consumer/controls/get.rb +2 -0
- data/lib/consumer/controls/get/incrementing.rb +32 -18
- data/lib/consumer/controls/handle.rb +38 -11
- data/lib/consumer/controls/handle/raise_error.rb +17 -0
- data/lib/consumer/controls/identifier.rb +12 -2
- data/lib/consumer/controls/message_data.rb +3 -0
- data/lib/consumer/controls/position_store/local_file.rb +13 -3
- data/lib/consumer/controls/session.rb +59 -0
- data/lib/consumer/handler_registry.rb +15 -33
- data/lib/consumer/position_store.rb +10 -8
- data/lib/consumer/substitute.rb +1 -1
- metadata +20 -5
- data/lib/consumer/dispatch.rb +0 -43
- data/lib/consumer/dispatch/substitute.rb +0 -41
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a93391825108de34561c03f36c7e2319388cc63dad3809c2dd8e96a710dceff
|
4
|
+
data.tar.gz: 4f18345dc270025a494488f07b7961cbb854e708c9d649f3f821c5b2ad7a959d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fdd0b3542210e9984e9f7364b72239f663822b3d7632c3c328a3d591d046616f7566e0ef0486dc5e241055905f19df850310e61db0cf0b17887e28721e114925
|
7
|
+
data.tar.gz: 52c7945be88a0d169a9dcdcbc159cf6e5c4ef5a82e3d787830b86f8b004d7070bd60cd31eb2b51a8bb12a3b93ee3728f7caf2cd1cf40444f00b89fdde881a33e
|
data/lib/consumer.rb
CHANGED
@@ -4,6 +4,7 @@ require 'configure'; Configure.activate
|
|
4
4
|
require 'poll'
|
5
5
|
require 'messaging'
|
6
6
|
require 'log'
|
7
|
+
require 'settings'
|
7
8
|
|
8
9
|
require 'consumer/log'
|
9
10
|
require 'consumer/log_text'
|
@@ -16,9 +17,6 @@ require 'consumer/position_store'
|
|
16
17
|
require 'consumer/position_store/substitute'
|
17
18
|
require 'consumer/position_store/telemetry'
|
18
19
|
|
19
|
-
require 'consumer/dispatch'
|
20
|
-
require 'consumer/dispatch/substitute'
|
21
|
-
|
22
20
|
require 'consumer/subscription'
|
23
21
|
require 'consumer/subscription/defaults'
|
24
22
|
require 'consumer/subscription/get_batch'
|
data/lib/consumer/actor.rb
CHANGED
data/lib/consumer/consumer.rb
CHANGED
@@ -13,14 +13,25 @@ module Consumer
|
|
13
13
|
|
14
14
|
initializer :stream_name
|
15
15
|
|
16
|
+
attr_writer :identifier
|
17
|
+
def identifier
|
18
|
+
@identifier ||= self.class.identifier
|
19
|
+
end
|
20
|
+
|
16
21
|
attr_writer :position_update_interval
|
17
22
|
def position_update_interval
|
18
23
|
@position_update_interval ||= Defaults.position_update_interval
|
19
24
|
end
|
20
25
|
|
26
|
+
attr_writer :position_update_counter
|
27
|
+
def position_update_counter
|
28
|
+
@position_update_counter ||= 0
|
29
|
+
end
|
30
|
+
|
31
|
+
attr_accessor :session
|
32
|
+
|
21
33
|
attr_accessor :poll_interval_milliseconds
|
22
34
|
|
23
|
-
dependency :dispatch, Dispatch
|
24
35
|
dependency :get
|
25
36
|
dependency :position_store, PositionStore
|
26
37
|
dependency :subscription, Subscription
|
@@ -28,13 +39,17 @@ module Consumer
|
|
28
39
|
virtual :error_raised do |error, message_data|
|
29
40
|
raise error
|
30
41
|
end
|
42
|
+
|
43
|
+
alias_method :call, :dispatch
|
31
44
|
end
|
32
45
|
end
|
33
46
|
|
34
|
-
def
|
47
|
+
def dispatch(message_data)
|
35
48
|
logger.trace { "Dispatching message (#{LogText.message_data(message_data)})" }
|
36
49
|
|
37
|
-
|
50
|
+
self.class.handler_registry.each do |handler|
|
51
|
+
handler.(message_data, session: session)
|
52
|
+
end
|
38
53
|
|
39
54
|
update_position(message_data.global_position)
|
40
55
|
|
@@ -45,10 +60,6 @@ module Consumer
|
|
45
60
|
error_raised(error, message_data)
|
46
61
|
end
|
47
62
|
|
48
|
-
def identifier
|
49
|
-
self.class.identifier
|
50
|
-
end
|
51
|
-
|
52
63
|
def start(&probe)
|
53
64
|
_, subscription_thread = ::Actor::Start.(subscription)
|
54
65
|
|
@@ -63,28 +74,22 @@ module Consumer
|
|
63
74
|
AsyncInvocation::Incorrect
|
64
75
|
end
|
65
76
|
|
66
|
-
def add_handler(handler)
|
67
|
-
dispatch.add_handler handler
|
68
|
-
end
|
69
|
-
|
70
77
|
def update_position(position)
|
71
|
-
logger.trace { "Updating position (Position: #{position},
|
78
|
+
logger.trace { "Updating position (Global Position: #{position}, Counter: #{position_update_counter}/#{position_update_interval})" }
|
72
79
|
|
73
|
-
|
80
|
+
self.position_update_counter += 1
|
74
81
|
|
75
|
-
if
|
82
|
+
if position_update_counter >= position_update_interval
|
76
83
|
position_store.put(position)
|
77
84
|
|
78
|
-
logger.debug { "Updated position (Position: #{position},
|
85
|
+
logger.debug { "Updated position (Global Position: #{position}, Counter: #{position_update_counter}/#{position_update_interval})" }
|
86
|
+
|
87
|
+
self.position_update_counter = 0
|
79
88
|
else
|
80
|
-
logger.debug { "Interval not reached; position not updated (Position: #{position},
|
89
|
+
logger.debug { "Interval not reached; position not updated (Global Position: #{position}, Counter: #{position_update_counter}/#{position_update_interval})" }
|
81
90
|
end
|
82
91
|
end
|
83
92
|
|
84
|
-
def position_update_interval
|
85
|
-
@position_update_interval ||= self.class.position_update_interval
|
86
|
-
end
|
87
|
-
|
88
93
|
module LogText
|
89
94
|
def self.message_data(message_data)
|
90
95
|
"Type: #{message_data.type}, Stream: #{message_data.stream_name}, Position: #{message_data.position}, GlobalPosition: #{message_data.global_position}"
|
@@ -92,10 +97,10 @@ module Consumer
|
|
92
97
|
end
|
93
98
|
|
94
99
|
module Configure
|
95
|
-
def configure(
|
96
|
-
logger.trace { "Configuring (
|
100
|
+
def configure(**kwargs)
|
101
|
+
logger.trace { "Configuring (Stream Name: #{stream_name})" }
|
97
102
|
|
98
|
-
super
|
103
|
+
super(**kwargs)
|
99
104
|
|
100
105
|
starting_position = self.position_store.get
|
101
106
|
|
@@ -107,22 +112,22 @@ module Consumer
|
|
107
112
|
poll_interval_milliseconds: poll_interval_milliseconds
|
108
113
|
)
|
109
114
|
|
110
|
-
|
111
|
-
|
112
|
-
dispatch = Dispatch.configure(self, handlers)
|
113
|
-
|
114
|
-
logger.debug { "Done configuring (Batch Size: #{batch_size}, Session: #{session.inspect}, Starting Position: #{starting_position})" }
|
115
|
+
logger.debug { "Done configuring (Stream Name: #{stream_name}, Starting Position: #{starting_position})" }
|
115
116
|
end
|
116
117
|
end
|
117
118
|
|
118
119
|
module Build
|
119
|
-
def build(stream_name,
|
120
|
-
instance = new
|
120
|
+
def build(stream_name, position_update_interval: nil, poll_interval_milliseconds: nil, identifier: nil, **arguments)
|
121
|
+
instance = new(stream_name)
|
122
|
+
|
123
|
+
unless identifier.nil?
|
124
|
+
instance.identifier = identifier
|
125
|
+
end
|
121
126
|
|
122
127
|
instance.position_update_interval = position_update_interval
|
123
128
|
instance.poll_interval_milliseconds = poll_interval_milliseconds
|
124
129
|
|
125
|
-
instance.configure(
|
130
|
+
instance.configure(**arguments)
|
126
131
|
|
127
132
|
instance
|
128
133
|
end
|
data/lib/consumer/controls.rb
CHANGED
@@ -7,15 +7,19 @@ require 'consumer/controls/message_data/batch'
|
|
7
7
|
require 'consumer/controls/error'
|
8
8
|
require 'consumer/controls/get'
|
9
9
|
require 'consumer/controls/get/incrementing'
|
10
|
-
require 'consumer/controls/handle'
|
11
10
|
require 'consumer/controls/id'
|
12
11
|
require 'consumer/controls/identifier'
|
13
12
|
require 'consumer/controls/position'
|
13
|
+
require 'consumer/controls/session'
|
14
14
|
require 'consumer/controls/stream_name'
|
15
15
|
|
16
16
|
require 'consumer/controls/position_store'
|
17
17
|
require 'consumer/controls/position_store/local_file'
|
18
18
|
require 'consumer/controls/subscription'
|
19
19
|
|
20
|
+
require 'consumer/controls/handle'
|
21
|
+
require 'consumer/controls/handle/raise_error'
|
22
|
+
|
20
23
|
require 'consumer/controls/consumer'
|
21
24
|
require 'consumer/controls/consumer/incrementing'
|
25
|
+
require 'consumer/controls/consumer/error_handler'
|
@@ -1,20 +1,63 @@
|
|
1
1
|
module Consumer
|
2
2
|
module Controls
|
3
3
|
module Consumer
|
4
|
-
def self.example
|
5
|
-
|
4
|
+
def self.example(stream_name=nil, identifier: nil, handlers: nil)
|
5
|
+
stream_name ||= StreamName.example
|
6
|
+
|
7
|
+
cls = example_class(identifier: identifier, handlers: handlers)
|
8
|
+
|
9
|
+
cls.new(stream_name)
|
6
10
|
end
|
7
11
|
|
8
|
-
|
9
|
-
|
12
|
+
def self.example_class(identifier: nil, handlers: nil)
|
13
|
+
if identifier == :none
|
14
|
+
identifier = nil
|
15
|
+
else
|
16
|
+
identifier ||= Identifier.random
|
17
|
+
end
|
18
|
+
|
19
|
+
if handlers == :none
|
20
|
+
handlers = []
|
21
|
+
else
|
22
|
+
handlers ||= [
|
23
|
+
Handle.example_class,
|
24
|
+
Handle.example_class
|
25
|
+
]
|
26
|
+
end
|
27
|
+
|
28
|
+
Class.new do
|
29
|
+
include ::Consumer
|
30
|
+
|
31
|
+
handlers.each do |handler_cls|
|
32
|
+
handler handler_cls
|
33
|
+
end
|
10
34
|
|
11
|
-
|
35
|
+
unless identifier.nil?
|
36
|
+
identifier identifier
|
37
|
+
end
|
12
38
|
|
13
|
-
|
14
|
-
|
15
|
-
|
39
|
+
def configure(settings: nil, **)
|
40
|
+
Controls::Session::Example.configure(self, settings)
|
41
|
+
|
42
|
+
Get::Example.configure(self)
|
43
|
+
PositionStore::Example.configure(self)
|
44
|
+
end
|
45
|
+
|
46
|
+
def handled_messages
|
47
|
+
handled_messages = []
|
48
|
+
|
49
|
+
self.class.handler_registry.each do |handler|
|
50
|
+
next unless handler.ancestors.include?(Handle)
|
51
|
+
|
52
|
+
handled_messages += handler.handled_messages
|
53
|
+
end
|
54
|
+
|
55
|
+
handled_messages
|
56
|
+
end
|
16
57
|
end
|
17
58
|
end
|
59
|
+
|
60
|
+
Example = self.example_class
|
18
61
|
end
|
19
62
|
end
|
20
63
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Consumer
|
2
|
+
module Controls
|
3
|
+
module Consumer
|
4
|
+
module ErrorHandler
|
5
|
+
def self.example(stream_name=nil)
|
6
|
+
stream_name ||= StreamName.example
|
7
|
+
|
8
|
+
Example.new(stream_name)
|
9
|
+
end
|
10
|
+
|
11
|
+
class Example
|
12
|
+
include ::Consumer
|
13
|
+
|
14
|
+
attr_accessor :handled_error
|
15
|
+
attr_accessor :failed_message
|
16
|
+
|
17
|
+
handler Handle::Example
|
18
|
+
handler Handle::RaiseError
|
19
|
+
|
20
|
+
def error_raised(error, message)
|
21
|
+
self.handled_error = error
|
22
|
+
self.failed_message = message
|
23
|
+
end
|
24
|
+
|
25
|
+
def handled_error?(error=nil)
|
26
|
+
if error.nil?
|
27
|
+
!handled_error.nil?
|
28
|
+
else
|
29
|
+
handled_error == error
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def failed_message?(message)
|
34
|
+
failed_message == message
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -5,21 +5,36 @@ module Consumer
|
|
5
5
|
include ::Consumer
|
6
6
|
include ::Log::Dependency
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
module Handlers
|
9
|
+
class PrintSummary
|
10
|
+
include Messaging::Handle
|
11
|
+
include Log::Dependency
|
12
|
+
|
13
|
+
def handle(message_data)
|
14
|
+
logger.info { "Handled event (StreamName: #{message_data.stream_name}, GlobalPosition: #{message_data.global_position})" }
|
15
|
+
end
|
16
|
+
end
|
11
17
|
|
12
|
-
|
13
|
-
|
18
|
+
class PrintData
|
19
|
+
include Messaging::Handle
|
20
|
+
include Log::Dependency
|
21
|
+
|
22
|
+
def handle(message_data)
|
23
|
+
logger.debug { message_data.data.pretty_inspect }
|
24
|
+
end
|
25
|
+
end
|
14
26
|
end
|
15
27
|
|
16
|
-
|
28
|
+
handler Handlers::PrintSummary
|
29
|
+
handler Handlers::PrintData
|
30
|
+
|
31
|
+
def configure
|
17
32
|
sleep_duration = ENV['SLEEP_DURATION'] || 100
|
18
33
|
sleep_duration = sleep_duration.to_i
|
19
34
|
|
20
35
|
Get::Incrementing.configure(self, sleep_duration)
|
21
36
|
|
22
|
-
PositionStore::LocalFile.configure(self,
|
37
|
+
PositionStore::LocalFile.configure(self, identifier: identifier)
|
23
38
|
end
|
24
39
|
end
|
25
40
|
end
|
@@ -2,18 +2,26 @@ module Consumer
|
|
2
2
|
module Controls
|
3
3
|
module Get
|
4
4
|
class Incrementing
|
5
|
+
extend ::Configure::Macro
|
6
|
+
|
5
7
|
configure :get
|
6
8
|
|
7
|
-
initializer :
|
9
|
+
initializer :frequency_milliseconds
|
10
|
+
|
11
|
+
def frequency_seconds
|
12
|
+
frequency_milliseconds.to_f / 1000
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.build(frequency_milliseconds=nil)
|
16
|
+
frequency_milliseconds ||= Defaults.frequency_milliseconds
|
8
17
|
|
9
|
-
|
10
|
-
new(sleep_duration)
|
18
|
+
new(frequency_milliseconds)
|
11
19
|
end
|
12
20
|
|
13
21
|
def call(stream_name, position: nil)
|
14
22
|
position ||= 0
|
15
23
|
|
16
|
-
sleep
|
24
|
+
sleep(frequency_seconds)
|
17
25
|
|
18
26
|
3.times.map do |offset|
|
19
27
|
MessageData.get(
|
@@ -23,21 +31,27 @@ module Consumer
|
|
23
31
|
)
|
24
32
|
end
|
25
33
|
end
|
26
|
-
end
|
27
34
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
35
|
+
module Defaults
|
36
|
+
def self.frequency_milliseconds
|
37
|
+
100
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class MessageData
|
42
|
+
def self.get(stream_name, global_position, position)
|
43
|
+
data = {
|
44
|
+
:position => position,
|
45
|
+
:global_position => global_position
|
46
|
+
}
|
47
|
+
|
48
|
+
Controls::MessageData.example(
|
49
|
+
stream_name: stream_name,
|
50
|
+
data: data,
|
51
|
+
global_position: global_position,
|
52
|
+
position: position
|
53
|
+
)
|
54
|
+
end
|
41
55
|
end
|
42
56
|
end
|
43
57
|
end
|
@@ -2,24 +2,51 @@ module Consumer
|
|
2
2
|
module Controls
|
3
3
|
module Handle
|
4
4
|
def self.example
|
5
|
-
|
5
|
+
example_class.new
|
6
6
|
end
|
7
7
|
|
8
|
-
|
9
|
-
|
8
|
+
def self.example_class
|
9
|
+
Class.new do
|
10
|
+
include Messaging::Handle
|
11
|
+
include Handle
|
10
12
|
|
11
|
-
|
12
|
-
handled_messages << message_data
|
13
|
-
end
|
13
|
+
attr_accessor :session
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
def configure(session: nil)
|
16
|
+
self.session = session
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.handled_messages
|
20
|
+
@@handled_messages ||= []
|
21
|
+
end
|
22
|
+
|
23
|
+
def handle(message_data)
|
24
|
+
handled_messages << message_data
|
25
|
+
end
|
18
26
|
|
19
|
-
|
20
|
-
|
27
|
+
def handled_messages
|
28
|
+
self.class.handled_messages
|
29
|
+
end
|
30
|
+
|
31
|
+
def handled?(message_data=nil)
|
32
|
+
if message_data.nil?
|
33
|
+
handled_messages.any?
|
34
|
+
else
|
35
|
+
handled_messages.include?(message_data)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def session?(session=nil)
|
40
|
+
if session.nil?
|
41
|
+
!self.session.nil?
|
42
|
+
else
|
43
|
+
session == self.session
|
44
|
+
end
|
45
|
+
end
|
21
46
|
end
|
22
47
|
end
|
48
|
+
|
49
|
+
Example = self.example_class
|
23
50
|
end
|
24
51
|
end
|
25
52
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Consumer
|
2
|
+
module Controls
|
3
|
+
module Handle
|
4
|
+
module RaiseError
|
5
|
+
class Example
|
6
|
+
include Messaging::Handle
|
7
|
+
|
8
|
+
def handle(message_data)
|
9
|
+
error_text = "Example error (Message: #{message_data.type}, Stream: #{message_data.stream_name}, Position: #{message_data.position}, Global Position: #{message_data.global_position})"
|
10
|
+
|
11
|
+
raise Error::Example, error_text
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,8 +1,18 @@
|
|
1
1
|
module Consumer
|
2
2
|
module Controls
|
3
3
|
module Identifier
|
4
|
-
def self.example
|
5
|
-
|
4
|
+
def self.example(random: nil)
|
5
|
+
random ||= false
|
6
|
+
|
7
|
+
unless random
|
8
|
+
'some-consumer'
|
9
|
+
else
|
10
|
+
"some-consumer-#{SecureRandom.hex(8)}"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.random
|
15
|
+
example(random: true)
|
6
16
|
end
|
7
17
|
end
|
8
18
|
end
|
@@ -5,9 +5,12 @@ module Consumer
|
|
5
5
|
global_position ||= position
|
6
6
|
|
7
7
|
message_data = MessageStore::Controls::MessageData::Read.example(data: data)
|
8
|
+
|
8
9
|
message_data.stream_name = stream_name unless stream_name.nil?
|
10
|
+
|
9
11
|
message_data.position = position unless position.nil?
|
10
12
|
message_data.global_position = global_position unless global_position.nil?
|
13
|
+
|
11
14
|
message_data
|
12
15
|
end
|
13
16
|
end
|
@@ -3,15 +3,19 @@ module Consumer
|
|
3
3
|
module PositionStore
|
4
4
|
class LocalFile
|
5
5
|
include Consumer::PositionStore
|
6
|
+
extend Initializer::Macro
|
6
7
|
|
7
|
-
|
8
|
-
|
8
|
+
initializer(:identifier)
|
9
|
+
|
10
|
+
def self.build(identifier: nil)
|
11
|
+
instance = new(identifier)
|
9
12
|
instance.configure
|
10
13
|
instance
|
11
14
|
end
|
12
15
|
|
13
16
|
def get
|
14
17
|
return 0 unless File.exist?(path)
|
18
|
+
|
15
19
|
text = File.read(path)
|
16
20
|
text.to_i
|
17
21
|
end
|
@@ -21,7 +25,13 @@ module Consumer
|
|
21
25
|
end
|
22
26
|
|
23
27
|
def path
|
24
|
-
'tmp
|
28
|
+
path = File.join('tmp', 'local_file_position_store')
|
29
|
+
|
30
|
+
unless identifier.nil?
|
31
|
+
path << "-#{identifier}"
|
32
|
+
end
|
33
|
+
|
34
|
+
path
|
25
35
|
end
|
26
36
|
end
|
27
37
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Consumer
|
2
|
+
module Controls
|
3
|
+
module Session
|
4
|
+
def self.example(settings=nil)
|
5
|
+
Example.build(settings)
|
6
|
+
end
|
7
|
+
|
8
|
+
class Example
|
9
|
+
extend ::Configure::Macro
|
10
|
+
extend ::Settings::Setting::Macro
|
11
|
+
|
12
|
+
configure :session
|
13
|
+
|
14
|
+
setting :some_setting
|
15
|
+
setting :other_setting
|
16
|
+
|
17
|
+
def self.build(settings=nil)
|
18
|
+
settings ||= Settings.example
|
19
|
+
|
20
|
+
instance = new
|
21
|
+
settings.set(instance)
|
22
|
+
instance
|
23
|
+
end
|
24
|
+
|
25
|
+
def settings?(other_settings)
|
26
|
+
self.some_setting == other_settings.get(:some_setting) &&
|
27
|
+
self.other_setting == other_settings.get(:other_setting)
|
28
|
+
end
|
29
|
+
|
30
|
+
def ==(other_session)
|
31
|
+
other_session.is_a?(self.class) &&
|
32
|
+
self.some_setting == other_session.some_setting &&
|
33
|
+
self.other_setting == other_session.other_setting
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
module Settings
|
38
|
+
def self.example
|
39
|
+
Example.build
|
40
|
+
end
|
41
|
+
|
42
|
+
class Example < ::Settings
|
43
|
+
def self.data_source
|
44
|
+
Raw.example
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
module Raw
|
49
|
+
def self.example
|
50
|
+
{
|
51
|
+
:some_setting => SecureRandom.hex(7),
|
52
|
+
:other_setting => SecureRandom.hex(7)
|
53
|
+
}
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -4,34 +4,34 @@ module Consumer
|
|
4
4
|
|
5
5
|
configure :handler_registry
|
6
6
|
|
7
|
+
def entries
|
8
|
+
@entries ||= Set.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def count
|
12
|
+
entries.count
|
13
|
+
end
|
14
|
+
|
15
|
+
def each(&block)
|
16
|
+
entries.each(&block)
|
17
|
+
end
|
18
|
+
|
7
19
|
def register(handler)
|
8
|
-
logger.trace { "Registering handler (Handler: #{
|
20
|
+
logger.trace { "Registering handler (Handler: #{handler.name})" }
|
9
21
|
|
10
22
|
if registered? handler
|
11
|
-
error_message = "Handler is already registered (Handler: #{
|
23
|
+
error_message = "Handler is already registered (Handler: #{handler.name})"
|
12
24
|
logger.error { error_message }
|
13
25
|
raise Error, error_message
|
14
26
|
end
|
15
27
|
|
16
28
|
entries << handler
|
17
29
|
|
18
|
-
logger.debug { "Handler registered (Handler: #{
|
30
|
+
logger.debug { "Handler registered (Handler: #{handler.name})" }
|
19
31
|
|
20
32
|
handler
|
21
33
|
end
|
22
34
|
|
23
|
-
def get(consumer)
|
24
|
-
entries.map do |handler|
|
25
|
-
if handler.is_a? Proc
|
26
|
-
proc { |message_data|
|
27
|
-
consumer.instance_exec(message_data, &handler)
|
28
|
-
}
|
29
|
-
else
|
30
|
-
handler.build
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
35
|
def registered?(handler)
|
36
36
|
entries.any? do |entry|
|
37
37
|
return true if handler == entry
|
@@ -42,24 +42,6 @@ module Consumer
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
def entries
|
46
|
-
@entries ||= Set.new
|
47
|
-
end
|
48
|
-
|
49
|
-
def count
|
50
|
-
entries.count
|
51
|
-
end
|
52
|
-
|
53
|
-
module LogText
|
54
|
-
def self.handler(handler)
|
55
|
-
case handler
|
56
|
-
when Module then handler.name
|
57
|
-
when Proc then '(proc)'
|
58
|
-
else handler.inspect
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
45
|
Error = Class.new(RuntimeError)
|
64
46
|
end
|
65
47
|
end
|
@@ -19,20 +19,22 @@ module Consumer
|
|
19
19
|
|
20
20
|
module Build
|
21
21
|
def self.extended(cls)
|
22
|
-
|
22
|
+
cls.singleton_class.class_exec do
|
23
|
+
extend Virtual::Macro
|
24
|
+
|
25
|
+
abstract :build
|
26
|
+
end
|
23
27
|
end
|
24
28
|
end
|
25
29
|
|
26
30
|
module ClassConfigure
|
27
|
-
def configure(receiver, *arguments,
|
31
|
+
def configure(receiver, *arguments, attr_name: nil, **keyword_arguments)
|
28
32
|
attr_name ||= :position_store
|
29
33
|
|
30
|
-
if
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
position_store = build(*arguments)
|
35
|
-
end
|
34
|
+
if keyword_arguments.any?
|
35
|
+
position_store = build(*arguments, **keyword_arguments)
|
36
|
+
else
|
37
|
+
position_store = build(*arguments)
|
36
38
|
end
|
37
39
|
|
38
40
|
receiver.public_send("#{attr_name}=", position_store)
|
data/lib/consumer/substitute.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: evt-consumer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.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: 2018-
|
11
|
+
date: 2018-10-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ntl-actor
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: evt-settings
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: test_bench
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -92,11 +106,13 @@ files:
|
|
92
106
|
- lib/consumer/controls.rb
|
93
107
|
- lib/consumer/controls/category.rb
|
94
108
|
- lib/consumer/controls/consumer.rb
|
109
|
+
- lib/consumer/controls/consumer/error_handler.rb
|
95
110
|
- lib/consumer/controls/consumer/incrementing.rb
|
96
111
|
- lib/consumer/controls/error.rb
|
97
112
|
- lib/consumer/controls/get.rb
|
98
113
|
- lib/consumer/controls/get/incrementing.rb
|
99
114
|
- lib/consumer/controls/handle.rb
|
115
|
+
- lib/consumer/controls/handle/raise_error.rb
|
100
116
|
- lib/consumer/controls/id.rb
|
101
117
|
- lib/consumer/controls/identifier.rb
|
102
118
|
- lib/consumer/controls/message_data.rb
|
@@ -105,11 +121,10 @@ files:
|
|
105
121
|
- lib/consumer/controls/position.rb
|
106
122
|
- lib/consumer/controls/position_store.rb
|
107
123
|
- lib/consumer/controls/position_store/local_file.rb
|
124
|
+
- lib/consumer/controls/session.rb
|
108
125
|
- lib/consumer/controls/stream_name.rb
|
109
126
|
- lib/consumer/controls/subscription.rb
|
110
127
|
- lib/consumer/defaults.rb
|
111
|
-
- lib/consumer/dispatch.rb
|
112
|
-
- lib/consumer/dispatch/substitute.rb
|
113
128
|
- lib/consumer/handler_registry.rb
|
114
129
|
- lib/consumer/log.rb
|
115
130
|
- lib/consumer/log_text.rb
|
@@ -140,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
140
155
|
version: '0'
|
141
156
|
requirements: []
|
142
157
|
rubyforge_project:
|
143
|
-
rubygems_version: 2.7.
|
158
|
+
rubygems_version: 2.7.6
|
144
159
|
signing_key:
|
145
160
|
specification_version: 4
|
146
161
|
summary: Continuous subscription to a stream and message dispatching to handlers
|
data/lib/consumer/dispatch.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
module Consumer
|
2
|
-
class Dispatch
|
3
|
-
include Log::Dependency
|
4
|
-
|
5
|
-
def handlers
|
6
|
-
@handlers ||= []
|
7
|
-
end
|
8
|
-
|
9
|
-
configure :dispatch
|
10
|
-
|
11
|
-
def self.build(handlers=nil)
|
12
|
-
handlers = Array(handlers)
|
13
|
-
|
14
|
-
instance = new
|
15
|
-
|
16
|
-
handlers.each do |handler|
|
17
|
-
instance.add_handler(handler)
|
18
|
-
end
|
19
|
-
|
20
|
-
instance
|
21
|
-
end
|
22
|
-
|
23
|
-
def call(message_data)
|
24
|
-
logger.trace { "Dispatching event (#{LogText.message_data(message_data)})" }
|
25
|
-
|
26
|
-
handlers.each do |handle|
|
27
|
-
handle.(message_data)
|
28
|
-
end
|
29
|
-
|
30
|
-
logger.debug { "Event dispatched (#{LogText.message_data(message_data)}, Handlers Count: #{handlers.count})" }
|
31
|
-
|
32
|
-
nil
|
33
|
-
end
|
34
|
-
|
35
|
-
def add_handler(handler)
|
36
|
-
handlers << handler
|
37
|
-
end
|
38
|
-
|
39
|
-
def to_proc
|
40
|
-
method(:call)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
module Consumer
|
2
|
-
class Dispatch
|
3
|
-
module Substitute
|
4
|
-
def self.build
|
5
|
-
Dispatch.new
|
6
|
-
end
|
7
|
-
|
8
|
-
class Dispatch
|
9
|
-
def call(message_data)
|
10
|
-
dispatched_messages << message_data
|
11
|
-
end
|
12
|
-
|
13
|
-
def add_handler(handle)
|
14
|
-
handlers << handle
|
15
|
-
end
|
16
|
-
|
17
|
-
def dispatched_messages
|
18
|
-
@dispatched_messages ||= []
|
19
|
-
end
|
20
|
-
|
21
|
-
def dispatched?(message_data=nil, &block)
|
22
|
-
if message_data.nil?
|
23
|
-
block ||= proc { true }
|
24
|
-
else
|
25
|
-
block ||= proc { |msg| message_data == msg }
|
26
|
-
end
|
27
|
-
|
28
|
-
dispatched_messages.any? &block
|
29
|
-
end
|
30
|
-
|
31
|
-
def handlers
|
32
|
-
@handlers ||= []
|
33
|
-
end
|
34
|
-
|
35
|
-
def handler?(handler)
|
36
|
-
handlers.include?(handler)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|