rsmp 0.2.2 → 0.2.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 55265e42f3956b7af530055680da60f82c84d34d7febd19286bf7c78bd2048f8
4
- data.tar.gz: 445498a67e24c6b63cbfceca009ad736e962717eb89e92239bdd7ad4870cf72f
3
+ metadata.gz: a57d963e9f3f6f4dccdfbfaf7bc2d4c09fcbae56d1ec886ed699faa373e054ed
4
+ data.tar.gz: 4035d49f738d335f94d4df8c9dd33a3744d258740e51df55be9da5998ce3e538
5
5
  SHA512:
6
- metadata.gz: '0854ca1835fc15e8ccd10059c3f6f30638daf54677d215799eabae0f87fa4de11c9f825319f10ba92f9d25052fc90927fb54eb9f5df19cb714ba9ead236effbf'
7
- data.tar.gz: 5d60090a4de455ca03fcb0fc182977ff938d0c8df9ea0bfb69d1dc985546c6de6ece83296bb25a64cc5f9e3b67d94e7694ec9702e08877bd6d9e05853d700ebd
6
+ metadata.gz: 94e7df5ad072745c960726053e0630b8b9efefc87c746a0f96afb53c32c4ff7450a553d3576a9ad9cd430640355e8ff329862cb4fd24da8338780e500f3c0245
7
+ data.tar.gz: 70b0a93eb41dca5cfabe62cacfb08f675fe2f359886bc4038aa647a95d873553b04056277ee08bac16476c441c7b6f646300179567fe2b33f58aa83121456b37
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rsmp (0.2.2)
4
+ rsmp (0.2.3)
5
5
  async (~> 1.29.1)
6
6
  async-io (~> 1.32.1)
7
7
  colorize (~> 0.8.1)
@@ -2,6 +2,113 @@
2
2
  module RSMP
3
3
  module SiteProxyWait
4
4
 
5
+ class Matcher
6
+ attr_reader :result, :messages
7
+
8
+ # Initialize with a list a wanted statuses
9
+ def initialize want, options={}
10
+ @want = want.clone
11
+ @result = {}
12
+ @messages = []
13
+ @m_id = options[:m_id]
14
+ end
15
+
16
+ # Check if a messages is wanted.
17
+ # Returns true when we found all that we want.
18
+ def process message
19
+ ack_status = check_not_ack message
20
+ return ack_status if ack_status != nil
21
+
22
+ add = false
23
+ @want.each_with_index do |query,i| # look through wanted
24
+ get_items(message).each do |input| # look through status items in message
25
+ matching = match? query, input
26
+ if matching == true
27
+ @result[query] = input
28
+ add = true
29
+ elsif matching == false
30
+ @result.delete query
31
+ end
32
+ end
33
+ end
34
+ @messages << message if add
35
+ @result.size == @want.size # queries left to match?
36
+ end
37
+
38
+ # Check for MessageNotAck
39
+ # If the original request identified by @m_id is rejected, we abort
40
+ def check_not_ack message
41
+ if message.is_a?(MessageNotAck)
42
+ if message.attribute('oMId') == @m_id
43
+ # Set result to an exception, but don't raise it.
44
+ # This will be returned by the async task and stored as the task result
45
+ # When the parent task call wait() on the task, the exception
46
+ # will be raised in the parent task, and caught by RSpec.
47
+ # RSpec will then show the error and record the test as failed
48
+ m_id_short = RSMP::Message.shorten_m_id @m_id, 8
49
+ @result = RSMP::MessageRejected.new("#{type_str} #{m_id_short} was rejected: #{message.attribute('rea')}")
50
+ @messages = [message]
51
+ return true
52
+ end
53
+ return false
54
+ end
55
+ end
56
+ end
57
+
58
+ class CommandResponseMatcher < RSMP::SiteProxyWait::Matcher
59
+ def initialize want, options={}
60
+ super
61
+ end
62
+
63
+ def type_str
64
+ "Command request"
65
+ end
66
+
67
+ def get_items message
68
+ message.attributes['rvs']
69
+ end
70
+
71
+ def match? query, item
72
+ return nil if query['cCI'] && query['cCI'] != item['cCI']
73
+ return nil if query['n'] && query['n'] != item['n']
74
+ if query['v'].is_a? Regexp
75
+ return false if query['v'] && item['v'] !~ query['v']
76
+ else
77
+ return false if query['v'] && item['v'] != query['v']
78
+ end
79
+ true
80
+ end
81
+ end
82
+
83
+ # Class for matching incoming messaging against a list of wanted statuses,
84
+ # and flagging when everything has been matched.
85
+ class StatusResponseMatcher < RSMP::SiteProxyWait::Matcher
86
+ def initialize want, options={}
87
+ super
88
+ end
89
+
90
+ def type_str
91
+ "Status request"
92
+ end
93
+
94
+ def get_items message
95
+ message.attributes['sS']
96
+ end
97
+
98
+ # Match an item against a query
99
+ def match? query, item
100
+ return nil if query['sCI'] && query['sCI'] != item['sCI']
101
+ return nil if query['n'] && query['n'] != item['n']
102
+ return false if query['q'] && query['q'] != item['q']
103
+ if query['s'].is_a? Regexp
104
+ return false if query['s'] && item['s'] !~ query['s']
105
+ else
106
+ return false if query['s'] && item['s'] != query['s']
107
+ end
108
+ true
109
+ end
110
+ end
111
+
5
112
  def wait_for_alarm parent_task, options={}
6
113
  matching_alarm = nil
7
114
  message = collect(parent_task,options.merge(type: "Alarm", with_message: true, num: 1)) do |message|
@@ -29,120 +136,26 @@ module RSMP
29
136
 
30
137
  def collect_command_responses parent_task, options, m_id
31
138
  task.annotate "wait for command response"
32
- want = options[:command_list].clone
33
- result = {}
34
- messages = []
35
- collect(parent_task,options.merge({
36
- type: ['CommandResponse','MessageNotAck'],
37
- num: 1
38
- })) do |message|
39
- if message.is_a?(MessageNotAck)
40
- if message.attribute('oMId') == m_id
41
- # set result to an exception, but don't raise it.
42
- # this will be returned by the task and stored as the task result
43
- # when the parent task call wait() on the task, the exception
44
- # will be raised in the parent task, and caught by rspec.
45
- # rspec will then show the error and record the test as failed
46
- m_id_short = RSMP::Message.shorten_m_id m_id, 8
47
- result = RSMP::MessageRejected.new "Command request #{m_id_short} was rejected: #{message.attribute('rea')}"
48
- next true # done, no more messages wanted
49
- else
50
- false
51
- end
52
- else
53
- add = false
54
- # look through querues
55
- want.each_with_index do |query,i|
56
- # look through items in message
57
- message.attributes['rvs'].each do |input|
58
- matching = command_match? query, input
59
- if matching == true
60
- result[query] = input
61
- add = true
62
- elsif matching == false
63
- result.delete query
64
- end
65
- end
66
- end
67
- messages << message if add
68
- result.size == want.size # any queries left to match?
69
- end
139
+ matcher = CommandResponseMatcher.new options[:command_list], m_id: m_id
140
+ collect(parent_task,options.merge(type: ['CommandResponse','MessageNotAck'], num: 1)) do |message|
141
+ matcher.process message # returns true when done (all queries matched)
70
142
  end
71
- return result, messages
143
+ return matcher.result, matcher.messages
72
144
  rescue Async::TimeoutError
73
145
  raise RSMP::TimeoutError.new "Did not receive correct command response to #{m_id} within #{options[:timeout]}s"
74
146
  end
75
147
 
76
148
  def collect_status_updates_or_responses task, type, options, m_id
77
- want = options[:status_list].clone
78
- result = {}
79
- messages = []
80
- # wait for a status update
81
- collect(task,options.merge({
82
- type: [type,'MessageNotAck'],
83
- num: 1
84
- })) do |message|
85
- if message.is_a?(MessageNotAck)
86
- if message.attribute('oMId') == m_id
87
- # set result to an exception, but don't raise it.
88
- # this will be returned by the task and stored as the task result
89
- # when the parent task call wait() on the task, the exception
90
- # will be raised in the parent task, and caught by rspec.
91
- # rspec will then show the error and record the test as failed
92
- m_id_short = RSMP::Message.shorten_m_id m_id, 8
93
- result = RSMP::MessageRejected.new "Status request #{m_id_short} was rejected: #{message.attribute('rea')}"
94
- next true # done, no more messages wanted
95
- end
96
- false
97
- else
98
- found = []
99
- add = false
100
- # look through querues
101
- want.each_with_index do |query,i|
102
- # look through status items in message
103
- message.attributes['sS'].each do |input|
104
- matching = status_match? query, input
105
- if matching == true
106
- result[query] = input
107
- add = true
108
- elsif matching == false
109
- result.delete query
110
- end
111
- end
112
- end
113
- messages << message if add
114
- result.size == want.size # any queries left to match?
115
- end
149
+ matcher = StatusResponseMatcher.new options[:status_list], m_id: m_id
150
+ collect(task,options.merge( type: [type,'MessageNotAck'], num: 1 )) do |message|
151
+ matcher.process message # returns true when done (all queries matched)
116
152
  end
117
- return result, messages
153
+ return matcher.result, matcher.messages
118
154
  rescue Async::TimeoutError
119
155
  type_str = {'StatusUpdate'=>'update', 'StatusResponse'=>'response'}[type]
120
156
  raise RSMP::TimeoutError.new "Did not received correct status #{type_str} in reply to #{m_id} within #{options[:timeout]}s"
121
157
  end
122
158
 
123
- def status_match? query, item
124
- return nil if query['sCI'] && query['sCI'] != item['sCI']
125
- return nil if query['n'] && query['n'] != item['n']
126
- return false if query['q'] && query['q'] != item['q']
127
- if query['s'].is_a? Regexp
128
- return false if query['s'] && item['s'] !~ query['s']
129
- else
130
- return false if query['s'] && item['s'] != query['s']
131
- end
132
- true
133
- end
134
-
135
- def command_match? query, item
136
- return nil if query['cCI'] && query['cCI'] != item['cCI']
137
- return nil if query['n'] && query['n'] != item['n']
138
- if query['v'].is_a? Regexp
139
- return false if query['v'] && item['v'] !~ query['v']
140
- else
141
- return false if query['v'] && item['v'] != query['v']
142
- end
143
- true
144
- end
145
-
146
159
  def wait_for_aggregated_status parent_task, options, m_id
147
160
  collect(parent_task,options.merge({
148
161
  type: ['AggregatedStatus','MessageNotAck'],
@@ -168,4 +181,4 @@ module RSMP
168
181
  end
169
182
 
170
183
  end
171
- end
184
+ end
data/lib/rsmp/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module RSMP
2
- VERSION = "0.2.2"
2
+ VERSION = "0.2.3"
3
3
  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.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emil Tin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-09-22 00:00:00.000000000 Z
11
+ date: 2021-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async