bioversions 0.5.552__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.
- bioversions/__init__.py +7 -3
- bioversions/__main__.py +0 -2
- bioversions/charts.py +3 -7
- bioversions/cli.py +3 -5
- bioversions/resources/__init__.py +1 -3
- bioversions/resources/update.py +1 -3
- bioversions/resources/versions.json +19543 -0
- bioversions/slack_client.py +2 -5
- bioversions/sources/__init__.py +13 -11
- bioversions/sources/antibodyregistry.py +0 -2
- bioversions/sources/bigg.py +5 -7
- bioversions/sources/biogrid.py +0 -2
- bioversions/sources/cellosaurus.py +3 -5
- bioversions/sources/chebi.py +1 -3
- bioversions/sources/chembl.py +3 -4
- bioversions/sources/chemidplus.py +1 -3
- bioversions/sources/civic.py +4 -2
- bioversions/sources/complexportal.py +0 -2
- bioversions/sources/daily.py +0 -2
- bioversions/sources/depmap.py +1 -3
- bioversions/sources/dgi.py +1 -3
- bioversions/sources/disgenet.py +1 -3
- bioversions/sources/drugbank.py +2 -4
- bioversions/sources/drugcentral.py +2 -4
- bioversions/sources/ensembl.py +1 -3
- bioversions/sources/expasy.py +0 -3
- bioversions/sources/flybase.py +0 -2
- bioversions/sources/gtdb.py +35 -0
- bioversions/sources/guidetopharmacology.py +3 -5
- bioversions/sources/hgnc.py +1 -1
- bioversions/sources/homologene.py +0 -2
- bioversions/sources/icd10.py +1 -3
- bioversions/sources/icd11.py +1 -3
- bioversions/sources/icf.py +1 -3
- bioversions/sources/intact.py +0 -2
- bioversions/sources/interpro.py +1 -3
- bioversions/sources/itis.py +1 -3
- bioversions/sources/kegg.py +5 -6
- bioversions/sources/mesh.py +0 -2
- bioversions/sources/mgi.py +0 -2
- bioversions/sources/mirbase.py +13 -8
- bioversions/sources/moalmanac.py +0 -2
- bioversions/sources/msigdb.py +0 -2
- bioversions/sources/ncit.py +1 -4
- bioversions/sources/npass.py +0 -2
- bioversions/sources/obo.py +2 -4
- bioversions/sources/ols.py +6 -8
- bioversions/sources/omim.py +2 -3
- bioversions/sources/oncotree.py +4 -4
- bioversions/sources/pathbank.py +0 -2
- bioversions/sources/pathwaycommons.py +0 -2
- bioversions/sources/pfam.py +0 -2
- bioversions/sources/pombase.py +0 -2
- bioversions/sources/pr.py +1 -3
- bioversions/sources/pubchem.py +0 -2
- bioversions/sources/reactome.py +0 -2
- bioversions/sources/rfam.py +0 -2
- bioversions/sources/rgd.py +0 -2
- bioversions/sources/rhea.py +0 -2
- bioversions/sources/rxnorm.py +0 -2
- bioversions/sources/sgd.py +0 -2
- bioversions/sources/slm.py +1 -1
- bioversions/sources/stringdb.py +2 -4
- bioversions/sources/umls.py +0 -2
- bioversions/sources/uniprot.py +1 -3
- bioversions/sources/unversioned.py +0 -2
- bioversions/sources/wikipathways.py +0 -2
- bioversions/sources/zfin.py +0 -2
- bioversions/templates/base.html +28 -0
- bioversions/templates/home.html +60 -0
- bioversions/twitter_client.py +5 -8
- bioversions/utils.py +30 -28
- bioversions/version.py +3 -5
- bioversions/wsgi.py +2 -4
- {bioversions-0.5.552.dist-info → bioversions-0.5.553.dist-info}/LICENSE +1 -1
- bioversions-0.5.553.dist-info/METADATA +382 -0
- bioversions-0.5.553.dist-info/RECORD +81 -0
- bioversions-0.5.552.dist-info/METADATA +0 -166
- bioversions-0.5.552.dist-info/RECORD +0 -77
- {bioversions-0.5.552.dist-info → bioversions-0.5.553.dist-info}/WHEEL +0 -0
- {bioversions-0.5.552.dist-info → bioversions-0.5.553.dist-info}/entry_points.txt +0 -0
- {bioversions-0.5.552.dist-info → bioversions-0.5.553.dist-info}/top_level.txt +0 -0
bioversions/slack_client.py
CHANGED
@@ -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:
|
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:
|
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:
|
bioversions/sources/__init__.py
CHANGED
@@ -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() ->
|
82
|
+
def get_getters() -> list[type[Getter]]:
|
82
83
|
"""Get a list of getters."""
|
83
84
|
# TODO replace with entrypoint lookup
|
84
|
-
getters:
|
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,
|
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:
|
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:
|
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:
|
197
|
-
) -> Iterable[
|
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 (
|
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
|
bioversions/sources/bigg.py
CHANGED
@@ -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
|
29
|
-
version
|
30
|
-
date
|
31
|
-
|
26
|
+
return {
|
27
|
+
"version": res["bigg_models_version"],
|
28
|
+
"date": date,
|
29
|
+
}
|
32
30
|
|
33
31
|
|
34
32
|
if __name__ == "__main__":
|
bioversions/sources/biogrid.py
CHANGED
@@ -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 =
|
31
|
+
key, value = (part.strip() for part in line.split(":", 1))
|
34
32
|
data[key] = value
|
35
|
-
return
|
33
|
+
return {"version": data["data-version"], "date": data["date"]}
|
36
34
|
|
37
35
|
|
38
36
|
if __name__ == "__main__":
|
bioversions/sources/chebi.py
CHANGED
@@ -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
|
28
|
+
return {"version": version, "date": date}
|
31
29
|
|
32
30
|
|
33
31
|
if __name__ == "__main__":
|
bioversions/sources/chembl.py
CHANGED
@@ -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
|
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:
|
bioversions/sources/civic.py
CHANGED
@@ -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
|
|
bioversions/sources/daily.py
CHANGED
bioversions/sources/depmap.py
CHANGED
@@ -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
|
|
bioversions/sources/dgi.py
CHANGED
@@ -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:
|
bioversions/sources/disgenet.py
CHANGED
@@ -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 {
|
bioversions/sources/drugbank.py
CHANGED
@@ -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
|
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 =
|
16
|
+
PARAMS = {"dbname": DBNAME, "user": USER, "password": PASSWORD, "host": HOST, "port": PORT}
|
19
17
|
|
20
18
|
|
21
19
|
class DrugCentralGetter(Getter):
|
bioversions/sources/ensembl.py
CHANGED
@@ -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
|
26
|
+
return {"version": version.split()[-1], "date": date}
|
29
27
|
|
30
28
|
|
31
29
|
if __name__ == "__main__":
|
bioversions/sources/expasy.py
CHANGED
@@ -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:
|
bioversions/sources/flybase.py
CHANGED
@@ -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
|
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) ->
|
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
|
bioversions/sources/hgnc.py
CHANGED
@@ -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:
|
bioversions/sources/icd10.py
CHANGED
@@ -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
|
|
bioversions/sources/icd11.py
CHANGED
@@ -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
|
|
bioversions/sources/icf.py
CHANGED
@@ -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
|
|
bioversions/sources/intact.py
CHANGED
bioversions/sources/interpro.py
CHANGED
@@ -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
|
36
|
+
return {"version": version, "date": _process_line(rest)}
|
39
37
|
raise ValueError
|
40
38
|
|
41
39
|
|
bioversions/sources/itis.py
CHANGED
bioversions/sources/kegg.py
CHANGED
@@ -1,8 +1,7 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
|
3
1
|
"""A getter for KEGG."""
|
4
2
|
|
5
|
-
from
|
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 =
|
30
|
+
version, date = (part.strip() for part in sibling.split(",", 1))
|
32
31
|
version = version[len("Release ") :]
|
33
|
-
return
|
32
|
+
return {"version": version, "date": date}
|
34
33
|
|
35
34
|
|
36
35
|
if __name__ == "__main__":
|
bioversions/sources/mesh.py
CHANGED
bioversions/sources/mgi.py
CHANGED
bioversions/sources/mirbase.py
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
|
3
1
|
"""A getter for miRBase."""
|
4
2
|
|
5
|
-
from
|
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
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
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__":
|
bioversions/sources/moalmanac.py
CHANGED