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
@@ -0,0 +1,57 @@
1
+ [
2
+ {
3
+ "identifier": "backwardCompatibleWith",
4
+ "label": "backwardCompatibleWith",
5
+ "prefix": "owl"
6
+ },
7
+ {
8
+ "identifier": "bottomDataProperty",
9
+ "label": "bottomDataProperty",
10
+ "prefix": "owl"
11
+ },
12
+ {
13
+ "identifier": "bottomObjectProperty",
14
+ "label": "bottomObjectProperty",
15
+ "prefix": "owl"
16
+ },
17
+ {
18
+ "identifier": "deprecated",
19
+ "label": "deprecated",
20
+ "prefix": "owl"
21
+ },
22
+ {
23
+ "identifier": "imports",
24
+ "label": "imports",
25
+ "prefix": "owl"
26
+ },
27
+ {
28
+ "identifier": "incompatibleWith",
29
+ "label": "incompatibleWith",
30
+ "prefix": "owl"
31
+ },
32
+ {
33
+ "identifier": "priorVersion",
34
+ "label": "priorVersion",
35
+ "prefix": "owl"
36
+ },
37
+ {
38
+ "identifier": "topDataProperty",
39
+ "label": "topDataProperty",
40
+ "prefix": "owl"
41
+ },
42
+ {
43
+ "identifier": "topObjectProperty",
44
+ "label": "topObjectProperty",
45
+ "prefix": "owl"
46
+ },
47
+ {
48
+ "identifier": "versionIRI",
49
+ "label": "versionIRI",
50
+ "prefix": "owl"
51
+ },
52
+ {
53
+ "identifier": "versionInfo",
54
+ "label": "versionInfo",
55
+ "prefix": "owl"
56
+ }
57
+ ]
@@ -0,0 +1 @@
1
+ []
@@ -0,0 +1,7 @@
1
+ [
2
+ {
3
+ "identifier": "seeAlso",
4
+ "label": "see also",
5
+ "prefix": "rdfs"
6
+ }
7
+ ]
pyobo/mocks.py CHANGED
@@ -1,7 +1,9 @@
1
1
  """Mocks for PyOBO."""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
  from collections.abc import Mapping
4
- from typing import Optional, TypeVar, Union
6
+ from typing import TypeVar
5
7
  from unittest import mock
6
8
 
7
9
  import pandas as pd
@@ -9,10 +11,10 @@ import pandas as pd
9
11
  from pyobo.constants import XREF_COLUMNS
10
12
 
11
13
  __all__ = [
12
- "get_mock_id_name_mapping",
13
- "get_mock_id_synonyms_mapping",
14
14
  "get_mock_get_xrefs_df",
15
15
  "get_mock_id_alts_mapping",
16
+ "get_mock_id_name_mapping",
17
+ "get_mock_id_synonyms_mapping",
16
18
  ]
17
19
 
18
20
 
@@ -35,7 +37,8 @@ def get_mock_id_synonyms_mapping(data: Mapping[str, Mapping[str, list[str]]]) ->
35
37
  def get_mock_id_alts_mapping(data: Mapping[str, Mapping[str, list[str]]]) -> mock._patch:
36
38
  """Mock the :func:`pyobo.extract.get_id_to_alts` function.
37
39
 
38
- :param data: A mapping from prefix to mappings of identifier to lists of alternative identifiers.
40
+ :param data: A mapping from prefix to mappings of identifier to lists of alternative
41
+ identifiers.
39
42
  """
40
43
  return _replace_mapping_getter("pyobo.api.alts.get_id_to_alts", data)
41
44
 
@@ -51,7 +54,7 @@ def _replace_mapping_getter(name: str, data: Mapping[str, Mapping[str, X]]) -> m
51
54
 
52
55
 
53
56
  def get_mock_get_xrefs_df(
54
- df: Union[list[tuple[str, str, str, str, str]], pd.DataFrame],
57
+ df: list[tuple[str, str, str, str, str]] | pd.DataFrame,
55
58
  ) -> mock._patch:
56
59
  """Mock the :func:`pyobo.xrefsdb.xrefs_pipeline.get_xref_df` function.
57
60
 
@@ -69,7 +72,7 @@ def get_mock_get_xrefs_df(
69
72
 
70
73
 
71
74
  def _make_mock_get_name(name: str, data: Mapping[str, Mapping[str, X]]) -> mock._patch:
72
- def _get_name(prefix: str, identifier: str) -> Optional[X]:
75
+ def _get_name(prefix: str, identifier: str) -> X | None:
73
76
  return data.get(prefix, {}).get(identifier)
74
77
 
75
78
  return mock.patch(name, side_effect=_get_name)
pyobo/ner/__init__.py ADDED
@@ -0,0 +1,9 @@
1
+ """Wrapper around NER functionalities."""
2
+
3
+ from .api import get_grounder
4
+ from .normalizer import ground
5
+
6
+ __all__ = [
7
+ "get_grounder",
8
+ "ground",
9
+ ]
pyobo/ner/api.py ADDED
@@ -0,0 +1,72 @@
1
+ """NER functionality."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Iterable
6
+ from subprocess import CalledProcessError
7
+ from typing import TYPE_CHECKING
8
+
9
+ import ssslm
10
+ from ssslm import LiteralMapping
11
+ from tqdm import tqdm
12
+ from typing_extensions import Unpack
13
+
14
+ from pyobo.api import get_literal_mappings
15
+ from pyobo.constants import GetOntologyKwargs, check_should_use_tqdm
16
+ from pyobo.getters import NoBuildError
17
+
18
+ if TYPE_CHECKING:
19
+ import gilda
20
+
21
+ __all__ = [
22
+ "get_grounder",
23
+ ]
24
+
25
+
26
+ def get_grounder(
27
+ prefixes: str | Iterable[str],
28
+ *,
29
+ grounder_cls: type[gilda.Grounder] | None = None,
30
+ versions: None | str | Iterable[str | None] | dict[str, str] = None,
31
+ skip_obsolete: bool = False,
32
+ **kwargs: Unpack[GetOntologyKwargs],
33
+ ) -> ssslm.Grounder:
34
+ """Get a grounder for the given prefix(es)."""
35
+ literal_mappings: list[LiteralMapping] = []
36
+ it = _clean_prefix_versions(prefixes, versions=versions)
37
+ disable = len(it) == 1 or not check_should_use_tqdm(kwargs)
38
+ for prefix, kwargs["version"] in tqdm(it, leave=False, disable=disable):
39
+ try:
40
+ literal_mappings.extend(
41
+ get_literal_mappings(
42
+ prefix,
43
+ skip_obsolete=skip_obsolete,
44
+ **kwargs,
45
+ )
46
+ )
47
+ except (NoBuildError, CalledProcessError):
48
+ continue
49
+
50
+ return ssslm.make_grounder(literal_mappings, implementation="gilda", grounder_cls=grounder_cls)
51
+
52
+
53
+ def _clean_prefix_versions(
54
+ prefixes: str | Iterable[str],
55
+ versions: None | str | Iterable[str | None] | dict[str, str] = None,
56
+ ) -> list[tuple[str, str | None]]:
57
+ if isinstance(prefixes, str):
58
+ prefixes = [prefixes]
59
+ else:
60
+ prefixes = list(prefixes)
61
+ if versions is None:
62
+ versions = [None] * len(prefixes)
63
+ elif isinstance(versions, str):
64
+ versions = [versions]
65
+ elif isinstance(versions, dict):
66
+ versions = [versions.get(prefix) for prefix in prefixes]
67
+ else:
68
+ versions = list(versions)
69
+ if len(prefixes) != len(versions):
70
+ raise ValueError
71
+
72
+ return list(zip(prefixes, versions, strict=True))
@@ -0,0 +1,33 @@
1
+ """Use synonyms from OBO to normalize names."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Iterable
6
+
7
+ from typing_extensions import Unpack
8
+
9
+ from .api import get_grounder
10
+ from ..constants import GetOntologyKwargs
11
+ from ..struct import Reference
12
+
13
+ __all__ = [
14
+ "ground",
15
+ ]
16
+
17
+
18
+ def ground(
19
+ prefix: str | Iterable[str], query: str, **kwargs: Unpack[GetOntologyKwargs]
20
+ ) -> Reference | None:
21
+ """Normalize a string given the prefix's labels and synonyms.
22
+
23
+ :param prefix: If a string, only grounds against that namespace. If a list, will try grounding
24
+ against all in that order
25
+ :param query: The string to try grounding
26
+ """
27
+ grounder = get_grounder(prefix, **kwargs)
28
+ match = grounder.get_best_match(query)
29
+ if match:
30
+ # TODO when generics are working, the grounder
31
+ # can be type annotated with the right reference
32
+ return Reference.from_reference(match.reference)
33
+ return None
pyobo/obographs.py CHANGED
@@ -1,12 +1,12 @@
1
1
  """Convert PyOBO into OBO Graph."""
2
2
 
3
+ from __future__ import annotations
4
+
5
+ import logging
3
6
  from collections.abc import Iterable
4
7
 
5
8
  import bioregistry
6
- import curies
7
9
  from bioontologies.obograph import (
8
- OBO_SYNONYM_TO_OIO,
9
- OIO_TO_REFERENCE,
10
10
  Definition,
11
11
  Edge,
12
12
  Graph,
@@ -19,7 +19,7 @@ from bioontologies.obograph import (
19
19
  from bioontologies.robot import ParseResults
20
20
  from tqdm import tqdm
21
21
 
22
- from pyobo.struct import Obo, Reference, Term
22
+ from pyobo.struct import Obo, OBOLiteral, Reference, Term
23
23
  from pyobo.struct.typedef import definition_source, is_a
24
24
 
25
25
  __all__ = [
@@ -27,6 +27,8 @@ __all__ = [
27
27
  "parse_results_from_obo",
28
28
  ]
29
29
 
30
+ logger = logging.getLogger(__name__)
31
+
30
32
 
31
33
  def parse_results_from_obo(obo: Obo) -> ParseResults:
32
34
  """Get parse results from an OBO graph."""
@@ -59,40 +61,28 @@ def _get_meta(obo: Obo) -> Meta:
59
61
  )
60
62
 
61
63
 
62
- def _rewire(r: Reference) -> curies.Reference:
63
- return curies.Reference(prefix=r.prefix, identifier=r.identifier)
64
-
65
-
66
64
  def _get_class_node(term: Term) -> Node:
67
- if term.definition or term.provenance:
65
+ if term.provenance or term.definition:
68
66
  definition = Definition.from_parsed(
69
- value=term.definition, references=[_rewire(p) for p in term.provenance]
67
+ value=term.definition, references=_prep_prov(term.provenance)
70
68
  )
71
69
  else:
72
70
  definition = None
73
-
74
- if term.xrefs:
75
- if not term.xref_types:
76
- term.xref_types = [
77
- Reference(prefix="oboInOwl", identifier="hasDbXref") for _ in term.xrefs
78
- ]
79
- elif len(term.xrefs) != len(term.xref_types):
80
- raise ValueError
81
-
82
71
  xrefs = [
83
72
  Xref.from_parsed(
84
- predicate=_rewire(xref_type),
85
- value=_rewire(xref),
73
+ predicate=Reference.from_reference(mapping_predicate),
74
+ value=Reference.from_reference(mapping_object),
75
+ )
76
+ for mapping_predicate, mapping_object in term.get_mappings(
77
+ include_xrefs=True, add_context=False
86
78
  )
87
- for xref, xref_type in zip(term.xrefs, term.xref_types)
88
79
  ]
89
- default_st = Reference(prefix="oboInOwl", identifier="SynonymType")
90
80
  synonyms = [
91
81
  Synonym.from_parsed(
92
82
  name=synonym.name,
93
- predicate=OIO_TO_REFERENCE[OBO_SYNONYM_TO_OIO[synonym.specificity]],
94
- synonym_type=_rewire(synonym.type.reference) if synonym.type else default_st,
95
- references=[_rewire(x) for x in synonym.provenance],
83
+ predicate=Reference.from_reference(synonym.predicate),
84
+ synonym_type=Reference.from_reference(synonym.type) if synonym.type else None,
85
+ references=_prep_prov(synonym.provenance),
96
86
  )
97
87
  for synonym in term.synonyms
98
88
  ]
@@ -105,35 +95,49 @@ def _get_class_node(term: Term) -> Node:
105
95
  deprecated=term.is_obsolete or False,
106
96
  )
107
97
  return Node(
108
- id=term.bioregistry_link,
98
+ # FIXME do expansion same as for OFN
99
+ id=f"https://bioregistry.io/{term.curie}",
109
100
  lbl=term.name,
110
101
  meta=meta,
111
102
  type="CLASS",
112
- reference=_rewire(term.reference),
103
+ reference=Reference.from_reference(term.reference),
113
104
  standardized=True,
114
105
  )
115
106
 
116
107
 
108
+ def _prep_prov(provenance):
109
+ rv = []
110
+ for x in provenance:
111
+ match x:
112
+ case Reference():
113
+ rv.append(Reference.from_reference(x))
114
+ case OBOLiteral():
115
+ logger.debug("not implemented to convert literal provenance")
116
+ continue
117
+ return rv
118
+
119
+
117
120
  def _iter_edges(term: Term) -> Iterable[Edge]:
118
121
  for parent in term.parents:
119
122
  yield Edge.from_parsed(
120
- _rewire(term.reference),
121
- _rewire(is_a.reference),
122
- _rewire(parent),
123
+ Reference.from_reference(term.reference),
124
+ Reference.from_reference(is_a.reference),
125
+ Reference.from_reference(parent),
123
126
  )
124
127
 
125
128
  for typedef, targets in term.relationships.items():
126
129
  for target in targets:
127
130
  yield Edge.from_parsed(
128
- _rewire(term.reference),
129
- _rewire(typedef.reference),
130
- _rewire(target),
131
+ Reference.from_reference(term.reference),
132
+ Reference.from_reference(typedef),
133
+ Reference.from_reference(target),
131
134
  )
132
135
 
133
136
  for provenance_reference in term.provenance:
134
- yield Edge.from_parsed(
135
- _rewire(term.reference),
136
- _rewire(definition_source.reference),
137
- _rewire(provenance_reference),
138
- )
137
+ if isinstance(provenance_reference, Reference):
138
+ yield Edge.from_parsed(
139
+ Reference.from_reference(term.reference),
140
+ Reference.from_reference(definition_source.reference),
141
+ Reference.from_reference(provenance_reference),
142
+ )
139
143
  # TODO also look through xrefs and seealso to get provenance xrefs?
pyobo/plugins.py CHANGED
@@ -1,15 +1,16 @@
1
1
  """Tools for loading entry points."""
2
2
 
3
- from collections.abc import Iterable, Mapping
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Callable, Iterable, Mapping
4
6
  from functools import lru_cache
5
- from typing import Callable, Optional
6
7
 
7
8
  from .struct import Obo
8
9
 
9
10
  __all__ = [
10
11
  "has_nomenclature_plugin",
11
- "run_nomenclature_plugin",
12
12
  "iter_nomenclature_plugins",
13
+ "run_nomenclature_plugin",
13
14
  ]
14
15
 
15
16
 
@@ -32,7 +33,7 @@ def has_nomenclature_plugin(prefix: str) -> bool:
32
33
  return True
33
34
 
34
35
 
35
- def run_nomenclature_plugin(prefix: str, version: Optional[str] = None) -> Obo:
36
+ def run_nomenclature_plugin(prefix: str, version: str | None = None) -> Obo:
36
37
  """Get a converted PyOBO source."""
37
38
  from .sources import ontology_resolver
38
39
 
pyobo/py.typed CHANGED
File without changes