Coverage for src/bioimageio/spec/_update.py: 89%
46 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-18 09:17 +0000
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-18 09:17 +0000
1from __future__ import annotations
3import collections.abc
4import warnings
5from pathlib import Path
6from typing import TextIO
7from zipfile import ZipFile
9from ._description import (
10 LATEST,
11 InvalidDescr,
12 LatestResourceDescr,
13 ResourceDescr,
14 build_description,
15 dump_description,
16)
17from ._internal.common_nodes import ResourceDescrBase
18from ._internal.io import BioimageioYamlContent
19from ._internal.types import PermissiveFileSource
20from ._internal.validation_context import get_validation_context
21from ._io import load_description, save_bioimageio_yaml_only
22from ._package import save_bioimageio_package, save_bioimageio_package_as_folder
25def update_format(
26 source: ResourceDescr
27 | PermissiveFileSource
28 | ZipFile
29 | BioimageioYamlContent
30 | InvalidDescr,
31 /,
32 *,
33 output: Path | TextIO | None = None,
34 exclude_defaults: bool = True,
35 perform_io_checks: bool | None = None,
36) -> 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: PermissiveFileSource | ZipFile | ResourceDescr | BioimageioYamlContent,
94 /,
95) -> 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)