Source code for khoros.utils.version
# -*- coding: utf-8 -*-
"""
:Module: khoros.utils.version
:Synopsis: This simple script contains the package version
:Usage: ``from .utils import version``
:Example: ``__version__ = version.get_full_version()``
:Created By: Jeff Shurtliff
:Last Modified: Jeff Shurtliff
:Modified Date: 01 Nov 2023
"""
import json
import urllib.request
from . import log_utils
# Define special and global variables
__version__ = "5.4.0"
latest_version_reported = False
logger = log_utils.initialize_logging(__name__)
[docs]
def get_full_version():
"""This function returns the current full version of the khoros package."""
return __version__
[docs]
def log_current_version(debug=False):
"""This function reports the current running version of the library in a debug log entry.
.. versionchanged:: 5.0.0
Removed the redundant ``return`` statement.
.. versionadded:: 3.0.0
:param debug: Defines if the message should be logged with the ``DEBUG`` log level. (``False`` by default)
:type debug: bool
:returns: None
"""
log_msg = f'The current version of the library is {__version__}.'
if debug:
logger.debug(log_msg)
else:
logger.info(log_msg)
[docs]
def get_major_minor_version():
"""This function returns the current major.minor (i.e. X.Y) version of the khoros package."""
return ".".join(__version__.split(".")[:2])
[docs]
def get_latest_stable():
"""This function returns the latest stable version of the khoros package.
.. versionchanged:: 3.4.0
This function has been refactored to leverage the standard library instead of the ``requests`` library.
.. versionchanged:: 3.0.0
Error handling and logging was added to avoid an exception if PyPI cannot be queried successfully.
:returns: The latest stable version in string format
"""
try:
response = urllib.request.urlopen('https://pypi.org/pypi/khoros/json')
pypi_data = json.loads(response.read().decode(response.info().get_param('charset') or 'utf-8'))
latest_stable = pypi_data['info']['version']
global latest_version_reported
if not latest_version_reported:
logger.debug(f'The latest stable version of the library on PyPI is {latest_stable}.')
latest_version_reported = True
except Exception as exc:
exc_msg = f"{type(exc).__name__} - {exc}"
logger.error("Unable to perform the query to retrieve the latest stable version of the library due "
f"to the following exception: {exc_msg}")
latest_stable = '0.0.0'
return latest_stable
[docs]
def latest_version():
"""This function defines if the current version matches the latest stable version on PyPI.
.. versionchanged:: 3.0.0
The function was reduced to a single return statement.
:returns: Boolean value indicating if the versions match
"""
return True if get_full_version() == get_latest_stable() else False
[docs]
def warn_when_not_latest():
"""This function displays a :py:exc:`RuntimeWarning` if the running version doesn't match the latest stable version.
.. versionchanged:: 5.0.0
Removed the redundant ``return`` statement and merged two ``if`` statements.
.. versionchanged:: 3.0.0
The function was updated to use logging for the warning rather than the :py:mod:`warnings` module.
:returns: None
"""
if not latest_version() and get_latest_stable() != '0.0.0':
warn_msg = "The latest stable version of khoros is not running. " + \
"Consider running 'pip install khoros --upgrade' when feasible."
logger.warning(warn_msg)
# Log the current version only when debug mode is enabled
log_current_version(debug=True)