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
« 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
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
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.
39 Notes:
40 - Invalid **source** descriptions may fail to update.
41 - The updated description might be invalid (even if the **source** was valid).
42 """
44 if isinstance(source, ResourceDescrBase):
45 root = source.root
46 source = dump_description(source)
47 else:
48 root = None
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 )
59 else:
60 descr = load_description(
61 source,
62 perform_io_checks=perform_io_checks,
63 format_version=LATEST,
64 )
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)
89 return descr
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
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)