Commit 99b4da0c by Sébastien Eustace

Fix handling of extras

parent cc715ef8
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
- Fixed a memory leak in the resolver. - Fixed a memory leak in the resolver.
- Fixed a recursion error on duplicate dependencies with only different extras. - Fixed a recursion error on duplicate dependencies with only different extras.
- Fixed handling of extras.
## [0.11.5] - 2018-09-04 ## [0.11.5] - 2018-09-04
......
...@@ -383,8 +383,7 @@ class Provider: ...@@ -383,8 +383,7 @@ class Provider:
dependencies = [ dependencies = [
r r
for r in package.requires for r in package.requires
if r.is_activated() if self._package.python_constraint.allows_any(r.python_constraint)
and self._package.python_constraint.allows_any(r.python_constraint)
] ]
# Searching for duplicate dependencies # Searching for duplicate dependencies
......
...@@ -160,12 +160,13 @@ class Solver: ...@@ -160,12 +160,13 @@ class Solver:
category, optional, marker, depth = self._get_tags_for_package( category, optional, marker, depth = self._get_tags_for_package(
package, graph package, graph
) )
depths.append(depth)
package.category = category package.category = category
package.optional = optional package.optional = optional
package.marker = marker package.marker = marker
depths.append(depth)
return packages, depths return packages, depths
def _build_graph( def _build_graph(
...@@ -194,6 +195,7 @@ class Solver: ...@@ -194,6 +195,7 @@ class Solver:
return graph return graph
for dependency in package.all_requires: for dependency in package.all_requires:
is_activated = True
if dependency.is_optional(): if dependency.is_optional():
if not package.is_root() and ( if not package.is_root() and (
not previous_dep or not previous_dep.extras not previous_dep or not previous_dep.extras
...@@ -201,7 +203,7 @@ class Solver: ...@@ -201,7 +203,7 @@ class Solver:
continue continue
is_activated = False is_activated = False
for group, extras in package.extras.items(): for group, extra_deps in package.extras.items():
if dep: if dep:
extras = previous_dep.extras extras = previous_dep.extras
elif package.is_root(): elif package.is_root():
...@@ -209,13 +211,12 @@ class Solver: ...@@ -209,13 +211,12 @@ class Solver:
else: else:
extras = [] extras = []
if group in extras: if group in extras and dependency.name in (
d.name for d in package.extras[group]
):
is_activated = True is_activated = True
break break
if not is_activated:
continue
if previous and previous["name"] == dependency.name: if previous and previous["name"] == dependency.name:
break break
...@@ -238,6 +239,9 @@ class Solver: ...@@ -238,6 +239,9 @@ class Solver:
pkg, packages, graph, dependency, dep or dependency pkg, packages, graph, dependency, dep or dependency
) )
if not is_activated:
child_graph["optional"] = True
if existing: if existing:
existing["marker"] = existing["marker"].union( existing["marker"] = existing["marker"].union(
child_graph["marker"] child_graph["marker"]
......
...@@ -60,6 +60,7 @@ cachy 0.2.0 ...@@ -60,6 +60,7 @@ cachy 0.2.0
def test_debug_resolve_git_dependency(app, repo): def test_debug_resolve_git_dependency(app, repo):
repo.add_package(get_package("pendulum", "2.0.3")) repo.add_package(get_package("pendulum", "2.0.3"))
repo.add_package(get_package("cleo", "0.6.5"))
command = app.find("debug:resolve") command = app.find("debug:resolve")
tester = CommandTester(command) tester = CommandTester(command)
...@@ -77,6 +78,7 @@ Resolving dependencies... ...@@ -77,6 +78,7 @@ Resolving dependencies...
Resolution results: Resolution results:
- pendulum (2.0.3) - pendulum (2.0.3)
- cleo (0.6.5)
- demo (0.1.2) - demo (0.1.2)
""" """
......
...@@ -104,6 +104,7 @@ def test_add_git_constraint(app, repo, installer): ...@@ -104,6 +104,7 @@ def test_add_git_constraint(app, repo, installer):
tester = CommandTester(command) tester = CommandTester(command)
repo.add_package(get_package("pendulum", "1.4.4")) repo.add_package(get_package("pendulum", "1.4.4"))
repo.add_package(get_package("cleo", "0.6.5"))
tester.execute( tester.execute(
[ [
......
[[package]] [[package]]
description = "" description = ""
category = "main" category = "main"
name = "cachy"
optional = true
python-versions = "*"
version = "0.2.0"
[[package]]
description = ""
category = "main"
name = "pendulum" name = "pendulum"
optional = false optional = false
python-versions = "*" python-versions = "*"
...@@ -27,5 +35,6 @@ content-hash = "123456789" ...@@ -27,5 +35,6 @@ content-hash = "123456789"
python-versions = "*" python-versions = "*"
[metadata.hashes] [metadata.hashes]
cachy = []
project-with-extras = [] project-with-extras = []
pendulum = [] pendulum = []
...@@ -613,6 +613,7 @@ def test_run_installs_with_local_poetry_directory_and_extras( ...@@ -613,6 +613,7 @@ def test_run_installs_with_local_poetry_directory_and_extras(
package.add_dependency("demo", {"path": str(file_path), "extras": ["extras_a"]}) package.add_dependency("demo", {"path": str(file_path), "extras": ["extras_a"]})
repo.add_package(get_package("pendulum", "1.4.4")) repo.add_package(get_package("pendulum", "1.4.4"))
repo.add_package(get_package("cachy", "0.2.0"))
installer.run() installer.run()
......
...@@ -913,6 +913,7 @@ def test_solver_can_resolve_git_dependencies(solver, repo, package): ...@@ -913,6 +913,7 @@ def test_solver_can_resolve_git_dependencies(solver, repo, package):
ops, ops,
[ [
{"job": "install", "package": pendulum}, {"job": "install", "package": pendulum},
{"job": "install", "package": cleo},
{"job": "install", "package": get_package("demo", "0.1.2")}, {"job": "install", "package": get_package("demo", "0.1.2")},
], ],
) )
...@@ -1104,3 +1105,38 @@ def test_solver_does_not_raise_conflict_for_locked_conditional_dependencies( ...@@ -1104,3 +1105,38 @@ def test_solver_does_not_raise_conflict_for_locked_conditional_dependencies(
{"job": "install", "package": package_b}, {"job": "install", "package": package_b},
], ],
) )
def test_solver_returns_extras_if_requested_in_dependencies_and_not_in_root_package(
solver, repo, package
):
package.add_dependency("A")
package.add_dependency("B")
package.add_dependency("C")
package_a = get_package("A", "1.0")
package_b = get_package("B", "1.0")
package_c = get_package("C", "1.0")
package_d = get_package("D", "1.0")
package_b.add_dependency("C", {"version": "^1.0", "extras": ["foo"]})
package_c.add_dependency("D", {"version": "^1.0", "optional": True})
package_c.extras = {"foo": [get_dependency("D", "^1.0")]}
repo.add_package(package_a)
repo.add_package(package_b)
repo.add_package(package_c)
repo.add_package(package_d)
ops = solver.solve()
check_solver_result(
ops,
[
{"job": "install", "package": package_d},
{"job": "install", "package": package_c},
{"job": "install", "package": package_a},
{"job": "install", "package": package_b},
],
)
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