Coverage for src/bioimageio/spec/generic/_v0_3_converter.py: 80%
66 statements
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-15 15:08 +0000
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-15 15:08 +0000
1import collections.abc
2import string
3from pathlib import Path
5import imageio
6from loguru import logger
7from packaging.version import Version
9from .._internal.io import (
10 BioimageioYamlContent,
11 extract_file_name,
12 interprete_file_source,
13)
14from .._internal.type_guards import is_list
15from ._v0_2_converter import convert_from_older_format as convert_from_older_format_v0_2
18def convert_from_older_format(data: BioimageioYamlContent) -> None:
19 """convert raw RDF data of an older format where possible"""
20 # check if we have future format version
21 fv_raw = data.get("format_version", "0.2.0")
22 if fv_raw is None or not isinstance(fv_raw, str):
23 fv = None
24 else:
25 try:
26 fv = Version(fv_raw)
27 except Exception:
28 fv = None
30 if fv is None:
31 return
33 if fv < Version("0.3"):
34 convert_from_older_format_v0_2(data)
36 convert_attachments(data)
37 convert_cover_images(data)
39 _ = data.pop("download_url", None)
40 _ = data.pop("rdf_source", None)
42 if "name" in data and isinstance(data["name"], str):
43 data["name"] = "".join(
44 c if c in string.ascii_letters + string.digits + "_+- ()" else " "
45 for c in data["name"]
46 )[:128]
48 if fv < Version("0.3.4"):
49 convert_plain_covers_and_docs_and_icon(data)
51 data["format_version"] = "0.3.4"
54def convert_attachments(data: BioimageioYamlContent) -> None:
55 a = data.get("attachments")
56 if isinstance(a, collections.abc.Mapping):
57 data["attachments"] = tuple({"source": file} for file in a.get("files", [])) # type: ignore
60def convert_cover_images(data: BioimageioYamlContent) -> None:
61 covers = data.get("covers")
62 if not isinstance(covers, list):
63 return
65 for i in range(len(covers)):
66 c = covers[i]
67 if not isinstance(c, str):
68 continue
70 src = interprete_file_source(c)
71 fname = extract_file_name(src)
73 if not (fname.endswith(".tif") or fname.endswith(".tiff")):
74 continue
76 try:
77 image = imageio.imread(c)
78 c_path = (Path(".bioimageio_converter_cache") / fname).with_suffix(".png")
79 imageio.imwrite(c_path, image)
80 covers[i] = str(c_path.absolute())
81 except Exception as e:
82 logger.warning("failed to convert tif cover image: {}", e)
85def convert_plain_covers_and_docs_and_icon(data: BioimageioYamlContent) -> None:
86 doc = data.get("documentation")
87 if isinstance(doc, str):
88 data["documentation"] = {"source": doc}
90 covers = data.get("covers")
91 if is_list(covers):
92 for i in range(len(covers)):
93 c = covers[i]
94 if isinstance(c, str):
95 covers[i] = {"source": c}
97 icon = data.get("icon")
98 if isinstance(icon, str) and len(icon) > 2:
99 data["icon"] = {"source": icon}