def check_module_requirements()

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)