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

"Compatible Release" (~=) operator violates PEP 440 with long (4-part+) versions #3186

Open
3 tasks done
tharradine opened this issue Oct 12, 2020 · 4 comments · May be fixed by python-poetry/poetry-core#409
Open
3 tasks done
Labels
kind/bug Something isn't working as expected status/triage This issue needs to be triaged

Comments

@tharradine
Copy link

tharradine commented Oct 12, 2020

  • I am on the latest Poetry version.
  • I have searched the issues of this repo and believe that this is not a duplicate.
  • (N/A) If an exception occurs when executing a command, I executed it again in debug mode (-vvv option).
poetry debug output
Poetry
Version: 1.1.2
Python:  3.6.11

Virtualenv
Python:         3.6.11
Implementation: CPython
Path:           /tmp/tmp.1eGGnOnKny/.venv
Valid:          True

System
Platform: linux
OS:       posix
Python:   /home/tobyh/.pyenv/versions/3.6.11

Issue

It seems as though when specifying a dependency with a 4-part (or possibly higher) version number, that the ~= operator violates PEP 440. An example is included in my pyproject.toml and poetry.lock.

Specifically, when locking:

Input:

  • anchor-exp = "~=0.0.0.5"

Expected locked version:

  • anchor-exp = "==0.0.0.6"

Actual locked version:

  • anchor-exp = "==0.0.2.0"

This does not match the example shown in PEP 440:

The padding rules for release segment comparisons means that the assumed degree of forward compatibility in a compatible release clause can be controlled by appending additional zeros to the version specifier:

~= 2.2.0
>= 2.2.0, == 2.2.*

~= 1.4.5.0
>= 1.4.5.0, == 1.4.5.*

Current workaround

Specify the correctly resolved version constraints manually (e.g. anchor-exp~=0.0.0.5 -> anchor-exp>=0.0.0.5,==0.0.0.*). This works fine for primary dependencies, but may be problematic with transitive dependencies. Edit: It seems as though doing this results in the same version, which tells me the issue could actually be in the version-matching with *. Actual workaround can be anchor-exp~=0.0.0.5 -> anchor-exp>=0.0.0.5,<0.0.1

@tharradine tharradine added kind/bug Something isn't working as expected status/triage This issue needs to be triaged labels Oct 12, 2020
@tharradine
Copy link
Author

tharradine commented Oct 12, 2020

Update: It seems as though the issue runs deeper and also affects the * operator, as this happens:

Input:

  • anchor-exp = ">=0.0.0.5,==0.0.0.*"

Expected locked version:

  • anchor-exp = "==0.0.0.6"

Actual locked version:

  • anchor-exp = "==0.0.2.0"

@absassi
Copy link

absassi commented Nov 3, 2020

I didn't know that one could use PEP 440 operators for version specification in Poetry. This is not currently documented, but I think it should be.

@neersighted
Copy link
Member

PTAL @dimbleby @radoering

@dimbleby
Copy link
Contributor

dimbleby commented Oct 5, 2022

report looks legit, I see we already have python-poetry/poetry-core#409.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
kind/bug Something isn't working as expected status/triage This issue needs to be triaged
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants