Esempio n. 1
0
def validate_package_tree(packages: Dict[str, Package]):
    """ Verify that all dependencies are met in all packages passed to this function.
    Args:
        packages: list of packages to check
    Raises:
        PackageDependencyError: if dependency is missing
        PackageConflictError: if there is a conflict between packages
    """

    for name, package in packages.items():
        log.debug(f'checking dependencies for {name}')
        for dependency in package.manifest['package']['depends']:
            dependency_package = packages.get(dependency.name)
            if dependency_package is None:
                raise PackageDependencyError(package.name, dependency)

            installed_version = dependency_package.version
            log.debug(
                f'dependency package is installed {dependency.name}: {installed_version}'
            )
            if not dependency.constraint.allows(installed_version):
                raise PackageDependencyError(package.name, dependency,
                                             installed_version)

            dependency_components = dependency.components
            if not dependency_components:
                dependency_components = {}
                for component, version in package.components.items():
                    implicit_constraint = VersionConstraint.parse(
                        f'^{version.major}.{version.minor}.0')
                    dependency_components[component] = implicit_constraint

            for component, constraint in dependency_components.items():
                if component not in dependency_package.components:
                    raise PackageComponentDependencyError(
                        package.name, dependency, component, constraint)

                component_version = dependency_package.components[component]
                log.debug(
                    f'dependency package {dependency.name}: '
                    f'component {component} version is {component_version}')

                if not constraint.allows(component_version):
                    raise PackageComponentDependencyError(
                        package.name, dependency, component, constraint,
                        component_version)

        log.debug(f'checking conflicts for {name}')
        for conflict in package.manifest['package']['breaks']:
            conflicting_package = packages.get(conflict.name)
            if conflicting_package is None:
                continue

            installed_version = conflicting_package.version
            log.debug(
                f'conflicting package is installed {conflict.name}: {installed_version}'
            )
            if conflict.constraint.allows(installed_version):
                raise PackageConflictError(package.name, conflict,
                                           installed_version)

            for component, constraint in conflicting_package.components.items(
            ):
                if component not in conflicting_package.components:
                    continue

                component_version = conflicting_package.components[component]
                log.debug(
                    f'conflicting package {conflict.name}: '
                    f'component {component} version is {component_version}')

                if constraint.allows(component_version):
                    raise PackageComponentConflictError(
                        package.name, dependency, component, constraint,
                        component_version)
Esempio n. 2
0
def test_constraint_only_name():
    package_constraint = PackageConstraint.parse('swss')
    assert package_constraint.name == 'swss'
    assert package_constraint.constraint == VersionConstraint('*')