diff --git a/planemo/autoupdate.py b/planemo/autoupdate.py index 289738ac1..34ea33667 100644 --- a/planemo/autoupdate.py +++ b/planemo/autoupdate.py @@ -28,6 +28,7 @@ from planemo.io import ( error, info, + warn, ) from planemo.workflow_lint import ( find_repos_from_tool_id, @@ -78,6 +79,18 @@ def get_tokens(xml_tree: ElementTree) -> Dict[str, Dict[str, Optional[str]]]: return tokens +def parse_version(version: str) -> packaging.version.Version: + """ + Parse a version string into a Version object. + If the version string is not PEP 440 compliant, return Version("0"). + """ + try: + return packaging.version.parse(version) + except packaging.version.InvalidVersion as e: + warn(e) + return packaging.version.Version("0") + + def check_conda(package_name: str, ctx: "PlanemoCliContext", **kwds) -> str: """ Get the most up-to-date conda version for a package. @@ -89,7 +102,7 @@ def check_conda(package_name: str, ctx: "PlanemoCliContext", **kwds) -> str: search_results = itertools.chain.from_iterable( n["versions"] for n in r.json() if n["name"] == package_name and n["owner"] in kwds["conda_ensure_channels"] ) - return sorted(search_results, key=packaging.version.parse, reverse=True)[0] + return sorted(search_results, key=parse_version, reverse=True)[0] target = conda_util.CondaTarget(package_name) best_search_results = conda_util.best_search_result(target, conda_context=conda_context) @@ -289,7 +302,7 @@ def _update_wf(config: "LocalGalaxyConfig", workflow_id: str, instance: bool = F def get_newest_tool_id(tool_ids: List[str]) -> str: return sorted( tool_ids, - key=lambda n: packaging.version.parse(n.split("/")[-1]), + key=lambda n: parse_version(n.split("/")[-1]), )[-1]