Commit c640aaff by Sébastien Eustace

Fixed multiple constraint handling for the root package

parent 78963e69
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
- Fixed an error when resolving directory dependencies with no sub dependencies. - Fixed an error when resolving directory dependencies with no sub dependencies.
- Fixed an error when locking packages with no description. - Fixed an error when locking packages with no description.
- Fixed path resolution for transitive file dependencies. - Fixed path resolution for transitive file dependencies.
- Fixed multiple constraints handling for the root package.
## [0.12.10] - 2018-11-22 ## [0.12.10] - 2018-11-22
......
...@@ -374,7 +374,6 @@ class VersionSolver: ...@@ -374,7 +374,6 @@ class VersionSolver:
return dependency.name return dependency.name
if not version.is_root():
version = self._provider.complete_package(version) version = self._provider.complete_package(version)
conflict = False conflict = False
......
...@@ -11,6 +11,9 @@ class DependencyPackage(object): ...@@ -11,6 +11,9 @@ class DependencyPackage(object):
def package(self): def package(self):
return self._package return self._package
def clone(self): # type: () -> DependencyPackage
return self.__class__(self._dependency, self._package.clone())
def __getattr__(self, name): def __getattr__(self, name):
return getattr(self._package, name) return getattr(self._package, name)
......
...@@ -369,6 +369,9 @@ class Package(object): ...@@ -369,6 +369,9 @@ class Package(object):
for dep in self.requires: for dep in self.requires:
clone.requires.append(dep) clone.requires.append(dep)
for dep in self.dev_requires:
clone.dev_requires.append(dep)
return clone return clone
def __hash__(self): def __hash__(self):
......
...@@ -43,3 +43,13 @@ class ProjectPackage(Package): ...@@ -43,3 +43,13 @@ class ProjectPackage(Package):
self._python_marker = parse_marker( self._python_marker = parse_marker(
create_nested_marker("python_version", self._python_constraint) create_nested_marker("python_version", self._python_constraint)
) )
def clone(self): # type: () -> ProjectPackage
package = super(ProjectPackage, self).clone()
package.build = self.build
package.packages = self.packages[:]
package.include = self.include[:]
package.exclude = self.exclude[:]
return package
...@@ -453,9 +453,13 @@ class Provider: ...@@ -453,9 +453,13 @@ class Provider:
self, package self, package
): # type: (DependencyPackage) -> DependencyPackage ): # type: (DependencyPackage) -> DependencyPackage
if package.is_root(): if package.is_root():
return package package = package.clone()
if package.source_type not in {"directory", "file", "git"}: if not package.is_root() and package.source_type not in {
"directory",
"file",
"git",
}:
package = DependencyPackage( package = DependencyPackage(
package.dependency, package.dependency,
self._pool.package( self._pool.package(
...@@ -487,7 +491,6 @@ class Provider: ...@@ -487,7 +491,6 @@ class Provider:
# An example of this is: # An example of this is:
# - pypiwin32 (220); sys_platform == "win32" and python_version >= "3.6" # - pypiwin32 (220); sys_platform == "win32" and python_version >= "3.6"
# - pypiwin32 (219); sys_platform == "win32" and python_version < "3.6" # - pypiwin32 (219); sys_platform == "win32" and python_version < "3.6"
if not package.is_root():
duplicates = {} duplicates = {}
for dep in dependencies: for dep in dependencies:
if dep.name not in duplicates: if dep.name not in duplicates:
...@@ -501,9 +504,7 @@ class Provider: ...@@ -501,9 +504,7 @@ class Provider:
dependencies.append(deps[0]) dependencies.append(deps[0])
continue continue
self.debug( self.debug("<debug>Duplicate dependencies for {}</debug>".format(dep_name))
"<debug>Duplicate dependencies for {}</debug>".format(dep_name)
)
# Regrouping by constraint # Regrouping by constraint
by_constraint = {} by_constraint = {}
...@@ -550,9 +551,7 @@ class Provider: ...@@ -550,9 +551,7 @@ class Provider:
if len(by_constraint) == 1: if len(by_constraint) == 1:
self.debug( self.debug(
"<debug>Merging requirements for {}</debug>".format( "<debug>Merging requirements for {}</debug>".format(str(deps[0]))
str(deps[0])
)
) )
dependencies.append(list(by_constraint.values())[0][0]) dependencies.append(list(by_constraint.values())[0][0])
continue continue
......
...@@ -1552,3 +1552,21 @@ def test_solver_skips_invalid_versions(package, installed, locked, io): ...@@ -1552,3 +1552,21 @@ def test_solver_skips_invalid_versions(package, installed, locked, io):
check_solver_result( check_solver_result(
ops, [{"job": "install", "package": get_package("trackpy", "0.4.1")}] ops, [{"job": "install", "package": get_package("trackpy", "0.4.1")}]
) )
def test_multiple_constraints_on_root(package, solver, repo):
package.add_dependency("foo", {"version": "^1.0", "python": "^2.7"})
package.add_dependency("foo", {"version": "^2.0", "python": "^3.7"})
foo15 = get_package("foo", "1.5.0")
foo25 = get_package("foo", "2.5.0")
repo.add_package(foo15)
repo.add_package(foo25)
ops = solver.solve()
check_solver_result(
ops,
[{"job": "install", "package": foo15}, {"job": "install", "package": foo25}],
)
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