rsmp 0.37.0 → 0.38.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.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/.devcontainer/devcontainer.json +22 -0
  3. data/.github/workflows/rubocop.yaml +17 -0
  4. data/.gitignore +5 -6
  5. data/.rubocop.yml +80 -0
  6. data/Gemfile +13 -1
  7. data/Gemfile.lock +34 -1
  8. data/Rakefile +3 -3
  9. data/lib/rsmp/cli.rb +147 -124
  10. data/lib/rsmp/collect/ack_collector.rb +8 -7
  11. data/lib/rsmp/collect/aggregated_status_collector.rb +4 -4
  12. data/lib/rsmp/collect/alarm_collector.rb +31 -23
  13. data/lib/rsmp/collect/alarm_matcher.rb +3 -3
  14. data/lib/rsmp/collect/collector/logging.rb +17 -0
  15. data/lib/rsmp/collect/collector/reporting.rb +44 -0
  16. data/lib/rsmp/collect/collector/status.rb +34 -0
  17. data/lib/rsmp/collect/collector.rb +69 -150
  18. data/lib/rsmp/collect/command_matcher.rb +19 -6
  19. data/lib/rsmp/collect/command_response_collector.rb +7 -7
  20. data/lib/rsmp/collect/distributor.rb +14 -11
  21. data/lib/rsmp/collect/filter.rb +31 -15
  22. data/lib/rsmp/collect/matcher.rb +7 -11
  23. data/lib/rsmp/collect/queue.rb +4 -4
  24. data/lib/rsmp/collect/receiver.rb +10 -12
  25. data/lib/rsmp/collect/state_collector.rb +116 -77
  26. data/lib/rsmp/collect/status_collector.rb +6 -6
  27. data/lib/rsmp/collect/status_matcher.rb +17 -7
  28. data/lib/rsmp/{alarm_state.rb → component/alarm_state.rb} +76 -37
  29. data/lib/rsmp/{component.rb → component/component.rb} +15 -15
  30. data/lib/rsmp/component/component_base.rb +89 -0
  31. data/lib/rsmp/component/component_proxy.rb +75 -0
  32. data/lib/rsmp/component/components.rb +63 -0
  33. data/lib/rsmp/convert/export/json_schema.rb +116 -110
  34. data/lib/rsmp/convert/import/yaml.rb +21 -18
  35. data/lib/rsmp/{rsmp.rb → helpers/clock.rb} +5 -6
  36. data/lib/rsmp/{deep_merge.rb → helpers/deep_merge.rb} +2 -1
  37. data/lib/rsmp/helpers/error.rb +71 -0
  38. data/lib/rsmp/{inspect.rb → helpers/inspect.rb} +6 -10
  39. data/lib/rsmp/log/archive.rb +98 -0
  40. data/lib/rsmp/log/colorization.rb +41 -0
  41. data/lib/rsmp/log/filtering.rb +54 -0
  42. data/lib/rsmp/log/logger.rb +206 -0
  43. data/lib/rsmp/{logging.rb → log/logging.rb} +5 -7
  44. data/lib/rsmp/message.rb +159 -148
  45. data/lib/rsmp/{node.rb → node/node.rb} +19 -17
  46. data/lib/rsmp/{protocol.rb → node/protocol.rb} +5 -3
  47. data/lib/rsmp/node/site/site.rb +195 -0
  48. data/lib/rsmp/node/supervisor/modules/configuration.rb +59 -0
  49. data/lib/rsmp/node/supervisor/modules/connection.rb +140 -0
  50. data/lib/rsmp/node/supervisor/modules/sites.rb +64 -0
  51. data/lib/rsmp/node/supervisor/supervisor.rb +72 -0
  52. data/lib/rsmp/{task.rb → node/task.rb} +12 -14
  53. data/lib/rsmp/proxy/modules/acknowledgements.rb +144 -0
  54. data/lib/rsmp/proxy/modules/receive.rb +119 -0
  55. data/lib/rsmp/proxy/modules/send.rb +76 -0
  56. data/lib/rsmp/proxy/modules/state.rb +25 -0
  57. data/lib/rsmp/proxy/modules/tasks.rb +105 -0
  58. data/lib/rsmp/proxy/modules/versions.rb +69 -0
  59. data/lib/rsmp/proxy/modules/watchdogs.rb +66 -0
  60. data/lib/rsmp/proxy/proxy.rb +199 -0
  61. data/lib/rsmp/proxy/site/modules/aggregated_status.rb +52 -0
  62. data/lib/rsmp/proxy/site/modules/alarms.rb +27 -0
  63. data/lib/rsmp/proxy/site/modules/commands.rb +31 -0
  64. data/lib/rsmp/proxy/site/modules/status.rb +110 -0
  65. data/lib/rsmp/proxy/site/site_proxy.rb +205 -0
  66. data/lib/rsmp/proxy/supervisor/modules/aggregated_status.rb +47 -0
  67. data/lib/rsmp/proxy/supervisor/modules/alarms.rb +73 -0
  68. data/lib/rsmp/proxy/supervisor/modules/commands.rb +53 -0
  69. data/lib/rsmp/proxy/supervisor/modules/status.rb +204 -0
  70. data/lib/rsmp/proxy/supervisor/supervisor_proxy.rb +178 -0
  71. data/lib/rsmp/tlc/detector_logic.rb +18 -34
  72. data/lib/rsmp/tlc/input_states.rb +126 -0
  73. data/lib/rsmp/tlc/modules/detector_logics.rb +50 -0
  74. data/lib/rsmp/tlc/modules/display.rb +78 -0
  75. data/lib/rsmp/tlc/modules/helpers.rb +41 -0
  76. data/lib/rsmp/tlc/modules/inputs.rb +173 -0
  77. data/lib/rsmp/tlc/modules/modes.rb +253 -0
  78. data/lib/rsmp/tlc/modules/outputs.rb +30 -0
  79. data/lib/rsmp/tlc/modules/plans.rb +218 -0
  80. data/lib/rsmp/tlc/modules/signal_groups.rb +109 -0
  81. data/lib/rsmp/tlc/modules/startup_sequence.rb +22 -0
  82. data/lib/rsmp/tlc/modules/system.rb +140 -0
  83. data/lib/rsmp/tlc/modules/traffic_data.rb +49 -0
  84. data/lib/rsmp/tlc/signal_group.rb +37 -41
  85. data/lib/rsmp/tlc/signal_plan.rb +14 -11
  86. data/lib/rsmp/tlc/signal_priority.rb +39 -35
  87. data/lib/rsmp/tlc/startup_sequence.rb +59 -0
  88. data/lib/rsmp/tlc/traffic_controller.rb +38 -1010
  89. data/lib/rsmp/tlc/traffic_controller_site.rb +58 -57
  90. data/lib/rsmp/version.rb +1 -1
  91. data/lib/rsmp.rb +82 -48
  92. data/rsmp.gemspec +24 -31
  93. metadata +79 -139
  94. data/lib/rsmp/archive.rb +0 -76
  95. data/lib/rsmp/collect/message_matchers.rb +0 -0
  96. data/lib/rsmp/component_base.rb +0 -87
  97. data/lib/rsmp/component_proxy.rb +0 -57
  98. data/lib/rsmp/components.rb +0 -65
  99. data/lib/rsmp/error.rb +0 -71
  100. data/lib/rsmp/logger.rb +0 -216
  101. data/lib/rsmp/proxy.rb +0 -693
  102. data/lib/rsmp/site.rb +0 -188
  103. data/lib/rsmp/site_proxy.rb +0 -389
  104. data/lib/rsmp/supervisor.rb +0 -302
  105. data/lib/rsmp/supervisor_proxy.rb +0 -510
  106. data/lib/rsmp/tlc/inputs.rb +0 -134
data/lib/rsmp/message.rb CHANGED
@@ -5,69 +5,64 @@ module RSMP
5
5
  class Message
6
6
  include Inspect
7
7
 
8
- attr_reader :now, :attributes, :out
9
- attr_reader :timestamp # this is an internal timestamp recording when we receive/send
8
+ attr_reader :now, :attributes, :out, :timestamp # this is an internal timestamp recording when we receive/send
10
9
  attr_accessor :json, :direction
11
10
 
12
11
  def self.make_m_id
13
- SecureRandom.uuid()
12
+ SecureRandom.uuid
14
13
  end
15
14
 
16
- def self.parse_attributes json
15
+ def self.parse_attributes(json)
17
16
  raise ArgumentError unless json
17
+
18
18
  JSON.parse json
19
19
  rescue JSON::ParserError
20
20
  raise InvalidPacket, bin_to_chars(json)
21
21
  end
22
22
 
23
- def self.build attributes, json
23
+ def self.build(attributes, json)
24
24
  validate_message_type attributes
25
- case attributes["type"]
26
- when "MessageAck"
27
- message = MessageAck.new attributes
28
- when "MessageNotAck"
29
- message = MessageNotAck.new attributes
30
- when "Version"
31
- message = Version.new attributes
32
- when "AggregatedStatus"
33
- message = AggregatedStatus.new attributes
34
- when "AggregatedStatusRequest"
35
- message = AggregatedStatusRequest.new attributes
36
- when "Watchdog"
37
- message = Watchdog.new attributes
38
- when "Alarm"
39
- message = self.build_alarm attributes
40
- when "CommandRequest"
41
- message = CommandRequest.new attributes
42
- when "CommandResponse"
43
- message = CommandResponse.new attributes
44
- when "StatusRequest"
45
- message = StatusRequest.new attributes
46
- when "StatusResponse"
47
- message = StatusResponse.new attributes
48
- when "StatusSubscribe"
49
- message = StatusSubscribe.new attributes
50
- when "StatusUnsubscribe"
51
- message = StatusUnsubscribe.new attributes
52
- when "StatusUpdate"
53
- message = StatusUpdate.new attributes
54
- else
55
- message = Unknown.new attributes
56
- end
25
+ message = create_message_instance(attributes)
57
26
  message.json = json
58
27
  message.direction = :in
59
28
  message
60
29
  end
61
30
 
62
- def self.build_alarm attributes
63
- case attributes["aSp"]
31
+ def self.message_types
32
+ {
33
+ 'MessageAck' => MessageAck,
34
+ 'MessageNotAck' => MessageNotAck,
35
+ 'Version' => Version,
36
+ 'AggregatedStatus' => AggregatedStatus,
37
+ 'AggregatedStatusRequest' => AggregatedStatusRequest,
38
+ 'Watchdog' => Watchdog,
39
+ 'CommandRequest' => CommandRequest,
40
+ 'CommandResponse' => CommandResponse,
41
+ 'StatusRequest' => StatusRequest,
42
+ 'StatusResponse' => StatusResponse,
43
+ 'StatusSubscribe' => StatusSubscribe,
44
+ 'StatusUnsubscribe' => StatusUnsubscribe,
45
+ 'StatusUpdate' => StatusUpdate
46
+ }
47
+ end
48
+
49
+ def self.create_message_instance(attributes)
50
+ type = attributes['type']
51
+ return build_alarm(attributes) if type == 'Alarm'
52
+
53
+ klass = message_types[type] || Unknown
54
+ klass.new(attributes)
55
+ end
56
+
57
+ def self.build_alarm(attributes)
58
+ case attributes['aSp']
64
59
  when /^Issue$/i
65
60
  AlarmIssue.new attributes
66
61
  when /^Request$/i
67
62
  AlarmRequest.new attributes
68
63
  when /^Acknowledge$/i
69
64
  if attributes['ack'] =~ /^acknowledged$/i
70
- AlarmAcknowledged.new attributes
65
+ AlarmAcknowledged.new attributes
71
66
  else
72
67
  AlarmAcknowledge.new attributes
73
68
  end
@@ -87,84 +82,97 @@ module RSMP
87
82
  end
88
83
 
89
84
  def type
90
- @attributes["type"]
85
+ @attributes['type']
91
86
  end
92
87
 
93
88
  def m_id
94
- @attributes["mId"]
89
+ @attributes['mId']
95
90
  end
96
91
 
97
- def self.shorten_m_id m_id, length=4
98
- m_id[0..length-1]
92
+ def self.shorten_m_id(m_id, length = 4)
93
+ m_id[0..(length - 1)]
99
94
  end
100
95
 
101
96
  def m_id_short
102
- Message.shorten_m_id @attributes["mId"]
97
+ Message.shorten_m_id @attributes['mId']
103
98
  end
104
99
 
105
- def attribute key
106
- unless @attributes.key? key # note that this is not the same as @attributes[key] when
107
- maybe = @attributes.find { |k,v| k.downcase == key.downcase }
108
- if maybe
109
- raise MissingAttribute.new "attribute '#{maybe.first}' should be named '#{key}'"
110
- else
111
- raise MissingAttribute.new "missing attribute '#{key}'"
112
- end
100
+ def attribute(key)
101
+ unless @attributes.key? key # NOTE: that this is not the same as @attributes[key] when
102
+ maybe = @attributes.find { |k, _v| k.downcase == key.downcase }
103
+ raise MissingAttribute, "attribute '#{maybe.first}' should be named '#{key}'" if maybe
104
+
105
+ raise MissingAttribute, "missing attribute '#{key}'"
106
+
113
107
  end
114
108
  @attributes[key]
115
109
  end
116
110
 
117
- def self.bin_to_chars(s)
118
- out = s.gsub(/[^[:print:]]/i, '.')
111
+ def self.bin_to_chars(str)
112
+ out = str.gsub(/[^[:print:]]/i, '.')
119
113
  max = 120
120
114
  if out.size <= max
121
115
  out
122
116
  else
123
- mid = " ... "
124
- length = (max-mid.size)/2 - 1
125
- "#{out[0..length]} ... #{out[-length-1..-1]}"
117
+ mid = ' ... '
118
+ length = ((max - mid.size) / 2) - 1
119
+ "#{out[0..length]} ... #{out[(-length - 1)..]}"
126
120
  end
127
121
  end
128
122
 
129
- def self.validate_message_type attributes
130
- raise MalformedMessage.new("JSON must be a Hash, got #{attributes.class} ") unless attributes.is_a?(Hash)
131
- raise MalformedMessage.new("'mType' is missing") unless attributes["mType"]
132
- raise MalformedMessage.new("'mType' must be a String, got #{attributes["mType"].class}") unless attributes["mType"].is_a? String
133
- raise MalformedMessage.new("'mType' must be 'rSMsg', got '#{attributes["mType"]}'") unless attributes["mType"] == "rSMsg"
134
- raise MalformedMessage.new("'type' is missing") unless attributes["type"]
135
- raise MalformedMessage.new("'type' must be a String, got #{attributes["type"].class}") unless attributes["type"].is_a? String
123
+ def self.validate_message_type(attributes)
124
+ validate_attributes_structure(attributes)
125
+ validate_mtype_field(attributes)
126
+ validate_type_field(attributes)
136
127
  end
137
128
 
138
- def initialize attributes = {}
139
- @timestamp = Time.now # this timestamp is for internal use, and does not use the clock
140
- # in the node, which can be set by an rsmp supervisor
129
+ def self.validate_attributes_structure(attributes)
130
+ raise MalformedMessage, "JSON must be a Hash, got #{attributes.class} " unless attributes.is_a?(Hash)
131
+ end
141
132
 
142
- @attributes = { "mType"=> "rSMsg" }.merge attributes
133
+ def self.validate_mtype_field(attributes)
134
+ mtype = attributes['mType']
135
+ raise MalformedMessage, "'mType' is missing" unless mtype
136
+ raise MalformedMessage, "'mType' must be a String, got #{mtype.class}" unless mtype.is_a?(String)
137
+ raise MalformedMessage, "'mType' must be 'rSMsg', got '#{mtype}'" unless mtype == 'rSMsg'
138
+ end
139
+
140
+ def self.validate_type_field(attributes)
141
+ type = attributes['type']
142
+ raise MalformedMessage, "'type' is missing" unless type
143
+ raise MalformedMessage, "'type' must be a String, got #{type.class}" unless type.is_a?(String)
144
+ end
145
+
146
+ def initialize(attributes = {})
147
+ @timestamp = Time.now # this timestamp is for internal use, and does not use the clock
148
+ # in the node, which can be set by an rsmp supervisor
149
+
150
+ @attributes = { 'mType' => 'rSMsg' }.merge attributes
143
151
 
144
152
  ensure_message_id
145
153
  end
146
154
 
147
155
  def ensure_message_id
148
156
  # if message id is empty, generate a new one
149
- @attributes["mId"] ||= Message.make_m_id
157
+ @attributes['mId'] ||= Message.make_m_id
150
158
  end
151
159
 
152
- def validate schemas
160
+ def validate(schemas)
153
161
  errors = RSMP::Schema.validate attributes, schemas
154
- if errors
155
- error_string = errors.map {|item| item.reject {|e| e=='' } }.compact.join(', ').strip
156
- err = SchemaError.new "#{error_string}"
157
- err.schemas = schemas
158
- raise err
159
- end
162
+ return unless errors
163
+
164
+ error_string = errors.map { |item| item.reject { |e| e == '' } }.compact.join(', ').strip
165
+ err = SchemaError.new error_string.to_s
166
+ err.schemas = schemas
167
+ raise err
160
168
  end
161
169
 
162
- def validate_type
163
- @attributes["mType"] == "rSMsg"
170
+ def validate_type?
171
+ @attributes['mType'] == 'rSMsg'
164
172
  end
165
173
 
166
- def validate_id
167
- (@attributes["mId"] =~ /[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}/i) != nil
174
+ def validate_id?
175
+ !(@attributes['mId'] =~ /[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}/i).nil?
168
176
  end
169
177
 
170
178
  def valid?
@@ -181,26 +189,27 @@ module RSMP
181
189
  }
182
190
  @json = JSON.generate @attributes, options
183
191
  end
184
-
185
192
  end
186
193
 
187
194
  class Malformed < Message
188
- def initialize attributes = {}
195
+ # rubocop:disable Lint/MissingSuper
196
+ def initialize(attributes = {})
189
197
  # don't call super, just copy (potentially invalid) attributes
190
198
  @attributes = {}
191
199
  @invalid_attributes = attributes
192
200
  end
201
+ # rubocop:enable Lint/MissingSuper
193
202
  end
194
203
 
195
204
  class Version < Message
196
- def initialize attributes = {}
205
+ def initialize(attributes = {})
197
206
  super({
198
- "type" => "Version",
207
+ 'type' => 'Version'
199
208
  }.merge attributes)
200
209
  end
201
210
 
202
211
  def versions
203
- attribute("RSMP").map{ |item| item["vers"] }
212
+ attribute('RSMP').map { |item| item['vers'] }
204
213
  end
205
214
  end
206
215
 
@@ -208,111 +217,113 @@ module RSMP
208
217
  end
209
218
 
210
219
  class AggregatedStatus < Message
211
- def initialize attributes = {}
220
+ def initialize(attributes = {})
212
221
  super({
213
- "type" => "AggregatedStatus",
222
+ 'type' => 'AggregatedStatus'
214
223
  }.merge attributes)
215
224
  end
216
225
  end
217
226
 
218
227
  class AggregatedStatusRequest < Message
219
- def initialize attributes = {}
228
+ def initialize(attributes = {})
220
229
  super({
221
- "type" => "AggregatedStatusRequest",
230
+ 'type' => 'AggregatedStatusRequest'
222
231
  }.merge attributes)
223
232
  end
224
233
  end
225
234
 
226
235
  class Alarm < Message
227
- def initialize attributes = {}
236
+ def initialize(attributes = {})
228
237
  super({
229
- "type" => "Alarm",
230
- "ntsOId" => '',
231
- "xNId" => '',
232
- "xACId" => '',
233
- "xNACId" => ''
238
+ 'type' => 'Alarm',
239
+ 'ntsOId' => '',
240
+ 'xNId' => '',
241
+ 'xACId' => '',
242
+ 'xNACId' => ''
234
243
  }.merge attributes)
235
244
  end
236
245
 
237
- def differ? from
238
- %w{aSp aCId ack aS sS aTs cat pri}.each do |key|
246
+ def differ?(from)
247
+ %w[aSp aCId ack aS sS aTs cat pri].each do |key|
239
248
  return true if attribute(key).downcase != from.attribute(key).downcase
240
249
  end
241
250
  return true if attribute('rvs') != from.attribute('rvs')
251
+
242
252
  false
243
253
  end
244
254
  end
245
255
 
246
256
  class AlarmIssue < Alarm
247
- def initialize attributes = {}
257
+ def initialize(attributes = {})
248
258
  super({
249
- "aSp" => "Issue"
259
+ 'aSp' => 'Issue'
250
260
  }.merge attributes)
251
261
  end
252
262
  end
253
263
 
254
264
  class AlarmRequest < Alarm
255
- def initialize attributes = {}
265
+ def initialize(attributes = {})
256
266
  super({
257
- "aSp" => "Request",
267
+ 'aSp' => 'Request'
258
268
  }.merge attributes)
259
269
  end
260
270
  end
261
271
 
262
272
  class AlarmAcknowledge < Alarm
263
- def initialize attributes = {}
273
+ def initialize(attributes = {})
264
274
  super({
265
- "aSp" => "Acknowledge",
275
+ 'aSp' => 'Acknowledge'
266
276
  }.merge attributes)
267
277
  end
268
278
  end
269
279
 
270
280
  class AlarmAcknowledged < Alarm
271
- def initialize attributes = {}
281
+ def initialize(attributes = {})
272
282
  super({
273
- "aSp" => "Acknowledge",
274
- "ack" => "acknowledged"
283
+ 'aSp' => 'Acknowledge',
284
+ 'ack' => 'acknowledged'
275
285
  }.merge attributes)
276
286
  end
277
287
  end
288
+
278
289
  class AlarmSuspend < Alarm
279
- def initialize attributes = {}
290
+ def initialize(attributes = {})
280
291
  super({
281
- "aSp" => "Suspend",
292
+ 'aSp' => 'Suspend'
282
293
  }.merge attributes)
283
294
  end
284
295
  end
285
296
 
286
297
  class AlarmSuspended < Alarm
287
- def initialize attributes = {}
298
+ def initialize(attributes = {})
288
299
  super({
289
- "aSp" => "Suspend",
290
- "sS" => "Suspended"
300
+ 'aSp' => 'Suspend',
301
+ 'sS' => 'Suspended'
291
302
  }.merge attributes)
292
303
  end
293
304
  end
294
305
 
295
306
  class AlarmResume < Alarm
296
- def initialize attributes = {}
307
+ def initialize(attributes = {})
297
308
  super({
298
- "aSp" => "Resume",
309
+ 'aSp' => 'Resume'
299
310
  }.merge attributes)
300
311
  end
301
312
  end
302
313
 
303
314
  class AlarmResumed < Alarm
304
- def initialize attributes = {}
315
+ def initialize(attributes = {})
305
316
  super({
306
- "aSp" => "Suspend",
307
- "sS" => "notSuspended"
317
+ 'aSp' => 'Suspend',
318
+ 'sS' => 'notSuspended'
308
319
  }.merge attributes)
309
320
  end
310
321
  end
311
322
 
312
323
  class Watchdog < Message
313
- def initialize attributes = {}
324
+ def initialize(attributes = {})
314
325
  super({
315
- "type" => "Watchdog",
326
+ 'type' => 'Watchdog'
316
327
  }.merge attributes)
317
328
  end
318
329
  end
@@ -320,26 +331,27 @@ module RSMP
320
331
  class MessageAcking < Message
321
332
  attr_reader :original
322
333
 
323
- def self.build_from message
324
- return new({
325
- "oMId" => message.attributes["mId"]
326
- })
334
+ def self.build_from(message)
335
+ new({
336
+ 'oMId' => message.attributes['mId']
337
+ })
327
338
  end
328
339
 
329
- def original= message
340
+ def original=(message)
330
341
  raise InvalidArgument unless message
342
+
331
343
  @original = message
332
344
  end
333
345
 
334
- def validate_id
346
+ def validate_id?
335
347
  true
336
348
  end
337
349
  end
338
350
 
339
351
  class MessageAck < MessageAcking
340
- def initialize attributes = {}
352
+ def initialize(attributes = {})
341
353
  super({
342
- "type" => "MessageAck",
354
+ 'type' => 'MessageAck'
343
355
  }.merge attributes)
344
356
  end
345
357
 
@@ -349,69 +361,68 @@ module RSMP
349
361
  end
350
362
 
351
363
  class MessageNotAck < MessageAcking
352
- def initialize attributes = {}
364
+ def initialize(attributes = {})
353
365
  super({
354
- "type" => "MessageNotAck",
355
- "rea" => "Unknown reason"
366
+ 'type' => 'MessageNotAck',
367
+ 'rea' => 'Unknown reason'
356
368
  }.merge attributes)
357
- @attributes.delete "mId"
358
- end
369
+ @attributes.delete 'mId'
370
+ end
359
371
  end
360
372
 
361
373
  class CommandRequest < Message
362
- def initialize attributes = {}
374
+ def initialize(attributes = {})
363
375
  super({
364
- "type" => "CommandRequest",
376
+ 'type' => 'CommandRequest'
365
377
  }.merge attributes)
366
378
  end
367
379
  end
368
380
 
369
381
  class CommandResponse < Message
370
- def initialize attributes = {}
382
+ def initialize(attributes = {})
371
383
  super({
372
- "type" => "CommandResponse",
384
+ 'type' => 'CommandResponse'
373
385
  }.merge attributes)
374
386
  end
375
387
  end
376
388
 
377
389
  class StatusRequest < Message
378
- def initialize attributes = {}
390
+ def initialize(attributes = {})
379
391
  super({
380
- "type" => "StatusRequest",
392
+ 'type' => 'StatusRequest'
381
393
  }.merge attributes)
382
394
  end
383
395
  end
384
396
 
385
397
  class StatusResponse < Message
386
- def initialize attributes = {}
398
+ def initialize(attributes = {})
387
399
  super({
388
- "type" => "StatusResponse",
400
+ 'type' => 'StatusResponse'
389
401
  }.merge attributes)
390
402
  end
391
403
  end
392
404
 
393
405
  class StatusSubscribe < Message
394
- def initialize attributes = {}
406
+ def initialize(attributes = {})
395
407
  super({
396
- "type" => "StatusSubscribe",
408
+ 'type' => 'StatusSubscribe'
397
409
  }.merge attributes)
398
410
  end
399
411
  end
400
412
 
401
413
  class StatusUnsubscribe < Message
402
- def initialize attributes = {}
414
+ def initialize(attributes = {})
403
415
  super({
404
- "type" => "StatusUnsubscribe",
416
+ 'type' => 'StatusUnsubscribe'
405
417
  }.merge attributes)
406
418
  end
407
419
  end
408
420
 
409
421
  class StatusUpdate < Message
410
- def initialize attributes = {}
422
+ def initialize(attributes = {})
411
423
  super({
412
- "type" => "StatusUpdate",
424
+ 'type' => 'StatusUpdate'
413
425
  }.merge attributes)
414
426
  end
415
427
  end
416
-
417
- end
428
+ end
@@ -8,7 +8,7 @@ module RSMP
8
8
 
9
9
  attr_reader :archive, :logger, :task, :deferred, :error_queue, :clock, :collector
10
10
 
11
- def initialize options={}
11
+ def initialize(options = {})
12
12
  initialize_logging options
13
13
  initialize_task
14
14
  @deferred = []
@@ -24,55 +24,57 @@ module RSMP
24
24
 
25
25
  # stop proxies, then call super
26
26
  def stop_subtasks
27
- @proxies.each { |proxy| proxy.stop }
27
+ @proxies.each(&:stop)
28
28
  @proxies.clear
29
29
  super
30
30
  end
31
31
 
32
- def ignore_errors classes, &block
33
- was, @ignore_errors = @ignore_errors, [classes].flatten
32
+ def ignore_errors(classes)
33
+ was = @ignore_errors
34
+ @ignore_errors = [classes].flatten
34
35
  yield
35
36
  ensure
36
37
  @ignore_errors = was
37
38
  end
38
39
 
39
- def distribute_error e, options={}
40
- return if @ignore_errors.find { |klass| e.is_a? klass }
40
+ def distribute_error(error, options = {})
41
+ return if @ignore_errors.find { |klass| error.is_a? klass }
42
+
41
43
  if options[:level] == :internal
42
- log ["#{e.to_s} in task: #{Async::Task.current.to_s}",e.backtrace].flatten.join("\n"), level: :error
44
+ log ["#{error} in task: #{Async::Task.current}", error.backtrace].flatten.join("\n"),
45
+ level: :error
43
46
  end
44
- @error_queue.enqueue e
47
+ @error_queue.enqueue error
45
48
  end
46
49
 
47
- def defer key, item=nil
50
+ def defer(key, item = nil)
48
51
  @deferred << [key, item]
49
52
  end
50
53
 
51
54
  def process_deferred
52
- cloned = @deferred.clone # clone in case do_deferred restarts the current task
55
+ cloned = @deferred.clone # clone in case do_deferred restarts the current task
53
56
  @deferred.clear
54
57
  cloned.each do |pair|
55
58
  do_deferred pair.first, pair.last
56
59
  end
57
60
  end
58
61
 
59
- def do_deferred key,item=nil
60
- end
62
+ def do_deferred(key, item = nil); end
61
63
 
62
64
  def clear_deferred
63
65
  @deferred.clear
64
66
  end
65
67
 
66
- def check_required_settings settings, required
67
- raise ArgumentError.new "Settings is empty" unless settings
68
+ def check_required_settings(settings, required)
69
+ raise ArgumentError, 'Settings is empty' unless settings
70
+
68
71
  required.each do |setting|
69
- raise ArgumentError.new "Missing setting: #{setting}" unless settings.include? setting.to_s
72
+ raise ArgumentError, "Missing setting: #{setting}" unless settings.include? setting.to_s
70
73
  end
71
74
  end
72
75
 
73
76
  def author
74
77
  site_id
75
78
  end
76
-
77
79
  end
78
- end
80
+ end
@@ -16,7 +16,7 @@ module RSMP
16
16
  end
17
17
 
18
18
  def peek_line
19
- @peeked = read unless @peeked
19
+ @peeked ||= read
20
20
  @peeked
21
21
  end
22
22
 
@@ -24,12 +24,14 @@ module RSMP
24
24
  @stream.write(data + RSMP::Proxy::WRAPPING_DELIMITER)
25
25
  @stream.flush unless @stream.closed?
26
26
  end
27
-
27
+
28
28
  protected
29
+
29
30
  def read
30
31
  line = @stream.gets(RSMP::Proxy::WRAPPING_DELIMITER)
31
32
  return nil unless line
33
+
32
34
  line.chomp(RSMP::Proxy::WRAPPING_DELIMITER)
33
35
  end
34
36
  end
35
- end
37
+ end