Source code for spey.system.webutils
import logging
from platform import python_version
from typing import Literal
import requests
from semantic_version import SimpleSpec, Version
from spey._version import __version__
log = logging.getLogger("Spey")
__all__ = ["get_bibtex", "check_updates", "ConnectionError"]
def __dir__():
return __all__
class ConnectionError(Exception):
"""No internet connection"""
def get_bibtex(
home: Literal["inspire/arxiv", "inspire/doi", "doi", "zenodo"],
identifier: str,
timeout: int = 5,
) -> str:
"""
Retreive BibTex information from InspireHEP, Zenodo or DOI.org
Args:
home (``Text``): Home location for the identifier.
* ``"inspire/arxiv"``: retreive information from inspire using
arXiv number.
* ``"inspire/doi"``: retreive information from inspore using
doi number.
* ``"doi"``: retreive information from doi.org
* ``"zenodo"``: retreive information from zenodo using zenodo
identifier.
identifier (``Text``): web identifier
timeout (``int``, default ``5``): time out.
Returns:
``Text``:
Bibtex entry.
"""
# pylint: disable=W1203
home_loc = {
"inspire/arxiv": "https://inspirehep.net/api/arxiv/%s",
"inspire/doi": "https://inspirehep.net/api/doi/%s",
"doi": "https://doi.org/%s",
"zenodo": "https://zenodo.org/api/records/%s",
}
try:
response = requests.get(
home_loc[home] % identifier,
headers={"accept": "application/x-bibtex"},
timeout=timeout,
)
if not 200 <= response.status_code <= 299:
log.debug(f"HTML Status Code: {response.status_code}")
return ""
response.encoding = "utf-8"
return response.text
except (
requests.ConnectionError,
requests.ConnectTimeout,
requests.exceptions.ReadTimeout,
) as err:
raise ConnectionError(
"Can not retreive BibTeX information: No internet connection."
) from err
except Exception as err: # pylint: disable=W0718
log.debug(str(err))
return ""
[docs]
def check_updates() -> None:
"""
Check Spey Updates.
.. versionadded:: 0.1.6
Spey always checks updates when initialised. To disable this set the following
Option if using terminal:
.. code-block:: bash
export SPEY_CHECKUPDATE=OFF
Option if using python interface:
.. code-block:: python
import os
os.environ["SPEY_CHECKUPDATE"]="OFF"
"""
# pylint: disable=import-outside-toplevel, W1203
try:
response = requests.get("https://pypi.org/pypi/spey/json", timeout=1)
response.encoding = "utf-8"
pypi_info = response.json()
py_version = Version(python_version())
pypi_version = pypi_info.get("info", {}).get("version", False)
version = __version__
if pypi_version:
python_requires = SimpleSpec(pypi_info["info"]["requires_python"])
log.debug(f"Curernt version {version}, latest version {pypi_version}.")
if "beta" in Version(version).prerelease:
log.warning(
f"A prerelease version of Spey is in use: {version}. "
f"Latest stable version is {pypi_version}."
)
elif Version(version) < Version(pypi_version):
log.warning(
f"A newer version ({pypi_version}) of Spey is available. "
f"Current version is {version}."
)
elif Version(version) > Version(pypi_version):
log.warning(
f"An unstable version of Spey ({version}) is being used."
f" Latest stable version is {pypi_version}."
)
if py_version not in python_requires:
log.warning(
f"The latest version of Spey requires python{python_requires},"
f" however local python version is {py_version}."
)
except Exception as err: # pylint: disable=W0718
# Can not retreive updates
log.debug(str(err))