cli-proton-ruby 1.0.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.
@@ -0,0 +1,61 @@
1
+ #--
2
+ # Copyright 2017 Red Hat Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #++
16
+
17
+ require_relative 'basic_option_parser'
18
+
19
+ module Options
20
+
21
+ # Option parser of basic (see Options::BasicOptionParser) and specific
22
+ # options for connector client
23
+ # ==== Specific connector options
24
+ # count:: number of connections to create (default: DEFAULT_COUNT,
25
+ # see Defaults)
26
+ class ConnectorOptionParser < Options::BasicOptionParser
27
+
28
+ # Initialization and parsing of basic and specific connector options
29
+ # ==== Parameters
30
+ # args:: arguments to parse
31
+ def initialize(args)
32
+ # Initialization of basic options
33
+ super()
34
+ # Connector usage
35
+ @opt_parser.banner = "Usage: <connector_program> [OPTIONS]"
36
+
37
+ # Connector specific options with default values
38
+
39
+ # Number of connections option
40
+ @options.count = Defaults::DEFAULT_COUNT
41
+
42
+ # Number of messages
43
+ @opt_parser.on(
44
+ "-c",
45
+ "--count COUNT",
46
+ Integer,
47
+ "number of connections to create "+
48
+ "(default: #{Defaults::DEFAULT_COUNT})"
49
+ ) do |count|
50
+ @options.count = count
51
+ end
52
+
53
+ # Parse basic and specific options for connector client
54
+ parse(args)
55
+ end
56
+
57
+ end # class ConnectorOptionParser
58
+
59
+ end # module Options
60
+
61
+ # eof
@@ -0,0 +1,154 @@
1
+ #--
2
+ # Copyright 2017 Red Hat Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #++
16
+
17
+ require_relative 'sr_common_option_parser'
18
+ require_relative '../constants'
19
+ require_relative '../utils/string_utils'
20
+
21
+ module Options
22
+
23
+ # Option parser of basic (see Options::BasicOptionParser),
24
+ # common (see Options::SRCommonOptionParser)
25
+ # and specific options for receiver client
26
+ # ==== Specific receiver options
27
+ # count:: number of messages to receiver
28
+ # (default: DEFAULT_COUNT, see Defaults)
29
+ # process-reply-to:: send message to reply-to address if enabled
30
+ # and message got reply-to address
31
+ # recv-browse:: browse messages instead of reading
32
+ # (default: DEFAULT_BROWSE, see Defaults)
33
+ class ReceiverOptionParser < Options::SRCommonOptionParser
34
+
35
+ # Initialization and parsing of basic, common and specific receiver
36
+ # options
37
+ # ==== Parameters
38
+ # args:: arguments to parse
39
+ def initialize(args)
40
+ # Initialization of basic and common options
41
+ super()
42
+ # Receiver usage
43
+ @opt_parser.banner = "Usage: <receiver_program> [OPTIONS]"
44
+
45
+ # Receiver specific options with default values
46
+
47
+ # Number of messages option
48
+ @options.count = Defaults::DEFAULT_COUNT
49
+ # Credit for messages to be pre-fetched
50
+ @options.prefetch = Defaults::DEFAULT_PREFETCH
51
+ # Process reply to
52
+ @options.process_reply_to = Defaults::DEFAULT_PROC_REPLY_TO
53
+ # Browse messages
54
+ @options.browse = Defaults::DEFAULT_BROWSE
55
+ # Filter using selector
56
+ @options.selector = Defaults::DEFAULT_SELECTOR
57
+ # Receiver listen
58
+ @options.recv_listen = Defaults::DEFAULT_RECV_LISTEN
59
+ # Receiver listen port
60
+ @options.recv_listen_port = Defaults::DEFAULT_RECV_LISTEN_PORT
61
+
62
+ # Number of messages
63
+ @opt_parser.on(
64
+ "-c",
65
+ "--count COUNT",
66
+ Integer,
67
+ "number of messages to receiver "+
68
+ "(default: #{Defaults::DEFAULT_COUNT})"
69
+ ) do |count|
70
+ @options.count = count
71
+ end
72
+
73
+ # Prefetch
74
+ @opt_parser.on(
75
+ "--reactor-prefetch PREFETCH",
76
+ Integer,
77
+ "receiver's prefetch count "+
78
+ "(default: #{Defaults::DEFAULT_PREFETCH})"
79
+ ) do |prefetch|
80
+ @options.prefetch = prefetch
81
+ end
82
+
83
+ # Process reply to
84
+ @opt_parser.on(
85
+ "--process-reply-to",
86
+ "send message to reply-to address if enable and message got reply-to "+
87
+ "address",
88
+ ) do |process_reply_to|
89
+ @options.process_reply_to = process_reply_to
90
+ end
91
+
92
+ # Browse messages
93
+ @opt_parser.on(
94
+ "--recv-browse",
95
+ "browse messages instead of reading",
96
+ ) do |browse|
97
+ @options.browse = browse
98
+ end
99
+
100
+ # Filter messages
101
+ @opt_parser.on(
102
+ "--recv-selector SELECTOR",
103
+ "filter messages using a selector"
104
+ ) do |selector|
105
+ @options.selector = selector
106
+ end
107
+
108
+ # Receiver listen
109
+ @opt_parser.on(
110
+ "--recv-listen LISTEN",
111
+ Options::BOOLEAN_STRINGS,
112
+ "enable receiver listen (P2P) (#{Options::BOOLEAN_STRINGS.join("/")}, "+
113
+ "default: #{Defaults::DEFAULT_RECV_LISTEN})"
114
+ ) do |recv_listen|
115
+ @options.recv_listen = StringUtils.str_to_bool(recv_listen)
116
+ end
117
+
118
+ # Receiver listen port
119
+ @opt_parser.on(
120
+ "--recv-listen-port PORT",
121
+ Integer,
122
+ "define port for local listening "+
123
+ "(range: #{Constants::CONST_MIN_PORT_RANGE_VALUE}-"+
124
+ "#{Constants::CONST_MAX_PORT_RANGE_VALUE}, "+
125
+ "default: #{Defaults::DEFAULT_RECV_LISTEN_PORT})"
126
+ ) do |recv_listen_port|
127
+ if recv_listen_port < Constants::CONST_MIN_PORT_RANGE_VALUE \
128
+ or recv_listen_port > Constants::CONST_MAX_PORT_RANGE_VALUE
129
+ raise OptionParser::InvalidArgument, "#{recv_listen_port} "+
130
+ "(out of range: #{Constants::CONST_MIN_PORT_RANGE_VALUE}-"+
131
+ "#{Constants::CONST_MAX_PORT_RANGE_VALUE})"
132
+ end
133
+ @options.recv_listen_port = recv_listen_port
134
+ end
135
+
136
+ # Duration mode
137
+ @options.duration_mode = "before-receive"
138
+ duration_modes = %w(before-receive after-receive after-receive-action after-receive-tx-action)
139
+ @opt_parser.on(
140
+ "--duration-mode MODE", duration_modes,
141
+ "in use with --duration defines where to wait (allowed: #{duration_modes.join(', ')}, default: #{@options.duration_mode})"
142
+ ) do |d|
143
+ @options.duration_mode = d
144
+ end
145
+
146
+ # Parse basic, common and specific options for receiver client
147
+ parse(args)
148
+ end # initialize(args)
149
+
150
+ end # class ReceiverOptionParser
151
+
152
+ end # module Options
153
+
154
+ # eof
@@ -0,0 +1,365 @@
1
+ #--
2
+ # Copyright 2017 Red Hat Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #++
16
+
17
+ require_relative 'sr_common_option_parser'
18
+ require_relative '../utils/string_utils'
19
+
20
+ module Options
21
+
22
+ # Option parser of basic (see Options::BasicOptionParser),
23
+ # common (see Options::SRCommonOptionParser)
24
+ # and specific options for sender client
25
+ # ==== Specific sender options
26
+ # count:: number of messages to send (default: DEFAULT_COUNT, see Defaults)
27
+ # msg-content:: message content (default: DEFAULT_MSG_CONTENT,
28
+ # see Defaults)
29
+ # msg-content-map-item:: message content map item
30
+ # msg-content-list-item:: message content list item
31
+ # msg-durable:: message durability (default: DEFAULT_MSG_DURABLE)
32
+ # msg-ttl:: message Time-To-Live (ms) (default: DEFAULT_MSG_TTL)
33
+ # msg-correlation-id:: message correlation ID
34
+ # msg-reply-to:: address to send reply to
35
+ # msg-group-id:: message group ID
36
+ # msg-to:: message destination
37
+ class SenderOptionParser < Options::SRCommonOptionParser
38
+
39
+ # Initialization and parsing of basic, common and specific sender options
40
+ # ==== Parameters
41
+ # args:: arguments to parse
42
+ def initialize(args)
43
+ # Initialization of basic and common options
44
+ super()
45
+ # Sender usage
46
+ @opt_parser.banner = "Usage: <sender_program> [OPTIONS]"
47
+
48
+ # Sender specific options with default values
49
+
50
+ # Number of messages option
51
+ @options.count = Defaults::DEFAULT_COUNT
52
+ # Message property option
53
+ @options.msg_properties = Defaults::DEFAULT_MSG_PROPERTIES
54
+ # Message content option
55
+ @options.msg_content = Defaults::DEFAULT_MSG_CONTENT
56
+ # Message content type option
57
+ @options.msg_content_type = Defaults::DEFAULT_MSG_CONTENT_TYPE
58
+ # Content type option
59
+ @options.content_type = Defaults::DEFAULT_CONTENT_TYPE
60
+ # Message durability
61
+ @options.msg_durable = Defaults::DEFAULT_MSG_DURABLE
62
+ # Message TTL
63
+ @options.msg_ttl = Defaults::DEFAULT_MSG_TTL
64
+ # Message correlation ID option
65
+ @options.msg_correlation_id = Defaults::DEFAULT_CORR_ID
66
+ # Address to send reply to
67
+ @options.msg_reply_to = Defaults::DEFAULT_MSG_REPLY_TO
68
+ # Message group ID option
69
+ @options.msg_group_id = Defaults::DEFAULT_GROUP_ID
70
+ # Message priority option
71
+ @options.msg_priority = Defaults::DEFAULT_MSG_PRIORITY
72
+ # Message ID option
73
+ @options.msg_id = Defaults::DEFAULT_MSG_ID
74
+ # Message user ID option
75
+ @options.msg_user_id = Defaults::DEFAULT_MSG_USER_ID
76
+ # Message subject option
77
+ @options.msg_subject = Defaults::DEFAULT_MSG_SUBJECT
78
+ # Anonymous producer option
79
+ @options.anonymous = Defaults::DEFAULT_ANONYMOUS
80
+ # Message destination
81
+ @options.msg_to = Defaults::DEFAULT_TO
82
+
83
+ # List of blocks executed at the end of parsing
84
+ # when all other options are already applied
85
+ @do_last = []
86
+
87
+ # Number of messages
88
+ @opt_parser.on(
89
+ "-c",
90
+ "--count COUNT",
91
+ Integer,
92
+ "number of messages to send (default: #{Defaults::DEFAULT_COUNT})"
93
+ ) do |count|
94
+ @options.count = count
95
+ end
96
+
97
+ # Message content
98
+ @opt_parser.on(
99
+ "-m",
100
+ "--msg-content CONTENT",
101
+ String,
102
+ "message content (default: "+(
103
+ if Defaults::DEFAULT_MSG_CONTENT.nil?
104
+ "nil"
105
+ else
106
+ Defaults::DEFAULT_MSG_CONTENT
107
+ end
108
+ )+")"
109
+ ) do |msg_content|
110
+ @do_last << Proc.new {
111
+ @options.msg_content = manual_cast(@options.content_type, msg_content)
112
+ }
113
+ end
114
+
115
+ # Message content from file
116
+ @opt_parser.on(
117
+ "--msg-content-from-file FILE",
118
+ String,
119
+ "message content from file"
120
+ ) do |file|
121
+ @do_last << Proc.new {
122
+ @options.msg_content = manual_cast(@options.content_type, File.read(file))
123
+ }
124
+ end
125
+
126
+ # Message content type
127
+ @opt_parser.on(
128
+ "--msg-content-type TYPE",
129
+ String,
130
+ "AMQP message content type"
131
+ ) do |msg_content_type|
132
+ @options.msg_content_type = msg_content_type
133
+ end
134
+
135
+ # Content type
136
+ @opt_parser.on(
137
+ "--content-type TYPE",
138
+ %w(string int long float bool),
139
+ "cast --msg-content, -list-item, and =values of -map-item" +
140
+ "and --msg-property to this type (default: #{Defaults::DEFAULT_CONTENT_TYPE})"
141
+ ) do |content_type|
142
+ @options.content_type = content_type
143
+ end
144
+
145
+ # Message property
146
+ @opt_parser.on(
147
+ "-P",
148
+ "--msg-property KEY=VALUE",
149
+ String,
150
+ "property specified as KEY=VALUE (use '~' instead of '=' for auto-casting)"
151
+ ) do |msg_property|
152
+ _ = parse_kv(msg_property) # ensure correct option format
153
+ @do_last << Proc.new {
154
+ if @options.msg_properties.nil?
155
+ @options.msg_properties = {}
156
+ end
157
+
158
+ key, value = parse_kv(msg_property)
159
+ @options.msg_properties[key] = value
160
+ }
161
+ end
162
+ # Message map content
163
+ @opt_parser.on(
164
+ "-M",
165
+ "--msg-content-map-item KEY=VALUE",
166
+ String,
167
+ "map item specified as KEY=VALUE (use '~' instead of '=' for auto-casting)"
168
+ ) do |msg_content_map_item|
169
+ _ = parse_kv(msg_content_map_item) # ensure correct option format
170
+ @do_last << Proc.new {
171
+ if @options.msg_content.nil?
172
+ @options.msg_content = {}
173
+ end
174
+
175
+ key, value = parse_kv(msg_content_map_item)
176
+ @options.msg_content[key] = value
177
+ }
178
+ end
179
+
180
+ # Message list content
181
+ @opt_parser.on(
182
+ "-L",
183
+ "--msg-content-list-item VALUE",
184
+ "list item"
185
+ ) do |msg_content_list_item|
186
+ @do_last << Proc.new {
187
+ if @options.msg_content.nil?
188
+ @options.msg_content = []
189
+ end
190
+
191
+ if msg_content_list_item.start_with? "~"
192
+ value = msg_content_list_item[1..-1]
193
+ @options.msg_content.push(auto_cast(value))
194
+ else
195
+ @options.msg_content.push(
196
+ manual_cast(@options.content_type, msg_content_list_item))
197
+ end
198
+ }
199
+ end
200
+
201
+ # Message durability
202
+ @opt_parser.on(
203
+ "--msg-durable DURABILITY",
204
+ BOOLEAN_STRINGS,
205
+ "message durability (yes/no|True/False|true/false, default: "+
206
+ "#{Defaults::DEFAULT_MSG_DURABLE})"
207
+ ) do |msg_durable|
208
+ @options.msg_durable = StringUtils.str_to_bool(msg_durable)
209
+ end
210
+
211
+ # Message TTL
212
+ @opt_parser.on(
213
+ "--msg-ttl TTL",
214
+ Integer,
215
+ "message Time-To-Live (ms) (default: #{Defaults::DEFAULT_MSG_TTL})"
216
+ ) do |msg_ttl|
217
+ @options.msg_ttl = msg_ttl
218
+ end
219
+
220
+ # Message correlation id
221
+ @opt_parser.on(
222
+ "--msg-correlation-id ID",
223
+ String,
224
+ "message correlation ID"
225
+ ) do |msg_correlation_id|
226
+ @options.msg_correlation_id = msg_correlation_id
227
+ end
228
+
229
+ # Address to send reply to
230
+ @opt_parser.on(
231
+ "--msg-reply-to ADDRESS",
232
+ String,
233
+ "address to send reply to"
234
+ ) do |msg_reply_to|
235
+ @options.msg_reply_to = msg_reply_to
236
+ end
237
+
238
+ # Message group id
239
+ @opt_parser.on(
240
+ "--msg-group-id ID",
241
+ String,
242
+ "message group ID"
243
+ ) do |msg_group_id|
244
+ @options.msg_group_id = msg_group_id
245
+ end
246
+
247
+ # Message priority
248
+ @opt_parser.on(
249
+ "--msg-priority PRIORITY",
250
+ Integer,
251
+ "message priority"
252
+ ) do |msg_priority|
253
+ @options.msg_priority = msg_priority
254
+ end
255
+
256
+ # Message ID
257
+ @opt_parser.on(
258
+ "--msg-id ID",
259
+ String,
260
+ "message ID"
261
+ ) do |msg_id|
262
+ @options.msg_id = msg_id
263
+ end
264
+
265
+ # Message user ID
266
+ @opt_parser.on(
267
+ "--msg-user-id ID",
268
+ String,
269
+ "message user ID"
270
+ ) do |msg_user_id|
271
+ @options.msg_user_id = msg_user_id
272
+ end
273
+
274
+ # Message subject
275
+ @opt_parser.on(
276
+ "--msg-subject SUBJECT",
277
+ String,
278
+ "message subject"
279
+ ) do |msg_subject|
280
+ @options.msg_subject = msg_subject
281
+ end
282
+
283
+ # Anonymous producer
284
+ @opt_parser.on(
285
+ "--anonymous [ANONYMOUS]",
286
+ BOOLEAN_STRINGS,
287
+ "send message by connection level anonymous sender" +
288
+ " (default: #{Defaults::DEFAULT_ANONYMOUS})"
289
+ ) do |anonymous|
290
+ @options.anonymous = true
291
+ @options.anonymous = StringUtils.str_to_bool(anonymous) if anonymous
292
+ end
293
+
294
+ # Duration mode
295
+ duration_modes = %w(before-send after-send after-send-tx-action)
296
+ @options.duration_mode = "before-send"
297
+ @opt_parser.on(
298
+ "--duration-mode MODE", duration_modes,
299
+ "in use with --duration defines where to wait (allowed: #{duration_modes.join(', ')}, default: #{@options.duration_mode})"
300
+ ) do |d|
301
+ @options.duration_mode = d
302
+ end
303
+
304
+ # Destination
305
+ @opt_parser.on(
306
+ "--msg-to ADDRESS",
307
+ String,
308
+ "destination ADDRESS"
309
+ ) do |msg_to|
310
+ @options.msg_to = msg_to
311
+ end
312
+
313
+ # Parse basic, common and specific options for sender client
314
+ parse(args)
315
+ # Apply options which need to be applied last
316
+ @do_last.each { |proc| proc.call }
317
+ end # initialize
318
+
319
+ private
320
+ def parse_kv(key_value)
321
+ if key_value.include? "="
322
+ key, value = key_value.split("=")
323
+ value = "" if value.nil?
324
+ return key, manual_cast(@options.content_type, value)
325
+ elsif key_value.include? "~"
326
+ key, value = key_value.split("~")
327
+ return key, auto_cast(value)
328
+ else
329
+ raise OptionParser::InvalidArgument, "kv pair '#{key_value}' is of invalid format, = or ~ required"
330
+ end
331
+ end
332
+
333
+ private
334
+ def auto_cast(value)
335
+ if StringUtils.str_is_int?(value)
336
+ return value.to_i
337
+ elsif StringUtils.str_is_float?(value)
338
+ return value.to_f
339
+ elsif StringUtils.str_is_bool?(value)
340
+ return StringUtils.str_to_bool(value)
341
+ end
342
+ return value
343
+ end
344
+
345
+ private
346
+ def manual_cast(type, value)
347
+ case type
348
+ when "int"
349
+ return Integer(value)
350
+ when "float"
351
+ return Float(value)
352
+ when "long"
353
+ return Integer(value)
354
+ when "bool"
355
+ return StringUtils.str_to_bool(value)
356
+ else
357
+ return value
358
+ end
359
+ end
360
+
361
+ end # class SenderOptionParser
362
+
363
+ end # module Options
364
+
365
+ # eof