@@ -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+
590597def _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
0 commit comments