carnivore 0.2.10 → 0.2.12
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/CHANGELOG.md +6 -0
- data/lib/carnivore/callback.rb +5 -1
- data/lib/carnivore/runner.rb +17 -6
- data/lib/carnivore/source.rb +64 -40
- data/lib/carnivore/utils.rb +1 -0
- data/lib/carnivore/utils/failure.rb +31 -0
- data/lib/carnivore/utils/smash.rb +39 -3
- data/lib/carnivore/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 488354b5c88ba4e3992fa4ee8ec6b81c42e52ef2
|
|
4
|
+
data.tar.gz: 0b33704a653ae60d4733fd1a3bb4b4b98d420196
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d5da72980c4bd8d3ee3b99a1348f264008a9dd0ab1549da85ac43ad215772152a38f6b1f54b583f12959a1e72a78bf61f3dfe5533a709595decc65a308b91171
|
|
7
|
+
data.tar.gz: a24fb16e43b8ffa06c6f3e50495c93b4756ba9b7c9a21f0f9f46aa458ee4c05ca1fd8e933096032b6854951513536bd684e41705d971ef591bb450bef3aa3355
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
# v0.2.12
|
|
2
|
+
* Prevent source configuration output at INFO level on build
|
|
3
|
+
* Keep all sources paused until all sources are built
|
|
4
|
+
* Add helper for performing hash conversions
|
|
5
|
+
* Support deep hash conversions (process through enumerables)
|
|
6
|
+
|
|
1
7
|
# v0.2.10
|
|
2
8
|
* Remove explicit JSON usage
|
|
3
9
|
|
data/lib/carnivore/callback.rb
CHANGED
|
@@ -12,6 +12,8 @@ module Carnivore
|
|
|
12
12
|
include Celluloid
|
|
13
13
|
include Carnivore::Utils::Logging
|
|
14
14
|
# @!parse include Carnivore::Utils::Logging
|
|
15
|
+
include Carnivore::Utils::Failure
|
|
16
|
+
# @!parse include Carnivore::Utils::Failure
|
|
15
17
|
|
|
16
18
|
# @return [String, Symbol] name of callback
|
|
17
19
|
attr_reader :name
|
|
@@ -30,7 +32,9 @@ module Carnivore
|
|
|
30
32
|
raise ArgumentError.new 'Block is required for dynamic callbacks!'
|
|
31
33
|
end
|
|
32
34
|
define_singleton_method(:execute, &block) if block
|
|
33
|
-
setup
|
|
35
|
+
execute_and_retry_forever(:setup) do
|
|
36
|
+
setup
|
|
37
|
+
end
|
|
34
38
|
end
|
|
35
39
|
|
|
36
40
|
# Used by custom callback classes for setup
|
data/lib/carnivore/runner.rb
CHANGED
|
@@ -19,13 +19,24 @@ module Carnivore
|
|
|
19
19
|
begin
|
|
20
20
|
require 'carnivore/supervisor'
|
|
21
21
|
supervisor = Carnivore::Supervisor.build!
|
|
22
|
+
Celluloid::Logger.info 'Initializing all registered sources.'
|
|
23
|
+
[].tap do |register|
|
|
24
|
+
Source.sources.each do |source|
|
|
25
|
+
register << Thread.new do
|
|
26
|
+
source.klass.reset_comms!
|
|
27
|
+
supervisor.supervise_as(
|
|
28
|
+
source.source_hash[:name],
|
|
29
|
+
source.klass,
|
|
30
|
+
source.source_hash.dup
|
|
31
|
+
)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end.map(&:join)
|
|
35
|
+
Celluloid::Logger.info 'Source initializations complete. Enabling message processing.'
|
|
22
36
|
Source.sources.each do |source|
|
|
23
|
-
source.
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
source.klass,
|
|
27
|
-
source.source_hash.dup
|
|
28
|
-
)
|
|
37
|
+
if(source.source_hash.fetch(:auto_process, true))
|
|
38
|
+
supervisor[source.source_hash[:name]].start!
|
|
39
|
+
end
|
|
29
40
|
end
|
|
30
41
|
loop do
|
|
31
42
|
# We do a sleep loop so we can periodically check on the
|
data/lib/carnivore/source.rb
CHANGED
|
@@ -98,6 +98,8 @@ module Carnivore
|
|
|
98
98
|
include Celluloid
|
|
99
99
|
include Utils::Logging
|
|
100
100
|
# @!parse include Carnivore::Utils::Logging
|
|
101
|
+
include Utils::Failure
|
|
102
|
+
# @!parse include Carnivore::Utils::Failure
|
|
101
103
|
|
|
102
104
|
finalizer :teardown_cleanup
|
|
103
105
|
|
|
@@ -171,12 +173,11 @@ module Carnivore
|
|
|
171
173
|
add_callback(name, block)
|
|
172
174
|
end
|
|
173
175
|
end
|
|
174
|
-
setup
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
warn 'Processing is disabled'
|
|
176
|
+
execute_and_retry_forever(:setup) do
|
|
177
|
+
setup(args)
|
|
178
|
+
end
|
|
179
|
+
execute_and_retry_forever(:connect) do
|
|
180
|
+
connect
|
|
180
181
|
end
|
|
181
182
|
info 'Source initialization is complete'
|
|
182
183
|
rescue => e
|
|
@@ -184,6 +185,25 @@ module Carnivore
|
|
|
184
185
|
raise
|
|
185
186
|
end
|
|
186
187
|
|
|
188
|
+
# Start source if auto_process is enabled
|
|
189
|
+
#
|
|
190
|
+
# @return [TrueClass, FalseClass]
|
|
191
|
+
def start!
|
|
192
|
+
if(auto_process?)
|
|
193
|
+
info 'Message processing started via auto start'
|
|
194
|
+
async.process
|
|
195
|
+
true
|
|
196
|
+
else
|
|
197
|
+
warn 'Message processing is disabled via auto start'
|
|
198
|
+
false
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
# @return [TrueClass, FalseClass] auto processing enabled
|
|
203
|
+
def auto_process?
|
|
204
|
+
auto_process && !callbacks.empty?
|
|
205
|
+
end
|
|
206
|
+
|
|
187
207
|
# Ensure we cleanup our internal supervisor before bailing out
|
|
188
208
|
def teardown_cleanup
|
|
189
209
|
warn 'Termination request received. Tearing down!'
|
|
@@ -335,47 +355,51 @@ module Carnivore
|
|
|
335
355
|
# @param args [Object] list of arguments
|
|
336
356
|
# @return [TrueClass]
|
|
337
357
|
def process(*args)
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
msgs = []
|
|
346
|
-
msgs.push message_loop.pop unless message_loop.empty?
|
|
347
|
-
msgs.push message_remote.pop unless message_remote.empty?
|
|
348
|
-
msgs = [msgs].flatten.compact.map do |m|
|
|
349
|
-
if(valid_message?(m))
|
|
350
|
-
format(m)
|
|
358
|
+
unless(processing)
|
|
359
|
+
begin
|
|
360
|
+
async.receive_messages
|
|
361
|
+
@processing = true
|
|
362
|
+
while(run_process && !callbacks.empty?)
|
|
363
|
+
if(message_loop.empty? && message_remote.empty?)
|
|
364
|
+
wait(:messages_available)
|
|
351
365
|
end
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
366
|
+
msgs = []
|
|
367
|
+
msgs.push message_loop.pop unless message_loop.empty?
|
|
368
|
+
msgs.push message_remote.pop unless message_remote.empty?
|
|
369
|
+
msgs = [msgs].flatten.compact.map do |m|
|
|
370
|
+
if(valid_message?(m))
|
|
371
|
+
format(m)
|
|
357
372
|
end
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
373
|
+
end.compact
|
|
374
|
+
msgs.each do |msg|
|
|
375
|
+
if(multiple_callbacks? || respond_to?(:orphan_callback))
|
|
376
|
+
valid_callbacks = callbacks.find_all do |name|
|
|
377
|
+
callback_supervisor[callback_name(name)].valid?(msg)
|
|
378
|
+
end
|
|
379
|
+
else
|
|
380
|
+
valid_callbacks = callbacks
|
|
381
|
+
end
|
|
382
|
+
if(valid_callbacks.empty?)
|
|
383
|
+
warn "Received message was not processed through any callbacks on this source: #{msg}"
|
|
384
|
+
orphan_callback(msg) if respond_to?(:orphan_callback)
|
|
385
|
+
elsif(valid_callbacks.size > 1 && !multiple_callbacks?)
|
|
386
|
+
error "Received message is valid for multiple callbacks but multiple callbacks are disabled: #{msg}"
|
|
387
|
+
multiple_callback(msg) if respond_to?(:multiple_callback)
|
|
388
|
+
else
|
|
389
|
+
valid_callbacks.each do |name|
|
|
390
|
+
debug "Dispatching message<#{msg[:message].object_id}> to callback<#{name} (#{callback_name(name)})>"
|
|
391
|
+
callback_supervisor[callback_name(name)].async.call(msg)
|
|
392
|
+
end
|
|
371
393
|
end
|
|
372
394
|
end
|
|
373
395
|
end
|
|
396
|
+
ensure
|
|
397
|
+
@processing = false
|
|
374
398
|
end
|
|
375
|
-
|
|
376
|
-
|
|
399
|
+
true
|
|
400
|
+
else
|
|
401
|
+
false
|
|
377
402
|
end
|
|
378
|
-
true
|
|
379
403
|
end
|
|
380
404
|
|
|
381
405
|
# Receive messages from source
|
data/lib/carnivore/utils.rb
CHANGED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'carnivore'
|
|
2
|
+
|
|
3
|
+
module Carnivore
|
|
4
|
+
module Utils
|
|
5
|
+
|
|
6
|
+
# Failure utilities
|
|
7
|
+
module Failure
|
|
8
|
+
|
|
9
|
+
# Attempt to execute provided block. If exception is raised, log
|
|
10
|
+
# and pause before retry. Do this until success.
|
|
11
|
+
#
|
|
12
|
+
# @param action [String, Symbol] display name for block
|
|
13
|
+
# @return [Object] result of yielded block
|
|
14
|
+
def execute_and_retry_forever(action)
|
|
15
|
+
begin
|
|
16
|
+
debug "Starting #{action} process"
|
|
17
|
+
result = yield
|
|
18
|
+
debug "Completed #{action} process"
|
|
19
|
+
result
|
|
20
|
+
rescue => e
|
|
21
|
+
error "#{action.to_s.capitalize} process encountered an error: #{e.class} - #{e}"
|
|
22
|
+
debug "#{e.class}: #{e}\n#{e.backtrace.join("\n")}"
|
|
23
|
+
warn "Pausing for 5 seconds then retrying #{action}"
|
|
24
|
+
sleep(5)
|
|
25
|
+
retry
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -75,6 +75,13 @@ module Carnivore
|
|
|
75
75
|
value
|
|
76
76
|
end
|
|
77
77
|
|
|
78
|
+
# Convert to Hash
|
|
79
|
+
#
|
|
80
|
+
# @return [Hash]
|
|
81
|
+
def to_hash
|
|
82
|
+
self.to_type_converter(::Hash, :to_hash)
|
|
83
|
+
end
|
|
84
|
+
|
|
78
85
|
end
|
|
79
86
|
end
|
|
80
87
|
|
|
@@ -87,13 +94,42 @@ class Hash
|
|
|
87
94
|
#
|
|
88
95
|
# @return [Smash]
|
|
89
96
|
def to_smash
|
|
90
|
-
::Smash
|
|
97
|
+
self.to_type_converter(::Smash, :to_smash)
|
|
98
|
+
end
|
|
99
|
+
alias_method :hulk_smash, :to_smash
|
|
100
|
+
|
|
101
|
+
protected
|
|
102
|
+
|
|
103
|
+
# Convert to type
|
|
104
|
+
#
|
|
105
|
+
# @param type [Class] hash type
|
|
106
|
+
# @param convert_call [Symbol] builtin hash convert
|
|
107
|
+
# @return [Smash]
|
|
108
|
+
def to_type_converter(type, convert_call)
|
|
109
|
+
type.new.tap do |smash|
|
|
91
110
|
self.each do |k,v|
|
|
92
|
-
smash[k.is_a?(Symbol) ? k.to_s : k] = v
|
|
111
|
+
smash[k.is_a?(Symbol) ? k.to_s : k] = smash_conversion(v, convert_call)
|
|
93
112
|
end
|
|
94
113
|
end
|
|
95
114
|
end
|
|
96
|
-
|
|
115
|
+
|
|
116
|
+
# Convert object to smash if applicable
|
|
117
|
+
#
|
|
118
|
+
# @param obj [Object]
|
|
119
|
+
# @param convert_call [Symbol] builtin hash convert
|
|
120
|
+
# @return [Smash, Object]
|
|
121
|
+
def smash_conversion(obj, convert_call)
|
|
122
|
+
case obj
|
|
123
|
+
when Hash
|
|
124
|
+
obj.send(convert_call)
|
|
125
|
+
when Array
|
|
126
|
+
obj.map do |i|
|
|
127
|
+
smash_conversion(i, convert_call)
|
|
128
|
+
end
|
|
129
|
+
else
|
|
130
|
+
obj
|
|
131
|
+
end
|
|
132
|
+
end
|
|
97
133
|
|
|
98
134
|
end
|
|
99
135
|
|
data/lib/carnivore/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: carnivore
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.12
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Chris Roberts
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2014-
|
|
11
|
+
date: 2014-10-02 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: celluloid
|
|
@@ -88,6 +88,7 @@ files:
|
|
|
88
88
|
- lib/carnivore/spec_helper.rb
|
|
89
89
|
- lib/carnivore/supervisor.rb
|
|
90
90
|
- lib/carnivore/utils.rb
|
|
91
|
+
- lib/carnivore/utils/failure.rb
|
|
91
92
|
- lib/carnivore/utils/logging.rb
|
|
92
93
|
- lib/carnivore/utils/message_registry.rb
|
|
93
94
|
- lib/carnivore/utils/params.rb
|