Commit 7e0e7b42 by Maxim Koltsov Committed by GitHub

fix: preserve package's source when it has extras (#6472)

This PR splits out simple part of #6130. Once this merged I'll update
that PR to contain only second (more controversial) fix.
parent 338e02a8
...@@ -603,7 +603,15 @@ class Provider: ...@@ -603,7 +603,15 @@ class Provider:
) )
package = dependency_package.package package = dependency_package.package
dependency = dependency_package.dependency dependency = dependency_package.dependency
_dependencies.append(package.without_features().to_dependency()) new_dependency = package.without_features().to_dependency()
# When adding dependency foo[extra] -> foo, preserve foo's source, if it's
# specified. This prevents us from trying to get foo from PyPI
# when user explicitly set repo for foo[extra].
if not new_dependency.source_name and dependency.source_name:
new_dependency.source_name = dependency.source_name
_dependencies.append(new_dependency)
for dep in requires: for dep in requires:
if not self._python_constraint.allows_any(dep.python_constraint): if not self._python_constraint.allows_any(dep.python_constraint):
......
...@@ -688,3 +688,31 @@ def test_complete_package_preserves_source_type_with_subdirectories( ...@@ -688,3 +688,31 @@ def test_complete_package_preserves_source_type_with_subdirectories(
dependency_one_copy.to_pep_508(), dependency_one_copy.to_pep_508(),
dependency_two.to_pep_508(), dependency_two.to_pep_508(),
} }
@pytest.mark.parametrize("source_name", [None, "repo"])
def test_complete_package_with_extras_preserves_source_name(
provider: Provider, repository: Repository, source_name: str | None
) -> None:
package_a = Package("A", "1.0")
package_b = Package("B", "1.0")
dep = get_dependency("B", "^1.0", optional=True)
package_a.add_dependency(dep)
package_a.extras = {"foo": [dep]}
repository.add_package(package_a)
repository.add_package(package_b)
dependency = Dependency("A", "1.0", extras=["foo"])
if source_name:
dependency.source_name = source_name
complete_package = provider.complete_package(
DependencyPackage(dependency, package_a)
)
requires = complete_package.package.all_requires
assert len(requires) == 2
assert requires[0].name == "a"
assert requires[0].source_name == source_name
assert requires[1].name == "b"
assert requires[1].source_name is None
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