Commit 3611523f by Sébastien Eustace Committed by Arun Babu Neelicattu

Fix resolution of packages with missing required extras

parent 7a5f2601
......@@ -453,23 +453,19 @@ class Provider:
self.search_for_url(r)
optional_dependencies = []
activated_extras = []
for extra in package.dependency.extras:
if extra not in package.extras:
continue
activated_extras.append(extra)
optional_dependencies += [d.name for d in package.extras[extra]]
_dependencies = []
# If some extras/features were required, we need to
# add a special dependency representing the base package
# to the current package
if package.dependency.extras:
if activated_extras:
package = package.with_features(activated_extras)
for extra in package.dependency.extras:
if extra not in package.extras:
continue
optional_dependencies += [d.name for d in package.extras[extra]]
package = package.with_features(list(package.dependency.extras))
_dependencies.append(package.without_features().to_dependency())
for dep in requires:
......
......@@ -24,14 +24,9 @@ class Repository(BaseRepository):
def package(self, name, version, extras=None):
name = name.lower()
if extras is None:
extras = []
for package in self.packages:
if name == package.name and package.version.text == version:
package = package.with_features(extras)
return package
return package.clone()
def find_packages(self, dependency):
constraint = dependency.constraint
......
......@@ -2435,7 +2435,6 @@ def test_solver_can_resolve_transitive_extras(solver, repo, package):
requests = get_package("requests", "2.24.0")
requests.add_dependency(Factory.create_dependency("certifi", ">=2017.4.17"))
dep = get_dependency("PyOpenSSL", ">=0.14")
dep.in_extras.append("security")
requests.add_dependency(
Factory.create_dependency("PyOpenSSL", {"version": ">=0.14", "optional": True})
)
......@@ -2465,6 +2464,41 @@ def test_solver_can_resolve_transitive_extras(solver, repo, package):
)
def test_solver_can_resolve_for_packages_with_missing_extras(solver, repo, package):
package.add_dependency(
Factory.create_dependency(
"django-anymail", {"version": "^6.0", "extras": ["postmark"]}
)
)
django_anymail = get_package("django-anymail", "6.1.0")
django_anymail.add_dependency(Factory.create_dependency("django", ">=2.0"))
django_anymail.add_dependency(Factory.create_dependency("requests", ">=2.4.3"))
django_anymail.add_dependency(
Factory.create_dependency("boto3", {"version": "*", "optional": True})
)
django_anymail.extras["amazon_ses"] = [Factory.create_dependency("boto3", "*")]
django = get_package("django", "2.2.0")
boto3 = get_package("boto3", "1.0.0")
requests = get_package("requests", "2.24.0")
repo.add_package(django_anymail)
repo.add_package(django)
repo.add_package(boto3)
repo.add_package(requests)
ops = solver.solve()
check_solver_result(
ops,
[
{"job": "install", "package": django},
{"job": "install", "package": requests},
{"job": "install", "package": django_anymail},
],
)
def test_solver_can_resolve_python_restricted_package_dependencies(
solver, repo, package, locked
):
......
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