bioversions 0.5.551__py3-none-any.whl → 0.5.553__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.
Files changed (82) hide show
  1. bioversions/__init__.py +7 -3
  2. bioversions/__main__.py +0 -2
  3. bioversions/charts.py +3 -7
  4. bioversions/cli.py +3 -5
  5. bioversions/resources/__init__.py +1 -3
  6. bioversions/resources/update.py +1 -3
  7. bioversions/resources/versions.json +19543 -0
  8. bioversions/slack_client.py +2 -5
  9. bioversions/sources/__init__.py +13 -11
  10. bioversions/sources/antibodyregistry.py +0 -2
  11. bioversions/sources/bigg.py +5 -7
  12. bioversions/sources/biogrid.py +0 -2
  13. bioversions/sources/cellosaurus.py +3 -5
  14. bioversions/sources/chebi.py +1 -3
  15. bioversions/sources/chembl.py +3 -4
  16. bioversions/sources/chemidplus.py +1 -3
  17. bioversions/sources/civic.py +4 -2
  18. bioversions/sources/complexportal.py +0 -2
  19. bioversions/sources/daily.py +0 -2
  20. bioversions/sources/depmap.py +1 -3
  21. bioversions/sources/dgi.py +1 -3
  22. bioversions/sources/disgenet.py +1 -3
  23. bioversions/sources/drugbank.py +2 -4
  24. bioversions/sources/drugcentral.py +2 -4
  25. bioversions/sources/ensembl.py +1 -3
  26. bioversions/sources/expasy.py +0 -3
  27. bioversions/sources/flybase.py +0 -2
  28. bioversions/sources/gtdb.py +35 -0
  29. bioversions/sources/guidetopharmacology.py +3 -5
  30. bioversions/sources/hgnc.py +1 -1
  31. bioversions/sources/homologene.py +0 -2
  32. bioversions/sources/icd10.py +1 -3
  33. bioversions/sources/icd11.py +1 -3
  34. bioversions/sources/icf.py +1 -3
  35. bioversions/sources/intact.py +0 -2
  36. bioversions/sources/interpro.py +1 -3
  37. bioversions/sources/itis.py +1 -3
  38. bioversions/sources/kegg.py +5 -6
  39. bioversions/sources/mesh.py +0 -2
  40. bioversions/sources/mgi.py +0 -2
  41. bioversions/sources/mirbase.py +13 -8
  42. bioversions/sources/moalmanac.py +0 -2
  43. bioversions/sources/msigdb.py +0 -2
  44. bioversions/sources/ncit.py +1 -4
  45. bioversions/sources/npass.py +0 -2
  46. bioversions/sources/obo.py +2 -4
  47. bioversions/sources/ols.py +6 -8
  48. bioversions/sources/omim.py +2 -3
  49. bioversions/sources/oncotree.py +4 -4
  50. bioversions/sources/pathbank.py +0 -2
  51. bioversions/sources/pathwaycommons.py +0 -2
  52. bioversions/sources/pfam.py +0 -2
  53. bioversions/sources/pombase.py +0 -2
  54. bioversions/sources/pr.py +1 -3
  55. bioversions/sources/pubchem.py +0 -2
  56. bioversions/sources/reactome.py +0 -2
  57. bioversions/sources/rfam.py +0 -2
  58. bioversions/sources/rgd.py +0 -2
  59. bioversions/sources/rhea.py +0 -2
  60. bioversions/sources/rxnorm.py +0 -2
  61. bioversions/sources/sgd.py +0 -2
  62. bioversions/sources/slm.py +1 -1
  63. bioversions/sources/stringdb.py +2 -4
  64. bioversions/sources/umls.py +0 -2
  65. bioversions/sources/uniprot.py +1 -3
  66. bioversions/sources/unversioned.py +0 -2
  67. bioversions/sources/wikipathways.py +0 -2
  68. bioversions/sources/zfin.py +0 -2
  69. bioversions/templates/base.html +28 -0
  70. bioversions/templates/home.html +60 -0
  71. bioversions/twitter_client.py +5 -8
  72. bioversions/utils.py +30 -28
  73. bioversions/version.py +3 -5
  74. bioversions/wsgi.py +2 -4
  75. {bioversions-0.5.551.dist-info → bioversions-0.5.553.dist-info}/LICENSE +1 -1
  76. bioversions-0.5.553.dist-info/METADATA +382 -0
  77. bioversions-0.5.553.dist-info/RECORD +81 -0
  78. bioversions-0.5.551.dist-info/METADATA +0 -166
  79. bioversions-0.5.551.dist-info/RECORD +0 -77
  80. {bioversions-0.5.551.dist-info → bioversions-0.5.553.dist-info}/WHEEL +0 -0
  81. {bioversions-0.5.551.dist-info → bioversions-0.5.553.dist-info}/entry_points.txt +0 -0
  82. {bioversions-0.5.551.dist-info → bioversions-0.5.553.dist-info}/top_level.txt +0 -0
@@ -1,10 +1,7 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """Utilities for interacting with Slack."""
4
2
 
5
3
  import logging
6
4
  from functools import lru_cache
7
- from typing import Optional
8
5
 
9
6
  import pystow
10
7
  from slack_sdk import WebClient
@@ -18,14 +15,14 @@ logger = logging.getLogger(__name__)
18
15
 
19
16
 
20
17
  @lru_cache(maxsize=1)
21
- def _get_client(token: Optional[str] = None) -> Optional[WebClient]:
18
+ def _get_client(token: str | None = None) -> WebClient | None:
22
19
  token = pystow.get_config("bioversions", "slack_api_token", passthrough=token)
23
20
  if token is None:
24
21
  return None
25
22
  return WebClient(token=token)
26
23
 
27
24
 
28
- def post(text: str, channel: str = "random", token: Optional[str] = None):
25
+ def post(text: str, channel: str = "random", token: str | None = None):
29
26
  """Post the message to a given Slack channel."""
30
27
  client = _get_client(token)
31
28
  if client is None:
@@ -1,11 +1,11 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """Sources for Bioversions."""
4
2
 
3
+ from __future__ import annotations
4
+
5
5
  import ftplib
6
6
  import logging
7
+ from collections.abc import Iterable, Mapping
7
8
  from functools import lru_cache
8
- from typing import Iterable, List, Mapping, Optional, Tuple, Type, Union
9
9
 
10
10
  from tqdm import tqdm
11
11
 
@@ -27,6 +27,7 @@ from .drugcentral import DrugCentralGetter
27
27
  from .ensembl import EnsemblGetter
28
28
  from .expasy import ExPASyGetter
29
29
  from .flybase import FlybaseGetter
30
+ from .gtdb import GTDBGetter
30
31
  from .guidetopharmacology import GuideToPharmacologyGetter
31
32
  from .hgnc import HGNCGetter
32
33
  from .homologene import HomoloGeneGetter
@@ -78,10 +79,10 @@ logger = logging.getLogger(__name__)
78
79
 
79
80
 
80
81
  @lru_cache(maxsize=1)
81
- def get_getters() -> List[Type[Getter]]:
82
+ def get_getters() -> list[type[Getter]]:
82
83
  """Get a list of getters."""
83
84
  # TODO replace with entrypoint lookup
84
- getters: List[Type[Getter]] = [
85
+ getters: list[type[Getter]] = [
85
86
  BioGRIDGetter,
86
87
  ChEMBLGetter,
87
88
  ComplexPortalGetter,
@@ -137,6 +138,7 @@ def get_getters() -> List[Type[Getter]]:
137
138
  ICD10Getter,
138
139
  ICD11Getter,
139
140
  CiVICGetter,
141
+ GTDBGetter,
140
142
  ]
141
143
  getters.extend(iter_obo_getters())
142
144
  extend_ols_getters(getters)
@@ -144,7 +146,7 @@ def get_getters() -> List[Type[Getter]]:
144
146
  return getters
145
147
 
146
148
 
147
- def get_getter_dict() -> Mapping[str, Type[Getter]]:
149
+ def get_getter_dict() -> Mapping[str, type[Getter]]:
148
150
  """Get a dict of getters."""
149
151
  rv = {}
150
152
  for getter in get_getters():
@@ -174,7 +176,7 @@ def _resolve_helper_cached(name: str) -> Bioversion:
174
176
 
175
177
  def _resolve_helper(name: str) -> Bioversion:
176
178
  norm_name = norm(name)
177
- getter: Type[Getter] = get_getter_dict()[norm_name]
179
+ getter: type[Getter] = get_getter_dict()[norm_name]
178
180
  return getter.resolve()
179
181
 
180
182
 
@@ -183,7 +185,7 @@ def get_version(name: str) -> str:
183
185
  return resolve(name).version
184
186
 
185
187
 
186
- def get_rows(use_tqdm: Optional[bool] = False) -> List[Bioversion]:
188
+ def get_rows(use_tqdm: bool | None = False) -> list[Bioversion]:
187
189
  """Get the rows, refreshing once per day."""
188
190
  return [
189
191
  bioversion
@@ -193,15 +195,15 @@ def get_rows(use_tqdm: Optional[bool] = False) -> List[Bioversion]:
193
195
 
194
196
 
195
197
  def _iter_versions(
196
- use_tqdm: Optional[bool] = False,
197
- ) -> Iterable[Union[Tuple[Bioversion, None], Tuple[None, str]]]:
198
+ use_tqdm: bool | None = False,
199
+ ) -> Iterable[tuple[Bioversion, None] | tuple[None, str]]:
198
200
  it = tqdm(get_getters(), disable=not use_tqdm)
199
201
 
200
202
  for cls in it:
201
203
  it.set_postfix(name=cls.name)
202
204
  try:
203
205
  yv = resolve(cls.name)
204
- except (IOError, AttributeError, ftplib.error_perm):
206
+ except (OSError, AttributeError, ftplib.error_perm):
205
207
  msg = f"failed to resolve {cls.name}"
206
208
  tqdm.write(msg)
207
209
  yield None, msg
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for the Antibody Registry."""
4
2
 
5
3
  from bioversions.utils import Getter, VersionType, get_soup
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for BiGG."""
4
2
 
5
3
  from datetime import datetime
@@ -23,12 +21,12 @@ class BiGGGetter(Getter):
23
21
 
24
22
  def get(self):
25
23
  """Get the latest BiGG version number."""
26
- res = requests.get(URL).json()
24
+ res = requests.get(URL, timeout=15).json()
27
25
  date = datetime.fromisoformat(res["last_updated"])
28
- return dict(
29
- version=res["bigg_models_version"],
30
- date=date,
31
- )
26
+ return {
27
+ "version": res["bigg_models_version"],
28
+ "date": date,
29
+ }
32
30
 
33
31
 
34
32
  if __name__ == "__main__":
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for BioGRID."""
4
2
 
5
3
  from ..utils import Getter, VersionType, get_soup
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for Cellosaurus."""
4
2
 
5
3
  import requests
@@ -24,15 +22,15 @@ class CellosaurusGetter(Getter):
24
22
  # 12:15:2022 12:00
25
23
  def get(self):
26
24
  """Get the latest Cellosaurus version number."""
27
- res = requests.get(URL, stream=True)
25
+ res = requests.get(URL, stream=True, timeout=15)
28
26
  data = {}
29
27
  for line in res.iter_lines(decode_unicode=True):
30
28
  line = line.strip().decode("utf8")
31
29
  if not line:
32
30
  break
33
- key, value = [part.strip() for part in line.split(":", 1)]
31
+ key, value = (part.strip() for part in line.split(":", 1))
34
32
  data[key] = value
35
- return dict(version=data["data-version"], date=data["date"])
33
+ return {"version": data["data-version"], "date": data["date"]}
36
34
 
37
35
 
38
36
  if __name__ == "__main__":
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for ChEBI."""
4
2
 
5
3
  from bioversions.utils import Getter, VersionType, get_soup
@@ -27,7 +25,7 @@ class ChEBIGetter(Getter):
27
25
  last = list(anchors)[-1]
28
26
  date = last.next_sibling.strip().split()[0]
29
27
  version = last.text.rstrip("/")[len("rel") :]
30
- return dict(version=version, date=date)
28
+ return {"version": version, "date": date}
31
29
 
32
30
 
33
31
  if __name__ == "__main__":
@@ -1,9 +1,8 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for ChEMBL."""
4
2
 
5
3
  import ftplib
6
4
  import io
5
+ from typing import ClassVar
7
6
 
8
7
  from bioversions.utils import Getter, VersionType
9
8
 
@@ -23,7 +22,7 @@ class ChEMBLGetter(Getter):
23
22
  homepage_fmt = "ftp://ftp.ebi.ac.uk/pub/databases/chembl/ChEMBLdb/releases/chembl_{version}"
24
23
  date_fmt = "%d/%m/%Y"
25
24
  version_type = VersionType.sequential
26
- collection = ["chembl", "chembl.target", "chembl.compound", "chembl.cell"]
25
+ collection: ClassVar[list[str]] = ["chembl", "chembl.target", "chembl.compound", "chembl.cell"]
27
26
 
28
27
  def get(self):
29
28
  """Get the latest ChEMBL version number."""
@@ -40,7 +39,7 @@ class ChEMBLGetter(Getter):
40
39
  date = _removeprefix(line, DATE_PREFIX).strip()
41
40
  if version is None or date is None:
42
41
  raise ValueError
43
- return dict(date=date, version=version)
42
+ return {"date": date, "version": version}
44
43
 
45
44
 
46
45
  def _removeprefix(s, prefix):
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for ChemIDplus."""
4
2
 
5
3
  import re
@@ -26,7 +24,7 @@ class ChemIDplusGetter(Getter):
26
24
  """Get the latest ChemIDplus version number."""
27
25
  latest_url = "https://ftp.nlm.nih.gov/projects/chemidlease/CurrentChemID.xml"
28
26
  headers = {"Range": "bytes=0-300"} # leave some slack to capture date
29
- r = requests.get(latest_url, headers=headers)
27
+ r = requests.get(latest_url, headers=headers, timeout=15)
30
28
  if r.status_code == 206:
31
29
  result = re.search(r" date=\"([0-9]{4}-[0-9]{2}-[0-9]{2})\">", r.text)
32
30
  if result:
@@ -1,5 +1,7 @@
1
1
  """Get the version for CiVIC."""
2
2
 
3
+ from typing import ClassVar
4
+
3
5
  import requests
4
6
 
5
7
  from bioversions.utils import Getter, VersionType
@@ -28,11 +30,11 @@ class CiVICGetter(Getter):
28
30
  date_fmt = "%d-%b-%Y"
29
31
  version_type = VersionType.date
30
32
  homepage = "https://civicdb.org"
31
- collection = ["civic.gid", "civic.eid"]
33
+ collection: ClassVar[list[str]] = ["civic.gid", "civic.eid"]
32
34
 
33
35
  def get(self):
34
36
  """Get the latest ChEMBL version number."""
35
- res = requests.post(API, json={"query": GRAPHQL_QUERY})
37
+ res = requests.post(API, json={"query": GRAPHQL_QUERY}, timeout=15)
36
38
  # 0 element is always nightly, 1 is latest
37
39
  return res.json()["data"]["dataReleases"][1]["name"]
38
40
 
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for Complex Portal."""
4
2
 
5
3
  from bioversions.utils import Getter, VersionType, _get_ftp_date_version
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A collection of daily updated resources that aren't assigned specific versions."""
4
2
 
5
3
  from bioversions.utils import DailyGetter
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for DepMap."""
4
2
 
5
3
  import requests
@@ -21,7 +19,7 @@ class DepMapGetter(Getter):
21
19
 
22
20
  def get(self) -> str:
23
21
  """Get the latest DepMap version number."""
24
- res = requests.get(URL)
22
+ res = requests.get(URL, timeout=15)
25
23
  latest = next(release for release in res.json()["releaseData"] if release["isLatest"])
26
24
  return latest["releaseName"][len("DepMap Public ") :]
27
25
 
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for the `Drug Gene Interaction Database (DGI-DB) <http://www.dgidb.org>`_."""
4
2
 
5
3
  import bs4
@@ -20,7 +18,7 @@ class DGIGetter(Getter):
20
18
 
21
19
  def get(self):
22
20
  """Get the latest DGI version number."""
23
- res = requests.get(GITHUB_PAGE)
21
+ res = requests.get(GITHUB_PAGE, timeout=15)
24
22
  soup = bs4.BeautifulSoup(res.content, features="html.parser")
25
23
  time_tag = soup.find("relative-time")
26
24
  if time_tag is None:
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for DisGeNet."""
4
2
 
5
3
  import requests
@@ -22,7 +20,7 @@ class DisGeNetGetter(Getter):
22
20
 
23
21
  def get(self):
24
22
  """Get the latest DisGeNet version number."""
25
- res = requests.get(URL, params={"format": "json"})
23
+ res = requests.get(URL, params={"format": "json"}, timeout=15)
26
24
  res_json = res.json()
27
25
  version = res_json["database_version"].split()[-1].lstrip("v")
28
26
  return {
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for DrugBank."""
4
2
 
5
3
  from operator import itemgetter
@@ -26,10 +24,10 @@ class DrugBankGetter(Getter):
26
24
 
27
25
  def get(self):
28
26
  """Get the latest DrugBank version number."""
29
- res = requests.get(URL)
27
+ res = requests.get(URL, timeout=15)
30
28
  res.raise_for_status()
31
29
  latest = max(res.json(), key=itemgetter("released_on"))
32
- return dict(date=latest["released_on"], version=latest["version"])
30
+ return {"date": latest["released_on"], "version": latest["version"]}
33
31
 
34
32
  @staticmethod
35
33
  def homepage_version_transform(version: str) -> str:
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for DrugCentral."""
4
2
 
5
3
  from contextlib import closing
@@ -13,9 +11,9 @@ __all__ = [
13
11
  HOST = "unmtid-dbs.net"
14
12
  PORT = 5433
15
13
  USER = "drugman"
16
- PASSWORD = "dosage"
14
+ PASSWORD = "dosage" # noqa:S105
17
15
  DBNAME = "drugcentral"
18
- PARAMS = dict(dbname=DBNAME, user=USER, password=PASSWORD, host=HOST, port=PORT)
16
+ PARAMS = {"dbname": DBNAME, "user": USER, "password": PASSWORD, "host": HOST, "port": PORT}
19
17
 
20
18
 
21
19
  class DrugCentralGetter(Getter):
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for Ensembl."""
4
2
 
5
3
  from bioversions.utils import Getter, VersionType, get_soup
@@ -25,7 +23,7 @@ class EnsemblGetter(Getter):
25
23
  soup = get_soup(URL)
26
24
  manifest = soup.find(**{"class": "box-header"}).text
27
25
  version, date = manifest.rstrip(")").split("(", 1)
28
- return dict(version=version.split()[-1], date=date)
26
+ return {"version": version.split()[-1], "date": date}
29
27
 
30
28
 
31
29
  if __name__ == "__main__":
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for ExPASy."""
4
2
 
5
3
  from datetime import datetime
@@ -20,7 +18,6 @@ class ExPASyGetter(Getter):
20
18
 
21
19
  bioregistry_id = "eccode"
22
20
  name = "ExPASy"
23
- # date_version_fmt = "%d-%b-%Y"
24
21
  version_type = VersionType.date
25
22
 
26
23
  def get(self) -> str:
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for FlyBase."""
4
2
 
5
3
  import ftplib
@@ -0,0 +1,35 @@
1
+ """A getter for GTDB."""
2
+
3
+ import requests
4
+
5
+ from bioversions.utils import Getter, VersionType
6
+
7
+ __all__ = [
8
+ "GTDBGetter",
9
+ ]
10
+
11
+ URL = "https://data.gtdb.ecogenomic.org/releases/latest/VERSION.txt"
12
+
13
+
14
+ class GTDBGetter(Getter):
15
+ """A getter for the Genome Taxonomy Database (GTDB)."""
16
+
17
+ bioregistry_id = "gtdb"
18
+ name = "Genome Taxonomy Database"
19
+ version_type = VersionType.sequential
20
+ date_fmt = "%b %d, %Y" # Format to match "Apr 24, 2024"
21
+ homepage_fmt = "https://gtdb.ecogenomic.org/"
22
+
23
+ def get(self):
24
+ """Get the latest GTDB version number from VERSION.txt."""
25
+ res = requests.get(URL, timeout=15)
26
+ lines = res.text.strip().split("\n")
27
+ # First line contains version like "v220"
28
+ version = lines[0].strip().lstrip("v")
29
+ # Third line contains date like "Released Apr 24, 2024"
30
+ date = lines[2].strip().removeprefix("Released ")
31
+ return {"version": version, "date": date}
32
+
33
+
34
+ if __name__ == "__main__":
35
+ GTDBGetter.print()
@@ -1,10 +1,8 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for GuideToPharmacology."""
4
2
 
5
3
  import re
6
4
  from datetime import datetime
7
- from typing import Dict
5
+ from typing import ClassVar
8
6
 
9
7
  from bioversions.utils import Getter, VersionType, get_soup
10
8
 
@@ -23,9 +21,9 @@ class GuideToPharmacologyGetter(Getter):
23
21
  homepage_fmt = "https://www.guidetopharmacology.org/DATA/public_iuphardb_v{version}.zip"
24
22
  date_fmt = "%Y-%m-%d"
25
23
  version_type = VersionType.year_minor
26
- collection = ["iuphar.family", "iuphar.ligand", "iuphar.receptor"]
24
+ collection: ClassVar[list[str]] = ["iuphar.family", "iuphar.ligand", "iuphar.receptor"]
27
25
 
28
- def get(self) -> Dict[str, str]:
26
+ def get(self) -> dict[str, str]:
29
27
  """Get the latest Guide to Pharmacology version number."""
30
28
  soup = get_soup(URL)
31
29
  text = soup.findAll("div", {"class": "contentboxfullhelp"})[4].div.ul.li.a.text
@@ -33,7 +33,7 @@ class HGNCGetter(Getter):
33
33
  this_year = int(today.strftime("%Y"))
34
34
  this_month = int(today.strftime("%m"))
35
35
  maybe = today.strftime("%Y-%m-01")
36
- res = requests.head(self.homepage_fmt.format(version=maybe))
36
+ res = requests.head(self.homepage_fmt.format(version=maybe), timeout=15)
37
37
  if res.status_code == 200:
38
38
  return maybe
39
39
  if this_month == 1:
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for HomoloGene."""
4
2
 
5
3
  import requests
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for ICD10."""
4
2
 
5
3
  import requests
@@ -23,7 +21,7 @@ class ICD10Getter(Getter):
23
21
 
24
22
  def get(self) -> str:
25
23
  """Get the latest ICD10 version number."""
26
- response = requests.get(URL, allow_redirects=True)
24
+ response = requests.get(URL, allow_redirects=True, timeout=15)
27
25
  final_url = response.url
28
26
  return final_url[len("https://icd.who.int/browse10/") :].split("/")[0]
29
27
 
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for ICD11."""
4
2
 
5
3
  import requests
@@ -23,7 +21,7 @@ class ICD11Getter(Getter):
23
21
 
24
22
  def get(self) -> str:
25
23
  """Get the latest ICD11 version number."""
26
- response = requests.get(URL, allow_redirects=True)
24
+ response = requests.get(URL, allow_redirects=True, timeout=15)
27
25
  final_url = response.url
28
26
  return final_url[len("https://icd.who.int/browse/") :].split("/")[0]
29
27
 
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for ICF."""
4
2
 
5
3
  import requests
@@ -23,7 +21,7 @@ class ICFGetter(Getter):
23
21
 
24
22
  def get(self) -> str:
25
23
  """Get the latest ICF version number."""
26
- response = requests.get(URL, allow_redirects=True)
24
+ response = requests.get(URL, allow_redirects=True, timeout=15)
27
25
  final_url = response.url
28
26
  return final_url[len("https://icd.who.int/browse/") :].split("/")[0]
29
27
 
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for IntAct."""
4
2
 
5
3
  from bioversions.utils import Getter, VersionType, _get_ftp_date_version
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for InterPro."""
4
2
 
5
3
  import re
@@ -35,7 +33,7 @@ class InterProGetter(Getter):
35
33
  if line.startswith("Release") and not line.startswith("Release Notes"):
36
34
  line = line[len("Release ") :]
37
35
  version, rest = line.split(",", 1)
38
- return dict(version=version, date=_process_line(rest))
36
+ return {"version": version, "date": _process_line(rest)}
39
37
  raise ValueError
40
38
 
41
39
 
@@ -1,8 +1,6 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for ITIS."""
4
2
 
5
- from typing import Mapping
3
+ from collections.abc import Mapping
6
4
 
7
5
  from bioversions.utils import Getter, VersionType, get_soup
8
6
 
@@ -1,8 +1,7 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for KEGG."""
4
2
 
5
- from typing import Mapping
3
+ from collections.abc import Mapping
4
+ from typing import ClassVar
6
5
 
7
6
  import bioregistry
8
7
 
@@ -21,16 +20,16 @@ class KEGGGetter(Getter):
21
20
  name = "KEGG"
22
21
  date_fmt = "%B %d, %Y"
23
22
  version_type = VersionType.semver_minor
24
- collection = ["kegg", *bioregistry.get_has_parts("kegg")]
23
+ collection: ClassVar[list[str]] = ["kegg", *bioregistry.get_has_parts("kegg")]
25
24
 
26
25
  def get(self) -> Mapping[str, str]:
27
26
  """Get the latest KEGG version number."""
28
27
  soup = get_soup(URL)
29
28
  header = soup.find("h4")
30
29
  sibling = header.next_sibling.strip()
31
- version, date = [part.strip() for part in sibling.split(",", 1)]
30
+ version, date = (part.strip() for part in sibling.split(",", 1))
32
31
  version = version[len("Release ") :]
33
- return dict(version=version, date=date)
32
+ return {"version": version, "date": date}
34
33
 
35
34
 
36
35
  if __name__ == "__main__":
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for MeSH."""
4
2
 
5
3
  import ftplib
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for the Mouse Genome Database."""
4
2
 
5
3
  from bioversions.utils import Getter, VersionType, get_soup
@@ -1,8 +1,8 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for miRBase."""
4
2
 
5
- from bioversions.utils import Getter, VersionType
3
+ from typing import ClassVar
4
+
5
+ from bioversions.utils import Getter, VersionType, get_soup
6
6
 
7
7
  __all__ = [
8
8
  "MirbaseGetter",
@@ -18,15 +18,20 @@ class MirbaseGetter(Getter):
18
18
  name = "miRBase"
19
19
  homepage_fmt = "https://www.mirbase.org/download/PREVIOUS_RELEASES/{version}"
20
20
  version_type = VersionType.semver_minor
21
- collection = ["mirbase", "mirbase.family", "mirbase.mature"]
21
+ collection: ClassVar[list[str]] = ["mirbase", "mirbase.family", "mirbase.mature"]
22
22
 
23
23
  def get(self):
24
24
  """Get the latest miRBase version number."""
25
25
  return "22.1"
26
- # Old code, doesn't work anymore because miRBase site deleted most of their FTP server and downloads
27
- # url = "http://www.mirbase.org/download_readme/"
28
- # soup = get_soup(url, verify=False)
29
- # return soup.find("p").text.splitlines()[0].split()[-1]
26
+
27
+
28
+ def _old():
29
+ """Get miRBase version number from the old server."""
30
+ # Old code, doesn't work anymore because miRBase site deleted
31
+ # most of their FTP server and downloads
32
+ url = "http://www.mirbase.org/download_readme/"
33
+ soup = get_soup(url, verify=False)
34
+ return soup.find("p").text.splitlines()[0].split()[-1]
30
35
 
31
36
 
32
37
  if __name__ == "__main__":
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for the Molecular Oncology Almanac."""
4
2
 
5
3
  from ..utils import Getter, VersionType, get_soup
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  """A getter for MSigDB."""
4
2
 
5
3
  from bioversions.utils import Getter, VersionType, get_soup