Mercurial > repos > shellac > sam_consensus_v3
diff env/lib/python3.9/site-packages/galaxy/util/renamed_temporary_file.py @ 0:4f3585e2f14b draft default tip
"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author | shellac |
---|---|
date | Mon, 22 Mar 2021 18:12:50 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/env/lib/python3.9/site-packages/galaxy/util/renamed_temporary_file.py Mon Mar 22 18:12:50 2021 +0000 @@ -0,0 +1,47 @@ +"""Safely write file to temporary file and then move file into place.""" +# Copied from https://stackoverflow.com/a/12007885. +import os +import tempfile + + +class RenamedTemporaryFile: + """ + A temporary file object which will be renamed to the specified + path on exit. + """ + def __init__(self, final_path, **kwargs): + """ + >>> dir = tempfile.mkdtemp() + >>> with RenamedTemporaryFile(os.path.join(dir, 'test.txt'), mode="w") as out: + ... _ = out.write('bla') + """ + tmpfile_dir = kwargs.pop('dir', None) + + # Put temporary file in the same directory as the location for the + # final file so that an atomic move into place can occur. + + if tmpfile_dir is None: + tmpfile_dir = os.path.dirname(final_path) + + self.tmpfile = tempfile.NamedTemporaryFile(dir=tmpfile_dir, delete=False, **kwargs) + self.final_path = final_path + + def __getattr__(self, attr): + """ + Delegate attribute access to the underlying temporary file object. + """ + return getattr(self.tmpfile, attr) + + def __enter__(self): + self.tmpfile.__enter__() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + if exc_type is None: + self.tmpfile.flush() + result = self.tmpfile.__exit__(exc_type, exc_val, exc_tb) + os.rename(self.tmpfile.name, self.final_path) + else: + result = self.tmpfile.__exit__(exc_type, exc_val, exc_tb) + + return result