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