From 89d8c57ee8eb595a77cd2cdf4b4672c69180b685 Mon Sep 17 00:00:00 2001 From: Chris Hennes Date: Fri, 19 May 2023 17:17:29 -0500 Subject: [PATCH] Addon Manager: Improve error handling for Version --- .../AddonManagerTest/app/test_metadata.py | 32 ++++++++----------- src/Mod/AddonManager/addonmanager_metadata.py | 20 ++++++------ 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/src/Mod/AddonManager/AddonManagerTest/app/test_metadata.py b/src/Mod/AddonManager/AddonManagerTest/app/test_metadata.py index ad7d74d54c..6c430f72a9 100644 --- a/src/Mod/AddonManager/AddonManagerTest/app/test_metadata.py +++ b/src/Mod/AddonManager/AddonManagerTest/app/test_metadata.py @@ -243,17 +243,11 @@ class TestMetadataAuxiliaryFunctions(unittest.TestCase): v_list = min_version.version_as_list metadata = Metadata() wb1 = Metadata() - wb1.freecadmin = Version( - from_list=[v_list[0] + 1, v_list[1], v_list[2], v_list[3]] - ) + wb1.freecadmin = Version(from_list=[v_list[0] + 1, v_list[1], v_list[2], v_list[3]]) wb2 = Metadata() - wb2.freecadmin = Version( - from_list=[v_list[0], v_list[1] + 1, v_list[2], v_list[3]] - ) + wb2.freecadmin = Version(from_list=[v_list[0], v_list[1] + 1, v_list[2], v_list[3]]) wb3 = Metadata() - wb3.freecadmin = Version( - from_list=[v_list[0], v_list[1], v_list[2] + 1, v_list[3]] - ) + wb3.freecadmin = Version(from_list=[v_list[0], v_list[1], v_list[2] + 1, v_list[3]]) m1 = Metadata() m1.freecadmin = min_version metadata.content = {"workbench": [wb1, wb2, wb3], "macro": [m1]} @@ -351,6 +345,14 @@ class TestMetadataReader(unittest.TestCase): MetadataReader._parse_child_element("", child, mock_metadata) self.assertEqual(Version("1.2.3"), mock_metadata.version) + def test_parse_child_element_version_bad(self): + from addonmanager_metadata import Metadata, Version, MetadataReader + + mock_metadata = Metadata() + child = self.given_mock_tree_node("version", "1-2-3") + MetadataReader._parse_child_element("", child, mock_metadata) + self.assertEqual(Version("0.0.0"), mock_metadata.version) + def test_parse_child_element_lists_of_strings(self): from addonmanager_metadata import Metadata, MetadataReader @@ -413,9 +415,7 @@ class TestMetadataReader(unittest.TestCase): if type == "repository": branch = f"Branch {i} for {tag}" expected_results.append(Url(location=text, type=url_type, branch=branch)) - child = self.given_mock_tree_node( - tag, text, {"type": type, "branch": branch} - ) + child = self.given_mock_tree_node(tag, text, {"type": type, "branch": branch}) MetadataReader._parse_child_element("", child, mock_metadata) self.assertEqual(len(mock_metadata.__dict__[tag]), 10) self.assertListEqual(mock_metadata.__dict__[tag], expected_results) @@ -448,9 +448,7 @@ class TestMetadataReader(unittest.TestCase): text = f"Test {i} for {tag}" dependency_type = DependencyType(i % len(DependencyType)) dependency_type_str = str(dependency_type) - expected = Dependency( - package=text, dependency_type=dependency_type - ) + expected = Dependency(package=text, dependency_type=dependency_type) expected.__dict__[attribute] = attr_value expected_results.append(expected) child = self.given_mock_tree_node( @@ -548,9 +546,7 @@ class TestMetadataReaderIntegration(unittest.TestCase): self.assertEqual(Version("1.0.1"), metadata.version) self.assertEqual("2022-01-07", metadata.date) self.assertEqual("Resources/icons/PackageIcon.svg", metadata.icon) - self.assertListEqual( - [License(name="LGPLv2.1", file="LICENSE")], metadata.license - ) + self.assertListEqual([License(name="LGPLv2.1", file="LICENSE")], metadata.license) self.assertListEqual( [Contact(name="FreeCAD Developer", email="developer@freecad.org")], metadata.maintainer, diff --git a/src/Mod/AddonManager/addonmanager_metadata.py b/src/Mod/AddonManager/addonmanager_metadata.py index 69e58a4a29..6a72e6d47b 100644 --- a/src/Mod/AddonManager/addonmanager_metadata.py +++ b/src/Mod/AddonManager/addonmanager_metadata.py @@ -273,7 +273,13 @@ class MetadataReader: # Text-only elements metadata.__dict__[tag] = child.text elif tag in ["version", "freecadmin", "freecadmax", "pythonmin"]: - metadata.__dict__[tag] = Version(from_string=child.text) + try: + metadata.__dict__[tag] = Version(from_string=child.text) + except ValueError: + print( + f"Invalid version specified for tag {tag} in Addon {metadata.name}: {child.text}" + ) + metadata.__dict__[tag] = Version(from_list=[0, 0, 0]) elif tag in ["tag", "file"]: # Lists of strings if child.text: @@ -321,9 +327,7 @@ class MetadataReader: v_gte = child.attrib["version_gte"] if "version_gte" in child.attrib else "" v_gt = child.attrib["version_gt"] if "version_gt" in child.attrib else "" condition = child.attrib["condition"] if "condition" in child.attrib else "" - optional = ( - "optional" in child.attrib and child.attrib["optional"].lower() == "true" - ) + optional = "optional" in child.attrib and child.attrib["optional"].lower() == "true" dependency_type = DependencyType.automatic if "type" in child.attrib and child.attrib["type"] in DependencyType.__dict__: dependency_type = DependencyType[child.attrib["type"]] @@ -349,17 +353,13 @@ class MetadataReader: if content_type in known_content_types: if content_type not in metadata.content: metadata.content[content_type] = [] - metadata.content[content_type].append( - MetadataReader._create_node(namespace, child) - ) + metadata.content[content_type].append(MetadataReader._create_node(namespace, child)) @staticmethod def _create_node(namespace, child) -> Metadata: new_content_item = Metadata() for content_child in child: - MetadataReader._parse_child_element( - namespace, content_child, new_content_item - ) + MetadataReader._parse_child_element(namespace, content_child, new_content_item) return new_content_item