added implemenation and test for module versioning
This commit is contained in:
@ -5,6 +5,7 @@ requirements, and assessed by handlers and conductors.
|
|||||||
Author(s): David Marchant
|
Author(s): David Marchant
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from importlib.metadata import version, PackageNotFoundError
|
||||||
from importlib.util import find_spec
|
from importlib.util import find_spec
|
||||||
from os.path import basename
|
from os.path import basename
|
||||||
from sys import version_info, prefix, base_prefix
|
from sys import version_info, prefix, base_prefix
|
||||||
@ -71,10 +72,61 @@ def check_python_requirements(reqs:Dict[str,Any])->bool:
|
|||||||
# TODO expand these so you can specify versions
|
# TODO expand these so you can specify versions
|
||||||
if REQ_PYTHON_MODULES in reqs:
|
if REQ_PYTHON_MODULES in reqs:
|
||||||
for module in reqs[REQ_PYTHON_MODULES]:
|
for module in reqs[REQ_PYTHON_MODULES]:
|
||||||
|
module_version = None
|
||||||
|
relation = None
|
||||||
|
for r in ["==", ">=", "<=", ">", "<"]:
|
||||||
|
if r in module:
|
||||||
|
module, module_version = module.split(r)
|
||||||
|
relation = r
|
||||||
|
break
|
||||||
|
|
||||||
found_spec = find_spec(module)
|
found_spec = find_spec(module)
|
||||||
if found_spec is None:
|
if found_spec is None:
|
||||||
return False, f"Could not find module '{module}'."
|
return False, f"Could not find module '{module}'."
|
||||||
|
|
||||||
|
if module_version is None:
|
||||||
|
continue
|
||||||
|
|
||||||
|
try:
|
||||||
|
installed_version = version(module)
|
||||||
|
except PackageNotFoundError:
|
||||||
|
return False, f"Could not find module '{module}'."
|
||||||
|
|
||||||
|
if relation == "==" and module_version != installed_version:
|
||||||
|
return (
|
||||||
|
False,
|
||||||
|
f"Installed {module} version '{installed_version}' "
|
||||||
|
f"differs from requested '{module_version}'"
|
||||||
|
)
|
||||||
|
|
||||||
|
if relation == ">=" and module_version > installed_version:
|
||||||
|
return (
|
||||||
|
False,
|
||||||
|
f"Installed {module} version '{installed_version}' "
|
||||||
|
f"is more that requested '{module_version}'"
|
||||||
|
)
|
||||||
|
|
||||||
|
if relation == "<=" and module_version < installed_version:
|
||||||
|
return (
|
||||||
|
False,
|
||||||
|
f"Installed {module} version '{installed_version}' "
|
||||||
|
f"is less that requested '{module_version}'"
|
||||||
|
)
|
||||||
|
|
||||||
|
if relation == ">" and module_version > installed_version:
|
||||||
|
return (
|
||||||
|
False,
|
||||||
|
f"Installed {module} version '{installed_version}' "
|
||||||
|
f"is more that requested '{module_version}'"
|
||||||
|
)
|
||||||
|
|
||||||
|
if relation == "<" and module_version < installed_version:
|
||||||
|
return (
|
||||||
|
False,
|
||||||
|
f"Installed {module} version '{installed_version}' "
|
||||||
|
f"is less that requested '{module_version}'"
|
||||||
|
)
|
||||||
|
|
||||||
if REQ_PYTHON_VERSION in reqs:
|
if REQ_PYTHON_VERSION in reqs:
|
||||||
major, minor, micro = parse_versions(reqs[REQ_PYTHON_VERSION])
|
major, minor, micro = parse_versions(reqs[REQ_PYTHON_VERSION])
|
||||||
|
|
||||||
|
@ -1044,6 +1044,73 @@ class RequirementsTest(unittest.TestCase):
|
|||||||
|
|
||||||
self.assertFalse(status)
|
self.assertFalse(status)
|
||||||
|
|
||||||
|
def testPythonRequirementModuleVersions(self)->None:
|
||||||
|
key, python_reqs = create_python_requirements(
|
||||||
|
modules="papermill==2.4.0")
|
||||||
|
reqs = { key: python_reqs }
|
||||||
|
status, _ = check_requirements(reqs)
|
||||||
|
self.assertTrue(status)
|
||||||
|
|
||||||
|
key, python_reqs = create_python_requirements(
|
||||||
|
modules="papermill<4")
|
||||||
|
reqs = { key: python_reqs }
|
||||||
|
status, _ = check_requirements(reqs)
|
||||||
|
self.assertTrue(status)
|
||||||
|
|
||||||
|
key, python_reqs = create_python_requirements(
|
||||||
|
modules="papermill<1.0")
|
||||||
|
reqs = { key: python_reqs }
|
||||||
|
status, _ = check_requirements(reqs)
|
||||||
|
self.assertFalse(status)
|
||||||
|
|
||||||
|
key, python_reqs = create_python_requirements(
|
||||||
|
modules="papermill>4")
|
||||||
|
reqs = { key: python_reqs }
|
||||||
|
status, _ = check_requirements(reqs)
|
||||||
|
self.assertFalse(status)
|
||||||
|
|
||||||
|
key, python_reqs = create_python_requirements(
|
||||||
|
modules="papermill>1.0")
|
||||||
|
reqs = { key: python_reqs }
|
||||||
|
status, _ = check_requirements(reqs)
|
||||||
|
self.assertTrue(status)
|
||||||
|
|
||||||
|
key, python_reqs = create_python_requirements(
|
||||||
|
modules="papermill<=4")
|
||||||
|
reqs = { key: python_reqs }
|
||||||
|
status, _ = check_requirements(reqs)
|
||||||
|
self.assertTrue(status)
|
||||||
|
|
||||||
|
key, python_reqs = create_python_requirements(
|
||||||
|
modules="papermill<=2.4.0")
|
||||||
|
reqs = { key: python_reqs }
|
||||||
|
status, _ = check_requirements(reqs)
|
||||||
|
self.assertTrue(status)
|
||||||
|
|
||||||
|
key, python_reqs = create_python_requirements(
|
||||||
|
modules="papermill<=1.0")
|
||||||
|
reqs = { key: python_reqs }
|
||||||
|
status, _ = check_requirements(reqs)
|
||||||
|
self.assertFalse(status)
|
||||||
|
|
||||||
|
key, python_reqs = create_python_requirements(
|
||||||
|
modules="papermill>=4")
|
||||||
|
reqs = { key: python_reqs }
|
||||||
|
status, _ = check_requirements(reqs)
|
||||||
|
self.assertFalse(status)
|
||||||
|
|
||||||
|
key, python_reqs = create_python_requirements(
|
||||||
|
modules="papermill>=2.4.0")
|
||||||
|
reqs = { key: python_reqs }
|
||||||
|
status, _ = check_requirements(reqs)
|
||||||
|
self.assertTrue(status)
|
||||||
|
|
||||||
|
key, python_reqs = create_python_requirements(
|
||||||
|
modules="papermill>=1.0")
|
||||||
|
reqs = { key: python_reqs }
|
||||||
|
status, _ = check_requirements(reqs)
|
||||||
|
self.assertTrue(status)
|
||||||
|
|
||||||
# Test environment value of Python requirement testings
|
# Test environment value of Python requirement testings
|
||||||
def testPythonRequirementsEnvironment(self)->None:
|
def testPythonRequirementsEnvironment(self)->None:
|
||||||
# TODO rework this test so that it actually create and runs in a new
|
# TODO rework this test so that it actually create and runs in a new
|
||||||
|
Reference in New Issue
Block a user