pyobo 0.10.6__py3-none-any.whl → 0.10.7__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/identifier_utils.py CHANGED
@@ -119,7 +119,7 @@ def wrap_norm_prefix(f):
119
119
 
120
120
  def standardize_ec(ec: str) -> str:
121
121
  """Standardize an EC code identifier by removing all trailing dashes and dots."""
122
- ec = ec.strip()
122
+ ec = ec.strip().replace(" ", "")
123
123
  for _ in range(4):
124
124
  ec = ec.rstrip("-").rstrip(".")
125
125
  return ec
pyobo/obographs.py CHANGED
@@ -19,7 +19,7 @@ from bioontologies.obograph import (
19
19
  from bioontologies.robot import ParseResults
20
20
 
21
21
  from pyobo.struct import Obo, Reference, Term
22
- from pyobo.struct.typedef import is_a
22
+ from pyobo.struct.typedef import definition_source, is_a
23
23
 
24
24
  __all__ = [
25
25
  "graph_from_obo",
@@ -61,12 +61,12 @@ def _rewire(r: Reference) -> curies.Reference:
61
61
 
62
62
 
63
63
  def _get_class_node(term: Term) -> Node:
64
- if not term.definition:
65
- definition = None
66
- else:
64
+ if term.definition or term.provenance:
67
65
  definition = Definition.from_parsed(
68
66
  value=term.definition, references=[_rewire(p) for p in term.provenance]
69
67
  )
68
+ else:
69
+ definition = None
70
70
 
71
71
  if term.xrefs:
72
72
  if not term.xref_types:
@@ -126,3 +126,11 @@ def _iter_edges(term: Term) -> Iterable[Edge]:
126
126
  _rewire(typedef.reference),
127
127
  _rewire(target),
128
128
  )
129
+
130
+ for provenance_reference in term.provenance:
131
+ yield Edge.from_parsed(
132
+ _rewire(term.reference),
133
+ _rewire(definition_source.reference),
134
+ _rewire(provenance_reference),
135
+ )
136
+ # TODO also look through xrefs and seealso to get provenance xrefs?
pyobo/reader.py CHANGED
@@ -444,20 +444,23 @@ def _extract_synonym(
444
444
  break
445
445
 
446
446
  stype: Optional[SynonymTypeDef] = None
447
- if specificity is not None: # go fishing for a synonym type definition
448
- for _stype in synonym_typedefs.values():
449
- # Since there aren't a lot of carefully defined synonym definitions, it
450
- # can appear as a string or curie. Therefore, we might see temporary prefixes
451
- # get added, so we should check against full curies as well as local unique
452
- # identifiers
453
- if rest.startswith(_stype.curie):
454
- rest = rest[len(_stype.curie) :].strip()
455
- stype = _stype
456
- break
457
- elif rest.startswith(_stype.identifier):
458
- rest = rest[len(_stype.identifier) :].strip()
459
- stype = _stype
460
- break
447
+ for _stype in synonym_typedefs.values():
448
+ # Since there aren't a lot of carefully defined synonym definitions, it
449
+ # can appear as a string or curie. Therefore, we might see temporary prefixes
450
+ # get added, so we should check against full curies as well as local unique
451
+ # identifiers
452
+ if rest.startswith(_stype.curie):
453
+ rest = rest[len(_stype.curie) :].strip()
454
+ stype = _stype
455
+ break
456
+ elif rest.startswith(_stype.preferred_curie):
457
+ rest = rest[len(_stype.preferred_curie) :].strip()
458
+ stype = _stype
459
+ break
460
+ elif rest.startswith(_stype.identifier):
461
+ rest = rest[len(_stype.identifier) :].strip()
462
+ stype = _stype
463
+ break
461
464
 
462
465
  if not rest.startswith("[") or not rest.endswith("]"):
463
466
  logger.warning("[%s:%s] problem with synonym: %s", prefix, identifier, s)
@@ -82,6 +82,17 @@ def _parse_xrefs(s) -> List[Tuple[Reference, str]]:
82
82
  logger.warning("xref missing (: %s", xref)
83
83
  continue
84
84
  note = note.rstrip(")")
85
+ note.replace("rhea:rhea ", "rhea:")
86
+ note.replace("rhea:Rhea ", "rhea:")
87
+ note.replace("eccode::", "eccode:")
88
+ note.replace("eccode:EC:", "eccode:")
89
+ note.replace("eccode:RHEA:", "rhea:")
90
+ if note.lower().startswith("rhea "):
91
+ note = note[len("Rhea ") :]
92
+ if note.lower().startswith("rhea:rhea "):
93
+ note = note[len("rhea:rhea ") :]
94
+ if note.lower().startswith("EC:"):
95
+ note = note[len("EC:") :]
85
96
  try:
86
97
  reference = Reference.from_curie(xref_curie)
87
98
  except ValueError:
pyobo/sources/geonames.py CHANGED
@@ -38,7 +38,9 @@ def get_terms(*, force: bool = False) -> Collection[Term]:
38
38
  """Get terms."""
39
39
  code_to_country = get_code_to_country(force=force)
40
40
  code_to_admin1 = get_code_to_admin1(code_to_country, force=force)
41
- code_to_admin2 = get_code_to_admin2(code_to_admin1, force=force)
41
+ code_to_admin2 = get_code_to_admin2(
42
+ code_to_country=code_to_country, code_to_admin1=code_to_admin1, force=force
43
+ )
42
44
  id_to_term = get_cities(
43
45
  code_to_country=code_to_country,
44
46
  code_to_admin1=code_to_admin1,
@@ -113,7 +115,7 @@ def get_code_to_admin1(
113
115
 
114
116
 
115
117
  def get_code_to_admin2(
116
- code_to_admin1: Mapping[str, Term], *, force: bool = False
118
+ *, code_to_country: Mapping[str, Term], code_to_admin1: Mapping[str, Term], force: bool = False
117
119
  ) -> Mapping[str, Term]:
118
120
  """Get a mapping from admin2 code to term."""
119
121
  admin2_df = ensure_df(
@@ -134,8 +136,13 @@ def get_code_to_admin2(
134
136
  term.append_property("code", code)
135
137
  code_to_admin2[code] = term
136
138
  admin1_code = code.rsplit(".", 1)[0]
137
- admin1_term = code_to_admin1[admin1_code]
138
- term.append_relationship(part_of, admin1_term)
139
+ admin1_term = code_to_admin1.get(admin1_code)
140
+ if admin1_term:
141
+ term.append_relationship(part_of, admin1_term)
142
+ else:
143
+ country_code = admin1_code.split(".", 1)[0]
144
+ country_term = code_to_country[country_code]
145
+ term.append_relationship(part_of, country_term)
139
146
  return code_to_admin2
140
147
 
141
148
 
@@ -197,7 +204,10 @@ def get_cities(
197
204
  term.append_synonym(synonym)
198
205
 
199
206
  if pd.isna(admin1):
200
- tqdm.write(f"[geonames:{identifier}] missing admin 1 code for {name} ({country})")
207
+ # TODO try to annotate these directly onto countries
208
+ tqdm.write(
209
+ f"[geonames:{identifier}] {name}, a city in {country}, is missing admin 1 code"
210
+ )
201
211
  continue
202
212
 
203
213
  admin1_full = f"{country}.{admin1}"
pyobo/sources/npass.py CHANGED
@@ -72,7 +72,9 @@ def iter_terms(version: str, force: bool = False) -> Iterable[Term]:
72
72
 
73
73
  # TODO check that the first is always the parent compound?
74
74
  if pd.notna(pubchem_compound_ids):
75
- pubchem_compound_ids = pubchem_compound_ids.split(";")
75
+ pubchem_compound_ids = [
76
+ yy.strip() for xx in pubchem_compound_ids.split(";") for yy in xx.strip().split(",")
77
+ ]
76
78
  if len(pubchem_compound_ids) > 1:
77
79
  logger.debug("multiple cids for %s: %s", identifier, pubchem_compound_ids)
78
80
  for pubchem_compound_id in pubchem_compound_ids:
@@ -30,7 +30,7 @@ class UniProtGetter(Obo):
30
30
 
31
31
  def iter_terms(self, force: bool = False) -> Iterable[Term]:
32
32
  """Iterate over terms in the ontology."""
33
- yield from iter_terms(force=force, version=self._version_or_raise)
33
+ yield from iter_terms(version=self._version_or_raise)
34
34
 
35
35
 
36
36
  def get_obo(force: bool = False) -> Obo:
@@ -38,9 +38,9 @@ def get_obo(force: bool = False) -> Obo:
38
38
  return UniProtGetter(force=force)
39
39
 
40
40
 
41
- def iter_terms(version: Optional[str] = None, force: bool = False) -> Iterable[Term]:
41
+ def iter_terms(version: Optional[str] = None) -> Iterable[Term]:
42
42
  """Iterate over UniProt Terms."""
43
- with open_reader(ensure(version=version, force=force)) as reader:
43
+ with open_reader(ensure(version=version)) as reader:
44
44
  _ = next(reader) # header
45
45
  for uniprot_id, name, taxonomy_id, _synonyms, ecs, pubmeds, pdbs in tqdm(
46
46
  reader, desc="Mapping UniProt", unit_scale=True
@@ -63,11 +63,11 @@ def iter_terms(version: Optional[str] = None, force: bool = False) -> Iterable[T
63
63
  yield term
64
64
 
65
65
 
66
- def ensure(version: Optional[str] = None, force: bool = False) -> Path:
66
+ def ensure(version: Optional[str] = None) -> Path:
67
67
  """Ensure the reviewed uniprot names are available."""
68
68
  if version is None:
69
69
  version = bioversions.get_version("uniprot")
70
- return RAW_MODULE.ensure(PREFIX, version, name="reviewed.tsv.gz", url=REVIEWED_URL, force=force)
70
+ return RAW_MODULE.ensure(PREFIX, version, name="reviewed.tsv.gz", url=REVIEWED_URL)
71
71
 
72
72
 
73
73
  if __name__ == "__main__":
pyobo/struct/reference.py CHANGED
@@ -31,11 +31,15 @@ class Reference(curies.Reference):
31
31
  raise ExpansionError(f"Unknown prefix: {v}")
32
32
  return norm_prefix
33
33
 
34
+ @property
35
+ def preferred_prefix(self) -> str:
36
+ """Get the preferred curie for this reference."""
37
+ return bioregistry.get_preferred_prefix(self.prefix) or self.prefix
38
+
34
39
  @property
35
40
  def preferred_curie(self) -> str:
36
41
  """Get the preferred curie for this reference."""
37
- pp = bioregistry.get_preferred_prefix(self.prefix) or self.prefix
38
- return f"{pp}:{self.identifier}"
42
+ return f"{self.preferred_prefix}:{self.identifier}"
39
43
 
40
44
  @root_validator(pre=True)
41
45
  def validate_identifier(cls, values): # noqa
@@ -125,7 +129,7 @@ class Reference(curies.Reference):
125
129
  if identifier_lower.startswith(f"{self.prefix.lower()}:"):
126
130
  rv = identifier_lower
127
131
  else:
128
- rv = f"{self.prefix}:{self._escaped_identifier}"
132
+ rv = f"{self.preferred_prefix}:{self._escaped_identifier}"
129
133
  if self.name:
130
134
  rv = f"{rv} ! {self.name}"
131
135
  return rv
pyobo/struct/struct.py CHANGED
@@ -384,9 +384,9 @@ class Term(Referenced):
384
384
  ) -> None:
385
385
  """Append a property."""
386
386
  if isinstance(prop, (Reference, Referenced)):
387
- prop = prop.curie
387
+ prop = prop.preferred_curie
388
388
  if isinstance(value, (Reference, Referenced)):
389
- value = value.curie
389
+ value = value.preferred_curie
390
390
  self.properties[prop].append(value)
391
391
 
392
392
  def _definition_fp(self) -> str:
@@ -423,11 +423,11 @@ class Term(Referenced):
423
423
  yield f"def: {self._definition_fp()}"
424
424
 
425
425
  for xref in sorted(self.xrefs, key=attrgetter("prefix", "identifier")):
426
- yield f"xref: {xref.preferred_curie}"
426
+ yield f"xref: {xref}" # __str__ bakes in the ! name
427
427
 
428
428
  parent_tag = "is_a" if self.type == "Term" else "instance_of"
429
429
  for parent in sorted(self.parents, key=attrgetter("prefix", "identifier")):
430
- yield f"{parent_tag}: {parent.preferred_curie}"
430
+ yield f"{parent_tag}: {parent}" # __str__ bakes in the ! name
431
431
 
432
432
  for typedef, references in sorted(self.relationships.items(), key=_sort_relations):
433
433
  if (not typedefs or typedef not in typedefs) and (
pyobo/struct/typedef.py CHANGED
@@ -50,7 +50,10 @@ __all__ = [
50
50
 
51
51
  @dataclass
52
52
  class TypeDef(Referenced):
53
- """A type definition in OBO."""
53
+ """A type definition in OBO.
54
+
55
+ See the subsection of https://owlcollab.github.io/oboformat/doc/GO.format.obo-1_4.html#S.2.2.
56
+ """
54
57
 
55
58
  reference: Reference
56
59
  comment: Optional[str] = None
@@ -108,6 +111,8 @@ class TypeDef(Referenced):
108
111
  _chain = " ".join(link.preferred_curie for link in self.holds_over_chain)
109
112
  _names = " / ".join(link.name or "_" for link in self.holds_over_chain)
110
113
  yield f"holds_over_chain: {_chain} ! {_names}"
114
+ if self.inverse:
115
+ yield f"inverse_of: {self.inverse}"
111
116
 
112
117
  @classmethod
113
118
  def from_triple(cls, prefix: str, identifier: str, name: Optional[str] = None) -> "TypeDef":
@@ -276,6 +281,9 @@ alternative_term = TypeDef.from_triple(
276
281
  has_ontology_root_term = TypeDef.from_triple(
277
282
  prefix=IAO_PREFIX, identifier="0000700", name="has ontology root term"
278
283
  )
284
+ definition_source = TypeDef.from_triple(
285
+ prefix=IAO_PREFIX, identifier="0000119", name="definition source"
286
+ )
279
287
  has_dbxref = TypeDef.from_curie("oboInOwl:hasDbXref", name="has database cross-reference")
280
288
 
281
289
  editor_note = TypeDef.from_triple(prefix=IAO_PREFIX, identifier="0000116", name="editor note")
pyobo/version.py CHANGED
@@ -14,7 +14,7 @@ __all__ = [
14
14
  "get_git_hash",
15
15
  ]
16
16
 
17
- VERSION = "0.10.6"
17
+ VERSION = "0.10.7"
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.6
3
+ Version: 0.10.7
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
@@ -4,14 +4,14 @@ 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
6
  pyobo/gilda_utils.py,sha256=XNgtk41hp1gMJjlmthMp9SQ0gLrVrjWZ4AUC9-lR4bU,6850
7
- pyobo/identifier_utils.py,sha256=4I5Na4B8BYh3l1MfbePbolT0aCYpR8hJ-q-yJZlUqzk,3642
7
+ pyobo/identifier_utils.py,sha256=y4eFbJJQGoGe0HKRqQoUc_3tani22W_K4z7OZFL6Z0E,3659
8
8
  pyobo/mocks.py,sha256=R-4W3Rm5NarIHfNjxurbvBYsLHXt6jmDb6THMUt6K1w,2432
9
9
  pyobo/normalizer.py,sha256=OHME2CDQSZYSbqmP-L_-4nxete9W9mtAjUzXVs1hnjU,8293
10
- pyobo/obographs.py,sha256=CyEBuEa89QaC1AHwzwyjxW7-mYgXZ6OfMioQnz_BgrM,3430
10
+ pyobo/obographs.py,sha256=JKE0a7e-gmxqdJoeX2zb_xQ6Tv5PAe60YhnIpAvrrYg,3758
11
11
  pyobo/plugins.py,sha256=dXWGoFuQktNeQUWSJlPz2a7FeLysggc9ry6auEZdw98,1227
12
- pyobo/reader.py,sha256=92mEpYWY8qcjSobMxass4x7M0hs_rkPI4jTtSgDjfsk,21237
12
+ pyobo/reader.py,sha256=3VTWQMmA-AHi3RdA2jb48d2deXO-lYKqXbcMa9Qhi_4,21271
13
13
  pyobo/resource_utils.py,sha256=JBcJRihZhNwp78-qWZPrzSCGoYfyOjzBwMkfmOkO_no,4289
14
- pyobo/version.py,sha256=C0_iNdG0JbjCFHPA_ffkTmeLuJBsJMvAnU-ir8lk2XM,977
14
+ pyobo/version.py,sha256=4zWbRnfTzmpe4izKe0mVCjyI8gxa0fCIboUcmzf12Tg,977
15
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
@@ -60,7 +60,7 @@ pyobo/sources/ccle.py,sha256=KqqVokOq0HYE980plNa3987O1ixLkpcC0j9rYoQIM70,2963
60
60
  pyobo/sources/cgnc.py,sha256=5epG5LK9RWMAUp2pL7rvd-5A-QPloqCNjw1MxHn6x-c,2308
61
61
  pyobo/sources/chebi.py,sha256=YSxLIV90P-AhQCq9q0AKzWwBgr_BgnxScUW-5AjY2DA,1198
62
62
  pyobo/sources/chembl.py,sha256=MG_bTilUwhhkeuTA3owLn1gro1QicMyGGfcd-48NGgE,2296
63
- pyobo/sources/complexportal.py,sha256=cEFXVJFK7iZUSv6pcIwEUR9A3PL9YhcFuNdfXTGtcdk,5529
63
+ pyobo/sources/complexportal.py,sha256=nhEaUzw4riuN31OLiwpGffj66YMCeLigekblTWGk3nk,6022
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
@@ -72,7 +72,7 @@ pyobo/sources/drugcentral.py,sha256=05mGolBIyKCxAYzpH9LY_ZQrTVnizup2JUiWi2wW9OI,
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
+ pyobo/sources/geonames.py,sha256=XpSc-_6653MrjunVJhqbHHLtkT8kmbJZzfRuF6DoWU8,7929
76
76
  pyobo/sources/gmt_utils.py,sha256=NAWyUZ1p1HcO8RPL9mEEcL9KoaBDPuU-tbyG2QLb98k,1401
77
77
  pyobo/sources/go.py,sha256=IJul9eAXxKifZiWKJL1Dl9PFDFdoPMQ0ZVydzhnRtX0,1275
78
78
  pyobo/sources/gwascentral_phenotype.py,sha256=dCzyw_jbmhol69Li0g2ocMQJRqjoV2fZM_pno6i7xyA,1889
@@ -92,7 +92,7 @@ pyobo/sources/mirbase_family.py,sha256=Yj3oXaeBWDxcmBKnvOl0q_7nzlye5EXhSJPWlV3Yp
92
92
  pyobo/sources/mirbase_mature.py,sha256=nvWcQVDMBucPu6v5DLFb_W_9fz_J_Id7HZrilkUhaFI,1504
93
93
  pyobo/sources/msigdb.py,sha256=YKgFyPgYKdYQtu22P69IVyLeBsLfgNyaNOl7q0Sy8IU,5019
94
94
  pyobo/sources/ncbigene.py,sha256=FXGwSrnPSQREiF2k3qtZvRBEiung3bbVb-NAJv33uHU,4890
95
- pyobo/sources/npass.py,sha256=T_ehde-DOXFLizgm52fWN9CU-ANNBhJo_bNkIt8d-h4,2720
95
+ pyobo/sources/npass.py,sha256=t8TDdxpfvvXYo8VczT4ngoSspPAdPJuLKigvHZ9OHrE,2805
96
96
  pyobo/sources/pathbank.py,sha256=yhdS4BCbGxQf0o3HCGzL2cYRY7zyvHvDzzSBkkezoog,4989
97
97
  pyobo/sources/pfam.py,sha256=aHXdXmoG6xyNkScHft_xYe4J2DzRr22EinyfjpmwEj4,1846
98
98
  pyobo/sources/pfam_clan.py,sha256=hjJ0UUEcrNoaQVWbXZ_EaTWFo4iB9VG9Sp6pcO90gxY,1340
@@ -124,7 +124,7 @@ pyobo/sources/umls/get_synonym_types.py,sha256=5u1ZEl8gp_StuQxrasvHK4S0DyVWdgp_r
124
124
  pyobo/sources/umls/synonym_types.tsv,sha256=z--ngeAqA_Kk8ft2YD8qOU_XUxhnTxF0OhL8jRd5xqo,8551
125
125
  pyobo/sources/umls/umls.py,sha256=nCeUPTJyKKs7K5Yft2ZSgVXaC6sCau0387AVzDXzXk0,3730
126
126
  pyobo/sources/uniprot/__init__.py,sha256=dsL0BvfMn3O_swtNhzQpjJUlP56NUBCcjSYdFvRlwmI,225
127
- pyobo/sources/uniprot/uniprot.py,sha256=cN1vZ3uhlSt70-PigADEA667z6Y36b3GfuG4F-C_Slg,2638
127
+ pyobo/sources/uniprot/uniprot.py,sha256=tJqSubCTMBfFkIRQxXqzVGlS7PTCrA9c_0mofjAFmj8,2557
128
128
  pyobo/sources/uniprot/uniprot_ptm.py,sha256=ze1cf0_kkqslhS-lXa7EdfasV4reUDp6niJat6yymT8,3551
129
129
  pyobo/ssg/__init__.py,sha256=Q5vYmk1LZwriShmA3TcYZ1Z1yiyjTWItcGxep5Fi2pw,5390
130
130
  pyobo/ssg/base.html,sha256=_vldUCa-gL2YTNY6GgAuxNT3TgaED585vF_q7TrrjYs,2844
@@ -132,9 +132,9 @@ pyobo/ssg/index.html,sha256=zDGkwIQBtbpnhCYALXQ0vr7qsVmAqDtbwOyPqU3hZ8s,3993
132
132
  pyobo/ssg/term.html,sha256=QU6piGOq4dq8zlNhJvLFxqFjhVQyWlkiG31I0Sg5frg,3559
133
133
  pyobo/ssg/typedef.html,sha256=KrdqzB6xjt689bG33D26AL-11JrvNuEkoxNNI-EG-Tg,2038
134
134
  pyobo/struct/__init__.py,sha256=imJ-ffEGBI8f_kSbmDC-VQMCZksLxoHh7OjwvF4chwM,653
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
+ pyobo/struct/reference.py,sha256=U2qHIANj_0XhSxh7UBaXUiOXWtVjtyIBeDQ03heWuxA,5712
136
+ pyobo/struct/struct.py,sha256=_azCiXAQwRObLpZMPrX0BJWm3Xscx-WKrEvUOOJQyxA,54085
137
+ pyobo/struct/typedef.py,sha256=pkowFqTdJrrg61Du86i2JGERnMHerFoQSx690HO2DS4,12268
138
138
  pyobo/struct/utils.py,sha256=-XHuCETp7jPNhjHCW72gikaKoaiTPTNhDK5BZYyJsVw,815
139
139
  pyobo/utils/__init__.py,sha256=wXtcjcasWRBtJdTSMCC3jT8yFG8ZkQC-Xdh9lLiQDAo,42
140
140
  pyobo/utils/cache.py,sha256=bmuEE0DyppY6szNEzkS1tLLKfsLIrHQFhp0P-q94KFs,2677
@@ -159,9 +159,9 @@ pyobo/xrefdb/sources/intact.py,sha256=F0z6WrOwI79aZSuM5MsvQwzqoyzh9J0UuB4Mseoj9X
159
159
  pyobo/xrefdb/sources/ncit.py,sha256=unoIKJqdcfitTc6pU9P1SxJ1w8ax0iDjvEOlqe64nCY,3745
160
160
  pyobo/xrefdb/sources/pubchem.py,sha256=GaqgqtSV-T_P-900nL3alPx_ZB36MlmnEepOnZMONA4,780
161
161
  pyobo/xrefdb/sources/wikidata.py,sha256=ODi87EMsE3pJKkZTmaOgjbxsHFgqROGsZ6r0w2gbHC8,3351
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,,
162
+ pyobo-0.10.7.dist-info/LICENSE,sha256=GRbxxtZEWtZiFGDENk1gntCQK4HEJYYbylEJEwpSLao,1076
163
+ pyobo-0.10.7.dist-info/METADATA,sha256=zIGpoqFqNW8k0hloMp_GTs6LcS4F0NAnxVgyhj4aiLM,20045
164
+ pyobo-0.10.7.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
165
+ pyobo-0.10.7.dist-info/entry_points.txt,sha256=Du5V6qw_T917Z5ZoMhLTTJoolK7kkVuUWkdE7aJWea0,669
166
+ pyobo-0.10.7.dist-info/top_level.txt,sha256=oVdkT-pbiGoSdGSQplXFuP1KQGJNf4GdRC65jn6y9t0,6
167
+ pyobo-0.10.7.dist-info/RECORD,,
File without changes