rspec_junit_formatter 0.2.3 → 0.3.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
[![Build results](http://img.shields.io/travis/sj26/rspec_junit_formatter.svg)](https://travis-ci.org/sj26/rspec_junit_formatter)
|
4
|
-
[![Gem version](http://img.shields.io/gem/v/rspec_junit_formatter.svg)](https://rubygems.org/
|
3
|
+
[![Build results](http://img.shields.io/travis/sj26/rspec_junit_formatter/master.svg)](https://travis-ci.org/sj26/rspec_junit_formatter)
|
4
|
+
[![Gem version](http://img.shields.io/gem/v/rspec_junit_formatter.svg)](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
|