def canonicalize(curie: str): """Return the best CURIE.""" # TODO maybe normalize the curie first? norm_prefix, norm_identifier = normalize_curie(curie) if norm_prefix is None or norm_identifier is None: return jsonify( query=curie, normalizable=False, ) norm_curie = f'{norm_prefix}:{norm_identifier}' rv = dict(query=curie) if norm_curie != curie: rv['norm_curie'] = norm_curie if norm_curie not in graph: rv['found'] = False else: result_curie = canonicalizer.canonicalize(norm_curie) rv.update( found=True, result=result_curie, mappings=url_for( f'.{all_mappings.__name__}', source_curie=norm_curie, target_curie=result_curie, ), ) return jsonify(rv)
def _process_interactor(s: str) -> Optional[str]: prefix, identifier = normalize_curie(s) if prefix is None: logger.warning('could not parse %s', s) return if prefix == 'ncbigene': return identifier elif prefix == 'biogrid': ncbigene_identifier = _map_ncbigene(identifier) if ncbigene_identifier is not None: return ncbigene_identifier elif identifier in BIOGRID_NCBIGENE_REMAPPING: remapped = BIOGRID_NCBIGENE_REMAPPING[identifier] if not remapped: logger.debug('tried but failed curation on %s', s) return remapped else: logger.warning('need to curate: %s', s) return elif prefix == 'uniprot': if identifier in UNIPROT_NCBIGENE_REMAPPING: remapped = UNIPROT_NCBIGENE_REMAPPING[identifier] if not remapped: logger.debug('tried but failed curation on %s', s) return remapped else: logger.warning('need to curate: %s', s) return else: logger.warning('unhandled interactor: %s (%s:%s)', s, prefix, identifier)
def test_strip_prefix(self): """Test stripping prefixes works.""" self.assertEqual(("go", "1234"), normalize_curie("GO:1234")) self.assertEqual(("go", "1234"), normalize_curie("go:1234")) self.assertEqual((None, None), normalize_curie("1234")) self.assertEqual(("go", "1234"), normalize_curie("GO:GO:1234")) self.assertEqual(("pubmed", "1234"), normalize_curie("pubmed:1234")) # Test remapping self.assertEqual(("pubmed", "1234"), normalize_curie("pmid:1234")) self.assertEqual(("pubmed", "1234"), normalize_curie("PMID:1234"))
def test_strip_prefix(self): """Test stripping prefixes works.""" self.assertEqual(('go', '1234'), normalize_curie('GO:1234')) self.assertEqual(('go', '1234'), normalize_curie('go:1234')) self.assertEqual((None, None), normalize_curie('1234')) self.assertEqual(('go', 'GO:1234'), normalize_curie('GO:GO:1234')) self.assertEqual(('pubmed', '1234'), normalize_curie('pubmed:1234')) # Test remapping self.assertEqual(('pubmed', '1234'), normalize_curie('pmid:1234')) self.assertEqual(('pubmed', '1234'), normalize_curie('PMID:1234'))
def _help_resolve(curie: str) -> Mapping[str, Any]: prefix, identifier = normalize_curie(curie) if prefix is None: return dict( query=curie, success=False, message='Could not identify prefix', ) miriam = get_identifiers_org_link(prefix, identifier) id_name_mapping = get_id_name_mapping(prefix) if id_name_mapping is None: rv = dict( query=curie, prefix=prefix, identifier=identifier, success=False, ) if miriam: rv.update( dict( miriam=miriam, message= 'Could not find id->name mapping for prefix, but still able to report Identifiers.org link', )) else: rv['message'] = 'Could not find id->name mapping for prefix' return rv name = id_name_mapping.get(identifier) if name is None: return dict( query=curie, prefix=prefix, identifier=identifier, success=False, message='Could not look up identifier', ) return dict( query=curie, prefix=prefix, identifier=identifier, name=name, success=True, miriam=miriam, )
def _iter_process_xrefs(s: str) -> Iterable[Tuple[str, str]]: """Take a string with pipe-delimited curies and split/normalize them. Compact Uniform Identfiers (CURIE) examples: - hgnc:12345 - ncbigene:12345 - uniprot:P12345 - ec-code:1.2.3.15 Goal: make hgnc:1234|ncbigene:1245|uniprot...:12345" into a list of tuples """ for curie in s.split('|'): curie = curie.strip() prefix, identifier = normalize_curie(curie) if prefix is not None: yield prefix, identifier
def resolve(self, curie: str, resolve_alternate: bool = False) -> Mapping[str, Any]: """Return the results and summary when resolving a CURIE string.""" prefix, identifier = normalize_curie(curie) if prefix is None: return dict( query=curie, success=False, message='Could not identify prefix', ) miriam_link = get_identifiers_org_link(prefix, identifier) obofoundry_link = get_obofoundry_link(prefix, identifier) ols_link = get_ols_link(prefix, identifier) if not self.has_prefix(prefix): rv = dict( query=curie, prefix=prefix, identifier=identifier, success=False, message=f'Could not find id->name mapping for {prefix}', ) if miriam_link: rv['miriam'] = miriam_link if obofoundry_link: rv['obofoundry'] = obofoundry_link if ols_link: rv['ols'] = ols_link return rv name = self.get_name(prefix, identifier) if name is None and resolve_alternate: primary_id = self.get_primary_id(prefix, identifier) if primary_id != identifier: miriam_link = get_identifiers_org_link(prefix, primary_id) obofoundry_link = get_obofoundry_link(prefix, primary_id) ols_link = get_ols_link(prefix, primary_id) name = self.get_name(prefix, primary_id) if name is None: return dict( query=curie, prefix=prefix, identifier=identifier, success=False, miriam=miriam_link, obofoundry=obofoundry_link, ols=ols_link, message='Could not look up identifier', ) return dict( query=curie, prefix=prefix, identifier=identifier, name=name, success=True, miriam=miriam_link, obofoundry=obofoundry_link, ols=ols_link, )