in modular_api/services/install_service.py [0:0]
def check_module_requirements(api_module_config):
"""
Expecting module descriptor file template:
{
"module_name": "$MODULE_NAME",
"cli_path": "$MODULE_CLI_PATH",
"mount_point": "$MOUNT_POINT",
"dependencies": [
{
"module_name": "$MODULE_NAME_DEPENDENT_FROM",
"min_version": "$MIN_ALLOWED_VERSION_OF_DEPENDED_MODULE"
},
...
]
}
Property "dependencies" is optional, but if present - "module_name" in
"dependencies"`s objects is required. Property "min_version" is optional
"""
dependencies = api_module_config.get(DEPENDENCIES)
if not dependencies:
return
candidate = api_module_config.get(MODULE_NAME_KEY)
installed_packages = {dist.metadata['Name']: dist for dist in distributions()}
for item in dependencies:
# check dependent module is installed
dependent_module_name = item.get(MODULE_NAME_KEY)
if not dependent_module_name:
message = 'Missing required property "module_name" in module ' \
'descriptor file'
_LOG.error(message)
sys.exit(message)
installed_module_name = installed_packages.get(dependent_module_name)
if not installed_module_name:
message = f'Module "{dependent_module_name}" is marked as ' \
f'required for "{candidate}" module. Please install ' \
f'"{dependent_module_name}" first'
_LOG.error(message)
sys.exit(message)
# check major versions conflict
dependency_min_version = item.get(MIN_VER)
if not dependency_min_version:
break
installing_major_min_version = version.parse(dependency_min_version).major
installed_major_version = version.parse(installed_module_name.version).major
if installing_major_min_version > installed_major_version:
message = f'Module "{candidate}" requires a later major version ' \
f'of "{dependent_module_name}". Please update ' \
f'"{dependent_module_name}" to the latest version'
_LOG.error(message)
sys.exit(message)