Commit 26f13f78 by Sébastien Eustace

Refactor dependencies handling to support groups

parent 52788238
......@@ -397,12 +397,19 @@ version = "1.1.0a5"
description = "Poetry PEP 517 Build Backend"
category = "main"
optional = false
python-versions = ">=3.6,<4.0"
python-versions = "^3.6"
develop = false
[package.dependencies]
dataclasses = {version = ">=0.8", markers = "python_version >= \"3.6\" and python_version < \"3.7\""}
importlib-metadata = {version = ">=1.7.0", markers = "python_version < \"3.8\""}
[package.source]
type = "git"
url = "https://github.com/python-poetry/poetry-core.git"
reference = "master"
resolved_reference = "afaa6903f654b695d9411fb548ad10630287c19f"
[[package]]
name = "pre-commit"
version = "2.12.1"
......@@ -701,7 +708,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt
[metadata]
lock-version = "1.1"
python-versions = "^3.6"
content-hash = "ac67bc6eacbb6b633f9568d69533d80456f632c7bfb9a2aa61aa9dd98e862473"
content-hash = "e38d34da68dcd63ef9f9d999f60b8e19d8da7f988031c3a6e6865d51c1fadeda"
[metadata.files]
appdirs = [
......@@ -967,10 +974,7 @@ pluggy = [
{file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"},
{file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"},
]
poetry-core = [
{file = "poetry-core-1.1.0a5.tar.gz", hash = "sha256:1b886de26026865325eae86a5d12eb154b80c0add8067c106eb706757594d85f"},
{file = "poetry_core-1.1.0a5-py3-none-any.whl", hash = "sha256:b347525c1417e9b5c6aee52967eff98c0886853a9e8ab1b9dfb2659913dd37bc"},
]
poetry-core = []
pre-commit = [
{file = "pre_commit-2.12.1-py2.py3-none-any.whl", hash = "sha256:70c5ec1f30406250b706eda35e868b87e3e4ba099af8787e3e8b4b01e84f4712"},
{file = "pre_commit-2.12.1.tar.gz", hash = "sha256:900d3c7e1bf4cf0374bb2893c24c23304952181405b4d88c9c40b72bda1bb8a9"},
......
......@@ -99,7 +99,7 @@ class DebugResolveCommand(InitCommand):
packages = [op.package for op in ops]
repo = Repository(packages)
requires = package.requires + package.dev_requires
requires = package.all_requires
for pkg in repo.packages:
for require in requires:
if pkg.name == require.name:
......
......@@ -68,14 +68,17 @@ lists all packages available."""
# Show tree view if requested
if self.option("tree") and not package:
requires = self.poetry.package.requires
groups = ["default"]
if include_dev:
requires += self.poetry.package.dev_requires
groups.append("dev")
package = self.poetry.package.with_dependency_groups(groups, only=True)
requires = package.all_requires
packages = locked_repo.packages
for package in packages:
for pkg in packages:
for require in requires:
if package.name == require.name:
self.display_package_tree(self._io, package, locked_repo)
if pkg.name == require.name:
self.display_package_tree(self._io, pkg, locked_repo)
break
return 0
......@@ -386,13 +389,16 @@ lists all packages available."""
# find the latest version allowed in this pool
if package.source_type in ("git", "file", "directory"):
requires = self.poetry.package.requires
groups = ["default"]
if include_dev:
requires = requires + self.poetry.package.dev_requires
groups.append("dev")
root = self.poetry.package.with_dependency_groups(groups, only=True)
requires = root.all_requires
for dep in requires:
if dep.name == package.name:
provider = Provider(self.poetry.package, self.poetry.pool, NullIO())
provider = Provider(root, self.poetry.pool, NullIO())
if dep.is_vcs():
return provider.search_for_vcs(dep)[0]
......
......@@ -37,7 +37,9 @@ class UpdateCommand(InstallerCommand):
if packages:
self._installer.whitelist({name: "*" for name in packages})
self._installer.dev_mode(not self.option("no-dev"))
if self.option("no-dev"):
self._installer.with_groups(["dev"])
self._installer.dry_run(self.option("dry-run"))
self._installer.execute_operations(not self.option("lock"))
......
......@@ -157,7 +157,9 @@ class PackageInfo:
poetry_package = self._get_poetry_package(path=root_dir or self._source_url)
if poetry_package:
package.extras = poetry_package.extras
package.requires = poetry_package.requires
for dependency in poetry_package.requires:
package.add_dependency(dependency)
return package
seen_requirements = set()
......@@ -191,7 +193,7 @@ class PackageInfo:
req = dependency.to_pep_508(with_extras=True)
if req not in seen_requirements:
package.requires.append(dependency)
package.add_dependency(dependency)
seen_requirements.add(req)
return package
......
......@@ -54,8 +54,10 @@ class Installer:
self._update = False
self._verbose = False
self._write_lock = True
self._dev_mode = True
self._dev_only = False
self._without_groups = None
self._with_groups = None
self._only_groups = None
self._execute_operations = True
self._lock = False
......@@ -137,21 +139,20 @@ class Installer:
def is_verbose(self) -> bool:
return self._verbose
def dev_mode(self, dev_mode: bool = True) -> "Installer":
self._dev_mode = dev_mode
def without_groups(self, groups: List[str]) -> "Installer":
self._without_groups = groups
return self
def is_dev_mode(self) -> bool:
return self._dev_mode
def dev_only(self, dev_only: bool = False) -> "Installer":
self._dev_only = dev_only
def with_groups(self, groups: List[str]) -> "Installer":
self._with_groups = groups
return self
def is_dev_only(self) -> bool:
return self._dev_only
def only_groups(self, groups: List[str]) -> "Installer":
self._only_groups = groups
return self
def update(self, update: bool = True) -> "Installer":
self._update = update
......@@ -283,13 +284,20 @@ class Installer:
# If we are only in lock mode, no need to go any further
return 0
root = self._package
if not self.is_dev_mode():
root = root.clone()
del root.dev_requires[:]
elif self.is_dev_only():
root = root.clone()
del root.requires[:]
if self._without_groups or self._with_groups or self._only_groups:
if self._with_groups:
# Default dependencies and opt-in optional dependencies
root = self._package.without_dependency_groups(self._with_groups)
elif self._without_groups:
# Default dependencies without elected groups
root = self._package.without_dependency_groups(self._without_groups)
else:
# Only selected groups
root = self._package.with_dependency_groups(
self._only_groups, only=True
)
else:
root = self._package.without_optional_dependency_groups()
if self._io.is_verbose():
self._io.write_line("")
......@@ -502,9 +510,7 @@ class Installer:
for installed in installed_repo.packages:
if locked.name == installed.name:
is_installed = True
if locked.category == "dev" and not self.is_dev_mode():
ops.append(Uninstall(locked))
elif locked.optional and locked.name not in extra_packages:
if locked.optional and locked.name not in extra_packages:
# Installed but optional and not requested in extras
ops.append(Uninstall(locked))
elif locked.version != installed.version:
......@@ -553,11 +559,6 @@ class Installer:
if package.name not in extra_packages:
op.skip("Not required")
# If the package is a dev package and dev packages
# are not requested, we skip it
if package.category == "dev" and not self.is_dev_mode():
op.skip("Dev dependencies not requested")
def _get_extra_packages(self, repo: Repository) -> List[str]:
"""
Returns all package names required by extras.
......
......@@ -47,7 +47,7 @@ class Locker:
_VERSION = "1.1"
_relevant_keys = ["dependencies", "dev-dependencies", "source", "extras"]
_relevant_keys = ["dependencies", "group", "source", "extras"]
def __init__(self, lock: Union[str, Path], local_config: dict) -> None:
self._lock = TOMLFile(lock)
......@@ -128,7 +128,8 @@ class Locker:
source_resolved_reference=source.get("resolved_reference"),
)
package.description = info.get("description", "")
package.category = info["category"]
package.category = info.get("category", "main")
package.groups = info.get("groups", ["default"])
package.optional = info["optional"]
if "hashes" in lock_data["metadata"]:
# Old lock so we create dummy files from the hashes
......
......@@ -21,3 +21,5 @@ class ProjectPackage(_ProjectPackage):
else:
self._version = version
self._pretty_version = pretty_version or version.text
return self
......@@ -330,7 +330,8 @@ class Provider:
for dep in package.extras[extra]:
dep.activate()
package.requires += package.extras[extra]
for extra_dep in package.extras[extra]:
package.add_dependency(extra_dep)
dependency._constraint = package.version
dependency._pretty_constraint = package.version.text
......@@ -535,10 +536,10 @@ class Provider:
# - pypiwin32 (219); sys_platform == "win32" and python_version < "3.6"
duplicates = dict()
for dep in dependencies:
if dep.name not in duplicates:
duplicates[dep.name] = []
if dep.complete_name not in duplicates:
duplicates[dep.complete_name] = []
duplicates[dep.name].append(dep)
duplicates[dep.complete_name].append(dep)
dependencies = []
for dep_name, deps in duplicates.items():
......@@ -699,7 +700,12 @@ class Provider:
clean_dependencies.append(dep)
package.requires = clean_dependencies
package = DependencyPackage(
package.dependency, package.with_dependency_groups([], only=True)
)
for dep in clean_dependencies:
package.add_dependency(dep)
return package
......
......@@ -6,6 +6,7 @@ from contextlib import contextmanager
from typing import TYPE_CHECKING
from typing import Callable
from typing import Dict
from typing import FrozenSet
from typing import List
from typing import Optional
from typing import Tuple
......@@ -254,7 +255,7 @@ class Solver:
for dep in package.requires:
if dep not in pkg.requires:
pkg.requires.append(dep)
pkg.add_dependency(dep)
return packages, depths
......@@ -300,7 +301,7 @@ class Solver:
continue
if dep not in _package.requires:
_package.requires.append(dep)
_package.add_dependency(dep)
continue
......@@ -312,7 +313,9 @@ class Solver:
class DFSNode:
def __init__(self, id: Tuple[str, str, bool], name: str, base_name: str) -> None:
def __init__(
self, id: Tuple[str, FrozenSet[str], bool], name: str, base_name: str
) -> None:
self.id = id
self.name = name
self.base_name = base_name
......@@ -423,13 +426,15 @@ class PackageNode(DFSNode):
if not previous:
self.category = "dev"
self.groups = frozenset()
self.optional = True
else:
self.category = dep.category
self.category = "main" if "default" in dep.groups else "dev"
self.groups = dep.groups
self.optional = dep.is_optional()
super().__init__(
(package.complete_name, self.category, self.optional),
(package.complete_name, self.groups, self.optional),
package.complete_name,
package.name,
)
......@@ -470,7 +475,7 @@ class PackageNode(DFSNode):
# we merge the requirements
if any(
child.package.name == pkg.name
and child.category == dependency.category
and child.groups == dependency.groups
for child in children
):
continue
......@@ -505,14 +510,20 @@ def aggregate_package_nodes(
) -> Tuple[Package, int]:
package = nodes[0].package
depth = max(node.depth for node in nodes)
groups = []
for node in nodes:
groups.extend(node.groups)
category = (
"main" if any(node.category == "main" for node in children + nodes) else "dev"
"main" if any("default" in node.groups for node in children + nodes) else "dev"
)
optional = all(node.optional for node in children + nodes)
for node in nodes:
node.depth = depth
node.category = category
node.optional = optional
package.category = category
package.optional = optional
return package, depth
......@@ -31,7 +31,7 @@ generate-setup-file = false
[tool.poetry.dependencies]
python = "^3.6"
poetry-core = "~1.1.0a5"
poetry-core = { git = "https://github.com/python-poetry/poetry-core.git", branch = "master" }
cleo = "^1.0.0a1"
crashtest = "^0.3.0"
requests = "^2.18"
......
......@@ -116,7 +116,7 @@ def test_add_constraint_with_extras(app, repo, tester):
cachy1 = get_package("cachy", "0.1.0")
cachy1.extras = {"msgpack": [get_dependency("msgpack-python")]}
msgpack_dep = get_dependency("msgpack-python", ">=0.5 <0.6", optional=True)
cachy1.requires = [msgpack_dep]
cachy1.add_dependency(msgpack_dep)
repo.add_package(get_package("cachy", "0.2.0"))
repo.add_package(cachy1)
......@@ -144,7 +144,7 @@ Package operations: 2 installs, 0 updates, 0 removals
def test_add_constraint_dependencies(app, repo, tester):
cachy2 = get_package("cachy", "0.2.0")
msgpack_dep = get_dependency("msgpack-python", ">=0.5 <0.6")
cachy2.requires = [msgpack_dep]
cachy2.add_dependency(msgpack_dep)
repo.add_package(get_package("cachy", "0.1.0"))
repo.add_package(cachy2)
......@@ -443,7 +443,7 @@ def test_add_constraint_with_extras_option(app, repo, tester):
cachy2 = get_package("cachy", "0.2.0")
cachy2.extras = {"msgpack": [get_dependency("msgpack-python")]}
msgpack_dep = get_dependency("msgpack-python", ">=0.5 <0.6", optional=True)
cachy2.requires = [msgpack_dep]
cachy2.add_dependency(msgpack_dep)
repo.add_package(get_package("cachy", "0.1.0"))
repo.add_package(cachy2)
......@@ -919,7 +919,7 @@ def test_add_constraint_with_extras_old_installer(app, repo, installer, old_test
cachy1 = get_package("cachy", "0.1.0")
cachy1.extras = {"msgpack": [get_dependency("msgpack-python")]}
msgpack_dep = get_dependency("msgpack-python", ">=0.5 <0.6", optional=True)
cachy1.requires = [msgpack_dep]
cachy1.add_dependency(msgpack_dep)
repo.add_package(get_package("cachy", "0.2.0"))
repo.add_package(cachy1)
......@@ -948,7 +948,7 @@ Package operations: 2 installs, 0 updates, 0 removals
def test_add_constraint_dependencies_old_installer(app, repo, installer, old_tester):
cachy2 = get_package("cachy", "0.2.0")
msgpack_dep = get_dependency("msgpack-python", ">=0.5 <0.6")
cachy2.requires = [msgpack_dep]
cachy2.add_dependency(msgpack_dep)
repo.add_package(get_package("cachy", "0.1.0"))
repo.add_package(cachy2)
......@@ -1245,7 +1245,7 @@ def test_add_constraint_with_extras_option_old_installer(
cachy2 = get_package("cachy", "0.2.0")
cachy2.extras = {"msgpack": [get_dependency("msgpack-python")]}
msgpack_dep = get_dependency("msgpack-python", ">=0.5 <0.6", optional=True)
cachy2.requires = [msgpack_dep]
cachy2.add_dependency(msgpack_dep)
repo.add_package(get_package("cachy", "0.1.0"))
repo.add_package(cachy2)
......
......@@ -13,7 +13,7 @@ def test_show_basic_with_installed_packages(tester, poetry, installed):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0"))
poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0"))
poetry.package.add_dependency(
Factory.create_dependency("pytest", "^3.7.3", category="dev")
Factory.create_dependency("pytest", "^3.7.3", groups=["dev"])
)
cachy_010 = get_package("cachy", "0.1.0")
......@@ -1193,7 +1193,7 @@ cachy 0.2.0
def test_show_tree_no_dev(tester, poetry, installed):
poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.2.0"))
poetry.package.add_dependency(
Factory.create_dependency("pytest", "^6.1.0", category="dev")
Factory.create_dependency("pytest", "^6.1.0", groups=["dev"])
)
cachy2 = get_package("cachy", "0.2.0")
......
......@@ -46,7 +46,7 @@ functools32 = { version = "^3.2.3", markers = "python_version ~= '2.7' and sys_p
[tool.poetry.extras]
db = [ "orator" ]
[tool.poetry.dev-dependencies]
[tool.poetry.group.dev.dependencies]
pytest = "~3.4"
......
......@@ -101,7 +101,7 @@ six = "*"
[metadata]
lock-version = "1.1"
python-versions = "^3.8"
content-hash = "0cd068218f235c162f7b74bc8faf4ce3387b82daee1c1bb7a97af034f27ee116"
content-hash = "ae61bd854548e88c090780099edd400d58e6944ce9f3fc086d2f9aa5ac487f14"
[metadata.files]
certifi = [
......
......@@ -7,7 +7,6 @@ from pathlib import Path
from poetry.console.application import Application
from poetry.core.masonry.utils.helpers import escape_name
from poetry.core.masonry.utils.helpers import escape_version
from poetry.core.packages.dependency import Dependency
from poetry.core.packages.package import Package
from poetry.core.packages.utils.link import Link
from poetry.core.toml.file import TOMLFile
......@@ -28,15 +27,18 @@ def get_package(name, version):
def get_dependency(
name, constraint=None, category="main", optional=False, allows_prereleases=False
name, constraint=None, groups=None, optional=False, allows_prereleases=False
):
return Dependency(
name,
constraint or "*",
category=category,
optional=optional,
allows_prereleases=allows_prereleases,
)
if constraint is None:
constraint = "*"
if isinstance(constraint, str):
constraint = {"version": constraint}
constraint["optional"] = optional
constraint["allow_prereleases"] = allows_prereleases
return Factory.create_dependency(name, constraint or "*", groups=groups)
def fixture(path=None):
......
......@@ -334,13 +334,13 @@ def _configure_run_install_dev(locker, repo, package, installed):
package.add_dependency(Factory.create_dependency("A", "~1.0"))
package.add_dependency(Factory.create_dependency("B", "~1.1"))
package.add_dependency(Factory.create_dependency("C", "~1.2", category="dev"))
package.add_dependency(Factory.create_dependency("C", "~1.2", groups=["dev"]))
def test_run_install_no_dev(installer, locker, repo, package, installed):
def test_run_install_no_group(installer, locker, repo, package, installed):
_configure_run_install_dev(locker, repo, package, installed)
installer.dev_mode(False)
installer.with_groups(["dev"])
installer.run()
assert 0 == installer.executor.installations_count
......@@ -348,10 +348,10 @@ def test_run_install_no_dev(installer, locker, repo, package, installed):
assert 1 == installer.executor.removals_count
def test_run_install_dev_only(installer, locker, repo, package, installed):
def test_run_install_group_only(installer, locker, repo, package, installed):
_configure_run_install_dev(locker, repo, package, installed)
installer.dev_only(True)
installer.only_groups(["dev"])
installer.run()
assert 0 == installer.executor.installations_count
......@@ -359,18 +359,6 @@ def test_run_install_dev_only(installer, locker, repo, package, installed):
assert 2 == installer.executor.removals_count
def test_run_install_no_dev_and_dev_only(installer, locker, repo, package, installed):
_configure_run_install_dev(locker, repo, package, installed)
installer.dev_mode(False)
installer.dev_only(True)
installer.run()
assert 0 == installer.executor.installations_count
assert 0 == installer.executor.updates_count
assert 1 == installer.executor.removals_count
@pytest.mark.parametrize(
"managed_reserved_package_names",
[
......@@ -439,7 +427,7 @@ def test_run_install_remove_untracked(
}
)
installer.dev_mode(True).remove_untracked(True)
installer.remove_untracked(True)
installer.run()
assert 0 == installer.executor.installations_count
......@@ -863,7 +851,7 @@ def test_installer_with_pypi_repository(package, locker, installed, config):
NullIO(), NullEnv(), package, locker, pool, config, installed=installed
)
package.add_dependency(Factory.create_dependency("pytest", "^3.5", category="dev"))
package.add_dependency(Factory.create_dependency("pytest", "^3.5", groups=["dev"]))
installer.run()
expected = fixture("with-pypi-repository")
......@@ -1069,7 +1057,7 @@ def test_run_changes_category_if_needed(installer, locker, repo, package):
package.add_dependency(
Factory.create_dependency(
"A", {"version": "^1.0", "optional": True}, category="dev"
"A", {"version": "^1.0", "optional": True}, groups=["dev"]
)
)
package.add_dependency(Factory.create_dependency("B", "^1.1"))
......@@ -1169,8 +1157,8 @@ def test_run_update_with_locked_extras(installer, locker, repo, package):
b_dependency.in_extras.append("foo")
c_dependency = get_dependency("C", "^1.0")
c_dependency.python_versions = "~2.7"
package_a.requires.append(b_dependency)
package_a.requires.append(c_dependency)
package_a.add_dependency(b_dependency)
package_a.add_dependency(c_dependency)
repo.add_package(package_a)
repo.add_package(get_package("B", "1.0"))
......@@ -1869,7 +1857,7 @@ def test_installer_can_handle_old_lock_files(
pool = Pool()
pool.add_repository(MockRepository())
package.add_dependency(Factory.create_dependency("pytest", "^3.5", category="dev"))
package.add_dependency(Factory.create_dependency("pytest", "^3.5", groups=["dev"]))
locker.locked()
locker.mock_lock_data(fixture("old-lock"))
......
......@@ -281,9 +281,9 @@ def test_run_install_no_dev(installer, locker, repo, package, installed):
package.add_dependency(Factory.create_dependency("A", "~1.0"))
package.add_dependency(Factory.create_dependency("B", "~1.1"))
package.add_dependency(Factory.create_dependency("C", "~1.2", category="dev"))
package.add_dependency(Factory.create_dependency("C", "~1.2", groups=["dev"]))
installer.dev_mode(False)
installer.with_groups(["dev"])
installer.run()
installs = installer.installer.installs
......@@ -364,7 +364,7 @@ def test_run_install_remove_untracked(
}
)
installer.dev_mode(True).remove_untracked(True)
installer.remove_untracked(True)
installer.run()
installs = installer.installer.installs
......@@ -767,7 +767,7 @@ def test_installer_with_pypi_repository(package, locker, installed, config):
NullIO(), NullEnv(), package, locker, pool, config, installed=installed
)
package.add_dependency(Factory.create_dependency("pytest", "^3.5", category="dev"))
package.add_dependency(Factory.create_dependency("pytest", "^3.5", groups=["dev"]))
installer.run()
expected = fixture("with-pypi-repository")
......@@ -974,7 +974,7 @@ def test_run_changes_category_if_needed(installer, locker, repo, package):
package.add_dependency(
Factory.create_dependency(
"A", {"version": "^1.0", "optional": True}, category="dev"
"A", {"version": "^1.0", "optional": True}, groups=["dev"]
)
)
package.add_dependency(Factory.create_dependency("B", "^1.1"))
......@@ -1074,8 +1074,8 @@ def test_run_update_with_locked_extras(installer, locker, repo, package):
b_dependency.in_extras.append("foo")
c_dependency = get_dependency("C", "^1.0")
c_dependency.python_versions = "~2.7"
package_a.requires.append(b_dependency)
package_a.requires.append(c_dependency)
package_a.add_dependency(b_dependency)
package_a.add_dependency(c_dependency)
repo.add_package(package_a)
repo.add_package(get_package("B", "1.0"))
......@@ -1739,7 +1739,7 @@ def test_installer_can_handle_old_lock_files(
pool = Pool()
pool.add_repository(MockRepository())
package.add_dependency(Factory.create_dependency("pytest", "^3.5", category="dev"))
package.add_dependency(Factory.create_dependency("pytest", "^3.5", groups=["dev"]))
locker.locked()
locker.mock_lock_data(fixture("old-lock"))
......
......@@ -86,7 +86,7 @@ resolved_reference = "123456"
[metadata]
lock-version = "1.1"
python-versions = "*"
content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8"
content-hash = "178f2cd01dc40e96be23a4a0ae1094816626346346618335e5ff4f0b2c0c5831"
[metadata.files]
A = [
......@@ -295,7 +295,7 @@ python-versions = "*"
[metadata]
lock-version = "1.1"
python-versions = "*"
content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8"
content-hash = "178f2cd01dc40e96be23a4a0ae1094816626346346618335e5ff4f0b2c0c5831"
[metadata.files]
A = []
......@@ -335,7 +335,7 @@ foo = ["B (>=1.0.0)"]
[metadata]
lock-version = "1.1"
python-versions = "*"
content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8"
content-hash = "178f2cd01dc40e96be23a4a0ae1094816626346346618335e5ff4f0b2c0c5831"
[metadata.files]
A = []
......@@ -365,7 +365,7 @@ foo = ["bar"]
[metadata]
lock-version = "1.1"
python-versions = "*"
content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8"
content-hash = "178f2cd01dc40e96be23a4a0ae1094816626346346618335e5ff4f0b2c0c5831"
[metadata.files]
A = []
......@@ -410,7 +410,7 @@ reference = "legacy"
[metadata]
lock-version = "1.1"
python-versions = "*"
content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8"
content-hash = "178f2cd01dc40e96be23a4a0ae1094816626346346618335e5ff4f0b2c0c5831"
[metadata.files]
A = []
......@@ -497,7 +497,7 @@ B = {version = "^1.0.0", extras = ["a", "b", "c"], optional = true}
[metadata]
lock-version = "1.1"
python-versions = "*"
content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8"
content-hash = "178f2cd01dc40e96be23a4a0ae1094816626346346618335e5ff4f0b2c0c5831"
[metadata.files]
A = []
......@@ -591,7 +591,7 @@ F = {git = "https://github.com/python-poetry/poetry.git", branch = "foo"}
[metadata]
lock-version = "1.1"
python-versions = "*"
content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8"
content-hash = "178f2cd01dc40e96be23a4a0ae1094816626346346618335e5ff4f0b2c0c5831"
[metadata.files]
A = []
......
......@@ -148,7 +148,7 @@ def test_solver_with_deps(solver, repo, package):
repo.add_package(package_b)
repo.add_package(new_package_b)
package_a.requires.append(get_dependency("B", "<1.1"))
package_a.add_dependency(get_dependency("B", "<1.1"))
ops = solver.solve()
......@@ -176,7 +176,7 @@ def test_install_honours_not_equal(solver, repo, package):
repo.add_package(new_package_b12)
repo.add_package(new_package_b13)
package_a.requires.append(get_dependency("B", "<=1.3,!=1.3,!=1.2"))
package_a.add_dependency(get_dependency("B", "<=1.3,!=1.3,!=1.2"))
ops = solver.solve()
......@@ -201,10 +201,10 @@ def test_install_with_deps_in_order(solver, repo, package):
repo.add_package(package_b)
repo.add_package(package_c)
package_b.requires.append(get_dependency("A", ">=1.0"))
package_b.requires.append(get_dependency("C", ">=1.0"))
package_b.add_dependency(get_dependency("A", ">=1.0"))
package_b.add_dependency(get_dependency("C", ">=1.0"))
package_c.requires.append(get_dependency("A", ">=1.0"))
package_c.add_dependency(get_dependency("A", ">=1.0"))
ops = solver.solve()
......@@ -278,9 +278,9 @@ def test_update_with_use_latest(solver, repo, installed, package, locked):
)
def test_solver_sets_categories(solver, repo, package):
def test_solver_sets_groups(solver, repo, package):
package.add_dependency(Factory.create_dependency("A", "*"))
package.add_dependency(Factory.create_dependency("B", "*", category="dev"))
package.add_dependency(Factory.create_dependency("B", "*", groups=["dev"]))
package_a = get_package("A", "1.0")
package_b = get_package("B", "1.0")
......@@ -429,7 +429,7 @@ def test_solver_returns_extras_if_requested(solver, repo, package):
dep = get_dependency("C", "^1.0", optional=True)
dep.marker = parse_marker("extra == 'foo'")
package_b.extras = {"foo": [dep]}
package_b.requires.append(dep)
package_b.add_dependency(dep)
repo.add_package(package_a)
repo.add_package(package_b)
......@@ -474,8 +474,8 @@ def test_solver_returns_extras_only_requested(solver, repo, package, enabled_ext
package_b.extras = {"one": [dep10], "two": [dep20]}
package_b.requires.append(dep10)
package_b.requires.append(dep20)
package_b.add_dependency(dep10)
package_b.add_dependency(dep20)
repo.add_package(package_a)
repo.add_package(package_b)
......@@ -523,7 +523,7 @@ def test_solver_returns_extras_when_multiple_extras_use_same_dependency(
package_b.extras = {"one": [dep], "two": [dep]}
package_b.requires.append(dep)
package_b.add_dependency(dep)
extras = [enabled_extra] if enabled_extra is not None else []
package_a.add_dependency(
......@@ -574,8 +574,8 @@ def test_solver_returns_extras_only_requested_nested(
package_b.extras = {"one": [dep10], "two": [dep20]}
package_b.requires.append(dep10)
package_b.requires.append(dep20)
package_b.add_dependency(dep10)
package_b.add_dependency(dep20)
extras = [enabled_extra] if enabled_extra is not None else []
package_a.add_dependency(
......@@ -824,14 +824,14 @@ def test_solver_sub_dependencies_with_not_supported_python_version_transitive(
)
def test_solver_with_dependency_in_both_main_and_dev_dependencies(
def test_solver_with_dependency_in_both_default_and_dev_dependencies(
solver, repo, package
):
solver.provider.set_package_python_versions("^3.5")
package.add_dependency(Factory.create_dependency("A", "*"))
package.add_dependency(
Factory.create_dependency(
"A", {"version": "*", "extras": ["foo"]}, category="dev"
"A", {"version": "*", "extras": ["foo"]}, groups=["dev"]
)
)
......@@ -884,7 +884,7 @@ def test_solver_with_dependency_in_both_main_and_dev_dependencies_with_one_more_
package.add_dependency(Factory.create_dependency("E", "*"))
package.add_dependency(
Factory.create_dependency(
"A", {"version": "*", "extras": ["foo"]}, category="dev"
"A", {"version": "*", "extras": ["foo"]}, groups=["dev"]
)
)
......@@ -1417,8 +1417,8 @@ def test_solver_does_not_trigger_new_resolution_on_duplicate_dependencies_if_onl
package_a = get_package("A", "1.0.0")
package_a.extras = {"foo": [dep1], "bar": [dep2]}
package_a.requires.append(dep1)
package_a.requires.append(dep2)
package_a.add_dependency(dep1)
package_a.add_dependency(dep2)
package_b2 = get_package("B", "2.0.0")
package_b1 = get_package("B", "1.0.0")
......@@ -1539,7 +1539,7 @@ def test_solver_ignores_dependencies_with_incompatible_python_full_version_marke
package.add_dependency(Factory.create_dependency("B", "^2.0"))
package_a = get_package("A", "1.0.0")
package_a.requires.append(
package_a.add_dependency(
Dependency.create_from_pep_508(
'B (<2.0); platform_python_implementation == "PyPy" and python_full_version < "2.7.9"'
)
......@@ -2286,12 +2286,12 @@ def test_solver_does_not_raise_conflict_for_conditional_dev_dependencies(
solver.provider.set_package_python_versions("~2.7 || ^3.5")
package.add_dependency(
Factory.create_dependency(
"A", {"version": "^1.0", "python": "~2.7"}, category="dev"
"A", {"version": "^1.0", "python": "~2.7"}, groups=["dev"]
)
)
package.add_dependency(
Factory.create_dependency(
"A", {"version": "^2.0", "python": "^3.5"}, category="dev"
"A", {"version": "^2.0", "python": "^3.5"}, groups=["dev"]
)
)
......
......@@ -62,16 +62,12 @@ def poetry(fixture_dir, locker):
def set_package_requires(poetry, skip=None):
skip = skip or set()
packages = poetry.locker.locked_repository(with_dev_reqs=True).packages
poetry.package.requires = [
pkg.to_dependency()
for pkg in packages
if pkg.category == "main" and pkg.name not in skip
]
poetry.package.dev_requires = [
pkg.to_dependency()
for pkg in packages
if pkg.category == "dev" and pkg.name not in skip
]
package = poetry.package.with_dependency_groups([], only=True)
for pkg in packages:
if pkg.name not in skip:
package.add_dependency(pkg.to_dependency())
poetry._package = package
def test_exporter_can_export_requirements_txt_with_standard_packages(
......@@ -483,16 +479,18 @@ def test_exporter_can_export_requirements_txt_with_nested_packages_and_markers_a
}
)
poetry.package.requires = [
root = poetry.package.with_dependency_groups([], only=True)
root.add_dependency(
Factory.create_dependency(
name="a", constraint=dict(version="^1.2.3", python="<3.8")
),
]
poetry.package.dev_requires = [
)
)
root.add_dependency(
Factory.create_dependency(
name="b", constraint=dict(version="^4.5.6"), category="dev"
),
]
name="b", constraint=dict(version="^4.5.6"), groups=["dev"]
)
)
poetry._package = root
exporter = Exporter(poetry)
......@@ -825,6 +823,7 @@ def test_exporter_can_export_requirements_txt_with_git_packages(tmp_dir, poetry)
}
)
set_package_requires(poetry)
print(poetry.package.all_requires)
exporter = Exporter(poetry)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment