Source code for apptools.logger.agent.attachments

# (C) Copyright 2005-2024 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!
""" Attach relevant project files.

FIXME: there are no public project plugins for Envisage 3, yet. In any case,
this stuff should not be hard-coded, but extensible via extension points. The
code remains here because we can reuse the zip utility code in that extensible
rewrite.
"""

import logging
import os.path
from email import encoders
from email.mime.base import MIMEBase

from traits.api import Any, HasTraits


logger = logging.getLogger(__name__)


[docs]class Attachments(HasTraits): application = Any() message = Any() def __init__(self, message, **traits): traits = traits.copy() traits["message"] = message super(Attachments, self).__init__(**traits) # FIXME: all of the package_*() methods refer to deprecated project plugins
[docs] def package_workspace(self): if self.application is None: pass workspace = self.application.get_service("envisage.project.IWorkspace") if workspace is not None: dir = workspace.path self._attach_directory(dir)
[docs] def package_single_project(self): if self.application is None: pass single_project = self.application.get_service( "envisage.single_project.ModelService" ) if single_project is not None: dir = single_project.location self._attach_directory(dir)
[docs] def package_any_relevant_files(self): self.package_workspace() self.package_single_project()
def _attach_directory(self, dir): relpath = os.path.basename(dir) import zipfile from io import BytesIO ctype = "application/octet-stream" maintype, subtype = ctype.split("/", 1) msg = MIMEBase(maintype, subtype) file_object = BytesIO() zip = zipfile.ZipFile(file_object, "w") _append_to_zip_archive(zip, dir, relpath) zip.close() msg.set_payload(file_object.getvalue()) encoders.encode_base64(msg) # Encode the payload using Base64 msg.add_header( "Content-Disposition", "attachment", filename="project.zip" ) self.message.attach(msg) file_object.close()
def _append_to_zip_archive(zip, dir, relpath): """ Add all files in and below directory dir into zip archive""" for filename in os.listdir(dir): path = os.path.join(dir, filename) if os.path.isfile(path): name = os.path.join(relpath, filename) zip.write(path, name) logger.debug("adding %s to error report" % path) else: if filename != ".svn": # skip svn files if any subdir = os.path.join(dir, filename) _append_to_zip_archive( zip, subdir, os.path.join(relpath, filename) )