Skip to content

Commit

Permalink
Do not resolve heavy extras that are not requested
Browse files Browse the repository at this point in the history
  • Loading branch information
maksbotan committed Sep 3, 2022
1 parent f48e0a0 commit 972789d
Showing 1 changed file with 43 additions and 20 deletions.
63 changes: 43 additions & 20 deletions src/poetry/puzzle/provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,8 +248,23 @@ def search_for_installed_packages(
)
return packages

def search_for_direct_origin_dependency(self, dependency: Dependency) -> Package:
def _get_from_deferred_cache(self, dependency: Dependency) -> Package | None:
package = self._deferred_cache.get(dependency)
if package is None:
return None

if dependency.is_vcs():
dependency._source_reference = package.source_reference
dependency._source_resolved_reference = package.source_resolved_reference
dependency._source_subdirectory = package.source_subdirectory

dependency._constraint = package.version
dependency._pretty_constraint = package.version.text

return package

def search_for_direct_origin_dependency(self, dependency: Dependency) -> Package:
package = self._get_from_deferred_cache(dependency)
if package is not None:
pass

Expand All @@ -274,14 +289,6 @@ def search_for_direct_origin_dependency(self, dependency: Dependency) -> Package
f"{dependency}: unknown direct dependency type {dependency.source_type}"
)

if dependency.is_vcs():
dependency._source_reference = package.source_reference
dependency._source_resolved_reference = package.source_resolved_reference
dependency._source_subdirectory = package.source_subdirectory

dependency._constraint = package.version
dependency._pretty_constraint = package.version.text

self._deferred_cache[dependency] = package

return package
Expand Down Expand Up @@ -577,26 +584,42 @@ def complete_package(
else:
requires = package.requires

optional_dependencies: list[str] = []
if dependency_package.dependency.extras:
for extra in dependency.extras:
extra = safe_extra(extra)
if extra not in package.extras:
continue

optional_dependencies += [d.name for d in package.extras[extra]]

if self._load_deferred:
# Retrieving constraints for deferred dependencies
for r in requires:
if r.is_direct_origin():
# If there is an optional dependency and it's not requested,
# do not try resolving it.
# Saves time when dep is a large Git repository for example.
if (
not package.is_root()
and r.is_optional()
and r.name not in optional_dependencies
):
# When we have foo[extra] dependency, we will later consider
# foo (w/o extras), at that moment this code will fire
# and skip `r`. Update r with version and reference if it was
# resolved on the previous step.
_ = self._get_from_deferred_cache(r)
continue

self.search_for_direct_origin_dependency(r)

optional_dependencies = []
_dependencies = []
_dependencies: list[Dependency] = []

# If some extras/features were required, we need to
# add a special dependency representing the base package
# to the current package
if dependency.extras:
for extra in dependency.extras:
extra = safe_extra(extra)
if extra not in package.extras:
continue

optional_dependencies += [d.name for d in package.extras[extra]]

dependency_package = dependency_package.with_features(
list(dependency.extras)
)
Expand All @@ -605,8 +628,8 @@ def complete_package(
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].
# specified. This prevents us from trying to get foo from PyPI
# when user explicitly set repo for foo[extra].
if not dependency.source_name and dependency_package.dependency.source_name:
dependency.source_name = dependency_package.dependency.source_name

Expand Down

0 comments on commit 972789d

Please sign in to comment.