Source code for hpotk.ontology.load.obographs._factory
importabcimportloggingimportreimporttypingfromhpotk.modelimportTermId,Term,MinimalTerm,Synonym,SynonymType,SynonymCategory,Definitionfrom._modelimportNode,Meta,SynonymPropertyValuelogger=logging.getLogger(__name__)MINIMAL_TERM=typing.TypeVar('MINIMAL_TERM',bound=MinimalTerm)OBO_PURL_PT=re.compile(r'^http://purl\.obolibrary\.org/obo/(?P<value>.+)$')HP_VAL_PT=re.compile(r'^hp(.*)#(?P<value>.+)$')ORCID_PT=re.compile(r'.*orcid\.org/(?P<orcid>\d{4}-\d{4}-\d{4}-\d{4})$')defcreate_alt_term_ids(node:Node)->typing.List[TermId]:alt_term_ids=[]ifnode.meta:forbpvinnode.meta.basic_property_values:ifbpv.predisnotNone \
andbpv.valisnotNone \
andbpv.pred.endswith('#hasAlternativeId'):alt_term_ids.append(TermId.from_curie(bpv.val))returnalt_term_idsdefcreate_synonyms(meta:Meta)->typing.Optional[typing.List[Synonym]]:iflen(meta.synonyms)==0:returnNoneelse:return[parse_synonym(s)forsinmeta.synonyms]defparse_synonym(spv:SynonymPropertyValue)->Synonym:synonym_category:typing.Optional[SynonymCategory]=parse_synonym_category(spv.pred)synonym_type:typing.Optional[SynonymType]=parse_synonym_type(spv.synonym_type)iflen(spv.xrefs)!=0:xrefs=[]forxrefinspv.xrefs:parsed=parse_synonym_xref(xref)ifparsedisnotNone:xrefs.append(parsed)xrefs=list(xrefs)iflen(xrefs)!=0elseNone# shrink to fitelse:xrefs=NonereturnSynonym(name=spv.val,synonym_category=synonym_category,synonym_type=synonym_type,xrefs=xrefs)defparse_synonym_category(synonym_category:str)->typing.Optional[SynonymCategory]:ifsynonym_category=='hasRelatedSynonym':returnSynonymCategory.RELATEDelifsynonym_category=='hasExactSynonym':returnSynonymCategory.EXACTelifsynonym_category=='hasBroadSynonym':returnSynonymCategory.BROADelifsynonym_category=='hasNarrowSynonym':returnSynonymCategory.NARROWelse:logger.debug(f"Unknown synonym category {synonym_category}")returnNonedefparse_synonym_type(synonym_type:str)->typing.Optional[SynonymType]:ifsynonym_typeisNoneorlen(synonym_type)==0:returnNonehp_obo_matcher=OBO_PURL_PT.match(synonym_type)ifhp_obo_matcher:value=hp_obo_matcher.group('value')hp_matcher=HP_VAL_PT.match(value)ifhp_matcher:value=hp_matcher.group('value')ifvaluein('layperson','layperson term'):returnSynonymType.LAYPERSON_TERMelifvalue=='abbreviation':returnSynonymType.ABBREVIATIONelifvalue=='uk_spelling':returnSynonymType.UK_SPELLINGelifvalue=='obsolete_synonym':returnSynonymType.OBSOLETE_SYNONYMelifvalue=='plural_form':returnSynonymType.PLURAL_FORMelse:ifvaluein('HP_0034334','allelic_requirement'):returnSynonymType.ALLELIC_REQUIREMENTlogger.debug(f"Unknown synonym type {synonym_type}")returnNonedefparse_synonym_xref(xref)->typing.Optional[TermId]:orcid_matcher=ORCID_PT.match(xref)iforcid_matcher:returnTermId.from_curie(f'ORCID:{orcid_matcher.group("orcid")}')else:try:# TODO: this can contain many things. Investigate..returnTermId.from_curie(xref)exceptValueError:logger.debug(f'Unable to create a synonym xref from {xref}')returnNonedefcreate_xrefs(meta:Meta)->typing.Optional[typing.List[TermId]]:iflen(meta.xrefs)==0:returnNoneelse:# TODO: Expecting that all xrefs are CURIES may be a bit too naive. Investigate..return[TermId.from_curie(xref.val)forxrefinmeta.xrefs]classObographsTermFactory(typing.Generic[MINIMAL_TERM],metaclass=abc.ABCMeta):""" Term factory turns `TermId` and obographs `Node` into an ontology term. """@abc.abstractmethoddefcreate_term(self,term_id:TermId,node:Node)->typing.Optional[MINIMAL_TERM]:""" Create `MinimalTerm` or a more specific instance for `TermId` and `Node` The term may not be created at the discretion of the factory, in which case `None` is returned. """pass