Skip to content

Commit 0f98a4a

Browse files
committed
add estimate of metadata completeness
1 parent 7c4699f commit 0f98a4a

File tree

2 files changed

+37
-7
lines changed

2 files changed

+37
-7
lines changed

bioimageio/spec/_internal/common_nodes.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
Any,
1111
ClassVar,
1212
Dict,
13+
Iterable,
1314
List,
1415
Literal,
1516
Mapping,
@@ -149,13 +150,15 @@ def _ignore_future_patch(cls, data: Any, /) -> Any:
149150
@model_validator(mode="after")
150151
def _set_init_validation_summary(self) -> Self:
151152
context = get_validation_context()
153+
152154
self._validation_summary = ValidationSummary(
153155
name="bioimageio format validation",
154156
source_name=context.source_name,
155157
id=getattr(self, "id", None),
156158
type=self.type,
157159
format_version=self.format_version,
158160
status="failed" if isinstance(self, InvalidDescr) else "valid-format",
161+
metadata_completeness=self._get_metadata_completeness(),
159162
details=(
160163
[]
161164
if isinstance(self, InvalidDescr)
@@ -245,6 +248,25 @@ def load(
245248

246249
return rd
247250

251+
def _get_metadata_completeness(self) -> float:
252+
if isinstance(self, InvalidDescr):
253+
return 0.0
254+
255+
given = self.model_dump(mode="json", exclude_unset=True, exclude_defaults=False)
256+
full = self.model_dump(mode="json", exclude_unset=False, exclude_defaults=False)
257+
258+
def extract_flat_keys(d: Dict[Any, Any], key: str = "") -> Iterable[str]:
259+
for k, v in d.items():
260+
if is_dict(v):
261+
yield from extract_flat_keys(v, key=f"{key}.{k}" if key else k)
262+
263+
yield k
264+
265+
given_keys = set(extract_flat_keys(given))
266+
full_keys = set(extract_flat_keys(full))
267+
assert len(full_keys) >= len(given_keys)
268+
return len(given_keys) / len(full_keys) if full_keys else 0.0
269+
248270
@classmethod
249271
def _load_impl(
250272
cls, data: BioimageioYamlContent

bioimageio/spec/summary.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
no_type_check,
2424
)
2525

26+
import annotated_types
2627
import markdown
2728
import rich.console
2829
import rich.markdown
@@ -36,7 +37,7 @@
3637
model_validator,
3738
)
3839
from pydantic_core.core_schema import ErrorType
39-
from typing_extensions import Self, assert_never
40+
from typing_extensions import Annotated, Self, assert_never
4041

4142
from bioimageio.spec._internal.type_guards import is_dict
4243

@@ -241,25 +242,32 @@ class ValidationSummary(BaseModel, extra="allow"):
241242
for one specific `ResourceDescr` instance."""
242243

243244
name: str
244-
"""name of the validation"""
245+
"""Name of the validation"""
245246
source_name: str
246-
"""source of the validated bioimageio description"""
247+
"""Source of the validated bioimageio description"""
247248
id: Optional[str] = None
248249
"""ID of the resource being validated"""
249250
type: str
250-
"""type of the resource being validated"""
251+
"""Type of the resource being validated"""
251252
format_version: str
252-
"""format version of the resource being validated"""
253+
"""Format version of the resource being validated"""
253254
status: Literal["passed", "valid-format", "failed"]
254255
"""overall status of the bioimageio validation"""
256+
metadata_completeness: Annotated[float, annotated_types.Interval(ge=0, le=1)] = 0.0
257+
"""Estimate of completeness of the metadata in the resource description.
258+
259+
Note: This completeness estimate may change with subsequent releases
260+
and should be considered bioimageio.spec version specific.
261+
"""
262+
255263
details: List[ValidationDetail]
256-
"""list of validation details"""
264+
"""List of validation details"""
257265
env: Set[InstalledPackage] = Field(
258266
default_factory=lambda: {
259267
InstalledPackage(name="bioimageio.spec", version=VERSION)
260268
}
261269
)
262-
"""list of selected, relevant package versions"""
270+
"""List of selected, relevant package versions"""
263271

264272
saved_conda_list: Optional[str] = None
265273

0 commit comments

Comments
 (0)