"""The qnexus package."""from__future__importannotationsfromcollectionsimportOrderedDictfromdatetimeimportdatetimefromtypingimportAny,TypedDictimportpandasaspdfrompydanticimportBaseModel,ConfigDict,Field,field_serializer,field_validatorPropertiesDict=OrderedDict[str,bool|int|float|str]classAnnotationsDict(TypedDict,total=False):"""TypedDict for annotations"""name:str|Nonedescription:str|Noneproperties:PropertiesDictcreated:datetime|Nonemodified:datetime|None
[docs]classAnnotations(BaseModel):"""Pydantic model for annotations"""name:str|None=Nonedescription:str|None=Noneproperties:PropertiesDict=Field(default_factory=OrderedDict)created:datetime|None=Nonemodified:datetime|None=Nonemodel_config=ConfigDict(frozen=True)@field_validator("properties")@classmethoddefsort_properties(cls,v:PropertiesDict)->PropertiesDict:"""Sort the values of the properties dict."""returnPropertiesDict(OrderedDict(sorted(v.items())))@field_serializer("created")defserialize_created(self,created:datetime|None)->str|None:"""Custom serializer for datetimes."""ifcreated:returnstr(created)returnNone@field_serializer("modified")defserialize_modified(self,modified:datetime|None)->str|None:"""Custom serializer for datetimes."""ifmodified:returnstr(modified)returnNonedefdf(self)->pd.DataFrame:"""Convert to a pandas DataFrame."""returnpd.DataFrame({"name":self.name,"description":self.description,"created":self.created,"modified":self.modified,}|self.properties,index=[0],)@classmethoddeffrom_dict(cls,annotations_dict:dict[str,Any])->Annotations:"""Construct Annotations from a dict."""returnAnnotations(name=annotations_dict["name"],description=annotations_dict.get("description",None),properties=PropertiesDict(**annotations_dict.get("properties",{})),created=annotations_dict["timestamps"]["created"],modified=annotations_dict["timestamps"]["modified"],)
classCreateAnnotations(BaseModel):"""Pydantic model for annotations when the name is required."""name:strdescription:str|None=Noneproperties:PropertiesDict|None=Field(default_factory=PropertiesDict)model_config=ConfigDict(frozen=True)@field_validator("properties")@classmethoddefset_properties_default(cls,v:PropertiesDict|None)->PropertiesDict:"""Replace None properties with an empty PropertiesDict on model construction."""ifvisNone:returnPropertiesDict()returnv