44from allure_commons .model2 import TestResultContainer
55from allure_commons .model2 import TestResult
66from allure_commons .model2 import Attachment , ATTACHMENT_PATTERN
7+ from allure_commons .model2 import GlobalAttachment , GlobalError , Globals
78from allure_commons .model2 import TestStepResult
89from allure_commons .model2 import ExecutableItem
910from allure_commons .model2 import TestBeforeResult
@@ -124,14 +125,7 @@ def stop_after_fixture(self, uuid=None):
124125 fixture .stop = now ()
125126
126127 def _attach (self , uuid , name = None , attachment_type = None , extension = None , parent_uuid = 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 )
128+ file_name , mime_type = self .__resolve_attachment_filename_and_type (uuid , attachment_type = attachment_type , extension = extension )
135129 attachment = Attachment (source = file_name , name = name , type = mime_type )
136130 last_uuid = parent_uuid if parent_uuid else self ._last_item_uuid (ExecutableItem )
137131 self ._items [last_uuid ].attachments .append (attachment )
@@ -147,3 +141,33 @@ def attach_data(self, uuid, body, name=None, attachment_type=None, extension=Non
147141 file_name = self ._attach (uuid , name = name , attachment_type = attachment_type ,
148142 extension = extension , parent_uuid = parent_uuid )
149143 plugin_manager .hook .report_attached_data (body = body , file_name = file_name )
144+
145+ def global_attach_file (self , uuid , source , name = None , attachment_type = None , extension = None ):
146+ file_name , mime_type = self .__resolve_attachment_filename_and_type (uuid , attachment_type = attachment_type , extension = extension )
147+ plugin_manager .hook .report_attached_file (source = source , file_name = file_name )
148+ plugin_manager .hook .report_globals (globals_item = Globals (attachments = [
149+ GlobalAttachment (source = file_name , name = name , type = mime_type , timestamp = now ())
150+ ]))
151+
152+ def global_attach_data (self , uuid , body , name = None , attachment_type = None , extension = None ):
153+ file_name , mime_type = self .__resolve_attachment_filename_and_type (uuid , attachment_type = attachment_type , extension = extension )
154+ plugin_manager .hook .report_attached_data (body = body , file_name = file_name )
155+ plugin_manager .hook .report_globals (globals_item = Globals (attachments = [
156+ GlobalAttachment (source = file_name , name = name , type = mime_type , timestamp = now ())
157+ ]))
158+
159+ def global_error (self , message = None , trace = None ):
160+ plugin_manager .hook .report_globals (globals_item = Globals (errors = [
161+ GlobalError (message = message , trace = trace , timestamp = now ())
162+ ]))
163+
164+ def __resolve_attachment_filename_and_type (self , uuid , attachment_type = None , extension = None ):
165+ mime_type = attachment_type
166+ extension = extension if extension else "attach"
167+
168+ if type (attachment_type ) is AttachmentType :
169+ extension = attachment_type .extension
170+ mime_type = attachment_type .mime_type
171+
172+ file_name = ATTACHMENT_PATTERN .format (prefix = uuid , ext = extension )
173+ return file_name , mime_type
0 commit comments