poetry/tests/mixology/version_solver/test_with_lock.py

241 lines
7.5 KiB
Python

from __future__ import annotations
from typing import TYPE_CHECKING
from cleo.io.null_io import NullIO
from packaging.utils import canonicalize_name
from poetry.core.packages.package import Package
from poetry.factory import Factory
from tests.helpers import get_package
from tests.mixology.helpers import add_to_repo
from tests.mixology.helpers import check_solver_result
from tests.mixology.version_solver.conftest import Provider
if TYPE_CHECKING:
from poetry.core.packages.project_package import ProjectPackage
from poetry.repositories import Repository
from poetry.repositories import RepositoryPool
def test_with_compatible_locked_dependencies(
root: ProjectPackage, repo: Repository, pool: RepositoryPool
) -> None:
root.add_dependency(Factory.create_dependency("foo", "*"))
add_to_repo(repo, "foo", "1.0.0", deps={"bar": "1.0.0"})
add_to_repo(repo, "foo", "1.0.1", deps={"bar": "1.0.1"})
add_to_repo(repo, "foo", "1.0.2", deps={"bar": "1.0.2"})
add_to_repo(repo, "bar", "1.0.0")
add_to_repo(repo, "bar", "1.0.1")
add_to_repo(repo, "bar", "1.0.2")
locked = [get_package("foo", "1.0.1"), get_package("bar", "1.0.1")]
provider = Provider(root, pool, NullIO(), locked=locked)
check_solver_result(
root,
provider,
result={"foo": "1.0.1", "bar": "1.0.1"},
)
def test_with_incompatible_locked_dependencies(
root: ProjectPackage, repo: Repository, pool: RepositoryPool
) -> None:
root.add_dependency(Factory.create_dependency("foo", ">1.0.1"))
add_to_repo(repo, "foo", "1.0.0", deps={"bar": "1.0.0"})
add_to_repo(repo, "foo", "1.0.1", deps={"bar": "1.0.1"})
add_to_repo(repo, "foo", "1.0.2", deps={"bar": "1.0.2"})
add_to_repo(repo, "bar", "1.0.0")
add_to_repo(repo, "bar", "1.0.1")
add_to_repo(repo, "bar", "1.0.2")
locked = [get_package("foo", "1.0.1"), get_package("bar", "1.0.1")]
provider = Provider(root, pool, NullIO(), locked=locked)
check_solver_result(
root,
provider,
result={"foo": "1.0.2", "bar": "1.0.2"},
)
def test_with_unrelated_locked_dependencies(
root: ProjectPackage, repo: Repository, pool: RepositoryPool
) -> None:
root.add_dependency(Factory.create_dependency("foo", "*"))
add_to_repo(repo, "foo", "1.0.0", deps={"bar": "1.0.0"})
add_to_repo(repo, "foo", "1.0.1", deps={"bar": "1.0.1"})
add_to_repo(repo, "foo", "1.0.2", deps={"bar": "1.0.2"})
add_to_repo(repo, "bar", "1.0.0")
add_to_repo(repo, "bar", "1.0.1")
add_to_repo(repo, "bar", "1.0.2")
add_to_repo(repo, "baz", "1.0.0")
locked = [get_package("baz", "1.0.1")]
provider = Provider(root, pool, NullIO(), locked=locked)
check_solver_result(
root,
provider,
result={"foo": "1.0.2", "bar": "1.0.2"},
)
def test_unlocks_dependencies_if_necessary_to_ensure_that_a_new_dependency_is_satisfied(
root: ProjectPackage, repo: Repository, pool: RepositoryPool
) -> None:
root.add_dependency(Factory.create_dependency("foo", "*"))
root.add_dependency(Factory.create_dependency("newdep", "2.0.0"))
add_to_repo(repo, "foo", "1.0.0", deps={"bar": "<2.0.0"})
add_to_repo(repo, "bar", "1.0.0", deps={"baz": "<2.0.0"})
add_to_repo(repo, "baz", "1.0.0", deps={"qux": "<2.0.0"})
add_to_repo(repo, "qux", "1.0.0")
add_to_repo(repo, "foo", "2.0.0", deps={"bar": "<3.0.0"})
add_to_repo(repo, "bar", "2.0.0", deps={"baz": "<3.0.0"})
add_to_repo(repo, "baz", "2.0.0", deps={"qux": "<3.0.0"})
add_to_repo(repo, "qux", "2.0.0")
add_to_repo(repo, "newdep", "2.0.0", deps={"baz": ">=1.5.0"})
locked = [
get_package("foo", "2.0.0"),
get_package("bar", "1.0.0"),
get_package("baz", "1.0.0"),
get_package("qux", "1.0.0"),
]
provider = Provider(root, pool, NullIO(), locked=locked)
check_solver_result(
root,
provider,
result={
"foo": "2.0.0",
"bar": "2.0.0",
"baz": "2.0.0",
"qux": "1.0.0",
"newdep": "2.0.0",
},
)
def test_with_compatible_locked_dependencies_use_latest(
root: ProjectPackage, repo: Repository, pool: RepositoryPool
) -> None:
root.add_dependency(Factory.create_dependency("foo", "*"))
root.add_dependency(Factory.create_dependency("baz", "*"))
add_to_repo(repo, "foo", "1.0.0", deps={"bar": "1.0.0"})
add_to_repo(repo, "foo", "1.0.1", deps={"bar": "1.0.1"})
add_to_repo(repo, "foo", "1.0.2", deps={"bar": "1.0.2"})
add_to_repo(repo, "bar", "1.0.0")
add_to_repo(repo, "bar", "1.0.1")
add_to_repo(repo, "bar", "1.0.2")
add_to_repo(repo, "baz", "1.0.0")
add_to_repo(repo, "baz", "1.0.1")
locked = [
get_package("foo", "1.0.1"),
get_package("bar", "1.0.1"),
get_package("baz", "1.0.0"),
]
provider = Provider(root, pool, NullIO(), locked=locked)
check_solver_result(
root,
provider,
result={"foo": "1.0.2", "bar": "1.0.2", "baz": "1.0.0"},
use_latest=[canonicalize_name("foo")],
)
def test_with_compatible_locked_dependencies_with_extras(
root: ProjectPackage, repo: Repository, pool: RepositoryPool
) -> None:
root.add_dependency(Factory.create_dependency("foo", "^1.0"))
package_foo_0 = get_package("foo", "1.0.0")
package_foo_1 = get_package("foo", "1.0.1")
bar_extra_dep = Factory.create_dependency(
"bar", {"version": "^1.0", "extras": "extra"}
)
for package_foo in (package_foo_0, package_foo_1):
package_foo.add_dependency(bar_extra_dep)
repo.add_package(package_foo)
bar_deps = {"baz": {"version": "^1.0", "extras": ["extra"]}}
add_to_repo(repo, "bar", "1.0.0", bar_deps)
add_to_repo(repo, "bar", "1.0.1", bar_deps)
add_to_repo(repo, "baz", "1.0.0")
add_to_repo(repo, "baz", "1.0.1")
locked = [
get_package("foo", "1.0.0"),
get_package("bar", "1.0.0"),
get_package("baz", "1.0.0"),
]
provider = Provider(root, pool, NullIO(), locked=locked)
check_solver_result(
root,
provider,
result={"foo": "1.0.0", "bar": "1.0.0", "baz": "1.0.0"},
)
def test_with_yanked_package_in_lock(
root: ProjectPackage, repo: Repository, pool: RepositoryPool
) -> None:
root.add_dependency(Factory.create_dependency("foo", "*"))
add_to_repo(repo, "foo", "1")
add_to_repo(repo, "foo", "2", yanked=True)
# yanked version is kept in lock file
locked_foo = get_package("foo", "2")
assert not locked_foo.yanked
provider = Provider(root, pool, NullIO(), locked=[locked_foo])
result = check_solver_result(
root,
provider,
result={"foo": "2"},
)
assert result is not None
foo = result.packages[0]
assert foo.yanked
# without considering the lock file, the other version is chosen
provider = Provider(root, pool, NullIO())
check_solver_result(
root,
provider,
result={"foo": "1"},
)
def test_no_update_is_respected_for_legacy_repository(
root: ProjectPackage, repo: Repository, pool: RepositoryPool
) -> None:
root.add_dependency(Factory.create_dependency("foo", "^1.0"))
foo_100 = Package(
"foo", "1.0.0", source_type="legacy", source_url="http://example.com"
)
foo_101 = Package(
"foo", "1.0.1", source_type="legacy", source_url="http://example.com"
)
repo.add_package(foo_100)
repo.add_package(foo_101)
provider = Provider(root, pool, NullIO(), locked=[foo_100])
check_solver_result(
root,
provider,
result={"foo": "1.0.0"},
)