/lib/galaxy/util/streamball.py

https://bitbucket.org/cistrome/cistrome-harvard/ · Python · 49 lines · 43 code · 3 blank · 3 comment · 8 complexity · 6bce1ea20b7ebdd511fa1553f8db8b5d MD5 · raw file

  1. """
  2. A simple wrapper for writing tarballs as a stream.
  3. """
  4. import os
  5. import logging, tarfile
  6. from galaxy.exceptions import ObjectNotFound
  7. log = logging.getLogger( __name__ )
  8. class StreamBall( object ):
  9. def __init__( self, mode, members=None ):
  10. self.members = members
  11. if members is None:
  12. self.members = {}
  13. self.mode = mode
  14. self.wsgi_status = None
  15. self.wsgi_headeritems = None
  16. def add( self, file, relpath, check_file=False):
  17. if check_file and len(file)>0:
  18. if not os.path.isfile(file):
  19. raise ObjectNotFound
  20. else:
  21. self.members[file] = relpath
  22. def stream( self, environ, start_response ):
  23. response_write = start_response( self.wsgi_status, self.wsgi_headeritems )
  24. class tarfileobj:
  25. def write( self, *args, **kwargs ):
  26. response_write( *args, **kwargs )
  27. tf = tarfile.open( mode=self.mode, fileobj=tarfileobj() )
  28. for file, rel in self.members.items():
  29. tf.add( file, arcname=rel )
  30. tf.close()
  31. return []
  32. class ZipBall(object):
  33. def __init__(self, tmpf, tmpd):
  34. self._tmpf = tmpf
  35. self._tmpd = tmpd
  36. def stream(self, environ, start_response):
  37. response_write = start_response( self.wsgi_status, self.wsgi_headeritems )
  38. tmpfh = open( self._tmpf )
  39. response_write(tmpfh.read())
  40. tmpfh.close()
  41. try:
  42. os.unlink( self._tmpf )
  43. os.rmdir( self._tmpd )
  44. except OSError:
  45. log.exception( "Unable to remove temporary library download archive and directory" )
  46. return []