aboutsummaryrefslogtreecommitdiff
path: root/src/hydrilla
diff options
context:
space:
mode:
Diffstat (limited to 'src/hydrilla')
-rw-r--r--src/hydrilla/builder/build.py8
m---------src/hydrilla/schemas0
-rw-r--r--src/hydrilla/util/__init__.py2
-rw-r--r--src/hydrilla/util/_util.py28
4 files changed, 29 insertions, 9 deletions
diff --git a/src/hydrilla/builder/build.py b/src/hydrilla/builder/build.py
index dae5579..3503f7a 100644
--- a/src/hydrilla/builder/build.py
+++ b/src/hydrilla/builder/build.py
@@ -35,7 +35,7 @@ import jsonschema
from .. import util
-index_json_schema = util.load_schema('package_source-1.schema.json')
+index_validator = util.validator_for('package_source-1.schema.json')
class FileReferenceError(Exception):
"""
@@ -275,8 +275,8 @@ class Build:
item_list.append(new_item_obj)
- return dict([(prop, new_item_obj[prop])
- for prop in ('type', 'identifier', 'version')])
+ props_in_ref = ('type', 'identifier', 'version', 'long_name')
+ return dict([(prop, new_item_obj[prop]) for prop in props_in_ref])
def _process_index_json(self, index_obj: dict):
"""
@@ -285,7 +285,7 @@ class Build:
files and computed definitions of the source package and items defined
in it.
"""
- jsonschema.validate(index_obj, index_json_schema)
+ index_validator.validate(index_obj)
self.source_name = index_obj['source_name']
diff --git a/src/hydrilla/schemas b/src/hydrilla/schemas
-Subproject ca1de2ed4a69a71f2f75552ade693d04ea1baa8
+Subproject c72c8438875d20b156d22d975523a19bbb407d9
diff --git a/src/hydrilla/util/__init__.py b/src/hydrilla/util/__init__.py
index d435c0a..2a69e0d 100644
--- a/src/hydrilla/util/__init__.py
+++ b/src/hydrilla/util/__init__.py
@@ -5,4 +5,4 @@
# Available under the terms of Creative Commons Zero v1.0 Universal.
from ._util import strip_json_comments, normalize_version, parse_version, \
- version_string, load_schema
+ version_string, validator_for
diff --git a/src/hydrilla/util/_util.py b/src/hydrilla/util/_util.py
index 0ce62f6..9bebdc1 100644
--- a/src/hydrilla/util/_util.py
+++ b/src/hydrilla/util/_util.py
@@ -30,6 +30,8 @@ import json
from pathlib import Path
from typing import Optional
+from jsonschema import RefResolver, Draft7Validator
+
here = Path(__file__).resolve().parent
_strip_comment_re = re.compile(r'''
@@ -103,7 +105,25 @@ def version_string(ver: list[int], rev: Optional[int]=None) -> str:
"""
return '.'.join([str(n) for n in ver]) + ('' if rev is None else f'-{rev}')
-def load_schema(schema_filename: str) -> dict:
- """Find schema JSON file in '../schemas' and json.load() it."""
- with open(here.parent / 'schemas' / schema_filename, 'rt') as file_handle:
- return json.load(file_handle)
+schemas = {}
+for path in (here.parent / 'schemas').glob('*-1.schema.json'):
+ schema = json.loads(path.read_text())
+ schemas[schema['$id']] = schema
+
+common_schema_filename = 'common_definitions-1.schema.json'
+common_schema_path = here.parent / "schemas" / common_schema_filename
+
+resolver = RefResolver(
+ base_uri=f'file://{str(common_schema_path)}',
+ referrer=f'https://hydrilla.koszko.org/{common_schema_filename}',
+ store=schemas
+)
+
+def validator_for(schema_filename: str) -> Draft7Validator:
+ """
+ Prepare a validator for one of the schemas in '../schemas'.
+
+ This function is not thread-safe.
+ """
+ return Draft7Validator(resolver.resolve(schema_filename)[1],
+ resolver=resolver)