Commit da6014c9 by Sébastien Eustace

Fix handling of git dependencies with extras

parent 8e49e901
......@@ -90,7 +90,7 @@ def dependency_from_pep_508(name):
for or_ in markers["extra"]:
for _, extra in or_:
dep.extras.append(extra)
dep.in_extras.append(extra)
if "python_version" in markers:
ors = []
......
......@@ -209,7 +209,15 @@ class Provider:
package = Package(meta.name, meta.version)
for req in reqs:
package.requires.append(dependency_from_pep_508(req))
dep = dependency_from_pep_508(req)
if dep.in_extras:
for extra in dep.in_extras:
if extra not in package.extras:
package.extras[extra] = []
package.extras[extra].append(dep)
package.requires.append(dep)
except Exception:
raise
finally:
......@@ -231,6 +239,12 @@ class Provider:
)
)
if dependency.extras:
for extra in dependency.extras:
if extra in package.extras:
for dep in package.extras[extra]:
dep.activate()
return [package]
def search_for_file(self, dependency): # type: (FileDependency) -> List[Package]
......@@ -314,10 +328,10 @@ class Provider:
]
def complete_package(self, package): # type: (str, Version) -> Package
if package.is_root() or package.source_type in {"git", "file"}:
if package.is_root():
return package
if package.source_type != "directory":
if package.source_type not in {"directory", "file", "git"}:
package = self._pool.package(
package.name, package.version.text, extras=package.requires_extras
)
......
......@@ -155,8 +155,8 @@ class PyPiRepository(Repository):
)
continue
if dependency.extras:
for extra in dependency.extras:
if dependency.in_extras:
for extra in dependency.in_extras:
if extra not in package.extras:
package.extras[extra] = []
......
......@@ -13,6 +13,7 @@ kwargs = dict(
url="https://github.com/demo/demo",
packages=["demo"],
install_requires=["pendulum>=1.4.4"],
extras_require={"foo": ["cleo"]},
)
......
......@@ -39,7 +39,7 @@ def test_dependency_from_pep_508_with_extras():
assert dep.name == "requests"
assert str(dep.constraint) == "2.18.0"
assert dep.extras == ["foo", "bar"]
assert dep.in_extras == ["foo", "bar"]
def test_dependency_from_pep_508_with_python_version():
......@@ -84,7 +84,7 @@ def test_dependency_from_pep_508_complex():
assert dep.name == "requests"
assert str(dep.constraint) == "2.18.0"
assert dep.extras == ["foo"]
assert dep.in_extras == ["foo"]
assert dep.python_versions == ">=2.7 !=3.2.*"
assert dep.platform == "win32 || darwin"
......
......@@ -12,6 +12,7 @@ from poetry.puzzle.exceptions import SolverProblemError
from tests.helpers import get_dependency
from tests.helpers import get_package
from tests.repositories.test_pypi_repository import MockRepository
@pytest.fixture()
......@@ -921,3 +922,44 @@ def test_solver_does_not_get_stuck_in_recursion_on_circular_dependency(
{"job": "install", "package": package_a},
],
)
def test_solver_can_resolve_git_dependencies(solver, repo, package):
pendulum = get_package("pendulum", "2.0.3")
cleo = get_package("cleo", "1.0.0")
repo.add_package(pendulum)
repo.add_package(cleo)
package.add_dependency("demo", {"git": "https://github.com/demo/demo.git"})
ops = solver.solve()
check_solver_result(
ops,
[
{"job": "install", "package": pendulum},
{"job": "install", "package": get_package("demo", "0.1.2")},
],
)
def test_solver_can_resolve_git_dependencies_with_extras(solver, repo, package):
pendulum = get_package("pendulum", "2.0.3")
cleo = get_package("cleo", "1.0.0")
repo.add_package(pendulum)
repo.add_package(cleo)
package.add_dependency(
"demo", {"git": "https://github.com/demo/demo.git", "extras": ["foo"]}
)
ops = solver.solve()
check_solver_result(
ops,
[
{"job": "install", "package": cleo},
{"job": "install", "package": pendulum},
{"job": "install", "package": get_package("demo", "0.1.2")},
],
)
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