Mercurial > repos > shellac > sam_consensus_v3
comparison env/lib/python3.9/site-packages/allure_commons/utils.py @ 0:4f3585e2f14b draft default tip
"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author | shellac |
---|---|
date | Mon, 22 Mar 2021 18:12:50 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4f3585e2f14b |
---|---|
1 # -*- coding: utf-8 -*- | |
2 | |
3 import os | |
4 import sys | |
5 import six | |
6 import time | |
7 import uuid | |
8 import json | |
9 import socket | |
10 import inspect | |
11 import hashlib | |
12 import platform | |
13 import threading | |
14 import traceback | |
15 import collections | |
16 | |
17 from functools import partial | |
18 | |
19 | |
20 def getargspec(func): | |
21 """ | |
22 Used because getargspec for python 2.7 does not accept functools.partial | |
23 which is the type for pytest fixtures. | |
24 | |
25 getargspec excerpted from: | |
26 | |
27 sphinx.util.inspect | |
28 ~~~~~~~~~~~~~~~~~~~ | |
29 Helpers for inspecting Python modules. | |
30 :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. | |
31 :license: BSD, see LICENSE for details. | |
32 | |
33 Like inspect.getargspec but supports functools.partial as well. | |
34 """ | |
35 # noqa: E731 type: (Any) -> Any | |
36 if inspect.ismethod(func): | |
37 func = func.__func__ | |
38 parts = 0, () # noqa: E731 type: Tuple[int, Tuple[unicode, ...]] | |
39 if type(func) is partial: | |
40 keywords = func.keywords | |
41 if keywords is None: | |
42 keywords = {} | |
43 parts = len(func.args), keywords.keys() | |
44 func = func.func | |
45 if not inspect.isfunction(func): | |
46 raise TypeError('%r is not a Python function' % func) | |
47 args, varargs, varkw = inspect.getargs(func.__code__) | |
48 func_defaults = func.__defaults__ | |
49 if func_defaults is None: | |
50 func_defaults = [] | |
51 else: | |
52 func_defaults = list(func_defaults) | |
53 if parts[0]: | |
54 args = args[parts[0]:] | |
55 if parts[1]: | |
56 for arg in parts[1]: | |
57 i = args.index(arg) - len(args) # type: ignore | |
58 del args[i] | |
59 try: | |
60 del func_defaults[i] | |
61 except IndexError: | |
62 pass | |
63 return inspect.ArgSpec(args, varargs, varkw, func_defaults) # type: ignore | |
64 | |
65 | |
66 if six.PY3: | |
67 from traceback import format_exception_only | |
68 else: | |
69 from _compat import format_exception_only | |
70 | |
71 | |
72 def md5(*args): | |
73 m = hashlib.md5() | |
74 for arg in args: | |
75 part = arg.encode('utf-8') | |
76 m.update(part) | |
77 return m.hexdigest() | |
78 | |
79 | |
80 def uuid4(): | |
81 return str(uuid.uuid4()) | |
82 | |
83 | |
84 def now(): | |
85 return int(round(1000 * time.time())) | |
86 | |
87 | |
88 def platform_label(): | |
89 major_version, _, __ = platform.python_version_tuple() | |
90 implementation = platform.python_implementation() | |
91 return '{implementation}{major_version}'.format(implementation=implementation.lower(), | |
92 major_version=major_version) | |
93 | |
94 | |
95 def thread_tag(): | |
96 return '{0}-{1}'.format(os.getpid(), threading.current_thread().name) | |
97 | |
98 | |
99 def host_tag(): | |
100 return socket.gethostname() | |
101 | |
102 | |
103 def escape_non_unicode_symbols(item): | |
104 if not (six.PY2 and isinstance(item, str)): | |
105 return item | |
106 | |
107 def escape_symbol(s): | |
108 try: | |
109 s.decode(encoding='UTF-8') | |
110 return s | |
111 except UnicodeDecodeError: | |
112 return repr(s)[1:-1] | |
113 | |
114 return ''.join(map(escape_symbol, item)) | |
115 | |
116 | |
117 def represent(item): | |
118 """ | |
119 >>> represent(None) | |
120 'None' | |
121 | |
122 >>> represent(123) | |
123 '123' | |
124 | |
125 >>> import six | |
126 >>> expected = u"'hi'" if six.PY2 else "'hi'" | |
127 >>> represent('hi') == expected | |
128 True | |
129 | |
130 >>> expected = u"'привет'" if six.PY2 else "'привет'" | |
131 >>> represent(u'привет') == expected | |
132 True | |
133 | |
134 >>> represent(bytearray([0xd0, 0xbf])) # doctest: +ELLIPSIS | |
135 "<... 'bytearray'>" | |
136 | |
137 >>> from struct import pack | |
138 >>> result = "<type 'str'>" if six.PY2 else "<class 'bytes'>" | |
139 >>> represent(pack('h', 0x89)) == result | |
140 True | |
141 | |
142 >>> result = "<type 'int'>" if six.PY2 else "<class 'int'>" | |
143 >>> represent(int) == result | |
144 True | |
145 | |
146 >>> represent(represent) # doctest: +ELLIPSIS | |
147 '<function represent at ...>' | |
148 | |
149 >>> represent([represent]) # doctest: +ELLIPSIS | |
150 '[<function represent at ...>]' | |
151 | |
152 >>> class ClassWithName(object): | |
153 ... pass | |
154 | |
155 >>> represent(ClassWithName) | |
156 "<class 'utils.ClassWithName'>" | |
157 """ | |
158 | |
159 if six.PY2 and isinstance(item, str): | |
160 try: | |
161 item = item.decode(encoding='UTF-8') | |
162 except UnicodeDecodeError: | |
163 pass | |
164 | |
165 if isinstance(item, six.text_type): | |
166 return u'\'%s\'' % item | |
167 elif isinstance(item, (bytes, bytearray)): | |
168 return repr(type(item)) | |
169 else: | |
170 return repr(item) | |
171 | |
172 | |
173 def func_parameters(func, *args, **kwargs): | |
174 """ | |
175 >>> def helper(func): | |
176 ... def wrapper(*args, **kwargs): | |
177 ... params = func_parameters(func, *args, **kwargs) | |
178 ... print(list(params.items())) | |
179 ... return func(*args, **kwargs) | |
180 ... return wrapper | |
181 | |
182 >>> @helper | |
183 ... def args(a, b): | |
184 ... pass | |
185 | |
186 >>> args(1, 2) | |
187 [('a', '1'), ('b', '2')] | |
188 | |
189 >>> args(*(1,2)) | |
190 [('a', '1'), ('b', '2')] | |
191 | |
192 >>> args(1, b=2) | |
193 [('a', '1'), ('b', '2')] | |
194 | |
195 >>> @helper | |
196 ... def kwargs(a=1, b=2): | |
197 ... pass | |
198 | |
199 >>> kwargs() | |
200 [('a', '1'), ('b', '2')] | |
201 | |
202 >>> kwargs(a=3, b=4) | |
203 [('a', '3'), ('b', '4')] | |
204 | |
205 >>> kwargs(b=4, a=3) | |
206 [('a', '3'), ('b', '4')] | |
207 | |
208 >>> kwargs(a=3) | |
209 [('a', '3'), ('b', '2')] | |
210 | |
211 >>> kwargs(b=4) | |
212 [('a', '1'), ('b', '4')] | |
213 | |
214 >>> @helper | |
215 ... def args_kwargs(a, b, c=3, d=4): | |
216 ... pass | |
217 | |
218 >>> args_kwargs(1, 2) | |
219 [('a', '1'), ('b', '2'), ('c', '3'), ('d', '4')] | |
220 | |
221 >>> args_kwargs(1, 2, d=5) | |
222 [('a', '1'), ('b', '2'), ('c', '3'), ('d', '5')] | |
223 | |
224 >>> args_kwargs(1, 2, 5, 6) | |
225 [('a', '1'), ('b', '2'), ('c', '5'), ('d', '6')] | |
226 | |
227 >>> @helper | |
228 ... def varargs(*a): | |
229 ... pass | |
230 | |
231 >>> varargs() | |
232 [] | |
233 | |
234 >>> varargs(1, 2) | |
235 [('a', '(1, 2)')] | |
236 | |
237 >>> @helper | |
238 ... def keywords(**a): | |
239 ... pass | |
240 | |
241 >>> keywords() | |
242 [] | |
243 | |
244 >>> keywords(a=1, b=2) | |
245 [('a', '1'), ('b', '2')] | |
246 | |
247 >>> @helper | |
248 ... def args_varargs(a, b, *c): | |
249 ... pass | |
250 | |
251 >>> args_varargs(1, 2) | |
252 [('a', '1'), ('b', '2')] | |
253 | |
254 >>> args_varargs(1, 2, 2) | |
255 [('a', '1'), ('b', '2'), ('c', '(2,)')] | |
256 | |
257 >>> @helper | |
258 ... def args_kwargs_varargs(a, b, c=3, **d): | |
259 ... pass | |
260 | |
261 >>> args_kwargs_varargs(1, 2) | |
262 [('a', '1'), ('b', '2'), ('c', '3')] | |
263 | |
264 >>> args_kwargs_varargs(1, 2, 4, d=5, e=6) | |
265 [('a', '1'), ('b', '2'), ('c', '4'), ('d', '5'), ('e', '6')] | |
266 | |
267 >>> @helper | |
268 ... def args_kwargs_varargs_keywords(a, b=2, *c, **d): | |
269 ... pass | |
270 | |
271 >>> args_kwargs_varargs_keywords(1) | |
272 [('a', '1'), ('b', '2')] | |
273 | |
274 >>> args_kwargs_varargs_keywords(1, 2, 4, d=5, e=6) | |
275 [('a', '1'), ('b', '2'), ('c', '(4,)'), ('d', '5'), ('e', '6')] | |
276 | |
277 >>> class Class(object): | |
278 ... @staticmethod | |
279 ... @helper | |
280 ... def static_args(a, b): | |
281 ... pass | |
282 ... | |
283 ... @classmethod | |
284 ... @helper | |
285 ... def method_args(cls, a, b): | |
286 ... pass | |
287 ... | |
288 ... @helper | |
289 ... def args(self, a, b): | |
290 ... pass | |
291 | |
292 >>> cls = Class() | |
293 | |
294 >>> cls.args(1, 2) | |
295 [('a', '1'), ('b', '2')] | |
296 | |
297 >>> cls.method_args(1, 2) | |
298 [('a', '1'), ('b', '2')] | |
299 | |
300 >>> cls.static_args(1, 2) | |
301 [('a', '1'), ('b', '2')] | |
302 | |
303 """ | |
304 parameters = {} | |
305 arg_spec = getargspec(func) if six.PY2 else inspect.getfullargspec(func) | |
306 arg_order = list(arg_spec.args) | |
307 args_dict = dict(zip(arg_spec.args, args)) | |
308 | |
309 if arg_spec.defaults: | |
310 kwargs_defaults_dict = dict(zip(arg_spec.args[len(args):], arg_spec.defaults)) | |
311 parameters.update(kwargs_defaults_dict) | |
312 | |
313 if arg_spec.varargs: | |
314 arg_order.append(arg_spec.varargs) | |
315 varargs = args[len(arg_spec.args):] | |
316 parameters.update({arg_spec.varargs: varargs} if varargs else {}) | |
317 | |
318 if arg_spec.args and arg_spec.args[0] in ['cls', 'self']: | |
319 args_dict.pop(arg_spec.args[0], None) | |
320 | |
321 if kwargs: | |
322 if sys.version_info < (3, 6): | |
323 # Sort alphabetically as old python versions does | |
324 # not preserve call order for kwargs | |
325 arg_order.extend(sorted(list(kwargs.keys()))) | |
326 else: | |
327 # Keep py3.6 behaviour to preserve kwargs order | |
328 arg_order.extend(list(kwargs.keys())) | |
329 parameters.update(kwargs) | |
330 | |
331 parameters.update(args_dict) | |
332 | |
333 items = parameters.iteritems() if six.PY2 else parameters.items() | |
334 sorted_items = sorted(map(lambda kv: (kv[0], represent(kv[1])), items), key=lambda x: arg_order.index(x[0])) | |
335 | |
336 return collections.OrderedDict(sorted_items) | |
337 | |
338 | |
339 def format_traceback(exc_traceback): | |
340 return ''.join(traceback.format_tb(exc_traceback)) if exc_traceback else None | |
341 | |
342 | |
343 def format_exception(etype, value): | |
344 """ | |
345 >>> import sys | |
346 | |
347 >>> try: | |
348 ... assert False, u'Привет' | |
349 ... except AssertionError: | |
350 ... etype, e, _ = sys.exc_info() | |
351 ... format_exception(etype, e) # doctest: +ELLIPSIS | |
352 'AssertionError: ...\\n' | |
353 | |
354 >>> try: | |
355 ... assert False, 'Привет' | |
356 ... except AssertionError: | |
357 ... etype, e, _ = sys.exc_info() | |
358 ... format_exception(etype, e) # doctest: +ELLIPSIS | |
359 'AssertionError: ...\\n' | |
360 | |
361 >>> try: | |
362 ... compile("bla u'Привет'", "fake.py", "exec") | |
363 ... except SyntaxError: | |
364 ... etype, e, _ = sys.exc_info() | |
365 ... format_exception(etype, e) # doctest: +ELLIPSIS | |
366 ' File "fake.py", line 1...SyntaxError: invalid syntax\\n' | |
367 | |
368 >>> try: | |
369 ... compile("bla 'Привет'", "fake.py", "exec") | |
370 ... except SyntaxError: | |
371 ... etype, e, _ = sys.exc_info() | |
372 ... format_exception(etype, e) # doctest: +ELLIPSIS | |
373 ' File "fake.py", line 1...SyntaxError: invalid syntax\\n' | |
374 | |
375 >>> from hamcrest import assert_that, equal_to | |
376 | |
377 >>> try: | |
378 ... assert_that('left', equal_to('right')) | |
379 ... except AssertionError: | |
380 ... etype, e, _ = sys.exc_info() | |
381 ... format_exception(etype, e) # doctest: +ELLIPSIS | |
382 "AssertionError: \\nExpected:...but:..." | |
383 | |
384 >>> try: | |
385 ... assert_that(u'left', equal_to(u'right')) | |
386 ... except AssertionError: | |
387 ... etype, e, _ = sys.exc_info() | |
388 ... format_exception(etype, e) # doctest: +ELLIPSIS | |
389 "AssertionError: \\nExpected:...but:..." | |
390 """ | |
391 return '\n'.join(format_exception_only(etype, value)) if etype or value else None | |
392 | |
393 | |
394 def get_testplan(): | |
395 planned_tests = [] | |
396 file_path = os.environ.get("ALLURE_TESTPLAN_PATH") | |
397 | |
398 if file_path and os.path.exists(file_path): | |
399 with open(file_path, 'r') as plan_file: | |
400 plan = json.load(plan_file) | |
401 planned_tests = plan.get("tests", []) | |
402 | |
403 return planned_tests |