pyobo 0.10.5__py3-none-any.whl → 0.10.6__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/struct/struct.py CHANGED
@@ -47,6 +47,7 @@ from .typedef import (
47
47
  exact_match,
48
48
  from_species,
49
49
  get_reference_tuple,
50
+ has_ontology_root_term,
50
51
  has_part,
51
52
  is_a,
52
53
  orthologous,
@@ -108,7 +109,7 @@ class Synonym:
108
109
  def _fp(self) -> str:
109
110
  x = f'"{self._escape(self.name)}" {self.specificity}'
110
111
  if self.type and self.type.pair != DEFAULT_SYNONYM_TYPE.pair:
111
- x = f"{x} {self.type.curie}"
112
+ x = f"{x} {self.type.preferred_curie}"
112
113
  return f"{x} [{comma_separate(self.provenance)}]"
113
114
 
114
115
  @staticmethod
@@ -125,7 +126,7 @@ class SynonymTypeDef(Referenced):
125
126
 
126
127
  def to_obo(self) -> str:
127
128
  """Serialize to OBO."""
128
- rv = f'synonymtypedef: {self.curie} "{self.name}"'
129
+ rv = f'synonymtypedef: {self.preferred_curie} "{self.name}"'
129
130
  if self.specificity:
130
131
  rv = f"{rv} {self.specificity}"
131
132
  return rv
@@ -157,6 +158,11 @@ class SynonymTypeDef(Referenced):
157
158
  DEFAULT_SYNONYM_TYPE = SynonymTypeDef(
158
159
  reference=Reference(prefix="oboInOwl", identifier="SynonymType", name="Synonym"),
159
160
  )
161
+ abbreviation = SynonymTypeDef(
162
+ reference=Reference(prefix="OMO", identifier="0003000", name="abbreviation")
163
+ )
164
+ acronym = SynonymTypeDef(reference=Reference(prefix="omo", identifier="0003012", name="acronym"))
165
+
160
166
 
161
167
  ReferenceHint = Union[Reference, "Term", Tuple[str, str], str]
162
168
 
@@ -216,6 +222,8 @@ class Term(Referenced):
216
222
  #: An annotation for obsolescence. By default, is None, but this means that it is not obsolete.
217
223
  is_obsolete: Optional[bool] = None
218
224
 
225
+ type: Literal["Term", "Instance"] = "Term"
226
+
219
227
  def __hash__(self): # noqa: D105
220
228
  return hash((self.__class__, self.prefix, self.identifier))
221
229
 
@@ -226,11 +234,13 @@ class Term(Referenced):
226
234
  identifier: str,
227
235
  name: Optional[str] = None,
228
236
  definition: Optional[str] = None,
237
+ **kwargs,
229
238
  ) -> "Term":
230
239
  """Create a term from a reference."""
231
240
  return cls(
232
241
  reference=Reference(prefix=prefix, identifier=identifier, name=name),
233
242
  definition=definition,
243
+ **kwargs,
234
244
  )
235
245
 
236
246
  @classmethod
@@ -260,11 +270,17 @@ class Term(Referenced):
260
270
  self.provenance.append(_ensure_ref(reference))
261
271
 
262
272
  def append_synonym(
263
- self, synonym: Union[str, Synonym], type: Optional[SynonymTypeDef] = None
273
+ self,
274
+ synonym: Union[str, Synonym],
275
+ *,
276
+ type: Optional[SynonymTypeDef] = None,
277
+ specificity: Optional[SynonymSpecificity] = None,
264
278
  ) -> None:
265
279
  """Add a synonym."""
266
280
  if isinstance(synonym, str):
267
- synonym = Synonym(synonym, type=type or DEFAULT_SYNONYM_TYPE)
281
+ synonym = Synonym(
282
+ synonym, type=type or DEFAULT_SYNONYM_TYPE, specificity=specificity or "EXACT"
283
+ )
268
284
  self.synonyms.append(synonym)
269
285
 
270
286
  def append_alt(self, alt: Union[str, Reference]) -> None:
@@ -322,7 +338,7 @@ class Term(Referenced):
322
338
  """Get relationships from the given type."""
323
339
  return self.relationships[typedef]
324
340
 
325
- def append_exact_match(self, reference):
341
+ def append_exact_match(self, reference: ReferenceHint):
326
342
  """Append an exact match, also adding an xref."""
327
343
  reference = _ensure_ref(reference)
328
344
  self.append_relationship(exact_match, reference)
@@ -363,11 +379,13 @@ class Term(Referenced):
363
379
  raise ValueError("can not extend a collection that includes a null reference")
364
380
  self.relationships[typedef].extend(references)
365
381
 
366
- def append_property(self, prop: Union[str, TypeDef], value: Union[str, Reference]) -> None:
382
+ def append_property(
383
+ self, prop: Union[str, Reference, Referenced], value: Union[str, Reference, Referenced]
384
+ ) -> None:
367
385
  """Append a property."""
368
- if isinstance(prop, TypeDef):
386
+ if isinstance(prop, (Reference, Referenced)):
369
387
  prop = prop.curie
370
- if isinstance(value, Reference):
388
+ if isinstance(value, (Reference, Referenced)):
371
389
  value = value.curie
372
390
  self.properties[prop].append(value)
373
391
 
@@ -387,10 +405,12 @@ class Term(Referenced):
387
405
  for value in values:
388
406
  yield prop, value
389
407
 
390
- def iterate_obo_lines(self) -> Iterable[str]:
408
+ def iterate_obo_lines(self, *, ontology, typedefs) -> Iterable[str]:
391
409
  """Iterate over the lines to write in an OBO file."""
392
- yield "\n[Term]"
393
- yield f"id: {self.curie}"
410
+ yield f"\n[{self.type}]"
411
+ yield f"id: {self.preferred_curie}"
412
+ if self.is_obsolete:
413
+ yield "is_obsolete: true"
394
414
  if self.name:
395
415
  yield f"name: {obo_escape_slim(self.name)}"
396
416
  if self.namespace and self.namespace != "?":
@@ -403,14 +423,23 @@ class Term(Referenced):
403
423
  yield f"def: {self._definition_fp()}"
404
424
 
405
425
  for xref in sorted(self.xrefs, key=attrgetter("prefix", "identifier")):
406
- yield f"xref: {xref}"
426
+ yield f"xref: {xref.preferred_curie}"
407
427
 
428
+ parent_tag = "is_a" if self.type == "Term" else "instance_of"
408
429
  for parent in sorted(self.parents, key=attrgetter("prefix", "identifier")):
409
- yield f"is_a: {parent}"
430
+ yield f"{parent_tag}: {parent.preferred_curie}"
410
431
 
411
432
  for typedef, references in sorted(self.relationships.items(), key=_sort_relations):
433
+ if (not typedefs or typedef not in typedefs) and (
434
+ ontology,
435
+ typedef.curie,
436
+ ) not in _TYPEDEF_WARNINGS:
437
+ logger.warning(f"[{ontology}] typedef not defined in OBO: {typedef.curie}")
438
+ _TYPEDEF_WARNINGS.add((ontology, typedef.curie))
439
+
440
+ typedef_preferred_curie = typedef.preferred_curie
412
441
  for reference in sorted(references, key=attrgetter("prefix", "identifier")):
413
- s = f"relationship: {typedef.curie} {reference.curie}"
442
+ s = f"relationship: {typedef_preferred_curie} {reference.preferred_curie}"
414
443
  if typedef.name or reference.name:
415
444
  s += " !"
416
445
  if typedef.name:
@@ -420,6 +449,7 @@ class Term(Referenced):
420
449
  yield s
421
450
 
422
451
  for prop, value in sorted(self.iterate_properties(), key=_sort_properties):
452
+ # TODO deal with typedefs for properties
423
453
  yield f'property_value: {prop} "{value}" xsd:string' # TODO deal with types later
424
454
 
425
455
  for synonym in sorted(self.synonyms, key=attrgetter("name")):
@@ -430,6 +460,10 @@ class Term(Referenced):
430
460
  return s.replace("\n", "\\n").replace('"', '\\"')
431
461
 
432
462
 
463
+ #: A set of warnings, used to make sure we don't show the same one over and over
464
+ _TYPEDEF_WARNINGS: Set[Tuple[str, str]] = set()
465
+
466
+
433
467
  def _sort_relations(r):
434
468
  typedef, _references = r
435
469
  return typedef.reference.name or typedef.reference.identifier
@@ -632,6 +666,8 @@ class Obo:
632
666
  yield f"idspace: {prefix} {url}"
633
667
 
634
668
  for synonym_typedef in sorted((self.synonym_typedefs or []), key=attrgetter("curie")):
669
+ if synonym_typedef.curie == DEFAULT_SYNONYM_TYPE.curie:
670
+ continue
635
671
  yield synonym_typedef.to_obo()
636
672
 
637
673
  yield f"ontology: {self.ontology}"
@@ -639,15 +675,23 @@ class Obo:
639
675
  if self.name is None:
640
676
  raise ValueError("ontology is missing name")
641
677
  yield f'property_value: http://purl.org/dc/elements/1.1/title "{self.name}" xsd:string'
678
+ license_spdx_id = bioregistry.get_license(self.ontology)
679
+ if license_spdx_id:
680
+ # TODO add SPDX to idspaces and use as a CURIE?
681
+ yield f'property_value: http://purl.org/dc/terms/license "{license_spdx_id}" xsd:string'
682
+ description = bioregistry.get_description(self.ontology)
683
+ if description:
684
+ description = obo_escape_slim(description.strip())
685
+ yield f'property_value: http://purl.org/dc/elements/1.1/description "{description}" xsd:string'
642
686
 
643
687
  for root_term in self.root_terms or []:
644
- yield f"property_value: IAO:0000700 {root_term.curie}"
688
+ yield f"property_value: {has_ontology_root_term.preferred_curie} {root_term.preferred_curie}"
645
689
 
646
690
  for typedef in sorted(self.typedefs or [], key=attrgetter("curie")):
647
691
  yield from typedef.iterate_obo_lines()
648
692
 
649
693
  for term in self:
650
- yield from term.iterate_obo_lines()
694
+ yield from term.iterate_obo_lines(ontology=self.ontology, typedefs=self.typedefs)
651
695
 
652
696
  def write_obo(
653
697
  self, file: Union[None, str, TextIO, Path] = None, use_tqdm: bool = False
@@ -992,6 +1036,16 @@ class Obo:
992
1036
  """Get a mapping from identifiers to definitions."""
993
1037
  return dict(self.iterate_id_definition(use_tqdm=use_tqdm))
994
1038
 
1039
+ def get_obsolete(self, *, use_tqdm: bool = False) -> Set[str]:
1040
+ """Get the set of obsolete identifiers."""
1041
+ return {
1042
+ term.identifier
1043
+ for term in self._iter_terms(
1044
+ use_tqdm=use_tqdm, desc=f"[{self.ontology}] getting obsolete"
1045
+ )
1046
+ if term.identifier and term.is_obsolete
1047
+ }
1048
+
995
1049
  ############
996
1050
  # TYPEDEFS #
997
1051
  ############
@@ -1416,4 +1470,4 @@ def _convert_synonym_typedefs(synonym_typedefs: Optional[Iterable[SynonymTypeDef
1416
1470
 
1417
1471
 
1418
1472
  def _convert_synonym_typedef(synonym_typedef: SynonymTypeDef) -> str:
1419
- return f'{synonym_typedef.curie} "{synonym_typedef.name}"'
1473
+ return f'{synonym_typedef.preferred_curie} "{synonym_typedef.name}"'
pyobo/struct/typedef.py CHANGED
@@ -40,6 +40,9 @@ __all__ = [
40
40
  "enables",
41
41
  "participates_in",
42
42
  "has_participant",
43
+ "exact_match",
44
+ "has_dbxref",
45
+ # Properties
43
46
  "has_inchi",
44
47
  "has_smiles",
45
48
  ]
@@ -75,7 +78,7 @@ class TypeDef(Referenced):
75
78
  def iterate_obo_lines(self) -> Iterable[str]:
76
79
  """Iterate over the lines to write in an OBO file."""
77
80
  yield "\n[Typedef]"
78
- yield f"id: {self.reference.curie}"
81
+ yield f"id: {self.reference.preferred_curie}"
79
82
  if self.name:
80
83
  yield f"name: {self.reference.name}"
81
84
  if self.definition:
@@ -94,7 +97,7 @@ class TypeDef(Referenced):
94
97
  yield f"comment: {self.comment}"
95
98
 
96
99
  for xref in self.xrefs:
97
- yield f"xref: {xref}"
100
+ yield f"xref: {xref.preferred_curie}"
98
101
 
99
102
  if self.is_transitive is not None:
100
103
  yield f'is_transitive: {"true" if self.is_transitive else "false"}'
@@ -102,7 +105,7 @@ class TypeDef(Referenced):
102
105
  if self.is_symmetric is not None:
103
106
  yield f'is_symmetric: {"true" if self.is_symmetric else "false"}'
104
107
  if self.holds_over_chain:
105
- _chain = " ".join(link.curie for link in self.holds_over_chain)
108
+ _chain = " ".join(link.preferred_curie for link in self.holds_over_chain)
106
109
  _names = " / ".join(link.name or "_" for link in self.holds_over_chain)
107
110
  yield f"holds_over_chain: {_chain} ! {_names}"
108
111
 
@@ -261,9 +264,21 @@ has_salt = TypeDef(
261
264
  reference=Reference(prefix="debio", identifier="0000006", name="has salt"),
262
265
  )
263
266
 
264
- example_of_usage = Reference(prefix=IAO_PREFIX, identifier="0000112", name="example of usage")
265
- alternative_term = Reference(prefix=IAO_PREFIX, identifier="0000118", name="alternative term")
266
- editor_note = Reference(prefix=IAO_PREFIX, identifier="0000116", name="editor note")
267
+ term_replaced_by = TypeDef.from_triple(
268
+ prefix=IAO_PREFIX, identifier="0100001", name="term replaced by"
269
+ )
270
+ example_of_usage = TypeDef.from_triple(
271
+ prefix=IAO_PREFIX, identifier="0000112", name="example of usage"
272
+ )
273
+ alternative_term = TypeDef.from_triple(
274
+ prefix=IAO_PREFIX, identifier="0000118", name="alternative term"
275
+ )
276
+ has_ontology_root_term = TypeDef.from_triple(
277
+ prefix=IAO_PREFIX, identifier="0000700", name="has ontology root term"
278
+ )
279
+ has_dbxref = TypeDef.from_curie("oboInOwl:hasDbXref", name="has database cross-reference")
280
+
281
+ editor_note = TypeDef.from_triple(prefix=IAO_PREFIX, identifier="0000116", name="editor note")
267
282
 
268
283
  is_immediately_transformed_from = TypeDef.from_triple(
269
284
  prefix=SIO_PREFIX, identifier="000658", name="is immediately transformed from"
pyobo/version.py CHANGED
@@ -14,7 +14,7 @@ __all__ = [
14
14
  "get_git_hash",
15
15
  ]
16
16
 
17
- VERSION = "0.10.5"
17
+ VERSION = "0.10.6"
18
18
 
19
19
 
20
20
  def get_git_hash() -> str:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyobo
3
- Version: 0.10.5
3
+ Version: 0.10.6
4
4
  Summary: Handling and writing OBO
5
5
  Home-page: https://github.com/pyobo/pyobo
6
6
  Download-URL: https://github.com/pyobo/pyobo/releases
@@ -49,7 +49,7 @@ Requires-Dist: class-resolver
49
49
  Requires-Dist: psycopg2-binary
50
50
  Requires-Dist: drugbank-downloader
51
51
  Requires-Dist: chembl-downloader
52
- Requires-Dist: umls-downloader
52
+ Requires-Dist: umls-downloader >=0.1.2
53
53
  Requires-Dist: typing-extensions
54
54
  Provides-Extra: agrovoc
55
55
  Requires-Dist: rdflib ; extra == 'agrovoc'
@@ -1,9 +1,9 @@
1
- pyobo/__init__.py,sha256=qnXvit-N0GItG8tZQ5qkjGI4IXARMSQGzuuTjy08Ozc,1844
1
+ pyobo/__init__.py,sha256=mZ96iZ-5ucxe2eLBi0xuSKaa2ZfeInaSR5Ajc_NkvUo,1862
2
2
  pyobo/__main__.py,sha256=cQjBabQ2wlFKcv54PFdt0SgPXNeb3oWneuOHaBgHx1Q,108
3
3
  pyobo/aws.py,sha256=EUXsN_sQEOWOV2oZXrVrkO8R6Zo_JJHGeGzzWWgpvzo,5948
4
4
  pyobo/constants.py,sha256=gj8xSUmCO0rU-eGXHOW7Vix3SAHl50cLAM3HXuoAFt4,2200
5
5
  pyobo/getters.py,sha256=PFKV03izOK8wIU9CpZVRKgu5x-Mqnl39Kzo_bVPs8cs,15528
6
- pyobo/gilda_utils.py,sha256=MOBoNT_BXbi6lzaNd7z2Noubvo86RVlJqU4KJa7t2AE,7034
6
+ pyobo/gilda_utils.py,sha256=XNgtk41hp1gMJjlmthMp9SQ0gLrVrjWZ4AUC9-lR4bU,6850
7
7
  pyobo/identifier_utils.py,sha256=4I5Na4B8BYh3l1MfbePbolT0aCYpR8hJ-q-yJZlUqzk,3642
8
8
  pyobo/mocks.py,sha256=R-4W3Rm5NarIHfNjxurbvBYsLHXt6jmDb6THMUt6K1w,2432
9
9
  pyobo/normalizer.py,sha256=OHME2CDQSZYSbqmP-L_-4nxete9W9mtAjUzXVs1hnjU,8293
@@ -11,12 +11,12 @@ pyobo/obographs.py,sha256=CyEBuEa89QaC1AHwzwyjxW7-mYgXZ6OfMioQnz_BgrM,3430
11
11
  pyobo/plugins.py,sha256=dXWGoFuQktNeQUWSJlPz2a7FeLysggc9ry6auEZdw98,1227
12
12
  pyobo/reader.py,sha256=92mEpYWY8qcjSobMxass4x7M0hs_rkPI4jTtSgDjfsk,21237
13
13
  pyobo/resource_utils.py,sha256=JBcJRihZhNwp78-qWZPrzSCGoYfyOjzBwMkfmOkO_no,4289
14
- pyobo/version.py,sha256=Yio6dpeUaGKZmDQ6P1SfSxKUWP7bmDDT8U5HqOkntnw,977
15
- pyobo/api/__init__.py,sha256=7kDkA26zvk8xQYQ95wXwnmaHxeUGqVSNS2UDD2o_gEU,1308
14
+ pyobo/version.py,sha256=C0_iNdG0JbjCFHPA_ffkTmeLuJBsJMvAnU-ir8lk2XM,977
15
+ pyobo/api/__init__.py,sha256=Hq8p5uPW8fFYG2KfLqUsHhtLkTPqE4TqItGkedZzvXM,1326
16
16
  pyobo/api/alts.py,sha256=xmAb-gGQCJ9MbaFvoNK6E-V0B3TV9hxulkfbkHIvOso,2617
17
17
  pyobo/api/hierarchy.py,sha256=TBZs6SqG1wBP3026D7_bsznH-PAXeM2t1Onwb6_10R4,9010
18
18
  pyobo/api/metadata.py,sha256=62E7j0ZW3vYK2Rh-R7NCMKnChbYjZwPjVDoaE1AsCOc,1070
19
- pyobo/api/names.py,sha256=rQkLOndJEQ0QI_cjod8OqqlPJwKWyl6z3TzzdV9UIFU,6955
19
+ pyobo/api/names.py,sha256=A5HprOfdt7twF2LfjdQQaIj3FNj4_GD7MZ7CrKllY5M,7559
20
20
  pyobo/api/properties.py,sha256=PTCYsYmma3cym-dYY44p2NVGD7Z1dKZdC1otcfUflqg,7342
21
21
  pyobo/api/relations.py,sha256=VEQCQjPamehyGaL-wFzUYH9OeVq9pVzj70sl9K3ttKw,5996
22
22
  pyobo/api/species.py,sha256=xRPRoD6n1wcDaqlC_tHLw3rKMWa4razWsSPNa228g_4,2181
@@ -52,31 +52,32 @@ pyobo/resources/ncbitaxon.py,sha256=kyJDMGm8qIpIpckN6NSGovCBDacG1qGYTIpvJ--HXhM,
52
52
  pyobo/resources/ncbitaxon.tsv.gz,sha256=43zHjnVt62TA4_lV58X-FCPdMDfLg1B1PvZSr_Xy9hY,22981954
53
53
  pyobo/resources/ro.py,sha256=_CYD90vftMZvu8Rj6H9kOiw6wRBbs1LWmCl-HToxMIg,1484
54
54
  pyobo/resources/ro.tsv,sha256=YvlBLPAKy2w4IheYzO9ox1Yg6WkHdMVzMQTikIlECog,26586
55
- pyobo/sources/__init__.py,sha256=4OCytk4FwLNv2NehCNqOwfyuSQoNXpdiPP4dgn48Ybc,3563
55
+ pyobo/sources/__init__.py,sha256=vWzTP4kraQulrA4h2NTAhsjouehsEj0hQBwpqLypXSs,3666
56
56
  pyobo/sources/agrovoc.py,sha256=J425AyyOVAeqeyN5MhmAR9OtJom41GDvKArfyz1iIU8,795
57
57
  pyobo/sources/antibodyregistry.py,sha256=5i2qRhGgyi11Ke9xrHU1NRFxD3xMCnHQWWKh9fQCXDs,3178
58
58
  pyobo/sources/biogrid.py,sha256=Rr5gSLmOK95YPm2cYcFbGLDm3LWNckLvlarmbSIP-5M,3290
59
59
  pyobo/sources/ccle.py,sha256=KqqVokOq0HYE980plNa3987O1ixLkpcC0j9rYoQIM70,2963
60
- pyobo/sources/cgnc.py,sha256=HsER4HihwjEeFaLobK0FW1izLflpzKA7k_7Vuppnt6k,2250
60
+ pyobo/sources/cgnc.py,sha256=5epG5LK9RWMAUp2pL7rvd-5A-QPloqCNjw1MxHn6x-c,2308
61
61
  pyobo/sources/chebi.py,sha256=YSxLIV90P-AhQCq9q0AKzWwBgr_BgnxScUW-5AjY2DA,1198
62
- pyobo/sources/chembl.py,sha256=vwRVUxtv9e7T3fJGn2P54ozK3_8OUSqVhpR2mtQeahQ,2254
62
+ pyobo/sources/chembl.py,sha256=MG_bTilUwhhkeuTA3owLn1gro1QicMyGGfcd-48NGgE,2296
63
63
  pyobo/sources/complexportal.py,sha256=cEFXVJFK7iZUSv6pcIwEUR9A3PL9YhcFuNdfXTGtcdk,5529
64
64
  pyobo/sources/conso.py,sha256=ZLQ_T5EgrcuX9q6kCBKCwfGzAEVxgN6xADl-LKzJtbk,2460
65
65
  pyobo/sources/cpt.py,sha256=x8P15D9UX5Fwf6bmeVsU1DAFJvZ22rxVPy5ur-GUk_Q,1482
66
66
  pyobo/sources/cvx.py,sha256=Jo9b2S7lGfY8YyVIyoBLbOBn47LiUA3IcMFOD4L2j_k,2195
67
- pyobo/sources/depmap.py,sha256=Row0hZxjDUf4WhIILNFlkEog0vvGKD-czG4YpXm4xJk,3582
67
+ pyobo/sources/depmap.py,sha256=VuZduDgCduiAHPLwPDXgWpxhMSOZCC4UsxFdj7hNkYQ,3656
68
68
  pyobo/sources/dictybase_gene.py,sha256=EgWBwUZ83ev7x5Lp_nUkgSq2zumkDjJ7_13m3f6kJz0,2564
69
69
  pyobo/sources/drugbank.py,sha256=pb2IdVQF4FqDvefwRdqlDV5j6pR9R1b3rGxHC-GSWb4,11028
70
70
  pyobo/sources/drugbank_salt.py,sha256=hx16G41mP2KXT4fsAQRCRkJMGn-z5cafs-bwm4wMtwo,1783
71
- pyobo/sources/drugcentral.py,sha256=FUBVTnF9m-YlWUDwNTa9sB3hhEJ6-KUHTj-TROv2T-Q,3545
71
+ pyobo/sources/drugcentral.py,sha256=05mGolBIyKCxAYzpH9LY_ZQrTVnizup2JUiWi2wW9OI,3587
72
72
  pyobo/sources/expasy.py,sha256=h8RcFtRd4wHBDVHC7tK8C1dT2M0dCknhfoWao7DLOx4,9507
73
73
  pyobo/sources/famplex.py,sha256=O5-pUBsT-GMedAAoTkZDnpNdWDFIf4NnZwXSv7qXWaA,5784
74
74
  pyobo/sources/flybase.py,sha256=0-BCNsp-L-CgGPN9VdJec6-8e4-fJuzaZAZiNra3ZUQ,5768
75
+ pyobo/sources/geonames.py,sha256=oUUKnvTRdSFgtgaF9JfSF4WBZO53RBvPEoFQe2LXwe4,7507
75
76
  pyobo/sources/gmt_utils.py,sha256=NAWyUZ1p1HcO8RPL9mEEcL9KoaBDPuU-tbyG2QLb98k,1401
76
77
  pyobo/sources/go.py,sha256=IJul9eAXxKifZiWKJL1Dl9PFDFdoPMQ0ZVydzhnRtX0,1275
77
78
  pyobo/sources/gwascentral_phenotype.py,sha256=dCzyw_jbmhol69Li0g2ocMQJRqjoV2fZM_pno6i7xyA,1889
78
79
  pyobo/sources/gwascentral_study.py,sha256=_YH9TRWsCOHjOrJ2pAqQ7fi_HmF1WbMmTUj5iqWDUwY,2812
79
- pyobo/sources/hgnc.py,sha256=_6Do7ZwRzAeWESiTepic0DTpNSACOg7MdFaePe85rsw,14949
80
+ pyobo/sources/hgnc.py,sha256=kVxVIv4LIy_H_rvVQbwvj3Jn6KmLwpk-XRn5jkpnjN4,15951
80
81
  pyobo/sources/hgncgenefamily.py,sha256=o7gCI5raXkCMr8ONfAZpRW7PtsZ8lkRC4T1kEjTxBn4,3645
81
82
  pyobo/sources/icd10.py,sha256=KhenR1U8LvZQF97mRZIoSEE_daKcJ2hTJ41BQU7SNuM,2286
82
83
  pyobo/sources/icd11.py,sha256=04nLt-Lr64hAroOLH4OP-iNbuIjBk-mYcg-Ib34zgMM,2834
@@ -84,28 +85,29 @@ pyobo/sources/icd_utils.py,sha256=c1Xkk9YAyKQ-vvnPud5GKq5ygZVbd1j0NFSml3RjQZ0,31
84
85
  pyobo/sources/interpro.py,sha256=sWla5FDOkzA8elzeNHXOMD0nEVIbNK7jg4UZ0Zp7BfI,4934
85
86
  pyobo/sources/itis.py,sha256=LXS4MTL7OMmdfo-ypoF75UJkePw7VnHDrgq10RF_VUk,2967
86
87
  pyobo/sources/mesh.py,sha256=2vpfF_85fQqdOORha0ekZJ4gifAV1HDNyo5y6arSmjE,11103
87
- pyobo/sources/mgi.py,sha256=2QEkBUgV38ZACp9Wtua1WU01CJnicjM8JfaOyNhGfZE,5707
88
- pyobo/sources/mirbase.py,sha256=5Yb-uAw-JmNs5DIbvEa4BVj1N5RXG3ZlFGJ5ko6IGeE,6284
88
+ pyobo/sources/mgi.py,sha256=c0CiiH_LolAFdHPNu1lpLeAzHq20wVLyOrLRTkLYxhY,5766
89
+ pyobo/sources/mirbase.py,sha256=NMqZfT7CbbetqCV-KdGjHJmz2uM5QvdF_M1BxKi1ZCw,6349
89
90
  pyobo/sources/mirbase_constants.py,sha256=X7KhJDp1saGrdBwUR9fQSWwebzns5f-mEF4qWSETs2k,2023
90
- pyobo/sources/mirbase_family.py,sha256=2-jHXswTa3gVyxN4f__MtGgjzeBOsmAsJw6rBHJKYHM,2057
91
+ pyobo/sources/mirbase_family.py,sha256=Yj3oXaeBWDxcmBKnvOl0q_7nzlye5EXhSJPWlV3YpT8,2167
91
92
  pyobo/sources/mirbase_mature.py,sha256=nvWcQVDMBucPu6v5DLFb_W_9fz_J_Id7HZrilkUhaFI,1504
92
93
  pyobo/sources/msigdb.py,sha256=YKgFyPgYKdYQtu22P69IVyLeBsLfgNyaNOl7q0Sy8IU,5019
93
94
  pyobo/sources/ncbigene.py,sha256=FXGwSrnPSQREiF2k3qtZvRBEiung3bbVb-NAJv33uHU,4890
94
- pyobo/sources/npass.py,sha256=7h5GYfSXPYQCdQ9ykEHPk8yHVvSvc_pT1pSl_snqeWg,2712
95
+ pyobo/sources/npass.py,sha256=T_ehde-DOXFLizgm52fWN9CU-ANNBhJo_bNkIt8d-h4,2720
95
96
  pyobo/sources/pathbank.py,sha256=yhdS4BCbGxQf0o3HCGzL2cYRY7zyvHvDzzSBkkezoog,4989
96
97
  pyobo/sources/pfam.py,sha256=aHXdXmoG6xyNkScHft_xYe4J2DzRr22EinyfjpmwEj4,1846
97
98
  pyobo/sources/pfam_clan.py,sha256=hjJ0UUEcrNoaQVWbXZ_EaTWFo4iB9VG9Sp6pcO90gxY,1340
98
99
  pyobo/sources/pid.py,sha256=ZEbiYpbZL9_aOCEJWw0I3H5f7Q2RhQuNy5PUZfs0orU,4570
99
- pyobo/sources/pombase.py,sha256=KxmVFMn2XA7iTOSr3WhqQP-CL4JPTgpyLpDMMYGnWlA,3588
100
+ pyobo/sources/pombase.py,sha256=nRMxk2FuQZv6KnL8LBxqZbVtvynvneLe39i5V3dYAtw,3601
100
101
  pyobo/sources/pubchem.py,sha256=arIX53mvCWRghLJkeh9iTPUU_lQJ8SSTm-pOK8KBqbE,5289
101
102
  pyobo/sources/reactome.py,sha256=H-hMMrbf2mElOLDu_hYZgurYLYTZvrQ7E1dyvaWKvSM,5084
102
103
  pyobo/sources/rgd.py,sha256=CbtDDIrBQ7ZA0GK6BcorxYBeaJazo3D1gMot588cA0E,5397
103
104
  pyobo/sources/rhea.py,sha256=YZBFB6JLzHv6_bnCH5XZruJpwUaFaiH206oxE0THr0M,4109
104
- pyobo/sources/sgd.py,sha256=aGB6wrsB1m9jvXaPvKsHGUkix8XxL44Q9KOIxg_MWIY,2267
105
- pyobo/sources/slm.py,sha256=ZK4RQW-Q1jWtqMFj9HyDhrRkH60iWFhxCFud6j4flbU,3762
105
+ pyobo/sources/ror.py,sha256=g4UxcEYJ4RW_imqna3T6GnAxRp058L7MJFDmZjstYdo,6123
106
+ pyobo/sources/sgd.py,sha256=DOcRxEJGrHEOsaIiWat2x9ER2HnfnU3l8lqr3IktblA,2150
107
+ pyobo/sources/slm.py,sha256=ai_Zp0tqBIanMZ7q7b5x6w9KdTTCEqA4PhX0ToaF594,3804
106
108
  pyobo/sources/utils.py,sha256=tmCGXGxHVrYkS5E1-k2SZqL8H4Tv8dFrkoIEJ0xzVmQ,1119
107
109
  pyobo/sources/wikipathways.py,sha256=ZNi3lGQ4HbJIBpIq3IMvjiYuvWPuqPysjs8TB6kMxu4,2726
108
- pyobo/sources/zfin.py,sha256=_MUu7XGENmOU58cm52kNnje0KKC1IuUBQmAkKt-kFM8,4938
110
+ pyobo/sources/zfin.py,sha256=qB251aocDsZeHCE4i9wIZuWTfpv3lYuzEz5zK1zvgGE,4996
109
111
  pyobo/sources/kegg/__init__.py,sha256=g0Ui2giVNV_y8LYWJEz-1TIcp_NY8YWDuwHORw4RmKk,244
110
112
  pyobo/sources/kegg/api.py,sha256=CBTO72PIfLh6ZczDrPBDtnxEkuXN9_DCgXqQo6CNwQQ,4721
111
113
  pyobo/sources/kegg/genes.py,sha256=i0OOtso4bU1bz9UVckvsMGQ8DvJnQDhOSoHqv1wmqPc,3705
@@ -118,8 +120,9 @@ pyobo/sources/selventa/sdis.py,sha256=5LRPNHJonDZ2aojg6juTsBNbGKv55k8dtFex9LHYDd
118
120
  pyobo/sources/selventa/sfam.py,sha256=F9HzH_OZucofsAkOkvinyoiUmnw3_0pBMB7pgU9fSZg,1620
119
121
  pyobo/sources/umls/__init__.py,sha256=L49nPxoXFtFHwzP327cEOTr1oJrKAz7_nS2tahajpnY,104
120
122
  pyobo/sources/umls/__main__.py,sha256=mz2UqO02rnA68XM3420Nev4yocBn20QFSqU3E0oqNx8,133
121
- pyobo/sources/umls/synonym_types.tsv,sha256=eg71WyjDVVsIpb9eB8bMCx_24yP4YyavJy3U6Z11sxo,8163
122
- pyobo/sources/umls/umls.py,sha256=P_pTts60egeWWhZiudCsdh6fMDOA5j7AtmhCVFGCZCY,3854
123
+ pyobo/sources/umls/get_synonym_types.py,sha256=5u1ZEl8gp_StuQxrasvHK4S0DyVWdgp_rLzo3aFOALI,1111
124
+ pyobo/sources/umls/synonym_types.tsv,sha256=z--ngeAqA_Kk8ft2YD8qOU_XUxhnTxF0OhL8jRd5xqo,8551
125
+ pyobo/sources/umls/umls.py,sha256=nCeUPTJyKKs7K5Yft2ZSgVXaC6sCau0387AVzDXzXk0,3730
123
126
  pyobo/sources/uniprot/__init__.py,sha256=dsL0BvfMn3O_swtNhzQpjJUlP56NUBCcjSYdFvRlwmI,225
124
127
  pyobo/sources/uniprot/uniprot.py,sha256=cN1vZ3uhlSt70-PigADEA667z6Y36b3GfuG4F-C_Slg,2638
125
128
  pyobo/sources/uniprot/uniprot_ptm.py,sha256=ze1cf0_kkqslhS-lXa7EdfasV4reUDp6niJat6yymT8,3551
@@ -129,9 +132,9 @@ pyobo/ssg/index.html,sha256=zDGkwIQBtbpnhCYALXQ0vr7qsVmAqDtbwOyPqU3hZ8s,3993
129
132
  pyobo/ssg/term.html,sha256=QU6piGOq4dq8zlNhJvLFxqFjhVQyWlkiG31I0Sg5frg,3559
130
133
  pyobo/ssg/typedef.html,sha256=KrdqzB6xjt689bG33D26AL-11JrvNuEkoxNNI-EG-Tg,2038
131
134
  pyobo/struct/__init__.py,sha256=imJ-ffEGBI8f_kSbmDC-VQMCZksLxoHh7OjwvF4chwM,653
132
- pyobo/struct/reference.py,sha256=ksaUNZ4eawJWVFowoFr9Rh91PxYTANNwUBzZmBbwn_g,5179
133
- pyobo/struct/struct.py,sha256=M0zZm4CqQOL9PEFOrB_q_h4tWTHYvz3LpFXJ330UjbA,51585
134
- pyobo/struct/typedef.py,sha256=Q8KUR_ZEjcr3MTyVXFXCga1RkRIcXLphtImEFU1xaSg,11520
135
+ pyobo/struct/reference.py,sha256=p6DDe7O73zaOvoc5spyHBBId8eRjRYIyy37PzRy0mBM,5569
136
+ pyobo/struct/struct.py,sha256=zWoMfP3KlgRvxX57Uck0KPOArZacs3F1AprwcDmWx8M,54035
137
+ pyobo/struct/typedef.py,sha256=hJKfGawq8BnQqzO0yrlFDSmr1kAwNzIlyVpD1U_wCIU,11978
135
138
  pyobo/struct/utils.py,sha256=-XHuCETp7jPNhjHCW72gikaKoaiTPTNhDK5BZYyJsVw,815
136
139
  pyobo/utils/__init__.py,sha256=wXtcjcasWRBtJdTSMCC3jT8yFG8ZkQC-Xdh9lLiQDAo,42
137
140
  pyobo/utils/cache.py,sha256=bmuEE0DyppY6szNEzkS1tLLKfsLIrHQFhp0P-q94KFs,2677
@@ -156,9 +159,9 @@ pyobo/xrefdb/sources/intact.py,sha256=F0z6WrOwI79aZSuM5MsvQwzqoyzh9J0UuB4Mseoj9X
156
159
  pyobo/xrefdb/sources/ncit.py,sha256=unoIKJqdcfitTc6pU9P1SxJ1w8ax0iDjvEOlqe64nCY,3745
157
160
  pyobo/xrefdb/sources/pubchem.py,sha256=GaqgqtSV-T_P-900nL3alPx_ZB36MlmnEepOnZMONA4,780
158
161
  pyobo/xrefdb/sources/wikidata.py,sha256=ODi87EMsE3pJKkZTmaOgjbxsHFgqROGsZ6r0w2gbHC8,3351
159
- pyobo-0.10.5.dist-info/LICENSE,sha256=GRbxxtZEWtZiFGDENk1gntCQK4HEJYYbylEJEwpSLao,1076
160
- pyobo-0.10.5.dist-info/METADATA,sha256=gsPenbHdWiN5upKgYrCABfxG0E7O4SfopFqUxUB8gCA,20037
161
- pyobo-0.10.5.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
162
- pyobo-0.10.5.dist-info/entry_points.txt,sha256=Du5V6qw_T917Z5ZoMhLTTJoolK7kkVuUWkdE7aJWea0,669
163
- pyobo-0.10.5.dist-info/top_level.txt,sha256=oVdkT-pbiGoSdGSQplXFuP1KQGJNf4GdRC65jn6y9t0,6
164
- pyobo-0.10.5.dist-info/RECORD,,
162
+ pyobo-0.10.6.dist-info/LICENSE,sha256=GRbxxtZEWtZiFGDENk1gntCQK4HEJYYbylEJEwpSLao,1076
163
+ pyobo-0.10.6.dist-info/METADATA,sha256=bdUsuH24Duo7R7OCc8m26JmOj03pSyMRgvKA827SLFs,20045
164
+ pyobo-0.10.6.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
165
+ pyobo-0.10.6.dist-info/entry_points.txt,sha256=Du5V6qw_T917Z5ZoMhLTTJoolK7kkVuUWkdE7aJWea0,669
166
+ pyobo-0.10.6.dist-info/top_level.txt,sha256=oVdkT-pbiGoSdGSQplXFuP1KQGJNf4GdRC65jn6y9t0,6
167
+ pyobo-0.10.6.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.41.2)
2
+ Generator: bdist_wheel (0.41.3)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5