Path: blob/master/venv/Lib/site-packages/soupsieve/__meta__.py
811 views
"""Meta related things."""1from collections import namedtuple2import re34RE_VER = re.compile(5r'''(?x)6(?P<major>\d+)(?:\.(?P<minor>\d+))?(?:\.(?P<micro>\d+))?7(?:(?P<type>a|b|rc)(?P<pre>\d+))?8(?:\.post(?P<post>\d+))?9(?:\.dev(?P<dev>\d+))?10'''11)1213REL_MAP = {14".dev": "",15".dev-alpha": "a",16".dev-beta": "b",17".dev-candidate": "rc",18"alpha": "a",19"beta": "b",20"candidate": "rc",21"final": ""22}2324DEV_STATUS = {25".dev": "2 - Pre-Alpha",26".dev-alpha": "2 - Pre-Alpha",27".dev-beta": "2 - Pre-Alpha",28".dev-candidate": "2 - Pre-Alpha",29"alpha": "3 - Alpha",30"beta": "4 - Beta",31"candidate": "4 - Beta",32"final": "5 - Production/Stable"33}3435PRE_REL_MAP = {"a": 'alpha', "b": 'beta', "rc": 'candidate'}363738class Version(namedtuple("Version", ["major", "minor", "micro", "release", "pre", "post", "dev"])):39"""40Get the version (PEP 440).4142A biased approach to the PEP 440 semantic version.4344Provides a tuple structure which is sorted for comparisons `v1 > v2` etc.45(major, minor, micro, release type, pre-release build, post-release build, development release build)46Release types are named in is such a way they are comparable with ease.47Accessors to check if a development, pre-release, or post-release build. Also provides accessor to get48development status for setup files.4950How it works (currently):5152- You must specify a release type as either `final`, `alpha`, `beta`, or `candidate`.53- To define a development release, you can use either `.dev`, `.dev-alpha`, `.dev-beta`, or `.dev-candidate`.54The dot is used to ensure all development specifiers are sorted before `alpha`.55You can specify a `dev` number for development builds, but do not have to as implicit development releases56are allowed.57- You must specify a `pre` value greater than zero if using a prerelease as this project (not PEP 440) does not58allow implicit prereleases.59- You can optionally set `post` to a value greater than zero to make the build a post release. While post releases60are technically allowed in prereleases, it is strongly discouraged, so we are rejecting them. It should be61noted that we do not allow `post0` even though PEP 440 does not restrict this. This project specifically62does not allow implicit post releases.63- It should be noted that we do not support epochs `1!` or local versions `+some-custom.version-1`.6465Acceptable version releases:6667```68Version(1, 0, 0, "final") 1.069Version(1, 2, 0, "final") 1.270Version(1, 2, 3, "final") 1.2.371Version(1, 2, 0, ".dev-alpha", pre=4) 1.2a472Version(1, 2, 0, ".dev-beta", pre=4) 1.2b473Version(1, 2, 0, ".dev-candidate", pre=4) 1.2rc474Version(1, 2, 0, "final", post=1) 1.2.post175Version(1, 2, 3, ".dev") 1.2.3.dev076Version(1, 2, 3, ".dev", dev=1) 1.2.3.dev177```7879"""8081def __new__(cls, major, minor, micro, release="final", pre=0, post=0, dev=0):82"""Validate version info."""8384# Ensure all parts are positive integers.85for value in (major, minor, micro, pre, post):86if not (isinstance(value, int) and value >= 0):87raise ValueError("All version parts except 'release' should be integers.")8889if release not in REL_MAP:90raise ValueError("'{}' is not a valid release type.".format(release))9192# Ensure valid pre-release (we do not allow implicit pre-releases).93if ".dev-candidate" < release < "final":94if pre == 0:95raise ValueError("Implicit pre-releases not allowed.")96elif dev:97raise ValueError("Version is not a development release.")98elif post:99raise ValueError("Post-releases are not allowed with pre-releases.")100101# Ensure valid development or development/pre release102elif release < "alpha":103if release > ".dev" and pre == 0:104raise ValueError("Implicit pre-release not allowed.")105elif post:106raise ValueError("Post-releases are not allowed with pre-releases.")107108# Ensure a valid normal release109else:110if pre:111raise ValueError("Version is not a pre-release.")112elif dev:113raise ValueError("Version is not a development release.")114115return super(Version, cls).__new__(cls, major, minor, micro, release, pre, post, dev)116117def _is_pre(self):118"""Is prerelease."""119120return self.pre > 0121122def _is_dev(self):123"""Is development."""124125return bool(self.release < "alpha")126127def _is_post(self):128"""Is post."""129130return self.post > 0131132def _get_dev_status(self): # pragma: no cover133"""Get development status string."""134135return DEV_STATUS[self.release]136137def _get_canonical(self):138"""Get the canonical output string."""139140# Assemble major, minor, micro version and append `pre`, `post`, or `dev` if needed..141if self.micro == 0:142ver = "{}.{}".format(self.major, self.minor)143else:144ver = "{}.{}.{}".format(self.major, self.minor, self.micro)145if self._is_pre():146ver += '{}{}'.format(REL_MAP[self.release], self.pre)147if self._is_post():148ver += ".post{}".format(self.post)149if self._is_dev():150ver += ".dev{}".format(self.dev)151152return ver153154155def parse_version(ver, pre=False):156"""Parse version into a comparable Version tuple."""157158m = RE_VER.match(ver)159160# Handle major, minor, micro161major = int(m.group('major'))162minor = int(m.group('minor')) if m.group('minor') else 0163micro = int(m.group('micro')) if m.group('micro') else 0164165# Handle pre releases166if m.group('type'):167release = PRE_REL_MAP[m.group('type')]168pre = int(m.group('pre'))169else:170release = "final"171pre = 0172173# Handle development releases174dev = m.group('dev') if m.group('dev') else 0175if m.group('dev'):176dev = int(m.group('dev'))177release = '.dev-' + release if pre else '.dev'178else:179dev = 0180181# Handle post182post = int(m.group('post')) if m.group('post') else 0183184return Version(major, minor, micro, release, pre, post, dev)185186187__version_info__ = Version(2, 0, 1, "final")188__version__ = __version_info__._get_canonical()189190191