summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarald Nezbeda <hn@nezhar.com>2021-06-14 15:02:12 +0200
committerHarald Nezbeda <hn@nezhar.com>2021-07-19 18:14:31 +0200
commitedc5eb086b557336dfb6963ed38f47464ee17727 (patch)
tree2785c8e2a5a3bc6d2b5db44c47438917af65fbb0
parent491168de3b21ea30531406f0f8ddd1415b6f0cba (diff)
downloadjsonschema-edc5eb086b557336dfb6963ed38f47464ee17727.tar.gz
Julian/jsonschema#782: Extend format check for draft2020-12, add duration format check
-rw-r--r--jsonschema/_format.py58
-rw-r--r--setup.cfg2
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)
diff --git a/setup.cfg b/setup.cfg
index 8806726..a53aea0 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -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 =