Spaces:
Runtime error
Runtime error
# This file is dual licensed under the terms of the Apache License, Version | |
# 2.0, and the BSD License. See the LICENSE file in the root of this repository | |
# for complete details. | |
from __future__ import absolute_import, division, print_function | |
import re | |
from ._typing import TYPE_CHECKING, cast | |
from .version import InvalidVersion, Version | |
if TYPE_CHECKING: # pragma: no cover | |
from typing import NewType, Union | |
NormalizedName = NewType("NormalizedName", str) | |
_canonicalize_regex = re.compile(r"[-_.]+") | |
def canonicalize_name(name): | |
# type: (str) -> NormalizedName | |
# This is taken from PEP 503. | |
value = _canonicalize_regex.sub("-", name).lower() | |
return cast("NormalizedName", value) | |
def canonicalize_version(_version): | |
# type: (str) -> Union[Version, str] | |
""" | |
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: | |
# Legacy versions cannot be normalized | |
return _version | |
parts = [] | |
# Epoch | |
if version.epoch != 0: | |
parts.append("{0}!".format(version.epoch)) | |
# Release segment | |
# NB: This strips trailing '.0's to normalize | |
parts.append(re.sub(r"(\.0)+$", "", ".".join(str(x) for x in version.release))) | |
# Pre-release | |
if version.pre is not None: | |
parts.append("".join(str(x) for x in version.pre)) | |
# Post-release | |
if version.post is not None: | |
parts.append(".post{0}".format(version.post)) | |
# Development release | |
if version.dev is not None: | |
parts.append(".dev{0}".format(version.dev)) | |
# Local version segment | |
if version.local is not None: | |
parts.append("+{0}".format(version.local)) | |
return "".join(parts) | |