Upgrade test requirements and code style requirements. Auto-reformat code accordingly.
continuous-integration/drone/push Build is passing Details

This commit is contained in:
Dan Helfman 2023-04-14 19:35:24 -07:00
parent 1c67db5d62
commit 5dbb71709c
50 changed files with 603 additions and 155 deletions

View File

@ -8,7 +8,12 @@ logger = logging.getLogger(__name__)
def run_borg( def run_borg(
repository, storage, local_borg_version, borg_arguments, local_path, remote_path, repository,
storage,
local_borg_version,
borg_arguments,
local_path,
remote_path,
): ):
''' '''
Run the "borg" action for the given repository. Run the "borg" action for the given repository.

View File

@ -7,7 +7,12 @@ logger = logging.getLogger(__name__)
def run_break_lock( def run_break_lock(
repository, storage, local_borg_version, break_lock_arguments, local_path, remote_path, repository,
storage,
local_borg_version,
break_lock_arguments,
local_path,
remote_path,
): ):
''' '''
Run the "break-lock" action for the given repository. Run the "break-lock" action for the given repository.

View File

@ -9,7 +9,12 @@ logger = logging.getLogger(__name__)
def run_info( def run_info(
repository, storage, local_borg_version, info_arguments, local_path, remote_path, repository,
storage,
local_borg_version,
info_arguments,
local_path,
remote_path,
): ):
''' '''
Run the "info" action for the given repository and archive. Run the "info" action for the given repository and archive.

View File

@ -8,7 +8,12 @@ logger = logging.getLogger(__name__)
def run_list( def run_list(
repository, storage, local_borg_version, list_arguments, local_path, remote_path, repository,
storage,
local_borg_version,
list_arguments,
local_path,
remote_path,
): ):
''' '''
Run the "list" action for the given repository and archive. Run the "list" action for the given repository and archive.

View File

@ -8,7 +8,12 @@ logger = logging.getLogger(__name__)
def run_mount( def run_mount(
repository, storage, local_borg_version, mount_arguments, local_path, remote_path, repository,
storage,
local_borg_version,
mount_arguments,
local_path,
remote_path,
): ):
''' '''
Run the "mount" action for the given repository. Run the "mount" action for the given repository.

View File

@ -114,7 +114,13 @@ def restore_single_database(
def collect_archive_database_names( def collect_archive_database_names(
repository, archive, location, storage, local_borg_version, local_path, remote_path, repository,
archive,
location,
storage,
local_borg_version,
local_path,
remote_path,
): ):
''' '''
Given a local or remote repository path, a resolved archive name, a location configuration dict, Given a local or remote repository path, a resolved archive name, a location configuration dict,
@ -180,7 +186,7 @@ def find_databases_to_restore(requested_database_names, archive_database_names):
if 'all' in restore_names[UNSPECIFIED_HOOK]: if 'all' in restore_names[UNSPECIFIED_HOOK]:
restore_names[UNSPECIFIED_HOOK].remove('all') restore_names[UNSPECIFIED_HOOK].remove('all')
for (hook_name, database_names) in archive_database_names.items(): for hook_name, database_names in archive_database_names.items():
restore_names.setdefault(hook_name, []).extend(database_names) restore_names.setdefault(hook_name, []).extend(database_names)
# If a database is to be restored as part of "all", then remove it from restore names so # If a database is to be restored as part of "all", then remove it from restore names so

View File

@ -8,7 +8,12 @@ logger = logging.getLogger(__name__)
def run_rinfo( def run_rinfo(
repository, storage, local_borg_version, rinfo_arguments, local_path, remote_path, repository,
storage,
local_borg_version,
rinfo_arguments,
local_path,
remote_path,
): ):
''' '''
Run the "rinfo" action for the given repository. Run the "rinfo" action for the given repository.

View File

@ -8,7 +8,12 @@ logger = logging.getLogger(__name__)
def run_rlist( def run_rlist(
repository, storage, local_borg_version, rlist_arguments, local_path, remote_path, repository,
storage,
local_borg_version,
rlist_arguments,
local_path,
remote_path,
): ):
''' '''
Run the "rlist" action for the given repository. Run the "rlist" action for the given repository.

View File

@ -7,7 +7,11 @@ logger = logging.getLogger(__name__)
def break_lock( def break_lock(
repository_path, storage_config, local_borg_version, local_path='borg', remote_path=None, repository_path,
storage_config,
local_borg_version,
local_path='borg',
remote_path=None,
): ):
''' '''
Given a local or remote repository path, a storage configuration dict, the local Borg version, Given a local or remote repository path, a storage configuration dict, the local Borg version,

View File

@ -509,7 +509,9 @@ def create_archive(
) )
elif output_log_level is None: elif output_log_level is None:
return execute_command_and_capture_output( return execute_command_and_capture_output(
create_command, working_directory=working_directory, extra_environment=borg_environment, create_command,
working_directory=working_directory,
extra_environment=borg_environment,
) )
else: else:
execute_command( execute_command(

View File

@ -45,7 +45,11 @@ def export_tar_archive(
+ (('--dry-run',) if dry_run else ()) + (('--dry-run',) if dry_run else ())
+ (('--tar-filter', tar_filter) if tar_filter else ()) + (('--tar-filter', tar_filter) if tar_filter else ())
+ (('--strip-components', str(strip_components)) if strip_components else ()) + (('--strip-components', str(strip_components)) if strip_components else ())
+ flags.make_repository_archive_flags(repository_path, archive, local_borg_version,) + flags.make_repository_archive_flags(
repository_path,
archive,
local_borg_version,
)
+ (destination_path,) + (destination_path,)
+ (tuple(paths) if paths else ()) + (tuple(paths) if paths else ())
) )

View File

@ -108,7 +108,11 @@ def extract_archive(
+ (('--strip-components', str(strip_components)) if strip_components else ()) + (('--strip-components', str(strip_components)) if strip_components else ())
+ (('--progress',) if progress else ()) + (('--progress',) if progress else ())
+ (('--stdout',) if extract_to_stdout else ()) + (('--stdout',) if extract_to_stdout else ())
+ flags.make_repository_archive_flags(repository, archive, local_borg_version,) + flags.make_repository_archive_flags(
repository,
archive,
local_borg_version,
)
+ (tuple(paths) if paths else ()) + (tuple(paths) if paths else ())
) )

View File

@ -62,7 +62,8 @@ def display_archives_info(
if info_arguments.json: if info_arguments.json:
return execute_command_and_capture_output( return execute_command_and_capture_output(
full_command, extra_environment=environment.make_environment(storage_config), full_command,
extra_environment=environment.make_environment(storage_config),
) )
else: else:
execute_command( execute_command(

View File

@ -50,7 +50,8 @@ def display_repository_info(
if rinfo_arguments.json: if rinfo_arguments.json:
return execute_command_and_capture_output( return execute_command_and_capture_output(
full_command, extra_environment=extra_environment, full_command,
extra_environment=extra_environment,
) )
else: else:
execute_command( execute_command(

View File

@ -40,7 +40,8 @@ def resolve_archive_name(
) )
output = execute_command_and_capture_output( output = execute_command_and_capture_output(
full_command, extra_environment=environment.make_environment(storage_config), full_command,
extra_environment=environment.make_environment(storage_config),
) )
try: try:
latest_archive = output.strip().splitlines()[-1] latest_archive = output.strip().splitlines()[-1]

View File

@ -19,7 +19,8 @@ def local_borg_version(storage_config, local_path='borg'):
+ (('--debug', '--show-rc') if logger.isEnabledFor(logging.DEBUG) else ()) + (('--debug', '--show-rc') if logger.isEnabledFor(logging.DEBUG) else ())
) )
output = execute_command_and_capture_output( output = execute_command_and_capture_output(
full_command, extra_environment=environment.make_environment(storage_config), full_command,
extra_environment=environment.make_environment(storage_config),
) )
try: try:

View File

@ -178,7 +178,9 @@ def make_parsers():
help='Log verbose progress to monitoring integrations that support logging (from only errors to very verbose: -1, 0, 1, or 2)', help='Log verbose progress to monitoring integrations that support logging (from only errors to very verbose: -1, 0, 1, or 2)',
) )
global_group.add_argument( global_group.add_argument(
'--log-file', type=str, help='Write log messages to this file instead of syslog', '--log-file',
type=str,
help='Write log messages to this file instead of syslog',
) )
global_group.add_argument( global_group.add_argument(
'--log-file-format', '--log-file-format',
@ -258,10 +260,13 @@ def make_parsers():
help='Copy the crypt key used for authenticated encryption from the source repository, defaults to a new random key (Borg 2.x+ only)', help='Copy the crypt key used for authenticated encryption from the source repository, defaults to a new random key (Borg 2.x+ only)',
) )
rcreate_group.add_argument( rcreate_group.add_argument(
'--append-only', action='store_true', help='Create an append-only repository', '--append-only',
action='store_true',
help='Create an append-only repository',
) )
rcreate_group.add_argument( rcreate_group.add_argument(
'--storage-quota', help='Create a repository with a fixed storage quota', '--storage-quota',
help='Create a repository with a fixed storage quota',
) )
rcreate_group.add_argument( rcreate_group.add_argument(
'--make-parent-dirs', '--make-parent-dirs',
@ -649,7 +654,8 @@ def make_parsers():
) )
rlist_group = rlist_parser.add_argument_group('rlist arguments') rlist_group = rlist_parser.add_argument_group('rlist arguments')
rlist_group.add_argument( rlist_group.add_argument(
'--repository', help='Path of repository to list, defaults to the configured repositories', '--repository',
help='Path of repository to list, defaults to the configured repositories',
) )
rlist_group.add_argument( rlist_group.add_argument(
'--short', default=False, action='store_true', help='Output only archive names' '--short', default=False, action='store_true', help='Output only archive names'

View File

@ -103,7 +103,9 @@ def run_configuration(config_filename, config, arguments):
if not encountered_error: if not encountered_error:
repo_queue = Queue() repo_queue = Queue()
for repo in location['repositories']: for repo in location['repositories']:
repo_queue.put((repo, 0),) repo_queue.put(
(repo, 0),
)
while not repo_queue.empty(): while not repo_queue.empty():
repository, retry_num = repo_queue.get() repository, retry_num = repo_queue.get()
@ -128,7 +130,9 @@ def run_configuration(config_filename, config, arguments):
) )
except (OSError, CalledProcessError, ValueError) as error: except (OSError, CalledProcessError, ValueError) as error:
if retry_num < retries: if retry_num < retries:
repo_queue.put((repository, retry_num + 1),) repo_queue.put(
(repository, retry_num + 1),
)
tuple( # Consume the generator so as to trigger logging. tuple( # Consume the generator so as to trigger logging.
log_error_records( log_error_records(
f'{repository["path"]}: Error running actions for repository', f'{repository["path"]}: Error running actions for repository',
@ -279,7 +283,7 @@ def run_actions(
**hook_context, **hook_context,
) )
for (action_name, action_arguments) in arguments.items(): for action_name, action_arguments in arguments.items():
if action_name == 'rcreate': if action_name == 'rcreate':
borgmatic.actions.rcreate.run_rcreate( borgmatic.actions.rcreate.run_rcreate(
repository, repository,
@ -408,19 +412,39 @@ def run_actions(
) )
elif action_name == 'rlist': elif action_name == 'rlist':
yield from borgmatic.actions.rlist.run_rlist( yield from borgmatic.actions.rlist.run_rlist(
repository, storage, local_borg_version, action_arguments, local_path, remote_path, repository,
storage,
local_borg_version,
action_arguments,
local_path,
remote_path,
) )
elif action_name == 'list': elif action_name == 'list':
yield from borgmatic.actions.list.run_list( yield from borgmatic.actions.list.run_list(
repository, storage, local_borg_version, action_arguments, local_path, remote_path, repository,
storage,
local_borg_version,
action_arguments,
local_path,
remote_path,
) )
elif action_name == 'rinfo': elif action_name == 'rinfo':
yield from borgmatic.actions.rinfo.run_rinfo( yield from borgmatic.actions.rinfo.run_rinfo(
repository, storage, local_borg_version, action_arguments, local_path, remote_path, repository,
storage,
local_borg_version,
action_arguments,
local_path,
remote_path,
) )
elif action_name == 'info': elif action_name == 'info':
yield from borgmatic.actions.info.run_info( yield from borgmatic.actions.info.run_info(
repository, storage, local_borg_version, action_arguments, local_path, remote_path, repository,
storage,
local_borg_version,
action_arguments,
local_path,
remote_path,
) )
elif action_name == 'break-lock': elif action_name == 'break-lock':
borgmatic.actions.break_lock.run_break_lock( borgmatic.actions.break_lock.run_break_lock(
@ -433,7 +457,12 @@ def run_actions(
) )
elif action_name == 'borg': elif action_name == 'borg':
borgmatic.actions.borg.run_borg( borgmatic.actions.borg.run_borg(
repository, storage, local_borg_version, action_arguments, local_path, remote_path, repository,
storage,
local_borg_version,
action_arguments,
local_path,
remote_path,
) )
command.execute_hook( command.execute_hook(
@ -626,7 +655,8 @@ def collect_configuration_run_summary_logs(configs, arguments):
logger.info(f"Unmounting mount point {arguments['umount'].mount_point}") logger.info(f"Unmounting mount point {arguments['umount'].mount_point}")
try: try:
borg_umount.unmount_archive( borg_umount.unmount_archive(
mount_point=arguments['umount'].mount_point, local_path=get_local_path(configs), mount_point=arguments['umount'].mount_point,
local_path=get_local_path(configs),
) )
except (CalledProcessError, OSError) as error: except (CalledProcessError, OSError) as error:
yield from log_error_records('Error unmounting mount point', error) yield from log_error_records('Error unmounting mount point', error)

View File

@ -121,6 +121,7 @@ def load_configuration(filename):
Raise ruamel.yaml.error.YAMLError if something goes wrong parsing the YAML, or RecursionError Raise ruamel.yaml.error.YAMLError if something goes wrong parsing the YAML, or RecursionError
if there are too many recursive includes. if there are too many recursive includes.
''' '''
# Use an embedded derived class for the include constructor so as to capture the filename # Use an embedded derived class for the include constructor so as to capture the filename
# value. (functools.partial doesn't work for this use case because yaml.Constructor has to be # value. (functools.partial doesn't work for this use case because yaml.Constructor has to be
# an actual class.) # an actual class.)

View File

@ -81,7 +81,10 @@ def normalize(config_filename, config):
repository_path.partition('file://')[-1] repository_path.partition('file://')[-1]
) )
config['location']['repositories'].append( config['location']['repositories'].append(
dict(repository_dict, path=updated_repository_path,) dict(
repository_dict,
path=updated_repository_path,
)
) )
elif repository_path.startswith('ssh://'): elif repository_path.startswith('ssh://'):
config['location']['repositories'].append(repository_dict) config['location']['repositories'].append(repository_dict)
@ -97,7 +100,10 @@ def normalize(config_filename, config):
) )
) )
config['location']['repositories'].append( config['location']['repositories'].append(
dict(repository_dict, path=rewritten_repository_path,) dict(
repository_dict,
path=rewritten_repository_path,
)
) )
else: else:
config['location']['repositories'].append(repository_dict) config['location']['repositories'].append(repository_dict)

View File

@ -57,7 +57,12 @@ def parse_overrides(raw_overrides):
for raw_override in raw_overrides: for raw_override in raw_overrides:
try: try:
raw_keys, value = raw_override.split('=', 1) raw_keys, value = raw_override.split('=', 1)
parsed_overrides.append((tuple(raw_keys.split('.')), convert_value_type(value),)) parsed_overrides.append(
(
tuple(raw_keys.split('.')),
convert_value_type(value),
)
)
except ValueError: except ValueError:
raise ValueError( raise ValueError(
f"Invalid override '{raw_override}'. Make sure you use the form: SECTION.OPTION=VALUE" f"Invalid override '{raw_override}'. Make sure you use the form: SECTION.OPTION=VALUE"
@ -75,5 +80,5 @@ def apply_overrides(config, raw_overrides):
''' '''
overrides = parse_overrides(raw_overrides) overrides = parse_overrides(raw_overrides)
for (keys, value) in overrides: for keys, value in overrides:
set_values(config, keys, value) set_values(config, keys, value)

View File

@ -236,7 +236,11 @@ def execute_command(
def execute_command_and_capture_output( def execute_command_and_capture_output(
full_command, capture_stderr=False, shell=False, extra_environment=None, working_directory=None, full_command,
capture_stderr=False,
shell=False,
extra_environment=None,
working_directory=None,
): ):
''' '''
Execute the given command (a sequence of command/argument strings), capturing and returning its Execute the given command (a sequence of command/argument strings), capturing and returning its

View File

@ -100,7 +100,9 @@ def execute_dump_command(
dump.create_named_pipe_for_dump(dump_filename) dump.create_named_pipe_for_dump(dump_filename)
return execute_command( return execute_command(
dump_command, extra_environment=extra_environment, run_to_completion=False, dump_command,
extra_environment=extra_environment,
run_to_completion=False,
) )

View File

@ -123,7 +123,12 @@ def dump_databases(databases, log_prefix, location_config, dry_run):
continue continue
command = ( command = (
(dump_command, '--no-password', '--clean', '--if-exists',) (
dump_command,
'--no-password',
'--clean',
'--if-exists',
)
+ (('--host', database['hostname']) if 'hostname' in database else ()) + (('--host', database['hostname']) if 'hostname' in database else ())
+ (('--port', str(database['port'])) if 'port' in database else ()) + (('--port', str(database['port'])) if 'port' in database else ())
+ (('--username', database['username']) if 'username' in database else ()) + (('--username', database['username']) if 'username' in database else ())
@ -146,7 +151,9 @@ def dump_databases(databases, log_prefix, location_config, dry_run):
if dump_format == 'directory': if dump_format == 'directory':
dump.create_parent_directory_for_dump(dump_filename) dump.create_parent_directory_for_dump(dump_filename)
execute_command( execute_command(
command, shell=True, extra_environment=extra_environment, command,
shell=True,
extra_environment=extra_environment,
) )
else: else:
dump.create_named_pipe_for_dump(dump_filename) dump.create_named_pipe_for_dump(dump_filename)

View File

@ -8,18 +8,21 @@ filterwarnings =
ignore:Deprecated call to `pkg_resources.declare_namespace\('ruamel'\)`.*:DeprecationWarning ignore:Deprecated call to `pkg_resources.declare_namespace\('ruamel'\)`.*:DeprecationWarning
[flake8] [flake8]
ignore = E501,W503 max-line-length = 100
extend-ignore = E203,E501,W503
exclude = *.*/* exclude = *.*/*
multiline-quotes = ''' multiline-quotes = '''
docstring-quotes = ''' docstring-quotes = '''
[tool:isort] [tool:isort]
force_single_line = False profile=black
include_trailing_comma = True
known_first_party = borgmatic known_first_party = borgmatic
line_length = 100 line_length = 100
multi_line_output = 3
skip = .tox skip = .tox
[codespell] [codespell]
skip = .git,.tox,build skip = .git,.tox,build
[pycodestyle]
ignore = E203
max_line_length = 100

View File

@ -1,27 +1,29 @@
appdirs==1.4.4; python_version >= '3.8' appdirs==1.4.4; python_version >= '3.8'
attrs==20.3.0; python_version >= '3.8' attrs==22.2.0; python_version >= '3.8'
black==19.10b0; python_version >= '3.8' black==23.3.0; python_version >= '3.8'
click==7.1.2; python_version >= '3.8' chardet==5.1.0
click==8.1.3; python_version >= '3.8'
codespell==2.2.4 codespell==2.2.4
colorama==0.4.4 colorama==0.4.6
coverage==5.3 coverage==7.2.3
flake8==4.0.1 flake8==6.0.0
flake8-quotes==3.3.2 flake8-quotes==3.3.2
flake8-use-fstring==1.4 flake8-use-fstring==1.4
flake8-variables-names==0.0.5 flake8-variables-names==0.0.5
flexmock==0.10.4 flexmock==0.11.3
isort==5.9.1 idna==3.4
mccabe==0.6.1 isort==5.12.0
pluggy==0.13.1 mccabe==0.7.0
pathspec==0.8.1; python_version >= '3.8' pluggy==1.0.0
py==1.10.0 pathspec==0.11.1; python_version >= '3.8'
pycodestyle==2.8.0 py==1.11.0
pyflakes==2.4.0 pycodestyle==2.10.0
jsonschema==3.2.0 pyflakes==3.0.1
pytest==7.2.0 jsonschema==4.17.3
pytest==7.3.0
pytest-cov==4.0.0 pytest-cov==4.0.0
regex; python_version >= '3.8' regex; python_version >= '3.8'
requests==2.25.0 requests==2.28.2
ruamel.yaml>0.15.0,<0.18.0 ruamel.yaml>0.15.0,<0.18.0
toml==0.10.2; python_version >= '3.8' toml==0.10.2; python_version >= '3.8'
typed-ast; python_version >= '3.8' typed-ast; python_version >= '3.8'

View File

@ -12,7 +12,11 @@ def test_run_check_calls_hooks_for_configured_repository():
flexmock(module.borgmatic.borg.check).should_receive('check_archives').once() flexmock(module.borgmatic.borg.check).should_receive('check_archives').once()
flexmock(module.borgmatic.hooks.command).should_receive('execute_hook').times(2) flexmock(module.borgmatic.hooks.command).should_receive('execute_hook').times(2)
check_arguments = flexmock( check_arguments = flexmock(
repository=None, progress=flexmock(), repair=flexmock(), only=flexmock(), force=flexmock(), repository=None,
progress=flexmock(),
repair=flexmock(),
only=flexmock(),
force=flexmock(),
) )
global_arguments = flexmock(monitoring_verbosity=1, dry_run=False) global_arguments = flexmock(monitoring_verbosity=1, dry_run=False)

View File

@ -148,7 +148,8 @@ def test_find_databases_to_restore_without_requested_names_finds_all_archive_dat
archive_database_names = {'postresql_databases': ['foo', 'bar']} archive_database_names = {'postresql_databases': ['foo', 'bar']}
restore_names = module.find_databases_to_restore( restore_names = module.find_databases_to_restore(
requested_database_names=[], archive_database_names=archive_database_names, requested_database_names=[],
archive_database_names=archive_database_names,
) )
assert restore_names == archive_database_names assert restore_names == archive_database_names
@ -158,7 +159,8 @@ def test_find_databases_to_restore_with_all_in_requested_names_finds_all_archive
archive_database_names = {'postresql_databases': ['foo', 'bar']} archive_database_names = {'postresql_databases': ['foo', 'bar']}
restore_names = module.find_databases_to_restore( restore_names = module.find_databases_to_restore(
requested_database_names=['all'], archive_database_names=archive_database_names, requested_database_names=['all'],
archive_database_names=archive_database_names,
) )
assert restore_names == archive_database_names assert restore_names == archive_database_names
@ -194,7 +196,9 @@ def test_ensure_databases_found_with_all_databases_found_does_not_raise():
def test_ensure_databases_found_with_no_databases_raises(): def test_ensure_databases_found_with_no_databases_raises():
with pytest.raises(ValueError): with pytest.raises(ValueError):
module.ensure_databases_found( module.ensure_databases_found(
restore_names={'postgresql_databases': []}, remaining_restore_names={}, found_names=[], restore_names={'postgresql_databases': []},
remaining_restore_names={},
found_names=[],
) )

View File

@ -222,7 +222,10 @@ def test_run_arbitrary_borg_without_borg_specific_parameters_does_not_raise():
) )
module.run_arbitrary_borg( module.run_arbitrary_borg(
repository_path='repo', storage_config={}, local_borg_version='1.2.3', options=[], repository_path='repo',
storage_config={},
local_borg_version='1.2.3',
options=[],
) )

View File

@ -10,7 +10,9 @@ from ..test_verbosity import insert_logging_mock
def insert_execute_command_mock(command): def insert_execute_command_mock(command):
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command').with_args( flexmock(module).should_receive('execute_command').with_args(
command, borg_local_path='borg', extra_environment=None, command,
borg_local_path='borg',
extra_environment=None,
).once() ).once()
@ -19,7 +21,9 @@ def test_break_lock_calls_borg_with_required_flags():
insert_execute_command_mock(('borg', 'break-lock', 'repo')) insert_execute_command_mock(('borg', 'break-lock', 'repo'))
module.break_lock( module.break_lock(
repository_path='repo', storage_config={}, local_borg_version='1.2.3', repository_path='repo',
storage_config={},
local_borg_version='1.2.3',
) )
@ -28,7 +32,10 @@ def test_break_lock_calls_borg_with_remote_path_flags():
insert_execute_command_mock(('borg', 'break-lock', '--remote-path', 'borg1', 'repo')) insert_execute_command_mock(('borg', 'break-lock', '--remote-path', 'borg1', 'repo'))
module.break_lock( module.break_lock(
repository_path='repo', storage_config={}, local_borg_version='1.2.3', remote_path='borg1', repository_path='repo',
storage_config={},
local_borg_version='1.2.3',
remote_path='borg1',
) )
@ -37,7 +44,9 @@ def test_break_lock_calls_borg_with_umask_flags():
insert_execute_command_mock(('borg', 'break-lock', '--umask', '0770', 'repo')) insert_execute_command_mock(('borg', 'break-lock', '--umask', '0770', 'repo'))
module.break_lock( module.break_lock(
repository_path='repo', storage_config={'umask': '0770'}, local_borg_version='1.2.3', repository_path='repo',
storage_config={'umask': '0770'},
local_borg_version='1.2.3',
) )
@ -46,7 +55,9 @@ def test_break_lock_calls_borg_with_lock_wait_flags():
insert_execute_command_mock(('borg', 'break-lock', '--lock-wait', '5', 'repo')) insert_execute_command_mock(('borg', 'break-lock', '--lock-wait', '5', 'repo'))
module.break_lock( module.break_lock(
repository_path='repo', storage_config={'lock_wait': '5'}, local_borg_version='1.2.3', repository_path='repo',
storage_config={'lock_wait': '5'},
local_borg_version='1.2.3',
) )
@ -56,7 +67,9 @@ def test_break_lock_with_log_info_calls_borg_with_info_parameter():
insert_logging_mock(logging.INFO) insert_logging_mock(logging.INFO)
module.break_lock( module.break_lock(
repository_path='repo', storage_config={}, local_borg_version='1.2.3', repository_path='repo',
storage_config={},
local_borg_version='1.2.3',
) )
@ -66,5 +79,7 @@ def test_break_lock_with_log_debug_calls_borg_with_debug_flags():
insert_logging_mock(logging.DEBUG) insert_logging_mock(logging.DEBUG)
module.break_lock( module.break_lock(
repository_path='repo', storage_config={}, local_borg_version='1.2.3', repository_path='repo',
storage_config={},
local_borg_version='1.2.3',
) )

View File

@ -79,7 +79,12 @@ def test_parse_frequency_parses_into_timedeltas(frequency, expected_result):
@pytest.mark.parametrize( @pytest.mark.parametrize(
'frequency', ('sometime', 'x days', '3 decades',), 'frequency',
(
'sometime',
'x days',
'3 decades',
),
) )
def test_parse_frequency_raises_on_parse_error(frequency): def test_parse_frequency_raises_on_parse_error(frequency):
with pytest.raises(ValueError): with pytest.raises(ValueError):
@ -211,7 +216,10 @@ def test_make_check_flags_with_data_check_returns_flag_and_implies_archives():
flags = module.make_check_flags('1.2.3', {}, ('data',)) flags = module.make_check_flags('1.2.3', {}, ('data',))
assert flags == ('--archives-only', '--verify-data',) assert flags == (
'--archives-only',
'--verify-data',
)
def test_make_check_flags_with_extract_omits_extract_flag(): def test_make_check_flags_with_extract_omits_extract_flag():
@ -227,7 +235,14 @@ def test_make_check_flags_with_repository_and_data_checks_does_not_return_reposi
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_match_archives_flags').and_return(()) flexmock(module.flags).should_receive('make_match_archives_flags').and_return(())
flags = module.make_check_flags('1.2.3', {}, ('repository', 'data',)) flags = module.make_check_flags(
'1.2.3',
{},
(
'repository',
'data',
),
)
assert flags == ('--verify-data',) assert flags == ('--verify-data',)
@ -236,7 +251,12 @@ def test_make_check_flags_with_default_checks_and_prefix_returns_default_flags()
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_match_archives_flags').and_return(()) flexmock(module.flags).should_receive('make_match_archives_flags').and_return(())
flags = module.make_check_flags('1.2.3', {}, ('repository', 'archives'), prefix='foo',) flags = module.make_check_flags(
'1.2.3',
{},
('repository', 'archives'),
prefix='foo',
)
assert flags == ('--match-archives', 'sh:foo*') assert flags == ('--match-archives', 'sh:foo*')
@ -246,7 +266,10 @@ def test_make_check_flags_with_all_checks_and_prefix_returns_default_flags():
flexmock(module.flags).should_receive('make_match_archives_flags').and_return(()) flexmock(module.flags).should_receive('make_match_archives_flags').and_return(())
flags = module.make_check_flags( flags = module.make_check_flags(
'1.2.3', {}, ('repository', 'archives', 'extract'), prefix='foo', '1.2.3',
{},
('repository', 'archives', 'extract'),
prefix='foo',
) )
assert flags == ('--match-archives', 'sh:foo*') assert flags == ('--match-archives', 'sh:foo*')
@ -257,7 +280,10 @@ def test_make_check_flags_with_all_checks_and_prefix_without_borg_features_retur
flexmock(module.flags).should_receive('make_match_archives_flags').and_return(()) flexmock(module.flags).should_receive('make_match_archives_flags').and_return(())
flags = module.make_check_flags( flags = module.make_check_flags(
'1.2.3', {}, ('repository', 'archives', 'extract'), prefix='foo', '1.2.3',
{},
('repository', 'archives', 'extract'),
prefix='foo',
) )
assert flags == ('--glob-archives', 'foo*') assert flags == ('--glob-archives', 'foo*')
@ -447,7 +473,11 @@ def test_check_archives_calls_borg_with_parameters(checks):
'{"repository": {"id": "repo"}}' '{"repository": {"id": "repo"}}'
) )
flexmock(module).should_receive('make_check_flags').with_args( flexmock(module).should_receive('make_check_flags').with_args(
'1.2.3', {}, checks, check_last, prefix=None, '1.2.3',
{},
checks,
check_last,
prefix=None,
).and_return(()) ).and_return(())
flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
insert_execute_command_mock(('borg', 'check', 'repo')) insert_execute_command_mock(('borg', 'check', 'repo'))
@ -601,7 +631,11 @@ def test_check_archives_with_local_path_calls_borg_via_local_path():
'{"repository": {"id": "repo"}}' '{"repository": {"id": "repo"}}'
) )
flexmock(module).should_receive('make_check_flags').with_args( flexmock(module).should_receive('make_check_flags').with_args(
'1.2.3', {}, checks, check_last, prefix=None, '1.2.3',
{},
checks,
check_last,
prefix=None,
).and_return(()) ).and_return(())
flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
insert_execute_command_mock(('borg1', 'check', 'repo')) insert_execute_command_mock(('borg1', 'check', 'repo'))
@ -628,7 +662,11 @@ def test_check_archives_with_remote_path_calls_borg_with_remote_path_parameters(
'{"repository": {"id": "repo"}}' '{"repository": {"id": "repo"}}'
) )
flexmock(module).should_receive('make_check_flags').with_args( flexmock(module).should_receive('make_check_flags').with_args(
'1.2.3', {}, checks, check_last, prefix=None, '1.2.3',
{},
checks,
check_last,
prefix=None,
).and_return(()) ).and_return(())
flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
insert_execute_command_mock(('borg', 'check', '--remote-path', 'borg1', 'repo')) insert_execute_command_mock(('borg', 'check', '--remote-path', 'borg1', 'repo'))
@ -656,7 +694,11 @@ def test_check_archives_with_lock_wait_calls_borg_with_lock_wait_parameters():
'{"repository": {"id": "repo"}}' '{"repository": {"id": "repo"}}'
) )
flexmock(module).should_receive('make_check_flags').with_args( flexmock(module).should_receive('make_check_flags').with_args(
'1.2.3', storage_config, checks, check_last, None, '1.2.3',
storage_config,
checks,
check_last,
None,
).and_return(()) ).and_return(())
flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
insert_execute_command_mock(('borg', 'check', '--lock-wait', '5', 'repo')) insert_execute_command_mock(('borg', 'check', '--lock-wait', '5', 'repo'))

View File

@ -1053,7 +1053,8 @@ def test_create_archive_with_compression_calls_borg_with_compression_parameters(
@pytest.mark.parametrize( @pytest.mark.parametrize(
'feature_available,option_flag', ((True, '--upload-ratelimit'), (False, '--remote-ratelimit')), 'feature_available,option_flag',
((True, '--upload-ratelimit'), (False, '--remote-ratelimit')),
) )
def test_create_archive_with_upload_rate_limit_calls_borg_with_upload_ratelimit_parameters( def test_create_archive_with_upload_rate_limit_calls_borg_with_upload_ratelimit_parameters(
feature_available, option_flag feature_available, option_flag
@ -1188,7 +1189,8 @@ def test_create_archive_with_one_file_system_calls_borg_with_one_file_system_par
@pytest.mark.parametrize( @pytest.mark.parametrize(
'feature_available,option_flag', ((True, '--numeric-ids'), (False, '--numeric-owner')), 'feature_available,option_flag',
((True, '--numeric-ids'), (False, '--numeric-owner')),
) )
def test_create_archive_with_numeric_ids_calls_borg_with_numeric_ids_parameter( def test_create_archive_with_numeric_ids_calls_borg_with_numeric_ids_parameter(
feature_available, option_flag feature_available, option_flag
@ -1290,7 +1292,12 @@ def test_create_archive_with_read_special_calls_borg_with_read_special_parameter
@pytest.mark.parametrize( @pytest.mark.parametrize(
'option_name,option_value', 'option_name,option_value',
(('ctime', True), ('ctime', False), ('birthtime', True), ('birthtime', False),), (
('ctime', True),
('ctime', False),
('birthtime', True),
('birthtime', False),
),
) )
def test_create_archive_with_basic_option_calls_borg_with_corresponding_parameter( def test_create_archive_with_basic_option_calls_borg_with_corresponding_parameter(
option_name, option_value option_name, option_value
@ -1766,7 +1773,12 @@ def test_create_archive_with_progress_and_log_info_calls_borg_with_progress_para
) )
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command').with_args( flexmock(module).should_receive('execute_command').with_args(
('borg', 'create') + REPO_ARCHIVE_WITH_PATHS + ('--info', '--progress',), ('borg', 'create')
+ REPO_ARCHIVE_WITH_PATHS
+ (
'--info',
'--progress',
),
output_log_level=logging.INFO, output_log_level=logging.INFO,
output_file=module.DO_NOT_CAPTURE, output_file=module.DO_NOT_CAPTURE,
borg_local_path='borg', borg_local_path='borg',

View File

@ -11,7 +11,9 @@ from ..test_verbosity import insert_logging_mock
def insert_execute_command_mock(command, working_directory=None): def insert_execute_command_mock(command, working_directory=None):
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command').with_args( flexmock(module).should_receive('execute_command').with_args(
command, working_directory=working_directory, extra_environment=None, command,
working_directory=working_directory,
extra_environment=None,
).once() ).once()
@ -152,7 +154,11 @@ def test_extract_archive_calls_borg_with_remote_path_parameters():
@pytest.mark.parametrize( @pytest.mark.parametrize(
'feature_available,option_flag', ((True, '--numeric-ids'), (False, '--numeric-owner'),), 'feature_available,option_flag',
(
(True, '--numeric-ids'),
(False, '--numeric-owner'),
),
) )
def test_extract_archive_calls_borg_with_numeric_ids_parameter(feature_available, option_flag): def test_extract_archive_calls_borg_with_numeric_ids_parameter(feature_available, option_flag):
flexmock(module.os.path).should_receive('abspath').and_return('repo') flexmock(module.os.path).should_receive('abspath').and_return('repo')
@ -441,7 +447,9 @@ def test_extract_archive_skips_abspath_for_remote_repository():
flexmock(module.os.path).should_receive('abspath').never() flexmock(module.os.path).should_receive('abspath').never()
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command').with_args( flexmock(module).should_receive('execute_command').with_args(
('borg', 'extract', 'server:repo::archive'), working_directory=None, extra_environment=None, ('borg', 'extract', 'server:repo::archive'),
working_directory=None,
extra_environment=None,
).once() ).once()
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return( flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(

View File

@ -70,7 +70,11 @@ def test_make_repository_archive_flags_with_borg_features_separates_repository_a
assert module.make_repository_archive_flags( assert module.make_repository_archive_flags(
repository_path='repo', archive='archive', local_borg_version='1.2.3' repository_path='repo', archive='archive', local_borg_version='1.2.3'
) == ('--repo', 'repo', 'archive',) ) == (
'--repo',
'repo',
'archive',
)
def test_make_repository_archive_flags_with_borg_features_joins_repository_and_archive(): def test_make_repository_archive_flags_with_borg_features_joins_repository_and_archive():
@ -86,9 +90,24 @@ def test_make_repository_archive_flags_with_borg_features_joins_repository_and_a
( (
(None, None, True, ()), (None, None, True, ()),
(None, '', True, ()), (None, '', True, ()),
('re:foo-.*', '{hostname}-{now}', True, ('--match-archives', 're:foo-.*'),), # noqa: FS003 (
('sh:foo-*', '{hostname}-{now}', False, ('--glob-archives', 'foo-*'),), # noqa: FS003 're:foo-.*',
('foo-*', '{hostname}-{now}', False, ('--glob-archives', 'foo-*'),), # noqa: FS003 '{hostname}-{now}',
True,
('--match-archives', 're:foo-.*'),
), # noqa: FS003
(
'sh:foo-*',
'{hostname}-{now}',
False,
('--glob-archives', 'foo-*'),
), # noqa: FS003
(
'foo-*',
'{hostname}-{now}',
False,
('--glob-archives', 'foo-*'),
), # noqa: FS003
( (
None, None,
'{hostname}-docs-{now}', # noqa: FS003 '{hostname}-docs-{now}', # noqa: FS003

View File

@ -69,7 +69,8 @@ def test_display_archives_info_with_log_info_and_json_suppresses_most_borg_outpu
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo')) flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo'))
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command_and_capture_output').with_args( flexmock(module).should_receive('execute_command_and_capture_output').with_args(
('borg', 'info', '--json', '--repo', 'repo'), extra_environment=None, ('borg', 'info', '--json', '--repo', 'repo'),
extra_environment=None,
).and_return('[]') ).and_return('[]')
insert_logging_mock(logging.INFO) insert_logging_mock(logging.INFO)
@ -120,7 +121,8 @@ def test_display_archives_info_with_log_debug_and_json_suppresses_most_borg_outp
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo')) flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo'))
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command_and_capture_output').with_args( flexmock(module).should_receive('execute_command_and_capture_output').with_args(
('borg', 'info', '--json', '--repo', 'repo'), extra_environment=None, ('borg', 'info', '--json', '--repo', 'repo'),
extra_environment=None,
).and_return('[]') ).and_return('[]')
insert_logging_mock(logging.DEBUG) insert_logging_mock(logging.DEBUG)
@ -145,7 +147,8 @@ def test_display_archives_info_with_json_calls_borg_with_json_parameter():
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo')) flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo'))
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command_and_capture_output').with_args( flexmock(module).should_receive('execute_command_and_capture_output').with_args(
('borg', 'info', '--json', '--repo', 'repo'), extra_environment=None, ('borg', 'info', '--json', '--repo', 'repo'),
extra_environment=None,
).and_return('[]') ).and_return('[]')
json_output = module.display_archives_info( json_output = module.display_archives_info(

View File

@ -387,7 +387,8 @@ def test_list_archive_calls_borg_multiple_times_with_find_paths():
flexmock(module.feature).should_receive('available').and_return(False) flexmock(module.feature).should_receive('available').and_return(False)
flexmock(module.rlist).should_receive('make_rlist_command').and_return(('borg', 'list', 'repo')) flexmock(module.rlist).should_receive('make_rlist_command').and_return(('borg', 'list', 'repo'))
flexmock(module).should_receive('execute_command_and_capture_output').with_args( flexmock(module).should_receive('execute_command_and_capture_output').with_args(
('borg', 'list', 'repo'), extra_environment=None, ('borg', 'list', 'repo'),
extra_environment=None,
).and_return('archive1\narchive2').once() ).and_return('archive1\narchive2').once()
flexmock(module).should_receive('make_list_command').and_return( flexmock(module).should_receive('make_list_command').and_return(
('borg', 'list', 'repo::archive1') ('borg', 'list', 'repo::archive1')
@ -518,9 +519,18 @@ def test_list_archive_with_borg_features_without_archive_delegates_to_list_repos
@pytest.mark.parametrize( @pytest.mark.parametrize(
'archive_filter_flag', ('prefix', 'match_archives', 'sort_by', 'first', 'last',), 'archive_filter_flag',
(
'prefix',
'match_archives',
'sort_by',
'first',
'last',
),
) )
def test_list_archive_with_archive_ignores_archive_filter_flag(archive_filter_flag,): def test_list_archive_with_archive_ignores_archive_filter_flag(
archive_filter_flag,
):
flexmock(module.borgmatic.logger).should_receive('add_custom_log_levels') flexmock(module.borgmatic.logger).should_receive('add_custom_log_levels')
flexmock(module.logging).ANSWER = module.borgmatic.logger.ANSWER flexmock(module.logging).ANSWER = module.borgmatic.logger.ANSWER
flexmock(module.logger).answer = lambda message: None flexmock(module.logger).answer = lambda message: None
@ -566,7 +576,14 @@ def test_list_archive_with_archive_ignores_archive_filter_flag(archive_filter_fl
@pytest.mark.parametrize( @pytest.mark.parametrize(
'archive_filter_flag', ('prefix', 'match_archives', 'sort_by', 'first', 'last',), 'archive_filter_flag',
(
'prefix',
'match_archives',
'sort_by',
'first',
'last',
),
) )
def test_list_archive_with_find_paths_allows_archive_filter_flag_but_only_passes_it_to_rlist( def test_list_archive_with_find_paths_allows_archive_filter_flag_but_only_passes_it_to_rlist(
archive_filter_flag, archive_filter_flag,
@ -597,7 +614,8 @@ def test_list_archive_with_find_paths_allows_archive_filter_flag_but_only_passes
).and_return(('borg', 'rlist', '--repo', 'repo')) ).and_return(('borg', 'rlist', '--repo', 'repo'))
flexmock(module).should_receive('execute_command_and_capture_output').with_args( flexmock(module).should_receive('execute_command_and_capture_output').with_args(
('borg', 'rlist', '--repo', 'repo'), extra_environment=None, ('borg', 'rlist', '--repo', 'repo'),
extra_environment=None,
).and_return('archive1\narchive2').once() ).and_return('archive1\narchive2').once()
flexmock(module).should_receive('make_list_command').with_args( flexmock(module).should_receive('make_list_command').with_args(

View File

@ -10,7 +10,9 @@ from ..test_verbosity import insert_logging_mock
def insert_execute_command_mock(command): def insert_execute_command_mock(command):
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command').with_args( flexmock(module).should_receive('execute_command').with_args(
command, borg_local_path='borg', extra_environment=None, command,
borg_local_path='borg',
extra_environment=None,
).once() ).once()
@ -33,7 +35,12 @@ def test_mount_archive_calls_borg_with_required_flags():
def test_mount_archive_with_borg_features_calls_borg_with_repository_and_match_archives_flags(): def test_mount_archive_with_borg_features_calls_borg_with_repository_and_match_archives_flags():
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
insert_execute_command_mock( insert_execute_command_mock(
('borg', 'mount', '--repo', 'repo', '--match-archives', 'archive', '/mnt') ('borg', 'mount', '--repo', 'repo', '--match-archives', 'archive', '/mnt')
) )

View File

@ -36,7 +36,12 @@ def test_create_repository_calls_borg_with_flags():
insert_rinfo_command_not_found_mock() insert_rinfo_command_not_found_mock()
insert_rcreate_command_mock(RCREATE_COMMAND + ('--repo', 'repo')) insert_rcreate_command_mock(RCREATE_COMMAND + ('--repo', 'repo'))
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
module.create_repository( module.create_repository(
dry_run=False, dry_run=False,
@ -51,7 +56,12 @@ def test_create_repository_with_dry_run_skips_borg_call():
insert_rinfo_command_not_found_mock() insert_rinfo_command_not_found_mock()
flexmock(module).should_receive('execute_command').never() flexmock(module).should_receive('execute_command').never()
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
module.create_repository( module.create_repository(
dry_run=True, dry_run=True,
@ -65,7 +75,12 @@ def test_create_repository_with_dry_run_skips_borg_call():
def test_create_repository_raises_for_borg_rcreate_error(): def test_create_repository_raises_for_borg_rcreate_error():
insert_rinfo_command_not_found_mock() insert_rinfo_command_not_found_mock()
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command').and_raise( flexmock(module).should_receive('execute_command').and_raise(
module.subprocess.CalledProcessError(2, 'borg rcreate') module.subprocess.CalledProcessError(2, 'borg rcreate')
@ -84,7 +99,12 @@ def test_create_repository_raises_for_borg_rcreate_error():
def test_create_repository_skips_creation_when_repository_already_exists(): def test_create_repository_skips_creation_when_repository_already_exists():
insert_rinfo_command_found_mock() insert_rinfo_command_found_mock()
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
module.create_repository( module.create_repository(
dry_run=False, dry_run=False,
@ -114,7 +134,12 @@ def test_create_repository_with_source_repository_calls_borg_with_other_repo_fla
insert_rinfo_command_not_found_mock() insert_rinfo_command_not_found_mock()
insert_rcreate_command_mock(RCREATE_COMMAND + ('--other-repo', 'other.borg', '--repo', 'repo')) insert_rcreate_command_mock(RCREATE_COMMAND + ('--other-repo', 'other.borg', '--repo', 'repo'))
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
module.create_repository( module.create_repository(
dry_run=False, dry_run=False,
@ -130,7 +155,12 @@ def test_create_repository_with_copy_crypt_key_calls_borg_with_copy_crypt_key_fl
insert_rinfo_command_not_found_mock() insert_rinfo_command_not_found_mock()
insert_rcreate_command_mock(RCREATE_COMMAND + ('--copy-crypt-key', '--repo', 'repo')) insert_rcreate_command_mock(RCREATE_COMMAND + ('--copy-crypt-key', '--repo', 'repo'))
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
module.create_repository( module.create_repository(
dry_run=False, dry_run=False,
@ -146,7 +176,12 @@ def test_create_repository_with_append_only_calls_borg_with_append_only_flag():
insert_rinfo_command_not_found_mock() insert_rinfo_command_not_found_mock()
insert_rcreate_command_mock(RCREATE_COMMAND + ('--append-only', '--repo', 'repo')) insert_rcreate_command_mock(RCREATE_COMMAND + ('--append-only', '--repo', 'repo'))
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
module.create_repository( module.create_repository(
dry_run=False, dry_run=False,
@ -162,7 +197,12 @@ def test_create_repository_with_storage_quota_calls_borg_with_storage_quota_flag
insert_rinfo_command_not_found_mock() insert_rinfo_command_not_found_mock()
insert_rcreate_command_mock(RCREATE_COMMAND + ('--storage-quota', '5G', '--repo', 'repo')) insert_rcreate_command_mock(RCREATE_COMMAND + ('--storage-quota', '5G', '--repo', 'repo'))
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
module.create_repository( module.create_repository(
dry_run=False, dry_run=False,
@ -178,7 +218,12 @@ def test_create_repository_with_make_parent_dirs_calls_borg_with_make_parent_dir
insert_rinfo_command_not_found_mock() insert_rinfo_command_not_found_mock()
insert_rcreate_command_mock(RCREATE_COMMAND + ('--make-parent-dirs', '--repo', 'repo')) insert_rcreate_command_mock(RCREATE_COMMAND + ('--make-parent-dirs', '--repo', 'repo'))
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
module.create_repository( module.create_repository(
dry_run=False, dry_run=False,
@ -195,7 +240,12 @@ def test_create_repository_with_log_info_calls_borg_with_info_flag():
insert_rcreate_command_mock(RCREATE_COMMAND + ('--info', '--repo', 'repo')) insert_rcreate_command_mock(RCREATE_COMMAND + ('--info', '--repo', 'repo'))
insert_logging_mock(logging.INFO) insert_logging_mock(logging.INFO)
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
module.create_repository( module.create_repository(
dry_run=False, dry_run=False,
@ -211,7 +261,12 @@ def test_create_repository_with_log_debug_calls_borg_with_debug_flag():
insert_rcreate_command_mock(RCREATE_COMMAND + ('--debug', '--repo', 'repo')) insert_rcreate_command_mock(RCREATE_COMMAND + ('--debug', '--repo', 'repo'))
insert_logging_mock(logging.DEBUG) insert_logging_mock(logging.DEBUG)
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
module.create_repository( module.create_repository(
dry_run=False, dry_run=False,
@ -226,7 +281,12 @@ def test_create_repository_with_local_path_calls_borg_via_local_path():
insert_rinfo_command_not_found_mock() insert_rinfo_command_not_found_mock()
insert_rcreate_command_mock(('borg1',) + RCREATE_COMMAND[1:] + ('--repo', 'repo')) insert_rcreate_command_mock(('borg1',) + RCREATE_COMMAND[1:] + ('--repo', 'repo'))
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
module.create_repository( module.create_repository(
dry_run=False, dry_run=False,
@ -242,7 +302,12 @@ def test_create_repository_with_remote_path_calls_borg_with_remote_path_flag():
insert_rinfo_command_not_found_mock() insert_rinfo_command_not_found_mock()
insert_rcreate_command_mock(RCREATE_COMMAND + ('--remote-path', 'borg1', '--repo', 'repo')) insert_rcreate_command_mock(RCREATE_COMMAND + ('--remote-path', 'borg1', '--repo', 'repo'))
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
module.create_repository( module.create_repository(
dry_run=False, dry_run=False,
@ -258,7 +323,12 @@ def test_create_repository_with_extra_borg_options_calls_borg_with_extra_options
insert_rinfo_command_not_found_mock() insert_rinfo_command_not_found_mock()
insert_rcreate_command_mock(RCREATE_COMMAND + ('--extra', '--options', '--repo', 'repo')) insert_rcreate_command_mock(RCREATE_COMMAND + ('--extra', '--options', '--repo', 'repo'))
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
module.create_repository( module.create_repository(
dry_run=False, dry_run=False,

View File

@ -11,7 +11,12 @@ def test_display_repository_info_calls_borg_with_parameters():
flexmock(module.borgmatic.logger).should_receive('add_custom_log_levels') flexmock(module.borgmatic.logger).should_receive('add_custom_log_levels')
flexmock(module.logging).ANSWER = module.borgmatic.logger.ANSWER flexmock(module.logging).ANSWER = module.borgmatic.logger.ANSWER
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command').with_args( flexmock(module).should_receive('execute_command').with_args(
('borg', 'rinfo', '--repo', 'repo'), ('borg', 'rinfo', '--repo', 'repo'),
@ -53,7 +58,12 @@ def test_display_repository_info_with_log_info_calls_borg_with_info_parameter():
flexmock(module.borgmatic.logger).should_receive('add_custom_log_levels') flexmock(module.borgmatic.logger).should_receive('add_custom_log_levels')
flexmock(module.logging).ANSWER = module.borgmatic.logger.ANSWER flexmock(module.logging).ANSWER = module.borgmatic.logger.ANSWER
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command').with_args( flexmock(module).should_receive('execute_command').with_args(
('borg', 'rinfo', '--info', '--repo', 'repo'), ('borg', 'rinfo', '--info', '--repo', 'repo'),
@ -74,10 +84,16 @@ def test_display_repository_info_with_log_info_and_json_suppresses_most_borg_out
flexmock(module.borgmatic.logger).should_receive('add_custom_log_levels') flexmock(module.borgmatic.logger).should_receive('add_custom_log_levels')
flexmock(module.logging).ANSWER = module.borgmatic.logger.ANSWER flexmock(module.logging).ANSWER = module.borgmatic.logger.ANSWER
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command_and_capture_output').with_args( flexmock(module).should_receive('execute_command_and_capture_output').with_args(
('borg', 'rinfo', '--json', '--repo', 'repo'), extra_environment=None, ('borg', 'rinfo', '--json', '--repo', 'repo'),
extra_environment=None,
).and_return('[]') ).and_return('[]')
insert_logging_mock(logging.INFO) insert_logging_mock(logging.INFO)
@ -95,7 +111,12 @@ def test_display_repository_info_with_log_debug_calls_borg_with_debug_parameter(
flexmock(module.borgmatic.logger).should_receive('add_custom_log_levels') flexmock(module.borgmatic.logger).should_receive('add_custom_log_levels')
flexmock(module.logging).ANSWER = module.borgmatic.logger.ANSWER flexmock(module.logging).ANSWER = module.borgmatic.logger.ANSWER
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command').with_args( flexmock(module).should_receive('execute_command').with_args(
('borg', 'rinfo', '--debug', '--show-rc', '--repo', 'repo'), ('borg', 'rinfo', '--debug', '--show-rc', '--repo', 'repo'),
@ -117,10 +138,16 @@ def test_display_repository_info_with_log_debug_and_json_suppresses_most_borg_ou
flexmock(module.borgmatic.logger).should_receive('add_custom_log_levels') flexmock(module.borgmatic.logger).should_receive('add_custom_log_levels')
flexmock(module.logging).ANSWER = module.borgmatic.logger.ANSWER flexmock(module.logging).ANSWER = module.borgmatic.logger.ANSWER
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command_and_capture_output').with_args( flexmock(module).should_receive('execute_command_and_capture_output').with_args(
('borg', 'rinfo', '--json', '--repo', 'repo'), extra_environment=None, ('borg', 'rinfo', '--json', '--repo', 'repo'),
extra_environment=None,
).and_return('[]') ).and_return('[]')
insert_logging_mock(logging.DEBUG) insert_logging_mock(logging.DEBUG)
@ -138,10 +165,16 @@ def test_display_repository_info_with_json_calls_borg_with_json_parameter():
flexmock(module.borgmatic.logger).should_receive('add_custom_log_levels') flexmock(module.borgmatic.logger).should_receive('add_custom_log_levels')
flexmock(module.logging).ANSWER = module.borgmatic.logger.ANSWER flexmock(module.logging).ANSWER = module.borgmatic.logger.ANSWER
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command_and_capture_output').with_args( flexmock(module).should_receive('execute_command_and_capture_output').with_args(
('borg', 'rinfo', '--json', '--repo', 'repo'), extra_environment=None, ('borg', 'rinfo', '--json', '--repo', 'repo'),
extra_environment=None,
).and_return('[]') ).and_return('[]')
json_output = module.display_repository_info( json_output = module.display_repository_info(
@ -158,7 +191,12 @@ def test_display_repository_info_with_local_path_calls_borg_via_local_path():
flexmock(module.borgmatic.logger).should_receive('add_custom_log_levels') flexmock(module.borgmatic.logger).should_receive('add_custom_log_levels')
flexmock(module.logging).ANSWER = module.borgmatic.logger.ANSWER flexmock(module.logging).ANSWER = module.borgmatic.logger.ANSWER
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command').with_args( flexmock(module).should_receive('execute_command').with_args(
('borg1', 'rinfo', '--repo', 'repo'), ('borg1', 'rinfo', '--repo', 'repo'),
@ -180,7 +218,12 @@ def test_display_repository_info_with_remote_path_calls_borg_with_remote_path_pa
flexmock(module.borgmatic.logger).should_receive('add_custom_log_levels') flexmock(module.borgmatic.logger).should_receive('add_custom_log_levels')
flexmock(module.logging).ANSWER = module.borgmatic.logger.ANSWER flexmock(module.logging).ANSWER = module.borgmatic.logger.ANSWER
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command').with_args( flexmock(module).should_receive('execute_command').with_args(
('borg', 'rinfo', '--remote-path', 'borg1', '--repo', 'repo'), ('borg', 'rinfo', '--remote-path', 'borg1', '--repo', 'repo'),
@ -203,7 +246,12 @@ def test_display_repository_info_with_lock_wait_calls_borg_with_lock_wait_parame
flexmock(module.logging).ANSWER = module.borgmatic.logger.ANSWER flexmock(module.logging).ANSWER = module.borgmatic.logger.ANSWER
storage_config = {'lock_wait': 5} storage_config = {'lock_wait': 5}
flexmock(module.feature).should_receive('available').and_return(True) flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(
(
'--repo',
'repo',
)
)
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command').with_args( flexmock(module).should_receive('execute_command').with_args(
('borg', 'rinfo', '--lock-wait', '5', '--repo', 'repo'), ('borg', 'rinfo', '--lock-wait', '5', '--repo', 'repo'),

View File

@ -29,7 +29,8 @@ def test_resolve_archive_name_calls_borg_with_parameters():
expected_archive = 'archive-name' expected_archive = 'archive-name'
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command_and_capture_output').with_args( flexmock(module).should_receive('execute_command_and_capture_output').with_args(
('borg', 'list') + BORG_LIST_LATEST_ARGUMENTS, extra_environment=None, ('borg', 'list') + BORG_LIST_LATEST_ARGUMENTS,
extra_environment=None,
).and_return(expected_archive + '\n') ).and_return(expected_archive + '\n')
assert ( assert (
@ -42,7 +43,8 @@ def test_resolve_archive_name_with_log_info_calls_borg_without_info_parameter():
expected_archive = 'archive-name' expected_archive = 'archive-name'
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command_and_capture_output').with_args( flexmock(module).should_receive('execute_command_and_capture_output').with_args(
('borg', 'list') + BORG_LIST_LATEST_ARGUMENTS, extra_environment=None, ('borg', 'list') + BORG_LIST_LATEST_ARGUMENTS,
extra_environment=None,
).and_return(expected_archive + '\n') ).and_return(expected_archive + '\n')
insert_logging_mock(logging.INFO) insert_logging_mock(logging.INFO)
@ -56,7 +58,8 @@ def test_resolve_archive_name_with_log_debug_calls_borg_without_debug_parameter(
expected_archive = 'archive-name' expected_archive = 'archive-name'
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command_and_capture_output').with_args( flexmock(module).should_receive('execute_command_and_capture_output').with_args(
('borg', 'list') + BORG_LIST_LATEST_ARGUMENTS, extra_environment=None, ('borg', 'list') + BORG_LIST_LATEST_ARGUMENTS,
extra_environment=None,
).and_return(expected_archive + '\n') ).and_return(expected_archive + '\n')
insert_logging_mock(logging.DEBUG) insert_logging_mock(logging.DEBUG)
@ -70,7 +73,8 @@ def test_resolve_archive_name_with_local_path_calls_borg_via_local_path():
expected_archive = 'archive-name' expected_archive = 'archive-name'
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command_and_capture_output').with_args( flexmock(module).should_receive('execute_command_and_capture_output').with_args(
('borg1', 'list') + BORG_LIST_LATEST_ARGUMENTS, extra_environment=None, ('borg1', 'list') + BORG_LIST_LATEST_ARGUMENTS,
extra_environment=None,
).and_return(expected_archive + '\n') ).and_return(expected_archive + '\n')
assert ( assert (
@ -100,7 +104,8 @@ def test_resolve_archive_name_with_remote_path_calls_borg_with_remote_path_param
def test_resolve_archive_name_without_archives_raises(): def test_resolve_archive_name_without_archives_raises():
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command_and_capture_output').with_args( flexmock(module).should_receive('execute_command_and_capture_output').with_args(
('borg', 'list') + BORG_LIST_LATEST_ARGUMENTS, extra_environment=None, ('borg', 'list') + BORG_LIST_LATEST_ARGUMENTS,
extra_environment=None,
).and_return('') ).and_return('')
with pytest.raises(ValueError): with pytest.raises(ValueError):
@ -374,7 +379,15 @@ def test_make_rlist_command_includes_short():
@pytest.mark.parametrize( @pytest.mark.parametrize(
'argument_name', 'argument_name',
('sort_by', 'first', 'last', 'exclude', 'exclude_from', 'pattern', 'patterns_from',), (
'sort_by',
'first',
'last',
'exclude',
'exclude_from',
'pattern',
'patterns_from',
),
) )
def test_make_rlist_command_includes_additional_flags(argument_name): def test_make_rlist_command_includes_additional_flags(argument_name):
flexmock(module.flags).should_receive('make_flags').and_return(()) flexmock(module.flags).should_receive('make_flags').and_return(())
@ -411,7 +424,9 @@ def test_make_rlist_command_with_match_archives_calls_borg_with_match_archives_p
None, None, '1.2.3' None, None, '1.2.3'
).and_return(()) ).and_return(())
flexmock(module.flags).should_receive('make_match_archives_flags').with_args( flexmock(module.flags).should_receive('make_match_archives_flags').with_args(
'foo-*', None, '1.2.3', 'foo-*',
None,
'1.2.3',
).and_return(('--match-archives', 'foo-*')) ).and_return(('--match-archives', 'foo-*'))
flexmock(module.flags).should_receive('make_flags_from_arguments').and_return(()) flexmock(module.flags).should_receive('make_flags_from_arguments').and_return(())
flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',)) flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))

View File

@ -15,7 +15,8 @@ def insert_execute_command_and_capture_output_mock(
): ):
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command_and_capture_output').with_args( flexmock(module).should_receive('execute_command_and_capture_output').with_args(
command, extra_environment=None, command,
extra_environment=None,
).once().and_return(version_output) ).once().and_return(version_output)

View File

@ -229,7 +229,8 @@ def test_run_configuration_retries_hard_error():
).and_return([flexmock()]) ).and_return([flexmock()])
error_logs = [flexmock()] error_logs = [flexmock()]
flexmock(module).should_receive('log_error_records').with_args( flexmock(module).should_receive('log_error_records').with_args(
'foo: Error running actions for repository', OSError, 'foo: Error running actions for repository',
OSError,
).and_return(error_logs) ).and_return(error_logs)
config = {'location': {'repositories': [{'path': 'foo'}]}, 'storage': {'retries': 1}} config = {'location': {'repositories': [{'path': 'foo'}]}, 'storage': {'retries': 1}}
arguments = {'global': flexmock(monitoring_verbosity=1, dry_run=False), 'create': flexmock()} arguments = {'global': flexmock(monitoring_verbosity=1, dry_run=False), 'create': flexmock()}

View File

@ -21,13 +21,21 @@ from borgmatic.config import normalize as module
{'location': {'source_directories': ['foo', 'bar']}}, {'location': {'source_directories': ['foo', 'bar']}},
False, False,
), ),
({'location': None}, {'location': None}, False,), (
{'location': None},
{'location': None},
False,
),
( (
{'storage': {'compression': 'yes_please'}}, {'storage': {'compression': 'yes_please'}},
{'storage': {'compression': 'yes_please'}}, {'storage': {'compression': 'yes_please'}},
False, False,
), ),
({'storage': None}, {'storage': None}, False,), (
{'storage': None},
{'storage': None},
False,
),
( (
{'hooks': {'healthchecks': 'https://example.com'}}, {'hooks': {'healthchecks': 'https://example.com'}},
{'hooks': {'healthchecks': {'ping_url': 'https://example.com'}}}, {'hooks': {'healthchecks': {'ping_url': 'https://example.com'}}},
@ -48,10 +56,9 @@ from borgmatic.config import normalize as module
{'hooks': {'cronhub': {'ping_url': 'https://example.com'}}}, {'hooks': {'cronhub': {'ping_url': 'https://example.com'}}},
False, False,
), ),
({'hooks': None}, {'hooks': None}, False,),
( (
{'consistency': {'checks': ['archives']}}, {'hooks': None},
{'consistency': {'checks': [{'name': 'archives'}]}}, {'hooks': None},
False, False,
), ),
( (
@ -59,9 +66,26 @@ from borgmatic.config import normalize as module
{'consistency': {'checks': [{'name': 'archives'}]}}, {'consistency': {'checks': [{'name': 'archives'}]}},
False, False,
), ),
({'consistency': None}, {'consistency': None}, False,), (
({'location': {'numeric_owner': False}}, {'location': {'numeric_ids': False}}, False,), {'consistency': {'checks': ['archives']}},
({'location': {'bsd_flags': False}}, {'location': {'flags': False}}, False,), {'consistency': {'checks': [{'name': 'archives'}]}},
False,
),
(
{'consistency': None},
{'consistency': None},
False,
),
(
{'location': {'numeric_owner': False}},
{'location': {'numeric_ids': False}},
False,
),
(
{'location': {'bsd_flags': False}},
{'location': {'flags': False}},
False,
),
( (
{'storage': {'remote_rate_limit': False}}, {'storage': {'remote_rate_limit': False}},
{'storage': {'upload_rate_limit': False}}, {'storage': {'upload_rate_limit': False}},

View File

@ -138,7 +138,6 @@ def test_guard_configuration_contains_repository_does_not_raise_when_repository_
def test_guard_configuration_contains_repository_does_not_raise_when_repository_label_in_config(): def test_guard_configuration_contains_repository_does_not_raise_when_repository_label_in_config():
module.guard_configuration_contains_repository( module.guard_configuration_contains_repository(
repository='repo', repository='repo',
configurations={ configurations={
@ -190,13 +189,15 @@ def test_guard_single_repository_selected_raises_when_multiple_repositories_conf
def test_guard_single_repository_selected_does_not_raise_when_single_repository_configured_and_none_selected(): def test_guard_single_repository_selected_does_not_raise_when_single_repository_configured_and_none_selected():
module.guard_single_repository_selected( module.guard_single_repository_selected(
repository=None, configurations={'config.yaml': {'location': {'repositories': ['repo']}}}, repository=None,
configurations={'config.yaml': {'location': {'repositories': ['repo']}}},
) )
def test_guard_single_repository_selected_does_not_raise_when_no_repositories_configured_and_one_selected(): def test_guard_single_repository_selected_does_not_raise_when_no_repositories_configured_and_one_selected():
module.guard_single_repository_selected( module.guard_single_repository_selected(
repository='repo', configurations={'config.yaml': {'location': {'repositories': []}}}, repository='repo',
configurations={'config.yaml': {'location': {'repositories': []}}},
) )

View File

@ -108,5 +108,9 @@ def test_ping_monitor_with_unsupported_monitoring_state():
hook_config = {'ping_url': 'https://example.com'} hook_config = {'ping_url': 'https://example.com'}
flexmock(module.requests).should_receive('get').never() flexmock(module.requests).should_receive('get').never()
module.ping_monitor( module.ping_monitor(
hook_config, 'config.yaml', module.monitor.State.LOG, monitoring_log_level=1, dry_run=False, hook_config,
'config.yaml',
module.monitor.State.LOG,
monitoring_log_level=1,
dry_run=False,
) )

View File

@ -93,5 +93,9 @@ def test_ping_monitor_with_unsupported_monitoring_state():
hook_config = {'ping_url': 'https://example.com'} hook_config = {'ping_url': 'https://example.com'}
flexmock(module.requests).should_receive('get').never() flexmock(module.requests).should_receive('get').never()
module.ping_monitor( module.ping_monitor(
hook_config, 'config.yaml', module.monitor.State.LOG, monitoring_log_level=1, dry_run=False, hook_config,
'config.yaml',
module.monitor.State.LOG,
monitoring_log_level=1,
dry_run=False,
) )

View File

@ -206,7 +206,9 @@ def test_ping_monitor_with_ping_uuid_hits_corresponding_url():
payload = 'data' payload = 'data'
flexmock(module).should_receive('format_buffered_logs_for_payload').and_return(payload) flexmock(module).should_receive('format_buffered_logs_for_payload').and_return(payload)
flexmock(module.requests).should_receive('post').with_args( flexmock(module.requests).should_receive('post').with_args(
f"https://hc-ping.com/{hook_config['ping_url']}", data=payload.encode('utf-8'), verify=True, f"https://hc-ping.com/{hook_config['ping_url']}",
data=payload.encode('utf-8'),
verify=True,
).and_return(flexmock(ok=True)) ).and_return(flexmock(ok=True))
module.ping_monitor( module.ping_monitor(

View File

@ -114,7 +114,8 @@ def test_dump_databases_runs_mongodump_with_directory_format():
flexmock(module.dump).should_receive('create_named_pipe_for_dump').never() flexmock(module.dump).should_receive('create_named_pipe_for_dump').never()
flexmock(module).should_receive('execute_command').with_args( flexmock(module).should_receive('execute_command').with_args(
['mongodump', '--out', 'databases/localhost/foo', '--db', 'foo'], shell=True, ['mongodump', '--out', 'databases/localhost/foo', '--db', 'foo'],
shell=True,
).and_return(flexmock()).once() ).and_return(flexmock()).once()
assert module.dump_databases(databases, 'test.yaml', {}, dry_run=False) == [] assert module.dump_databases(databases, 'test.yaml', {}, dry_run=False) == []

View File

@ -149,7 +149,14 @@ def test_execute_dump_command_runs_mysqldump():
flexmock(module.dump).should_receive('create_named_pipe_for_dump') flexmock(module.dump).should_receive('create_named_pipe_for_dump')
flexmock(module).should_receive('execute_command').with_args( flexmock(module).should_receive('execute_command').with_args(
('mysqldump', '--add-drop-database', '--databases', 'foo', '--result-file', 'dump',), (
'mysqldump',
'--add-drop-database',
'--databases',
'foo',
'--result-file',
'dump',
),
extra_environment=None, extra_environment=None,
run_to_completion=False, run_to_completion=False,
).and_return(process).once() ).and_return(process).once()
@ -175,7 +182,13 @@ def test_execute_dump_command_runs_mysqldump_without_add_drop_database():
flexmock(module.dump).should_receive('create_named_pipe_for_dump') flexmock(module.dump).should_receive('create_named_pipe_for_dump')
flexmock(module).should_receive('execute_command').with_args( flexmock(module).should_receive('execute_command').with_args(
('mysqldump', '--databases', 'foo', '--result-file', 'dump',), (
'mysqldump',
'--databases',
'foo',
'--result-file',
'dump',
),
extra_environment=None, extra_environment=None,
run_to_completion=False, run_to_completion=False,
).and_return(process).once() ).and_return(process).once()

View File

@ -320,7 +320,11 @@ def test_execute_command_and_capture_output_returns_output_with_extra_environmen
expected_output = '[]' expected_output = '[]'
flexmock(module.os, environ={'a': 'b'}) flexmock(module.os, environ={'a': 'b'})
flexmock(module.subprocess).should_receive('check_output').with_args( flexmock(module.subprocess).should_receive('check_output').with_args(
full_command, stderr=None, shell=False, env={'a': 'b', 'c': 'd'}, cwd=None, full_command,
stderr=None,
shell=False,
env={'a': 'b', 'c': 'd'},
cwd=None,
).and_return(flexmock(decode=lambda: expected_output)).once() ).and_return(flexmock(decode=lambda: expected_output)).once()
output = module.execute_command_and_capture_output( output = module.execute_command_and_capture_output(