rsmp 0.1.10 → 0.1.19

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.
@@ -1,3 +1,3 @@
1
1
  module RSMP
2
- VERSION = "0.1.10"
2
+ VERSION = "0.1.19"
3
3
  end
@@ -1,10 +1,11 @@
1
1
  # Helper for waiting for an Async condition using a block
2
2
 
3
3
  module RSMP
4
- class Wait
4
+ module Wait
5
5
 
6
- def self.wait_for task, condition, timeout, &block
7
- task.with_timeout(timeout) do
6
+ def wait_for condition, timeout, &block
7
+ raise RuntimeError.new("Can't wait for state because task is stopped") unless @task.running?
8
+ @task.with_timeout(timeout) do
8
9
  while task.running? do
9
10
  value = condition.wait
10
11
  result = yield value
@@ -13,5 +14,150 @@ module RSMP
13
14
  end
14
15
  end
15
16
 
17
+ def capture_status_updates_or_responses task, type, options, m_id
18
+ task.annotate "wait for status update/response"
19
+ want = convert_status_list options[:status_list]
20
+ result = {}
21
+ # wait for a status update
22
+ item = @archive.capture(task,options.merge({
23
+ type: [type,'MessageNotAck'],
24
+ num: 1
25
+ })) do |item|
26
+ message = item[:message]
27
+ if message.is_a?(MessageNotAck) && message.attribute('oMId') == m_id
28
+ # set result to an exception, but don't raise it.
29
+ # this will be returned by the task and stored as the task result
30
+ # when the parent task call wait() on the task, the exception
31
+ # will be raised in the parent task, and caught by rspec.
32
+ # rspec will then show the error and record the test as failed
33
+ m_id_short = RSMP::Message.shorten_m_id m_id, 8
34
+ result = RSMP::MessageRejected.new "Status request #{m_id_short} was rejected: #{message.attribute('rea')}"
35
+ next true # done, no more messages wanted
36
+ end
37
+ found = []
38
+ # look through querues
39
+ want.each_with_index do |query,i|
40
+ # look through status items in message
41
+ item[:message].attributes['sS'].each do |input|
42
+ ok = status_match? query, input
43
+ if ok
44
+ result[query] = input
45
+ found << i # record which queries where matched succesfully
46
+ end
47
+ end
48
+ end
49
+ # remove queries that where matched
50
+ found.sort.reverse.each do |i|
51
+ want.delete_at i
52
+ end
53
+ want.empty? # any queries left to match?
54
+ end
55
+ result
56
+ rescue Async::TimeoutError
57
+ type_str = {'StatusUpdate'=>'update', 'StatusResponse'=>'response'}[type]
58
+ raise RSMP::TimeoutError.new "Did not received status #{type_str} in reply to #{m_id} within #{options[:timeout]}s"
59
+ end
60
+
61
+ def wait_for_status_updates_or_responses parent_task, type, options={}, &block
62
+ raise ArgumentError.new("component argument is missing") unless options[:component]
63
+ raise ArgumentError.new("status_list argument is missing") unless options[:status_list]
64
+ m_id = RSMP::Message.make_m_id # make message id so we can start waiting for it
65
+
66
+ # wait for command responses in an async task
67
+ task = parent_task.async do |task|
68
+ capture_status_updates_or_responses task, type, options, m_id
69
+ end
70
+
71
+ # call block, it should send command request using the given m_id
72
+ yield m_id
73
+
74
+ # wait for the response and return it, raise exception if NotAck received, it it timed out
75
+ task.wait
76
+ end
77
+
78
+ def wait_for_status_updates parent_task, options={}, &block
79
+ wait_for_status_updates_or_responses parent_task, 'StatusUpdate', options, &block
80
+ end
81
+
82
+ def wait_for_status_responses parent_task, options={}, &block
83
+ wait_for_status_updates_or_responses parent_task, 'StatusResponse', options, &block
84
+ end
85
+
86
+ def process_command_response message
87
+ log "Received #{message.type}", message: message, level: :log
88
+ acknowledge message
89
+ end
90
+
91
+ def command_match? query, item
92
+ return false if query[:sCI] && query[:sCI] != item['sCI']
93
+ return false if query[:n] && query[:n] != item['n']
94
+ if query[:s].is_a? Regexp
95
+ return false if query[:v] && item['v'] !~ query[:v]
96
+ else
97
+ return false if query[:v] && item['v'] != query[:v]
98
+ end
99
+ true
100
+ end
101
+
102
+ def capture_command_responses parent_task, type, options, m_id
103
+ task.annotate "wait for command response"
104
+ want = options[:command_list].clone
105
+ result = {}
106
+ item = @archive.capture(parent_task,options.merge({
107
+ type: [type,'MessageNotAck'],
108
+ num: 1
109
+ })) do |item|
110
+ message = item[:message]
111
+ if message.is_a?(MessageNotAck) && message.attribute('oMId') == m_id
112
+ # and message.attribute('oMId')==m_id
113
+ # set result to an exception, but don't raise it.
114
+ # this will be returned by the task and stored as the task result
115
+ # when the parent task call wait() on the task, the exception
116
+ # will be raised in the parent task, and caught by rspec.
117
+ # rspec will then show the error and record the test as failed
118
+ m_id_short = RSMP::Message.shorten_m_id m_id, 8
119
+ result = RSMP::MessageRejected.new "Command request #{m_id_short} was rejected: #{message.attribute('rea')}"
120
+ next true # done, no more messages wanted
121
+ end
122
+
123
+ found = []
124
+ # look through querues
125
+ want.each_with_index do |query,i|
126
+ # look through items in message
127
+ item[:message].attributes['rvs'].each do |input|
128
+ ok = command_match? query, input
129
+ if ok
130
+ result[query] = input
131
+ found << i # record which queries where matched succesfully
132
+ end
133
+ end
134
+ end
135
+ # remove queries that where matched
136
+ found.sort.reverse.each do |i|
137
+ want.delete_at i
138
+ end
139
+ want.empty? # any queries left to match?
140
+ end
141
+ result
142
+ rescue Async::TimeoutError
143
+ raise RSMP::TimeoutError.new "Did not receive command response to #{m_id} within #{options[:timeout]}s"
144
+ end
145
+
146
+ def wait_for_command_responses parent_task, options={}, &block
147
+ raise ArgumentError.new("component argument is missing") unless options[:component]
148
+ raise ArgumentError.new("command_list argument is missing") unless options[:command_list]
149
+ m_id = RSMP::Message.make_m_id # make message id so we can start waiting for it
150
+
151
+ # wait for command responses in an async task
152
+ task = parent_task.async do |task|
153
+ capture_command_responses task, 'CommandResponse', options, m_id
154
+ end
155
+
156
+ # call block, it should send command request using the given m_id
157
+ yield m_id
158
+
159
+ # wait for the response and return it, raise exception if NotAck received, it it timed out
160
+ task.wait
161
+ end
16
162
  end
17
163
  end
@@ -42,17 +42,16 @@ Gem::Specification.new do |spec|
42
42
  spec.require_paths = ["lib"]
43
43
 
44
44
  spec.add_dependency "async", "~> 1.23.0"
45
- spec.add_dependency "async-io", "~> 1.27.1"
45
+ spec.add_dependency "async-io", "~> 1.27.4"
46
46
  spec.add_dependency "colorize", "~> 0.8.1"
47
- spec.add_dependency "thor", "~> 0.20.3"
48
- spec.add_dependency "json_schemer", "~> 0.2.8"
49
-
50
- spec.add_development_dependency "bundler", "~> 2.0"
51
- spec.add_development_dependency "rake", "~> 10.0"
52
- spec.add_development_dependency "rspec", "~> 3.0"
53
- spec.add_development_dependency "rspec-expectations", "~> 3.8.3"
54
- spec.add_development_dependency "rspec-with_params", "~> 0.2.0"
47
+ spec.add_dependency "thor", "~> 1.0.1"
48
+ spec.add_dependency "json_schemer", "~> 0.2.11"
49
+
50
+ spec.add_development_dependency "bundler", "~> 2.1.4"
51
+ spec.add_development_dependency "rake", "~> 13.0.1"
52
+ spec.add_development_dependency "rspec", "~> 3.9.0"
53
+ spec.add_development_dependency "rspec-expectations", "~> 3.9.1"
55
54
  spec.add_development_dependency "timecop", "~> 0.9.1"
56
55
  spec.add_development_dependency "cucumber", "~> 3.1.2"
57
- spec.add_development_dependency "aruba", "~> 0.14.11"
56
+ spec.add_development_dependency "aruba", "~> 1.0.0"
58
57
  end
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.10
4
+ version: 0.1.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emil Tin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-12-16 00:00:00.000000000 Z
11
+ date: 2020-12-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.27.1
33
+ version: 1.27.4
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.27.1
40
+ version: 1.27.4
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: colorize
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -58,98 +58,84 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.20.3
61
+ version: 1.0.1
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.20.3
68
+ version: 1.0.1
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: json_schemer
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 0.2.8
75
+ version: 0.2.11
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.8
82
+ version: 0.2.11
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.0'
89
+ version: 2.1.4
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.0'
96
+ version: 2.1.4
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rake
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '10.0'
103
+ version: 13.0.1
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '10.0'
110
+ version: 13.0.1
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: rspec
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '3.0'
117
+ version: 3.9.0
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '3.0'
124
+ version: 3.9.0
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: rspec-expectations
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: 3.8.3
131
+ version: 3.9.1
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: 3.8.3
139
- - !ruby/object:Gem::Dependency
140
- name: rspec-with_params
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - "~>"
144
- - !ruby/object:Gem::Version
145
- version: 0.2.0
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - "~>"
151
- - !ruby/object:Gem::Version
152
- version: 0.2.0
138
+ version: 3.9.1
153
139
  - !ruby/object:Gem::Dependency
154
140
  name: timecop
155
141
  requirement: !ruby/object:Gem::Requirement
@@ -184,14 +170,14 @@ dependencies:
184
170
  requirements:
185
171
  - - "~>"
186
172
  - !ruby/object:Gem::Version
187
- version: 0.14.11
173
+ version: 1.0.0
188
174
  type: :development
189
175
  prerelease: false
190
176
  version_requirements: !ruby/object:Gem::Requirement
191
177
  requirements:
192
178
  - - "~>"
193
179
  - !ruby/object:Gem::Version
194
- version: 0.14.11
180
+ version: 1.0.0
195
181
  description: Easy RSMP site and supervisor communication.
196
182
  email:
197
183
  - zf0f@kk.dk
@@ -213,6 +199,8 @@ files:
213
199
  - bin/setup
214
200
  - config/site.yaml
215
201
  - config/supervisor.yaml
202
+ - config/tlc.yaml
203
+ - documentation/classes.md
216
204
  - exe/rsmp
217
205
  - lib/rsmp.rb
218
206
  - lib/rsmp/alarm.rb
@@ -232,8 +220,8 @@ files:
232
220
  - lib/rsmp/site_base.rb
233
221
  - lib/rsmp/site_proxy.rb
234
222
  - lib/rsmp/supervisor.rb
235
- - lib/rsmp/supervisor_base.rb
236
223
  - lib/rsmp/supervisor_proxy.rb
224
+ - lib/rsmp/tlc.rb
237
225
  - lib/rsmp/version.rb
238
226
  - lib/rsmp/wait.rb
239
227
  - lib/rsmp_schema/schema/core/aggregated_status.json
@@ -286,7 +274,10 @@ files:
286
274
  - lib/rsmp_schema/schema/tlc/commands/M0017.json
287
275
  - lib/rsmp_schema/schema/tlc/commands/M0018.json
288
276
  - lib/rsmp_schema/schema/tlc/commands/M0019.json
277
+ - lib/rsmp_schema/schema/tlc/commands/M0020.json
278
+ - lib/rsmp_schema/schema/tlc/commands/M0021.json
289
279
  - lib/rsmp_schema/schema/tlc/commands/M0103.json
280
+ - lib/rsmp_schema/schema/tlc/commands/M0104.json
290
281
  - lib/rsmp_schema/schema/tlc/commands/command_requests.json
291
282
  - lib/rsmp_schema/schema/tlc/commands/command_responses.json
292
283
  - lib/rsmp_schema/schema/tlc/commands/commands.json
@@ -319,10 +310,13 @@ files:
319
310
  - lib/rsmp_schema/schema/tlc/statuses/S0027.json
320
311
  - lib/rsmp_schema/schema/tlc/statuses/S0028.json
321
312
  - lib/rsmp_schema/schema/tlc/statuses/S0029.json
313
+ - lib/rsmp_schema/schema/tlc/statuses/S0030.json
314
+ - lib/rsmp_schema/schema/tlc/statuses/S0031.json
322
315
  - lib/rsmp_schema/schema/tlc/statuses/S0091.json
323
316
  - lib/rsmp_schema/schema/tlc/statuses/S0092.json
324
317
  - lib/rsmp_schema/schema/tlc/statuses/S0095.json
325
318
  - lib/rsmp_schema/schema/tlc/statuses/S0096.json
319
+ - lib/rsmp_schema/schema/tlc/statuses/S0097.json
326
320
  - lib/rsmp_schema/schema/tlc/statuses/S0201.json
327
321
  - lib/rsmp_schema/schema/tlc/statuses/S0202.json
328
322
  - lib/rsmp_schema/schema/tlc/statuses/S0203.json
@@ -357,7 +351,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
357
351
  - !ruby/object:Gem::Version
358
352
  version: '0'
359
353
  requirements: []
360
- rubygems_version: 3.0.6
354
+ rubygems_version: 3.1.2
361
355
  signing_key:
362
356
  specification_version: 4
363
357
  summary: RoadSide Message Protocol (RSMP) library.
@@ -1,10 +0,0 @@
1
- # Things shared between sites and site proxies
2
-
3
- module RSMP
4
- module SupervisorBase
5
-
6
- def initialize_supervisor
7
- end
8
-
9
- end
10
- end