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

1import collections.abc 

2import string 

3from pathlib import Path 

4 

5import imageio 

6from loguru import logger 

7from packaging.version import Version 

8 

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 

16 

17 

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 

29 

30 if fv is None: 

31 return 

32 

33 if fv < Version("0.3"): 

34 convert_from_older_format_v0_2(data) 

35 

36 convert_attachments(data) 

37 convert_cover_images(data) 

38 

39 _ = data.pop("download_url", None) 

40 _ = data.pop("rdf_source", None) 

41 

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] 

47 

48 if fv < Version("0.3.4"): 

49 convert_plain_covers_and_docs_and_icon(data) 

50 

51 data["format_version"] = "0.3.4" 

52 

53 

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 

58 

59 

60def convert_cover_images(data: BioimageioYamlContent) -> None: 

61 covers = data.get("covers") 

62 if not isinstance(covers, list): 

63 return 

64 

65 for i in range(len(covers)): 

66 c = covers[i] 

67 if not isinstance(c, str): 

68 continue 

69 

70 src = interprete_file_source(c) 

71 fname = extract_file_name(src) 

72 

73 if not (fname.endswith(".tif") or fname.endswith(".tiff")): 

74 continue 

75 

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) 

83 

84 

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} 

89 

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} 

96 

97 icon = data.get("icon") 

98 if isinstance(icon, str) and len(icon) > 2: 

99 data["icon"] = {"source": icon}