Coverage for bioimageio/spec/dataset/v0_3.py: 98%
47 statements
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-27 09:20 +0000
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-27 09:20 +0000
1from typing import TYPE_CHECKING, Any, ClassVar, Dict, Literal, Optional, cast
3from pydantic import model_validator
5from .._internal.common_nodes import InvalidDescr
6from .._internal.io import FileDescr as FileDescr
7from .._internal.io_basics import Sha256 as Sha256
8from .._internal.url import HttpUrl as HttpUrl
9from ..generic.v0_3 import VALID_COVER_IMAGE_EXTENSIONS as VALID_COVER_IMAGE_EXTENSIONS
10from ..generic.v0_3 import Author as Author
11from ..generic.v0_3 import BadgeDescr as BadgeDescr
12from ..generic.v0_3 import BioimageioConfig as BioimageioConfig
13from ..generic.v0_3 import CiteEntry as CiteEntry
14from ..generic.v0_3 import Config as Config
15from ..generic.v0_3 import DeprecatedLicenseId as DeprecatedLicenseId
16from ..generic.v0_3 import Doi as Doi
17from ..generic.v0_3 import (
18 GenericDescrBase,
19 LinkedResourceBase,
20 _author_conv, # pyright: ignore[reportPrivateUsage]
21 _maintainer_conv, # pyright: ignore[reportPrivateUsage]
22)
23from ..generic.v0_3 import LicenseId as LicenseId
24from ..generic.v0_3 import LinkedResource as LinkedResource
25from ..generic.v0_3 import Maintainer as Maintainer
26from ..generic.v0_3 import OrcidId as OrcidId
27from ..generic.v0_3 import RelativeFilePath as RelativeFilePath
28from ..generic.v0_3 import ResourceId as ResourceId
29from ..generic.v0_3 import Uploader as Uploader
30from ..generic.v0_3 import Version as Version
31from .v0_2 import DatasetDescr as DatasetDescr02
34class DatasetId(ResourceId):
35 pass
38class DatasetDescr(GenericDescrBase):
39 """A bioimage.io dataset resource description file (dataset RDF) describes a dataset relevant to bioimage
40 processing.
41 """
43 implemented_type: ClassVar[Literal["dataset"]] = "dataset"
44 if TYPE_CHECKING:
45 type: Literal["dataset"] = "dataset"
46 else:
47 type: Literal["dataset"]
49 id: Optional[DatasetId] = None
50 """bioimage.io-wide unique resource identifier
51 assigned by bioimage.io; version **un**specific."""
53 parent: Optional[DatasetId] = None
54 """The description from which this one is derived"""
56 source: Optional[HttpUrl] = None
57 """"URL to the source of the dataset."""
59 @model_validator(mode="before")
60 @classmethod
61 def _convert(cls, data: Dict[str, Any], /) -> Dict[str, Any]:
62 if (
63 data.get("type") == "dataset"
64 and isinstance(fv := data.get("format_version"), str)
65 and fv.startswith("0.2.")
66 ):
67 old = DatasetDescr02.load(data)
68 if isinstance(old, InvalidDescr):
69 return data
71 return cast(
72 Dict[str, Any],
73 (cls if TYPE_CHECKING else dict)(
74 attachments=(
75 []
76 if old.attachments is None
77 else [FileDescr(source=f) for f in old.attachments.files]
78 ),
79 authors=[
80 _author_conv.convert_as_dict(a) for a in old.authors
81 ], # pyright: ignore[reportArgumentType]
82 badges=old.badges,
83 cite=[
84 {"text": c.text, "doi": c.doi, "url": c.url} for c in old.cite
85 ], # pyright: ignore[reportArgumentType]
86 config=old.config, # pyright: ignore[reportArgumentType]
87 covers=old.covers,
88 description=old.description,
89 documentation=old.documentation,
90 format_version="0.3.0",
91 git_repo=old.git_repo, # pyright: ignore[reportArgumentType]
92 icon=old.icon,
93 id=None if old.id is None else DatasetId(old.id),
94 license=old.license, # type: ignore
95 links=old.links,
96 maintainers=[
97 _maintainer_conv.convert_as_dict(m) for m in old.maintainers
98 ], # pyright: ignore[reportArgumentType]
99 name=old.name,
100 source=old.source,
101 tags=old.tags,
102 type=old.type,
103 uploader=old.uploader,
104 version=old.version,
105 **(old.model_extra or {}),
106 ),
107 )
109 return data
112class LinkedDataset(LinkedResourceBase):
113 """Reference to a bioimage.io dataset."""
115 id: DatasetId
116 """A valid dataset `id` from the bioimage.io collection."""