Commit c640aaff by Sébastien Eustace

Fixed multiple constraint handling for the root package

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