1919__all__ = ['JsonValidator' , 'JsonStrictValidator' ]
2020
2121from abc import ABC
22+ from collections .abc import Iterable
23+ from itertools import chain
2224from json import loads as json_loads
23- from typing import TYPE_CHECKING , Any , Literal , Optional
25+ from typing import TYPE_CHECKING , Any , Literal , Optional , Union , overload
2426
2527from ..schema import OutputFormat
2628
3335
3436_missing_deps_error : Optional [tuple [MissingOptionalDependencyException , ImportError ]] = None
3537try :
36- from jsonschema .exceptions import ValidationError as JsonValidationError # type:ignore[import-untyped]
3738 from jsonschema .validators import Draft7Validator # type:ignore[import-untyped]
3839 from referencing import Registry
3940 from referencing .jsonschema import DRAFT7
@@ -56,24 +57,46 @@ def __init__(self, schema_version: 'SchemaVersion') -> None:
5657 # this is the def that is used for generating the documentation
5758 super ().__init__ (schema_version )
5859
60+ # region typing-relevant copy from parent class - needed for mypy and doc tools
61+
62+ @overload
63+ def validate_str (self , data : str , * , all_errors : Literal [False ] = ...) -> Optional [ValidationError ]:
64+ ... # pragma: no cover
65+
66+ @overload
67+ def validate_str (self , data : str , * , all_errors : Literal [True ]) -> Optional [Iterable [ValidationError ]]:
68+ ... # pragma: no cover
69+
70+ def validate_str (
71+ self , data : str , * , all_errors : bool = False
72+ ) -> Union [None , ValidationError , Iterable [ValidationError ]]:
73+ ... # pragma: no cover
74+
75+ # endregion
76+
5977 if _missing_deps_error : # noqa:C901
6078 __MDERROR = _missing_deps_error
6179
62- def validate_str (self , data : str ) -> Optional [ValidationError ]:
80+ def validate_str ( # type:ignore[no-redef] # noqa:F811 # typing-relevant headers go first
81+ self , data : str , * , all_errors : bool = False
82+ ) -> Union [None , ValidationError , Iterable [ValidationError ]]:
6383 raise self .__MDERROR [0 ] from self .__MDERROR [1 ]
6484
6585 else :
66- def validate_str (self , data : str ) -> Optional [ValidationError ]:
67- return self ._validata_data (
68- json_loads (data ))
6986
70- def _validata_data (self , data : Any ) -> Optional [ValidationError ]:
87+ def validate_str ( # type:ignore[no-redef] # noqa:F811 # typing-relevant headers go first
88+ self , data : str , * , all_errors : bool = False
89+ ) -> Union [None , ValidationError , Iterable [ValidationError ]]:
7190 validator = self ._validator # may throw on error that MUST NOT be caught
72- try :
73- validator .validate (data )
74- except JsonValidationError as error :
75- return ValidationError (error )
76- return None
91+ structure = json_loads (data )
92+ errors = validator .iter_errors (structure )
93+ first_error = next (errors , None )
94+ if first_error is None :
95+ return None
96+ first_error = ValidationError (first_error )
97+ return chain ((first_error ,), map (ValidationError , errors )) \
98+ if all_errors \
99+ else first_error
77100
78101 __validator : Optional ['JsonSchemaValidator' ] = None
79102
0 commit comments