diff --git a/libcove/lib/common.py b/libcove/lib/common.py index 2bea99f..a3880dd 100644 --- a/libcove/lib/common.py +++ b/libcove/lib/common.py @@ -17,6 +17,7 @@ from flattentool import unflatten from flattentool.schema import get_property_type_set from jsonschema import FormatChecker, RefResolver +from jsonschema._utils import uniq from jsonschema.exceptions import ValidationError from .exceptions import cove_spreadsheet_conversion_error @@ -66,6 +67,7 @@ def unique_ids(validator, ui, instance, schema): if ui and validator.is_type(instance, "array"): non_unique_ids = set() all_ids = set() + previous_items = set() for item in instance: try: item_id = item.get(id_name) @@ -81,11 +83,12 @@ def unique_ids(validator, ui, instance, schema): non_unique_ids.add(item_id) all_ids.add(item_id) else: - msg = "Array has non-unique elements" - err = ValidationError(msg, instance=instance) - err.error_id = "uniqueItems_no_ids" - yield err - return + if uniq(instance): + msg = "Array has non-unique elements" + err = ValidationError(msg, instance=instance) + err.error_id = "uniqueItems_no_ids" + yield err + return for non_unique_id in sorted(non_unique_ids): msg = "Non-unique {} values".format(id_name) diff --git a/tests/lib/test_common.py b/tests/lib/test_common.py index 7c44de0..5c3905b 100644 --- a/tests/lib/test_common.py +++ b/tests/lib/test_common.py @@ -620,19 +620,6 @@ def get_release_pkg_schema_obj(self): "error_id": None, "values": [{"path": "releases/1"}], }, - { - "message": "Array has non-unique elements", - "message_safe": "Array has non-unique elements", - "validator": "uniqueItems", - "assumption": None, - "message_type": "uniqueItems", - "path_no_number": "releases", - "header": "releases", - "header_extra": "releases", - "null_clause": "", - "error_id": "uniqueItems_no_ids", - "values": [{"path": "releases"}], - }, ], ), ( @@ -665,19 +652,6 @@ def get_release_pkg_schema_obj(self): "error_id": None, "values": [{"path": "records/1"}], }, - { - "message": "Array has non-unique elements", - "message_safe": "Array has non-unique elements", - "validator": "uniqueItems", - "assumption": None, - "message_type": "uniqueItems", - "path_no_number": "records", - "header": "records", - "header_extra": "records", - "null_clause": "", - "error_id": "uniqueItems_no_ids", - "values": [{"path": "records"}], - }, ], ), ],