diff options
author | Harald Nezbeda <hn@nezhar.com> | 2021-06-14 15:02:12 +0200 |
---|---|---|
committer | Harald Nezbeda <hn@nezhar.com> | 2021-07-19 18:14:31 +0200 |
commit | edc5eb086b557336dfb6963ed38f47464ee17727 (patch) | |
tree | 2785c8e2a5a3bc6d2b5db44c47438917af65fbb0 | |
parent | 491168de3b21ea30531406f0f8ddd1415b6f0cba (diff) | |
download | jsonschema-edc5eb086b557336dfb6963ed38f47464ee17727.tar.gz |
Julian/jsonschema#782: Extend format check for draft2020-12, add duration format check
-rw-r--r-- | jsonschema/_format.py | 58 | ||||
-rw-r--r-- | setup.cfg | 2 |
2 files changed, 54 insertions, 6 deletions
diff --git a/jsonschema/_format.py b/jsonschema/_format.py index 345545b..49b6b71 100644 --- a/jsonschema/_format.py +++ b/jsonschema/_format.py @@ -148,12 +148,14 @@ def _checks_drafts( draft4=None, draft6=None, draft7=None, + draft202012=None, raises=(), ): draft3 = draft3 or name draft4 = draft4 or name draft6 = draft6 or name draft7 = draft7 or name + draft202012 = draft202012 or name def wrap(func): if draft3: @@ -164,11 +166,13 @@ def _checks_drafts( func = _draft_checkers["draft6"].checks(draft6, raises)(func) if draft7: func = _draft_checkers["draft7"].checks(draft7, raises)(func) + if draft202012: + func = _draft_checkers["draft202012"].checks(draft202012, raises)(func) # Oy. This is bad global state, but relied upon for now, until # deprecation. See https://github.com/Julian/jsonschema/issues/519 # and test_format_checkers_come_with_defaults - FormatChecker.cls_checks(draft7 or draft6 or draft4 or draft3, raises)( + FormatChecker.cls_checks(draft202012 or draft7 or draft6 or draft4 or draft3, raises)( func, ) return func @@ -188,6 +192,7 @@ def is_email(instance): draft4="ipv4", draft6="ipv4", draft7="ipv4", + draft202012="ipv4", raises=ipaddress.AddressValueError, ) def is_ipv4(instance): @@ -214,6 +219,7 @@ else: draft4="hostname", draft6="hostname", draft7="hostname", + draft202012="hostname", ) def is_host_name(instance): if not isinstance(instance, str): @@ -229,6 +235,7 @@ except ImportError: # pragma: no cover else: @_checks_drafts( draft7="idn-hostname", + draft202012="idn-hostname", raises=(idna.IDNAError, UnicodeError), ) def is_idn_host_name(instance): @@ -255,6 +262,7 @@ except ImportError: @_checks_drafts( draft6="uri-reference", draft7="uri-reference", + draft202012="uri-reference", raises=ValueError, ) def is_uri_reference(instance): @@ -263,19 +271,30 @@ except ImportError: return validate_rfc3986(instance, rule="URI_reference") else: - @_checks_drafts(draft7="iri", raises=ValueError) + @_checks_drafts( + draft7="iri", + draft202012="iri", + raises=ValueError, + ) def is_iri(instance): if not isinstance(instance, str): return True return rfc3987.parse(instance, rule="IRI") - @_checks_drafts(draft7="iri-reference", raises=ValueError) + @_checks_drafts( + draft7="iri-reference", + draft202012="iri-reference", + raises=ValueError, + ) def is_iri_reference(instance): if not isinstance(instance, str): return True return rfc3987.parse(instance, rule="IRI_reference") - @_checks_drafts(name="uri", raises=ValueError) + @_checks_drafts( + name="uri", + raises=ValueError, + ) def is_uri(instance): if not isinstance(instance, str): return True @@ -284,6 +303,7 @@ else: @_checks_drafts( draft6="uri-reference", draft7="uri-reference", + draft202012="uri-reference", raises=ValueError, ) def is_uri_reference(instance): @@ -307,7 +327,10 @@ if validate_rfc3339: return True return validate_rfc3339(instance.upper()) - @_checks_drafts(draft7="time") + @_checks_drafts( + draft7="time", + draft202012="time", + ) def is_time(instance): if not isinstance(instance, str): return True @@ -328,7 +351,12 @@ else: return datetime.datetime.strptime(instance, "%Y-%m-%d") -@_checks_drafts(draft3="date", draft7="date", raises=ValueError) +@_checks_drafts( + draft3="date", + draft7="date", + draft202012="date", + raises=ValueError, +) def is_date(instance): if not isinstance(instance, str): return True @@ -378,6 +406,7 @@ else: @_checks_drafts( draft6="json-pointer", draft7="json-pointer", + draft202012="json-pointer", raises=jsonpointer.JsonPointerException, ) def is_json_pointer(instance): @@ -391,6 +420,7 @@ else: # into a new external library. @_checks_drafts( draft7="relative-json-pointer", + draft202012="relative-json-pointer", raises=jsonpointer.JsonPointerException, ) def is_relative_json_pointer(instance): @@ -420,8 +450,24 @@ else: @_checks_drafts( draft6="uri-template", draft7="uri-template", + draft202012="uri-template", ) def is_uri_template(instance): if not isinstance(instance, str): return True return uri_template.validate(instance) + + +try: + import isoduration +except ImportError: + pass +else: + @_checks_drafts( + draft202012="duration", + raises=isoduration.DurationParsingException, + ) + def is_duration(instance): + if not isinstance(instance, str): + return True + return isoduration.parse_duration(instance) @@ -39,6 +39,7 @@ format = strict-rfc3339 webcolors uri_template + isoduration;python_version>'3.6' format_nongpl = fqdn idna @@ -47,6 +48,7 @@ format_nongpl = rfc3986-validator>0.1.0 rfc3339-validator uri_template + isoduration;python_version>'3.6' [options.entry_points] console_scripts = |