ocrd 3.2.0__tar.gz → 3.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ocrd-3.2.0/src/ocrd.egg-info → ocrd-3.3.0}/PKG-INFO +2 -2
- ocrd-3.3.0/VERSION +1 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/requirements.txt +1 -1
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/cli/network.py +0 -2
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/cli/resmgr.py +61 -24
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/processor/base.py +15 -5
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/resource_manager.py +116 -199
- {ocrd-3.2.0 → ocrd-3.3.0/src/ocrd.egg-info}/PKG-INFO +2 -2
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd.egg-info/SOURCES.txt +0 -2
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd.egg-info/requires.txt +1 -1
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/__init__.py +0 -1
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/cli/__init__.py +1 -3
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/constants.py +0 -3
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/logging_utils.py +0 -5
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/runtime_data/hosts.py +56 -47
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/runtime_data/network_agents.py +3 -26
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_utils/__init__.py +0 -2
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_utils/constants.py +0 -5
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_utils/os.py +52 -130
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_validators/ocrd_tool.schema.yml +4 -7
- {ocrd-3.2.0 → ocrd-3.3.0}/tests/test_resource_manager.py +13 -32
- ocrd-3.2.0/VERSION +0 -1
- ocrd-3.2.0/src/ocrd_network/cli/resmgr_server.py +0 -23
- ocrd-3.2.0/src/ocrd_network/resource_manager_server.py +0 -178
- {ocrd-3.2.0 → ocrd-3.3.0}/LICENSE +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/MANIFEST.in +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/README.md +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/README_bashlib.md +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/README_ocrd.md +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/README_ocrd_modelfactory.md +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/README_ocrd_models.md +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/README_ocrd_network.md +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/README_ocrd_utils.md +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/README_ocrd_validators.md +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/pyproject.toml +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/setup.cfg +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/__init__.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/cli/__init__.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/cli/bashlib.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/cli/log.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/cli/ocrd_tool.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/cli/process.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/cli/validate.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/cli/workspace.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/cli/zip.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/constants.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/decorators/__init__.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/decorators/loglevel_option.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/decorators/mets_find_options.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/decorators/ocrd_cli_options.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/decorators/parameter_option.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/lib.bash +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/mets_server.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/ocrd-all-tool.json +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/processor/__init__.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/processor/builtin/__init__.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/processor/builtin/dummy/__init__.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/processor/builtin/dummy/ocrd-tool.json +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/processor/builtin/dummy_processor.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/processor/builtin/filter_processor.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/processor/helpers.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/processor/ocrd_page_result.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/resolver.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/resource_list.yml +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/task_sequence.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/workspace.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/workspace_backup.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd/workspace_bagger.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd.egg-info/dependency_links.txt +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd.egg-info/entry_points.txt +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd.egg-info/top_level.txt +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_modelfactory/__init__.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_models/__init__.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_models/constants.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_models/mets-empty.xml +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_models/ocrd_agent.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_models/ocrd_exif.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_models/ocrd_file.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_models/ocrd_mets.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_models/ocrd_page.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_models/ocrd_page_generateds.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_models/ocrd_xml_base.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_models/report.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_models/utils.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_models/xpath_functions.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/cli/client.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/cli/processing_server.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/cli/processing_worker.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/cli/processor_server.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/client.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/client_utils.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/database.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/models/__init__.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/models/job.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/models/messages.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/models/ocrd_tool.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/models/workflow.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/models/workspace.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/param_validators.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/process_helpers.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/processing_server.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/processing_worker.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/processor_server.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/rabbitmq_utils/__init__.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/rabbitmq_utils/connector.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/rabbitmq_utils/constants.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/rabbitmq_utils/consumer.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/rabbitmq_utils/helpers.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/rabbitmq_utils/ocrd_messages.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/rabbitmq_utils/publisher.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/runtime_data/__init__.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/runtime_data/config_parser.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/runtime_data/connection_clients.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/runtime_data/deployer.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/runtime_data/network_services.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/server_cache.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/server_utils.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/tcp_to_uds_mets_proxy.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_network/utils.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_utils/config.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_utils/deprecate.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_utils/image.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_utils/introspect.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_utils/logging.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_utils/ocrd_logging.conf +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_utils/str.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_validators/__init__.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_validators/bagit-profile.yml +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_validators/constants.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_validators/json_validator.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_validators/message_processing.schema.yml +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_validators/message_result.schema.yml +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_validators/mets.xsd +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_validators/ocrd_network_message_validator.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_validators/ocrd_tool_validator.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_validators/ocrd_zip_validator.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_validators/page.xsd +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_validators/page_validator.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_validators/parameter_validator.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_validators/processing_server_config.schema.yml +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_validators/processing_server_config_validator.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_validators/resource_list_validator.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_validators/workspace_validator.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_validators/xlink.xsd +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_validators/xsd_mets_validator.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_validators/xsd_page_validator.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/src/ocrd_validators/xsd_validator.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/tests/test_decorators.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/tests/test_logging.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/tests/test_logging_conf.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/tests/test_mets_server.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/tests/test_model_factory.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/tests/test_resolver.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/tests/test_resolver_oai.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/tests/test_task_sequence.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/tests/test_utils.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/tests/test_version.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/tests/test_workspace.py +0 -0
- {ocrd-3.2.0 → ocrd-3.3.0}/tests/test_workspace_remove.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: ocrd
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.3.0
|
|
4
4
|
Summary: OCR-D framework
|
|
5
5
|
Author-email: Konstantin Baierer <unixprog@gmail.com>
|
|
6
6
|
License: Apache License 2.0
|
|
@@ -16,7 +16,7 @@ Requires-Dist: beanie~=1.7
|
|
|
16
16
|
Requires-Dist: click>=7
|
|
17
17
|
Requires-Dist: cryptography<43.0.0
|
|
18
18
|
Requires-Dist: Deprecated==1.2.0
|
|
19
|
-
Requires-Dist: docker
|
|
19
|
+
Requires-Dist: docker
|
|
20
20
|
Requires-Dist: elementpath
|
|
21
21
|
Requires-Dist: fastapi>=0.78.0
|
|
22
22
|
Requires-Dist: filetype
|
ocrd-3.3.0/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.3.0
|
|
@@ -13,7 +13,6 @@ from ocrd_network.cli import (
|
|
|
13
13
|
processing_server_cli,
|
|
14
14
|
processing_worker_cli,
|
|
15
15
|
processor_server_cli,
|
|
16
|
-
resource_manager_server_cli
|
|
17
16
|
)
|
|
18
17
|
|
|
19
18
|
|
|
@@ -29,4 +28,3 @@ network_cli.add_command(client_cli)
|
|
|
29
28
|
network_cli.add_command(processing_server_cli)
|
|
30
29
|
network_cli.add_command(processing_worker_cli)
|
|
31
30
|
network_cli.add_command(processor_server_cli)
|
|
32
|
-
network_cli.add_command(resource_manager_server_cli)
|
|
@@ -18,9 +18,9 @@ from ocrd_utils import (
|
|
|
18
18
|
getLogger,
|
|
19
19
|
get_moduledir,
|
|
20
20
|
get_ocrd_tool_json,
|
|
21
|
+
resource_filename,
|
|
21
22
|
initLogging,
|
|
22
23
|
RESOURCE_LOCATIONS,
|
|
23
|
-
RESOURCE_TYPES
|
|
24
24
|
)
|
|
25
25
|
from ocrd.constants import RESOURCE_USER_LIST_COMMENT
|
|
26
26
|
|
|
@@ -72,13 +72,13 @@ def list_installed(executable=None):
|
|
|
72
72
|
@click.option('-n', '--any-url', default='', help='URL of unregistered resource to download/copy from')
|
|
73
73
|
@click.option('-D', '--no-dynamic', default=False, is_flag=True,
|
|
74
74
|
help="Whether to skip looking into each processor's --dump-{json,module-dir} for module-level resources")
|
|
75
|
-
@click.option('-t', '--resource-type', type=click.Choice(
|
|
75
|
+
@click.option('-t', '--resource-type', type=click.Choice(['file', 'directory', 'archive']), default='file',
|
|
76
76
|
help='Type of resource',)
|
|
77
77
|
@click.option('-P', '--path-in-archive', default='.', help='Path to extract in case of archive type')
|
|
78
78
|
@click.option('-a', '--allow-uninstalled', is_flag=True,
|
|
79
79
|
help="Allow installing resources for uninstalled processors",)
|
|
80
80
|
@click.option('-o', '--overwrite', help='Overwrite existing resources', is_flag=True)
|
|
81
|
-
@click.option('-l', '--location', type=click.Choice(RESOURCE_LOCATIONS),
|
|
81
|
+
@click.option('-l', '--location', type=click.Choice(RESOURCE_LOCATIONS),
|
|
82
82
|
help="Where to store resources - defaults to first location in processor's 'resource_locations' "
|
|
83
83
|
"list or finally 'data'")
|
|
84
84
|
@click.argument('executable', required=True)
|
|
@@ -107,6 +107,8 @@ def download(any_url, no_dynamic, resource_type, path_in_archive, allow_uninstal
|
|
|
107
107
|
executable = None
|
|
108
108
|
if name == '*':
|
|
109
109
|
name = None
|
|
110
|
+
is_url = (any_url.startswith('https://') or any_url.startswith('http://')) if any_url else False
|
|
111
|
+
is_filename = Path(any_url).exists() if any_url else False
|
|
110
112
|
if executable and not which(executable):
|
|
111
113
|
if not allow_uninstalled:
|
|
112
114
|
log.error(f"Executable '{executable}' is not installed. "
|
|
@@ -125,30 +127,65 @@ def download(any_url, no_dynamic, resource_type, path_in_archive, allow_uninstal
|
|
|
125
127
|
'path_in_archive': path_in_archive}]
|
|
126
128
|
)]
|
|
127
129
|
for this_executable, this_reslist in reslist:
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
130
|
+
for resdict in this_reslist:
|
|
131
|
+
if 'size' in resdict:
|
|
132
|
+
registered = "registered"
|
|
133
|
+
else:
|
|
134
|
+
registered = "unregistered"
|
|
135
|
+
if any_url:
|
|
136
|
+
resdict['url'] = any_url
|
|
137
|
+
if resdict['url'] == '???':
|
|
138
|
+
log.warning(f"Cannot download user resource {resdict['name']}")
|
|
139
|
+
continue
|
|
140
|
+
if resdict['url'].startswith('https://') or resdict['url'].startswith('http://'):
|
|
141
|
+
log.info(f"Downloading {registered} resource '{resdict['name']}' ({resdict['url']})")
|
|
142
|
+
if 'size' not in resdict:
|
|
143
|
+
with requests.head(resdict['url']) as r:
|
|
144
|
+
resdict['size'] = int(r.headers.get('content-length', 0))
|
|
145
|
+
else:
|
|
146
|
+
log.info(f"Copying {registered} resource '{resdict['name']}' ({resdict['url']})")
|
|
147
|
+
urlpath = Path(resdict['url'])
|
|
148
|
+
resdict['url'] = str(urlpath.resolve())
|
|
149
|
+
if Path(urlpath).is_dir():
|
|
150
|
+
resdict['size'] = directory_size(urlpath)
|
|
151
|
+
else:
|
|
152
|
+
resdict['size'] = urlpath.stat().st_size
|
|
153
|
+
if not location:
|
|
154
|
+
location = get_ocrd_tool_json(this_executable)['resource_locations'][0]
|
|
155
|
+
elif location not in get_ocrd_tool_json(this_executable)['resource_locations']:
|
|
156
|
+
log.error(f"The selected --location {location} is not in the {this_executable}'s resource search path, "
|
|
157
|
+
f"refusing to install to invalid location")
|
|
158
|
+
sys.exit(1)
|
|
159
|
+
if location != 'module':
|
|
160
|
+
basedir = resmgr.location_to_resource_dir(location)
|
|
161
|
+
else:
|
|
162
|
+
basedir = get_moduledir(this_executable)
|
|
163
|
+
if not basedir:
|
|
164
|
+
basedir = resmgr.location_to_resource_dir('data')
|
|
165
|
+
|
|
136
166
|
try:
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
167
|
+
with click.progressbar(length=resdict['size']) as bar:
|
|
168
|
+
fpath = resmgr.download(
|
|
169
|
+
this_executable,
|
|
170
|
+
resdict['url'],
|
|
171
|
+
basedir,
|
|
172
|
+
name=resdict['name'],
|
|
173
|
+
resource_type=resdict.get('type', resource_type),
|
|
174
|
+
path_in_archive=resdict.get('path_in_archive', path_in_archive),
|
|
175
|
+
overwrite=overwrite,
|
|
176
|
+
no_subdir=location in ['cwd', 'module'],
|
|
177
|
+
progress_cb=lambda delta: bar.update(delta)
|
|
178
|
+
)
|
|
179
|
+
if registered == 'unregistered':
|
|
180
|
+
log.info(f"{this_executable} resource '{name}' ({any_url}) not a known resource, creating stub "
|
|
181
|
+
f"in {resmgr.user_list}'")
|
|
182
|
+
resmgr.add_to_user_database(this_executable, fpath, url=any_url)
|
|
183
|
+
resmgr.save_user_list()
|
|
184
|
+
log.info(f"Installed resource {resdict['url']} under {fpath}")
|
|
148
185
|
except FileExistsError as exc:
|
|
149
186
|
log.info(str(exc))
|
|
150
|
-
|
|
151
|
-
|
|
187
|
+
log.info(f"Use in parameters as "
|
|
188
|
+
f"'{resmgr.parameter_usage(resdict['name'], usage=resdict.get('parameter_usage', 'as-is'))}'")
|
|
152
189
|
|
|
153
190
|
|
|
154
191
|
@resmgr_cli.command('migrate')
|
|
@@ -43,14 +43,15 @@ from .ocrd_page_result import OcrdPageResult
|
|
|
43
43
|
from ocrd_utils import (
|
|
44
44
|
VERSION as OCRD_VERSION,
|
|
45
45
|
MIMETYPE_PAGE,
|
|
46
|
+
MIME_TO_EXT,
|
|
46
47
|
config,
|
|
47
48
|
getLogger,
|
|
48
49
|
list_resource_candidates,
|
|
50
|
+
pushd_popd,
|
|
49
51
|
list_all_resources,
|
|
50
52
|
get_processor_resource_types,
|
|
51
53
|
resource_filename,
|
|
52
54
|
parse_json_file_with_comments,
|
|
53
|
-
pushd_popd,
|
|
54
55
|
make_file_id,
|
|
55
56
|
deprecation_warning
|
|
56
57
|
)
|
|
@@ -904,8 +905,9 @@ class Processor():
|
|
|
904
905
|
cwd = self.old_pwd
|
|
905
906
|
else:
|
|
906
907
|
cwd = getcwd()
|
|
907
|
-
ret =
|
|
908
|
-
|
|
908
|
+
ret = [cand for cand in list_resource_candidates(executable, val,
|
|
909
|
+
cwd=cwd, moduled=self.moduledir)
|
|
910
|
+
if exists(cand)]
|
|
909
911
|
if ret:
|
|
910
912
|
self._base_logger.debug("Resolved %s to absolute path %s" % (val, ret[0]))
|
|
911
913
|
return ret[0]
|
|
@@ -936,9 +938,17 @@ class Processor():
|
|
|
936
938
|
"""
|
|
937
939
|
List all resources found in the filesystem and matching content-type by filename suffix
|
|
938
940
|
"""
|
|
939
|
-
|
|
941
|
+
mimetypes = get_processor_resource_types(None, self.ocrd_tool)
|
|
942
|
+
for res in list_all_resources(self.ocrd_tool['executable'], moduled=self.moduledir):
|
|
940
943
|
res = Path(res)
|
|
941
|
-
|
|
944
|
+
if not '*/*' in mimetypes:
|
|
945
|
+
if res.is_dir() and not 'text/directory' in mimetypes:
|
|
946
|
+
continue
|
|
947
|
+
# if we do not know all MIME types, then keep the file, otherwise require suffix match
|
|
948
|
+
if res.is_file() and not any(res.suffix == MIME_TO_EXT.get(mime, res.suffix)
|
|
949
|
+
for mime in mimetypes):
|
|
950
|
+
continue
|
|
951
|
+
yield res
|
|
942
952
|
|
|
943
953
|
@property
|
|
944
954
|
def module(self):
|