pyobo 0.11.1__py3-none-any.whl → 0.12.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. pyobo/.DS_Store +0 -0
  2. pyobo/__init__.py +95 -20
  3. pyobo/__main__.py +0 -0
  4. pyobo/api/__init__.py +81 -10
  5. pyobo/api/alts.py +52 -42
  6. pyobo/api/combine.py +39 -0
  7. pyobo/api/edges.py +68 -0
  8. pyobo/api/hierarchy.py +231 -203
  9. pyobo/api/metadata.py +14 -19
  10. pyobo/api/names.py +207 -127
  11. pyobo/api/properties.py +117 -113
  12. pyobo/api/relations.py +68 -94
  13. pyobo/api/species.py +24 -21
  14. pyobo/api/typedefs.py +11 -11
  15. pyobo/api/utils.py +66 -13
  16. pyobo/api/xrefs.py +108 -114
  17. pyobo/cli/__init__.py +0 -0
  18. pyobo/cli/cli.py +35 -50
  19. pyobo/cli/database.py +183 -161
  20. pyobo/{xrefdb/xrefs_pipeline.py → cli/database_utils.py} +54 -73
  21. pyobo/cli/lookup.py +163 -195
  22. pyobo/cli/utils.py +19 -6
  23. pyobo/constants.py +102 -3
  24. pyobo/getters.py +196 -118
  25. pyobo/gilda_utils.py +79 -200
  26. pyobo/identifier_utils/__init__.py +41 -0
  27. pyobo/identifier_utils/api.py +296 -0
  28. pyobo/identifier_utils/model.py +130 -0
  29. pyobo/identifier_utils/preprocessing.json +812 -0
  30. pyobo/identifier_utils/preprocessing.py +61 -0
  31. pyobo/identifier_utils/relations/__init__.py +8 -0
  32. pyobo/identifier_utils/relations/api.py +162 -0
  33. pyobo/identifier_utils/relations/data.json +5824 -0
  34. pyobo/identifier_utils/relations/data_owl.json +57 -0
  35. pyobo/identifier_utils/relations/data_rdf.json +1 -0
  36. pyobo/identifier_utils/relations/data_rdfs.json +7 -0
  37. pyobo/mocks.py +9 -6
  38. pyobo/ner/__init__.py +9 -0
  39. pyobo/ner/api.py +72 -0
  40. pyobo/ner/normalizer.py +33 -0
  41. pyobo/obographs.py +43 -39
  42. pyobo/plugins.py +5 -4
  43. pyobo/py.typed +0 -0
  44. pyobo/reader.py +1358 -395
  45. pyobo/reader_utils.py +155 -0
  46. pyobo/resource_utils.py +42 -22
  47. pyobo/resources/__init__.py +0 -0
  48. pyobo/resources/goc.py +75 -0
  49. pyobo/resources/goc.tsv +188 -0
  50. pyobo/resources/ncbitaxon.py +4 -5
  51. pyobo/resources/ncbitaxon.tsv.gz +0 -0
  52. pyobo/resources/ro.py +3 -2
  53. pyobo/resources/ro.tsv +0 -0
  54. pyobo/resources/so.py +0 -0
  55. pyobo/resources/so.tsv +0 -0
  56. pyobo/sources/README.md +12 -8
  57. pyobo/sources/__init__.py +52 -29
  58. pyobo/sources/agrovoc.py +0 -0
  59. pyobo/sources/antibodyregistry.py +11 -12
  60. pyobo/sources/bigg/__init__.py +13 -0
  61. pyobo/sources/bigg/bigg_compartment.py +81 -0
  62. pyobo/sources/bigg/bigg_metabolite.py +229 -0
  63. pyobo/sources/bigg/bigg_model.py +46 -0
  64. pyobo/sources/bigg/bigg_reaction.py +77 -0
  65. pyobo/sources/biogrid.py +1 -2
  66. pyobo/sources/ccle.py +7 -12
  67. pyobo/sources/cgnc.py +0 -5
  68. pyobo/sources/chebi.py +1 -1
  69. pyobo/sources/chembl/__init__.py +9 -0
  70. pyobo/sources/{chembl.py → chembl/chembl_compound.py} +13 -25
  71. pyobo/sources/chembl/chembl_target.py +160 -0
  72. pyobo/sources/civic_gene.py +55 -15
  73. pyobo/sources/clinicaltrials.py +160 -0
  74. pyobo/sources/complexportal.py +24 -24
  75. pyobo/sources/conso.py +14 -22
  76. pyobo/sources/cpt.py +0 -0
  77. pyobo/sources/credit.py +1 -9
  78. pyobo/sources/cvx.py +27 -5
  79. pyobo/sources/depmap.py +9 -12
  80. pyobo/sources/dictybase_gene.py +2 -7
  81. pyobo/sources/drugbank/__init__.py +9 -0
  82. pyobo/sources/{drugbank.py → drugbank/drugbank.py} +11 -16
  83. pyobo/sources/{drugbank_salt.py → drugbank/drugbank_salt.py} +3 -8
  84. pyobo/sources/drugcentral.py +17 -13
  85. pyobo/sources/expasy.py +31 -34
  86. pyobo/sources/famplex.py +13 -18
  87. pyobo/sources/flybase.py +3 -8
  88. pyobo/sources/gard.py +62 -0
  89. pyobo/sources/geonames/__init__.py +9 -0
  90. pyobo/sources/geonames/features.py +28 -0
  91. pyobo/sources/{geonames.py → geonames/geonames.py} +87 -26
  92. pyobo/sources/geonames/utils.py +115 -0
  93. pyobo/sources/gmt_utils.py +6 -7
  94. pyobo/sources/go.py +20 -13
  95. pyobo/sources/gtdb.py +154 -0
  96. pyobo/sources/gwascentral/__init__.py +9 -0
  97. pyobo/sources/{gwascentral_phenotype.py → gwascentral/gwascentral_phenotype.py} +5 -7
  98. pyobo/sources/{gwascentral_study.py → gwascentral/gwascentral_study.py} +1 -7
  99. pyobo/sources/hgnc/__init__.py +9 -0
  100. pyobo/sources/{hgnc.py → hgnc/hgnc.py} +56 -70
  101. pyobo/sources/{hgncgenefamily.py → hgnc/hgncgenefamily.py} +8 -18
  102. pyobo/sources/icd/__init__.py +9 -0
  103. pyobo/sources/{icd10.py → icd/icd10.py} +35 -37
  104. pyobo/sources/icd/icd11.py +148 -0
  105. pyobo/sources/{icd_utils.py → icd/icd_utils.py} +66 -20
  106. pyobo/sources/interpro.py +4 -9
  107. pyobo/sources/itis.py +0 -5
  108. pyobo/sources/kegg/__init__.py +0 -0
  109. pyobo/sources/kegg/api.py +16 -38
  110. pyobo/sources/kegg/genes.py +9 -20
  111. pyobo/sources/kegg/genome.py +1 -7
  112. pyobo/sources/kegg/pathway.py +9 -21
  113. pyobo/sources/mesh.py +58 -24
  114. pyobo/sources/mgi.py +3 -10
  115. pyobo/sources/mirbase/__init__.py +11 -0
  116. pyobo/sources/{mirbase.py → mirbase/mirbase.py} +8 -11
  117. pyobo/sources/{mirbase_constants.py → mirbase/mirbase_constants.py} +0 -0
  118. pyobo/sources/{mirbase_family.py → mirbase/mirbase_family.py} +4 -8
  119. pyobo/sources/{mirbase_mature.py → mirbase/mirbase_mature.py} +3 -7
  120. pyobo/sources/msigdb.py +74 -39
  121. pyobo/sources/ncbi/__init__.py +9 -0
  122. pyobo/sources/ncbi/ncbi_gc.py +162 -0
  123. pyobo/sources/{ncbigene.py → ncbi/ncbigene.py} +18 -19
  124. pyobo/sources/nih_reporter.py +60 -0
  125. pyobo/sources/nlm/__init__.py +9 -0
  126. pyobo/sources/nlm/nlm_catalog.py +48 -0
  127. pyobo/sources/nlm/nlm_publisher.py +36 -0
  128. pyobo/sources/nlm/utils.py +116 -0
  129. pyobo/sources/npass.py +6 -8
  130. pyobo/sources/omim_ps.py +10 -3
  131. pyobo/sources/pathbank.py +4 -8
  132. pyobo/sources/pfam/__init__.py +9 -0
  133. pyobo/sources/{pfam.py → pfam/pfam.py} +3 -8
  134. pyobo/sources/{pfam_clan.py → pfam/pfam_clan.py} +2 -7
  135. pyobo/sources/pharmgkb/__init__.py +15 -0
  136. pyobo/sources/pharmgkb/pharmgkb_chemical.py +89 -0
  137. pyobo/sources/pharmgkb/pharmgkb_disease.py +77 -0
  138. pyobo/sources/pharmgkb/pharmgkb_gene.py +108 -0
  139. pyobo/sources/pharmgkb/pharmgkb_pathway.py +63 -0
  140. pyobo/sources/pharmgkb/pharmgkb_variant.py +84 -0
  141. pyobo/sources/pharmgkb/utils.py +86 -0
  142. pyobo/sources/pid.py +1 -6
  143. pyobo/sources/pombase.py +6 -10
  144. pyobo/sources/pubchem.py +4 -9
  145. pyobo/sources/reactome.py +5 -11
  146. pyobo/sources/rgd.py +11 -16
  147. pyobo/sources/rhea.py +37 -36
  148. pyobo/sources/ror.py +69 -42
  149. pyobo/sources/selventa/__init__.py +0 -0
  150. pyobo/sources/selventa/schem.py +4 -7
  151. pyobo/sources/selventa/scomp.py +1 -6
  152. pyobo/sources/selventa/sdis.py +4 -7
  153. pyobo/sources/selventa/sfam.py +1 -6
  154. pyobo/sources/sgd.py +6 -11
  155. pyobo/sources/signor/__init__.py +7 -0
  156. pyobo/sources/signor/download.py +41 -0
  157. pyobo/sources/signor/signor_complexes.py +105 -0
  158. pyobo/sources/slm.py +12 -15
  159. pyobo/sources/umls/__init__.py +7 -1
  160. pyobo/sources/umls/__main__.py +0 -0
  161. pyobo/sources/umls/get_synonym_types.py +20 -4
  162. pyobo/sources/umls/sty.py +57 -0
  163. pyobo/sources/umls/synonym_types.tsv +1 -1
  164. pyobo/sources/umls/umls.py +18 -22
  165. pyobo/sources/unimod.py +46 -0
  166. pyobo/sources/uniprot/__init__.py +1 -1
  167. pyobo/sources/uniprot/uniprot.py +40 -32
  168. pyobo/sources/uniprot/uniprot_ptm.py +4 -34
  169. pyobo/sources/utils.py +3 -2
  170. pyobo/sources/wikipathways.py +7 -10
  171. pyobo/sources/zfin.py +5 -10
  172. pyobo/ssg/__init__.py +12 -16
  173. pyobo/ssg/base.html +0 -0
  174. pyobo/ssg/index.html +26 -13
  175. pyobo/ssg/term.html +12 -2
  176. pyobo/ssg/typedef.html +0 -0
  177. pyobo/struct/__init__.py +54 -8
  178. pyobo/struct/functional/__init__.py +1 -0
  179. pyobo/struct/functional/dsl.py +2572 -0
  180. pyobo/struct/functional/macros.py +423 -0
  181. pyobo/struct/functional/obo_to_functional.py +385 -0
  182. pyobo/struct/functional/ontology.py +270 -0
  183. pyobo/struct/functional/utils.py +112 -0
  184. pyobo/struct/reference.py +331 -136
  185. pyobo/struct/struct.py +1413 -643
  186. pyobo/struct/struct_utils.py +1078 -0
  187. pyobo/struct/typedef.py +162 -210
  188. pyobo/struct/utils.py +12 -5
  189. pyobo/struct/vocabulary.py +138 -0
  190. pyobo/utils/__init__.py +0 -0
  191. pyobo/utils/cache.py +13 -11
  192. pyobo/utils/io.py +17 -31
  193. pyobo/utils/iter.py +5 -5
  194. pyobo/utils/misc.py +41 -53
  195. pyobo/utils/ndex_utils.py +0 -0
  196. pyobo/utils/path.py +76 -70
  197. pyobo/version.py +3 -3
  198. {pyobo-0.11.1.dist-info → pyobo-0.12.0.dist-info}/METADATA +224 -225
  199. pyobo-0.12.0.dist-info/RECORD +202 -0
  200. pyobo-0.12.0.dist-info/WHEEL +4 -0
  201. {pyobo-0.11.1.dist-info → pyobo-0.12.0.dist-info}/entry_points.txt +1 -0
  202. {pyobo-0.11.1.dist-info → pyobo-0.12.0.dist-info/licenses}/LICENSE +0 -0
  203. pyobo/apps/__init__.py +0 -3
  204. pyobo/apps/cli.py +0 -24
  205. pyobo/apps/gilda/__init__.py +0 -3
  206. pyobo/apps/gilda/__main__.py +0 -8
  207. pyobo/apps/gilda/app.py +0 -48
  208. pyobo/apps/gilda/cli.py +0 -36
  209. pyobo/apps/gilda/templates/base.html +0 -33
  210. pyobo/apps/gilda/templates/home.html +0 -11
  211. pyobo/apps/gilda/templates/matches.html +0 -32
  212. pyobo/apps/mapper/__init__.py +0 -3
  213. pyobo/apps/mapper/__main__.py +0 -11
  214. pyobo/apps/mapper/cli.py +0 -37
  215. pyobo/apps/mapper/mapper.py +0 -187
  216. pyobo/apps/mapper/templates/base.html +0 -35
  217. pyobo/apps/mapper/templates/mapper_home.html +0 -64
  218. pyobo/aws.py +0 -162
  219. pyobo/cli/aws.py +0 -47
  220. pyobo/identifier_utils.py +0 -142
  221. pyobo/normalizer.py +0 -232
  222. pyobo/registries/__init__.py +0 -16
  223. pyobo/registries/metaregistry.json +0 -507
  224. pyobo/registries/metaregistry.py +0 -135
  225. pyobo/sources/icd11.py +0 -105
  226. pyobo/xrefdb/__init__.py +0 -1
  227. pyobo/xrefdb/canonicalizer.py +0 -214
  228. pyobo/xrefdb/priority.py +0 -59
  229. pyobo/xrefdb/sources/__init__.py +0 -60
  230. pyobo/xrefdb/sources/biomappings.py +0 -36
  231. pyobo/xrefdb/sources/cbms2019.py +0 -91
  232. pyobo/xrefdb/sources/chembl.py +0 -83
  233. pyobo/xrefdb/sources/compath.py +0 -82
  234. pyobo/xrefdb/sources/famplex.py +0 -64
  235. pyobo/xrefdb/sources/gilda.py +0 -50
  236. pyobo/xrefdb/sources/intact.py +0 -113
  237. pyobo/xrefdb/sources/ncit.py +0 -133
  238. pyobo/xrefdb/sources/pubchem.py +0 -27
  239. pyobo/xrefdb/sources/wikidata.py +0 -116
  240. pyobo-0.11.1.dist-info/RECORD +0 -173
  241. pyobo-0.11.1.dist-info/WHEEL +0 -5
  242. pyobo-0.11.1.dist-info/top_level.txt +0 -1
pyobo/api/names.py CHANGED
@@ -4,43 +4,54 @@ from __future__ import annotations
4
4
 
5
5
  import logging
6
6
  import subprocess
7
- from collections.abc import Mapping
7
+ from collections.abc import Callable, Mapping
8
8
  from functools import lru_cache
9
- from typing import Callable, TypeVar
9
+ from typing import Any, TypeVar
10
10
 
11
- from curies import Reference, ReferenceTuple
11
+ import curies
12
+ import pandas as pd
13
+ import ssslm
14
+ from pystow.cache import Cached
15
+ from ssslm import LiteralMapping
16
+ from typing_extensions import Unpack
12
17
 
13
18
  from .alts import get_primary_identifier
14
- from .utils import get_version
19
+ from .utils import _get_pi, get_version_from_kwargs
20
+ from ..constants import (
21
+ GetOntologyKwargs,
22
+ check_should_cache,
23
+ check_should_force,
24
+ )
15
25
  from ..getters import NoBuildError, get_ontology
16
- from ..identifier_utils import normalize_curie, wrap_norm_prefix
17
- from ..utils.cache import cached_collection, cached_mapping, cached_multidict
18
- from ..utils.path import prefix_cache_join
26
+ from ..identifier_utils import wrap_norm_prefix
27
+ from ..struct import Reference
28
+ from ..utils.cache import cached_collection, cached_df, cached_mapping
29
+ from ..utils.io import multidict
30
+ from ..utils.path import CacheArtifact, get_cache_path
19
31
 
20
32
  __all__ = [
21
- "get_name",
22
- "get_name_by_curie",
23
- "get_ids",
24
- "get_id_name_mapping",
25
- "get_name_id_mapping",
26
33
  "get_definition",
27
34
  "get_id_definition_mapping",
28
- "get_synonyms",
35
+ "get_id_name_mapping",
29
36
  "get_id_synonyms_mapping",
37
+ "get_ids",
38
+ "get_literal_mappings",
39
+ "get_literal_mappings_df",
40
+ "get_name",
41
+ "get_name_by_curie",
42
+ "get_name_id_mapping",
30
43
  "get_obsolete",
44
+ "get_obsolete_references",
45
+ "get_references",
46
+ "get_synonyms",
31
47
  ]
32
48
 
33
49
  logger = logging.getLogger(__name__)
34
50
 
35
51
 
36
- def get_name_by_curie(curie: str, *, version: str | None = None) -> str | None:
52
+ def get_name_by_curie(curie: str, **kwargs: Any) -> str | None:
37
53
  """Get the name for a CURIE, if possible."""
38
- if version is None:
39
- version = get_version(curie.split(":")[0])
40
- prefix, identifier = normalize_curie(curie)
41
- if prefix and identifier:
42
- return get_name(prefix, identifier, version=version)
43
- return None
54
+ return get_name(curie, **kwargs)
44
55
 
45
56
 
46
57
  X = TypeVar("X")
@@ -50,108 +61,140 @@ NO_BUILD_LOGGED: set = set()
50
61
 
51
62
 
52
63
  def _help_get(
53
- f: Callable[[str], Mapping[str, X]],
54
- prefix: str,
55
- identifier: str,
56
- force: bool = False,
57
- strict: bool = False,
58
- version: str | None = None,
64
+ f: Callable[[str, Unpack[GetOntologyKwargs]], Mapping[str, X]],
65
+ reference: Reference,
66
+ **kwargs: Unpack[GetOntologyKwargs],
59
67
  ) -> X | None:
60
68
  """Get the result for an entity based on a mapping maker function ``f``."""
61
69
  try:
62
- mapping = f(prefix, force=force, strict=strict, version=version) # type:ignore
70
+ mapping = f(reference.prefix, **kwargs) # type:ignore
63
71
  except NoBuildError:
64
- if prefix not in NO_BUILD_PREFIXES:
65
- logger.warning("[%s] unable to look up results with %s", prefix, f)
66
- NO_BUILD_PREFIXES.add(prefix)
72
+ if reference.prefix not in NO_BUILD_PREFIXES:
73
+ logger.warning("[%s] unable to look up results with %s", reference.prefix, f)
74
+ NO_BUILD_PREFIXES.add(reference.prefix)
67
75
  return None
68
76
  except ValueError as e:
69
- if prefix not in NO_BUILD_PREFIXES:
70
- logger.warning("[%s] value error while looking up results with %s: %s", prefix, f, e)
71
- NO_BUILD_PREFIXES.add(prefix)
77
+ if reference.prefix not in NO_BUILD_PREFIXES:
78
+ logger.warning(
79
+ "[%s] value error while looking up results with %s: %s", reference.prefix, f, e
80
+ )
81
+ NO_BUILD_PREFIXES.add(reference.prefix)
72
82
  return None
73
83
 
74
84
  if not mapping:
75
- if prefix not in NO_BUILD_PREFIXES:
76
- logger.warning("[%s] no results produced with %s", prefix, f)
77
- NO_BUILD_PREFIXES.add(prefix)
85
+ if reference.prefix not in NO_BUILD_PREFIXES:
86
+ logger.warning("[%s] no results produced with %s", reference.prefix, f)
87
+ NO_BUILD_PREFIXES.add(reference.prefix)
78
88
  return None
79
89
 
80
- primary_id = get_primary_identifier(prefix, identifier, version=version)
90
+ primary_id = get_primary_identifier(reference, **kwargs)
81
91
  return mapping.get(primary_id)
82
92
 
83
93
 
84
- @wrap_norm_prefix
85
94
  def get_name(
86
- prefix: str | Reference | ReferenceTuple,
95
+ prefix: str | curies.Reference | curies.ReferenceTuple,
87
96
  identifier: str | None = None,
88
97
  /,
89
- *,
90
- version: str | None = None,
98
+ **kwargs: Unpack[GetOntologyKwargs],
91
99
  ) -> str | None:
92
100
  """Get the name for an entity."""
93
- if isinstance(prefix, (ReferenceTuple, Reference)):
94
- prefix, identifier = prefix.prefix, prefix.identifier
95
- return _help_get(get_id_name_mapping, prefix, identifier, version=version) # type:ignore
101
+ reference = _get_pi(prefix, identifier)
102
+ return _help_get(get_id_name_mapping, reference, **kwargs)
96
103
 
97
104
 
98
105
  @lru_cache
99
106
  @wrap_norm_prefix
100
- def get_ids(
101
- prefix: str, *, force: bool = False, strict: bool = False, version: str | None = None
102
- ) -> set[str]:
107
+ def get_ids(prefix: str, **kwargs: Unpack[GetOntologyKwargs]) -> set[str]:
103
108
  """Get the set of identifiers for this prefix."""
104
109
  if prefix == "ncbigene":
105
- from ..sources.ncbigene import get_ncbigene_ids
110
+ from ..sources.ncbi.ncbigene import get_ncbigene_ids
106
111
 
107
112
  logger.info("[%s] loading name mappings", prefix)
108
113
  rv = get_ncbigene_ids()
109
114
  logger.info("[%s] done loading name mappings", prefix)
110
115
  return rv
111
116
 
112
- if version is None:
113
- version = get_version(prefix)
114
- path = prefix_cache_join(prefix, name="ids.tsv", version=version)
115
-
116
- @cached_collection(path=path, force=force)
117
- def _get_ids() -> set[str]:
118
- if force:
119
- logger.info("[%s v%s] forcing reload for names", prefix, version)
120
- else:
121
- logger.debug(
122
- "[%s v%s] no cached identifiers found. getting from OBO loader", prefix, version
123
- )
124
- ontology = get_ontology(prefix, force=force, strict=strict, version=version)
125
- return ontology.get_ids()
117
+ return {
118
+ reference.identifier
119
+ for reference in get_references(prefix, **kwargs)
120
+ if reference.prefix == prefix
121
+ }
122
+
123
+
124
+ class CachedReferences(Cached[list[Reference]]):
125
+ """Make a function lazily cache its return value as file."""
126
+
127
+ def load(self) -> list[Reference]:
128
+ """Load data from the cache as a list of strings.
129
+
130
+ :returns: A list of strings loaded from the cache
131
+ """
132
+ with open(self.path) as file:
133
+ return [Reference.from_curie(line.strip()) for line in file]
126
134
 
127
- return set(_get_ids())
135
+ def dump(self, references: list[Reference]) -> None:
136
+ """Dump data to the cache as a list of strings.
137
+
138
+ :param references: The list of strings to dump
139
+ """
140
+ with open(self.path, "w") as file:
141
+ for reference in references:
142
+ print(reference.curie, file=file)
143
+
144
+
145
+ @wrap_norm_prefix
146
+ def get_references(prefix: str, **kwargs: Unpack[GetOntologyKwargs]) -> set[Reference]:
147
+ """Get the set of identifiers for this prefix."""
148
+ if prefix == "ncbigene":
149
+ from ..sources.ncbi.ncbigene import get_ncbigene_ids
150
+
151
+ logger.info("[%s] loading identifiers ", prefix)
152
+ rv = {Reference(prefix="ncbigene", identifier=i) for i in get_ncbigene_ids()}
153
+ logger.info("[%s] done loading identifiers", prefix)
154
+ return rv
155
+
156
+ version = get_version_from_kwargs(prefix, kwargs)
157
+ # TODO pre-cache these!
158
+ path = get_cache_path(prefix, CacheArtifact.references, version=version)
159
+
160
+ @CachedReferences(
161
+ path=path,
162
+ force=check_should_force(kwargs),
163
+ cache=check_should_cache(kwargs),
164
+ )
165
+ def _get_references() -> list[Reference]:
166
+ ontology = get_ontology(prefix, **kwargs)
167
+ return sorted(ontology.iterate_references())
168
+
169
+ return set(_get_references())
128
170
 
129
171
 
130
172
  @lru_cache
131
173
  @wrap_norm_prefix
132
174
  def get_id_name_mapping(
133
- prefix: str, *, force: bool = False, strict: bool = False, version: str | None = None
175
+ prefix: str,
176
+ **kwargs: Unpack[GetOntologyKwargs],
134
177
  ) -> Mapping[str, str]:
135
178
  """Get an identifier to name mapping for the OBO file."""
136
179
  if prefix == "ncbigene":
137
- from ..sources.ncbigene import get_ncbigene_id_to_name_mapping
180
+ from ..sources.ncbi.ncbigene import get_ncbigene_id_to_name_mapping
138
181
 
139
- logger.info("[%s] loading name mappings", prefix)
182
+ logger.info("[%s] loading identifiers", prefix)
140
183
  rv = get_ncbigene_id_to_name_mapping()
141
- logger.info("[%s] done loading name mappings", prefix)
184
+ logger.info("[%s] done loading identifiers", prefix)
142
185
  return rv
143
186
 
144
- if version is None:
145
- version = get_version(prefix)
146
- path = prefix_cache_join(prefix, name="names.tsv", version=version)
187
+ version = get_version_from_kwargs(prefix, kwargs)
188
+ path = get_cache_path(prefix, CacheArtifact.names, version=version)
147
189
 
148
- @cached_mapping(path=path, header=[f"{prefix}_id", "name"], force=force)
190
+ @cached_mapping(
191
+ path=path,
192
+ header=[f"{prefix}_id", "name"],
193
+ force=check_should_force(kwargs),
194
+ cache=check_should_cache(kwargs),
195
+ )
149
196
  def _get_id_name_mapping() -> Mapping[str, str]:
150
- if force:
151
- logger.debug("[%s v%s] forcing reload for names", prefix, version)
152
- else:
153
- logger.debug("[%s v%s] no cached names found. getting from OBO loader", prefix, version)
154
- ontology = get_ontology(prefix, force=force, strict=strict, version=version)
197
+ ontology = get_ontology(prefix, **kwargs)
155
198
  return ontology.get_id_name_mapping()
156
199
 
157
200
  try:
@@ -167,89 +210,126 @@ def get_id_name_mapping(
167
210
  @lru_cache
168
211
  @wrap_norm_prefix
169
212
  def get_name_id_mapping(
170
- prefix: str, *, force: bool = False, version: str | None = None
213
+ prefix: str,
214
+ **kwargs: Unpack[GetOntologyKwargs],
171
215
  ) -> Mapping[str, str]:
172
216
  """Get a name to identifier mapping for the OBO file."""
173
- id_name = get_id_name_mapping(prefix=prefix, force=force, version=version)
217
+ id_name = get_id_name_mapping(prefix, **kwargs)
174
218
  return {v: k for k, v in id_name.items()}
175
219
 
176
220
 
177
- @wrap_norm_prefix
178
221
  def get_definition(
179
- prefix: str, identifier: str | None = None, *, version: str | None = None
222
+ prefix: str | curies.Reference | curies.ReferenceTuple,
223
+ identifier: str | None = None,
224
+ /,
225
+ **kwargs: Unpack[GetOntologyKwargs],
180
226
  ) -> str | None:
181
227
  """Get the definition for an entity."""
182
- if identifier is None:
183
- prefix, _, identifier = prefix.rpartition(":")
184
- return _help_get(get_id_definition_mapping, prefix, identifier, version=version)
228
+ reference = _get_pi(prefix, identifier)
229
+ return _help_get(get_id_definition_mapping, reference, **kwargs)
185
230
 
186
231
 
187
232
  def get_id_definition_mapping(
188
- prefix: str,
189
- *,
190
- force: bool = False,
191
- strict: bool = False,
192
- version: str | None = None,
233
+ prefix: str, **kwargs: Unpack[GetOntologyKwargs]
193
234
  ) -> Mapping[str, str]:
194
235
  """Get a mapping of descriptions."""
195
- if version is None:
196
- version = get_version(prefix)
197
- path = prefix_cache_join(prefix, name="definitions.tsv", version=version)
198
-
199
- @cached_mapping(path=path, header=[f"{prefix}_id", "definition"], force=force)
236
+ version = get_version_from_kwargs(prefix, kwargs)
237
+ path = get_cache_path(prefix, CacheArtifact.definitions, version=version)
238
+
239
+ @cached_mapping(
240
+ path=path,
241
+ header=[f"{prefix}_id", "definition"],
242
+ force=check_should_force(kwargs),
243
+ cache=check_should_cache(kwargs),
244
+ )
200
245
  def _get_mapping() -> Mapping[str, str]:
201
246
  logger.info(
202
247
  "[%s v%s] no cached descriptions found. getting from OBO loader", prefix, version
203
248
  )
204
- ontology = get_ontology(prefix, force=force, strict=strict, version=version)
249
+ ontology = get_ontology(prefix, **kwargs)
205
250
  return ontology.get_id_definition_mapping()
206
251
 
207
252
  return _get_mapping()
208
253
 
209
254
 
210
- def get_obsolete(
211
- prefix: str,
212
- *,
213
- force: bool = False,
214
- strict: bool = False,
215
- version: str | None = None,
216
- ) -> set[str]:
255
+ @wrap_norm_prefix
256
+ def get_obsolete(prefix: str, **kwargs: Unpack[GetOntologyKwargs]) -> set[str]:
217
257
  """Get the set of obsolete local unique identifiers."""
218
- if version is None:
219
- version = get_version(prefix)
220
- path = prefix_cache_join(prefix, name="obsolete.tsv", version=version)
221
-
222
- @cached_collection(path=path, force=force)
223
- def _get_obsolete() -> set[str]:
224
- ontology = get_ontology(prefix, force=force, strict=strict, version=version)
225
- return ontology.get_obsolete()
258
+ version = get_version_from_kwargs(prefix, kwargs)
259
+ # TODO pre-cache these!
260
+ path = get_cache_path(prefix, CacheArtifact.obsoletes, version=version)
261
+
262
+ @cached_collection(
263
+ path=path,
264
+ force=check_should_force(kwargs),
265
+ cache=check_should_cache(kwargs),
266
+ )
267
+ def _get_obsolete() -> list[str]:
268
+ ontology = get_ontology(prefix, **kwargs)
269
+ return sorted(ontology.get_obsolete())
226
270
 
227
271
  return set(_get_obsolete())
228
272
 
229
273
 
230
274
  @wrap_norm_prefix
231
- def get_synonyms(prefix: str, identifier: str) -> list[str] | None:
275
+ def get_obsolete_references(prefix: str, **kwargs: Unpack[GetOntologyKwargs]) -> set[Reference]:
276
+ """Get the set of obsolete references."""
277
+ return {
278
+ Reference(prefix=prefix, identifier=identifier)
279
+ for identifier in get_obsolete(prefix, **kwargs)
280
+ }
281
+
282
+
283
+ def get_synonyms(
284
+ prefix: str | curies.Reference | curies.ReferenceTuple,
285
+ identifier: str | None = None,
286
+ /,
287
+ **kwargs: Unpack[GetOntologyKwargs],
288
+ ) -> list[str] | None:
232
289
  """Get the synonyms for an entity."""
233
- return _help_get(get_id_synonyms_mapping, prefix, identifier)
290
+ reference = _get_pi(prefix, identifier)
291
+ return _help_get(get_id_synonyms_mapping, reference, **kwargs)
234
292
 
235
293
 
236
294
  @wrap_norm_prefix
237
295
  def get_id_synonyms_mapping(
238
- prefix: str,
239
- *,
240
- force: bool = False,
241
- strict: bool = False,
242
- version: str | None = None,
296
+ prefix: str, **kwargs: Unpack[GetOntologyKwargs]
243
297
  ) -> Mapping[str, list[str]]:
244
298
  """Get the OBO file and output a synonym dictionary."""
245
- if version is None:
246
- version = get_version(prefix)
247
- path = prefix_cache_join(prefix, name="synonyms.tsv", version=version)
248
-
249
- @cached_multidict(path=path, header=[f"{prefix}_id", "synonym"], force=force)
250
- def _get_multidict() -> Mapping[str, list[str]]:
251
- logger.info("[%s v%s] no cached synonyms found. getting from OBO loader", prefix, version)
252
- ontology = get_ontology(prefix, force=force, strict=strict, version=version)
253
- return ontology.get_id_synonyms_mapping()
254
-
255
- return _get_multidict()
299
+ df = get_literal_mappings_df(prefix=prefix, **kwargs)
300
+ prefix_with_colon = f"{prefix}:"
301
+ prefix_with_colon_len = len(prefix_with_colon)
302
+ # keep only literal mappings with the right prefix
303
+ df = df[df["curie"].str.startswith(prefix_with_colon)]
304
+ return multidict(
305
+ (curie[prefix_with_colon_len:], text) for curie, text in df[["curie", "text"]].values
306
+ )
307
+
308
+
309
+ def get_literal_mappings(
310
+ prefix: str, *, skip_obsolete: bool = False, **kwargs: Unpack[GetOntologyKwargs]
311
+ ) -> list[LiteralMapping]:
312
+ """Get literal mappings."""
313
+ df = get_literal_mappings_df(prefix=prefix, **kwargs)
314
+ rv = ssslm.df_to_literal_mappings(df, reference_cls=Reference)
315
+ if skip_obsolete:
316
+ obsoletes = get_obsolete_references(prefix, **kwargs)
317
+ rv = [lm for lm in rv if lm.reference not in obsoletes]
318
+ return rv
319
+
320
+
321
+ def get_literal_mappings_df(
322
+ prefix: str,
323
+ **kwargs: Unpack[GetOntologyKwargs],
324
+ ) -> pd.DataFrame:
325
+ """Get a literal mappings dataframe."""
326
+ version = get_version_from_kwargs(prefix, kwargs)
327
+ path = get_cache_path(prefix, CacheArtifact.literal_mappings, version=version)
328
+
329
+ @cached_df(
330
+ path=path, dtype=str, force=check_should_force(kwargs), cache=check_should_cache(kwargs)
331
+ )
332
+ def _df_getter() -> pd.DataFrame:
333
+ return get_ontology(prefix, **kwargs).get_literal_mappings_df()
334
+
335
+ return _df_getter()