From ae777e48ee527457031a5c23f9605e92bfd8a992 Mon Sep 17 00:00:00 2001 From: Johannes Nussbaum <39048939+jnussbaum@users.noreply.github.com> Date: Tue, 25 Oct 2022 13:06:48 +0200 Subject: [PATCH] fix(excel2xml): prevent writing empty text-prop, make text-prop validation less restrictive (DEV-1440) #243 --- docs/dsp-tools-excel2xml.md | 42 ++++++++++++++++-- knora/dsplib/utils/shared.py | 19 +++++++- knora/excel2xml.py | 27 +++++++---- test/unittests/test_excel2xml.py | 32 ++++++++----- test/unittests/test_shared.py | 5 +-- testdata/excel2xml-expected-output.xml | 2 + testdata/excel2xml-testdata.csv | 4 +- testdata/excel2xml-testdata.xls | Bin 54784 -> 58368 bytes testdata/excel2xml-testdata.xlsx | Bin 49686 -> 49759 bytes ...tdata-invalid-boolean-prop-two-values.xlsx | Bin 0 -> 22624 bytes ...l2xml-testdata-invalid-empty-property.xlsx | Bin 0 -> 19002 bytes ...lid-single-invalid-value-for-property.xlsx | Bin 0 -> 19048 bytes testdata/test-data-systematic.xml | 10 ++++- 13 files changed, 108 insertions(+), 33 deletions(-) create mode 100644 testdata/invalid_testdata/excel2xml-testdata-invalid-boolean-prop-two-values.xlsx create mode 100644 testdata/invalid_testdata/excel2xml-testdata-invalid-empty-property.xlsx create mode 100644 testdata/invalid_testdata/excel2xml-testdata-invalid-single-invalid-value-for-property.xlsx diff --git a/docs/dsp-tools-excel2xml.md b/docs/dsp-tools-excel2xml.md index e848f4f20..790da569f 100644 --- a/docs/dsp-tools-excel2xml.md +++ b/docs/dsp-tools-excel2xml.md @@ -229,6 +229,23 @@ else: excel2xml.make_boolean_prop(":hasBoolean", False) ``` +#### Supported text values +DSP's only restriction on text-properties is that the string must be longer than 0. It is, for example, possible to +upload the following property: +```xml + + + - + +``` + +`excel2xml` allows to create such a property, but text values that don't meet the requirements of +[`excel2xml.check_notna()`](#check-if-a-cell-contains-a-usable-value) will trigger a warning, for example: +```python +excel2xml.make_text_prop(":hasText", " ") # OK, but triggers a warning +excel2xml.make_text_prop(":hasText", "-") # OK, but triggers a warning +``` + ### 8. Append the resource to root At the end of the for-loop, it is important not to forget to append the finished resource to the root. @@ -245,11 +262,28 @@ usable if it is - a number (integer or float, but not numpy.nan) - a boolean - - a string with at least one Unicode letter (matching the regex `\p{L}`), underscore, ?, !, or number, but not "None", - "", "N/A", or "-" + - a string with at least one Unicode letter (matching the regex ``\\p{L}``) or number, or at least one _, !, or ? + (The strings "None", "", "N/A", and "-" are considered invalid.) - a PropertyElement whose "value" fulfills the above criteria -Why not just checking a cell by its boolean value? Like: +Examples: +``` +check_notna(0) == True +check_notna(False) == True +check_notna("œ") == True +check_notna("0") == True +check_notna("_") == True +check_notna("!") == True +check_notna("?") == True +check_notna(None) == False +check_notna("None") == False +check_notna() == False +check_notna("") == False +check_notna("-") == False +check_notna(" ") == False +``` + +But why not just checking a cell by its boolean value? Like: ``` if cell: resource.append(make_*_prop(cell)) @@ -264,7 +298,7 @@ might expect: | " " | True | False, because an empty string is not usable for a text property | | numpy.nan | True | False, because N/A is not a usable value | | pandas.NA | TypeError (*) | False, because N/A is not a usable value | -| "" | True | False, because this is the string representation of N/A | +| "<NA>" | True | False, because this is the string representation of N/A | | "-" | True | False, because this is a placeholder in an empty text field | (*) TypeError: boolean value of NA is ambiguous diff --git a/knora/dsplib/utils/shared.py b/knora/dsplib/utils/shared.py index 6d20c0095..ec5692a5a 100644 --- a/knora/dsplib/utils/shared.py +++ b/knora/dsplib/utils/shared.py @@ -175,8 +175,8 @@ def check_notna(value: Optional[Any]) -> bool: Check a value if it is usable in the context of data archiving. A value is considered usable if it is - a number (integer or float, but not np.nan) - a boolean - - a string with at least one Unicode letter (matching the regex ``\\p{L}``), underscore, !, ?, or number, but not - "None", "", "N/A", or "-" + - a string with at least one Unicode letter (matching the regex ``\\p{L}``) or number, or at least one _, !, or ? + (The strings "None", "", "N/A", and "-" are considered invalid.) - a PropertyElement whose "value" fulfills the above criteria Args: @@ -184,6 +184,21 @@ def check_notna(value: Optional[Any]) -> bool: Returns: True if the value is usable, False if it is N/A or otherwise unusable + + Examples: + >>> check_notna(0) == True + >>> check_notna(False) == True + >>> check_notna("œ") == True + >>> check_notna("0") == True + >>> check_notna("_") == True + >>> check_notna("!") == True + >>> check_notna("?") == True + >>> check_notna(None) == False + >>> check_notna("None") == False + >>> check_notna() == False + >>> check_notna("") == False + >>> check_notna("-") == False + >>> check_notna(" ") == False """ if isinstance(value, PropertyElement): diff --git a/knora/excel2xml.py b/knora/excel2xml.py index 415072f88..9be64e13a 100644 --- a/knora/excel2xml.py +++ b/knora/excel2xml.py @@ -1189,9 +1189,12 @@ def make_text_prop( # check value type for val in values: - if not isinstance(val.value, str) or not check_notna(val.value): + if not isinstance(val.value, str) or len(val.value) < 1: raise BaseError(f"Failed validation in resource '{calling_resource}', property '{name}': " f"'{val.value}' is not a valid string.") + if not check_notna(val.value): + warnings.warn(f"Warning for resource '{calling_resource}', property '{name}': " + f"'{val.value}' is probably not a usable string.", stacklevel=2) # make xml structure of the valid values prop_ = etree.Element( @@ -1743,10 +1746,6 @@ def excel2xml(datafile: str, shortcode: str, default_ontology: str) -> None: "text-prop": make_text_prop, "uri-prop": make_uri_prop } - single_value_functions = [ - make_bitstream_prop, - make_boolean_prop - ] if re.search(r"\.csv$", datafile): # "utf_8_sig": an optional BOM at the start of the file will be skipped # let the "python" engine detect the separator @@ -1757,7 +1756,7 @@ def excel2xml(datafile: str, shortcode: str, default_ontology: str) -> None: raise BaseError("The argument 'datafile' must have one of the extensions 'csv', 'xls', 'xlsx'") # replace NA-like cells by NA main_df = main_df.applymap( - lambda x: x if pd.notna(x) and regex.search(r"[\w\p{L}]", str(x), flags=regex.U) else pd.NA + lambda x: x if pd.notna(x) and regex.search(r"[\p{L}\d_!?\-]", str(x), flags=regex.U) else pd.NA ) # remove empty columns, so that the max_prop_count can be calculated without errors main_df.dropna(axis="columns", how="all", inplace=True) @@ -1847,7 +1846,7 @@ def excel2xml(datafile: str, shortcode: str, default_ontology: str) -> None: property_elements: list[PropertyElement] = [] for i in range(1, max_prop_count + 1): value = row[f"{i}_value"] - if check_notna(value): + if pd.notna(value): kwargs_propelem = { "value": value, "permissions": str(row.get(f"{i}_permissions")) @@ -1861,13 +1860,25 @@ def excel2xml(datafile: str, shortcode: str, default_ontology: str) -> None: kwargs_propelem["encoding"] = str(row[f"{i}_encoding"]) property_elements.append(PropertyElement(**kwargs_propelem)) + elif check_notna(str(row.get(f"{i}_permissions"))): + raise BaseError(f"Excel row {int(str(index)) + 2} has an entry in column {i}_permissions, but not " + f"in {i}_value. Please note that cell contents that don't meet the requirements of " + r"the regex [\p{L}\d_!?\-] are considered inexistent.") + + # validate property_elements + if len(property_elements) == 0: + raise BaseError(f"At least one value per property is required, but Excel row {int(str(index)) + 2}" + f"doesn't contain any values.") + if make_prop_function == make_boolean_prop and len(property_elements) != 1: + raise BaseError(f"A can only have a single value, but Excel row {int(str(index)) + 2} " + f"contains more than one values.") # create the property and append it to resource kwargs_propfunc: dict[str, Union[str, PropertyElement, list[PropertyElement]]] = { "name": row["prop name"], "calling_resource": resource_id } - if make_prop_function in single_value_functions and len(property_elements) == 1: + if make_prop_function == make_boolean_prop: kwargs_propfunc["value"] = property_elements[0] else: kwargs_propfunc["value"] = property_elements diff --git a/test/unittests/test_excel2xml.py b/test/unittests/test_excel2xml.py index e41ef7a24..361edee64 100644 --- a/test/unittests/test_excel2xml.py +++ b/test/unittests/test_excel2xml.py @@ -5,6 +5,7 @@ from typing import Callable, Sequence, Union, Optional, Any import numpy as np +import pytest from lxml import etree from knora import excel2xml @@ -104,6 +105,8 @@ def run_test( xml_returned = method(**kwargs_to_generate_xml) xml_returned = etree.tostring(xml_returned, encoding="unicode") xml_returned = re.sub(r" xmlns(:.+?)?=\".+?\"", "", xml_returned) # remove all xml namespace declarations + xml_returned = xml_returned.replace("<", "<") + xml_returned = xml_returned.replace(">", ">") testcase.assertEqual(xml_expected, xml_returned, msg=f"Method {method.__name__} failed with kwargs {kwargs_to_generate_xml}") @@ -348,11 +351,12 @@ def test_make_resptr_prop(self) -> None: run_test(self, prop, method, different_values, invalid_values) + @pytest.mark.filterwarnings("ignore") def test_make_text_prop(self) -> None: prop = "text" method = excel2xml.make_text_prop - different_values = ["text_1", "text_2", "text_3", "text_4", "text_5"] - invalid_values = [True, 10.0, 5] + different_values = ["text_1", " ", "!", "?", "-", "_", "None", ""] + invalid_values = [True, 10.0, 5, ""] run_test(self, prop, method, different_values, invalid_values) # test encoding="xml" @@ -513,6 +517,7 @@ def test_create_json_list_mapping(self) -> None: self.assertDictEqual(testlist_mapping_returned, testlist_mapping_expected) + @pytest.mark.filterwarnings("ignore") def test_excel2xml(self) -> None: # test the valid files, 3 times identical, but in the three formats XLSX, XLS, and CSV with open("testdata/excel2xml-expected-output.xml") as f: @@ -528,17 +533,20 @@ def test_excel2xml(self) -> None: # test the invalid files invalid_prefix = "testdata/invalid_testdata/excel2xml-testdata-invalid" invalid_cases = [ - (f"{invalid_prefix}-id-propname-both.xlsx", "Exactly 1 of the 2 columns 'id' and 'prop name' must have an entry"), - (f"{invalid_prefix}-id-propname-none.xlsx", "Exactly 1 of the 2 columns 'id' and 'prop name' must have an entry"), - (f"{invalid_prefix}-missing-prop-permissions.xlsx", "Missing permissions for value .+ of property"), - (f"{invalid_prefix}-missing-resource-label.xlsx", "Missing label for resource"), - (f"{invalid_prefix}-missing-resource-permissions.xlsx", "Missing permissions for resource"), - (f"{invalid_prefix}-missing-restype.xlsx", "Missing restype"), - (f"{invalid_prefix}-no-bitstream-permissions.xlsx", "'file permissions' missing"), - (f"{invalid_prefix}-nonexisting-proptype.xlsx", "Invalid prop type"), + (f"{invalid_prefix}-boolean-prop-two-values.xlsx", "A can only have a single value"), + (f"{invalid_prefix}-empty-property.xlsx", "At least one value per property is required"), + (f"{invalid_prefix}-id-propname-both.xlsx", "Exactly 1 of the 2 columns 'id' and 'prop name' must have an entry"), + (f"{invalid_prefix}-id-propname-none.xlsx", "Exactly 1 of the 2 columns 'id' and 'prop name' must have an entry"), + (f"{invalid_prefix}-missing-prop-permissions.xlsx", "Missing permissions for value .+ of property"), + (f"{invalid_prefix}-missing-resource-label.xlsx", "Missing label for resource"), + (f"{invalid_prefix}-missing-resource-permissions.xlsx", "Missing permissions for resource"), + (f"{invalid_prefix}-missing-restype.xlsx", "Missing restype"), + (f"{invalid_prefix}-no-bitstream-permissions.xlsx", "'file permissions' missing"), + (f"{invalid_prefix}-nonexisting-proptype.xlsx", "Invalid prop type"), + (f"{invalid_prefix}-single-invalid-value-for-property.xlsx", "has an entry in column \\d+_permissions, but not in \\d+_value") ] - for file, regex in invalid_cases: - with self.assertRaisesRegex(BaseError, regex, msg=f"Failed with file '{file}'"): + for file, _regex in invalid_cases: + with self.assertRaisesRegex(BaseError, _regex, msg=f"Failed with file '{file}'"): excel2xml.excel2xml(file, "1234", f"excel2xml-invalid") diff --git a/test/unittests/test_shared.py b/test/unittests/test_shared.py index 97a8e0023..96c47af9c 100644 --- a/test/unittests/test_shared.py +++ b/test/unittests/test_shared.py @@ -45,12 +45,11 @@ def test_prepare_dataframe(self) -> None: def test_check_notna(self) -> None: na_values = [None, pd.NA, np.nan, "", " ", "-", ",", ".", "*", " ⳰", " ῀ ", " ῾ ", " \n\t ", "N/A", "n/a", - - "", ["a", "b"], pd.array(["a", "b"]), np.array([0, 1])] + "", "None", ["a", "b"], pd.array(["a", "b"]), np.array([0, 1])] for na_value in na_values: self.assertFalse(shared.check_notna(na_value), msg=f"Failed na_value: {na_value}") - notna_values = [1, 0.1, True, False, "True", "False", r" \n\t ", "0", "_", "Ὅμηρος"] + notna_values = [1, 0.1, True, False, "True", "False", r" \n\t ", "0", "_", "Ὅμηρος", "!", "?"] notna_values.extend([PropertyElement(x) for x in notna_values]) for notna_value in notna_values: self.assertTrue(shared.check_notna(notna_value), msg=f"Failed notna_value: {notna_value}") diff --git a/testdata/excel2xml-expected-output.xml b/testdata/excel2xml-expected-output.xml index f8a56d961..b4de93afb 100644 --- a/testdata/excel2xml-expected-output.xml +++ b/testdata/excel2xml-expected-output.xml @@ -28,6 +28,8 @@ Homer Ὅμηρος + ?? + - http://d-nb.info/gnd/11855333X diff --git a/testdata/excel2xml-testdata.csv b/testdata/excel2xml-testdata.csv index e8942bc84..93d88dc09 100644 --- a/testdata/excel2xml-testdata.csv +++ b/testdata/excel2xml-testdata.csv @@ -1,6 +1,6 @@ id,restype,label,ark,iri,created,permissions,file,file permissions,prop name,prop type,prop list,1_value,1_encoding,1_permissions,1_comment,2_value,2_encoding,2_permissions,2_comment,3_value,3_encoding,3_permissions,3_comment,4_value,4_encoding,4_permissions,4_comment, ,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, person_0,:Person,Homer,,,1999-12-31T23:59:59.9999999+01:00,res-default,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,:hasName,text-prop,,Homer,utf8,prop-default,,Ὅμηρος,utf8,prop-default,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,:hasName,text-prop,,Homer,utf8,prop-default,,Ὅμηρος,utf8,prop-default,,??,utf8,prop-default,,-,utf8,prop-default,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,:hasIdentifier,uri-prop,,http://d-nb.info/gnd/11855333X,,prop-default,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,:hasExternalLink,uri-prop,,https://en.wikipedia.org/wiki/Homer,,prop-default,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, annotation_0,Annotation,Annotation to Homer,,,,res-default,,,,,,,,,,,,,,,,,,,,,,, ,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, @@ -54,4 +54,4 @@ link_thing_0,LinkObj,Link between person_0 and img_obj_6,ark:/72163/4123-31ec6ea ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file diff --git a/testdata/excel2xml-testdata.xls b/testdata/excel2xml-testdata.xls index 405afe495847e8ba256ef50000ce4e5203e2a1b4..98d30bda9cac5bf4cc8a4868664a2ed9389c983d 100644 GIT binary patch delta 1829 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 E7jsEtYkzoBS}C&!YDzKf`X_7ML`L>0!k3c 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

h%+N#p2hn!F7;(g>EAwEthLHFU7$R)X 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 diff --git a/testdata/invalid_testdata/excel2xml-testdata-invalid-boolean-prop-two-values.xlsx b/testdata/invalid_testdata/excel2xml-testdata-invalid-boolean-prop-two-values.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..09202142a1703f7517fb291a3b80bd37339d2e98 GIT binary patch literal 22624 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 literal 0 HcmV?d00001 diff --git a/testdata/invalid_testdata/excel2xml-testdata-invalid-empty-property.xlsx b/testdata/invalid_testdata/excel2xml-testdata-invalid-empty-property.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3e06eb045c15364fe50d2c0dd91433031e30a598 GIT binary patch literal 19002 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 U0JttRLmCxE3-JDSap=|m13Pb=rT_o{ literal 0 HcmV?d00001 diff --git a/testdata/invalid_testdata/excel2xml-testdata-invalid-single-invalid-value-for-property.xlsx b/testdata/invalid_testdata/excel2xml-testdata-invalid-single-invalid-value-for-property.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5cbbf1e3d1b2a66ab199c6aeff592c3012687d1c GIT binary patch literal 19048 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 AO#lD@ literal 0 HcmV?d00001 diff --git a/testdata/test-data-systematic.xml b/testdata/test-data-systematic.xml index b06ba9c30..d3c26fc8a 100644 --- a/testdata/test-data-systematic.xml +++ b/testdata/test-data-systematic.xml @@ -60,8 +60,14 @@ id="test_thing_1" permissions="res-default"> - Dies ist ein einfacher Text ohne Markup - Nochmals ein einfacher Text + Dies ist ein einfacher Text ohne Markup mit Tags, die aber nicht geparst werden. + Nochmals ein einfacher Text, dessen Tags geparst werden + + _ + ! + ? + - + œ