From 60b1a0c5a819c01562546627d943c315693a48f2 Mon Sep 17 00:00:00 2001 From: Lucian Smith Date: Fri, 16 Feb 2024 11:17:28 -0800 Subject: [PATCH 1/7] lxml doesn't have xpath.execute() any more. Suggestion from the lxml mailing list. --- biosimulators_utils/sedml/validation.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/biosimulators_utils/sedml/validation.py b/biosimulators_utils/sedml/validation.py index b29953fc..faa956ff 100644 --- a/biosimulators_utils/sedml/validation.py +++ b/biosimulators_utils/sedml/validation.py @@ -1663,10 +1663,9 @@ def validate_target(target, namespaces, context, language, model_id, model_etree namespaces.pop(None, None) try: - xpath = lxml.etree.XPath(target, namespaces=namespaces) root = lxml.etree.Element("root") try: - xpath.evaluate(root) + xpath = root.xpath(target, namespaces=namespaces) if model_etree and check_in_model_source: if context == DataGenerator and '/@' in target: From ed78b160e66e18cc0e1fcfcd7633f0c5052c28d2 Mon Sep 17 00:00:00 2001 From: Lucian Smith Date: Fri, 16 Feb 2024 11:19:47 -0800 Subject: [PATCH 2/7] Update version number. --- biosimulators_utils/_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/biosimulators_utils/_version.py b/biosimulators_utils/_version.py index b324b3e2..3c136c78 100644 --- a/biosimulators_utils/_version.py +++ b/biosimulators_utils/_version.py @@ -1 +1 @@ -__version__ = '0.1.186' +__version__ = '0.1.187' From f3ab3a8aedf0f20d460ed4f72acbe7bcb3bcbded Mon Sep 17 00:00:00 2001 From: Lucian Smith Date: Fri, 16 Feb 2024 11:59:29 -0800 Subject: [PATCH 3/7] It seems to now be illegal for xpaths to not have namespaces (!) --- tests/sedml/test_sedml_validation.py | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/tests/sedml/test_sedml_validation.py b/tests/sedml/test_sedml_validation.py index f4778561..8d510bbb 100644 --- a/tests/sedml/test_sedml_validation.py +++ b/tests/sedml/test_sedml_validation.py @@ -1318,19 +1318,18 @@ def test_validate_target_xpaths(self): def test_validate_target(self): self.assertEqual(validation.validate_target('/sbml:sbml/sbml:model', - {None: 'sed-ml', 'sbml': 'sbml'}, + {'sbml': 'sbml'}, data_model.Calculation, data_model.ModelLanguage.SBML.value, ''), ([], [['XPath could not be validated.']])) self.assertEqual(validation.validate_target('/sbml:sbml/sbml:model/@sbml:value', - {None: 'sed-ml', 'sbml': 'sbml'}, + {'sbml': 'sbml'}, data_model.Calculation, data_model.ModelLanguage.SBML.value, ''), ([], [['XPath could not be validated.']])) self.assertEqual(validation.validate_target( "/sbml:sbml/sbml:model/qual:listOfQualitativeSpecies/qual:qualitativeSpecies[@qual:id='A']/@qual:level", { - None: 'sed-ml', 'sbml': 'sbml', 'qual': 'qual', }, @@ -1341,7 +1340,6 @@ def test_validate_target(self): self.assertEqual(validation.validate_target( "/sbml/model/qual:listOfQualitativeSpecies/qual:qualitativeSpecies[@qual:id='A']/@qual:level", { - None: 'sed-ml', 'sbml': 'sbml', 'qual': 'qual', }, @@ -1355,7 +1353,6 @@ def test_validate_target(self): self.assertEqual(validation.validate_target( "/sbml:sbml/sbml:model/qual:listOfQualitativeSpecies/qual:qualitativeSpecies[@qual:id='erk']/@qual:compartment", { - None: 'sed-ml', 'sbml': 'http://www.sbml.org/sbml/level3/version1/core', 'qual': 'http://www.sbml.org/sbml/level3/version1/qual/version1', }, @@ -1369,7 +1366,6 @@ def test_validate_target(self): self.assertEqual(validation.validate_target( "/sbml:sbml/sbml:model/qual:listOfQualitativeSpecies/qual:qualitativeSpecies[@qual:id='erk']/@qual:level", { - None: 'sed-ml', 'sbml': 'http://www.sbml.org/sbml/level3/version1/core', 'qual': 'http://www.sbml.org/sbml/level3/version1/qual/version1', }, @@ -1382,7 +1378,7 @@ def test_validate_target(self): self.assertIn('not a valid XML XPath', flatten_nested_list_of_strings(validation.validate_target('/sbml:sbml@sbml:model', - {None: 'sed-ml', 'sbml': 'sbml'}, + {'sbml': 'sbml'}, data_model.Calculation, data_model.ModelLanguage.SBML.value, '')[0])) self.assertIn('No namespaces are defined', @@ -1400,7 +1396,6 @@ def test_validate_target(self): flatten_nested_list_of_strings(validation.validate_target( "/sbml:sbml/sbml:model/qual:listOfQualitativeSpecies/qual:qualitativeSpecies[@qual:id='erk']/@qual:level", { - None: 'sed-ml', 'sbml': 'http://www.sbml.org/sbml/level3/version1/core', 'qual': 'http://www.sbml.org/sbml/level3/version1/qual/version1', }, @@ -1415,7 +1410,6 @@ def test_validate_target(self): flatten_nested_list_of_strings(validation.validate_target( "/sbml:sbml/sbml:model/qual:listOfQualitativeSpecies/qual:qualitativeSpecies[@qual:id='ERK']/@qual:compartment", { - None: 'sed-ml', 'sbml': 'http://www.sbml.org/sbml/level3/version1/core', 'qual': 'http://www.sbml.org/sbml/level3/version1/qual/version1', }, @@ -1430,7 +1424,6 @@ def test_validate_target(self): flatten_nested_list_of_strings(validation.validate_target( "/sbml:sbml/sbml:model/qual:listOfQualitativeSpecies/qual:qualitativeSpecies", { - None: 'sed-ml', 'sbml': 'http://www.sbml.org/sbml/level3/version1/core', 'qual': 'http://www.sbml.org/sbml/level3/version1/qual/version1', }, From 4da8a725a3e28f04ccb8275fbfc19e2384fde2a4 Mon Sep 17 00:00:00 2001 From: Lucian Smith Date: Fri, 16 Feb 2024 13:41:32 -0800 Subject: [PATCH 4/7] Get 'not a valid XPath' error the old way. --- biosimulators_utils/sedml/validation.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/biosimulators_utils/sedml/validation.py b/biosimulators_utils/sedml/validation.py index faa956ff..bb00e45f 100644 --- a/biosimulators_utils/sedml/validation.py +++ b/biosimulators_utils/sedml/validation.py @@ -1663,9 +1663,10 @@ def validate_target(target, namespaces, context, language, model_id, model_etree namespaces.pop(None, None) try: + xpath = lxml.etree.XPath(target, namespaces=namespaces) root = lxml.etree.Element("root") try: - xpath = root.xpath(target, namespaces=namespaces) + root.xpath(target, namespaces=namespaces) if model_etree and check_in_model_source: if context == DataGenerator and '/@' in target: @@ -1707,6 +1708,8 @@ def validate_target(target, namespaces, context, language, model_id, model_etree ns_message = 'No namespaces are defined for the target.' errors.append(['One or more namespaces required for target `{}` are not defined. {}'.format(target, ns_message)]) + else: + errors.append(['Target `{}` is not a valid XML XPath.'.format(target)]) except lxml.etree.XPathSyntaxError: errors.append(['Target `{}` is not a valid XML XPath.'.format(target)]) From 4fcd82e11a82793a1ce201b57c29249f12a1995b Mon Sep 17 00:00:00 2001 From: Lucian Smith Date: Fri, 16 Feb 2024 13:49:29 -0800 Subject: [PATCH 5/7] Simplify the code a bit. Since the new way of calling 'evaluate' is rolled into the old, our code can be simplified a bit. I think. --- biosimulators_utils/sedml/validation.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/biosimulators_utils/sedml/validation.py b/biosimulators_utils/sedml/validation.py index bb00e45f..603e88a4 100644 --- a/biosimulators_utils/sedml/validation.py +++ b/biosimulators_utils/sedml/validation.py @@ -1662,8 +1662,6 @@ def validate_target(target, namespaces, context, language, model_id, model_etree namespaces = dict(namespaces) namespaces.pop(None, None) - try: - xpath = lxml.etree.XPath(target, namespaces=namespaces) root = lxml.etree.Element("root") try: root.xpath(target, namespaces=namespaces) @@ -1711,8 +1709,6 @@ def validate_target(target, namespaces, context, language, model_id, model_etree else: errors.append(['Target `{}` is not a valid XML XPath.'.format(target)]) - except lxml.etree.XPathSyntaxError: - errors.append(['Target `{}` is not a valid XML XPath.'.format(target)]) return errors, warnings From 892548529c6e28beb45bf7554e39530e30b51df4 Mon Sep 17 00:00:00 2001 From: Lucian Smith Date: Fri, 16 Feb 2024 13:54:02 -0800 Subject: [PATCH 6/7] Fix lint. --- biosimulators_utils/sedml/validation.py | 1 - 1 file changed, 1 deletion(-) diff --git a/biosimulators_utils/sedml/validation.py b/biosimulators_utils/sedml/validation.py index 603e88a4..0c87aaa3 100644 --- a/biosimulators_utils/sedml/validation.py +++ b/biosimulators_utils/sedml/validation.py @@ -1709,7 +1709,6 @@ def validate_target(target, namespaces, context, language, model_id, model_etree else: errors.append(['Target `{}` is not a valid XML XPath.'.format(target)]) - return errors, warnings From 795e370e65f42846e4fed58554abec42986bbb5f Mon Sep 17 00:00:00 2001 From: Lucian Smith Date: Fri, 16 Feb 2024 14:00:58 -0800 Subject: [PATCH 7/7] Revert; old way is only way that works. --- biosimulators_utils/sedml/validation.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/biosimulators_utils/sedml/validation.py b/biosimulators_utils/sedml/validation.py index 0c87aaa3..03b7d879 100644 --- a/biosimulators_utils/sedml/validation.py +++ b/biosimulators_utils/sedml/validation.py @@ -1662,6 +1662,8 @@ def validate_target(target, namespaces, context, language, model_id, model_etree namespaces = dict(namespaces) namespaces.pop(None, None) + try: + xpath = lxml.etree.XPath(target, namespaces=namespaces) root = lxml.etree.Element("root") try: root.xpath(target, namespaces=namespaces) @@ -1706,8 +1708,9 @@ def validate_target(target, namespaces, context, language, model_id, model_etree ns_message = 'No namespaces are defined for the target.' errors.append(['One or more namespaces required for target `{}` are not defined. {}'.format(target, ns_message)]) - else: - errors.append(['Target `{}` is not a valid XML XPath.'.format(target)]) + + except lxml.etree.XPathSyntaxError: + errors.append(['Target `{}` is not a valid XML XPath.'.format(target)]) return errors, warnings