Coverage for src / bioimageio / spec / _update.py: 89%

45 statements  

« prev     ^ index     » next       coverage.py v7.14.0, created at 2026-05-13 11:29 +0000

1import collections.abc 

2import warnings 

3from pathlib import Path 

4from typing import Optional, TextIO, Union 

5from zipfile import ZipFile 

6 

7from ._description import ( 

8 LATEST, 

9 InvalidDescr, 

10 LatestResourceDescr, 

11 ResourceDescr, 

12 build_description, 

13 dump_description, 

14) 

15from ._internal.common_nodes import ResourceDescrBase 

16from ._internal.io import BioimageioYamlContent 

17from ._internal.types import PermissiveFileSource 

18from ._internal.validation_context import get_validation_context 

19from ._io import load_description, save_bioimageio_yaml_only 

20from ._package import save_bioimageio_package, save_bioimageio_package_as_folder 

21 

22 

23def update_format( 

24 source: Union[ 

25 ResourceDescr, 

26 PermissiveFileSource, 

27 ZipFile, 

28 BioimageioYamlContent, 

29 InvalidDescr, 

30 ], 

31 /, 

32 *, 

33 output: Union[Path, TextIO, None] = None, 

34 exclude_defaults: bool = True, 

35 perform_io_checks: Optional[bool] = None, 

36) -> Union[LatestResourceDescr, InvalidDescr]: 

37 """Update a resource description. 

38 

39 Notes: 

40 - Invalid **source** descriptions may fail to update. 

41 - The updated description might be invalid (even if the **source** was valid). 

42 """ 

43 

44 if isinstance(source, ResourceDescrBase): 

45 root = source.root 

46 source = dump_description(source) 

47 else: 

48 root = None 

49 

50 if isinstance(source, collections.abc.Mapping): 

51 descr = build_description( 

52 source, 

53 context=get_validation_context().replace( 

54 root=root, perform_io_checks=perform_io_checks 

55 ), 

56 format_version=LATEST, 

57 ) 

58 

59 else: 

60 descr = load_description( 

61 source, 

62 perform_io_checks=perform_io_checks, 

63 format_version=LATEST, 

64 ) 

65 

66 if output is None: 

67 pass 

68 elif isinstance(output, (str, Path)): 

69 output = Path(output) 

70 if output.suffix in {".yaml", ".yml"}: 

71 save_bioimageio_yaml_only( 

72 descr, file=output, exclude_defaults=exclude_defaults 

73 ) 

74 elif isinstance(descr, InvalidDescr): 

75 output = output.with_name(output.stem + "_invalid.yaml") 

76 warnings.warn( 

77 f"description is invalid, saving bioimageio.yaml to '{output}'" 

78 ) 

79 save_bioimageio_yaml_only( 

80 descr, file=output, exclude_defaults=exclude_defaults 

81 ) 

82 elif not output.suffix: 

83 _ = save_bioimageio_package_as_folder(descr, output_path=output) 

84 else: 

85 _ = save_bioimageio_package(descr, output_path=output) 

86 else: 

87 save_bioimageio_yaml_only(descr, file=output, exclude_defaults=exclude_defaults) 

88 

89 return descr 

90 

91 

92def update_hashes( 

93 source: Union[PermissiveFileSource, ZipFile, ResourceDescr, BioimageioYamlContent], 

94 /, 

95) -> Union[ResourceDescr, InvalidDescr]: 

96 """Update hash values of the files referenced in **source**.""" 

97 if isinstance(source, ResourceDescrBase): 

98 root = source.root 

99 source = dump_description(source) 

100 else: 

101 root = None 

102 

103 context = get_validation_context().replace( 

104 update_hashes=True, root=root, perform_io_checks=True 

105 ) 

106 with context: 

107 if isinstance(source, collections.abc.Mapping): 

108 return build_description(source) 

109 else: 

110 return load_description(source, perform_io_checks=True)