Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Poetry doesn't respect python version specification when resolving dependencies #9573

Closed
osemenovsky opened this issue Jul 23, 2024 · 2 comments
Labels
kind/bug Something isn't working as expected status/triage This issue needs to be triaged

Comments

@osemenovsky
Copy link

osemenovsky commented Jul 23, 2024

Description

I have the following pyproject.toml (in full)

[tool.poetry]
name = "poetry-issue"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]
readme = "README.md"

[tool.poetry.dependencies]
python = "^2.7 || >= 3.7"
typing = { version = "3.10.0.0", python = "^2.7" }
typing-extensions = [
	{ version = "==3.10.0.2", python = "^2.7" },
	{ version = ">=4.1.0", python = ">=3.7" },
]
mypy = { version = "1.4.1", python = ">=3.7" }


[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

When I run poetry lock I get this error message

Updating dependencies
Resolving dependencies... (0.7s)

Because mypy (1.4.1) depends on typing-extensions (>=4.1.0)
 and poetry-issue depends on typing-extensions (3.10.0.2), mypy is forbidden.
So, because poetry-issue depends on mypy (1.4.1), version solving failed.

So Poetry ignores the fact that the conflicting dependency is meant for a different version of python that mypy's installed for.

Workarounds

I didn't find any workarounds yet

Poetry Installation Method

pipx

Operating System

NixOS unstable

Poetry Version

1.8.3

Poetry Configuration

experimental.system-git-client = false
installer.max-workers = null
installer.modern-installation = true
installer.no-binary = null
installer.parallel = true
keyring.enabled = true
solver.lazy-wheel = true
virtualenvs.create = true
virtualenvs.in-project = null
virtualenvs.options.always-copy = false
virtualenvs.options.no-pip = false
virtualenvs.options.no-setuptools = false
virtualenvs.options.system-site-packages = false
virtualenvs.path = "{cache-dir}/virtualenvs"
virtualenvs.prefer-active-python = false
virtualenvs.prompt = "{project_name}-py{python_version}"
warnings.export = false

Python Sysconfig

I don't think it's relevant and I would rather not share

Example pyproject.toml

[tool.poetry]
name = "poetry-issue"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]
readme = "README.md"

[tool.poetry.dependencies]
python = "^2.7 || >= 3.7"
typing = { version = "3.10.0.0", python = "^2.7" }
typing-extensions = [
	{ version = "==3.10.0.2", python = "^2.7" },
	{ version = ">=4.1.0", python = ">=3.7" },
]
mypy = { version = "1.4.1", python = ">=3.7" }


[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

Poetry Runtime Logs

Loading configuration file /home/.../.config/pypoetry/config.toml
Loading configuration file /home/.../.config/pypoetry/auth.toml
Using virtualenv: /home/.../.cache/pypoetry/virtualenvs/poetry-issue-DVHHV6Qp-py3.11
Updating dependencies
Resolving dependencies...
   1: fact: poetry-issue is 0.1.0
   1: derived: poetry-issue
   0: Duplicate dependencies for typing-extensions
   0: Different requirements found for typing-extensions (3.10.0.2) with markers python_version >= "2.7" and python_version < "3.0" and typing-extensions (>=4.1.0) with markers python_version >= "3.7".
   1: Version solving took 0.002 seconds.
   1: Tried 1 solutions.
   0: Retrying dependency resolution with the following overrides ({Package('poetry-issue', '0.1.0'): {'typing-extensions': <Dependency typing-extensions (==3.10.0.2)>}}).
   1: fact: poetry-issue is 0.1.0
   1: derived: poetry-issue
   1: fact: poetry-issue depends on typing (3.10.0.0)
   1: fact: poetry-issue depends on typing-extensions (3.10.0.2)
   1: fact: poetry-issue depends on mypy (1.4.1)
   1: selecting poetry-issue (0.1.0)
   1: derived: mypy (==1.4.1)
   1: derived: typing-extensions (==3.10.0.2)
   1: derived: typing (==3.10.0.0)
Checking if keyring is available
[keyring:keyring.backend] Loading KWallet
[keyring:keyring.backend] Loading SecretService
[keyring:keyring.backend] Loading Windows
[keyring:keyring.backend] Loading chainer
[keyring:keyring.backend] Loading libsecret
[keyring:keyring.backend] Loading macOS
Backend 'fail Keyring' is not suitable
No valid keyring backend was found
Creating new session for pypi.org
Source (PyPI): 1 packages found for mypy 1.4.1
Source (PyPI): 1 packages found for typing-extensions 3.10.0.2
Source (PyPI): 1 packages found for typing 3.10.0.0
   1: fact: mypy (1.4.1) depends on typing-extensions (>=4.1.0)
   1: fact: mypy (1.4.1) depends on mypy-extensions (>=1.0.0)
   1: fact: mypy (1.4.1) depends on tomli (>=1.1.0)
   1: fact: mypy (1.4.1) depends on typed-ast (>=1.4.0,<2)
   1: derived: typed-ast (>=1.4.0,<2)
   1: derived: tomli (>=1.1.0)
   1: derived: mypy-extensions (>=1.0.0)
   1: conflict: mypy (1.4.1) depends on typing-extensions (>=4.1.0)
   1: ! not typing-extensions (>=4.1.0) is satisfied by typing-extensions (==3.10.0.2)
   1: ! which is caused by "poetry-issue depends on typing-extensions (3.10.0.2)"
   1: ! thus: mypy is forbidden
   1: ! mypy (==1.4.1) is satisfied by mypy (==1.4.1)
   1: ! which is caused by "poetry-issue depends on mypy (1.4.1)"
   1: ! thus: version solving failed
   1: Version solving took 0.144 seconds.
   1: Tried 1 solutions.

  Stack trace:

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

  3  ~/.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│ 

  2  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/mixology/version_solver.py:175 in solve
      173│             while next is not None:
      174│                 self._propagate(next)
    → 175│                 next = self._choose_package_version()
      176│ 
      177│             return self._result()

  1  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/mixology/version_solver.py:514 in _choose_package_version
      512│             package = locked
      513│ 
    → 514│         package = self._provider.complete_package(package)
      515│ 
      516│         conflict = False

  OverrideNeeded

  ({Package('poetry-issue', '0.1.0'): {'typing-extensions': <Dependency typing-extensions (==3.10.0.2)>}}, {Package('poetry-issue', '0.1.0'): {'typing-extensions': <Dependency typing-extensions (>=4.1.0)>}})

  at ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/puzzle/provider.py:653 in complete_package
      649│                     current_overrides.update({package: package_overrides})
      650│                     overrides.append(current_overrides)
      651│ 
      652│             if overrides:
    → 653│                 raise OverrideNeeded(*overrides)
      654│ 
      655│         # Modifying dependencies as needed
      656│         clean_dependencies = []
      657│         for dep in dependencies:

The following error occurred when trying to handle this error:


  Stack trace:

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

  3  ~/.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│ 

  2  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/mixology/version_solver.py:174 in solve
      172│             next: str | None = self._root.name
      173│             while next is not None:
    → 174│                 self._propagate(next)
      175│                 next = self._choose_package_version()
      176│ 

  1  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/mixology/version_solver.py:213 in _propagate
      211│                     # where that incompatibility will allow us to derive new assignments
      212│                     # that avoid the conflict.
    → 213│                     root_cause = self._resolve_conflict(incompatibility)
      214│ 
      215│                     # Back jumping erases all the assignments we did at the previous

  SolveFailure

  Because mypy (1.4.1) depends on typing-extensions (>=4.1.0)
   and poetry-issue depends on typing-extensions (3.10.0.2), mypy is forbidden.
  So, because poetry-issue depends on mypy (1.4.1), version solving failed.

  at ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/mixology/version_solver.py:427 in _resolve_conflict
      423│             )
      424│             self._log(f'! which is caused by "{most_recent_satisfier.cause}"')
      425│             self._log(f"! thus: {incompatibility}")
      426│ 
    → 427│         raise SolveFailure(incompatibility)
      428│ 
      429│     def _choose_package_version(self) -> str | None:
      430│         """
      431│         Tries to select a version of a required package.

The following error occurred when trying to handle this error:


  Stack trace:

  13  ~/.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

  12  ~/.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│ 

  11  ~/.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│ 

  10  ~/.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

   9  ~/.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

   8  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/cleo/commands/base_command.py:117 in run
       115│         io.input.validate()
       116│ 
     → 117│         return self.execute(io) or 0
       118│ 
       119│     def merge_application_definition(self, merge_args: bool = True) -> None:

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

   6  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/console/commands/lock.py:55 in handle
        53│         self.installer.lock(update=not self.option("no-update"))
        54│ 
     →  55│         return self.installer.run()
        56│ 

   5  ~/.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:

   4  ~/.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")

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

   2  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/puzzle/solver.py:158 in _solve
       156│             packages = result.packages
       157│         except OverrideNeeded as e:
     → 158│             return self._solve_in_compatibility_mode(e.overrides)
       159│         except SolveFailure as e:
       160│             raise SolverProblemError(e)

   1  ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/puzzle/solver.py:132 in _solve_in_compatibility_mode
       130│             )
       131│             self._provider.set_overrides(override)
     → 132│             _packages, _depths = self._solve()
       133│             for index, package in enumerate(_packages):
       134│                 if package not in packages:

  SolverProblemError

  Because mypy (1.4.1) depends on typing-extensions (>=4.1.0)
   and poetry-issue depends on typing-extensions (3.10.0.2), mypy is forbidden.
  So, because poetry-issue depends on mypy (1.4.1), version solving failed.

  at ~/.local/pipx/venvs/poetry/lib/python3.11/site-packages/poetry/puzzle/solver.py:160 in _solve
      156│             packages = result.packages
      157│         except OverrideNeeded as e:
      158│             return self._solve_in_compatibility_mode(e.overrides)
      159│         except SolveFailure as e:
    → 160│             raise SolverProblemError(e)
      161│ 
      162│         combined_nodes = depth_first_search(PackageNode(self._package, packages))
      163│         results = dict(aggregate_package_nodes(nodes) for nodes in combined_nodes)
      164│
@osemenovsky osemenovsky added kind/bug Something isn't working as expected status/triage This issue needs to be triaged labels Jul 23, 2024
@dimbleby
Copy link
Contributor

duplicate #5506, please close

Copy link

This issue has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs.

@github-actions github-actions bot locked as resolved and limited conversation to collaborators Aug 23, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
kind/bug Something isn't working as expected status/triage This issue needs to be triaged
Projects
None yet
Development

No branches or pull requests

2 participants