rsmp 0.1.17 → 0.1.30
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/.gitignore +1 -0
- data/.gitmodules +0 -4
- data/Gemfile.lock +23 -19
- data/README.md +1 -1
- data/config/supervisor.yaml +9 -15
- data/config/tlc.yaml +12 -10
- data/documentation/classes_and_modules.md +65 -0
- data/documentation/message_distribution.md +23 -0
- data/lib/rsmp.rb +14 -5
- data/lib/rsmp/archive.rb +23 -22
- data/lib/rsmp/cli.rb +133 -102
- data/lib/rsmp/collector.rb +102 -0
- data/lib/rsmp/component.rb +3 -0
- data/lib/rsmp/{site_base.rb → components.rb} +3 -3
- data/lib/rsmp/convert/export/json_schema.rb +204 -0
- data/lib/rsmp/convert/import/yaml.rb +38 -0
- data/lib/rsmp/deep_merge.rb +11 -0
- data/lib/rsmp/error.rb +1 -1
- data/lib/rsmp/inspect.rb +46 -0
- data/lib/rsmp/listener.rb +23 -0
- data/lib/rsmp/logger.rb +6 -4
- data/lib/rsmp/{base.rb → logging.rb} +3 -3
- data/lib/rsmp/message.rb +46 -32
- data/lib/rsmp/node.rb +47 -12
- data/lib/rsmp/notifier.rb +29 -0
- data/lib/rsmp/proxy.rb +143 -71
- data/lib/rsmp/rsmp.rb +34 -23
- data/lib/rsmp/site.rb +35 -34
- data/lib/rsmp/site_proxy.rb +180 -98
- data/lib/rsmp/site_proxy_wait.rb +206 -0
- data/lib/rsmp/supervisor.rb +85 -49
- data/lib/rsmp/supervisor_proxy.rb +70 -27
- data/lib/rsmp/tlc.rb +252 -90
- data/lib/rsmp/version.rb +1 -1
- data/lib/rsmp/wait.rb +7 -8
- data/rsmp.gemspec +4 -15
- metadata +27 -118
- data/config/site.yaml +0 -40
- data/lib/rsmp/probe.rb +0 -114
- data/lib/rsmp/probe_collection.rb +0 -28
- data/lib/rsmp/supervisor_base.rb +0 -10
data/lib/rsmp/version.rb
CHANGED
data/lib/rsmp/wait.rb
CHANGED
@@ -1,17 +1,16 @@
|
|
1
|
-
# Helper for waiting for an Async condition using a block
|
2
|
-
|
3
1
|
module RSMP
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
2
|
+
module Wait
|
3
|
+
# wait for an async condition to signal, then yield to block
|
4
|
+
# if block returns true we're done. otherwise, wait again
|
5
|
+
def wait_for condition, timeout, &block
|
6
|
+
raise RuntimeError.new("Can't wait for condition because task is not running") unless @task.running?
|
7
|
+
@task.with_timeout(timeout) do
|
8
|
+
while @task.running? do
|
9
9
|
value = condition.wait
|
10
10
|
result = yield value
|
11
11
|
return result if result # return result of check, if not nil
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
15
|
-
|
16
15
|
end
|
17
16
|
end
|
data/rsmp.gemspec
CHANGED
@@ -26,28 +26,17 @@ Gem::Specification.new do |spec|
|
|
26
26
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
27
27
|
end
|
28
28
|
|
29
|
-
# Add schema files in rsmp_schema submodule
|
30
|
-
gem_dir = Pathname.new(__dir__).expand_path
|
31
|
-
submodule_path = File.expand_path 'lib/rsmp_schema/schema'
|
32
|
-
Dir.chdir(submodule_path) do
|
33
|
-
submodule_relative_path = Pathname.new(submodule_path).relative_path_from(gem_dir)
|
34
|
-
`git ls-files`.split($\).each do |filename|
|
35
|
-
# for each git file, prepend relative submodule path and add to spec
|
36
|
-
spec.files << submodule_relative_path.join(filename).to_s
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
29
|
spec.bindir = "exe"
|
41
30
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
42
31
|
spec.require_paths = ["lib"]
|
43
32
|
|
44
|
-
spec.add_dependency "async", "~> 1.
|
45
|
-
spec.add_dependency "async-io", "~> 1.
|
33
|
+
spec.add_dependency "async", "~> 1.28.7"
|
34
|
+
spec.add_dependency "async-io", "~> 1.30.2"
|
46
35
|
spec.add_dependency "colorize", "~> 0.8.1"
|
47
36
|
spec.add_dependency "thor", "~> 1.0.1"
|
48
|
-
spec.add_dependency "
|
37
|
+
spec.add_dependency "rsmp_schemer", "~> 0.2.0"
|
49
38
|
|
50
|
-
spec.add_development_dependency "bundler", "~> 2.
|
39
|
+
spec.add_development_dependency "bundler", "~> 2.2.3"
|
51
40
|
spec.add_development_dependency "rake", "~> 13.0.1"
|
52
41
|
spec.add_development_dependency "rspec", "~> 3.9.0"
|
53
42
|
spec.add_development_dependency "rspec-expectations", "~> 3.9.1"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rsmp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.30
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Emil Tin
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-06-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: async
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.
|
19
|
+
version: 1.28.7
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.
|
26
|
+
version: 1.28.7
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: async-io
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.
|
33
|
+
version: 1.30.2
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 1.
|
40
|
+
version: 1.30.2
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: colorize
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -67,33 +67,33 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 1.0.1
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: rsmp_schemer
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 0.2.
|
75
|
+
version: 0.2.0
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 0.2.
|
82
|
+
version: 0.2.0
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: bundler
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 2.
|
89
|
+
version: 2.2.3
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 2.
|
96
|
+
version: 2.2.3
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rake
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -197,130 +197,39 @@ files:
|
|
197
197
|
- Rakefile
|
198
198
|
- bin/console
|
199
199
|
- bin/setup
|
200
|
-
- config/site.yaml
|
201
200
|
- config/supervisor.yaml
|
202
201
|
- config/tlc.yaml
|
202
|
+
- documentation/classes_and_modules.md
|
203
|
+
- documentation/message_distribution.md
|
203
204
|
- exe/rsmp
|
204
205
|
- lib/rsmp.rb
|
205
206
|
- lib/rsmp/alarm.rb
|
206
207
|
- lib/rsmp/archive.rb
|
207
|
-
- lib/rsmp/base.rb
|
208
208
|
- lib/rsmp/cli.rb
|
209
|
+
- lib/rsmp/collector.rb
|
209
210
|
- lib/rsmp/component.rb
|
211
|
+
- lib/rsmp/components.rb
|
212
|
+
- lib/rsmp/convert/export/json_schema.rb
|
213
|
+
- lib/rsmp/convert/import/yaml.rb
|
214
|
+
- lib/rsmp/deep_merge.rb
|
210
215
|
- lib/rsmp/error.rb
|
216
|
+
- lib/rsmp/inspect.rb
|
217
|
+
- lib/rsmp/listener.rb
|
211
218
|
- lib/rsmp/logger.rb
|
219
|
+
- lib/rsmp/logging.rb
|
212
220
|
- lib/rsmp/message.rb
|
213
221
|
- lib/rsmp/node.rb
|
214
|
-
- lib/rsmp/
|
215
|
-
- lib/rsmp/probe_collection.rb
|
222
|
+
- lib/rsmp/notifier.rb
|
216
223
|
- lib/rsmp/proxy.rb
|
217
224
|
- lib/rsmp/rsmp.rb
|
218
225
|
- lib/rsmp/site.rb
|
219
|
-
- lib/rsmp/site_base.rb
|
220
226
|
- lib/rsmp/site_proxy.rb
|
227
|
+
- lib/rsmp/site_proxy_wait.rb
|
221
228
|
- lib/rsmp/supervisor.rb
|
222
|
-
- lib/rsmp/supervisor_base.rb
|
223
229
|
- lib/rsmp/supervisor_proxy.rb
|
224
230
|
- lib/rsmp/tlc.rb
|
225
231
|
- lib/rsmp/version.rb
|
226
232
|
- lib/rsmp/wait.rb
|
227
|
-
- lib/rsmp_schema/schema/core/aggregated_status.json
|
228
|
-
- lib/rsmp_schema/schema/core/alarm.json
|
229
|
-
- lib/rsmp_schema/schema/core/command_request.json
|
230
|
-
- lib/rsmp_schema/schema/core/command_response.json
|
231
|
-
- lib/rsmp_schema/schema/core/core.json
|
232
|
-
- lib/rsmp_schema/schema/core/definitions.json
|
233
|
-
- lib/rsmp_schema/schema/core/message_ack.json
|
234
|
-
- lib/rsmp_schema/schema/core/message_not_ack.json
|
235
|
-
- lib/rsmp_schema/schema/core/rsmp.json
|
236
|
-
- lib/rsmp_schema/schema/core/status.json
|
237
|
-
- lib/rsmp_schema/schema/core/status_request.json
|
238
|
-
- lib/rsmp_schema/schema/core/status_response.json
|
239
|
-
- lib/rsmp_schema/schema/core/status_subscribe.json
|
240
|
-
- lib/rsmp_schema/schema/core/status_unsubscribe.json
|
241
|
-
- lib/rsmp_schema/schema/core/status_update.json
|
242
|
-
- lib/rsmp_schema/schema/core/version.json
|
243
|
-
- lib/rsmp_schema/schema/core/watchdog.json
|
244
|
-
- lib/rsmp_schema/schema/tlc/alarms/A0001.json
|
245
|
-
- lib/rsmp_schema/schema/tlc/alarms/A0002.json
|
246
|
-
- lib/rsmp_schema/schema/tlc/alarms/A0003.json
|
247
|
-
- lib/rsmp_schema/schema/tlc/alarms/A0004.json
|
248
|
-
- lib/rsmp_schema/schema/tlc/alarms/A0005.json
|
249
|
-
- lib/rsmp_schema/schema/tlc/alarms/A0006.json
|
250
|
-
- lib/rsmp_schema/schema/tlc/alarms/A0007.json
|
251
|
-
- lib/rsmp_schema/schema/tlc/alarms/A0008.json
|
252
|
-
- lib/rsmp_schema/schema/tlc/alarms/A0009.json
|
253
|
-
- lib/rsmp_schema/schema/tlc/alarms/A0101.json
|
254
|
-
- lib/rsmp_schema/schema/tlc/alarms/A0201.json
|
255
|
-
- lib/rsmp_schema/schema/tlc/alarms/A0202.json
|
256
|
-
- lib/rsmp_schema/schema/tlc/alarms/A0301.json
|
257
|
-
- lib/rsmp_schema/schema/tlc/alarms/A0302.json
|
258
|
-
- lib/rsmp_schema/schema/tlc/alarms/alarms.json
|
259
|
-
- lib/rsmp_schema/schema/tlc/commands/M0001.json
|
260
|
-
- lib/rsmp_schema/schema/tlc/commands/M0002.json
|
261
|
-
- lib/rsmp_schema/schema/tlc/commands/M0003.json
|
262
|
-
- lib/rsmp_schema/schema/tlc/commands/M0004.json
|
263
|
-
- lib/rsmp_schema/schema/tlc/commands/M0005.json
|
264
|
-
- lib/rsmp_schema/schema/tlc/commands/M0006.json
|
265
|
-
- lib/rsmp_schema/schema/tlc/commands/M0007.json
|
266
|
-
- lib/rsmp_schema/schema/tlc/commands/M0008.json
|
267
|
-
- lib/rsmp_schema/schema/tlc/commands/M0010.json
|
268
|
-
- lib/rsmp_schema/schema/tlc/commands/M0011.json
|
269
|
-
- lib/rsmp_schema/schema/tlc/commands/M0012.json
|
270
|
-
- lib/rsmp_schema/schema/tlc/commands/M0013.json
|
271
|
-
- lib/rsmp_schema/schema/tlc/commands/M0014.json
|
272
|
-
- lib/rsmp_schema/schema/tlc/commands/M0015.json
|
273
|
-
- lib/rsmp_schema/schema/tlc/commands/M0016.json
|
274
|
-
- lib/rsmp_schema/schema/tlc/commands/M0017.json
|
275
|
-
- lib/rsmp_schema/schema/tlc/commands/M0018.json
|
276
|
-
- lib/rsmp_schema/schema/tlc/commands/M0019.json
|
277
|
-
- lib/rsmp_schema/schema/tlc/commands/M0103.json
|
278
|
-
- lib/rsmp_schema/schema/tlc/commands/command_requests.json
|
279
|
-
- lib/rsmp_schema/schema/tlc/commands/command_responses.json
|
280
|
-
- lib/rsmp_schema/schema/tlc/commands/commands.json
|
281
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0001.json
|
282
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0002.json
|
283
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0003.json
|
284
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0004.json
|
285
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0005.json
|
286
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0006.json
|
287
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0007.json
|
288
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0008.json
|
289
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0009.json
|
290
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0010.json
|
291
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0011.json
|
292
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0012.json
|
293
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0013.json
|
294
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0014.json
|
295
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0015.json
|
296
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0016.json
|
297
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0017.json
|
298
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0018.json
|
299
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0019.json
|
300
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0020.json
|
301
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0021.json
|
302
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0022.json
|
303
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0023.json
|
304
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0024.json
|
305
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0025.json
|
306
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0026.json
|
307
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0027.json
|
308
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0028.json
|
309
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0029.json
|
310
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0091.json
|
311
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0092.json
|
312
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0095.json
|
313
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0096.json
|
314
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0201.json
|
315
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0202.json
|
316
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0203.json
|
317
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0204.json
|
318
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0205.json
|
319
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0206.json
|
320
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0207.json
|
321
|
-
- lib/rsmp_schema/schema/tlc/statuses/S0208.json
|
322
|
-
- lib/rsmp_schema/schema/tlc/statuses/statuses.json
|
323
|
-
- lib/rsmp_schema/schema/tlc/sxl.json
|
324
233
|
- rsmp.gemspec
|
325
234
|
homepage: https://github.com/rsmp-nordic/rsmp
|
326
235
|
licenses:
|
@@ -330,7 +239,7 @@ metadata:
|
|
330
239
|
source_code_uri: https://github.com/rsmp-nordic/rsmp
|
331
240
|
changelog_uri: https://github.com/rsmp-nordic/rsmp/blob/master/CHANGELOG.md
|
332
241
|
bug_tracker_uri: https://github.com/rsmp-nordic/rsmp/issues
|
333
|
-
post_install_message:
|
242
|
+
post_install_message:
|
334
243
|
rdoc_options: []
|
335
244
|
require_paths:
|
336
245
|
- lib
|
@@ -345,8 +254,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
345
254
|
- !ruby/object:Gem::Version
|
346
255
|
version: '0'
|
347
256
|
requirements: []
|
348
|
-
rubygems_version: 3.
|
349
|
-
signing_key:
|
257
|
+
rubygems_version: 3.2.3
|
258
|
+
signing_key:
|
350
259
|
specification_version: 4
|
351
260
|
summary: RoadSide Message Protocol (RSMP) library.
|
352
261
|
test_files: []
|
data/config/site.yaml
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
site_id: RN+SI0001
|
2
|
-
supervisors:
|
3
|
-
- ip: 127.0.0.1
|
4
|
-
port: 12111
|
5
|
-
|
6
|
-
sxl: traffic_light_controller
|
7
|
-
|
8
|
-
rsmp_versions:
|
9
|
-
- 3.1.1
|
10
|
-
- 3.1.2
|
11
|
-
- 3.1.3
|
12
|
-
- 3.1.4
|
13
|
-
|
14
|
-
components:
|
15
|
-
main:
|
16
|
-
C1:
|
17
|
-
|
18
|
-
watchdog_interval: 1
|
19
|
-
watchdog_timeout: 2
|
20
|
-
acknowledgement_timeout: 1
|
21
|
-
command_response_timeout: 1
|
22
|
-
status_response_timeout: 1
|
23
|
-
status_update_timeout: 1
|
24
|
-
reconnect_interval: 0.1
|
25
|
-
|
26
|
-
log:
|
27
|
-
active: true
|
28
|
-
color: true
|
29
|
-
timestamp: true
|
30
|
-
id: true
|
31
|
-
component: true
|
32
|
-
ip: false
|
33
|
-
site_id: true
|
34
|
-
level: false
|
35
|
-
text: true
|
36
|
-
direction: true
|
37
|
-
json: true
|
38
|
-
acknowledgements: false
|
39
|
-
watchdogs: false
|
40
|
-
|
data/lib/rsmp/probe.rb
DELETED
@@ -1,114 +0,0 @@
|
|
1
|
-
# A probe checks incoming messages and store matches
|
2
|
-
# Once it has collected what it needs, it triggers a condition variable
|
3
|
-
# and the client wakes up.
|
4
|
-
|
5
|
-
module RSMP
|
6
|
-
class Probe
|
7
|
-
attr_reader :condition, :items, :done
|
8
|
-
|
9
|
-
# block should send a message and return message just sent
|
10
|
-
def self.collect_response proxy, options={}, &block
|
11
|
-
from = proxy.archive.current_index
|
12
|
-
sent = yield
|
13
|
-
raise RuntimeError unless sent && sent[:message].is_a?(RSMP::Message)
|
14
|
-
item = proxy.archive.capture(options.merge(from: from+1, num: 1, with_message: true)) do |item|
|
15
|
-
["CommandResponse","StatusResponse","MessageNotAck"].include?(item[:message].type)
|
16
|
-
end
|
17
|
-
if item
|
18
|
-
item[:message]
|
19
|
-
else
|
20
|
-
nil
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
|
25
|
-
def initialize archive
|
26
|
-
raise ArgumentError.new("Archive expected") unless archive.is_a? Archive
|
27
|
-
@archive = archive
|
28
|
-
@items = []
|
29
|
-
@condition = Async::Notification.new
|
30
|
-
end
|
31
|
-
|
32
|
-
def capture task, options={}, &block
|
33
|
-
@options = options
|
34
|
-
@block = block
|
35
|
-
@num = options[:num]
|
36
|
-
|
37
|
-
if options[:earliest]
|
38
|
-
from = find_timestamp_index options[:earliest]
|
39
|
-
backscan from
|
40
|
-
elsif options[:from]
|
41
|
-
backscan options[:from]
|
42
|
-
end
|
43
|
-
|
44
|
-
# if backscan didn't find enough items, then
|
45
|
-
# insert ourself as probe and sleep until enough items are captured
|
46
|
-
if @items.size < @num
|
47
|
-
begin
|
48
|
-
@archive.probes.add self
|
49
|
-
task.with_timeout(options[:timeout]) do
|
50
|
-
@condition.wait
|
51
|
-
end
|
52
|
-
ensure
|
53
|
-
@archive.probes.remove self
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
if @num == 1
|
58
|
-
@items.first # if one item was requested, return item instead of array
|
59
|
-
else
|
60
|
-
@items[0..@num-1] # return array, but ensure we never return more than requested
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def find_timestamp_index earliest
|
65
|
-
(0..@archive.items.size).bsearch do |i| # use binary search to find item index
|
66
|
-
@archive.items[i][:timestamp] >= earliest
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def backscan from
|
71
|
-
from.upto(@archive.items.size-1) do |i|
|
72
|
-
return if process @archive.items[i]
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def reset
|
77
|
-
@items.clear
|
78
|
-
@done = false
|
79
|
-
end
|
80
|
-
|
81
|
-
def process item
|
82
|
-
raise ArgumentError unless item
|
83
|
-
return true if @done
|
84
|
-
if matches? item
|
85
|
-
@items << item
|
86
|
-
if @num && @items.size >= @num
|
87
|
-
@done = true
|
88
|
-
@condition.signal
|
89
|
-
return true
|
90
|
-
end
|
91
|
-
end
|
92
|
-
false
|
93
|
-
end
|
94
|
-
|
95
|
-
def matches? item
|
96
|
-
raise ArgumentError unless item
|
97
|
-
|
98
|
-
if @options[:type]
|
99
|
-
return false if item[:message] == nil
|
100
|
-
if @options[:type].is_a? Array
|
101
|
-
return false unless @options[:type].include? item[:message].type
|
102
|
-
else
|
103
|
-
return false unless item[:message].type == @options[:type]
|
104
|
-
end
|
105
|
-
end
|
106
|
-
return if @options[:level] && item[:level] != @options[:level]
|
107
|
-
return false if @options[:with_message] && !(item[:direction] && item[:message])
|
108
|
-
if @block
|
109
|
-
return false if @block.call(item) == false
|
110
|
-
end
|
111
|
-
true
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|