# 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 annotations
import functools import re from typing import NewType, Tuple, Union, cast
from .tags import Tag, parse_tag from .version import InvalidVersion, Version, _TrimmedRelease
class InvalidName(ValueError): """
An invalid distribution name; users should refer to the packaging user guide. """
class InvalidWheelFilename(ValueError): """
An invalid wheel filename was found, users should refer to PEP 427. """
class InvalidSdistFilename(ValueError): """
An invalid sdist filename was found, users should refer to the packaging user guide. """
# Core metadata spec for `Name`
_validate_regex = re.compile(
r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$", re.IGNORECASE
)
_canonicalize_regex = re.compile(r"[-_.]+")
_normalized_regex = re.compile(r"^([a-z0-9]|[a-z0-9]([a-z0-9-](?!--))*[a-z0-9])$") # PEP 427: The build number must start with a digit.
_build_tag_regex = re.compile(r"(\d+)(.*)")
def canonicalize_name(name: str, *, validate: bool = False) -> NormalizedName: if validate andnot _validate_regex.match(name): raise InvalidName(f"name is invalid: {name!r}") # This is taken from PEP 503.
value = _canonicalize_regex.sub("-", name).lower() return cast(NormalizedName, value)
@functools.singledispatch def canonicalize_version(
version: Version | str, *, strip_trailing_zero: bool = True
) -> str: """ Return a canonical form of a version as a string.
>>> canonicalize_version('1.0.1') '1.0.1'
Per PEP 625, versions may have multiple canonical forms, differing
only by trailing zeros.
filename = filename[:-4]
dashes = filename.count("-") if dashes notin (4, 5): raise InvalidWheelFilename(
f"Invalid wheel filename (wrong number of parts): {filename!r}"
)
parts = filename.split("-", dashes - 2)
name_part = parts[0] # See PEP 427 for the rules on escaping the project name. if"__"in name_part or re.match(r"^[\w\d._]*$", name_part, re.UNICODE) isNone: raise InvalidWheelFilename(f"Invalid project name: {filename!r}")
name = canonicalize_name(name_part)
try:
version = Version(parts[1]) except InvalidVersion as e: raise InvalidWheelFilename(
f"Invalid wheel filename (invalid version): {filename!r}"
) from e
def parse_sdist_filename(filename: str) -> tuple[NormalizedName, Version]: if filename.endswith(".tar.gz"):
file_stem = filename[: -len(".tar.gz")] elif filename.endswith(".zip"):
file_stem = filename[: -len(".zip")] else: raise InvalidSdistFilename(
f"Invalid sdist filename (extension must be '.tar.gz' or '.zip'):"
f" {filename!r}"
)
# We are requiring a PEP 440 version, which cannot contain dashes, # so we split on the last dash.
name_part, sep, version_part = file_stem.rpartition("-") ifnot sep: raise InvalidSdistFilename(f"Invalid sdist filename: {filename!r}")
name = canonicalize_name(name_part)
try:
version = Version(version_part) except InvalidVersion as e: raise InvalidSdistFilename(
f"Invalid sdist filename (invalid version): {filename!r}"
) from e
return (name, version)
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.19 Sekunden
(vorverarbeitet am 2026-08-25)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.