rspec_junit_formatter 0.2.3 → 0.3.0.pre
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
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/README.md +33 -13
- data/lib/rspec_junit_formatter.rb +82 -21
- data/lib/rspec_junit_formatter/rspec2.rb +5 -8
- data/lib/rspec_junit_formatter/rspec3.rb +4 -4
- metadata +14 -28
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f06d768eaf9e411ad68a32229073dc7aa32917e1
|
4
|
+
data.tar.gz: 7d90c8e0eb6e9b786c0a7057f2f6b1645803f685
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 84ffd05878f6574d9d3e20ed9317432dbfb8f87894d5aa87264048ee8e6cd233b1f61dd28e1b1f5c9b614d7b89bc6e2627855c2cc17fd742492b2c8a2dc3946c
|
7
|
+
data.tar.gz: 3f9e1f4d8d3cad02103a3cb4a43446ebecc19d207ad891360d997efc2090adf9e82fa67b8db18913d4f74fd20df3855b29fa430aea3288f08b0a69b2c0df7465
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/README.md
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# RSpec JUnit Formatter
|
2
2
|
|
3
|
-
[](https://travis-ci.org/sj26/rspec_junit_formatter)
|
4
|
-
[](https://rubygems.org/
|
3
|
+
[](https://travis-ci.org/sj26/rspec_junit_formatter)
|
4
|
+
[](https://rubygems.org/gems/rspec_junit_formatter)
|
5
5
|
|
6
|
-
[RSpec][rspec] 2 & 3 results that [Jenkins][jenkins] can read. Probably a few other CI
|
6
|
+
[RSpec][rspec] 2 & 3 results that [Jenkins][jenkins] can read. Probably a few other CI services, too.
|
7
7
|
|
8
8
|
Inspired by the work of [Diego Souza][dgvncsz0f] on [RSpec Formatters][dgvncsz0f/rspec_formatters] after frustration with [CI Reporter][ci_reporter].
|
9
9
|
|
@@ -11,35 +11,55 @@ Inspired by the work of [Diego Souza][dgvncsz0f] on [RSpec Formatters][dgvncsz0f
|
|
11
11
|
|
12
12
|
Install the gem:
|
13
13
|
|
14
|
-
|
14
|
+
```sh
|
15
|
+
gem install rspec_junit_formatter
|
16
|
+
```
|
15
17
|
|
16
18
|
Use it:
|
17
19
|
|
18
|
-
|
20
|
+
```sh
|
21
|
+
rspec --format RspecJunitFormatter --out rspec.xml
|
22
|
+
```
|
19
23
|
|
20
|
-
You'll get an XML file with your results in it.
|
24
|
+
You'll get an XML file `rspec.xml` with your results in it.
|
21
25
|
|
22
|
-
|
26
|
+
You can use it in combination with other [formatters][rspec-formatters], too:
|
27
|
+
|
28
|
+
```sh
|
29
|
+
rspec --format progress --format RspecJunitFormatter --out rspec.xml
|
30
|
+
```
|
31
|
+
|
32
|
+
### Using in your project with Bundler
|
23
33
|
|
24
34
|
Add it to your Gemfile if you're using [Bundler][bundler]. Put it in the same groups as rspec.
|
25
35
|
|
26
|
-
|
36
|
+
```ruby
|
37
|
+
group :test do
|
38
|
+
gem "rspec"
|
39
|
+
gem "rspec_junit_formatter"
|
40
|
+
end
|
41
|
+
```
|
27
42
|
|
28
|
-
|
29
|
-
--out rspec.xml
|
43
|
+
Put the same arguments as the commands above in [your `.rspec`][rspec-file]:
|
30
44
|
|
31
|
-
|
45
|
+
```
|
46
|
+
--format RspecJunitFormatter
|
47
|
+
--out rspec.xml
|
48
|
+
```
|
32
49
|
|
33
50
|
## Roadmap
|
34
51
|
|
35
|
-
* It would be nice to split things up into individual test suites, although
|
36
|
-
|
52
|
+
* It would be nice to split things up into individual test suites, although
|
53
|
+
would this correspond to example groups? The subject? The spec file? Not
|
54
|
+
sure yet.
|
37
55
|
|
38
56
|
## License
|
39
57
|
|
40
58
|
The MIT License, see [LICENSE][license].
|
41
59
|
|
42
60
|
[rspec]: http://rspec.info/
|
61
|
+
[rspec-formatters]: https://relishapp.com/rspec/rspec-core/v/3-6/docs/formatters
|
62
|
+
[rspec-file]: https://relishapp.com/rspec/rspec-core/v/3-6/docs/configuration/read-command-line-configuration-options-from-files
|
43
63
|
[jenkins]: http://jenkins-ci.org/
|
44
64
|
[dgvncsz0f]: https://github.com/dgvncsz0f
|
45
65
|
[dgvncsz0f/rspec_formatters]: https://github.com/dgvncsz0f/rspec_formatters
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require "time"
|
2
|
-
require "builder"
|
3
2
|
|
4
3
|
require "rspec/core"
|
5
4
|
require "rspec/core/formatters/base_formatter"
|
@@ -11,17 +10,24 @@ class RSpecJUnitFormatter < RSpec::Core::Formatters::BaseFormatter
|
|
11
10
|
|
12
11
|
private
|
13
12
|
|
14
|
-
def xml
|
15
|
-
@xml ||= Builder::XmlMarkup.new target: output, indent: 2
|
16
|
-
end
|
17
|
-
|
18
13
|
def xml_dump
|
19
|
-
xml.
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
14
|
+
output << %{<?xml version="1.0" encoding="UTF-8"?>\n}
|
15
|
+
output << %{<testsuite}
|
16
|
+
output << %{ name="rspec#{escape(ENV["TEST_ENV_NUMBER"].to_s)}"}
|
17
|
+
output << %{ tests="#{example_count}"}
|
18
|
+
output << %{ failures="#{failure_count}"}
|
19
|
+
output << %{ errors="0"}
|
20
|
+
output << %{ time="#{escape("%.6f" % duration)}"}
|
21
|
+
output << %{ timestamp="#{escape(started.iso8601)}"}
|
22
|
+
output << %{>\n}
|
23
|
+
output << %{<properties>\n}
|
24
|
+
output << %{<property}
|
25
|
+
output << %{ name="seed"}
|
26
|
+
output << %{ value="#{escape(RSpec.configuration.seed.to_s)}"}
|
27
|
+
output << %{/>\n}
|
28
|
+
output << %{</properties>\n}
|
29
|
+
xml_dump_examples
|
30
|
+
output << %{</testsuite>\n}
|
25
31
|
end
|
26
32
|
|
27
33
|
def xml_dump_examples
|
@@ -36,30 +42,85 @@ private
|
|
36
42
|
|
37
43
|
def xml_dump_pending(example)
|
38
44
|
xml_dump_example(example) do
|
39
|
-
|
45
|
+
output << %{<skipped/>}
|
40
46
|
end
|
41
47
|
end
|
42
48
|
|
43
49
|
def xml_dump_failed(example)
|
44
50
|
exception = exception_for(example)
|
45
|
-
backtrace = formatted_backtrace_for(example)
|
46
51
|
|
47
52
|
xml_dump_example(example) do
|
48
|
-
|
49
|
-
|
50
|
-
|
53
|
+
output << %{<failure}
|
54
|
+
output << %{ message="#{escape(exception.to_s)}"}
|
55
|
+
output << %{ type="#{escape(exception.class.name)}"}
|
56
|
+
output << %{>}
|
57
|
+
output << escape(failure_for(example))
|
58
|
+
output << %{</failure>}
|
51
59
|
end
|
52
60
|
end
|
53
61
|
|
54
|
-
def xml_dump_example(example
|
55
|
-
|
62
|
+
def xml_dump_example(example)
|
63
|
+
output << %{<testcase}
|
64
|
+
output << %{ classname="#{escape(classname_for(example))}"}
|
65
|
+
output << %{ name="#{escape(description_for(example))}"}
|
66
|
+
output << %{ file="#{escape(example_group_file_path_for(example))}"}
|
67
|
+
output << %{ time="#{escape("%.6f" % duration_for(example))}"}
|
68
|
+
output << %{>}
|
69
|
+
yield if block_given?
|
70
|
+
output << %{</testcase>\n}
|
71
|
+
end
|
72
|
+
|
73
|
+
# Based on valid characters allowed in XML unescaped, with restricted and
|
74
|
+
# discouraged characters removed
|
75
|
+
#
|
76
|
+
# See https://www.w3.org/TR/xml/#dt-chardata
|
77
|
+
ESCAPE_REGEXP = Regexp.new(
|
78
|
+
"[^" <<
|
79
|
+
"\u{9}" << # => \t
|
80
|
+
"\u{a}" << # =>\n
|
81
|
+
"\u{d}" << # => \r
|
82
|
+
"\u{20}-\u{21}" <<
|
83
|
+
# "\u{22}" << # => "
|
84
|
+
"\u{23}-\u{25}" <<
|
85
|
+
# "\u{26}" << # => &
|
86
|
+
# "\u{27}" << # => '
|
87
|
+
"\u{28}-\u{3b}" <<
|
88
|
+
# "\u{3c}" << # => <
|
89
|
+
"\u{3d}" <<
|
90
|
+
# "\u{3e}" << # => >
|
91
|
+
"\u{3f}-\u{7e}" <<
|
92
|
+
# "\u{7f}-\u{84}" << # discouraged control characters
|
93
|
+
"\u{85}" <<
|
94
|
+
# "\u{86}-\u{9f}" << # discouraged control characters
|
95
|
+
"\u{a0}-\u{d7ff}" <<
|
96
|
+
"\u{e000}-\u{ffcf}" <<
|
97
|
+
# "\u{ffd0}-\u{fdef}" <<
|
98
|
+
"\u{fdf0}-\u{fffd}" <<
|
99
|
+
# things get murky from here, just escape anything with a higher codepoint
|
100
|
+
# "\u{10000}-\u{10ffff}" <<
|
101
|
+
"]"
|
102
|
+
)
|
103
|
+
|
104
|
+
# Translate well-known entities, or use generic unicode hex entity
|
105
|
+
ESCAPE_ENTITY = Hash.new { |_, c| "&##{c.ord.to_s(16)};".freeze }.update(
|
106
|
+
?" => """.freeze,
|
107
|
+
?& => "&".freeze,
|
108
|
+
?' => "'".freeze,
|
109
|
+
?< => "<".freeze,
|
110
|
+
?> => ">".freeze,
|
111
|
+
).freeze
|
112
|
+
|
113
|
+
def escape(text)
|
114
|
+
# Make sure it's utf-8 (this will throw errors for bad output, but that
|
115
|
+
# seems okay) and replace invalid xml characters with entities
|
116
|
+
text.to_s.encode(Encoding::UTF_8).gsub(ESCAPE_REGEXP, ESCAPE_ENTITY)
|
56
117
|
end
|
57
118
|
end
|
58
119
|
|
59
120
|
RspecJunitFormatter = RSpecJUnitFormatter
|
60
121
|
|
61
|
-
if RSpec::Core::Version::STRING.start_with? "
|
62
|
-
require "rspec_junit_formatter/rspec3"
|
63
|
-
else RSpec::Core::Version::STRING.start_with? "2."
|
122
|
+
if RSpec::Core::Version::STRING.start_with? "2."
|
64
123
|
require "rspec_junit_formatter/rspec2"
|
124
|
+
else
|
125
|
+
require "rspec_junit_formatter/rspec3"
|
65
126
|
end
|
@@ -13,12 +13,6 @@ class RSpecJUnitFormatter < RSpec::Core::Formatters::BaseFormatter
|
|
13
13
|
|
14
14
|
private
|
15
15
|
|
16
|
-
def xml_dump_examples
|
17
|
-
examples.each do |example|
|
18
|
-
send :"xml_dump_#{example.execution_result[:status]}", example
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
16
|
def result_of(example)
|
23
17
|
example.execution_result[:status]
|
24
18
|
end
|
@@ -48,7 +42,10 @@ private
|
|
48
42
|
example.execution_result[:exception]
|
49
43
|
end
|
50
44
|
|
51
|
-
def
|
52
|
-
|
45
|
+
def failure_for(example)
|
46
|
+
exception = exception_for(example)
|
47
|
+
backtrace = format_backtrace(exception.backtrace, example)
|
48
|
+
|
49
|
+
"#{exception.message}\n#{backtrace.join("\n")}"
|
53
50
|
end
|
54
51
|
end
|
@@ -60,11 +60,11 @@ private
|
|
60
60
|
notification.example.full_description
|
61
61
|
end
|
62
62
|
|
63
|
-
def
|
64
|
-
notification.
|
63
|
+
def failure_for(notification)
|
64
|
+
notification.message_lines.join("\n") << "\n" << notification.formatted_backtrace.join("\n")
|
65
65
|
end
|
66
66
|
|
67
|
-
def
|
68
|
-
notification.
|
67
|
+
def exception_for(notification)
|
68
|
+
notification.example.execution_result.exception
|
69
69
|
end
|
70
70
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec_junit_formatter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Cochran
|
@@ -10,9 +10,9 @@ bindir: bin
|
|
10
10
|
cert_chain:
|
11
11
|
- |
|
12
12
|
-----BEGIN CERTIFICATE-----
|
13
|
-
|
13
|
+
MIIDKDCCAhCgAwIBAgIBBDANBgkqhkiG9w0BAQUFADA6MQ0wCwYDVQQDDARzajI2
|
14
14
|
MRQwEgYKCZImiZPyLGQBGRYEc2oyNjETMBEGCgmSJomT8ixkARkWA2NvbTAeFw0x
|
15
|
-
|
15
|
+
NjA3MjYxMTIxMjZaFw0xNzA3MjYxMTIxMjZaMDoxDTALBgNVBAMMBHNqMjYxFDAS
|
16
16
|
BgoJkiaJk/IsZAEZFgRzajI2MRMwEQYKCZImiZPyLGQBGRYDY29tMIIBIjANBgkq
|
17
17
|
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr60Eo/ttCk8GMTMFiPr3GoYMIMFvLak
|
18
18
|
xSmTk9YGCB6UiEePB4THSSA5w6IPyeaCF/nWkDp3/BAam0eZMWG1IzYQB23TqIM0
|
@@ -21,14 +21,14 @@ cert_chain:
|
|
21
21
|
4O/FL2ChjL2CPCpLZW55ShYyrzphWJwLOJe+FJ/ZBl6YXwrzQM9HKnt4titSNvyU
|
22
22
|
KzE3L63A3PZvExzLrN9u09kuWLLJfXB2sGOlw3n9t72rJiuBr3/OQQIDAQABozkw
|
23
23
|
NzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU99dfRjEKFyczTeIz
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
24
|
+
m3ZsDWrNC80wDQYJKoZIhvcNAQEFBQADggEBAH//VnNBPm1b6MCuqaLLkulf2rqq
|
25
|
+
7P8OY517doHl3uDKBeAvG0ufJ1Hk3yDCaoSnkP+JlpF3bPA9VFO/omKEMOLcEKEC
|
26
|
+
9X6kFHhGo2jTRBAwaJ3OXvsm5bi5ZE0oivVh/QXpNOkLM+hqozLjquXrZ8la5KL8
|
27
|
+
jv7OM8j53TJA004uwxjuVK+nEqiril93acOe2tKdDedd0Qb0KrObFYY/en6OV92h
|
28
|
+
bn56+Lu22lsUMYD62lUEdAPyYn1/JLPfq47UEuV1p5gy/f++aTxknsAYE/z/bfmO
|
29
|
+
EkIxoeESVQ0Kqhp754GWYv3Sfmtyk8UbGo5XCZHzvC6h2G7mplPzh6o+Edw=
|
30
30
|
-----END CERTIFICATE-----
|
31
|
-
date:
|
31
|
+
date: 2017-06-08 00:00:00.000000000 Z
|
32
32
|
dependencies:
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: rspec-core
|
@@ -56,20 +56,6 @@ dependencies:
|
|
56
56
|
- - "!="
|
57
57
|
- !ruby/object:Gem::Version
|
58
58
|
version: 2.12.0
|
59
|
-
- !ruby/object:Gem::Dependency
|
60
|
-
name: builder
|
61
|
-
requirement: !ruby/object:Gem::Requirement
|
62
|
-
requirements:
|
63
|
-
- - "<"
|
64
|
-
- !ruby/object:Gem::Version
|
65
|
-
version: '4'
|
66
|
-
type: :runtime
|
67
|
-
prerelease: false
|
68
|
-
version_requirements: !ruby/object:Gem::Requirement
|
69
|
-
requirements:
|
70
|
-
- - "<"
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
version: '4'
|
73
59
|
- !ruby/object:Gem::Dependency
|
74
60
|
name: nokogiri
|
75
61
|
requirement: !ruby/object:Gem::Requirement
|
@@ -84,7 +70,7 @@ dependencies:
|
|
84
70
|
- - "~>"
|
85
71
|
- !ruby/object:Gem::Version
|
86
72
|
version: '1.6'
|
87
|
-
description: RSpec results that
|
73
|
+
description: RSpec results that your continuous integration service can read.
|
88
74
|
email: sj26@sj26.com
|
89
75
|
executables: []
|
90
76
|
extensions: []
|
@@ -107,15 +93,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
107
93
|
requirements:
|
108
94
|
- - ">="
|
109
95
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
96
|
+
version: 2.0.0
|
111
97
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
98
|
requirements:
|
113
99
|
- - ">="
|
114
100
|
- !ruby/object:Gem::Version
|
115
|
-
version:
|
101
|
+
version: 2.0.0
|
116
102
|
requirements: []
|
117
103
|
rubyforge_project:
|
118
|
-
rubygems_version: 2.
|
104
|
+
rubygems_version: 2.6.11
|
119
105
|
signing_key:
|
120
106
|
specification_version: 4
|
121
107
|
summary: RSpec JUnit XML formatter
|
metadata.gz.sig
CHANGED
Binary file
|