Skip to content

Commit 5c7c87c

Browse files
committed
Add FORMAT_CHECKER
1 parent 7b8eccb commit 5c7c87c

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

jsonschema/protocols.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ class Validator(Protocol):
7979
#: :validator:`type` properties in JSON schemas.
8080
TYPE_CHECKER: ClassVar[jsonschema.TypeChecker]
8181

82+
#: A `jsonschema.FormatChecker` that will be used when validating
83+
#: :validator:`format` properties in JSON schemas.
84+
FORMAT_CHECKER: ClassVar[jsonschema.FormatChecker]
85+
8286
#: The schema that was passed in when initializing the object.
8387
schema: dict | bool
8488

jsonschema/validators.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from jsonschema import (
2020
_legacy_validators,
2121
_types,
22+
_format,
2223
_utils,
2324
_validators,
2425
exceptions,
@@ -108,6 +109,7 @@ def create(
108109
validators=(),
109110
version=None,
110111
type_checker=_types.draft7_type_checker,
112+
format_checker=_format.draft7_format_checker,
111113
id_of=_id_of,
112114
applicable_validators=lambda schema: schema.items(),
113115
):
@@ -148,6 +150,13 @@ def create(
148150
If unprovided, a `jsonschema.TypeChecker` will be created
149151
with a set of default types typical of JSON Schema drafts.
150152
153+
format_checker (jsonschema.FormatChecker):
154+
155+
a format checker, used when applying the :validator:`format` validator.
156+
157+
If unprovided, a `jsonschema.FormatChecker` will be created
158+
with a set of default formats typical of JSON Schema drafts.
159+
151160
id_of (collections.abc.Callable):
152161
153162
A function that given a schema, returns its ID.
@@ -162,13 +171,16 @@ def create(
162171
163172
a new `jsonschema.protocols.Validator` class
164173
"""
174+
# rename to not clash with "format_checker" argument of `Validator.__init__()`
175+
fmt_checker = format_checker
165176

166177
@attr.s
167178
class Validator:
168179

169180
VALIDATORS = dict(validators)
170181
META_SCHEMA = dict(meta_schema)
171182
TYPE_CHECKER = type_checker
183+
FORMAT_CHECKER = fmt_checker
172184
ID_OF = staticmethod(id_of)
173185

174186
schema = attr.ib(repr=reprlib.repr)
@@ -283,7 +295,7 @@ def is_valid(self, instance, _schema=None):
283295
return Validator
284296

285297

286-
def extend(validator, validators=(), version=None, type_checker=None):
298+
def extend(validator, validators=(), version=None, type_checker=None, format_checker=None):
287299
"""
288300
Create a new validator class by extending an existing one.
289301
@@ -321,6 +333,13 @@ def extend(validator, validators=(), version=None, type_checker=None):
321333
If unprovided, the type checker of the extended
322334
`jsonschema.protocols.Validator` will be carried along.
323335
336+
format_checker (jsonschema.FormatChecker):
337+
338+
a format checker, used when applying the :validator:`format` validator.
339+
340+
If unprovided, the format checker of the extended
341+
`jsonschema.protocols.Validator` will be carried along.
342+
324343
Returns:
325344
326345
a new `jsonschema.protocols.Validator` class extending the one
@@ -342,11 +361,14 @@ def extend(validator, validators=(), version=None, type_checker=None):
342361

343362
if type_checker is None:
344363
type_checker = validator.TYPE_CHECKER
364+
if format_checker is None:
365+
format_checker = validator.FORMAT_CHECKER
345366
return create(
346367
meta_schema=validator.META_SCHEMA,
347368
validators=all_validators,
348369
version=version,
349370
type_checker=type_checker,
371+
format_checker=format_checker,
350372
id_of=validator.ID_OF,
351373
)
352374

@@ -377,6 +399,7 @@ def extend(validator, validators=(), version=None, type_checker=None):
377399
"uniqueItems": _validators.uniqueItems,
378400
},
379401
type_checker=_types.draft3_type_checker,
402+
format_checker=_format.draft3_format_checker,
380403
version="draft3",
381404
id_of=lambda schema: schema.get("id", ""),
382405
applicable_validators=_legacy_validators.ignore_ref_siblings,
@@ -413,6 +436,7 @@ def extend(validator, validators=(), version=None, type_checker=None):
413436
"uniqueItems": _validators.uniqueItems,
414437
},
415438
type_checker=_types.draft4_type_checker,
439+
format_checker=_format.draft4_format_checker,
416440
version="draft4",
417441
id_of=lambda schema: schema.get("id", ""),
418442
applicable_validators=_legacy_validators.ignore_ref_siblings,
@@ -454,6 +478,7 @@ def extend(validator, validators=(), version=None, type_checker=None):
454478
"uniqueItems": _validators.uniqueItems,
455479
},
456480
type_checker=_types.draft6_type_checker,
481+
format_checker=_format.draft6_format_checker,
457482
version="draft6",
458483
applicable_validators=_legacy_validators.ignore_ref_siblings,
459484
)
@@ -495,6 +520,7 @@ def extend(validator, validators=(), version=None, type_checker=None):
495520
"uniqueItems": _validators.uniqueItems,
496521
},
497522
type_checker=_types.draft7_type_checker,
523+
format_checker=_format.draft7_format_checker,
498524
version="draft7",
499525
applicable_validators=_legacy_validators.ignore_ref_siblings,
500526
)
@@ -540,6 +566,7 @@ def extend(validator, validators=(), version=None, type_checker=None):
540566
"uniqueItems": _validators.uniqueItems,
541567
},
542568
type_checker=_types.draft201909_type_checker,
569+
format_checker=_format.draft201909_format_checker,
543570
version="draft2019-09",
544571
)
545572

@@ -585,6 +612,7 @@ def extend(validator, validators=(), version=None, type_checker=None):
585612
"uniqueItems": _validators.uniqueItems,
586613
},
587614
type_checker=_types.draft202012_type_checker,
615+
format_checker=_format.draft202012_format_checker,
588616
version="draft2020-12",
589617
)
590618

0 commit comments

Comments
 (0)