From 1df8d8c79ff2afe94aec266e5a75869a6ba08246 Mon Sep 17 00:00:00 2001 From: sujata-m Date: Thu, 30 Jan 2025 23:16:50 +0530 Subject: [PATCH 1/3] Fixed 1679 - Added limit the message error when u_id and v_id are missing - Added Unit test cases for missing u_id and v_id - Updated Package Version - Updated Changelog --- CHANGELOG.md | 5 ++++ src/example.py | 11 +++++---- src/python_osw_validation/__init__.py | 18 +++++++++++--- src/python_osw_validation/version.py | 2 +- tests/assets/4151.zip | Bin 0 -> 14312 bytes tests/unit_tests/test_osw_validation.py | 30 +++++++++++++++++++++--- 6 files changed, 54 insertions(+), 12 deletions(-) create mode 100644 tests/assets/4151.zip diff --git a/CHANGELOG.md b/CHANGELOG.md index 470b2ad..e9d8c5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Change log +### 0.2.10 + +- Added limit the message error when u_id and v_id are missing +- Added Unit test cases for missing u_id and v_id + ### 0.2.8 - Fixed geopands version to `0.14.4`. diff --git a/src/example.py b/src/example.py index 86987ed..89afc8c 100644 --- a/src/example.py +++ b/src/example.py @@ -4,7 +4,7 @@ PARENT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) ASSETS_DIR = os.path.join(PARENT_DIR, 'tests/assets') VALID_ZIP_FILE = os.path.join(ASSETS_DIR, 'valid.zip') -INVALID_ZIP_FILE = os.path.join(ASSETS_DIR, 'invalid.zip') +INVALID_ZIP_FILE = os.path.join(ASSETS_DIR, '4151.zip') INVALID_VANCOUVER_ZIP_FILE = os.path.join(ASSETS_DIR, 'vancouver-dataset.zip') SCHEMA_DIR = os.path.join(PARENT_DIR, 'src/python_osw_validation/schema') SCHEMA_FILE_PATH = os.path.join(SCHEMA_DIR, 'opensidewalks.schema.json') @@ -33,6 +33,7 @@ def invalid_test_without_provided_schema(): validator = OSWValidation(zipfile_path=INVALID_ZIP_FILE) result = validator.validate(max_errors=10) print(f'Number of errors: {len(result.errors)}') + print(result.errors) print(f'Invalid Test With Provided Schema: {"Failed" if result.is_valid else "Passed"}') @@ -44,8 +45,8 @@ def invalid_test_vancouver_dataset(): if __name__ == '__main__': - valid_test_with_provided_schema() - valid_test_without_provided_schema() - invalid_test_with_provided_schema() + # valid_test_with_provided_schema() + # valid_test_without_provided_schema() + # invalid_test_with_provided_schema() invalid_test_without_provided_schema() - invalid_test_vancouver_dataset() + # invalid_test_vancouver_dataset() diff --git a/src/python_osw_validation/__init__.py b/src/python_osw_validation/__init__.py index c9bfd4c..f2050fd 100644 --- a/src/python_osw_validation/__init__.py +++ b/src/python_osw_validation/__init__.py @@ -107,22 +107,34 @@ def validate(self, max_errors=20) -> ValidationResult: unmatched = node_ids_edges_u - node_ids is_valid = len(unmatched) == 0 if not is_valid: + unmatched_list = list(unmatched) + displayed_unmatched = ', '.join(map(str, unmatched_list[:20])) self.errors.append( - f"All _u_id's in edges should be part of _id's mentioned in nodes, _u_id's not in nodes are: {unmatched}") + f"All _u_id's in edges should be part of _id's mentioned in nodes. " + f"Showing 20 out of {len(unmatched)} unmatched _u_id's: {displayed_unmatched}" + ) # Do all node references in _v_id exist in nodes? unmatched = node_ids_edges_v - node_ids is_valid = len(unmatched) == 0 if not is_valid: + unmatched_list = list(unmatched) + displayed_unmatched = ', '.join(map(str, unmatched_list[:20])) self.errors.append( - f"All _v_id's in edges should be part of _id's mentioned in nodes, _v_id's not in nodes are: {unmatched}") + f"All _v_id's in edges should be part of _id's mentioned in nodes. " + f"Showing 20 out of {len(unmatched)} unmatched _v_id's: {displayed_unmatched}" + ) # Do all node references in _w_id exist in nodes? unmatched = node_ids_zones_w - node_ids is_valid = len(unmatched) == 0 if not is_valid: + unmatched_list = list(unmatched) + displayed_unmatched = ', '.join(map(str, unmatched_list[:20])) self.errors.append( - f"All _w_id's in zones should be part of _id's mentioned in nodes, _w_id's not in nodes are: {unmatched}") + f"All _w_id's in zones should be part of _id's mentioned in nodes. " + f"Showing 20 out of {len(unmatched)} unmatched _w_id's: {displayed_unmatched}" + ) # Geometry validation: check geometry type in each file and test if coordinates make a shape that is reasonable geometric shape according to the Simple Feature Access standard for osw_file in OSW_DATASET: diff --git a/src/python_osw_validation/version.py b/src/python_osw_validation/version.py index 6c8aff6..f0ca935 100644 --- a/src/python_osw_validation/version.py +++ b/src/python_osw_validation/version.py @@ -1 +1 @@ -__version__ = '0.2.9' \ No newline at end of file +__version__ = '0.2.10' \ No newline at end of file diff --git a/tests/assets/4151.zip b/tests/assets/4151.zip new file mode 100644 index 0000000000000000000000000000000000000000..df513857fb0cea60e7d40637e0d94eb2ab6676fc GIT binary patch literal 14312 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 0) @@ -95,7 +95,7 @@ def test_invalid_zipfile_should_specific_errors_counts(self): def test_invalid_zipfile_with_invalid_schema(self): validation = OSWValidation(zipfile_path=self.invalid_zipfile, - schema_file_path=self.invalid_schema_file_path) + schema_file_path=self.invalid_schema_file_path) result = validation.validate() self.assertTrue(len(result.errors) > 0) @@ -160,7 +160,8 @@ def test_external_extension_file_inside_zipfile(self): self.assertIsNone(result.errors) def test_external_extension_file_inside_zipfile_with_schema(self): - validation = OSWValidation(zipfile_path=self.external_extension_file_zipfile, schema_file_path=self.schema_file_path) + validation = OSWValidation(zipfile_path=self.external_extension_file_zipfile, + schema_file_path=self.schema_file_path) result = validation.validate() self.assertTrue(result.is_valid) self.assertIsNone(result.errors) @@ -226,6 +227,29 @@ def test_invalid_zones_file(self): self.assertFalse(result.is_valid) self.assertIsNotNone(result.errors) + def test_unmatched_ids_limited_to_20(self): + validation = OSWValidation(zipfile_path=self.invalid_v_id_file) + result = validation.validate() + + # Ensure validation fails + self.assertFalse(result.is_valid, 'Validation should fail, but it passed.') + self.assertTrue(result.errors, 'Validation should produce errors, but it returned none.') + + # Try to find the unmatched ID error message + error_message = next((err for err in result.errors if 'unmatched' in err.lower()), None) + + # Ensure the error message exists + self.assertIsNotNone(error_message, 'Expected error message for unmatched IDs not found.') + + # Extract the displayed IDs from the message + extracted_ids = error_message.split(':')[-1].strip().split(', ') + + # Ensure only 20 IDs are displayed + self.assertLessEqual(len(extracted_ids), 20, 'More than 20 unmatched IDs displayed in the error message.') + + # Ensure the total count is mentioned + self.assertIn('Showing 20 out of', error_message) + if __name__ == '__main__': unittest.main() From 772a2ee8fb0d142b17700f6381faba13168e3d8e Mon Sep 17 00:00:00 2001 From: sujata-m Date: Thu, 30 Jan 2025 23:19:31 +0530 Subject: [PATCH 2/3] Revert examples --- src/example.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/example.py b/src/example.py index 89afc8c..9f18b99 100644 --- a/src/example.py +++ b/src/example.py @@ -45,8 +45,8 @@ def invalid_test_vancouver_dataset(): if __name__ == '__main__': - # valid_test_with_provided_schema() - # valid_test_without_provided_schema() - # invalid_test_with_provided_schema() + valid_test_with_provided_schema() + valid_test_without_provided_schema() + invalid_test_with_provided_schema() invalid_test_without_provided_schema() - # invalid_test_vancouver_dataset() + invalid_test_vancouver_dataset() From ebfa4026ea925fa140791b7b18f8520e857750d1 Mon Sep 17 00:00:00 2001 From: sujata-m Date: Fri, 31 Jan 2025 11:36:24 +0530 Subject: [PATCH 3/3] Updated code with different errors --- src/python_osw_validation/__init__.py | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/python_osw_validation/__init__.py b/src/python_osw_validation/__init__.py index f2050fd..46527e4 100644 --- a/src/python_osw_validation/__init__.py +++ b/src/python_osw_validation/__init__.py @@ -108,10 +108,12 @@ def validate(self, max_errors=20) -> ValidationResult: is_valid = len(unmatched) == 0 if not is_valid: unmatched_list = list(unmatched) - displayed_unmatched = ', '.join(map(str, unmatched_list[:20])) + num_unmatched = len(unmatched_list) + limit = min(num_unmatched, 20) + displayed_unmatched = ', '.join(map(str, unmatched_list[:limit])) self.errors.append( f"All _u_id's in edges should be part of _id's mentioned in nodes. " - f"Showing 20 out of {len(unmatched)} unmatched _u_id's: {displayed_unmatched}" + f"Showing {'20' if num_unmatched > 20 else 'all'} out of {len(unmatched)} unmatched _u_id's: {displayed_unmatched}" ) # Do all node references in _v_id exist in nodes? @@ -119,10 +121,12 @@ def validate(self, max_errors=20) -> ValidationResult: is_valid = len(unmatched) == 0 if not is_valid: unmatched_list = list(unmatched) - displayed_unmatched = ', '.join(map(str, unmatched_list[:20])) + num_unmatched = len(unmatched_list) + limit = min(num_unmatched, 20) + displayed_unmatched = ', '.join(map(str, unmatched_list[:limit])) self.errors.append( f"All _v_id's in edges should be part of _id's mentioned in nodes. " - f"Showing 20 out of {len(unmatched)} unmatched _v_id's: {displayed_unmatched}" + f"Showing {'20' if num_unmatched > 20 else 'all'} out of {len(unmatched)} unmatched _v_id's: {displayed_unmatched}" ) # Do all node references in _w_id exist in nodes? @@ -130,10 +134,12 @@ def validate(self, max_errors=20) -> ValidationResult: is_valid = len(unmatched) == 0 if not is_valid: unmatched_list = list(unmatched) - displayed_unmatched = ', '.join(map(str, unmatched_list[:20])) + num_unmatched = len(unmatched_list) + limit = min(num_unmatched, 20) + displayed_unmatched = ', '.join(map(str, unmatched_list[:limit])) self.errors.append( f"All _w_id's in zones should be part of _id's mentioned in nodes. " - f"Showing 20 out of {len(unmatched)} unmatched _w_id's: {displayed_unmatched}" + f"Showing {'20' if num_unmatched > 20 else 'all'} out of {len(unmatched)} unmatched _w_id's: {displayed_unmatched}" ) # Geometry validation: check geometry type in each file and test if coordinates make a shape that is reasonable geometric shape according to the Simple Feature Access standard @@ -143,8 +149,14 @@ def validate(self, max_errors=20) -> ValidationResult: OSW_DATASET[osw_file].is_valid == False)] is_valid = len(invalid_geojson) == 0 if not is_valid: + invalid_ids = list(set(invalid_geojson['_id'])) + num_invalid = len(invalid_ids) + limit = min(num_invalid, 20) + displayed_invalid = ', '.join(map(str, invalid_ids[:min(num_invalid, limit)])) self.errors.append( - f"Invalid {osw_file} geometries found, id's of invalid geometries: {set(invalid_geojson['_id'])}") + f"Showing {'20' if num_invalid > 20 else 'all'} out of {num_invalid} invalid {osw_file} geometries, " + f"id's of invalid geometries: {displayed_invalid}" + ) # Validate OSW external extensions for file in validator.externalExtensions: