def __init__( self, root=None, name=None, destinations=None, tempdir=None, zip_path=None, password=None, exclude=None, encoding_translation=None, max_archive_size=None, ): # pragma: no cover -- TODO accesses FS, needs proper mocks for FS and Path object. """ Creates context for backup operation. See main docstring for details on each parameter. """ self.root = Path(root).expanduser() self.name = name or self.root.name self.destinations = [ Path(os.path.expandvars(location)).expanduser() for location in (destinations or []) ] self.tempdir = Path(tempdir or tempfile.gettempdir()).expanduser() self.zip_path = Path(zip_path or r"C:\Program Files\7-Zip\7z.exe") self.exclude = list(exclude or []) self.encoding_translation = list(encoding_translation or []) if len(self.encoding_translation) not in (2, 3): raise ValueError( 'Expected 2 or 3 lines in encoding_translations, got {0} instead.' .format(len(self.encoding_translation))) self.max_archive_size = max_archive_size if isinstance(password, dict): if 'file' in password: try: password = password['file'] password = Path( os.path.expandvars(password)).expanduser().read_text() if password.endswith('\n'): password = password[:-1] except Exception as e: raise ValueError( 'Failed to read password file: {0}'.format(e)) else: raise ValueError( 'Unknown password field configuration! Supported configurations are: plain string, {.file=<...>}' ) self.password = Password(password)