minitest_log 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/Gemfile.lock +26 -26
- data/README.md +23 -21
- data/lib/minitest_assertions_patch.rb +9 -0
- data/lib/minitest_log.rb +204 -120
- data/lib/minitest_log/version.rb +1 -1
- data/minitest_log.gemspec +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2f0a05214c679b2851776f4f5cabea520b673112759f45cb7bf8788a50887361
|
4
|
+
data.tar.gz: 1c83fcd0f14dfe379bb76a384a46369862c1be5016b24ff889edf5ef025943ce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 13f1b174112581541efdc28a8747914f4a426d7c6251f7e1d3f1e69755efe14dc405647bead3ac39a7a1e2f8e62f59593fbc82398dafb65dd05188a4c47e11a6
|
7
|
+
data.tar.gz: 57f373a87eb5a6a5479d18be5ec02466ed6b0e6bf31fb1befa53adcf8de21530dfe64be6acd4c6ac85b39f6b40c441fb336f14ae5284218e3ce153cbd67c8dae
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,26 +1,26 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
minitest_log (1.0.
|
5
|
-
diff-lcs (~> 1.3)
|
6
|
-
minitest (~> 5.0)
|
7
|
-
|
8
|
-
GEM
|
9
|
-
remote: https://rubygems.org/
|
10
|
-
specs:
|
11
|
-
diff-lcs (1.3)
|
12
|
-
markdown_helper (2.1.0)
|
13
|
-
minitest (5.11.3)
|
14
|
-
rake (10.5.0)
|
15
|
-
|
16
|
-
PLATFORMS
|
17
|
-
x64-mingw32
|
18
|
-
|
19
|
-
DEPENDENCIES
|
20
|
-
bundler (~> 1.7)
|
21
|
-
markdown_helper (~> 2.0)
|
22
|
-
minitest_log!
|
23
|
-
rake (~> 10.0)
|
24
|
-
|
25
|
-
BUNDLED WITH
|
26
|
-
1.17.3
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
minitest_log (1.0.1)
|
5
|
+
diff-lcs (~> 1.3)
|
6
|
+
minitest (~> 5.0)
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
diff-lcs (1.3)
|
12
|
+
markdown_helper (2.1.0)
|
13
|
+
minitest (5.11.3)
|
14
|
+
rake (10.5.0)
|
15
|
+
|
16
|
+
PLATFORMS
|
17
|
+
x64-mingw32
|
18
|
+
|
19
|
+
DEPENDENCIES
|
20
|
+
bundler (~> 1.7)
|
21
|
+
markdown_helper (~> 2.0)
|
22
|
+
minitest_log!
|
23
|
+
rake (~> 10.0)
|
24
|
+
|
25
|
+
BUNDLED WITH
|
26
|
+
1.17.3
|
data/README.md
CHANGED
@@ -286,13 +286,13 @@ end
|
|
286
286
|
```log.xml```:
|
287
287
|
```xml
|
288
288
|
<log>
|
289
|
-
<section_ name='My section with timestamp' timestamp='2019-
|
289
|
+
<section_ name='My section with timestamp' timestamp='2019-06-01-Sat-15.07.07.469'>
|
290
290
|
Section with timestamp.
|
291
291
|
</section_>
|
292
|
-
<section_ name='My section with duration' duration_seconds='0.
|
292
|
+
<section_ name='My section with duration' duration_seconds='0.503'>
|
293
293
|
Section with duration.
|
294
294
|
</section_>
|
295
|
-
<section_ name='My section with both' timestamp='2019-
|
295
|
+
<section_ name='My section with both' timestamp='2019-06-01-Sat-15.07.07.974' duration_seconds='0.514'>
|
296
296
|
Section with both.
|
297
297
|
</section_>
|
298
298
|
</log>
|
@@ -364,7 +364,7 @@ end
|
|
364
364
|
```xml
|
365
365
|
<log>
|
366
366
|
<section_ name='My unrescued section'>
|
367
|
-
<uncaught_exception_ timestamp='2019-
|
367
|
+
<uncaught_exception_ timestamp='2019-06-01-Sat-15.07.08.960' class='RuntimeError'>
|
368
368
|
<message_>
|
369
369
|
Boo!
|
370
370
|
</message_>
|
@@ -421,7 +421,7 @@ end
|
|
421
421
|
```log.xml```:
|
422
422
|
```xml
|
423
423
|
<log>
|
424
|
-
<section_ name='Section with potpourri of arguments' a='0' b='1' timestamp='2019-
|
424
|
+
<section_ name='Section with potpourri of arguments' a='0' b='1' timestamp='2019-06-01-Sat-15.07.05.791' c='2' d='3' duration_seconds='0.513'>
|
425
425
|
Word More words
|
426
426
|
<rescued_exception_ class='Exception' message='Boo!'>
|
427
427
|
<backtrace_>
|
@@ -824,7 +824,7 @@ error_verdict.rb:9:in `test_demo'
|
|
824
824
|
<verdict_ method='verdict_assert_equal?' outcome='failed' id='error_count'>
|
825
825
|
<expected_ class='Integer' value='0'/>
|
826
826
|
<actual_ class='Integer' value='1'/>
|
827
|
-
<exception_ class='Minitest::Assertion' message='Expected: 0'>
|
827
|
+
<exception_ class='Minitest::Assertion' message='Expected: 0\n Actual: 1'>
|
828
828
|
<backtrace_>
|
829
829
|
<![CDATA[
|
830
830
|
error_verdict.rb:9:in `new'
|
@@ -860,7 +860,7 @@ end
|
|
860
860
|
```default_backtrace_filter.xml```:
|
861
861
|
```xml
|
862
862
|
<log>
|
863
|
-
<uncaught_exception_ timestamp='2019-
|
863
|
+
<uncaught_exception_ timestamp='2019-06-01-Sat-15.07.03.608' class='RuntimeError'>
|
864
864
|
<message_>
|
865
865
|
Boo!
|
866
866
|
</message_>
|
@@ -878,14 +878,16 @@ backtrace_filter.rb:4:in `test_demo'
|
|
878
878
|
```custom_backtrace_filter.xml```:
|
879
879
|
```xml
|
880
880
|
<log>
|
881
|
-
<uncaught_exception_ timestamp='2019-
|
881
|
+
<uncaught_exception_ timestamp='2019-06-01-Sat-15.07.03.610' class='RuntimeError'>
|
882
882
|
<message_>
|
883
883
|
Boo!
|
884
884
|
</message_>
|
885
885
|
<backtrace_>
|
886
886
|
<![CDATA[
|
887
887
|
backtrace_filter.rb:8:in `block in test_demo'
|
888
|
-
C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/minitest_log-0.
|
888
|
+
C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/minitest_log-1.0.0/lib/minitest_log.rb:39:in `block in initialize'
|
889
|
+
C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/minitest_log-1.0.0/lib/minitest_log.rb:186:in `do_log'
|
890
|
+
C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/minitest_log-1.0.0/lib/minitest_log.rb:37:in `initialize'
|
889
891
|
backtrace_filter.rb:7:in `new'
|
890
892
|
backtrace_filter.rb:7:in `test_demo'
|
891
893
|
C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/minitest-5.11.3/lib/minitest/test.rb:98:in `block (3 levels) in run'
|
@@ -1113,7 +1115,7 @@ end
|
|
1113
1115
|
(?-mix:Bar)
|
1114
1116
|
</data_>
|
1115
1117
|
<data_ name='My time' class='Time' method=':to_s'>
|
1116
|
-
2019-
|
1118
|
+
2019-06-01 15:07:01 -0500
|
1117
1119
|
</data_>
|
1118
1120
|
<data_ name='My uri,' class='URI::HTTPS' method=':to_s'>
|
1119
1121
|
https://www.github.com
|
@@ -1286,7 +1288,7 @@ end
|
|
1286
1288
|
<verdict_ method='verdict_assert_equal?' outcome='failed' id='another_id' message='Another message'>
|
1287
1289
|
<expected_ class='Integer' value='0'/>
|
1288
1290
|
<actual_ class='Integer' value='1'/>
|
1289
|
-
<exception_ class='Minitest::Assertion' message='Expected: 0'>
|
1291
|
+
<exception_ class='Minitest::Assertion' message='Expected: 0\n Actual: 1'>
|
1290
1292
|
<backtrace_>
|
1291
1293
|
<![CDATA[
|
1292
1294
|
verdict_assert_equal.rb:6:in `block in test_demo_verdict'
|
@@ -1470,7 +1472,7 @@ end
|
|
1470
1472
|
<verdict_ method='verdict_assert_instance_of?' outcome='failed' id='another_id' message='another message'>
|
1471
1473
|
<expected_ class='Class' value='Integer'/>
|
1472
1474
|
<actual_ class='String' value='"my_string"'/>
|
1473
|
-
<exception_ class='Minitest::Assertion' message='Expected "my_string" to be an instance of Integer, not String.'>
|
1475
|
+
<exception_ class='Minitest::Assertion' message='Expected # encoding: UTF-8\n"my_string" to be an instance of Integer, not String.'>
|
1474
1476
|
<backtrace_>
|
1475
1477
|
<![CDATA[
|
1476
1478
|
verdict_assert_instance_of.rb:6:in `block in test_demo_verdict'
|
@@ -1560,7 +1562,7 @@ end
|
|
1560
1562
|
<verdict_ method='verdict_assert_match?' outcome='failed' id='another_id' message='Another message'>
|
1561
1563
|
<expected_ class='Regexp' value='/foo/'/>
|
1562
1564
|
<actual_ class='String' value='"feed"'/>
|
1563
|
-
<exception_ class='Minitest::Assertion' message='Expected /foo/ to match "feed".'>
|
1565
|
+
<exception_ class='Minitest::Assertion' message='Expected /foo/ to match # encoding: UTF-8\n"feed".'>
|
1564
1566
|
<backtrace_>
|
1565
1567
|
<![CDATA[
|
1566
1568
|
verdict_assert_match.rb:6:in `block in test_demo_verdict'
|
@@ -1703,7 +1705,7 @@ end
|
|
1703
1705
|
<verdict_ method='verdict_assert_output?' outcome='failed' id='another_id'>
|
1704
1706
|
<stdout_ class='String' value='"Bar"'/>
|
1705
1707
|
<stderr_ class='String' value='"Foo"'/>
|
1706
|
-
<exception_ class='Minitest::Assertion' message='In stderr
|
1708
|
+
<exception_ class='Minitest::Assertion' message='In stderr.\n--- expected\n+++ actual\n@@ -1,2 +1 @@\n-# encoding: UTF-8\n-"Foo"\n+"Bar"\n'>
|
1707
1709
|
<backtrace_>
|
1708
1710
|
<![CDATA[
|
1709
1711
|
verdict_assert_output.rb:9:in `block in test_demo_verdict'
|
@@ -1748,7 +1750,7 @@ end
|
|
1748
1750
|
<verdict_ method='verdict_assert_predicate?' outcome='failed' id='another_id' message='Another message'>
|
1749
1751
|
<object_ class='String' value='"x"'/>
|
1750
1752
|
<operator_ class='Symbol' value=':empty?'/>
|
1751
|
-
<exception_ class='Minitest::Assertion' message='Expected "x" to be empty?.'>
|
1753
|
+
<exception_ class='Minitest::Assertion' message='Expected # encoding: UTF-8\n"x" to be empty?.'>
|
1752
1754
|
<backtrace_>
|
1753
1755
|
<![CDATA[
|
1754
1756
|
verdict_assert_predicate.rb:6:in `block in test_demo_verdict'
|
@@ -1795,7 +1797,7 @@ end
|
|
1795
1797
|
</verdict_>
|
1796
1798
|
<verdict_ method='verdict_assert_raises?' outcome='failed' id='another_id' message='Another message'>
|
1797
1799
|
<error_class_ class='Class' value='RuntimeError'/>
|
1798
|
-
<exception_ class='Minitest::Assertion' message='[RuntimeError] exception expected, not'>
|
1800
|
+
<exception_ class='Minitest::Assertion' message='[RuntimeError] exception expected, not\nClass: <Exception>\nMessage: <"Boo!">\n---Backtrace---\nverdict_assert_raises.rb:9:in `block (2 levels) in test_demo_verdict'\nC:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/minitest_log-1.0.0/lib/verdict_assertion.rb:260:in `block in verdict_assert_raises?'\nC:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/minitest_log-1.0.0/lib/verdict_assertion.rb:272:in `block in _verdict_raises?'\n---------------'>
|
1799
1801
|
<backtrace_>
|
1800
1802
|
<![CDATA[
|
1801
1803
|
verdict_assert_raises.rb:8:in `block in test_demo_verdict'
|
@@ -1885,7 +1887,7 @@ end
|
|
1885
1887
|
<verdict_ method='verdict_assert_same?' outcome='failed' id='another_id' message='Another message'>
|
1886
1888
|
<expected_ class='String' value='"foo"'/>
|
1887
1889
|
<actual_ class='String' value='"foo"'/>
|
1888
|
-
<exception_ class='Minitest::Assertion' message='Expected "foo" (oid=
|
1890
|
+
<exception_ class='Minitest::Assertion' message='Expected # encoding: UTF-8\n"foo" (oid=28462120) to be the same as # encoding: UTF-8\n"foo" (oid=28462140).'>
|
1889
1891
|
<backtrace_>
|
1890
1892
|
<![CDATA[
|
1891
1893
|
verdict_assert_same.rb:6:in `block in test_demo_verdict'
|
@@ -1928,7 +1930,7 @@ end
|
|
1928
1930
|
<log>
|
1929
1931
|
<verdict_ method='verdict_assert_silent?' outcome='passed' id='one_id'/>
|
1930
1932
|
<verdict_ method='verdict_assert_silent?' outcome='failed' id='another_id'>
|
1931
|
-
<exception_ class='Minitest::Assertion' message='In stdout
|
1933
|
+
<exception_ class='Minitest::Assertion' message='In stdout.\n--- expected\n+++ actual\n@@ -1,2 +1 @@\n-# encoding: UTF-8\n-""\n+"Foo"\n'>
|
1932
1934
|
<backtrace_>
|
1933
1935
|
<![CDATA[
|
1934
1936
|
verdict_assert_silent.rb:7:in `block in test_demo_verdict'
|
@@ -2294,7 +2296,7 @@ end
|
|
2294
2296
|
<verdict_ method='verdict_refute_instance_of?' outcome='failed' id='another_id' message='another message'>
|
2295
2297
|
<expected_ class='Class' value='String'/>
|
2296
2298
|
<actual_ class='String' value='"my_string"'/>
|
2297
|
-
<exception_ class='Minitest::Assertion' message='Expected "my_string" to not be an instance of String.'>
|
2299
|
+
<exception_ class='Minitest::Assertion' message='Expected # encoding: UTF-8\n"my_string" to not be an instance of String.'>
|
2298
2300
|
<backtrace_>
|
2299
2301
|
<![CDATA[
|
2300
2302
|
verdict_refute_instance_of.rb:6:in `block in test_demo_verdict'
|
@@ -2384,7 +2386,7 @@ end
|
|
2384
2386
|
<verdict_ method='verdict_refute_match?' outcome='failed' id='another_id' message='Another message'>
|
2385
2387
|
<expected_ class='Regexp' value='/foo/'/>
|
2386
2388
|
<actual_ class='String' value='"food"'/>
|
2387
|
-
<exception_ class='Minitest::Assertion' message='Expected /foo/ to not match "food".'>
|
2389
|
+
<exception_ class='Minitest::Assertion' message='Expected /foo/ to not match # encoding: UTF-8\n"food".'>
|
2388
2390
|
<backtrace_>
|
2389
2391
|
<![CDATA[
|
2390
2392
|
verdict_refute_match.rb:6:in `block in test_demo_verdict'
|
@@ -2519,7 +2521,7 @@ end
|
|
2519
2521
|
<verdict_ method='verdict_refute_predicate?' outcome='failed' id='another_id' message='Another message'>
|
2520
2522
|
<object_ class='String' value='""'/>
|
2521
2523
|
<operator_ class='Symbol' value=':empty?'/>
|
2522
|
-
<exception_ class='Minitest::Assertion' message='Expected "" to not be empty?.'>
|
2524
|
+
<exception_ class='Minitest::Assertion' message='Expected # encoding: UTF-8\n"" to not be empty?.'>
|
2523
2525
|
<backtrace_>
|
2524
2526
|
<![CDATA[
|
2525
2527
|
verdict_refute_predicate.rb:6:in `block in test_demo_verdict'
|
data/lib/minitest_log.rb
CHANGED
@@ -4,9 +4,12 @@ require 'minitest/assertions'
|
|
4
4
|
require 'diff/lcs'
|
5
5
|
|
6
6
|
require_relative 'verdict_assertion'
|
7
|
+
require_relative 'minitest_assertions_patch'
|
7
8
|
|
8
9
|
class MinitestLog
|
9
10
|
|
11
|
+
include REXML
|
12
|
+
include Minitest::Assertions
|
10
13
|
include VerdictAssertion
|
11
14
|
|
12
15
|
attr_accessor \
|
@@ -21,9 +24,6 @@ class MinitestLog
|
|
21
24
|
:error_verdict,
|
22
25
|
:summary
|
23
26
|
|
24
|
-
include REXML
|
25
|
-
include Minitest::Assertions
|
26
|
-
|
27
27
|
class MinitestLogError < Exception; end
|
28
28
|
class NoBlockError < MinitestLogError; end
|
29
29
|
class DuplicateVerdictIdError < MinitestLogError; end
|
@@ -32,42 +32,16 @@ class MinitestLog
|
|
32
32
|
|
33
33
|
def initialize(file_path, options=Hash.new)
|
34
34
|
raise NoBlockError.new('No block given for MinitestLog#new.') unless (block_given?)
|
35
|
-
default_options = Hash[
|
36
|
-
:root_name => 'log',
|
37
|
-
:xml_indentation => 2,
|
38
|
-
:error_verdict => false,
|
39
|
-
:summary => false
|
40
|
-
]
|
41
|
-
options = default_options.merge(options)
|
42
|
-
self.assertions = 0
|
43
35
|
self.file_path = file_path
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
log_puts("REMARK\tThis text log is the precursor for an XML log.")
|
51
|
-
log_puts("REMARK\tIf the logged process completes, this text will be converted to XML.")
|
52
|
-
log_puts("BEGIN\t#{self.root_name}")
|
53
|
-
self.counts = Hash[
|
54
|
-
:verdict => 0,
|
55
|
-
:failure => 0,
|
56
|
-
:error => 0,
|
57
|
-
]
|
58
|
-
begin
|
59
|
-
yield self
|
60
|
-
rescue => x
|
61
|
-
put_element('uncaught_exception', :timestamp, :class => x.class) do
|
62
|
-
put_element('message', x.message)
|
63
|
-
put_element('backtrace') do
|
64
|
-
backtrace = filter_backtrace(x.backtrace)
|
65
|
-
put_pre(backtrace.join("\n"))
|
66
|
-
end
|
36
|
+
handle_options(options)
|
37
|
+
do_log do
|
38
|
+
begin
|
39
|
+
yield self
|
40
|
+
rescue => x
|
41
|
+
handle_exception(x)
|
67
42
|
end
|
68
43
|
end
|
69
|
-
|
70
|
-
nil
|
44
|
+
create_xml_log
|
71
45
|
end
|
72
46
|
|
73
47
|
def section(name, *args)
|
@@ -90,78 +64,12 @@ class MinitestLog
|
|
90
64
|
end
|
91
65
|
|
92
66
|
def put_element(element_name = 'element', *args)
|
93
|
-
|
94
|
-
caller[0].match(/minitest_log.rb/) ||
|
95
|
-
caller[0].match(/verdict_assertion.rb/)
|
96
|
-
# Make the element name special.
|
97
|
-
element_name += '_'
|
98
|
-
elsif element_name.end_with?('_')
|
99
|
-
# Don't accept user's special.
|
100
|
-
message = "Element name should not end with underscore: #{element_name}"
|
101
|
-
raise IllegalElementNameError.new(message)
|
102
|
-
else
|
103
|
-
# Ok.
|
104
|
-
end
|
105
|
-
attributes = {}
|
106
|
-
pcdata = ''
|
107
|
-
start_time = nil
|
108
|
-
duration_to_be_included = false
|
109
|
-
block_to_be_rescued = false
|
110
|
-
args.each do |arg|
|
111
|
-
case
|
112
|
-
when arg.kind_of?(Hash)
|
113
|
-
attributes.merge!(arg)
|
114
|
-
when arg.kind_of?(String)
|
115
|
-
pcdata += arg
|
116
|
-
when arg == :timestamp
|
117
|
-
attributes[:timestamp] = MinitestLog.timestamp
|
118
|
-
when arg == :duration
|
119
|
-
duration_to_be_included = true
|
120
|
-
when arg == :rescue
|
121
|
-
block_to_be_rescued = true
|
122
|
-
else
|
123
|
-
pcdata = pcdata + arg.inspect
|
124
|
-
end
|
125
|
-
end
|
126
|
-
log_puts("BEGIN\t#{element_name}")
|
127
|
-
put_attributes(attributes)
|
128
|
-
unless pcdata.empty?
|
129
|
-
# Guard against using a terminator that's a substring of pcdata.
|
130
|
-
s = 'EOT'
|
131
|
-
terminator = s
|
132
|
-
while pcdata.match(terminator) do
|
133
|
-
terminator += s
|
134
|
-
end
|
135
|
-
log_puts("PCDATA\t<<#{terminator}")
|
136
|
-
log_puts(pcdata)
|
137
|
-
log_puts(terminator)
|
138
|
-
end
|
139
|
-
start_time = Time.new if duration_to_be_included
|
67
|
+
conditioned_element_name = condition_element_name(element_name, caller[0])
|
140
68
|
if block_given?
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
rescue Exception => x
|
145
|
-
put_element('rescued_exception', {:class => x.class, :message => x.message}) do
|
146
|
-
put_element('backtrace') do
|
147
|
-
backtrace = filter_backtrace(x.backtrace)
|
148
|
-
put_pre(backtrace.join("\n"))
|
149
|
-
end
|
150
|
-
end
|
151
|
-
self.counts[:error] += 1
|
152
|
-
end
|
153
|
-
else
|
154
|
-
yield
|
155
|
-
end
|
156
|
-
end
|
157
|
-
if start_time
|
158
|
-
end_time = Time.now
|
159
|
-
duration_f = end_time.to_f - start_time.to_f
|
160
|
-
duration_s = format('%.3f', duration_f)
|
161
|
-
put_attributes({:duration_seconds => duration_s})
|
69
|
+
Element.new(self, conditioned_element_name, *args, &Proc.new)
|
70
|
+
else
|
71
|
+
Element.new(self, conditioned_element_name, *args)
|
162
72
|
end
|
163
|
-
log_puts("END\t#{element_name}")
|
164
|
-
nil
|
165
73
|
end
|
166
74
|
|
167
75
|
def put_each_with_index(name, obj)
|
@@ -273,18 +181,34 @@ class MinitestLog
|
|
273
181
|
|
274
182
|
private
|
275
183
|
|
276
|
-
def
|
184
|
+
def do_log
|
185
|
+
begin_log
|
186
|
+
yield
|
187
|
+
end_log
|
188
|
+
end
|
277
189
|
|
278
|
-
|
190
|
+
def begin_log
|
191
|
+
self.counts = Hash[
|
192
|
+
:verdict => 0,
|
193
|
+
:failure => 0,
|
194
|
+
:error => 0,
|
195
|
+
]
|
196
|
+
self.assertions = 0
|
197
|
+
self.file = File.open(self.file_path, 'w')
|
198
|
+
log_puts("REMARK\tThis text log is the precursor for an XML log.")
|
199
|
+
log_puts("REMARK\tIf the logged process completes, this text will be converted to XML.")
|
200
|
+
log_puts("BEGIN\t#{self.root_name}")
|
201
|
+
end
|
202
|
+
|
203
|
+
def end_log
|
279
204
|
if self.error_verdict
|
280
205
|
verdict_assert_equal?('error_count', 0, self.counts[:error])
|
281
206
|
end
|
282
|
-
|
283
|
-
# Close the text log.
|
284
207
|
log_puts("END\t#{self.root_name}")
|
285
208
|
self.file.close
|
209
|
+
end
|
286
210
|
|
287
|
-
|
211
|
+
def create_xml_log
|
288
212
|
document = REXML::Document.new
|
289
213
|
File.open(self.file_path, 'r') do |file|
|
290
214
|
element = document
|
@@ -374,10 +298,7 @@ class MinitestLog
|
|
374
298
|
end
|
375
299
|
if exception
|
376
300
|
self.counts[:failure] += 1
|
377
|
-
|
378
|
-
# Remove it, so that the message is the same on all platforms.
|
379
|
-
conditioned_message = exception.message.gsub("# encoding: UTF-8\n", '')
|
380
|
-
put_element('exception', {:class => exception.class, :message => conditioned_message}) do
|
301
|
+
put_element('exception', {:class => exception.class, :message => exception.message}) do
|
381
302
|
put_element('backtrace') do
|
382
303
|
backtrace = filter_backtrace(exception.backtrace)
|
383
304
|
put_pre(backtrace.join("\n"))
|
@@ -392,7 +313,7 @@ class MinitestLog
|
|
392
313
|
attributes.each_pair do |name, value|
|
393
314
|
value = case
|
394
315
|
when value.is_a?(String)
|
395
|
-
value
|
316
|
+
value.gsub("\n", "\\n")
|
396
317
|
when value.is_a?(Symbol)
|
397
318
|
value.to_s
|
398
319
|
else
|
@@ -419,19 +340,27 @@ class MinitestLog
|
|
419
340
|
nil
|
420
341
|
end
|
421
342
|
|
422
|
-
def
|
343
|
+
def put_cdata_or_pcdata(token, text)
|
423
344
|
# Guard against using a terminator that's a substring of the cdata.
|
424
345
|
s = 'EOT'
|
425
346
|
terminator = s
|
426
347
|
while text.match(terminator) do
|
427
348
|
terminator += s
|
428
349
|
end
|
429
|
-
log_puts("
|
350
|
+
log_puts("#{token}\t<<#{terminator}")
|
430
351
|
log_puts(text)
|
431
352
|
log_puts(terminator)
|
432
353
|
nil
|
433
354
|
end
|
434
355
|
|
356
|
+
def put_cdata(text)
|
357
|
+
put_cdata_or_pcdata('CDATA', text)
|
358
|
+
end
|
359
|
+
|
360
|
+
def put_pcdata(text)
|
361
|
+
put_cdata_or_pcdata('PCDATA', text)
|
362
|
+
end
|
363
|
+
|
435
364
|
def get_assertion_outcome(verdict_id, assertion_method, *assertion_args)
|
436
365
|
validate_verdict_id(verdict_id)
|
437
366
|
self.counts[:verdict] += 1
|
@@ -471,8 +400,7 @@ class MinitestLog
|
|
471
400
|
while usec_s.length < 3 do
|
472
401
|
usec_s = '0' + usec_s
|
473
402
|
end
|
474
|
-
#
|
475
|
-
ts += ".#{usec_s}"
|
403
|
+
"#{ts}.#{usec_s}"
|
476
404
|
end
|
477
405
|
|
478
406
|
def assertion_method_for(verdict_method)
|
@@ -495,4 +423,160 @@ class MinitestLog
|
|
495
423
|
document
|
496
424
|
end
|
497
425
|
|
426
|
+
def condition_element_name(element_name, caller_0)
|
427
|
+
if caller_is_us?(caller_0)
|
428
|
+
conditioned_element_name = element_name + '_'
|
429
|
+
elsif element_name.end_with?('_')
|
430
|
+
message = "Element name should not end with underscore: #{element_name}"
|
431
|
+
raise IllegalElementNameError.new(message)
|
432
|
+
else
|
433
|
+
conditioned_element_name = element_name
|
434
|
+
end
|
435
|
+
conditioned_element_name
|
436
|
+
end
|
437
|
+
|
438
|
+
def caller_is_us?(caller_0)
|
439
|
+
caller_0.match(/minitest_log.rb/) || caller_0.match(/verdict_assertion.rb/)
|
440
|
+
end
|
441
|
+
|
442
|
+
def handle_options(options)
|
443
|
+
default_options = Hash[
|
444
|
+
:root_name => 'log',
|
445
|
+
:xml_indentation => 2,
|
446
|
+
:error_verdict => false,
|
447
|
+
:summary => false
|
448
|
+
]
|
449
|
+
options = default_options.merge(options)
|
450
|
+
self.root_name = options[:root_name]
|
451
|
+
self.xml_indentation = options[:xml_indentation]
|
452
|
+
self.summary = options[:summary]
|
453
|
+
self.error_verdict = options[:error_verdict] || false
|
454
|
+
self.backtrace_filter = options[:backtrace_filter] || /minitest/
|
455
|
+
end
|
456
|
+
|
457
|
+
def handle_exception(x)
|
458
|
+
put_element('uncaught_exception', :timestamp, :class => x.class) do
|
459
|
+
put_element('message', x.message)
|
460
|
+
put_element('backtrace') do
|
461
|
+
backtrace = filter_backtrace(x.backtrace)
|
462
|
+
put_pre(backtrace.join("\n"))
|
463
|
+
end
|
464
|
+
end
|
465
|
+
end
|
466
|
+
|
467
|
+
class Element
|
468
|
+
|
469
|
+
attr_accessor \
|
470
|
+
:args,
|
471
|
+
:attributes,
|
472
|
+
:block_to_be_rescued,
|
473
|
+
:duration_to_be_included,
|
474
|
+
:element_name,
|
475
|
+
:log,
|
476
|
+
:pcdata,
|
477
|
+
:start_time
|
478
|
+
|
479
|
+
def initialize(log, element_name, *args)
|
480
|
+
|
481
|
+
self.log = log
|
482
|
+
self.element_name = element_name
|
483
|
+
self.args = args
|
484
|
+
|
485
|
+
self.attributes = {}
|
486
|
+
self.block_to_be_rescued = false
|
487
|
+
self.duration_to_be_included = false
|
488
|
+
self.pcdata = ''
|
489
|
+
self.start_time = nil
|
490
|
+
|
491
|
+
process_args
|
492
|
+
put_element do
|
493
|
+
put_attributes
|
494
|
+
put_pcdata
|
495
|
+
do_duration do
|
496
|
+
do_block(&Proc.new) if block_given?
|
497
|
+
end
|
498
|
+
end
|
499
|
+
|
500
|
+
end
|
501
|
+
|
502
|
+
def process_args
|
503
|
+
args.each do |arg|
|
504
|
+
case
|
505
|
+
when arg.kind_of?(Hash)
|
506
|
+
self.attributes.merge!(arg)
|
507
|
+
when arg.kind_of?(String)
|
508
|
+
self.pcdata += arg
|
509
|
+
when arg == :timestamp
|
510
|
+
self.attributes[:timestamp] = MinitestLog.timestamp
|
511
|
+
when arg == :duration
|
512
|
+
self.duration_to_be_included = true
|
513
|
+
when arg == :rescue
|
514
|
+
self.block_to_be_rescued = true
|
515
|
+
else
|
516
|
+
self.pcdata = self.pcdata + arg.inspect
|
517
|
+
end
|
518
|
+
end
|
519
|
+
end
|
520
|
+
|
521
|
+
def put_element
|
522
|
+
log_puts("BEGIN\t#{element_name}")
|
523
|
+
yield
|
524
|
+
log_puts("END\t#{element_name}")
|
525
|
+
end
|
526
|
+
|
527
|
+
def put_attributes
|
528
|
+
log_put_attributes(attributes)
|
529
|
+
end
|
530
|
+
|
531
|
+
def put_pcdata
|
532
|
+
unless pcdata.empty?
|
533
|
+
log.send(:put_pcdata, pcdata)
|
534
|
+
end
|
535
|
+
end
|
536
|
+
|
537
|
+
def do_duration
|
538
|
+
self.start_time = Time.new
|
539
|
+
yield
|
540
|
+
if duration_to_be_included
|
541
|
+
end_time = Time.now
|
542
|
+
duration_f = end_time.to_f - start_time.to_f
|
543
|
+
duration_s = format('%.3f', duration_f)
|
544
|
+
log_put_attributes({:duration_seconds => duration_s})
|
545
|
+
end
|
546
|
+
end
|
547
|
+
|
548
|
+
def do_block
|
549
|
+
if block_to_be_rescued
|
550
|
+
begin
|
551
|
+
yield
|
552
|
+
rescue Exception => x
|
553
|
+
log.put_element('rescued_exception', {:class => x.class, :message => x.message}) do
|
554
|
+
log.put_element('backtrace') do
|
555
|
+
backtrace = log_filter_backtrace(x.backtrace)
|
556
|
+
log.put_pre(backtrace.join("\n"))
|
557
|
+
end
|
558
|
+
end
|
559
|
+
log.counts[:error] += 1
|
560
|
+
end
|
561
|
+
else
|
562
|
+
yield
|
563
|
+
end
|
564
|
+
end
|
565
|
+
|
566
|
+
# The called methods are private.
|
567
|
+
|
568
|
+
def log_puts(s)
|
569
|
+
log.send(:log_puts, s)
|
570
|
+
end
|
571
|
+
|
572
|
+
def log_put_attributes(attributes)
|
573
|
+
log.send(:put_attributes, attributes)
|
574
|
+
end
|
575
|
+
|
576
|
+
def log_filter_backtrace(backtrace)
|
577
|
+
log.send(:filter_backtrace, backtrace)
|
578
|
+
end
|
579
|
+
|
580
|
+
end
|
581
|
+
|
498
582
|
end
|
data/lib/minitest_log/version.rb
CHANGED
data/minitest_log.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.email = ['burdettelamar@yahoo.com']
|
10
10
|
|
11
11
|
spec.summary = %q{Logging for testing with Minitest}
|
12
|
-
spec.description = "Gem minitest_log uses Minitest, adding structured
|
12
|
+
spec.description = "Gem minitest_log uses Minitest, adding structured logging, data explication, and verdicts."
|
13
13
|
spec.homepage = "https://github.com/BurdetteLamar/minitest_log"
|
14
14
|
spec.license = 'MIT'
|
15
15
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: minitest_log
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Burdette Lamar
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -80,7 +80,7 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '1.3'
|
83
|
-
description: Gem minitest_log uses Minitest, adding structured
|
83
|
+
description: Gem minitest_log uses Minitest, adding structured logging, data explication,
|
84
84
|
and verdicts.
|
85
85
|
email:
|
86
86
|
- burdettelamar@yahoo.com
|
@@ -99,6 +99,7 @@ files:
|
|
99
99
|
- lib/helpers/array_helper.rb
|
100
100
|
- lib/helpers/hash_helper.rb
|
101
101
|
- lib/helpers/set_helper.rb
|
102
|
+
- lib/minitest_assertions_patch.rb
|
102
103
|
- lib/minitest_log.rb
|
103
104
|
- lib/minitest_log/version.rb
|
104
105
|
- lib/verdict_assertion.rb
|
@@ -123,8 +124,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
123
124
|
- !ruby/object:Gem::Version
|
124
125
|
version: '0'
|
125
126
|
requirements: []
|
126
|
-
|
127
|
-
rubygems_version: 2.7.6
|
127
|
+
rubygems_version: 3.0.3
|
128
128
|
signing_key:
|
129
129
|
specification_version: 4
|
130
130
|
summary: Logging for testing with Minitest
|