| import os |
| import io |
| import contextlib |
| import tempfile |
| import shutil |
| import errno |
| import zipfile |
| |
| |
| @contextlib.contextmanager |
| def tempdir(): |
| """Create a temporary directory in a context manager.""" |
| td = tempfile.mkdtemp() |
| try: |
| yield td |
| finally: |
| shutil.rmtree(td) |
| |
| |
| def mkdir_p(*args, **kwargs): |
| """Like `mkdir`, but does not raise an exception if the |
| directory already exists. |
| """ |
| try: |
| return os.mkdir(*args, **kwargs) |
| except OSError as exc: |
| if exc.errno != errno.EEXIST: |
| raise |
| |
| |
| def dir_to_zipfile(root): |
| """Construct an in-memory zip file for a directory.""" |
| buffer = io.BytesIO() |
| zip_file = zipfile.ZipFile(buffer, 'w') |
| for root, dirs, files in os.walk(root): |
| for path in dirs: |
| fs_path = os.path.join(root, path) |
| rel_path = os.path.relpath(fs_path, root) |
| zip_file.writestr(rel_path + '/', '') |
| for path in files: |
| fs_path = os.path.join(root, path) |
| rel_path = os.path.relpath(fs_path, root) |
| zip_file.write(fs_path, rel_path) |
| return zip_file |