Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-resolvelib for openSUSE:Factory checked in at 2022-07-19 17:19:10 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-resolvelib (Old) and /work/SRC/openSUSE:Factory/.python-resolvelib.new.1523 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-resolvelib" Tue Jul 19 17:19:10 2022 rev:5 rq:989686 version:0.8.1 Changes: -------- --- /work/SRC/openSUSE:Factory/python-resolvelib/python-resolvelib.changes 2021-11-07 22:09:26.379650376 +0100 +++ /work/SRC/openSUSE:Factory/.python-resolvelib.new.1523/python-resolvelib.changes 2022-07-19 17:19:11.628353195 +0200 @@ -1,0 +2,10 @@ +Sun Jul 17 08:24:27 UTC 2022 - Dirk M??ller <dmuel...@suse.com> + +- update to 0.8.1: + * A new reporter hook ``resolving_conflicts`` is added. The resolver triggers + * this hook when it detects conflicts in the dependency tree, and before it + * attempts to fix them. The hook accepts one single argument ``causes``, which + * is a list of ``(requirement, parent)`` 2-tuples that represents all the + * edges that lead to the detected conflicts. + +------------------------------------------------------------------- Old: ---- resolvelib-0.8.0.tar.gz New: ---- resolvelib-0.8.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-resolvelib.spec ++++++ --- /var/tmp/diff_new_pack.DXBVTx/_old 2022-07-19 17:19:12.216353979 +0200 +++ /var/tmp/diff_new_pack.DXBVTx/_new 2022-07-19 17:19:12.220353985 +0200 @@ -1,7 +1,7 @@ # # spec file for package python-resolvelib # -# Copyright (c) 2021 SUSE LLC +# Copyright (c) 2022 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,7 +18,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-resolvelib -Version: 0.8.0 +Version: 0.8.1 Release: 0 Summary: Module to resolve abstract dependencies into concrete ones License: ISC ++++++ resolvelib-0.8.0.tar.gz -> resolvelib-0.8.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/.github/workflows/ci.yml new/resolvelib-0.8.1/.github/workflows/ci.yml --- old/resolvelib-0.8.0/.github/workflows/ci.yml 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/.github/workflows/ci.yml 2021-10-11 23:05:57.000000000 +0200 @@ -11,10 +11,11 @@ steps: - uses: actions/checkout@v2 - uses: actions/setup-python@v2 - - run: pip install black flake8 mypy + - run: pip install .[lint,test] - run: black --check . + - run: isort . - run: flake8 . - - run: mypy src/ + - run: mypy src/ tests/ package: name: Package runs-on: ubuntu-latest @@ -31,12 +32,12 @@ fail-fast: true matrix: python: - - '2.7' - - '3.10' - - '3.9' - - '3.8' - - '3.7' - - '3.6' + - "2.7" + - "3.10" + - "3.9" + - "3.8" + - "3.7" + - "3.6" steps: - uses: actions/checkout@v2 - uses: actions/setup-python@v2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/CHANGELOG.rst new/resolvelib-0.8.1/CHANGELOG.rst --- old/resolvelib-0.8.0/CHANGELOG.rst 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/CHANGELOG.rst 2021-10-11 23:05:57.000000000 +0200 @@ -1,5 +1,14 @@ -0.8.0 (2021-10-08) -No significant changes. +0.8.1 (2021-10-12) +================== + +Features +-------- + +- A new reporter hook ``resolving_conflicts`` is added. The resolver triggers + this hook when it detects conflicts in the dependency tree, and before it + attempts to fix them. The hook accepts one single argument ``causes``, which + is a list of ``(requirement, parent)`` 2-tuples that represents all the + edges that lead to the detected conflicts. `#81 <https://github.com/sarugaku/resolvelib/issues/81>`_ 0.8.0 (2021-10-08) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/DEVELOPMENT.rst new/resolvelib-0.8.1/DEVELOPMENT.rst --- old/resolvelib-0.8.0/DEVELOPMENT.rst 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/DEVELOPMENT.rst 2021-10-11 23:05:57.000000000 +0200 @@ -25,3 +25,24 @@ Please make sure any changes are covered by existing tests or that new tests are added. ResolveLib is used on many different python versions and operating systems and environments so every effort must be made in order to keep code portable. Pull requests should be small to facilitate easier review. + + +Release Process for Maintainers +=============================== + +Replace ``X.Y.Z`` with the release you would like to make. + +* Make sure the news fragments are in place. +* ``nox -s release -- --repo https://upload.pypi.org/legacy/ --prebump X.Y.Z+1.dev0 --version X.Y.Z`` +* ``git push origin master --tags`` +* ``git push upstream master --tags`` + +Breakdown of the ``release`` nox task: + +* Writes ``X.Y.Z`` to ``src/resolvelib/__init__.py``. +* Runs ``towncrier`` to update the changelog and delete news fragments. +* Commit the changelog and version change. +* Tag the commit as release ``X.Y.Z``. +* Build, check, and upload distributions to the index specified by ``repo``. +* Writes ``X.Y.Z+1.dev0`` to ``src/resolvelib/__init__.py``. +* Commit the "prebump" change. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/README.rst new/resolvelib-0.8.1/README.rst --- old/resolvelib-0.8.0/README.rst 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/README.rst 2021-10-11 23:05:57.000000000 +0200 @@ -87,4 +87,4 @@ Contributing ============ -Please see `developer documentation <./CONTRIBUTING.rst>`__. +Please see `developer documentation <./DEVELOPMENT.rst>`__. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/examples/pypi_wheel_provider.py new/resolvelib-0.8.1/examples/pypi_wheel_provider.py --- old/resolvelib-0.8.0/examples/pypi_wheel_provider.py 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/examples/pypi_wheel_provider.py 2021-10-11 23:05:57.000000000 +0200 @@ -7,17 +7,17 @@ from urllib.parse import urlparse from zipfile import ZipFile -import requests import html5lib -from packaging.specifiers import SpecifierSet -from packaging.version import Version, InvalidVersion +import requests from packaging.requirements import Requirement +from packaging.specifiers import SpecifierSet from packaging.utils import canonicalize_name +from packaging.version import InvalidVersion, Version + from resolvelib import BaseReporter, Resolver from .extras_provider import ExtrasProvider - PYTHON_VERSION = Version(python_version()) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/examples/reporter_demo.py new/resolvelib-0.8.1/examples/reporter_demo.py --- old/resolvelib-0.8.0/examples/reporter_demo.py 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/examples/reporter_demo.py 2021-10-11 23:05:57.000000000 +0200 @@ -1,4 +1,5 @@ from collections import namedtuple + from packaging.specifiers import SpecifierSet from packaging.version import Version diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/examples/visualization/run_pypi.py new/resolvelib-0.8.1/examples/visualization/run_pypi.py --- old/resolvelib-0.8.0/examples/visualization/run_pypi.py 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/examples/visualization/run_pypi.py 2021-10-11 23:05:57.000000000 +0200 @@ -1,8 +1,9 @@ from pypi_wheel_provider import PyPIProvider, Requirement -from resolvelib import Resolver from visualization.generate import generate_html from visualization.reporter import GraphGeneratingReporter +from resolvelib import Resolver + if __name__ == "__main__": provider = PyPIProvider() reporter = GraphGeneratingReporter() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/noxfile.py new/resolvelib-0.8.1/noxfile.py --- old/resolvelib-0.8.0/noxfile.py 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/noxfile.py 2021-10-11 23:05:57.000000000 +0200 @@ -4,7 +4,6 @@ import nox - ROOT = pathlib.Path(__file__).resolve().parent INIT_PY = ROOT.joinpath("src", "resolvelib", "__init__.py") @@ -15,11 +14,12 @@ @nox.session def lint(session): - session.install(".[lint]") + session.install(".[lint, test]") session.run("black", "--check", ".") + session.run("isort", ".") session.run("flake8", ".") - session.run("mypy", "src") + session.run("mypy", "src", "tests") @nox.session(python=["3.9", "3.8", "3.7", "3.6", "3.5", "2.7"]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/pyproject.toml new/resolvelib-0.8.1/pyproject.toml --- old/resolvelib-0.8.0/pyproject.toml 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/pyproject.toml 2021-10-11 23:05:57.000000000 +0200 @@ -5,6 +5,11 @@ line-length = 79 include = '^/(docs|examples|src|tasks|tests)/.+\.py$' +[tool.isort] +profile = "black" +line_length = 79 +multi_line_output = 3 + [tool.towncrier] package = 'resolvelib' package_dir = 'src' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/setup.cfg new/resolvelib-0.8.1/setup.cfg --- old/resolvelib-0.8.0/setup.cfg 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/setup.cfg 2021-10-11 23:05:57.000000000 +0200 @@ -38,6 +38,9 @@ lint = black flake8 + mypy + isort + types-requests test = commentjson packaging diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/setup.py new/resolvelib-0.8.1/setup.py --- old/resolvelib-0.8.0/setup.py 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/setup.py 2021-10-11 23:05:57.000000000 +0200 @@ -1,2 +1,3 @@ from setuptools import setup + setup() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/src/resolvelib/__init__.py new/resolvelib-0.8.1/src/resolvelib/__init__.py --- old/resolvelib-0.8.0/src/resolvelib/__init__.py 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/src/resolvelib/__init__.py 2021-10-11 23:05:57.000000000 +0200 @@ -11,7 +11,7 @@ "ResolutionTooDeep", ] -__version__ = "0.8.0" +__version__ = "0.8.1" from .providers import AbstractProvider, AbstractResolver @@ -19,8 +19,8 @@ from .resolvers import ( InconsistentCandidate, RequirementsConflicted, - Resolver, ResolutionError, ResolutionImpossible, ResolutionTooDeep, + Resolver, ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/src/resolvelib/__init__.pyi new/resolvelib-0.8.1/src/resolvelib/__init__.pyi --- old/resolvelib-0.8.0/src/resolvelib/__init__.pyi 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/src/resolvelib/__init__.pyi 2021-10-11 23:05:57.000000000 +0200 @@ -1,15 +1,11 @@ __version__: str -from .providers import ( - AbstractResolver as AbstractResolver, - AbstractProvider as AbstractProvider, -) +from .providers import AbstractProvider as AbstractProvider +from .providers import AbstractResolver as AbstractResolver from .reporters import BaseReporter as BaseReporter -from .resolvers import ( - InconsistentCandidate as InconsistentCandidate, - RequirementsConflicted as RequirementsConflicted, - Resolver as Resolver, - ResolutionError as ResolutionError, - ResolutionImpossible as ResolutionImpossible, - ResolutionTooDeep as ResolutionTooDeep, -) +from .resolvers import InconsistentCandidate as InconsistentCandidate +from .resolvers import RequirementsConflicted as RequirementsConflicted +from .resolvers import ResolutionError as ResolutionError +from .resolvers import ResolutionImpossible as ResolutionImpossible +from .resolvers import ResolutionTooDeep as ResolutionTooDeep +from .resolvers import Resolver as Resolver diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/src/resolvelib/providers.pyi new/resolvelib-0.8.1/src/resolvelib/providers.pyi --- old/resolvelib-0.8.0/src/resolvelib/providers.pyi 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/src/resolvelib/providers.pyi 2021-10-11 23:05:57.000000000 +0200 @@ -12,7 +12,7 @@ from .reporters import BaseReporter from .resolvers import RequirementInformation -from .structs import KT, RT, CT, Matches +from .structs import CT, KT, RT, Matches class Preference(Protocol): def __lt__(self, __other: Any) -> bool: ... diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/src/resolvelib/reporters.py new/resolvelib-0.8.1/src/resolvelib/reporters.py --- old/resolvelib-0.8.0/src/resolvelib/reporters.py 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/src/resolvelib/reporters.py 2021-10-11 23:05:57.000000000 +0200 @@ -30,6 +30,12 @@ requirements passed in from ``Resolver.resolve()``. """ + def resolving_conflicts(self, causes): + """Called when starting to attempt requirement conflict resolution. + + :param causes: The information on the collision that caused the backtracking. + """ + def backtracking(self, candidate): """Called when rejecting a candidate during backtracking.""" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/src/resolvelib/reporters.pyi new/resolvelib-0.8.1/src/resolvelib/reporters.pyi --- old/resolvelib-0.8.0/src/resolvelib/reporters.pyi 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/src/resolvelib/reporters.pyi 2021-10-11 23:05:57.000000000 +0200 @@ -7,4 +7,5 @@ def ending(self, state: Any) -> Any: ... def adding_requirement(self, requirement: Any, parent: Any) -> Any: ... def backtracking(self, candidate: Any) -> Any: ... + def resolving_conflicts(self, causes: Any) -> Any: ... def pinning(self, candidate: Any) -> Any: ... diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/src/resolvelib/resolvers.py new/resolvelib-0.8.1/src/resolvelib/resolvers.py --- old/resolvelib-0.8.0/src/resolvelib/resolvers.py 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/src/resolvelib/resolvers.py 2021-10-11 23:05:57.000000000 +0200 @@ -4,7 +4,6 @@ from .providers import AbstractResolver from .structs import DirectedGraph, IteratorMapping, build_iter_view - RequirementInformation = collections.namedtuple( "RequirementInformation", ["requirement", "parent"] ) @@ -374,12 +373,12 @@ failure_causes = self._attempt_to_pin_criterion(name) if failure_causes: + causes = [i for c in failure_causes for i in c.information] # Backtrack if pinning fails. The backtrack process puts us in # an unpinned state, so we can work on it in the next round. + self._r.resolving_conflicts(causes=causes) success = self._backtrack() - self.state.backtrack_causes[:] = [ - i for c in failure_causes for i in c.information - ] + self.state.backtrack_causes[:] = causes # Dead ends everywhere. Give up. if not success: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/src/resolvelib/resolvers.pyi new/resolvelib-0.8.1/src/resolvelib/resolvers.pyi --- old/resolvelib-0.8.0/src/resolvelib/resolvers.pyi 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/src/resolvelib/resolvers.pyi 2021-10-11 23:05:57.000000000 +0200 @@ -9,13 +9,7 @@ ) from .providers import AbstractProvider, AbstractResolver -from .structs import ( - CT, - KT, - RT, - DirectedGraph, - IterableView, -) +from .structs import CT, KT, RT, DirectedGraph, IterableView # This should be a NamedTuple, but Python 3.6 has a bug that prevents it. # https://stackoverflow.com/a/50531189/1376863 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/src/resolvelib/structs.pyi new/resolvelib-0.8.1/src/resolvelib/structs.pyi --- old/resolvelib-0.8.0/src/resolvelib/structs.pyi 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/src/resolvelib/structs.pyi 2021-10-11 23:05:57.000000000 +0200 @@ -5,17 +5,22 @@ Generic, Iterable, Iterator, + Mapping, Tuple, TypeVar, Union, ) -KT = TypeVar("KT") -RT = TypeVar("RT") -CT = TypeVar("CT") +KT = TypeVar("KT") # Identifier. +RT = TypeVar("RT") # Requirement. +CT = TypeVar("CT") # Candidate. _T = TypeVar("_T") + Matches = Union[Iterable[CT], Callable[[], Iterator[CT]]] +class IteratorMapping(Mapping[KT, _T], metaclass=ABCMeta): + pass + class IterableView(Container[CT], Iterable[CT], metaclass=ABCMeta): pass diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/tests/functional/cocoapods/test_resolvers_cocoapods.py new/resolvelib-0.8.1/tests/functional/cocoapods/test_resolvers_cocoapods.py --- old/resolvelib-0.8.0/tests/functional/cocoapods/test_resolvers_cocoapods.py 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/tests/functional/cocoapods/test_resolvers_cocoapods.py 2021-10-11 23:05:57.000000000 +0200 @@ -5,14 +5,13 @@ import re import string -import commentjson +import commentjson # type: ignore import packaging.specifiers import packaging.version import pytest from resolvelib import AbstractProvider, ResolutionImpossible, Resolver - Requirement = collections.namedtuple("Requirement", "name spec") Candidate = collections.namedtuple("Candidate", "name ver deps") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/tests/functional/python/py2index.py new/resolvelib-0.8.1/tests/functional/python/py2index.py --- old/resolvelib-0.8.0/tests/functional/python/py2index.py 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/tests/functional/python/py2index.py 2021-10-11 23:05:57.000000000 +0200 @@ -18,21 +18,14 @@ import os import pathlib import re -import urllib.parse import sys +import urllib.parse import zipfile - -import html5lib -import packaging.requirements -import packaging.tags -import packaging.utils -import packaging.version -import requests - from typing import ( + IO, BinaryIO, Dict, - IO, + FrozenSet, Iterable, Iterator, List, @@ -44,6 +37,12 @@ cast, ) +import html5lib +import packaging.requirements +import packaging.tags +import packaging.utils +import packaging.version +import requests logger = logging.getLogger() @@ -114,7 +113,7 @@ return path -def _parse_tag(s: str) -> Set[packaging.tags.Tag]: +def _parse_tag(s: str) -> FrozenSet[packaging.tags.Tag]: try: return packaging.tags.parse_tag(s) except ValueError: @@ -123,7 +122,7 @@ @dataclasses.dataclass() class WheelMatcher: - required_python: Optional[packaging.version.Version] + required_python: packaging.version.Version tags: Dict[packaging.tags.Tag, int] @classmethod @@ -133,7 +132,7 @@ impl: Optional[str], plats: Optional[List[str]], ) -> WheelMatcher: - required_python = packaging.version.parse( + required_python = packaging.version.Version( ".".join(str(v) for v in python_version) ) # TODO: Add ABI customization. @@ -278,7 +277,7 @@ dep, ) return None - more.add(packaging.utils.canonicalize_name(req.name)) + more.add(str(packaging.utils.canonicalize_name(req.name))) return more def find(self, package_names: Iterable[str]) -> dict: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/tests/functional/python/test_resolvers_python.py new/resolvelib-0.8.1/tests/functional/python/test_resolvers_python.py --- old/resolvelib-0.8.0/tests/functional/python/test_resolvers_python.py 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/tests/functional/python/test_resolvers_python.py 2021-10-11 23:05:57.000000000 +0200 @@ -14,7 +14,6 @@ from resolvelib import AbstractProvider, ResolutionImpossible, Resolver - Candidate = collections.namedtuple("Candidate", "name version extras") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/tests/functional/swift-package-manager/test_resolvers_swift.py new/resolvelib-0.8.1/tests/functional/swift-package-manager/test_resolvers_swift.py --- old/resolvelib-0.8.0/tests/functional/swift-package-manager/test_resolvers_swift.py 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/tests/functional/swift-package-manager/test_resolvers_swift.py 2021-10-11 23:05:57.000000000 +0200 @@ -8,7 +8,6 @@ from resolvelib.providers import AbstractProvider from resolvelib.resolvers import Resolver - Requirement = collections.namedtuple("Requirement", "container constraint") Candidate = collections.namedtuple("Candidate", "container version") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/resolvelib-0.8.0/tests/test_resolvers.py new/resolvelib-0.8.1/tests/test_resolvers.py --- old/resolvelib-0.8.0/tests/test_resolvers.py 2021-10-08 13:02:45.000000000 +0200 +++ new/resolvelib-0.8.1/tests/test_resolvers.py 2021-10-11 23:05:57.000000000 +0200 @@ -4,6 +4,7 @@ AbstractProvider, BaseReporter, InconsistentCandidate, + ResolutionImpossible, Resolver, ) @@ -91,3 +92,54 @@ assert set(result.mapping) == {"parent", "child"} assert result.mapping["child"] == ("child", "1", []) + + +def test_resolving_conflicts(): + all_candidates = { + "a": [("a", 1, [("q", {1})]), ("a", 2, [("q", {2})])], + "b": [("b", 1, [("q", {1})])], + "q": [("q", 1, []), ("q", 2, [])], + } + + class Reporter(BaseReporter): + def __init__(self): + self.backtracking_causes = None + + def resolving_conflicts(self, causes): + self.backtracking_causes = causes + + class Provider(AbstractProvider): + def identify(self, requirement_or_candidate): + return requirement_or_candidate[0] + + def get_preference(self, **_): + return 0 + + def get_dependencies(self, candidate): + return candidate[2] + + def find_matches(self, identifier, requirements, incompatibilities): + bad_versions = {c[1] for c in incompatibilities[identifier]} + candidates = [ + c + for c in all_candidates[identifier] + if all(c[1] in r[1] for r in requirements[identifier]) + and c[1] not in bad_versions + ] + return sorted(candidates, key=lambda c: c[1], reverse=True) + + def is_satisfied_by(self, requirement, candidate): + return candidate[1] in requirement[1] + + def run_resolver(*args): + reporter = Reporter() + resolver = Resolver(Provider(), reporter) + try: + resolver.resolve(*args) + return reporter.backtracking_causes + except ResolutionImpossible as e: + return e.causes + + backtracking_causes = run_resolver([("a", {1, 2}), ("b", {1})]) + exception_causes = run_resolver([("a", {2}), ("b", {1})]) + assert exception_causes == backtracking_causes