|
29 | 29 | # (and writing a few steps by hand is a DoS attack on the AST walker in Pytest)
|
30 | 30 | JSONType = Union[None, bool, float, str, list, Dict[str, Any]]
|
31 | 31 | Schema = Dict[str, JSONType]
|
| 32 | +JSONSchemaValidator = Union[ |
| 33 | + jsonschema.validators.Draft4Validator, |
| 34 | + jsonschema.validators.Draft6Validator, |
| 35 | + jsonschema.validators.Draft7Validator, |
| 36 | +] |
32 | 37 |
|
33 | 38 | # Canonical type strings, in order.
|
34 | 39 | TYPE_STRINGS = ("null", "boolean", "integer", "number", "string", "array", "object")
|
@@ -66,16 +71,19 @@ def next_down(val: float) -> float:
|
66 | 71 | return out
|
67 | 72 |
|
68 | 73 |
|
69 |
| -def make_validator( |
70 |
| - schema: Schema, |
71 |
| -) -> Union[ |
72 |
| - jsonschema.validators.Draft3Validator, |
73 |
| - jsonschema.validators.Draft4Validator, |
74 |
| - jsonschema.validators.Draft6Validator, |
75 |
| - jsonschema.validators.Draft7Validator, |
76 |
| -]: |
77 |
| - validator_cls = jsonschema.validators.validator_for(schema) |
78 |
| - return validator_cls(schema) |
| 74 | +def _get_validator_class(schema: Schema) -> JSONSchemaValidator: |
| 75 | + try: |
| 76 | + validator = jsonschema.validators.validator_for(schema) |
| 77 | + validator.check_schema(schema) |
| 78 | + except jsonschema.exceptions.SchemaError: |
| 79 | + validator = jsonschema.Draft4Validator |
| 80 | + validator.check_schema(schema) |
| 81 | + return validator |
| 82 | + |
| 83 | + |
| 84 | +def make_validator(schema: Schema) -> JSONSchemaValidator: |
| 85 | + validator = _get_validator_class(schema) |
| 86 | + return validator(schema) |
79 | 87 |
|
80 | 88 |
|
81 | 89 | class CanonicalisingJsonEncoder(json.JSONEncoder):
|
@@ -888,7 +896,7 @@ def merged(schemas: List[Any]) -> Optional[Schema]:
|
888 | 896 | if out == FALSEY:
|
889 | 897 | return FALSEY
|
890 | 898 | assert isinstance(out, dict)
|
891 |
| - jsonschema.validators.validator_for(out).check_schema(out) |
| 899 | + _get_validator_class(out) |
892 | 900 | return out
|
893 | 901 |
|
894 | 902 |
|
|
0 commit comments