python-poetry / poetry

Python packaging and dependency management made easy
https://python-poetry.org
MIT License
31.1k stars 2.25k forks source link

`assert term is not None` in poetry lock/update #8405

Open david26694 opened 1 year ago

david26694 commented 1 year ago

Issue

I do poetry update and I get the following error (using internal libraries, so can't share the toml):

Updating dependencies
Resolving dependencies... (53.3s)

  AssertionError

  at ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/mixology/partial_solution.py:160 in _register
      156│         old_negative = self._negative.get(name)
      157│         term = (
      158│             assignment if old_negative is None else assignment.intersect(old_negative)
      159│          )
    → 160│         assert term is not None
      161│ 
      162│         if term.is_positive():
      163│             if name in self._negative:
      164│                 del self._negative[name]

what does this mean?

this is the partial toml (removed some internal libraries):


[tool.poetry.dependencies]
python = ">=3.8.6,<3.10"
pandas="~1.2.2"
lightgbm="~2.2.2"
numpy="^1.19.5"
scipy="~1.5.4"
pytest="^5.4.3"
boto3="^1.16.57"
injector="^0.18.4"
locust="^1.4.1"
scikit_learn="^0.22.1"
Shapely="^1.7.1"
scikit-optimize="^0.7.2"
PyMySQL="^1.0.2"
psycopg2-binary="^2.8.6"
distributed="==2.30.*"
pytz="*"
Ipython="^7.19.0"
dill=">=0.3.1, <1"
jupyter_client="^5.3.4"
ipykernel="^5.1.3"
nbconvert="^5.6.1"
geotiler=">=0.14.3, <1"
nest_asyncio="^1.2.3"
Unidecode="^1.1.1"
numba="==0.50.0"
llvmlite="^0.33"
jinja2 = "3.0.3"
smart-open = "*"
slackclient = "*"
py-dagger = "^0.4.2"
google-api-python-client = "^2.0.2"
matrixprofile = "==1.1.10"

[tool.poetry.dev-dependencies]
pytest = "^5.2"

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
david26694 commented 1 year ago

Running with -vvv:

  17: fact: google-api-python-client (2.39.0) depends on httplib2 (>=0.15.0,<1dev)
  17: fact: google-api-python-client (2.39.0) depends on google-auth (>=1.16.0,<3.0.0dev)
  17: fact: google-api-python-client (2.39.0) depends on google-auth-httplib2 (>=0.1.0)
  17: fact: google-api-python-client (2.39.0) depends on google-api-core (>=1.21.0,<3.0.0dev)
  17: fact: google-api-python-client (2.39.0) depends on uritemplate (>=3.0.1,<5)
  17: selecting google-api-python-client (2.39.0)
  17: derived: uritemplate (>=3.0.1,<5)
  17: derived: google-api-core (>=1.21.0,<3.0.0dev)
  17: Version solving took 60.370 seconds.
  17: Tried 17 solutions.

  Stack trace:

  18  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/cleo/application.py:327 in run
       325│ 
       326│             try:
     → 327│                 exit_code = self._run(io)
       328│             except BrokenPipeError:
       329│                 # If we are piped to another process, it may close early and send a

  17  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/console/application.py:190 in _run
       188│         self._load_plugins(io)
       189│ 
     → 190│         exit_code: int = super()._run(io)
       191│         return exit_code
       192│ 

  16  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/cleo/application.py:431 in _run
       429│             io.input.interactive(interactive)
       430│ 
     → 431│         exit_code = self._run_command(command, io)
       432│         self._running_command = None
       433│ 

  15  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/cleo/application.py:473 in _run_command
       471│ 
       472│         if error is not None:
     → 473│             raise error
       474│ 
       475│         return terminate_event.exit_code

  14  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/cleo/application.py:457 in _run_command
       455│ 
       456│             if command_event.command_should_run():
     → 457│                 exit_code = command.run(io)
       458│             else:
       459│                 exit_code = ConsoleCommandEvent.RETURN_CODE_DISABLED

  13  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/cleo/commands/base_command.py:119 in run
       117│         io.input.validate()
       118│ 
     → 119│         status_code = self.execute(io)
       120│ 
       121│         if status_code is None:

  12  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/cleo/commands/command.py:62 in execute
        60│ 
        61│         try:
     →  62│             return self.handle()
        63│         except KeyboardInterrupt:
        64│             return 1

  11  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/console/commands/update.py:49 in handle
        47│         self.installer.update(True)
        48│ 
     →  49│         return self.installer.run()
        50│ 

  10  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/installation/installer.py:104 in run
       102│             self.verbose(True)
       103│ 
     → 104│         return self._do_install()
       105│ 
       106│     def dry_run(self, dry_run: bool = True) -> Installer:

   9  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/installation/installer.py:241 in _do_install
       239│                 source_root=self._env.path.joinpath("src")
       240│             ):
     → 241│                 ops = solver.solve(use_latest=self._whitelist).calculate_operations()
       242│         else:
       243│             self._io.write_line("Installing dependencies from lock file")

   8  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/puzzle/solver.py:72 in solve
        70│         with self._progress(), self._provider.use_latest_for(use_latest or []):
        71│             start = time.time()
     →  72│             packages, depths = self._solve()
        73│             end = time.time()
        74│ 

   7  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/puzzle/solver.py:155 in _solve
       153│ 
       154│         try:
     → 155│             result = resolve_version(self._package, self._provider)
       156│ 
       157│             packages = result.packages

   6  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/mixology/__init__.py:18 in resolve_version
        16│     solver = VersionSolver(root, provider)
        17│ 
     →  18│     return solver.solve()
        19│ 

   5  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/mixology/version_solver.py:163 in solve
       161│             next: str | None = self._root.name
       162│             while next is not None:
     → 163│                 self._propagate(next)
       164│                 next = self._choose_package_version()
       165│ 

   4  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/mixology/version_solver.py:192 in _propagate
       190│                     continue
       191│ 
     → 192│                 result = self._propagate_incompatibility(incompatibility)
       193│ 
       194│                 if result is _conflict:

   3  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/mixology/version_solver.py:267 in _propagate_incompatibility
       265│         self._log(f"derived: {adverb}{unsatisfied.dependency}")
       266│ 
     → 267│         self._solution.derive(
       268│             unsatisfied.dependency, not unsatisfied.is_positive(), incompatibility
       269│         )

   2  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/mixology/partial_solution.py:100 in derive
        98│         Adds an assignment of package as a derivation.
        99│         """
     → 100│         self._assign(
       101│             Assignment.derivation(
       102│                 dependency,

   1  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/mixology/partial_solution.py:115 in _assign
       113│         """
       114│         self._assignments.append(assignment)
     → 115│         self._register(assignment)
       116│ 
       117│     def backtrack(self, decision_level: int) -> None:

  AssertionError

  at ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/mixology/partial_solution.py:160 in _register
      156│         old_negative = self._negative.get(name)
      157│         term = (
      158│             assignment if old_negative is None else assignment.intersect(old_negative)
      159│         )
    → 160│         assert term is not None
      161│ 
      162│         if term.is_positive():
      163│             if name in self._negative:
      164│                 del self._negative[name]
dimbleby commented 1 year ago

if you can't share a pyproject.toml that reproduces this there's little chance that you can be helped

it probably has something to do with an unusual version number somewhere in your tree - a release candidate or a dev version or whatever.

But if you're unable or unwilling to enable anyone else to reproduce this, you're likely on your own - sorry.

dimbleby commented 1 year ago

also we probably might as well assume it's a duplicate of #8202