| | |
| | |
| | |
| | from __future__ import absolute_import, division, print_function |
| |
|
| | import re |
| |
|
| | from ._typing import TYPE_CHECKING, cast |
| | from .version import InvalidVersion, Version |
| |
|
| | if TYPE_CHECKING: |
| | from typing import NewType, Union |
| |
|
| | NormalizedName = NewType("NormalizedName", str) |
| |
|
| | _canonicalize_regex = re.compile(r"[-_.]+") |
| |
|
| |
|
| | def canonicalize_name(name): |
| | |
| | |
| | value = _canonicalize_regex.sub("-", name).lower() |
| | return cast("NormalizedName", value) |
| |
|
| |
|
| | def canonicalize_version(_version): |
| | |
| | """ |
| | This is very similar to Version.__str__, but has one subtle difference |
| | with the way it handles the release segment. |
| | """ |
| |
|
| | try: |
| | version = Version(_version) |
| | except InvalidVersion: |
| | |
| | return _version |
| |
|
| | parts = [] |
| |
|
| | |
| | if version.epoch != 0: |
| | parts.append("{0}!".format(version.epoch)) |
| |
|
| | |
| | |
| | parts.append(re.sub(r"(\.0)+$", "", ".".join(str(x) for x in version.release))) |
| |
|
| | |
| | if version.pre is not None: |
| | parts.append("".join(str(x) for x in version.pre)) |
| |
|
| | |
| | if version.post is not None: |
| | parts.append(".post{0}".format(version.post)) |
| |
|
| | |
| | if version.dev is not None: |
| | parts.append(".dev{0}".format(version.dev)) |
| |
|
| | |
| | if version.local is not None: |
| | parts.append("+{0}".format(version.local)) |
| |
|
| | return "".join(parts) |
| |
|