pyobo 0.11.0__py3-none-any.whl → 0.11.1__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.
pyobo/sources/rgd.py CHANGED
@@ -137,7 +137,7 @@ def get_terms(force: bool = False, version: Optional[str] = None) -> Iterable[Te
137
137
  continue
138
138
  if prefix == "uniprot":
139
139
  term.append_relationship(
140
- has_gene_product, Reference.auto(prefix=prefix, identifier=xref_id)
140
+ has_gene_product, Reference(prefix=prefix, identifier=xref_id)
141
141
  )
142
142
  elif prefix == "ensembl":
143
143
  if xref_id.startswith("ENSMUSG") or xref_id.startswith("ENSRNOG"):
pyobo/sources/slm.py CHANGED
@@ -77,10 +77,10 @@ def iter_terms(version: str, force: bool = False):
77
77
  smiles,
78
78
  inchi,
79
79
  inchikey,
80
- chebi_id,
81
- lipidmaps_id,
82
- hmdb_id,
83
- pmids,
80
+ chebi_ids,
81
+ lipidmaps_ids,
82
+ hmdb_ids,
83
+ pubmed_ids,
84
84
  ) in tqdm(
85
85
  df[COLUMNS].values, desc=f"[{PREFIX}] generating terms", unit_scale=True, unit="lipid"
86
86
  ):
@@ -103,21 +103,35 @@ def iter_terms(version: str, force: bool = False):
103
103
  inchi = inchi[len("InChI=") :]
104
104
  term.append_property(has_inchi, inchi)
105
105
  if pd.notna(inchikey):
106
- if inchikey.startswith("InChIKey="):
107
- inchikey = inchikey[len("InChIKey=") :]
108
- term.append_exact_match(Reference(prefix="inchikey", identifier=inchikey))
109
- if pd.notna(chebi_id):
110
- term.append_exact_match(("chebi", chebi_id))
111
- if pd.notna(lipidmaps_id):
106
+ inchikey = inchikey.removeprefix("InChIKey=").strip()
107
+ if inchikey and inchikey != "none":
108
+ try:
109
+ inchi_ref = Reference(prefix="inchikey", identifier=inchikey)
110
+ except ValueError:
111
+ tqdm.write(
112
+ f"[slm:{identifier}] had invalid inchikey reference: ({type(inchikey)}) {inchikey}"
113
+ )
114
+ else:
115
+ term.append_exact_match(inchi_ref)
116
+ for chebi_id in _split(chebi_ids):
117
+ term.append_xref(("chebi", chebi_id))
118
+ for lipidmaps_id in _split(lipidmaps_ids):
112
119
  term.append_exact_match(("lipidmaps", lipidmaps_id))
113
- if pd.notna(hmdb_id):
120
+ for hmdb_id in _split(hmdb_ids):
114
121
  term.append_exact_match(("hmdb", hmdb_id))
115
- if pd.notna(pmids):
116
- for pmid in pmids.split("|"):
117
- term.append_provenance(("pubmed", pmid))
122
+ for pubmed_id in _split(pubmed_ids):
123
+ term.append_provenance(("pubmed", pubmed_id))
118
124
  # TODO how to handle class, parents, and components?
119
125
  yield term
120
126
 
121
127
 
128
+ def _split(s: str) -> Iterable[str]:
129
+ if pd.notna(s):
130
+ for x in s.split("|"):
131
+ x = x.strip()
132
+ if x:
133
+ yield x
134
+
135
+
122
136
  if __name__ == "__main__":
123
137
  get_obo().write_default(write_obo=True, use_tqdm=True)
@@ -82,7 +82,7 @@ def iter_terms(version: Optional[str] = None) -> Iterable[Term]:
82
82
  pubmeds,
83
83
  pdbs,
84
84
  proteome,
85
- gene_id,
85
+ gene_ids,
86
86
  rhea_curies,
87
87
  go_components,
88
88
  go_functions,
@@ -94,13 +94,14 @@ def iter_terms(version: Optional[str] = None) -> Iterable[Term]:
94
94
  description = description.removeprefix("FUNCTION: ")
95
95
  term = Term(
96
96
  reference=Reference(prefix=PREFIX, identifier=uniprot_id, name=accession),
97
- definition=description or None,
97
+ # definition=description or None,
98
98
  )
99
99
  term.set_species(taxonomy_id)
100
- if gene_id:
101
- term.append_relationship(
102
- gene_product_of, Reference(prefix="ncbigene", identifier=gene_id)
103
- )
100
+ if gene_ids:
101
+ for gene_id in gene_ids.split(";"):
102
+ term.append_relationship(
103
+ gene_product_of, Reference(prefix="ncbigene", identifier=gene_id.strip())
104
+ )
104
105
 
105
106
  # TODO add type=Reference(prefix="xsd", identifier="boolean")
106
107
  term.append_property("reviewed", "true")
pyobo/sources/zfin.py CHANGED
@@ -7,6 +7,7 @@ from typing import Optional
7
7
 
8
8
  from tqdm.auto import tqdm
9
9
 
10
+ from pyobo.resources.so import get_so_name
10
11
  from pyobo.struct import (
11
12
  Obo,
12
13
  Reference,
@@ -113,7 +114,9 @@ def get_terms(force: bool = False, version: Optional[str] = None) -> Iterable[Te
113
114
  )
114
115
  df["sequence_ontology_id"] = df["sequence_ontology_id"].map(lambda x: x[len("SO:") :])
115
116
  so = {
116
- sequence_ontology_id: Reference.auto(prefix="SO", identifier=sequence_ontology_id)
117
+ sequence_ontology_id: Reference(
118
+ prefix="SO", identifier=sequence_ontology_id, name=get_so_name(sequence_ontology_id)
119
+ )
117
120
  for sequence_ontology_id in df["sequence_ontology_id"].unique()
118
121
  }
119
122
  for _, reference in sorted(so.items()):
@@ -135,17 +138,26 @@ def get_terms(force: bool = False, version: Optional[str] = None) -> Iterable[Te
135
138
  term.append_alt(alt_id)
136
139
  entrez_id = entrez_mappings.get(identifier)
137
140
  if entrez_id:
138
- term.append_exact_match(Reference(prefix="ncbigene", identifier=entrez_id))
141
+ try:
142
+ ncbigene_ref = Reference(prefix="ncbigene", identifier=entrez_id)
143
+ except ValueError:
144
+ tqdm.write(f"[zfin] invalid NCBI gene: {entrez_id}")
145
+ else:
146
+ term.append_exact_match(ncbigene_ref)
139
147
  for uniprot_id in uniprot_mappings.get(identifier, []):
140
- term.append_relationship(has_gene_product, Reference.auto("uniprot", uniprot_id))
148
+ term.append_relationship(
149
+ has_gene_product, Reference(prefix="uniprot", identifier=uniprot_id)
150
+ )
141
151
  for hgnc_id in human_orthologs.get(identifier, []):
142
- term.append_relationship(orthologous, Reference.auto("hgnc", hgnc_id))
152
+ term.append_relationship(orthologous, Reference(prefix="hgnc", identifier=hgnc_id))
143
153
  for mgi_curie in mouse_orthologs.get(identifier, []):
144
- mouse_ortholog = Reference.from_curie(mgi_curie, auto=True)
154
+ mouse_ortholog = Reference.from_curie(mgi_curie)
145
155
  if mouse_ortholog:
146
156
  term.append_relationship(orthologous, mouse_ortholog)
147
157
  for flybase_id in fly_orthologs.get(identifier, []):
148
- term.append_relationship(orthologous, Reference.auto("flybase", flybase_id))
158
+ term.append_relationship(
159
+ orthologous, Reference(prefix="flybase", identifier=flybase_id)
160
+ )
149
161
 
150
162
  yield term
151
163
 
pyobo/struct/reference.py CHANGED
@@ -8,6 +8,7 @@ from curies.api import ExpansionError
8
8
  from pydantic import Field, field_validator, model_validator
9
9
 
10
10
  from .utils import obo_escape
11
+ from ..constants import GLOBAL_CHECK_IDS
11
12
  from ..identifier_utils import normalize_curie
12
13
 
13
14
  __all__ = [
@@ -45,13 +46,13 @@ class Reference(curies.Reference):
45
46
  prefix, identifier = values.get("prefix"), values.get("identifier")
46
47
  if not prefix or not identifier:
47
48
  return values
48
- norm_prefix = bioregistry.normalize_prefix(prefix)
49
- if norm_prefix is None:
49
+ resource = bioregistry.get_resource(prefix)
50
+ if resource is None:
50
51
  raise ExpansionError(f"Unknown prefix: {prefix}")
51
- values["prefix"] = norm_prefix
52
- values["identifier"] = bioregistry.standardize_identifier(norm_prefix, identifier).strip()
53
- # if not bioregistry.is_valid_identifier(norm_prefix, values["identifier"]):
54
- # raise ValueError(f"non-standard identifier: {norm_prefix}:{norm_identifier}")
52
+ values["prefix"] = resource.prefix
53
+ values["identifier"] = resource.standardize_identifier(identifier)
54
+ if GLOBAL_CHECK_IDS and not resource.is_valid_identifier(values["identifier"]):
55
+ raise ValueError(f"non-standard identifier: {resource.prefix}:{values['identifier']}")
55
56
  return values
56
57
 
57
58
  @classmethod
@@ -60,7 +61,7 @@ class Reference(curies.Reference):
60
61
  from ..api import get_name
61
62
 
62
63
  name = get_name(prefix, identifier)
63
- return cls(prefix=prefix, identifier=identifier, name=name)
64
+ return cls.model_validate({"prefix": prefix, "identifier": identifier, "name": name})
64
65
 
65
66
  @property
66
67
  def bioregistry_link(self) -> str:
@@ -116,7 +117,7 @@ class Reference(curies.Reference):
116
117
  return None
117
118
  if name is None and auto:
118
119
  return cls.auto(prefix=prefix, identifier=identifier)
119
- return cls(prefix=prefix, identifier=identifier, name=name)
120
+ return cls.model_validate({"prefix": prefix, "identifier": identifier, "name": name})
120
121
 
121
122
  @property
122
123
  def _escaped_identifier(self):
pyobo/struct/struct.py CHANGED
@@ -4,6 +4,7 @@ import gzip
4
4
  import json
5
5
  import logging
6
6
  import os
7
+ import sys
7
8
  from collections import defaultdict
8
9
  from collections.abc import Collection, Iterable, Iterator, Mapping, Sequence
9
10
  from dataclasses import dataclass, field
@@ -603,6 +604,11 @@ class Obo:
603
604
 
604
605
  return graph_from_obo(self)
605
606
 
607
+ def write_obograph(self, path: Path) -> None:
608
+ """Write OBO Graph json."""
609
+ graph = self.get_graph()
610
+ path.write_text(graph.model_dump_json(indent=2, exclude_none=True, exclude_unset=True))
611
+
606
612
  @classmethod
607
613
  def cli(cls) -> None:
608
614
  """Run the CLI for this class."""
@@ -616,22 +622,31 @@ class Obo:
616
622
  @click.command()
617
623
  @verbose_option
618
624
  @force_option
625
+ @click.option("--rewrite", "-r", is_flag=True)
619
626
  @click.option("--owl", is_flag=True, help="Write OWL via ROBOT")
620
- @click.option("--graph", is_flag=True, help="Write OBO Graph JSON via ROBOT")
621
627
  @click.option("--nodes", is_flag=True, help="Write nodes file")
622
628
  @click.option(
623
629
  "--version", help="Specify data version to get. Use this if bioversions is acting up."
624
630
  )
625
- def _main(force: bool, owl: bool, graph: bool, nodes: bool, version: Optional[str]):
626
- inst = cls(force=force, data_version=version)
627
- inst.write_default(
628
- write_obograph=graph,
629
- write_obo=True,
630
- write_owl=owl,
631
- write_nodes=nodes,
632
- force=force,
633
- use_tqdm=True,
634
- )
631
+ def _main(force: bool, owl: bool, nodes: bool, version: Optional[str], rewrite: bool):
632
+ try:
633
+ inst = cls(force=force, data_version=version)
634
+ except Exception as e:
635
+ click.secho(f"[{cls.ontology}] Got an exception during instantiation - {type(e)}")
636
+ sys.exit(1)
637
+
638
+ try:
639
+ inst.write_default(
640
+ write_obograph=True,
641
+ write_obo=True,
642
+ write_owl=owl,
643
+ write_nodes=nodes,
644
+ force=force or rewrite,
645
+ use_tqdm=True,
646
+ )
647
+ except Exception as e:
648
+ click.secho(f"[{cls.ontology}] Got an exception during OBO writing {type(e)}")
649
+ sys.exit(1)
635
650
 
636
651
  return _main
637
652
 
@@ -865,16 +880,11 @@ class Obo:
865
880
  relation_df.sort_values(list(relation_df.columns), inplace=True)
866
881
  relation_df.to_csv(relations_path, sep="\t", index=False)
867
882
 
868
- if (write_obo or write_obograph or write_owl) and (not self._obo_path.exists() or force):
883
+ if (write_obo or write_owl) and (not self._obo_path.exists() or force):
869
884
  self.write_obo(self._obo_path, use_tqdm=use_tqdm)
870
- if write_obograph:
871
- # obo_to_obograph(self._obo_path, self._obograph_path)
872
- self._obograph_path.write_text(
873
- self.get_graph().json(
874
- indent=2, ensure_ascii=False, exclude_none=True, exclude_unset=True
875
- )
876
- )
877
- if write_owl:
885
+ if write_obograph and (not self._obograph_path.exists() or force):
886
+ self.write_obograph(self._obograph_path)
887
+ if write_owl and (not self._owl_path.exists() or force):
878
888
  obo_to_owl(self._obo_path, self._owl_path)
879
889
  if write_obonet and (not self._obonet_gz_path.exists() or force):
880
890
  logger.debug("writing obonet to %s", self._obonet_gz_path)
pyobo/struct/typedef.py CHANGED
@@ -365,6 +365,11 @@ has_homepage = TypeDef(
365
365
  reference=Reference(prefix="foaf", identifier="homepage", name="homepage"), is_metadata_tag=True
366
366
  )
367
367
 
368
+ has_category = TypeDef(
369
+ reference=Reference(prefix="biolink", identifier="category", name="has category"),
370
+ is_metadata_tag=True,
371
+ )
372
+
368
373
  default_typedefs: dict[tuple[str, str], TypeDef] = {
369
374
  v.pair: v for k, v in locals().items() if isinstance(v, TypeDef)
370
375
  }
pyobo/version.py CHANGED
@@ -12,7 +12,7 @@ __all__ = [
12
12
  "get_git_hash",
13
13
  ]
14
14
 
15
- VERSION = "0.11.0"
15
+ VERSION = "0.11.1"
16
16
 
17
17
 
18
18
  def get_git_hash() -> str:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyobo
3
- Version: 0.11.0
3
+ Version: 0.11.1
4
4
  Summary: A python package for handling and generating OBO
5
5
  Author-email: Charles Tapley Hoyt <cthoyt@gmail.com>
6
6
  Maintainer-email: Charles Tapley Hoyt <cthoyt@gmail.com>
@@ -63,8 +63,8 @@ Requires-Dist: humanize
63
63
  Requires-Dist: tabulate
64
64
  Requires-Dist: cachier
65
65
  Requires-Dist: pystow >=0.2.7
66
- Requires-Dist: bioversions >=0.5.514
67
- Requires-Dist: bioregistry >=0.10.20
66
+ Requires-Dist: bioversions >=0.5.535
67
+ Requires-Dist: bioregistry >=0.11.23
68
68
  Requires-Dist: bioontologies >=0.4.0
69
69
  Requires-Dist: zenodo-client >=0.0.5
70
70
  Requires-Dist: class-resolver
@@ -109,10 +109,12 @@ Requires-Dist: coverage ; extra == 'tests'
109
109
  <img src="https://codecov.io/gh/biopragmatics/pyobo/branch/main/graph/badge.svg" alt="Codecov status" /></a>
110
110
  <a href="https://github.com/cthoyt/cookiecutter-python-package">
111
111
  <img alt="Cookiecutter template from @cthoyt" src="https://img.shields.io/badge/Cookiecutter-snekpack-blue" /></a>
112
- <a href='https://github.com/psf/black'>
113
- <img src='https://img.shields.io/badge/code%20style-black-000000.svg' alt='Code style: black' /></a>
112
+ <a href="https://github.com/astral-sh/ruff">
113
+ <img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Ruff" style="max-width:100%;"></a>
114
114
  <a href="https://github.com/biopragmatics/pyobo/blob/main/.github/CODE_OF_CONDUCT.md">
115
115
  <img src="https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg" alt="Contributor Covenant"/></a>
116
+ <a href="https://doi.org/10.5281/zenodo.3381961">
117
+ <img src="https://zenodo.org/badge/DOI/10.5281/zenodo.3381961.svg" alt="DOI"></a>
116
118
  </p>
117
119
 
118
120
  Tools for biological identifiers, names, synonyms, xrefs, hierarchies, relations, and properties through the
@@ -500,14 +502,14 @@ and make update to the `url` entry for that namespace in the Bioregistry.
500
502
  The most recent release can be installed from
501
503
  [PyPI](https://pypi.org/project/pyobo/) with:
502
504
 
503
- ```shell
504
- pip install pyobo
505
+ ```console
506
+ python3 -m pip install pyobo
505
507
  ```
506
508
 
507
509
  The most recent code and data can be installed directly from GitHub with:
508
510
 
509
- ```shell
510
- pip install git+https://github.com/biopragmatics/pyobo.git
511
+ ```console
512
+ python3 -m pip install git+https://github.com/biopragmatics/pyobo.git
511
513
  ```
512
514
 
513
515
  ## 👐 Contributing
@@ -564,10 +566,10 @@ The final section of the README is for if you want to get involved by making a c
564
566
 
565
567
  To install in development mode, use the following:
566
568
 
567
- ```bash
569
+ ```console
568
570
  git clone git+https://github.com/biopragmatics/pyobo.git
569
571
  cd pyobo
570
- pip install -e .
572
+ python3 -m pip install -e .
571
573
  ```
572
574
 
573
575
  ### Updating Package Boilerplate
@@ -576,8 +578,8 @@ This project uses `cruft` to keep boilerplate (i.e., configuration, contribution
576
578
  configuration)
577
579
  up-to-date with the upstream cookiecutter package. Update with the following:
578
580
 
579
- ```shell
580
- pip install cruft
581
+ ```console
582
+ python3 -m pip install cruft
581
583
  cruft update
582
584
  ```
583
585
 
@@ -586,10 +588,11 @@ available [here](https://github.com/cruft/cruft?tab=readme-ov-file#updating-a-pr
586
588
 
587
589
  ### 🥼 Testing
588
590
 
589
- After cloning the repository and installing `tox` with `pip install tox tox-uv`,
591
+ After cloning the repository and installing `tox` with
592
+ `python3 -m pip install tox tox-uv`,
590
593
  the unit tests in the `tests/` folder can be run reproducibly with:
591
594
 
592
- ```shell
595
+ ```console
593
596
  tox -e py
594
597
  ```
595
598
 
@@ -600,12 +603,12 @@ Additionally, these tests are automatically re-run with each commit in a
600
603
 
601
604
  The documentation can be built locally using the following:
602
605
 
603
- ```shell
606
+ ```console
604
607
  git clone git+https://github.com/biopragmatics/pyobo.git
605
608
  cd pyobo
606
609
  tox -e docs
607
610
  open docs/build/html/index.html
608
- ```
611
+ ```
609
612
 
610
613
  The documentation automatically installs the package as well as the `docs`
611
614
  extra specified in the [`pyproject.toml`](../../Desktop/pyobo/pyproject.toml). `sphinx` plugins
@@ -661,38 +664,23 @@ You only have to do the following steps once.
661
664
 
662
665
  #### Configuring your machine's connection to PyPI
663
666
 
664
- You have to do the following steps once per machine. Create a file in your home directory called
665
- `.pypirc` and include the following:
666
-
667
- ```ini
668
- [distutils]
669
- index-servers =
670
- pypi
671
- testpypi
672
-
673
- [pypi]
674
- username = __token__
675
- password = <the API token you just got>
667
+ You have to do the following steps once per machine.
676
668
 
677
- # This block is optional in case you want to be able to make test releases to the Test PyPI server
678
- [testpypi]
679
- repository = https://test.pypi.org/legacy/
680
- username = __token__
681
- password = <an API token from test PyPI>
669
+ ```console
670
+ $ uv tool install keyring
671
+ $ keyring set https://upload.pypi.org/legacy/ __token__
672
+ $ keyring set https://test.pypi.org/legacy/ __token__
682
673
  ```
683
674
 
684
- Note that since PyPI is requiring token-based authentication, we use `__token__` as the user, verbatim.
685
- If you already have a `.pypirc` file with a `[distutils]` section, just make sure that there is an `index-servers`
686
- key and that `pypi` is in its associated list. More information on configuring the `.pypirc` file can
687
- be found [here](https://packaging.python.org/en/latest/specifications/pypirc).
675
+ Note that this deprecates previous workflows using `.pypirc`.
688
676
 
689
677
  #### Uploading to PyPI
690
678
 
691
679
  After installing the package in development mode and installing
692
- `tox` with `pip install tox tox-uv`,
693
- run the following from the shell:
680
+ `tox` with `python3 -m pip install tox tox-uv`,
681
+ run the following from the console:
694
682
 
695
- ```shell
683
+ ```console
696
684
  tox -e finish
697
685
  ```
698
686
 
@@ -703,7 +691,7 @@ This script does the following:
703
691
  and [`docs/source/conf.py`](../../Desktop/pyobo/docs/source/conf.py) to not have the `-dev` suffix
704
692
  2. Packages the code in both a tar archive and a wheel using
705
693
  [`uv build`](https://docs.astral.sh/uv/guides/publish/#building-your-package)
706
- 3. Uploads to PyPI using [`twine`](https://github.com/pypa/twine).
694
+ 3. Uploads to PyPI using [`uv publish`](https://docs.astral.sh/uv/guides/publish/#publishing-your-package).
707
695
  4. Push to GitHub. You'll need to make a release going with the commit where the version was bumped.
708
696
  5. Bump the version to the next patch. If you made big changes and want to bump the version by minor, you can
709
697
  use `tox -e bumpversion -- minor` after.
@@ -1,18 +1,18 @@
1
1
  pyobo/__init__.py,sha256=k-oIvi7tNzCg0SA8D7jghJ9Q9GW6RXp75kszqsbZ_Xk,1837
2
2
  pyobo/__main__.py,sha256=cOYQ2OELxF-9T6nuZ9xnLSu9bLHk6einrsSoz7EcD9M,83
3
3
  pyobo/aws.py,sha256=8vg7VumLT3blTX8dyluS13jrBo6bwRHNEpkQw1njhXo,5946
4
- pyobo/constants.py,sha256=aonqwwtc65p-XgoPzTXL57dwJWkG5vXGK0ULES3u25U,1911
4
+ pyobo/constants.py,sha256=R6ZIJ9JylzEXaGAO70WcMwwwNXezKoTJDEWLskzcYZc,1936
5
5
  pyobo/getters.py,sha256=mOrlI8qrI3zHwloXNvpmQnSSxhZZLjBgg5ZUGUwqUK8,15557
6
- pyobo/gilda_utils.py,sha256=bj_r8WPHL_BuV2yxRcJDNYHqdExNTz973qeSfx4fpNg,8173
6
+ pyobo/gilda_utils.py,sha256=QXSzJmas1-BzT6S1O6XWnzKVjFzO_-vYoPZGi_HoUpw,8246
7
7
  pyobo/identifier_utils.py,sha256=UoDXiOeqlqMVXISR4Qhw1zXD0ss7jsw-fPs5Jsx8xyY,4533
8
8
  pyobo/mocks.py,sha256=Tivg8tLNFjUsbAF8TiY3iurhBbgmzGtYJmNMg_e6TTo,2422
9
9
  pyobo/normalizer.py,sha256=DfDuX2Ed3vCJgaezfHXorYcNui9vfR64AFJFYfF_NWk,8304
10
- pyobo/obographs.py,sha256=edsB4MF4x98C2EsIJ8ZifuG4oGA3YWXrCkIVd1iTbOg,3761
10
+ pyobo/obographs.py,sha256=3Bdot7c5KlrTPxmgnk3Y7tXmaVf0n9aL8QEs6pIGVHo,3912
11
11
  pyobo/plugins.py,sha256=UyEnXxFP2q9IdYp5o7DDXPBrcExvTx4LkvhvWXx-XQc,1227
12
12
  pyobo/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  pyobo/reader.py,sha256=C_-Dz0ScyFdr8DivHTYyDhIVg8SOwS_Y0DIuqKT2EJI,21292
14
14
  pyobo/resource_utils.py,sha256=8ZQx8d-HbmPyc_WHUhqx1yjUKFZMF101FopZwZPghoE,4273
15
- pyobo/version.py,sha256=HPxL1mV3HqbCzveHuGbwWCt4-rh8D-dif3AILKAlX80,919
15
+ pyobo/version.py,sha256=QvIJIOoOcrMgtVzkvER3psDs709LKt9w5I-rKlbzVcI,919
16
16
  pyobo/api/__init__.py,sha256=7_uVqbZVEWrKNBYxVJb86K9-dLsGD2d2H5wjLzIP1wU,1301
17
17
  pyobo/api/alts.py,sha256=fYA3S3odeem2-HvzeqUn0jkAFGdmbL1SYXCjIqKmRqs,2836
18
18
  pyobo/api/hierarchy.py,sha256=-zgM4n0n0h5v5aPOhG0AR3isOt10Vtpo6EwVYN00ngI,9509
@@ -53,6 +53,8 @@ pyobo/resources/ncbitaxon.py,sha256=rZtU6ik32UATBb5tRY5i5LU9_kpTA3vmPy9gOfhY_fU,
53
53
  pyobo/resources/ncbitaxon.tsv.gz,sha256=43zHjnVt62TA4_lV58X-FCPdMDfLg1B1PvZSr_Xy9hY,22981954
54
54
  pyobo/resources/ro.py,sha256=k8JoFKz64T1Pp39FKud1n4I3qPb178B2xSWJbAN8qdU,1461
55
55
  pyobo/resources/ro.tsv,sha256=YvlBLPAKy2w4IheYzO9ox1Yg6WkHdMVzMQTikIlECog,26586
56
+ pyobo/resources/so.py,sha256=S-vmQ7L8AJE08FfGVDIJqNQNaLPUmuJ6HC5F4hWHMrA,1466
57
+ pyobo/resources/so.tsv,sha256=UJZKFTEAv_XszYYbun4Wf6b4jovDjSKc1RWRQRcTzDw,82068
56
58
  pyobo/sources/README.md,sha256=w2klc3MjUbLL9VZxIZIqFrHMdQshPUGSCoFsYdUReD8,889
57
59
  pyobo/sources/__init__.py,sha256=WkyBXj7V1Y90qSijmHwF89GyC8kRj-Jv7DiFAzqX1iA,3811
58
60
  pyobo/sources/agrovoc.py,sha256=SJsbJ7KtxdJUG9Rimmb2CfLfzpK9eOzP0wx59gj-6s4,787
@@ -63,26 +65,26 @@ pyobo/sources/cgnc.py,sha256=MSEGwaZ8wOypR5sLALAl5Z3ay7K3RjqMC0GtJd4VvSc,2320
63
65
  pyobo/sources/chebi.py,sha256=IrfXfO9-75jxeDCjCBFBgRWe2R7DSQpQBOllgt7MmoI,1202
64
66
  pyobo/sources/chembl.py,sha256=5K5gtIrsqHyZSG8uxhqgXuvKjSXAw9i1dg20boZg8Fg,2280
65
67
  pyobo/sources/civic_gene.py,sha256=_gC7P8QyRhJF9i_46eEU4_nV8I7i6z7XGKvXD67mwOM,1693
66
- pyobo/sources/complexportal.py,sha256=Uf3lxgD_jzBWQH5xbcJ11hgbdbxOlMHkdqsC0ySurdE,5993
68
+ pyobo/sources/complexportal.py,sha256=n_ZHWzg7jRA0Trmy1ndQZAFM-ayDl_hFnj6O0ZjZESA,7581
67
69
  pyobo/sources/conso.py,sha256=OVcfSUjwMh5biMZuTfidHvREjyPrQE84kmEQOHsinxE,2438
68
70
  pyobo/sources/cpt.py,sha256=b7hcULlvu_xa6URwoD37Gc_8VAs8mxawAlXflL1e1LU,1466
69
71
  pyobo/sources/credit.py,sha256=gOhD5Q2Xa4CgEnDiwli8CuxjAxLkydZukwFU-l_KTzc,2017
70
72
  pyobo/sources/cvx.py,sha256=WglHdUi6uLKFUkzDRxGTuElOxBu4x5By2XcfZNS4LlM,2820
71
73
  pyobo/sources/depmap.py,sha256=UKJ63iH7NtzklQ7AIqENMxQIvslNeBocwLW90cR8Tcc,3660
72
- pyobo/sources/dictybase_gene.py,sha256=n91GwkCIZWhS_O9IaRwGS_LZ3rKSb3tCZBpb_uvx27w,2548
74
+ pyobo/sources/dictybase_gene.py,sha256=57RxdH70S3Rklz4qZS0T_kBEdCH2UVSXYdYwt7Gn2Ds,2810
73
75
  pyobo/sources/drugbank.py,sha256=W-Qa8Cttk07PtndbdJHc1yrAMYZHT-4r1bxeRrXgqHE,11032
74
76
  pyobo/sources/drugbank_salt.py,sha256=DXqz5rEw8QUipPkDeuwg-MU9OvnSrBM62k3JeSeq4kM,1768
75
- pyobo/sources/drugcentral.py,sha256=5k-Fy1Khn_vqtuO5Sy33RsQLB51rcNgUA-K-PVaQOW0,3576
76
- pyobo/sources/expasy.py,sha256=MpkQ1snWdWAff5xVBpP-c1RQ3JXeFEKJ4J1Taufrtoo,10040
77
+ pyobo/sources/drugcentral.py,sha256=YXd6d2y62ILNrWg5rqi9jDfmB-MTacCZA26itDgETmY,3751
78
+ pyobo/sources/expasy.py,sha256=2MUKkPIiww97e14sTMH-FQa7tSxFym7Gz49D08wmZYI,10771
77
79
  pyobo/sources/famplex.py,sha256=oyNbnAbRuc72nap_xWpiZR8mcWWj7O5GliL89kwF9mQ,5787
78
- pyobo/sources/flybase.py,sha256=tSUbtg7XUnLFi5CKallNQIjwa0zX5rWiuh2vn-k0smA,5747
80
+ pyobo/sources/flybase.py,sha256=8-_8AfS-_rho4OThchHjqDG0y07owq02rlmQjGmuBkY,5817
79
81
  pyobo/sources/geonames.py,sha256=uNwrVBXGaPvMS7bwUAof_plSrV3F999Va2YSWbNwAKA,8563
80
82
  pyobo/sources/gmt_utils.py,sha256=aPPVAtoyPOzoyGFOAf3RwlgpdARAU0RHkDWnp_ZFgl4,1391
81
83
  pyobo/sources/go.py,sha256=SDRZtT28gY6T3k3z_3PMSDdsQkb4vJDAchw1dL6x40Q,1250
82
84
  pyobo/sources/gwascentral_phenotype.py,sha256=EDxcAC6ONhZj-Amo4PsT7ruO1-CzqsJvYXug4eeFX5A,1873
83
85
  pyobo/sources/gwascentral_study.py,sha256=njSRd9YxMWvXXg4cyILPL704LrtIeg-_63cR120jgyc,2814
84
- pyobo/sources/hgnc.py,sha256=WDu6O3WCzok1NVOr6cR6WiIprAmTg2fm12yTTpdCewo,15902
85
- pyobo/sources/hgncgenefamily.py,sha256=StZ9GhhU5SfMrzIJe444SP-PKU-8cZpx9Gv2SlcbHrc,3623
86
+ pyobo/sources/hgnc.py,sha256=C6Av1SIgP4XNyxcKKjZfEEvrPRu8lKUD-rNMYAmSC7Y,16298
87
+ pyobo/sources/hgncgenefamily.py,sha256=jecrhlcBSXMnoFKlKHyS8zkWfqSqr5UHXZT7h_cY4oU,3755
86
88
  pyobo/sources/icd10.py,sha256=FqCrB3f1OGukQDcvgLGffbSNyaA9D62ufTQkgMLeE4I,2283
87
89
  pyobo/sources/icd11.py,sha256=IaJ6fV_7humYu7AKvn_93y355FL_XMjtMyyMClYBUjI,2831
88
90
  pyobo/sources/icd_utils.py,sha256=Ub5LH4fDRHrGWwb7iP8I2KEFNl6I-viqxvLUyxGz2nM,3156
@@ -90,33 +92,33 @@ pyobo/sources/interpro.py,sha256=8IhVie_VrQSHFZmxpQVPQXm6ISFV435UjhDA41qBuk8,488
90
92
  pyobo/sources/itis.py,sha256=jJF5oGuaewl4SH882AMhzr7HX5Ekpp2fyqAwT3nY6G4,2951
91
93
  pyobo/sources/mesh.py,sha256=02VCo6t4g3kp0BhLb_2pykK1428xyfY40zQ3xCPK_eY,12116
92
94
  pyobo/sources/mgi.py,sha256=nIizvAtIG7genT1iETkdKZmS6mCQmQZCSR-_kRMg7_s,5750
93
- pyobo/sources/mirbase.py,sha256=7bE6XVBn9na82p8Kr6Vs4xjy67MEJK8Ac1ZsQxmC4oA,6327
95
+ pyobo/sources/mirbase.py,sha256=SfXyLt0_EVp_9mTApKC13-9cFTGs2qfi8J7KekKv5d4,6511
94
96
  pyobo/sources/mirbase_constants.py,sha256=5DjcwX_FRSzFYbTf50yvkPamSIH70Rw3I8q-Ds0zHVs,1998
95
97
  pyobo/sources/mirbase_family.py,sha256=qWAp1PUN5pJCArTPx-rhMGi6UG0LfoZNg5URQdXhDps,2151
96
98
  pyobo/sources/mirbase_mature.py,sha256=UbAdGEzLiS3GjeCnGKjapUKrL1WxTgxF25hdwx7pmV4,1488
97
99
  pyobo/sources/msigdb.py,sha256=lzQ9Bfuv53UVaN3He1NCkGg4ChWfo_9OPOK8NW6bl_s,5010
98
100
  pyobo/sources/ncbigene.py,sha256=jeQRJnLnU4Q1_U-FKOOeQjkqlc-iamUUn0zZqEmiaiI,5028
99
- pyobo/sources/npass.py,sha256=yMqkAkfOiNeQBXBIRR0qFrtcxBKrIqYH86MXPJC3e9U,2798
101
+ pyobo/sources/npass.py,sha256=0jHHGX0gk2PZFhv5jhEsbN-khTaJu0cE3sbMedZe3UU,2799
100
102
  pyobo/sources/omim_ps.py,sha256=fcMNrFBtc5u3HHaLpQVML4amHvgMErTS--pOlg074A4,1004
101
- pyobo/sources/pathbank.py,sha256=xf3e8MvSOUcV_z-fMJuhakuKksL3cGcw2lnNljrX50E,4968
103
+ pyobo/sources/pathbank.py,sha256=5sM_8dgriKE5YawxeGq3A6bpdC1kFS0KZXeaF-k-IYA,5471
102
104
  pyobo/sources/pfam.py,sha256=T9rZNIXUTw8XajUSNoPscDUN9wG4bae171xQepYqhQI,1830
103
105
  pyobo/sources/pfam_clan.py,sha256=Qk4q8jEwFR9NcLXeGR3p9TjA2oK40KkkFS0wMA1UirA,1324
104
106
  pyobo/sources/pid.py,sha256=iVoZ3yUgfTccun2baEDQ-mTwLYJ8kdWMoT9H3Q6xREc,4541
105
- pyobo/sources/pombase.py,sha256=byAaa4Gwla48y3sglcbfjpXCxVvVR5SAsbUBUiDRnIs,3585
107
+ pyobo/sources/pombase.py,sha256=hpkhIWgHk9viHF8aZnUJUqLEOK1I6M58v4zXGMKGQAw,3712
106
108
  pyobo/sources/pubchem.py,sha256=SgC56EBUHT6Cgwm7BUc3Kgw8b-kdg80JHm8D-TKdEzg,5284
107
- pyobo/sources/reactome.py,sha256=LHtv5dqremVixw4ASVIPM3Aq4feNqXVJ1R5kNQ93z9g,5063
108
- pyobo/sources/rgd.py,sha256=dleXkB5zQHpjOcj0u2rvSjsXm5S7GRuxQ-DupTN5BKk,5399
109
+ pyobo/sources/reactome.py,sha256=yp0JZkdZvtSlwl9ki2L4ziEfaPo3YDolPeXTbQkmrnA,5720
110
+ pyobo/sources/rgd.py,sha256=yYTZvYZi4irm2daE6GRf9NNtQXjwA9DYXupov2K9PXY,5394
109
111
  pyobo/sources/rhea.py,sha256=qlQj6wHuY08QeEGwVHubh8oLD-E12dbqNCJ57v_uKW4,7776
110
112
  pyobo/sources/ror.py,sha256=U6sQ1IBs0nxENF02bnkUVA8rx04o4Y9dZ2YwKu6rtj4,7377
111
113
  pyobo/sources/sgd.py,sha256=kQ_kof0F50RB0TrL2Eorqc7nUyv2kibAdf4Hp99ijKo,2134
112
- pyobo/sources/slm.py,sha256=EbMv4SIpNbIyWmN4t6rDGji0ziIuLnaqjLR9r8V6LfA,3788
114
+ pyobo/sources/slm.py,sha256=KaU2fwiSaURlnCOBeOsXEgt-Thqi8AOxq7YZg_rsJcQ,4261
113
115
  pyobo/sources/utils.py,sha256=RLo6z5BKLdofu4bLstDOJMOEiMDEmJdYrE12PeJEKtc,1091
114
116
  pyobo/sources/wikipathways.py,sha256=cd_0uRjwi5Q5SpBHTUF2QqLxj67-ZhuqdxEIGHcoB0U,2710
115
- pyobo/sources/zfin.py,sha256=yHRtpT1JtcP9kq9cPLsuLVainap4vZ9m5gl6ZJi55bk,4998
117
+ pyobo/sources/zfin.py,sha256=6Mh-JhTKXy3g9xed-AgzmZlhIoWnBoEUJK9bsjQUahA,5369
116
118
  pyobo/sources/kegg/__init__.py,sha256=hVP0tuwVpiNMikFv_bNPrzuYv-HA1_bPdCvNx-fm5Fg,219
117
119
  pyobo/sources/kegg/api.py,sha256=nwHuKPsYbWhHEgBZzJ92XQAibQp8XEVQ6xglzWxyWY4,4709
118
120
  pyobo/sources/kegg/genes.py,sha256=T9ct-E_q43MZT4v7I2-liokxhNiRCI-HMZwKgBPwxz4,3707
119
- pyobo/sources/kegg/genome.py,sha256=0MfKjgbnKNvW_HM2FCufw5p_bj351_rBKIRPfdrAeVA,3968
121
+ pyobo/sources/kegg/genome.py,sha256=9KSpBffM1Wv2pwTG8g0Lve9Zhu1Eur-Alvnjnry2N5o,4321
120
122
  pyobo/sources/kegg/pathway.py,sha256=ZvKBXLieL1w5kwaHg5wxvtFAAYAnWF1TalhGo_G6puc,6176
121
123
  pyobo/sources/selventa/__init__.py,sha256=cIIDlWL9znL2r0aZIJ2r1FN3NM9io74w-He2egzJwX8,254
122
124
  pyobo/sources/selventa/schem.py,sha256=Ct6Ut3AB99eylGhZco57ueoRcsyUmHATpFPRR8cbG8g,1313
@@ -129,7 +131,7 @@ pyobo/sources/umls/get_synonym_types.py,sha256=KU3CQxQBV2xYcX3SjqMrfRNU9nESYGDA7
129
131
  pyobo/sources/umls/synonym_types.tsv,sha256=z--ngeAqA_Kk8ft2YD8qOU_XUxhnTxF0OhL8jRd5xqo,8551
130
132
  pyobo/sources/umls/umls.py,sha256=WM2vNSX1asHn8hcVjV8sdkxE3Id3xOXwiRdLqb7Jnxk,4297
131
133
  pyobo/sources/uniprot/__init__.py,sha256=HVrjUxKjixqagsOYvVJkZ7nyIPlWAhLaUWa8sR0gLqA,200
132
- pyobo/sources/uniprot/uniprot.py,sha256=7Z-K35YVZAFlIGbae7JRlFyEEezubUYuztXYrsnvUrw,6130
134
+ pyobo/sources/uniprot/uniprot.py,sha256=Qi329uy0PWRglmZGoEtSlzXy0Gs7nFVPIFroJA0H0VM,6206
133
135
  pyobo/sources/uniprot/uniprot_ptm.py,sha256=8hbGP_5Rh-HhB6iBIJZ7qhXBdcCKD9sUKtwYKUhczHU,3552
134
136
  pyobo/ssg/__init__.py,sha256=j_5ZWISXGMNLjJRiT-OBhdJ7MQpRQF69fMLWMaDidVQ,5410
135
137
  pyobo/ssg/base.html,sha256=_vldUCa-gL2YTNY6GgAuxNT3TgaED585vF_q7TrrjYs,2844
@@ -137,9 +139,9 @@ pyobo/ssg/index.html,sha256=zDGkwIQBtbpnhCYALXQ0vr7qsVmAqDtbwOyPqU3hZ8s,3993
137
139
  pyobo/ssg/term.html,sha256=QU6piGOq4dq8zlNhJvLFxqFjhVQyWlkiG31I0Sg5frg,3559
138
140
  pyobo/ssg/typedef.html,sha256=KrdqzB6xjt689bG33D26AL-11JrvNuEkoxNNI-EG-Tg,2038
139
141
  pyobo/struct/__init__.py,sha256=DwGtSEPepZdgB49UvxG470g12XIFdhMdKZ44DoZMg6g,646
140
- pyobo/struct/reference.py,sha256=JPrFspoCVXzDDW9yPbeWu62eP8Q9ForaDJcsQ247k5g,5587
141
- pyobo/struct/struct.py,sha256=OOzp2b4BkhBqR5DeY1fl90bP7wpdbGSzx4StAHUGcaU,54564
142
- pyobo/struct/typedef.py,sha256=Oyubk6VfUUDijG2C-l5LOdhdoLKFps6mm5ek5YphAQ8,13869
142
+ pyobo/struct/reference.py,sha256=-SJaXMSDOrQ7SyU12UYquwwUdqoFoxrb6WypVtbGxOs,5661
143
+ pyobo/struct/struct.py,sha256=5GJl4hEY2L5C3iM_vexdsPxiJANwNh_1KakjDMorXDs,55019
144
+ pyobo/struct/typedef.py,sha256=MA62XSS-Me4kSmVs25fQbW1nGss1C8zhAQ5diidCSzs,14009
143
145
  pyobo/struct/utils.py,sha256=ETsjZDtlGI3iEMHlYkgHcSNGeo3agwlLK3QL74gqTc8,790
144
146
  pyobo/utils/__init__.py,sha256=CANSY8vGq_6v8rWhWRIdnk-Wo5LA2R9Wjg1nqbWqLOw,17
145
147
  pyobo/utils/cache.py,sha256=fED68uExWkruXsrqYWe4iAZNZEN4MapEPYmrTBgA7U0,2996
@@ -163,9 +165,9 @@ pyobo/xrefdb/sources/intact.py,sha256=l2gqxm9OLPpQqhNqAIT_jk7AHx61itsUCz-5dowwMb
163
165
  pyobo/xrefdb/sources/ncit.py,sha256=QTo9BSGuurvy9M54viS6_v6dF36O8DbUGU6iiyqKsPI,3729
164
166
  pyobo/xrefdb/sources/pubchem.py,sha256=VK_yPCaoa-CKQNkq9iAF0Zh0D_zxqa92YG4OBbvnA9c,771
165
167
  pyobo/xrefdb/sources/wikidata.py,sha256=JSrl3YWMQA_gxw7IXJRnxWWetcAV82aM5-5J3IHFzoQ,3562
166
- pyobo-0.11.0.dist-info/LICENSE,sha256=QcgJZKGxlW5BwBNnCBL8VZLVtRvXs81Ch9lJRQSIpJg,1076
167
- pyobo-0.11.0.dist-info/METADATA,sha256=ydZIch8oh6smWoaZ7SATHqOxIgqWrsRyeDVZaGTAW3U,25208
168
- pyobo-0.11.0.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
169
- pyobo-0.11.0.dist-info/entry_points.txt,sha256=YfZYzQyXBZ5dGiy4GsOUCOKKlNRNDcmR4vnlpD50q08,41
170
- pyobo-0.11.0.dist-info/top_level.txt,sha256=oVdkT-pbiGoSdGSQplXFuP1KQGJNf4GdRC65jn6y9t0,6
171
- pyobo-0.11.0.dist-info/RECORD,,
168
+ pyobo-0.11.1.dist-info/LICENSE,sha256=QcgJZKGxlW5BwBNnCBL8VZLVtRvXs81Ch9lJRQSIpJg,1076
169
+ pyobo-0.11.1.dist-info/METADATA,sha256=llPe8alNZWukCFjhvVKIEL6s2Vri9vfaSWRZE2DxMQg,24927
170
+ pyobo-0.11.1.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
171
+ pyobo-0.11.1.dist-info/entry_points.txt,sha256=YfZYzQyXBZ5dGiy4GsOUCOKKlNRNDcmR4vnlpD50q08,41
172
+ pyobo-0.11.1.dist-info/top_level.txt,sha256=oVdkT-pbiGoSdGSQplXFuP1KQGJNf4GdRC65jn6y9t0,6
173
+ pyobo-0.11.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.2.0)
2
+ Generator: setuptools (75.3.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5