parallel_report_portal 2.3.0 → 2.5.0
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 +3 -0
- data/lib/parallel_report_portal/after_launch.rb +13 -0
- data/lib/parallel_report_portal/configuration.rb +7 -7
- data/lib/parallel_report_portal/cucumber/report.rb +56 -39
- data/lib/parallel_report_portal/version.rb +1 -1
- data/lib/parallel_report_portal.rb +4 -2
- data/parallel_report_portal.gemspec +2 -1
- metadata +25 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dca25702756ef6361e293e078cbca0e4a7b3e58e01a172729f49a319fa43fd15
|
4
|
+
data.tar.gz: 81397b39a9131c2ef601e782da487c7ec5be55cb6a90e8ba98d00de5c95248b5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b1fd11d745dbba815364eadb751c9d8c15ff23fa36fd3c40490d1e2d718c125cc7d83cd7d4f8ca1540114ee86898b2fafc1405809506a92857840adc260d801
|
7
|
+
data.tar.gz: ef8ba69e9d7cf3f61f78e56b3df1e8e256541192f22c1656267268c5c97a0878bb76ddc5f0411184f12a14d89bdc4396a99aaca2b267e92620204393fb38668d
|
data/.gitignore
CHANGED
@@ -1,23 +1,23 @@
|
|
1
1
|
module ParallelReportPortal
|
2
2
|
# The Configuration class holds the connection properties to communicate with
|
3
3
|
# Report Portal and to identify the user and project for reporting.
|
4
|
-
#
|
4
|
+
#
|
5
5
|
# It attempts to load a configuration file called +report_portal.yml+ first in a
|
6
6
|
# local directory called +config+ and if that's not found in the current directory.
|
7
7
|
# (Report Portal actually tells you to create a files called +REPORT_PORTAL.YML+ in
|
8
|
-
# uppercase -- for this reason the initializer is case insensitive with regards to
|
8
|
+
# uppercase -- for this reason the initializer is case insensitive with regards to
|
9
9
|
# the file name)
|
10
|
-
#
|
10
|
+
#
|
11
11
|
# It will then try an apply the following environment variables, if present (these
|
12
12
|
# can be specified in either lowercase for backwards compatibility with the official
|
13
13
|
# gem or in uppercase for reasons of sanity)
|
14
|
-
#
|
14
|
+
#
|
15
15
|
# == Environment variables
|
16
|
-
#
|
16
|
+
#
|
17
17
|
# RP_UUID:: The UUID of the user associated with this launch
|
18
18
|
# RP_ENDPOINT:: the URL of the Report Portal API endpoint
|
19
19
|
# RP_PROJECT:: the Report Portal project name -- this must already exist within Report Port and this user must be a member of the project
|
20
|
-
# RP_LAUNCH:: The name of this launch
|
20
|
+
# RP_LAUNCH:: The name of this launch
|
21
21
|
# RP_DESCRIPTION:: A textual string describing this launch
|
22
22
|
# RP_TAGS:: A set of tags to pass to Report Portal for this launch. If these are set via an environment variable, provide a comma-separated string of tags
|
23
23
|
# RP_ATTRIBUTES:: A set of attribute tags to pass to Report Portal for this launch. If these are set via an environment variable, provide a comma-separated string of attributes
|
@@ -52,7 +52,6 @@ module ParallelReportPortal
|
|
52
52
|
# @return [Integer] the number of seconds for the read connection to timeout
|
53
53
|
attr_accessor :read_timeout
|
54
54
|
|
55
|
-
|
56
55
|
# Create an instance of Configuration.
|
57
56
|
#
|
58
57
|
# The initializer will first attempt to load a configuration files called
|
@@ -101,6 +100,7 @@ module ParallelReportPortal
|
|
101
100
|
end
|
102
101
|
end
|
103
102
|
|
103
|
+
|
104
104
|
# Simple method to obtain an attribute from this class or set default value
|
105
105
|
# param [symbol] a symbol version of the attribute
|
106
106
|
def fetch(key, default_value)
|
@@ -1,42 +1,51 @@
|
|
1
1
|
require 'faraday'
|
2
|
+
require 'faraday/net_http_persistent'
|
3
|
+
require 'faraday/multipart'
|
2
4
|
require 'tree'
|
3
5
|
|
4
6
|
module ParallelReportPortal
|
5
7
|
module Cucumber
|
6
8
|
# Report object. This handles the management of the state hierarchy and
|
7
|
-
# the issuing of the requests to the HTTP module.
|
9
|
+
# the issuing of the requests to the HTTP module.
|
8
10
|
class Report
|
9
|
-
|
11
|
+
|
10
12
|
attr_reader :launch_id
|
11
|
-
|
13
|
+
|
12
14
|
Feature = Struct.new(:feature, :id)
|
13
|
-
|
14
|
-
LOG_LEVELS = {
|
15
|
-
error: 'ERROR',
|
16
|
-
warn: 'WARN',
|
17
|
-
info: 'INFO',
|
18
|
-
debug: 'DEBUG',
|
19
|
-
trace: 'TRACE',
|
20
|
-
fatal: 'FATAL',
|
21
|
-
unknown: 'UNKNOWN'
|
15
|
+
|
16
|
+
LOG_LEVELS = {
|
17
|
+
error: 'ERROR',
|
18
|
+
warn: 'WARN',
|
19
|
+
info: 'INFO',
|
20
|
+
debug: 'DEBUG',
|
21
|
+
trace: 'TRACE',
|
22
|
+
fatal: 'FATAL',
|
23
|
+
unknown: 'UNKNOWN'
|
22
24
|
}
|
23
25
|
|
24
|
-
|
26
|
+
|
25
27
|
# Create a new instance of the report
|
26
28
|
def initialize(ast_lookup = nil)
|
27
29
|
@feature = nil
|
28
|
-
@tree = Tree::TreeNode.new( 'root' )
|
30
|
+
@tree = Tree::TreeNode.new( 'root' )
|
29
31
|
@ast_lookup = ast_lookup
|
32
|
+
check_faraday_compatibility
|
33
|
+
end
|
34
|
+
|
35
|
+
def check_faraday_compatibility
|
36
|
+
if Gem::Version.create(Faraday::VERSION) < Gem::Version.create('2.0')
|
37
|
+
Kernel.warn("Minimum of Faraday v2 is expected for compatibility with parallel_report_portal", category: :deprecated)
|
38
|
+
end
|
30
39
|
end
|
31
|
-
|
40
|
+
|
32
41
|
# Issued to start a launch. It is possilbe that this method could be called
|
33
42
|
# from multiple processes for the same launch if this is being run with
|
34
43
|
# parallel tests enabled. A temporary launch file will be created (using
|
35
44
|
# exclusive locking). The first time this method is called it will write the
|
36
45
|
# launch id to the launch file, subsequent calls by other processes will read
|
37
46
|
# this launch id and use that.
|
38
|
-
#
|
39
|
-
# @param start_time [Integer] the millis from the epoch
|
47
|
+
#
|
48
|
+
# @param start_time [Integer] the millis from the epoch
|
40
49
|
# @return [String] the UUID of this launch
|
41
50
|
def launch_started(start_time)
|
42
51
|
ParallelReportPortal.file_open_exlock_and_block(ParallelReportPortal.launch_id_file, 'a+' ) do |file|
|
@@ -50,39 +59,42 @@ module ParallelReportPortal
|
|
50
59
|
@launch_id
|
51
60
|
end
|
52
61
|
end
|
53
|
-
|
62
|
+
|
54
63
|
# Called to finish a launch. Any open children items will be closed in the process.
|
55
|
-
#
|
64
|
+
#
|
56
65
|
# @param clock [Integer] the millis from the epoch
|
57
66
|
def launch_finished(clock)
|
58
67
|
@tree.postordered_each do |node|
|
59
|
-
ParallelReportPortal.req_feature_finished(node.content, clock) unless node.is_root?
|
68
|
+
response = ParallelReportPortal.req_feature_finished(node.content, clock) unless node.is_root?
|
69
|
+
parse_report_link_from_response(response)
|
60
70
|
end
|
61
|
-
ParallelReportPortal.req_launch_finished(launch_id, clock)
|
71
|
+
response = ParallelReportPortal.req_launch_finished(launch_id, clock)
|
72
|
+
parse_report_link_from_response(response)
|
73
|
+
ParallelReportPortal.launch_finished_block.call if ParallelReportPortal.launch_finished_block
|
62
74
|
end
|
63
|
-
|
75
|
+
|
64
76
|
# Called to indicate that a feature has started.
|
65
|
-
#
|
66
|
-
# @param
|
77
|
+
#
|
78
|
+
# @param
|
67
79
|
def feature_started(feature, clock)
|
68
80
|
parent_id = hierarchy(feature, clock)
|
69
81
|
feature = feature.feature if using_cucumber_messages?
|
70
82
|
ParallelReportPortal.req_feature_started(launch_id, parent_id, feature, clock)
|
71
83
|
end
|
72
|
-
|
84
|
+
|
73
85
|
def feature_finished(clock)
|
74
86
|
if @feature
|
75
87
|
resp = ParallelReportPortal.req_feature_finished(@feature.id, clock)
|
76
88
|
end
|
77
89
|
end
|
78
|
-
|
90
|
+
|
79
91
|
def test_case_started(event, clock)
|
80
92
|
test_case = lookup_test_case(event.test_case)
|
81
93
|
feature = lookup_feature(event.test_case)
|
82
94
|
feature = current_feature(feature, clock)
|
83
95
|
@test_case_id = ParallelReportPortal.req_test_case_started(launch_id, feature.id, test_case, clock)
|
84
96
|
end
|
85
|
-
|
97
|
+
|
86
98
|
def test_case_finished(event, clock)
|
87
99
|
result = event.result
|
88
100
|
status = result.to_sym
|
@@ -93,7 +105,7 @@ module ParallelReportPortal
|
|
93
105
|
end
|
94
106
|
resp = ParallelReportPortal.req_test_case_finished(@test_case_id, status, clock)
|
95
107
|
end
|
96
|
-
|
108
|
+
|
97
109
|
def test_step_started(event, clock)
|
98
110
|
test_step = event.test_step
|
99
111
|
if !hook?(test_step)
|
@@ -104,11 +116,11 @@ module ParallelReportPortal
|
|
104
116
|
elsif (using_cucumber_messages? ? test_step : step_source).multiline_arg.data_table?
|
105
117
|
detail << (using_cucumber_messages? ? test_step : step_source).multiline_arg.raw.reduce("\n") {|acc, row| acc << "| #{row.join(' | ')} |\n"}
|
106
118
|
end
|
107
|
-
|
119
|
+
|
108
120
|
ParallelReportPortal.req_log(@test_case_id, detail, status_to_level(:trace), clock)
|
109
121
|
end
|
110
122
|
end
|
111
|
-
|
123
|
+
|
112
124
|
def test_step_finished(event, clock)
|
113
125
|
test_step = event.test_step
|
114
126
|
result = event.result
|
@@ -129,13 +141,13 @@ module ParallelReportPortal
|
|
129
141
|
ParallelReportPortal.req_log(@test_case_id, detail, status_to_level(status), clock) if detail
|
130
142
|
|
131
143
|
end
|
132
|
-
|
144
|
+
|
133
145
|
private
|
134
146
|
|
135
147
|
def using_cucumber_messages?
|
136
148
|
@ast_lookup != nil
|
137
149
|
end
|
138
|
-
|
150
|
+
|
139
151
|
def hierarchy(feature, clock)
|
140
152
|
node = nil
|
141
153
|
path_components = if using_cucumber_messages?
|
@@ -144,7 +156,7 @@ module ParallelReportPortal
|
|
144
156
|
feature.location.file.split(File::SEPARATOR)
|
145
157
|
end
|
146
158
|
ParallelReportPortal.file_open_exlock_and_block(ParallelReportPortal.hierarchy_file, 'a+b' ) do |file|
|
147
|
-
@tree = Marshal.load(File.read(file)) if file.size > 0
|
159
|
+
@tree = Marshal.load(File.read(file)) if file.size > 0
|
148
160
|
node = @tree.root
|
149
161
|
path_components[0..-2].each do |component|
|
150
162
|
next_node = node[component]
|
@@ -161,7 +173,7 @@ module ParallelReportPortal
|
|
161
173
|
file.write(Marshal.dump(@tree))
|
162
174
|
file.flush
|
163
175
|
end
|
164
|
-
|
176
|
+
|
165
177
|
node.content
|
166
178
|
end
|
167
179
|
|
@@ -193,7 +205,7 @@ module ParallelReportPortal
|
|
193
205
|
step.source.last
|
194
206
|
end
|
195
207
|
end
|
196
|
-
|
208
|
+
|
197
209
|
def current_feature(feature, clock)
|
198
210
|
if @feature&.feature == feature
|
199
211
|
@feature
|
@@ -202,7 +214,7 @@ module ParallelReportPortal
|
|
202
214
|
@feature = Feature.new(feature, feature_started(feature, clock))
|
203
215
|
end
|
204
216
|
end
|
205
|
-
|
217
|
+
|
206
218
|
def hook?(test_step)
|
207
219
|
if using_cucumber_messages?
|
208
220
|
test_step.hook?
|
@@ -210,7 +222,7 @@ module ParallelReportPortal
|
|
210
222
|
! test_step.source.last.respond_to?(:keyword)
|
211
223
|
end
|
212
224
|
end
|
213
|
-
|
225
|
+
|
214
226
|
def status_to_level(status)
|
215
227
|
case status
|
216
228
|
when :passed
|
@@ -223,8 +235,13 @@ module ParallelReportPortal
|
|
223
235
|
LOG_LEVELS.fetch(status, LOG_LEVELS[:info])
|
224
236
|
end
|
225
237
|
end
|
226
|
-
|
227
|
-
|
238
|
+
|
239
|
+
def parse_report_link_from_response(response)
|
240
|
+
if response
|
241
|
+
json = JSON.parse(response.body)
|
242
|
+
ParallelReportPortal.report_url = json['link'] if json['link']
|
243
|
+
end
|
244
|
+
end
|
228
245
|
end
|
229
246
|
end
|
230
247
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'parallel_report_portal/after_launch'
|
1
2
|
require "parallel_report_portal/clock"
|
2
3
|
require "parallel_report_portal/configuration"
|
3
4
|
require "parallel_report_portal/file_utils"
|
@@ -8,19 +9,20 @@ require 'parallel_tests'
|
|
8
9
|
module ParallelReportPortal
|
9
10
|
class Error < StandardError; end
|
10
11
|
|
12
|
+
extend ParallelReportPortal::AfterLaunch
|
11
13
|
extend ParallelReportPortal::HTTP
|
12
14
|
extend ParallelReportPortal::FileUtils
|
13
15
|
extend ParallelReportPortal::Clock
|
14
16
|
|
15
17
|
# Returns the configuration object, initializing it if necessary.
|
16
|
-
#
|
18
|
+
#
|
17
19
|
# @return [Configuration] the configuration object
|
18
20
|
def self.configuration
|
19
21
|
@configuration ||= Configuration.new
|
20
22
|
end
|
21
23
|
|
22
24
|
# Configures the Report Portal environment.
|
23
|
-
#
|
25
|
+
#
|
24
26
|
# @yieldparam [Configuration] config the configuration object yielded to the block
|
25
27
|
def self.configure(&block)
|
26
28
|
yield configuration
|
@@ -38,7 +38,8 @@ Gem::Specification.new do |spec|
|
|
38
38
|
spec.add_development_dependency "webmock", "~> 3.12"
|
39
39
|
|
40
40
|
spec.add_runtime_dependency 'cucumber', '>= 3.2'
|
41
|
-
spec.add_runtime_dependency 'faraday', '~> 1
|
41
|
+
spec.add_runtime_dependency 'faraday-net_http_persistent', '~> 2.1'
|
42
|
+
spec.add_runtime_dependency 'faraday-multipart', '~> 1.0', '>= 1.0.4'
|
42
43
|
spec.add_runtime_dependency 'parallel_tests', '>= 2.29.1'
|
43
44
|
spec.add_runtime_dependency 'rubytree', '~> 1.0'
|
44
45
|
spec.add_runtime_dependency 'net-http-persistent', '~> 4.0'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: parallel_report_portal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nigel Brookes-Thomas
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2023-03-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: appraisal
|
@@ -124,12 +124,29 @@ dependencies:
|
|
124
124
|
- !ruby/object:Gem::Version
|
125
125
|
version: '3.2'
|
126
126
|
- !ruby/object:Gem::Dependency
|
127
|
-
name: faraday
|
127
|
+
name: faraday-net_http_persistent
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - "~>"
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '2.1'
|
133
|
+
type: :runtime
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - "~>"
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '2.1'
|
140
|
+
- !ruby/object:Gem::Dependency
|
141
|
+
name: faraday-multipart
|
128
142
|
requirement: !ruby/object:Gem::Requirement
|
129
143
|
requirements:
|
130
144
|
- - "~>"
|
131
145
|
- !ruby/object:Gem::Version
|
132
146
|
version: '1.0'
|
147
|
+
- - ">="
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: 1.0.4
|
133
150
|
type: :runtime
|
134
151
|
prerelease: false
|
135
152
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -137,6 +154,9 @@ dependencies:
|
|
137
154
|
- - "~>"
|
138
155
|
- !ruby/object:Gem::Version
|
139
156
|
version: '1.0'
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: 1.0.4
|
140
160
|
- !ruby/object:Gem::Dependency
|
141
161
|
name: parallel_tests
|
142
162
|
requirement: !ruby/object:Gem::Requirement
|
@@ -205,6 +225,7 @@ files:
|
|
205
225
|
- gemfiles/cucumber_6.0.gemfile
|
206
226
|
- lib/parallel_report_portal.rb
|
207
227
|
- lib/parallel_report_portal/.DS_Store
|
228
|
+
- lib/parallel_report_portal/after_launch.rb
|
208
229
|
- lib/parallel_report_portal/clock.rb
|
209
230
|
- lib/parallel_report_portal/configuration.rb
|
210
231
|
- lib/parallel_report_portal/cucumber/formatter.rb
|
@@ -234,7 +255,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
234
255
|
- !ruby/object:Gem::Version
|
235
256
|
version: '0'
|
236
257
|
requirements: []
|
237
|
-
rubygems_version: 3.
|
258
|
+
rubygems_version: 3.4.1
|
238
259
|
signing_key:
|
239
260
|
specification_version: 4
|
240
261
|
summary: Run Cucumber Tests in parallel and with Cucumber 3 and 4+
|