Commit 5d61ab7c by Sébastien Eustace

Speedup packages retrieval for already seen dependencies

parent eb394670
...@@ -9,6 +9,7 @@ from typing import List ...@@ -9,6 +9,7 @@ from typing import List
from poetry.mixology import DependencyGraph from poetry.mixology import DependencyGraph
from poetry.mixology.conflict import Conflict from poetry.mixology.conflict import Conflict
from poetry.mixology.contracts import SpecificationProvider from poetry.mixology.contracts import SpecificationProvider
from poetry.mixology.contracts import UI
from poetry.packages import Dependency from poetry.packages import Dependency
from poetry.packages import FileDependency from poetry.packages import FileDependency
...@@ -27,7 +28,7 @@ from poetry.utils.venv import Venv ...@@ -27,7 +28,7 @@ from poetry.utils.venv import Venv
from poetry.vcs.git import Git from poetry.vcs.git import Git
class Provider(SpecificationProvider): class Provider(SpecificationProvider, UI):
UNSAFE_PACKAGES = {'setuptools', 'distribute', 'pip'} UNSAFE_PACKAGES = {'setuptools', 'distribute', 'pip'}
...@@ -42,6 +43,9 @@ class Provider(SpecificationProvider): ...@@ -42,6 +43,9 @@ class Provider(SpecificationProvider):
self._python_constraint = package.python_constraint self._python_constraint = package.python_constraint
self._base_dg = DependencyGraph() self._base_dg = DependencyGraph()
self._search_for = {} self._search_for = {}
self._constraints = {}
super(Provider, self).__init__(debug=self._io.is_debug())
@property @property
def pool(self): # type: () -> Pool def pool(self): # type: () -> Pool
...@@ -76,9 +80,22 @@ class Provider(SpecificationProvider): ...@@ -76,9 +80,22 @@ class Provider(SpecificationProvider):
elif dependency.is_file(): elif dependency.is_file():
packages = self.search_for_file(dependency) packages = self.search_for_file(dependency)
else: else:
constraint = dependency.constraint
# If we have already seen this dependency
# we take the most restrictive constraint
if dependency.name in self._constraints:
current_constraint = self._constraints[dependency.name]
if str(dependency.constraint) == '*':
# The new constraint accepts anything
# so we take the previous one
constraint = current_constraint
self._constraints[dependency.name] = constraint
packages = self._pool.find_packages( packages = self._pool.find_packages(
dependency.name, dependency.name,
dependency.constraint, constraint,
extras=dependency.extras, extras=dependency.extras,
) )
...@@ -256,3 +273,32 @@ class Provider(SpecificationProvider): ...@@ -256,3 +273,32 @@ class Provider(SpecificationProvider):
0 if d.allows_prereleases() else 1, 0 if d.allows_prereleases() else 1,
0 if d.name in conflicts else 1 0 if d.name in conflicts else 1
]) ])
# UI
@property
def output(self):
return self._io
def before_resolution(self):
self._io.write('<info>Resolving dependencies</>')
if self.is_debugging():
self._io.new_line()
def indicate_progress(self):
if not self.is_debugging():
self._io.write('.')
def after_resolution(self):
self._io.new_line()
def debug(self, message, depth):
if self.is_debugging():
debug_info = str(message)
debug_info = '\n'.join([
'<comment>:{}:</> {}'.format(str(depth).rjust(4), s)
for s in debug_info.split('\n')
]) + '\n'
self.output.write(debug_info)
...@@ -26,10 +26,8 @@ class Solver: ...@@ -26,10 +26,8 @@ class Solver:
self._io = io self._io = io
def solve(self, requested, fixed=None): # type: (...) -> List[Operation] def solve(self, requested, fixed=None): # type: (...) -> List[Operation]
resolver = Resolver( provider = Provider(self._package, self._pool, self._io)
Provider(self._package, self._pool, self._io), resolver = Resolver(provider, provider)
UI(self._io)
)
base = None base = None
if fixed is not None: if fixed is not None:
......
...@@ -3,7 +3,6 @@ import operator ...@@ -3,7 +3,6 @@ import operator
from poetry.version import parse as parse_version from poetry.version import parse as parse_version
from poetry.version import version_compare from poetry.version import version_compare
from ..helpers import normalize_version
from .base_constraint import BaseConstraint from .base_constraint import BaseConstraint
......
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