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

Reply via email to