From c72c50c715126a652728f7be83c57d330edbead5 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Sun, 2 Apr 2023 09:14:28 +0200 Subject: [PATCH 01/51] Simplify max_ver and min_ver Use max() and min() with argument key=Version.parse --- src/semver/_deprecated.py | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/src/semver/_deprecated.py b/src/semver/_deprecated.py index 8dfb1933..2c736fff 100644 --- a/src/semver/_deprecated.py +++ b/src/semver/_deprecated.py @@ -11,7 +11,7 @@ from . import cli from .version import Version -from ._types import Decorator, F, String +from ._types import Decorator, F def deprecated( @@ -192,15 +192,7 @@ def max_ver(ver1, ver2): >>> semver.max_ver("1.0.0", "2.0.0") '2.0.0' """ - if isinstance(ver1, String.__args__): # type: ignore - ver1 = Version.parse(ver1) - elif not isinstance(ver1, Version): - raise TypeError() - cmp_res = ver1.compare(ver2) - if cmp_res >= 0: - return str(ver1) - else: - return ver2 + return str(max(ver1, ver2, key=Version.parse)) @deprecated(replace="min", version="2.10.2") @@ -219,12 +211,7 @@ def min_ver(ver1, ver2): >>> semver.min_ver("1.0.0", "2.0.0") '1.0.0' """ - ver1 = Version.parse(ver1) - cmp_res = ver1.compare(ver2) - if cmp_res <= 0: - return str(ver1) - else: - return ver2 + return str(min(ver1, ver2, key=Version.parse)) @deprecated(replace="str(versionobject)", version="2.10.0") From 47b49cac131c24b1d3f9046ecb62fdace0c2de9e Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Sun, 19 Mar 2023 17:18:22 +0100 Subject: [PATCH 02/51] Fix #258: Keep semver._deprecated.compare Although it breaks consistency with module level functions, it seems it's a much needed/used function. Nevertheless it's a "deprecated" function. * Function is also available accessing semver.compare() * Decorate semver.compare() as PendingDeprecationWarning * Update docstring of semver.compare() * Adapt `deprecated` decorator and use enforce keyword arguments * Update CHANGELOG.rst * Use intersphinx to link to Python exception, use Python inventory It's still unclear if we should deprecate this function or not (that's why we use PendingDeprecationWarning). As we don't have a uniform initializer yet, this function stays in _deprecated.py for the time being until we find a better soltuion. See #258 for details --- CHANGELOG.rst | 10 +- docs/api.rst | 4 +- docs/changelog-semver2.rst | 670 ---------------------------- docs/conf.py | 11 + docs/index.rst | 2 +- docs/inventories/python-objects.inv | Bin 0 -> 130055 bytes docs/usage/compare-versions.rst | 2 +- src/semver/__init__.py | 2 +- src/semver/_deprecated.py | 89 ++-- tests/test_deprecated_functions.py | 2 - 10 files changed, 83 insertions(+), 709 deletions(-) delete mode 100644 docs/changelog-semver2.rst create mode 100644 docs/inventories/python-objects.inv diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 28a401e2..11b08e06 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -21,7 +21,7 @@ This section covers the changes between major version 2 and version 3. Version 3.0.0 ============= -:Released: 2023-03-19 +:Released: 2023-04-02 :Maintainer: Tom Schraitle @@ -95,6 +95,14 @@ Deprecations didn't cast many votes, the majority agreed to remove support for Python 3.6. +* :pr:`402`: Keep :func:`semver.compare `. + Although it breaks consistency with module level functions, it seems it's + a much needed/used function. It's still unclear if we should deprecate + this function or not (that's why we use :py:exc:`PendingDeprecationWarning`). + + As we don't have a uniform initializer yet, this function stays in the + :file:`_deprecated.py` file for the time being until we find a better solution. See :gh:`258` for details. + Features -------- diff --git a/docs/api.rst b/docs/api.rst index 279df408..f545ebc5 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -17,6 +17,8 @@ Deprecated Functions in :mod:`semver._deprecated` .. automodule:: semver._deprecated +.. autofunction:: semver._deprecated.compare + .. autofunction:: semver._deprecated.bump_build .. autofunction:: semver._deprecated.bump_major @@ -27,8 +29,6 @@ Deprecated Functions in :mod:`semver._deprecated` .. autofunction:: semver._deprecated.bump_prerelease -.. autofunction:: semver._deprecated.compare - .. autofunction:: semver._deprecated.deprecated .. autofunction:: semver._deprecated.finalize_version diff --git a/docs/changelog-semver2.rst b/docs/changelog-semver2.rst deleted file mode 100644 index dca94413..00000000 --- a/docs/changelog-semver2.rst +++ /dev/null @@ -1,670 +0,0 @@ -################## -Change Log semver2 -################## - -This changelog contains older entries for semver2. - ----- - - -Version 2.13.0 -============== - -:Released: 2020-10-20 -:Maintainer: Tom Schraitle - - -Features --------- - -* :pr:`287`: Document how to create subclass from ``VersionInfo`` - - -Bug Fixes ---------- - -* :pr:`283`: Ensure equal versions have equal hashes. - Version equality means for semver, that ``major``, - ``minor``, ``patch``, and ``prerelease`` parts are - equal in both versions you compare. The ``build`` part - is ignored. - - -Additions ---------- - -n/a - - -Deprecations ------------- - -n/a - - ----- - - -Version 2.12.0 -============== - -:Released: 2020-10-19 -:Maintainer: Tom Schraitle - - -Bug Fixes ---------- - -* :gh:`291` (:pr:`292`): Disallow negative numbers of - ``major``, ``minor``, and ``patch`` for :class:`semver.VersionInfo` - - ----- - - -Version 2.11.0 -============== - -:Released: 2020-10-17 -:Maintainer: Tom Schraitle - - -Bug Fixes ---------- - -* :gh:`276` (:pr:`277`): ``VersionInfo.parse`` should be a class method - Also add authors and update changelog in :gh:`286` -* :gh:`274` (:pr:`275`): Py2 vs. Py3 incompatibility TypeError - - ----- - - -Version 2.10.2 -============== - -:Released: 2020-06-15 -:Maintainer: Tom Schraitle - -Features --------- - -:gh:`268`: Increase coverage - - -Bug Fixes ---------- - -* :gh:`260` (:pr:`261`): Fixed ``__getitem__`` returning None on wrong parts -* :pr:`263`: Doc: Add missing "install" subcommand for openSUSE - - -Deprecations ------------- - -* :gh:`160` (:pr:`264`): - * :func:`semver.max_ver` - * :func:`semver.min_ver` - - ----- - - -Version 2.10.1 -============== - -:Released: 2020-05-13 -:Maintainer: Tom Schraitle - - -Features --------- - -* :pr:`249`: Added release policy and version restriction in documentation to - help our users which would like to stay on the major 2 release. -* :pr:`250`: Simplified installation semver on openSUSE with ``obs://``. -* :pr:`256`: Made docstrings consistent - - - -Bug Fixes ---------- - -* :gh:`251` (:pr:`254`): Fixed return type of ``semver.VersionInfo.next_version`` - to always return a ``VersionInfo`` instance. - - ----- - - - -Version 2.10.0 -============== - -:Released: 2020-05-05 -:Maintainer: Tom Schraitle - -Features --------- - -* :pr:`138`: Added ``__getitem__`` magic method to ``semver.VersionInfo`` class. - Allows to access a version like ``version[1]``. -* :pr:`235`: Improved documentation and shift focus on ``semver.VersionInfo`` instead of advertising - the old and deprecated module-level functions. -* :pr:`230`: Add version information in some functions: - - * Use ``.. versionadded::`` RST directive in docstrings to - make it more visible when something was added - * Minor wording fix in docstrings (versions -> version strings) - - -Bug Fixes ---------- - -* :gh:`224` (:pr:`226`): In ``setup.py``, replaced in class ``clean``, - ``super(CleanCommand, self).run()`` with ``CleanCommand.run(self)`` -* :gh:`244` (:pr:`245`): Allow comparison with ``VersionInfo``, tuple/list, dict, and string. - - -Additions ---------- - -* :pr:`228`: Added better doctest integration - - -Deprecations ------------- -* :gh:`225` (:pr:`229`): Output a DeprecationWarning for the following functions: - - - ``semver.parse`` - - ``semver.parse_version_info`` - - ``semver.format_version`` - - ``semver.bump_{major,minor,patch,prerelease,build}`` - - ``semver.finalize_version`` - - ``semver.replace`` - - ``semver.VersionInfo._asdict`` (use the new, public available - function ``semver.VersionInfo.to_dict()``) - - ``semver.VersionInfo._astuple`` (use the new, public available - function ``semver.VersionInfo.to_tuple()``) - - These deprecated functions will be removed in semver 3. - - ----- - - -Version 2.9.1 -============= -:Released: 2020-02-16 -:Maintainer: Tom Schraitle - -Features --------- - -* :gh:`177` (:pr:`178`): Fixed repository and CI links (moved https://github.com/k-bx/python-semver/ repository to https://github.com/python-semver/python-semver/) -* :pr:`179`: Added note about moving this project to the new python-semver organization on GitHub -* :gh:`187` (:pr:`188`): Added logo for python-semver organization and documentation -* :gh:`191` (:pr:`194`): Created manpage for pysemver -* :gh:`196` (:pr:`197`): Added distribution specific installation instructions -* :gh:`201` (:pr:`202`): Reformatted source code with black -* :gh:`208` (:pr:`209`): Introduce new function :func:`semver.VersionInfo.isvalid` - and extend :command:`pysemver` with :command:`check` subcommand -* :gh:`210` (:pr:`215`): Document how to deal with invalid versions -* :pr:`212`: Improve docstrings according to PEP257 - -Bug Fixes ---------- - -* :gh:`192` (:pr:`193`): Fixed "pysemver" and "pysemver bump" when called without arguments - - ----- - -Version 2.9.0 -============= -:Released: 2019-10-30 -:Maintainer: Sébastien Celles - -Features --------- - -* :gh:`59` (:pr:`164`): Implemented a command line interface -* :gh:`85` (:pr:`147`, :pr:`154`): Improved contribution section -* :gh:`104` (:pr:`125`): Added iterator to :func:`semver.VersionInfo` -* :gh:`112`, :gh:`113`: Added Python 3.7 support -* :pr:`120`: Improved test_immutable function with properties -* :pr:`125`: Created :file:`setup.cfg` for pytest and tox -* :gh:`126` (:pr:`127`): Added target for documentation in :file:`tox.ini` -* :gh:`142` (:pr:`143`): Improved usage section -* :gh:`144` (:pr:`156`): Added :func:`semver.replace` and :func:`semver.VersionInfo.replace` - functions -* :gh:`145` (:pr:`146`): Added posargs in :file:`tox.ini` -* :pr:`157`: Introduce :file:`conftest.py` to improve doctests -* :pr:`165`: Improved code coverage -* :pr:`166`: Reworked :file:`.gitignore` file -* :gh:`167` (:pr:`168`): Introduced global constant :data:`SEMVER_SPEC_VERSION` - -Bug Fixes ---------- - -* :gh:`102`: Fixed comparison between VersionInfo and tuple -* :gh:`103`: Disallow comparison between VersionInfo and string (and int) -* :gh:`121` (:pr:`122`): Use python3 instead of python3.4 in :file:`tox.ini` -* :pr:`123`: Improved :func:`__repr__` and derive class name from :func:`type` -* :gh:`128` (:pr:`129`): Fixed wrong datatypes in docstring for :func:`semver.format_version` -* :gh:`135` (:pr:`140`): Converted prerelease and build to string -* :gh:`136` (:pr:`151`): Added testsuite to tarball -* :gh:`154` (:pr:`155`): Improved README description - -Removals --------- - -* :gh:`111` (:pr:`110`): Dropped Python 3.3 -* :gh:`148` (:pr:`149`): Removed and replaced ``python setup.py test`` - - ----- - -Version 2.8.2 -============= -:Released: 2019-05-19 -:Maintainer: Sébastien Celles - -Skipped, not released. - ----- - -Version 2.8.1 -============= -:Released: 2018-07-09 -:Maintainer: Sébastien Celles - -Features --------- - -* :gh:`40` (:pr:`88`): Added a static parse method to VersionInfo -* :gh:`77` (:pr:`47`): Converted multiple tests into pytest.mark.parametrize -* :gh:`87`, :gh:`94` (:pr:`93`): Removed named tuple inheritance. -* :gh:`89` (:pr:`90`): Added doctests. - -Bug Fixes ---------- - -* :gh:`98` (:pr:`99`): Set prerelease and build to None by default -* :gh:`96` (:pr:`97`): Made VersionInfo immutable - - ----- - -Version 2.8.0 -============= -:Released: 2018-05-16 -:Maintainer: Sébastien Celles - - -Changes -------- - -* :gh:`82` (:pr:`83`): Renamed :file:`test.py` to :file:`test_semver.py` so - py.test can autodiscover test file - -Additions ---------- - -* :gh:`79` (:pr:`81`, :pr:`84`): Defined and improve a release procedure file -* :gh:`72`, :gh:`73` (:pr:`75`): Implemented :func:`__str__` and :func:`__hash__` - -Removals --------- - -* :gh:`76` (:pr:`80`): Removed Python 2.6 compatibility - ----- - - -Version 2.7.9 -============= - -:Released: 2017-09-23 -:Maintainer: Kostiantyn Rybnikov - - -Additions ---------- - -* :gh:`65` (:pr:`66`): Added :func:`semver.finalize_version` function. - - ----- - -Version 2.7.8 -============= - -:Released: 2017-08-25 -:Maintainer: Kostiantyn Rybnikov - -* :gh:`62`: Support custom default names for pre and build - - ----- - -Version 2.7.7 -============= - -:Released: 2017-05-25 -:Maintainer: Kostiantyn Rybnikov - -* :gh:`54` (:pr:`55`): Added comparision between VersionInfo objects -* :pr:`56`: Added support for Python 3.6 - - ----- - -Version 2.7.2 -============= - -:Released: 2016-11-08 -:Maintainer: Kostiantyn Rybnikov - -Additions ---------- - -* Added :func:`semver.parse_version_info` to parse a version string to a - version info tuple. - -Bug Fixes ---------- - -* :gh:`37`: Removed trailing zeros from prelease doesn't allow to - parse 0 pre-release version - -* Refine parsing to conform more strictly to SemVer 2.0.0. - - SemVer 2.0.0 specification §9 forbids leading zero on identifiers in - the prerelease version. - - ----- - -Version 2.6.0 -============= - -:Released: 2016-06-08 -:Maintainer: Kostiantyn Rybnikov - -Removals --------- - -* Remove comparison of build component. - - SemVer 2.0.0 specification recommends that build component is - ignored in comparisons. - - ----- - -Version 2.5.0 -============= - -:Released: 2016-05-25 -:Maintainer: Kostiantyn Rybnikov - -Additions ---------- - -* Support matching 'not equal' with “!=”. - -Changes -------- - -* Made separate builds for tests on Travis CI. - - ----- - -Version 2.4.2 -============= - -:Released: 2016-05-16 -:Maintainer: Kostiantyn Rybnikov - -Changes -------- - -* Migrated README document to reStructuredText format. - -* Used Setuptools for distribution management. - -* Migrated test cases to Py.test. - -* Added configuration for Tox test runner. - - ----- - -Version 2.4.1 -============= - -:Released: 2016-03-04 -:Maintainer: Kostiantyn Rybnikov - -Additions ---------- - -* :gh:`23`: Compared build component of a version. - - ----- - -Version 2.4.0 -============= - -:Released: 2016-02-12 -:Maintainer: Kostiantyn Rybnikov - -Bug Fixes ---------- - -* :gh:`21`: Compared alphanumeric components correctly. - - ----- - -Version 2.3.1 -============= - -:Released: 2016-01-30 -:Maintainer: Kostiantyn Rybnikov - -Additions ---------- - -* Declared granted license name in distribution metadata. - - ----- - -Version 2.3.0 -============= - -:Released: 2016-01-29 -:Maintainer: Kostiantyn Rybnikov - -Additions ---------- - -* Added functions to increment prerelease and build components in a - version. - - ----- - -Version 2.2.1 -============= - -:Released: 2015-08-04 -:Maintainer: Kostiantyn Rybnikov - -Bug Fixes ---------- - -* Corrected comparison when any component includes zero. - - ----- - -Version 2.2.0 -============= - -:Released: 2015-06-21 -:Maintainer: Kostiantyn Rybnikov - -Additions ---------- - -* Add functions to determined minimum and maximum version. - -* Add code examples for recently-added functions. - - ----- - -Version 2.1.2 -============= - -:Released: 2015-05-23 -:Maintainer: Kostiantyn Rybnikov - -Bug Fixes ---------- - -* Restored current README document to distribution manifest. - - ----- - -Version 2.1.1 -============= - -:Released: 2015-05-23 -:Maintainer: Kostiantyn Rybnikov - -Bug Fixes ---------- - -* Removed absent document from distribution manifest. - - ----- - -Version 2.1.0 -============= - -:Released: 2015-05-22 -:Maintainer: Kostiantyn Rybnikov - -Additions ---------- - -* Documented installation instructions. - -* Documented project home page. - -* Added function to format a version string from components. - -* Added functions to increment specific components in a version. - -Changes -------- - -* Migrated README document to Markdown format. - -Bug Fixes ---------- - -* Corrected code examples in README document. - - ----- - -Version 2.0.2 -============= - -:Released: 2015-04-14 -:Maintainer: Konstantine Rybnikov - -Additions ---------- - -* Added configuration for Travis continuous integration. - -* Explicitly declared supported Python versions. - - ----- - -Version 2.0.1 -============= - -:Released: 2014-09-24 -:Maintainer: Konstantine Rybnikov - -Bug Fixes ---------- - -* :gh:`9`: Fixed comparison of equal version strings. - - ----- - -Version 2.0.0 -============= - -:Released: 2014-05-24 -:Maintainer: Konstantine Rybnikov - -Additions ---------- - -* Grant license in this code base under BSD 3-clause license terms. - -Changes -------- - -* Update parser to SemVer standard 2.0.0. - -* Ignore build component for comparison. - - ----- - -Version 0.0.2 -============= - -:Released: 2012-05-10 -:Maintainer: Konstantine Rybnikov - -Changes -------- - -* Use standard library Distutils for distribution management. - - ----- - -Version 0.0.1 -============= - -:Released: 2012-04-28 -:Maintainer: Konstantine Rybnikov - -* Initial release. - - -.. - Local variables: - coding: utf-8 - mode: text - mode: rst - End: - vim: fileencoding=utf-8 filetype=rst : diff --git a/docs/conf.py b/docs/conf.py index 9edfda4d..eab3248d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -122,6 +122,17 @@ def find_version(*file_paths): "pr": ("https://github.com/python-semver/python-semver/pull/%s", "PR #%s"), } +# Link to other projects’ documentation +# See https://www.sphinx-doc.org/en/master/usage/extensions/intersphinx.html +intersphinx_mapping = { + # Download it from the root with: + # wget -O docs/python-objects.inv https://docs.python.org/3/objects.inv + "python": ("https://docs.python.org/3", (None, "inventories/python-objects.inv")), +} +# Avoid side-effects (namely that documentations local references can +# suddenly resolve to an external location.) +intersphinx_disabled_reftypes = ["*"] + # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for diff --git a/docs/index.rst b/docs/index.rst index 4c9ccff7..1054c225 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -32,7 +32,7 @@ Semver |version| -- Semantic Versioning :hidden: changelog - changelog-semver2 + changelog-semver3-devel Indices and Tables diff --git a/docs/inventories/python-objects.inv b/docs/inventories/python-objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..6f01e284eb588b00fa34fab71b910eac28980526 GIT binary patch literal 130055 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 literal 0 HcmV?d00001 diff --git a/docs/usage/compare-versions.rst b/docs/usage/compare-versions.rst index cf55eae3..ddd03b68 100644 --- a/docs/usage/compare-versions.rst +++ b/docs/usage/compare-versions.rst @@ -5,7 +5,7 @@ To compare two versions depends on your type: * **Two strings** - Use :func:`semver.compare`:: + Use :func:`semver.compare `:: >>> semver.compare("1.0.0", "2.0.0") -1 diff --git a/src/semver/__init__.py b/src/semver/__init__.py index c6726f2e..433e5d5d 100644 --- a/src/semver/__init__.py +++ b/src/semver/__init__.py @@ -9,8 +9,8 @@ bump_major, bump_minor, bump_patch, - bump_prerelease, compare, + bump_prerelease, finalize_version, format_version, match, diff --git a/src/semver/_deprecated.py b/src/semver/_deprecated.py index 2c736fff..efbdf439 100644 --- a/src/semver/_deprecated.py +++ b/src/semver/_deprecated.py @@ -16,8 +16,10 @@ def deprecated( func: Optional[F] = None, + *, replace: Optional[str] = None, version: Optional[str] = None, + remove: Optional[str] = None, category: Type[Warning] = DeprecationWarning, ) -> Decorator: """ @@ -34,7 +36,13 @@ def deprecated( """ if func is None: - return partial(deprecated, replace=replace, version=version, category=category) + return partial( + deprecated, + replace=replace, + version=version, + remove=remove, + category=category, + ) @wraps(func) def wrapper(*args, **kwargs) -> Callable[..., F]: @@ -42,7 +50,12 @@ def wrapper(*args, **kwargs) -> Callable[..., F]: if version: msg_list.append("Deprecated since version {v}. ") - msg_list.append("This function will be removed in semver 3.") + + if not remove: + msg_list.append("This function will be removed in semver 3.") + else: + msg_list.append(str(remove)) + if replace: msg_list.append("Use {r!r} instead.") else: @@ -69,6 +82,36 @@ def wrapper(*args, **kwargs) -> Callable[..., F]: return wrapper +@deprecated( + version="3.0.0", + remove="Still under investigation, see #258.", + category=PendingDeprecationWarning, +) +def compare(ver1: str, ver2: str) -> int: + """ + Compare two versions strings. + + .. deprecated:: 3.0.0 + The situation of this function is unclear and it might + disappear in the future. + If possible, use :meth:`semver.version.Version.compare`. + See :gh:`258` for details. + + :param ver1: first version string + :param ver2: second version string + :return: The return value is negative if ver1 < ver2, + zero if ver1 == ver2 and strictly positive if ver1 > ver2 + + >>> semver.compare("1.0.0", "2.0.0") + -1 + >>> semver.compare("2.0.0", "1.0.0") + 1 + >>> semver.compare("2.0.0", "2.0.0") + 0 + """ + return Version.parse(ver1).compare(ver2) + + @deprecated(version="2.10.0") def parse(version): """ @@ -126,28 +169,6 @@ def parse_version_info(version): return Version.parse(version) -@deprecated(version="2.10.0") -def compare(ver1, ver2): - """ - Compare two versions strings. - - :param ver1: version string 1 - :param ver2: version string 2 - :return: The return value is negative if ver1 < ver2, - zero if ver1 == ver2 and strictly positive if ver1 > ver2 - :rtype: int - - >>> semver.compare("1.0.0", "2.0.0") - -1 - >>> semver.compare("2.0.0", "1.0.0") - 1 - >>> semver.compare("2.0.0", "2.0.0") - 0 - """ - v1 = Version.parse(ver1) - return v1.compare(ver2) - - @deprecated(version="2.10.0") def match(version, match_expr): """ @@ -374,10 +395,16 @@ def replace(version, **parts): # CLI -cmd_bump = deprecated(cli.cmd_bump, "semver.cli.cmd_bump", "3.0.0") -cmd_check = deprecated(cli.cmd_check, "semver.cli.cmd_check", "3.0.0") -cmd_compare = deprecated(cli.cmd_compare, "semver.cli.cmd_compare", "3.0.0") -cmd_nextver = deprecated(cli.cmd_nextver, "semver.cli.cmd_nextver", "3.0.0") -createparser = deprecated(cli.createparser, "semver.cli.createparser", "3.0.0") -process = deprecated(cli.process, "semver.cli.process", "3.0.0") -main = deprecated(cli.main, "semver.cli.main", "3.0.0") +cmd_bump = deprecated(cli.cmd_bump, replace="semver.cli.cmd_bump", version="3.0.0") +cmd_check = deprecated(cli.cmd_check, replace="semver.cli.cmd_check", version="3.0.0") +cmd_compare = deprecated( + cli.cmd_compare, replace="semver.cli.cmd_compare", version="3.0.0" +) +cmd_nextver = deprecated( + cli.cmd_nextver, replace="semver.cli.cmd_nextver", version="3.0.0" +) +createparser = deprecated( + cli.createparser, replace="semver.cli.createparser", version="3.0.0" +) +process = deprecated(cli.process, replace="semver.cli.process", version="3.0.0") +main = deprecated(cli.main, replace="semver.cli.main", version="3.0.0") diff --git a/tests/test_deprecated_functions.py b/tests/test_deprecated_functions.py index 0b5123cc..88862689 100644 --- a/tests/test_deprecated_functions.py +++ b/tests/test_deprecated_functions.py @@ -5,7 +5,6 @@ from semver import ( parse, parse_version_info, - compare, match, max_ver, min_ver, @@ -36,7 +35,6 @@ (bump_minor, ("1.2.3",), {}), (bump_patch, ("1.2.3",), {}), (bump_prerelease, ("1.2.3",), {}), - (compare, ("1.2.1", "1.2.2"), {}), (format_version, (3, 4, 5), {}), (finalize_version, ("1.2.3-rc.5",), {}), (match, ("1.0.0", ">=1.0.0"), {}), From d26cc07a757fe3ac831ccbdec238ba66bc478128 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Sun, 2 Apr 2023 14:32:27 +0200 Subject: [PATCH 03/51] Build 3.0.0 release of semver --- docs/usage/semver-version.rst | 2 +- src/semver/__about__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/usage/semver-version.rst b/docs/usage/semver-version.rst index e8cc92b3..b7d5ed9e 100644 --- a/docs/usage/semver-version.rst +++ b/docs/usage/semver-version.rst @@ -4,4 +4,4 @@ Getting the Version of semver To know the version of semver itself, use the following construct:: >>> semver.__version__ - '3.0.0-rc.1' + '3.0.0' diff --git a/src/semver/__about__.py b/src/semver/__about__.py index dd671d02..89c6412e 100644 --- a/src/semver/__about__.py +++ b/src/semver/__about__.py @@ -16,7 +16,7 @@ """ #: Semver version -__version__ = "3.0.0-rc.1" +__version__ = "3.0.0" #: Original semver author __author__ = "Kostiantyn Rybnikov" From 3215a9931bfc501b41274f716a6966273bc0c287 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Mon, 3 Apr 2023 16:34:29 +0200 Subject: [PATCH 04/51] Remove incorrect dependencies in pyproject.toml (#405) * Remove redundant wheel dep from pyproject.toml Remove the redundant `wheel` dependency, as it is added by the backend automatically. Listing it explicitly in the documentation was a historical mistake and has been fixed since, see: https://github.com/pypa/setuptools/commit/f7d30a9529378cf69054b5176249e5457aaf640a * Add build into deps (prepare-dist) Co-authored-by: Tom Schraitle --- pyproject.toml | 2 -- tox.ini | 2 -- 2 files changed, 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index d288e68e..e611abc4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,8 +10,6 @@ requires = [ # sync with setup.py until we discard non-pep-517/518 "setuptools", "setuptools-scm", - "wheel", - "build", ] build-backend = "setuptools.build_meta" diff --git a/tox.ini b/tox.ini index b71ae78e..fb91a518 100644 --- a/tox.ini +++ b/tox.ini @@ -99,9 +99,7 @@ commands = make -C docs man description = Prepare for TestPyPI basepython = python3 deps = - wheel twine - # PEP 517 build frontend build commands = # Same as python3 -m build From 7625129e911829e359c150b3d155345a05f83140 Mon Sep 17 00:00:00 2001 From: Benjamin K <53038537+treee111@users.noreply.github.com> Date: Wed, 12 Apr 2023 16:32:48 +0200 Subject: [PATCH 05/51] correct typo in function description --- src/semver/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/semver/version.py b/src/semver/version.py index cca744a1..e9d0e15b 100644 --- a/src/semver/version.py +++ b/src/semver/version.py @@ -432,7 +432,7 @@ def next_version(self, part: str, prerelease_token: str = "rc") -> "Version": This function is taking prereleases into account. The "major", "minor", and "patch" raises the respective parts like the ``bump_*`` functions. The real difference is using the - "preprelease" part. It gives you the next patch version of the + "prerelease" part. It gives you the next patch version of the prerelease, for example: >>> str(semver.parse("0.1.4").next_version("prerelease")) From 100d90b27f0d5ae26d2892a73b2525ba49c850f5 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Sat, 22 Apr 2023 16:08:00 +0200 Subject: [PATCH 06/51] Improve GitHub Action * Set timeout-minutes ti 15min * Add on.push.path on.pull_request.path * Raise Python 3.7 -> 3.8 * Use cache for actions/setup-python@v3 --- .github/workflows/python-testing.yml | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/.github/workflows/python-testing.yml b/.github/workflows/python-testing.yml index fb23fcf8..8f32ffd1 100644 --- a/.github/workflows/python-testing.yml +++ b/.github/workflows/python-testing.yml @@ -3,9 +3,21 @@ name: Python on: push: - branches: [ master ] + branches: [ "master", "main" ] + paths: + - 'pyproject.toml' + - '**.py' + - '.github/workflows/python-testing.yml' + pull_request: - branches: [ master ] + branches: [ "master", "main" ] + paths: + - 'pyproject.toml' + - '**.py' + - '.github/workflows/python-testing.yml' + +permissions: + contents: read concurrency: # only cancel in-progress runs of the same workflow @@ -17,6 +29,9 @@ concurrency: jobs: check: runs-on: ubuntu-latest + # Timout of 15min + timeout-minutes: 15 + steps: - uses: actions/checkout@v3 - name: Output env variables @@ -41,7 +56,8 @@ jobs: - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v3 with: - python-version: 3.7 + python-version: 3.8 + cache: 'pip' - name: Install dependencies run: | python3 -m pip install --upgrade pip setuptools setuptools-scm @@ -70,6 +86,7 @@ jobs: uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} + cache: 'pip' - name: Install dependencies run: | python3 -m pip install --upgrade pip From 39bf287af9106986404762d91c20a27ca97b2219 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Thu, 27 Apr 2023 08:25:37 +0200 Subject: [PATCH 07/51] Add CITATION.cff for citation Benefits: * Users of our software can easily cite it using the metadata from CITATION.cff * GitHub shows the citation information in the sidebar * Browser plugins can import the correct reference Sources: * https://citation-file-format.github.io/ * https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-citation-files --- CITATION.cff | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 CITATION.cff diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 00000000..708f4d0a --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,104 @@ +# This CITATION.cff file was generated with cffinit: +# https://bit.ly/cffinit + +cff-version: 1.2.0 +title: python-semver +message: >- + If you use this software, please cite it using the + metadata from this file. +type: software + +authors: + - given-names: Kostiantyn + family-names: Rybnikov + email: k-bx@k-bx.com + - given-names: Tom + family-names: Schraitle + email: tom_schr@web.de + - given-names: Sebastian + family-names: Celles + email: s.celles@gmail.com + - name: "The python-semver software team" + +identifiers: + - type: url + value: 'https://github.com/python-semver/python-semver' + description: GitHub python-semver/python-semver +url: 'https://python-semver.readthedocs.io' +repository-code: 'https://github.com/python-semver/python-semver' +repository-artifact: 'https://pypi.org/project/semver/' + +abstract: >- + A Python module for semantic versioning. Simplifies + comparing versions. This modules follows the + MAJOR.MINOR.PATCH style. + +keywords: + - Python + - Python module + - semver + - versioning + - semantic versioning + - semver-format + - semver-tag + - versions + +references: + - authors: + - family-names: Preston-Werner + given-names: Tom + - name: "The semver team" + title: 'Semantic Versioning 2.0.0' + url: 'https://semver.org' + repository-code: 'https://github.com/semver/semver' + type: standard + version: 2.0.0 + languages: + - ar + - bg + - ca + - cs + - da + - de + - el + - en + - es + - fa + - fr + - he + - hin + - hr + - hu + - hy + - id + - it + - ja + - ka + - kab + - ko + - nl + - pl + - pt + - ro + - ru + - sk + - sl + - sr + - sv + - tr + - uk + - vi + - zh + abstract: >- + Given a version number MAJOR.MINOR.PATCH, increment the: + + 1. MAJOR version when you make incompatible API changes + 2. MINOR version when you add functionality in a backwards compatible manner + 3. PATCH version when you make backwards compatible bug fixes + + Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format. + +license: BSD-3-Clause +commit: 3a7680dc436211227c0aeae84c9b45e0b3345b8f +version: 3.0.0 +date-released: '2023-04-02' From 2a8331f3d4f4fe824360487071599d4dc0aeab09 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Thu, 27 Apr 2023 09:57:53 +0200 Subject: [PATCH 08/51] Mention CITATION.cff in release procedure --- release-procedure.md | 1 + 1 file changed, 1 insertion(+) diff --git a/release-procedure.md b/release-procedure.md index d6c1701e..f7b8d7bb 100644 --- a/release-procedure.md +++ b/release-procedure.md @@ -20,6 +20,7 @@ create a new release. * `setup.cfg` * `tox.ini` * `.git/workflows/pythonpackage.yml` + * `CITATION.cff` 1. Verify that the version has been updated and follow : From 17bc2571c4f3c7faf85d5b024d5f9117d555d49b Mon Sep 17 00:00:00 2001 From: Dhaval Soneji Date: Wed, 14 Jun 2023 11:35:35 +0100 Subject: [PATCH 09/51] Fix #410 Export all names in __all__ variable * Export all semver names in `__all__` variable. * Fix linting issues --- changelog.d/410.bugfix.rst | 1 + src/semver/__init__.py | 35 ++++++++++++++++++++++++++++++++++- src/semver/cli.py | 2 +- src/semver/version.py | 4 ++-- 4 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 changelog.d/410.bugfix.rst diff --git a/changelog.d/410.bugfix.rst b/changelog.d/410.bugfix.rst new file mode 100644 index 00000000..1b2dcf74 --- /dev/null +++ b/changelog.d/410.bugfix.rst @@ -0,0 +1 @@ +Export functions properly using `__all__` in `__init__.py`. \ No newline at end of file diff --git a/src/semver/__init__.py b/src/semver/__init__.py index 433e5d5d..19c88f78 100644 --- a/src/semver/__init__.py +++ b/src/semver/__init__.py @@ -1,5 +1,5 @@ """ -semver package major release 3. +Semver package major release 3. A Python module for semantic versioning. Simplifies comparing versions. """ @@ -37,3 +37,36 @@ __maintainer_email__, SEMVER_SPEC_VERSION, ) + +__all__ = [ + "bump_build", + "bump_major", + "bump_minor", + "bump_patch", + "compare", + "bump_prerelease", + "finalize_version", + "format_version", + "match", + "max_ver", + "min_ver", + "parse", + "parse_version_info", + "replace", + "cmd_bump", + "cmd_compare", + "cmd_nextver", + "cmd_check", + "createparser", + "process", + "main", + "Version", + "VersionInfo", + "__version__", + "__author__", + "__maintainer__", + "__author_email__", + "__description__", + "__maintainer_email__", + "SEMVER_SPEC_VERSION", +] diff --git a/src/semver/cli.py b/src/semver/cli.py index b2751429..43e101e1 100644 --- a/src/semver/cli.py +++ b/src/semver/cli.py @@ -61,7 +61,7 @@ def cmd_check(args: argparse.Namespace) -> None: def cmd_compare(args: argparse.Namespace) -> str: """ - Subcommand: Compare two versions + Subcommand: Compare two versions. Synopsis: compare diff --git a/src/semver/version.py b/src/semver/version.py index e9d0e15b..af437296 100644 --- a/src/semver/version.py +++ b/src/semver/version.py @@ -64,8 +64,8 @@ class Version: See specification at https://semver.org. :param major: version when you make incompatible API changes. - :param minor: version when you add functionality in - a backwards-compatible manner. + :param minor: version when you add functionality in a backwards- + compatible manner. :param patch: version when you make backwards-compatible bug fixes. :param prerelease: an optional prerelease string :param build: an optional build string From 90c34840b1932d1dca5a975ac366be11e4a4f214 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Wed, 14 Jun 2023 12:48:17 +0200 Subject: [PATCH 10/51] Configure docformatter (#412) * Add config options to pyproject.toml * Call docformatter without any options in tox.ini as they are set in pyproject.toml now --- pyproject.toml | 9 +++++++++ src/semver/version.py | 3 +-- tox.ini | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e611abc4..6b12deb0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,6 +21,15 @@ target-version = ['py37', 'py38', 'py39', 'py310', 'py311'] # diff = true +[tool.docformatter] +wrap-summaries = 80 +close-quotes-on-newline = true +# make-summary-multi-line = true +black = true +pre-summary-newline = true +recursive = true + + [tool.towncrier] package = "semver" package_dir = "src" diff --git a/src/semver/version.py b/src/semver/version.py index af437296..d2f336c0 100644 --- a/src/semver/version.py +++ b/src/semver/version.py @@ -64,8 +64,7 @@ class Version: See specification at https://semver.org. :param major: version when you make incompatible API changes. - :param minor: version when you add functionality in a backwards- - compatible manner. + :param minor: version when you add functionality in a backwards-compatible manner. :param patch: version when you make backwards-compatible bug fixes. :param prerelease: an optional prerelease string :param build: an optional build string diff --git a/tox.ini b/tox.ini index fb91a518..94598c4c 100644 --- a/tox.ini +++ b/tox.ini @@ -56,7 +56,7 @@ commands = mypy {posargs:--ignore-missing-imports --check-untyped-defs src} description = Check for PEP257 compatible docstrings basepython = python3 deps = docformatter -commands = docformatter --check --diff {posargs:--pre-summary-newline -r src} +commands = docformatter --check --diff {posargs:src} [testenv:checks] From c2680608bc9b080a1f34161a36971e8331a19056 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Wed, 14 Jun 2023 13:41:24 +0200 Subject: [PATCH 11/51] Prepare version 3.0.1 (#413) * Raise version * Ignore exit code from docformatter in checks `tox.ini` * Correct typo in release-procedure.md * Update CHANGELOG.rst --- CHANGELOG.rst | 17 +++++++++++++++++ changelog.d/410.bugfix.rst | 1 - docs/usage/semver-version.rst | 2 +- release-procedure.md | 2 +- src/semver/__about__.py | 2 +- tox.ini | 5 +++-- 6 files changed, 23 insertions(+), 6 deletions(-) delete mode 100644 changelog.d/410.bugfix.rst diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 11b08e06..a773e1f3 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -18,6 +18,23 @@ This section covers the changes between major version 2 and version 3. .. towncrier release notes start +Version 3.0.1 +============= + +:Released: 2023-06-14 +:Maintainer: Tom Schraitle + + +Bug Fixes +--------- + +* :gh:`410`: Export functions properly using ``__all__`` in ``__init__.py``. + + + +---- + + Version 3.0.0 ============= diff --git a/changelog.d/410.bugfix.rst b/changelog.d/410.bugfix.rst deleted file mode 100644 index 1b2dcf74..00000000 --- a/changelog.d/410.bugfix.rst +++ /dev/null @@ -1 +0,0 @@ -Export functions properly using `__all__` in `__init__.py`. \ No newline at end of file diff --git a/docs/usage/semver-version.rst b/docs/usage/semver-version.rst index b7d5ed9e..0f2e2411 100644 --- a/docs/usage/semver-version.rst +++ b/docs/usage/semver-version.rst @@ -4,4 +4,4 @@ Getting the Version of semver To know the version of semver itself, use the following construct:: >>> semver.__version__ - '3.0.0' + '3.0.1' diff --git a/release-procedure.md b/release-procedure.md index f7b8d7bb..7476c79a 100644 --- a/release-procedure.md +++ b/release-procedure.md @@ -26,7 +26,7 @@ create a new release. : * `src/semver/__about__.py` - * `docs/usage.rst` + * `docs/usage/semver-version.rst` 1. Add eventually new contributor(s) to [CONTRIBUTORS](https://github.com/python-semver/python-semver/blob/master/CONTRIBUTORS). diff --git a/src/semver/__about__.py b/src/semver/__about__.py index 89c6412e..2eff8c86 100644 --- a/src/semver/__about__.py +++ b/src/semver/__about__.py @@ -16,7 +16,7 @@ """ #: Semver version -__version__ = "3.0.0" +__version__ = "3.0.1" #: Original semver author __author__ = "Kostiantyn Rybnikov" diff --git a/tox.ini b/tox.ini index 94598c4c..b18aa1f7 100644 --- a/tox.ini +++ b/tox.ini @@ -56,7 +56,8 @@ commands = mypy {posargs:--ignore-missing-imports --check-untyped-defs src} description = Check for PEP257 compatible docstrings basepython = python3 deps = docformatter -commands = docformatter --check --diff {posargs:src} +commands = + docformatter --check --diff {posargs:src} [testenv:checks] @@ -68,10 +69,10 @@ deps = {[testenv:mypy]deps} {[testenv:docstrings]deps} commands = + - {[testenv:docstrings]commands} {[testenv:black]commands} {[testenv:flake8]commands} {[testenv:mypy]commands} - {[testenv:docstrings]commands} [testenv:docs] From dcda25649ec87aa04cba5a0e1f00ab2713f2233d Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Wed, 14 Jun 2023 13:48:47 +0200 Subject: [PATCH 12/51] Fix minor issue in release-procedure.md Wrap commands in triple-backticks --- release-procedure.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/release-procedure.md b/release-procedure.md index 7476c79a..4225bfd9 100644 --- a/release-procedure.md +++ b/release-procedure.md @@ -99,14 +99,18 @@ create a new release. 1. Create a tag: - $ git tag -a x.x.x + ```bash + $ git tag -a x.y.z + ``` It's recommended to use the generated Tox output from the Changelog. 1. Push the tag: - $ git push --tags + ```bash + $ git push origin x.y.z + ``` 1. In [GitHub Release page](https://github.com/python-semver/python-semver/release) document the new release. From 72bf1c3d45792971ab49b24c2156d468270be491 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Thu, 15 Jun 2023 20:09:06 +0200 Subject: [PATCH 13/51] Create SUPPORT.md --- SUPPORT.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 SUPPORT.md diff --git a/SUPPORT.md b/SUPPORT.md new file mode 100644 index 00000000..4702eb08 --- /dev/null +++ b/SUPPORT.md @@ -0,0 +1,14 @@ +# Getting support + +If you need help, try these ways: + +* Ask your questions on the [discussion](https://github.com/python-semver/python-semver/discussions) page. + + Our forum is a good way to post your questions. +* Read the [python-semver documentation](https://python-semver.readthedocs.io/). + + The documentation contains all the information to install and use the library. +* Suggest a new feature or a new [issue](https://github.com/python-semver/python-semver/issues/new) + + If you found a problem or would like to suggest a new feature that could improve python-semver, + this is the place to go. From ca1fcd9ad9e26b6cd2f89a391cb4c635360e2522 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Fri, 30 Jun 2023 12:45:05 +0200 Subject: [PATCH 14/51] GHA: Use matrix to test MacOS too Related to issue #416 --- .github/workflows/python-testing.yml | 6 ++++-- changelog.d/pr417.feature.rst | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 changelog.d/pr417.feature.rst diff --git a/.github/workflows/python-testing.yml b/.github/workflows/python-testing.yml index 8f32ffd1..a6b51d73 100644 --- a/.github/workflows/python-testing.yml +++ b/.github/workflows/python-testing.yml @@ -68,9 +68,10 @@ jobs: tests: needs: check - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} strategy: max-parallel: 5 + fail-fast: true matrix: python-version: ["3.7", "3.8", @@ -79,10 +80,11 @@ jobs: "3.11", # "3.12-dev" ] + os: [ubuntu-latest, "macos-latest"] steps: - uses: actions/checkout@v3 - - name: Set up Python ${{ matrix.python-version }} + - name: Set up Python ${{ matrix.python-version }} for ${{ matrix.os }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} diff --git a/changelog.d/pr417.feature.rst b/changelog.d/pr417.feature.rst new file mode 100644 index 00000000..c33a3704 --- /dev/null +++ b/changelog.d/pr417.feature.rst @@ -0,0 +1 @@ +Amend GitHub Actions to check against MacOS. From 655a7d068203907330ae076d53b49f69c2f533bc Mon Sep 17 00:00:00 2001 From: David Bold Date: Wed, 12 Jul 2023 18:14:53 +0200 Subject: [PATCH 15/51] Return dict instead of OrderedDict (#419) dict is guaranteed to preserve order in all supported versions --- changelog.d/pr418.bugfix.rst | 5 ++++ .../convert-version-into-different-types.rst | 2 +- docs/usage/create-a-version.rst | 2 +- src/semver/version.py | 24 ++++++++----------- 4 files changed, 17 insertions(+), 16 deletions(-) create mode 100644 changelog.d/pr418.bugfix.rst diff --git a/changelog.d/pr418.bugfix.rst b/changelog.d/pr418.bugfix.rst new file mode 100644 index 00000000..6f037102 --- /dev/null +++ b/changelog.d/pr418.bugfix.rst @@ -0,0 +1,5 @@ +Replace :class:`~collection.OrderedDict` with :class:`dict`. + +The dict datatype is ordered since Python 3.7. As we do not support +Python 3.6 anymore, it can be considered safe to avoid :class:`~collection.OrderedDict`. +Related to :gh:`419`. diff --git a/docs/usage/convert-version-into-different-types.rst b/docs/usage/convert-version-into-different-types.rst index 6948438c..6a447d0d 100644 --- a/docs/usage/convert-version-into-different-types.rst +++ b/docs/usage/convert-version-into-different-types.rst @@ -17,7 +17,7 @@ It is possible to convert a :class:`~semver.version.Version` instance: >>> v = Version(major=3, minor=4, patch=5) >>> v.to_dict() - OrderedDict([('major', 3), ('minor', 4), ('patch', 5), ('prerelease', None), ('build', None)]) + {'major': 3, 'minor': 4, 'patch': 5, 'prerelease': None, 'build': None} * Into a tuple with :meth:`~semver.version.Version.to_tuple`:: diff --git a/docs/usage/create-a-version.rst b/docs/usage/create-a-version.rst index 48bb58a1..b8dfdd83 100644 --- a/docs/usage/create-a-version.rst +++ b/docs/usage/create-a-version.rst @@ -90,7 +90,7 @@ Depending on your use case, the following methods are available: To access individual parts, you can use the function :func:`semver.parse`:: >>> semver.parse("3.4.5-pre.2+build.4") - OrderedDict([('major', 3), ('minor', 4), ('patch', 5), ('prerelease', 'pre.2'), ('build', 'build.4')]) + {'major': 3, 'minor': 4, 'patch': 5, 'prerelease': 'pre.2', 'build': 'build.4'} If you pass an invalid version string you will get a :py:exc:`ValueError`:: diff --git a/src/semver/version.py b/src/semver/version.py index d2f336c0..96040cef 100644 --- a/src/semver/version.py +++ b/src/semver/version.py @@ -1,6 +1,5 @@ """Version handling by a semver compatible version class.""" -import collections import re from functools import wraps from typing import ( @@ -218,27 +217,24 @@ def to_tuple(self) -> VersionTuple: def to_dict(self) -> VersionDict: """ - Convert the Version object to an OrderedDict. + Convert the Version object to an dict. .. versionadded:: 2.10.0 Renamed :meth:`Version._asdict` to :meth:`Version.to_dict` to make this function available in the public API. - :return: an OrderedDict with the keys in the order ``major``, ``minor``, + :return: an dict with the keys in the order ``major``, ``minor``, ``patch``, ``prerelease``, and ``build``. >>> semver.Version(3, 2, 1).to_dict() - OrderedDict([('major', 3), ('minor', 2), ('patch', 1), \ -('prerelease', None), ('build', None)]) - """ - return collections.OrderedDict( - ( - ("major", self.major), - ("minor", self.minor), - ("patch", self.patch), - ("prerelease", self.prerelease), - ("build", self.build), - ) + {'major': 3, 'minor': 2, 'patch': 1, 'prerelease': None, 'build': None} + """ + return dict( + major=self.major, + minor=self.minor, + patch=self.patch, + prerelease=self.prerelease, + build=self.build, ) def __iter__(self) -> VersionIterator: From 50532e767c7656eb7cd0585b04bff3111096bbe1 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Sun, 23 Jul 2023 09:23:57 +0200 Subject: [PATCH 16/51] Use actions/setup-python@v4 instead of v3 --- .github/workflows/python-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-testing.yml b/.github/workflows/python-testing.yml index a6b51d73..f6decc03 100644 --- a/.github/workflows/python-testing.yml +++ b/.github/workflows/python-testing.yml @@ -54,7 +54,7 @@ jobs: echo "\n" echo "::debug::---end" - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v3 + uses: actions/setup-python@v4 with: python-version: 3.8 cache: 'pip' From 6a90bd3a55e13715e309c4933740a16eee534e3a Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Sun, 23 Jul 2023 09:32:43 +0200 Subject: [PATCH 17/51] Introduce ClassVar type Use it for class variables NAMES, _LAST_NUMBER, _REGEX_TEMPLATE, _REGEX, and _REGEX_OPTIONAL_MINOR_AND_PATCH. --- changelog.d/pr420.trivial.rst | 2 ++ pyproject.toml | 1 - src/semver/version.py | 14 +++++++++----- 3 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 changelog.d/pr420.trivial.rst diff --git a/changelog.d/pr420.trivial.rst b/changelog.d/pr420.trivial.rst new file mode 100644 index 00000000..234ecdbe --- /dev/null +++ b/changelog.d/pr420.trivial.rst @@ -0,0 +1,2 @@ +Introduce :py:class:`~typing.ClassVar` for some :class:`~semver.version.Version` +class variables, mainly :data:`~semver.version.Version.NAMES` and some private. diff --git a/pyproject.toml b/pyproject.toml index 6b12deb0..e26c034c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,6 @@ requires = [ build-backend = "setuptools.build_meta" - [tool.black] line-length = 88 target-version = ['py37', 'py38', 'py39', 'py310', 'py311'] diff --git a/src/semver/version.py b/src/semver/version.py index 96040cef..c84f2328 100644 --- a/src/semver/version.py +++ b/src/semver/version.py @@ -4,9 +4,11 @@ from functools import wraps from typing import ( Any, + ClassVar, Dict, Iterable, Optional, + Pattern, SupportsInt, Tuple, Union, @@ -72,12 +74,14 @@ class Version: __slots__ = ("_major", "_minor", "_patch", "_prerelease", "_build") #: The names of the different parts of a version - NAMES = tuple([item[1:] for item in __slots__]) + NAMES: ClassVar[Tuple[str, ...]] = tuple([item[1:] for item in __slots__]) #: Regex for number in a prerelease - _LAST_NUMBER = re.compile(r"(?:[^\d]*(\d+)[^\d]*)+") + _LAST_NUMBER: ClassVar[Pattern] = re.compile(r"(?:[^\d]*(\d+)[^\d]*)+") #: Regex template for a semver version - _REGEX_TEMPLATE = r""" + _REGEX_TEMPLATE: ClassVar[ + str + ] = r""" ^ (?P0|[1-9]\d*) (?: @@ -99,12 +103,12 @@ class Version: $ """ #: Regex for a semver version - _REGEX = re.compile( + _REGEX: ClassVar[Pattern] = re.compile( _REGEX_TEMPLATE.format(opt_patch="", opt_minor=""), re.VERBOSE, ) #: Regex for a semver version that might be shorter - _REGEX_OPTIONAL_MINOR_AND_PATCH = re.compile( + _REGEX_OPTIONAL_MINOR_AND_PATCH: ClassVar[Pattern] = re.compile( _REGEX_TEMPLATE.format(opt_patch="?", opt_minor="?"), re.VERBOSE, ) From 9b332b030b03bba1d50ce9a0df6efde8954c0c65 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Sun, 23 Jul 2023 10:30:24 +0200 Subject: [PATCH 18/51] Issue #420: add missing [str] for Pattern type --- src/semver/version.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/semver/version.py b/src/semver/version.py index c84f2328..9a7a4ffc 100644 --- a/src/semver/version.py +++ b/src/semver/version.py @@ -77,7 +77,7 @@ class Version: NAMES: ClassVar[Tuple[str, ...]] = tuple([item[1:] for item in __slots__]) #: Regex for number in a prerelease - _LAST_NUMBER: ClassVar[Pattern] = re.compile(r"(?:[^\d]*(\d+)[^\d]*)+") + _LAST_NUMBER: ClassVar[Pattern[str]] = re.compile(r"(?:[^\d]*(\d+)[^\d]*)+") #: Regex template for a semver version _REGEX_TEMPLATE: ClassVar[ str @@ -103,12 +103,12 @@ class Version: $ """ #: Regex for a semver version - _REGEX: ClassVar[Pattern] = re.compile( + _REGEX: ClassVar[Pattern[str]] = re.compile( _REGEX_TEMPLATE.format(opt_patch="", opt_minor=""), re.VERBOSE, ) #: Regex for a semver version that might be shorter - _REGEX_OPTIONAL_MINOR_AND_PATCH: ClassVar[Pattern] = re.compile( + _REGEX_OPTIONAL_MINOR_AND_PATCH: ClassVar[Pattern[str]] = re.compile( _REGEX_TEMPLATE.format(opt_patch="?", opt_minor="?"), re.VERBOSE, ) From 96d309511014350ab01aeff17bd4c31bce26818f Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Sun, 23 Jul 2023 09:32:43 +0200 Subject: [PATCH 19/51] Insert mypy config into pyproject.toml Insert mypy configuration into pyproject.toml and remove config options from tox.ini. --- changelog.d/pr421.trivial.rst | 2 ++ pyproject.toml | 8 ++++++++ tox.ini | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 changelog.d/pr421.trivial.rst diff --git a/changelog.d/pr421.trivial.rst b/changelog.d/pr421.trivial.rst new file mode 100644 index 00000000..b00b9e55 --- /dev/null +++ b/changelog.d/pr421.trivial.rst @@ -0,0 +1,2 @@ +Insert mypy configuration into :file:`pyproject.toml` and remove +config options from :file:`tox.ini`. diff --git a/pyproject.toml b/pyproject.toml index e26c034c..64c9a32c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,6 +14,14 @@ requires = [ build-backend = "setuptools.build_meta" +[tool.mypy] +# ignore_missing_imports = true +check_untyped_defs = true +show_error_codes = true +# strict = true +pretty = true + + [tool.black] line-length = 88 target-version = ['py37', 'py38', 'py39', 'py310', 'py311'] diff --git a/tox.ini b/tox.ini index b18aa1f7..1bc77e1b 100644 --- a/tox.ini +++ b/tox.ini @@ -49,7 +49,7 @@ commands = flake8 {posargs:} description = Check code style basepython = python3 deps = mypy -commands = mypy {posargs:--ignore-missing-imports --check-untyped-defs src} +commands = mypy {posargs:src} [testenv:docstrings] From 2ae1a215fc5290559025a43acf7aa2b07a5c49a6 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Thu, 27 Jul 2023 20:05:58 +0200 Subject: [PATCH 20/51] Fix #422: Update advanced topic about Pydantic v2 --- docs/advanced/combine-pydantic-and-semver.rst | 60 +++++++++++++------ 1 file changed, 42 insertions(+), 18 deletions(-) diff --git a/docs/advanced/combine-pydantic-and-semver.rst b/docs/advanced/combine-pydantic-and-semver.rst index a00c2cff..1b68a59f 100644 --- a/docs/advanced/combine-pydantic-and-semver.rst +++ b/docs/advanced/combine-pydantic-and-semver.rst @@ -5,35 +5,59 @@ According to its homepage, `Pydantic `_ "enforces type hints at runtime, and provides user friendly errors when data is invalid." -To work with Pydantic, use the following steps: +To work with Pydantic>2.0, use the following steps: 1. Derive a new class from :class:`~semver.version.Version` - first and add the magic methods :py:meth:`__get_validators__` - and :py:meth:`__modify_schema__` like this: + first and add the magic methods :py:meth:`__get_pydantic_core_schema__` + and :py:meth:`__get_pydantic_json_schema__` like this: .. code-block:: python + from typing import Annotated, Any, Callable + from pydantic import GetJsonSchemaHandler + from pydantic_core import core_schema + from pydantic.json_schema import JsonSchemaValue from semver import Version - class PydanticVersion(Version): - @classmethod - def _parse(cls, version): - return cls.parse(version) + class _VersionPydanticAnnotation: @classmethod - def __get_validators__(cls): - """Return a list of validator methods for pydantic models.""" - yield cls._parse + def __get_pydantic_core_schema__( + cls, + _source_type: Any, + _handler: Callable[[Any], core_schema.CoreSchema], + ) -> core_schema.CoreSchema: + def validate_from_str(value: str) -> Version: + return Version.parse(value) + + from_str_schema = core_schema.chain_schema( + [ + core_schema.str_schema(), + core_schema.no_info_plain_validator_function(validate_from_str), + ] + ) + + return core_schema.json_or_python_schema( + json_schema=from_str_schema, + python_schema=core_schema.union_schema( + [ + core_schema.is_instance_schema(Version), + from_str_schema, + ] + ), + serialization=core_schema.plain_serializer_function_ser_schema( + lambda instance: instance.x + ), + ) @classmethod - def __modify_schema__(cls, field_schema): - """Inject/mutate the pydantic field schema in-place.""" - field_schema.update(examples=["1.0.2", - "2.15.3-alpha", - "21.3.15-beta+12345", - ] - ) + def __get_pydantic_json_schema__( + cls, _core_schema: core_schema.CoreSchema, handler: GetJsonSchemaHandler + ) -> JsonSchemaValue: + return handler(core_schema.str_schema()) + + ManifestVersion = Annotated[Version, _VersionPydanticAnnotation] 2. Create a new model (in this example :class:`MyModel`) and derive it from :class:`pydantic.BaseModel`: @@ -43,7 +67,7 @@ To work with Pydantic, use the following steps: import pydantic class MyModel(pydantic.BaseModel): - version: PydanticVersion + version: _VersionPydanticAnnotation 3. Use your model like this: From 4b03f867a3deaecb07240f471fed9bf9c9072629 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Thu, 28 Sep 2023 14:31:42 +0200 Subject: [PATCH 21/51] Fix #426: call subclass when deriving from Version When using the replace method, an instance of the Version class is created and not the respective subclass. Co-authored-by: Danny Staple --- changelog.d/426.bugfix.rst | 2 ++ src/semver/version.py | 6 +++--- tests/test_subclass.py | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 changelog.d/426.bugfix.rst diff --git a/changelog.d/426.bugfix.rst b/changelog.d/426.bugfix.rst new file mode 100644 index 00000000..2c2d0eac --- /dev/null +++ b/changelog.d/426.bugfix.rst @@ -0,0 +1,2 @@ +Fix :meth:`~semver.version.Version.replace` method to use the derived class +of an instance instead of :class:`~semver.version.Version` class. diff --git a/src/semver/version.py b/src/semver/version.py index 9a7a4ffc..29309ab4 100644 --- a/src/semver/version.py +++ b/src/semver/version.py @@ -655,8 +655,8 @@ def parse( def replace(self, **parts: Union[int, Optional[str]]) -> "Version": """ - Replace one or more parts of a version and return a new - :class:`Version` object, but leave self untouched + Replace one or more parts of a version and return a new :class:`Version` + object, but leave self untouched. .. versionadded:: 2.9.0 Added :func:`Version.replace` @@ -670,7 +670,7 @@ def replace(self, **parts: Union[int, Optional[str]]) -> "Version": version = self.to_dict() version.update(parts) try: - return Version(**version) # type: ignore + return type(self)(**version) # type: ignore except TypeError: unknownkeys = set(parts) - set(self.to_dict()) error = "replace() got %d unexpected keyword argument(s): %s" % ( diff --git a/tests/test_subclass.py b/tests/test_subclass.py index cbf9d271..b33f4969 100644 --- a/tests/test_subclass.py +++ b/tests/test_subclass.py @@ -17,3 +17,37 @@ def __str__(self): v = SemVerWithVPrefix.parse("v1.2.3") assert str(v) == "v1.2.3" + + +def test_replace_from_subclass(): + # Issue#426 + # Taken from the example "Creating Subclasses from Version" + class SemVerWithVPrefix(Version): + """ + A subclass of Version which allows a "v" prefix + """ + + @classmethod + def parse(cls, version: str) -> "SemVerWithVPrefix": + """ + Parse version string to a Version instance. + + :param version: version string with "v" or "V" prefix + :raises ValueError: when version does not start with "v" or "V" + :return: a new instance + """ + if not version[0] in ("v", "V"): + raise ValueError( + f"{version!r}: not a valid semantic version tag. " + "Must start with 'v' or 'V'" + ) + return super().parse(version[1:], optional_minor_and_patch=True) + + def __str__(self) -> str: + # Reconstruct the tag + return "v" + super().__str__() + + version = SemVerWithVPrefix.parse("v1.1.0") + dev_version = version.replace(prerelease="dev.0") + + assert str(dev_version) == "v1.1.0-dev.0" From 2dda51c0b3d0956187533210927533af50bf6175 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Fri, 29 Sep 2023 14:34:57 +0200 Subject: [PATCH 22/51] GHA: Require setuptool>60 and setuptools-scm>60 --- .github/workflows/python-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-testing.yml b/.github/workflows/python-testing.yml index f6decc03..adb06d4a 100644 --- a/.github/workflows/python-testing.yml +++ b/.github/workflows/python-testing.yml @@ -60,7 +60,7 @@ jobs: cache: 'pip' - name: Install dependencies run: | - python3 -m pip install --upgrade pip setuptools setuptools-scm + python3 -m pip install --upgrade pip setuptools>60 setuptools-scm>=60 pip install tox tox-gh-actions - name: Check run: | From 8ac99bd6068ebf3a508fbe1fd109f0d49e7f9378 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Thu, 27 Jul 2023 21:55:51 +0200 Subject: [PATCH 23/51] Only run GHA if project files are modified There is no need to run the test suite when docs files are modified. --- .github/workflows/python-testing.yml | 69 +++++++++++++++++++--------- 1 file changed, 47 insertions(+), 22 deletions(-) diff --git a/.github/workflows/python-testing.yml b/.github/workflows/python-testing.yml index f6decc03..5c52af69 100644 --- a/.github/workflows/python-testing.yml +++ b/.github/workflows/python-testing.yml @@ -1,20 +1,23 @@ --- name: Python +# HINT: Sync this paths with the egrep in step check_files on: push: branches: [ "master", "main" ] paths: - 'pyproject.toml' + - 'setup.cfg' - '**.py' - - '.github/workflows/python-testing.yml' + - '.github/workflows/*.yml' pull_request: branches: [ "master", "main" ] paths: - 'pyproject.toml' + - 'setup.cfg' - '**.py' - - '.github/workflows/python-testing.yml' + - '.github/workflows/*.yml' permissions: contents: read @@ -22,37 +25,59 @@ permissions: concurrency: # only cancel in-progress runs of the same workflow group: ${{ github.workflow }}-${{ github.ref }} - # ${{ github.head_ref || github.run_id }} cancel-in-progress: true jobs: + check-files: + runs-on: ubuntu-latest + outputs: + can_run: ${{ steps.check_files.outputs.can_run }} + + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: GitHub variables + id: gh-vars + run: | + for var in GITHUB_WORKFLOW GITHUB_ACTION GITHUB_ACTIONS GITHUB_REPOSITORY GITHUB_EVEN_NAME GITHUB_EVENT_PATH GITHUB_WORKSPACE GITHUB_SHA GITHUB_REF GITHUB_HEAD_REF GITHUB_BASE_REF; do + echo "$var = ${!var}" + done + + - name: Check for file changes + id: check_files + run: | + # ${{ github.event.after }} ${{ github.event.before }} + can_run=$(git diff --name-only HEAD~1 HEAD | \ + egrep -q '.github/workflows/|pyproject.toml|setup.cfg|\.py$' && echo 1 || echo 0) + echo "can_run=$can_run" + echo "can_run=$can_run" >> $GITHUB_OUTPUT + + skip_test: + runs-on: ubuntu-latest + needs: check-files + timeout-minutes: 2 + if: ${{ needs.check-files.outputs.can_run == '0' }} + + steps: + - name: Skip test + run: | + echo "Nothing to do as no TOML, Python, or YAML file has been changed. + " + echo "Skipping." + check: runs-on: ubuntu-latest + needs: check-files # Timout of 15min timeout-minutes: 15 + # needs.check-files.outputs.can_run + if: ${{ needs.check-files.outputs.can_run == '1' }} steps: - uses: actions/checkout@v3 - - name: Output env variables - run: | - echo "Default branch=${default-branch}" - echo "GITHUB_WORKFLOW=${GITHUB_WORKFLOW}" - echo "GITHUB_ACTION=$GITHUB_ACTION" - echo "GITHUB_ACTIONS=$GITHUB_ACTIONS" - echo "GITHUB_ACTOR=$GITHUB_ACTOR" - echo "GITHUB_REPOSITORY=$GITHUB_REPOSITORY" - echo "GITHUB_EVENT_NAME=$GITHUB_EVENT_NAME" - echo "GITHUB_EVENT_PATH=$GITHUB_EVENT_PATH" - echo "GITHUB_WORKSPACE=$GITHUB_WORKSPACE" - echo "GITHUB_SHA=$GITHUB_SHA" - echo "GITHUB_REF=$GITHUB_REF" - echo "GITHUB_HEAD_REF=$GITHUB_HEAD_REF" - echo "GITHUB_BASE_REF=$GITHUB_BASE_REF" - echo "::debug::---Start content of file $GITHUB_EVENT_PATH" - cat $GITHUB_EVENT_PATH - echo "\n" - echo "::debug::---end" - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: From 1aad4adba78e7c4882927bd7dabe2ba00f460400 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Wed, 20 Sep 2023 13:38:17 +0200 Subject: [PATCH 24/51] Improve documentation wording & consistency --- README.rst | 2 +- docs/contribute/doc-semver.rst | 18 ++++++++++----- .../replace-deprecated-functions.rst | 23 +++++++++---------- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/README.rst b/README.rst index ede10a18..122c12a8 100644 --- a/README.rst +++ b/README.rst @@ -3,7 +3,7 @@ Quickstart .. teaser-begin -A Python module for `semantic versioning`_. Simplifies comparing versions. +A Python module to simplify `semantic versioning`_. |GHAction| |python-support| |downloads| |license| |docs| |black| |openissues| |GHDiscussion| diff --git a/docs/contribute/doc-semver.rst b/docs/contribute/doc-semver.rst index fcc6c1ac..e5237eaf 100644 --- a/docs/contribute/doc-semver.rst +++ b/docs/contribute/doc-semver.rst @@ -19,13 +19,19 @@ used efficiently. A new feature is *not* complete if it isn't proberly documented. A good documentation includes: + * **Type annotations** + + This library supports type annotations. Therefore, each function + or method requires types for each arguments and return objects. + Exception of this rule is ``self``. + * **A docstring** Each docstring contains a summary line, a linebreak, an optional directive (see next item), the description of its arguments in `Sphinx style`_, and an optional doctest. The docstring is extracted and reused in the :ref:`api` section. - An appropriate docstring should look like this:: + An appropriate docstring looks like this:: def to_tuple(self) -> VersionTuple: """ @@ -70,11 +76,11 @@ documentation includes: * **The documentation** - A docstring is good, but in most cases it's too dense. API documentation - cannot replace a good user documentation. Describe how - to use your new feature in our documentation. Here you can give your - readers more examples, describe it in a broader context or show - edge cases. + A docstring is good, but in most cases it is too short. API documentation + cannot replace good user documentation. + Describe *how* to use your new feature in the documentation. + Here you can give your readers more examples, describe it in a broader + context, or show edge cases. .. _Sphinx style: https://sphinx-rtd-tutorial.rtfd.io/en/latest/docstrings.html diff --git a/docs/migration/replace-deprecated-functions.rst b/docs/migration/replace-deprecated-functions.rst index ebe8c354..2fe1bb2d 100644 --- a/docs/migration/replace-deprecated-functions.rst +++ b/docs/migration/replace-deprecated-functions.rst @@ -8,19 +8,18 @@ Replacing Deprecated Functions the module level. The preferred way of using semver is through the :class:`~semver.version.Version` class. -The deprecated functions can still be used in version 2.10.0 and above. In version 3 of -semver, the deprecated functions will be removed. +The deprecated functions can still be used in version 2.10.0 and above. However, in +future versions of semver, the deprecated functions will be removed. The following list shows the deprecated functions and how you can replace them with code which is compatible for future versions: - * :func:`semver.bump_major`, :func:`semver.bump_minor`, :func:`semver.bump_patch`, :func:`semver.bump_prerelease`, :func:`semver.bump_build` Replace them with the respective methods of the :class:`~semver.version.Version` class. For example, the function :func:`semver.bump_major` is replaced by - :meth:`~semver.version.Version.bump_major` and calling the ``str(versionobject)``: + :meth:`Version.bump_major ` and calling the ``str(versionobject)``: .. code-block:: python @@ -31,14 +30,14 @@ them with code which is compatible for future versions: Likewise with the other module level functions. -* :func:`semver.Version.isvalid` +* :meth:`semver.Version.isvalid` - Replace it with :meth:`semver.version.Version.is_valid`: + Replace it with :meth:`Version.is_valid `: * :func:`semver.finalize_version` - Replace it with :func:`semver.version.Version.finalize_version`: + Replace it with :meth:`Version.finalize_version `: .. code-block:: python @@ -71,7 +70,7 @@ them with code which is compatible for future versions: * :func:`semver.min_ver` - Replace it with ``min(version1, version2, ...)`` or ``min([version1, version2, ...])``: + Replace it with ``min(version1, version2, ...)`` or ``min([version1, version2, ...])`` and a ``key``: .. code-block:: python @@ -82,8 +81,8 @@ them with code which is compatible for future versions: * :func:`semver.parse` - Replace it with :meth:`semver.version.Version.parse` and call - :meth:`semver.version.Version.to_dict`: + Replace it with :meth:`Version.parse ` and call + :meth:`Version.to_dict `: .. code-block:: python @@ -94,7 +93,7 @@ them with code which is compatible for future versions: * :func:`semver.parse_version_info` - Replace it with :meth:`semver.version.Version.parse`: + Replace it with :meth:`Version.parse `: .. code-block:: python @@ -105,7 +104,7 @@ them with code which is compatible for future versions: * :func:`semver.replace` - Replace it with :meth:`semver.version.Version.replace`: + Replace it with :meth:`Version.replace `: .. code-block:: python From a951c8a24fd5557622240de504c667e3900f3be5 Mon Sep 17 00:00:00 2001 From: Apiwat Chantawibul Date: Sat, 7 Oct 2023 02:20:45 +0700 Subject: [PATCH 25/51] Fix #429: bug on serialization to json --- docs/advanced/combine-pydantic-and-semver.rst | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/advanced/combine-pydantic-and-semver.rst b/docs/advanced/combine-pydantic-and-semver.rst index 1b68a59f..840ddbd4 100644 --- a/docs/advanced/combine-pydantic-and-semver.rst +++ b/docs/advanced/combine-pydantic-and-semver.rst @@ -46,9 +46,7 @@ To work with Pydantic>2.0, use the following steps: from_str_schema, ] ), - serialization=core_schema.plain_serializer_function_ser_schema( - lambda instance: instance.x - ), + serialization = core_schema.to_string_ser_schema(), ) @classmethod From 9391f8a9bf8762c897138e33922e08151a8ef53f Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Mon, 9 Oct 2023 09:43:53 +0200 Subject: [PATCH 26/51] Rename a news fragment for Towncrier --- changelog.d/{426.bugfix.rst => pr426.bugfix.rst} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename changelog.d/{426.bugfix.rst => pr426.bugfix.rst} (100%) diff --git a/changelog.d/426.bugfix.rst b/changelog.d/pr426.bugfix.rst similarity index 100% rename from changelog.d/426.bugfix.rst rename to changelog.d/pr426.bugfix.rst From 083b592c7dee31fbc54ea7a12f6912a772a1a5fa Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Mon, 9 Oct 2023 09:39:10 +0200 Subject: [PATCH 27/51] Clarify version policy for semver Integrate additional topic that describes an high level overview about semver v2, v3, and v3 and beyond. Also revise section about "Release Policy" which is related. First mention semver3 and use semver2 later. --- README.rst | 15 ++---------- changelog.d/pr431.doc.rst | 2 ++ docs/index.rst | 1 + docs/install.rst | 21 +++++++--------- docs/version-policy.rst | 50 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 63 insertions(+), 26 deletions(-) create mode 100644 changelog.d/pr431.doc.rst create mode 100644 docs/version-policy.rst diff --git a/README.rst b/README.rst index 122c12a8..ee2ab44d 100644 --- a/README.rst +++ b/README.rst @@ -12,19 +12,8 @@ A Python module to simplify `semantic versioning`_. .. note:: - This project works for Python 3.7 and greater only. If you are - looking for a compatible version for Python 2, use the - maintenance branch |MAINT|_. - - The last version of semver which supports Python 2.7 to 3.5 will be - 2.x.y However, keep in mind, the major 2 release is frozen: no new - features nor backports will be integrated. - - We recommend to upgrade your workflow to Python 3 to gain support, - bugfixes, and new features. - -.. |MAINT| replace:: ``maint/v2`` -.. _MAINT: https://github.com/python-semver/python-semver/tree/maint/v2 + This project works for Python 3.7 and greater only. + Refer to :ref:`version-policy` for more details. The module follows the ``MAJOR.MINOR.PATCH`` style: diff --git a/changelog.d/pr431.doc.rst b/changelog.d/pr431.doc.rst new file mode 100644 index 00000000..ad54c962 --- /dev/null +++ b/changelog.d/pr431.doc.rst @@ -0,0 +1,2 @@ +Clarify version policy for the different semver versions (v2, v3, >v3) +and the supported Python versions. diff --git a/docs/index.rst b/docs/index.rst index 1054c225..0f1f32d6 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -16,6 +16,7 @@ Semver |version| -- Semantic Versioning migration/index advanced/index contribute/index + version-policy api .. toctree:: diff --git a/docs/install.rst b/docs/install.rst index 5404882f..dee441de 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -6,25 +6,20 @@ Release Policy As semver uses `Semantic Versioning`_, breaking changes are only introduced in major releases (incremented ``X`` in "X.Y.Z"). +Refer to section :ref:`version-policy` for a general overview. -For users who want to stay with major 2 releases only, add the following version -restriction:: +For users who want or need to stay with major 3 releases only, add the +following version restriction (:file:`setup.py`, :file:`requirements.txt`, +or :file:`pyproject.toml`):: - semver>=2,<3 - -This line avoids surprises. You will get any updates within the major 2 release like -2.11.0 or above. However, you will never get an update for semver 3.0.0. + semver>=3,<4 -Keep in mind, as this line avoids any major version updates, you also will never -get new exciting features or bug fixes. +This line avoids surprises. You will get any updates within the major 3 release like 3.1.x and above. However, you will never get an update for semver 4.0.0. -Same applies for semver v3, if you want to get all updates for the semver v3 -development line, but not a major update to semver v4:: +For users who have to stay with major 2 releases only, use the following line:: - semver>=3,<4 + semver>=2,<3 -You can add this line in your file :file:`setup.py`, :file:`requirements.txt`, -:file:`pyproject.toml`, or any other file that lists your dependencies. Pip --- diff --git a/docs/version-policy.rst b/docs/version-policy.rst new file mode 100644 index 00000000..a6eac5cc --- /dev/null +++ b/docs/version-policy.rst @@ -0,0 +1,50 @@ +.. _version-policy: + +Version Policy +============== + +.. |MAINT| replace:: ``maint/v2`` +.. _MAINT: https://github.com/python-semver/python-semver/tree/maint/v2 +.. |CHANGELOG| replace:: ``Changelog`` +.. _CHANGELOG: https://github.com/python-semver/python-semver/blob/maint/v2/CHANGELOG.rst + +The move from v2 to v3 introduced many changes and deprecated module functions. +The main functionality is handled by the :class:`~semver.version.Version` class +now. Find more information in the section :ref:`semver2-to-3`. + + +semver Version 2 +---------------- + +Active development of major version 2 has stopped. No new features nor +backports will be integrated. +We recommend to upgrade your workflow to Python 3 to gain support, +bugfixes, and new features. + +If you still need this old version, use the |MAINT|_ branch. There you +can look for the |CHANGELOG|_ if you need some details about the history. + + +semver Version 3 +---------------- + +We will not intentionally make breaking changes in minor releases of V3. + +Methods marked as ``deprecated`` raise a warning message when used from the :py:mod:`warnings` module. +Check section :ref:`sec_replace_deprecated_functions` to make your code +ready for future major releases. + + +semver Version 3 and beyond +--------------------------- + +Methods that were marked as deprecated will be very likely be removed. + + +Support for Python versions +--------------------------- + +This project will drop support for a Python version when the +following conditions are met: + +* The Python version has reached `EOL `_. From 23e0e73ebc3c33339bc46cede443ff5059fc9367 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Mon, 9 Oct 2023 10:55:12 +0200 Subject: [PATCH 28/51] Improve external docs with intersphinx extension * Downloads the inventories for Python and Pydantic * Use the correct :ref: syntax ("INVENTORY_NAME:OBJECT") --- changelog.d/432.doc.rst | 2 + docs/advanced/combine-pydantic-and-semver.rst | 4 +- docs/changelog-semver3-devel.rst | 40 ++++++------- docs/conf.py | 7 ++- docs/inventories/pydantic.inv | Bin 0 -> 4080 bytes docs/inventories/python-objects.inv | Bin 130055 -> 134114 bytes .../replace-deprecated-functions.rst | 56 ++++++++++++------ docs/usage/access-parts-of-a-version.rst | 2 +- docs/usage/access-parts-through-index.rst | 2 +- docs/usage/compare-versions.rst | 4 +- docs/usage/create-a-version.rst | 8 +-- docs/version-policy.rst | 4 +- 12 files changed, 79 insertions(+), 50 deletions(-) create mode 100644 changelog.d/432.doc.rst create mode 100644 docs/inventories/pydantic.inv diff --git a/changelog.d/432.doc.rst b/changelog.d/432.doc.rst new file mode 100644 index 00000000..ab09b96c --- /dev/null +++ b/changelog.d/432.doc.rst @@ -0,0 +1,2 @@ +Improve external doc links to Python and Pydantic. + diff --git a/docs/advanced/combine-pydantic-and-semver.rst b/docs/advanced/combine-pydantic-and-semver.rst index 840ddbd4..3236c2a2 100644 --- a/docs/advanced/combine-pydantic-and-semver.rst +++ b/docs/advanced/combine-pydantic-and-semver.rst @@ -58,7 +58,7 @@ To work with Pydantic>2.0, use the following steps: ManifestVersion = Annotated[Version, _VersionPydanticAnnotation] 2. Create a new model (in this example :class:`MyModel`) and derive - it from :class:`pydantic.BaseModel`: + it from :py:class:`pydantic:pydantic.BaseModel`: .. code-block:: python @@ -76,4 +76,4 @@ To work with Pydantic>2.0, use the following steps: The attribute :py:attr:`model.version` will be an instance of :class:`~semver.version.Version`. If the version is invalid, the construction will raise a - :py:exc:`pydantic.ValidationError`. + :py:class:`pydantic:pydantic_core.ValidationError`. diff --git a/docs/changelog-semver3-devel.rst b/docs/changelog-semver3-devel.rst index 2d40635d..75579d0f 100644 --- a/docs/changelog-semver3-devel.rst +++ b/docs/changelog-semver3-devel.rst @@ -132,11 +132,11 @@ Improved Documentation :class:`~semver.version.Version` class * Remove semver. prefix in doctests to make examples shorter * Correct some references to dunder methods like - :func:`~.semver.version.Version.__getitem__`, - :func:`~.semver.version.Version.__gt__` etc. + :func:`~semver.version.Version.__getitem__`, + :func:`~semver.version.Version.__gt__` etc. * Remove inconsistencies and mention module level function as deprecated and discouraged from using - * Make empty :py:func:`super` call in :file:`semverwithvprefix.py` example + * Make empty :py:class:`python:super` call in :file:`semverwithvprefix.py` example * :gh:`315`: Improve release procedure text @@ -151,34 +151,32 @@ Trivial/Internal Changes The following functions got renamed: - * function ``semver.version.comparator`` got renamed to + * function :func:`semver.version.comparator` got renamed to :func:`semver.version._comparator` as it is only useful inside the :class:`~semver.version.Version` class. - * function ``semver.version.cmp`` got renamed to + * function :func:`semver.version.cmp` got renamed to :func:`semver.version._cmp` as it is only useful inside the :class:`~semver.version.Version` class. The following functions got integrated into the :class:`~semver.version.Version` class: - * function ``semver.version._nat_cmd`` as a classmethod - * function ``semver.version.ensure_str`` + * function :func:`semver.version._nat_cmd` as a classmethod + * function :func:`semver.version.ensure_str` * :gh:`313`: Correct :file:`tox.ini` for ``changelog`` entry to skip installation for semver. This should speed up the execution of towncrier. * :gh:`316`: Comparisons of :class:`~semver.version.Version` class and other - types return now a :py:const:`NotImplemented` constant instead - of a :py:exc:`TypeError` exception. + types return now a :py:data:`python:NotImplemented` constant instead + of a :py:exc:`python:TypeError` exception. - The `NotImplemented`_ section of the Python documentation recommends - returning this constant when comparing with ``__gt__``, ``__lt__``, - and other comparison operators to "to indicate that the operation is + In the Python documentation, :py:data:`python:NotImplemented` recommends + returning this constant when comparing with :py:meth:`__gt__ `, :py:meth:`__lt__ `, + and other comparison operators "to indicate that the operation is not implemented with respect to the other type". - .. _NotImplemented: https://docs.python.org/3/library/constants.html#NotImplemented - * :gh:`319`: Introduce stages in :file:`.travis.yml` The config file contains now two stages: check and test. If check fails, the test stage won't be executed. This could @@ -206,7 +204,7 @@ Version 3.0.0-dev.2 Deprecations ------------ -* :gh:`169`: Deprecate CLI functions not imported from ``semver.cli``. +* :gh:`169`: Deprecate CLI functions not imported from :mod:`semver.cli`. .. _semver-3.0.0-dev.2-features: @@ -222,10 +220,10 @@ Features * Create :file:`src/semver/_deprecated.py` for the ``deprecated`` decorator and other deprecated functions * Create :file:`src/semver/__main__.py` to allow calling the CLI using :command:`python -m semver` * Create :file:`src/semver/_types.py` to hold type aliases - * Create :file:`src/semver/version.py` to hold the :class:`Version` class (old name :class:`VersionInfo`) and its utility functions + * Create :file:`src/semver/version.py` to hold the :class:`~semver.version.Version` class (old name :class:`~semver.version.VersionInfo`) and its utility functions * Create :file:`src/semver/__about__.py` for all the metadata variables -* :gh:`305`: Rename :class:`VersionInfo` to :class:`Version` but keep an alias for compatibility +* :gh:`305`: Rename :class:`~semver.version.VersionInfo` to :class:`~semver.version.Version` but keep an alias for compatibility .. _semver-3.0.0-dev.2-docs: @@ -239,7 +237,7 @@ Improved Documentation * Add migration chapter from semver2 to semver3. * Distinguish between changlog for version 2 and 3 -* :gh:`305`: Add note about :class:`Version` rename. +* :gh:`305`: Add note about :class:`~semver.version.Version` rename. .. _semver-3.0.0-dev.2-trivial: @@ -314,8 +312,8 @@ Features * Split test suite into separate files under :file:`tests/` directory * Adjust and update :file:`setup.py`. Requires Python >=3.6.* - Extract metadata directly from source (affects all the ``__version__``, - ``__author__`` etc. variables) + Extract metadata directly from source (affects all the :data:`~semver.__about__.__version__`, + :data:`~semver.__about__.__author__` etc. variables) * :gh:`270`: Configure Towncrier (:pr:`273`:) @@ -331,7 +329,7 @@ Features * Update documentation and add include a new section "Changelog" included from :file:`changelog.d/README.rst`. -* :gh:`276`: Document how to create a sublass from :class:`VersionInfo` class +* :gh:`276`: Document how to create a sublass from :class:`~semver.version.VersionInfo` class * :gh:`213`: Add typing information diff --git a/docs/conf.py b/docs/conf.py index eab3248d..39d8cb4b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -126,8 +126,13 @@ def find_version(*file_paths): # See https://www.sphinx-doc.org/en/master/usage/extensions/intersphinx.html intersphinx_mapping = { # Download it from the root with: - # wget -O docs/python-objects.inv https://docs.python.org/3/objects.inv + # wget -O docs/inventories/python-objects.inv https://docs.python.org/3/objects.inv "python": ("https://docs.python.org/3", (None, "inventories/python-objects.inv")), + # wget -O docs/inventories/pydantic.inv https://docs.pydantic.dev/latest/objects.inv + "pydantic": ( + "https://docs.pydantic.dev/latest/", + (None, "inventories/pydantic.inv"), + ), } # Avoid side-effects (namely that documentations local references can # suddenly resolve to an external location.) diff --git a/docs/inventories/pydantic.inv b/docs/inventories/pydantic.inv new file mode 100644 index 0000000000000000000000000000000000000000..455215a74ed7255fd24b089a523144711cf13f4d GIT binary patch literal 4080 zcmVNERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkVd1PU3 zbZKJ>BOq2~a&u{KZaN?^E-)@I3L_v?Xk{RBWo=<;Ze(S0Aa78b#rNMXCQiPX<{x4c-p<4OLyD26@d5s6*;HfR&%DE>7qONm3R_+ z+&G?e#{-j)gqj360O&`4eeobEQX(nf0`MZSE%AOAxVU)Zg7sU0s3iFcQOYEexX5;h z7A5B5L;d#eiWN6wZ!%%N(W*8L%_U(pOxro*I7KdwxT_7pWsy--VXXp5$zyBSVv4zXF1?W= z70DSA_=Xj@JT&^F`Xa0JHwO|GB6Kgd$}&QU%(4mPt_br;mNU8`+k=AfMO1a8GiwT3 z1hMd|6Ojol12aX1{!eNkit{-;Y%zu9^nP$q&45 zCBleINK-$8NgO{mq%49t&!{AYY7nAoaOrFWz_T9k0+m9otqyQ z#8$mwuuYD`pa_M`zukSAVhPhNd@M1tRP8+Rqr5C zAm{N-2G_v?Z%|XpKnlmQ;n0?eGl_HAj(1E856sk#6uOYq_*?y-Va^%UVU$&rk^A8e zAX8M*wM1U3f4YN%X?s51M3^l+ssd!dT&&xUYl%Q;k_hdmj4R<>7V z0mJ1C^BiZYmw8kbUXLGC_4Pnq>Zaz8zJF5wiI$`e8eHKvJUf(Hsbtnj+-6-3(bi$Y}d$plfQnt1HI$Yl}{t{YuWrFYL#Y&#tcYj|qF7l)0uGc9|RlUB{-L>hMuz;lE4%un7R}!>Pxc)m%o|U_{(7Rsi}tM|B#qZK=eFeOMR) zc)R);72nR}*mCLZpK>8t=U#6l=6`e_ekXFr8rgZ+U~nE)O*Hl~cE(3Mxo3F8I8FdI z^(6sUSC#}=Q+6Zv%m!>s6$eh3N=;<;fy<=JL^9vJZr9I#-^63yKatMj6Ehz;*EZqL zLnF*Lv7YSF?iHAQux7q9*c5dU&(4n_^tnBx|@DN>~bG zOSIkMB1?tOcWHd2M6VgMrxKIYQ}eY_P`|19Q4+hW30RROYGnrSb`?CufXnXSC(|%E zJfFfbM;kTCk{_Sjg?n@pd400Ch&&%2$1TKf;O!o=$ZD0D_TXuB_QLLP1gA%QE0Wf# z_-vKrMj!J{!G3zlQsV2RbiLc#@#n%lg61+Qny*GkR@oy#sk*-egBYH|7L^*zk!+_! zY|_!hr=unNSEHR_K?+=b@FTb|{W+3b&= z{Ptjq?%g)Axj9n5_w)osYa>q$ygQs6b!WhaCoCM?fj0nVgq6Jzx$Cw9<8Nz78&9Ck zle0#3by00o5t+U0H@)JGMroniftH+ASO~O*yS&~{58YL}d_`4V9-pFflh#|=p($wH zB}OOe65Q%R5?~a?@`drIs+TQN}^93NLm&7m50D|lP zW|ueX>o3`t%iE9NK6#2OhdDPP`G~ZQ^{}NlC4E^TQr;h*Q#~bjt40(?)>rWQ?pf8U zbx|mf6)@pzDly-*!N30ExAsq8;Xb|%ciBE@v}OP{`s=8@vL8=A+n*D;Gk@N3CRxso zEbUKFnR)3JY?e+OEs=Gke0w?sx5x7!30%OeOo*pEiV_dNi6+nSWCT!18fW5QmXICp z&aCGK*l!UuvLGOJdf*WuZ4;Q#l&O|VhfqdH+%(BIeQJoz@p0WAemfzs$}%>|0K|i!o)|Kn+CnhYXVGICa5DG`_H&nNr30vW3W6 z22m^aY6yr93!RV1fF*LzGcmexU1bc1dddFe>9IKl1N1t3BXW4Fwz%Ts*@g8j@e!b8d60Z1wn6gd7Kb20E?<4+ zuPKp1WpD@pmBSGPP!>lFkUftm0Grx&GD^EPKt*mDj>w=^p__o6n+-BpmOI90%3f#~ z;`fS3u<-rxqL8q3j8G30zt-lqmp)L$3)(J~g}9MI*qc>C`$P?D1m+XhX+co6%F+wt zMFf=Ikc^Qc#-m`+(Oqc}%%2VBZxJ{fjT_wYffSLDT`KJ) zBNBA(D#(+p8@*-zNf|6cRUWe9)aem1g5!>OF+6w#jO5D4iHzrfBet$5(V@}ZdqfZS z^G|K#;N|EeX>czyra(KGF$L1M9Hax#t*rT0e16eK-@HwE&ng@|^i+&hzp&wx@NYk+ zBDCG6GCCYLTpB(Z>@^0fk3iBwT-BdhYGUE|*MkRjrt_lGQ zO|7Vj6M(OT<>Tm)`DO6Q?ffIg>iZ7U2Z4*FWpPK8j%YvcZ&{wLGmf+rZGO%AwnO5JsF%2szNSt`9SdLkbF?{c`_OwW?T`u;=9M- z!|A8P??J5#j@_)D4!Vb69pddljlyCOEUYgzH`I1P_WhB&ez+BDG^Yas-bGWFBOBEJ z4jD?UsLPKT55Gfp((37QV-o7Ys`qXj| zIr<1bGSMmg9NgZ-?HqXI%)7>$!&WaGV#33~I>Hol96A9tFB7vbH&cpAdp2o$8)EQi zW*$9-T7CU^ww_(;_s5-g>5Iu*F;2FGPQGj?n2m&4G%pgdclb3CnQtG{kux(3Ph}HP zrX#0Fx$1ocP6rl}$HnR}Nqt|DDoB(f!RGhVkq=P3U8_cAy-Sk%=AlGI z-H(p-Xei=}Uft=xeB9kp3uldf<7fM%TMouD?)26AZ2i@K;*pbR+6J$GJ<7C;H!LS) z`0CVY6LwF`2=)O8I;Q)+{qUYOJfA-fcnT?u_!8QLLiR5YSso5V(AM8Ms81S{%R}o3 z>S~VFkO9AA1`BKs_qN#!S2$!fS$Bdy)Ip~8M67C;^f|I=j)*B*hGQj(YUr^ds+#iC%dv1ieyvMg z^D%wad*4Cz=z_`60#=$$o7r^%;=dJtaG zRJ9Mvyut?+sFo8$oZ*)Xaw~lvdc9{1Z2~|z+&B?LojGzH#GJqN0fKe8g8{ z5SV^`U6$9EE7KE~8d>Y*XUANJZWccI^e&(n5lG;y8d zDUrTV-GolA5_^bFF97=h7S?tlnE7Q}5Y1sl7Q~%fY+a~}s*vx=5A0r8oy2O_R7mgG zt8va_i9uRdl6hub$cwgA-BNqi$cAG-ne_{@BKq*YyVxyKeYn3^mnT1|eZKtUF3m;c zv$rHV3%2WSUZr=4u$Q6-A^NMyZAh7)6Pj+QC3^V(Pz+**F#uqMF(BLoswW0oVJ`_c z#DD>|#eflF4$CM!JHDY5yjryK;5t!w_3(R{ZUKGzNQD!jeYt@z;Ukv)6;P8m+RuyT zj1uZswmRauoA>w#J$BCEBjjreErR{?(}mLb3hDqSUzs*`(Ob-Y4Azfg^qJ736_U}n iOOnT&1Kmrc`Ac})&kr@*PrIKc0%A(#Q2776H4yW5xbrCh literal 0 HcmV?d00001 diff --git a/docs/inventories/python-objects.inv b/docs/inventories/python-objects.inv index 6f01e284eb588b00fa34fab71b910eac28980526..90bfa0a6cfed96227e766a910ec7c51af931926e 100644 GIT binary patch literal 134114 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 diff --git a/docs/migration/replace-deprecated-functions.rst b/docs/migration/replace-deprecated-functions.rst index 2fe1bb2d..c0091b73 100644 --- a/docs/migration/replace-deprecated-functions.rst +++ b/docs/migration/replace-deprecated-functions.rst @@ -8,17 +8,25 @@ Replacing Deprecated Functions the module level. The preferred way of using semver is through the :class:`~semver.version.Version` class. -The deprecated functions can still be used in version 2.10.0 and above. However, in -future versions of semver, the deprecated functions will be removed. +The deprecated functions can still be used in version 2.10.0 and above. +However, in future versions of semver, the deprecated functions will be removed. -The following list shows the deprecated functions and how you can replace + +Deprecated Module Level Functions +--------------------------------- + +The following list shows the deprecated module level functions and how you can replace them with code which is compatible for future versions: -* :func:`semver.bump_major`, :func:`semver.bump_minor`, :func:`semver.bump_patch`, :func:`semver.bump_prerelease`, :func:`semver.bump_build` +* :func:`semver.bump_major `, + :func:`semver.bump_minor `, + :func:`semver.bump_patch `, + :func:`semver.bump_prerelease `, + :func:`semver.bump_build ` Replace them with the respective methods of the :class:`~semver.version.Version` class. - For example, the function :func:`semver.bump_major` is replaced by + For example, the function :func:`semver.bump_major ` is replaced by :meth:`Version.bump_major ` and calling the ``str(versionobject)``: .. code-block:: python @@ -30,12 +38,7 @@ them with code which is compatible for future versions: Likewise with the other module level functions. -* :meth:`semver.Version.isvalid` - - Replace it with :meth:`Version.is_valid `: - - -* :func:`semver.finalize_version` +* :func:`semver.finalize_version ` Replace it with :meth:`Version.finalize_version `: @@ -46,7 +49,7 @@ them with code which is compatible for future versions: >>> s1 == s2 True -* :func:`semver.format_version` +* :func:`semver.format_version ` Replace it with ``str(versionobject)``: @@ -57,7 +60,7 @@ them with code which is compatible for future versions: >>> s1 == s2 True -* :func:`semver.max_ver` +* :func:`semver.max_ver ` Replace it with ``max(version1, version2, ...)`` or ``max([version1, version2, ...])`` and a ``key``: @@ -68,7 +71,7 @@ them with code which is compatible for future versions: >>> s1 == s2 True -* :func:`semver.min_ver` +* :func:`semver.min_ver ` Replace it with ``min(version1, version2, ...)`` or ``min([version1, version2, ...])`` and a ``key``: @@ -79,7 +82,7 @@ them with code which is compatible for future versions: >>> s1 == s2 True -* :func:`semver.parse` +* :func:`semver.parse ` Replace it with :meth:`Version.parse ` and call :meth:`Version.to_dict `: @@ -91,7 +94,7 @@ them with code which is compatible for future versions: >>> v1 == v2 True -* :func:`semver.parse_version_info` +* :func:`semver.parse_version_info ` Replace it with :meth:`Version.parse `: @@ -102,7 +105,7 @@ them with code which is compatible for future versions: >>> v1 == v2 True -* :func:`semver.replace` +* :func:`semver.replace ` Replace it with :meth:`Version.replace `: @@ -112,3 +115,22 @@ them with code which is compatible for future versions: >>> s2 = str(Version.parse('1.2.3').replace(major=2, patch=10)) >>> s1 == s2 True + + +Deprected Version methods +------------------------- + +The following list shows the deprecated methods of the :class:`~semver.version.Version` class. + +* :meth:`Version.isvalid ` + + Replace it with :meth:`Version.is_valid `: + + +Deprecated Classes +------------------ + +* :class:`VersionInfo ` + + The class was renamed to :class:`~semver.version.Version`. + Don't use the old name anymore. \ No newline at end of file diff --git a/docs/usage/access-parts-of-a-version.rst b/docs/usage/access-parts-of-a-version.rst index 4eb9274f..b1ce3a14 100644 --- a/docs/usage/access-parts-of-a-version.rst +++ b/docs/usage/access-parts-of-a-version.rst @@ -21,7 +21,7 @@ parts of a version: 'build.4' However, the attributes are read-only. You cannot change any of the above attributes. -If you do, you get an :py:exc:`AttributeError`:: +If you do, you get an :py:exc:`python:AttributeError`:: >>> v.minor = 5 Traceback (most recent call last): diff --git a/docs/usage/access-parts-through-index.rst b/docs/usage/access-parts-through-index.rst index c3651a5e..4553056a 100644 --- a/docs/usage/access-parts-through-index.rst +++ b/docs/usage/access-parts-through-index.rst @@ -33,7 +33,7 @@ Or, as an alternative, you can pass a :func:`slice` object: >>> ver[sl] (10, 3, 2) -Negative numbers or undefined parts raise an :py:exc:`IndexError` exception: +Negative numbers or undefined parts raise an :py:exc:`python:IndexError` exception: .. code-block:: python diff --git a/docs/usage/compare-versions.rst b/docs/usage/compare-versions.rst index ddd03b68..839ad68b 100644 --- a/docs/usage/compare-versions.rst +++ b/docs/usage/compare-versions.rst @@ -62,7 +62,7 @@ To compare two versions depends on your type: >>> "3.5.0" > v True - However, if you compare incomplete strings, you get a :py:exc:`ValueError` exception:: + However, if you compare incomplete strings, you get a :py:exc:`python:ValueError` exception:: >>> v > "1.0" Traceback (most recent call last): @@ -82,7 +82,7 @@ To compare two versions depends on your type: >>> dict(major=1) < v True - If the dictionary contains unknown keys, you get a :py:exc:`TypeError` exception:: + If the dictionary contains unknown keys, you get a :py:exc:`python:TypeError` exception:: >>> v > dict(major=1, unknown=42) Traceback (most recent call last): diff --git a/docs/usage/create-a-version.rst b/docs/usage/create-a-version.rst index b8dfdd83..9404ae4b 100644 --- a/docs/usage/create-a-version.rst +++ b/docs/usage/create-a-version.rst @@ -41,7 +41,7 @@ A :class:`~semver.version.Version` instance can be created in different ways: Version(major=3, minor=4, patch=5, prerelease='pre.2', build='build.4') Keep in mind, the ``major``, ``minor``, ``patch`` parts has to - be positive integers or strings: + be positive integers or strings, otherwise a :py:exc:`python:ValueError` is raised: >>> d = {'major': -3, 'minor': 4, 'patch': 5, 'prerelease': 'pre.2', 'build': 'build.4'} >>> Version(**d) @@ -50,7 +50,7 @@ A :class:`~semver.version.Version` instance can be created in different ways: ValueError: 'major' is negative. A version can only be positive. As a minimum requirement, your dictionary needs at least the ``major`` - key, others can be omitted. You get a ``TypeError`` if your + key, others can be omitted. You get a :py:exc:`python:TypeError` if your dictionary contains invalid keys. Only the keys ``major``, ``minor``, ``patch``, ``prerelease``, and ``build`` are allowed. @@ -87,12 +87,12 @@ Depending on your use case, the following methods are available: * From a string into a dictionary - To access individual parts, you can use the function :func:`semver.parse`:: + To access individual parts, you can use the function :func:`~semver._deprecated.parse`:: >>> semver.parse("3.4.5-pre.2+build.4") {'major': 3, 'minor': 4, 'patch': 5, 'prerelease': 'pre.2', 'build': 'build.4'} - If you pass an invalid version string you will get a :py:exc:`ValueError`:: + If you pass an invalid version string you will get a :py:exc:`python:ValueError`:: >>> semver.parse("1.2") Traceback (most recent call last): diff --git a/docs/version-policy.rst b/docs/version-policy.rst index a6eac5cc..f0c423f8 100644 --- a/docs/version-policy.rst +++ b/docs/version-policy.rst @@ -30,7 +30,9 @@ semver Version 3 We will not intentionally make breaking changes in minor releases of V3. -Methods marked as ``deprecated`` raise a warning message when used from the :py:mod:`warnings` module. +Methods marked as ``deprecated`` raise a warning message when used from the +:py:mod:`python:warnings` module. +Refer to section :ref:`sec_display_deprecation_warnings` to get more information about how to customize it. Check section :ref:`sec_replace_deprecated_functions` to make your code ready for future major releases. From fb02b3b23e9be75e21662fef3a8b0ef97ece4160 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Mon, 9 Oct 2023 12:50:07 +0200 Subject: [PATCH 29/51] Build 3.0.2 release of semver --- CHANGELOG.rst | 52 +++++++++++++++++++++++++++++++++++ changelog.d/432.doc.rst | 2 -- changelog.d/pr417.feature.rst | 1 - changelog.d/pr418.bugfix.rst | 5 ---- changelog.d/pr420.trivial.rst | 2 -- changelog.d/pr421.trivial.rst | 2 -- changelog.d/pr426.bugfix.rst | 2 -- changelog.d/pr431.doc.rst | 2 -- docs/usage/semver-version.rst | 2 +- src/semver/__about__.py | 2 +- 10 files changed, 54 insertions(+), 18 deletions(-) delete mode 100644 changelog.d/432.doc.rst delete mode 100644 changelog.d/pr417.feature.rst delete mode 100644 changelog.d/pr418.bugfix.rst delete mode 100644 changelog.d/pr420.trivial.rst delete mode 100644 changelog.d/pr421.trivial.rst delete mode 100644 changelog.d/pr426.bugfix.rst delete mode 100644 changelog.d/pr431.doc.rst diff --git a/CHANGELOG.rst b/CHANGELOG.rst index a773e1f3..2281f167 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -18,6 +18,58 @@ This section covers the changes between major version 2 and version 3. .. towncrier release notes start +Version 3.0.2 +============= + +:Released: 2023-10-09 +:Maintainer: + + +Bug Fixes +--------- + +* :pr:`418`: Replace :class:`~collection.OrderedDict` with :class:`dict`. + + The dict datatype is ordered since Python 3.7. As we do not support + Python 3.6 anymore, it can be considered safe to avoid :class:`~collection.OrderedDict`. + Related to :gh:`419`. + +* :pr:`426`: Fix :meth:`~semver.version.Version.replace` method to use the derived class + of an instance instead of :class:`~semver.version.Version` class. + + + +Improved Documentation +---------------------- + +* :pr:`431`: Clarify version policy for the different semver versions (v2, v3, >v3) + and the supported Python versions. + +* :gh:`432`: Improve external doc links to Python and Pydantic. + + + +Features +-------- + +* :pr:`417`: Amend GitHub Actions to check against MacOS. + + + +Trivial/Internal Changes +------------------------ + +* :pr:`420`: Introduce :py:class:`~typing.ClassVar` for some :class:`~semver.version.Version` + class variables, mainly :data:`~semver.version.Version.NAMES` and some private. + +* :pr:`421`: Insert mypy configuration into :file:`pyproject.toml` and remove + config options from :file:`tox.ini`. + + + +---- + + Version 3.0.1 ============= diff --git a/changelog.d/432.doc.rst b/changelog.d/432.doc.rst deleted file mode 100644 index ab09b96c..00000000 --- a/changelog.d/432.doc.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improve external doc links to Python and Pydantic. - diff --git a/changelog.d/pr417.feature.rst b/changelog.d/pr417.feature.rst deleted file mode 100644 index c33a3704..00000000 --- a/changelog.d/pr417.feature.rst +++ /dev/null @@ -1 +0,0 @@ -Amend GitHub Actions to check against MacOS. diff --git a/changelog.d/pr418.bugfix.rst b/changelog.d/pr418.bugfix.rst deleted file mode 100644 index 6f037102..00000000 --- a/changelog.d/pr418.bugfix.rst +++ /dev/null @@ -1,5 +0,0 @@ -Replace :class:`~collection.OrderedDict` with :class:`dict`. - -The dict datatype is ordered since Python 3.7. As we do not support -Python 3.6 anymore, it can be considered safe to avoid :class:`~collection.OrderedDict`. -Related to :gh:`419`. diff --git a/changelog.d/pr420.trivial.rst b/changelog.d/pr420.trivial.rst deleted file mode 100644 index 234ecdbe..00000000 --- a/changelog.d/pr420.trivial.rst +++ /dev/null @@ -1,2 +0,0 @@ -Introduce :py:class:`~typing.ClassVar` for some :class:`~semver.version.Version` -class variables, mainly :data:`~semver.version.Version.NAMES` and some private. diff --git a/changelog.d/pr421.trivial.rst b/changelog.d/pr421.trivial.rst deleted file mode 100644 index b00b9e55..00000000 --- a/changelog.d/pr421.trivial.rst +++ /dev/null @@ -1,2 +0,0 @@ -Insert mypy configuration into :file:`pyproject.toml` and remove -config options from :file:`tox.ini`. diff --git a/changelog.d/pr426.bugfix.rst b/changelog.d/pr426.bugfix.rst deleted file mode 100644 index 2c2d0eac..00000000 --- a/changelog.d/pr426.bugfix.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :meth:`~semver.version.Version.replace` method to use the derived class -of an instance instead of :class:`~semver.version.Version` class. diff --git a/changelog.d/pr431.doc.rst b/changelog.d/pr431.doc.rst deleted file mode 100644 index ad54c962..00000000 --- a/changelog.d/pr431.doc.rst +++ /dev/null @@ -1,2 +0,0 @@ -Clarify version policy for the different semver versions (v2, v3, >v3) -and the supported Python versions. diff --git a/docs/usage/semver-version.rst b/docs/usage/semver-version.rst index 0f2e2411..ac580f98 100644 --- a/docs/usage/semver-version.rst +++ b/docs/usage/semver-version.rst @@ -4,4 +4,4 @@ Getting the Version of semver To know the version of semver itself, use the following construct:: >>> semver.__version__ - '3.0.1' + '3.0.2' diff --git a/src/semver/__about__.py b/src/semver/__about__.py index 2eff8c86..a0d9cf90 100644 --- a/src/semver/__about__.py +++ b/src/semver/__about__.py @@ -16,7 +16,7 @@ """ #: Semver version -__version__ = "3.0.1" +__version__ = "3.0.2" #: Original semver author __author__ = "Kostiantyn Rybnikov" From f65feabbca2052b0b7ccba5118a73e3c3994eb34 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Mon, 9 Oct 2023 13:24:34 +0200 Subject: [PATCH 30/51] Correct some smaller issues when building * Remove :ref: in README.rst * Add tool.setuptools_scm section in pyproject.toml --- README.rst | 6 ------ pyproject.toml | 3 +++ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/README.rst b/README.rst index ee2ab44d..66552796 100644 --- a/README.rst +++ b/README.rst @@ -10,12 +10,6 @@ A Python module to simplify `semantic versioning`_. .. teaser-end -.. note:: - - This project works for Python 3.7 and greater only. - Refer to :ref:`version-policy` for more details. - - The module follows the ``MAJOR.MINOR.PATCH`` style: * ``MAJOR`` version when you make incompatible API changes, diff --git a/pyproject.toml b/pyproject.toml index 64c9a32c..ce540deb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,6 +13,9 @@ requires = [ ] build-backend = "setuptools.build_meta" +[tool.setuptools_scm] +version_scheme = "post-release" +local_scheme = "dirty-tag" [tool.mypy] # ignore_missing_imports = true From ec9348aefd8e9f287f451fcf2e837621a40e3ca4 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Mon, 9 Oct 2023 13:48:58 +0200 Subject: [PATCH 31/51] Add missing .readthedocs.yaml According to [1], the .readthedocs.yaml configuration file is now required. The last builds have failed. [1] https://blog.readthedocs.com/migrate-configuration-v2/ --- .readthedocs.yaml | 20 ++++++++++++++++++++ docs/requirements.txt | 1 + 2 files changed, 21 insertions(+) create mode 100644 .readthedocs.yaml diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 00000000..33e3e3aa --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,20 @@ +# .readthedocs.yaml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the version of Python and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.11" + +# Build documentation in the docs/ directory with Sphinx +sphinx: + configuration: docs/conf.py + +python: + install: + - requirements: docs/requirements.txt diff --git a/docs/requirements.txt b/docs/requirements.txt index 1186b4c3..2a86234d 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,5 @@ # requirements file for documentation # sphinx +# required in .readthedocs.yaml sphinx-argparse sphinx-autodoc-typehints From 03fb990a85b62eba0161a5109d486671f662c750 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Mon, 9 Oct 2023 15:26:16 +0200 Subject: [PATCH 32/51] Pin versions for reproducable doc builds --- docs/requirements.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 2a86234d..540348a5 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,5 +1,5 @@ -# requirements file for documentation -# sphinx -# required in .readthedocs.yaml -sphinx-argparse -sphinx-autodoc-typehints +# Sphinx requirements file for documentation +# Required in .readthedocs.yaml +sphinx==7.0.1 +sphinx-argparse==0.4.0 +sphinx-autodoc-typehints==1.24.0 From 87f639f9edd404b84b6d9a4394cdfca5fd011369 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Mon, 9 Oct 2023 15:26:40 +0200 Subject: [PATCH 33/51] Use canonicals on ReadTheDocs If environment variable READTHEDOCS_CANONICAL_URL is definied, set html_baseurl variable so Sphinx can grab it. --- docs/conf.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index 39d8cb4b..30a0fc5a 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -211,6 +211,10 @@ def find_version(*file_paths): html_static_path = ["_static"] html_css_files = ["css/custom.css"] +# Canonical link relation +if os.environ.get("READTHEDOCS_CANONICAL_URL"): + html_baseurl = f"{os.environ['READTHEDOCS_CANONICAL_URL']}" + # html_logo = "logo.svg" # -- Options for HTMLHelp output ------------------------------------------ From ca415339bd28c51931fa65d81a5f42f93fb314ef Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Mon, 9 Oct 2023 18:00:14 +0200 Subject: [PATCH 34/51] Use meta directive for SEO --- changelog.d/pr435.doc.rst | 7 +++++++ docs/advanced/combine-pydantic-and-semver.rst | 4 ++++ docs/advanced/convert-pypi-to-semver.rst | 6 +++++- docs/advanced/create-subclasses-from-version.rst | 4 ++++ docs/advanced/deal-with-invalid-versions.rst | 4 ++++ docs/advanced/display-deprecation-warnings.rst | 4 ++++ docs/advanced/index.rst | 3 +++ docs/advanced/version-from-file.rst | 6 +++++- docs/api.rst | 4 ++++ docs/build-semver.rst | 3 +++ docs/contribute/add-changelog-entry.rst | 4 ++++ docs/contribute/doc-semver.rst | 4 ++++ docs/contribute/finish-release.rst | 4 ++++ docs/contribute/index.rst | 4 ++++ docs/contribute/prerequisites.rst | 4 ++++ docs/contribute/release-procedure.rst | 4 ++++ docs/contribute/report-bugs.rst | 4 ++++ docs/contribute/run-test-suite.rst | 4 ++++ docs/index.rst | 4 ++++ docs/install.rst | 4 ++++ docs/migration/index.rst | 3 +++ docs/migration/migratetosemver3.rst | 4 ++++ docs/migration/replace-deprecated-functions.rst | 4 ++++ docs/pysemver.rst | 4 ++++ docs/usage/access-parts-of-a-version.rst | 4 ++++ docs/usage/access-parts-through-index.rst | 4 ++++ docs/usage/check-compatible-semver-version.rst | 4 ++++ docs/usage/check-valid-semver-version.rst | 4 ++++ docs/usage/compare-versions-through-expression.rst | 4 ++++ docs/usage/compare-versions.rst | 4 ++++ docs/usage/convert-version-into-different-types.rst | 5 +++++ docs/usage/create-a-version.rst | 4 ++++ docs/usage/determine-version-equality.rst | 4 ++++ docs/usage/get-min-and-max-of-multiple-versions.rst | 4 ++++ 34 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 changelog.d/pr435.doc.rst diff --git a/changelog.d/pr435.doc.rst b/changelog.d/pr435.doc.rst new file mode 100644 index 00000000..87925c3d --- /dev/null +++ b/changelog.d/pr435.doc.rst @@ -0,0 +1,7 @@ +Several small improvements for documentation: + +* Add meta description to improve SEO +* Use canonicals on ReadTheDocs (commit 87f639f) +* Pin versions for reproducable doc builds (commit 03fb990) +* Add missing :file:`.readthedocs.yaml` file (commit ec9348a) +* Correct some smaller issues when building (commit f65feab) diff --git a/docs/advanced/combine-pydantic-and-semver.rst b/docs/advanced/combine-pydantic-and-semver.rst index 3236c2a2..c7566e12 100644 --- a/docs/advanced/combine-pydantic-and-semver.rst +++ b/docs/advanced/combine-pydantic-and-semver.rst @@ -1,6 +1,10 @@ Combining Pydantic and semver ============================= +.. meta:: + :description lang=en: + Combining Pydantic and semver + According to its homepage, `Pydantic `_ "enforces type hints at runtime, and provides user friendly errors when data is invalid." diff --git a/docs/advanced/convert-pypi-to-semver.rst b/docs/advanced/convert-pypi-to-semver.rst index 04737d29..82b4f5a3 100644 --- a/docs/advanced/convert-pypi-to-semver.rst +++ b/docs/advanced/convert-pypi-to-semver.rst @@ -1,6 +1,10 @@ -Converting versions between PyPI and semver +Converting Versions between PyPI and semver =========================================== +.. meta:: + :description lang=en: + Converting versions between PyPI and semver + .. Link https://packaging.pypa.io/en/latest/_modules/packaging/version.html#InvalidVersion diff --git a/docs/advanced/create-subclasses-from-version.rst b/docs/advanced/create-subclasses-from-version.rst index 7e99e217..3a5194f4 100644 --- a/docs/advanced/create-subclasses-from-version.rst +++ b/docs/advanced/create-subclasses-from-version.rst @@ -3,6 +3,10 @@ Creating Subclasses from Version ================================ +.. meta:: + :description lang=en: + Creating subclasses from Version class + If you do not like creating functions to modify the behavior of semver (as shown in section :ref:`sec_dealing_with_invalid_versions`), you can also create a subclass of the :class:`Version ` class. diff --git a/docs/advanced/deal-with-invalid-versions.rst b/docs/advanced/deal-with-invalid-versions.rst index ee5e5704..120d82a0 100644 --- a/docs/advanced/deal-with-invalid-versions.rst +++ b/docs/advanced/deal-with-invalid-versions.rst @@ -3,6 +3,10 @@ Dealing with Invalid Versions ============================= +.. meta:: + :description lang=en: + Dealing with invalid versions + As semver follows the semver specification, it cannot parse version strings which are considered "invalid" by that specification. The semver library cannot know all the possible variations so you need to help the diff --git a/docs/advanced/display-deprecation-warnings.rst b/docs/advanced/display-deprecation-warnings.rst index 825bbe76..a2fb8342 100644 --- a/docs/advanced/display-deprecation-warnings.rst +++ b/docs/advanced/display-deprecation-warnings.rst @@ -3,6 +3,10 @@ Displaying Deprecation Warnings =============================== +.. meta:: + :description lang=en: + Displaying and filtering deprecation warnings + By default, deprecation warnings are `ignored in Python `_. This also affects semver's own warnings. diff --git a/docs/advanced/index.rst b/docs/advanced/index.rst index 47c23b9d..26cd5729 100644 --- a/docs/advanced/index.rst +++ b/docs/advanced/index.rst @@ -1,6 +1,9 @@ Advanced topics =============== +.. meta:: + :description lang=en: + Advanced topics for Python semver .. toctree:: :maxdepth: 1 diff --git a/docs/advanced/version-from-file.rst b/docs/advanced/version-from-file.rst index b49ff36b..5d484438 100644 --- a/docs/advanced/version-from-file.rst +++ b/docs/advanced/version-from-file.rst @@ -1,8 +1,12 @@ .. _sec_reading_versions_from_file: -Reading versions from file +Reading Versions from File ========================== +.. meta:: + :description lang=en: + Reading versions from file + In cases where a version is stored inside a file, one possible solution is to use the following function: diff --git a/docs/api.rst b/docs/api.rst index f545ebc5..0ce4012c 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -3,6 +3,10 @@ API Reference ============= +.. meta:: + :description lang=en: + API reference about Python semver + .. currentmodule:: semver diff --git a/docs/build-semver.rst b/docs/build-semver.rst index c938a1ee..b5626d22 100644 --- a/docs/build-semver.rst +++ b/docs/build-semver.rst @@ -3,6 +3,9 @@ Building semver =============== +.. meta:: + :description lang=en: + Building semver .. _PEP 517: https://www.python.org/dev/peps/pep-0517/ .. _PEP 621: https://www.python.org/dev/peps/pep-0621/ diff --git a/docs/contribute/add-changelog-entry.rst b/docs/contribute/add-changelog-entry.rst index c0d426a8..30215c76 100644 --- a/docs/contribute/add-changelog-entry.rst +++ b/docs/contribute/add-changelog-entry.rst @@ -3,5 +3,9 @@ Adding a Changelog Entry ======================== +.. meta:: + :description lang=en: + Adding a changelog entry with Towncrier + .. include:: ../../changelog.d/README.rst :start-after: -text-begin- \ No newline at end of file diff --git a/docs/contribute/doc-semver.rst b/docs/contribute/doc-semver.rst index e5237eaf..217b1d21 100644 --- a/docs/contribute/doc-semver.rst +++ b/docs/contribute/doc-semver.rst @@ -3,6 +3,10 @@ Documenting semver ================== +.. meta:: + :description lang=en: + Documenting semver with type annotations, docstrings, Sphinx directives + Documenting the features of semver is very important. It gives our developers an overview what is possible with semver, how it "feels", and how it is used efficiently. diff --git a/docs/contribute/finish-release.rst b/docs/contribute/finish-release.rst index 947fcf96..d1fcce2c 100644 --- a/docs/contribute/finish-release.rst +++ b/docs/contribute/finish-release.rst @@ -3,6 +3,10 @@ Finish the Release ================== +.. meta:: + :description lang=en: + Finish the semver release by creating tags + 1. Create a tag: $ git tag -a x.x.x diff --git a/docs/contribute/index.rst b/docs/contribute/index.rst index f09e6418..30960ace 100644 --- a/docs/contribute/index.rst +++ b/docs/contribute/index.rst @@ -3,6 +3,10 @@ Contributing to semver ====================== +.. meta:: + :description lang=en: + Contributing to Python semver + The semver source code is managed using Git and is hosted on GitHub:: git clone git://github.com/python-semver/python-semver diff --git a/docs/contribute/prerequisites.rst b/docs/contribute/prerequisites.rst index 79bbb571..1084d247 100644 --- a/docs/contribute/prerequisites.rst +++ b/docs/contribute/prerequisites.rst @@ -1,6 +1,10 @@ Prerequisites ------------- +.. meta:: + :description lang=en: + Overview of prerequisites for contributing + .. -text-begin- Before you make changes to the code, we would highly appreciate if you diff --git a/docs/contribute/release-procedure.rst b/docs/contribute/release-procedure.rst index c02148fe..b18672fb 100644 --- a/docs/contribute/release-procedure.rst +++ b/docs/contribute/release-procedure.rst @@ -1,6 +1,10 @@ Release Procedure ================= +.. meta:: + :description lang=en: + Release procedure: prepare and create the release + The following procedures gives a short overview of what steps are needed to create a new release. diff --git a/docs/contribute/report-bugs.rst b/docs/contribute/report-bugs.rst index fa14eb18..614098b9 100644 --- a/docs/contribute/report-bugs.rst +++ b/docs/contribute/report-bugs.rst @@ -3,6 +3,10 @@ Reporting Bugs and Asking Questions ----------------------------------- +.. meta:: + :description lang=en: + Reporting bugs and asking questions about semver + If you think you have encountered a bug in semver or have an idea for a new feature? Great! We like to hear from you! diff --git a/docs/contribute/run-test-suite.rst b/docs/contribute/run-test-suite.rst index 07c49fff..22f4ebc0 100644 --- a/docs/contribute/run-test-suite.rst +++ b/docs/contribute/run-test-suite.rst @@ -3,6 +3,10 @@ Running the Test Suite ====================== +.. meta:: + :description lang=en: + Running the test suite through tox + We use `pytest`_ and `tox`_ to run tests against all supported Python versions. All test dependencies are resolved automatically. diff --git a/docs/index.rst b/docs/index.rst index 0f1f32d6..d0b15882 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,6 +1,10 @@ Semver |version| -- Semantic Versioning ======================================= +.. meta:: + :description lang=en: + Semantic versioning for Python + .. include:: readme.rst diff --git a/docs/install.rst b/docs/install.rst index dee441de..380a4bb5 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -1,6 +1,10 @@ Installing semver ================= +.. meta:: + :description lang=en: + Installing semver on the system + Release Policy -------------- diff --git a/docs/migration/index.rst b/docs/migration/index.rst index c6af7c05..74c3d866 100644 --- a/docs/migration/index.rst +++ b/docs/migration/index.rst @@ -1,6 +1,9 @@ Migrating to semver3 ==================== +.. meta:: + :description lang=en: + Migrating from semver version 2 to version 3 .. toctree:: :maxdepth: 1 diff --git a/docs/migration/migratetosemver3.rst b/docs/migration/migratetosemver3.rst index e8b5c9ab..2c09fb41 100644 --- a/docs/migration/migratetosemver3.rst +++ b/docs/migration/migratetosemver3.rst @@ -3,6 +3,10 @@ Migrating from semver2 to semver3 ================================= +.. meta:: + :description lang=en: + Migrating from semver2 to semver3 + This section describes the visible differences for users and how your code stays compatible for semver3. Some changes are backward incompatible. diff --git a/docs/migration/replace-deprecated-functions.rst b/docs/migration/replace-deprecated-functions.rst index c0091b73..df0d799a 100644 --- a/docs/migration/replace-deprecated-functions.rst +++ b/docs/migration/replace-deprecated-functions.rst @@ -3,6 +3,10 @@ Replacing Deprecated Functions ============================== +.. meta:: + :description lang=en: + Replacing deprecated functions + .. versionchanged:: 2.10.0 The development team of semver has decided to deprecate certain functions on the module level. The preferred way of using semver is through the diff --git a/docs/pysemver.rst b/docs/pysemver.rst index b0896eea..cea32e6c 100644 --- a/docs/pysemver.rst +++ b/docs/pysemver.rst @@ -3,6 +3,10 @@ pysemver |version| ================== +.. meta:: + :description lang=en: + Commandline tool pysemver describing all commands and options + Synopsis -------- diff --git a/docs/usage/access-parts-of-a-version.rst b/docs/usage/access-parts-of-a-version.rst index b1ce3a14..d8a15cb4 100644 --- a/docs/usage/access-parts-of-a-version.rst +++ b/docs/usage/access-parts-of-a-version.rst @@ -3,6 +3,10 @@ Accessing Parts of a Version Through Names ========================================== +.. meta:: + :description lang=en: + Accessing parts of a version through names + The :class:`~semver.version.Version` class contains attributes to access the different parts of a version: diff --git a/docs/usage/access-parts-through-index.rst b/docs/usage/access-parts-through-index.rst index 4553056a..cc6b0c2b 100644 --- a/docs/usage/access-parts-through-index.rst +++ b/docs/usage/access-parts-through-index.rst @@ -3,6 +3,10 @@ Accessing Parts Through Index Numbers ===================================== +.. meta:: + :description lang=en: + Accessing parts through index numbers + .. versionadded:: 2.10.0 Another way to access parts of a version is to use an index notation. The underlying diff --git a/docs/usage/check-compatible-semver-version.rst b/docs/usage/check-compatible-semver-version.rst index 20330456..4cf47908 100644 --- a/docs/usage/check-compatible-semver-version.rst +++ b/docs/usage/check-compatible-semver-version.rst @@ -1,6 +1,10 @@ Checking for a Compatible Semver Version ======================================== +.. meta:: + :description lang=en: + Check for a compatible semver version + To check if a *change* from a semver version ``a`` to a semver version ``b`` is *compatible* according to semver rule, use the method :meth:`~semver.version.Version.is_compatible`. diff --git a/docs/usage/check-valid-semver-version.rst b/docs/usage/check-valid-semver-version.rst index bdd57e7a..2e016c6d 100644 --- a/docs/usage/check-valid-semver-version.rst +++ b/docs/usage/check-valid-semver-version.rst @@ -1,6 +1,10 @@ Checking for a Valid Semver Version =================================== +.. meta:: + :description lang=en: + Checking for a valid semver version + If you need to check a string if it is a valid semver version, use the classmethod :meth:`~semver.version.Version.is_valid`: diff --git a/docs/usage/compare-versions-through-expression.rst b/docs/usage/compare-versions-through-expression.rst index e2dee4d6..5b05a123 100644 --- a/docs/usage/compare-versions-through-expression.rst +++ b/docs/usage/compare-versions-through-expression.rst @@ -1,6 +1,10 @@ Comparing Versions through an Expression ======================================== +.. meta:: + :description lang=en: + Comparing versions through an expression + If you need a more fine-grained approach of comparing two versions, use the :meth:`~semver.version.Version.match` function. It expects two arguments: diff --git a/docs/usage/compare-versions.rst b/docs/usage/compare-versions.rst index 839ad68b..714cf8ba 100644 --- a/docs/usage/compare-versions.rst +++ b/docs/usage/compare-versions.rst @@ -1,6 +1,10 @@ Comparing Versions ================== +.. meta:: + :description lang=en: + Comparing versions with semver.compare and the Version class + To compare two versions depends on your type: * **Two strings** diff --git a/docs/usage/convert-version-into-different-types.rst b/docs/usage/convert-version-into-different-types.rst index 6a447d0d..c75992f1 100644 --- a/docs/usage/convert-version-into-different-types.rst +++ b/docs/usage/convert-version-into-different-types.rst @@ -3,6 +3,11 @@ Converting a Version instance into Different Types ================================================== +.. meta:: + :description lang=en: + Converting a version instance into different types + + Sometimes it is needed to convert a :class:`~semver.version.Version` instance into a different type. For example, for displaying or to access all parts. diff --git a/docs/usage/create-a-version.rst b/docs/usage/create-a-version.rst index 9404ae4b..06165235 100644 --- a/docs/usage/create-a-version.rst +++ b/docs/usage/create-a-version.rst @@ -1,6 +1,10 @@ Creating a Version ================== +.. meta:: + :description lang=en: + Creating a version using different methods + .. versionchanged:: 3.0.0 The former :class:`~semver.version.VersionInfo` class diff --git a/docs/usage/determine-version-equality.rst b/docs/usage/determine-version-equality.rst index 211743c9..ba4125ed 100644 --- a/docs/usage/determine-version-equality.rst +++ b/docs/usage/determine-version-equality.rst @@ -1,6 +1,10 @@ Determining Version Equality ============================ +.. meta:: + :description lang=en: + Determining verison equality + Version equality means for semver, that major, minor, patch, and prerelease parts are equal in both versions you compare. The build part is ignored. For example:: diff --git a/docs/usage/get-min-and-max-of-multiple-versions.rst b/docs/usage/get-min-and-max-of-multiple-versions.rst index e143162a..35ba77b4 100644 --- a/docs/usage/get-min-and-max-of-multiple-versions.rst +++ b/docs/usage/get-min-and-max-of-multiple-versions.rst @@ -3,6 +3,10 @@ Getting Minimum and Maximum of Multiple Versions ================================================ +.. meta:: + :description lang=en: + Getting minimum and maximum of multiple versions + .. versionchanged:: 2.10.2 The functions :func:`semver.max_ver` and :func:`semver.min_ver` are deprecated in favor of their builtin counterparts :func:`max` and :func:`min`. From 254e7c5ad1277ed614cc6a20d2e3f7232e8c4649 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Mon, 9 Oct 2023 18:36:23 +0200 Subject: [PATCH 35/51] Move search box more at the top This makes it easier for users as if the TOC is long, the search box isn't visible anymore. --- changelog.d/pr436.doc.rst | 3 +++ docs/_static/css/custom.css | 4 ++++ docs/_templates/layout.html | 47 ++++--------------------------------- docs/conf.py | 10 ++++++++ 4 files changed, 21 insertions(+), 43 deletions(-) create mode 100644 changelog.d/pr436.doc.rst diff --git a/changelog.d/pr436.doc.rst b/changelog.d/pr436.doc.rst new file mode 100644 index 00000000..5f078361 --- /dev/null +++ b/changelog.d/pr436.doc.rst @@ -0,0 +1,3 @@ +Move search box more at the top. This makes it easier for +users as if the TOC is long, the search box isn't visible +anymore. diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css index 81a5906f..33510db3 100644 --- a/docs/_static/css/custom.css +++ b/docs/_static/css/custom.css @@ -31,6 +31,10 @@ div.related.top nav { margin-bottom: -0.75em; } +#searchbox { + margin-bottom: 1.25em; +} + .section h1 { font-weight: 700; } diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html index 7a114d41..1f72ac26 100644 --- a/docs/_templates/layout.html +++ b/docs/_templates/layout.html @@ -3,47 +3,8 @@ #} {% extends "!layout.html" %} -{%- block footer %} -

-{% if theme_github_banner|lower != 'false' %} - - Fork me on GitHub - -{% endif %} -{% if theme_analytics_id %} - -{% endif %} -{%- endblock %} \ No newline at end of file +{%- block extrahead %} + {{- super() }} + +{% endblock %} \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index 30a0fc5a..801e9eaf 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -211,6 +211,16 @@ def find_version(*file_paths): html_static_path = ["_static"] html_css_files = ["css/custom.css"] +html_sidebars = { + "**": [ + "about.html", # theme_logo + # 'relations.html', # prev and next + "searchbox.html", # basic/searchbox.html + "navigation.html", # TOC + # 'donate.html', + ] +} + # Canonical link relation if os.environ.get("READTHEDOCS_CANONICAL_URL"): html_baseurl = f"{os.environ['READTHEDOCS_CANONICAL_URL']}" From c47774db88386f7db79e5ec9fe3672c07ed7c063 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Tue, 16 Apr 2024 09:44:41 +0200 Subject: [PATCH 36/51] Replace organization placeholder in LICENSE Found by @tpoliaw in https://github.com/python-semver/python-semver/discussions/438 --- LICENSE.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE.txt b/LICENSE.txt index f98e22bc..bbb09286 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -11,7 +11,7 @@ are permitted provided that the following conditions are met: list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the {organization} nor the names of its + Neither the name of the python-semver org nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. From d974788718ff009e38908bf91f4ac297b034568c Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Tue, 16 Jul 2024 13:50:25 +0200 Subject: [PATCH 37/51] Ignore venv*/.venv* --- .gitignore | 2 +- setup.cfg | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index dead3352..256de715 100644 --- a/.gitignore +++ b/.gitignore @@ -108,7 +108,7 @@ celerybeat.pid # Environments .env -.venv +.venv* env/ venv/ ENV/ diff --git a/setup.cfg b/setup.cfg index 0ee8564c..790f260c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -76,7 +76,8 @@ extend-exclude = .env build docs - venv + venv* + .venv* conftest.py src/semver/__init__.py tasks.py From 4cb269d952c256108f3e06c210ccbfc0e0032e2b Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Tue, 16 Jul 2024 13:55:49 +0200 Subject: [PATCH 38/51] GHA: Change Python and CodeQL Python workflow: * Exclude 3.7 on macos-latest * Use actions/checkout@v4 (migrated from @v3) * Enable Python 3.12, use action/setup-python@v5 * Use newer syntax of "tox run ..." CodeQL workflow: * Update to latest version @v3 * Not be triggered in master, but in release/* branches --- .github/workflows/codeql-analysis.yml | 10 +++++----- .github/workflows/python-testing.yml | 22 +++++++++++++--------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index f310a7e3..61d1a1f6 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -13,7 +13,7 @@ name: "CodeQL" on: push: - branches: [ master, maint/v2 ] + branches: [ maint/v2, release/* ] pull_request: # The branches below must be a subset of the branches above branches: [ master ] @@ -35,11 +35,11 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -50,7 +50,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v3 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -64,4 +64,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/python-testing.yml b/.github/workflows/python-testing.yml index bbbe2a42..db555cc0 100644 --- a/.github/workflows/python-testing.yml +++ b/.github/workflows/python-testing.yml @@ -35,7 +35,7 @@ jobs: can_run: ${{ steps.check_files.outputs.can_run }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 @@ -77,9 +77,9 @@ jobs: if: ${{ needs.check-files.outputs.can_run == '1' }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: 3.8 cache: 'pip' @@ -89,11 +89,12 @@ jobs: pip install tox tox-gh-actions - name: Check run: | - tox -e checks + tox run -e checks tests: needs: check runs-on: ${{ matrix.os }} + continue-on-error: true strategy: max-parallel: 5 fail-fast: true @@ -103,14 +104,17 @@ jobs: "3.9", "3.10", "3.11", - # "3.12-dev" + "3.12", ] - os: [ubuntu-latest, "macos-latest"] + os: ["ubuntu-latest", "macos-latest"] + exclude: + - os: "macos-latest" + python-version: "3.7" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} for ${{ matrix.os }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} cache: 'pip' @@ -120,4 +124,4 @@ jobs: pip install tox tox-gh-actions - name: Test with tox run: | - tox + tox run From dec7f63f11c8349d0f2aa6ef647ff6dd6c9fe86c Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Tue, 16 Jul 2024 14:02:27 +0200 Subject: [PATCH 39/51] Change flake8 config to be compatible with black As suggested by https://black.readthedocs.io/en/stable/guides/using_black_with_other_tools.html#labels-why-pycodestyle-warnings --- setup.cfg | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/setup.cfg b/setup.cfg index 790f260c..7f1878c2 100644 --- a/setup.cfg +++ b/setup.cfg @@ -70,7 +70,7 @@ addopts = [flake8] max-line-length = 88 -ignore = F821,W503 +extend-ignore = E203,E701 extend-exclude = .eggs .env @@ -84,7 +84,8 @@ extend-exclude = [pycodestyle] count = False -# ignore = E226,E302,E41 +ignore = E203,E701 +# E226,E302,E41 max-line-length = 88 statistics = True exclude = From 97676c838129bfeff1439b47775ad1025f817b55 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Tue, 16 Jul 2024 14:03:38 +0200 Subject: [PATCH 40/51] Format with black --- src/semver/__main__.py | 1 + src/semver/_deprecated.py | 1 + tests/test_semver.py | 3 +-- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/semver/__main__.py b/src/semver/__main__.py index 6cb11f09..c6adb834 100644 --- a/src/semver/__main__.py +++ b/src/semver/__main__.py @@ -9,6 +9,7 @@ $ python3 semver-3*-py3-none-any.whl/semver -h """ + import os.path import sys from typing import List, Optional diff --git a/src/semver/_deprecated.py b/src/semver/_deprecated.py index efbdf439..df11bb02 100644 --- a/src/semver/_deprecated.py +++ b/src/semver/_deprecated.py @@ -3,6 +3,7 @@ .. autofunction: deprecated """ + import inspect import warnings from functools import partial, wraps diff --git a/tests/test_semver.py b/tests/test_semver.py index 782d5c79..9978b940 100644 --- a/tests/test_semver.py +++ b/tests/test_semver.py @@ -131,7 +131,6 @@ def test_should_fail_with_incompatible_type_for_compatible_match(wrongtype): def test_should_succeed_with_compatible_subclass_for_is_compatible(): - class CustomVersion(Version): - ... + class CustomVersion(Version): ... assert CustomVersion(1, 0, 0).is_compatible(Version(1, 0, 0)) From 9593ad085b398a7ae7356167cdf817568cbe4a35 Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Fri, 12 Jul 2024 23:04:26 +0800 Subject: [PATCH 41/51] Improve type hints to fix TODOs --- src/semver/version.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/semver/version.py b/src/semver/version.py index 29309ab4..e3b9229f 100644 --- a/src/semver/version.py +++ b/src/semver/version.py @@ -32,6 +32,7 @@ Comparator = Callable[["Version", Comparable], bool] T = TypeVar("T", bound="Version") +T_cmp = TypeVar("T_cmp", tuple, str, int) def _comparator(operator: Comparator) -> Comparator: @@ -53,7 +54,7 @@ def wrapper(self: "Version", other: Comparable) -> bool: return wrapper -def _cmp(a, b): # TODO: type hints +def _cmp(a: T_cmp, b: T_cmp) -> int: """Return negative if ab.""" return (a > b) - (a < b) @@ -137,7 +138,7 @@ def __init__( self._build = None if build is None else str(build) @classmethod - def _nat_cmp(cls, a, b): # TODO: type hints + def _nat_cmp(cls, a: Optional[str], b: Optional[str]) -> int: def cmp_prerelease_tag(a, b): if isinstance(a, int) and isinstance(b, int): return _cmp(a, b) @@ -150,9 +151,10 @@ def cmp_prerelease_tag(a, b): a, b = a or "", b or "" a_parts, b_parts = a.split("."), b.split(".") - a_parts = [int(x) if re.match(r"^\d+$", x) else x for x in a_parts] - b_parts = [int(x) if re.match(r"^\d+$", x) else x for x in b_parts] - for sub_a, sub_b in zip(a_parts, b_parts): + re_digits = re.compile(r"^\d+$") + parts_a = [int(x) if re_digits.match(x) else x for x in a_parts] + parts_b = [int(x) if re_digits.match(x) else x for x in b_parts] + for sub_a, sub_b in zip(parts_a, parts_b): cmp_result = cmp_prerelease_tag(sub_a, sub_b) if cmp_result != 0: return cmp_result From 2072a6817a0a3d9522a27e2ce47586775e289087 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Thu, 17 Oct 2024 13:43:32 +0200 Subject: [PATCH 42/51] GH Action: Include Python 3.13 --- .github/workflows/python-testing.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/python-testing.yml b/.github/workflows/python-testing.yml index db555cc0..959336c8 100644 --- a/.github/workflows/python-testing.yml +++ b/.github/workflows/python-testing.yml @@ -105,6 +105,7 @@ jobs: "3.10", "3.11", "3.12", + "3.13", ] os: ["ubuntu-latest", "macos-latest"] exclude: From 0f30183605ebb1cb43de1a6b8baad5dcd754f685 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Thu, 17 Oct 2024 12:59:16 +0200 Subject: [PATCH 43/51] Improve private _nat_cmp() method * Remove obsolete else * Find a better way to identify digits without the re module * Fix docstring in compare --- src/semver/version.py | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/semver/version.py b/src/semver/version.py index e3b9229f..2f1f8cb7 100644 --- a/src/semver/version.py +++ b/src/semver/version.py @@ -149,17 +149,15 @@ def cmp_prerelease_tag(a, b): else: return _cmp(a, b) - a, b = a or "", b or "" - a_parts, b_parts = a.split("."), b.split(".") - re_digits = re.compile(r"^\d+$") - parts_a = [int(x) if re_digits.match(x) else x for x in a_parts] - parts_b = [int(x) if re_digits.match(x) else x for x in b_parts] - for sub_a, sub_b in zip(parts_a, parts_b): + a_parts = [int(x) if x.isdigit() else x for x in (a or "").split(".")] + b_parts = [int(x) if x.isdigit() else x for x in (b or "").split(".")] + + for sub_a, sub_b in zip(a_parts, b_parts): cmp_result = cmp_prerelease_tag(sub_a, sub_b) if cmp_result != 0: return cmp_result - else: - return _cmp(len(a), len(b)) + + return _cmp(len(a_parts), len(b_parts)) @property def major(self) -> int: @@ -384,13 +382,11 @@ def compare(self, other: Comparable) -> int: :return: The return value is negative if ver1 < ver2, zero if ver1 == ver2 and strictly positive if ver1 > ver2 - >>> semver.compare("2.0.0") + >>> Version.parse("1.0.0").compare("2.0.0") -1 - >>> semver.compare("1.0.0") + >>> Version.parse("2.0.0").compare("1.0.0") 1 - >>> semver.compare("2.0.0") - 0 - >>> semver.compare(dict(major=2, minor=0, patch=0)) + >>> Version.parse("2.0.0").compare("2.0.0") 0 """ cls = type(self) From 6208a548e9b2c6923fa42ec280b2005f6f3619ff Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Mon, 4 Nov 2024 08:55:08 +0100 Subject: [PATCH 44/51] Modernize project configs with uv & pyproject.toml * Raise version to 3.0.3-alpha.1 * In pyproject.toml: - Use new dependency group from PEP 735 - Move all project related data from setup.cfg to pyproject.toml - Consolidate flake8, pycodestyle with ruff - Split Towncrier config type "trivial" into "trivial" and "internal" * Add uv's lock file (uv.lock) * Create config file for ruff (.ruff.toml) * Create config file for pytest (.pytest.ini) * Simplify tox.ini and remove old stuff * Document installation with new uv command * Simplify Sphinx config with find_version() * Update the authors * Use uv in GitHub Action python-testing.yml workflow --- .editorconfig | 1 + .github/workflows/python-testing.yml | 52 +- .pytest.ini | 15 + .ruff.toml | 53 + changelog.d/pr447.internal.rst | 15 + docs/Makefile | 6 + docs/conf.py | 39 +- docs/install.rst | 22 +- docs/usage/semver-version.rst | 2 +- pyproject.toml | 122 ++- setup.cfg | 78 -- src/semver/__about__.py | 2 +- tox.ini | 35 +- uv.lock | 1408 ++++++++++++++++++++++++++ 14 files changed, 1691 insertions(+), 159 deletions(-) create mode 100644 .pytest.ini create mode 100644 .ruff.toml create mode 100644 changelog.d/pr447.internal.rst create mode 100644 uv.lock diff --git a/.editorconfig b/.editorconfig index 573ac0f4..c98add8c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,6 +4,7 @@ root = true [*] end_of_line = lf charset = utf-8 +max_line_length = 99 [*.py] indent_style = space diff --git a/.github/workflows/python-testing.yml b/.github/workflows/python-testing.yml index 959336c8..7c5759ce 100644 --- a/.github/workflows/python-testing.yml +++ b/.github/workflows/python-testing.yml @@ -71,30 +71,34 @@ jobs: check: runs-on: ubuntu-latest needs: check-files - # Timout of 15min timeout-minutes: 15 # needs.check-files.outputs.can_run if: ${{ needs.check-files.outputs.can_run == '1' }} steps: - uses: actions/checkout@v4 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 + + - name: Install uv + uses: astral-sh/setup-uv@v3 with: - python-version: 3.8 - cache: 'pip' - - name: Install dependencies - run: | - python3 -m pip install --upgrade pip setuptools>60 setuptools-scm>=60 - pip install tox tox-gh-actions - - name: Check + enable-cache: true + + - name: Set up Python 3.7 + # check tox.ini for the lowest version + run: uv python install 3.7 + + - name: Install the project run: | - tox run -e checks + uv sync --all-extras --group gh-action + + - name: Checks + continue-on-error: true + run: uv run tox run -e checks tests: needs: check runs-on: ${{ matrix.os }} - continue-on-error: true + # continue-on-error: true strategy: max-parallel: 5 fail-fast: true @@ -114,15 +118,17 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set up Python ${{ matrix.python-version }} for ${{ matrix.os }} - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python-version }} - cache: 'pip' - - name: Install dependencies - run: | - python3 -m pip install --upgrade pip - pip install tox tox-gh-actions - - name: Test with tox + + - name: Install uv + uses: astral-sh/setup-uv@v3 + + - name: Set up Python ${{ matrix.python-version }} + run: uv python install ${{ matrix.python-version }} + + - name: Install the project run: | - tox run + uv sync --all-extras --dev + uv pip install tox tox-gh-actions + + - name: Checks + run: uv run tox run -e ${{ matrix.python-version }} diff --git a/.pytest.ini b/.pytest.ini new file mode 100644 index 00000000..2058b4fd --- /dev/null +++ b/.pytest.ini @@ -0,0 +1,15 @@ +[pytest] +norecursedirs = .git build .env/ env/ .pyenv/ .tmp/ .eggs/ venv/ +testpaths = tests docs +pythonpath = src tests +filterwarnings = + ignore:Function 'semver.*:DeprecationWarning + # ' <- This apostroph is just to fix syntax highlighting +addopts = + --import-mode=importlib + --no-cov-on-fail + --cov=semver + --cov-report=term-missing + --doctest-glob='*.rst' + --doctest-modules + --doctest-report ndiff \ No newline at end of file diff --git a/.ruff.toml b/.ruff.toml new file mode 100644 index 00000000..ddcdbb07 --- /dev/null +++ b/.ruff.toml @@ -0,0 +1,53 @@ +# +# Configuration file for ruff +# See https://docs.astral.sh/ruff/configuration/ + +line-length = 88 +indent-width = 4 +include = [ + "pyproject.toml", + "src/**/*.py", + "tests/**/*.py", + "docs/**/*.py", +] + +[lint] +extend-ignore = [ + "RUF005", + "RUF012", + # Comment contains ambiguous `’` (RIGHT SINGLE QUOTATION MARK): + "RUF003", + "ISC001", +] +select = [ + "F", # pyflakes + "E", # pycodestyle + "I", # isort + "N", # pep8-naming + "UP", # pyupgrade + "RUF", # ruff + "B", # flake8-bugbear + "C4", # flake8-comprehensions + "ISC", # flake8-implicit-str-concat + "PTH", # flake8-use-pathlib + "SIM", # flake8-simplify + "TID", # flake8-tidy-imports +] +# TODO: Remove ISC001 ignore when formatter updated: https://github.com/astral-sh/ruff/issues/8272 + + +[format] +# Exclude type hint stub files from formatting. +exclude = ["*.pyi"] + +# Like Black, use double quotes for strings. +quote-style = "double" + +# Like Black, indent with spaces, rather than tabs. +indent-style = "space" + +# Like Black, respect magic trailing commas. +skip-magic-trailing-comma = false + +docstring-code-format = true +docstring-code-line-length = "dynamic" \ No newline at end of file diff --git a/changelog.d/pr447.internal.rst b/changelog.d/pr447.internal.rst new file mode 100644 index 00000000..2f1e367d --- /dev/null +++ b/changelog.d/pr447.internal.rst @@ -0,0 +1,15 @@ +Modernize project configs with :file:`pyproject.toml` + +* In :file:`pyproject.toml`: + * Move all project related data from :file:`setup.cfg` to :file:`pyproject.toml` + * Use new dependency group from :pep:`735` + * Consolidate flake8, isort, pycodestyle with ruff + * Split towncrier config type "trivial" into "trivial" and + "internal" +* Create config file for ruff (:file:`.ruff.toml`) +* Create config file for pytest (:file:`.pytest.ini`) +* Simplify :file:`tox.ini` and remove old stuff +* Document installation with new :command:`uv` command +* Simplify Sphinx config with :func:`find_version()` +* Update the authors +* Use :command:`uv` in GitHub Action :file:`python-testing.yml` workflow diff --git a/docs/Makefile b/docs/Makefile index ea7c53f0..a38fc5bd 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -8,6 +8,12 @@ SPHINXPROJ = semver SOURCEDIR = . BUILDDIR = _build +# Set the source directory for your project +SRC_DIR = ../src + +# Set the PYTHONPATH environment variable +export PYTHONPATH := $(SRC_DIR):$(PYTHONPATH) + # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/conf.py b/docs/conf.py index 801e9eaf..872f943a 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# -*- coding: utf-8 -*- # # python-semver documentation build configuration file # @@ -16,37 +15,31 @@ # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # -import codecs -from datetime import date + import os import re -import sys +from datetime import date +from pathlib import Path -SRC_DIR = os.path.abspath("../src/") -sys.path.insert(0, SRC_DIR) -# from semver import __version__ # noqa: E402 +SRC_DIR = Path(__file__).absolute().parent.parent / "src" YEAR = date.today().year -def read(*parts): - """ - Build an absolute path from *parts* and and return the contents of the - resulting file. Assume UTF-8 encoding. - """ - here = os.path.abspath(os.path.dirname(__file__)) - with codecs.open(os.path.join(here, *parts), "rb", "utf-8") as f: - return f.read() - - -def find_version(*file_paths): +def find_version(path: Path) -> str: """ Build a path from *file_paths* and search for a ``__version__`` string inside. """ - version_file = read(*file_paths) - version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]", version_file, re.M) + content = Path(path).read_text(encoding="utf-8") + + version_match = re.search( + r"^__version__ = ['\"]([^'\"]*)['\"]", + content, + re.MULTILINE + ) if version_match: return version_match.group(1) + raise RuntimeError("Unable to find version string.") @@ -86,14 +79,14 @@ def find_version(*file_paths): # General information about the project. project = "python-semver" copyright = f"{YEAR}, Kostiantyn Rybnikov and all" -author = "Kostiantyn Rybnikov and all" +author = "Kostiantyn Rybnikov, Tom Schraitle, Sebastien Celles, and others" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. -release = find_version("../src/semver/__about__.py") +release = find_version(SRC_DIR / "semver/__about__.py") # The full version, including alpha/beta/rc tags. version = release # .rsplit(u".", 1)[0] @@ -174,7 +167,7 @@ def find_version(*file_paths): "github_button": True, #: "github_type": "star", - #: whether to apply a ‘Fork me on Github’ banner + #: whether to apply a "Fork me on Github" banner #: in the top right corner of the page: # "github_banner": True, # diff --git a/docs/install.rst b/docs/install.rst index 380a4bb5..786ecc40 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -25,10 +25,11 @@ For users who have to stay with major 2 releases only, use the following line:: semver>=2,<3 -Pip ---- +With Pip +-------- .. code-block:: bash + :name: install-pip pip3 install semver @@ -40,6 +41,19 @@ with an URL and its version: pip3 install git+https://github.com/python-semver/python-semver.git@3.0.0 +With uv +------- + +First, install the :command:`uv` command. Refer to https://docs.astral.sh/uv/getting-started/installation/ for more information. + +Then use the command :command:`uv` to install the package: + +.. code-block:: bash + :name: install-uv + + uv pip install semver + + Linux Distributions ------------------- @@ -101,7 +115,9 @@ openSUSE 1. Enable the ``devel:languages:python`` repository of the Open Build Service:: - $ sudo zypper addrepo --refresh obs://devel:languages:python devel_languages_python + $ sudo zypper addrepo --refresh \ + --name devel_languages_python \ + "https://download.opensuse.org/repositories/devel:/languages:/python/\$releasever" 2. Install the package:: diff --git a/docs/usage/semver-version.rst b/docs/usage/semver-version.rst index ac580f98..51165293 100644 --- a/docs/usage/semver-version.rst +++ b/docs/usage/semver-version.rst @@ -4,4 +4,4 @@ Getting the Version of semver To know the version of semver itself, use the following construct:: >>> semver.__version__ - '3.0.2' + '3.0.3-alpha.1' diff --git a/pyproject.toml b/pyproject.toml index ce540deb..6c9cb93a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,15 +8,128 @@ [build-system] requires = [ # sync with setup.py until we discard non-pep-517/518 - "setuptools", - "setuptools-scm", + "setuptools>=61", + # "setuptools-scm>=8", ] build-backend = "setuptools.build_meta" + +[project] +requires-python = ">=3.7" +name = "semver" +description = "Python helper for Semantic Versioning (https://semver.org)" +readme = "README.rst" +# readme.content-type = "text/x-rst" +license = { file = "LICENSE.txt" } +authors = [ + {name = "Kostiantyn Rybnikov", email = "k-bx@k-bx.com"}, + {name = "Tom Schraitle", email = "toms@suse.de"}, +] +maintainers = [ + {name = "Tom Schraitle", email = "toms@suse.de"}, + {name = "Sebastien Celles", email = "s.celles@gmail.com"}, +] +dynamic = ["version",] +classifiers = [ + "Environment :: Web Environment", + "Intended Audience :: Developers", + "Development Status :: 5 - Production/Stable", + "License :: OSI Approved :: BSD License", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", + "Topic :: Software Development :: Libraries :: Python Modules", +] + + +[project.urls] +"GitHub Homepage" = "https://github.com/python-semver/python-semver" +Changelog = "https://python-semver.readthedocs.io/en/latest/changelog.html" +Documentation = "https://python-semver.rtfd.io" +Releases = "https://github.com/python-semver/python-semver/releases" +"Bug Tracker" = "https://github.com/python-semver/python-semver/issues" + + +[project.scripts] +pysemver = "semver.cli:main" + + +[dependency-groups] +# See https://github.com/astral-sh/uv/issues/5632 +# See https://peps.python.org/pep-0735/ +typing = [ + "mypy", + "pyright", +] +formatting = [ + "black", + "ruff", + "docformatter", +] +test = [ + "tox", + "pytest", + "pytest-cov", + +] +publish = [ + "twine", + # pyproject-build is required for building the package + "build", +] +changelog = [ + "towncrier", +] +docs = [ + # Required in .readthedocs.yaml + "sphinx", # ==7.0.1 + "sphinx-argparse", # ==0.4.0 + "sphinx-autodoc-typehints", # ==1.24.0 +] +devel = [ + {include-group = "typing"}, + {include-group = "formatting"}, + {include-group = "test"}, + {include-group = "changelog"}, + {include-group = "docs"}, + {include-group = "publish"}, +] +# Only needed when using GitHub Actions +gh-action = [ + {include-group = "devel"}, + "tox-gh-actions", +] + +# --- Setuptools configuration --- +[tool.setuptools] +package-dir = {"" = "src"} +package-data = { "semver" = ["py.typed"] } +include-package-data = true + + +[tool.setuptools.packages.find] +# Is that still necessary? +# list of folders that contain the packages (["."] by default) +where = ["src"] + + +[tool.setuptools.dynamic] +version = {attr = "semver.__about__.__version__"} + + +# --------------------------------- [tool.setuptools_scm] version_scheme = "post-release" local_scheme = "dirty-tag" + [tool.mypy] # ignore_missing_imports = true check_untyped_defs = true @@ -70,4 +183,7 @@ name = "Features" name = "Removals" [tool.towncrier.fragment.trivial] -name = "Trivial/Internal Changes" +name = "Trivial Changes" + +[tool.towncrier.fragment.internal] +name = "Internal Changes" diff --git a/setup.cfg b/setup.cfg index 7f1878c2..813d2533 100644 --- a/setup.cfg +++ b/setup.cfg @@ -3,84 +3,6 @@ # # See https://setuptools.rtfd.io/en/latest/userguide/declarative_config.html -[metadata] -name = semver -version = attr: semver.__about__.__version__ -description = Python helper for Semantic Versioning (https://semver.org) -long_description = file: README.rst -long_description_content_type = text/x-rst -author = Kostiantyn Rybnikov -author_email = k-bx@k-bx.com -maintainer = Sebastien Celles, Tom Schraitle -maintainer_email = s.celles@gmail.com -url = https://github.com/python-semver/python-semver -project_urls = - Changelog = https://python-semver.readthedocs.io/en/latest/changelog.html - Documentation = https://python-semver.rtfd.io - Releases = https://github.com/python-semver/python-semver/releases - Bug Tracker = https://github.com/python-semver/python-semver/issues -classifiers = - Environment :: Web Environment - Intended Audience :: Developers - License :: OSI Approved :: BSD License - Operating System :: OS Independent - Programming Language :: Python - Programming Language :: Python :: 3 - Programming Language :: Python :: 3.7 - Programming Language :: Python :: 3.8 - Programming Language :: Python :: 3.9 - Programming Language :: Python :: 3.10 - Programming Language :: Python :: 3.11 - Programming Language :: Python :: 3.12 - Topic :: Software Development :: Libraries :: Python Modules -license = BSD - -[options] -package_dir = - =src -packages = find: -python_requires = >=3.7 -include_package_data = True - -[options.entry_points] -console_scripts = - pysemver = semver.cli:main - -[options.packages.find] -where = src - -[options.package_data] -semver = py.typed - -[tool:pytest] -norecursedirs = .git build .env/ env/ .pyenv/ .tmp/ .eggs/ venv/ -testpaths = tests docs -pythonpath = src tests -filterwarnings = - ignore:Function 'semver.*:DeprecationWarning - # ' <- This apostroph is just to fix syntax highlighting -addopts = - --import-mode=importlib - --no-cov-on-fail - --cov=semver - --cov-report=term-missing - --doctest-glob='*.rst' - --doctest-modules - --doctest-report ndiff - -[flake8] -max-line-length = 88 -extend-ignore = E203,E701 -extend-exclude = - .eggs - .env - build - docs - venv* - .venv* - conftest.py - src/semver/__init__.py - tasks.py [pycodestyle] count = False diff --git a/src/semver/__about__.py b/src/semver/__about__.py index a0d9cf90..697372f8 100644 --- a/src/semver/__about__.py +++ b/src/semver/__about__.py @@ -16,7 +16,7 @@ """ #: Semver version -__version__ = "3.0.2" +__version__ = "3.0.3-alpha.1" #: Original semver author __author__ = "Kostiantyn Rybnikov" diff --git a/tox.ini b/tox.ini index 1bc77e1b..74918c44 100644 --- a/tox.ini +++ b/tox.ini @@ -1,19 +1,20 @@ [tox] envlist = checks - py3{7,8,9,10,11,12} + py3{7,8,9,10,11,12,13} isolated_build = True skip_missing_interpreters = True [gh-actions] python = # setuptools >=62 needs Python >=3.7 - 3.7: py37,check + 3.7: py37,checks 3.8: py38 3.9: py39 3.10: py310 3.11: py311 3.12: py312 + 3.13: py313 [testenv] @@ -30,21 +31,6 @@ setenv = PIP_DISABLE_PIP_VERSION_CHECK = 1 -[testenv:black] -description = Check for formatting changes -basepython = python3 -skip_install = true -deps = black -commands = black --check {posargs:.} - - -[testenv:flake8] -description = Check code style -basepython = python3 -deps = flake8 -commands = flake8 {posargs:} - - [testenv:mypy] description = Check code style basepython = python3 @@ -64,15 +50,9 @@ commands = description = Run code style checks basepython = python3 deps = - {[testenv:black]deps} - {[testenv:flake8]deps} - {[testenv:mypy]deps} - {[testenv:docstrings]deps} + ruff commands = - - {[testenv:docstrings]commands} - {[testenv:black]commands} - {[testenv:flake8]commands} - {[testenv:mypy]commands} + ruff check [testenv:docs] @@ -84,9 +64,10 @@ allowlist_externals = make echo commands = - make -C docs html + uvx make -C docs html commands_post = - echo "Find the HTML documentation at {toxinidir}/docs/_build/html/index.html" + echo "Find the HTML documentation at file://{toxinidir}/docs/_build/html/index.html" + [testenv:man] description = Build the manpage diff --git a/uv.lock b/uv.lock new file mode 100644 index 00000000..026a5848 --- /dev/null +++ b/uv.lock @@ -0,0 +1,1408 @@ +version = 1 +requires-python = ">=3.7" + +[[package]] +name = "alabaster" +version = "0.7.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/71/a8ee96d1fd95ca04a0d2e2d9c4081dac4c2d2b12f7ddb899c8cb9bfd1532/alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2", size = 11454 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/88/c7083fc61120ab661c5d0b82cb77079fc1429d3f913a456c1c82cf4658f7/alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3", size = 13857 }, +] + +[[package]] +name = "babel" +version = "2.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytz", marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e2/80/cfbe44a9085d112e983282ee7ca4c00429bc4d1ce86ee5f4e60259ddff7f/Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363", size = 10795622 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/35/4196b21041e29a42dc4f05866d0c94fa26c9da88ce12c38c2265e42c82fb/Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287", size = 11034798 }, +] + +[[package]] +name = "black" +version = "23.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "mypy-extensions" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "platformdirs" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "typed-ast", marker = "python_full_version < '3.8' and implementation_name == 'cpython'" }, + { name = "typing-extensions", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/36/66370f5017b100225ec4950a60caeef60201a10080da57ddb24124453fba/black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940", size = 582156 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/f4/7908f71cc71da08df1317a3619f002cbf91927fb5d3ffc7723905a2113f7/black-23.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915", size = 1342273 }, + { url = "https://files.pythonhosted.org/packages/27/70/07aab2623cfd3789786f17e051487a41d5657258c7b1ef8f780512ffea9c/black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9", size = 2676721 }, + { url = "https://files.pythonhosted.org/packages/29/b1/b584fc863c155653963039664a592b3327b002405043b7e761b9b0212337/black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2", size = 1520336 }, + { url = "https://files.pythonhosted.org/packages/6d/b4/0f13ab7f5e364795ff82b76b0f9a4c9c50afda6f1e2feeb8b03fdd7ec57d/black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c", size = 1654611 }, + { url = "https://files.pythonhosted.org/packages/de/b4/76f152c5eb0be5471c22cd18380d31d188930377a1a57969073b89d6615d/black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c", size = 1286657 }, + { url = "https://files.pythonhosted.org/packages/d7/6f/d3832960a3b646b333b7f0d80d336a3c123012e9d9d5dba4a622b2b6181d/black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6", size = 1326112 }, + { url = "https://files.pythonhosted.org/packages/eb/a5/17b40bfd9b607b69fa726b0b3a473d14b093dcd5191ea1a1dd664eccfee3/black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b", size = 2643808 }, + { url = "https://files.pythonhosted.org/packages/69/49/7e1f0cf585b0d607aad3f971f95982cc4208fc77f92363d632d23021ee57/black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d", size = 1503287 }, + { url = "https://files.pythonhosted.org/packages/c0/53/42e312c17cfda5c8fc4b6b396a508218807a3fcbb963b318e49d3ddd11d5/black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70", size = 1638625 }, + { url = "https://files.pythonhosted.org/packages/3f/0d/81dd4194ce7057c199d4f28e4c2a885082d9d929e7a55c514b23784f7787/black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326", size = 1293585 }, + { url = "https://files.pythonhosted.org/packages/24/eb/2d2d2c27cb64cfd073896f62a952a802cd83cf943a692a2f278525b57ca9/black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b", size = 1447428 }, + { url = "https://files.pythonhosted.org/packages/49/36/15d2122f90ff1cd70f06892ebda777b650218cf84b56b5916a993dc1359a/black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2", size = 1576467 }, + { url = "https://files.pythonhosted.org/packages/ca/44/eb41edd3f558a6139f09eee052dead4a7a464e563b822ddf236f5a8ee286/black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925", size = 1226437 }, + { url = "https://files.pythonhosted.org/packages/ce/f4/2b0c6ac9e1f8584296747f66dd511898b4ebd51d6510dba118279bff53b6/black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27", size = 1331955 }, + { url = "https://files.pythonhosted.org/packages/21/14/d5a2bec5fb15f9118baab7123d344646fac0b1c6939d51c2b05259cd2d9c/black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331", size = 2658520 }, + { url = "https://files.pythonhosted.org/packages/13/0a/ed8b66c299e896780e4528eed4018f5b084da3b9ba4ee48328550567d866/black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5", size = 1509852 }, + { url = "https://files.pythonhosted.org/packages/12/4b/99c71d1cf1353edd5aff2700b8960f92e9b805c9dab72639b67dbb449d3a/black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961", size = 1641852 }, + { url = "https://files.pythonhosted.org/packages/d1/6e/5810b6992ed70403124c67e8b3f62858a32b35405177553f1a78ed6b6e31/black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8", size = 1297694 }, + { url = "https://files.pythonhosted.org/packages/13/25/cfa06788d0a936f2445af88f13604b5bcd5c9d050db618c718e6ebe66f74/black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30", size = 1341089 }, + { url = "https://files.pythonhosted.org/packages/fd/5b/fc2d7922c1a6bb49458d424b5be71d251f2d0dc97be9534e35d171bdc653/black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3", size = 2674699 }, + { url = "https://files.pythonhosted.org/packages/49/d7/f3b7da6c772800f5375aeb050a3dcf682f0bbeb41d313c9c2820d0156e4e/black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266", size = 1519946 }, + { url = "https://files.pythonhosted.org/packages/3c/d7/85f3d79f9e543402de2244c4d117793f262149e404ea0168841613c33e07/black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab", size = 1654176 }, + { url = "https://files.pythonhosted.org/packages/06/1e/273d610249f0335afb1ddb03664a03223f4826e3d1a95170a0142cb19fb4/black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb", size = 1286299 }, + { url = "https://files.pythonhosted.org/packages/ad/e7/4642b7f462381799393fbad894ba4b32db00870a797f0616c197b07129a9/black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4", size = 180965 }, +] + +[[package]] +name = "bleach" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7e/e6/d5f220ca638f6a25557a611860482cb6e54b2d97f0332966b1b005742e1f/bleach-6.0.0.tar.gz", hash = "sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414", size = 201298 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ac/e2/dfcab68c9b2e7800c8f06b85c76e5f978d05b195a958daa9b1dda54a1db6/bleach-6.0.0-py3-none-any.whl", hash = "sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4", size = 162493 }, +] + +[[package]] +name = "build" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "importlib-metadata", marker = "python_full_version < '3.10.2'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/f7/7bd626bc41b59152248087c1b56dd9f5d09c3f817b96075dc3cbda539dc7/build-1.1.1.tar.gz", hash = "sha256:8eea65bb45b1aac2e734ba2cc8dad3a6d97d97901a395bd0ed3e7b46953d2a31", size = 44711 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/81/4849059526d02fcc9708e19346dd740e8b9edd2f0675ea7c38302d6729df/build-1.1.1-py3-none-any.whl", hash = "sha256:8ed0851ee76e6e38adce47e4bee3b51c771d86c64cf578d0c2245567ee200e73", size = 19719 }, +] + +[[package]] +name = "cachetools" +version = "5.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/38/a0f315319737ecf45b4319a8cd1f3a908e29d9277b46942263292115eee7/cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a", size = 27661 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/07/14f8ad37f2d12a5ce41206c21820d8cb6561b728e51fad4530dff0552a67/cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292", size = 9524 }, +] + +[[package]] +name = "certifi" +version = "2024.8.30" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9", size = 168507 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", size = 167321 }, +] + +[[package]] +name = "cffi" +version = "1.15.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2b/a8/050ab4f0c3d4c1b8aaa805f70e26e84d0e27004907c5b8ecc1d31815f92a/cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9", size = 508501 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/a3/c5f01988ddb70a187c3e6112152e01696188c9f8a4fa4c68aa330adbb179/cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd", size = 421712 }, + { url = "https://files.pythonhosted.org/packages/ef/41/19da352d341963d29a33bdb28433ba94c05672fb16155f794fad3fd907b0/cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc", size = 449886 }, + { url = "https://files.pythonhosted.org/packages/af/da/9441d56d7dd19d07dcc40a2a5031a1f51c82a27cee3705edf53dadcac398/cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f", size = 450520 }, + { url = "https://files.pythonhosted.org/packages/aa/02/ab15b3aa572759df752491d5fa0f74128cd14e002e8e3257c1ab1587810b/cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e", size = 446015 }, + { url = "https://files.pythonhosted.org/packages/88/89/c34caf63029fb7628ec2ebd5c88ae0c9bd17db98c812e4065a4d020ca41f/cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4", size = 441830 }, + { url = "https://files.pythonhosted.org/packages/32/bd/d0809593f7976828f06a492716fbcbbfb62798bbf60ea1f65200b8d49901/cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01", size = 434743 }, + { url = "https://files.pythonhosted.org/packages/0e/65/0d7b5dad821ced4dcd43f96a362905a68ce71e6b5f5cfd2fada867840582/cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e", size = 464113 }, + { url = "https://files.pythonhosted.org/packages/10/72/617ee266192223a38b67149c830bd9376b69cf3551e1477abc72ff23ef8e/cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9", size = 441694 }, + { url = "https://files.pythonhosted.org/packages/91/bc/b7723c2fe7a22eee71d7edf2102cd43423d5f95ff3932ebaa2f82c7ec8d0/cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c", size = 470613 }, + { url = "https://files.pythonhosted.org/packages/5d/4e/4e0bb5579b01fdbfd4388bd1eb9394a989e1336203a4b7f700d887b233c1/cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325", size = 472199 }, + { url = "https://files.pythonhosted.org/packages/37/5a/c37631a86be838bdd84cc0259130942bf7e6e32f70f4cab95f479847fb91/cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c", size = 462588 }, + { url = "https://files.pythonhosted.org/packages/71/d7/0fe0d91b0bbf610fb7254bb164fa8931596e660d62e90fb6289b7ee27b09/cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef", size = 450543 }, + { url = "https://files.pythonhosted.org/packages/d3/56/3e94aa719ae96eeda8b68b3ec6e347e0a23168c6841dc276ccdcdadc9f32/cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8", size = 474253 }, + { url = "https://files.pythonhosted.org/packages/c2/0b/3b09a755ddb977c167e6d209a7536f6ade43bb0654bad42e08df1406b8e4/cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e", size = 405992 }, + { url = "https://files.pythonhosted.org/packages/5b/1a/e1ee5bed11d8b6540c05a8e3c32448832d775364d4461dd6497374533401/cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82", size = 435560 }, + { url = "https://files.pythonhosted.org/packages/d3/e1/e55ca2e0dd446caa2cc8f73c2b98879c04a1f4064ac529e1836683ca58b8/cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b", size = 435478 }, + { url = "https://files.pythonhosted.org/packages/2e/7a/68c35c151e5b7a12650ecc12fdfb85211aa1da43e9924598451c4a0a3839/cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c", size = 430395 }, + { url = "https://files.pythonhosted.org/packages/93/d0/2e2b27ea2f69b0ec9e481647822f8f77f5fc23faca2dd00d1ff009940eb7/cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426", size = 427911 }, + { url = "https://files.pythonhosted.org/packages/22/c6/df826563f55f7e9dd9a1d3617866282afa969fe0d57decffa1911f416ed8/cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a", size = 421947 }, + { url = "https://files.pythonhosted.org/packages/c1/25/16a082701378170559bb1d0e9ef2d293cece8dc62913d79351beb34c5ddf/cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5", size = 449906 }, + { url = "https://files.pythonhosted.org/packages/df/02/aef53d4aa43154b829e9707c8c60bab413cd21819c4a36b0d7aaa83e2a61/cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca", size = 451028 }, + { url = "https://files.pythonhosted.org/packages/79/4b/33494eb0adbcd884656c48f6db0c98ad8a5c678fb8fb5ed41ab546b04d8c/cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02", size = 446520 }, + { url = "https://files.pythonhosted.org/packages/b7/8b/06f30caa03b5b3ac006de4f93478dbd0239e2a16566d81a106c322dc4f79/cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192", size = 442655 }, + { url = "https://files.pythonhosted.org/packages/85/1f/a3c533f8d377da5ca7edb4f580cc3edc1edbebc45fac8bb3ae60f1176629/cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415", size = 420641 }, + { url = "https://files.pythonhosted.org/packages/77/b7/d3618d612be01e184033eab90006f8ca5b5edafd17bf247439ea4e167d8a/cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d", size = 448814 }, + { url = "https://files.pythonhosted.org/packages/a9/ba/e082df21ebaa9cb29f2c4e1d7e49a29b90fcd667d43632c6674a16d65382/cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984", size = 449647 }, + { url = "https://files.pythonhosted.org/packages/af/cb/53b7bba75a18372d57113ba934b27d0734206c283c1dfcc172347fbd9f76/cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35", size = 445191 }, + { url = "https://files.pythonhosted.org/packages/2d/86/3ca57cddfa0419f6a95d1c8478f8f622ba597e3581fd501bbb915b20eb75/cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", size = 441236 }, + { url = "https://files.pythonhosted.org/packages/ad/26/7b3a73ab7d82a64664c7c4ea470e4ec4a3c73bb4f02575c543a41e272de5/cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76", size = 433865 }, + { url = "https://files.pythonhosted.org/packages/da/ff/ab939e2c7b3f40d851c0f7192c876f1910f3442080c9c846532993ec3cef/cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3", size = 463090 }, +] + +[[package]] +name = "chardet" +version = "5.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/f7b6ab21ec75897ed80c17d79b15951a719226b9fababf1e40ea74d69079/chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", size = 2069618 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970", size = 199385 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", size = 106620 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/8b/825cc84cf13a28bfbcba7c416ec22bf85a9584971be15b21dd8300c65b7f/charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6", size = 196363 }, + { url = "https://files.pythonhosted.org/packages/23/81/d7eef6a99e42c77f444fdd7bc894b0ceca6c3a95c51239e74a722039521c/charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b", size = 125639 }, + { url = "https://files.pythonhosted.org/packages/21/67/b4564d81f48042f520c948abac7079356e94b30cb8ffb22e747532cf469d/charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99", size = 120451 }, + { url = "https://files.pythonhosted.org/packages/c2/72/12a7f0943dd71fb5b4e7b55c41327ac0a1663046a868ee4d0d8e9c369b85/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca", size = 140041 }, + { url = "https://files.pythonhosted.org/packages/67/56/fa28c2c3e31217c4c52158537a2cf5d98a6c1e89d31faf476c89391cd16b/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d", size = 150333 }, + { url = "https://files.pythonhosted.org/packages/f9/d2/466a9be1f32d89eb1554cf84073a5ed9262047acee1ab39cbaefc19635d2/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7", size = 142921 }, + { url = "https://files.pythonhosted.org/packages/f8/01/344ec40cf5d85c1da3c1f57566c59e0c9b56bcc5566c08804a95a6cc8257/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3", size = 144785 }, + { url = "https://files.pythonhosted.org/packages/73/8b/2102692cb6d7e9f03b9a33a710e0164cadfce312872e3efc7cfe22ed26b4/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907", size = 146631 }, + { url = "https://files.pythonhosted.org/packages/d8/96/cc2c1b5d994119ce9f088a9a0c3ebd489d360a2eb058e2c8049f27092847/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b", size = 140867 }, + { url = "https://files.pythonhosted.org/packages/c9/27/cde291783715b8ec30a61c810d0120411844bc4c23b50189b81188b273db/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912", size = 149273 }, + { url = "https://files.pythonhosted.org/packages/3a/a4/8633b0fc1a2d1834d5393dafecce4a1cc56727bfd82b4dc18fc92f0d3cc3/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95", size = 152437 }, + { url = "https://files.pythonhosted.org/packages/64/ea/69af161062166b5975ccbb0961fd2384853190c70786f288684490913bf5/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e", size = 150087 }, + { url = "https://files.pythonhosted.org/packages/3b/fd/e60a9d9fd967f4ad5a92810138192f825d77b4fa2a557990fd575a47695b/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe", size = 145142 }, + { url = "https://files.pythonhosted.org/packages/6d/02/8cb0988a1e49ac9ce2eed1e07b77ff118f2923e9ebd0ede41ba85f2dcb04/charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc", size = 94701 }, + { url = "https://files.pythonhosted.org/packages/d6/20/f1d4670a8a723c46be695dff449d86d6092916f9e99c53051954ee33a1bc/charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749", size = 102191 }, + { url = "https://files.pythonhosted.org/packages/9c/61/73589dcc7a719582bf56aae309b6103d2762b526bffe189d635a7fcfd998/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", size = 193339 }, + { url = "https://files.pythonhosted.org/packages/77/d5/8c982d58144de49f59571f940e329ad6e8615e1e82ef84584c5eeb5e1d72/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", size = 124366 }, + { url = "https://files.pythonhosted.org/packages/bf/19/411a64f01ee971bed3231111b69eb56f9331a769072de479eae7de52296d/charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", size = 118874 }, + { url = "https://files.pythonhosted.org/packages/4c/92/97509850f0d00e9f14a46bc751daabd0ad7765cff29cdfb66c68b6dad57f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", size = 138243 }, + { url = "https://files.pythonhosted.org/packages/e2/29/d227805bff72ed6d6cb1ce08eec707f7cfbd9868044893617eb331f16295/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", size = 148676 }, + { url = "https://files.pythonhosted.org/packages/13/bc/87c2c9f2c144bedfa62f894c3007cd4530ba4b5351acb10dc786428a50f0/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", size = 141289 }, + { url = "https://files.pythonhosted.org/packages/eb/5b/6f10bad0f6461fa272bfbbdf5d0023b5fb9bc6217c92bf068fa5a99820f5/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", size = 142585 }, + { url = "https://files.pythonhosted.org/packages/3b/a0/a68980ab8a1f45a36d9745d35049c1af57d27255eff8c907e3add84cf68f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5", size = 144408 }, + { url = "https://files.pythonhosted.org/packages/d7/a1/493919799446464ed0299c8eef3c3fad0daf1c3cd48bff9263c731b0d9e2/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", size = 139076 }, + { url = "https://files.pythonhosted.org/packages/fb/9d/9c13753a5a6e0db4a0a6edb1cef7aee39859177b64e1a1e748a6e3ba62c2/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c", size = 146874 }, + { url = "https://files.pythonhosted.org/packages/75/d2/0ab54463d3410709c09266dfb416d032a08f97fd7d60e94b8c6ef54ae14b/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", size = 150871 }, + { url = "https://files.pythonhosted.org/packages/8d/c9/27e41d481557be53d51e60750b85aa40eaf52b841946b3cdeff363105737/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", size = 148546 }, + { url = "https://files.pythonhosted.org/packages/ee/44/4f62042ca8cdc0cabf87c0fc00ae27cd8b53ab68be3605ba6d071f742ad3/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", size = 143048 }, + { url = "https://files.pythonhosted.org/packages/01/f8/38842422988b795220eb8038745d27a675ce066e2ada79516c118f291f07/charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99", size = 94389 }, + { url = "https://files.pythonhosted.org/packages/0b/6e/b13bd47fa9023b3699e94abf565b5a2f0b0be6e9ddac9812182596ee62e4/charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", size = 101752 }, + { url = "https://files.pythonhosted.org/packages/d3/0b/4b7a70987abf9b8196845806198975b6aab4ce016632f817ad758a5aa056/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", size = 194445 }, + { url = "https://files.pythonhosted.org/packages/50/89/354cc56cf4dd2449715bc9a0f54f3aef3dc700d2d62d1fa5bbea53b13426/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", size = 125275 }, + { url = "https://files.pythonhosted.org/packages/fa/44/b730e2a2580110ced837ac083d8ad222343c96bb6b66e9e4e706e4d0b6df/charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", size = 119020 }, + { url = "https://files.pythonhosted.org/packages/9d/e4/9263b8240ed9472a2ae7ddc3e516e71ef46617fe40eaa51221ccd4ad9a27/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", size = 139128 }, + { url = "https://files.pythonhosted.org/packages/6b/e3/9f73e779315a54334240353eaea75854a9a690f3f580e4bd85d977cb2204/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", size = 149277 }, + { url = "https://files.pythonhosted.org/packages/1a/cf/f1f50c2f295312edb8a548d3fa56a5c923b146cd3f24114d5adb7e7be558/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", size = 142174 }, + { url = "https://files.pythonhosted.org/packages/16/92/92a76dc2ff3a12e69ba94e7e05168d37d0345fa08c87e1fe24d0c2a42223/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", size = 143838 }, + { url = "https://files.pythonhosted.org/packages/a4/01/2117ff2b1dfc61695daf2babe4a874bca328489afa85952440b59819e9d7/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", size = 146149 }, + { url = "https://files.pythonhosted.org/packages/f6/9b/93a332b8d25b347f6839ca0a61b7f0287b0930216994e8bf67a75d050255/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", size = 140043 }, + { url = "https://files.pythonhosted.org/packages/ab/f6/7ac4a01adcdecbc7a7587767c776d53d369b8b971382b91211489535acf0/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", size = 148229 }, + { url = "https://files.pythonhosted.org/packages/9d/be/5708ad18161dee7dc6a0f7e6cf3a88ea6279c3e8484844c0590e50e803ef/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", size = 151556 }, + { url = "https://files.pythonhosted.org/packages/5a/bb/3d8bc22bacb9eb89785e83e6723f9888265f3a0de3b9ce724d66bd49884e/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", size = 149772 }, + { url = "https://files.pythonhosted.org/packages/f7/fa/d3fc622de05a86f30beea5fc4e9ac46aead4731e73fd9055496732bcc0a4/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", size = 144800 }, + { url = "https://files.pythonhosted.org/packages/9a/65/bdb9bc496d7d190d725e96816e20e2ae3a6fa42a5cac99c3c3d6ff884118/charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", size = 94836 }, + { url = "https://files.pythonhosted.org/packages/3e/67/7b72b69d25b89c0b3cea583ee372c43aa24df15f0e0f8d3982c57804984b/charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", size = 102187 }, + { url = "https://files.pythonhosted.org/packages/f3/89/68a4c86f1a0002810a27f12e9a7b22feb198c59b2f05231349fbce5c06f4/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", size = 194617 }, + { url = "https://files.pythonhosted.org/packages/4f/cd/8947fe425e2ab0aa57aceb7807af13a0e4162cd21eee42ef5b053447edf5/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", size = 125310 }, + { url = "https://files.pythonhosted.org/packages/5b/f0/b5263e8668a4ee9becc2b451ed909e9c27058337fda5b8c49588183c267a/charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", size = 119126 }, + { url = "https://files.pythonhosted.org/packages/ff/6e/e445afe4f7fda27a533f3234b627b3e515a1b9429bc981c9a5e2aa5d97b6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", size = 139342 }, + { url = "https://files.pythonhosted.org/packages/a1/b2/4af9993b532d93270538ad4926c8e37dc29f2111c36f9c629840c57cd9b3/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", size = 149383 }, + { url = "https://files.pythonhosted.org/packages/fb/6f/4e78c3b97686b871db9be6f31d64e9264e889f8c9d7ab33c771f847f79b7/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", size = 142214 }, + { url = "https://files.pythonhosted.org/packages/2b/c9/1c8fe3ce05d30c87eff498592c89015b19fade13df42850aafae09e94f35/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", size = 144104 }, + { url = "https://files.pythonhosted.org/packages/ee/68/efad5dcb306bf37db7db338338e7bb8ebd8cf38ee5bbd5ceaaaa46f257e6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", size = 146255 }, + { url = "https://files.pythonhosted.org/packages/0c/75/1ed813c3ffd200b1f3e71121c95da3f79e6d2a96120163443b3ad1057505/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", size = 140251 }, + { url = "https://files.pythonhosted.org/packages/7d/0d/6f32255c1979653b448d3c709583557a4d24ff97ac4f3a5be156b2e6a210/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", size = 148474 }, + { url = "https://files.pythonhosted.org/packages/ac/a0/c1b5298de4670d997101fef95b97ac440e8c8d8b4efa5a4d1ef44af82f0d/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", size = 151849 }, + { url = "https://files.pythonhosted.org/packages/04/4f/b3961ba0c664989ba63e30595a3ed0875d6790ff26671e2aae2fdc28a399/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", size = 149781 }, + { url = "https://files.pythonhosted.org/packages/d8/90/6af4cd042066a4adad58ae25648a12c09c879efa4849c705719ba1b23d8c/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482", size = 144970 }, + { url = "https://files.pythonhosted.org/packages/cc/67/e5e7e0cbfefc4ca79025238b43cdf8a2037854195b37d6417f3d0895c4c2/charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", size = 94973 }, + { url = "https://files.pythonhosted.org/packages/65/97/fc9bbc54ee13d33dc54a7fcf17b26368b18505500fc01e228c27b5222d80/charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", size = 102308 }, + { url = "https://files.pythonhosted.org/packages/28/9b/64f11b42d34a9f1fcd05827dd695e91e0b30ac35a9a7aaeb93e84d9f8c76/charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2", size = 121758 }, + { url = "https://files.pythonhosted.org/packages/1f/18/0fc3d61a244ffdee01374b751387f9154ecb8a4d5f931227ecfd31ab46f0/charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7", size = 134949 }, + { url = "https://files.pythonhosted.org/packages/3f/b5/354d544f60614aeb6bf73d3b6c955933e0af5eeaf2eec8c0637293a995bc/charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51", size = 144221 }, + { url = "https://files.pythonhosted.org/packages/93/5f/a2acc6e2a47d053760caece2d7b7194e9949945091eff452019765b87146/charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574", size = 137301 }, + { url = "https://files.pythonhosted.org/packages/27/9f/68c828438af904d830e680a8d2f6182be97f3205d6d62edfeb4a029b4192/charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf", size = 138257 }, + { url = "https://files.pythonhosted.org/packages/27/4b/522e1c868960b6be2f88cd407a284f99801421a6c5ae214f0c33de131fde/charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455", size = 140933 }, + { url = "https://files.pythonhosted.org/packages/03/f8/f9b90f5aed190d63e620d9f61db1cef5f30dbb19075e5c114329483d069a/charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6", size = 134954 }, + { url = "https://files.pythonhosted.org/packages/0f/8e/44cde4d583038cbe37867efe7af4699212e6104fca0e7fc010e5f3d4a5c9/charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748", size = 142158 }, + { url = "https://files.pythonhosted.org/packages/28/2c/c6c5b3d70a9e09fcde6b0901789d8c3c2f44ef12abae070a33a342d239a9/charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62", size = 145701 }, + { url = "https://files.pythonhosted.org/packages/1c/9d/fb7f6b68f88e8becca86eb7cba1d5a5429fbfaaa6dd7a3a9f62adaee44d3/charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4", size = 144846 }, + { url = "https://files.pythonhosted.org/packages/b2/8d/fb3d3d3d5a09202d7ef1983848b41a5928b0c907e5692a8d13b1c07a10de/charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621", size = 138254 }, + { url = "https://files.pythonhosted.org/packages/28/d3/efc854ab04626167ad1709e527c4f2a01f5e5cd9c1d5691094d1b7d49154/charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149", size = 93163 }, + { url = "https://files.pythonhosted.org/packages/b6/33/cf8f2602715863219804c1790374b611f08be515176229de078f807d71e3/charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee", size = 99861 }, + { url = "https://files.pythonhosted.org/packages/86/f4/ccab93e631e7293cca82f9f7ba39783c967f823a0000df2d8dd743cad74f/charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578", size = 193961 }, + { url = "https://files.pythonhosted.org/packages/94/d4/2b21cb277bac9605026d2d91a4a8872bc82199ed11072d035dc674c27223/charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6", size = 124507 }, + { url = "https://files.pythonhosted.org/packages/9a/e0/a7c1fcdff20d9c667342e0391cfeb33ab01468d7d276b2c7914b371667cc/charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417", size = 119298 }, + { url = "https://files.pythonhosted.org/packages/70/de/1538bb2f84ac9940f7fa39945a5dd1d22b295a89c98240b262fc4b9fcfe0/charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51", size = 139328 }, + { url = "https://files.pythonhosted.org/packages/e9/ca/288bb1a6bc2b74fb3990bdc515012b47c4bc5925c8304fc915d03f94b027/charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41", size = 149368 }, + { url = "https://files.pythonhosted.org/packages/aa/75/58374fdaaf8406f373e508dab3486a31091f760f99f832d3951ee93313e8/charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f", size = 141944 }, + { url = "https://files.pythonhosted.org/packages/32/c8/0bc558f7260db6ffca991ed7166494a7da4fda5983ee0b0bfc8ed2ac6ff9/charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8", size = 143326 }, + { url = "https://files.pythonhosted.org/packages/0e/dd/7f6fec09a1686446cee713f38cf7d5e0669e0bcc8288c8e2924e998cf87d/charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab", size = 146171 }, + { url = "https://files.pythonhosted.org/packages/4c/a8/440f1926d6d8740c34d3ca388fbd718191ec97d3d457a0677eb3aa718fce/charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12", size = 139711 }, + { url = "https://files.pythonhosted.org/packages/e9/7f/4b71e350a3377ddd70b980bea1e2cc0983faf45ba43032b24b2578c14314/charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19", size = 148348 }, + { url = "https://files.pythonhosted.org/packages/1e/70/17b1b9202531a33ed7ef41885f0d2575ae42a1e330c67fddda5d99ad1208/charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea", size = 151290 }, + { url = "https://files.pythonhosted.org/packages/44/30/574b5b5933d77ecb015550aafe1c7d14a8cd41e7e6c4dcea5ae9e8d496c3/charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858", size = 149114 }, + { url = "https://files.pythonhosted.org/packages/0b/11/ca7786f7e13708687443082af20d8341c02e01024275a28bc75032c5ce5d/charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654", size = 143856 }, + { url = "https://files.pythonhosted.org/packages/f9/c2/1727c1438256c71ed32753b23ec2e6fe7b6dff66a598f6566cfe8139305e/charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613", size = 94333 }, + { url = "https://files.pythonhosted.org/packages/09/c8/0e17270496a05839f8b500c1166e3261d1226e39b698a735805ec206967b/charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade", size = 101454 }, + { url = "https://files.pythonhosted.org/packages/54/2f/28659eee7f5d003e0f5a3b572765bf76d6e0fe6601ab1f1b1dd4cba7e4f1/charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa", size = 196326 }, + { url = "https://files.pythonhosted.org/packages/d1/18/92869d5c0057baa973a3ee2af71573be7b084b3c3d428fe6463ce71167f8/charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a", size = 125614 }, + { url = "https://files.pythonhosted.org/packages/d6/27/327904c5a54a7796bb9f36810ec4173d2df5d88b401d2b95ef53111d214e/charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0", size = 120450 }, + { url = "https://files.pythonhosted.org/packages/a4/23/65af317914a0308495133b2d654cf67b11bbd6ca16637c4e8a38f80a5a69/charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a", size = 140135 }, + { url = "https://files.pythonhosted.org/packages/f2/41/6190102ad521a8aa888519bb014a74251ac4586cde9b38e790901684f9ab/charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242", size = 150413 }, + { url = "https://files.pythonhosted.org/packages/7b/ab/f47b0159a69eab9bd915591106859f49670c75f9a19082505ff16f50efc0/charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b", size = 142992 }, + { url = "https://files.pythonhosted.org/packages/28/89/60f51ad71f63aaaa7e51a2a2ad37919985a341a1d267070f212cdf6c2d22/charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62", size = 144871 }, + { url = "https://files.pythonhosted.org/packages/0c/48/0050550275fea585a6e24460b42465020b53375017d8596c96be57bfabca/charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0", size = 146756 }, + { url = "https://files.pythonhosted.org/packages/dc/b5/47f8ee91455946f745e6c9ddbb0f8f50314d2416dd922b213e7d5551ad09/charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd", size = 141034 }, + { url = "https://files.pythonhosted.org/packages/84/79/5c731059ebab43e80bf61fa51666b9b18167974b82004f18c76378ed31a3/charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be", size = 149434 }, + { url = "https://files.pythonhosted.org/packages/ca/f3/0719cd09fc4dc42066f239cb3c48ced17fc3316afca3e2a30a4756fe49ab/charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d", size = 152443 }, + { url = "https://files.pythonhosted.org/packages/f7/0e/c6357297f1157c8e8227ff337e93fd0a90e498e3d6ab96b2782204ecae48/charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3", size = 150294 }, + { url = "https://files.pythonhosted.org/packages/54/9a/acfa96dc4ea8c928040b15822b59d0863d6e1757fba8bd7de3dc4f761c13/charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742", size = 145314 }, + { url = "https://files.pythonhosted.org/packages/73/1c/b10a63032eaebb8d7bcb8544f12f063f41f5f463778ac61da15d9985e8b6/charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2", size = 94724 }, + { url = "https://files.pythonhosted.org/packages/c5/77/3a78bf28bfaa0863f9cfef278dbeadf55efe064eafff8c7c424ae3c4c1bf/charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca", size = 102159 }, + { url = "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", size = 49446 }, +] + +[[package]] +name = "click" +version = "8.1.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "platform_system == 'Windows'" }, + { name = "importlib-metadata", marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", size = 336121 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", size = 97941 }, +] + +[[package]] +name = "click-default-group" +version = "1.2.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1d/ce/edb087fb53de63dad3b36408ca30368f438738098e668b78c87f93cd41df/click_default_group-1.2.4.tar.gz", hash = "sha256:eb3f3c99ec0d456ca6cd2a7f08f7d4e91771bef51b01bdd9580cc6450fe1251e", size = 3505 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl", hash = "sha256:9b60486923720e7fc61731bdb32b617039aba820e22e1c88766b1125592eaa5f", size = 4123 }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "coverage" +version = "7.2.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/45/8b/421f30467e69ac0e414214856798d4bc32da1336df745e49e49ae5c1e2a8/coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59", size = 762575 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/24/be01e62a7bce89bcffe04729c540382caa5a06bee45ae42136c93e2499f5/coverage-7.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8", size = 200724 }, + { url = "https://files.pythonhosted.org/packages/3d/80/7060a445e1d2c9744b683dc935248613355657809d6c6b2716cdf4ca4766/coverage-7.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb", size = 201024 }, + { url = "https://files.pythonhosted.org/packages/b8/9d/926fce7e03dbfc653104c2d981c0fa71f0572a9ebd344d24c573bd6f7c4f/coverage-7.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6", size = 229528 }, + { url = "https://files.pythonhosted.org/packages/d1/3a/67f5d18f911abf96857f6f7e4df37ca840e38179e2cc9ab6c0b9c3380f19/coverage-7.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2", size = 227842 }, + { url = "https://files.pythonhosted.org/packages/b4/bd/1b2331e3a04f4cc9b7b332b1dd0f3a1261dfc4114f8479bebfcc2afee9e8/coverage-7.2.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063", size = 228717 }, + { url = "https://files.pythonhosted.org/packages/2b/86/3dbf9be43f8bf6a5ca28790a713e18902b2d884bc5fa9512823a81dff601/coverage-7.2.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1", size = 234632 }, + { url = "https://files.pythonhosted.org/packages/91/e8/469ed808a782b9e8305a08bad8c6fa5f8e73e093bda6546c5aec68275bff/coverage-7.2.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353", size = 232875 }, + { url = "https://files.pythonhosted.org/packages/29/8f/4fad1c2ba98104425009efd7eaa19af9a7c797e92d40cd2ec026fa1f58cb/coverage-7.2.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495", size = 234094 }, + { url = "https://files.pythonhosted.org/packages/94/4e/d4e46a214ae857be3d7dc5de248ba43765f60daeb1ab077cb6c1536c7fba/coverage-7.2.7-cp310-cp310-win32.whl", hash = "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818", size = 203184 }, + { url = "https://files.pythonhosted.org/packages/1f/e9/d6730247d8dec2a3dddc520ebe11e2e860f0f98cee3639e23de6cf920255/coverage-7.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850", size = 204096 }, + { url = "https://files.pythonhosted.org/packages/c6/fa/529f55c9a1029c840bcc9109d5a15ff00478b7ff550a1ae361f8745f8ad5/coverage-7.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f", size = 200895 }, + { url = "https://files.pythonhosted.org/packages/67/d7/cd8fe689b5743fffac516597a1222834c42b80686b99f5b44ef43ccc2a43/coverage-7.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe", size = 201120 }, + { url = "https://files.pythonhosted.org/packages/8c/95/16eed713202406ca0a37f8ac259bbf144c9d24f9b8097a8e6ead61da2dbb/coverage-7.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3", size = 233178 }, + { url = "https://files.pythonhosted.org/packages/c1/49/4d487e2ad5d54ed82ac1101e467e8994c09d6123c91b2a962145f3d262c2/coverage-7.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f", size = 230754 }, + { url = "https://files.pythonhosted.org/packages/a7/cd/3ce94ad9d407a052dc2a74fbeb1c7947f442155b28264eb467ee78dea812/coverage-7.2.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb", size = 232558 }, + { url = "https://files.pythonhosted.org/packages/8f/a8/12cc7b261f3082cc299ab61f677f7e48d93e35ca5c3c2f7241ed5525ccea/coverage-7.2.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833", size = 241509 }, + { url = "https://files.pythonhosted.org/packages/04/fa/43b55101f75a5e9115259e8be70ff9279921cb6b17f04c34a5702ff9b1f7/coverage-7.2.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97", size = 239924 }, + { url = "https://files.pythonhosted.org/packages/68/5f/d2bd0f02aa3c3e0311986e625ccf97fdc511b52f4f1a063e4f37b624772f/coverage-7.2.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a", size = 240977 }, + { url = "https://files.pythonhosted.org/packages/ba/92/69c0722882643df4257ecc5437b83f4c17ba9e67f15dc6b77bad89b6982e/coverage-7.2.7-cp311-cp311-win32.whl", hash = "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a", size = 203168 }, + { url = "https://files.pythonhosted.org/packages/b1/96/c12ed0dfd4ec587f3739f53eb677b9007853fd486ccb0e7d5512a27bab2e/coverage-7.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562", size = 204185 }, + { url = "https://files.pythonhosted.org/packages/ff/d5/52fa1891d1802ab2e1b346d37d349cb41cdd4fd03f724ebbf94e80577687/coverage-7.2.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4", size = 201020 }, + { url = "https://files.pythonhosted.org/packages/24/df/6765898d54ea20e3197a26d26bb65b084deefadd77ce7de946b9c96dfdc5/coverage-7.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4", size = 233994 }, + { url = "https://files.pythonhosted.org/packages/15/81/b108a60bc758b448c151e5abceed027ed77a9523ecbc6b8a390938301841/coverage-7.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01", size = 231358 }, + { url = "https://files.pythonhosted.org/packages/61/90/c76b9462f39897ebd8714faf21bc985b65c4e1ea6dff428ea9dc711ed0dd/coverage-7.2.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6", size = 233316 }, + { url = "https://files.pythonhosted.org/packages/04/d6/8cba3bf346e8b1a4fb3f084df7d8cea25a6b6c56aaca1f2e53829be17e9e/coverage-7.2.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d", size = 240159 }, + { url = "https://files.pythonhosted.org/packages/6e/ea/4a252dc77ca0605b23d477729d139915e753ee89e4c9507630e12ad64a80/coverage-7.2.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de", size = 238127 }, + { url = "https://files.pythonhosted.org/packages/9f/5c/d9760ac497c41f9c4841f5972d0edf05d50cad7814e86ee7d133ec4a0ac8/coverage-7.2.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d", size = 239833 }, + { url = "https://files.pythonhosted.org/packages/69/8c/26a95b08059db1cbb01e4b0e6d40f2e9debb628c6ca86b78f625ceaf9bab/coverage-7.2.7-cp312-cp312-win32.whl", hash = "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511", size = 203463 }, + { url = "https://files.pythonhosted.org/packages/b7/00/14b00a0748e9eda26e97be07a63cc911108844004687321ddcc213be956c/coverage-7.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3", size = 204347 }, + { url = "https://files.pythonhosted.org/packages/80/d7/67937c80b8fd4c909fdac29292bc8b35d9505312cff6bcab41c53c5b1df6/coverage-7.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f", size = 200580 }, + { url = "https://files.pythonhosted.org/packages/7a/05/084864fa4bbf8106f44fb72a56e67e0cd372d3bf9d893be818338c81af5d/coverage-7.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb", size = 226237 }, + { url = "https://files.pythonhosted.org/packages/67/a2/6fa66a50e6e894286d79a3564f42bd54a9bd27049dc0a63b26d9924f0aa3/coverage-7.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9", size = 224256 }, + { url = "https://files.pythonhosted.org/packages/e2/c0/73f139794c742840b9ab88e2e17fe14a3d4668a166ff95d812ac66c0829d/coverage-7.2.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd", size = 225550 }, + { url = "https://files.pythonhosted.org/packages/03/ec/6f30b4e0c96ce03b0e64aec46b4af2a8c49b70d1b5d0d69577add757b946/coverage-7.2.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a", size = 232440 }, + { url = "https://files.pythonhosted.org/packages/22/c1/2f6c1b6f01a0996c9e067a9c780e1824351dbe17faae54388a4477e6d86f/coverage-7.2.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959", size = 230897 }, + { url = "https://files.pythonhosted.org/packages/8d/d6/53e999ec1bf7498ca4bc5f3b8227eb61db39068d2de5dcc359dec5601b5a/coverage-7.2.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02", size = 232024 }, + { url = "https://files.pythonhosted.org/packages/e9/40/383305500d24122dbed73e505a4d6828f8f3356d1f68ab6d32c781754b81/coverage-7.2.7-cp37-cp37m-win32.whl", hash = "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f", size = 203293 }, + { url = "https://files.pythonhosted.org/packages/0e/bc/7e3a31534fabb043269f14fb64e2bb2733f85d4cf39e5bbc71357c57553a/coverage-7.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0", size = 204040 }, + { url = "https://files.pythonhosted.org/packages/c6/fc/be19131010930a6cf271da48202c8cc1d3f971f68c02fb2d3a78247f43dc/coverage-7.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5", size = 200689 }, + { url = "https://files.pythonhosted.org/packages/28/d7/9a8de57d87f4bbc6f9a6a5ded1eaac88a89bf71369bb935dac3c0cf2893e/coverage-7.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5", size = 200986 }, + { url = "https://files.pythonhosted.org/packages/c8/e4/e6182e4697665fb594a7f4e4f27cb3a4dd00c2e3d35c5c706765de8c7866/coverage-7.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9", size = 230648 }, + { url = "https://files.pythonhosted.org/packages/7b/e3/f552d5871943f747165b92a924055c5d6daa164ae659a13f9018e22f3990/coverage-7.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6", size = 228511 }, + { url = "https://files.pythonhosted.org/packages/44/55/49f65ccdd4dfd6d5528e966b28c37caec64170c725af32ab312889d2f857/coverage-7.2.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e", size = 229852 }, + { url = "https://files.pythonhosted.org/packages/0d/31/340428c238eb506feb96d4fb5c9ea614db1149517f22cc7ab8c6035ef6d9/coverage-7.2.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050", size = 235578 }, + { url = "https://files.pythonhosted.org/packages/dd/ce/97c1dd6592c908425622fe7f31c017d11cf0421729b09101d4de75bcadc8/coverage-7.2.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5", size = 234079 }, + { url = "https://files.pythonhosted.org/packages/de/a3/5a98dc9e239d0dc5f243ef5053d5b1bdcaa1dee27a691dfc12befeccf878/coverage-7.2.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f", size = 234991 }, + { url = "https://files.pythonhosted.org/packages/4a/fb/78986d3022e5ccf2d4370bc43a5fef8374f092b3c21d32499dee8e30b7b6/coverage-7.2.7-cp38-cp38-win32.whl", hash = "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e", size = 203160 }, + { url = "https://files.pythonhosted.org/packages/c3/1c/6b3c9c363fb1433c79128e0d692863deb761b1b78162494abb9e5c328bc0/coverage-7.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c", size = 204085 }, + { url = "https://files.pythonhosted.org/packages/88/da/495944ebf0ad246235a6bd523810d9f81981f9b81c6059ba1f56e943abe0/coverage-7.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9", size = 200725 }, + { url = "https://files.pythonhosted.org/packages/ca/0c/3dfeeb1006c44b911ee0ed915350db30325d01808525ae7cc8d57643a2ce/coverage-7.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2", size = 201022 }, + { url = "https://files.pythonhosted.org/packages/61/af/5964b8d7d9a5c767785644d9a5a63cacba9a9c45cc42ba06d25895ec87be/coverage-7.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7", size = 229102 }, + { url = "https://files.pythonhosted.org/packages/d9/1d/cd467fceb62c371f9adb1d739c92a05d4e550246daa90412e711226bd320/coverage-7.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e", size = 227441 }, + { url = "https://files.pythonhosted.org/packages/fe/57/e4f8ad64d84ca9e759d783a052795f62a9f9111585e46068845b1cb52c2b/coverage-7.2.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1", size = 228265 }, + { url = "https://files.pythonhosted.org/packages/88/8b/b0d9fe727acae907fa7f1c8194ccb6fe9d02e1c3e9001ecf74c741f86110/coverage-7.2.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9", size = 234217 }, + { url = "https://files.pythonhosted.org/packages/66/2e/c99fe1f6396d93551aa352c75410686e726cd4ea104479b9af1af22367ce/coverage-7.2.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250", size = 232466 }, + { url = "https://files.pythonhosted.org/packages/bb/e9/88747b40c8fb4a783b40222510ce6d66170217eb05d7f46462c36b4fa8cc/coverage-7.2.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2", size = 233669 }, + { url = "https://files.pythonhosted.org/packages/b1/d5/a8e276bc005e42114468d4fe03e0a9555786bc51cbfe0d20827a46c1565a/coverage-7.2.7-cp39-cp39-win32.whl", hash = "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb", size = 203199 }, + { url = "https://files.pythonhosted.org/packages/a9/0c/4a848ae663b47f1195abcb09a951751dd61f80b503303b9b9d768e0fd321/coverage-7.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27", size = 204109 }, + { url = "https://files.pythonhosted.org/packages/67/fb/b3b1d7887e1ea25a9608b0776e480e4bbc303ca95a31fd585555ec4fff5a/coverage-7.2.7-pp37.pp38.pp39-none-any.whl", hash = "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d", size = 193207 }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", marker = "python_full_version <= '3.11'" }, +] + +[[package]] +name = "cryptography" +version = "43.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0d/05/07b55d1fa21ac18c3a8c79f764e2514e6f6a9698f1be44994f5adf0d29db/cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805", size = 686989 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/01/4896f3d1b392025d4fcbecf40fdea92d3df8662123f6835d0af828d148fd/cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e", size = 3760905 }, + { url = "https://files.pythonhosted.org/packages/0a/be/f9a1f673f0ed4b7f6c643164e513dbad28dd4f2dcdf5715004f172ef24b6/cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f", size = 3977271 }, + { url = "https://files.pythonhosted.org/packages/4e/49/80c3a7b5514d1b416d7350830e8c422a4d667b6d9b16a9392ebfd4a5388a/cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6", size = 3746606 }, + { url = "https://files.pythonhosted.org/packages/0e/16/a28ddf78ac6e7e3f25ebcef69ab15c2c6be5ff9743dd0709a69a4f968472/cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18", size = 3986484 }, + { url = "https://files.pythonhosted.org/packages/01/f5/69ae8da70c19864a32b0315049866c4d411cce423ec169993d0434218762/cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd", size = 3852131 }, + { url = "https://files.pythonhosted.org/packages/fd/db/e74911d95c040f9afd3612b1f732e52b3e517cb80de8bf183be0b7d413c6/cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73", size = 4075647 }, + { url = "https://files.pythonhosted.org/packages/2f/78/55356eb9075d0be6e81b59f45c7b48df87f76a20e73893872170471f3ee8/cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5", size = 3762968 }, + { url = "https://files.pythonhosted.org/packages/2a/2c/488776a3dc843f95f86d2f957ca0fc3407d0242b50bede7fad1e339be03f/cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4", size = 3977754 }, + { url = "https://files.pythonhosted.org/packages/7c/04/2345ca92f7a22f601a9c62961741ef7dd0127c39f7310dffa0041c80f16f/cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7", size = 3749458 }, + { url = "https://files.pythonhosted.org/packages/ac/25/e715fa0bc24ac2114ed69da33adf451a38abb6f3f24ec207908112e9ba53/cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405", size = 3988220 }, + { url = "https://files.pythonhosted.org/packages/21/ce/b9c9ff56c7164d8e2edfb6c9305045fbc0df4508ccfdb13ee66eb8c95b0e/cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16", size = 3853898 }, + { url = "https://files.pythonhosted.org/packages/2a/33/b3682992ab2e9476b9c81fff22f02c8b0a1e6e1d49ee1750a67d85fd7ed2/cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73", size = 4076592 }, + { url = "https://files.pythonhosted.org/packages/93/90/116edd5f8ec23b2dc879f7a42443e073cdad22950d3c8ee834e3b8124543/cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3", size = 3679828 }, + { url = "https://files.pythonhosted.org/packages/d8/32/1e1d78b316aa22c0ba6493cc271c1c309969e5aa5c22c830a1d7ce3471e6/cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83", size = 3908132 }, + { url = "https://files.pythonhosted.org/packages/d7/29/a233efb3e98b13d9175dcb3c3146988ec990896c8fa07e8467cce27d5a80/cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08", size = 3681997 }, + { url = "https://files.pythonhosted.org/packages/c0/cf/c9eea7791b961f279fb6db86c3355cfad29a73141f46427af71852b23b95/cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa", size = 3905208 }, +] + +[[package]] +name = "distlib" +version = "0.3.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/dd/1bec4c5ddb504ca60fc29472f3d27e8d4da1257a854e1d96742f15c1d02d/distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403", size = 613923 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973 }, +] + +[[package]] +name = "docformatter" +version = "1.7.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "charset-normalizer" }, + { name = "untokenize" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f4/44/aba2c40cf796121b35835ea8c00bc5d93f2f70730eca53b36b8bbbfaefe1/docformatter-1.7.5.tar.gz", hash = "sha256:ffed3da0daffa2e77f80ccba4f0e50bfa2755e1c10e130102571c890a61b246e", size = 25893 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/95/568a2fca29df365b82012b09b64964a05f4f20ac83c2137b262f3fa3188f/docformatter-1.7.5-py3-none-any.whl", hash = "sha256:a24f5545ed1f30af00d106f5d85dc2fce4959295687c24c8f39f5263afaf9186", size = 32798 }, +] + +[[package]] +name = "docutils" +version = "0.19" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/330ea8d383eb2ce973df34d1239b3b21e91cd8c865d21ff82902d952f91f/docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6", size = 2056383 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/69/e391bd51bc08ed9141ecd899a0ddb61ab6465309f1eb470905c0c8868081/docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc", size = 570472 }, +] + +[[package]] +name = "exceptiongroup" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 }, +] + +[[package]] +name = "filelock" +version = "3.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/00/0b/c506e9e44e4c4b6c89fcecda23dc115bf8e7ff7eb127e0cb9c114cbc9a15/filelock-3.12.2.tar.gz", hash = "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81", size = 12441 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/45/ec3407adf6f6b5bf867a4462b2b0af27597a26bd3cd6e2534cb6ab029938/filelock-3.12.2-py3-none-any.whl", hash = "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec", size = 10923 }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, +] + +[[package]] +name = "imagesize" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769 }, +] + +[[package]] +name = "importlib-metadata" +version = "6.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.8'" }, + { name = "zipp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/82/f6e29c8d5c098b6be61460371c2c5591f4a335923639edec43b3830650a4/importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4", size = 53569 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/94/64287b38c7de4c90683630338cf28f129decbba0a44f0c6db35a873c73c4/importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5", size = 22934 }, +] + +[[package]] +name = "importlib-resources" +version = "5.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4e/a2/3cab1de83f95dd15297c15bdc04d50902391d707247cada1f021bbfe2149/importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6", size = 39894 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/71/c13ea695a4393639830bf96baea956538ba7a9d06fcce7cef10bfff20f72/importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a", size = 36211 }, +] + +[[package]] +name = "incremental" +version = "22.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/42/9e87f04fa2cd40e3016f27a4b4572290e95899c6dce317e2cdb580f3ff09/incremental-22.10.0.tar.gz", hash = "sha256:912feeb5e0f7e0188e6f42241d2f450002e11bbc0937c65865045854c24c0bd0", size = 18305 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/51/8073577012492fcd15628e811db585f447c500fa407e944ab3a18ec55fb7/incremental-22.10.0-py2.py3-none-any.whl", hash = "sha256:b864a1f30885ee72c5ac2835a761b8fe8aa9c28b9395cacf27286602688d3e51", size = 16361 }, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }, +] + +[[package]] +name = "jaraco-classes" +version = "3.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bf/02/a956c9bfd2dfe60b30c065ed8e28df7fcf72b292b861dca97e951c145ef6/jaraco.classes-3.2.3.tar.gz", hash = "sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a", size = 9416 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/28/220d3ae0829171c11e50dded4355d17824d60895285631d7eb9dee0ab5e5/jaraco.classes-3.2.3-py3-none-any.whl", hash = "sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158", size = 5961 }, +] + +[[package]] +name = "jeepney" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/f4/154cf374c2daf2020e05c3c6a03c91348d59b23c5366e968feb198306fdf/jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806", size = 106005 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/72/2a1e2290f1ab1e06f71f3d0f1646c9e4634e70e1d37491535e19266e8dc9/jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755", size = 48435 }, +] + +[[package]] +name = "jinja2" +version = "3.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ed/55/39036716d19cab0747a5020fc7e907f362fbf48c984b14e62127f7e68e5d/jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", size = 240245 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d", size = 133271 }, +] + +[[package]] +name = "keyring" +version = "24.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata", marker = "python_full_version < '3.12'" }, + { name = "importlib-resources", marker = "python_full_version < '3.9'" }, + { name = "jaraco-classes" }, + { name = "jeepney", marker = "sys_platform == 'linux'" }, + { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" }, + { name = "secretstorage", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/25/17/9745959c3482eed095db21a459572808c2f735bcbf55adb93afcf9c605c7/keyring-24.1.1.tar.gz", hash = "sha256:3d44a48fa9a254f6c72879d7c88604831ebdaac6ecb0b214308b02953502c510", size = 59094 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/9e/9517ad9978abfd2c579c0f7bd6ff3c549b5e0ea8a0e7ad345879c83a5b87/keyring-24.1.1-py3-none-any.whl", hash = "sha256:bc402c5e501053098bcbd149c4ddbf8e36c6809e572c2d098d4961e88d4c270d", size = 37588 }, +] + +[[package]] +name = "markdown-it-py" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, + { name = "typing-extensions", marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/c0/59bd6d0571986f72899288a95d9d6178d0eebd70b6650f1bb3f0da90f8f7/markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1", size = 67120 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/25/2d88e8feee8e055d015343f9b86e370a1ccbec546f2865c98397aaef24af/markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30", size = 84466 }, +] + +[[package]] +name = "markupsafe" +version = "2.1.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/87/5b/aae44c6655f3801e81aa3eef09dbbf012431987ba564d7231722f68df02d/MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", size = 19384 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/54/ad5eb37bf9d51800010a74e4665425831a9db4e7c4e0fde4352e391e808e/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", size = 18206 }, + { url = "https://files.pythonhosted.org/packages/6a/4a/a4d49415e600bacae038c67f9fecc1d5433b9d3c71a4de6f33537b89654c/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", size = 14079 }, + { url = "https://files.pythonhosted.org/packages/0a/7b/85681ae3c33c385b10ac0f8dd025c30af83c78cec1c37a6aa3b55e67f5ec/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", size = 26620 }, + { url = "https://files.pythonhosted.org/packages/7c/52/2b1b570f6b8b803cef5ac28fdf78c0da318916c7d2fe9402a84d591b394c/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", size = 25818 }, + { url = "https://files.pythonhosted.org/packages/29/fe/a36ba8c7ca55621620b2d7c585313efd10729e63ef81e4e61f52330da781/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", size = 25493 }, + { url = "https://files.pythonhosted.org/packages/60/ae/9c60231cdfda003434e8bd27282b1f4e197ad5a710c14bee8bea8a9ca4f0/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", size = 30630 }, + { url = "https://files.pythonhosted.org/packages/65/dc/1510be4d179869f5dafe071aecb3f1f41b45d37c02329dfba01ff59e5ac5/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", size = 29745 }, + { url = "https://files.pythonhosted.org/packages/30/39/8d845dd7d0b0613d86e0ef89549bfb5f61ed781f59af45fc96496e897f3a/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", size = 30021 }, + { url = "https://files.pythonhosted.org/packages/c7/5c/356a6f62e4f3c5fbf2602b4771376af22a3b16efa74eb8716fb4e328e01e/MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", size = 16659 }, + { url = "https://files.pythonhosted.org/packages/69/48/acbf292615c65f0604a0c6fc402ce6d8c991276e16c80c46a8f758fbd30c/MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", size = 17213 }, + { url = "https://files.pythonhosted.org/packages/11/e7/291e55127bb2ae67c64d66cef01432b5933859dfb7d6949daa721b89d0b3/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", size = 18219 }, + { url = "https://files.pythonhosted.org/packages/6b/cb/aed7a284c00dfa7c0682d14df85ad4955a350a21d2e3b06d8240497359bf/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", size = 14098 }, + { url = "https://files.pythonhosted.org/packages/1c/cf/35fe557e53709e93feb65575c93927942087e9b97213eabc3fe9d5b25a55/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", size = 29014 }, + { url = "https://files.pythonhosted.org/packages/97/18/c30da5e7a0e7f4603abfc6780574131221d9148f323752c2755d48abad30/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", size = 28220 }, + { url = "https://files.pythonhosted.org/packages/0c/40/2e73e7d532d030b1e41180807a80d564eda53babaf04d65e15c1cf897e40/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", size = 27756 }, + { url = "https://files.pythonhosted.org/packages/18/46/5dca760547e8c59c5311b332f70605d24c99d1303dd9a6e1fc3ed0d73561/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", size = 33988 }, + { url = "https://files.pythonhosted.org/packages/6d/c5/27febe918ac36397919cd4a67d5579cbbfa8da027fa1238af6285bb368ea/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", size = 32718 }, + { url = "https://files.pythonhosted.org/packages/f8/81/56e567126a2c2bc2684d6391332e357589a96a76cb9f8e5052d85cb0ead8/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", size = 33317 }, + { url = "https://files.pythonhosted.org/packages/00/0b/23f4b2470accb53285c613a3ab9ec19dc944eaf53592cb6d9e2af8aa24cc/MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", size = 16670 }, + { url = "https://files.pythonhosted.org/packages/b7/a2/c78a06a9ec6d04b3445a949615c4c7ed86a0b2eb68e44e7541b9d57067cc/MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", size = 17224 }, + { url = "https://files.pythonhosted.org/packages/53/bd/583bf3e4c8d6a321938c13f49d44024dbe5ed63e0a7ba127e454a66da974/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", size = 18215 }, + { url = "https://files.pythonhosted.org/packages/48/d6/e7cd795fc710292c3af3a06d80868ce4b02bfbbf370b7cee11d282815a2a/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", size = 14069 }, + { url = "https://files.pythonhosted.org/packages/51/b5/5d8ec796e2a08fc814a2c7d2584b55f889a55cf17dd1a90f2beb70744e5c/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", size = 29452 }, + { url = "https://files.pythonhosted.org/packages/0a/0d/2454f072fae3b5a137c119abf15465d1771319dfe9e4acbb31722a0fff91/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", size = 28462 }, + { url = "https://files.pythonhosted.org/packages/2d/75/fd6cb2e68780f72d47e6671840ca517bda5ef663d30ada7616b0462ad1e3/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", size = 27869 }, + { url = "https://files.pythonhosted.org/packages/b0/81/147c477391c2750e8fc7705829f7351cf1cd3be64406edcf900dc633feb2/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", size = 33906 }, + { url = "https://files.pythonhosted.org/packages/8b/ff/9a52b71839d7a256b563e85d11050e307121000dcebc97df120176b3ad93/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", size = 32296 }, + { url = "https://files.pythonhosted.org/packages/88/07/2dc76aa51b481eb96a4c3198894f38b480490e834479611a4053fbf08623/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", size = 33038 }, + { url = "https://files.pythonhosted.org/packages/96/0c/620c1fb3661858c0e37eb3cbffd8c6f732a67cd97296f725789679801b31/MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", size = 16572 }, + { url = "https://files.pythonhosted.org/packages/3f/14/c3554d512d5f9100a95e737502f4a2323a1959f6d0d01e0d0997b35f7b10/MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", size = 17127 }, + { url = "https://files.pythonhosted.org/packages/a7/88/a940e11827ea1c136a34eca862486178294ae841164475b9ab216b80eb8e/MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", size = 13982 }, + { url = "https://files.pythonhosted.org/packages/cb/06/0d28bd178db529c5ac762a625c335a9168a7a23f280b4db9c95e97046145/MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", size = 26335 }, + { url = "https://files.pythonhosted.org/packages/4a/1d/c4f5016f87ced614eacc7d5fb85b25bcc0ff53e8f058d069fc8cbfdc3c7a/MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", size = 25557 }, + { url = "https://files.pythonhosted.org/packages/b3/fb/c18b8c9fbe69e347fdbf782c6478f1bc77f19a830588daa224236678339b/MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", size = 25245 }, + { url = "https://files.pythonhosted.org/packages/2f/69/30d29adcf9d1d931c75001dd85001adad7374381c9c2086154d9f6445be6/MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", size = 31013 }, + { url = "https://files.pythonhosted.org/packages/3a/03/63498d05bd54278b6ca340099e5b52ffb9cdf2ee4f2d9b98246337e21689/MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", size = 30178 }, + { url = "https://files.pythonhosted.org/packages/68/79/11b4fe15124692f8673b603433e47abca199a08ecd2a4851bfbdc97dc62d/MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", size = 30429 }, + { url = "https://files.pythonhosted.org/packages/ed/88/408bdbf292eb86f03201c17489acafae8358ba4e120d92358308c15cea7c/MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", size = 16633 }, + { url = "https://files.pythonhosted.org/packages/6c/4c/3577a52eea1880538c435176bc85e5b3379b7ab442327ccd82118550758f/MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", size = 17215 }, + { url = "https://files.pythonhosted.org/packages/f8/ff/2c942a82c35a49df5de3a630ce0a8456ac2969691b230e530ac12314364c/MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", size = 18192 }, + { url = "https://files.pythonhosted.org/packages/4f/14/6f294b9c4f969d0c801a4615e221c1e084722ea6114ab2114189c5b8cbe0/MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", size = 14072 }, + { url = "https://files.pythonhosted.org/packages/81/d4/fd74714ed30a1dedd0b82427c02fa4deec64f173831ec716da11c51a50aa/MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", size = 26928 }, + { url = "https://files.pythonhosted.org/packages/c7/bd/50319665ce81bb10e90d1cf76f9e1aa269ea6f7fa30ab4521f14d122a3df/MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", size = 26106 }, + { url = "https://files.pythonhosted.org/packages/4c/6f/f2b0f675635b05f6afd5ea03c094557bdb8622fa8e673387444fe8d8e787/MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68", size = 25781 }, + { url = "https://files.pythonhosted.org/packages/51/e0/393467cf899b34a9d3678e78961c2c8cdf49fb902a959ba54ece01273fb1/MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", size = 30518 }, + { url = "https://files.pythonhosted.org/packages/f6/02/5437e2ad33047290dafced9df741d9efc3e716b75583bbd73a9984f1b6f7/MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", size = 29669 }, + { url = "https://files.pythonhosted.org/packages/0e/7d/968284145ffd9d726183ed6237c77938c021abacde4e073020f920e060b2/MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", size = 29933 }, + { url = "https://files.pythonhosted.org/packages/bf/f3/ecb00fc8ab02b7beae8699f34db9357ae49d9f21d4d3de6f305f34fa949e/MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", size = 16656 }, + { url = "https://files.pythonhosted.org/packages/92/21/357205f03514a49b293e214ac39de01fadd0970a6e05e4bf1ddd0ffd0881/MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", size = 17206 }, + { url = "https://files.pythonhosted.org/packages/0f/31/780bb297db036ba7b7bbede5e1d7f1e14d704ad4beb3ce53fb495d22bc62/MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", size = 18193 }, + { url = "https://files.pythonhosted.org/packages/6c/77/d77701bbef72892affe060cdacb7a2ed7fd68dae3b477a8642f15ad3b132/MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", size = 14073 }, + { url = "https://files.pythonhosted.org/packages/d9/a7/1e558b4f78454c8a3a0199292d96159eb4d091f983bc35ef258314fe7269/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", size = 26486 }, + { url = "https://files.pythonhosted.org/packages/5f/5a/360da85076688755ea0cceb92472923086993e86b5613bbae9fbc14136b0/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", size = 25685 }, + { url = "https://files.pythonhosted.org/packages/6a/18/ae5a258e3401f9b8312f92b028c54d7026a97ec3ab20bfaddbdfa7d8cce8/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", size = 25338 }, + { url = "https://files.pythonhosted.org/packages/0b/cc/48206bd61c5b9d0129f4d75243b156929b04c94c09041321456fd06a876d/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", size = 30439 }, + { url = "https://files.pythonhosted.org/packages/d1/06/a41c112ab9ffdeeb5f77bc3e331fdadf97fa65e52e44ba31880f4e7f983c/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", size = 29531 }, + { url = "https://files.pythonhosted.org/packages/02/8c/ab9a463301a50dab04d5472e998acbd4080597abc048166ded5c7aa768c8/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", size = 29823 }, + { url = "https://files.pythonhosted.org/packages/bc/29/9bc18da763496b055d8e98ce476c8e718dcfd78157e17f555ce6dd7d0895/MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", size = 16658 }, + { url = "https://files.pythonhosted.org/packages/f6/f8/4da07de16f10551ca1f640c92b5f316f9394088b183c6a57183df6de5ae4/MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", size = 17211 }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, +] + +[[package]] +name = "more-itertools" +version = "9.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/d0/bea165535891bd1dcb5152263603e902c0ec1f4c9a2e152cc4adff6b3a38/more-itertools-9.1.0.tar.gz", hash = "sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d", size = 107389 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/01/e2678ee4e0d7eed4fd6be9e5b043fff9d22d245d06c8c91def8ced664189/more_itertools-9.1.0-py3-none-any.whl", hash = "sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3", size = 54207 }, +] + +[[package]] +name = "mypy" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mypy-extensions" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "typed-ast", marker = "python_full_version < '3.8'" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/28/d8a8233ff167d06108e53b7aefb4a8d7350adbbf9d7abd980f17fdb7a3a6/mypy-1.4.1.tar.gz", hash = "sha256:9bbcd9ab8ea1f2e1c8031c21445b511442cc45c89951e49bbf852cbb70755b1b", size = 2855162 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/3b/1c7363863b56c059f60a1dfdca9ac774a22ba64b7a4da0ee58ee53e5243f/mypy-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:566e72b0cd6598503e48ea610e0052d1b8168e60a46e0bfd34b3acf2d57f96a8", size = 10451043 }, + { url = "https://files.pythonhosted.org/packages/a7/24/6f0df1874118839db1155fed62a4bd7e80c181367ff8ea07d40fbaffcfb4/mypy-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ca637024ca67ab24a7fd6f65d280572c3794665eaf5edcc7e90a866544076878", size = 9542079 }, + { url = "https://files.pythonhosted.org/packages/04/5c/deeac94fcccd11aa621e6b350df333e1b809b11443774ea67582cc0205da/mypy-1.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dde1d180cd84f0624c5dcaaa89c89775550a675aff96b5848de78fb11adabcd", size = 11974913 }, + { url = "https://files.pythonhosted.org/packages/e5/2f/de3c455c54e8cf5e37ea38705c1920f2df470389f8fc051084d2dd8c9c59/mypy-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8c4d8e89aa7de683e2056a581ce63c46a0c41e31bd2b6d34144e2c80f5ea53dc", size = 12044492 }, + { url = "https://files.pythonhosted.org/packages/e7/d3/6f65357dcb68109946de70cd55bd2e60f10114f387471302f48d54ff5dae/mypy-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:bfdca17c36ae01a21274a3c387a63aa1aafe72bff976522886869ef131b937f1", size = 8831655 }, + { url = "https://files.pythonhosted.org/packages/94/01/e34e37a044325af4d4af9825c15e8a0d26d89b5a9624b4d0908449d3411b/mypy-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7549fbf655e5825d787bbc9ecf6028731973f78088fbca3a1f4145c39ef09462", size = 10338636 }, + { url = "https://files.pythonhosted.org/packages/92/58/ccc0b714ecbd1a64b34d8ce1c38763ff6431de1d82551904ecc3711fbe05/mypy-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:98324ec3ecf12296e6422939e54763faedbfcc502ea4a4c38502082711867258", size = 9444172 }, + { url = "https://files.pythonhosted.org/packages/73/72/dfc0b46e6905eafd598e7c48c0c4f2e232647e4e36547425c64e6c850495/mypy-1.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:141dedfdbfe8a04142881ff30ce6e6653c9685b354876b12e4fe6c78598b45e2", size = 11855450 }, + { url = "https://files.pythonhosted.org/packages/66/f4/60739a2d336f3adf5628e7c9b920d16e8af6dc078550d615e4ba2a1d7759/mypy-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8207b7105829eca6f3d774f64a904190bb2231de91b8b186d21ffd98005f14a7", size = 11928679 }, + { url = "https://files.pythonhosted.org/packages/8c/26/6ff2b55bf8b605a4cc898883654c2ca4dd4feedf0bb04ecaacf60d165cde/mypy-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:16f0db5b641ba159eff72cff08edc3875f2b62b2fa2bc24f68c1e7a4e8232d01", size = 8831134 }, + { url = "https://files.pythonhosted.org/packages/95/47/fb69dad9634af9f1dab69f8b4031d674592384b59c7171852b1fbed6de15/mypy-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:470c969bb3f9a9efcedbadcd19a74ffb34a25f8e6b0e02dae7c0e71f8372f97b", size = 10101278 }, + { url = "https://files.pythonhosted.org/packages/65/f7/77339904a3415cadca5551f2ea0c74feefc9b7187636a292690788f4d4b3/mypy-1.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5952d2d18b79f7dc25e62e014fe5a23eb1a3d2bc66318df8988a01b1a037c5b", size = 11643877 }, + { url = "https://files.pythonhosted.org/packages/f5/93/ae39163ae84266d24d1fcf8ee1e2db1e0346e09de97570dd101a07ccf876/mypy-1.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:190b6bab0302cec4e9e6767d3eb66085aef2a1cc98fe04936d8a42ed2ba77bb7", size = 11702718 }, + { url = "https://files.pythonhosted.org/packages/13/3b/3b7de921626547b36c34b91c74cfbda260210df7c49bd3d315015cfd6005/mypy-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9d40652cc4fe33871ad3338581dca3297ff5f2213d0df345bcfbde5162abf0c9", size = 8551181 }, + { url = "https://files.pythonhosted.org/packages/49/7d/63bab763e4d44e1a7c341fb64496ddf20970780935596ffed9ed2d85eae7/mypy-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01fd2e9f85622d981fd9063bfaef1aed6e336eaacca00892cd2d82801ab7c042", size = 10390236 }, + { url = "https://files.pythonhosted.org/packages/23/3f/54a87d933440416a1efd7a42b45f8cf22e353efe889eb3903cc34177ab44/mypy-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2460a58faeea905aeb1b9b36f5065f2dc9a9c6e4c992a6499a2360c6c74ceca3", size = 9496760 }, + { url = "https://files.pythonhosted.org/packages/4e/89/26230b46e27724bd54f76cd73a2759eaaf35292b32ba64f36c7c47836d4b/mypy-1.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2746d69a8196698146a3dbe29104f9eb6a2a4d8a27878d92169a6c0b74435b6", size = 11927489 }, + { url = "https://files.pythonhosted.org/packages/64/7d/156e721376951c449554942eedf4d53e9ca2a57e94bf0833ad2821d59bfa/mypy-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ae704dcfaa180ff7c4cfbad23e74321a2b774f92ca77fd94ce1049175a21c97f", size = 11990009 }, + { url = "https://files.pythonhosted.org/packages/27/ab/21230851e8137c9ef9a095cc8cb70d8ff8cac21014e4b249ac7a9eae7df9/mypy-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:43d24f6437925ce50139a310a64b2ab048cb2d3694c84c71c3f2a1626d8101dc", size = 8816535 }, + { url = "https://files.pythonhosted.org/packages/1d/1b/9050b5c444ef82c3d59bdbf21f91b259cf20b2ac1df37d55bc6b91d609a1/mypy-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c482e1246726616088532b5e964e39765b6d1520791348e6c9dc3af25b233828", size = 10447897 }, + { url = "https://files.pythonhosted.org/packages/da/00/ac2b58b321d85cac25be0dcd1bc2427dfc6cf403283fc205a0031576f14b/mypy-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:43b592511672017f5b1a483527fd2684347fdffc041c9ef53428c8dc530f79a3", size = 9534091 }, + { url = "https://files.pythonhosted.org/packages/c4/10/26240f14e854a95af87d577b288d607ebe0ccb75cb37052f6386402f022d/mypy-1.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34a9239d5b3502c17f07fd7c0b2ae6b7dd7d7f6af35fbb5072c6208e76295816", size = 11970165 }, + { url = "https://files.pythonhosted.org/packages/b7/34/a3edaec8762181bfe97439c7e094f4c2f411ed9b79ac8f4d72156e88d5ce/mypy-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5703097c4936bbb9e9bce41478c8d08edd2865e177dc4c52be759f81ee4dd26c", size = 12040792 }, + { url = "https://files.pythonhosted.org/packages/d1/f3/0d0622d5a83859a992b01741a7b97949d6fb9efc9f05f20a09f0df10dc1e/mypy-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e02d700ec8d9b1859790c0475df4e4092c7bf3272a4fd2c9f33d87fac4427b8f", size = 8831367 }, + { url = "https://files.pythonhosted.org/packages/3d/9a/e13addb8d652cb068f835ac2746d9d42f85b730092f581bb17e2059c28f1/mypy-1.4.1-py3-none-any.whl", hash = "sha256:45d32cec14e7b97af848bddd97d85ea4f0db4d5a149ed9676caa4eb2f7402bb4", size = 2451741 }, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 }, +] + +[[package]] +name = "nodeenv" +version = "1.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314 }, +] + +[[package]] +name = "packaging" +version = "24.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/b5/b43a27ac7472e1818c4bafd44430e69605baefe1f34440593e0332ec8b4d/packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9", size = 147882 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/df/1fceb2f8900f8639e278b056416d49134fb8d84c5942ffaa01ad34782422/packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", size = 53488 }, +] + +[[package]] +name = "pathspec" +version = "0.11.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a0/2a/bd167cdf116d4f3539caaa4c332752aac0b3a0cc0174cdb302ee68933e81/pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3", size = 47032 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/2a/9b1be29146139ef459188f5e420a66e835dda921208db600b7037093891f/pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20", size = 29603 }, +] + +[[package]] +name = "pkginfo" +version = "1.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/72/347ec5be4adc85c182ed2823d8d1c7b51e13b9a6b0c1aae59582eca652df/pkginfo-1.10.0.tar.gz", hash = "sha256:5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297", size = 378457 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/09/054aea9b7534a15ad38a363a2bd974c20646ab1582a387a95b8df1bfea1c/pkginfo-1.10.0-py3-none-any.whl", hash = "sha256:889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097", size = 30392 }, +] + +[[package]] +name = "platformdirs" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/31/28/e40d24d2e2eb23135f8533ad33d582359c7825623b1e022f9d460def7c05/platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731", size = 19914 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/16/70be3b725073035aa5fc3229321d06e22e73e3e09f6af78dcfdf16c7636c/platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b", size = 17562 }, +] + +[[package]] +name = "pluggy" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata", marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/42/8f2833655a29c4e9cb52ee8a2be04ceac61bcff4a680fb338cbd3d1e322d/pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3", size = 61613 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/32/4a79112b8b87b21450b066e102d6608907f4c885ed7b04c3fdb085d4d6ae/pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849", size = 17695 }, +] + +[[package]] +name = "pycparser" +version = "2.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/0b/95d387f5f4433cb0f53ff7ad859bd2c6051051cebbb564f139a999ab46de/pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206", size = 170877 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/d5/5f610ebe421e85889f2e55e33b7f9a6795bd982198517d912eb1c76e1a53/pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", size = 118697 }, +] + +[[package]] +name = "pygments" +version = "2.17.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/55/59/8bccf4157baf25e4aa5a0bb7fa3ba8600907de105ebc22b0c78cfbf6f565/pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367", size = 4827772 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/9c/372fef8377a6e340b1704768d20daaded98bf13282b5327beb2e2fe2c7ef/pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", size = 1179756 }, +] + +[[package]] +name = "pyproject-api" +version = "1.5.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f7/70/a63493ea5066b32053f80fdc24fae7c5a2fc65d8f01a1883b30fd850aa84/pyproject_api-1.5.3.tar.gz", hash = "sha256:ffb5b2d7cad43f5b2688ab490de7c4d3f6f15e0b819cb588c4b771567c9729eb", size = 22128 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/53/b225115e177eb54664ede5b68a23d6806d9890baa8ee66b8d87f0bdb6346/pyproject_api-1.5.3-py3-none-any.whl", hash = "sha256:14cf09828670c7b08842249c1f28c8ee6581b872e893f81b62d5465bec41502f", size = 12889 }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216 }, +] + +[[package]] +name = "pyright" +version = "1.1.387" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nodeenv" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c2/32/e7187478d3105d6d7edc9b754d56472ee06557c25cc404911288fee1796a/pyright-1.1.387.tar.gz", hash = "sha256:577de60224f7fe36505d5b181231e3a395d427b7873be0bbcaa962a29ea93a60", size = 21939 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/18/c497df36641b0572f5bd59ae147b08ccaa6b8086397d50e1af97cc2ddcf6/pyright-1.1.387-py3-none-any.whl", hash = "sha256:6a1f495a261a72e12ad17e20d1ae3df4511223c773b19407cfa006229b1b08a5", size = 18577 }, +] + +[[package]] +name = "pytest" +version = "7.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "importlib-metadata", marker = "python_full_version < '3.8'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/80/1f/9d8e98e4133ffb16c90f3b405c43e38d3abb715bb5d7a63a5a684f7e46a3/pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280", size = 1357116 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/ff/f6e8b8f39e08547faece4bd80f89d5a8de68a38b2d179cc1c4490ffa3286/pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8", size = 325287 }, +] + +[[package]] +name = "pytest-cov" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage", extra = ["toml"] }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/15/da3df99fd551507694a9b01f512a2f6cf1254f33601605843c3775f39460/pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6", size = 63245 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/4b/8b78d126e275efa2379b1c2e09dc52cf70df16fc3b90613ef82531499d73/pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a", size = 21949 }, +] + +[[package]] +name = "pytz" +version = "2024.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/31/3c70bf7603cc2dca0f19bdc53b4537a797747a58875b552c8c413d963a3f/pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a", size = 319692 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/c3/005fcca25ce078d2cc29fd559379817424e94885510568bc1bc53d7d5846/pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725", size = 508002 }, +] + +[[package]] +name = "pywin32-ctypes" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756 }, +] + +[[package]] +name = "readme-renderer" +version = "37.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bleach" }, + { name = "docutils" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/81/c3/d20152fcd1986117b898f66928938f329d0c91ddc47f081c58e64e0f51dc/readme_renderer-37.3.tar.gz", hash = "sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273", size = 29718 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/52/fd8a77d6f0a9ddeb26ed8fb334e01ac546106bf0c5b8e40dc826c5bd160f/readme_renderer-37.3-py3-none-any.whl", hash = "sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343", size = 14055 }, +] + +[[package]] +name = "requests" +version = "2.31.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/be/10918a2eac4ae9f02f6cfe6414b7a155ccd8f7f9d4380d62fd5b955065c3/requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1", size = 110794 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", size = 62574 }, +] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481 }, +] + +[[package]] +name = "rfc3986" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", size = 49026 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", size = 31326 }, +] + +[[package]] +name = "rich" +version = "13.8.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, + { name = "typing-extensions", marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/92/76/40f084cb7db51c9d1fa29a7120717892aeda9a7711f6225692c957a93535/rich-13.8.1.tar.gz", hash = "sha256:8260cda28e3db6bf04d2d1ef4dbc03ba80a824c88b0e7668a0f23126a424844a", size = 222080 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/11/dadb85e2bd6b1f1ae56669c3e1f0410797f9605d752d68fb47b77f525b31/rich-13.8.1-py3-none-any.whl", hash = "sha256:1760a3c0848469b97b558fc61c85233e3dafb69c7a071b4d60c38099d3cd4c06", size = 241608 }, +] + +[[package]] +name = "ruff" +version = "0.7.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/51/231bb3790e5b0b9fd4131f9a231d73d061b3667522e3f406fd9b63334d0e/ruff-0.7.2.tar.gz", hash = "sha256:2b14e77293380e475b4e3a7a368e14549288ed2931fce259a6f99978669e844f", size = 3210036 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/56/0caa2b5745d66a39aa239c01059f6918fc76ed8380033d2f44bf297d141d/ruff-0.7.2-py3-none-linux_armv6l.whl", hash = "sha256:b73f873b5f52092e63ed540adefc3c36f1f803790ecf2590e1df8bf0a9f72cb8", size = 10373973 }, + { url = "https://files.pythonhosted.org/packages/1a/33/cad6ff306731f335d481c50caa155b69a286d5b388e87ff234cd2a4b3557/ruff-0.7.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5b813ef26db1015953daf476202585512afd6a6862a02cde63f3bafb53d0b2d4", size = 10171140 }, + { url = "https://files.pythonhosted.org/packages/97/f5/6a2ca5c9ba416226eac9cf8121a1baa6f06655431937e85f38ffcb9d0d01/ruff-0.7.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:853277dbd9675810c6826dad7a428d52a11760744508340e66bf46f8be9701d9", size = 9809333 }, + { url = "https://files.pythonhosted.org/packages/16/83/e3e87f13d1a1dc205713632978cd7bc287a59b08bc95780dbe359b9aefcb/ruff-0.7.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21aae53ab1490a52bf4e3bf520c10ce120987b047c494cacf4edad0ba0888da2", size = 10622987 }, + { url = "https://files.pythonhosted.org/packages/22/16/97ccab194480e99a2e3c77ae132b3eebfa38c2112747570c403a4a13ba3a/ruff-0.7.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ccc7e0fc6e0cb3168443eeadb6445285abaae75142ee22b2b72c27d790ab60ba", size = 10184640 }, + { url = "https://files.pythonhosted.org/packages/97/1b/82ff05441b036f68817296c14f24da47c591cb27acfda473ee571a5651ac/ruff-0.7.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd77877a4e43b3a98e5ef4715ba3862105e299af0c48942cc6d51ba3d97dc859", size = 11210203 }, + { url = "https://files.pythonhosted.org/packages/a6/96/7ecb30a7ef7f942e2d8e0287ad4c1957dddc6c5097af4978c27cfc334f97/ruff-0.7.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:e00163fb897d35523c70d71a46fbaa43bf7bf9af0f4534c53ea5b96b2e03397b", size = 11870894 }, + { url = "https://files.pythonhosted.org/packages/06/6a/c716bb126218227f8e604a9c484836257708a05ee3d2ebceb666ff3d3867/ruff-0.7.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3c54b538633482dc342e9b634d91168fe8cc56b30a4b4f99287f4e339103e88", size = 11449533 }, + { url = "https://files.pythonhosted.org/packages/e6/2f/3a5f9f9478904e5ae9506ea699109070ead1e79aac041e872cbaad8a7458/ruff-0.7.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b792468e9804a204be221b14257566669d1db5c00d6bb335996e5cd7004ba80", size = 12607919 }, + { url = "https://files.pythonhosted.org/packages/a0/57/4642e57484d80d274750dcc872ea66655bbd7e66e986fede31e1865b463d/ruff-0.7.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dba53ed84ac19ae4bfb4ea4bf0172550a2285fa27fbb13e3746f04c80f7fa088", size = 11016915 }, + { url = "https://files.pythonhosted.org/packages/4d/6d/59be6680abee34c22296ae3f46b2a3b91662b8b18ab0bf388b5eb1355c97/ruff-0.7.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b19fafe261bf741bca2764c14cbb4ee1819b67adb63ebc2db6401dcd652e3748", size = 10625424 }, + { url = "https://files.pythonhosted.org/packages/82/e7/f6a643683354c9bc7879d2f228ee0324fea66d253de49273a0814fba1927/ruff-0.7.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:28bd8220f4d8f79d590db9e2f6a0674f75ddbc3847277dd44ac1f8d30684b828", size = 10233692 }, + { url = "https://files.pythonhosted.org/packages/d7/48/b4e02fc835cd7ed1ee7318d9c53e48bcf6b66301f55925a7dcb920e45532/ruff-0.7.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9fd67094e77efbea932e62b5d2483006154794040abb3a5072e659096415ae1e", size = 10751825 }, + { url = "https://files.pythonhosted.org/packages/1e/06/6c5ee6ab7bb4cbad9e8bb9b2dd0d818c759c90c1c9e057c6ed70334b97f4/ruff-0.7.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:576305393998b7bd6c46018f8104ea3a9cb3fa7908c21d8580e3274a3b04b691", size = 11074811 }, + { url = "https://files.pythonhosted.org/packages/a1/16/8969304f25bcd0e4af1778342e63b715e91db8a2dbb51807acd858cba915/ruff-0.7.2-py3-none-win32.whl", hash = "sha256:fa993cfc9f0ff11187e82de874dfc3611df80852540331bc85c75809c93253a8", size = 8650268 }, + { url = "https://files.pythonhosted.org/packages/d9/18/c4b00d161def43fe5968e959039c8f6ce60dca762cec4a34e4e83a4210a0/ruff-0.7.2-py3-none-win_amd64.whl", hash = "sha256:dd8800cbe0254e06b8fec585e97554047fb82c894973f7ff18558eee33d1cb88", size = 9433693 }, + { url = "https://files.pythonhosted.org/packages/7f/7b/c920673ac01c19814dd15fc617c02301c522f3d6812ca2024f4588ed4549/ruff-0.7.2-py3-none-win_arm64.whl", hash = "sha256:bb8368cd45bba3f57bb29cbb8d64b4a33f8415d0149d2655c5c8539452ce7760", size = 8735845 }, +] + +[[package]] +name = "secretstorage" +version = "3.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "jeepney" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/53/a4/f48c9d79cb507ed1373477dbceaba7401fd8a23af63b837fa61f1dcd3691/SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77", size = 19739 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99", size = 15221 }, +] + +[[package]] +name = "semver" +version = "3.0.3a1" +source = { editable = "." } + +[package.dev-dependencies] +changelog = [ + { name = "towncrier" }, +] +devel = [ + { name = "black" }, + { name = "build" }, + { name = "docformatter" }, + { name = "mypy" }, + { name = "pyright" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "ruff" }, + { name = "sphinx" }, + { name = "sphinx-argparse" }, + { name = "sphinx-autodoc-typehints" }, + { name = "towncrier" }, + { name = "tox" }, + { name = "twine" }, +] +docs = [ + { name = "sphinx" }, + { name = "sphinx-argparse" }, + { name = "sphinx-autodoc-typehints" }, +] +formatting = [ + { name = "black" }, + { name = "docformatter" }, + { name = "ruff" }, +] +gh-action = [ + { name = "black" }, + { name = "build" }, + { name = "docformatter" }, + { name = "mypy" }, + { name = "pyright" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "ruff" }, + { name = "sphinx" }, + { name = "sphinx-argparse" }, + { name = "sphinx-autodoc-typehints" }, + { name = "towncrier" }, + { name = "tox" }, + { name = "tox-gh-actions" }, + { name = "twine" }, +] +publish = [ + { name = "build" }, + { name = "twine" }, +] +test = [ + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "tox" }, +] +typing = [ + { name = "mypy" }, + { name = "pyright" }, +] + +[package.metadata] + +[package.metadata.requires-dev] +changelog = [{ name = "towncrier" }] +devel = [ + { name = "black" }, + { name = "build" }, + { name = "docformatter" }, + { name = "mypy" }, + { name = "pyright" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "ruff" }, + { name = "sphinx" }, + { name = "sphinx-argparse" }, + { name = "sphinx-autodoc-typehints" }, + { name = "towncrier" }, + { name = "tox" }, + { name = "twine" }, +] +docs = [ + { name = "sphinx" }, + { name = "sphinx-argparse" }, + { name = "sphinx-autodoc-typehints" }, +] +formatting = [ + { name = "black" }, + { name = "docformatter" }, + { name = "ruff" }, +] +gh-action = [ + { name = "black" }, + { name = "build" }, + { name = "docformatter" }, + { name = "mypy" }, + { name = "pyright" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "ruff" }, + { name = "sphinx" }, + { name = "sphinx-argparse" }, + { name = "sphinx-autodoc-typehints" }, + { name = "towncrier" }, + { name = "tox" }, + { name = "tox-gh-actions" }, + { name = "twine" }, +] +publish = [ + { name = "build" }, + { name = "twine" }, +] +test = [ + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "tox" }, +] +typing = [ + { name = "mypy" }, + { name = "pyright" }, +] + +[[package]] +name = "six" +version = "1.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/71/39/171f1c67cd00715f190ba0b100d606d440a28c93c7714febeca8b79af85e/six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", size = 34041 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254", size = 11053 }, +] + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/44/7b/af302bebf22c749c56c9c3e8ae13190b5b5db37a33d9068652e8f73b7089/snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", size = 86699 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a", size = 93002 }, +] + +[[package]] +name = "sphinx" +version = "5.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alabaster" }, + { name = "babel" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docutils" }, + { name = "imagesize" }, + { name = "importlib-metadata", marker = "python_full_version < '3.10'" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "requests" }, + { name = "snowballstemmer" }, + { name = "sphinxcontrib-applehelp" }, + { name = "sphinxcontrib-devhelp" }, + { name = "sphinxcontrib-htmlhelp" }, + { name = "sphinxcontrib-jsmath" }, + { name = "sphinxcontrib-qthelp" }, + { name = "sphinxcontrib-serializinghtml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/af/b2/02a43597980903483fe5eb081ee8e0ba2bb62ea43a70499484343795f3bf/Sphinx-5.3.0.tar.gz", hash = "sha256:51026de0a9ff9fc13c05d74913ad66047e104f56a129ff73e174eb5c3ee794b5", size = 6811365 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/a7/01dd6fd9653c056258d65032aa09a615b5d7b07dd840845a9f41a8860fbc/sphinx-5.3.0-py3-none-any.whl", hash = "sha256:060ca5c9f7ba57a08a1219e547b269fadf125ae25b06b9fa7f66768efb652d6d", size = 3183160 }, +] + +[[package]] +name = "sphinx-argparse" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/0b/d98f799d4283e8b6c403fd8102acf2b552ad78e947b6899a1344521e9d86/sphinx_argparse-0.4.0.tar.gz", hash = "sha256:e0f34184eb56f12face774fbc87b880abdb9017a0998d1ec559b267e9697e449", size = 15020 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/98/d32f45b19b60e52b4ddc714dee139a92c6ea8fa9115f994884d321c3454d/sphinx_argparse-0.4.0-py3-none-any.whl", hash = "sha256:73bee01f7276fae2bf621ccfe4d167af7306e7288e3482005405d9f826f9b037", size = 12625 }, +] + +[[package]] +name = "sphinx-autodoc-typehints" +version = "1.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/30/9764a2c735c655c3065f32072fb3d8c6fd5dda8df294d4e9f05670d60e31/sphinx_autodoc_typehints-1.23.0.tar.gz", hash = "sha256:5d44e2996633cdada499b6d27a496ddf9dbc95dd1f0f09f7b37940249e61f6e9", size = 35945 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/be/792b64ddacfcff362062077689ce37eb9750b9924fc0a14f623fa71ffaf6/sphinx_autodoc_typehints-1.23.0-py3-none-any.whl", hash = "sha256:ac099057e66b09e51b698058ba7dd76e57e1fe696cd91b54e121d3dad188f91d", size = 17896 }, +] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/01/ad9d4ebbceddbed9979ab4a89ddb78c9760e74e6757b1880f1b2760e8295/sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58", size = 24548 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/47/86022665a9433d89a66f5911b558ddff69861766807ba685de2e324bd6ed/sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a", size = 121180 }, +] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/33/dc28393f16385f722c893cb55539c641c9aaec8d1bc1c15b69ce0ac2dbb3/sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4", size = 17398 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/09/5de5ed43a521387f18bdf5f5af31d099605c992fd25372b2b9b825ce48ee/sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e", size = 84690 }, +] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/85/93464ac9bd43d248e7c74573d58a791d48c475230bcf000df2b2700b9027/sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2", size = 28144 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/40/c854ef09500e25f6432dcbad0f37df87fd7046d376272292d8654cc71c95/sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07", size = 100451 }, +] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071 }, +] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/8e/c4846e59f38a5f2b4a0e3b27af38f2fcf904d4bfd82095bf92de0b114ebd/sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72", size = 21658 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/14/05f9206cf4e9cfca1afb5fd224c7cd434dcc3a433d6d9e4e0264d29c6cdb/sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6", size = 90609 }, +] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/72/835d6fadb9e5d02304cf39b18f93d227cd93abd3c41ebf58e6853eeb1455/sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952", size = 21019 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/77/5464ec50dd0f1c1037e3c93249b040c8fc8078fdda97530eeb02424b6eea/sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd", size = 94021 }, +] + +[[package]] +name = "tomli" +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f", size = 15164 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", size = 12757 }, +] + +[[package]] +name = "towncrier" +version = "23.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "click-default-group" }, + { name = "importlib-resources", marker = "python_full_version < '3.10'" }, + { name = "incremental" }, + { name = "jinja2" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/01/095289468ee2f7aaf745e8f21449f0b6db3491fcb6add71048c078058605/towncrier-23.6.0.tar.gz", hash = "sha256:fc29bd5ab4727c8dacfbe636f7fb5dc53b99805b62da1c96b214836159ff70c1", size = 48002 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/b8/e436e5d8097f4deb1f96b7f9c5b1397586ca2accdb123701a3239115d41e/towncrier-23.6.0-py3-none-any.whl", hash = "sha256:da552f29192b3c2b04d630133f194c98e9f14f0558669d427708e203fea4d0a5", size = 46289 }, +] + +[[package]] +name = "tox" +version = "4.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cachetools" }, + { name = "chardet" }, + { name = "colorama" }, + { name = "filelock" }, + { name = "importlib-metadata", marker = "python_full_version < '3.8'" }, + { name = "packaging" }, + { name = "platformdirs" }, + { name = "pluggy" }, + { name = "pyproject-api" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.8'" }, + { name = "virtualenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/21/8a0d95e6a502c6a0be81c583af9c11066bf1f4e6eeb6551ee8b6f4c7292d/tox-4.8.0.tar.gz", hash = "sha256:2adacf435b12ccf10b9dfa9975d8ec0afd7cbae44d300463140d2117b968037b", size = 173370 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/0c/9ad67a4f8ed18c2619b6b8c41cea4c99e7617d5d712670ab4193d439f1f8/tox-4.8.0-py3-none-any.whl", hash = "sha256:4991305a56983d750a0d848a34242be290452aa88d248f1bf976e4036ee8b213", size = 152622 }, +] + +[[package]] +name = "tox-gh-actions" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tox" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/a1/3e7b3185031f905ddfc0c65dfd85949dae612a4387cbacb286b9f2931314/tox-gh-actions-3.2.0.tar.gz", hash = "sha256:ac6fa3b8da51bc90dd77985fd55f09e746c6558c55910c0a93d643045a2b0ccc", size = 18834 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/7a/d59f4eb08d156787af19fb44371586fd8b25580a1837ce92ae203a847c49/tox_gh_actions-3.2.0-py2.py3-none-any.whl", hash = "sha256:821b66a4751a788fa3e9617bd796d696507b08c6e1d929ee4faefba06b73b694", size = 9951 }, +] + +[[package]] +name = "twine" +version = "4.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata" }, + { name = "keyring" }, + { name = "pkginfo" }, + { name = "readme-renderer" }, + { name = "requests" }, + { name = "requests-toolbelt" }, + { name = "rfc3986" }, + { name = "rich" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/1a/a7884359429d801cd63c2c5512ad0a337a509994b0e42d9696d4778d71f6/twine-4.0.2.tar.gz", hash = "sha256:9e102ef5fdd5a20661eb88fad46338806c3bd32cf1db729603fe3697b1bc83c8", size = 215249 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/38/a3f27a9e8ce45523d7d1e28c09e9085b61a98dab15d35ec086f36a44b37c/twine-4.0.2-py3-none-any.whl", hash = "sha256:929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8", size = 36394 }, +] + +[[package]] +name = "typed-ast" +version = "1.5.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/7e/a424029f350aa8078b75fd0d360a787a273ca753a678d1104c5fa4f3072a/typed_ast-1.5.5.tar.gz", hash = "sha256:94282f7a354f36ef5dbce0ef3467ebf6a258e370ab33d5b40c249fa996e590dd", size = 252841 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/07/5defe18d4fc16281cd18c4374270abc430c3d852d8ac29b5db6599d45cfe/typed_ast-1.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bc1efe0ce3ffb74784e06460f01a223ac1f6ab31c6bc0376a21184bf5aabe3b", size = 223267 }, + { url = "https://files.pythonhosted.org/packages/a0/5c/e379b00028680bfcd267d845cf46b60e76d8ac6f7009fd440d6ce030cc92/typed_ast-1.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f7a8c46a8b333f71abd61d7ab9255440d4a588f34a21f126bbfc95f6049e686", size = 208260 }, + { url = "https://files.pythonhosted.org/packages/3b/99/5cc31ef4f3c80e1ceb03ed2690c7085571e3fbf119cbd67a111ec0b6622f/typed_ast-1.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597fc66b4162f959ee6a96b978c0435bd63791e31e4f410622d19f1686d5e769", size = 842272 }, + { url = "https://files.pythonhosted.org/packages/e2/ed/b9b8b794b37b55c9247b1e8d38b0361e8158795c181636d34d6c11b506e7/typed_ast-1.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d41b7a686ce653e06c2609075d397ebd5b969d821b9797d029fccd71fdec8e04", size = 824651 }, + { url = "https://files.pythonhosted.org/packages/ca/59/dbbbe5a0e91c15d14a0896b539a5ed01326b0d468e75c1a33274d128d2d1/typed_ast-1.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5fe83a9a44c4ce67c796a1b466c270c1272e176603d5e06f6afbc101a572859d", size = 854960 }, + { url = "https://files.pythonhosted.org/packages/90/f0/0956d925f87bd81f6e0f8cf119eac5e5c8f4da50ca25bb9f5904148d4611/typed_ast-1.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d5c0c112a74c0e5db2c75882a0adf3133adedcdbfd8cf7c9d6ed77365ab90a1d", size = 839321 }, + { url = "https://files.pythonhosted.org/packages/43/17/4bdece9795da6f3345c4da5667ac64bc25863617f19c28d81f350f515be6/typed_ast-1.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:e1a976ed4cc2d71bb073e1b2a250892a6e968ff02aa14c1f40eba4f365ffec02", size = 139380 }, + { url = "https://files.pythonhosted.org/packages/75/53/b685e10da535c7b3572735f8bea0d4abb35a04722a7d44ca9c163a0cf822/typed_ast-1.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c631da9710271cb67b08bd3f3813b7af7f4c69c319b75475436fcab8c3d21bee", size = 223264 }, + { url = "https://files.pythonhosted.org/packages/96/fd/fc8ccf19fc16a40a23e7c7802d0abc78c1f38f1abb6e2447c474f8a076d8/typed_ast-1.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b445c2abfecab89a932b20bd8261488d574591173d07827c1eda32c457358b18", size = 208158 }, + { url = "https://files.pythonhosted.org/packages/bf/9a/598e47f2c3ecd19d7f1bb66854d0d3ba23ffd93c846448790a92524b0a8d/typed_ast-1.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc95ffaaab2be3b25eb938779e43f513e0e538a84dd14a5d844b8f2932593d88", size = 878366 }, + { url = "https://files.pythonhosted.org/packages/60/ca/765e8bf8b24d0ed7b9fc669f6826c5bc3eb7412fc765691f59b83ae195b2/typed_ast-1.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61443214d9b4c660dcf4b5307f15c12cb30bdfe9588ce6158f4a005baeb167b2", size = 860314 }, + { url = "https://files.pythonhosted.org/packages/d9/3c/4af750e6c673a0dd6c7b9f5b5e5ed58ec51a2e4e744081781c664d369dfa/typed_ast-1.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6eb936d107e4d474940469e8ec5b380c9b329b5f08b78282d46baeebd3692dc9", size = 898108 }, + { url = "https://files.pythonhosted.org/packages/03/8d/d0a4d1e060e1e8dda2408131a0cc7633fc4bc99fca5941dcb86c461dfe01/typed_ast-1.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e48bf27022897577d8479eaed64701ecaf0467182448bd95759883300ca818c8", size = 881971 }, + { url = "https://files.pythonhosted.org/packages/90/83/f28d2c912cd010a09b3677ac69d23181045eb17e358914ab739b7fdee530/typed_ast-1.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:83509f9324011c9a39faaef0922c6f720f9623afe3fe220b6d0b15638247206b", size = 139286 }, + { url = "https://files.pythonhosted.org/packages/d5/00/635353c31b71ed307ab020eff6baed9987da59a1b2ba489f885ecbe293b8/typed_ast-1.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2188bc33d85951ea4ddad55d2b35598b2709d122c11c75cffd529fbc9965508e", size = 222315 }, + { url = "https://files.pythonhosted.org/packages/01/95/11be104446bb20212a741d30d40eab52a9cfc05ea34efa074ff4f7c16983/typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0635900d16ae133cab3b26c607586131269f88266954eb04ec31535c9a12ef1e", size = 793541 }, + { url = "https://files.pythonhosted.org/packages/32/f1/75bd58fb1410cb72fbc6e8adf163015720db2c38844b46a9149c5ff6bf38/typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57bfc3cf35a0f2fdf0a88a3044aafaec1d2f24d8ae8cd87c4f58d615fb5b6311", size = 778348 }, + { url = "https://files.pythonhosted.org/packages/47/97/0bb4dba688a58ff9c08e63b39653e4bcaa340ce1bb9c1d58163e5c2c66f1/typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fe58ef6a764de7b4b36edfc8592641f56e69b7163bba9f9c8089838ee596bfb2", size = 809447 }, + { url = "https://files.pythonhosted.org/packages/a8/cd/9a867f5a96d83a9742c43914e10d3a2083d8fe894ab9bf60fd467c6c497f/typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d09d930c2d1d621f717bb217bf1fe2584616febb5138d9b3e8cdd26506c3f6d4", size = 796707 }, + { url = "https://files.pythonhosted.org/packages/eb/06/73ca55ee5303b41d08920de775f02d2a3e1e59430371f5adf7fbb1a21127/typed_ast-1.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:d40c10326893ecab8a80a53039164a224984339b2c32a6baf55ecbd5b1df6431", size = 138403 }, + { url = "https://files.pythonhosted.org/packages/19/e3/88b65e46643006592f39e0fdef3e29454244a9fdaa52acfb047dc68cae6a/typed_ast-1.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd946abf3c31fb50eee07451a6aedbfff912fcd13cf357363f5b4e834cc5e71a", size = 222951 }, + { url = "https://files.pythonhosted.org/packages/15/e0/182bdd9edb6c6a1c068cecaa87f58924a817f2807a0b0d940f578b3328df/typed_ast-1.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ed4a1a42df8a3dfb6b40c3d2de109e935949f2f66b19703eafade03173f8f437", size = 208247 }, + { url = "https://files.pythonhosted.org/packages/8d/09/bba083f2c11746288eaf1859e512130420405033de84189375fe65d839ba/typed_ast-1.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:045f9930a1550d9352464e5149710d56a2aed23a2ffe78946478f7b5416f1ede", size = 861010 }, + { url = "https://files.pythonhosted.org/packages/31/f3/38839df509b04fb54205e388fc04b47627377e0ad628870112086864a441/typed_ast-1.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381eed9c95484ceef5ced626355fdc0765ab51d8553fec08661dce654a935db4", size = 840026 }, + { url = "https://files.pythonhosted.org/packages/45/1e/aa5f1dae4b92bc665ae9a655787bb2fe007a881fa2866b0408ce548bb24c/typed_ast-1.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bfd39a41c0ef6f31684daff53befddae608f9daf6957140228a08e51f312d7e6", size = 875615 }, + { url = "https://files.pythonhosted.org/packages/94/88/71a1c249c01fbbd66f9f28648f8249e737a7fe19056c1a78e7b3b9250eb1/typed_ast-1.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8c524eb3024edcc04e288db9541fe1f438f82d281e591c548903d5b77ad1ddd4", size = 858320 }, + { url = "https://files.pythonhosted.org/packages/12/1e/19f53aad3984e351e6730e4265fde4b949a66c451e10828fdbc4dfb050f1/typed_ast-1.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:7f58fabdde8dcbe764cef5e1a7fcb440f2463c1bbbec1cf2a86ca7bc1f95184b", size = 139414 }, + { url = "https://files.pythonhosted.org/packages/b1/88/6e7f36f5fab6fbf0586a2dd866ac337924b7d4796a4d1b2b04443a864faf/typed_ast-1.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:042eb665ff6bf020dd2243307d11ed626306b82812aba21836096d229fdc6a10", size = 223329 }, + { url = "https://files.pythonhosted.org/packages/71/30/09d27e13824495547bcc665bd07afc593b22b9484f143b27565eae4ccaac/typed_ast-1.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:622e4a006472b05cf6ef7f9f2636edc51bda670b7bbffa18d26b255269d3d814", size = 208314 }, + { url = "https://files.pythonhosted.org/packages/07/3d/564308b7a432acb1f5399933cbb1b376a1a64d2544b90f6ba91894674260/typed_ast-1.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1efebbbf4604ad1283e963e8915daa240cb4bf5067053cf2f0baadc4d4fb51b8", size = 840900 }, + { url = "https://files.pythonhosted.org/packages/ea/f4/262512d14f777ea3666a089e2675a9b1500a85b8329a36de85d63433fb0e/typed_ast-1.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0aefdd66f1784c58f65b502b6cf8b121544680456d1cebbd300c2c813899274", size = 823435 }, + { url = "https://files.pythonhosted.org/packages/a1/25/b3ccb948166d309ab75296ac9863ebe2ff209fbc063f1122a2d3979e47c3/typed_ast-1.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:48074261a842acf825af1968cd912f6f21357316080ebaca5f19abbb11690c8a", size = 853125 }, + { url = "https://files.pythonhosted.org/packages/1c/09/012da182242f168bb5c42284297dcc08dc0a1b3668db5b3852aec467f56f/typed_ast-1.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:429ae404f69dc94b9361bb62291885894b7c6fb4640d561179548c849f8492ba", size = 837280 }, + { url = "https://files.pythonhosted.org/packages/30/bd/c815051404c4293265634d9d3e292f04fcf681d0502a9484c38b8f224d04/typed_ast-1.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:335f22ccb244da2b5c296e6f96b06ee9bed46526db0de38d2f0e5a6597b81155", size = 139486 }, +] + +[[package]] +name = "typing-extensions" +version = "4.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/8b/0111dd7d6c1478bf83baa1cab85c686426c7a6274119aceb2bd9d35395ad/typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2", size = 72876 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/6b/63cc3df74987c36fe26157ee12e09e8f9db4de771e0f3404263117e75b95/typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", size = 33232 }, +] + +[[package]] +name = "untokenize" +version = "0.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/46/e7cea8159199096e1df52da20a57a6665da80c37fb8aeb848a3e47442c32/untokenize-0.1.1.tar.gz", hash = "sha256:3865dbbbb8efb4bb5eaa72f1be7f3e0be00ea8b7f125c69cbd1f5fda926f37a2", size = 3099 } + +[[package]] +name = "urllib3" +version = "2.0.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/47/b215df9f71b4fdba1025fc05a77db2ad243fa0926755a52c5e71659f4e3c/urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84", size = 282546 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/b2/b157855192a68541a91ba7b2bbcb91f1b4faa51f8bae38d8005c034be524/urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e", size = 124213 }, +] + +[[package]] +name = "virtualenv" +version = "20.26.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock" }, + { name = "importlib-metadata", marker = "python_full_version < '3.8'" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3f/40/abc5a766da6b0b2457f819feab8e9203cbeae29327bd241359f866a3da9d/virtualenv-20.26.6.tar.gz", hash = "sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48", size = 9372482 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl", hash = "sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2", size = 5999862 }, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774 }, +] + +[[package]] +name = "zipp" +version = "3.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/00/27/f0ac6b846684cecce1ee93d32450c45ab607f65c2e0255f0092032d91f07/zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b", size = 18454 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/fa/c9e82bbe1af6266adf08afb563905eb87cab83fde00a0a08963510621047/zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556", size = 6758 }, +] From 06fe49fca6bb65921c65c4b942c1dd75e8e77312 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Sun, 17 Nov 2024 11:40:04 +0100 Subject: [PATCH 45/51] Turn our Markdown templates into YAML The YAML format defines an issue form. This makes it (hopefully) easier to add more consistent bug reports. --- .github/ISSUE_TEMPLATE/bug_report.md | 33 --------- .github/ISSUE_TEMPLATE/bug_report.yaml | 82 +++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 24 ------ .github/ISSUE_TEMPLATE/feature_request.yaml | 36 +++++++++ 4 files changed, 118 insertions(+), 57 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yaml delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yaml diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 461254e9..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -name: Bug report -about: Create a bug report to help us improve semver -title: '' -labels: bug -assignees: '' - ---- - - - -# Situation - - -# To Reproduce - - -# Expected Behavior - - -# Environment -- OS: [e.g. Linux, MacOS, Windows, ...] -- Python version [e.g. 3.6, 3.7, ...] -- Version of semver library [e.g. 3.0.0] - -# Additional context - diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml new file mode 100644 index 00000000..a263dcb9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -0,0 +1,82 @@ +name: 🐞Bug report +description: Create a bug report to help us improve +# title: '' +labels: [bug] +assignees: [tomschr] + +body: + - type: markdown + attributes: + value: | + Thanks a lot for taking the time to fill out this bug report! 🐛 + It will help us to improve the project for everyone. 🌟 + + Find help from the community on our [GitHub Discussions](https://github.com/python-semver/python-semver/discussions) page or + on our [Documentation](https://python-semver.readthedocs.io/en/latest/). + + - type: dropdown + id: python_version + attributes: + label: Which version of Python is the problem with? + multiple: true + options: + - "3.7" + - "3.8" + - "3.9" + - "3.10" + - "3.11" + - "3.12" + - "3.13" + - "3.14" + validations: + required: true + + - type: input + id: semver_version + attributes: + label: What semver version are you using? + description: You can find this with `pip show semver` + placeholder: 3.0.2 + + - type: dropdown + id: os + attributes: + label: What OS are you using? (Add more in the Environment section) + multiple: true + options: + - Linux + - Windows + - macOS + - Other + + - type: textarea + id: situation + attributes: + label: Situation + description: A clear and concise description of what the bug is. + placeholder: Describe the problem you see... + + - type: textarea + id: reproduction_steps + attributes: + label: How to reproduce + description: | + Steps to reproduce the behavior: + 1. Run '...' + 2. Scroll down to '....' + 3. See error + placeholder: Describe the steps to reproduce the issue... + + - type: textarea + id: expected_behavior + attributes: + label: Expected behavior + description: A clear and concise description of what you expected to happen. + placeholder: Describe the expected behavior... + + - type: textarea + id: environment + attributes: + label: Environment + description: Optionally provide some more details about your environment. + placeholder: Describe your environment... diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 5a24681d..00000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: enhancement -assignees: '' - ---- - - - -# Situation - - -# Possible Solution/Idea - - - -# Additional context - diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml new file mode 100644 index 00000000..2ec54c11 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -0,0 +1,36 @@ +name: Feature request +description: Suggest an idea for this project +# title: '' +labels: [enhancement] +assignees: [tomschr] + +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this feature request! + + - type: textarea + id: situation + attributes: + label: Situation + description: A clear and concise description of what the feature is. Ex. I'm always frustrated when [...] + placeholder: Describe the situation... + validations: + required: true + + - type: textarea + id: expected_solution + attributes: + label: Expected solution + description: A clear and concise description of what you want to happen. + placeholder: Describe the expected solution... + validations: + required: true + + - type: textarea + id: alternatives + attributes: + label: Alternatives + description: A clear and concise description of any alternative solutions or features you've considered. + placeholder: Describe any alternatives... \ No newline at end of file From bd97cfcd595c882d92b73430d4bf5c880d6062dc Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Sun, 17 Nov 2024 11:54:01 +0100 Subject: [PATCH 46/51] Require validation for bug issue template --- .github/ISSUE_TEMPLATE/bug_report.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index a263dcb9..6e75e2c8 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -55,6 +55,8 @@ body: label: Situation description: A clear and concise description of what the bug is. placeholder: Describe the problem you see... + validations: + required: true - type: textarea id: reproduction_steps @@ -66,6 +68,8 @@ body: 2. Scroll down to '....' 3. See error placeholder: Describe the steps to reproduce the issue... + validations: + required: true - type: textarea id: expected_behavior @@ -73,6 +77,8 @@ body: label: Expected behavior description: A clear and concise description of what you expected to happen. placeholder: Describe the expected behavior... + validations: + required: true - type: textarea id: environment From bc41390f388d88114e8529b17fe145c5af390cbb Mon Sep 17 00:00:00 2001 From: Victor Westerhuis Date: Fri, 13 Dec 2024 09:16:03 +0100 Subject: [PATCH 47/51] Fix comparison with subclasses --- src/semver/version.py | 2 +- tests/test_subclass.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/semver/version.py b/src/semver/version.py index 2f1f8cb7..0ff5b9f4 100644 --- a/src/semver/version.py +++ b/src/semver/version.py @@ -41,7 +41,7 @@ def _comparator(operator: Comparator) -> Comparator: @wraps(operator) def wrapper(self: "Version", other: Comparable) -> bool: comparable_types = ( - Version, + type(self), dict, tuple, list, diff --git a/tests/test_subclass.py b/tests/test_subclass.py index b33f4969..0d390009 100644 --- a/tests/test_subclass.py +++ b/tests/test_subclass.py @@ -1,4 +1,5 @@ from semver import Version +import pytest def test_subclass_from_versioninfo(): @@ -51,3 +52,20 @@ def __str__(self) -> str: dev_version = version.replace(prerelease="dev.0") assert str(dev_version) == "v1.1.0-dev.0" + + +def test_compare_with_subclass(): + class SemVerSubclass(Version): + pass + + with pytest.raises(TypeError): + SemVerSubclass.parse("1.0.0").compare(Version.parse("1.0.0")) + assert Version.parse("1.0.0").compare(SemVerSubclass.parse("1.0.0")) == 0 + + assert ( + SemVerSubclass.parse("1.0.0").__eq__(Version.parse("1.0.0")) is NotImplemented + ) + assert Version.parse("1.0.0").__eq__(SemVerSubclass.parse("1.0.0")) is True + + assert SemVerSubclass.parse("1.0.0") == Version.parse("1.0.0") + assert Version.parse("1.0.0") == SemVerSubclass.parse("1.0.0") From cc4ae0755098dfd52e0ee197c2099ef207079fbe Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Fri, 13 Dec 2024 13:51:33 +0100 Subject: [PATCH 48/51] Change version to 3.0.3 * Allow uvx to be executed by tox * Adjust building semver section * Rework release procedure with uv * Add restview to `pyproject.toml` * Mention PEP 639 in `pyproject.toml` * Update Changelog * Extend `.readthedocs.yaml` with jobs --- .readthedocs.yaml | 12 +++- CHANGELOG.rst | 87 ++++++++++++++++++++++- changelog.d/pr435.doc.rst | 7 -- changelog.d/pr436.doc.rst | 3 - changelog.d/pr447.internal.rst | 15 ---- docs/build-semver.rst | 53 +++----------- docs/usage/semver-version.rst | 2 +- pyproject.toml | 6 +- release-procedure.md | 124 +++++++++++++++++++-------------- src/semver/__about__.py | 2 +- tox.ini | 1 + uv.lock | 29 ++++++-- 12 files changed, 210 insertions(+), 131 deletions(-) delete mode 100644 changelog.d/pr435.doc.rst delete mode 100644 changelog.d/pr436.doc.rst delete mode 100644 changelog.d/pr447.internal.rst diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 33e3e3aa..626c2a5e 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -10,11 +10,17 @@ build: os: ubuntu-22.04 tools: python: "3.11" + jobs: + pre_install: + # - curl -LsSf https://astral.sh/uv/install.sh | sh + - pip install uv + - uv export --only-group docs --no-hashes --no-color > requirements-docs.txt + post_install: + - pip install -r requirements-docs.txt + pre_build: + - make -C docs html # Build documentation in the docs/ directory with Sphinx sphinx: configuration: docs/conf.py -python: - install: - - requirements: docs/requirements.txt diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 2281f167..97a5f89f 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -18,11 +18,96 @@ This section covers the changes between major version 2 and version 3. .. towncrier release notes start +Version 3.0.3 +============= + +:Released: 2025-01-18 +:Maintainer: Tom Schraitle + + +Bug Fixes +--------- + +* :pr:`453`: The check in ``_comparator`` does not match the check in :meth:`Version.compare`. + This breaks comparision with subclasses. + + + +Improved Documentation +---------------------- + +* :pr:`435`: Several small improvements for documentation: + + * Add meta description to improve SEO + * Use canonicals on ReadTheDocs (commit 87f639f) + * Pin versions for reproducable doc builds (commit 03fb990) + * Add missing :file:`.readthedocs.yaml` file (commit ec9348a) + * Correct some smaller issues when building (commit f65feab) + +* :pr:`436`: Move search box more at the top. This makes it easier for + users as if the TOC is long, the search box isn't visible + anymore. + + + +Features +-------- + +* :pr:`439`: Improve type hints to fix TODOs + + + +Internal Changes +---------------- + +* :pr:`440`: Update workflow file + +* :pr:`446`: Add Python 3.13 to GitHub Actions + +* :pr:`447`: Modernize project configs with :file:`pyproject.toml` and + use Astral's uv command. + + * In :file:`pyproject.toml`: + + * Move all project related data from :file:`setup.cfg` to :file:`pyproject.toml` + * Use new dependency group from :pep:`735` + * Consolidate flake8, isort, pycodestyle with ruff + * Split towncrier config type "trivial" into "trivial" and "internal" + + * Create config file for ruff (:file:`.ruff.toml`) + * Create config file for pytest (:file:`.pytest.ini`) + * Simplify :file:`tox.ini` and remove old stuff + * Document installation with new :command:`uv` command + * Simplify Sphinx config with :func:`find_version()` + * Update the authors + * Use :command:`uv` in GitHub Action :file:`python-testing.yml` workflow + +* Update :file:`release-procedure.md`. + +* :pr:`451`: Turn our Markdown issue templates into YAML + + +Trivial Changes +--------------- + +* :pr:`438`: Replace organization placeholder in license + +* :pr:`445`: Improve private :func:`_nat_cmp` method: + + * Remove obsolete else. + * Find a better way to identify digits without the :mod:`re` module. + * Fix docstring in :meth:`Version.compare` + + + +---- + + Version 3.0.2 ============= :Released: 2023-10-09 -:Maintainer: +:Maintainer: Tom Schraitle Bug Fixes diff --git a/changelog.d/pr435.doc.rst b/changelog.d/pr435.doc.rst deleted file mode 100644 index 87925c3d..00000000 --- a/changelog.d/pr435.doc.rst +++ /dev/null @@ -1,7 +0,0 @@ -Several small improvements for documentation: - -* Add meta description to improve SEO -* Use canonicals on ReadTheDocs (commit 87f639f) -* Pin versions for reproducable doc builds (commit 03fb990) -* Add missing :file:`.readthedocs.yaml` file (commit ec9348a) -* Correct some smaller issues when building (commit f65feab) diff --git a/changelog.d/pr436.doc.rst b/changelog.d/pr436.doc.rst deleted file mode 100644 index 5f078361..00000000 --- a/changelog.d/pr436.doc.rst +++ /dev/null @@ -1,3 +0,0 @@ -Move search box more at the top. This makes it easier for -users as if the TOC is long, the search box isn't visible -anymore. diff --git a/changelog.d/pr447.internal.rst b/changelog.d/pr447.internal.rst deleted file mode 100644 index 2f1e367d..00000000 --- a/changelog.d/pr447.internal.rst +++ /dev/null @@ -1,15 +0,0 @@ -Modernize project configs with :file:`pyproject.toml` - -* In :file:`pyproject.toml`: - * Move all project related data from :file:`setup.cfg` to :file:`pyproject.toml` - * Use new dependency group from :pep:`735` - * Consolidate flake8, isort, pycodestyle with ruff - * Split towncrier config type "trivial" into "trivial" and - "internal" -* Create config file for ruff (:file:`.ruff.toml`) -* Create config file for pytest (:file:`.pytest.ini`) -* Simplify :file:`tox.ini` and remove old stuff -* Document installation with new :command:`uv` command -* Simplify Sphinx config with :func:`find_version()` -* Update the authors -* Use :command:`uv` in GitHub Action :file:`python-testing.yml` workflow diff --git a/docs/build-semver.rst b/docs/build-semver.rst index b5626d22..9c0441d8 100644 --- a/docs/build-semver.rst +++ b/docs/build-semver.rst @@ -7,58 +7,27 @@ Building semver :description lang=en: Building semver -.. _PEP 517: https://www.python.org/dev/peps/pep-0517/ -.. _PEP 621: https://www.python.org/dev/peps/pep-0621/ -.. _A Practical Guide to Setuptools and Pyproject.toml: https://godatadriven.com/blog/a-practical-guide-to-setuptools-and-pyproject-toml/ -.. _Declarative config: https://setuptools.rtfd.io/en/latest/userguide/declarative_config.html +.. _Installing uv: https://docs.astral.sh/uv/getting-started/installation/ -This project changed slightly its way how it is built. The reason for this -was to still support the "traditional" way with :command:`setup.py`, -but at the same time try out the newer way with :file:`pyproject.toml`. -As Python 3.6 got deprecated, this project does support from now on only -:file:`pyproject.toml`. +This project changed its way how it is built over time. We used to have +a :file:`setup.py` file, but switched to a :file:`pyproject.toml` setup. +The build process is managed by :command:`uv` command. -Background information ----------------------- +You need: -Skip this section and head over to :ref:`build-pyproject-build` if you just -want to know how to build semver. -This section gives some background information how this project is set up. +* Python 3.7 or newer. -The traditional way with :command:`setup.py` in this project uses a -`Declarative config`_. With this approach, the :command:`setup.py` is -stripped down to its bare minimum and all the metadata is stored in -:file:`setup.cfg`. +* The :mod:`setuptools` module version 61 or newer which is used as + a build backend. -The new :file:`pyproject.toml` contains only information about the build backend, currently setuptools.build_meta. The idea is taken from -`A Practical Guide to Setuptools and Pyproject.toml`_. -Setuptools-specific configuration keys as defined in `PEP 621`_ are currently -not used. +* The command :command:`uv` from Astral. Refer to the section + `Installing uv`_ for more information. -.. _build-pyproject-build: - -Building with pyproject-build ------------------------------ - -To build semver you need: - -* The :mod:`build` module which implements the `PEP 517`_ build - frontend. - Install it with:: - - pip install build - - Some Linux distributions has already packaged it. If you prefer - to use the module with your package manager, search for - :file:`python-build` or :file:`python3-build` and install it. - -* The command :command:`pyproject-build` from the :mod:`build` module. - To build semver, run:: - pyproject-build + uv build After the command is finished, you can find two files in the :file:`dist` folder: a ``.tar.gz`` and a ``.whl`` file. \ No newline at end of file diff --git a/docs/usage/semver-version.rst b/docs/usage/semver-version.rst index 51165293..df04a74f 100644 --- a/docs/usage/semver-version.rst +++ b/docs/usage/semver-version.rst @@ -4,4 +4,4 @@ Getting the Version of semver To know the version of semver itself, use the following construct:: >>> semver.__version__ - '3.0.3-alpha.1' + '3.0.3' diff --git a/pyproject.toml b/pyproject.toml index 6c9cb93a..33986287 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,6 @@ [build-system] requires = [ - # sync with setup.py until we discard non-pep-517/518 "setuptools>=61", # "setuptools-scm>=8", ] @@ -19,6 +18,8 @@ requires-python = ">=3.7" name = "semver" description = "Python helper for Semantic Versioning (https://semver.org)" readme = "README.rst" +# PEP 639 +# licence = "BSD-2-Clause" # readme.content-type = "text/x-rst" license = { file = "LICENSE.txt" } authors = [ @@ -34,7 +35,7 @@ classifiers = [ "Environment :: Web Environment", "Intended Audience :: Developers", "Development Status :: 5 - Production/Stable", - "License :: OSI Approved :: BSD License", + # "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", @@ -92,6 +93,7 @@ docs = [ "sphinx", # ==7.0.1 "sphinx-argparse", # ==0.4.0 "sphinx-autodoc-typehints", # ==1.24.0 + "restview", ] devel = [ {include-group = "typing"}, diff --git a/release-procedure.md b/release-procedure.md index 4225bfd9..f6c7c377 100644 --- a/release-procedure.md +++ b/release-procedure.md @@ -3,120 +3,142 @@ The following procedures gives a short overview of what steps are needed to create a new release. -## Prepare the Release +## Prepare your environment -1. Verify: +1. Create your API tokens: - * all issues for a new release are closed: . + 1. From the [PyPI test server](https://test.pypi.org/manage/account/token/). - * that all pull requests that should be included in this release are merged: . + 1. From the official [PyPI server](https://test.pypi.org/manage/account/token/). - * that continuous integration for latest build was passing: - . + 1. Save both tokens it in a safe place like your password manager. + +1. Create a file `~/.pypirc` with file mode 0600 and the following minimal content: + + # Protect the file with chmod 0600 ~/.pypirc + [distutils] + index-servers = + test-semver + semver + + [test-semver] + repository = https://test.pypi.org/legacy/ + username = __token__ + password = + + [semver] + repository = https://pypi.org/legacy/ + username = __token__ + password = + +1. Install uv as shown in Astral's [Installing uv](https://docs.astral.sh/uv/getting-started/installation/) documentation. + +1. Update the project's environment: + + uv sync --group devel + +1. Activate your environment: + + source .venv/bin/activate + +## Prepare the Release 1. Create a new branch `release/`. -1. If one or several supported Python versions have been removed or added, verify that the 3 following files have been updated: - * `setup.cfg` +1. If one or several supported **Python** versions have been removed or added, verify that the following files have been updated: + * `pyproject.toml` (look into the key `project.requires-python` and `project.classifiers`) * `tox.ini` * `.git/workflows/pythonpackage.yml` * `CITATION.cff` -1. Verify that the version has been updated and follow - : +1. Verify that: + + * the version has been updated and follow : + * `src/semver/__about__.py` + * `docs/usage/semver-version.rst` + + * all issues for a new release are closed: . - * `src/semver/__about__.py` - * `docs/usage/semver-version.rst` + * all pull requests that should be included in this release are merged: . + + * continuous integration for latest build was passing: + . 1. Add eventually new contributor(s) to [CONTRIBUTORS](https://github.com/python-semver/python-semver/blob/master/CONTRIBUTORS). +1. Create the changelog: -1. Check if all changelog entries are created. If some are missing, [create them](https://python-semver.readthedocs.io/en/latest/development.html#adding-a-changelog-entry). + 1. Check if all changelog entries are created. If some are missing, [create them](https://python-semver.readthedocs.io/en/latest/development.html#adding-a-changelog-entry). -1. Show the new draft [CHANGELOG](https://github.com/python-semver/python-semver/blob/master/CHANGELOG.rst) entry for the latest release with: + 1. Show the new draft [CHANGELOG](https://github.com/python-semver/python-semver/blob/master/CHANGELOG.rst) entry for the latest release with: - $ tox -e changelog + uvx tox r -e changelog - Check the output. If you are not happy, update the files in the - `changelog.d/` directory. - If everything is okay, build the new `CHANGELOG` with: + 1. Check the output. If you are not happy, update the files in the + `changelog.d/` directory. + If everything is okay, build the new `CHANGELOG` with: - $ tox -e changelog -- build + uvx tox r -e changelog -- build 1. Build the documentation and check the output: - $ tox -e docs + uvx tox r -e docs 1. Commit all changes, push, and create a pull request. ## Create the New Release -1. Ensure that long description ([README.rst](https://github.com/python-semver/python-semver/blob/master/README.rst)) can be correctly rendered by Pypi using `restview --long-description` +1. Ensure that long description ([README.rst](https://github.com/python-semver/python-semver/blob/master/README.rst)) can be correctly rendered by Pypi using `uvx restview -b README.rst` 1. Clean up your local Git repository. Be careful, as it **will remove all files** which are not versioned by Git: - $ git clean -xfd + git clean -xfd Before you create your distribution files, clean the directory too: - $ rm dist/* + rm dist/* 1. Create the distribution files (wheel and source): - $ tox -e prepare-dist + uvx tox r -e prepare-dist 1. Upload the wheel and source to TestPyPI first: - ```bash - $ twine upload --repository-url https://test.pypi.org/legacy/ dist/* - ``` + twine upload --verbose --repository test-semver dist/* - If you have a `~/.pypirc` with a `testpypi` section, the upload can be - simplified: - - $ twine upload --repository testpypi dist/* + (Normally you would do it with `uv publish`, but for some unknown reason it didn't work for me.) 1. Check if everything is okay with the wheel. Check also the web site `https://test.pypi.org/project//` +# Finish the release + 1. If everything looks fine, merge the pull request. 1. Upload to PyPI: - ```bash - $ git clean -xfd - $ tox -e prepare-dist - $ twine upload dist/* - ``` + $ git clean -xfd + $ tox r -e prepare-dist + $ twine upload --verbose --repository semver dist/* 1. Go to https://pypi.org/project/semver/ to verify that new version is online and the page is rendered correctly. -# Finish the release - 1. Create a tag: - ```bash - $ git tag -a x.y.z - ``` + git tag -a x.y.z - It's recommended to use the generated Tox output - from the Changelog. + It's recommended to use the generated Tox output from the Changelog. 1. Push the tag: - ```bash - $ git push origin x.y.z - ``` + git push origin x.y.z -1. In [GitHub Release page](https://github.com/python-semver/python-semver/release) - document the new release. - Select the tag from the last step and copy the - content of the tag description into the release - description. +1. In [GitHub Release page](https://github.com/python-semver/python-semver/release) document the new release. + Select the tag from the last step and copy the content of the tag description into the release description. 1. Announce it in . diff --git a/src/semver/__about__.py b/src/semver/__about__.py index 697372f8..d971e038 100644 --- a/src/semver/__about__.py +++ b/src/semver/__about__.py @@ -16,7 +16,7 @@ """ #: Semver version -__version__ = "3.0.3-alpha.1" +__version__ = "3.0.3" #: Original semver author __author__ = "Kostiantyn Rybnikov" diff --git a/tox.ini b/tox.ini index 74918c44..5c9db174 100644 --- a/tox.ini +++ b/tox.ini @@ -63,6 +63,7 @@ skip_install = true allowlist_externals = make echo + uvx commands = uvx make -C docs html commands_post = diff --git a/uv.lock b/uv.lock index 026a5848..c14d1363 100644 --- a/uv.lock +++ b/uv.lock @@ -278,7 +278,7 @@ name = "click" version = "8.1.7" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "platform_system == 'Windows'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "importlib-metadata", marker = "python_full_version < '3.8'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", size = 336121 } @@ -876,16 +876,16 @@ wheels = [ [[package]] name = "readme-renderer" -version = "37.3" +version = "36.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "bleach" }, { name = "docutils" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/81/c3/d20152fcd1986117b898f66928938f329d0c91ddc47f081c58e64e0f51dc/readme_renderer-37.3.tar.gz", hash = "sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273", size = 29718 } +sdist = { url = "https://files.pythonhosted.org/packages/15/4e/0ffa80eb3e0d0fcc0c6b901b36d4faa11c47d10b9a066fdd42f24c7e646a/readme_renderer-36.0.tar.gz", hash = "sha256:f71aeef9a588fcbed1f4cc001ba611370e94a0cd27c75b1140537618ec78f0a2", size = 28680 } wheels = [ - { url = "https://files.pythonhosted.org/packages/97/52/fd8a77d6f0a9ddeb26ed8fb334e01ac546106bf0c5b8e40dc826c5bd160f/readme_renderer-37.3-py3-none-any.whl", hash = "sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343", size = 14055 }, + { url = "https://files.pythonhosted.org/packages/0a/3e/ce07c86adbc46cfedf637dd77333184bcd0a913f9c169b0b3afc25f67b6b/readme_renderer-36.0-py3-none-any.whl", hash = "sha256:2c37e472ca96755caba6cc58bcbf673a5574bc033385a2ac91d85dfef2799876", size = 14076 }, ] [[package]] @@ -915,6 +915,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481 }, ] +[[package]] +name = "restview" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "pygments" }, + { name = "readme-renderer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/d4/36ed06051e9702d3dae5f7bb0296b79b18621ff5a1bf43247509cbfeff8d/restview-3.0.2.tar.gz", hash = "sha256:8b4d75a0bed76b67b456ef7011f4eb6c98a556c9f837642df2202c7312fccc1a", size = 50048 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/69/4046cbec75d4574e84fa3b2be53487ae9054129527211961555631805849/restview-3.0.2-py3-none-any.whl", hash = "sha256:9fbd26507f6ddc436a49d0ffced5bc8102a898f289fe53c1234a17be46eb660d", size = 38020 }, +] + [[package]] name = "rfc3986" version = "2.0.0" @@ -978,7 +992,6 @@ wheels = [ [[package]] name = "semver" -version = "3.0.3a1" source = { editable = "." } [package.dev-dependencies] @@ -993,6 +1006,7 @@ devel = [ { name = "pyright" }, { name = "pytest" }, { name = "pytest-cov" }, + { name = "restview" }, { name = "ruff" }, { name = "sphinx" }, { name = "sphinx-argparse" }, @@ -1002,6 +1016,7 @@ devel = [ { name = "twine" }, ] docs = [ + { name = "restview" }, { name = "sphinx" }, { name = "sphinx-argparse" }, { name = "sphinx-autodoc-typehints" }, @@ -1019,6 +1034,7 @@ gh-action = [ { name = "pyright" }, { name = "pytest" }, { name = "pytest-cov" }, + { name = "restview" }, { name = "ruff" }, { name = "sphinx" }, { name = "sphinx-argparse" }, @@ -1054,6 +1070,7 @@ devel = [ { name = "pyright" }, { name = "pytest" }, { name = "pytest-cov" }, + { name = "restview" }, { name = "ruff" }, { name = "sphinx" }, { name = "sphinx-argparse" }, @@ -1063,6 +1080,7 @@ devel = [ { name = "twine" }, ] docs = [ + { name = "restview" }, { name = "sphinx" }, { name = "sphinx-argparse" }, { name = "sphinx-autodoc-typehints" }, @@ -1080,6 +1098,7 @@ gh-action = [ { name = "pyright" }, { name = "pytest" }, { name = "pytest-cov" }, + { name = "restview" }, { name = "ruff" }, { name = "sphinx" }, { name = "sphinx-argparse" }, From bae0b7ca7ce3f2a3268290ff9b4b379e7ed3a779 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Mon, 20 Jan 2025 09:08:20 +0100 Subject: [PATCH 49/51] Fix #459: Fix 3.0.3 * Raise version 3.0.3 -> 3.0.4 * Fix #457: Re-enable Trove license identifier * Fix #456: Fix source dist file - Sort MANIFEST.in and add missing files - Add CONTRIBUTORS, .pytest.ini, .ruff.toml, and uv.lock * Update Changelog --- CHANGELOG.rst | 19 +++++++++++++++++++ MANIFEST.in | 20 +++++++++++++++++++- docs/usage/semver-version.rst | 2 +- pyproject.toml | 2 +- src/semver/__about__.py | 2 +- 5 files changed, 41 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 97a5f89f..9efa4477 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -18,6 +18,25 @@ This section covers the changes between major version 2 and version 3. .. towncrier release notes start +Version 3.0.4 +============= + +:Released: 2025-01-24 +:Maintainer: Tom Schraitle + + +Bug Fixes +--------- + +* :gh:`459`: Fix 3.0.3: + + * :pr:`457`: Re-enable Trove license identifier + * :pr:`456`: Fix source dist file + + +---- + + Version 3.0.3 ============= diff --git a/MANIFEST.in b/MANIFEST.in index e37851c9..fa2dcb20 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,8 +1,26 @@ +include *.md include *.rst include *.txt -include tests/test_*.py +include CONTRIBUTORS +include CITATION.cff +include Makefile +include changelog.d/* +graft docs/** +include tests/*.py +include tox.ini +include .pytest.ini +include .ruff.toml +include uv.lock + +# The dot files: +include .coveragerc +include .editorconfig +include .gitignore +include .readthedocs.yaml + prune docs/_build recursive-exclude .github * +prune docs/**/__pycache__ global-exclude __pycache__ diff --git a/docs/usage/semver-version.rst b/docs/usage/semver-version.rst index df04a74f..c771a006 100644 --- a/docs/usage/semver-version.rst +++ b/docs/usage/semver-version.rst @@ -4,4 +4,4 @@ Getting the Version of semver To know the version of semver itself, use the following construct:: >>> semver.__version__ - '3.0.3' + '3.0.4' diff --git a/pyproject.toml b/pyproject.toml index 33986287..60481679 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,7 +35,7 @@ classifiers = [ "Environment :: Web Environment", "Intended Audience :: Developers", "Development Status :: 5 - Production/Stable", - # "License :: OSI Approved :: BSD License", + "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", diff --git a/src/semver/__about__.py b/src/semver/__about__.py index d971e038..21494e68 100644 --- a/src/semver/__about__.py +++ b/src/semver/__about__.py @@ -16,7 +16,7 @@ """ #: Semver version -__version__ = "3.0.3" +__version__ = "3.0.4" #: Original semver author __author__ = "Kostiantyn Rybnikov" From d959aa7d669bbabd9ccce89f2119639bdc8a05dd Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Tue, 28 Jan 2025 09:46:32 +0100 Subject: [PATCH 50/51] Fix #463: Remove duplicate code Version.bump_build (#464) * Fix #463: Remove duplicate code Version.bump_build * Update changelog --- changelog.d/463.trivial.rst | 1 + src/semver/version.py | 12 ------------ 2 files changed, 1 insertion(+), 12 deletions(-) create mode 100644 changelog.d/463.trivial.rst diff --git a/changelog.d/463.trivial.rst b/changelog.d/463.trivial.rst new file mode 100644 index 00000000..3dcad2ae --- /dev/null +++ b/changelog.d/463.trivial.rst @@ -0,0 +1 @@ +Remove double code in :meth:`Version.bump_build` \ No newline at end of file diff --git a/src/semver/version.py b/src/semver/version.py index 0ff5b9f4..ec24fbb3 100644 --- a/src/semver/version.py +++ b/src/semver/version.py @@ -359,18 +359,6 @@ def bump_build(self, token: Optional[str] = "build") -> "Version": else: build = str(token) + ".0" - # self._build or (token or "build") + ".0" - build = cls._increment_string(build) - if self._build is not None: - build = self._build - elif token == "": - build = "0" - elif token is None: - build = "build.0" - else: - build = str(token) + ".0" - - # self._build or (token or "build") + ".0" build = cls._increment_string(build) return cls(self._major, self._minor, self._patch, self._prerelease, build) From d8813b67a2ec5d579365f51a6d8f96d02f3fcbc3 Mon Sep 17 00:00:00 2001 From: Learloj Date: Tue, 28 Jan 2025 13:40:12 +0100 Subject: [PATCH 51/51] Fix #460 Improve bump_prerelease to alway get a newer version (#462) Raising a prerelease version always results in a newer version, and raising an empty prerelease version has the option to raise the patch version as well Co-authored-by: Tom Schraitle --------- Co-authored-by: Bas Roos Co-authored-by: Tom Schraitle --- changelog.d/460.bugfix.rst | 9 ++++ docs/usage/raise-parts-of-a-version.rst | 17 +++++-- src/semver/version.py | 64 +++++++++++++++++++------ tests/test_bump.py | 55 ++++++++++++++++++--- tests/test_pysemver-cli.py | 2 +- tox.ini | 1 + 6 files changed, 122 insertions(+), 26 deletions(-) create mode 100644 changelog.d/460.bugfix.rst diff --git a/changelog.d/460.bugfix.rst b/changelog.d/460.bugfix.rst new file mode 100644 index 00000000..dc21db80 --- /dev/null +++ b/changelog.d/460.bugfix.rst @@ -0,0 +1,9 @@ +:meth:`~semver.version.Version.bump_prerelease` will now add `.0` to an +existing prerelease when the last segment of the current prerelease, split by +dots (`.`), is not numeric. This is to ensure the new prerelease is considered +higher than the previous one. + +:meth:`~semver.version.Version.bump_prerelease` now also support an argument +`bump_when_empty` which will bump the patch version if there is no existing +prerelease, to ensure the resulting version is considered a higher version than +the previous one. \ No newline at end of file diff --git a/docs/usage/raise-parts-of-a-version.rst b/docs/usage/raise-parts-of-a-version.rst index be89cf8d..101a8c35 100644 --- a/docs/usage/raise-parts-of-a-version.rst +++ b/docs/usage/raise-parts-of-a-version.rst @@ -3,13 +3,14 @@ Raising Parts of a Version .. note:: - Keep in mind, "raising" the pre-release only will make your - complete version *lower* than before. + Keep in mind, by default, "raising" the pre-release for a version without an existing + prerelease part, only will make your complete version *lower* than before. For example, having version ``1.0.0`` and raising the pre-release will lead to ``1.0.0-rc.1``, but ``1.0.0-rc.1`` is smaller than ``1.0.0``. - If you search for a way to take into account this behavior, look for the + To avoid this, set `bump_when_empty=True` in the + :meth:`~semver.version.Version.bump_prerelease` method, or by using the method :meth:`~semver.version.Version.next_version` in section :ref:`increase-parts-of-a-version`. @@ -67,4 +68,14 @@ is not taken into account: >>> str(Version.parse("3.4.5-rc.1").bump_prerelease('')) '3.4.5-rc.2' +To ensure correct ordering, we append `.0` to the last prerelease identifier +if it's not numeric. This prevents cases where `rc9` would incorrectly sort +lower than `rc10` (non-numeric identifiers are compared alphabetically): + +.. code-block:: python + + >>> str(Version.parse("3.4.5-rc9").bump_prerelease()) + '3.4.5-rc9.0' + >>> str(Version.parse("3.4.5-rc.9").bump_prerelease()) + '3.4.5-rc.10' diff --git a/src/semver/version.py b/src/semver/version.py index ec24fbb3..f9450f95 100644 --- a/src/semver/version.py +++ b/src/semver/version.py @@ -77,8 +77,10 @@ class Version: #: The names of the different parts of a version NAMES: ClassVar[Tuple[str, ...]] = tuple([item[1:] for item in __slots__]) - #: Regex for number in a prerelease + #: Regex for number in a build _LAST_NUMBER: ClassVar[Pattern[str]] = re.compile(r"(?:[^\d]*(\d+)[^\d]*)+") + #: Regex for number in a prerelease + _LAST_PRERELEASE: ClassVar[Pattern[str]] = re.compile(r"^(.*\.)?(\d+)$") #: Regex template for a semver version _REGEX_TEMPLATE: ClassVar[ str @@ -245,6 +247,23 @@ def __iter__(self) -> VersionIterator: """Return iter(self).""" yield from self.to_tuple() + @staticmethod + def _increment_prerelease(string: str) -> str: + """ + Check if the last part of a dot-separated string is numeric. If yes, + increase them. Else, add '.0' + + :param string: the prerelease version to increment + :return: the incremented string + """ + match = Version._LAST_PRERELEASE.search(string) + if match: + next_ = str(int(match.group(2)) + 1) + string = match.group(1) + next_ if match.group(1) else next_ + else: + string += ".0" + return string + @staticmethod def _increment_string(string: str) -> str: """ @@ -305,35 +324,52 @@ def bump_patch(self) -> "Version": cls = type(self) return cls(self._major, self._minor, self._patch + 1) - def bump_prerelease(self, token: Optional[str] = "rc") -> "Version": + def bump_prerelease( + self, + token: Optional[str] = "rc", + bump_when_empty: Optional[bool] = False + ) -> "Version": """ Raise the prerelease part of the version, return a new object but leave self untouched. + .. versionchanged:: 3.1.0 + Parameter `bump_when_empty` added. When set to true, bumps the patch version + when called with a version that has no prerelease segment, so the return + value will be considered a newer version. + + Adds `.0` to the prerelease if the last part of the dot-separated + prerelease is not a number. + :param token: defaults to ``'rc'`` :return: new :class:`Version` object with the raised prerelease part. The original object is not modified. >>> ver = semver.parse("3.4.5") >>> ver.bump_prerelease().prerelease - 'rc.2' + 'rc.1' >>> ver.bump_prerelease('').prerelease '1' >>> ver.bump_prerelease(None).prerelease 'rc.1' + >>> str(ver.bump_prerelease(bump_when_empty=True)) + '3.4.6-rc.1' """ cls = type(self) + patch = self._patch if self._prerelease is not None: - prerelease = self._prerelease - elif token == "": - prerelease = "0" - elif token is None: - prerelease = "rc.0" + prerelease = cls._increment_prerelease(self._prerelease) else: - prerelease = str(token) + ".0" + if bump_when_empty: + patch += 1 + if token == "": + prerelease = "1" + elif token is None: + prerelease = "rc.1" + else: + prerelease = str(token) + ".1" - prerelease = cls._increment_string(prerelease) - return cls(self._major, self._minor, self._patch, prerelease) + return cls(self._major, self._minor, patch, prerelease) def bump_build(self, token: Optional[str] = "build") -> "Version": """ @@ -445,10 +481,8 @@ def next_version(self, part: str, prerelease_token: str = "rc") -> "Version": # Only check the main parts: if part in cls.NAMES[:3]: return getattr(version, "bump_" + part)() - - if not version.prerelease: - version = version.bump_patch() - return version.bump_prerelease(prerelease_token) + else: + return version.bump_prerelease(prerelease_token, bump_when_empty=True) @_comparator def __eq__(self, other: Comparable) -> bool: # type: ignore diff --git a/tests/test_bump.py b/tests/test_bump.py index 34e0b2ac..fcbedf4c 100644 --- a/tests/test_bump.py +++ b/tests/test_bump.py @@ -6,6 +6,7 @@ bump_minor, bump_patch, bump_prerelease, + compare, parse_version_info, ) @@ -32,62 +33,101 @@ def test_should_versioninfo_bump_minor_and_patch(): v = parse_version_info("3.4.5") expected = parse_version_info("3.5.1") assert v.bump_minor().bump_patch() == expected + assert v.compare(expected) == -1 def test_should_versioninfo_bump_patch_and_prerelease(): v = parse_version_info("3.4.5-rc.1") expected = parse_version_info("3.4.6-rc.1") assert v.bump_patch().bump_prerelease() == expected + assert v.compare(expected) == -1 def test_should_versioninfo_bump_patch_and_prerelease_with_token(): v = parse_version_info("3.4.5-dev.1") expected = parse_version_info("3.4.6-dev.1") assert v.bump_patch().bump_prerelease("dev") == expected + assert v.compare(expected) == -1 def test_should_versioninfo_bump_prerelease_and_build(): v = parse_version_info("3.4.5-rc.1+build.1") expected = parse_version_info("3.4.5-rc.2+build.2") assert v.bump_prerelease().bump_build() == expected + assert v.compare(expected) == -1 def test_should_versioninfo_bump_prerelease_and_build_with_token(): v = parse_version_info("3.4.5-rc.1+b.1") expected = parse_version_info("3.4.5-rc.2+b.2") assert v.bump_prerelease().bump_build("b") == expected + assert v.compare(expected) == -1 def test_should_versioninfo_bump_multiple(): v = parse_version_info("3.4.5-rc.1+build.1") expected = parse_version_info("3.4.5-rc.2+build.2") assert v.bump_prerelease().bump_build().bump_build() == expected + assert v.compare(expected) == -1 expected = parse_version_info("3.4.5-rc.3") assert v.bump_prerelease().bump_build().bump_build().bump_prerelease() == expected + assert v.compare(expected) == -1 def test_should_versioninfo_bump_prerelease_with_empty_str(): v = parse_version_info("3.4.5") expected = parse_version_info("3.4.5-1") assert v.bump_prerelease("") == expected + assert v.compare(expected) == 1 def test_should_versioninfo_bump_prerelease_with_none(): v = parse_version_info("3.4.5") expected = parse_version_info("3.4.5-rc.1") assert v.bump_prerelease(None) == expected + assert v.compare(expected) == 1 + + +def test_should_versioninfo_bump_prerelease_nonnumeric(): + v = parse_version_info("3.4.5-rc1") + expected = parse_version_info("3.4.5-rc1.0") + assert v.bump_prerelease(None) == expected + assert v.compare(expected) == -1 + + +def test_should_versioninfo_bump_prerelease_nonnumeric_nine(): + v = parse_version_info("3.4.5-rc9") + expected = parse_version_info("3.4.5-rc9.0") + assert v.bump_prerelease(None) == expected + assert v.compare(expected) == -1 + + +def test_should_versioninfo_bump_prerelease_bump_patch(): + v = parse_version_info("3.4.5") + expected = parse_version_info("3.4.6-rc.1") + assert v.bump_prerelease(bump_when_empty=True) == expected + assert v.compare(expected) == -1 + + +def test_should_versioninfo_bump_patch_and_prerelease_bump_patch(): + v = parse_version_info("3.4.5") + expected = parse_version_info("3.4.7-rc.1") + assert v.bump_patch().bump_prerelease(bump_when_empty=True) == expected + assert v.compare(expected) == -1 def test_should_versioninfo_bump_build_with_empty_str(): v = parse_version_info("3.4.5") expected = parse_version_info("3.4.5+1") assert v.bump_build("") == expected + assert v.compare(expected) == 0 def test_should_versioninfo_bump_build_with_none(): v = parse_version_info("3.4.5") expected = parse_version_info("3.4.5+build.1") assert v.bump_build(None) == expected + assert v.compare(expected) == 0 def test_should_ignore_extensions_for_bump(): @@ -95,18 +135,18 @@ def test_should_ignore_extensions_for_bump(): @pytest.mark.parametrize( - "version,token,expected", + "version,token,expected,expected_compare", [ - ("3.4.5-rc.9", None, "3.4.5-rc.10"), - ("3.4.5", None, "3.4.5-rc.1"), - ("3.4.5", "dev", "3.4.5-dev.1"), - ("3.4.5", "", "3.4.5-rc.1"), + ("3.4.5-rc.9", None, "3.4.5-rc.10", -1), + ("3.4.5", None, "3.4.5-rc.1", 1), + ("3.4.5", "dev", "3.4.5-dev.1", 1), + ("3.4.5", "", "3.4.5-rc.1", 1), ], ) -def test_should_bump_prerelease(version, token, expected): +def test_should_bump_prerelease(version, token, expected, expected_compare): token = "rc" if not token else token assert bump_prerelease(version, token) == expected - + assert compare(version, expected) == expected_compare def test_should_ignore_build_on_prerelease_bump(): assert bump_prerelease("3.4.5-rc.1+build.4") == "3.4.5-rc.2" @@ -123,3 +163,4 @@ def test_should_ignore_build_on_prerelease_bump(): ) def test_should_bump_build(version, expected): assert bump_build(version) == expected + assert compare(version, expected) == 0 \ No newline at end of file diff --git a/tests/test_pysemver-cli.py b/tests/test_pysemver-cli.py index e783a0b4..5a0a2f82 100644 --- a/tests/test_pysemver-cli.py +++ b/tests/test_pysemver-cli.py @@ -55,7 +55,7 @@ def test_should_parse_cli_arguments(cli, expected): ( cmd_bump, Namespace(bump="prerelease", version="1.2.3-rc1"), - does_not_raise("1.2.3-rc2"), + does_not_raise("1.2.3-rc1.0"), ), ( cmd_bump, diff --git a/tox.ini b/tox.ini index 5c9db174..d39ce81a 100644 --- a/tox.ini +++ b/tox.ini @@ -29,6 +29,7 @@ deps = setuptools-scm setenv = PIP_DISABLE_PIP_VERSION_CHECK = 1 +downloads = true [testenv:mypy]