Coverage for src/bioimageio/spec/dataset/v0_3.py: 98%

49 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-18 09:17 +0000

1from __future__ import annotations 

2 

3from typing import TYPE_CHECKING, Any, ClassVar, Dict, Literal, cast 

4 

5from pydantic import model_validator 

6 

7from .._internal.common_nodes import InvalidDescr 

8from .._internal.io import FileDescr as FileDescr 

9from .._internal.io_basics import Sha256 as Sha256 

10from .._internal.types import FAIR 

11from .._internal.url import HttpUrl as HttpUrl 

12from ..generic.v0_3 import VALID_COVER_IMAGE_EXTENSIONS as VALID_COVER_IMAGE_EXTENSIONS 

13from ..generic.v0_3 import Author as Author 

14from ..generic.v0_3 import BadgeDescr as BadgeDescr 

15from ..generic.v0_3 import BioimageioConfig as BioimageioConfig 

16from ..generic.v0_3 import CiteEntry as CiteEntry 

17from ..generic.v0_3 import Config as Config 

18from ..generic.v0_3 import DeprecatedLicenseId as DeprecatedLicenseId 

19from ..generic.v0_3 import Doi as Doi 

20from ..generic.v0_3 import ( 

21 GenericDescrBase, 

22 LinkedResourceBase, 

23 _author_conv, # pyright: ignore[reportPrivateUsage] 

24 _maintainer_conv, # pyright: ignore[reportPrivateUsage] 

25) 

26from ..generic.v0_3 import LicenseId as LicenseId 

27from ..generic.v0_3 import LinkedResource as LinkedResource 

28from ..generic.v0_3 import Maintainer as Maintainer 

29from ..generic.v0_3 import OrcidId as OrcidId 

30from ..generic.v0_3 import RelativeFilePath as RelativeFilePath 

31from ..generic.v0_3 import ResourceId as ResourceId 

32from ..generic.v0_3 import Uploader as Uploader 

33from ..generic.v0_3 import Version as Version 

34from .v0_2 import DatasetDescr as DatasetDescr02 

35 

36 

37class DatasetId(ResourceId): 

38 pass 

39 

40 

41class DatasetDescr(GenericDescrBase): 

42 """A bioimage.io dataset resource description file (dataset RDF) describes a dataset relevant to bioimage 

43 processing. 

44 """ 

45 

46 implemented_type: ClassVar[Literal["dataset"]] = "dataset" 

47 if TYPE_CHECKING: 

48 type: Literal["dataset"] = "dataset" 

49 else: 

50 type: Literal["dataset"] 

51 

52 id: DatasetId | None = None 

53 """bioimage.io-wide unique resource identifier 

54 assigned by bioimage.io; version **un**specific.""" 

55 

56 parent: DatasetId | None = None 

57 """The description from which this one is derived""" 

58 

59 source: FAIR[HttpUrl | None] = None 

60 """"URL to the source of the dataset.""" 

61 

62 @model_validator(mode="before") 

63 @classmethod 

64 def _convert(cls, data: dict[str, Any], /) -> dict[str, Any]: 

65 if ( 

66 data.get("type") == "dataset" 

67 and isinstance(fv := data.get("format_version"), str) 

68 and fv.startswith("0.2.") 

69 ): 

70 old = DatasetDescr02.load(data) 

71 if isinstance(old, InvalidDescr): 

72 return data 

73 

74 return cast( 

75 Dict[str, Any], 

76 (cls if TYPE_CHECKING else dict)( 

77 attachments=( 

78 [] 

79 if old.attachments is None 

80 else [FileDescr(source=f) for f in old.attachments.files] 

81 ), 

82 authors=[_author_conv.convert_as_dict(a) for a in old.authors], # 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=[{"source": c} for c in old.covers], # pyright: ignore[reportArgumentType] 

89 description=old.description, 

90 documentation={"source": old.documentation} 

91 if old.documentation 

92 else None, # pyright: ignore[reportArgumentType] 

93 format_version="0.3.4", 

94 git_repo=old.git_repo, # pyright: ignore[reportArgumentType] 

95 icon={"source": old.icon} if old.icon else None, # pyright: ignore[reportArgumentType] 

96 id=None if old.id is None else DatasetId(old.id), 

97 license=old.license, # type: ignore 

98 links=old.links, 

99 maintainers=[ 

100 _maintainer_conv.convert_as_dict(m) for m in old.maintainers 

101 ], # pyright: ignore[reportArgumentType] 

102 name=old.name, 

103 source=old.source, 

104 tags=old.tags, 

105 type=old.type, 

106 uploader=old.uploader, 

107 version=old.version, 

108 **(old.model_extra or {}), 

109 ), 

110 ) 

111 

112 return data 

113 

114 

115class LinkedDataset(LinkedResourceBase): 

116 """Reference to a bioimage.io dataset.""" 

117 

118 id: DatasetId 

119 """A valid dataset `id` from the bioimage.io collection."""