xqsr3 0.8.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +27 -0
  3. data/README.md +26 -0
  4. data/lib/xqsr3/command_line_utilities/map_option_string.rb +137 -0
  5. data/lib/xqsr3/containers/frequency_map.rb +473 -0
  6. data/lib/xqsr3/containers/multi_map.rb +383 -0
  7. data/lib/xqsr3/diagnostics/exception_utilities.rb +216 -0
  8. data/lib/xqsr3/doc_.rb +116 -0
  9. data/lib/xqsr3/extensions/enumerable.rb +4 -0
  10. data/lib/xqsr3/extensions/enumerable/collect_with_index.rb +71 -0
  11. data/lib/xqsr3/extensions/enumerable/unique.rb +102 -0
  12. data/lib/xqsr3/extensions/io.rb +3 -0
  13. data/lib/xqsr3/extensions/io/writelines.rb +66 -0
  14. data/lib/xqsr3/extensions/kernel.rb +3 -0
  15. data/lib/xqsr3/extensions/kernel/raise_with_options.rb +68 -0
  16. data/lib/xqsr3/extensions/string.rb +5 -0
  17. data/lib/xqsr3/extensions/string/ends_with.rb +8 -0
  18. data/lib/xqsr3/extensions/string/map_option_string.rb +8 -0
  19. data/lib/xqsr3/extensions/string/starts_with.rb +8 -0
  20. data/lib/xqsr3/extensions/string/to_symbol.rb +8 -0
  21. data/lib/xqsr3/extensions/test/unit.rb +5 -0
  22. data/lib/xqsr3/extensions/test/unit/assert_eql.rb +18 -0
  23. data/lib/xqsr3/extensions/test/unit/assert_not.rb +18 -0
  24. data/lib/xqsr3/extensions/test/unit/assert_not_eql.rb +18 -0
  25. data/lib/xqsr3/io/writelines.rb +192 -0
  26. data/lib/xqsr3/quality/parameter_checking.rb +343 -0
  27. data/lib/xqsr3/string_utilities/ends_with.rb +134 -0
  28. data/lib/xqsr3/string_utilities/starts_with.rb +127 -0
  29. data/lib/xqsr3/string_utilities/to_symbol.rb +145 -0
  30. data/lib/xqsr3/version.rb +68 -0
  31. data/test/unit/command_line_utilities/tc_map_option_string.rb +39 -0
  32. data/test/unit/command_line_utilities/ts_all.rb +13 -0
  33. data/test/unit/containers/tc_frequency_map.rb +738 -0
  34. data/test/unit/containers/tc_multi_map.rb +640 -0
  35. data/test/unit/containers/ts_all.rb +13 -0
  36. data/test/unit/diagnostics/tc_exception_utilities.rb +221 -0
  37. data/test/unit/diagnostics/ts_all.rb +13 -0
  38. data/test/unit/extensions/enumerable/tc_collect_with_index.rb +36 -0
  39. data/test/unit/extensions/enumerable/tc_unique.rb +47 -0
  40. data/test/unit/extensions/enumerable/ts_all.rb +13 -0
  41. data/test/unit/extensions/io/tc_writelines.rb +110 -0
  42. data/test/unit/extensions/io/ts_all.rb +13 -0
  43. data/test/unit/extensions/kernel/tc_raise_with_options.rb +239 -0
  44. data/test/unit/extensions/kernel/ts_all.rb +13 -0
  45. data/test/unit/extensions/string/tc_ends_with.rb +70 -0
  46. data/test/unit/extensions/string/tc_map_option_string.rb +37 -0
  47. data/test/unit/extensions/string/tc_starts_with.rb +70 -0
  48. data/test/unit/extensions/string/tc_to_symbol.rb +51 -0
  49. data/test/unit/extensions/string/ts_all.rb +13 -0
  50. data/test/unit/extensions/ts_all.rb +13 -0
  51. data/test/unit/io/tc_writelines.rb +200 -0
  52. data/test/unit/io/ts_all.rb +13 -0
  53. data/test/unit/quality/tc_parameter_checking.rb +181 -0
  54. data/test/unit/quality/ts_all.rb +13 -0
  55. data/test/unit/tc_version.rb +37 -0
  56. data/test/unit/ts_all.rb +13 -0
  57. metadata +101 -0
@@ -0,0 +1,8 @@
1
+
2
+ require 'xqsr3/string_utilities/ends_with'
3
+
4
+ class String
5
+
6
+ include ::Xqsr3::StringUtilities::EndsWith
7
+ end # class String
8
+
@@ -0,0 +1,8 @@
1
+
2
+ require 'xqsr3/command_line_utilities/map_option_string'
3
+
4
+ class String
5
+
6
+ include ::Xqsr3::CommandLineUtilities::MapOptionString
7
+ end # class String
8
+
@@ -0,0 +1,8 @@
1
+
2
+ require 'xqsr3/string_utilities/starts_with'
3
+
4
+ class String
5
+
6
+ include ::Xqsr3::StringUtilities::StartsWith
7
+ end # class String
8
+
@@ -0,0 +1,8 @@
1
+
2
+ require 'xqsr3/string_utilities/to_symbol'
3
+
4
+ class String
5
+
6
+ include ::Xqsr3::StringUtilities::ToSymbol
7
+ end # class String
8
+
@@ -0,0 +1,5 @@
1
+
2
+ require 'xqsr3/extensions/test/unit/assert_eql'
3
+ require 'xqsr3/extensions/test/unit/assert_not'
4
+ require 'xqsr3/extensions/test/unit/assert_not_eql'
5
+
@@ -0,0 +1,18 @@
1
+
2
+ module Test
3
+ module Unit
4
+
5
+ module Assertions
6
+
7
+ unless respond_to? :assert_eql
8
+
9
+ def assert_eql(expected, actual, failure_message = '')
10
+
11
+ assert expected.eql?(actual), failure_message
12
+ end
13
+ end
14
+
15
+ end # class Assertions
16
+ end # module Unit
17
+ end # module Test
18
+
@@ -0,0 +1,18 @@
1
+
2
+ module Test
3
+ module Unit
4
+
5
+ module Assertions
6
+
7
+ unless respond_to? :assert_not
8
+
9
+ def assert_not(test, failure_message = '')
10
+
11
+ assert !(test), failure_message
12
+ end
13
+ end
14
+
15
+ end # class Assertions
16
+ end # module Unit
17
+ end # module Test
18
+
@@ -0,0 +1,18 @@
1
+
2
+ module Test
3
+ module Unit
4
+
5
+ module Assertions
6
+
7
+ unless respond_to? :assert_not_eql
8
+
9
+ def assert_not_eql(expected, actual, failure_message = '')
10
+
11
+ assert !(expected.eql?(actual)), failure_message
12
+ end
13
+ end
14
+
15
+ end # class Assertions
16
+ end # module Unit
17
+ end # module Test
18
+
@@ -0,0 +1,192 @@
1
+
2
+ # ######################################################################## #
3
+ # File: lib/xqsr3/io/writelines.rb
4
+ #
5
+ # Purpose: Adds a writelines() method to the IO module
6
+ #
7
+ # Created: 13th April 2007
8
+ # Updated: 10th June 2016
9
+ #
10
+ # Home: http://github.com/synesissoftware/xqsr3
11
+ #
12
+ # Author: Matthew Wilson
13
+ #
14
+ # Copyright (c) 2007-2016, Matthew Wilson and Synesis Software
15
+ # All rights reserved.
16
+ #
17
+ # Redistribution and use in source and binary forms, with or without
18
+ # modification, are permitted provided that the following conditions are
19
+ # met:
20
+ #
21
+ # * Redistributions of source code must retain the above copyright
22
+ # notice, this list of conditions and the following disclaimer.
23
+ #
24
+ # * Redistributions in binary form must reproduce the above copyright
25
+ # notice, this list of conditions and the following disclaimer in the
26
+ # documentation and/or other materials provided with the distribution.
27
+ #
28
+ # * Neither the names of the copyright holder nor the names of its
29
+ # contributors may be used to endorse or promote products derived from
30
+ # this software without specific prior written permission.
31
+ #
32
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
33
+ # IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
34
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
35
+ # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
36
+ # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
37
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
38
+ # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
39
+ # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
40
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
41
+ # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
42
+ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43
+ #
44
+ # ######################################################################## #
45
+
46
+
47
+ require 'xqsr3/quality/parameter_checking'
48
+
49
+ =begin
50
+ =end
51
+
52
+ module Xqsr3
53
+ module IO
54
+
55
+ private
56
+ module WriteLine_Constants_ #:nodoc:
57
+
58
+ NUMBER_OF_LINES_TO_EXAMINE = 20
59
+
60
+ end # module WriteLine_Constants_
61
+
62
+ private
63
+
64
+ def self.write_to_target_ target, contents, line_separator, column_separator
65
+ $stderr.puts "#{self.class}.write_to_target_(target(#{target.class})='#{target}', contents(#{contents.class})='#{contents}', line_separator(#{line_separator.class})='#{line_separator}', column_separator=(#{column_separator.class})='#{column_separator}')" if $DEBUG
66
+ if contents.instance_of? ::Hash
67
+
68
+ contents.each do |k, v|
69
+
70
+ target << "#{k}#{column_separator}#{v}#{line_separator}"
71
+ end
72
+ else
73
+
74
+ contents.each do |element|
75
+
76
+ target << "#{element}#{line_separator}"
77
+ end
78
+ end
79
+
80
+ contents.size
81
+ end
82
+
83
+ # This function checks to see if any part of the entries contains an
84
+ # embedded eol, in which case the empty string is returned to force no
85
+ # (additional) separator will be used. Otherwise, it returns "\n" to
86
+ # ensure that that is used.
87
+ def self.deduce_line_separator_ contents, eol_lookahead_limit
88
+
89
+ if contents.instance_of? ::Hash
90
+
91
+ contents.each_with_index do |k, v, index|
92
+
93
+ if eol_lookahead_limit && eol_lookahead_limit == index
94
+
95
+ break
96
+ else
97
+
98
+ return '' if v.to_s.include? "\n"
99
+ return '' if k.to_s.include? "\n"
100
+ end
101
+ end
102
+ else
103
+
104
+ contents.each_with_index do |element, index|
105
+
106
+ if eol_lookahead_limit && eol_lookahead_limit == index
107
+
108
+ break
109
+ else
110
+
111
+ return '' if element.to_s.include? "\n"
112
+ end
113
+ end
114
+ end
115
+
116
+ "\n"
117
+ end
118
+
119
+ public
120
+
121
+ # Writes the contents to the target, subject to the options
122
+ #
123
+ # === Signature
124
+ #
125
+ # * *Parameters*:
126
+ # - +target+:: The target of the write, which may be a string containing the path or a stream instance that supports write
127
+ # - +contents+:: The contents to be write, which may be a +Hash+, or an +Array+, or a +String+ containing delimited fields
128
+ # - +options+:: An options hash, containing any of the following options
129
+ #
130
+ # * *Options*:
131
+ # - +:column_separator+:: {optional} The column separator, to be applied between each field in the case where +contents+ is a +Hash+.
132
+ # - +:eol_lookahead_limit+:: {optional} The number of content elements (line/pair) to inspect to determine whether element has a terminating end-of-line sequence. Defaults to 20. If 0, and +:line_separator+ is not specified, then will default to <tt>"\n"</tt>. If +nil+, then every line will be inspected.
133
+ # - +:line_separator+:: {optional} The line separator, to be applied to the end of line created from each entry. When not specified, it will be deduced by inspecting +contents+ (according to +eol_lookahead_limit+).
134
+ #
135
+ # === Return
136
+ #
137
+ # The number of entries in +contents+
138
+ def self.writelines target, contents, options = {}
139
+
140
+ # validate parameters
141
+
142
+ ::Xqsr3::Quality::ParameterChecking.check_parameter(target, 'target', allow_nil: false) do |v|
143
+
144
+ raise TypeError, "#{self}#writeline() 'target' parameter must be a #{::String} or respond to <<" unless ::String === v || v.respond_to?(:<<)
145
+ true
146
+ end
147
+ ::Xqsr3::Quality::ParameterChecking.check_parameter(contents, 'contents', allow_nil: false, types: [ ::String, ::Hash, ::Array ])
148
+
149
+ # process parameters
150
+
151
+ if contents.instance_of? String
152
+
153
+ if contents.include? "\n"
154
+
155
+ contents = contents.split(/\r?\n/, -1)
156
+ else
157
+
158
+ contents = [ contents ]
159
+ end
160
+ end
161
+
162
+ options ||= {}
163
+ eol_lookahead_limit = options[:eol_lookahead_limit] || WriteLine_Constants_::NUMBER_OF_LINES_TO_EXAMINE
164
+ column_separator = options[:column_separator] || ''
165
+ line_separator = nil
166
+ line_separator ||= options[:line_separator]
167
+ line_separator ||= self.deduce_line_separator_(contents, eol_lookahead_limit) unless !eol_lookahead_limit.kind_of?(::Integer) || 0 == eol_lookahead_limit
168
+ line_separator ||= "\n"
169
+
170
+ if not contents.kind_of? ::Enumerable and not contents.instance_of? ::Hash
171
+
172
+ raise ArgumentError, "writelines() must be passed a #{::String}, or a #{::Hash}, or an #{::Enumerable} (or derived)"
173
+ end
174
+
175
+ # do the writing
176
+
177
+ if ::String === target
178
+
179
+ File.open(target, "w") do |io|
180
+
181
+ self.write_to_target_ io, contents, line_separator, column_separator
182
+ end
183
+ else
184
+
185
+ self.write_to_target_ target, contents, line_separator, column_separator
186
+ end
187
+ end # writelines
188
+ end # module IO
189
+ end # module Xqsr3
190
+
191
+ # ############################## end of file ############################# #
192
+
@@ -0,0 +1,343 @@
1
+
2
+ # ######################################################################## #
3
+ # File: lib/xqsr3/quality/parameter_checking.rb
4
+ #
5
+ # Purpose: Definition of the ParameterChecking module
6
+ #
7
+ # Created: 12th February 2015
8
+ # Updated: 10th June 2016
9
+ #
10
+ # Home: http://github.com/synesissoftware/xqsr3
11
+ #
12
+ # Author: Matthew Wilson
13
+ #
14
+ # Copyright (c) 2015-2016, Matthew Wilson and Synesis Software
15
+ # All rights reserved.
16
+ #
17
+ # Redistribution and use in source and binary forms, with or without
18
+ # modification, are permitted provided that the following conditions are
19
+ # met:
20
+ #
21
+ # * Redistributions of source code must retain the above copyright
22
+ # notice, this list of conditions and the following disclaimer.
23
+ #
24
+ # * Redistributions in binary form must reproduce the above copyright
25
+ # notice, this list of conditions and the following disclaimer in the
26
+ # documentation and/or other materials provided with the distribution.
27
+ #
28
+ # * Neither the names of the copyright holder nor the names of its
29
+ # contributors may be used to endorse or promote products derived from
30
+ # this software without specific prior written permission.
31
+ #
32
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
33
+ # IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
34
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
35
+ # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
36
+ # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
37
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
38
+ # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
39
+ # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
40
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
41
+ # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
42
+ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43
+ #
44
+ # ######################################################################## #
45
+
46
+
47
+ =begin
48
+ =end
49
+
50
+ module Xqsr3
51
+ module Quality
52
+
53
+ # Parameter-checking utilities
54
+ #
55
+ module ParameterChecking
56
+
57
+ # Check a given parameter (value=+value+, name=+name+) for type and value
58
+ #
59
+ # @param +value+ the parameter whose value and type is to be checked
60
+ # @param +name+ the name of the parameter to be checked
61
+ # @param +options+ options
62
+ #
63
+ # @option +:allow_nil+ the +value+ must not be +nil+ unless this option
64
+ # is true
65
+ # @option +:types+ an array of types one of which +value+ must be (or
66
+ # must be derived from)
67
+ # @option +:values+ an array of values one of which +value+ must be
68
+ # @option +:reject_empty+ requires value to respond to +empty?+
69
+ # message and to do so with false, unless +nil+
70
+ # @option +:require_empty+ requires value to respond to +empty?+
71
+ # message and to do so with true, unless +nil+
72
+ # @option +:nothrow+ causes failure to be indicated by a +nil+ return
73
+ # rather than a thrown exception
74
+ # @option +:message+ specifies a message to be used in any thrown
75
+ # exception, which suppresses internal message preparation
76
+ # @option +:treat_as_option+ if true, the value will be treated as an
77
+ # option when reporting check failure
78
+ def check_parameter value, name, options = {}, &block
79
+
80
+ failed_check = false
81
+ options ||= {}
82
+ message = options[:message]
83
+ treat_as_option = options[:treat_as_option]
84
+ return_value = value
85
+ param_s = treat_as_option ? 'option' : 'parameter'
86
+
87
+ warn "#{self}::check_parameter: invoked with non-string/non-symbol name: name.class=#{name.class}" unless name && [ ::String, ::Symbol ].any? { |c| name.is_a?(c) }
88
+
89
+ name = name.to_s if name.is_a?(::Symbol)
90
+ name = (':' + name.to_s) if treat_as_option and name.is_a?(::String)
91
+
92
+ # nil check
93
+
94
+ if value.nil? && !options[:allow_nil]
95
+
96
+ failed_check = true
97
+
98
+ unless options[:nothrow]
99
+
100
+ unless message
101
+
102
+ if name.nil?
103
+
104
+ message = "#{param_s} may not be nil"
105
+ else
106
+
107
+ message = "#{param_s} '#{name}' may not be nil"
108
+ end
109
+ end
110
+
111
+ raise ArgumentError, message
112
+ end
113
+ end
114
+
115
+ # check type(s)
116
+
117
+ unless value.nil?
118
+
119
+ types = options[:types] || []
120
+ types = [value.class] if types.empty?
121
+ type_found = false
122
+
123
+ warn "#{self}::check_parameter: options[:types] of type #{types.class} - should be #{::Array}" unless types.is_a?(Array)
124
+ warn "#{self}::check_parameter: options[:types] should contain only classes" if types.is_a?(Array) && !types.all? { |c| ::Class === c }
125
+
126
+ unless types.any? { |t| value.is_a?(t) }
127
+
128
+ failed_check = true
129
+
130
+ unless options[:nothrow]
131
+
132
+ unless message
133
+
134
+ s_name = name.is_a?(String) ? "'#{name}' " : ''
135
+
136
+ case types.size
137
+ when 1
138
+
139
+ s_types = "#{types[0]}"
140
+ when 2
141
+
142
+ s_types = "#{types[0]} or #{types[1]}"
143
+ else
144
+
145
+ s_types = "#{types[0...-1].join(', ')}, or #{types[-1]}"
146
+ end
147
+
148
+ message = "#{param_s} #{s_name}(#{value.class}) must be an instance of #{s_types}"
149
+ end
150
+
151
+ raise TypeError, message
152
+ end
153
+ end
154
+ end
155
+
156
+ # reject/require empty?
157
+
158
+ if options[:reject_empty]
159
+
160
+ warn "#{self}::check_parameter: value '#{value}' of type #{value.class} does not respond to empty?" unless value.respond_to? :empty?
161
+
162
+ if value.empty?
163
+
164
+ failed_check = true
165
+
166
+ unless options[:nothrow]
167
+
168
+ unless message
169
+ s_name = name.is_a?(String) ? "'#{name}' " : ''
170
+
171
+ message = "#{param_s} #{s_name}must not be empty"
172
+ end
173
+
174
+ raise ArgumentError, message
175
+ end
176
+ end
177
+ end
178
+
179
+ if options[:require_empty]
180
+
181
+ warn "#{self}::check_parameter: value '#{value}' of type #{value.class} does not respond to empty?" unless value.respond_to? :empty?
182
+
183
+ unless value.empty?
184
+
185
+ failed_check = true
186
+
187
+ unless options[:nothrow]
188
+
189
+ unless message
190
+ s_name = name.is_a?(String) ? "'#{name}' " : ''
191
+
192
+ message = "#{param_s} #{s_name}must be empty"
193
+ end
194
+
195
+ raise ArgumentError, message
196
+ end
197
+ end
198
+ end
199
+
200
+ # check value(s)
201
+
202
+ unless value.nil?
203
+
204
+ values = options[:values] || [ value ]
205
+
206
+ warn "#{self}::check_parameter: options[:values] of type #{values.class} - should be #{::Array}" unless values.is_a?(Array)
207
+
208
+ found = false
209
+
210
+ values.each do |v|
211
+
212
+ if ::Range === v && !(::Range === value) && v.cover?(value)
213
+
214
+ found = true
215
+ break
216
+ end
217
+
218
+ if value == v
219
+
220
+ found = true
221
+ break
222
+ end
223
+ end
224
+
225
+ unless found
226
+
227
+ failed_check = true
228
+
229
+ unless options[:nothrow]
230
+
231
+ unless message
232
+ s_name = name.is_a?(String) ? "'#{name}' " : ''
233
+
234
+ message = "#{param_s} #{s_name}value '#{value}' not found equal/within any of required values or ranges"
235
+ end
236
+
237
+ if value.is_a?(::Numeric)
238
+
239
+ raise RangeError, message
240
+ else
241
+
242
+ raise ArgumentError, message
243
+ end
244
+ end
245
+ end
246
+ end
247
+
248
+ # run block
249
+
250
+ if value and block
251
+
252
+ warn "#{self}::check_parameter: block arity must be 1" unless block.arity == 1
253
+
254
+ r = nil
255
+
256
+ begin
257
+
258
+ r = block.call(value)
259
+
260
+ rescue StandardError => x
261
+
262
+ xmsg = x.message || ''
263
+
264
+ if xmsg.empty?
265
+
266
+ xmsg ||= message
267
+
268
+ if xmsg.empty?
269
+
270
+ s_name = name.is_a?(String) ? "'#{name}' " : ''
271
+ xmsg = "#{param_s} #{s_name}failed validation against caller-supplied block"
272
+ end
273
+
274
+ raise $!, xmsg, $!.backtrace
275
+ end
276
+
277
+ raise
278
+ end
279
+
280
+ if r.is_a?(::Exception)
281
+
282
+ # An exception returned from the block, so raise it, with
283
+ # its message or a custom message
284
+
285
+ x = r
286
+ xmsg = x.message || ''
287
+
288
+ if xmsg.empty?
289
+
290
+ xmsg ||= message
291
+
292
+ if xmsg.empty?
293
+
294
+ s_name = name.is_a?(String) ? "'#{name}' " : ''
295
+ xmsg = "#{param_s} #{s_name}failed validation against caller-supplied block"
296
+ end
297
+
298
+ raise x, xmsg
299
+ end
300
+
301
+ raise x
302
+
303
+ elsif !r
304
+
305
+ failed_check = true
306
+
307
+ unless options[:nothrow]
308
+
309
+ s_name = name.is_a?(String) ? "'#{name}' " : ''
310
+ xmsg = "#{param_s} #{s_name}failed validation against caller-supplied block"
311
+
312
+ if value.is_a?(::Numeric)
313
+
314
+ raise RangeError, xmsg
315
+ else
316
+
317
+ raise ArgumentError, xmsg
318
+ end
319
+ end
320
+
321
+ elsif r.is_a?(::TrueClass)
322
+
323
+ ;
324
+ else
325
+
326
+ return_value = r
327
+ end
328
+ end
329
+
330
+ failed_check ? nil : return_value
331
+ end
332
+
333
+ alias check_param check_parameter
334
+
335
+ module_function :check_parameter
336
+
337
+ end # module ParameterChecking
338
+
339
+ end # module Quality
340
+ end # module Xqsr3
341
+
342
+ # ############################## end of file ############################# #
343
+