From 5ffb743ef8796088a98814c7255bdcb9ddb43079 Mon Sep 17 00:00:00 2001 From: fschrader1992 Date: Sat, 10 Aug 2019 00:43:17 +0200 Subject: [PATCH 01/15] [tools/xmlparser.py] Object Creation Errors to Warnings in Save Mode If ignore_errors is set, errors from object creation are converted to warnings. Related to issue #276. --- odml/tools/xmlparser.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/odml/tools/xmlparser.py b/odml/tools/xmlparser.py index 70b3bb3d..a7e1a4d6 100644 --- a/odml/tools/xmlparser.py +++ b/odml/tools/xmlparser.py @@ -310,7 +310,12 @@ def parse_tag(self, root, fmt, insert_children=True): self.check_mandatory_arguments(check_args, fmt, root.tag, root) # Instantiate the current odML object with the parsed attributes. - obj = fmt.create(**arguments) + # Return None, if + obj = None + try: + obj = fmt.create(**arguments) + except Exception as e: + self.error(str(e), root) if insert_children: for child in children: From 45ca2bc0d414e3b75d7d5f6fa4f1f0a2f73bf4a9 Mon Sep 17 00:00:00 2001 From: fschrader1992 Date: Sat, 10 Aug 2019 00:45:06 +0200 Subject: [PATCH 02/15] [text_parser_xml.py] Add Test for ignore_errors Mode Including sample file. Related to issue #276. --- test/resources/ignore_errors.xml | 37 ++++++++++++++++++++++++++++++++ test/test_parser_xml.py | 7 ++++++ 2 files changed, 44 insertions(+) create mode 100644 test/resources/ignore_errors.xml diff --git a/test/resources/ignore_errors.xml b/test/resources/ignore_errors.xml new file mode 100644 index 00000000..9e87aac3 --- /dev/null +++ b/test/resources/ignore_errors.xml @@ -0,0 +1,37 @@ + + + + + D. N. Adams + http://portal.g-node.org/odml/terminologies/v1.1/terminologies.xml +
+ + int + [zergrve sdic, 1] + ["string 1", "string 2"] + The Hitchhiker's guide to the Galaxy (novel) + wrongid + NoCrewMembers + Number of crew members + + crew + Information on the crew + 0f96a050-2d9b-498f-a532-fbfcc6aae55e + TheCrew +
+ + string + [1, 2] + wrongid2 + Nickname + Nickname(s) of the subject + + crew/person + Information on Arthur Dent + 1d6469b5-5322-408b-916e-3224b7a22008 +
+
+ 1979-10-12 + 79b613eb-a256-46bf-84f6-207df465b8f7 + new version +
diff --git a/test/test_parser_xml.py b/test/test_parser_xml.py index c7bbb747..e28600d9 100644 --- a/test/test_parser_xml.py +++ b/test/test_parser_xml.py @@ -12,6 +12,7 @@ def setUp(self): self.basepath = os.path.join(dir_path, "resources") self.xml_reader = xmlparser.XMLReader() + self.xml_reader_ignore = xmlparser.XMLReader(ignore_errors=True) def test_invalid_root(self): filename = "invalid_root.xml" @@ -36,3 +37,9 @@ def test_invalid_version(self): with self.assertRaises(InvalidVersionException): _ = self.xml_reader.from_file(os.path.join(self.basepath, filename)) + + def test_ignore_errors(self): + filename = "ignore_errors.xml" + + doc = self.xml_reader_ignore.from_file(os.path.join(self.basepath, filename)) + doc.pprint() From 4e4cdae9950638237b27636f17229b4181b7e943 Mon Sep 17 00:00:00 2001 From: fschrader1992 Date: Mon, 12 Aug 2019 12:18:00 +0200 Subject: [PATCH 03/15] [RDFWriter] Fix Broken Install Via Manifest By adding section_subclasses.yaml to MANIFEST the quick fix in rdf_converter.py/RDFWriter is replaced. Related to issue #212. --- MANIFEST.in | 1 + odml/tools/rdf_converter.py | 13 ++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index 00ee1263..cdd06f95 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,4 @@ include LICENSE include README.rst include odml/info.json +include doc/section_subclasses.yaml diff --git a/odml/tools/rdf_converter.py b/odml/tools/rdf_converter.py index 143691ef..f316d4fc 100644 --- a/odml/tools/rdf_converter.py +++ b/odml/tools/rdf_converter.py @@ -49,13 +49,12 @@ def __init__(self, odml_documents): subclass_path = os.path.join(dirname(dirname(dirname(abspath(__file__)))), 'doc', 'section_subclasses.yaml') - if os.path.isfile(subclass_path): - with open(subclass_path, "r") as f: - try: - self.section_subclasses = yaml.load(f) - except yaml.parser.ParserError as err: - print(err) - return + with open(subclass_path, "r") as f: + try: + self.section_subclasses = yaml.load(f) + except yaml.parser.ParserError as err: + print(err) + return def convert_to_rdf(self): self.hub_root = URIRef(odmlns.Hub) From a502115c8504ce8f9a275bd654c31fda09386d47 Mon Sep 17 00:00:00 2001 From: fschrader1992 Date: Mon, 12 Aug 2019 12:19:22 +0200 Subject: [PATCH 04/15] [doc.py] Fix Wrong Indentation for pprint() --- odml/doc.py | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/odml/doc.py b/odml/doc.py index 4a33ccea..9fb01ce9 100644 --- a/odml/doc.py +++ b/odml/doc.py @@ -141,21 +141,22 @@ def get_terminology_equivalent(self): return None term = terminology.load(self.repository) return term -def pprint(self, indent=2, max_depth=1, max_length=80, current_depth=0): - """ - Pretty print method to visualize Document-Section trees. - - :param indent: number of leading spaces for every child Section or Property. - :param max_depth: maximum number of hierarchical levels printed from the - starting Section. - :param max_length: maximum number of characters printed in one line. - :param current_depth: number of hierarchical levels printed from the - starting Section. - """ - doc_str = "[{} [{}] {}, sections: {}, repository: {}]".format(self.author, self.version, - self.date, len(self._sections), self.repository) - print(doc_str) - for s in self._sections: - s.pprint(current_depth=current_depth+1, max_depth=max_depth, - indent=indent, max_length=max_length) + def pprint(self, indent=2, max_depth=1, max_length=80, current_depth=0): + """ + Pretty print method to visualize Document-Section trees. + + :param indent: number of leading spaces for every child Section or Property. + :param max_depth: maximum number of hierarchical levels printed from the + starting Section. + :param max_length: maximum number of characters printed in one line. + :param current_depth: number of hierarchical levels printed from the + starting Section. + """ + doc_str = "[{} [{}] {}, sections: {}, repository: {}]".format(self.author, self.version, + self.date, len(self._sections), self.repository) + print(doc_str) + + for s in self._sections: + s.pprint(current_depth=current_depth+1, max_depth=max_depth, + indent=indent, max_length=max_length) From 6b688aff20e743beba6ffdb447d515b2d29234c3 Mon Sep 17 00:00:00 2001 From: fschrader1992 Date: Mon, 12 Aug 2019 12:26:42 +0200 Subject: [PATCH 05/15] [rdf_converter.py/RDFWriter] Remove Comment --- odml/tools/rdf_converter.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/odml/tools/rdf_converter.py b/odml/tools/rdf_converter.py index f316d4fc..d94e99f9 100644 --- a/odml/tools/rdf_converter.py +++ b/odml/tools/rdf_converter.py @@ -43,9 +43,6 @@ def __init__(self, odml_documents): self.section_subclasses = {} - # TODO doc/section_subclasses.yaml has to be exported on install, otherwise - # the RDFWriter is broken. Below is a quick and dirty fix to at least - # unbreak on install. subclass_path = os.path.join(dirname(dirname(dirname(abspath(__file__)))), 'doc', 'section_subclasses.yaml') From 09fcb09d17410fe2dec755871980ab92aeea84e7 Mon Sep 17 00:00:00 2001 From: fschrader1992 Date: Wed, 25 Sep 2019 18:16:57 +0200 Subject: [PATCH 06/15] [ignore_errors.xml] Change for Section Testing --- test/resources/ignore_errors.xml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/test/resources/ignore_errors.xml b/test/resources/ignore_errors.xml index 9e87aac3..116a32bb 100644 --- a/test/resources/ignore_errors.xml +++ b/test/resources/ignore_errors.xml @@ -26,9 +26,14 @@ Nickname Nickname(s) of the subject - crew/person + + int + 535 + wrongid3 + Nickname(s) of the subject + + ADent Information on Arthur Dent - 1d6469b5-5322-408b-916e-3224b7a22008 1979-10-12 From 171a20f35c5d7bf7ba2b6e02601ff5bf6993a87a Mon Sep 17 00:00:00 2001 From: fschrader1992 Date: Wed, 25 Sep 2019 18:20:37 +0200 Subject: [PATCH 07/15] [xmlparser.py] ignore_errors: Change Object Initialization From Null to current type (Document, Section, Property). Related to issue #276. --- odml/tools/xmlparser.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/odml/tools/xmlparser.py b/odml/tools/xmlparser.py index a7e1a4d6..5094a5f6 100644 --- a/odml/tools/xmlparser.py +++ b/odml/tools/xmlparser.py @@ -11,6 +11,7 @@ # this is needed for py2exe to include lxml completely from lxml import _elementpath as _dummy from os.path import basename +import uuid try: from StringIO import StringIO @@ -310,8 +311,7 @@ def parse_tag(self, root, fmt, insert_children=True): self.check_mandatory_arguments(check_args, fmt, root.tag, root) # Instantiate the current odML object with the parsed attributes. - # Return None, if - obj = None + obj = fmt.create() try: obj = fmt.create(**arguments) except Exception as e: From d18e5beb20e03e8bd92c5c5f1edb082749fc284b Mon Sep 17 00:00:00 2001 From: fschrader1992 Date: Wed, 25 Sep 2019 18:29:41 +0200 Subject: [PATCH 08/15] [rdf_converter.py] Add subclass_path Check Again --- odml/tools/rdf_converter.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/odml/tools/rdf_converter.py b/odml/tools/rdf_converter.py index d94e99f9..ceb18885 100644 --- a/odml/tools/rdf_converter.py +++ b/odml/tools/rdf_converter.py @@ -46,12 +46,13 @@ def __init__(self, odml_documents): subclass_path = os.path.join(dirname(dirname(dirname(abspath(__file__)))), 'doc', 'section_subclasses.yaml') - with open(subclass_path, "r") as f: - try: - self.section_subclasses = yaml.load(f) - except yaml.parser.ParserError as err: - print(err) - return + if os.path.isfile(subclass_path): + with open(subclass_path, "r") as f: + try: + self.section_subclasses = yaml.load(f) + except yaml.parser.ParserError as err: + print(err) + return def convert_to_rdf(self): self.hub_root = URIRef(odmlns.Hub) From b209dc07d8d094ab21bc4e7bcf37e9f526004eef Mon Sep 17 00:00:00 2001 From: fschrader1992 Date: Wed, 25 Sep 2019 19:14:23 +0200 Subject: [PATCH 09/15] [ignore_errors.xml] Add Further Test Cases Related to issue #276. --- test/resources/ignore_errors.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/resources/ignore_errors.xml b/test/resources/ignore_errors.xml index 116a32bb..1d71a905 100644 --- a/test/resources/ignore_errors.xml +++ b/test/resources/ignore_errors.xml @@ -5,6 +5,10 @@ D. N. Adams http://portal.g-node.org/odml/terminologies/v1.1/terminologies.xml
+ + int + 123 + int [zergrve sdic, 1] @@ -14,6 +18,13 @@ NoCrewMembers Number of crew members + + NoBones + + 235 + wrongid4 + Number of bones within the crew member. + crew Information on the crew 0f96a050-2d9b-498f-a532-fbfcc6aae55e From 8f18f02fea36b38912c28b340a95f622a623dd42 Mon Sep 17 00:00:00 2001 From: fschrader1992 Date: Wed, 25 Sep 2019 19:17:06 +0200 Subject: [PATCH 10/15] [xmlparser.py] Catch ValueError at Object Creation Add more Specific Error Message. Related to issue #276. --- odml/tools/xmlparser.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/odml/tools/xmlparser.py b/odml/tools/xmlparser.py index 5094a5f6..fc7b640f 100644 --- a/odml/tools/xmlparser.py +++ b/odml/tools/xmlparser.py @@ -314,8 +314,8 @@ def parse_tag(self, root, fmt, insert_children=True): obj = fmt.create() try: obj = fmt.create(**arguments) - except Exception as e: - self.error(str(e), root) + except ValueError: + self.error("ValueError: Values '%s' do not match given DType '%s'!" % (arguments['values'], arguments['dtype']), root) if insert_children: for child in children: From 9beda5880e735b412ebecac6215a4b87fcb0ae44 Mon Sep 17 00:00:00 2001 From: fschrader1992 Date: Wed, 25 Sep 2019 19:18:53 +0200 Subject: [PATCH 11/15] [xmlparser.py] Remove Useless Import Statement Related to issue #276. --- odml/tools/xmlparser.py | 1 - 1 file changed, 1 deletion(-) diff --git a/odml/tools/xmlparser.py b/odml/tools/xmlparser.py index fc7b640f..97bf7bd6 100644 --- a/odml/tools/xmlparser.py +++ b/odml/tools/xmlparser.py @@ -11,7 +11,6 @@ # this is needed for py2exe to include lxml completely from lxml import _elementpath as _dummy from os.path import basename -import uuid try: from StringIO import StringIO From 5991ededf4b26d05596a8c255d995b5c47fe26d5 Mon Sep 17 00:00:00 2001 From: fschrader1992 Date: Wed, 25 Sep 2019 19:21:30 +0200 Subject: [PATCH 12/15] [xmlparser.py] Whitespace Adjustments in Error Messages --- odml/tools/xmlparser.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/odml/tools/xmlparser.py b/odml/tools/xmlparser.py index 97bf7bd6..eed7eaf2 100644 --- a/odml/tools/xmlparser.py +++ b/odml/tools/xmlparser.py @@ -218,12 +218,12 @@ def from_string(self, string): def check_mandatory_arguments(self, data, ArgClass, tag_name, node): for k, v in ArgClass.arguments: if v != 0 and not ArgClass.map(k) in data: - self.error("missing element <%s> within <%s> tag" % + self.error("missing element <%s> within <%s> tag\n" % (k, tag_name) + repr(data), node) def is_valid_argument(self, tag_name, ArgClass, parent_node, child=None): if tag_name not in ArgClass.arguments_keys: - self.error("Invalid element <%s> inside <%s> tag" % + self.error("Invalid element <%s> inside <%s> tag\n" % (tag_name, parent_node.tag), parent_node if child is None else child) @@ -247,7 +247,7 @@ def warn(self, msg, elem): def parse_element(self, node): if node.tag not in self.tags: - self.error("Invalid element <%s>" % node.tag, node) + self.error("Invalid element <%s> " % node.tag, node) return None # won't be able to parse this one return getattr(self, "parse_" + node.tag)(node, self.tags[node.tag]) @@ -273,7 +273,7 @@ def parse_tag(self, root, fmt, insert_children=True): continue # We currently do not support XML attributes. - self.error("Attribute not supported, ignoring '%s=%s'" % (k, v), root) + self.error("Attribute not supported, ignoring '%s=%s' " % (k, v), root) for node in root: node.tag = node.tag.lower() @@ -299,7 +299,7 @@ def parse_tag(self, root, fmt, insert_children=True): else: arguments[tag] = curr_text else: - self.error("Invalid element <%s> in odML document section <%s>" + self.error("Invalid element <%s> in odML document section <%s> " % (node.tag, root.tag), node) if sys.version_info > (3,): @@ -314,7 +314,8 @@ def parse_tag(self, root, fmt, insert_children=True): try: obj = fmt.create(**arguments) except ValueError: - self.error("ValueError: Values '%s' do not match given DType '%s'!" % (arguments['values'], arguments['dtype']), root) + self.error("ValueError: Values '%s' do not match given DType '%s'!" % + (arguments['values'], arguments['dtype']), root) if insert_children: for child in children: From 9c32cfba067fe71d112277700f49d3b59a3aa72e Mon Sep 17 00:00:00 2001 From: fschrader1992 Date: Wed, 25 Sep 2019 19:23:01 +0200 Subject: [PATCH 13/15] [text_parser_xml.py] Check Exceptions of ignore_error.xml File Related to issue #276. --- test/test_parser_xml.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/test_parser_xml.py b/test/test_parser_xml.py index e28600d9..a83ac349 100644 --- a/test/test_parser_xml.py +++ b/test/test_parser_xml.py @@ -41,5 +41,8 @@ def test_invalid_version(self): def test_ignore_errors(self): filename = "ignore_errors.xml" + with self.assertRaises(ParserException): + _ = self.xml_reader.from_file(os.path.join(self.basepath, filename)) + doc = self.xml_reader_ignore.from_file(os.path.join(self.basepath, filename)) doc.pprint() From 420075fe72ccd51d3e6228f034690a9c43d63760 Mon Sep 17 00:00:00 2001 From: fschrader1992 Date: Thu, 26 Sep 2019 16:51:58 +0200 Subject: [PATCH 14/15] [xmlparser.py] Revert Catch ValueError at Object Creation Catch all Exceptions. Related to issue #276. --- odml/tools/xmlparser.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/odml/tools/xmlparser.py b/odml/tools/xmlparser.py index eed7eaf2..1ecea9c2 100644 --- a/odml/tools/xmlparser.py +++ b/odml/tools/xmlparser.py @@ -313,9 +313,8 @@ def parse_tag(self, root, fmt, insert_children=True): obj = fmt.create() try: obj = fmt.create(**arguments) - except ValueError: - self.error("ValueError: Values '%s' do not match given DType '%s'!" % - (arguments['values'], arguments['dtype']), root) + except Exception as e: + self.error(str(e), root) if insert_children: for child in children: From b86309e9dc671bb68d1116ac3a9a9f933e93137c Mon Sep 17 00:00:00 2001 From: fschrader1992 Date: Thu, 26 Sep 2019 16:53:07 +0200 Subject: [PATCH 15/15] [ignore_errors.xml] Add Further Wrong Date Type Test --- test/resources/ignore_errors.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/resources/ignore_errors.xml b/test/resources/ignore_errors.xml index 1d71a905..36d3680e 100644 --- a/test/resources/ignore_errors.xml +++ b/test/resources/ignore_errors.xml @@ -3,7 +3,7 @@ D. N. Adams - http://portal.g-node.org/odml/terminologies/v1.1/terminologies.xml + hello
int @@ -47,7 +47,7 @@ Information on Arthur Dent
- 1979-10-12 + ztuz 79b613eb-a256-46bf-84f6-207df465b8f7 new version