Revision 456ad6c0
Added by koszko over 1 year ago
setup.cfg | ||
---|---|---|
34 | 34 |
include_package_data=True |
35 | 35 |
install_requires = |
36 | 36 |
click |
37 |
jsonschema |
|
37 | 38 |
importlib; python_version == "2.6" |
38 | 39 |
# reuse is optional: |
39 | 40 |
# reuse |
src/hydrilla/builder/build.py | ||
---|---|---|
35 | 35 |
|
36 | 36 |
from .. import util |
37 | 37 |
|
38 |
index_json_schema = util.load_schema('package_source-1.schema.json')
|
|
38 |
index_validator = util.validator_for('package_source-1.schema.json')
|
|
39 | 39 |
|
40 | 40 |
class FileReferenceError(Exception): |
41 | 41 |
""" |
... | ... | |
275 | 275 |
|
276 | 276 |
item_list.append(new_item_obj) |
277 | 277 |
|
278 |
return dict([(prop, new_item_obj[prop])
|
|
279 |
for prop in ('type', 'identifier', 'version')])
|
|
278 |
props_in_ref = ('type', 'identifier', 'version', 'long_name')
|
|
279 |
return dict([(prop, new_item_obj[prop]) for prop in props_in_ref])
|
|
280 | 280 |
|
281 | 281 |
def _process_index_json(self, index_obj: dict): |
282 | 282 |
""" |
... | ... | |
285 | 285 |
files and computed definitions of the source package and items defined |
286 | 286 |
in it. |
287 | 287 |
""" |
288 |
jsonschema.validate(index_obj, index_json_schema)
|
|
288 |
index_validator.validate(index_obj)
|
|
289 | 289 |
|
290 | 290 |
self.source_name = index_obj['source_name'] |
291 | 291 |
|
src/hydrilla/schemas | ||
---|---|---|
1 |
Subproject commit ca1de2ed4a69a71f2f75552ade693d04ea1baa85 |
|
1 |
Subproject commit c72c8438875d20b156d22d975523a19bbb407d95 |
src/hydrilla/util/__init__.py | ||
---|---|---|
5 | 5 |
# Available under the terms of Creative Commons Zero v1.0 Universal. |
6 | 6 |
|
7 | 7 |
from ._util import strip_json_comments, normalize_version, parse_version, \ |
8 |
version_string, load_schema |
|
8 |
version_string, validator_for |
src/hydrilla/util/_util.py | ||
---|---|---|
30 | 30 |
from pathlib import Path |
31 | 31 |
from typing import Optional |
32 | 32 |
|
33 |
from jsonschema import RefResolver, Draft7Validator |
|
34 |
|
|
33 | 35 |
here = Path(__file__).resolve().parent |
34 | 36 |
|
35 | 37 |
_strip_comment_re = re.compile(r''' |
... | ... | |
103 | 105 |
""" |
104 | 106 |
return '.'.join([str(n) for n in ver]) + ('' if rev is None else f'-{rev}') |
105 | 107 |
|
106 |
def load_schema(schema_filename: str) -> dict: |
|
107 |
"""Find schema JSON file in '../schemas' and json.load() it.""" |
|
108 |
with open(here.parent / 'schemas' / schema_filename, 'rt') as file_handle: |
|
109 |
return json.load(file_handle) |
|
108 |
schemas = {} |
|
109 |
for path in (here.parent / 'schemas').glob('*-1.schema.json'): |
|
110 |
schema = json.loads(path.read_text()) |
|
111 |
schemas[schema['$id']] = schema |
|
112 |
|
|
113 |
common_schema_filename = 'common_definitions-1.schema.json' |
|
114 |
common_schema_path = here.parent / "schemas" / common_schema_filename |
|
115 |
|
|
116 |
resolver = RefResolver( |
|
117 |
base_uri=f'file://{str(common_schema_path)}', |
|
118 |
referrer=f'https://hydrilla.koszko.org/{common_schema_filename}', |
|
119 |
store=schemas |
|
120 |
) |
|
121 |
|
|
122 |
def validator_for(schema_filename: str) -> Draft7Validator: |
|
123 |
""" |
|
124 |
Prepare a validator for one of the schemas in '../schemas'. |
|
125 |
|
|
126 |
This function is not thread-safe. |
|
127 |
""" |
|
128 |
return Draft7Validator(resolver.resolve(schema_filename)[1], |
|
129 |
resolver=resolver) |
src/test/test_hydrilla_builder.py | ||
---|---|---|
148 | 148 |
'definitions': [{ |
149 | 149 |
'type': 'resource', |
150 | 150 |
'identifier': 'helloapple', |
151 |
'long_name': 'Hello Apple', |
|
151 | 152 |
'version': [2021, 11, 10], |
152 | 153 |
}, { |
153 | 154 |
'type': 'resource', |
154 | 155 |
'identifier': 'hello-message', |
156 |
'long_name': 'Hello Message', |
|
155 | 157 |
'version': [2021, 11, 10], |
156 | 158 |
}, { |
157 | 159 |
'type': 'mapping', |
158 | 160 |
'identifier': 'helloapple', |
161 |
'long_name': 'Hello Apple', |
|
159 | 162 |
'version': [2021, 11, 10], |
160 | 163 |
}] |
161 | 164 |
} |
... | ... | |
346 | 349 |
with open(subdir / '2021.11.10', 'rt') as file_handle: |
347 | 350 |
assert json.load(file_handle) == resource_json |
348 | 351 |
|
352 |
hydrilla_util.validator_for('api_resource_description-1.schema.json')\ |
|
353 |
.validate(resource_json) |
|
354 |
|
|
349 | 355 |
# Verify files under 'mapping/' |
350 | 356 |
mapping_dir = dstdir / 'mapping' |
351 | 357 |
assert ['helloapple'] == [path.name for path in mapping_dir.iterdir()] |
... | ... | |
356 | 362 |
with open(subdir / '2021.11.10', 'rt') as file_handle: |
357 | 363 |
assert json.load(file_handle) == settings.expected_mapping |
358 | 364 |
|
365 |
hydrilla_util.validator_for('api_mapping_description-1.schema.json')\ |
|
366 |
.validate(settings.expected_mapping) |
|
367 |
|
|
359 | 368 |
# Verify files under 'source/' |
360 | 369 |
source_dir = dstdir / 'source' |
361 | 370 |
assert {'hello.json', 'hello.zip'} == \ |
... | ... | |
377 | 386 |
with open(source_dir / 'hello.json', 'rt') as file_handle: |
378 | 387 |
assert json.load(file_handle) == settings.expected_source_description |
379 | 388 |
|
389 |
hydrilla_util.validator_for('api_source_description-1.schema.json')\ |
|
390 |
.validate(settings.expected_source_description) |
|
391 |
|
|
380 | 392 |
def modify_index_missing_file(dummy: CaseSettings, obj: dict) -> None: |
381 | 393 |
""" |
382 | 394 |
Modify index.json to expect missing report.spdx file and cause an error. |
Also available in: Unified diff
include new schemas in package and in tests