bioversions 0.7.89__tar.gz → 0.8.1__tar.gz

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 (82) hide show
  1. {bioversions-0.7.89 → bioversions-0.8.1}/PKG-INFO +1 -1
  2. {bioversions-0.7.89 → bioversions-0.8.1}/pyproject.toml +2 -2
  3. bioversions-0.8.1/src/bioversions/__init__.py +14 -0
  4. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/resources/update.py +3 -3
  5. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/resources/versions.json +35 -2
  6. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/__init__.py +42 -31
  7. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/ensembl.py +1 -1
  8. bioversions-0.8.1/src/bioversions/sources/flybase.py +42 -0
  9. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/gtdb.py +8 -3
  10. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/icd10.py +6 -1
  11. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/icd11.py +7 -1
  12. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/icf.py +6 -1
  13. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/npass.py +13 -7
  14. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/utils.py +3 -3
  15. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/version.py +1 -1
  16. bioversions-0.7.89/src/bioversions/__init__.py +0 -9
  17. bioversions-0.7.89/src/bioversions/sources/flybase.py +0 -38
  18. {bioversions-0.7.89 → bioversions-0.8.1}/LICENSE +0 -0
  19. {bioversions-0.7.89 → bioversions-0.8.1}/README.md +0 -0
  20. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/__main__.py +0 -0
  21. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/charts.py +0 -0
  22. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/cli.py +0 -0
  23. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/py.typed +0 -0
  24. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/resources/__init__.py +0 -0
  25. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/slack_client.py +0 -0
  26. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/antibodyregistry.py +0 -0
  27. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/bigg.py +0 -0
  28. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/biogrid.py +0 -0
  29. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/cellosaurus.py +0 -0
  30. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/chebi.py +0 -0
  31. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/chembl.py +0 -0
  32. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/chemidplus.py +0 -0
  33. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/civic.py +0 -0
  34. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/complexportal.py +0 -0
  35. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/daily.py +0 -0
  36. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/depmap.py +0 -0
  37. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/dgi.py +0 -0
  38. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/disgenet.py +0 -0
  39. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/drugbank.py +0 -0
  40. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/drugcentral.py +0 -0
  41. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/expasy.py +0 -0
  42. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/guidetopharmacology.py +0 -0
  43. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/hgnc.py +0 -0
  44. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/homologene.py +0 -0
  45. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/intact.py +0 -0
  46. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/interpro.py +0 -0
  47. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/itis.py +0 -0
  48. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/kegg.py +0 -0
  49. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/mesh.py +0 -0
  50. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/mgi.py +0 -0
  51. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/mirbase.py +0 -0
  52. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/moalmanac.py +0 -0
  53. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/msigdb.py +0 -0
  54. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/ncit.py +0 -0
  55. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/obo.py +0 -0
  56. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/ols.py +0 -0
  57. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/omim.py +0 -0
  58. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/oncotree.py +0 -0
  59. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/pathbank.py +0 -0
  60. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/pathwaycommons.py +0 -0
  61. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/pfam.py +0 -0
  62. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/pombase.py +0 -0
  63. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/pr.py +0 -0
  64. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/pubchem.py +0 -0
  65. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/reactome.py +0 -0
  66. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/rfam.py +0 -0
  67. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/rgd.py +0 -0
  68. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/rhea.py +0 -0
  69. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/rxnorm.py +0 -0
  70. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/sgd.py +0 -0
  71. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/signor.py +0 -0
  72. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/silva.py +0 -0
  73. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/slm.py +0 -0
  74. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/stringdb.py +0 -0
  75. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/umls.py +0 -0
  76. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/uniprot.py +0 -0
  77. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/unversioned.py +0 -0
  78. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/wikipathways.py +0 -0
  79. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/sources/zfin.py +0 -0
  80. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/templates/base.html +0 -0
  81. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/templates/home.html +0 -0
  82. {bioversions-0.7.89 → bioversions-0.8.1}/src/bioversions/wsgi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bioversions
3
- Version: 0.7.89
3
+ Version: 0.8.1
4
4
  Summary: Get the current version for biological databases
5
5
  Keywords: snekpack,cookiecutter,databases,biological databases,biomedical databases
6
6
  Author: Charles Tapley Hoyt
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "bioversions"
7
- version = "0.7.89"
7
+ version = "0.8.1"
8
8
  description = "Get the current version for biological databases"
9
9
  readme = "README.md"
10
10
  authors = [
@@ -260,7 +260,7 @@ known-first-party = [
260
260
  docstring-code-format = true
261
261
 
262
262
  [tool.bumpversion]
263
- current_version = "0.7.89"
263
+ current_version = "0.8.1"
264
264
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)(?:-(?P<release>[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+(?P<build>[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?"
265
265
  serialize = [
266
266
  "{major}.{minor}.{patch}-{release}+{build}",
@@ -0,0 +1,14 @@
1
+ """What's the current version for each biological database?""" # noqa:D400
2
+
3
+ from .sources import VersionFailure, clear_cache, get_rows, get_version, iter_versions, resolve
4
+ from .utils import VersionResult
5
+
6
+ __all__ = [
7
+ "VersionFailure",
8
+ "VersionResult",
9
+ "clear_cache",
10
+ "get_rows",
11
+ "get_version",
12
+ "iter_versions",
13
+ "resolve",
14
+ ]
@@ -15,7 +15,7 @@ from bioversions.resources import (
15
15
  write_export,
16
16
  write_versions,
17
17
  )
18
- from bioversions.sources import FailureTuple, _iter_versions
18
+ from bioversions.sources import VersionFailure, iter_versions
19
19
  from bioversions.version import get_git_hash
20
20
 
21
21
  __all__ = [
@@ -49,8 +49,8 @@ def _update(force: bool): # noqa:C901
49
49
 
50
50
  changes = False
51
51
  failure_tuples = []
52
- for bv in _iter_versions(use_tqdm=True):
53
- if isinstance(bv, FailureTuple):
52
+ for bv in iter_versions(use_tqdm=True):
53
+ if isinstance(bv, VersionFailure):
54
54
  failure_tuples.append(bv)
55
55
  continue
56
56
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "annotations": {
3
- "revision": 990,
4
- "date": "2025-05-06",
3
+ "revision": 991,
4
+ "date": "2025-05-07",
5
5
  "author": "runner"
6
6
  },
7
7
  "database": [
@@ -528,6 +528,11 @@
528
528
  "retrieved": "2025-05-06",
529
529
  "version": "2025-05-05",
530
530
  "homepage": "https://antibodyregistry.org/"
531
+ },
532
+ {
533
+ "retrieved": "2025-05-07",
534
+ "version": "2025-05-06",
535
+ "homepage": "https://antibodyregistry.org/"
531
536
  }
532
537
  ],
533
538
  "name": "Antibody Registry",
@@ -5345,6 +5350,11 @@
5345
5350
  "retrieved": "2025-02-25",
5346
5351
  "version": "2025_01",
5347
5352
  "homepage": "http://ftp.flybase.net/releases/FB2025_01/"
5353
+ },
5354
+ {
5355
+ "retrieved": "2025-05-07",
5356
+ "version": "2025_02",
5357
+ "homepage": "https://s3ftp.flybase.org/releases/FB2025_02/"
5348
5358
  }
5349
5359
  ],
5350
5360
  "name": "FlyBase",
@@ -5852,6 +5862,12 @@
5852
5862
  "version": "220",
5853
5863
  "homepage": "https://gtdb.ecogenomic.org/",
5854
5864
  "date": "2024-04-24"
5865
+ },
5866
+ {
5867
+ "retrieved": "2025-05-07",
5868
+ "version": "226",
5869
+ "homepage": "https://gtdb.ecogenomic.org/",
5870
+ "date": "2025-04-16"
5855
5871
  }
5856
5872
  ],
5857
5873
  "name": "Genome Taxonomy Database",
@@ -6296,6 +6312,11 @@
6296
6312
  "retrieved": "2025-04-03",
6297
6313
  "version": "2025-04-01",
6298
6314
  "homepage": "https://storage.googleapis.com/public-download-files/hgnc/archive/archive/monthly/json/hgnc_complete_set_2025-04-01.json"
6315
+ },
6316
+ {
6317
+ "retrieved": "2025-05-07",
6318
+ "version": "2025-05-06",
6319
+ "homepage": "https://storage.googleapis.com/public-download-files/hgnc/archive/archive/monthly/json/hgnc_complete_set_2025-05-06.json"
6299
6320
  }
6300
6321
  ],
6301
6322
  "name": "HGNC",
@@ -10547,6 +10568,10 @@
10547
10568
  {
10548
10569
  "retrieved": "2025-05-04",
10549
10570
  "version": "2025-05-02"
10571
+ },
10572
+ {
10573
+ "retrieved": "2025-05-07",
10574
+ "version": "2025-05-05"
10550
10575
  }
10551
10576
  ],
10552
10577
  "name": "Online Mendelian Inheritance in Man",
@@ -17096,6 +17121,10 @@
17096
17121
  {
17097
17122
  "retrieved": "2025-05-06",
17098
17123
  "version": "2025-05-06"
17124
+ },
17125
+ {
17126
+ "retrieved": "2025-05-07",
17127
+ "version": "2025-05-07"
17099
17128
  }
17100
17129
  ],
17101
17130
  "name": "SwissLipids",
@@ -22644,6 +22673,10 @@
22644
22673
  {
22645
22674
  "retrieved": "2025-05-06",
22646
22675
  "version": "2025-05-04"
22676
+ },
22677
+ {
22678
+ "retrieved": "2025-05-07",
22679
+ "version": "2025-05-05"
22647
22680
  }
22648
22681
  ],
22649
22682
  "name": "Zebrafish Information Network",
@@ -3,13 +3,13 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import ftplib
6
- import logging
7
6
  import traceback
8
7
  from collections.abc import Iterable, Mapping
9
8
  from functools import lru_cache
10
9
  from typing import Literal, NamedTuple, overload
11
10
 
12
11
  from tqdm import tqdm
12
+ from tqdm.contrib.logging import logging_redirect_tqdm
13
13
 
14
14
  from .antibodyregistry import AntibodyRegistryGetter
15
15
  from .bigg import BiGGGetter
@@ -71,15 +71,23 @@ from .umls import UMLSGetter
71
71
  from .uniprot import UniProtGetter
72
72
  from .wikipathways import WikiPathwaysGetter
73
73
  from .zfin import ZfinGetter
74
- from ..utils import Bioversion, Getter, norm, refresh_daily
74
+ from ..utils import Getter, VersionResult, norm, refresh_daily
75
75
 
76
76
  __all__ = [
77
+ "VersionFailure",
78
+ "clear_cache",
77
79
  "get_rows",
78
80
  "get_version",
81
+ "iter_versions",
79
82
  "resolve",
80
83
  ]
81
84
 
82
- logger = logging.getLogger(__name__)
85
+ #: These are broken beyond fixing at the moment
86
+ SKIPPED = [
87
+ DrugBankGetter,
88
+ PathwayCommonsGetter,
89
+ DisGeNetGetter,
90
+ ]
83
91
 
84
92
 
85
93
  @lru_cache(maxsize=1)
@@ -90,7 +98,6 @@ def get_getters() -> list[type[Getter]]:
90
98
  BioGRIDGetter,
91
99
  ChEMBLGetter,
92
100
  ComplexPortalGetter,
93
- DrugBankGetter,
94
101
  DrugCentralGetter,
95
102
  ExPASyGetter,
96
103
  IntActGetter,
@@ -109,7 +116,6 @@ def get_getters() -> list[type[Getter]]:
109
116
  RheaGetter,
110
117
  StringDBGetter,
111
118
  HomoloGeneGetter,
112
- DisGeNetGetter,
113
119
  MeshGetter,
114
120
  DGIGetter,
115
121
  FlybaseGetter,
@@ -131,7 +137,6 @@ def get_getters() -> list[type[Getter]]:
131
137
  SwissLipidGetter,
132
138
  ITISGetter,
133
139
  DepMapGetter,
134
- PathwayCommonsGetter,
135
140
  UMLSGetter,
136
141
  HGNCGetter,
137
142
  RGDGetter,
@@ -167,7 +172,7 @@ def get_getter_dict() -> Mapping[str, type[Getter]]:
167
172
  return rv
168
173
 
169
174
 
170
- def resolve(name: str, use_cache: bool = True) -> Bioversion:
175
+ def resolve(name: str, use_cache: bool = True) -> VersionResult:
171
176
  """Resolve the database name to a :class:`Bioversion` instance."""
172
177
  if use_cache:
173
178
  return _resolve_helper_cached(name)
@@ -176,11 +181,16 @@ def resolve(name: str, use_cache: bool = True) -> Bioversion:
176
181
 
177
182
 
178
183
  @refresh_daily
179
- def _resolve_helper_cached(name: str) -> Bioversion:
184
+ def _resolve_helper_cached(name: str) -> VersionResult:
180
185
  return _resolve_helper(name)
181
186
 
182
187
 
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:
184
194
  norm_name = norm(name)
185
195
  getter: type[Getter] = get_getter_dict()[norm_name]
186
196
  return getter.resolve()
@@ -217,16 +227,16 @@ def get_version(name: str, *, strict: bool = True) -> str | None:
217
227
  return rv
218
228
 
219
229
 
220
- def get_rows(use_tqdm: bool | None = False) -> list[Bioversion]:
230
+ def get_rows(use_tqdm: bool | None = False) -> list[VersionResult]:
221
231
  """Get the rows, refreshing once per day."""
222
232
  return [
223
233
  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)
226
236
  ]
227
237
 
228
238
 
229
- class FailureTuple(NamedTuple):
239
+ class VersionFailure(NamedTuple):
230
240
  """Holds information about failures."""
231
241
 
232
242
  name: str
@@ -235,22 +245,23 @@ class FailureTuple(NamedTuple):
235
245
  trace: str
236
246
 
237
247
 
238
- def _iter_versions(
248
+ def iter_versions(
239
249
  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
@@ -6,7 +6,7 @@ __all__ = [
6
6
  "EnsemblGetter",
7
7
  ]
8
8
 
9
- URL = "https://useast.ensembl.org/index.html"
9
+ URL = "https://www.ensembl.org/index.html"
10
10
 
11
11
 
12
12
  class EnsemblGetter(Getter):
@@ -0,0 +1,42 @@
1
+ """A getter for FlyBase."""
2
+
3
+ import re
4
+
5
+ from bioversions.utils import Getter, VersionType, get_soup
6
+
7
+ __all__ = [
8
+ "FlybaseGetter",
9
+ ]
10
+
11
+ URL = "https://s3ftp.flybase.org/releases/"
12
+ PATTERN = re.compile(r"FB\d{4}_\d{2}")
13
+ AGENT = (
14
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
15
+ "(KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"
16
+ )
17
+
18
+
19
+ class FlybaseGetter(Getter):
20
+ """A getter for FlyBase."""
21
+
22
+ bioregistry_id = "flybase"
23
+ name = "FlyBase"
24
+ homepage_fmt = "https://s3ftp.flybase.org/releases/FB{version}/"
25
+ version_type = VersionType.month
26
+
27
+ def get(self) -> str:
28
+ """Get the latest FlyBase version."""
29
+ soup = get_soup(URL, user_agent=AGENT)
30
+ releases = [
31
+ match.group().removeprefix("FB")
32
+ for anchor_tag in soup.find_all("a", href=True)
33
+ if (match := PATTERN.search(anchor_tag.text))
34
+ ]
35
+ if not releases:
36
+ raise ValueError("flybase hit anti-scraping measurements")
37
+ latest_version = max(releases)
38
+ return latest_version
39
+
40
+
41
+ if __name__ == "__main__":
42
+ FlybaseGetter.print()
@@ -8,7 +8,7 @@ __all__ = [
8
8
  "GTDBGetter",
9
9
  ]
10
10
 
11
- URL = "https://data.gtdb.ecogenomic.org/releases/latest/VERSION.txt"
11
+ URL = "https://data.ace.uq.edu.au/public/gtdb/data/releases/latest/VERSION.txt"
12
12
 
13
13
 
14
14
  class GTDBGetter(Getter):
@@ -24,10 +24,15 @@ class GTDBGetter(Getter):
24
24
  """Get the latest GTDB version number from VERSION.txt."""
25
25
  res = requests.get(URL, timeout=15)
26
26
  lines = res.text.strip().split("\n")
27
+
27
28
  # First line contains version like "v220"
28
- version = lines[0].strip().lstrip("v")
29
+ version_line = next(line for line in lines if line.startswith("v"))
30
+ version = version_line.strip().lstrip("v")
31
+
29
32
  # Third line contains date like "Released Apr 24, 2024"
30
- date = lines[2].strip().removeprefix("Released ")
33
+ date_line = next(line for line in lines if line.startswith("Released "))
34
+ date = date_line.strip().removeprefix("Released ")
35
+
31
36
  return {"version": version, "date": date}
32
37
 
33
38
 
@@ -1,6 +1,9 @@
1
1
  """A getter for ICD10."""
2
2
 
3
+ import warnings
4
+
3
5
  import requests
6
+ from urllib3.exceptions import InsecureRequestWarning
4
7
 
5
8
  from bioversions.utils import Getter, VersionType
6
9
 
@@ -21,7 +24,9 @@ class ICD10Getter(Getter):
21
24
 
22
25
  def get(self) -> str:
23
26
  """Get the latest ICD10 version number."""
24
- response = requests.get(URL, allow_redirects=True, timeout=15)
27
+ with warnings.catch_warnings():
28
+ warnings.simplefilter(action="ignore", category=InsecureRequestWarning)
29
+ response = requests.get(URL, allow_redirects=True, timeout=15, verify=False) # noqa:S501
25
30
  final_url = response.url
26
31
  return final_url[len("https://icd.who.int/browse10/") :].split("/")[0]
27
32
 
@@ -1,6 +1,9 @@
1
1
  """A getter for ICD11."""
2
2
 
3
+ import warnings
4
+
3
5
  import requests
6
+ from urllib3.exceptions import InsecureRequestWarning
4
7
 
5
8
  from bioversions.utils import Getter, VersionType
6
9
 
@@ -14,6 +17,7 @@ URL = "https://icd.who.int/browse/latest-release/mms/en"
14
17
  class ICD11Getter(Getter):
15
18
  """A getter for ICD11."""
16
19
 
20
+ # TODO combine with ICF using `collection`
17
21
  bioregistry_id = "icd11"
18
22
  name = "International Classification of Diseases, 11th Revision"
19
23
  version_type = VersionType.date
@@ -21,7 +25,9 @@ class ICD11Getter(Getter):
21
25
 
22
26
  def get(self) -> str:
23
27
  """Get the latest ICD11 version number."""
24
- response = requests.get(URL, allow_redirects=True, timeout=15)
28
+ with warnings.catch_warnings():
29
+ warnings.simplefilter(action="ignore", category=InsecureRequestWarning)
30
+ response = requests.get(URL, allow_redirects=True, timeout=15, verify=False) # noqa:S501
25
31
  final_url = response.url
26
32
  return final_url[len("https://icd.who.int/browse/") :].split("/")[0]
27
33
 
@@ -1,6 +1,9 @@
1
1
  """A getter for ICF."""
2
2
 
3
+ import warnings
4
+
3
5
  import requests
6
+ from urllib3.exceptions import InsecureRequestWarning
4
7
 
5
8
  from bioversions.utils import Getter, VersionType
6
9
 
@@ -21,7 +24,9 @@ class ICFGetter(Getter):
21
24
 
22
25
  def get(self) -> str:
23
26
  """Get the latest ICF version number."""
24
- response = requests.get(URL, allow_redirects=True, timeout=15)
27
+ with warnings.catch_warnings():
28
+ warnings.simplefilter(action="ignore", category=InsecureRequestWarning)
29
+ response = requests.get(URL, allow_redirects=True, timeout=15, verify=False) # noqa:S501
25
30
  final_url = response.url
26
31
  return final_url[len("https://icd.who.int/browse/") :].split("/")[0]
27
32
 
@@ -18,13 +18,19 @@ class NPASSGetter(Getter):
18
18
 
19
19
  def get(self) -> str:
20
20
  """Get the latest NPASS version number."""
21
- soup = get_soup(URL)
22
- footer = find(soup, name="footer")
23
- ul = find(footer, name="ul")
24
- for li in ul.find_all(name="li"):
25
- if li.text.startswith("Version:"):
26
- return li.text[len("Version: ") :]
27
- raise ValueError(f"could not parse NPASS version from {URL}")
21
+ return "2.0"
22
+
23
+
24
+ def _dynamic_get() -> str:
25
+ # this has been retired since the website is so slow and this
26
+ # resource is effectively static
27
+ soup = get_soup(URL)
28
+ footer = find(soup, name="footer")
29
+ ul = find(footer, name="ul")
30
+ for li in ul.find_all(name="li"):
31
+ if li.text.startswith("Version:"):
32
+ return li.text[len("Version: ") :]
33
+ raise ValueError(f"could not parse NPASS version from {URL}")
28
34
 
29
35
 
30
36
  if __name__ == "__main__":
@@ -158,7 +158,7 @@ class MetaGetter(type):
158
158
  return version
159
159
 
160
160
 
161
- class Bioversion(pydantic.BaseModel):
161
+ class VersionResult(pydantic.BaseModel):
162
162
  """A dataclass for information about a database and version."""
163
163
 
164
164
  #: The database name
@@ -217,9 +217,9 @@ class Getter(metaclass=MetaGetter):
217
217
  print(*x, sep=sep, file=file)
218
218
 
219
219
  @classmethod
220
- def resolve(cls) -> Bioversion:
220
+ def resolve(cls) -> VersionResult:
221
221
  """Get a Bioversion data container with the data for this database."""
222
- return Bioversion(
222
+ return VersionResult(
223
223
  name=cls.name,
224
224
  version=cls.version,
225
225
  classname=cls.__name__,
@@ -8,7 +8,7 @@ __all__ = [
8
8
  "get_git_hash",
9
9
  ]
10
10
 
11
- VERSION = "0.7.89"
11
+ VERSION = "0.8.1"
12
12
 
13
13
 
14
14
  def get_git_hash() -> str:
@@ -1,9 +0,0 @@
1
- """What's the current version for each biological database?""" # noqa:D400
2
-
3
- from .sources import get_rows, get_version, resolve
4
-
5
- __all__ = [
6
- "get_rows",
7
- "get_version",
8
- "resolve",
9
- ]
@@ -1,38 +0,0 @@
1
- """A getter for FlyBase."""
2
-
3
- import re
4
-
5
- from bioversions.utils import Getter, VersionType, get_soup
6
-
7
- __all__ = [
8
- "FlybaseGetter",
9
- ]
10
-
11
- URL = "http://flybase-ftp.s3-website-us-east-1.amazonaws.com/releases/index.html"
12
- PATTERN = re.compile(r"FB\d{4}_\d{2}")
13
-
14
-
15
- class FlybaseGetter(Getter):
16
- """A getter for FlyBase."""
17
-
18
- bioregistry_id = "flybase"
19
- name = "FlyBase"
20
- homepage_fmt = "http://flybase-ftp.s3-website-us-east-1.amazonaws.com/releases/FB{version}/"
21
- version_type = VersionType.month
22
-
23
- def get(self):
24
- """Get the latest flybase version number."""
25
- soup = get_soup(URL)
26
-
27
- releases = []
28
- # We check links to find ones that look like releases
29
- for anchor_tag in soup.find_all("a", href=True):
30
- match = PATTERN.search(anchor_tag.text)
31
- if match:
32
- releases.append(match.group().removeprefix("FB"))
33
- latest_version = max(releases)
34
- return latest_version
35
-
36
-
37
- if __name__ == "__main__":
38
- FlybaseGetter.print()
File without changes
File without changes