diff --git a/borgmatic/config/validate.py b/borgmatic/config/validate.py index b39199fe..5835ead1 100644 --- a/borgmatic/config/validate.py +++ b/borgmatic/config/validate.py @@ -3,11 +3,6 @@ import os import jsonschema import ruamel.yaml -try: - import importlib_metadata -except ModuleNotFoundError: # pragma: nocover - import importlib.metadata as importlib_metadata - import borgmatic.config from borgmatic.config import environment, load, normalize, override @@ -19,16 +14,10 @@ def schema_filename(): Raise FileNotFoundError when the schema path does not exist. ''' - try: - return next( - str(path.locate()) - for path in importlib_metadata.files('borgmatic') - if path.match('config/schema.yaml') - ) - except StopIteration: - # If the schema wasn't found in the package's files, this is probably a pip editable - # install, so try a different approach to get the schema. - return os.path.join(os.path.dirname(borgmatic.config.__file__), 'schema.yaml') + schema_path = os.path.join(os.path.dirname(borgmatic.config.__file__), 'schema.yaml') + + with open(schema_path): + return schema_path def format_json_error_path_element(path_element): diff --git a/tests/unit/config/test_validate.py b/tests/unit/config/test_validate.py index e81f2b02..701ba510 100644 --- a/tests/unit/config/test_validate.py +++ b/tests/unit/config/test_validate.py @@ -1,3 +1,7 @@ +import os +import sys +from io import StringIO + import pytest from flexmock import flexmock @@ -7,22 +11,21 @@ from borgmatic.config import validate as module def test_schema_filename_finds_schema_path(): schema_path = '/var/borgmatic/config/schema.yaml' - flexmock(module.importlib_metadata).should_receive('files').and_return( - flexmock(match=lambda path: False, locate=lambda: None), - flexmock(match=lambda path: True, locate=lambda: schema_path), - flexmock(match=lambda path: False, locate=lambda: None), - ) - + flexmock(os.path).should_receive('dirname').and_return("/var/borgmatic/config") + builtins = flexmock(sys.modules['builtins']) + builtins.should_receive('open').with_args(schema_path).and_return(StringIO()) assert module.schema_filename() == schema_path -def test_schema_filename_with_missing_schema_path_in_package_still_finds_it_in_config_directory(): - flexmock(module.importlib_metadata).should_receive('files').and_return( - flexmock(match=lambda path: False, locate=lambda: None), - flexmock(match=lambda path: False, locate=lambda: None), - ) +def test_schema_filename_raises_filenotfounderror(): + schema_path = '/var/borgmatic/config/schema.yaml' - assert module.schema_filename().endswith('/borgmatic/config/schema.yaml') + flexmock(os.path).should_receive('dirname').and_return("/var/borgmatic/config") + builtins = flexmock(sys.modules['builtins']) + builtins.should_receive('open').with_args(schema_path).and_raise(FileNotFoundError) + + with pytest.raises(FileNotFoundError): + module.schema_filename() def test_format_json_error_path_element_formats_array_index():