Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 11 additions & 30 deletions src/packaging/version.py
Original file line number Diff line number Diff line change
Expand Up @@ -237,14 +237,7 @@ def __str__(self) -> str:
>>> str(Version("1.0a5"))
'1.0a5'
"""
parts = []

# Epoch
if self.epoch != 0:
parts.append(f"{self.epoch}!")

# Release segment
parts.append(".".join(str(x) for x in self.release))
parts = [self.base_version]

# Pre-release
if self.pre is not None:
Expand Down Expand Up @@ -369,16 +362,8 @@ def base_version(self) -> str:
The "base version" is the public version of the project without any pre or post
release markers.
"""
parts = []

# Epoch
if self.epoch != 0:
parts.append(f"{self.epoch}!")

# Release segment
parts.append(".".join(str(x) for x in self.release))

return "".join(parts)
release_segment = ".".join(map(str, self.release))
return f"{self.epoch}!{release_segment}" if self.epoch else release_segment

@property
def is_prerelease(self) -> bool:
Expand Down Expand Up @@ -463,20 +448,16 @@ def release(self) -> tuple[int, ...]:
(0,)
"""
rel = super().release
nonzeros = (index for index, val in enumerate(rel) if val)
last_nonzero = max(nonzeros, default=0)
return rel[: last_nonzero + 1]
i = len(rel)
while i > 1 and rel[i - 1] == 0:
i -= 1
return rel[:i]


def _parse_letter_version(
letter: str | None, number: str | bytes | SupportsInt | None
) -> tuple[str, int] | None:
if letter:
# We consider there to be an implicit 0 in a pre-release if there is
# not a numeral associated with it.
if number is None:
number = 0

# We normalize any letters to their lower case form
letter = letter.lower()

Expand All @@ -492,14 +473,14 @@ def _parse_letter_version(
elif letter in ["rev", "r"]:
letter = "post"

return letter, int(number)
# We consider there to be an implicit 0 in a pre-release if there is
# not a numeral associated with it.
return letter, int(number or 0)

if number:
# We assume if we are given a number, but we are not given a letter
# then this is using the implicit post release syntax (e.g. 1.0-1)
letter = "post"

return letter, int(number)
return "post", int(number)

return None

Expand Down