diff planemo/lib/python3.7/site-packages/galaxy/util/streamball.py @ 1:56ad4e20f292 draft

"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author guerler
date Fri, 31 Jul 2020 00:32:28 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/planemo/lib/python3.7/site-packages/galaxy/util/streamball.py	Fri Jul 31 00:32:28 2020 -0400
@@ -0,0 +1,82 @@
+"""
+A simple wrapper for writing tarballs as a stream.
+"""
+from __future__ import absolute_import
+
+import logging
+import os
+import tarfile
+
+from galaxy.exceptions import ObjectNotFound
+from .path import safe_walk
+
+log = logging.getLogger(__name__)
+
+
+class StreamBall(object):
+    def __init__(self, mode, members=None):
+        self.members = members
+        if members is None:
+            self.members = []
+        self.mode = mode
+        self.wsgi_status = None
+        self.wsgi_headeritems = None
+
+    def add(self, file, relpath, check_file=False):
+        if check_file and len(file) > 0:
+            if not os.path.isfile(file):
+                raise ObjectNotFound
+            else:
+                self.members.append((file, relpath))
+        else:
+            self.members.append((file, relpath))
+
+    def stream(self, environ, start_response):
+        response_write = start_response(self.wsgi_status, self.wsgi_headeritems)
+
+        class tarfileobj(object):
+            def write(self, *args, **kwargs):
+                response_write(*args, **kwargs)
+        tf = tarfile.open(mode=self.mode, fileobj=tarfileobj())
+        for (file, rel) in self.members:
+            tf.add(file, arcname=rel)
+        tf.close()
+        return []
+
+
+class ZipBall(object):
+    def __init__(self, tmpf, tmpd):
+        self._tmpf = tmpf
+        self._tmpd = tmpd
+
+    def stream(self, environ, start_response):
+        response_write = start_response(self.wsgi_status, self.wsgi_headeritems)
+        tmpfh = open(self._tmpf)
+        response_write(tmpfh.read())
+        tmpfh.close()
+        try:
+            os.unlink(self._tmpf)
+            os.rmdir(self._tmpd)
+        except OSError:
+            log.exception("Unable to remove temporary library download archive and directory")
+        return []
+
+
+def stream_archive(trans, path, upstream_gzip=False):
+    archive_type_string = 'w|gz'
+    archive_ext = 'tgz'
+    if upstream_gzip:
+        archive_type_string = 'w|'
+        archive_ext = 'tar'
+    archive = StreamBall(mode=archive_type_string)
+    for root, directories, files in safe_walk(path):
+        for filename in files:
+            p = os.path.join(root, filename)
+            relpath = os.path.relpath(p, os.path.join(path, os.pardir))
+            archive.add(file=os.path.join(path, p), relpath=relpath)
+    archive_name = "%s.%s" % (os.path.basename(path), archive_ext)
+    trans.response.set_content_type("application/x-tar")
+    trans.response.headers["Content-Disposition"] = 'attachment; filename="{}"'.format(archive_name)
+    archive.wsgi_status = trans.response.wsgi_status()
+    archive.wsgi_headeritems = trans.response.wsgi_headeritems()
+    return archive.stream