awetestlib 0.1.1
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/.gitattributes +22 -0
- data/.gitignore +69 -0
- data/AwetestLib Instructions.rtf +0 -0
- data/awetestlib.gemspec +57 -0
- data/awetestlib.windows.gemspec +41 -0
- data/awetestlib_notes.txt +4 -0
- data/awetestlib_osx.gemspec +43 -0
- data/bin/awetestlib +67 -0
- data/ext/Rakefile +1 -0
- data/ext/mkrf_conf.rb +27 -0
- data/lib/awetestlib.rb +39 -0
- data/lib/patches/README +2 -0
- data/lib/patches/firewatir.rb +106 -0
- data/lib/patches/watir.rb +175 -0
- data/lib/regression/browser.rb +1259 -0
- data/lib/regression/drag_and_drop.rb +374 -0
- data/lib/regression/find.rb +426 -0
- data/lib/regression/legacy.rb +40 -0
- data/lib/regression/logging.rb +444 -0
- data/lib/regression/page_data.rb +185 -0
- data/lib/regression/runner.rb +278 -0
- data/lib/regression/tables.rb +486 -0
- data/lib/regression/user_input.rb +1255 -0
- data/lib/regression/utilities.rb +891 -0
- data/lib/regression/validations.rb +1179 -0
- data/lib/regression/waits.rb +387 -0
- data/lib/version.rb +4 -0
- data/rdoc_test.bat +1 -0
- data/test/create_zoho.rb +65 -0
- data/test/create_zoho_account1.rb +66 -0
- data/test/create_zoho_account2.rb +71 -0
- data/test/demo.rb +86 -0
- data/test/google_search1.rb +16 -0
- data/test/google_search2.rb +19 -0
- data/test/zoho_util.rb +485 -0
- data/test/zoho_variables.xls +0 -0
- metadata +237 -0
@@ -0,0 +1,40 @@
|
|
1
|
+
module Legacy
|
2
|
+
|
3
|
+
#--
|
4
|
+
##def open_log
|
5
|
+
# start = Time.now.to_f.to_s
|
6
|
+
#
|
7
|
+
# logTS = Time.at(@myRun.launched.to_f).strftime("%Y%m%d%H%M%S")
|
8
|
+
# xls = @myAppEnv.xls_name.gsub('.xls', '') + '_' if @myAppEnv.xls_name.length > 0
|
9
|
+
# @logFileSpec = "#{@myRoot}/#{logdir}/#{@myName}_#{@targetBrowser.abbrev}_#{xls}#{logTS}.log"
|
10
|
+
# init_logger(@logFileSpec, @myName)
|
11
|
+
#
|
12
|
+
# # message_tolog( self.inspect )
|
13
|
+
# message_to_log("#{@myName} launched at [#{@myRun.launched.to_f.to_s}][#{@myScript.id}][#{@myRun.id}][#{@myChild.id}]")
|
14
|
+
# debug_to_log("pid: #{$$}")
|
15
|
+
# message_to_log("#{@myName} begin at [#{start}]")
|
16
|
+
# message_to_log("#{@myName} environment [#{@myAppEnv.name}]")
|
17
|
+
# message_to_log("#{@myName} xls_name [#{@myAppEnv.xls_name}]") if @myAppEnv.xls_name.length > 0
|
18
|
+
# message_to_log("#{@myName} rootDir [#{@myRoot}]")
|
19
|
+
# message_to_log("#{@myName} Target Browser [#{@targetBrowser.name}]")
|
20
|
+
# mark_testlevel(@myParent.name, @myParent.level) # Module
|
21
|
+
# mark_testlevel(@myChild.name, @myChild.level) # SubModule
|
22
|
+
#
|
23
|
+
#end
|
24
|
+
#++
|
25
|
+
|
26
|
+
#def find_me(where, how, what)
|
27
|
+
# me = where.element(how, what)
|
28
|
+
# puts me.inspect
|
29
|
+
#rescue
|
30
|
+
# error_to_log("#{where.inspect} doesn't seem to respond to element() #{$!}")
|
31
|
+
#end
|
32
|
+
|
33
|
+
# def click_me(element)
|
34
|
+
# element.click
|
35
|
+
# rescue
|
36
|
+
# error_to_log("#{element.inspect} doesn't seem to respond to click() #{$!}")
|
37
|
+
# end
|
38
|
+
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,444 @@
|
|
1
|
+
#require 'screencap'
|
2
|
+
module Logging
|
3
|
+
|
4
|
+
def self.included(mod)
|
5
|
+
# puts "RegressionSupport::Logging extended by #{mod}"
|
6
|
+
end
|
7
|
+
|
8
|
+
def log_message(severity, message, tag = '', lnbr = nil, addts = 1, exception=nil)
|
9
|
+
# caller = get_caller(lnbr, exception)
|
10
|
+
|
11
|
+
# @sequence ||= log_properties ? log_properties.fetch('sequence', 0) : 0
|
12
|
+
# @sequence += 1
|
13
|
+
|
14
|
+
t = Time.now.utc
|
15
|
+
@last_t ||= t
|
16
|
+
|
17
|
+
# if log_properties
|
18
|
+
# log_args = {
|
19
|
+
# :cycle => @cycle,
|
20
|
+
# :browser_sequence => @browser_sequence,
|
21
|
+
# :session_num => @session_num,
|
22
|
+
# :sequence => @sequence,
|
23
|
+
# :job_id => log_properties['job_id'],
|
24
|
+
## :project_version_id => log_properties['project_version_id'],
|
25
|
+
# :test_run_id => log_properties['test_run_id'],
|
26
|
+
# :script_id => log_properties['script_id'],
|
27
|
+
# :caller => caller.split(":")[0] || 'unknown',
|
28
|
+
# :caller_line => caller.split(":")[1].to_i,
|
29
|
+
# :caller_method => caller.split(":")[2],
|
30
|
+
# :severity => severity,
|
31
|
+
# :message => message.gsub(/[\x80-\xff]/,"?"),
|
32
|
+
# :detail_timestamp => t.to_f.to_s,
|
33
|
+
# :duration => t.to_f-@last_t.to_f,
|
34
|
+
# :created_at => t,
|
35
|
+
### :company_id => log_properties['company_id'],
|
36
|
+
# :project_id => log_properties['project_id'],
|
37
|
+
# :level => tag.andand.is_a?(Fixnum) ? tag : nil,
|
38
|
+
# :pass => pass_code_for(tag),
|
39
|
+
# :test_category_id => log_properties['test_category_id'],
|
40
|
+
# :test_case_id => log_properties['test_case_id'],
|
41
|
+
# :application_role_id => nil, # not implemented yet
|
42
|
+
# :screen_path => nil
|
43
|
+
# }
|
44
|
+
# Resque::Job.create(log_queue.to_sym, log_class, log_args) if log_queue && log_class
|
45
|
+
#
|
46
|
+
# ::Screencap.capture(Shamisen::BROWSER_MAP[@browser],
|
47
|
+
# log_properties['test_run_id'], @sequence, root_path) if @screencap_path
|
48
|
+
#end
|
49
|
+
|
50
|
+
@last_t = t
|
51
|
+
|
52
|
+
dt = t.strftime("%Y%m%d %H%M%S")+' '+t.usec.to_s[0, 4]
|
53
|
+
mySev = translate_severity(severity)
|
54
|
+
myCaller = get_caller(lnbr) || 'unknown'
|
55
|
+
|
56
|
+
myMsg = "%-8s" % mySev
|
57
|
+
myMsg << '[' + dt + ']:'
|
58
|
+
if tag
|
59
|
+
if tag.is_a? Fixnum
|
60
|
+
tag = '-LVL' + tag.to_s
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
myMsg << "[%-5s]:" % tag
|
65
|
+
#myMsg << '[' + t.to_f.to_s + ']:'
|
66
|
+
#myMsg << '[' + myCaller + ']:'
|
67
|
+
#myMsg << "#{get_call_list[-1]}#{get_call_list[-2]} "
|
68
|
+
myMsg << get_call_list_new.to_s
|
69
|
+
myMsg << ' '+message
|
70
|
+
# myMsg << " {#{lnbr}} " if lnbr
|
71
|
+
|
72
|
+
# # TODO This is broken: @myBrowser is not necessarily populated
|
73
|
+
# if @screenCaptureOn and is_browser?(@myBrowser)
|
74
|
+
# if severity >= @options['screenshot'] andand
|
75
|
+
# tag.match(/PASS|FAIL/)
|
76
|
+
# then
|
77
|
+
# capture_screen(@myBrowser, t)
|
78
|
+
# end
|
79
|
+
# end
|
80
|
+
|
81
|
+
@myLog.add(severity, myMsg) if @myLog # add persistent logging for awetestlib. pmn 05jun2012
|
82
|
+
puts myMsg+"\n"
|
83
|
+
|
84
|
+
nil # so method doesn't return whole @output.
|
85
|
+
end
|
86
|
+
|
87
|
+
#private log_message
|
88
|
+
|
89
|
+
def pass_code_for(tag)
|
90
|
+
case
|
91
|
+
when tag =~ /PASS/
|
92
|
+
'P'
|
93
|
+
when tag =~ /FAIL/
|
94
|
+
'F'
|
95
|
+
#when tag =~ /\d+/ # avoid having to require andand for awetestlib. pmn 05jun2012
|
96
|
+
when tag.andand.is_a?(Fixnum)
|
97
|
+
'H'
|
98
|
+
when tag =~ /DONE/
|
99
|
+
'D'
|
100
|
+
when tag =~ /role/
|
101
|
+
'R'
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def log_sikuli_output(output_file, passed)
|
106
|
+
output_lines = File.open(output_file, 'r') { |f| f.readlines }
|
107
|
+
puts "IM FAILING?! #{passed}"
|
108
|
+
|
109
|
+
# if passed
|
110
|
+
|
111
|
+
log_messages = ['[log]', '[error]']
|
112
|
+
output_lines = output_lines.select { |l| log_messages } #.detect{|msg| l.include?(msg)} }
|
113
|
+
while line = output_lines.shift do
|
114
|
+
puts "line to be logged: #{line}"
|
115
|
+
if line.include? '[log]'
|
116
|
+
passed_to_log line
|
117
|
+
elsif line.include? '[error]'
|
118
|
+
failed_to_log line
|
119
|
+
elsif line.match /\s*Exception/
|
120
|
+
failed_to_log output_lines.join("\n")
|
121
|
+
break
|
122
|
+
else
|
123
|
+
debug_tolog line
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
# else
|
128
|
+
# failed_to_log "SIKULI LOG:\n\n #{output_lines.join('\n')}"
|
129
|
+
# end
|
130
|
+
|
131
|
+
return { :result => passed, :msg => output_str }
|
132
|
+
end
|
133
|
+
|
134
|
+
# Put status message to the log and output window
|
135
|
+
# TODO: figure out a way to do the leveling automatically based on actual call depth within script (and project library?)
|
136
|
+
# When using to mark test groupings, include
|
137
|
+
# level 'lvl' (numeric literal, 1 through 9, usually 1-4)
|
138
|
+
# indicating test grouping hierarchy:
|
139
|
+
# 0 lowest level test case, a single validation
|
140
|
+
# a.k.a TEST CASE, VALIDATION
|
141
|
+
# not normally used in scripts as it is
|
142
|
+
# implied by method with 'validate' in name
|
143
|
+
# 1 group of closely related level 0 validations
|
144
|
+
# a.k.a TEST GROUP
|
145
|
+
# should never be followed by another level 1
|
146
|
+
# or higher level message without intervening
|
147
|
+
# level 0 validations.
|
148
|
+
# 2 group of closely related level 1 validation sets.
|
149
|
+
# a.k.a TEST SET, SUBMODULE, USE CASE
|
150
|
+
# should never be followed by another level 2
|
151
|
+
# or higher level message without intervening
|
152
|
+
# lower levels.
|
153
|
+
# 3 group of closely related level 2 validation sets.
|
154
|
+
# a.k.a TEST SET, TEST SUITE, MODULE, USE CASE
|
155
|
+
# should never be followed by another level 3
|
156
|
+
# or higher level message without intervening
|
157
|
+
# lower levels.
|
158
|
+
# 4 group of closely related level 3 validation sets.
|
159
|
+
# a.k.a TEST SUITE, APPLICATION UNDER TEST, PLAN, PROJECT
|
160
|
+
# should never be followed by another level 4
|
161
|
+
# or higher level message without intervening
|
162
|
+
# lower levels. Will seldom appear directly in
|
163
|
+
# scripts
|
164
|
+
|
165
|
+
=begin rdoc
|
166
|
+
category: Logging
|
167
|
+
tags: report, log, test level
|
168
|
+
=end
|
169
|
+
def mark_testlevel(message, lvl, desc = '', dbg = nil)
|
170
|
+
strg = ''
|
171
|
+
strg << message
|
172
|
+
strg << " [#{desc}]" if desc.length > 0
|
173
|
+
strg << " \n#{get_debug_list}" if dbg or @debug_calls
|
174
|
+
log_message(INFO, strg, lvl, 1)
|
175
|
+
rescue
|
176
|
+
failed_to_log("#{__method__}: #{$!}")
|
177
|
+
end
|
178
|
+
|
179
|
+
alias mark_test_level mark_testlevel
|
180
|
+
|
181
|
+
=begin rdoc
|
182
|
+
category: Logging
|
183
|
+
tags: log
|
184
|
+
=end
|
185
|
+
def info_to_log(message, lnbr = __LINE__)
|
186
|
+
log_message(INFO, message, nil, lnbr)
|
187
|
+
end
|
188
|
+
|
189
|
+
alias message_tolog info_to_log
|
190
|
+
alias message_to_log info_to_log
|
191
|
+
alias info_tolog info_to_log
|
192
|
+
|
193
|
+
=begin rdoc
|
194
|
+
category: Logging
|
195
|
+
tags: log, debug
|
196
|
+
=end
|
197
|
+
def debug_to_log(message, lnbr = __LINE__, dbg = false)
|
198
|
+
message << " \n#{get_debug_list}" if dbg or @debug_calls # and not @debug_calls_fail_only)
|
199
|
+
log_message(DEBUG, "#{message}", nil, lnbr)
|
200
|
+
end
|
201
|
+
|
202
|
+
alias debug_tolog debug_to_log
|
203
|
+
|
204
|
+
=begin rdoc
|
205
|
+
category: Logging
|
206
|
+
tags: log, error
|
207
|
+
Do not use for failed validations.
|
208
|
+
=end
|
209
|
+
def error_to_log(message, lnbr = __LINE__)
|
210
|
+
log_message(ERROR, message, nil, lnbr)
|
211
|
+
end
|
212
|
+
|
213
|
+
alias error_tolog error_to_log
|
214
|
+
|
215
|
+
=begin rdoc
|
216
|
+
category: Logging
|
217
|
+
tags: log, error, pass, reference, tag, report
|
218
|
+
=end
|
219
|
+
def passed_to_log(message, lnbr = __LINE__, dbg = false)
|
220
|
+
message << " \n#{get_debug_list}" if dbg or @debug_calls # and not @debug_calls_fail_only)
|
221
|
+
@my_passed_count += 1 if @my_passed_count
|
222
|
+
parse_error_references(message)
|
223
|
+
log_message(INFO, "#{message}", PASS, lnbr)
|
224
|
+
end
|
225
|
+
|
226
|
+
alias validate_passed_tolog passed_to_log
|
227
|
+
alias validate_passed_to_log passed_to_log
|
228
|
+
alias passed_tolog passed_to_log
|
229
|
+
alias pass_tolog passed_to_log
|
230
|
+
alias pass_to_log passed_to_log
|
231
|
+
|
232
|
+
=begin rdoc
|
233
|
+
category: Logging
|
234
|
+
tags: log, error, fail, reference, tag, report
|
235
|
+
=end
|
236
|
+
def failed_to_log(message, lnbr = __LINE__, dbg = false)
|
237
|
+
message << " \n#{get_debug_list}" # if dbg or @debug_calls or @debug_calls_fail_only
|
238
|
+
@my_failed_count += 1 if @my_failed_count
|
239
|
+
parse_error_references(message, true)
|
240
|
+
log_message(WARN, "#{message}" + " (#{lnbr})]", FAIL, lnbr)
|
241
|
+
#debugger if debug_on_fail
|
242
|
+
end
|
243
|
+
|
244
|
+
alias validate_failed_tolog failed_to_log
|
245
|
+
alias validate_failed_to_log failed_to_log
|
246
|
+
alias failed_tolog failed_to_log
|
247
|
+
alias fail_tolog failed_to_log
|
248
|
+
alias fail_to_log failed_to_log
|
249
|
+
|
250
|
+
=begin rdoc
|
251
|
+
category: Logging
|
252
|
+
tags: log, error, fail, reference, tag, fatal, report
|
253
|
+
=end
|
254
|
+
def fatal_to_log(message, lnbr = __LINE__, dbg = false)
|
255
|
+
message << " \n#{get_debug_list}" # if dbg or (@debug_calls and not @debug_calls_fail_only)
|
256
|
+
@my_failed_count += 1 if @my_failed_count
|
257
|
+
parse_error_references(message, true)
|
258
|
+
debug_to_report("#{__method__}:\n#{dump_caller(lnbr)}")
|
259
|
+
log_message(FATAL, "#{message} (#{lnbr})", FAIL, lnbr)
|
260
|
+
end
|
261
|
+
|
262
|
+
#def fatal_to_log(message, lnbr = __LINE__)
|
263
|
+
# log_message(FATAL, "#{message} (#{lnbr})", FAIL, lnbr)
|
264
|
+
# log_message(DEBUG, "\n#{dump_caller(lnbr)}")
|
265
|
+
#end
|
266
|
+
|
267
|
+
alias fatal_tolog fatal_to_log
|
268
|
+
|
269
|
+
=begin rdoc
|
270
|
+
category: Logging
|
271
|
+
tags: log, report
|
272
|
+
=end
|
273
|
+
def message_to_report(message, dbg = false)
|
274
|
+
mark_testlevel("#{message}", 0, '', dbg)
|
275
|
+
end
|
276
|
+
|
277
|
+
=begin rdoc
|
278
|
+
category: Logging
|
279
|
+
tags: log, debug, report
|
280
|
+
=end
|
281
|
+
def debug_to_report(message, dbg = false)
|
282
|
+
mark_testlevel("(DEBUG): \n", 0, "#{message}", dbg)
|
283
|
+
end
|
284
|
+
|
285
|
+
def translate_severity(severity)
|
286
|
+
mySev = ''
|
287
|
+
case
|
288
|
+
when severity == 0
|
289
|
+
mySev = 'DEBUG'
|
290
|
+
when severity == 1
|
291
|
+
mySev = 'INFO'
|
292
|
+
when severity == 2
|
293
|
+
mySev = 'WARN'
|
294
|
+
when severity == 3
|
295
|
+
mySev = 'ERROR'
|
296
|
+
when severity == 4
|
297
|
+
mySev = 'FATAL'
|
298
|
+
when severity > 4
|
299
|
+
mySev = 'UNKNOWN'
|
300
|
+
end
|
301
|
+
mySev
|
302
|
+
end
|
303
|
+
|
304
|
+
=begin rdoc
|
305
|
+
category: Debug
|
306
|
+
tags: log, caller, trace, report
|
307
|
+
=end
|
308
|
+
def get_caller(lnbr=nil, exception=nil)
|
309
|
+
script_name ||= File.basename(script_file)
|
310
|
+
if lnbr && script_type.eql?("Selenium")
|
311
|
+
[script_name, lnbr, 'in run()'].join(":")
|
312
|
+
elsif lnbr && script_type.eql?("MobileNativeApp")
|
313
|
+
[script_name, lnbr, 'in scenario()'].join(":")
|
314
|
+
else
|
315
|
+
caller_object = exception ? exception.backtrace : Kernel.caller
|
316
|
+
call_frame = caller_object.detect do |frame|
|
317
|
+
frame.match(/#{script_name}/) or (library && frame.match(/#{library}/))
|
318
|
+
end
|
319
|
+
unless call_frame.nil?
|
320
|
+
call_frame.gsub!(/^C:/, '')
|
321
|
+
file, line, method = call_frame.split(":")
|
322
|
+
[File.basename(file), line, method].join(":")
|
323
|
+
else
|
324
|
+
'unknown'
|
325
|
+
end
|
326
|
+
end
|
327
|
+
end
|
328
|
+
|
329
|
+
def init_logger(logFile, scriptName = nil)
|
330
|
+
if File.exist?(logFile)
|
331
|
+
puts "==> Logfile already exists: #{logFile}. Replacing it."
|
332
|
+
begin
|
333
|
+
File.delete(logFile)
|
334
|
+
rescue
|
335
|
+
puts "#{scriptName}: init_logger RESCUE: #{$!}"
|
336
|
+
end
|
337
|
+
end
|
338
|
+
logger = ActiveSupport::BufferedLogger.new(logFile)
|
339
|
+
logger.level = Logger::DEBUG
|
340
|
+
logger.auto_flushing = (true)
|
341
|
+
logger.add(INFO, "#{logFile}\n#{ENV["OS"]}")
|
342
|
+
logger
|
343
|
+
end
|
344
|
+
|
345
|
+
#private init_logger
|
346
|
+
|
347
|
+
=begin rdoc
|
348
|
+
category: Logging
|
349
|
+
tags: error, fail, reference, tag
|
350
|
+
=end
|
351
|
+
def start_run(ts = nil)
|
352
|
+
@start_timestamp = Time.now unless ts
|
353
|
+
utc_ts = @start_timestamp.getutc
|
354
|
+
loc_tm = "#{@start_timestamp.strftime("%H:%M:%S")} #{@start_timestamp.zone}"
|
355
|
+
mark_testlevel(">> Starting #{@myName.titleize} #{utc_ts} (#{loc_tm})", 9)
|
356
|
+
end
|
357
|
+
|
358
|
+
alias start_to_log start_run
|
359
|
+
|
360
|
+
=begin rdoc
|
361
|
+
category: Logging
|
362
|
+
tags: log, begin, error, reference, validation, pass, fail, tallies, tag
|
363
|
+
=end
|
364
|
+
def finish_run(ts = nil)
|
365
|
+
timestamp = Time.now unless ts
|
366
|
+
|
367
|
+
mark_testlevel(">> #{@myName.titleize} duration: #{sec2hms(timestamp - @start_timestamp)}", 0)
|
368
|
+
|
369
|
+
mark_testlevel(">> #{@myName.titleize} validations: #{@my_passed_count + @my_failed_count} "+
|
370
|
+
"fail: #{@my_failed_count}]", 0) if @my_passed_count and @my_failed_count
|
371
|
+
|
372
|
+
tally_error_references
|
373
|
+
|
374
|
+
utc_ts = timestamp.getutc
|
375
|
+
loc_tm = "#{timestamp.strftime("%H:%M:%S")} #{timestamp.zone}"
|
376
|
+
mark_testlevel(">> End #{@myName.titleize} #{utc_ts} (#{loc_tm})", 9)
|
377
|
+
|
378
|
+
end
|
379
|
+
|
380
|
+
alias finish_to_log finish_run
|
381
|
+
|
382
|
+
=begin rdoc
|
383
|
+
category: Logging
|
384
|
+
tags: log, error, reference, tag, tallies
|
385
|
+
=end
|
386
|
+
def tally_error_references(list_tags = @report_all_refs)
|
387
|
+
tags_tested = 0
|
388
|
+
tags_hit = 0
|
389
|
+
if @my_error_hits and @my_error_hits.length > 0
|
390
|
+
mark_testlevel("Tagged Error Hits:", 0)
|
391
|
+
tags_hit = @my_error_hits.length
|
392
|
+
@my_error_hits.each_key do |ref|
|
393
|
+
mark_testlevel("#{ref} - #{@my_error_hits[ref]}", 0)
|
394
|
+
end
|
395
|
+
end
|
396
|
+
if list_tags
|
397
|
+
if @my_error_references and @my_error_references.length > 0
|
398
|
+
mark_testlevel("Error and Test Case Tags:", 0)
|
399
|
+
tags_tested = @my_error_references.length
|
400
|
+
@my_error_references.each_key do |ref|
|
401
|
+
mark_testlevel("#{ref} - #{@my_error_references[ref]}", 0)
|
402
|
+
end
|
403
|
+
mark_testlevel("Fails were hit on #{tags_hit} of #{tags_tested} error/test case references", 0)
|
404
|
+
else
|
405
|
+
mark_testlevel("No Error or Test Case References found.", 0)
|
406
|
+
end
|
407
|
+
end
|
408
|
+
end
|
409
|
+
|
410
|
+
=begin rdoc
|
411
|
+
category: Logging
|
412
|
+
tags: error, reference, tag, tallies
|
413
|
+
=end
|
414
|
+
def parse_error_references(message, fail = false)
|
415
|
+
msg = message.dup
|
416
|
+
while msg =~ /(\*\*\*\s+[\w\d_\s,-:;\?]+\s+\*\*\*)/
|
417
|
+
capture_error_reference($1, fail)
|
418
|
+
msg.sub!($1, '')
|
419
|
+
end
|
420
|
+
end
|
421
|
+
|
422
|
+
=begin rdoc
|
423
|
+
category: Logging
|
424
|
+
tags: error, fail, hits, reference, tag, tallies
|
425
|
+
=end
|
426
|
+
def capture_error_reference(ref, fail)
|
427
|
+
if fail
|
428
|
+
@my_error_hits = Hash.new unless @my_error_hits
|
429
|
+
if @my_error_hits[ref]
|
430
|
+
@my_error_hits[ref] += 1
|
431
|
+
else
|
432
|
+
@my_error_hits[ref] = 1
|
433
|
+
end
|
434
|
+
#debug_to_report("#{__method__}: error hits:\n#{@my_error_hits.to_yaml}")
|
435
|
+
end
|
436
|
+
@my_error_references = Hash.new unless @my_error_references
|
437
|
+
if @my_error_references[ref]
|
438
|
+
@my_error_references[ref] += 1
|
439
|
+
else
|
440
|
+
@my_error_references[ref] = 1
|
441
|
+
end
|
442
|
+
end
|
443
|
+
|
444
|
+
end
|