Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 25 additions & 18 deletions jsonschema/_keywords.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ def patternProperties(validator, patternProperties, instance, schema):
for k, v in instance.items():
if re.search(pattern, k):
yield from validator.descend(
v, subschema, path=k, schema_path=pattern,
v,
subschema,
path=k,
schema_path=pattern,
)


Expand Down Expand Up @@ -204,18 +207,13 @@ def maxItems(validator, mI, instance, schema):


def uniqueItems(validator, uI, instance, schema):
if (
uI
and validator.is_type(instance, "array")
and not uniq(instance)
):
if uI and validator.is_type(instance, "array") and not uniq(instance):
yield ValidationError(f"{instance!r} has non-unique elements")


def pattern(validator, patrn, instance, schema):
if (
validator.is_type(instance, "string")
and not re.search(patrn, instance)
if validator.is_type(instance, "string") and not re.search(
patrn, instance,
):
yield ValidationError(f"{instance!r} does not match {patrn!r}")

Expand Down Expand Up @@ -262,7 +260,9 @@ def dependentSchemas(validator, dependentSchemas, instance, schema):
if property not in instance:
continue
yield from validator.descend(
instance, dependency, schema_path=property,
instance,
dependency,
schema_path=property,
)


Expand Down Expand Up @@ -312,7 +312,8 @@ def required(validator, required, instance, schema):
def minProperties(validator, mP, instance, schema):
if validator.is_type(instance, "object") and len(instance) < mP:
message = (
"should be non-empty" if mP == 1
"should be non-empty"
if mP == 1
else "does not have enough properties"
)
yield ValidationError(f"{instance!r} {message}")
Expand All @@ -323,8 +324,7 @@ def maxProperties(validator, mP, instance, schema):
return
if validator.is_type(instance, "object") and len(instance) > mP:
message = (
"is expected to be empty" if mP == 0
else "has too many properties"
"is expected to be empty" if mP == 0 else "has too many properties"
)
yield ValidationError(f"{instance!r} {message}")

Expand All @@ -351,6 +351,7 @@ def anyOf(validator, anyOf, instance, schema):
def oneOf(validator, oneOf, instance, schema):
subschemas = enumerate(oneOf)
all_errors = []
first_valid = None
for index, subschema in subschemas:
errs = list(validator.descend(instance, subschema, schema_path=index))
if not errs:
Expand All @@ -364,10 +365,11 @@ def oneOf(validator, oneOf, instance, schema):
)

more_valid = [
each for _, each in subschemas
each
for _, each in subschemas
if validator.evolve(schema=each).is_valid(instance)
]
if more_valid:
if more_valid and first_valid is not None:
more_valid.append(first_valid)
reprs = ", ".join(repr(schema) for schema in more_valid)
yield ValidationError(f"{instance!r} is valid under each of {reprs}")
Expand All @@ -393,10 +395,13 @@ def unevaluatedItems(validator, unevaluatedItems, instance, schema):
if not validator.is_type(instance, "array"):
return
evaluated_item_indexes = find_evaluated_item_indexes_by_schema(
validator, instance, schema,
validator,
instance,
schema,
)
unevaluated_items = [
item for index, item in enumerate(instance)
item
for index, item in enumerate(instance)
if index not in evaluated_item_indexes
]
if unevaluated_items:
Expand All @@ -408,7 +413,9 @@ def unevaluatedProperties(validator, unevaluatedProperties, instance, schema):
if not validator.is_type(instance, "object"):
return
evaluated_keys = find_evaluated_property_keys_by_schema(
validator, instance, schema,
validator,
instance,
schema,
)
unevaluated_keys = []
for property in instance:
Expand Down
Loading