summaryrefslogtreecommitdiff
path: root/jsonschema
diff options
context:
space:
mode:
authorJulian Berman <Julian@GrayVines.com>2020-03-04 17:12:02 +0200
committerJulian Berman <Julian@GrayVines.com>2020-11-22 21:01:02 -0500
commit521a02ca42b3c970531ac47ac524141949d42f25 (patch)
treef5dfd0965d264e56cecd6c84a3dd725cd891b2d0 /jsonschema
parente5b0127d2c48ae4712b1baa27c077cd5147778b6 (diff)
downloadjsonschema-draft2019-09.tar.gz
Diffstat (limited to 'jsonschema')
-rw-r--r--jsonschema/__init__.py2
-rw-r--r--jsonschema/_format.py14
-rw-r--r--jsonschema/_types.py2
-rw-r--r--jsonschema/schemas/draft2019-09.json42
-rw-r--r--jsonschema/tests/test_jsonschema_test_suite.py71
-rw-r--r--jsonschema/validators.py44
6 files changed, 169 insertions, 6 deletions
diff --git a/jsonschema/__init__.py b/jsonschema/__init__.py
index 619a7ea..6fa7a83 100644
--- a/jsonschema/__init__.py
+++ b/jsonschema/__init__.py
@@ -14,6 +14,7 @@ from jsonschema._format import (
draft4_format_checker,
draft6_format_checker,
draft7_format_checker,
+ draft201909_format_checker,
)
from jsonschema._types import TypeChecker
from jsonschema.exceptions import (
@@ -28,6 +29,7 @@ from jsonschema.validators import (
Draft4Validator,
Draft6Validator,
Draft7Validator,
+ Draft201909Validator,
RefResolver,
validate,
)
diff --git a/jsonschema/_format.py b/jsonschema/_format.py
index 6d9be51..be5afc5 100644
--- a/jsonschema/_format.py
+++ b/jsonschema/_format.py
@@ -131,6 +131,7 @@ draft3_format_checker = FormatChecker()
draft4_format_checker = FormatChecker()
draft6_format_checker = FormatChecker()
draft7_format_checker = FormatChecker()
+draft201909_format_checker = FormatChecker()
_draft_checkers = dict(
@@ -138,6 +139,7 @@ _draft_checkers = dict(
draft4=draft4_format_checker,
draft6=draft6_format_checker,
draft7=draft7_format_checker,
+ draft201909=draft7_format_checker,
)
@@ -147,12 +149,14 @@ def _checks_drafts(
draft4=None,
draft6=None,
draft7=None,
+ draft201909=None,
raises=(),
):
draft3 = draft3 or name
draft4 = draft4 or name
draft6 = draft6 or name
draft7 = draft7 or name
+ draft201909 = draft201909 or name
def wrap(func):
if draft3:
@@ -163,13 +167,17 @@ def _checks_drafts(
func = _draft_checkers["draft6"].checks(draft6, raises)(func)
if draft7:
func = _draft_checkers["draft7"].checks(draft7, raises)(func)
+ if draft201909:
+ func = _draft_checkers["draft201909"].checks(draft201909, 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)(
- func,
- )
+ FormatChecker.cls_checks(
+ draft201909 or draft7 or draft6 or draft4 or draft3, raises,
+ )(func)
return func
return wrap
diff --git a/jsonschema/_types.py b/jsonschema/_types.py
index 50bcf99..5473023 100644
--- a/jsonschema/_types.py
+++ b/jsonschema/_types.py
@@ -184,4 +184,4 @@ draft6_type_checker = draft4_type_checker.redefine(
isinstance(instance, float) and instance.is_integer()
),
)
-draft7_type_checker = draft6_type_checker
+draft201909_type_checker = draft7_type_checker = draft6_type_checker
diff --git a/jsonschema/schemas/draft2019-09.json b/jsonschema/schemas/draft2019-09.json
new file mode 100644
index 0000000..2248a0c
--- /dev/null
+++ b/jsonschema/schemas/draft2019-09.json
@@ -0,0 +1,42 @@
+{
+ "$schema": "https://json-schema.org/draft/2019-09/schema",
+ "$id": "https://json-schema.org/draft/2019-09/schema",
+ "$vocabulary": {
+ "https://json-schema.org/draft/2019-09/vocab/core": true,
+ "https://json-schema.org/draft/2019-09/vocab/applicator": true,
+ "https://json-schema.org/draft/2019-09/vocab/validation": true,
+ "https://json-schema.org/draft/2019-09/vocab/meta-data": true,
+ "https://json-schema.org/draft/2019-09/vocab/format": false,
+ "https://json-schema.org/draft/2019-09/vocab/content": true
+ },
+ "$recursiveAnchor": true,
+
+ "title": "Core and Validation specifications meta-schema",
+ "allOf": [
+ {"$ref": "meta/core"},
+ {"$ref": "meta/applicator"},
+ {"$ref": "meta/validation"},
+ {"$ref": "meta/meta-data"},
+ {"$ref": "meta/format"},
+ {"$ref": "meta/content"}
+ ],
+ "type": ["object", "boolean"],
+ "properties": {
+ "definitions": {
+ "$comment": "While no longer an official keyword as it is replaced by $defs, this keyword is retained in the meta-schema to prevent incompatible extensions as it remains in common use.",
+ "type": "object",
+ "additionalProperties": { "$recursiveRef": "#" },
+ "default": {}
+ },
+ "dependencies": {
+ "$comment": "\"dependencies\" is no longer a keyword, but schema authors should avoid redefining it to facilitate a smooth transition to \"dependentSchemas\" and \"dependentRequired\"",
+ "type": "object",
+ "additionalProperties": {
+ "anyOf": [
+ { "$recursiveRef": "#" },
+ { "$ref": "meta/validation#/$defs/stringArray" }
+ ]
+ }
+ }
+ }
+}
diff --git a/jsonschema/tests/test_jsonschema_test_suite.py b/jsonschema/tests/test_jsonschema_test_suite.py
index 26e4345..2bce015 100644
--- a/jsonschema/tests/test_jsonschema_test_suite.py
+++ b/jsonschema/tests/test_jsonschema_test_suite.py
@@ -14,10 +14,12 @@ from jsonschema import (
Draft4Validator,
Draft6Validator,
Draft7Validator,
+ Draft201909Validator,
draft3_format_checker,
draft4_format_checker,
draft6_format_checker,
draft7_format_checker,
+ draft201909_format_checker,
)
from jsonschema.tests._helpers import bug
from jsonschema.tests._suite import Suite
@@ -28,6 +30,7 @@ DRAFT3 = SUITE.version(name="draft3")
DRAFT4 = SUITE.version(name="draft4")
DRAFT6 = SUITE.version(name="draft6")
DRAFT7 = SUITE.version(name="draft7")
+DRAFT201909 = SUITE.version(name="draft2019-09")
def skip(message, **kwargs):
@@ -446,6 +449,74 @@ TestDraft7 = DRAFT7.to_unittest_testcase(
)
+TestDraft201909 = DRAFT201909.to_unittest_testcase(
+ DRAFT201909.tests(),
+ DRAFT201909.format_tests(),
+ DRAFT201909.optional_tests_of(name="bignum"),
+ DRAFT201909.optional_tests_of(name="content"),
+ DRAFT201909.optional_tests_of(name="zeroTerminatedFloats"),
+ Validator=Draft201909Validator,
+ format_checker=draft201909_format_checker,
+ # skip=lambda test: (
+ # narrow_unicode_build(test)
+ # or missing_format(draft201909_format_checker)(test)
+ # or skip(
+ # message=bug(),
+ # subject="ref",
+ # case_description="Recursive references between schemas",
+ # )(test)
+ # or skip(
+ # message=bug(32019091),
+ # subject="ref",
+ # case_description="Location-independent identifier",
+ # )(test)
+ # or skip(
+ # message=bug(32019091),
+ # subject="ref",
+ # case_description=(
+ # "Location-independent identifier with absolute URI"
+ # ),
+ # )(test)
+ # or skip(
+ # message=bug(32019091),
+ # subject="ref",
+ # case_description=(
+ # "Location-independent identifier with base URI change in subschema"
+ # ),
+ # )(test)
+ # or skip(
+ # message=bug(),
+ # subject="refRemote",
+ # case_description="base URI change - change folder in subschema",
+ # )(test)
+ # or skip(
+ # message="Upstream bug in strict_rfc3339",
+ # subject="date-time",
+ # description="case-insensitive T and Z",
+ # )(test)
+ # or skip(
+ # message=bug(593),
+ # subject="content",
+ # case_description=(
+ # "validation of string-encoded content based on media type"
+ # ),
+ # )(test)
+ # or skip(
+ # message=bug(593),
+ # subject="content",
+ # case_description="validation of binary string-encoding",
+ # )(test)
+ # or skip(
+ # message=bug(593),
+ # subject="content",
+ # case_description=(
+ # "validation of binary-encoded media type documents"
+ # ),
+ # )(test)
+ # ),
+)
+
+
with warnings.catch_warnings():
warnings.simplefilter("ignore", DeprecationWarning)
diff --git a/jsonschema/validators.py b/jsonschema/validators.py
index d6e0a0c..c6f1e56 100644
--- a/jsonschema/validators.py
+++ b/jsonschema/validators.py
@@ -573,7 +573,47 @@ Draft7Validator = create(
version="draft7",
)
-_LATEST_VERSION = Draft7Validator
+Draft201909Validator = create(
+ meta_schema=_utils.load_schema("draft2019-09"),
+ type_checker=_types.draft201909_type_checker,
+ version="draft2019-09",
+ validators={
+ u"$ref": _validators.ref,
+ u"additionalItems": _validators.additionalItems,
+ u"additionalProperties": _validators.additionalProperties,
+ u"allOf": _validators.allOf,
+ u"anyOf": _validators.anyOf,
+ u"const": _validators.const,
+ u"contains": _validators.contains,
+ u"dependencies": _validators.dependencies,
+ u"enum": _validators.enum,
+ u"exclusiveMaximum": _validators.exclusiveMaximum,
+ u"exclusiveMinimum": _validators.exclusiveMinimum,
+ u"format": _validators.format,
+ u"if": _validators.if_,
+ u"items": _validators.items,
+ u"maxItems": _validators.maxItems,
+ u"maxLength": _validators.maxLength,
+ u"maxProperties": _validators.maxProperties,
+ u"maximum": _validators.maximum,
+ u"minItems": _validators.minItems,
+ u"minLength": _validators.minLength,
+ u"minProperties": _validators.minProperties,
+ u"minimum": _validators.minimum,
+ u"multipleOf": _validators.multipleOf,
+ u"oneOf": _validators.oneOf,
+ u"not": _validators.not_,
+ u"pattern": _validators.pattern,
+ u"patternProperties": _validators.patternProperties,
+ u"properties": _validators.properties,
+ u"propertyNames": _validators.propertyNames,
+ u"required": _validators.required,
+ u"type": _validators.type,
+ u"uniqueItems": _validators.uniqueItems,
+ },
+)
+
+_LATEST_VERSION = Draft201909Validator
class RefResolver(object):
@@ -871,7 +911,7 @@ def validate(instance, schema, cls=None, *args, **kwargs):
If you know you have a valid schema already, especially if you
intend to validate multiple instances with the same schema, you
likely would prefer using the `IValidator.validate` method directly
- on a specific validator (e.g. ``Draft7Validator.validate``).
+ on a specific validator (e.g. ``Draft201909Validator.validate``).
Arguments: