[Python-ideas] BackupFile

Kim Gräsman kim at mvps.org
Mon Jun 25 14:17:29 CEST 2012


Hello,

I'm new here, so forgive me if this has been discussed before or is off-topic.

I came up with a mechanism that I thought might be useful in the
Python standard library -- a scope-bound self-restoring backup file. I
came to this naïve implementation;

--
class BackupError(Exception):
   pass

class Backup:
   def __init__(self, path):
       if not os.path.exists(path) or os.path.isdir(path):
           raise BackupError("%s must be a valid file path" % path)

       self.path = path
       self.backup_path = None

   def __enter__(self):
       self.backup()

   def __exit__(self, type, value, traceback):
       self.restore()

   def _generate_backup_path(self):
       tempdir = tempfile.mkdtemp()
       basename = os.path.basename(self.path)
       return os.path.join(tempdir, basename)

   def backup(self):
       backup_path = self._generate_backup_path()
       shutil.copy(self.path, backup_path)
       self.backup_path = backup_path

   def restore(self):
       if self.backup_path:
           # Write backup back onto original
           shutil.copy(self.backup_path, self.path)
           shutil.rmtree(os.path.dirname(self.backup_path))
           self.backup_path = None
--

Backups are intended to be scope-bound like so:

 with Backup(settings_file):
    rewrite_settings(settings_file)
    do_something_else()

I even managed to use it with the @contextmanager attribute, to allow this:

 with rewrite_settings(settings_file):
    do_something_else()

So, open questions;

- Would something like this be useful outside of my office?
- Any suggestions for better names?
- This feels like it belongs in the tempfile module, would you agree?
- What's lacking in the implementation? Have I done something
decidedly non-Pythonic?

Thanks,
- Kim



More information about the Python-ideas mailing list