Skip to content

Commit 1872cbc

Browse files
committed
finish implementing the correct ordering for most versions
1 parent fef7a3c commit 1872cbc

File tree

2 files changed

+34
-8
lines changed

2 files changed

+34
-8
lines changed

python/private/py_wheel_normalize_pep440.bzl

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,13 @@ def _version_gt(left, right):
587587

588588
return left.key() > right.key()
589589

590+
def _first_non_none(*args):
591+
for arg in args:
592+
if arg != None:
593+
return arg
594+
595+
return None
596+
590597
def _new_version(*, epoch = 0, release, pre = "", post = "", dev = "", local = "", is_prefix = False, norm):
591598
epoch = epoch or 0
592599
_release = tuple([int(d) for d in release.split(".")])
@@ -617,6 +624,8 @@ def _new_version(*, epoch = 0, release, pre = "", post = "", dev = "", local = "
617624

618625
if local:
619626
local = local.lstrip("+")
627+
628+
# If the part is numerical, handle it as a number
620629
local = tuple([int(part) if part.isdigit() else part for part in local.split(".")])
621630
else:
622631
local = None
@@ -641,13 +650,28 @@ def _new_version(*, epoch = 0, release, pre = "", post = "", dev = "", local = "
641650
key = lambda: (
642651
epoch,
643652
_release,
644-
(
645-
-1 if post == None else post,
646-
pre == None,
653+
# PEP440 Within a pre-release, post-release or development release segment with
654+
# a shared prefix, ordering MUST be by the value of the numeric component.
655+
# PEP440 release ordering: .devN, aN, bN, rcN, <no suffix>, .postN
656+
# We choose to first match the pre-release, then post release, then dev and
657+
# then stable
658+
_first_non_none(
647659
pre,
648-
dev == None,
649-
dev,
660+
# We choose `~` since almost all of the ASCII characters will be before
661+
# it. Use `ord` and `chr` functions to find a good value.
662+
("~", post) if post != None else None,
663+
("", dev) if dev != None else None,
664+
# 'z' is just a character that goes after "rc",
665+
("z", 0),
666+
),
667+
# PEP440 - pre-release ordering: .devN, <no suffix>, .postN
668+
_first_non_none(
669+
("~", post) if post != None else None,
670+
("", dev) if dev != None else None,
671+
("z", 0),
650672
),
673+
# PEP440 - post release ordering: .devN, <no suffix>
674+
("", dev) if dev != None else ("~",),
651675
),
652676
)
653677

tests/pypi/pep508/evaluate_tests.bzl

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -304,15 +304,17 @@ def _test_ordering(env):
304304
want = [
305305
# Taken from https://peps.python.org/pep-0440/#summary-of-permitted-suffixes-and-relative-ordering
306306
"1.dev0",
307-
# "1.0.dev456",
307+
"1.0.dev456",
308308
"1.0a1",
309309
"1.0a2.dev456",
310310
"1.0a12.dev456",
311311
"1.0a12",
312312
"1.0b1.dev456",
313+
"1.0b1.dev457",
313314
"1.0b2",
314-
# "1.0b2.post345.dev456",
315-
# "1.0b2.post345",
315+
"1.0b2.post345.dev456",
316+
"1.0b2.post345.dev457",
317+
"1.0b2.post345",
316318
"1.0rc1.dev456",
317319
"1.0rc1",
318320
"1.0",

0 commit comments

Comments
 (0)