fromivcap_client.ivcapimportIVCAPivcap=IVCAP()# Add an aspectaspect=ivcap.add_aspect(entity="urn:ivcap:artifact:<uuid>",aspect={"$schema":"urn:my-project:schema:annotation.1","label":"coral","confidence":0.97,},)# List aspects for an entityforaspectinivcap.list_aspects(entity="urn:ivcap:artifact:<uuid>"):print(aspect.schema,aspect.entity)print(aspect.aspect)# JSON content# Retractaspect.retract()
@dataclassclassAspect:"""This class represents a aspect record stored at a particular IVCAP deployment"""id:strentity:strschema:str# content: Optional[any] = Nonecontent_type:str|None=Nonevalid_from:datetime.datetime|None=Nonevalid_to:datetime.datetime|None=Noneasserter:URN|None=Noneretracter:URN|None=None@classmethoddef_from_list_item(cls,item:AspectListItemRT,ivcap:IVCAP):kwargs=item.to_dict()returncls(ivcap,**kwargs)def__init__(self,ivcap:IVCAP,**kwargs):ifnotivcap:raiseValueError("missing 'ivcap' argument")self._ivcap=ivcapself.__update__(**kwargs)def__update__(self,**kwargs):p=["id","entity","schema","content-type","valid-from","valid-to","asserter","retracter",]hp=["content"]_set_fields(self,p,hp,kwargs)c=kwargs.get("content")ifisinstance(c,dict):self._content=celse:self._content=None@propertydefurn(self)->str:returnself.id@propertydefaspect(self)->dict:ifself._contentisNone:self.refresh()returnself._content@propertydefcontent(self)->dict:returnself.aspectdefrefresh(self)->Aspect:r=aspect_read.sync_detailed(self.id,client=self._ivcap._client)ifr.status_code>=300:returnprocess_error("aspect",r)res:AspectRT=r.parsedself.__update__(**res.to_dict())returnselfdefretract(self)->Aspect:"""Retract this aspect"""ifself.valid_to:# already retractedreturnselfr=aspect_retract.sync_detailed(self.id,client=self._ivcap._client)ifr.status_code>=300:returnprocess_error("aspect",r)returnself.refresh()def__repr__(self):returnf"<Aspect id={self.id}, entity={self.entity} schema={self.schema}>"
defretract(self)->Aspect:"""Retract this aspect"""ifself.valid_to:# already retractedreturnselfr=aspect_retract.sync_detailed(self.id,client=self._ivcap._client)ifr.status_code>=300:returnprocess_error("aspect",r)returnself.refresh()