from __future__ import annotations
from pydantic import BaseModel, Field, ConfigDict
from typing import Optional, Generic, TypeVar, Union
from enum import Enum
from uuid import uuid4
from datetime import date, datetime
from mdmodels.units.annotation import UnitDefinitionAnnot
Cls = TypeVar("Cls")
class FilterWrapper(Generic[Cls]):
def __init__(self, collection: list[Cls], **kwargs):
self.collection = collection
self.kwargs = kwargs
def filter(self) -> list[Cls]:
for key, value in self.kwargs.items():
self.collection = [
item for item in self.collection if self._fetch_attr(key, item) == value
]
return self.collection
def _fetch_attr(self, name: str, item: Cls):
try:
return getattr(item, name)
except AttributeError:
raise AttributeError(f"{item} does not have attribute {name}")
def add_namespace(obj, prefix: str | None, iri: str | None):
if prefix is None and iri is None:
return
elif prefix and iri is None:
raise ValueError("If prefix is provided, iri must also be provided")
elif iri and prefix is None:
raise ValueError("If iri is provided, prefix must also be provided")
obj.ld_context[prefix] = iri
def validate_prefix(term: str | dict, prefix: str):
if isinstance(term, dict) and not term["@id"].startswith(prefix + ":"):
raise ValueError(f"Term {term} is not prefixed with {prefix}")
elif isinstance(term, str) and not term.startswith(prefix + ":"):
raise ValueError(f"Term {term} is not prefixed with {prefix}")
class UnitTest(BaseModel):
model_config: ConfigDict = ConfigDict( validate_assignment = True,
)
units: list[UnitDefinitionAnnot] = Field(
default_factory=list,
description="""""",
)
optional_unit: Optional[UnitDefinitionAnnot] = Field(
default=None,
description="""""",
)
unit: Optional[UnitDefinitionAnnot] = Field(
default=None,
description="""""",
)
ld_id: str = Field(
serialization_alias="@id",
default_factory=lambda: "md:UnitTest/" + str(uuid4())
)
ld_type: list[str] = Field(
serialization_alias="@type",
default_factory = lambda: [
"md:UnitTest",
],
)
ld_context: dict[str, str | dict] = Field(
serialization_alias="@context",
default_factory = lambda: {
"md": "http://mdmodel.net",
"om": "http://www.ontology-of-units-of-measure.org/resource/om-2/",
"qudt": "http://qudt.org/schema/qudt#/",
"rdfs": "http://www.w3.org/2000/01/rdf-schema#/",
"schema": "http://schema.org/",
"unit": "http://qudt.org/vocab/unit#/",
"xsd": "http://www.w3.org/2001/XMLSchema#/",
}
)
def set_attr_term(
self,
attr: str,
term: str | dict,
prefix: str | None = None,
iri: str | None = None
):
assert attr in self.model_fields, f"Attribute {attr} not found in {self.__class__.__name__}"
if prefix:
validate_prefix(term, prefix)
add_namespace(self, prefix, iri)
self.ld_context[attr] = term
def add_type_term(
self,
term: str,
prefix: str | None = None,
iri: str | None = None
):
if prefix:
validate_prefix(term, prefix)
add_namespace(self, prefix, iri)
self.ld_type.append(term)