Coverage for src / bioimageio / spec / utils.py: 95%

60 statements  

« prev     ^ index     » next       coverage.py v7.13.4, created at 2026-02-17 16:08 +0000

1"""Utility functions for bioimage.io specifications (mostly IO).""" 

2 

3import json 

4import shutil 

5from typing import Any, Dict, List, TypedDict, Union 

6 

7from imageio.v3 import imread # pyright: ignore[reportUnknownVariableType] 

8from loguru import logger 

9from numpy.typing import NDArray 

10 

11from ._description import ensure_description_is_dataset as ensure_description_is_dataset 

12from ._description import ensure_description_is_model as ensure_description_is_model 

13from ._internal._settings import settings 

14from ._internal.io import FileDescr 

15from ._internal.io import download as download 

16from ._internal.io import extract_file_name as extract_file_name 

17from ._internal.io import get_reader as get_reader 

18from ._internal.io import get_sha256 as get_sha256 

19from ._internal.io import ( 

20 identify_bioimageio_yaml_file_name as identify_bioimageio_yaml_file_name, 

21) 

22from ._internal.io import interprete_file_source as interprete_file_source 

23from ._internal.io import is_valid_bioimageio_yaml_name as is_valid_bioimageio_yaml_name 

24from ._internal.io_basics import ZipPath 

25from ._internal.io_utils import load_array as load_array 

26from ._internal.io_utils import open_bioimageio_yaml as open_bioimageio_yaml 

27from ._internal.io_utils import read_yaml as read_yaml 

28from ._internal.io_utils import save_array as save_array 

29from ._internal.io_utils import write_yaml as write_yaml 

30from ._internal.type_guards import is_ndarray 

31from ._internal.types import PermissiveFileSource, RelativeFilePath 

32from ._internal.utils import files 

33 

34get_file_name = extract_file_name 

35 

36 

37class SpdxLicenseEntry(TypedDict): 

38 isDeprecatedLicenseId: bool 

39 isKnownByZenodo: bool 

40 isOsiApproved: bool 

41 licenseId: str 

42 name: str 

43 reference: str 

44 

45 

46class SpdxLicenses(TypedDict): 

47 licenseListVersion: str 

48 licenses: List[SpdxLicenseEntry] 

49 releaseDate: str 

50 

51 

52def get_spdx_licenses() -> SpdxLicenses: 

53 """get details of the SPDX licenses known to bioimageio.spec""" 

54 with ( 

55 files("bioimageio.spec") 

56 .joinpath("static/spdx_licenses.json") 

57 .open("r", encoding="utf-8") 

58 ) as f: 

59 return json.load(f) 

60 

61 

62def get_bioimageio_json_schema() -> Dict[str, Any]: 

63 """get the bioimageio specification as a JSON schema""" 

64 with ( 

65 files("bioimageio.spec") 

66 .joinpath("static/bioimageio_schema.json") 

67 .open("r", encoding="utf-8") 

68 ) as f: 

69 return json.load(f) 

70 

71 

72def load_image(source: Union[FileDescr, ZipPath, PermissiveFileSource]) -> NDArray[Any]: 

73 """load a single image as numpy array 

74 

75 Args: 

76 source: image source 

77 """ 

78 

79 if isinstance(source, (FileDescr, ZipPath)): 

80 parsed_source = source 

81 else: 

82 parsed_source = interprete_file_source(source) 

83 

84 if isinstance(parsed_source, RelativeFilePath): 

85 parsed_source = parsed_source.absolute() 

86 

87 if parsed_source.suffix == ".npy": 

88 image = load_array(parsed_source) 

89 else: 

90 reader = get_reader(parsed_source) 

91 image = imread( # pyright: ignore[reportUnknownVariableType] 

92 reader.read(), extension=parsed_source.suffix 

93 ) 

94 

95 assert is_ndarray(image) 

96 return image 

97 

98 

99def empty_cache(): 

100 """Empty the bioimageio disk cache.""" 

101 

102 shutil.rmtree(settings.cache_path) 

103 settings.cache_path.mkdir(parents=True, exist_ok=True) 

104 logger.info("Emptied cache at {}", settings.cache_path)