From 50c2305993551ca91a7acc36ea91b00650010d43 Mon Sep 17 00:00:00 2001 From: Uwe Hartwig Date: Mon, 20 Dec 2021 13:03:39 +0100 Subject: [PATCH 1/5] [test][rfct] decoupling: res-manager vs constants --- Makefile | 3 +- ocrd/ocrd/resource_manager.py | 35 +++++++--- ocrd_utils/ocrd_utils/__init__.py | 3 +- tests/test_resource_manager.py | 111 ++++++++++++++++++++---------- 4 files changed, 103 insertions(+), 49 deletions(-) diff --git a/Makefile b/Makefile index 4c066fa747..21e1848bff 100644 --- a/Makefile +++ b/Makefile @@ -152,8 +152,7 @@ assets-server: test: assets HOME=$(CURDIR)/ocrd_utils $(PYTHON) -m pytest --continue-on-collection-errors -k TestLogging $(TESTDIR) HOME=$(CURDIR) $(PYTHON) -m pytest --continue-on-collection-errors -k TestLogging $(TESTDIR) - HOME=$(CURDIR) $(PYTHON) -m pytest --continue-on-collection-errors $(TESTDIR)/test_resource_manager.py - $(PYTHON) -m pytest --continue-on-collection-errors --ignore=$(TESTDIR)/test_logging.py --ignore=$(TESTDIR)/test_resource_manager.py $(TESTDIR) + $(PYTHON) -m pytest --continue-on-collection-errors --ignore=$(TESTDIR)/test_logging.py $(TESTDIR) test-profile: $(PYTHON) -m cProfile -o profile $$(which pytest) diff --git a/ocrd/ocrd/resource_manager.py b/ocrd/ocrd/resource_manager.py index 7c37cb292b..a245252f99 100644 --- a/ocrd/ocrd/resource_manager.py +++ b/ocrd/ocrd/resource_manager.py @@ -1,6 +1,6 @@ from pathlib import Path from os.path import join -from os import environ, listdir, getcwd +from os import environ, listdir, getcwd, path import re from shutil import copytree from datetime import datetime @@ -13,8 +13,6 @@ from ocrd_validators import OcrdResourceListValidator from ocrd_utils import getLogger from ocrd_utils.os import list_all_resources, pushd_popd -from ocrd_utils.constants import XDG_CONFIG_HOME, XDG_DATA_HOME - from .constants import RESOURCE_LIST_FILENAME, RESOURCE_USER_LIST_COMMENT class OcrdResourceManager(): @@ -22,11 +20,18 @@ class OcrdResourceManager(): """ Managing processor resources """ - def __init__(self): + def __init__(self, xdb_config_home=None, xdb_data_home=None): self.log = getLogger('ocrd.resource_manager') self.database = {} + + self.xdb_data_home = xdb_data_home + if not self.xdb_data_home: + self._init_data_home() + self.xdb_config_home = xdb_config_home + if not self.xdb_config_home: + self._init_config_home() self.load_resource_list(Path(RESOURCE_LIST_FILENAME)) - self.user_list = Path(XDG_CONFIG_HOME, 'ocrd', 'resources.yml') + self.user_list = Path(self.xdb_config_home, 'ocrd', 'resources.yml') if not self.user_list.exists(): if not self.user_list.parent.exists(): self.user_list.parent.mkdir(parents=True) @@ -34,6 +39,20 @@ def __init__(self): f.write(RESOURCE_USER_LIST_COMMENT) self.load_resource_list(self.user_list) + def __init_home(self): + the_home = path.expanduser('~') + if 'HOME' in environ and environ['HOME'] != path.expanduser('~'): + the_home = environ['HOME'] + return the_home + + def _init_config_home(self): + the_home = self.__init_home() + self.xdb_config_home = environ['XDG_CONFIG_HOME'] if 'XDG_CONFIG_HOME' in environ else join(the_home, '.config') + + def _init_data_home(self): + the_home = self.__init_home() + self.xdb_data_home = environ['XDG_DATA_HOME'] if 'XDG_DATA_HOME' in environ else join(the_home, '.local', 'share') + def load_resource_list(self, list_filename, database=None): if not database: database = self.database @@ -70,7 +89,7 @@ def list_installed(self, executable=None): # resources we know about all_executables = list(self.database.keys()) # resources in the file system - parent_dirs = [join(x, 'ocrd-resources') for x in [XDG_DATA_HOME, '/usr/local/share']] + parent_dirs = [join(x, 'ocrd-resources') for x in [self.xdb_data_home, '/usr/local/share']] for parent_dir in parent_dirs: if Path(parent_dir).exists(): all_executables += [x for x in listdir(parent_dir) if x.startswith('ocrd-')] @@ -140,13 +159,13 @@ def default_resource_dir(self): def location_to_resource_dir(self, location): return '/usr/local/share/ocrd-resources' if location == 'system' else \ - join(XDG_DATA_HOME, 'ocrd-resources') if location == 'data' else \ + join(self.xdb_data_home, 'ocrd-resources') if location == 'data' else \ getcwd() def resource_dir_to_location(self, resource_path): resource_path = str(resource_path) return 'system' if resource_path.startswith('/usr/local/share/ocrd-resources') else \ - 'data' if resource_path.startswith(join(XDG_DATA_HOME, 'ocrd-resources')) else \ + 'data' if resource_path.startswith(join(self.xdb_data_home, 'ocrd-resources')) else \ 'cwd' if resource_path.startswith(getcwd()) else \ resource_path diff --git a/ocrd_utils/ocrd_utils/__init__.py b/ocrd_utils/ocrd_utils/__init__.py index 90d551f498..14aec4c4b7 100644 --- a/ocrd_utils/ocrd_utils/__init__.py +++ b/ocrd_utils/ocrd_utils/__init__.py @@ -114,8 +114,7 @@ LOG_FORMAT, LOG_TIMEFMT, VERSION, - XDG_CONFIG_HOME, - XDG_DATA_HOME) + ) from .deprecate import ( deprecated_alias) diff --git a/tests/test_resource_manager.py b/tests/test_resource_manager.py index afcf6c5bdd..1d25a47d8a 100644 --- a/tests/test_resource_manager.py +++ b/tests/test_resource_manager.py @@ -1,40 +1,77 @@ -from contextlib import contextmanager -from pathlib import Path -from tests.base import TestCase, main # pylint: disable=import-error,no-name-in-module - -from pytest import fixture - -from ocrd_utils import pushd_popd, initLogging -import ocrd_utils.constants - -@contextmanager -def monkey_patch_temp_xdg(): - with pushd_popd(tempdir=True) as tempdir: - old_config = ocrd_utils.constants.XDG_CONFIG_HOME - old_data = ocrd_utils.constants.XDG_DATA_HOME - ocrd_utils.constants.XDG_CONFIG_HOME = tempdir - ocrd_utils.constants.XDG_DATA_HOME = tempdir - from ocrd.resource_manager import OcrdResourceManager - yield tempdir, OcrdResourceManager() - ocrd_utils.constants.XDG_CONFIG_HOME = old_config - ocrd_utils.constants.XDG_DATA_HOME = old_data - -def test_config_created(): - with monkey_patch_temp_xdg() as (tempdir, mgr): - f = Path(tempdir, 'ocrd', 'resources.yml') - assert f.exists() - assert f == mgr.user_list - ret = mgr.add_to_user_database('ocrd-foo', f) - ret = mgr.add_to_user_database('ocrd-foo', f) - assert ret - mgr.list_installed() - proc = 'ocrd-anybaseocr-layout-analysis' - url = 'https://ocr-d-repo.scc.kit.edu/models/dfki/layoutAnalysis/mapping_densenet.pickle' - fpath = mgr.download(proc, url, mgr.location_to_resource_dir('data')) - assert fpath.exists() - ret = mgr.add_to_user_database(proc, fpath) - ret = mgr.add_to_user_database(proc, fpath) - assert ret +# -*- coding: utf-8 -*- + +import os +import pathlib + +from tests.base import main + +CONST_RESOURCE_YML = 'resources.yml' +CONST_RESOURCE_URL_LAYOUT = 'https://ocr-d-repo.scc.kit.edu/models/dfki/layoutAnalysis/mapping_densenet.pickle' + +def test_resources_manager_config_default(): + + # arrange + from ocrd.resource_manager import OcrdResourceManager + + # act + mgr = OcrdResourceManager() + + # + default_config_dir = os.path.join(os.environ['HOME'], '.config', 'ocrd') + f = pathlib.Path(default_config_dir) / CONST_RESOURCE_YML + assert f.exists() + assert f == mgr.user_list + assert mgr.add_to_user_database('ocrd-foo', f) + mgr.list_installed() + proc = 'ocrd-anybaseocr-layout-analysis' + fpath = mgr.download(proc, CONST_RESOURCE_URL_LAYOUT, mgr.location_to_resource_dir('data')) + assert fpath.exists() + assert mgr.add_to_user_database(proc, fpath) + + +def test_resources_manager_from_environment(tmp_path, monkeypatch): + + # arrange + monkeypatch.delenv("XDG_CONFIG_HOME", raising=False) + monkeypatch.delenv("XDG_DATA_HOME", raising=False) + from ocrd.resource_manager import OcrdResourceManager + monkeypatch.setenv('XDG_CONFIG_HOME', str(tmp_path)) + monkeypatch.setenv('XDG_DATA_HOME', str(tmp_path)) + + # act + mgr = OcrdResourceManager() + + # + f = tmp_path / 'ocrd' / CONST_RESOURCE_YML + assert f.exists() + assert f == mgr.user_list + assert mgr.add_to_user_database('ocrd-foo', f) + mgr.list_installed() + proc = 'ocrd-anybaseocr-layout-analysis' + fpath = mgr.download(proc, CONST_RESOURCE_URL_LAYOUT, mgr.location_to_resource_dir('data')) + assert fpath.exists() + assert mgr.add_to_user_database(proc, fpath) + + +def test_resources_manager_config_explicite(tmp_path): + + # arrange + from ocrd.resource_manager import OcrdResourceManager + + # act + mgr = OcrdResourceManager(xdb_config_home=str(tmp_path), xdb_data_home=str(tmp_path)) + + # + f = tmp_path / 'ocrd' / CONST_RESOURCE_YML + assert f.exists() + assert f == mgr.user_list + assert mgr.add_to_user_database('ocrd-foo', f) + mgr.list_installed() + proc = 'ocrd-anybaseocr-layout-analysis' + fpath = mgr.download(proc, CONST_RESOURCE_URL_LAYOUT, mgr.location_to_resource_dir('data')) + assert fpath.exists() + assert mgr.add_to_user_database(proc, fpath) + if __name__ == "__main__": main(__file__) From 62e9f827c011d50bf95d8489c60a329e76e01aca Mon Sep 17 00:00:00 2001 From: Uwe Hartwig Date: Mon, 20 Dec 2021 13:27:46 +0100 Subject: [PATCH 2/5] [test][rfct] drop useless imports --- tests/test_resource_manager.py | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/tests/test_resource_manager.py b/tests/test_resource_manager.py index 1d25a47d8a..3a95847d0d 100644 --- a/tests/test_resource_manager.py +++ b/tests/test_resource_manager.py @@ -3,20 +3,20 @@ import os import pathlib +from ocrd.resource_manager import OcrdResourceManager + from tests.base import main CONST_RESOURCE_YML = 'resources.yml' CONST_RESOURCE_URL_LAYOUT = 'https://ocr-d-repo.scc.kit.edu/models/dfki/layoutAnalysis/mapping_densenet.pickle' -def test_resources_manager_config_default(): - # arrange - from ocrd.resource_manager import OcrdResourceManager +def test_resources_manager_config_default(): # act mgr = OcrdResourceManager() - # + # assert default_config_dir = os.path.join(os.environ['HOME'], '.config', 'ocrd') f = pathlib.Path(default_config_dir) / CONST_RESOURCE_YML assert f.exists() @@ -32,16 +32,13 @@ def test_resources_manager_config_default(): def test_resources_manager_from_environment(tmp_path, monkeypatch): # arrange - monkeypatch.delenv("XDG_CONFIG_HOME", raising=False) - monkeypatch.delenv("XDG_DATA_HOME", raising=False) - from ocrd.resource_manager import OcrdResourceManager monkeypatch.setenv('XDG_CONFIG_HOME', str(tmp_path)) monkeypatch.setenv('XDG_DATA_HOME', str(tmp_path)) # act mgr = OcrdResourceManager() - # + # assert f = tmp_path / 'ocrd' / CONST_RESOURCE_YML assert f.exists() assert f == mgr.user_list @@ -55,13 +52,10 @@ def test_resources_manager_from_environment(tmp_path, monkeypatch): def test_resources_manager_config_explicite(tmp_path): - # arrange - from ocrd.resource_manager import OcrdResourceManager - # act mgr = OcrdResourceManager(xdb_config_home=str(tmp_path), xdb_data_home=str(tmp_path)) - # + # assert f = tmp_path / 'ocrd' / CONST_RESOURCE_YML assert f.exists() assert f == mgr.user_list From 1a507b7af60c7e9fb9c9439e9d2783d6363f4b77 Mon Sep 17 00:00:00 2001 From: Uwe Hartwig Date: Thu, 23 Dec 2021 08:46:23 +0100 Subject: [PATCH 3/5] [app][rfct] turn xdg_data_home to property --- ocrd/ocrd/resource_manager.py | 43 ++++++++++++++++++++-------------- tests/test_resource_manager.py | 2 +- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/ocrd/ocrd/resource_manager.py b/ocrd/ocrd/resource_manager.py index a245252f99..d015a6a654 100644 --- a/ocrd/ocrd/resource_manager.py +++ b/ocrd/ocrd/resource_manager.py @@ -20,18 +20,16 @@ class OcrdResourceManager(): """ Managing processor resources """ - def __init__(self, xdb_config_home=None, xdb_data_home=None): + def __init__(self, xdg_config_home=None): self.log = getLogger('ocrd.resource_manager') self.database = {} - self.xdb_data_home = xdb_data_home - if not self.xdb_data_home: - self._init_data_home() - self.xdb_config_home = xdb_config_home - if not self.xdb_config_home: - self._init_config_home() + self._xdg_data_home = None + self.xdg_config_home = xdg_config_home + if not self.xdg_config_home: + self._calculate_xdg_config_home() self.load_resource_list(Path(RESOURCE_LIST_FILENAME)) - self.user_list = Path(self.xdb_config_home, 'ocrd', 'resources.yml') + self.user_list = Path(self.xdg_config_home, 'ocrd', 'resources.yml') if not self.user_list.exists(): if not self.user_list.parent.exists(): self.user_list.parent.mkdir(parents=True) @@ -44,14 +42,23 @@ def __init_home(self): if 'HOME' in environ and environ['HOME'] != path.expanduser('~'): the_home = environ['HOME'] return the_home - - def _init_config_home(self): - the_home = self.__init_home() - self.xdb_config_home = environ['XDG_CONFIG_HOME'] if 'XDG_CONFIG_HOME' in environ else join(the_home, '.config') - def _init_data_home(self): - the_home = self.__init_home() - self.xdb_data_home = environ['XDG_DATA_HOME'] if 'XDG_DATA_HOME' in environ else join(the_home, '.local', 'share') + @property + def xdg_data_home(self): + if not self._xdg_data_home: + if 'XDG_DATA_HOME' in environ: + self._xdg_data_home = environ['XDG_DATA_HOME'] + else: + the_home = self.__init_home() + self._xdg_data_home = join(the_home, '.local', 'share') + return self._xdg_data_home + + def _calculate_xdg_config_home(self): + if 'XDG_CONFIG_HOME' in environ: + self.xdg_config_home = environ['XDG_CONFIG_HOME'] + else: + the_home = self.__init_home() + self.xdg_config_home = join(the_home, '.config') def load_resource_list(self, list_filename, database=None): if not database: @@ -89,7 +96,7 @@ def list_installed(self, executable=None): # resources we know about all_executables = list(self.database.keys()) # resources in the file system - parent_dirs = [join(x, 'ocrd-resources') for x in [self.xdb_data_home, '/usr/local/share']] + parent_dirs = [join(x, 'ocrd-resources') for x in [self.xdg_data_home, '/usr/local/share']] for parent_dir in parent_dirs: if Path(parent_dir).exists(): all_executables += [x for x in listdir(parent_dir) if x.startswith('ocrd-')] @@ -159,13 +166,13 @@ def default_resource_dir(self): def location_to_resource_dir(self, location): return '/usr/local/share/ocrd-resources' if location == 'system' else \ - join(self.xdb_data_home, 'ocrd-resources') if location == 'data' else \ + join(self.xdg_data_home, 'ocrd-resources') if location == 'data' else \ getcwd() def resource_dir_to_location(self, resource_path): resource_path = str(resource_path) return 'system' if resource_path.startswith('/usr/local/share/ocrd-resources') else \ - 'data' if resource_path.startswith(join(self.xdb_data_home, 'ocrd-resources')) else \ + 'data' if resource_path.startswith(join(self.xdg_data_home, 'ocrd-resources')) else \ 'cwd' if resource_path.startswith(getcwd()) else \ resource_path diff --git a/tests/test_resource_manager.py b/tests/test_resource_manager.py index 3a95847d0d..bc13100dbf 100644 --- a/tests/test_resource_manager.py +++ b/tests/test_resource_manager.py @@ -53,7 +53,7 @@ def test_resources_manager_from_environment(tmp_path, monkeypatch): def test_resources_manager_config_explicite(tmp_path): # act - mgr = OcrdResourceManager(xdb_config_home=str(tmp_path), xdb_data_home=str(tmp_path)) + mgr = OcrdResourceManager(xdg_config_home=str(tmp_path)) # assert f = tmp_path / 'ocrd' / CONST_RESOURCE_YML From 477fc1bd2088fd2d51f8e0b6e928802a97aa7167 Mon Sep 17 00:00:00 2001 From: Konstantin Baierer Date: Thu, 23 Dec 2021 14:05:47 +0100 Subject: [PATCH 4/5] resource_manager: make xdg_data_home and userdir properties --- ocrd/ocrd/resource_manager.py | 47 ++++++++++++++++++---------------- tests/test_resource_manager.py | 13 ++++++++++ 2 files changed, 38 insertions(+), 22 deletions(-) diff --git a/ocrd/ocrd/resource_manager.py b/ocrd/ocrd/resource_manager.py index d015a6a654..5eb9973fb3 100644 --- a/ocrd/ocrd/resource_manager.py +++ b/ocrd/ocrd/resource_manager.py @@ -20,16 +20,16 @@ class OcrdResourceManager(): """ Managing processor resources """ - def __init__(self, xdg_config_home=None): + def __init__(self, userdir=None, xdg_config_home=None, xdg_data_home=None): self.log = getLogger('ocrd.resource_manager') self.database = {} - self._xdg_data_home = None - self.xdg_config_home = xdg_config_home - if not self.xdg_config_home: - self._calculate_xdg_config_home() - self.load_resource_list(Path(RESOURCE_LIST_FILENAME)) + self._xdg_data_home = xdg_data_home + self._xdg_config_home = xdg_config_home + self._userdir = userdir self.user_list = Path(self.xdg_config_home, 'ocrd', 'resources.yml') + + self.load_resource_list(Path(RESOURCE_LIST_FILENAME)) if not self.user_list.exists(): if not self.user_list.parent.exists(): self.user_list.parent.mkdir(parents=True) @@ -37,28 +37,31 @@ def __init__(self, xdg_config_home=None): f.write(RESOURCE_USER_LIST_COMMENT) self.load_resource_list(self.user_list) - def __init_home(self): - the_home = path.expanduser('~') - if 'HOME' in environ and environ['HOME'] != path.expanduser('~'): - the_home = environ['HOME'] - return the_home + @property + def userdir(self): + if not self._userdir: + self._userdir = path.expanduser('~') + if 'HOME' in environ and environ['HOME'] != path.expanduser('~'): + self._userdir = environ['HOME'] + return self._userdir @property def xdg_data_home(self): if not self._xdg_data_home: if 'XDG_DATA_HOME' in environ: - self._xdg_data_home = environ['XDG_DATA_HOME'] + self._xdg_data_home = environ['XDG_DATA_HOME'] else: - the_home = self.__init_home() - self._xdg_data_home = join(the_home, '.local', 'share') + self._xdg_data_home = join(self.userdir, '.local', 'share') return self._xdg_data_home - - def _calculate_xdg_config_home(self): - if 'XDG_CONFIG_HOME' in environ: - self.xdg_config_home = environ['XDG_CONFIG_HOME'] - else: - the_home = self.__init_home() - self.xdg_config_home = join(the_home, '.config') + + @property + def xdg_config_home(self): + if not self._xdg_config_home: + if 'XDG_CONFIG_HOME' in environ: + self._xdg_config_home = environ['XDG_CONFIG_HOME'] + else: + self._xdg_config_home = join(self.userdir, '.config') + return self._xdg_config_home def load_resource_list(self, list_filename, database=None): if not database: @@ -106,7 +109,7 @@ def list_installed(self, executable=None): res_name = Path(res_filename).name resdict = [x for x in self.database.get(this_executable, []) if x['name'] == res_name] if not resdict: - self.log.info("%s resource '%s' (%s) not a known resource, creating stub in %s'" % (this_executable, res_name, res_filename, self.user_list)) + self.log.info("%s resource '%s' (%s) not a known resource, creating stub in %s'", this_executable, res_name, res_filename, self.user_list) resdict = [self.add_to_user_database(this_executable, res_filename)] resdict[0]['path'] = res_filename reslist.append(resdict[0]) diff --git a/tests/test_resource_manager.py b/tests/test_resource_manager.py index bc13100dbf..f0040b50ab 100644 --- a/tests/test_resource_manager.py +++ b/tests/test_resource_manager.py @@ -5,6 +5,7 @@ from ocrd.resource_manager import OcrdResourceManager +from pytest import raises from tests.base import main CONST_RESOURCE_YML = 'resources.yml' @@ -34,6 +35,7 @@ def test_resources_manager_from_environment(tmp_path, monkeypatch): # arrange monkeypatch.setenv('XDG_CONFIG_HOME', str(tmp_path)) monkeypatch.setenv('XDG_DATA_HOME', str(tmp_path)) + monkeypatch.setenv('HOME', str(tmp_path)) # act mgr = OcrdResourceManager() @@ -48,6 +50,7 @@ def test_resources_manager_from_environment(tmp_path, monkeypatch): fpath = mgr.download(proc, CONST_RESOURCE_URL_LAYOUT, mgr.location_to_resource_dir('data')) assert fpath.exists() assert mgr.add_to_user_database(proc, fpath) + assert mgr.userdir == str(tmp_path) def test_resources_manager_config_explicite(tmp_path): @@ -66,6 +69,16 @@ def test_resources_manager_config_explicite(tmp_path): assert fpath.exists() assert mgr.add_to_user_database(proc, fpath) +def test_resources_manager_config_explicit_invalid(tmp_path): + + # act + (tmp_path / 'ocrd').mkdir() + (tmp_path / 'ocrd' / CONST_RESOURCE_YML).write_text('::INVALID::') + + # assert + with raises(ValueError, match='is invalid'): + OcrdResourceManager(xdg_config_home=tmp_path) + if __name__ == "__main__": main(__file__) From d7de707967e7223efe6dc098b4c1eb8e3c433bc1 Mon Sep 17 00:00:00 2001 From: Konstantin Baierer Date: Thu, 23 Dec 2021 14:49:59 +0100 Subject: [PATCH 5/5] resource manager: reload after add_to_user_database --- ocrd/ocrd/resource_manager.py | 6 ++++-- tests/test_resource_manager.py | 27 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/ocrd/ocrd/resource_manager.py b/ocrd/ocrd/resource_manager.py index 5eb9973fb3..beda350094 100644 --- a/ocrd/ocrd/resource_manager.py +++ b/ocrd/ocrd/resource_manager.py @@ -86,7 +86,7 @@ def list_available(self, executable=None): """ if executable: return [(executable, self.database[executable])] - return [(x, y) for x, y in self.database.items()] + return self.database.items() def list_installed(self, executable=None): """ @@ -142,6 +142,7 @@ def add_to_user_database(self, executable, res_filename, url=None): f.write(RESOURCE_USER_LIST_COMMENT) f.write('\n') f.write(safe_dump(user_database)) + self.load_resource_list(self.user_list) return resdict def find_resources(self, executable=None, name=None, url=None, database=None): @@ -182,8 +183,9 @@ def resource_dir_to_location(self, resource_path): def parameter_usage(self, name, usage='as-is'): if usage == 'as-is': return name - if usage == 'without-extension': + elif usage == 'without-extension': return Path(name).stem + raise ValueError("No such usage '%s'" % usage) def _download_impl(self, url, filename, progress_cb=None, size=None): log = getLogger('ocrd.resource_manager._download_impl') diff --git a/tests/test_resource_manager.py b/tests/test_resource_manager.py index f0040b50ab..832028c8fd 100644 --- a/tests/test_resource_manager.py +++ b/tests/test_resource_manager.py @@ -25,6 +25,7 @@ def test_resources_manager_config_default(): assert mgr.add_to_user_database('ocrd-foo', f) mgr.list_installed() proc = 'ocrd-anybaseocr-layout-analysis' + # TODO mock request fpath = mgr.download(proc, CONST_RESOURCE_URL_LAYOUT, mgr.location_to_resource_dir('data')) assert fpath.exists() assert mgr.add_to_user_database(proc, fpath) @@ -79,6 +80,32 @@ def test_resources_manager_config_explicit_invalid(tmp_path): with raises(ValueError, match='is invalid'): OcrdResourceManager(xdg_config_home=tmp_path) +def test_find_resources(tmp_path): + + # act + f = tmp_path / 'ocrd-foo' / 'foo.bar' + f.parent.mkdir() + f.write_text('foobar') + mgr = OcrdResourceManager(xdg_config_home=tmp_path) + + # assert + assert mgr.find_resources(executable='ocrd-foo') == [] + assert mgr.add_to_user_database('ocrd-foo', f, url='http://foo/bar') + assert 'ocrd-foo' in [x for x, _ in mgr.find_resources()] + assert 'ocrd-foo' in [x for x, _ in mgr.find_resources(url='http://foo/bar')] + +def test_parameter_usage(tmp_path): + mgr = OcrdResourceManager(xdg_config_home=tmp_path) + assert mgr.parameter_usage('foo.bar') == 'foo.bar' + assert mgr.parameter_usage('foo.bar', 'without-extension') == 'foo' + with raises(ValueError, match='No such usage'): + mgr.parameter_usage('foo.bar', 'baz') + +def test_default_resource_dir(tmp_path): + mgr = OcrdResourceManager(xdg_data_home=tmp_path) + assert mgr.xdg_config_home != mgr.xdg_data_home + assert mgr.default_resource_dir == str(mgr.xdg_data_home / 'ocrd-resources') + if __name__ == "__main__": main(__file__)