1
1
import pytest
2
- from itertools import chain , islice , repeat
2
+ from itertools import repeat
3
3
from allure_commons .utils import SafeFormatter , md5
4
4
from allure_commons .utils import format_exception , format_traceback
5
5
from allure_commons .model2 import Status
6
6
from allure_commons .model2 import StatusDetails
7
7
from allure_commons .types import LabelType
8
-
8
+ from allure_pytest . stash import stashed
9
9
10
10
ALLURE_DESCRIPTION_MARK = 'allure_description'
11
11
ALLURE_DESCRIPTION_HTML_MARK = 'allure_description_html'
30
30
}
31
31
32
32
33
+ class ParsedPytestNodeId :
34
+ def __init__ (self , nodeid ):
35
+ filepath , * class_names , function_segment = ensure_len (nodeid .split ("::" ), 2 )
36
+ self .filepath = filepath
37
+ self .path_segments = filepath .split ('/' )
38
+ * parent_dirs , filename = ensure_len (self .path_segments , 1 )
39
+ self .parent_package = '.' .join (parent_dirs )
40
+ self .module = filename .rsplit ("." , 1 )[0 ]
41
+ self .package = '.' .join (filter (None , [self .parent_package , self .module ]))
42
+ self .class_names = class_names
43
+ self .test_function = function_segment .split ("[" , 1 )[0 ]
44
+
45
+
46
+ @stashed
47
+ def parse_nodeid (item ):
48
+ return ParsedPytestNodeId (item .nodeid )
49
+
50
+
33
51
def get_marker_value (item , keyword ):
34
52
marker = item .get_closest_marker (keyword )
35
53
return marker .args [0 ] if marker and marker .args else None
@@ -101,9 +119,7 @@ def should_convert_mark_to_tag(mark):
101
119
102
120
103
121
def allure_package (item ):
104
- parts = item .nodeid .split ('::' )
105
- path = parts [0 ].rsplit ('.' , 1 )[0 ]
106
- return path .replace ('/' , '.' )
122
+ return parse_nodeid (item ).package
107
123
108
124
109
125
def allure_name (item , parameters , param_id = None ):
@@ -122,37 +138,41 @@ def allure_name(item, parameters, param_id=None):
122
138
123
139
124
140
def allure_full_name (item : pytest .Item ):
125
- package = allure_package (item )
126
- class_names = item .nodeid .split ("::" )[1 :- 1 ]
127
- class_part = ("." + "." .join (class_names )) if class_names else ""
128
- test = item .originalname if isinstance (item , pytest .Function ) else item .name .split ("[" )[0 ]
129
- full_name = f'{ package } { class_part } #{ test } '
141
+ nodeid = parse_nodeid (item )
142
+ class_part = ("." + "." .join (nodeid .class_names )) if nodeid .class_names else ""
143
+ test = item .originalname if isinstance (item , pytest .Function ) else nodeid .test_function
144
+ full_name = f"{ nodeid .package } { class_part } #{ test } "
130
145
return full_name
131
146
132
147
148
+ def allure_title_path (item ):
149
+ nodeid = parse_nodeid (item )
150
+ return list (
151
+ filter (None , [* nodeid .path_segments , * nodeid .class_names ]),
152
+ )
153
+
154
+
133
155
def ensure_len (value , min_length , fill_value = None ):
134
156
yield from value
135
157
yield from repeat (fill_value , min_length - len (value ))
136
158
137
159
138
160
def allure_suite_labels (item ):
139
- head , * class_names , _ = ensure_len (item .nodeid .split ("::" ), 2 )
140
- file_name , path = islice (chain (reversed (head .rsplit ('/' , 1 )), [None ]), 2 )
141
- module = file_name .split ('.' )[0 ]
142
- package = path .replace ('/' , '.' ) if path else None
143
- pairs = dict (
144
- zip (
145
- [LabelType .PARENT_SUITE , LabelType .SUITE , LabelType .SUB_SUITE ],
146
- [package , module , " > " .join (class_names )],
147
- ),
148
- )
149
- labels = dict (allure_labels (item ))
150
- default_suite_labels = []
151
- for label , value in pairs .items ():
152
- if label not in labels .keys () and value :
153
- default_suite_labels .append ((label , value ))
161
+ nodeid = parse_nodeid (item )
162
+
163
+ default_suite_labels = {
164
+ LabelType .PARENT_SUITE : nodeid .parent_package ,
165
+ LabelType .SUITE : nodeid .module ,
166
+ LabelType .SUB_SUITE : " > " .join (nodeid .class_names ),
167
+ }
168
+
169
+ existing_labels = dict (allure_labels (item ))
170
+ resolved_default_suite_labels = []
171
+ for label , value in default_suite_labels .items ():
172
+ if label not in existing_labels and value :
173
+ resolved_default_suite_labels .append ((label , value ))
154
174
155
- return default_suite_labels
175
+ return resolved_default_suite_labels
156
176
157
177
158
178
def get_outcome_status (outcome ):
0 commit comments