python-poetry / poetry

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

Poetry does not install a non-optional package from lock file #9636

Open rgareev opened 3 weeks ago

rgareev commented 3 weeks ago

Description

Using pyproject.toml like this:

[tool.poetry]
name = "poetry-sandbox"
version = "0.1.0"
description = ""
authors = ["rinaldv"]
readme = "README.md"

[tool.poetry.dependencies]
python = "^3.10"
burr = {extras = ["tracking-client-s3", "tracking-server-s3", "cli"], version = "^0", allow-prereleases = true }

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

Use poetry lock to generate the lock file (see in attachments, poetry.lock). Notice that it contains the following snippet about non-optional requests package:

[[package]]
name = "requests"
version = "2.32.3"
description = "Python HTTP for Humans."
optional = false
python-versions = ">=3.8"
files = [
    {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"},
    {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"},
]

[package.dependencies]
certifi = ">=2017.4.17"
charset-normalizer = ">=2,<4"
idna = ">=2.5,<4"
urllib3 = ">=1.21.1,<3"

[package.extras]
socks = ["PySocks (>=1.5.6,!=1.5.7)"]
use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]

[[package]]
name = "s3transfer"

Do poetry install and notice that requests is not installed. Logs for -vvv are attached, see poetry-install.log. Expected behavior - it should be installed, because it seems to be resolved this way already into the lock file, and before it was resolved as dependency for burr[cli].

@radoering mentioned in discord that this might be related to poetry#9427 and installer.re-resolve but this is reported for 1.8.3 version

Workarounds

Adding missing dependencies manually into pyproject.toml

Poetry Installation Method

pipx

Operating System

MacOS 13.6.7

Poetry Version

1.8.3

Poetry Configuration

cache-dir = "/Users/rgareev/Library/Caches/pypoetry"
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"  # /Users/rgareev/Library/Caches/pypoetry/virtualenvs
virtualenvs.prefer-active-python = false
virtualenvs.prompt = "{project_name}-py{python_version}"
warnings.export = true

Python Sysconfig

No response

Example pyproject.toml

[tool.poetry]
name = "poetry-sandbox"
version = "0.1.0"
description = ""
authors = ["rinaldv"]
readme = "README.md"

[tool.poetry.dependencies]
python = "^3.10"
burr = {extras = ["tracking-client-s3", "tracking-server-s3", "cli"], version = "^0", allow-prereleases = true }

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

Poetry Runtime Logs

[poetry-install.log](https://github.com/user-attachments/files/16641377/poetry-install.log)
radoering commented 3 weeks ago

@radoering mentioned in discord that this might be related to poetry#9427 and installer.re-resolve but this is reported for 1.8.3 version

You misunderstood. I said that #9427 (partially) fixes this issue: If you re-lock with this PR and set poetry config installer.re-resolve false, then requests will be installed. (poetry show still does not show requests.)

dimbleby commented 3 weeks ago

the lockfile contains

[[package]]
name = "burr"
version = "0.27.2"
...

[package.dependencies]
...
requests = {version = "*", optional = true, markers = "extra == \"tracking-server\""}

which has indeed forgotten all about the cli extra.

this should fix I think:

diff --git a/src/poetry/puzzle/solver.py b/src/poetry/puzzle/solver.py
index 9675bc1f..9f7e5ddd 100644
--- a/src/poetry/puzzle/solver.py
+++ b/src/poetry/puzzle/solver.py
@@ -186,9 +186,7 @@ class Solver:
                             else:
                                 _dep = _package.requires[index]
                                 if _dep.marker != dep.marker:
-                                    # marker of feature package is more accurate
-                                    # because it includes relevant extras
-                                    _dep.marker = dep.marker
+                                    _package.add_dependency(dep)
             else:
                 final_packages.append(package)
                 depths.append(results[package])