Source code for osl_ephys.utils.version_utils
from packaging.version import Version, parse
import re
import operator
from importlib.metadata import version
# Housekeeping for logging
import logging
[docs]osl_logger = logging.getLogger(__name__)
[docs]def _parse_condition(cond):
"""Parse strings defining conditional statements.
Borrowed from EMD package
"""
name = re.split(r'[=<>!]', cond)[0]
comp = cond[len(name):]
if comp[:2] == '==':
func = operator.eq
elif comp[:2] == '!=':
func = operator.ne
elif comp[:2] == '<=':
func = operator.le
elif comp[:2] == '>=':
func = operator.ge
elif comp[0] == '<':
func = operator.lt
elif comp[0] == '>':
func = operator.gt
else:
print('Comparator not recognised!')
val = comp.lstrip('!=<>')
return (name, func, str(val))
[docs]def check_version(test_statement, mode='warn'):
"""Check whether the version of a package meets a specified condition.
Parameters
----------
test_statement : str
Package version comparison string in the standard format expected by python installs.
eg 'osl-ephys<1.0.0' or 'osl-ephys==0.6.dev0'
mode : {'warn', 'assert'}
Flag indicating whether to warn the user or raise an error if the comparison fails
"""
test_module, comparator, target_version = _parse_condition(test_statement)
test_version = Version(version(test_module))
target_version = Version(target_version)
if comparator(test_version, target_version) is False:
msg = "Package '{}' version ({}) fails specified requirement ({})"
msg = msg.format(test_module, test_version, test_statement)
if mode == 'warn':
osl_logger.warning(msg)
elif mode == 'assert':
osl_logger.warning(msg)
raise AssertionError(msg)