Skip to content

Commit

Permalink
Don't leak the additionalItems keyword into JSON Schema draft 202…
Browse files Browse the repository at this point in the history
…0-12

In 2020-12 it is called 'items', which of course is already supported.
  • Loading branch information
Julian committed Oct 30, 2023
1 parent 8cff13d commit daa40b3
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 24 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ v4.19.2
=======

* Fix the error message for additional items when used with heterogeneous arrays.
* Don't leak the ``additionalItems`` keyword into JSON Schema draft 2020-12, where it was replaced by ``items``.

v4.19.1
=======
Expand Down
18 changes: 0 additions & 18 deletions jsonschema/_keywords.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,24 +83,6 @@ def items(validator, items, instance, schema):
)


def additionalItems(validator, aI, instance, schema):
if (
not validator.is_type(instance, "array")
or validator.is_type(schema.get("items", {}), "object")
):
return

len_items = len(schema.get("items", []))
if validator.is_type(aI, "object"):
for index, item in enumerate(instance[len_items:], start=len_items):
yield from validator.descend(item, aI, path=index)
elif not aI and len(instance) > len(schema.get("items", [])):
error = "Additional items are not allowed (%s %s unexpected)"
yield ValidationError(
error % extras_msg(instance[len(schema.get("items", [])):]),
)


def const(validator, const, instance, schema):
if not equal(instance, const):
yield ValidationError(f"{const!r} was expected")
Expand Down
18 changes: 18 additions & 0 deletions jsonschema/_legacy_keywords.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,24 @@ def items_draft3_draft4(validator, items, instance, schema):
)


def additionalItems(validator, aI, instance, schema):
if (
not validator.is_type(instance, "array")
or validator.is_type(schema.get("items", {}), "object")
):
return

len_items = len(schema.get("items", []))
if validator.is_type(aI, "object"):
for index, item in enumerate(instance[len_items:], start=len_items):
yield from validator.descend(item, aI, path=index)
elif not aI and len(instance) > len(schema.get("items", [])):
error = "Additional items are not allowed (%s %s unexpected)"
yield ValidationError(
error % _utils.extras_msg(instance[len(schema.get("items", [])):]),
)


def items_draft6_draft7_draft201909(validator, items, instance, schema):
if not validator.is_type(instance, "array"):
return
Expand Down
11 changes: 5 additions & 6 deletions jsonschema/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -587,7 +587,7 @@ def extend(
),
validators={
"$ref": _keywords.ref,
"additionalItems": _keywords.additionalItems,
"additionalItems": _legacy_keywords.additionalItems,
"additionalProperties": _keywords.additionalProperties,
"dependencies": _legacy_keywords.dependencies_draft3,
"disallow": _legacy_keywords.disallow_draft3,
Expand Down Expand Up @@ -621,7 +621,7 @@ def extend(
),
validators={
"$ref": _keywords.ref,
"additionalItems": _keywords.additionalItems,
"additionalItems": _legacy_keywords.additionalItems,
"additionalProperties": _keywords.additionalProperties,
"allOf": _keywords.allOf,
"anyOf": _keywords.anyOf,
Expand Down Expand Up @@ -660,7 +660,7 @@ def extend(
),
validators={
"$ref": _keywords.ref,
"additionalItems": _keywords.additionalItems,
"additionalItems": _legacy_keywords.additionalItems,
"additionalProperties": _keywords.additionalProperties,
"allOf": _keywords.allOf,
"anyOf": _keywords.anyOf,
Expand Down Expand Up @@ -704,7 +704,7 @@ def extend(
),
validators={
"$ref": _keywords.ref,
"additionalItems": _keywords.additionalItems,
"additionalItems": _legacy_keywords.additionalItems,
"additionalProperties": _keywords.additionalProperties,
"allOf": _keywords.allOf,
"anyOf": _keywords.anyOf,
Expand Down Expand Up @@ -750,7 +750,7 @@ def extend(
validators={
"$recursiveRef": _legacy_keywords.recursiveRef,
"$ref": _keywords.ref,
"additionalItems": _keywords.additionalItems,
"additionalItems": _legacy_keywords.additionalItems,
"additionalProperties": _keywords.additionalProperties,
"allOf": _keywords.allOf,
"anyOf": _keywords.anyOf,
Expand Down Expand Up @@ -797,7 +797,6 @@ def extend(
validators={
"$dynamicRef": _keywords.dynamicRef,
"$ref": _keywords.ref,
"additionalItems": _keywords.additionalItems,
"additionalProperties": _keywords.additionalProperties,
"allOf": _keywords.allOf,
"anyOf": _keywords.anyOf,
Expand Down

0 comments on commit daa40b3

Please sign in to comment.