Files
HP_InHand_IG502/APPS_UNCOMPILED/lib/packaging/version.py
2025-04-30 08:48:49 -05:00

355 lines
11 KiB
Python

# uncompyle6 version 3.9.2
# Python bytecode version base 3.7.0 (3394)
# Decompiled from: Python 3.8.19 (default, Mar 20 2024, 15:27:52)
# [Clang 14.0.6 ]
# Embedded file name: /var/user/app/device_supervisorbak/device_supervisor/lib/packaging/version.py
# Compiled at: 2024-04-18 03:12:56
# Size of source mod 2**32: 15974 bytes
from __future__ import absolute_import, division, print_function
import collections, itertools, re, warnings
from ._structures import Infinity, NegativeInfinity
from ._typing import TYPE_CHECKING
if TYPE_CHECKING:
from typing import Callable, Iterator, List, Optional, SupportsInt, Tuple, Union
from ._structures import InfinityType, NegativeInfinityType
InfiniteTypes = Union[(InfinityType, NegativeInfinityType)]
PrePostDevType = Union[(InfiniteTypes, Tuple[(str, int)])]
SubLocalType = Union[(InfiniteTypes, int, str)]
LocalType = Union[(
NegativeInfinityType,
Tuple[(
Union[(
SubLocalType,
Tuple[(SubLocalType, str)],
Tuple[(NegativeInfinityType, SubLocalType)])],
...)])]
CmpKey = Tuple[(
int, Tuple[(int, ...)], PrePostDevType, PrePostDevType, PrePostDevType, LocalType)]
LegacyCmpKey = Tuple[(int, Tuple[(str, ...)])]
VersionComparisonMethod = Callable[(
[
Union[(CmpKey, LegacyCmpKey)], Union[(CmpKey, LegacyCmpKey)]], bool)]
__all__ = [
'parse', 'Version', 'LegacyVersion', 'InvalidVersion', 'VERSION_PATTERN']
_Version = collections.namedtuple("_Version", ['epoch', 'release', 'dev', 'pre', 'post', 'local'])
def parse(version):
"""
Parse the given version string and return either a :class:`Version` object
or a :class:`LegacyVersion` object depending on if the given version is
a valid PEP 440 version or a legacy version.
"""
try:
return Version(version)
except InvalidVersion:
return LegacyVersion(version)
class InvalidVersion(ValueError):
__doc__ = "\n An invalid version was found, users should refer to PEP 440.\n "
class _BaseVersion(object):
_key = None
def __hash__(self):
return hash(self._key)
def __lt__(self, other):
if not isinstance(other, _BaseVersion):
return NotImplemented
return self._key < other._key
def __le__(self, other):
if not isinstance(other, _BaseVersion):
return NotImplemented
return self._key <= other._key
def __eq__(self, other):
if not isinstance(other, _BaseVersion):
return NotImplemented
return self._key == other._key
def __ge__(self, other):
if not isinstance(other, _BaseVersion):
return NotImplemented
return self._key >= other._key
def __gt__(self, other):
if not isinstance(other, _BaseVersion):
return NotImplemented
return self._key > other._key
def __ne__(self, other):
if not isinstance(other, _BaseVersion):
return NotImplemented
return self._key != other._key
class LegacyVersion(_BaseVersion):
def __init__(self, version):
self._version = str(version)
self._key = _legacy_cmpkey(self._version)
warnings.warn("Creating a LegacyVersion has been deprecated and will be removed in the next major release", DeprecationWarning)
def __str__(self):
return self._version
def __repr__(self):
return "<LegacyVersion({0})>".format(repr(str(self)))
@property
def public(self):
return self._version
@property
def base_version(self):
return self._version
@property
def epoch(self):
return -1
@property
def release(self):
pass
@property
def pre(self):
pass
@property
def post(self):
pass
@property
def dev(self):
pass
@property
def local(self):
pass
@property
def is_prerelease(self):
return False
@property
def is_postrelease(self):
return False
@property
def is_devrelease(self):
return False
_legacy_version_component_re = re.compile("(\\d+ | [a-z]+ | \\.| -)", re.VERBOSE)
_legacy_version_replacement_map = {
'pre': '"c"',
'preview': '"c"',
'-': '"final-"',
'rc': '"c"',
'dev': '"@"'}
def _parse_version_parts(s):
for part in _legacy_version_component_re.split(s):
part = _legacy_version_replacement_map.get(part, part)
if part:
if part == ".":
continue
if part[None[:1]] in "0123456789":
yield part.zfill(8)
else:
yield "*" + part
yield "*final"
def _legacy_cmpkey(version):
epoch = -1
parts = []
for part in _parse_version_parts(version.lower()):
if part.startswith("*"):
if part < "*final":
while parts and parts[-1] == "*final-":
parts.pop()
while parts and parts[-1] == "00000000":
parts.pop()
parts.append(part)
return (epoch, tuple(parts))
VERSION_PATTERN = "\n v?\n (?:\n (?:(?P<epoch>[0-9]+)!)? # epoch\n (?P<release>[0-9]+(?:\\.[0-9]+)*) # release segment\n (?P<pre> # pre-release\n [-_\\.]?\n (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview))\n [-_\\.]?\n (?P<pre_n>[0-9]+)?\n )?\n (?P<post> # post release\n (?:-(?P<post_n1>[0-9]+))\n |\n (?:\n [-_\\.]?\n (?P<post_l>post|rev|r)\n [-_\\.]?\n (?P<post_n2>[0-9]+)?\n )\n )?\n (?P<dev> # dev release\n [-_\\.]?\n (?P<dev_l>dev)\n [-_\\.]?\n (?P<dev_n>[0-9]+)?\n )?\n )\n (?:\\+(?P<local>[a-z0-9]+(?:[-_\\.][a-z0-9]+)*))? # local version\n"
class Version(_BaseVersion):
_regex = re.compile("^\\s*" + VERSION_PATTERN + "\\s*$", re.VERBOSE | re.IGNORECASE)
def __init__(self, version):
match = self._regex.search(version)
if not match:
raise InvalidVersion("Invalid version: '{0}'".format(version))
self._version = _Version(epoch=(int(match.group("epoch")) if match.group("epoch") else 0),
release=(tuple((int(i) for i in match.group("release").split(".")))),
pre=(_parse_letter_version(match.group("pre_l"), match.group("pre_n"))),
post=(_parse_letter_version(match.group("post_l"), match.group("post_n1") or match.group("post_n2"))),
dev=(_parse_letter_version(match.group("dev_l"), match.group("dev_n"))),
local=(_parse_local_version(match.group("local"))))
self._key = _cmpkey(self._version.epoch, self._version.release, self._version.pre, self._version.post, self._version.dev, self._version.local)
def __repr__(self):
return "<Version({0})>".format(repr(str(self)))
def __str__(self):
parts = []
if self.epoch != 0:
parts.append("{0}!".format(self.epoch))
parts.append(".".join((str(x) for x in self.release)))
if self.pre is not None:
parts.append("".join((str(x) for x in self.pre)))
if self.post is not None:
parts.append(".post{0}".format(self.post))
if self.dev is not None:
parts.append(".dev{0}".format(self.dev))
if self.local is not None:
parts.append("+{0}".format(self.local))
return "".join(parts)
@property
def epoch(self):
_epoch = self._version.epoch
return _epoch
@property
def release(self):
_release = self._version.release
return _release
@property
def pre(self):
_pre = self._version.pre
return _pre
@property
def post(self):
if self._version.post:
return self._version.post[1]
@property
def dev(self):
if self._version.dev:
return self._version.dev[1]
@property
def local(self):
if self._version.local:
return ".".join((str(x) for x in self._version.local))
return
@property
def public(self):
return str(self).split("+", 1)[0]
@property
def base_version(self):
parts = []
if self.epoch != 0:
parts.append("{0}!".format(self.epoch))
parts.append(".".join((str(x) for x in self.release)))
return "".join(parts)
@property
def is_prerelease(self):
return self.dev is not None or self.pre is not None
@property
def is_postrelease(self):
return self.post is not None
@property
def is_devrelease(self):
return self.dev is not None
@property
def major(self):
if len(self.release) >= 1:
return self.release[0]
return 0
@property
def minor(self):
if len(self.release) >= 2:
return self.release[1]
return 0
@property
def micro(self):
if len(self.release) >= 3:
return self.release[2]
return 0
def _parse_letter_version(letter, number):
if letter:
if number is None:
number = 0
else:
letter = letter.lower()
if letter == "alpha":
letter = "a"
else:
if letter == "beta":
letter = "b"
else:
if letter in ('c', 'pre', 'preview'):
letter = "rc"
else:
if letter in ('rev', 'r'):
letter = "post"
return (
letter, int(number))
if not letter:
if number:
letter = "post"
return (
letter, int(number))
_local_version_separators = re.compile("[\\._-]")
def _parse_local_version(local):
"""
Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
"""
if local is not None:
return tuple((part.lower() if not part.isdigit() else int(part) for part in _local_version_separators.split(local)))
def _cmpkey(epoch, release, pre, post, dev, local):
_release = tuple(reversed(list(itertools.dropwhile(lambda x: x == 0, reversed(release)))))
if pre is None:
if post is None and dev is not None:
_pre = NegativeInfinity
else:
if pre is None:
_pre = Infinity
else:
_pre = pre
else:
if post is None:
_post = NegativeInfinity
else:
_post = post
if dev is None:
_dev = Infinity
else:
_dev = dev
if local is None:
_local = NegativeInfinity
else:
_local = tuple(((i, "") if isinstance(i, int) else (NegativeInfinity, i) for i in local))
return (epoch, _release, _pre, _post, _dev, _local)