minitest_log 1.0.0 → 1.0.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.
- 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
|