diff --git a/dnadna/utils/jsonschema.py b/dnadna/utils/jsonschema.py index 40a6a206495e192f3076a7590436a55aea4f9ea9..43c7d44469ded8adad1aa072bac813319428ac04 100644 --- a/dnadna/utils/jsonschema.py +++ b/dnadna/utils/jsonschema.py @@ -265,52 +265,97 @@ def make_config_validator(validator_cls=jsonschema.Draft7Validator, # ``validator_cls`` (`jsonschema.Draft7Validator` by default) # This is to work around the issue in # https://github.com/python-jsonschema/jsonschema/issues/1197 - validator_cls = jsonschema.validators.create( - meta_schema=make_config_meta_schema(validator_cls.META_SCHEMA), - validators={ - "$dynamicRef": _keywords.dynamicRef, - "$ref": _keywords.ref, - "additionalProperties": _keywords.additionalProperties, - "allOf": _keywords.allOf, - "anyOf": _keywords.anyOf, - "const": _keywords.const, - "contains": _keywords.contains, - "dependentRequired": _keywords.dependentRequired, - "dependentSchemas": _keywords.dependentSchemas, - "enum": _keywords.enum, - "exclusiveMaximum": _keywords.exclusiveMaximum, - "exclusiveMinimum": _keywords.exclusiveMinimum, - "format": _keywords.format, - "if": _keywords.if_, - "items": _keywords.items, - "maxItems": _keywords.maxItems, - "maxLength": _keywords.maxLength, - "maxProperties": _keywords.maxProperties, - "maximum": _keywords.maximum, - "minItems": _keywords.minItems, - "minLength": _keywords.minLength, - "minProperties": _keywords.minProperties, - "minimum": _keywords.minimum, - "multipleOf": _keywords.multipleOf, - "not": _keywords.not_, - "oneOf": _keywords.oneOf, - "pattern": _keywords.pattern, - "patternProperties": _keywords.patternProperties, - "prefixItems": _keywords.prefixItems, - "properties": validate_config_properties, - "propertyNames": _keywords.propertyNames, - "required": _keywords.required, - "type": _keywords.type, - "unevaluatedItems": _keywords.unevaluatedItems, - "unevaluatedProperties": _keywords.unevaluatedProperties, - "uniqueItems": _keywords.uniqueItems, - }, - type_checker=type_checker, - format_checker=format_checker, - version="draft7", - id_of=referencing.jsonschema.DRAFT7.id_of, - applicable_validators=_legacy_keywords.ignore_ref_siblings, - ) + if validator_cls.__name__ == 'Draft7Validator': + validator_cls = jsonschema.validators.create( + meta_schema=make_config_meta_schema(validator_cls.META_SCHEMA), + validators={ + "$dynamicRef": _keywords.dynamicRef, + "$ref": _keywords.ref, + "additionalProperties": _keywords.additionalProperties, + "allOf": _keywords.allOf, + "anyOf": _keywords.anyOf, + "const": _keywords.const, + "contains": _keywords.contains, + "dependentRequired": _keywords.dependentRequired, + "dependentSchemas": _keywords.dependentSchemas, + "enum": _keywords.enum, + "exclusiveMaximum": _keywords.exclusiveMaximum, + "exclusiveMinimum": _keywords.exclusiveMinimum, + "format": _keywords.format, + "if": _keywords.if_, + "items": _keywords.items, + "maxItems": _keywords.maxItems, + "maxLength": _keywords.maxLength, + "maxProperties": _keywords.maxProperties, + "maximum": _keywords.maximum, + "minItems": _keywords.minItems, + "minLength": _keywords.minLength, + "minProperties": _keywords.minProperties, + "minimum": _keywords.minimum, + "multipleOf": _keywords.multipleOf, + "not": _keywords.not_, + "oneOf": _keywords.oneOf, + "pattern": _keywords.pattern, + "patternProperties": _keywords.patternProperties, + "prefixItems": _keywords.prefixItems, + "properties": validate_config_properties, + "propertyNames": _keywords.propertyNames, + "required": _keywords.required, + "type": _keywords.type, + "unevaluatedItems": _keywords.unevaluatedItems, + "unevaluatedProperties": _keywords.unevaluatedProperties, + "uniqueItems": _keywords.uniqueItems, + }, + type_checker=type_checker, + format_checker=format_checker, + version="draft7", + id_of=referencing.jsonschema.DRAFT7.id_of, + applicable_validators=_legacy_keywords.ignore_ref_siblings, + ) + elif validator_cls.__name__ == 'Draft6Validator': + validator_cls = jsonschema.validators.create( + meta_schema=make_config_meta_schema(validator_cls.META_SCHEMA), + validators={ + "$ref": _keywords.ref, + "additionalItems": _legacy_keywords.additionalItems, + "additionalProperties": _keywords.additionalProperties, + "allOf": _keywords.allOf, + "anyOf": _keywords.anyOf, + "const": _keywords.const, + "contains": _legacy_keywords.contains_draft6_draft7, + "dependencies": _legacy_keywords.dependencies_draft4_draft6_draft7, + "enum": _keywords.enum, + "exclusiveMaximum": _keywords.exclusiveMaximum, + "exclusiveMinimum": _keywords.exclusiveMinimum, + "format": _keywords.format, + "items": _legacy_keywords.items_draft6_draft7_draft201909, + "maxItems": _keywords.maxItems, + "maxLength": _keywords.maxLength, + "maxProperties": _keywords.maxProperties, + "maximum": _keywords.maximum, + "minItems": _keywords.minItems, + "minLength": _keywords.minLength, + "minProperties": _keywords.minProperties, + "minimum": _keywords.minimum, + "multipleOf": _keywords.multipleOf, + "not": _keywords.not_, + "oneOf": _keywords.oneOf, + "pattern": _keywords.pattern, + "patternProperties": _keywords.patternProperties, + "properties": validate_config_properties, + "propertyNames": _keywords.propertyNames, + "required": _keywords.required, + "type": _keywords.type, + "uniqueItems": _keywords.uniqueItems, + }, + type_checker=type_checker, + format_checker=format_checker, + version="draft6", + id_of=referencing.jsonschema.DRAFT6.id_of, + applicable_validators=_legacy_keywords.ignore_ref_siblings, + ) + else: + raise ValueError("Only supported Draft-06 (minimum) or Draft-07 JSON Schemas") return validator_cls diff --git a/tests/test_schemas.py b/tests/test_schemas.py index 26327ca26b4f9bde08ebabc1b39c2f6a7f22dd7d..abaff8a532efd353b4c2d92a024e00365c297bb2 100644 --- a/tests/test_schemas.py +++ b/tests/test_schemas.py @@ -15,7 +15,7 @@ from dnadna.examples.one_event import DEFAULT_ONE_EVENT_CONFIG from dnadna.nets import Network from dnadna.utils.config import ConfigError, Config, load_dict from dnadna.utils.jsonschema import (make_config_meta_schema, SCHEMA_DIRS, - SCHEMA_SUPPORTED_VERSIONS) + SCHEMA_SUPPORTED_VERSIONS, make_config_validator) from dnadna.utils.plugins import Pluggable from dnadna.utils.misc import parse_format @@ -75,16 +75,14 @@ def test_schemas_valid(schema, validator): # extend the validator to also check our extended meta-schema with support # for errorMsg - class TestValidator(validator): - META_SCHEMA = make_config_meta_schema(validator.META_SCHEMA) - - def __init__(self, *args, **kwargs): - # We have to extend __init__ because the default implementation - # of validator.check_schema doesn't allow passing a - # format_checker - super().__init__(*args, **kwargs) - self.format_checker = format_checker - + TestValidator = jsonschema.validators.create( + meta_schema=make_config_meta_schema(validator.META_SCHEMA), + validators=validator.VALIDATORS, + type_checker=validator.TYPE_CHECKER, + format_checker=format_checker, + version=validator.__name__[:6] + ) + # NOTE: We leave the full directory name out of the 'schema' parameter for # cleaner output when running `pytest -v`; instead join the filename with # the SCHEMA_DIR here.