testability-driver 1.0.4 → 1.1.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.
- data/bin/tdriver-devtools +0 -0
- data/config/sut_setup.rb +32 -0
- data/config/sut_teardown.rb +32 -0
- data/ext/extconf.rb +3 -1
- data/lib/tdriver-devtools/behaviour/old/xml/update +0 -0
- data/lib/tdriver-devtools/behaviour/xml/generate.rb +0 -0
- data/lib/tdriver-devtools/doc/update +0 -0
- data/lib/tdriver-devtools/doc/xslt/update +0 -0
- data/lib/tdriver-devtools/tdriver-devtools.rb +0 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/application_closable_0x3f.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/application_close.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/application_environment.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/application_executable_name.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/application_uid.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/created.rid +1 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/find_find.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/flash_behaviour_flash.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/flash_behaviour_flash_images.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_application.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_capture_screen.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_child.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_clear_verify_blocks.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_connect.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_controller_execution_order.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_controller_execution_order_0x3d.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_current_application_id.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_disconnect.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_dump_count.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_freeze.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_frozen.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_get_application_id.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_get_object.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_get_operator_data.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_get_ui_dump.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_get_user_information.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_input.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_parameter.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_press_key.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_received_data.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_refresh.feature +20 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_refresh_timeout.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_refresh_tries.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_refresh_ui_dump.feature +20 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_run.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_sent_data.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_state.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_translate.feature +30 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_ui_type.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_ui_version.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_unfreeze.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_update.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_verify_always.feature +20 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_verify_blocks.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_x_path.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_xml_data.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_xml_data_0x3d.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_xml_data_crc.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/switchbox_behaviour_power_down.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/switchbox_behaviour_power_status.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/switchbox_behaviour_power_up.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/switchbox_behaviour_reset.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/verification_test_object_exists_0x3f.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/update +0 -0
- data/lib/tdriver/base/behaviour/behaviours/object_composition.rb +4 -4
- data/lib/tdriver/base/behaviour/factory.rb +8 -0
- data/lib/tdriver/base/sut/generic/behaviours/application.rb +24 -3
- data/lib/tdriver/base/sut/generic/behaviours/sut.rb +465 -354
- data/lib/tdriver/base/test_object/adapter.rb +2 -2
- data/lib/tdriver/base/test_object/behaviours/test_object.rb +22 -5
- data/lib/tdriver/base/test_object/cache.rb +1 -1
- data/lib/tdriver/base/test_object/factory.rb +23 -3
- data/lib/tdriver/env.rb +0 -0
- data/lib/tdriver/loader.rb +0 -0
- data/lib/tdriver/matti.rb +0 -0
- data/lib/tdriver/report/error_recovery/tdriver_error_recovery.rb +22 -24
- data/lib/tdriver/report/report.rb +8 -1
- data/lib/tdriver/report/report_api.rb +18 -0
- data/lib/tdriver/report/report_combine.rb +1 -1
- data/lib/tdriver/report/report_creator.rb +5 -1
- data/lib/tdriver/report/report_execution_statistics.rb +105 -78
- data/lib/tdriver/report/report_test_case_run.rb +2 -1
- data/lib/tdriver/report/report_test_run.rb +187 -116
- data/lib/tdriver/report/report_writer.rb +49 -29
- data/lib/tdriver/tdriver.rb +14 -3
- data/lib/tdriver/util/common/exception.rb +53 -0
- data/lib/tdriver/util/common/hash.rb +79 -23
- data/lib/tdriver/util/common/numeric.rb +26 -5
- data/lib/tdriver/util/common/object.rb +44 -15
- data/lib/tdriver/util/common/string.rb +4 -1
- data/lib/tdriver/util/filters/dynamic_attributes.rb +2 -1
- data/lib/tdriver/util/keymap/keymap.rb +81 -0
- data/lib/tdriver/util/loader.rb +4 -1
- data/lib/tdriver/util/logger/logger.rb +17 -9
- data/lib/tdriver/util/other/config.rb +0 -0
- data/lib/tdriver/util/parameter/error.rb +3 -0
- data/lib/tdriver/util/parameter/loader.rb +6 -1
- data/lib/tdriver/util/parameter/parameter.rb +87 -14
- data/lib/tdriver/util/parameter/parameter_new.rb +869 -0
- data/lib/tdriver/util/parameter/parameter_template.rb +2 -2
- data/lib/tdriver/util/parameter/parameter_user_api.rb +27 -3
- data/lib/tdriver/util/parameter/parameter_xml.rb +36 -38
- data/lib/tdriver/version.rb +1 -1
- data/xml/templates/generic.xml +4 -10
- metadata +196 -138
data/lib/tdriver/tdriver.rb
CHANGED
|
@@ -57,7 +57,7 @@ module TDriver
|
|
|
57
57
|
# ArgumentError:: SUT type not defined
|
|
58
58
|
# ArgumentError:: SUT type '%s' not supported
|
|
59
59
|
# ArgumentError:: Sut id not given
|
|
60
|
-
# MobyUtil::ParameterFileNotFoundError:: if paramter file
|
|
60
|
+
# MobyUtil::ParameterFileNotFoundError:: if paramter file (tdriver_parameters.xml in TDriver home directory) is not found
|
|
61
61
|
# === returns
|
|
62
62
|
# Object:: Object that SutFactory returns
|
|
63
63
|
# === example
|
|
@@ -115,10 +115,18 @@ module TDriver
|
|
|
115
115
|
end
|
|
116
116
|
|
|
117
117
|
# Wrapper for MobyUtil::ParameterUserAPI class with methods e.g. [] and []=, files and load_xml etc.
|
|
118
|
-
def self.parameter
|
|
118
|
+
def self.parameter( *arguments )
|
|
119
119
|
|
|
120
|
-
|
|
120
|
+
if arguments.count == 0
|
|
121
121
|
|
|
122
|
+
$parameters_api
|
|
123
|
+
|
|
124
|
+
else
|
|
125
|
+
|
|
126
|
+
$parameters_api[ *arguments ]
|
|
127
|
+
|
|
128
|
+
end
|
|
129
|
+
|
|
122
130
|
end
|
|
123
131
|
|
|
124
132
|
# Wrapper for MobyUtil::Logger class
|
|
@@ -133,6 +141,9 @@ module TDriver
|
|
|
133
141
|
|
|
134
142
|
end # TDriver
|
|
135
143
|
|
|
144
|
+
# initialize parameters
|
|
145
|
+
$parameters.init
|
|
146
|
+
|
|
136
147
|
# enable logging engine
|
|
137
148
|
$logger.enable_logging
|
|
138
149
|
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
############################################################################
|
|
2
|
+
##
|
|
3
|
+
## Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
|
4
|
+
## All rights reserved.
|
|
5
|
+
## Contact: Nokia Corporation (testabilitydriver@nokia.com)
|
|
6
|
+
##
|
|
7
|
+
## This file is part of Testability Driver.
|
|
8
|
+
##
|
|
9
|
+
## If you have questions regarding the use of this file, please contact
|
|
10
|
+
## Nokia at testabilitydriver@nokia.com .
|
|
11
|
+
##
|
|
12
|
+
## This library is free software; you can redistribute it and/or
|
|
13
|
+
## modify it under the terms of the GNU Lesser General Public
|
|
14
|
+
## License version 2.1 as published by the Free Software Foundation
|
|
15
|
+
## and appearing in the file LICENSE.LGPL included in the packaging
|
|
16
|
+
## of this file.
|
|
17
|
+
##
|
|
18
|
+
############################################################################
|
|
19
|
+
|
|
20
|
+
class Exception
|
|
21
|
+
|
|
22
|
+
# TODO: document me
|
|
23
|
+
def nested_backtrace
|
|
24
|
+
|
|
25
|
+
if backtrace
|
|
26
|
+
|
|
27
|
+
_backtrace = backtrace.dup
|
|
28
|
+
|
|
29
|
+
begin
|
|
30
|
+
|
|
31
|
+
_backtrace[ 0 ] = "#{ _backtrace.first.to_s } raised #{ self.class.name }: #{ message.to_s }"
|
|
32
|
+
|
|
33
|
+
_backtrace.unshift( caller.first )
|
|
34
|
+
|
|
35
|
+
rescue
|
|
36
|
+
|
|
37
|
+
# exception raised, do not alter backtrace
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
else
|
|
42
|
+
|
|
43
|
+
# no backtrace available
|
|
44
|
+
_backtrace = []
|
|
45
|
+
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# return backtrace array
|
|
49
|
+
_backtrace
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end # Exception
|
|
@@ -22,7 +22,9 @@ class Hash
|
|
|
22
22
|
|
|
23
23
|
def not_empty( message = "Hash must not be empty", exception = ArgumentError )
|
|
24
24
|
|
|
25
|
-
raise exception
|
|
25
|
+
raise exception, message if empty?
|
|
26
|
+
|
|
27
|
+
self
|
|
26
28
|
|
|
27
29
|
end
|
|
28
30
|
|
|
@@ -30,27 +32,30 @@ class Hash
|
|
|
30
32
|
def require_key( keys, message = "None of key(s) $1 found from hash" )
|
|
31
33
|
|
|
32
34
|
# create array of types
|
|
33
|
-
keys_array =
|
|
35
|
+
keys_array = Array( keys )
|
|
34
36
|
|
|
35
37
|
found = false
|
|
36
38
|
|
|
37
39
|
verbose_keys_list = keys_array.each_with_index.collect{ | key, index |
|
|
38
40
|
|
|
39
|
-
|
|
41
|
+
if has_key?( key )
|
|
42
|
+
found = true
|
|
43
|
+
break
|
|
44
|
+
end
|
|
40
45
|
|
|
41
46
|
# result string, separate types if multiple types given
|
|
42
47
|
"#{ ( ( index > 0 ) ? ( index + 1 < keys_array.count ? ", " : " or " ) : "" ) }#{ key.inspect }"
|
|
43
48
|
|
|
44
|
-
}
|
|
49
|
+
}
|
|
45
50
|
|
|
46
51
|
# raise exception if type did not match
|
|
47
52
|
unless found
|
|
48
53
|
|
|
49
54
|
# convert macros
|
|
50
|
-
[ verbose_keys_list ].each_with_index{ | param, index | message.gsub!( "$#{ index + 1 }", param.to_s ) }
|
|
55
|
+
[ verbose_keys_list.join ].each_with_index{ | param, index | message.gsub!( "$#{ index + 1 }", param.to_s ) }
|
|
51
56
|
|
|
52
57
|
# raise the exception
|
|
53
|
-
raise ArgumentError
|
|
58
|
+
raise ArgumentError, message
|
|
54
59
|
|
|
55
60
|
end
|
|
56
61
|
|
|
@@ -62,27 +67,27 @@ class Hash
|
|
|
62
67
|
def require_keys( keys, message = "Required key(s) $1 not found from hash" )
|
|
63
68
|
|
|
64
69
|
# create array of types
|
|
65
|
-
keys_array =
|
|
70
|
+
keys_array = Array( keys )
|
|
66
71
|
|
|
67
72
|
found = true
|
|
68
73
|
|
|
69
74
|
verbose_keys_list = keys_array.each_with_index.collect{ | key, index |
|
|
70
75
|
|
|
71
|
-
found = false unless
|
|
76
|
+
found = false unless has_key?( key )
|
|
72
77
|
|
|
73
78
|
# result string, separate types if multiple types given
|
|
74
79
|
"#{ ( ( index > 0 ) ? ( index + 1 < keys_array.count ? ", " : " and " ) : "" ) }#{ key.inspect }"
|
|
75
80
|
|
|
76
|
-
}
|
|
81
|
+
}
|
|
77
82
|
|
|
78
83
|
# raise exception if type did not match
|
|
79
84
|
unless found
|
|
80
85
|
|
|
81
86
|
# convert macros
|
|
82
|
-
[ verbose_keys_list ].each_with_index{ | param, index | message.gsub!( "$#{ index + 1 }", param.to_s ) }
|
|
87
|
+
[ verbose_keys_list.join ].each_with_index{ | param, index | message.gsub!( "$#{ index + 1 }", param.to_s ) }
|
|
83
88
|
|
|
84
89
|
# raise the exception
|
|
85
|
-
raise ArgumentError
|
|
90
|
+
raise ArgumentError, message
|
|
86
91
|
|
|
87
92
|
end
|
|
88
93
|
|
|
@@ -93,16 +98,20 @@ class Hash
|
|
|
93
98
|
# collect given keypairs from hash
|
|
94
99
|
def collect_keys( *keys )
|
|
95
100
|
|
|
96
|
-
Hash[ self.select{ | key, value | true if keys.include?( key ) } ]
|
|
101
|
+
#Hash[ self.select{ | key, value | true if keys.include?( key ) } ]
|
|
97
102
|
|
|
103
|
+
# optimized version, approx 47.9% faster
|
|
104
|
+
keys.inject( {} ){ | hash, key | hash[ key ] = self[ key ] if has_key?( key ); hash }
|
|
105
|
+
|
|
98
106
|
end
|
|
99
107
|
|
|
100
108
|
# remove keys from hash, return hash of deleted keys as result
|
|
101
109
|
def delete_keys!( *keys )
|
|
102
110
|
|
|
103
|
-
|
|
111
|
+
#Hash[ keys.flatten.collect{ | key | [ key, delete( key ) ] if has_key?( key ) }.compact ]
|
|
104
112
|
|
|
105
|
-
|
|
113
|
+
# optimized version, approx 23.4% faster
|
|
114
|
+
keys.inject( {} ){ | hash, key | hash[ key ] = delete( key ) if has_key?( key ); hash }
|
|
106
115
|
|
|
107
116
|
end
|
|
108
117
|
|
|
@@ -110,22 +119,17 @@ class Hash
|
|
|
110
119
|
def delete_keys( *keys )
|
|
111
120
|
|
|
112
121
|
# create a duplicate of current hash
|
|
113
|
-
result = dup
|
|
122
|
+
result = dup; keys.flatten.each{ | key | result.delete( key ) }; result
|
|
114
123
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
result
|
|
124
|
+
# optimized version, approx 5% faster
|
|
125
|
+
#keys.inject( dup ){ | hash, key | hash.delete( key ); hash }
|
|
118
126
|
|
|
119
127
|
end
|
|
120
128
|
|
|
121
129
|
# store keys and values to hash if not already defined
|
|
122
130
|
def default_values( hash )
|
|
123
131
|
|
|
124
|
-
hash.each_pair{ | key, value |
|
|
125
|
-
|
|
126
|
-
self[ key ] = value unless has_key?( key )
|
|
127
|
-
|
|
128
|
-
}
|
|
132
|
+
hash.each_pair{ | key, value | self[ key ] = value unless has_key?( key ) }
|
|
129
133
|
|
|
130
134
|
self
|
|
131
135
|
|
|
@@ -142,6 +146,7 @@ class Hash
|
|
|
142
146
|
|
|
143
147
|
def strip_dynamic_attributes!
|
|
144
148
|
|
|
149
|
+
=begin
|
|
145
150
|
# remove dynamic attributes from hash and return as result
|
|
146
151
|
Hash[
|
|
147
152
|
|
|
@@ -167,7 +172,58 @@ class Hash
|
|
|
167
172
|
}
|
|
168
173
|
|
|
169
174
|
]
|
|
175
|
+
=end
|
|
176
|
+
|
|
177
|
+
# optimized version, approx 3.2% faster
|
|
178
|
+
prefix = '__'
|
|
179
|
+
|
|
180
|
+
keys.inject( {} ){ | hash, key |
|
|
181
|
+
|
|
182
|
+
hash[ key ] = delete( key ) if key.to_s[0..1] == prefix
|
|
183
|
+
|
|
184
|
+
hash
|
|
185
|
+
|
|
186
|
+
}
|
|
170
187
|
|
|
171
188
|
end # strip_dynamic_attributes!
|
|
172
189
|
|
|
190
|
+
# TODO: document me
|
|
191
|
+
def recursive_merge( other )
|
|
192
|
+
|
|
193
|
+
self.merge( other ){ | key, old_value, new_value |
|
|
194
|
+
|
|
195
|
+
new_value
|
|
196
|
+
|
|
197
|
+
if old_value.kind_of?( Hash ) && new_value.kind_of?( Hash )
|
|
198
|
+
|
|
199
|
+
# merge hashes, call self recursively
|
|
200
|
+
old_value.recursive_merge( new_value )
|
|
201
|
+
|
|
202
|
+
elsif old_value.kind_of?( Array ) && new_value.kind_of?( Array )
|
|
203
|
+
|
|
204
|
+
# concatenate arrays
|
|
205
|
+
old_value.clone.concat( new_value ).uniq
|
|
206
|
+
|
|
207
|
+
else
|
|
208
|
+
|
|
209
|
+
# return new value as is
|
|
210
|
+
new_value
|
|
211
|
+
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
end # recursive_merge
|
|
217
|
+
|
|
218
|
+
# TODO: document me
|
|
219
|
+
def recursive_merge!( other )
|
|
220
|
+
|
|
221
|
+
self.replace(
|
|
222
|
+
|
|
223
|
+
recursive_merge( other )
|
|
224
|
+
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
end # recursive_merge!
|
|
228
|
+
|
|
173
229
|
end
|
|
@@ -49,11 +49,32 @@ class Numeric
|
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
# TODO: document me
|
|
52
|
-
def
|
|
52
|
+
def check_range( range, message = "value $1 is out of range ($2)" )
|
|
53
|
+
|
|
54
|
+
# check that given argument is type of Range
|
|
55
|
+
raise TypeError, 'wrong argument type #{ range.class } for range (expected Range)' unless range.kind_of?( Range )
|
|
56
|
+
|
|
57
|
+
# check that given argument is type of Range
|
|
58
|
+
raise TypeError, 'wrong argument type #{ message.class } for exception message (expected String)' unless message.kind_of?( String )
|
|
59
|
+
|
|
60
|
+
# replace macros
|
|
61
|
+
message.gsub!( '$1', self.inspect )
|
|
62
|
+
|
|
63
|
+
message.gsub!( '$2', range.inspect )
|
|
53
64
|
|
|
54
|
-
|
|
65
|
+
# raise exception if number is out of range
|
|
66
|
+
raise RangeError, message unless range.include?( self )
|
|
67
|
+
|
|
68
|
+
# return self
|
|
69
|
+
self
|
|
70
|
+
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# TODO: document me
|
|
74
|
+
def limit( minimum_value, maximum_value )
|
|
55
75
|
|
|
56
|
-
|
|
76
|
+
# limit current value
|
|
77
|
+
self.min( minimum_value ).max( maximum_value )
|
|
57
78
|
|
|
58
79
|
end
|
|
59
80
|
|
|
@@ -66,7 +87,7 @@ class Numeric
|
|
|
66
87
|
|
|
67
88
|
else
|
|
68
89
|
|
|
69
|
-
raise TypeError,
|
|
90
|
+
raise TypeError, "wrong type #{ value.class } for value (expected Numeric)"
|
|
70
91
|
|
|
71
92
|
end
|
|
72
93
|
|
|
@@ -81,7 +102,7 @@ class Numeric
|
|
|
81
102
|
|
|
82
103
|
else
|
|
83
104
|
|
|
84
|
-
raise TypeError,
|
|
105
|
+
raise TypeError, "wrong type #{ value.class } for value (expected Numeric)"
|
|
85
106
|
|
|
86
107
|
end
|
|
87
108
|
|
|
@@ -20,8 +20,23 @@
|
|
|
20
20
|
# extend Ruby Object class functionality
|
|
21
21
|
class Object
|
|
22
22
|
|
|
23
|
+
# TODO: document me
|
|
24
|
+
def blank?
|
|
25
|
+
|
|
26
|
+
respond_to?( :empty? ) ? empty? : !self
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def not_blank( message = "Object must not be blank", exception = ArgumentError )
|
|
31
|
+
|
|
32
|
+
raise exception, message if blank?
|
|
33
|
+
|
|
34
|
+
self
|
|
35
|
+
|
|
36
|
+
end
|
|
37
|
+
|
|
23
38
|
# define method to class instance
|
|
24
|
-
def meta_def method_name, &block
|
|
39
|
+
def meta_def( method_name, &block )
|
|
25
40
|
|
|
26
41
|
( class << self; self; end ).instance_eval{ define_method method_name, &block }
|
|
27
42
|
|
|
@@ -31,10 +46,10 @@ class Object
|
|
|
31
46
|
def check_type( types, message = "wrong argument type $1 (expected $2)" )
|
|
32
47
|
|
|
33
48
|
# raise exception if message is not type of String
|
|
34
|
-
raise TypeError
|
|
49
|
+
raise TypeError, "wrong argument type #{ message.class } for message (expected String)" unless message.kind_of?( String )
|
|
35
50
|
|
|
36
51
|
# create array of types
|
|
37
|
-
type_array =
|
|
52
|
+
type_array = Array( types )
|
|
38
53
|
|
|
39
54
|
# default result value
|
|
40
55
|
found = false
|
|
@@ -42,23 +57,29 @@ class Object
|
|
|
42
57
|
# collect verbose type list
|
|
43
58
|
verbose_type_list = type_array.each_with_index.collect{ | type, index |
|
|
44
59
|
|
|
45
|
-
raise TypeError
|
|
60
|
+
raise TypeError, "invalid argument type #{ type } for check_type. Did you mean #{ type.class }?" unless type.kind_of?( Class )
|
|
61
|
+
|
|
62
|
+
if self.kind_of?( type )
|
|
63
|
+
|
|
64
|
+
found = true
|
|
65
|
+
|
|
66
|
+
break
|
|
46
67
|
|
|
47
|
-
|
|
68
|
+
end
|
|
48
69
|
|
|
49
70
|
# result string, separate types if multiple types given
|
|
50
71
|
"#{ ( ( index > 0 ) ? ( index + 1 < type_array.count ? ", " : " or " ) : "" ) }#{ type.to_s }"
|
|
51
72
|
|
|
52
|
-
}
|
|
73
|
+
}
|
|
53
74
|
|
|
54
75
|
# raise exception if type did not match
|
|
55
76
|
unless found
|
|
56
77
|
|
|
57
78
|
# convert macros
|
|
58
|
-
[ self.class, verbose_type_list, self.inspect ].each_with_index{ | param, index | message.gsub!( "$#{ index + 1 }", param.to_s ) }
|
|
79
|
+
[ self.class, verbose_type_list.join, self.inspect ].each_with_index{ | param, index | message.gsub!( "$#{ index + 1 }", param.to_s ) }
|
|
59
80
|
|
|
60
81
|
# raise the exception
|
|
61
|
-
raise TypeError
|
|
82
|
+
raise TypeError, message
|
|
62
83
|
|
|
63
84
|
end
|
|
64
85
|
|
|
@@ -69,17 +90,19 @@ class Object
|
|
|
69
90
|
|
|
70
91
|
def not_nil( message = "Value must not be nil", exception = ArgumentError )
|
|
71
92
|
|
|
72
|
-
raise exception
|
|
93
|
+
raise exception, message unless self
|
|
94
|
+
|
|
95
|
+
self
|
|
73
96
|
|
|
74
97
|
end
|
|
75
98
|
|
|
76
99
|
def validate( values, message = "Unexpected value $3 for $1 (expected $2)" )
|
|
77
100
|
|
|
78
101
|
# raise exception if message is not type of String
|
|
79
|
-
raise TypeError
|
|
102
|
+
raise TypeError, "wrong argument type #{ message.class } for message (expected String)" unless message.kind_of?( String )
|
|
80
103
|
|
|
81
104
|
# create array of values
|
|
82
|
-
values_array =
|
|
105
|
+
values_array = Array( values )
|
|
83
106
|
|
|
84
107
|
# default result value
|
|
85
108
|
found = false
|
|
@@ -89,21 +112,27 @@ class Object
|
|
|
89
112
|
|
|
90
113
|
raise TypeError.new( "Invalid argument type #{ value.class } for value (expected #{ self.class })" ) unless value.kind_of?( self.class )
|
|
91
114
|
|
|
92
|
-
|
|
115
|
+
if self == value
|
|
116
|
+
|
|
117
|
+
found = true
|
|
118
|
+
|
|
119
|
+
break
|
|
120
|
+
|
|
121
|
+
end
|
|
93
122
|
|
|
94
123
|
# result string, separate types if multiple types given
|
|
95
124
|
"#{ ( ( index > 0 ) ? ( index + 1 < values_array.count ? ", " : " or " ) : "" ) }#{ value.inspect }"
|
|
96
125
|
|
|
97
|
-
}
|
|
126
|
+
}
|
|
98
127
|
|
|
99
128
|
# raise exception if value was not found
|
|
100
129
|
unless found
|
|
101
130
|
|
|
102
131
|
# convert macros
|
|
103
|
-
[ self.class, verbose_values_list, self.inspect ].each_with_index{ | param, index | message.gsub!( "$#{ index + 1 }", param.to_s ) }
|
|
132
|
+
[ self.class, verbose_values_list.join, self.inspect ].each_with_index{ | param, index | message.gsub!( "$#{ index + 1 }", param.to_s ) }
|
|
104
133
|
|
|
105
134
|
# raise the exception
|
|
106
|
-
raise ArgumentError
|
|
135
|
+
raise ArgumentError, message
|
|
107
136
|
|
|
108
137
|
end
|
|
109
138
|
|