xqsr3 0.27.2 → 0.29.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/xqsr3/containers/frequency_map.rb +4 -8
- data/lib/xqsr3/diagnostics/exceptions/with_cause.rb +3 -1
- data/lib/xqsr3/diagnostics/inspect_builder.rb +176 -0
- data/lib/xqsr3/quality/parameter_checking.rb +98 -10
- data/lib/xqsr3/version.rb +2 -2
- data/test/unit/extensions/object/tc_inspect.rb +100 -0
- data/test/unit/extensions/object/ts_all.rb +12 -0
- data/test/unit/quality/tc_parameter_checking.rb +37 -0
- data/test/unit/string_utilities/tc_truncate.rb +50 -0
- data/test/unit/string_utilities/ts_all.rb +12 -0
- metadata +6 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 67a291e75a1f5250c92410e09cb8ce4afc2e706b
|
4
|
+
data.tar.gz: 17b2fd750488be59288a0ac67df35253455eadcd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e2210e3dfc465b1c899c5dff468349d5c1df6d24aeecf96fc2c9bcb7186d1dbb1923bee39ee1e940493bb4f16b9b70c4c74e21f23752cb7977267f8beb83c7ca
|
7
|
+
data.tar.gz: 83e3b052e816d7eaf90dc5e27c2c8565693fe84108456f8f0417fdc156ef7c2cd3b5953443b20ebd7c66c94cb59e65dc8416baf45e8aa312daa652e91a26e717
|
@@ -5,13 +5,13 @@
|
|
5
5
|
# Purpose: FrequencyMap container
|
6
6
|
#
|
7
7
|
# Created: 28th January 2005
|
8
|
-
# Updated:
|
8
|
+
# Updated: 13th October 2018
|
9
9
|
#
|
10
10
|
# Home: http://github.com/synesissoftware/xqsr3
|
11
11
|
#
|
12
12
|
# Author: Matthew Wilson
|
13
13
|
#
|
14
|
-
# Copyright (c) 2005-
|
14
|
+
# Copyright (c) 2005-2018, Matthew Wilson and Synesis Software
|
15
15
|
# All rights reserved.
|
16
16
|
#
|
17
17
|
# Redistribution and use in source and binary forms, with or without
|
@@ -225,13 +225,9 @@ class FrequencyMap
|
|
225
225
|
tm = {}
|
226
226
|
@counts.each do |element, frequency|
|
227
227
|
|
228
|
-
|
228
|
+
tm[frequency] = [] unless tm.has_key?(frequency)
|
229
229
|
|
230
|
-
|
231
|
-
else
|
232
|
-
|
233
|
-
tm[frequency].push element
|
234
|
-
end
|
230
|
+
tm[frequency].push element
|
235
231
|
end
|
236
232
|
|
237
233
|
keys = tm.keys.sort.reverse
|
@@ -5,7 +5,7 @@
|
|
5
5
|
# Purpose: Definition of the WithCause inclusion module
|
6
6
|
#
|
7
7
|
# Created: 16th December 2017
|
8
|
-
# Updated:
|
8
|
+
# Updated: 5th September 2018
|
9
9
|
#
|
10
10
|
# Home: http://github.com/synesissoftware/xqsr3
|
11
11
|
#
|
@@ -66,6 +66,8 @@ module Exceptions
|
|
66
66
|
#
|
67
67
|
module WithCause
|
68
68
|
|
69
|
+
INSPECT_HIDDEN_FIELDS = [ 'has_implicit_message', 'uses_cause_message' ]
|
70
|
+
|
69
71
|
# Defines an initializer for an exception class that allows a cause (aka
|
70
72
|
# an inner exception) to be specified, either as the first or last
|
71
73
|
# argument or as a +:cause+ option
|
@@ -0,0 +1,176 @@
|
|
1
|
+
|
2
|
+
# ######################################################################## #
|
3
|
+
# File: lib/xqsr3/diagnostics/inspect_builder.rb
|
4
|
+
#
|
5
|
+
# Purpose: ::Xqsr3::Diagnostics::InspectBuilder module
|
6
|
+
#
|
7
|
+
# Created: 4th September 2018
|
8
|
+
# Updated: 5th September 2018
|
9
|
+
#
|
10
|
+
# Home: http://github.com/synesissoftware/xqsr3
|
11
|
+
#
|
12
|
+
# Author: Matthew Wilson
|
13
|
+
#
|
14
|
+
# Copyright (c) 2018, 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/string_utilities/truncate'
|
48
|
+
|
49
|
+
=begin
|
50
|
+
=end
|
51
|
+
|
52
|
+
module Xqsr3
|
53
|
+
module Diagnostics
|
54
|
+
|
55
|
+
module InspectBuilder
|
56
|
+
|
57
|
+
module InspectBuilder_Utilities
|
58
|
+
|
59
|
+
NORMALISE_FUNCTION = lambda { |ar| ar.map { |v| v.to_s }.map { |v| '@' == v[0] ? v : "@#{v}" } }
|
60
|
+
end # module InspectBuilder_Utilities
|
61
|
+
|
62
|
+
#
|
63
|
+
# === Signature
|
64
|
+
#
|
65
|
+
# * *Parameters:*
|
66
|
+
# @param +o+:: The target of the +inspect+ message for which a message
|
67
|
+
# will be built
|
68
|
+
#
|
69
|
+
# * *Options:*
|
70
|
+
# @option +:no_class+:: (boolean) Elides the class qualification
|
71
|
+
# @option +:no_object_id+:: (boolean) Elides the object id
|
72
|
+
# @option +:show_fields+:: (boolean) Shows (all) object fields
|
73
|
+
# @option +:hidden_fields+:: ([ String ]) Names of fields to be omitted
|
74
|
+
# (when +:show_fields+ is specified). Overridden by +:shown_fields+
|
75
|
+
# @option +:shown_fields+:: ([ String ]) Names of fields to be shown
|
76
|
+
# (when +:show_fields+ is specified). Overrides +:hidden_fields+
|
77
|
+
# @option +:truncate_width+:: (Integer) Specifies a maximum width for
|
78
|
+
# the values of fields
|
79
|
+
# @option +:deep_inspect+:: (boolean) Causes fields' values to be
|
80
|
+
# obtained via their own +inspect+ methods
|
81
|
+
def self.make_inspect o, **options
|
82
|
+
|
83
|
+
r = ''
|
84
|
+
|
85
|
+
unless options[:no_class]
|
86
|
+
|
87
|
+
r += o.class.to_s
|
88
|
+
end
|
89
|
+
|
90
|
+
unless options[:no_object_id]
|
91
|
+
|
92
|
+
r += ':' unless r.empty?
|
93
|
+
r += "0x#{o.object_id.to_s.rjust(16, '0')}"
|
94
|
+
end
|
95
|
+
|
96
|
+
if options[:show_fields]
|
97
|
+
|
98
|
+
normalise = InspectBuilder_Utilities::NORMALISE_FUNCTION
|
99
|
+
|
100
|
+
hide_fields = normalise.call(options[:hidden_fields] || [])
|
101
|
+
show_fields = normalise.call(options[:shown_fields] || [])
|
102
|
+
trunc_w = options[:truncate_width]
|
103
|
+
ivars = normalise.call(o.instance_variables)
|
104
|
+
|
105
|
+
unless show_fields.empty?
|
106
|
+
|
107
|
+
ivars = ivars & show_fields
|
108
|
+
else
|
109
|
+
|
110
|
+
o.class.ancestors.each do |ancestor|
|
111
|
+
|
112
|
+
ihf_constant = :INSPECT_HIDDEN_FIELDS
|
113
|
+
|
114
|
+
if ancestor.const_defined? ihf_constant
|
115
|
+
|
116
|
+
ihfs = ancestor.const_get ihf_constant
|
117
|
+
|
118
|
+
if ::Array === ihfs && ihfs.all? { |c| ::String === c }
|
119
|
+
|
120
|
+
hide_fields += normalise.call(ihfs)
|
121
|
+
else
|
122
|
+
|
123
|
+
warn "class/module #{ancestor}'s #{ihf_constant} should be an array of strings"
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
ivars = ivars - hide_fields
|
129
|
+
end
|
130
|
+
|
131
|
+
els = ivars.sort.map do |iv_name|
|
132
|
+
|
133
|
+
iv_value = o.instance_variable_get(iv_name)
|
134
|
+
iv_class = iv_value.class
|
135
|
+
iv_value = ::Xqsr3::StringUtilities::Truncate.string_truncate(iv_value.to_s, trunc_w) if trunc_w
|
136
|
+
if options[:deep_inspect]
|
137
|
+
|
138
|
+
iv_value = iv_value.inspect
|
139
|
+
else
|
140
|
+
|
141
|
+
case iv_value
|
142
|
+
when ::Array
|
143
|
+
|
144
|
+
|
145
|
+
when ::String
|
146
|
+
|
147
|
+
iv_value = "'#{iv_value}'"
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
"#{iv_name}(#{iv_class})=#{iv_value}"
|
152
|
+
end.join('; ')
|
153
|
+
|
154
|
+
r += ': ' unless r.empty?
|
155
|
+
r += els
|
156
|
+
end
|
157
|
+
|
158
|
+
r = '#<' + r + '>'
|
159
|
+
|
160
|
+
r
|
161
|
+
end
|
162
|
+
|
163
|
+
# Creates an inspect string from self
|
164
|
+
def make_inspect **options
|
165
|
+
|
166
|
+
::Xqsr3::Diagnostics::InspectBuilder.make_inspect self, **options
|
167
|
+
end
|
168
|
+
|
169
|
+
end # module InspectBuilder
|
170
|
+
|
171
|
+
end # module Diagnostics
|
172
|
+
end # module Xqsr3
|
173
|
+
|
174
|
+
# ############################## end of file ############################# #
|
175
|
+
|
176
|
+
|
@@ -5,7 +5,7 @@
|
|
5
5
|
# Purpose: Definition of the ParameterChecking module
|
6
6
|
#
|
7
7
|
# Created: 12th February 2015
|
8
|
-
# Updated:
|
8
|
+
# Updated: 20th September 2018
|
9
9
|
#
|
10
10
|
# Home: http://github.com/synesissoftware/xqsr3
|
11
11
|
#
|
@@ -81,17 +81,18 @@ module ParameterChecking
|
|
81
81
|
RECOGNISED_OPTION_NAMES = %w{
|
82
82
|
|
83
83
|
allow_nil
|
84
|
+
ignore_case
|
85
|
+
message
|
84
86
|
nil
|
85
|
-
|
86
|
-
type
|
87
|
-
values
|
88
|
-
responds_to
|
87
|
+
nothrow
|
89
88
|
reject_empty
|
90
89
|
require_empty
|
91
|
-
|
92
|
-
message
|
90
|
+
responds_to
|
93
91
|
strip_str_whitespace
|
94
92
|
treat_as_option
|
93
|
+
type
|
94
|
+
types
|
95
|
+
values
|
95
96
|
}.map { |v| v.to_sym }
|
96
97
|
|
97
98
|
end # module Constants
|
@@ -114,6 +115,9 @@ module ParameterChecking
|
|
114
115
|
# @option +:allow_nil+:: (boolean) The +value+ must not be +nil+ unless
|
115
116
|
# this option is true
|
116
117
|
# @option +:nil+:: an alias for +:allow_nil+
|
118
|
+
# @option +:ignore_case+:: (boolean) When +:values+ is specified,
|
119
|
+
# comparisons of strings, or arrays of strings, will be carried out in
|
120
|
+
# a case-insensitive manner
|
117
121
|
# @option +:types+:: (::Array) An array of types one of which +value+
|
118
122
|
# must be (or must be derived from). One of these types may be
|
119
123
|
# an array of types, in which case +value+ may be an array that
|
@@ -182,6 +186,9 @@ module ParameterChecking
|
|
182
186
|
# @option +:allow_nil+:: (boolean) The +value+ must not be +nil+ unless
|
183
187
|
# this option is true
|
184
188
|
# @option +:nil+:: an alias for +:allow_nil+
|
189
|
+
# @option +:ignore_case+:: (boolean) When +:values+ is specified,
|
190
|
+
# comparisons of strings, or arrays of strings, will be carried out in
|
191
|
+
# a case-insensitive manner
|
185
192
|
# @option +:types+:: (::Array) An array of types one of which +value+ must
|
186
193
|
# be (or must be derived from). One of these types may be an
|
187
194
|
# array of types, in which case +value+ may be an array that
|
@@ -339,6 +346,7 @@ module ParameterChecking
|
|
339
346
|
types << options[:type] if types.empty?
|
340
347
|
end
|
341
348
|
types = [value.class] if types.empty?
|
349
|
+
types = types.map { |type| :boolean == type ? [ ::TrueClass, ::FalseClass ] : type }.flatten if types.include?(:boolean)
|
342
350
|
|
343
351
|
warn "#{self}::check_parameter: options[:types] of type #{types.class} - should be #{::Array}" unless types.is_a?(Array)
|
344
352
|
warn "#{self}::check_parameter: options[:types] - '#{types}' - should contain only classes or arrays of classes" if types.is_a?(::Array) && !types.all? { |c| ::Class === c || (::Array === c && c.all? { |c2| ::Class === c2 }) }
|
@@ -449,6 +457,7 @@ module ParameterChecking
|
|
449
457
|
unless options[:nothrow]
|
450
458
|
|
451
459
|
unless message
|
460
|
+
|
452
461
|
s_name = name.is_a?(String) ? "'#{name}' " : ''
|
453
462
|
|
454
463
|
message = "#{param_s} #{s_name}must be empty"
|
@@ -462,14 +471,32 @@ module ParameterChecking
|
|
462
471
|
|
463
472
|
# check value(s)
|
464
473
|
|
465
|
-
unless value.nil?
|
466
|
-
|
467
|
-
values = options[:values] || [ value ]
|
474
|
+
unless value.nil? || !(values = options[:values])
|
468
475
|
|
469
476
|
warn "#{self}::check_parameter: options[:values] of type #{values.class} - should be #{::Array}" unless values.is_a?(Array)
|
470
477
|
|
471
478
|
found = false
|
472
479
|
|
480
|
+
io = options[:ignore_order] && ::Array === value
|
481
|
+
|
482
|
+
do_case = options[:ignore_case] ? lambda do |v|
|
483
|
+
|
484
|
+
case v
|
485
|
+
when ::String
|
486
|
+
|
487
|
+
return :string
|
488
|
+
when ::Array
|
489
|
+
|
490
|
+
return :array_of_strings if v.all? { |s| ::String === s }
|
491
|
+
end
|
492
|
+
|
493
|
+
nil
|
494
|
+
end : lambda { |v| nil }
|
495
|
+
|
496
|
+
value_ic = do_case.call(value)
|
497
|
+
value_io = nil
|
498
|
+
value_uc = nil
|
499
|
+
|
473
500
|
values.each do |v|
|
474
501
|
|
475
502
|
if ::Range === v && !(::Range === value) && v.cover?(value)
|
@@ -483,6 +510,66 @@ module ParameterChecking
|
|
483
510
|
found = true
|
484
511
|
break
|
485
512
|
end
|
513
|
+
|
514
|
+
# ignore-case comparing
|
515
|
+
|
516
|
+
if value_ic
|
517
|
+
|
518
|
+
unless value_uc
|
519
|
+
|
520
|
+
case value_ic
|
521
|
+
when :string
|
522
|
+
|
523
|
+
value_uc = value.upcase
|
524
|
+
when :array_of_strings
|
525
|
+
|
526
|
+
value_uc = value.map { |s| s.upcase }
|
527
|
+
value_uc = value_uc.sort if io
|
528
|
+
end
|
529
|
+
end
|
530
|
+
|
531
|
+
v_ic = do_case.call(v)
|
532
|
+
|
533
|
+
if v_ic == value_ic
|
534
|
+
|
535
|
+
case v_ic
|
536
|
+
when :string
|
537
|
+
|
538
|
+
if value_uc == v.upcase
|
539
|
+
|
540
|
+
found = true
|
541
|
+
break
|
542
|
+
end
|
543
|
+
when :array_of_strings
|
544
|
+
|
545
|
+
v_uc = v.map { |s| s.upcase }
|
546
|
+
v_uc = v_uc.sort if io
|
547
|
+
|
548
|
+
if value_uc == v_uc
|
549
|
+
|
550
|
+
found = true
|
551
|
+
break
|
552
|
+
end
|
553
|
+
end
|
554
|
+
end
|
555
|
+
elsif io
|
556
|
+
|
557
|
+
unless value_io
|
558
|
+
|
559
|
+
value_io = value.sort
|
560
|
+
end
|
561
|
+
|
562
|
+
if ::Array === v
|
563
|
+
|
564
|
+
v_io = v.sort
|
565
|
+
|
566
|
+
if value_io == v_io
|
567
|
+
|
568
|
+
found = true
|
569
|
+
break
|
570
|
+
end
|
571
|
+
end
|
572
|
+
end
|
486
573
|
end
|
487
574
|
|
488
575
|
unless found
|
@@ -492,6 +579,7 @@ module ParameterChecking
|
|
492
579
|
unless options[:nothrow]
|
493
580
|
|
494
581
|
unless message
|
582
|
+
|
495
583
|
s_name = name.is_a?(String) ? "'#{name}' " : ''
|
496
584
|
|
497
585
|
message = "#{param_s} #{s_name}value '#{value}' not found equal/within any of required values or ranges"
|
data/lib/xqsr3/version.rb
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
# Purpose: Version for Xqsr3 library
|
6
6
|
#
|
7
7
|
# Created: 3rd April 2016
|
8
|
-
# Updated:
|
8
|
+
# Updated: 13th October 2018
|
9
9
|
#
|
10
10
|
# Home: http://github.com/synesissoftware/xqsr3
|
11
11
|
#
|
@@ -50,7 +50,7 @@
|
|
50
50
|
module Xqsr3
|
51
51
|
|
52
52
|
# Current version of the Xqsr3 library
|
53
|
-
VERSION = '0.
|
53
|
+
VERSION = '0.29.2'
|
54
54
|
|
55
55
|
private
|
56
56
|
VERSION_PARTS_ = VERSION.split(/[.]/).collect { |n| n.to_i } # :nodoc:
|
@@ -0,0 +1,100 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift File.join(File.dirname(__FILE__), '../../../../lib')
|
4
|
+
|
5
|
+
require 'xqsr3/diagnostics/inspect_builder'
|
6
|
+
|
7
|
+
require 'xqsr3/extensions/test/unit'
|
8
|
+
require 'test/unit'
|
9
|
+
|
10
|
+
class Test_X_Object_inspect < Test::Unit::TestCase
|
11
|
+
|
12
|
+
class Example1
|
13
|
+
|
14
|
+
include ::Xqsr3::Diagnostics::InspectBuilder
|
15
|
+
|
16
|
+
def initialize **inspect_options
|
17
|
+
|
18
|
+
@alphabet = 'abcdefghijklmnopqrstuvwxyz'
|
19
|
+
@letters = @alphabet.chars.map { |c| c.upcase }
|
20
|
+
@inspect_options = inspect_options
|
21
|
+
end
|
22
|
+
|
23
|
+
def inspect
|
24
|
+
|
25
|
+
make_inspect **@inspect_options
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class ExampleWithHiddenFields < Example1
|
30
|
+
|
31
|
+
INSPECT_HIDDEN_FIELDS = [ 'letters' ]
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_default_use
|
35
|
+
|
36
|
+
ex = Example1.new
|
37
|
+
|
38
|
+
assert_match /\A#<Test_X_Object_inspect::Example1:0x\d+>\z/, ex.inspect
|
39
|
+
|
40
|
+
ex2 = ExampleWithHiddenFields.new
|
41
|
+
|
42
|
+
assert_match /\A#<Test_X_Object_inspect::ExampleWithHiddenFields:0x\d+>\z/, ex2.inspect
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_no_class
|
46
|
+
|
47
|
+
ex = Example1.new(no_class: true)
|
48
|
+
|
49
|
+
assert_match /\A#<0x\d+>\z/, ex.inspect
|
50
|
+
|
51
|
+
ex2 = ExampleWithHiddenFields.new(no_class: true)
|
52
|
+
|
53
|
+
assert_match /\A#<0x\d+>\z/, ex2.inspect
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_no_object_id
|
57
|
+
|
58
|
+
ex = Example1.new(no_object_id: true)
|
59
|
+
|
60
|
+
assert_match /\A#<Test_X_Object_inspect::Example1>\z/, ex.inspect
|
61
|
+
|
62
|
+
ex2 = ExampleWithHiddenFields.new(no_object_id: true)
|
63
|
+
|
64
|
+
assert_match /\A#<Test_X_Object_inspect::ExampleWithHiddenFields>\z/, ex2.inspect
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_show_fields
|
68
|
+
|
69
|
+
ex = Example1.new(show_fields: true)
|
70
|
+
|
71
|
+
assert_match /\A#<Test_X_Object_inspect::Example1:0x\d+:\s*@alphabet\(String\)='abcdefghijklmnopqrstuvwxyz';\s*@inspect_options.*;\s*@letters.*>\z/, ex.inspect
|
72
|
+
|
73
|
+
ex2 = ExampleWithHiddenFields.new(show_fields: true)
|
74
|
+
|
75
|
+
assert_match /\A#<Test_X_Object_inspect::ExampleWithHiddenFields:0x\d+:\s*@alphabet\(String\)='abcdefghijklmnopqrstuvwxyz';\s*@inspect_options\(.+\)=[^;]+>\z/, ex2.inspect
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_show_fields_hidden
|
79
|
+
|
80
|
+
ex = Example1.new(show_fields: true, hidden_fields: [ 'inspect_options' ])
|
81
|
+
|
82
|
+
assert_match /\A#<Test_X_Object_inspect::Example1:0x\d+:\s*@alphabet\(String\)='abcdefghijklmnopqrstuvwxyz';\s*@letters.*>\z/, ex.inspect
|
83
|
+
|
84
|
+
ex2 = ExampleWithHiddenFields.new(show_fields: true, hidden_fields: [ 'inspect_options' ])
|
85
|
+
|
86
|
+
assert_match /\A#<Test_X_Object_inspect::ExampleWithHiddenFields:0x\d+:\s*@alphabet\(String\)='abcdefghijklmnopqrstuvwxyz'>\z/, ex2.inspect
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_show_fields_truncated
|
90
|
+
|
91
|
+
ex = Example1.new(show_fields: true, truncate_width: 10)
|
92
|
+
|
93
|
+
assert_match /\A#<Test_X_Object_inspect::Example1:0x\d+:\s*@alphabet\(String\)='abcdefg...';\s*@inspect_options.*;\s*@letters.*>\z/, ex.inspect
|
94
|
+
|
95
|
+
ex2 = ExampleWithHiddenFields.new(show_fields: true, truncate_width: 10)
|
96
|
+
|
97
|
+
assert_match /\A#<Test_X_Object_inspect::ExampleWithHiddenFields:0x\d+:\s*@alphabet\(String\)='abcdefg...';\s*@inspect_options.*>\z/, ex2.inspect
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# executes all other tests
|
4
|
+
|
5
|
+
this_dir = File.expand_path(File.dirname(__FILE__))
|
6
|
+
|
7
|
+
# all tc_*rb in current directory
|
8
|
+
Dir[File.join(this_dir, 'tc_*rb')].each { |file| require file }
|
9
|
+
|
10
|
+
# all ts_*rb in immediate sub-directories
|
11
|
+
Dir[File.join(this_dir, '*', 'ts_*rb')].each { |file| require file }
|
12
|
+
|
@@ -103,6 +103,7 @@ class Test_parameter_checks_as_included_module < Test::Unit::TestCase
|
|
103
103
|
def test_2
|
104
104
|
|
105
105
|
assert_equal true, check_method_2(true, [ ::TrueClass ])
|
106
|
+
assert_equal true, check_method_2(true, [ :boolean ])
|
106
107
|
assert_equal true, check_method_2(true, [ ::TrueClass, ::String, ::Symbol ])
|
107
108
|
assert_raise TypeError do
|
108
109
|
check_method_2(true, [ ::String, ::Symbol, ::FalseClass ])
|
@@ -568,5 +569,41 @@ end
|
|
568
569
|
|
569
570
|
assert_nil(check_parameter(nil, 'the_param', nil: true))
|
570
571
|
end
|
572
|
+
|
573
|
+
|
574
|
+
# test_ignore_case
|
575
|
+
|
576
|
+
def test_ignore_case
|
577
|
+
|
578
|
+
assert_not_nil check_parameter('TheString', 'the_param', values: [ 'TheString', 'the-string' ])
|
579
|
+
|
580
|
+
assert_raise_with_message(::ArgumentError, /parameter.*the_param.*not found.*values/) { check_parameter('THESTRING', 'the_param', values: [ 'TheString', 'the-string' ]) }
|
581
|
+
|
582
|
+
assert_not_nil check_parameter('TheString', 'the_param', values: [ 'THESTRING', 'the-string' ], ignore_case: true)
|
583
|
+
end
|
584
|
+
|
585
|
+
def test_ignore_case_in_array
|
586
|
+
|
587
|
+
assert_not_nil check_parameter([ 'abc', 'def' ], 'the_param', values: [ [ 'ABC', 'DEF' ], [ 'abc', 'def' ] ])
|
588
|
+
|
589
|
+
assert_raise_with_message(::ArgumentError, /parameter.*the_param.*not found.*values/) { check_parameter([ 'Abc', 'Def' ], 'the_param', values: [ [ 'ABC', 'DEF' ], [ 'abc', 'def' ] ]) }
|
590
|
+
|
591
|
+
assert_not_nil check_parameter([ 'Abc', 'Def' ], 'the_param', values: [ [ 'ABC', 'DEF' ], [ 'abc', 'def' ] ], ignore_case: true)
|
592
|
+
|
593
|
+
assert_raise_with_message(::ArgumentError, /parameter.*the_param.*not found.*values/) { check_parameter([ 'Def', 'Abc' ], 'the_param', values: [ [ 'ABC', 'DEF' ], [ 'abc', 'def' ] ], ignore_case: true) }
|
594
|
+
|
595
|
+
end
|
596
|
+
|
597
|
+
def test_ignore_case_and_order_in_array
|
598
|
+
|
599
|
+
assert_not_nil check_parameter([ 'Def', 'Abc', 'Ghi' ], 'the_param', values: [ [ 'GHI', 'ABC', 'DEF' ], [ 'ghi', 'abc', 'def' ] ], ignore_case: true, ignore_order: true)
|
600
|
+
end
|
601
|
+
|
602
|
+
def test_ignore_order_in_array
|
603
|
+
|
604
|
+
assert_raise(::ArgumentError) { check_parameter([ 'abc', 'def', 'ghi' ], 'the_param', values: [ [ 'ghi', 'def', 'abc' ], [ 'ghi', 'abc', 'def' ] ]) }
|
605
|
+
|
606
|
+
assert_not_nil check_parameter([ 'abc', 'def', 'ghi' ], 'the_param', values: [ [ 'ghi', 'def', 'abc' ], [ 'ghi', 'abc', 'def' ] ], ignore_order: true)
|
607
|
+
end
|
571
608
|
end
|
572
609
|
|
@@ -0,0 +1,50 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift File.join(File.dirname(__FILE__), *(['..'] * 3), 'lib')
|
4
|
+
|
5
|
+
require 'xqsr3/string_utilities/truncate'
|
6
|
+
|
7
|
+
require 'xqsr3/extensions/test/unit'
|
8
|
+
require 'test/unit'
|
9
|
+
|
10
|
+
class Test_StringUtilities_Truncate < ::Test::Unit::TestCase
|
11
|
+
|
12
|
+
Truncator = ::Xqsr3::StringUtilities::Truncate
|
13
|
+
|
14
|
+
def test_truncate_of_empty_string
|
15
|
+
|
16
|
+
assert_equal '', Truncator.string_truncate('', 0)
|
17
|
+
assert_equal '', Truncator.string_truncate('', 1)
|
18
|
+
assert_equal '', Truncator.string_truncate('', 10)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_truncate_of_smallest_string
|
22
|
+
|
23
|
+
assert_equal '', Truncator.string_truncate('a', 0)
|
24
|
+
assert_equal 'a', Truncator.string_truncate('a', 1)
|
25
|
+
assert_equal 'a', Truncator.string_truncate('a', 10)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_truncate_of_smaller_string
|
29
|
+
|
30
|
+
assert_equal '', Truncator.string_truncate('abc', 0)
|
31
|
+
assert_equal '.', Truncator.string_truncate('abc', 1)
|
32
|
+
assert_equal '..', Truncator.string_truncate('abc', 2)
|
33
|
+
assert_equal 'abc', Truncator.string_truncate('abc', 3)
|
34
|
+
assert_equal 'abc', Truncator.string_truncate('abc', 4)
|
35
|
+
assert_equal 'abc', Truncator.string_truncate('abc', 10)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_truncate_of_small_string
|
39
|
+
|
40
|
+
assert_equal '', Truncator.string_truncate('abcdefghijklmnopqrstuvwxyz', 0)
|
41
|
+
assert_equal '.', Truncator.string_truncate('abcdefghijklmnopqrstuvwxyz', 1)
|
42
|
+
assert_equal '..', Truncator.string_truncate('abcdefghijklmnopqrstuvwxyz', 2)
|
43
|
+
assert_equal '...', Truncator.string_truncate('abcdefghijklmnopqrstuvwxyz', 3)
|
44
|
+
assert_equal 'a...', Truncator.string_truncate('abcdefghijklmnopqrstuvwxyz', 4)
|
45
|
+
assert_equal 'abcdefg...', Truncator.string_truncate('abcdefghijklmnopqrstuvwxyz', 10)
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
end
|
50
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# executes all other tests
|
4
|
+
|
5
|
+
this_dir = File.expand_path(File.dirname(__FILE__))
|
6
|
+
|
7
|
+
# all tc_*rb in current directory
|
8
|
+
Dir[File.join(this_dir, 'tc_*rb')].each { |file| require file }
|
9
|
+
|
10
|
+
# all ts_*rb in immediate sub-directories
|
11
|
+
Dir[File.join(this_dir, '*', 'ts_*rb')].each { |file| require file }
|
12
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xqsr3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.29.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Wilson
|
@@ -29,6 +29,7 @@ files:
|
|
29
29
|
- lib/xqsr3/conversion/integer_parser.rb
|
30
30
|
- lib/xqsr3/diagnostics/exception_utilities.rb
|
31
31
|
- lib/xqsr3/diagnostics/exceptions/with_cause.rb
|
32
|
+
- lib/xqsr3/diagnostics/inspect_builder.rb
|
32
33
|
- lib/xqsr3/doc_.rb
|
33
34
|
- lib/xqsr3/extensions/array/join_with_or.rb
|
34
35
|
- lib/xqsr3/extensions/enumerable.rb
|
@@ -104,6 +105,8 @@ files:
|
|
104
105
|
- test/unit/extensions/kernel/tc_integer.rb
|
105
106
|
- test/unit/extensions/kernel/tc_raise_with_options.rb
|
106
107
|
- test/unit/extensions/kernel/ts_all.rb
|
108
|
+
- test/unit/extensions/object/tc_inspect.rb
|
109
|
+
- test/unit/extensions/object/ts_all.rb
|
107
110
|
- test/unit/extensions/string/tc_bool.tb
|
108
111
|
- test/unit/extensions/string/tc_ends_with.rb
|
109
112
|
- test/unit/extensions/string/tc_map_option_string.rb
|
@@ -127,6 +130,8 @@ files:
|
|
127
130
|
- test/unit/io/ts_all.rb
|
128
131
|
- test/unit/quality/tc_parameter_checking.rb
|
129
132
|
- test/unit/quality/ts_all.rb
|
133
|
+
- test/unit/string_utilities/tc_truncate.rb
|
134
|
+
- test/unit/string_utilities/ts_all.rb
|
130
135
|
- test/unit/tc_version.rb
|
131
136
|
- test/unit/ts_all.rb
|
132
137
|
- test/unit/xml/ts_all.rb
|