33from __future__ import annotations
44
55import ftplib
6- import logging
76import traceback
87from collections .abc import Iterable , Mapping
98from functools import lru_cache
109from typing import Literal , NamedTuple , overload
1110
1211from tqdm import tqdm
12+ from tqdm .contrib .logging import logging_redirect_tqdm
1313
1414from .antibodyregistry import AntibodyRegistryGetter
1515from .bigg import BiGGGetter
7171from .uniprot import UniProtGetter
7272from .wikipathways import WikiPathwaysGetter
7373from .zfin import ZfinGetter
74- from ..utils import Bioversion , Getter , norm , refresh_daily
74+ from ..utils import Getter , VersionResult , norm , refresh_daily
7575
7676__all__ = [
77+ "VersionFailure" ,
78+ "clear_cache" ,
7779 "get_rows" ,
7880 "get_version" ,
81+ "iter_versions" ,
7982 "resolve" ,
8083]
8184
82- logger = logging .getLogger (__name__ )
85+ #: These are broken beyond fixing at the moment
86+ SKIPPED = [
87+ DrugBankGetter ,
88+ PathwayCommonsGetter ,
89+ DisGeNetGetter ,
90+ ]
8391
8492
8593@lru_cache (maxsize = 1 )
@@ -90,7 +98,6 @@ def get_getters() -> list[type[Getter]]:
9098 BioGRIDGetter ,
9199 ChEMBLGetter ,
92100 ComplexPortalGetter ,
93- DrugBankGetter ,
94101 DrugCentralGetter ,
95102 ExPASyGetter ,
96103 IntActGetter ,
@@ -109,7 +116,6 @@ def get_getters() -> list[type[Getter]]:
109116 RheaGetter ,
110117 StringDBGetter ,
111118 HomoloGeneGetter ,
112- DisGeNetGetter ,
113119 MeshGetter ,
114120 DGIGetter ,
115121 FlybaseGetter ,
@@ -131,7 +137,6 @@ def get_getters() -> list[type[Getter]]:
131137 SwissLipidGetter ,
132138 ITISGetter ,
133139 DepMapGetter ,
134- PathwayCommonsGetter ,
135140 UMLSGetter ,
136141 HGNCGetter ,
137142 RGDGetter ,
@@ -167,7 +172,7 @@ def get_getter_dict() -> Mapping[str, type[Getter]]:
167172 return rv
168173
169174
170- def resolve (name : str , use_cache : bool = True ) -> Bioversion :
175+ def resolve (name : str , use_cache : bool = True ) -> VersionResult :
171176 """Resolve the database name to a :class:`Bioversion` instance."""
172177 if use_cache :
173178 return _resolve_helper_cached (name )
@@ -176,11 +181,16 @@ def resolve(name: str, use_cache: bool = True) -> Bioversion:
176181
177182
178183@refresh_daily
179- def _resolve_helper_cached (name : str ) -> Bioversion :
184+ def _resolve_helper_cached (name : str ) -> VersionResult :
180185 return _resolve_helper (name )
181186
182187
183- def _resolve_helper (name : str ) -> Bioversion :
188+ def clear_cache () -> None :
189+ """Clear the cache."""
190+ _resolve_helper_cached .clear_cache ()
191+
192+
193+ def _resolve_helper (name : str ) -> VersionResult :
184194 norm_name = norm (name )
185195 getter : type [Getter ] = get_getter_dict ()[norm_name ]
186196 return getter .resolve ()
@@ -217,16 +227,16 @@ def get_version(name: str, *, strict: bool = True) -> str | None:
217227 return rv
218228
219229
220- def get_rows (use_tqdm : bool | None = False ) -> list [Bioversion ]:
230+ def get_rows (use_tqdm : bool | None = False ) -> list [VersionResult ]:
221231 """Get the rows, refreshing once per day."""
222232 return [
223233 bioversion
224- for bioversion in _iter_versions (use_tqdm = use_tqdm )
225- if isinstance (bioversion , Bioversion )
234+ for bioversion in iter_versions (use_tqdm = use_tqdm )
235+ if isinstance (bioversion , VersionResult )
226236 ]
227237
228238
229- class FailureTuple (NamedTuple ):
239+ class VersionFailure (NamedTuple ):
230240 """Holds information about failures."""
231241
232242 name : str
@@ -235,22 +245,23 @@ class FailureTuple(NamedTuple):
235245 trace : str
236246
237247
238- def _iter_versions (
248+ def iter_versions (
239249 use_tqdm : bool | None = False ,
240- ) -> Iterable [Bioversion | FailureTuple ]:
241- it = tqdm (get_getters (), disable = not use_tqdm )
242-
243- for cls in it :
244- it .set_postfix (name = cls .name )
245- try :
246- yv = resolve (cls .name )
247- except (OSError , AttributeError , ftplib .error_perm ):
248- msg = f"failed to resolve { cls .name } "
249- tqdm .write (msg )
250- yield FailureTuple (cls .name , cls .__name__ , msg , traceback .format_exc ())
251- except (ValueError , KeyError ) as e :
252- msg = f"issue parsing { cls .name } : { e } "
253- tqdm .write (msg )
254- yield FailureTuple (cls .name , cls .__name__ , msg , traceback .format_exc ())
255- else :
256- yield yv
250+ ) -> Iterable [VersionResult | VersionFailure ]:
251+ """Iterate over versions, without caching."""
252+ with logging_redirect_tqdm ():
253+ it = tqdm (get_getters (), disable = not use_tqdm , desc = "Getting versions" , unit = "resource" )
254+ for cls in it :
255+ it .set_postfix (name = cls .name )
256+ try :
257+ yv = resolve (cls .name )
258+ except (OSError , AttributeError , ftplib .error_perm ):
259+ msg = f"[{ cls .bioregistry_id or cls .name } ] failed to resolve"
260+ tqdm .write (msg )
261+ yield VersionFailure (cls .name , cls .__name__ , msg , traceback .format_exc ())
262+ except (ValueError , KeyError ) as e :
263+ msg = f"[{ cls .bioregistry_id or cls .name } ] issue parsing: { e } "
264+ tqdm .write (msg )
265+ yield VersionFailure (cls .name , cls .__name__ , msg , traceback .format_exc ())
266+ else :
267+ yield yv
0 commit comments