comparison env/lib/python3.9/site-packages/allure_commons/lifecycle.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 from collections import OrderedDict
2 from contextlib import contextmanager
3 from allure_commons._core import plugin_manager
4 from allure_commons.model2 import TestResultContainer
5 from allure_commons.model2 import TestResult
6 from allure_commons.model2 import Attachment, ATTACHMENT_PATTERN
7 from allure_commons.model2 import TestStepResult
8 from allure_commons.model2 import ExecutableItem
9 from allure_commons.model2 import TestBeforeResult
10 from allure_commons.model2 import TestAfterResult
11 from allure_commons.utils import uuid4
12 from allure_commons.utils import now
13 from allure_commons.types import AttachmentType
14
15
16 class AllureLifecycle(object):
17 def __init__(self):
18 self._items = OrderedDict()
19
20 def _get_item(self, uuid=None, item_type=None):
21 uuid = uuid or self._last_item_uuid(item_type=item_type)
22 return self._items.get(uuid)
23
24 def _pop_item(self, uuid=None, item_type=None):
25 uuid = uuid or self._last_item_uuid(item_type=item_type)
26 return self._items.pop(uuid, None)
27
28 def _last_item_uuid(self, item_type=None):
29 for uuid in reversed(self._items):
30 item = self._items.get(uuid)
31 if item_type is None:
32 return uuid
33 elif type(item) == item_type or isinstance(item, item_type):
34 return uuid
35
36 @contextmanager
37 def schedule_test_case(self, uuid=None):
38 test_result = TestResult()
39 test_result.uuid = uuid or uuid4()
40 self._items[test_result.uuid] = test_result
41 yield test_result
42
43 @contextmanager
44 def update_test_case(self, uuid=None):
45 yield self._get_item(uuid=uuid, item_type=TestResult)
46
47 def write_test_case(self, uuid=None):
48 test_result = self._pop_item(uuid=uuid, item_type=TestResult)
49 if test_result:
50 plugin_manager.hook.report_result(result=test_result)
51
52 @contextmanager
53 def start_step(self, parent_uuid=None, uuid=None):
54 parent = self._get_item(uuid=parent_uuid, item_type=ExecutableItem)
55 step = TestStepResult()
56 step.start = now()
57 parent.steps.append(step)
58 self._items[uuid or uuid4()] = step
59 yield step
60
61 @contextmanager
62 def update_step(self, uuid=None):
63 yield self._get_item(uuid=uuid, item_type=TestStepResult)
64
65 def stop_step(self, uuid=None):
66 step = self._pop_item(uuid=uuid, item_type=TestStepResult)
67 if step and not step.stop:
68 step.stop = now()
69
70 @contextmanager
71 def start_container(self, uuid=None):
72 container = TestResultContainer(uuid=uuid or uuid4())
73 self._items[container.uuid] = container
74 yield container
75
76 def containers(self):
77 for item in self._items.values():
78 if type(item) == TestResultContainer:
79 yield item
80
81 @contextmanager
82 def update_container(self, uuid=None):
83 yield self._get_item(uuid=uuid, item_type=TestResultContainer)
84
85 def write_container(self, uuid=None):
86 container = self._pop_item(uuid=uuid, item_type=TestResultContainer)
87 if container and (container.befores or container.afters):
88 plugin_manager.hook.report_container(container=container)
89
90 @contextmanager
91 def start_before_fixture(self, parent_uuid=None, uuid=None):
92 fixture = TestBeforeResult()
93 parent = self._get_item(uuid=parent_uuid, item_type=TestResultContainer)
94 if parent:
95 parent.befores.append(fixture)
96 self._items[uuid or uuid4()] = fixture
97 yield fixture
98
99 @contextmanager
100 def update_before_fixture(self, uuid=None):
101 yield self._get_item(uuid=uuid, item_type=TestBeforeResult)
102
103 def stop_before_fixture(self, uuid=None):
104 fixture = self._pop_item(uuid=uuid, item_type=TestBeforeResult)
105 if fixture and not fixture.stop:
106 fixture.stop = now()
107
108 @contextmanager
109 def start_after_fixture(self, parent_uuid=None, uuid=None):
110 fixture = TestAfterResult()
111 parent = self._get_item(uuid=parent_uuid, item_type=TestResultContainer)
112 if parent:
113 parent.afters.append(fixture)
114 self._items[uuid or uuid4()] = fixture
115 yield fixture
116
117 @contextmanager
118 def update_after_fixture(self, uuid=None):
119 yield self._get_item(uuid=uuid, item_type=TestAfterResult)
120
121 def stop_after_fixture(self, uuid=None):
122 fixture = self._pop_item(uuid=uuid, item_type=TestAfterResult)
123 if fixture and not fixture.stop:
124 fixture.stop = now()
125
126 def _attach(self, uuid, name=None, attachment_type=None, extension=None):
127 mime_type = attachment_type
128 extension = extension if extension else 'attach'
129
130 if type(attachment_type) is AttachmentType:
131 extension = attachment_type.extension
132 mime_type = attachment_type.mime_type
133
134 file_name = ATTACHMENT_PATTERN.format(prefix=uuid, ext=extension)
135 attachment = Attachment(source=file_name, name=name, type=mime_type)
136 uuid = self._last_item_uuid(item_type=ExecutableItem)
137 self._items[uuid].attachments.append(attachment)
138
139 return file_name
140
141 def attach_file(self, uuid, source, name=None, attachment_type=None, extension=None):
142 file_name = self._attach(uuid, name=name, attachment_type=attachment_type, extension=extension)
143 plugin_manager.hook.report_attached_file(source=source, file_name=file_name)
144
145 def attach_data(self, uuid, body, name=None, attachment_type=None, extension=None):
146 file_name = self._attach(uuid, name=name, attachment_type=attachment_type, extension=extension)
147 plugin_manager.hook.report_attached_data(body=body, file_name=file_name)