From a7e9d8544799efef45d33f6e4072ba7ea066eb4b Mon Sep 17 00:00:00 2001 From: Johannes Nussbaum <39048939+jnussbaum@users.noreply.github.com> Date: Wed, 28 Sep 2022 17:48:57 +0200 Subject: [PATCH] fix: improve excel2xml (DEV-1361) (#232) --- .../images/img-excel2xml-module-docstring.png | Bin 0 -> 189192 bytes .../templates/excel2xml_sample_script.py | 6 +- docs/dsp-tools-excel2xml.md | 196 +++++-- knora/dsplib/models/propertyelement.py | 18 +- knora/dsplib/utils/shared.py | 5 +- knora/excel2xml.py | 530 +++++++----------- test/unittests/test_excel2xml.py | 169 ++---- test/unittests/test_shared.py | 5 +- 8 files changed, 428 insertions(+), 501 deletions(-) create mode 100644 docs/assets/images/img-excel2xml-module-docstring.png diff --git a/docs/assets/images/img-excel2xml-module-docstring.png b/docs/assets/images/img-excel2xml-module-docstring.png new file mode 100644 index 0000000000000000000000000000000000000000..fd37d28102c6b5956a78a6c9a3b550b09dfb929d GIT binary patch literal 189192 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

`>zR}`BYu_q~n_P>Um}KTQ($I2JyKa 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 literal 0 HcmV?d00001 diff --git a/docs/assets/templates/excel2xml_sample_script.py b/docs/assets/templates/excel2xml_sample_script.py index 25429c600..6ea630929 100644 --- a/docs/assets/templates/excel2xml_sample_script.py +++ b/docs/assets/templates/excel2xml_sample_script.py @@ -47,9 +47,9 @@ # and if it's not there, look in "category_dict_fallback" category_values = [category_dict.get(x.strip(), category_dict_fallback[x.strip()]) for x in row["Category"].split(",")] - resource.append(excel2xml.make_list_prop("category", ":hasCategory", values=category_values)) + resource.append(excel2xml.make_list_prop("category", ":hasCategory", category_values)) if excel2xml.check_notna(row["Complete?"]): - resource.append(excel2xml.make_boolean_prop(name=":isComplete", value=row["Complete?"])) + resource.append(excel2xml.make_boolean_prop(":isComplete", row["Complete?"])) if excel2xml.check_notna(row["Color"]): resource.append(excel2xml.make_color_prop(":colorprop", row["Color"])) if pd.notna(row["Date discovered"]): @@ -93,7 +93,7 @@ link = excel2xml.make_link("Link between Resource 0 and 1", "link_res_0_res_1") link.append(excel2xml.make_text_prop("hasComment", "This is a comment")) -link.append(excel2xml.make_resptr_prop("hasLinkTo", values=["res_0", "res_1"])) +link.append(excel2xml.make_resptr_prop("hasLinkTo", ["res_0", "res_1"])) root.append(link) # write file diff --git a/docs/dsp-tools-excel2xml.md b/docs/dsp-tools-excel2xml.md index 5cc21d200..7b5527a00 100644 --- a/docs/dsp-tools-excel2xml.md +++ b/docs/dsp-tools-excel2xml.md @@ -5,30 +5,72 @@ dsp-tools assists you in converting a data source in CSV/XLS(X) format to an XML transformation from Excel/CSV to XML: - The CLI command `dsp-tools excel2xml` creates an XML file from an Excel/CSV file which is already structured - according to the DSP specifications. This is mostly used for DaSCH-interal data migration. The CLI command is - documented [here](dsp-tools-excel.md#cli-command-excel2xml). + according to the DSP specifications. This is mostly used for DaSCH-interal data migration. **The CLI command is + documented [here](dsp-tools-excel.md#cli-command-excel2xml).** - The module `excel2xml` can be imported into a custom Python script that transforms any tabular data into an XML. This - use case is more frequent, because data from research projects have a variety of formats/structures. **This document - only treats the `excel2xml` module.** + use case is more frequent, because data from research projects have a variety of formats/structures. **The + `excel2xml` module is documented on this page.** +
+**In the following, an example is given how to use the module `excel2xml`:** -## How to use the module excel2xml -At the end of this document, you find a sample Python script. In the following, it is explained how to use it. +Save the following files into a directory, and run the Python script: + - sample data: [excel2xml_sample_data.csv](./assets/templates/excel2xml_sample_data.csv) + - sample ontology: [excel2xml_sample_onto.json](./assets/templates/excel2xml_sample_onto.json) + - sample script: [excel2xml_sample_script.py](./assets/templates/excel2xml_sample_script.py) -### General preparation -Insert your ontology name, project shortcode, and the path to your data source. If necessary, activate one of the lines -that are commented out. -Then, the `root` element is created, which represents the `` tag of the XML document. As first children of -``, some standard permissions are added. At the end, please carefully check the permissions of the finished XML -file if they meet your requirements, and adapt them if necessary. -The standard permission of a resource is "res-default", and of a property "prop-default". If you don't specify it -otherwise, all resources and properties get these permissions. With excel2xml, it is not possible to create resources/ -properties that don't have permissions, because they would be invisible for all users except project admins and system -admins. Read more about permissions [here](./dsp-tools-xmlupload.md#how-to-use-the-permissions-attribute-in-resourcesproperties). +This is the simplified pattern how the Python script works: +``` +1 main_df = pd.read_csv("excel2xml_sample_data.csv", dtype="str", sep=",") +2 root = excel2xml.make_root(...) +3 root = excel2xml.append_permissions(root) +4 # if necessary: create list mappings, according to explanation below +5 for index, row in main_df.iterrows(): +6 resource = excel2xml.make_resource(...) +7 resource.append(excel2xml.make_text_prop(...)) +8 root.append(resource) +9 excel2xml.write_xml(root, "data.xml") +``` +``` +1 read in your data source with the pandas library (https://pandas.pydata.org/) +2 create the root element `` +3 append the permissions +4 if necessary: create list mappings (see below) +5 iterate through the rows of your data source: +6 create the `` tag +7 append properties to it +8 append the resource to the root tag `` +9 save the finished XML file +``` -### Create list mappings +
+These steps are now explained in-depth: + + +## 1. Read in your data source +In the first paragraph of the sample script, insert your ontology name, project shortcode, and the path to your data +source. If necessary, activate one of the lines that are commented out. + + +## 2. Create root element `` +Then, the root element is created, which represents the `` tag of the XML document. + + +## 3. Append the permissions +As first children of ``, some standard permissions are added. At the end, please carefully check the permissions +of the finished XML file to ensure that they meet your requirements, and adapt them if necessary. + +The standard permission of a resource is `res-default`, and of a property `prop-default`. If you don't specify it +otherwise, all resources and properties get these permissions. + +With `excel2xml`, it is not possible to create resources/properties that don't have permissions, because they would be +invisible for all users except project admins and system admins. [Read more about permissions +here](./dsp-tools-xmlupload.md#how-to-use-the-permissions-attribute-in-resourcesproperties). + + +## 4. Create list mappings Let's assume that your data source has a column containing list values named after the "label" of the JSON project list, instead of the "name" which is needed for the `dsp-tools xmlupload`. You need a way to get the names from the labels. If your data source uses the labels correctly, this is an easy task: The method `create_json_list_mapping()` creates a @@ -39,38 +81,117 @@ correct JSON project node name. This happens based on string similarity. Please no false matches! -### Create all resources -With the help of the [Python pandas library](https://pandas.pydata.org/), you can then iterate through the rows of your -Excel/CSV, and create resources and properties. Some examples of useful helper methods are: +## 5. Iterate through the rows of your data source +With the help of Pandas, you can then iterate through the rows of your Excel/CSV, and create resources and properties. + + +### 6. Create the `` tag +There are four kind of resources that can be created: + +| super | tag | method | +|--------------|----------------|---------------------| +| `Resource` | `` | `make_resource()` | +| `Annotation` | `` | `make_annotation()` | +| `Region` | `` | `make_region()` | +| `LinkObj` | `` | `make_link()` | + +`` is the most frequent of them. The other three are [explained +here](./dsp-tools-xmlupload.md#dsp-base-resources--base-properties-to-be-used-directly-in-the-xml-file). + +Special care is needed when the ID of a resource is created. Every resource must have an ID that is unique in the file, +and it must meet the constraints of xsd:ID. You can simply achieve this if you use the method `make_xsd_id_compatible()`. + + +### 7. Append the properties +For every property, there is a helper function that explains itself when you hover over it. So you don't need to worry +any more how to construct a certain XML value for a certain property. + +Here's how the Docstrings assist you: + + - method signature: names of the parameters and accepted types + - short explanation how the method behaves + - usage examples + - link to the dsp-tools documentation of this property + - a short description for every parameter + - short description of the returned object. + - Note: `etree._Element` is a type annotation of an underlying library. You don't have to care about it, as long as + you proceed as described (append the returned object to the parent resource). + +![docstring example](./assets/images/img-excel2xml-module-docstring.png) + + +#### Fine-tuning with `PropertyElement` +There are two possibilities how to create a property: The value can be passed as it is, or as `PropertyElement`. If it +is passed as it is, the `permissions` are assumed to be `prop-default`, texts are assumed to be encoded as `utf8`, and +the value won't have a comment: +``` +make_text_prop(":testproperty", "first text") +``` +``` + + first text + +``` + +If you want to change these defaults, you have to use a `PropertyElement` instead: +``` +make_text_prop( + ":testproperty", + PropertyElement( + value="first text", + permissions="prop-restricted", + encoding="xml", + comment="some comment" + ) +) +``` +``` + + first text + +``` + + +#### Supported boolean formats +For `make_boolean_prop(cell)`, the following formats are supported: + - true: True, "true", "True", "1", 1, "yes", "Yes" + - false: False, "false", "False", "0", 0, "no", "No" -#### Create an ID for a resource -The method `make_xsd_id_compatible(string)` makes a string compatible with the constraints of xsd:ID, so that it can be -used as ID of a resource. +N/A-like values will raise an Error. So if your cell is empty, this method will not count it as false, but will raise an +Error. If you want N/A-like values to be counted as false, you may use a construct like this: +```python +if excel2xml.check_notna(cell): + # the cell contains usable content + excel2xml.make_boolean_prop(":hasBoolean", cell) +else: + # the cell is empty: you can decide to count this as "False" + excel2xml.make_boolean_prop(":hasBoolean", False) +``` -#### Create a property -For every property, there is a helper function that explains itself when you hover over it. It also has a link to -the dsp-tools documentation of this property. So you don't need to worry how to construct a certain XML value for a -certain property. -For `make_boolean_prop(cell)`, the following formats are supported: +### 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. - - true: True, "true", "True", "1", 1, "yes", "Yes" - - false: False, "false", "False", "0", 0, "no", "No" + +## 9. Save the file +At the very end, save the file under a name that you can choose yourself. -#### Check if a cell contains a usable value +## Other helper methods +### Check if a cell contains a usable value The method `check_notna(cell)` checks 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 numpy.nan) - a boolean - - a string with at least one Unicode letter, underscore, or number, but not "None", "", "N/A", or "-" + - a string with at least one Unicode letter (matching the regex `\p{L}`), underscore, ?, !, or number, but not "None", + "", "N/A", or "-" - a PropertyElement whose "value" fulfills the above criteria -#### Calendar date parsing +### Calendar date parsing The method `find_date_in_string(string)` tries to find a calendar date in a string. If successful, it returns the DSP-formatted date string. @@ -99,12 +220,3 @@ Currently supported date formats: | 1849/1850 | GREGORIAN:CE:1849:CE:1850 | | 1849/50 | GREGORIAN:CE:1849:CE:1850 | | 1845-50 | GREGORIAN:CE:1845:CE:1850 | - - -## Complete example -Save the following files into a directory, and run the Python script. The features discussed in this document are -contained therein. - - - sample data: [excel2xml_sample_data.csv](assets/templates/excel2xml_sample_data.csv) - - sample ontology: [excel2xml_sample_onto.json](assets/templates/excel2xml_sample_onto.json) - - sample script: [excel2xml_sample_script.py](assets/templates/excel2xml_sample_script.py) diff --git a/knora/dsplib/models/propertyelement.py b/knora/dsplib/models/propertyelement.py index eb3291a42..ffa2e981d 100644 --- a/knora/dsplib/models/propertyelement.py +++ b/knora/dsplib/models/propertyelement.py @@ -1,6 +1,4 @@ from typing import Union, Optional -import pandas as pd -import regex from dataclasses import dataclass from knora.dsplib.models.helpers import BaseError @@ -10,13 +8,13 @@ class PropertyElement: """ A PropertyElement object carries more information about a property value than the value itself. The "value" is the value that could be passed to a method as plain string/int/float/bool. Use a PropertyElement - instead to define more precisely what attributes your tag (for example) will have. + instead to define more precisely what attributes your value tag (e.g. , , ...) will have. Args: - value: This is the content that will be written between the tags (for example) + value: This is the content that will be written into the value tag (e.g. , , ...) permissions: This is the permissions that your tag (for example) will have comment: This is the comment that your tag (for example) will have - encoding: For tags only. Can be "xml" or "utf8". + encoding: For tags only. If provided, it must be "xml" or "utf8". Examples: See the difference between the first and the second example: @@ -40,15 +38,5 @@ class PropertyElement: encoding: Optional[str] = None def __post_init__(self) -> None: - if not any([ - isinstance(self.value, int), - isinstance(self.value, float) and pd.notna(self.value), # necessary because isinstance(np.nan, float) - isinstance(self.value, bool), - isinstance(self.value, str) and all([ - regex.search(r"\p{L}|\d|_", self.value, flags=regex.UNICODE), - not bool(regex.search(r"^(none||-|n/a)$", self.value, flags=regex.IGNORECASE)) - ]) - ]): - raise BaseError(f"'{self.value}' is not a valid value for a PropertyElement") if self.encoding not in ["utf8", "xml", None]: raise BaseError(f"'{self.encoding}' is not a valid encoding for a PropertyElement") diff --git a/knora/dsplib/utils/shared.py b/knora/dsplib/utils/shared.py index a99fd86ce..7c7f74811 100644 --- a/knora/dsplib/utils/shared.py +++ b/knora/dsplib/utils/shared.py @@ -174,7 +174,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, underscore, or number, but not "None", "", "N/A", or "-" + - a string with at least one Unicode letter (matching the regex ``\\p{L}``), underscore, !, ?, or number, but not + "None", "", "N/A", or "-" - a PropertyElement whose "value" fulfills the above criteria Args: @@ -195,7 +196,7 @@ def check_notna(value: Optional[Any]) -> bool: return True elif isinstance(value, str): return all([ - regex.search(r"\p{L}|\d|_", value, flags=regex.UNICODE), + regex.search(r"[\p{L}\d_!?]", value, flags=regex.UNICODE), not bool(regex.search(r"^(none||-|n/a)$", value, flags=regex.IGNORECASE)) ]) else: diff --git a/knora/excel2xml.py b/knora/excel2xml.py index af6e79a0e..aa009174a 100644 --- a/knora/excel2xml.py +++ b/knora/excel2xml.py @@ -18,37 +18,32 @@ from knora.dsplib.models.propertyelement import PropertyElement from knora.dsplib.utils.shared import simplify_name, check_notna -############################## -# global variables and classes -############################## + xml_namespace_map = { None: "https://dasch.swiss/schema", "xsi": "http://www.w3.org/2001/XMLSchema-instance" } -########### -# functions -########### def make_xsd_id_compatible(string: str) -> str: """ - Make a string compatible with the constraints of xsd:ID as defined in http://www.datypic.com/sc/xsd/t-xsd_ID.html. - An xsd:ID cannot contain special characters, and it must be unique in the document. + Make a string compatible with the constraints of xsd:ID, so that it can be used as "id" attribute of a + tag. An xsd:ID must not contain special characters, and it must be unique in the document. This method replaces the illegal characters by "_" and appends a random number to the string to make it unique. - The string must contain at least one word-character (regex [A-Za-z0-9_]), but must not be "None", "", "N/A", or - "-". In such cases, a BaseError is thrown. + The string must contain at least one Unicode letter (matching the regex ``\\p{L}``), underscore, !, ?, or number, + but must not be "None", "", "N/A", or "-". Otherwise, a BaseError will be raised. Args: - string: string which to make the xsd:ID from + string: input string Returns: - an `xsd:ID` based on string + an xsd:ID based on the input string """ if not isinstance(string, str) or not check_notna(string): - raise BaseError(f"The string {string} cannot be made an xsd:ID") + raise BaseError(f"The input '{string}' cannot be transformed to an xsd:ID") # if start of string is neither letter nor underscore, add an underscore res = re.sub(r"^(?=[^A-Za-z_])", "_", string) @@ -69,7 +64,8 @@ def find_date_in_string(string: str, calling_resource: str = "") -> Optional[str DSP-formatted string. Returns None if no date was found. Notes: - - Assumes Christian era (no BC dates) and Gregorian calendar. + - All dates are interpreted in the Christian era and the Gregorian calendar. There is no support for BC dates or + non-Gregorian calendars. - The years 0000-2999 are supported, in 4-digit form. - Dates written with slashes are always interpreted in a European manner: 5/11/2021 is the 5th of November. @@ -165,8 +161,6 @@ def find_date_in_string(string: str, calling_resource: str = "") -> Optional[str startdate = datetime.date(year, month, day) enddate = startdate except ValueError: - warnings.warn(f"Date parsing error in resource {calling_resource}: '{iso_date.group(0)}' is not a valid " - f"date", stacklevel=2) return None elif eur_date_range: @@ -182,8 +176,6 @@ def find_date_in_string(string: str, calling_resource: str = "") -> Optional[str if enddate < startdate: raise ValueError except ValueError: - warnings.warn(f"Date parsing error in resource {calling_resource}: '{eur_date_range.group(0)}' is not a " - f"valid date", stacklevel=2) return None elif eur_date: @@ -194,8 +186,6 @@ def find_date_in_string(string: str, calling_resource: str = "") -> Optional[str startdate = datetime.date(startyear, startmonth, startday) enddate = startdate except ValueError: - warnings.warn(f"Date parsing error in resource {calling_resource}: '{eur_date.group(0)}' is not a valid " - f"date", stacklevel=2) return None elif monthname_date: @@ -206,8 +196,6 @@ def find_date_in_string(string: str, calling_resource: str = "") -> Optional[str startdate = datetime.date(year, month, day) enddate = startdate except ValueError: - warnings.warn(f"Date parsing error in resource {calling_resource}: '{monthname_date.group(0)}' is not a " - f"valid date", stacklevel=2) return None elif year_range: @@ -229,72 +217,28 @@ def find_date_in_string(string: str, calling_resource: str = "") -> Optional[str return None -def _check_and_prepare_values( - value: Optional[Union[PropertyElement, str, int, float, bool]], - values: Optional[Iterable[Union[PropertyElement, str, int, float, bool]]], - name: str, - calling_resource: str = "" +def prepare_value( + value: Union[PropertyElement, str, int, float, bool, Iterable[Union[PropertyElement, str, int, float, bool]]] ) -> list[PropertyElement]: """ - There is a variety of possibilities how to call a make_*_prop() method. Before such a method can do its job, the - parameters need to be checked and prepared, which is done by this helper method. The parameters "value" and "values" - are passed to it as they were received. This method will then perform the following checks, and throw a BaseError in - case of failure: - - check that exactly one of them contains data, but not both. - - check that the values are usable, and not N/A - - Then, all values are transformed to PropertyElements and returned as a list. In case of a single "value", the - resulting list contains the PropertyElement of this value. + This method transforms the parameter "value" from a make_*_prop() method into a list of PropertyElements. "value" is + passed on to this method as it was received. Args: value: "value" as received from the caller - values: "values" as received from the caller - name: name of the property (for better error messages) - calling_resource: name of the resource (for better error messages) Returns: a list of PropertyElements """ + # make sure that "value" is list-like + if not isinstance(value, Iterable) or isinstance(value, str): + value = [value] - # reduce 'value' to None if it is not usable - if not check_notna(value): - value = None - - # reduce 'values' to None if it is not usable - if values and not any([check_notna(val) for val in values]): - values = None - - # assert that either "value" or "values" is usable, but not both at the same time - if not value and not values: - raise BaseError(f"ERROR in resource '{calling_resource}', property '{name}': 'value' and 'values' cannot both " - f"be empty") - if value and values: - raise BaseError(f"ERROR in resource '{calling_resource}', property '{name}': You cannot provide a 'value' and " - f"a 'values' at the same time!") - - # construct the resulting list - result: list[PropertyElement] = list() - - if value: - # make a PropertyElement out of it, if necessary - if isinstance(value, PropertyElement): - result.append(value) - else: - result.append(PropertyElement(value)) - elif values: - # if "values" contains unusable elements, remove them - multiple_values = [val for val in values if check_notna(val)] - # make a PropertyElement out of them, if necessary - for elem in multiple_values: - if isinstance(elem, PropertyElement): - result.append(elem) - else: - result.append(PropertyElement(elem)) - - return result + # make a PropertyElement out of its elements, if necessary. + return [x if isinstance(x, PropertyElement) else PropertyElement(x) for x in value] -def make_root(shortcode: str, default_ontology: str) -> etree.Element: +def make_root(shortcode: str, default_ontology: str) -> etree._Element: """ Start building your XML document by creating the root element . @@ -326,7 +270,7 @@ def make_root(shortcode: str, default_ontology: str) -> etree.Element: return root -def append_permissions(root_element: etree.Element) -> etree.Element: +def append_permissions(root_element: etree.Element) -> etree._Element: """ After having created a root element, call this method to append the four permissions "res-default", "res-restricted", "prop-default", and "prop-restricted" to it. These four permissions are a good basis to @@ -388,7 +332,7 @@ def make_resource( permissions: str = "res-default", ark: Optional[str] = None, iri: Optional[str] = None -) -> etree.Element: +) -> etree._Element: """ Creates an empty resource element, with the attributes as specified by the arguments @@ -433,9 +377,10 @@ def make_bitstream_prop( path: str, permissions: str = "prop-default", calling_resource: str = "" -) -> etree.Element: +) -> etree._Element: """ - Creates a bitstream element that points to path. + Creates a bitstream element that points to "path". If "path" doesn't point to a valid file, a warning will be + printed to the console, but the script will continue. Args: path: path to a valid file that will be uploaded @@ -443,7 +388,7 @@ def make_bitstream_prop( calling_resource: the name of the parent resource (for better error messages) Returns: - an etree.Element that can be appended to the parent resource with resource.append(make_*_prop(...)) + an etree._Element that can be appended to the parent resource with resource.append(make_*_prop(...)) Examples: >>> resource = make_resource(...) @@ -454,7 +399,8 @@ def make_bitstream_prop( """ if not os.path.isfile(path): - warnings.warn(f"The following is not a valid path: {path} (resource '{calling_resource}')", + warnings.warn(f"Failed validation in bitstream tag of resource '{calling_resource}': The following path " + f"doesn't point to a file: {path}", stacklevel=2) prop_ = etree.Element("{%s}bitstream" % (xml_namespace_map[None]), permissions=permissions, nsmap=xml_namespace_map) @@ -470,29 +416,32 @@ def _format_bool(unformatted: Union[bool, str, int], name: str, calling_resource elif unformatted in (True, "true", "1", 1, "yes"): return "true" else: - raise BaseError(f"Invalid boolean format for prop '{name}' in resource '{calling_resource}': '{unformatted}'") + raise BaseError(f"Failed validation in resource '{calling_resource}', property '{name}': " + f"'{unformatted}' is not a valid boolean.") def make_boolean_prop( name: str, value: Union[PropertyElement, str, int, bool], calling_resource: str = "" -) -> etree.Element: +) -> etree._Element: """ Make a from a boolean value. The value can be provided directly or inside a PropertyElement. The following formats are supported: - true: (True, "true", "True", "1", 1, "yes", "Yes") - false: (False, "false", "False", "0", 0, "no", "No") - Unless provided as PropertyElement, the permission for every value is "prop-default". + If the value is not a valid boolean, a BaseError will be raised. + + Unless provided as PropertyElement, the permissions of the value default to "prop-default". Args: name: the name of this property as defined in the onto - value: a str/bool/int itself or inside a PropertyElement + value: a boolean value as str/bool/int, or as str/bool/int inside a PropertyElement calling_resource: the name of the parent resource (for better error messages) Returns: - an etree.Element that can be appended to the parent resource with resource.append(make_*_prop(...)) + an etree._Element that can be appended to the parent resource with resource.append(make_*_prop(...)) Examples: >>> make_boolean_prop(":testproperty", "no") @@ -513,7 +462,8 @@ def make_boolean_prop( elif isinstance(value, str) or isinstance(value, bool) or isinstance(value, int): value_new = PropertyElement(_format_bool(value, name, calling_resource)) else: - raise BaseError(f"Invalid boolean format for prop '{name}' in resource '{calling_resource}': '{value}'") + raise BaseError(f"Failed validation in resource '{calling_resource}', property '{name}': " + f"'{value}' is not a valid boolean.") # make xml structure of the value prop_ = etree.Element( @@ -537,25 +487,22 @@ def make_boolean_prop( def make_color_prop( name: str, - value: Optional[Union[PropertyElement, str]] = None, - values: Optional[Iterable[Union[PropertyElement, str]]] = None, + value: Union[PropertyElement, str, Iterable[Union[PropertyElement, str]]], calling_resource: str = "" -) -> etree.Element: +) -> etree._Element: """ Make a from one or more colors. The color(s) can be provided as string or as PropertyElement with a - string inside. If provided as string, the permission for every value is "prop-default". + string inside. If provided as string, the permissions default to "prop-default". - To create one ```` child, use the param ``value``, to create more than one ```` children, use - ``values``. + If the value is not a valid color, a BaseError will be raised. Args: name: the name of this property as defined in the onto - value: a string/PropertyElement - values: an iterable of (usually distinct) strings/PropertyElements + value: one or more DSP color(s), as string/PropertyElement, or as iterable of strings/PropertyElements calling_resource: the name of the parent resource (for better error messages) Returns: - an etree.Element that can be appended to the parent resource with resource.append(make_*_prop(...)) + an etree._Element that can be appended to the parent resource with resource.append(make_*_prop(...)) Examples: >>> make_color_prop(":testproperty", "#00ff66") @@ -566,7 +513,7 @@ def make_color_prop( #00ff66 - >>> make_color_prop(":testproperty", values=["#00ff66", "#000000"]) + >>> make_color_prop(":testproperty", ["#00ff66", "#000000"]) #00ff66 #000000 @@ -576,25 +523,21 @@ def make_color_prop( """ # check the input: prepare a list with valid values - values_new = _check_and_prepare_values( - value=value, - values=values, - name=name, - calling_resource=calling_resource - ) + values = prepare_value(value) # check value type - for val in values_new: + for val in values: if not re.search(r"^#[0-9a-f]{6}$", str(val.value).strip(), flags=re.IGNORECASE): - raise BaseError(f"Invalid color format for prop '{name}' in resource '{calling_resource}': '{val.value}'") + raise BaseError(f"Failed validation in resource '{calling_resource}', property '{name}': " + f"'{val.value}' is not a valid color.") - # make xml structure of the value + # make xml structure of the valid values prop_ = etree.Element( "{%s}color-prop" % (xml_namespace_map[None]), name=name, nsmap=xml_namespace_map ) - for val in values_new: + for val in values: kwargs = {"permissions": val.permissions} if check_notna(val.comment): kwargs["comment"] = val.comment @@ -611,24 +554,22 @@ def make_color_prop( def make_date_prop( name: str, - value: Optional[Union[PropertyElement, str]] = None, - values: Optional[Iterable[Union[PropertyElement, str]]] = None, + value: Union[PropertyElement, str, Iterable[Union[PropertyElement, str]]], calling_resource: str = "" -) -> etree.Element: +) -> etree._Element: """ Make a from one or more dates/date ranges. The date(s) can be provided as string or as PropertyElement - with a string inside. If provided as string, the permission for every value is "prop-default". + with a string inside. If provided as string, the permissions default to "prop-default". - To create one ```` child, use the param ``value``, to create more than one ```` children, use ``values``. + If the value is not a valid DSP date, a BaseError will be raised. Args: name: the name of this property as defined in the onto - value: a string/PropertyElement - values: an iterable of (usually distinct) strings/PropertyElements + value: one or more DSP dates, as string/PropertyElement, or as iterable of strings/PropertyElements calling_resource: the name of the parent resource (for better error messages) Returns: - an etree.Element that can be appended to the parent resource with resource.append(make_*_prop(...)) + an etree._Element that can be appended to the parent resource with resource.append(make_*_prop(...)) Examples: >>> make_date_prop(":testproperty", "GREGORIAN:CE:2014-01-31") @@ -641,7 +582,7 @@ def make_date_prop( GREGORIAN:CE:2014-01-31 - >>> make_date_prop(":testproperty", values=["GREGORIAN:CE:1930-09-02:CE:1930-09-03", "GREGORIAN:CE:1930-09-02:CE:1930-09-03"]) + >>> make_date_prop(":testproperty", ["GREGORIAN:CE:1930-09-02:CE:1930-09-03", "GREGORIAN:CE:1930-09-02:CE:1930-09-03"]) GREGORIAN:CE:1930-09-02:CE:1930-09-03 @@ -655,26 +596,22 @@ def make_date_prop( """ # check the input: prepare a list with valid values - values_new = _check_and_prepare_values( - value=value, - values=values, - name=name, - calling_resource=calling_resource - ) + values = prepare_value(value) # check value type - for val in values_new: + for val in values: if not re.search(r"^(GREGORIAN:|JULIAN:)?(CE:|BCE:)?(\d{4})(-\d{1,2})?(-\d{1,2})?" r"((:CE|:BCE)?(:\d{4})(-\d{1,2})?(-\d{1,2})?)?$", str(val.value).strip()): - raise BaseError(f"Invalid date format for prop '{name}' in resource '{calling_resource}': '{val.value}'") + raise BaseError(f"Failed validation in resource '{calling_resource}', property '{name}': " + f"'{val.value}' is not a valid DSP date.") - # make xml structure of the value + # make xml structure of the valid values prop_ = etree.Element( "{%s}date-prop" % (xml_namespace_map[None]), name=name, nsmap=xml_namespace_map ) - for val in values_new: + for val in values: kwargs = {"permissions": val.permissions} if check_notna(val.comment): kwargs["comment"] = val.comment @@ -691,26 +628,23 @@ def make_date_prop( def make_decimal_prop( name: str, - value: Optional[Union[PropertyElement, str]] = None, - values: Optional[Iterable[Union[PropertyElement, str]]] = None, + value: Union[PropertyElement, str, Iterable[Union[PropertyElement, str]]], calling_resource: str = "" -) -> etree.Element: +) -> etree._Element: """ Make a from one or more decimal numbers. The decimal(s) can be provided as string, float, or as - PropertyElement with a string/float inside. If provided as string/float, the permission for every value is + PropertyElement with a string/float inside. If provided as string/float, the permissions default to "prop-default". - To create one ```` child, use the param ``value``, to create more than one ```` children, use - ``values``. + If the value is not a valid decimal number, a BaseError will be raised. Args: name: the name of this property as defined in the onto - value: a string/float/PropertyElement - values: an iterable of distinct strings/PropertyElements + value: one or more decimal numbers, as string/float/PropertyElement, or as iterable of strings/PropertyElements calling_resource: the name of the parent resource (for better error messages) Returns: - an etree.Element that can be appended to the parent resource with resource.append(make_*_prop(...)) + an etree._Element that can be appended to the parent resource with resource.append(make_*_prop(...)) Examples: >>> make_decimal_prop(":testproperty", "3.14159") @@ -721,7 +655,7 @@ def make_decimal_prop( 3.14159 - >>> make_decimal_prop(":testproperty", values=["3.14159", "2.718"]) + >>> make_decimal_prop(":testproperty", ["3.14159", "2.718"]) 3.14159 2.718 @@ -731,25 +665,21 @@ def make_decimal_prop( """ # check the input: prepare a list with valid values - values_new = _check_and_prepare_values( - value=value, - values=values, - name=name, - calling_resource=calling_resource - ) + values = prepare_value(value) # check value type - for val in values_new: + for val in values: if not re.search(r"^\d+\.\d+$", str(val.value).strip()): - raise BaseError(f"Invalid decimal format for prop '{name}' in resource '{calling_resource}': '{val.value}'") + raise BaseError(f"Failed validation in resource '{calling_resource}', property '{name}': " + f"'{val.value}' is not a valid decimal number.") - # make xml structure of the value + # make xml structure of the valid values prop_ = etree.Element( "{%s}decimal-prop" % (xml_namespace_map[None]), name=name, nsmap=xml_namespace_map ) - for val in values_new: + for val in values: kwargs = {"permissions": val.permissions} if check_notna(val.comment): kwargs["comment"] = val.comment @@ -766,25 +696,22 @@ def make_decimal_prop( def make_geometry_prop( name: str, - value: Optional[Union[PropertyElement, str]] = None, - values: Optional[Iterable[Union[PropertyElement, str]]] = None, + value: Union[PropertyElement, str, Iterable[Union[PropertyElement, str]]], calling_resource: str = "" -) -> etree.Element: +) -> etree._Element: """ Make a from one or more areas of an image. The area(s) can be provided as JSON-string or as - PropertyElement with the JSON-string inside. If provided as string, the permission for every value is "prop-default". + PropertyElement with the JSON-string inside. If provided as string, the permissions default to "prop-default". - To create one ```` child, use the param ``value``, to create more than one ```` children, use - ``values``. + If the value is not a valid JSON geometry object, a BaseError is raised. Args: name: the name of this property as defined in the onto - value: a string/PropertyElement - values: an iterable of (usually distinct) strings/PropertyElements + value: one or more JSON geometry objects, as string/PropertyElement, or as iterable of strings/PropertyElements calling_resource: the name of the parent resource (for better error messages) Returns: - an etree.Element that can be appended to the parent resource with resource.append(make_*_prop(...)) + an etree._Element that can be appended to the parent resource with resource.append(make_*_prop(...)) Examples: >>> make_geometry_prop(":testproperty", json_string) @@ -795,7 +722,7 @@ def make_geometry_prop( {JSON} - >>> make_geometry_prop(":testproperty", values=[json_string1, json_string2]) + >>> make_geometry_prop(":testproperty", [json_string1, json_string2]) {JSON} {JSON} @@ -805,30 +732,25 @@ def make_geometry_prop( """ # check the input: prepare a list with valid values - values_new = _check_and_prepare_values( - value=value, - values=values, - name=name, - calling_resource=calling_resource - ) + values = prepare_value(value) # check value type - for val in values_new: + for val in values: try: value_as_dict = json.loads(val.value) - assert value_as_dict["type"] in ["rectangle", "circle"] + assert value_as_dict["type"] in ["rectangle", "circle", "polygon"] assert isinstance(value_as_dict["points"], list) except (json.JSONDecodeError, TypeError, IndexError, KeyError, AssertionError): - raise BaseError(f"Invalid geometry format for prop '{name}' in resource '{calling_resource}': " - f"'{val.value}'") + raise BaseError(f"Failed validation in resource '{calling_resource}', property '{name}': " + f"'{val.value}' is not a valid JSON geometry object.") - # make xml structure of the value + # make xml structure of the valid values prop_ = etree.Element( "{%s}geometry-prop" % (xml_namespace_map[None]), name=name, nsmap=xml_namespace_map ) - for val in values_new: + for val in values: kwargs = {"permissions": val.permissions} if check_notna(val.comment): kwargs["comment"] = val.comment @@ -844,26 +766,23 @@ def make_geometry_prop( def make_geoname_prop( name: str, - value: Optional[Union[PropertyElement, str, int]] = None, - values: Optional[Iterable[Union[PropertyElement, str, int]]] = None, + value: Union[PropertyElement, str, int, Iterable[Union[PropertyElement, str, int]]], calling_resource: str = "" -) -> etree.Element: +) -> etree._Element: """ Make a from one or more geonames.org IDs. The ID(s) can be provided as string, integer, or as - PropertyElement with a string/integer inside. If provided as string/integer, the permission for every value is + PropertyElement with a string/integer inside. If provided as string/integer, the permissions default to "prop-default". - To create one ```` child, use the param ``value``, to create more than one ```` children, use - ``values``. + If the value is not a valid geonames.org identifier, a BaseError will be raised. Args: name: the name of this property as defined in the onto - value: a string/int/PropertyElement - values: an iterable of (usually distinct) strings/ints/PropertyElements + value: one or more geonames.org IDs, as string/int/PropertyElement, or as iterable of strings/ints/PropertyElements calling_resource: the name of the parent resource (for better error messages) Returns: - an etree.Element that can be appended to the parent resource with resource.append(make_*_prop(...)) + an etree._Element that can be appended to the parent resource with resource.append(make_*_prop(...)) Examples: >>> make_geoname_prop(":testproperty", "2761369") @@ -874,7 +793,7 @@ def make_geoname_prop( 2761369 - >>> make_geoname_prop(":testproperty", values=["2761369", "1010101"]) + >>> make_geoname_prop(":testproperty", ["2761369", "1010101"]) 2761369 1010101 @@ -884,24 +803,21 @@ def make_geoname_prop( """ # check the input: prepare a list with valid values - values_new = _check_and_prepare_values( - value=value, - values=values, - name=name, - calling_resource=calling_resource - ) + values = prepare_value(value) # check value type - for val in values_new: + for val in values: if not re.search(r"^[0-9]+$", str(val.value)): - raise BaseError(f"Invalid geoname format for prop '{name}' in resource '{calling_resource}': '{val.value}'") + raise BaseError(f"Failed validation in resource '{calling_resource}', property '{name}': " + f"'{val.value}' is not a geonames.org identifier.") + # make xml structure of the valid values prop_ = etree.Element( "{%s}geoname-prop" % (xml_namespace_map[None]), name=name, nsmap=xml_namespace_map ) - for val in values_new: + for val in values: kwargs = {"permissions": val.permissions} if check_notna(val.comment): kwargs["comment"] = val.comment @@ -918,26 +834,23 @@ def make_geoname_prop( def make_integer_prop( name: str, - value: Optional[Union[PropertyElement, str, int]] = None, - values: Optional[Iterable[Union[PropertyElement, str, int]]] = None, + value: Union[PropertyElement, str, int, Iterable[Union[PropertyElement, str, int]]], calling_resource: str = "" -) -> etree.Element: +) -> etree._Element: """ Make a from one or more integers. The integers can be provided as string, integer, or as - PropertyElement with a string/integer inside. If provided as string/integer, the permission for every value is + PropertyElement with a string/integer inside. If provided as string/integer, the permissions default to "prop-default". - To create one ```` child, use the param ``value``, to create more than one ```` children, use - ``values``. + If the value is not a valid integer, a BaseError will be raised. Args: name: the name of this property as defined in the onto - value: a string/int/PropertyElement - values: an iterable of (usually distinct) strings/ints/PropertyElements + value: one or more integers, as string/int/PropertyElement, or as iterable of strings/ints/PropertyElements calling_resource: the name of the parent resource (for better error messages) Returns: - an etree.Element that can be appended to the parent resource with resource.append(make_*_prop(...)) + an etree._Element that can be appended to the parent resource with resource.append(make_*_prop(...)) Examples: >>> make_integer_prop(":testproperty", "2761369") @@ -948,7 +861,7 @@ def make_integer_prop( 2761369 - >>> make_integer_prop(":testproperty", values=["2761369", "1010101"]) + >>> make_integer_prop(":testproperty", ["2761369", "1010101"]) 2761369 1010101 @@ -958,24 +871,21 @@ def make_integer_prop( """ # check the input: prepare a list with valid values - values_new = _check_and_prepare_values( - value=value, - values=values, - name=name, - calling_resource=calling_resource - ) + values = prepare_value(value) # check value type - for val in values_new: + for val in values: if not re.search(r"^\d+$", str(val.value).strip()): - raise BaseError(f"Invalid integer format for prop '{name}' in resource '{calling_resource}': '{val.value}'") + raise BaseError(f"Failed validation in resource '{calling_resource}', property '{name}': " + f"'{val.value}' is not a valid integer.") + # make xml structure of the valid values prop_ = etree.Element( "{%s}integer-prop" % (xml_namespace_map[None]), name=name, nsmap=xml_namespace_map ) - for val in values_new: + for val in values: kwargs = {"permissions": val.permissions} if check_notna(val.comment): kwargs["comment"] = val.comment @@ -992,25 +902,22 @@ def make_integer_prop( def make_interval_prop( name: str, - value: Optional[Union[PropertyElement, str]] = None, - values: Optional[Iterable[Union[PropertyElement, str]]] = None, + value: Union[PropertyElement, str, Iterable[Union[PropertyElement, str]]], calling_resource: str = "" -) -> etree.Element: +) -> etree._Element: """ - Make a from one or more intervals. The interval(s) can be provided as string or as PropertyElement - with a string inside. If provided as string, the permission for every value is "prop-default". + Make a from one or more DSP intervals. The interval(s) can be provided as string or as + PropertyElement with a string inside. If provided as string, the permissions default to "prop-default". - To create one ```` child, use the param ``value``, to create more than one ```` children, use - ``values``. + If the value is not a valid DSP interval, a BaseError will be raised. Args: name: the name of this property as defined in the onto - value: a string/PropertyElement - values: an iterable of (usually distinct) strings/PropertyElements + value: one or more DSP intervals, as string/PropertyElement, or as iterable of strings/PropertyElements calling_resource: the name of the parent resource (for better error messages) Returns: - an etree.Element that can be appended to the parent resource with resource.append(make_*_prop(...)) + an etree._Element that can be appended to the parent resource with resource.append(make_*_prop(...)) Examples: >>> make_interval_prop(":testproperty", "61:3600") @@ -1021,7 +928,7 @@ def make_interval_prop( 61:3600 - >>> make_interval_prop(":testproperty", values=["61:3600", "60.5:120.5"]) + >>> make_interval_prop(":testproperty", ["61:3600", "60.5:120.5"]) 61:3600 60.5:120.5 @@ -1031,25 +938,21 @@ def make_interval_prop( """ # check the input: prepare a list with valid values - values_new = _check_and_prepare_values( - value=value, - values=values, - name=name, - calling_resource=calling_resource - ) + values = prepare_value(value) # check value type - for val in values_new: + for val in values: if not re.match(r"([+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)):([+-]?([0-9]+([.][0-9]*)?|[.][0-9]+))", str(val.value)): - raise BaseError(f"Invalid integer format for prop '{name}' in resource '{calling_resource}': '{val.value}'") - + raise BaseError(f"Failed validation in resource '{calling_resource}', property '{name}': " + f"'{val.value}' is not a valid DSP interval.") + # make xml structure of the valid values prop_ = etree.Element( "{%s}interval-prop" % (xml_namespace_map[None]), name=name, nsmap=xml_namespace_map ) - for val in values_new: + for val in values: kwargs = {"permissions": val.permissions} if check_notna(val.comment): kwargs["comment"] = val.comment @@ -1067,25 +970,23 @@ def make_interval_prop( def make_list_prop( list_name: str, name: str, - value: Optional[Union[PropertyElement, str]] = None, - values: Optional[Iterable[Union[PropertyElement, str]]] = None, + value: Union[PropertyElement, str, Iterable[Union[PropertyElement, str]]], calling_resource: str = "" -) -> etree.Element: +) -> etree._Element: """ - Make a from one or more list items. The list item(s) can be provided as string or as PropertyElement - with a string inside. If provided as string, the permission for every value is "prop-default". + Make a from one or more list nodes. The name(s) of the list node(s) can be provided as string or as + PropertyElement with a string inside. If provided as string, the permissions default to "prop-default". - To create one ```` child, use the param ``value``, to create more than one ```` children, use ``values``. + If the name of one of the list nodes is not a valid string, a BaseError will be raised. Args: list_name: the name of the list as defined in the onto name: the name of this property as defined in the onto - value: a string/PropertyElement - values: an iterable of (usually distinct) strings/PropertyElements + value: one or more node names, as string/PropertyElement, or as iterable of strings/PropertyElements calling_resource: the name of the parent resource (for better error messages) Returns: - an etree.Element that can be appended to the parent resource with resource.append(make_*_prop(...)) + an etree._Element that can be appended to the parent resource with resource.append(make_*_prop(...)) Examples: >>> make_list_prop("mylist", ":testproperty", "first_node") @@ -1096,7 +997,7 @@ def make_list_prop( first_node - >>> make_list_prop("mylist", ":testproperty", values=["first_node", "second_node"]) + >>> make_list_prop("mylist", ":testproperty", ["first_node", "second_node"]) first_node second_node @@ -1106,17 +1007,13 @@ def make_list_prop( """ # check the input: prepare a list with valid values - values_new = _check_and_prepare_values( - value=value, - values=values, - name=name, - calling_resource=calling_resource - ) + values = prepare_value(value) # check value type - for val in values_new: + for val in values: if not isinstance(val.value, str) or not check_notna(val.value): - raise BaseError(f"Invalid list format for prop '{name}' in resource '{calling_resource}': '{val.value}'") + raise BaseError(f"Failed validation in resource '{calling_resource}', property '{name}': " + f"'{val.value}' is not a valid name of a list node.") # make xml structure of the valid values prop_ = etree.Element( @@ -1125,7 +1022,7 @@ def make_list_prop( name=name, nsmap=xml_namespace_map ) - for val in values_new: + for val in values: kwargs = {"permissions": val.permissions} if check_notna(val.comment): kwargs["comment"] = val.comment @@ -1142,25 +1039,22 @@ def make_list_prop( def make_resptr_prop( name: str, - value: Optional[Union[PropertyElement, str]] = None, - values: Optional[Iterable[Union[PropertyElement, str]]] = None, + value: Union[PropertyElement, str, Iterable[Union[PropertyElement, str]]], calling_resource: str = "" -) -> etree.Element: +) -> etree._Element: """ - Make a from one or more links to other resources. The links(s) can be provided as string or as - PropertyElement with a string inside. If provided as string, the permission for every value is "prop-default". + Make a from one or more IDs of other resources. The ID(s) can be provided as string or as + PropertyElement with a string inside. If provided as string, the permissions default to "prop-default". - To create one ```` child, use the param ``value``, to create more than one ```` children, use - ``values``. + If the ID of one of the target resources is not a valid string, a BaseError will be raised. Args: name: the name of this property as defined in the onto - value: a string/PropertyElement - values: an iterable of (usually distinct) strings/PropertyElements + value: one or more resource identifiers, as string/PropertyElement, or as iterable of strings/PropertyElements calling_resource: the name of the parent resource (for better error messages) Returns: - an etree.Element that can be appended to the parent resource with resource.append(make_*_prop(...)) + an etree._Element that can be appended to the parent resource with resource.append(make_*_prop(...)) Examples: >>> make_resptr_prop(":testproperty", "resource_1") @@ -1171,7 +1065,7 @@ def make_resptr_prop( resource_1 - >>> make_resptr_prop(":testproperty", values=["resource_1", "resource_2"]) + >>> make_resptr_prop(":testproperty", ["resource_1", "resource_2"]) resource_1 resource_2 @@ -1181,17 +1075,13 @@ def make_resptr_prop( """ # check the input: prepare a list with valid values - values_new = _check_and_prepare_values( - value=value, - values=values, - name=name, - calling_resource=calling_resource - ) + values = prepare_value(value) # check value type - for val in values_new: + for val in values: if not isinstance(val.value, str) or not check_notna(val.value): - raise BaseError(f"Invalid resptr format for prop '{name}' in resource '{calling_resource}': '{val.value}'") + raise BaseError(f"Validation Error in resource '{calling_resource}', property '{name}': " + f"The following doesn't seem to be a valid ID of a target resource: '{val.value}'") # make xml structure of the valid values prop_ = etree.Element( @@ -1199,7 +1089,7 @@ def make_resptr_prop( name=name, nsmap=xml_namespace_map ) - for val in values_new: + for val in values: kwargs = {"permissions": val.permissions} if check_notna(val.comment): kwargs["comment"] = val.comment @@ -1216,25 +1106,22 @@ def make_resptr_prop( def make_text_prop( name: str, - value: Optional[Union[PropertyElement, str]] = None, - values: Optional[Iterable[Union[PropertyElement, str]]] = None, + value: Union[PropertyElement, str, Iterable[Union[PropertyElement, str]]], calling_resource: str = "" -) -> etree.Element: +) -> etree._Element: """ - Make a from one or more texts. The text(s) can be provided as string or as PropertyElement with a string - inside. The default encoding is utf8. The default permission for every value is "prop-default". + Make a from one or more strings. The string(s) can be provided as string or as PropertyElement with a + string inside. If provided as string, the encoding defaults to utf8, and the permissions to "prop-default". - To create one ```` child, use the param ``value``, to create more than one ```` - children, use ``values``. + If the value is not a valid string, a BaseError will be raised. Args: name: the name of this property as defined in the onto - value: a string/PropertyElement - values: an iterable of (usually distinct) strings/PropertyElements + value: one or more strings, as string/PropertyElement, or as iterable of strings/PropertyElements calling_resource: the name of the parent resource (for better error messages) Returns: - an etree.Element that can be appended to the parent resource with resource.append(make_*_prop(...)) + an etree._Element that can be appended to the parent resource with resource.append(make_*_prop(...)) Examples: >>> make_text_prop(":testproperty", "first text") @@ -1245,7 +1132,7 @@ def make_text_prop( first text - >>> make_text_prop(":testproperty", values=["first text", "second text"]) + >>> make_text_prop(":testproperty", ["first text", "second text"]) first text second text @@ -1255,17 +1142,13 @@ def make_text_prop( """ # check the input: prepare a list with valid values - values_new = _check_and_prepare_values( - value=value, - values=values, - name=name, - calling_resource=calling_resource - ) + values = prepare_value(value) # check value type - for val in values_new: + for val in values: if not isinstance(val.value, str) or not check_notna(val.value): - raise BaseError(f"Invalid text format for prop '{name}' in resource '{calling_resource}': '{val.value}'") + raise BaseError(f"Failed validation in resource '{calling_resource}', property '{name}': " + f"'{val.value}' is not a valid string.") # make xml structure of the valid values prop_ = etree.Element( @@ -1273,7 +1156,7 @@ def make_text_prop( name=name, nsmap=xml_namespace_map ) - for val in values_new: + for val in values: kwargs = {"permissions": val.permissions} if check_notna(val.comment): kwargs["comment"] = val.comment @@ -1294,26 +1177,23 @@ def make_text_prop( def make_time_prop( name: str, - value: Optional[Union[PropertyElement, str]] = None, - values: Optional[Iterable[Union[PropertyElement, str]]] = None, + value: Union[PropertyElement, str, Iterable[Union[PropertyElement, str]]], calling_resource: str = "" -) -> etree.Element: +) -> etree._Element: """ Make a from one or more datetime values of the form "2009-10-10T12:00:00-05:00". The time(s) can be - provided as string or as PropertyElement with a string inside. If provided as string, the permission for every - value is "prop-default". + provided as string or as PropertyElement with a string inside. If provided as string, the permissions default to + "prop-default". - To create one `` - >>> make_time_prop(":testproperty", values=["2009-10-10T12:00:00-05:00", "1901-01-01T01:00:00-00:00"]) + >>> make_time_prop(":testproperty", ["2009-10-10T12:00:00-05:00", "1901-01-01T01:00:00-00:00"])