From 8cf75e56f707fa7d5552ec4feb27c4d6a9921ddc Mon Sep 17 00:00:00 2001 From: Yozachar <38415384+yozachar@users.noreply.github.com> Date: Sat, 25 May 2024 08:10:01 +0530 Subject: [PATCH 01/47] hotfix: ensure `_tld.txt` is in `sdist` and `bdist` --- CHANGES.md | 17 +++++++++++++++++ CONTRIBUTING.md | 12 ++++++------ SECURITY.md | 2 +- pyproject.toml | 2 +- src/validators/__init__.py | 2 +- src/validators/_tld.txt | 2 +- src/validators/domain.py | 1 + 7 files changed, 28 insertions(+), 10 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 66ab634e..6dfe163a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,6 +9,22 @@ Note to self: Breaking changes must increment either --> +## 0.28.3 (2024-05-25) + +_**Breaking**_ + +> No breaking changes were introduced in this version. + +_**Features**_ + +> No features were introduced in this version. + +_**Maintenance**_ + +- hotfix: ensure `_tld.txt` is in `sdist` and `bdist` by @yozachar in [#379](https://github.com/python-validators/validators/pull/379) + +**Full Changelog**: [`0.28.2...0.28.3`](https://github.com/python-validators/validators/compare/0.28.2...0.28.3) + ## 0.28.2 (2024-05-24) _**Breaking**_ @@ -26,6 +42,7 @@ _**Maintenance**_ - fix(ip_address): properly handle private is false by @grleblanc in [#374](https://github.com/python-validators/validators/pull/374) - chore(url): allow symbols and pictographs in url by @prousso in [#375](https://github.com/python-validators/validators/pull/375) - build(deps): bump requests from 2.31.0 to 2.32.0 in /package by @dependabot in [#376](https://github.com/python-validators/validators/pull/376) +- chore: fix typo; update dev deps; bump version by @yozachar in [#377](https://github.com/python-validators/validators/pull/377) **Full Changelog**: [`0.28.1...0.28.2`](https://github.com/python-validators/validators/compare/0.28.1...0.28.2) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e7995c27..9a601f55 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,7 +8,7 @@ Hi, to start, you need the following installed on your system. 4. (Optional/Recommended) NodeJS for type checking 5. (Optional/Recommended) [mise](https://github.com/jdx/mise) to manage multiple versions of Python & NodeJS. -First [fork this repository](https://github.com/python-validators/validators/fork). Clone it to your system. Install development dependencies. +First [fork this repository](https://github.com/python-validators/validators/fork). Uncheck "fork only `master`", because for versioned docs you'll need `gh-pages` too. Clone it to your system. Install development dependencies. ```sh # clone repository @@ -78,11 +78,11 @@ $ python -m http.server -d docs/_build/web $ git push upstream --tag ``` -4. To update versioned docs, you must track the `gh-pages` onto a local branch. `git checkout --track upstream/gh-pages`, once. -5. Checkout to the tag you want to include in the versioned documentation `git checkout TAG_NAME`. -6. Then using [`mike`](https://github.com/jimporter/mike) (which is already a dev dependency) run `mike deploy -p -u VERSION stable`. -7. Or use `mike deploy -p -u dev master`, which will deploy docs in the CURRENT commit as the `latest` documentation. -8. Run `./package/roll.sh` (or `./package/roll.ps1`) to generate both sdist and bdist. +4. To prevew versioned docs, run `mike serve` (`mike` is already a dev dependency). +5. To update it, checkout to the tag you want to include in the versioned documentation `git checkout TAG_NAME`. +6. Then run `mike deploy -p -u VERSION stable` OR run `mike deploy -p -u dev master`, +7. Which will deploy docs in the CURRENT commit as the `latest` documentation, onto `gh-pages` branch. +8. Run `./package/roll.sh` (or `./package/roll.ps1`) to generate both `sdist` and `bdist`. 9. Install [`twine`](https://pypi.org/project/twine) using [`pipx`](https://pipx.pypa.io) to upload package to PyPI. ```sh diff --git a/SECURITY.md b/SECURITY.md index b39fe0dc..5c9f751e 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -4,7 +4,7 @@ | Version | Supported | | ---------- | ------------------ | -| `>=0.28.2` | :white_check_mark: | +| `>=0.28.3` | :white_check_mark: | ## Reporting a Vulnerability diff --git a/pyproject.toml b/pyproject.toml index fde50c7a..f1faaa87 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -88,7 +88,7 @@ include = ["validators*"] namespaces = false [tool.setuptools.package-data] -validators = ["py.typed"] +validators = ["py.typed", "_tld.txt"] [tool.setuptools.dynamic] version = { attr = "validators.__version__" } diff --git a/src/validators/__init__.py b/src/validators/__init__.py index 6f6506bc..f212d30f 100644 --- a/src/validators/__init__.py +++ b/src/validators/__init__.py @@ -105,4 +105,4 @@ "validator", ) -__version__ = "0.28.2" +__version__ = "0.28.3" diff --git a/src/validators/_tld.txt b/src/validators/_tld.txt index b26d13ad..00e543b2 100644 --- a/src/validators/_tld.txt +++ b/src/validators/_tld.txt @@ -1,4 +1,4 @@ -# Version 2024040300, Last Updated Wed Apr 3 07:07:01 2024 UTC +# Version 2024052400, Last Updated Fri May 24 07:07:01 2024 UTC AAA AARP ABB diff --git a/src/validators/domain.py b/src/validators/domain.py index 43ed981f..ecca605a 100644 --- a/src/validators/domain.py +++ b/src/validators/domain.py @@ -10,6 +10,7 @@ def _iana_tld(): """Load IANA TLDs as a Generator.""" + # source: https://data.iana.org/TLD/tlds-alpha-by-domain.txt with Path(__file__).parent.joinpath("_tld.txt").open() as tld_f: _ = next(tld_f) # ignore the first line for line in tld_f: From 70ff66924f6f821ca2e61b2e56a6de81992fe126 Mon Sep 17 00:00:00 2001 From: Yozachar <38415384+yozachar@users.noreply.github.com> Date: Mon, 17 Jun 2024 20:03:04 +0530 Subject: [PATCH 02/47] chore: update dev deps; adds python EOL info --- README.md | 6 +- docs/index.md | 6 +- docs/index.rst | 7 +- package/requirements.mkdocs.txt | 54 +++++------ package/requirements.sphinx.txt | 30 +++--- package/requirements.tooling.txt | 69 +++++++------- pdm.lock | 156 ++++++++++++++----------------- pyproject.toml | 14 +-- 8 files changed, 169 insertions(+), 173 deletions(-) diff --git a/README.md b/README.md index 9bc68517..3d7f58a4 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,11 @@ True - [Security](https://github.com/python-validators/validators/blob/master/SECURITY.md) - [Code](https://github.com/python-validators/validators/) - + + +--- + +> **_Python 3.8 [reaches EOL in](https://endoflife.date/python) October 2024._** [sast-badge]: https://github.com/python-validators/validators/actions/workflows/sast.yaml/badge.svg diff --git a/docs/index.md b/docs/index.md index 9bc68517..3d7f58a4 100644 --- a/docs/index.md +++ b/docs/index.md @@ -26,7 +26,11 @@ True - [Security](https://github.com/python-validators/validators/blob/master/SECURITY.md) - [Code](https://github.com/python-validators/validators/) - + + +--- + +> **_Python 3.8 [reaches EOL in](https://endoflife.date/python) October 2024._** [sast-badge]: https://github.com/python-validators/validators/actions/workflows/sast.yaml/badge.svg diff --git a/docs/index.rst b/docs/index.rst index 0d4e84dd..4d24aba4 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -37,7 +37,12 @@ Resources .. raw:: html - + + +-------------- + + **Python 3.8** `reaches EOL in `__ + **October 2024.** .. raw:: html diff --git a/package/requirements.mkdocs.txt b/package/requirements.mkdocs.txt index 8f0a4056..d9bef066 100644 --- a/package/requirements.mkdocs.txt +++ b/package/requirements.mkdocs.txt @@ -7,9 +7,9 @@ astunparse==1.6.3; python_version < "3.9" \ babel==2.15.0 \ --hash=sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb \ --hash=sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413 -certifi==2024.2.2 \ - --hash=sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f \ - --hash=sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1 +certifi==2024.6.2 \ + --hash=sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516 \ + --hash=sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56 charset-normalizer==3.3.2 \ --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ --hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \ @@ -103,9 +103,9 @@ gitdb==4.0.11 \ gitpython==3.1.43 \ --hash=sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c \ --hash=sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff -griffe==0.45.2 \ - --hash=sha256:297ec8530d0c68e5b98ff86fb588ebc3aa3559bb5dc21f3caea8d9542a350133 \ - --hash=sha256:83ce7dcaafd8cb7f43cbf1a455155015a1eb624b1ffd93249e5e1c4a22b2fdb2 +griffe==0.46.1 \ + --hash=sha256:cbf12fb5686110b5c1a956520079cd1656e2ea0b80b63f33ad9d9e21545af2a5 \ + --hash=sha256:e74dd71690a6bc339916f31aec4912fcb29a67294b7a557be7f80c3131f4ec6e idna==3.7 \ --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 @@ -188,12 +188,12 @@ mkdocs-autorefs==1.0.1 \ mkdocs-get-deps==0.2.0 \ --hash=sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c \ --hash=sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134 -mkdocs-git-revision-date-localized-plugin==1.2.5 \ - --hash=sha256:0c439816d9d0dba48e027d9d074b2b9f1d7cd179f74ba46b51e4da7bb3dc4b9b \ - --hash=sha256:d796a18b07cfcdb154c133e3ec099d2bb5f38389e4fd54d3eb516a8a736815b8 -mkdocs-material==9.5.24 \ - --hash=sha256:02d5aaba0ee755e707c3ef6e748f9acb7b3011187c0ea766db31af8905078a34 \ - --hash=sha256:e12cd75954c535b61e716f359cf2a5056bf4514889d17161fdebd5df4b0153c6 +mkdocs-git-revision-date-localized-plugin==1.2.6 \ + --hash=sha256:e432942ce4ee8aa9b9f4493e993dee9d2cc08b3ea2b40a3d6b03ca0f2a4bcaa2 \ + --hash=sha256:f015cb0f3894a39b33447b18e270ae391c4e25275cac5a626e80b243784e2692 +mkdocs-material==9.5.27 \ + --hash=sha256:a7d4a35f6d4a62b0c43a0cfe7e987da0980c13587b5bc3c26e690ad494427ec0 \ + --hash=sha256:af8cc263fafa98bb79e9e15a8c966204abf15164987569bd1175fd66a7705182 mkdocs-material-extensions==1.3.1 \ --hash=sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443 \ --hash=sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31 @@ -203,9 +203,9 @@ mkdocstrings==0.25.1 \ mkdocstrings-python==1.10.3 \ --hash=sha256:11ff6d21d3818fb03af82c3ea6225b1534837e17f790aa5f09626524171f949b \ --hash=sha256:321cf9c732907ab2b1fedaafa28765eaa089d89320f35f7206d00ea266889d03 -packaging==24.0 \ - --hash=sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5 \ - --hash=sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9 +packaging==24.1 \ + --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ + --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 paginate==0.5.6 \ --hash=sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d pathspec==0.12.1 \ @@ -352,21 +352,21 @@ regex==2024.5.15 \ --hash=sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a \ --hash=sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a \ --hash=sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796 -requests==2.32.2 \ - --hash=sha256:dd951ff5ecf3e3b3aa26b40703ba77495dab41da839ae72ef3c8e5d8e2433289 \ - --hash=sha256:fc06670dd0ed212426dfeb94fc1b983d917c4f9847c863f313c9dfaaffb7c23c +requests==2.32.3 \ + --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ + --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 smmap==5.0.1 \ --hash=sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62 \ --hash=sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da -typing-extensions==4.12.0; python_version < "3.11" \ - --hash=sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8 \ - --hash=sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594 -urllib3==2.2.1 \ - --hash=sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d \ - --hash=sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19 +typing-extensions==4.12.2; python_version < "3.11" \ + --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ + --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 +urllib3==2.2.2 \ + --hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \ + --hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168 verspec==0.1.0 \ --hash=sha256:741877d5633cc9464c45a469ae2a31e801e6dbbaa85b9675d481cda100f11c31 \ --hash=sha256:c4504ca697b2056cdb4bfa7121461f5a0e81809255b41c03dda4ba823637c01e @@ -406,6 +406,6 @@ watchdog==4.0.1 \ wheel==0.43.0; python_version < "3.9" \ --hash=sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85 \ --hash=sha256:55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81 -zipp==3.18.2 \ - --hash=sha256:6278d9ddbcfb1f1089a88fde84481528b07b0e10474e09dcfe53dad4069fa059 \ - --hash=sha256:dce197b859eb796242b0622af1b8beb0a722d52aa2f57133ead08edd5bf5374e +zipp==3.19.2 \ + --hash=sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19 \ + --hash=sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c diff --git a/package/requirements.sphinx.txt b/package/requirements.sphinx.txt index 197bcb7b..3e95ef31 100644 --- a/package/requirements.sphinx.txt +++ b/package/requirements.sphinx.txt @@ -10,9 +10,9 @@ babel==2.15.0 \ beautifulsoup4==4.12.3 \ --hash=sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051 \ --hash=sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed -certifi==2024.2.2 \ - --hash=sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f \ - --hash=sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1 +certifi==2024.6.2 \ + --hash=sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516 \ + --hash=sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56 charset-normalizer==3.3.2 \ --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ --hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \ @@ -176,9 +176,9 @@ mdurl==0.1.2 \ myst-parser==3.0.1 \ --hash=sha256:6457aaa33a5d474aca678b8ead9b3dc298e89c68e67012e73146ea6fd54babf1 \ --hash=sha256:88f0cb406cb363b077d176b51c476f62d60604d68a8dcdf4832e080441301a87 -packaging==24.0 \ - --hash=sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5 \ - --hash=sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9 +packaging==24.1 \ + --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ + --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 pygments==2.18.0 \ --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \ --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a @@ -233,9 +233,9 @@ pyyaml==6.0.1 \ --hash=sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c \ --hash=sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d \ --hash=sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f -requests==2.32.2 \ - --hash=sha256:dd951ff5ecf3e3b3aa26b40703ba77495dab41da839ae72ef3c8e5d8e2433289 \ - --hash=sha256:fc06670dd0ed212426dfeb94fc1b983d917c4f9847c863f313c9dfaaffb7c23c +requests==2.32.3 \ + --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ + --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 snowballstemmer==2.2.0 \ --hash=sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1 \ --hash=sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a @@ -266,9 +266,9 @@ sphinxcontrib-qthelp==1.0.3 \ sphinxcontrib-serializinghtml==1.1.5 \ --hash=sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd \ --hash=sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952 -urllib3==2.2.1 \ - --hash=sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d \ - --hash=sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19 -zipp==3.18.2 \ - --hash=sha256:6278d9ddbcfb1f1089a88fde84481528b07b0e10474e09dcfe53dad4069fa059 \ - --hash=sha256:dce197b859eb796242b0622af1b8beb0a722d52aa2f57133ead08edd5bf5374e +urllib3==2.2.2 \ + --hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \ + --hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168 +zipp==3.19.2 \ + --hash=sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19 \ + --hash=sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c diff --git a/package/requirements.tooling.txt b/package/requirements.tooling.txt index 01094e2b..e2961bf2 100644 --- a/package/requirements.tooling.txt +++ b/package/requirements.tooling.txt @@ -39,12 +39,12 @@ iniconfig==2.0.0 \ mypy-extensions==1.0.0 \ --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \ --hash=sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782 -nodeenv==1.8.0 \ - --hash=sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2 \ - --hash=sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec -packaging==24.0 \ - --hash=sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5 \ - --hash=sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9 +nodeenv==1.9.1 \ + --hash=sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f \ + --hash=sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9 +packaging==24.1 \ + --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ + --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 pathspec==0.12.1 \ --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 \ --hash=sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712 @@ -62,36 +62,33 @@ pypandoc-binary==1.13 \ --hash=sha256:67c0c7af811bcf3cd4f3221be756a4975ec35b2d7df89d8de4313a8caa2cd54f \ --hash=sha256:9455fdd9521cbf4b56d79a56b806afa94c8c22f3c8ef878536e58d941a70f6d6 \ --hash=sha256:946666388eb79b307d7f497b3b33045ef807750f8e5ef3440e0ba3bbab698044 -pyright==1.1.364 \ - --hash=sha256:612a2106a4078ec57efc22b5620729e9bdf4a3c17caba013b534bd33f7d08e5a \ - --hash=sha256:865f1e02873c5dc7427c95acf53659a118574010e6fb364e27e47ec5c46a9f26 -pytest==8.2.1 \ - --hash=sha256:5046e5b46d8e4cac199c373041f26be56fdb81eb4e67dc11d4e10811fc3408fd \ - --hash=sha256:faccc5d332b8c3719f40283d0d44aa5cf101cec36f88cde9ed8f2bc0538612b1 -ruff==0.4.5 \ - --hash=sha256:1169e47e9c4136c997f08f9857ae889d614c5035d87d38fda9b44b4338909cdf \ - --hash=sha256:25f483ad9d50b00e7fd577f6d0305aa18494c6af139bce7319c68a17180087f4 \ - --hash=sha256:286eabd47e7d4d521d199cab84deca135557e6d1e0f0d01c29e757c3cb151b54 \ - --hash=sha256:441dab55c568e38d02bbda68a926a3d0b54f5510095c9de7f95e47a39e0168aa \ - --hash=sha256:63fde3bf6f3ad4e990357af1d30e8ba2730860a954ea9282c95fc0846f5f64af \ - --hash=sha256:6e1b139b45e2911419044237d90b60e472f57285950e1492c757dfc88259bb06 \ - --hash=sha256:755ac9ac2598a941512fc36a9070a13c88d72ff874a9781493eb237ab02d75df \ - --hash=sha256:75a426506a183d9201e7e5664de3f6b414ad3850d7625764106f7b6d0486f0a1 \ - --hash=sha256:78e3ba4620dee27f76bbcad97067766026c918ba0f2d035c2fc25cbdd04d9c97 \ - --hash=sha256:84dd157474e16e3a82745d2afa1016c17d27cb5d52b12e3d45d418bcc6d49264 \ - --hash=sha256:8f58e615dec58b1a6b291769b559e12fdffb53cc4187160a2fc83250eaf54e96 \ - --hash=sha256:9d15de3425f53161b3f5a5658d4522e4eee5ea002bf2ac7aa380743dd9ad5fba \ - --hash=sha256:a6f29a8221d2e3d85ff0c7b4371c0e37b39c87732c969b4d90f3dad2e721c5b1 \ - --hash=sha256:aed8166c18b1a169a5d3ec28a49b43340949e400665555b51ee06f22813ef062 \ - --hash=sha256:b0b03c619d2b4350b4a27e34fd2ac64d0dabe1afbf43de57d0f9d8a05ecffa45 \ - --hash=sha256:d6ef817124d72b54cc923f3444828ba24fa45c3164bc9e8f1813db2f3d3a8a11 \ - --hash=sha256:f4b02a65985be2b34b170025a8b92449088ce61e33e69956ce4d316c0fe7cce0 -setuptools==70.0.0 \ - --hash=sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4 \ - --hash=sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0 +pyright==1.1.367 \ + --hash=sha256:89de6502ae02f1552d0c4df4b46867887a419849f379db617695ef9308cf01eb \ + --hash=sha256:b1e5522ceb246ee6bc293a43d6d0162719d6467c1f1e9b81cee741aa11cdacbd +pytest==8.2.2 \ + --hash=sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343 \ + --hash=sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977 +ruff==0.4.9 \ + --hash=sha256:06b60f91bfa5514bb689b500a25ba48e897d18fea14dce14b48a0c40d1635893 \ + --hash=sha256:0e8e7b95673f22e0efd3571fb5b0cf71a5eaaa3cc8a776584f3b2cc878e46bff \ + --hash=sha256:2d45ddc6d82e1190ea737341326ecbc9a61447ba331b0a8962869fcada758505 \ + --hash=sha256:4555056049d46d8a381f746680db1c46e67ac3b00d714606304077682832998e \ + --hash=sha256:5d5460f789ccf4efd43f265a58538a2c24dbce15dbf560676e430375f20a8198 \ + --hash=sha256:673bddb893f21ab47a8334c8e0ea7fd6598ecc8e698da75bcd12a7b9d0a3206e \ + --hash=sha256:732dd550bfa5d85af8c3c6cbc47ba5b67c6aed8a89e2f011b908fc88f87649db \ + --hash=sha256:784d3ec9bd6493c3b720a0b76f741e6c2d7d44f6b2be87f5eef1ae8cc1d54c84 \ + --hash=sha256:78de3fdb95c4af084087628132336772b1c5044f6e710739d440fc0bccf4d321 \ + --hash=sha256:8064590fd1a50dcf4909c268b0e7c2498253273309ad3d97e4a752bb9df4f521 \ + --hash=sha256:88bffe9c6a454bf8529f9ab9091c99490578a593cc9f9822b7fc065ee0712a06 \ + --hash=sha256:8c1aff58c31948cc66d0b22951aa19edb5af0a3af40c936340cd32a8b1ab7438 \ + --hash=sha256:98ec2775fd2d856dc405635e5ee4ff177920f2141b8e2d9eb5bd6efd50e80317 \ + --hash=sha256:b262ed08d036ebe162123170b35703aaf9daffecb698cd367a8d585157732991 \ + --hash=sha256:e0a22c4157e53d006530c902107c7f550b9233e9706313ab57b892d7197d8e52 \ + --hash=sha256:e91175fbe48f8a2174c9aad70438fe9cb0a5732c4159b2a10a3565fea2d94cde \ + --hash=sha256:f1cb0828ac9533ba0135d148d214e284711ede33640465e706772645483427e3 tomli==2.0.1; python_version < "3.11" \ --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f -typing-extensions==4.12.0; python_version < "3.11" \ - --hash=sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8 \ - --hash=sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594 +typing-extensions==4.12.2; python_version < "3.11" \ + --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ + --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 diff --git a/pdm.lock b/pdm.lock index 449fdad9..fd0bb463 100644 --- a/pdm.lock +++ b/pdm.lock @@ -2,10 +2,10 @@ # It is not intended for manual editing. [metadata] -groups = ["default", "package", "docs-online", "tooling", "runner", "sast", "docs-offline"] +groups = ["default", "docs-offline", "docs-online", "package", "runner", "sast", "tooling"] strategy = ["cross_platform", "inherit_metadata"] lock_version = "4.4.1" -content_hash = "sha256:5b8fd4acbb36295cb541cd2fb6952362eed3451f427007bc26a47c53c8f874c2" +content_hash = "sha256:f1143bde8b82a4e2bd7b47802b0d737bd856920f477462652751317cea175803" [[package]] name = "alabaster" @@ -49,7 +49,7 @@ files = [ [[package]] name = "bandit" -version = "1.7.8" +version = "1.7.9" requires_python = ">=3.8" summary = "Security oriented static analyser for python code." groups = ["sast"] @@ -60,24 +60,24 @@ dependencies = [ "stevedore>=1.20.0", ] files = [ - {file = "bandit-1.7.8-py3-none-any.whl", hash = "sha256:509f7af645bc0cd8fd4587abc1a038fc795636671ee8204d502b933aee44f381"}, - {file = "bandit-1.7.8.tar.gz", hash = "sha256:36de50f720856ab24a24dbaa5fee2c66050ed97c1477e0a1159deab1775eab6b"}, + {file = "bandit-1.7.9-py3-none-any.whl", hash = "sha256:52077cb339000f337fb25f7e045995c4ad01511e716e5daac37014b9752de8ec"}, + {file = "bandit-1.7.9.tar.gz", hash = "sha256:7c395a436743018f7be0a4cbb0a4ea9b902b6d87264ddecf8cfdc73b4f78ff61"}, ] [[package]] name = "bandit" -version = "1.7.8" +version = "1.7.9" extras = ["toml"] requires_python = ">=3.8" summary = "Security oriented static analyser for python code." groups = ["sast"] dependencies = [ - "bandit==1.7.8", + "bandit==1.7.9", "tomli>=1.1.0; python_version < \"3.11\"", ] files = [ - {file = "bandit-1.7.8-py3-none-any.whl", hash = "sha256:509f7af645bc0cd8fd4587abc1a038fc795636671ee8204d502b933aee44f381"}, - {file = "bandit-1.7.8.tar.gz", hash = "sha256:36de50f720856ab24a24dbaa5fee2c66050ed97c1477e0a1159deab1775eab6b"}, + {file = "bandit-1.7.9-py3-none-any.whl", hash = "sha256:52077cb339000f337fb25f7e045995c4ad01511e716e5daac37014b9752de8ec"}, + {file = "bandit-1.7.9.tar.gz", hash = "sha256:7c395a436743018f7be0a4cbb0a4ea9b902b6d87264ddecf8cfdc73b4f78ff61"}, ] [[package]] @@ -165,13 +165,13 @@ files = [ [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.6.2" requires_python = ">=3.6" summary = "Python package for providing Mozilla's CA Bundle." groups = ["docs-offline", "docs-online"] files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, + {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, ] [[package]] @@ -331,13 +331,13 @@ files = [ [[package]] name = "filelock" -version = "3.14.0" +version = "3.15.1" requires_python = ">=3.8" summary = "A platform independent file lock." groups = ["runner"] files = [ - {file = "filelock-3.14.0-py3-none-any.whl", hash = "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f"}, - {file = "filelock-3.14.0.tar.gz", hash = "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a"}, + {file = "filelock-3.15.1-py3-none-any.whl", hash = "sha256:71b3102950e91dfc1bb4209b64be4dc8854f40e5f534428d8684f953ac847fac"}, + {file = "filelock-3.15.1.tar.gz", hash = "sha256:58a2549afdf9e02e10720eaa4d4470f56386d7a6f72edd7d0596337af8ed7ad8"}, ] [[package]] @@ -400,7 +400,7 @@ files = [ [[package]] name = "griffe" -version = "0.45.2" +version = "0.46.1" requires_python = ">=3.8" summary = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." groups = ["docs-online"] @@ -409,8 +409,8 @@ dependencies = [ "colorama>=0.4", ] files = [ - {file = "griffe-0.45.2-py3-none-any.whl", hash = "sha256:297ec8530d0c68e5b98ff86fb588ebc3aa3559bb5dc21f3caea8d9542a350133"}, - {file = "griffe-0.45.2.tar.gz", hash = "sha256:83ce7dcaafd8cb7f43cbf1a455155015a1eb624b1ffd93249e5e1c4a22b2fdb2"}, + {file = "griffe-0.46.1-py3-none-any.whl", hash = "sha256:e74dd71690a6bc339916f31aec4912fcb29a67294b7a557be7f80c3131f4ec6e"}, + {file = "griffe-0.46.1.tar.gz", hash = "sha256:cbf12fb5686110b5c1a956520079cd1656e2ea0b80b63f33ad9d9e21545af2a5"}, ] [[package]] @@ -694,7 +694,7 @@ files = [ [[package]] name = "mkdocs-git-revision-date-localized-plugin" -version = "1.2.5" +version = "1.2.6" requires_python = ">=3.8" summary = "Mkdocs plugin that enables displaying the localized date of the last git modification of a markdown file." groups = ["docs-online"] @@ -705,13 +705,13 @@ dependencies = [ "pytz", ] files = [ - {file = "mkdocs_git_revision_date_localized_plugin-1.2.5-py3-none-any.whl", hash = "sha256:d796a18b07cfcdb154c133e3ec099d2bb5f38389e4fd54d3eb516a8a736815b8"}, - {file = "mkdocs_git_revision_date_localized_plugin-1.2.5.tar.gz", hash = "sha256:0c439816d9d0dba48e027d9d074b2b9f1d7cd179f74ba46b51e4da7bb3dc4b9b"}, + {file = "mkdocs_git_revision_date_localized_plugin-1.2.6-py3-none-any.whl", hash = "sha256:f015cb0f3894a39b33447b18e270ae391c4e25275cac5a626e80b243784e2692"}, + {file = "mkdocs_git_revision_date_localized_plugin-1.2.6.tar.gz", hash = "sha256:e432942ce4ee8aa9b9f4493e993dee9d2cc08b3ea2b40a3d6b03ca0f2a4bcaa2"}, ] [[package]] name = "mkdocs-material" -version = "9.5.24" +version = "9.5.27" requires_python = ">=3.8" summary = "Documentation that simply works" groups = ["docs-online"] @@ -729,8 +729,8 @@ dependencies = [ "requests~=2.26", ] files = [ - {file = "mkdocs_material-9.5.24-py3-none-any.whl", hash = "sha256:e12cd75954c535b61e716f359cf2a5056bf4514889d17161fdebd5df4b0153c6"}, - {file = "mkdocs_material-9.5.24.tar.gz", hash = "sha256:02d5aaba0ee755e707c3ef6e748f9acb7b3011187c0ea766db31af8905078a34"}, + {file = "mkdocs_material-9.5.27-py3-none-any.whl", hash = "sha256:af8cc263fafa98bb79e9e15a8c966204abf15164987569bd1175fd66a7705182"}, + {file = "mkdocs_material-9.5.27.tar.gz", hash = "sha256:a7d4a35f6d4a62b0c43a0cfe7e987da0980c13587b5bc3c26e690ad494427ec0"}, ] [[package]] @@ -830,27 +830,24 @@ files = [ [[package]] name = "nodeenv" -version = "1.8.0" -requires_python = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +version = "1.9.1" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" summary = "Node.js virtual environment builder" groups = ["tooling"] -dependencies = [ - "setuptools", -] files = [ - {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, - {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, ] [[package]] name = "packaging" -version = "24.0" -requires_python = ">=3.7" +version = "24.1" +requires_python = ">=3.8" summary = "Core utilities for Python packages" groups = ["docs-offline", "docs-online", "package", "runner", "tooling"] files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] @@ -987,7 +984,7 @@ files = [ [[package]] name = "pyright" -version = "1.1.364" +version = "1.1.367" requires_python = ">=3.7" summary = "Command line wrapper for pyright" groups = ["tooling"] @@ -995,13 +992,13 @@ dependencies = [ "nodeenv>=1.6.0", ] files = [ - {file = "pyright-1.1.364-py3-none-any.whl", hash = "sha256:865f1e02873c5dc7427c95acf53659a118574010e6fb364e27e47ec5c46a9f26"}, - {file = "pyright-1.1.364.tar.gz", hash = "sha256:612a2106a4078ec57efc22b5620729e9bdf4a3c17caba013b534bd33f7d08e5a"}, + {file = "pyright-1.1.367-py3-none-any.whl", hash = "sha256:89de6502ae02f1552d0c4df4b46867887a419849f379db617695ef9308cf01eb"}, + {file = "pyright-1.1.367.tar.gz", hash = "sha256:b1e5522ceb246ee6bc293a43d6d0162719d6467c1f1e9b81cee741aa11cdacbd"}, ] [[package]] name = "pytest" -version = "8.2.1" +version = "8.2.2" requires_python = ">=3.8" summary = "pytest: simple powerful testing with Python" groups = ["tooling"] @@ -1014,8 +1011,8 @@ dependencies = [ "tomli>=1; python_version < \"3.11\"", ] files = [ - {file = "pytest-8.2.1-py3-none-any.whl", hash = "sha256:faccc5d332b8c3719f40283d0d44aa5cf101cec36f88cde9ed8f2bc0538612b1"}, - {file = "pytest-8.2.1.tar.gz", hash = "sha256:5046e5b46d8e4cac199c373041f26be56fdb81eb4e67dc11d4e10811fc3408fd"}, + {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, + {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, ] [[package]] @@ -1194,7 +1191,7 @@ files = [ [[package]] name = "requests" -version = "2.32.2" +version = "2.32.3" requires_python = ">=3.8" summary = "Python HTTP for Humans." groups = ["docs-offline", "docs-online"] @@ -1205,8 +1202,8 @@ dependencies = [ "urllib3<3,>=1.21.1", ] files = [ - {file = "requests-2.32.2-py3-none-any.whl", hash = "sha256:fc06670dd0ed212426dfeb94fc1b983d917c4f9847c863f313c9dfaaffb7c23c"}, - {file = "requests-2.32.2.tar.gz", hash = "sha256:dd951ff5ecf3e3b3aa26b40703ba77495dab41da839ae72ef3c8e5d8e2433289"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [[package]] @@ -1227,39 +1224,28 @@ files = [ [[package]] name = "ruff" -version = "0.4.5" +version = "0.4.9" requires_python = ">=3.7" summary = "An extremely fast Python linter and code formatter, written in Rust." groups = ["tooling"] files = [ - {file = "ruff-0.4.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:8f58e615dec58b1a6b291769b559e12fdffb53cc4187160a2fc83250eaf54e96"}, - {file = "ruff-0.4.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:84dd157474e16e3a82745d2afa1016c17d27cb5d52b12e3d45d418bcc6d49264"}, - {file = "ruff-0.4.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f483ad9d50b00e7fd577f6d0305aa18494c6af139bce7319c68a17180087f4"}, - {file = "ruff-0.4.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:63fde3bf6f3ad4e990357af1d30e8ba2730860a954ea9282c95fc0846f5f64af"}, - {file = "ruff-0.4.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78e3ba4620dee27f76bbcad97067766026c918ba0f2d035c2fc25cbdd04d9c97"}, - {file = "ruff-0.4.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:441dab55c568e38d02bbda68a926a3d0b54f5510095c9de7f95e47a39e0168aa"}, - {file = "ruff-0.4.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1169e47e9c4136c997f08f9857ae889d614c5035d87d38fda9b44b4338909cdf"}, - {file = "ruff-0.4.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:755ac9ac2598a941512fc36a9070a13c88d72ff874a9781493eb237ab02d75df"}, - {file = "ruff-0.4.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4b02a65985be2b34b170025a8b92449088ce61e33e69956ce4d316c0fe7cce0"}, - {file = "ruff-0.4.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:75a426506a183d9201e7e5664de3f6b414ad3850d7625764106f7b6d0486f0a1"}, - {file = "ruff-0.4.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:6e1b139b45e2911419044237d90b60e472f57285950e1492c757dfc88259bb06"}, - {file = "ruff-0.4.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a6f29a8221d2e3d85ff0c7b4371c0e37b39c87732c969b4d90f3dad2e721c5b1"}, - {file = "ruff-0.4.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d6ef817124d72b54cc923f3444828ba24fa45c3164bc9e8f1813db2f3d3a8a11"}, - {file = "ruff-0.4.5-py3-none-win32.whl", hash = "sha256:aed8166c18b1a169a5d3ec28a49b43340949e400665555b51ee06f22813ef062"}, - {file = "ruff-0.4.5-py3-none-win_amd64.whl", hash = "sha256:b0b03c619d2b4350b4a27e34fd2ac64d0dabe1afbf43de57d0f9d8a05ecffa45"}, - {file = "ruff-0.4.5-py3-none-win_arm64.whl", hash = "sha256:9d15de3425f53161b3f5a5658d4522e4eee5ea002bf2ac7aa380743dd9ad5fba"}, - {file = "ruff-0.4.5.tar.gz", hash = "sha256:286eabd47e7d4d521d199cab84deca135557e6d1e0f0d01c29e757c3cb151b54"}, -] - -[[package]] -name = "setuptools" -version = "70.0.0" -requires_python = ">=3.8" -summary = "Easily download, build, install, upgrade, and uninstall Python packages" -groups = ["tooling"] -files = [ - {file = "setuptools-70.0.0-py3-none-any.whl", hash = "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4"}, - {file = "setuptools-70.0.0.tar.gz", hash = "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0"}, + {file = "ruff-0.4.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b262ed08d036ebe162123170b35703aaf9daffecb698cd367a8d585157732991"}, + {file = "ruff-0.4.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:98ec2775fd2d856dc405635e5ee4ff177920f2141b8e2d9eb5bd6efd50e80317"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4555056049d46d8a381f746680db1c46e67ac3b00d714606304077682832998e"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e91175fbe48f8a2174c9aad70438fe9cb0a5732c4159b2a10a3565fea2d94cde"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e8e7b95673f22e0efd3571fb5b0cf71a5eaaa3cc8a776584f3b2cc878e46bff"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:2d45ddc6d82e1190ea737341326ecbc9a61447ba331b0a8962869fcada758505"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:78de3fdb95c4af084087628132336772b1c5044f6e710739d440fc0bccf4d321"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:06b60f91bfa5514bb689b500a25ba48e897d18fea14dce14b48a0c40d1635893"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88bffe9c6a454bf8529f9ab9091c99490578a593cc9f9822b7fc065ee0712a06"}, + {file = "ruff-0.4.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:673bddb893f21ab47a8334c8e0ea7fd6598ecc8e698da75bcd12a7b9d0a3206e"}, + {file = "ruff-0.4.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8c1aff58c31948cc66d0b22951aa19edb5af0a3af40c936340cd32a8b1ab7438"}, + {file = "ruff-0.4.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:784d3ec9bd6493c3b720a0b76f741e6c2d7d44f6b2be87f5eef1ae8cc1d54c84"}, + {file = "ruff-0.4.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:732dd550bfa5d85af8c3c6cbc47ba5b67c6aed8a89e2f011b908fc88f87649db"}, + {file = "ruff-0.4.9-py3-none-win32.whl", hash = "sha256:8064590fd1a50dcf4909c268b0e7c2498253273309ad3d97e4a752bb9df4f521"}, + {file = "ruff-0.4.9-py3-none-win_amd64.whl", hash = "sha256:e0a22c4157e53d006530c902107c7f550b9233e9706313ab57b892d7197d8e52"}, + {file = "ruff-0.4.9-py3-none-win_arm64.whl", hash = "sha256:5d5460f789ccf4efd43f265a58538a2c24dbce15dbf560676e430375f20a8198"}, + {file = "ruff-0.4.9.tar.gz", hash = "sha256:f1cb0828ac9533ba0135d148d214e284711ede33640465e706772645483427e3"}, ] [[package]] @@ -1443,7 +1429,7 @@ files = [ [[package]] name = "tox" -version = "4.15.0" +version = "4.15.1" requires_python = ">=3.8" summary = "tox is a generic virtualenv management and test command line tool" groups = ["runner"] @@ -1460,31 +1446,31 @@ dependencies = [ "virtualenv>=20.25", ] files = [ - {file = "tox-4.15.0-py3-none-any.whl", hash = "sha256:300055f335d855b2ab1b12c5802de7f62a36d4fd53f30bd2835f6a201dda46ea"}, - {file = "tox-4.15.0.tar.gz", hash = "sha256:7a0beeef166fbe566f54f795b4906c31b428eddafc0102ac00d20998dd1933f6"}, + {file = "tox-4.15.1-py3-none-any.whl", hash = "sha256:f00a5dc4222b358e69694e47e3da0227ac41253509bca9f45aa8f012053e8d9d"}, + {file = "tox-4.15.1.tar.gz", hash = "sha256:53a092527d65e873e39213ebd4bd027a64623320b6b0326136384213f95b7076"}, ] [[package]] name = "typing-extensions" -version = "4.12.0" +version = "4.12.2" requires_python = ">=3.8" summary = "Backported and Experimental Type Hints for Python 3.8+" groups = ["docs-online", "sast", "tooling"] marker = "python_version < \"3.11\"" files = [ - {file = "typing_extensions-4.12.0-py3-none-any.whl", hash = "sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594"}, - {file = "typing_extensions-4.12.0.tar.gz", hash = "sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] name = "urllib3" -version = "2.2.1" +version = "2.2.2" requires_python = ">=3.8" summary = "HTTP library with thread-safe connection pooling, file post, and more." groups = ["docs-offline", "docs-online"] files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [[package]] @@ -1568,11 +1554,11 @@ files = [ [[package]] name = "zipp" -version = "3.18.2" +version = "3.19.2" requires_python = ">=3.8" summary = "Backport of pathlib-compatible object wrapper for zip files" groups = ["docs-offline", "docs-online", "package"] files = [ - {file = "zipp-3.18.2-py3-none-any.whl", hash = "sha256:dce197b859eb796242b0622af1b8beb0a722d52aa2f57133ead08edd5bf5374e"}, - {file = "zipp-3.18.2.tar.gz", hash = "sha256:6278d9ddbcfb1f1089a88fde84481528b07b0e10474e09dcfe53dad4069fa059"}, + {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, + {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, ] diff --git a/pyproject.toml b/pyproject.toml index f1faaa87..1cf7b901 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,19 +62,19 @@ docs-offline = [ ] docs-online = [ "mkdocs>=1.6.0", - "mkdocs-git-revision-date-localized-plugin>=1.2.5", - "mkdocs-material>=9.5.24", + "mkdocs-git-revision-date-localized-plugin>=1.2.6", + "mkdocs-material>=9.5.27", "mkdocstrings[python]>=0.25.1", "mike>=2.1.1", ] package = ["build>=1.2.1"] -runner = ["tox>=4.15.0"] -sast = ["bandit[toml]>=1.7.8"] +runner = ["tox>=4.15.1"] +sast = ["bandit[toml]>=1.7.9"] tooling = [ "black>=24.4.2", - "ruff>=0.4.5", - "pyright>=1.1.364", - "pytest>=8.2.1", + "ruff>=0.4.9", + "pyright>=1.1.367", + "pytest>=8.2.2", "pypandoc-binary>=1.13", # helps with type checking ] From 4973c49e69fc9c25741a05b4ba8fca2371734fc9 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Mon, 1 Jul 2024 18:41:31 +0330 Subject: [PATCH 03/47] feat: add validator for eth addresses (#383) - move to a new directory for crypto addresses validators - add a new feature to validate ethereum address - create a new dep group for crypto eth address - update tooling requirements - update api docs for crypto addresses - add a new dependency group for testing, update scripts accordingly - include crypto-eth-addresses in tooling requirements - add docs - bump version, update change log - fix: make `eth_hash` truly optional - make `eth_hash` truly optional - update dev dependencies - improve changelog - fix packaging and CI --------- Co-authored-by: Yozachar <38415384+yozachar@users.noreply.github.com> --- .github/workflows/pycqa.yaml | 6 +- CHANGES.md | 16 + CONTRIBUTING.md | 2 +- SECURITY.md | 2 +- docs/api/btc_address.md | 3 - docs/api/btc_address.rst | 5 - docs/api/crypto_addresses.md | 4 + docs/api/crypto_addresses.rst | 6 + mkdocs.yaml | 2 +- package/requirements.mkdocs.txt | 411 ------------------ package/requirements.sphinx.txt | 31 +- package/requirements.testing.txt | 49 +++ package/requirements.tooling.txt | 68 ++- package/roll.ps1 | 8 +- package/roll.sh | 8 +- pdm.lock | 166 ++++--- pyproject.toml | 12 +- src/validators/__init__.py | 7 +- src/validators/crypto_addresses/__init__.py | 7 + .../{ => crypto_addresses}/btc_address.py | 2 +- .../crypto_addresses/eth_address.py | 63 +++ .../test_btc_address.py | 0 tests/crypto_addresses/test_eth_address.py | 44 ++ 23 files changed, 403 insertions(+), 519 deletions(-) delete mode 100644 docs/api/btc_address.md delete mode 100644 docs/api/btc_address.rst create mode 100644 docs/api/crypto_addresses.md create mode 100644 docs/api/crypto_addresses.rst delete mode 100644 package/requirements.mkdocs.txt create mode 100644 package/requirements.testing.txt create mode 100644 src/validators/crypto_addresses/__init__.py rename src/validators/{ => crypto_addresses}/btc_address.py (97%) create mode 100644 src/validators/crypto_addresses/eth_address.py rename tests/{ => crypto_addresses}/test_btc_address.py (100%) create mode 100644 tests/crypto_addresses/test_eth_address.py diff --git a/.github/workflows/pycqa.yaml b/.github/workflows/pycqa.yaml index f713e300..13894da0 100644 --- a/.github/workflows/pycqa.yaml +++ b/.github/workflows/pycqa.yaml @@ -22,9 +22,7 @@ jobs: python-version: "3.8" # tooling - name: Install 'tooling' dependencies - run: | - pip install . - pip install -r package/requirements.tooling.txt + run: pip install -r package/requirements.tooling.txt - name: Tooling run: | black . @@ -50,6 +48,6 @@ jobs: cache: "pip" # testing - name: Install 'testing' dependencies - run: pip install pytest + run: pip install -r package/requirements.testing.txt - name: Testing run: pytest . diff --git a/CHANGES.md b/CHANGES.md index 6dfe163a..75898d1c 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,6 +9,22 @@ Note to self: Breaking changes must increment either --> +## 0.29.0 (2024-07-01) + +_**Breaking**_ ⚠️ + +- patch: moves `btc_address` to `crypto_addresses` by @msamsami in [#383](https://github.com/python-validators/validators/pull/383) on [`2f300b`](https://github.com/python-validators/validators/pull/383/commits/2f300bccf31e7d8914817cac2ca466fd2a0a4d08) + +_**Features**_ + +- feat: add validator for eth addresses by @msamsami in [#383](https://github.com/python-validators/validators/pull/383) + +_**Maintenance**_ + +- chore: update dev deps; adds python EOL info by @yozachar in [#381](https://github.com/python-validators/validators/pull/381) + +**Full Changelog**: [`0.28.3...0.29.0`](https://github.com/python-validators/validators/compare/0.28.3...0.29.0) + ## 0.28.3 (2024-05-25) _**Breaking**_ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9a601f55..ba9b1d11 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -78,7 +78,7 @@ $ python -m http.server -d docs/_build/web $ git push upstream --tag ``` -4. To prevew versioned docs, run `mike serve` (`mike` is already a dev dependency). +4. To preview versioned docs, run `mike serve` (`mike` is already a dev dependency). 5. To update it, checkout to the tag you want to include in the versioned documentation `git checkout TAG_NAME`. 6. Then run `mike deploy -p -u VERSION stable` OR run `mike deploy -p -u dev master`, 7. Which will deploy docs in the CURRENT commit as the `latest` documentation, onto `gh-pages` branch. diff --git a/SECURITY.md b/SECURITY.md index 5c9f751e..2a65546a 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -4,7 +4,7 @@ | Version | Supported | | ---------- | ------------------ | -| `>=0.28.3` | :white_check_mark: | +| `>=0.29.0` | :white_check_mark: | ## Reporting a Vulnerability diff --git a/docs/api/btc_address.md b/docs/api/btc_address.md deleted file mode 100644 index 989ca21a..00000000 --- a/docs/api/btc_address.md +++ /dev/null @@ -1,3 +0,0 @@ -# btc_address - -::: validators.btc_address.btc_address diff --git a/docs/api/btc_address.rst b/docs/api/btc_address.rst deleted file mode 100644 index cd325f55..00000000 --- a/docs/api/btc_address.rst +++ /dev/null @@ -1,5 +0,0 @@ -btc_address ------------ - -.. module:: validators.btc_address -.. autofunction:: btc_address diff --git a/docs/api/crypto_addresses.md b/docs/api/crypto_addresses.md new file mode 100644 index 00000000..628e061b --- /dev/null +++ b/docs/api/crypto_addresses.md @@ -0,0 +1,4 @@ +# crypto_addresses + +::: validators.crypto_addresses.btc_address +::: validators.crypto_addresses.eth_address diff --git a/docs/api/crypto_addresses.rst b/docs/api/crypto_addresses.rst new file mode 100644 index 00000000..60e733b8 --- /dev/null +++ b/docs/api/crypto_addresses.rst @@ -0,0 +1,6 @@ +crypto_addresses +---------------- + +.. module:: validators.crypto_addresses +.. autofunction:: btc_address +.. autofunction:: eth_address diff --git a/mkdocs.yaml b/mkdocs.yaml index cfa47f7d..b7b84f94 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -70,7 +70,7 @@ nav: - Install and Use: install_and_use.md - API: - api/between.md - - api/btc_address.md + - api/crypto_addresses.md - api/card.md - api/country.md - api/cron.md diff --git a/package/requirements.mkdocs.txt b/package/requirements.mkdocs.txt deleted file mode 100644 index d9bef066..00000000 --- a/package/requirements.mkdocs.txt +++ /dev/null @@ -1,411 +0,0 @@ -# This file is @generated by PDM. -# Please do not edit it manually. - -astunparse==1.6.3; python_version < "3.9" \ - --hash=sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872 \ - --hash=sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8 -babel==2.15.0 \ - --hash=sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb \ - --hash=sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413 -certifi==2024.6.2 \ - --hash=sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516 \ - --hash=sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56 -charset-normalizer==3.3.2 \ - --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ - --hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \ - --hash=sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8 \ - --hash=sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09 \ - --hash=sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185 \ - --hash=sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574 \ - --hash=sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e \ - --hash=sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519 \ - --hash=sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898 \ - --hash=sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269 \ - --hash=sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3 \ - --hash=sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f \ - --hash=sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8 \ - --hash=sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a \ - --hash=sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73 \ - --hash=sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc \ - --hash=sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2 \ - --hash=sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc \ - --hash=sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce \ - --hash=sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d \ - --hash=sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e \ - --hash=sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6 \ - --hash=sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269 \ - --hash=sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96 \ - --hash=sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d \ - --hash=sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a \ - --hash=sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4 \ - --hash=sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77 \ - --hash=sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d \ - --hash=sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0 \ - --hash=sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed \ - --hash=sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068 \ - --hash=sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac \ - --hash=sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25 \ - --hash=sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8 \ - --hash=sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab \ - --hash=sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26 \ - --hash=sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2 \ - --hash=sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db \ - --hash=sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f \ - --hash=sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5 \ - --hash=sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d \ - --hash=sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa \ - --hash=sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a \ - --hash=sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03 \ - --hash=sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b \ - --hash=sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04 \ - --hash=sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001 \ - --hash=sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458 \ - --hash=sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389 \ - --hash=sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99 \ - --hash=sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537 \ - --hash=sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238 \ - --hash=sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f \ - --hash=sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d \ - --hash=sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796 \ - --hash=sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a \ - --hash=sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143 \ - --hash=sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c \ - --hash=sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4 \ - --hash=sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6 \ - --hash=sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c \ - --hash=sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7 \ - --hash=sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b \ - --hash=sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae \ - --hash=sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12 \ - --hash=sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c \ - --hash=sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae \ - --hash=sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8 \ - --hash=sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887 \ - --hash=sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b \ - --hash=sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4 \ - --hash=sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f \ - --hash=sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5 \ - --hash=sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33 \ - --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ - --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 -click==8.1.7 \ - --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ - --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de -colorama==0.4.6 \ - --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ - --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 -ghp-import==2.1.0 \ - --hash=sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619 \ - --hash=sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343 -gitdb==4.0.11 \ - --hash=sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4 \ - --hash=sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b -gitpython==3.1.43 \ - --hash=sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c \ - --hash=sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff -griffe==0.46.1 \ - --hash=sha256:cbf12fb5686110b5c1a956520079cd1656e2ea0b80b63f33ad9d9e21545af2a5 \ - --hash=sha256:e74dd71690a6bc339916f31aec4912fcb29a67294b7a557be7f80c3131f4ec6e -idna==3.7 \ - --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ - --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 -importlib-metadata==7.1.0 \ - --hash=sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570 \ - --hash=sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2 -importlib-resources==6.4.0 \ - --hash=sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c \ - --hash=sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145 -jinja2==3.1.4 \ - --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ - --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d -markdown==3.6 \ - --hash=sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f \ - --hash=sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224 -markupsafe==2.1.5 \ - --hash=sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf \ - --hash=sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff \ - --hash=sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f \ - --hash=sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 \ - --hash=sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532 \ - --hash=sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f \ - --hash=sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 \ - --hash=sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4 \ - --hash=sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906 \ - --hash=sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f \ - --hash=sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4 \ - --hash=sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8 \ - --hash=sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465 \ - --hash=sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6 \ - --hash=sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169 \ - --hash=sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad \ - --hash=sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2 \ - --hash=sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0 \ - --hash=sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029 \ - --hash=sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f \ - --hash=sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a \ - --hash=sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced \ - --hash=sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5 \ - --hash=sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c \ - --hash=sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf \ - --hash=sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb \ - --hash=sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad \ - --hash=sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3 \ - --hash=sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1 \ - --hash=sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46 \ - --hash=sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc \ - --hash=sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee \ - --hash=sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900 \ - --hash=sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 \ - --hash=sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea \ - --hash=sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f \ - --hash=sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5 \ - --hash=sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e \ - --hash=sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a \ - --hash=sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a \ - --hash=sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b \ - --hash=sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4 \ - --hash=sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff \ - --hash=sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2 \ - --hash=sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46 \ - --hash=sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b \ - --hash=sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5 \ - --hash=sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5 \ - --hash=sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab \ - --hash=sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd \ - --hash=sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68 -mergedeep==1.3.4 \ - --hash=sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8 \ - --hash=sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307 -mike==2.1.1 \ - --hash=sha256:0b1d01a397a423284593eeb1b5f3194e37169488f929b860c9bfe95c0d5efb79 \ - --hash=sha256:f39ed39f3737da83ad0adc33e9f885092ed27f8c9e7ff0523add0480352a2c22 -mkdocs==1.6.0 \ - --hash=sha256:1eb5cb7676b7d89323e62b56235010216319217d4af5ddc543a91beb8d125ea7 \ - --hash=sha256:a73f735824ef83a4f3bcb7a231dcab23f5a838f88b7efc54a0eef5fbdbc3c512 -mkdocs-autorefs==1.0.1 \ - --hash=sha256:aacdfae1ab197780fb7a2dac92ad8a3d8f7ca8049a9cbe56a4218cd52e8da570 \ - --hash=sha256:f684edf847eced40b570b57846b15f0bf57fb93ac2c510450775dcf16accb971 -mkdocs-get-deps==0.2.0 \ - --hash=sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c \ - --hash=sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134 -mkdocs-git-revision-date-localized-plugin==1.2.6 \ - --hash=sha256:e432942ce4ee8aa9b9f4493e993dee9d2cc08b3ea2b40a3d6b03ca0f2a4bcaa2 \ - --hash=sha256:f015cb0f3894a39b33447b18e270ae391c4e25275cac5a626e80b243784e2692 -mkdocs-material==9.5.27 \ - --hash=sha256:a7d4a35f6d4a62b0c43a0cfe7e987da0980c13587b5bc3c26e690ad494427ec0 \ - --hash=sha256:af8cc263fafa98bb79e9e15a8c966204abf15164987569bd1175fd66a7705182 -mkdocs-material-extensions==1.3.1 \ - --hash=sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443 \ - --hash=sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31 -mkdocstrings==0.25.1 \ - --hash=sha256:c3a2515f31577f311a9ee58d089e4c51fc6046dbd9e9b4c3de4c3194667fe9bf \ - --hash=sha256:da01fcc2670ad61888e8fe5b60afe9fee5781017d67431996832d63e887c2e51 -mkdocstrings-python==1.10.3 \ - --hash=sha256:11ff6d21d3818fb03af82c3ea6225b1534837e17f790aa5f09626524171f949b \ - --hash=sha256:321cf9c732907ab2b1fedaafa28765eaa089d89320f35f7206d00ea266889d03 -packaging==24.1 \ - --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ - --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 -paginate==0.5.6 \ - --hash=sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d -pathspec==0.12.1 \ - --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 \ - --hash=sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712 -platformdirs==4.2.2 \ - --hash=sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee \ - --hash=sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3 -pygments==2.18.0 \ - --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \ - --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a -pymdown-extensions==10.8.1 \ - --hash=sha256:3ab1db5c9e21728dabf75192d71471f8e50f216627e9a1fa9535ecb0231b9940 \ - --hash=sha256:f938326115884f48c6059c67377c46cf631c733ef3629b6eed1349989d1b30cb -pyparsing==3.1.2 \ - --hash=sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad \ - --hash=sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742 -python-dateutil==2.9.0.post0 \ - --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ - --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 -pytz==2024.1 \ - --hash=sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812 \ - --hash=sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319 -pyyaml==6.0.1 \ - --hash=sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5 \ - --hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \ - --hash=sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df \ - --hash=sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741 \ - --hash=sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206 \ - --hash=sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595 \ - --hash=sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62 \ - --hash=sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696 \ - --hash=sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290 \ - --hash=sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9 \ - --hash=sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d \ - --hash=sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6 \ - --hash=sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486 \ - --hash=sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6 \ - --hash=sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007 \ - --hash=sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938 \ - --hash=sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0 \ - --hash=sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735 \ - --hash=sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d \ - --hash=sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28 \ - --hash=sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4 \ - --hash=sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8 \ - --hash=sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef \ - --hash=sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5 \ - --hash=sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0 \ - --hash=sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515 \ - --hash=sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c \ - --hash=sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924 \ - --hash=sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34 \ - --hash=sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43 \ - --hash=sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859 \ - --hash=sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673 \ - --hash=sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54 \ - --hash=sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a \ - --hash=sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b \ - --hash=sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab \ - --hash=sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c \ - --hash=sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d \ - --hash=sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f -pyyaml-env-tag==0.1 \ - --hash=sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb \ - --hash=sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069 -regex==2024.5.15 \ - --hash=sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649 \ - --hash=sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35 \ - --hash=sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb \ - --hash=sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68 \ - --hash=sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5 \ - --hash=sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133 \ - --hash=sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0 \ - --hash=sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d \ - --hash=sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da \ - --hash=sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f \ - --hash=sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d \ - --hash=sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53 \ - --hash=sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa \ - --hash=sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a \ - --hash=sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890 \ - --hash=sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67 \ - --hash=sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c \ - --hash=sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2 \ - --hash=sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced \ - --hash=sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741 \ - --hash=sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f \ - --hash=sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa \ - --hash=sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf \ - --hash=sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4 \ - --hash=sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5 \ - --hash=sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2 \ - --hash=sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384 \ - --hash=sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7 \ - --hash=sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014 \ - --hash=sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704 \ - --hash=sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5 \ - --hash=sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2 \ - --hash=sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49 \ - --hash=sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1 \ - --hash=sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694 \ - --hash=sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629 \ - --hash=sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6 \ - --hash=sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435 \ - --hash=sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c \ - --hash=sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835 \ - --hash=sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e \ - --hash=sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201 \ - --hash=sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62 \ - --hash=sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5 \ - --hash=sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16 \ - --hash=sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f \ - --hash=sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1 \ - --hash=sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f \ - --hash=sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f \ - --hash=sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145 \ - --hash=sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3 \ - --hash=sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed \ - --hash=sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143 \ - --hash=sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca \ - --hash=sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9 \ - --hash=sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa \ - --hash=sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850 \ - --hash=sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80 \ - --hash=sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe \ - --hash=sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656 \ - --hash=sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388 \ - --hash=sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1 \ - --hash=sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294 \ - --hash=sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3 \ - --hash=sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d \ - --hash=sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b \ - --hash=sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40 \ - --hash=sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600 \ - --hash=sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c \ - --hash=sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569 \ - --hash=sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456 \ - --hash=sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9 \ - --hash=sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb \ - --hash=sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e \ - --hash=sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f \ - --hash=sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d \ - --hash=sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a \ - --hash=sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a \ - --hash=sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796 -requests==2.32.3 \ - --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ - --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 -six==1.16.0 \ - --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ - --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 -smmap==5.0.1 \ - --hash=sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62 \ - --hash=sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da -typing-extensions==4.12.2; python_version < "3.11" \ - --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ - --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 -urllib3==2.2.2 \ - --hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \ - --hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168 -verspec==0.1.0 \ - --hash=sha256:741877d5633cc9464c45a469ae2a31e801e6dbbaa85b9675d481cda100f11c31 \ - --hash=sha256:c4504ca697b2056cdb4bfa7121461f5a0e81809255b41c03dda4ba823637c01e -watchdog==4.0.1 \ - --hash=sha256:0144c0ea9997b92615af1d94afc0c217e07ce2c14912c7b1a5731776329fcfc7 \ - --hash=sha256:03e70d2df2258fb6cb0e95bbdbe06c16e608af94a3ffbd2b90c3f1e83eb10767 \ - --hash=sha256:093b23e6906a8b97051191a4a0c73a77ecc958121d42346274c6af6520dec175 \ - --hash=sha256:123587af84260c991dc5f62a6e7ef3d1c57dfddc99faacee508c71d287248459 \ - --hash=sha256:17e32f147d8bf9657e0922c0940bcde863b894cd871dbb694beb6704cfbd2fb5 \ - --hash=sha256:206afc3d964f9a233e6ad34618ec60b9837d0582b500b63687e34011e15bb429 \ - --hash=sha256:4107ac5ab936a63952dea2a46a734a23230aa2f6f9db1291bf171dac3ebd53c6 \ - --hash=sha256:4513ec234c68b14d4161440e07f995f231be21a09329051e67a2118a7a612d2d \ - --hash=sha256:611be3904f9843f0529c35a3ff3fd617449463cb4b73b1633950b3d97fa4bfb7 \ - --hash=sha256:62c613ad689ddcb11707f030e722fa929f322ef7e4f18f5335d2b73c61a85c28 \ - --hash=sha256:667f3c579e813fcbad1b784db7a1aaa96524bed53437e119f6a2f5de4db04235 \ - --hash=sha256:6e8c70d2cd745daec2a08734d9f63092b793ad97612470a0ee4cbb8f5f705c57 \ - --hash=sha256:7577b3c43e5909623149f76b099ac49a1a01ca4e167d1785c76eb52fa585745a \ - --hash=sha256:998d2be6976a0ee3a81fb8e2777900c28641fb5bfbd0c84717d89bca0addcdc5 \ - --hash=sha256:a3c2c317a8fb53e5b3d25790553796105501a235343f5d2bf23bb8649c2c8709 \ - --hash=sha256:ab998f567ebdf6b1da7dc1e5accfaa7c6992244629c0fdaef062f43249bd8dee \ - --hash=sha256:ac7041b385f04c047fcc2951dc001671dee1b7e0615cde772e84b01fbf68ee84 \ - --hash=sha256:bca36be5707e81b9e6ce3208d92d95540d4ca244c006b61511753583c81c70dd \ - --hash=sha256:c9904904b6564d4ee8a1ed820db76185a3c96e05560c776c79a6ce5ab71888ba \ - --hash=sha256:cad0bbd66cd59fc474b4a4376bc5ac3fc698723510cbb64091c2a793b18654db \ - --hash=sha256:d10a681c9a1d5a77e75c48a3b8e1a9f2ae2928eda463e8d33660437705659682 \ - --hash=sha256:d4925e4bf7b9bddd1c3de13c9b8a2cdb89a468f640e66fbfabaf735bd85b3e35 \ - --hash=sha256:d7b9f5f3299e8dd230880b6c55504a1f69cf1e4316275d1b215ebdd8187ec88d \ - --hash=sha256:da2dfdaa8006eb6a71051795856bedd97e5b03e57da96f98e375682c48850645 \ - --hash=sha256:dddba7ca1c807045323b6af4ff80f5ddc4d654c8bce8317dde1bd96b128ed253 \ - --hash=sha256:e7921319fe4430b11278d924ef66d4daa469fafb1da679a2e48c935fa27af193 \ - --hash=sha256:e93f451f2dfa433d97765ca2634628b789b49ba8b504fdde5837cdcf25fdb53b \ - --hash=sha256:eebaacf674fa25511e8867028d281e602ee6500045b57f43b08778082f7f8b44 \ - --hash=sha256:ef0107bbb6a55f5be727cfc2ef945d5676b97bffb8425650dadbb184be9f9a2b \ - --hash=sha256:f0de0f284248ab40188f23380b03b59126d1479cd59940f2a34f8852db710625 \ - --hash=sha256:f27279d060e2ab24c0aa98363ff906d2386aa6c4dc2f1a374655d4e02a6c5e5e \ - --hash=sha256:f8affdf3c0f0466e69f5b3917cdd042f89c8c63aebdb9f7c078996f607cdb0f5 -wheel==0.43.0; python_version < "3.9" \ - --hash=sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85 \ - --hash=sha256:55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81 -zipp==3.19.2 \ - --hash=sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19 \ - --hash=sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c diff --git a/package/requirements.sphinx.txt b/package/requirements.sphinx.txt index 3e95ef31..42b17cff 100644 --- a/package/requirements.sphinx.txt +++ b/package/requirements.sphinx.txt @@ -97,6 +97,9 @@ colorama==0.4.6 \ docutils==0.20.1 \ --hash=sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6 \ --hash=sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b +eth-hash[pycryptodome]==0.7.0 \ + --hash=sha256:b8d5a230a2b251f4a291e3164a23a14057c4a6de4b0aa4a16fa4dc9161b57e2f \ + --hash=sha256:bacdc705bfd85dadd055ecd35fd1b4f846b671add101427e089a4ca2e8db310a furo==2024.5.6 \ --hash=sha256:490a00d08c0a37ecc90de03ae9227e8eb5d6f7f750edf9807f398a2bdf2358de \ --hash=sha256:81f205a6605ebccbb883350432b4831c0196dd3d1bc92f61e1f459045b3d2b0b @@ -106,9 +109,9 @@ idna==3.7 \ imagesize==1.4.1 \ --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b \ --hash=sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a -importlib-metadata==7.1.0 \ - --hash=sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570 \ - --hash=sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2 +importlib-metadata==8.0.0 \ + --hash=sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f \ + --hash=sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812 jinja2==3.1.4 \ --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d @@ -179,6 +182,28 @@ myst-parser==3.0.1 \ packaging==24.1 \ --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 +pycryptodome==3.20.0 \ + --hash=sha256:09609209ed7de61c2b560cc5c8c4fbf892f8b15b1faf7e4cbffac97db1fffda7 \ + --hash=sha256:210ba1b647837bfc42dd5a813cdecb5b86193ae11a3f5d972b9a0ae2c7e9e4b4 \ + --hash=sha256:2ab6ab0cb755154ad14e507d1df72de9897e99fd2d4922851a276ccc14f4f1a5 \ + --hash=sha256:405002eafad114a2f9a930f5db65feef7b53c4784495dd8758069b89baf68eab \ + --hash=sha256:4401564ebf37dfde45d096974c7a159b52eeabd9969135f0426907db367a652a \ + --hash=sha256:49a4c4dc60b78ec41d2afa392491d788c2e06edf48580fbfb0dd0f828af49d25 \ + --hash=sha256:6e0e4a987d38cfc2e71b4a1b591bae4891eeabe5fa0f56154f576e26287bfdea \ + --hash=sha256:76658f0d942051d12a9bd08ca1b6b34fd762a8ee4240984f7c06ddfb55eaf15a \ + --hash=sha256:76cb39afede7055127e35a444c1c041d2e8d2f1f9c121ecef573757ba4cd2c3c \ + --hash=sha256:8d6b98d0d83d21fb757a182d52940d028564efe8147baa9ce0f38d057104ae72 \ + --hash=sha256:9b3ae153c89a480a0ec402e23db8d8d84a3833b65fa4b15b81b83be9d637aab9 \ + --hash=sha256:a60fedd2b37b4cb11ccb5d0399efe26db9e0dd149016c1cc6c8161974ceac2d6 \ + --hash=sha256:ac1c7c0624a862f2e53438a15c9259d1655325fc2ec4392e66dc46cdae24d044 \ + --hash=sha256:acae12b9ede49f38eb0ef76fdec2df2e94aad85ae46ec85be3648a57f0a7db04 \ + --hash=sha256:acc2614e2e5346a4a4eab6e199203034924313626f9620b7b4b38e9ad74b7e0c \ + --hash=sha256:acf6e43fa75aca2d33e93409f2dafe386fe051818ee79ee8a3e21de9caa2ac9e \ + --hash=sha256:c18b381553638414b38705f07d1ef0a7cf301bc78a5f9bc17a957eb19446834b \ + --hash=sha256:ec1f93feb3bb93380ab0ebf8b859e8e5678c0f010d2d78367cf6bc30bfeb148e \ + --hash=sha256:f35d6cee81fa145333137009d9c8ba90951d7d77b67c79cbe5f03c7eb74d8fe2 \ + --hash=sha256:f47888542a0633baff535a04726948e876bf1ed880fddb7c10a736fa99146ab3 \ + --hash=sha256:fb3b87461fa35afa19c971b0a2b7456a7b1db7b4eba9a8424666104925b78128 pygments==2.18.0 \ --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \ --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a diff --git a/package/requirements.testing.txt b/package/requirements.testing.txt new file mode 100644 index 00000000..c763dc12 --- /dev/null +++ b/package/requirements.testing.txt @@ -0,0 +1,49 @@ +# This file is @generated by PDM. +# Please do not edit it manually. + +colorama==0.4.6 \ + --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 +eth-hash[pycryptodome]==0.7.0 \ + --hash=sha256:b8d5a230a2b251f4a291e3164a23a14057c4a6de4b0aa4a16fa4dc9161b57e2f \ + --hash=sha256:bacdc705bfd85dadd055ecd35fd1b4f846b671add101427e089a4ca2e8db310a +exceptiongroup==1.2.1; python_version < "3.11" \ + --hash=sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad \ + --hash=sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16 +iniconfig==2.0.0 \ + --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ + --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 +packaging==24.1 \ + --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ + --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 +pluggy==1.5.0 \ + --hash=sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1 \ + --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 +pycryptodome==3.20.0 \ + --hash=sha256:09609209ed7de61c2b560cc5c8c4fbf892f8b15b1faf7e4cbffac97db1fffda7 \ + --hash=sha256:210ba1b647837bfc42dd5a813cdecb5b86193ae11a3f5d972b9a0ae2c7e9e4b4 \ + --hash=sha256:2ab6ab0cb755154ad14e507d1df72de9897e99fd2d4922851a276ccc14f4f1a5 \ + --hash=sha256:405002eafad114a2f9a930f5db65feef7b53c4784495dd8758069b89baf68eab \ + --hash=sha256:4401564ebf37dfde45d096974c7a159b52eeabd9969135f0426907db367a652a \ + --hash=sha256:49a4c4dc60b78ec41d2afa392491d788c2e06edf48580fbfb0dd0f828af49d25 \ + --hash=sha256:6e0e4a987d38cfc2e71b4a1b591bae4891eeabe5fa0f56154f576e26287bfdea \ + --hash=sha256:76658f0d942051d12a9bd08ca1b6b34fd762a8ee4240984f7c06ddfb55eaf15a \ + --hash=sha256:76cb39afede7055127e35a444c1c041d2e8d2f1f9c121ecef573757ba4cd2c3c \ + --hash=sha256:8d6b98d0d83d21fb757a182d52940d028564efe8147baa9ce0f38d057104ae72 \ + --hash=sha256:9b3ae153c89a480a0ec402e23db8d8d84a3833b65fa4b15b81b83be9d637aab9 \ + --hash=sha256:a60fedd2b37b4cb11ccb5d0399efe26db9e0dd149016c1cc6c8161974ceac2d6 \ + --hash=sha256:ac1c7c0624a862f2e53438a15c9259d1655325fc2ec4392e66dc46cdae24d044 \ + --hash=sha256:acae12b9ede49f38eb0ef76fdec2df2e94aad85ae46ec85be3648a57f0a7db04 \ + --hash=sha256:acc2614e2e5346a4a4eab6e199203034924313626f9620b7b4b38e9ad74b7e0c \ + --hash=sha256:acf6e43fa75aca2d33e93409f2dafe386fe051818ee79ee8a3e21de9caa2ac9e \ + --hash=sha256:c18b381553638414b38705f07d1ef0a7cf301bc78a5f9bc17a957eb19446834b \ + --hash=sha256:ec1f93feb3bb93380ab0ebf8b859e8e5678c0f010d2d78367cf6bc30bfeb148e \ + --hash=sha256:f35d6cee81fa145333137009d9c8ba90951d7d77b67c79cbe5f03c7eb74d8fe2 \ + --hash=sha256:f47888542a0633baff535a04726948e876bf1ed880fddb7c10a736fa99146ab3 \ + --hash=sha256:fb3b87461fa35afa19c971b0a2b7456a7b1db7b4eba9a8424666104925b78128 +pytest==8.2.2 \ + --hash=sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343 \ + --hash=sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977 +tomli==2.0.1; python_version < "3.11" \ + --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ + --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f diff --git a/package/requirements.tooling.txt b/package/requirements.tooling.txt index e2961bf2..81fd4ee0 100644 --- a/package/requirements.tooling.txt +++ b/package/requirements.tooling.txt @@ -30,6 +30,9 @@ click==8.1.7 \ colorama==0.4.6 \ --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 +eth-hash[pycryptodome]==0.7.0 \ + --hash=sha256:b8d5a230a2b251f4a291e3164a23a14057c4a6de4b0aa4a16fa4dc9161b57e2f \ + --hash=sha256:bacdc705bfd85dadd055ecd35fd1b4f846b671add101427e089a4ca2e8db310a exceptiongroup==1.2.1; python_version < "3.11" \ --hash=sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad \ --hash=sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16 @@ -54,6 +57,28 @@ platformdirs==4.2.2 \ pluggy==1.5.0 \ --hash=sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1 \ --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 +pycryptodome==3.20.0 \ + --hash=sha256:09609209ed7de61c2b560cc5c8c4fbf892f8b15b1faf7e4cbffac97db1fffda7 \ + --hash=sha256:210ba1b647837bfc42dd5a813cdecb5b86193ae11a3f5d972b9a0ae2c7e9e4b4 \ + --hash=sha256:2ab6ab0cb755154ad14e507d1df72de9897e99fd2d4922851a276ccc14f4f1a5 \ + --hash=sha256:405002eafad114a2f9a930f5db65feef7b53c4784495dd8758069b89baf68eab \ + --hash=sha256:4401564ebf37dfde45d096974c7a159b52eeabd9969135f0426907db367a652a \ + --hash=sha256:49a4c4dc60b78ec41d2afa392491d788c2e06edf48580fbfb0dd0f828af49d25 \ + --hash=sha256:6e0e4a987d38cfc2e71b4a1b591bae4891eeabe5fa0f56154f576e26287bfdea \ + --hash=sha256:76658f0d942051d12a9bd08ca1b6b34fd762a8ee4240984f7c06ddfb55eaf15a \ + --hash=sha256:76cb39afede7055127e35a444c1c041d2e8d2f1f9c121ecef573757ba4cd2c3c \ + --hash=sha256:8d6b98d0d83d21fb757a182d52940d028564efe8147baa9ce0f38d057104ae72 \ + --hash=sha256:9b3ae153c89a480a0ec402e23db8d8d84a3833b65fa4b15b81b83be9d637aab9 \ + --hash=sha256:a60fedd2b37b4cb11ccb5d0399efe26db9e0dd149016c1cc6c8161974ceac2d6 \ + --hash=sha256:ac1c7c0624a862f2e53438a15c9259d1655325fc2ec4392e66dc46cdae24d044 \ + --hash=sha256:acae12b9ede49f38eb0ef76fdec2df2e94aad85ae46ec85be3648a57f0a7db04 \ + --hash=sha256:acc2614e2e5346a4a4eab6e199203034924313626f9620b7b4b38e9ad74b7e0c \ + --hash=sha256:acf6e43fa75aca2d33e93409f2dafe386fe051818ee79ee8a3e21de9caa2ac9e \ + --hash=sha256:c18b381553638414b38705f07d1ef0a7cf301bc78a5f9bc17a957eb19446834b \ + --hash=sha256:ec1f93feb3bb93380ab0ebf8b859e8e5678c0f010d2d78367cf6bc30bfeb148e \ + --hash=sha256:f35d6cee81fa145333137009d9c8ba90951d7d77b67c79cbe5f03c7eb74d8fe2 \ + --hash=sha256:f47888542a0633baff535a04726948e876bf1ed880fddb7c10a736fa99146ab3 \ + --hash=sha256:fb3b87461fa35afa19c971b0a2b7456a7b1db7b4eba9a8424666104925b78128 pypandoc-binary==1.13 \ --hash=sha256:11a2497320eb3dccb74de3c67b6df3e5d3f66cdc2a36a67e9a871708f7e48412 \ --hash=sha256:21ef0345726d36fc45a50211320614daf2caede684b0d0963ce8738292809746 \ @@ -62,30 +87,31 @@ pypandoc-binary==1.13 \ --hash=sha256:67c0c7af811bcf3cd4f3221be756a4975ec35b2d7df89d8de4313a8caa2cd54f \ --hash=sha256:9455fdd9521cbf4b56d79a56b806afa94c8c22f3c8ef878536e58d941a70f6d6 \ --hash=sha256:946666388eb79b307d7f497b3b33045ef807750f8e5ef3440e0ba3bbab698044 -pyright==1.1.367 \ - --hash=sha256:89de6502ae02f1552d0c4df4b46867887a419849f379db617695ef9308cf01eb \ - --hash=sha256:b1e5522ceb246ee6bc293a43d6d0162719d6467c1f1e9b81cee741aa11cdacbd +pyright==1.1.369 \ + --hash=sha256:06d5167a8d7be62523ced0265c5d2f1e022e110caf57a25d92f50fb2d07bcda0 \ + --hash=sha256:ad290710072d021e213b98cc7a2f90ae3a48609ef5b978f749346d1a47eb9af8 pytest==8.2.2 \ --hash=sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343 \ --hash=sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977 -ruff==0.4.9 \ - --hash=sha256:06b60f91bfa5514bb689b500a25ba48e897d18fea14dce14b48a0c40d1635893 \ - --hash=sha256:0e8e7b95673f22e0efd3571fb5b0cf71a5eaaa3cc8a776584f3b2cc878e46bff \ - --hash=sha256:2d45ddc6d82e1190ea737341326ecbc9a61447ba331b0a8962869fcada758505 \ - --hash=sha256:4555056049d46d8a381f746680db1c46e67ac3b00d714606304077682832998e \ - --hash=sha256:5d5460f789ccf4efd43f265a58538a2c24dbce15dbf560676e430375f20a8198 \ - --hash=sha256:673bddb893f21ab47a8334c8e0ea7fd6598ecc8e698da75bcd12a7b9d0a3206e \ - --hash=sha256:732dd550bfa5d85af8c3c6cbc47ba5b67c6aed8a89e2f011b908fc88f87649db \ - --hash=sha256:784d3ec9bd6493c3b720a0b76f741e6c2d7d44f6b2be87f5eef1ae8cc1d54c84 \ - --hash=sha256:78de3fdb95c4af084087628132336772b1c5044f6e710739d440fc0bccf4d321 \ - --hash=sha256:8064590fd1a50dcf4909c268b0e7c2498253273309ad3d97e4a752bb9df4f521 \ - --hash=sha256:88bffe9c6a454bf8529f9ab9091c99490578a593cc9f9822b7fc065ee0712a06 \ - --hash=sha256:8c1aff58c31948cc66d0b22951aa19edb5af0a3af40c936340cd32a8b1ab7438 \ - --hash=sha256:98ec2775fd2d856dc405635e5ee4ff177920f2141b8e2d9eb5bd6efd50e80317 \ - --hash=sha256:b262ed08d036ebe162123170b35703aaf9daffecb698cd367a8d585157732991 \ - --hash=sha256:e0a22c4157e53d006530c902107c7f550b9233e9706313ab57b892d7197d8e52 \ - --hash=sha256:e91175fbe48f8a2174c9aad70438fe9cb0a5732c4159b2a10a3565fea2d94cde \ - --hash=sha256:f1cb0828ac9533ba0135d148d214e284711ede33640465e706772645483427e3 +ruff==0.5.0 \ + --hash=sha256:2c4dfcd8d34b143916994b3876b63d53f56724c03f8c1a33a253b7b1e6bf2a7d \ + --hash=sha256:38f3b8327b3cb43474559d435f5fa65dacf723351c159ed0dc567f7ab735d1b6 \ + --hash=sha256:46e193b36f2255729ad34a49c9a997d506e58f08555366b2108783b3064a0e1e \ + --hash=sha256:49141d267100f5ceff541b4e06552e98527870eafa1acc9dec9139c9ec5af64c \ + --hash=sha256:7594f8df5404a5c5c8f64b8311169879f6cf42142da644c7e0ba3c3f14130370 \ + --hash=sha256:81e5facfc9f4a674c6a78c64d38becfbd5e4f739c31fcd9ce44c849f1fad9e4c \ + --hash=sha256:9dc5cfd3558f14513ed0d5b70ce531e28ea81a8a3b1b07f0f48421a3d9e7d80a \ + --hash=sha256:adc7012d6ec85032bc4e9065110df205752d64010bed5f958d25dbee9ce35de3 \ + --hash=sha256:b1a321c4f68809fddd9b282fab6a8d8db796b270fff44722589a8b946925a2a8 \ + --hash=sha256:cd096e23c6a4f9c819525a437fa0a99d1c67a1b6bb30948d46f33afbc53596cf \ + --hash=sha256:d2ffbc3715a52b037bcb0f6ff524a9367f642cdc5817944f6af5479bbb2eb50e \ + --hash=sha256:d505fb93b0fabef974b168d9b27c3960714d2ecda24b6ffa6a87ac432905ea38 \ + --hash=sha256:db3ca35265de239a1176d56a464b51557fce41095c37d6c406e658cf80bbb362 \ + --hash=sha256:e589e27971c2a3efff3fadafb16e5aef7ff93250f0134ec4b52052b673cf988d \ + --hash=sha256:e9118f60091047444c1b90952736ee7b1792910cab56e9b9a9ac20af94cd0440 \ + --hash=sha256:eb641b5873492cf9bd45bc9c5ae5320648218e04386a5f0c264ad6ccce8226a1 \ + --hash=sha256:ed5c4df5c1fb4518abcb57725b576659542bdbe93366f4f329e8f398c4b71178 \ + --hash=sha256:ee770ea8ab38918f34e7560a597cc0a8c9a193aaa01bfbd879ef43cb06bd9c4c tomli==2.0.1; python_version < "3.11" \ --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f diff --git a/package/roll.ps1 b/package/roll.ps1 index a91a406b..369729dc 100755 --- a/package/roll.ps1 +++ b/package/roll.ps1 @@ -4,12 +4,14 @@ $ErrorActionPreference = "Stop" # Check if CI environment variable is set to "false" if ($null -eq $env:CI || "false" -eq $env:CI) { + # testing + pdm export --group testing,crypto-eth-addresses -f requirements -o package/requirements.testing.txt # tooling - pdm export --group tooling -f requirements -o package/requirements.tooling.txt + pdm export --group tooling,crypto-eth-addresses -f requirements -o package/requirements.tooling.txt # mkdocs - pdm export --group docs-online -f requirements -o package/requirements.mkdocs.txt + # pdm export --group docs-online -f requirements -o package/requirements.mkdocs.txt # sphinx - pdm export --group docs-offline -f requirements -o package/requirements.sphinx.txt + pdm export --group docs-offline,crypto-eth-addresses -f requirements -o package/requirements.sphinx.txt # create environment variable $env:CI = "true"; diff --git a/package/roll.sh b/package/roll.sh index 7ff35355..1bbbf65d 100755 --- a/package/roll.sh +++ b/package/roll.sh @@ -6,12 +6,14 @@ set -e # or set to empty string or not set at all. # Using the wrong way see: https://stackoverflow.com/a/13864829 if [ -z "$CI" ] || [ "$CI" = "false" ]; then + # testing + pdm export --group testing,crypto-eth-addresses -f requirements -o package/requirements.testing.txt # tooling - pdm export --group tooling -f requirements -o package/requirements.tooling.txt + pdm export --group tooling,crypto-eth-addresses -f requirements -o package/requirements.tooling.txt # mkdocs - pdm export --group docs-online -f requirements -o package/requirements.mkdocs.txt + # pdm export --group docs-online -f requirements -o package/requirements.mkdocs.txt # sphinx - pdm export --group docs-offline -f requirements -o package/requirements.sphinx.txt + pdm export --group docs-offline,crypto-eth-addresses -f requirements -o package/requirements.sphinx.txt export CI=true fi diff --git a/pdm.lock b/pdm.lock index fd0bb463..7f6519b9 100644 --- a/pdm.lock +++ b/pdm.lock @@ -2,10 +2,10 @@ # It is not intended for manual editing. [metadata] -groups = ["default", "docs-offline", "docs-online", "package", "runner", "sast", "tooling"] +groups = ["default", "crypto-eth-addresses", "docs-offline", "docs-online", "package", "runner", "sast", "testing", "tooling"] strategy = ["cross_platform", "inherit_metadata"] -lock_version = "4.4.1" -content_hash = "sha256:f1143bde8b82a4e2bd7b47802b0d737bd856920f477462652751317cea175803" +lock_version = "4.4.2" +content_hash = "sha256:2a31be022afd854fd2d7e5b17abff17895885b687d8205f9198bd478cf2e0761" [[package]] name = "alabaster" @@ -290,7 +290,7 @@ name = "colorama" version = "0.4.6" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" summary = "Cross-platform colored terminal text." -groups = ["docs-offline", "docs-online", "package", "runner", "sast", "tooling"] +groups = ["docs-offline", "docs-online", "package", "runner", "sast", "testing", "tooling"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -317,12 +317,39 @@ files = [ {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, ] +[[package]] +name = "eth-hash" +version = "0.7.0" +requires_python = ">=3.8, <4" +summary = "eth-hash: The Ethereum hashing function, keccak256, sometimes (erroneously) called sha3" +groups = ["crypto-eth-addresses"] +files = [ + {file = "eth-hash-0.7.0.tar.gz", hash = "sha256:bacdc705bfd85dadd055ecd35fd1b4f846b671add101427e089a4ca2e8db310a"}, + {file = "eth_hash-0.7.0-py3-none-any.whl", hash = "sha256:b8d5a230a2b251f4a291e3164a23a14057c4a6de4b0aa4a16fa4dc9161b57e2f"}, +] + +[[package]] +name = "eth-hash" +version = "0.7.0" +extras = ["pycryptodome"] +requires_python = ">=3.8, <4" +summary = "eth-hash: The Ethereum hashing function, keccak256, sometimes (erroneously) called sha3" +groups = ["crypto-eth-addresses"] +dependencies = [ + "eth-hash==0.7.0", + "pycryptodome<4,>=3.6.6", +] +files = [ + {file = "eth-hash-0.7.0.tar.gz", hash = "sha256:bacdc705bfd85dadd055ecd35fd1b4f846b671add101427e089a4ca2e8db310a"}, + {file = "eth_hash-0.7.0-py3-none-any.whl", hash = "sha256:b8d5a230a2b251f4a291e3164a23a14057c4a6de4b0aa4a16fa4dc9161b57e2f"}, +] + [[package]] name = "exceptiongroup" version = "1.2.1" requires_python = ">=3.7" summary = "Backport of PEP 654 (exception groups)" -groups = ["tooling"] +groups = ["testing", "tooling"] marker = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, @@ -331,13 +358,13 @@ files = [ [[package]] name = "filelock" -version = "3.15.1" +version = "3.15.4" requires_python = ">=3.8" summary = "A platform independent file lock." groups = ["runner"] files = [ - {file = "filelock-3.15.1-py3-none-any.whl", hash = "sha256:71b3102950e91dfc1bb4209b64be4dc8854f40e5f534428d8684f953ac847fac"}, - {file = "filelock-3.15.1.tar.gz", hash = "sha256:58a2549afdf9e02e10720eaa4d4470f56386d7a6f72edd7d0596337af8ed7ad8"}, + {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, + {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, ] [[package]] @@ -400,7 +427,7 @@ files = [ [[package]] name = "griffe" -version = "0.46.1" +version = "0.47.0" requires_python = ">=3.8" summary = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." groups = ["docs-online"] @@ -409,8 +436,8 @@ dependencies = [ "colorama>=0.4", ] files = [ - {file = "griffe-0.46.1-py3-none-any.whl", hash = "sha256:e74dd71690a6bc339916f31aec4912fcb29a67294b7a557be7f80c3131f4ec6e"}, - {file = "griffe-0.46.1.tar.gz", hash = "sha256:cbf12fb5686110b5c1a956520079cd1656e2ea0b80b63f33ad9d9e21545af2a5"}, + {file = "griffe-0.47.0-py3-none-any.whl", hash = "sha256:07a2fd6a8c3d21d0bbb0decf701d62042ccc8a576645c7f8799fe1f10de2b2de"}, + {file = "griffe-0.47.0.tar.gz", hash = "sha256:95119a440a3c932b13293538bdbc405bee4c36428547553dc6b327e7e7d35e5a"}, ] [[package]] @@ -437,7 +464,7 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.1.0" +version = "8.0.0" requires_python = ">=3.8" summary = "Read metadata from Python packages" groups = ["docs-offline", "docs-online", "package"] @@ -445,8 +472,8 @@ dependencies = [ "zipp>=0.5", ] files = [ - {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, - {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, + {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"}, + {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"}, ] [[package]] @@ -468,7 +495,7 @@ name = "iniconfig" version = "2.0.0" requires_python = ">=3.7" summary = "brain-dead simple config-ini parsing" -groups = ["tooling"] +groups = ["testing", "tooling"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -614,7 +641,7 @@ files = [ [[package]] name = "mike" -version = "2.1.1" +version = "2.1.2" summary = "Manage multiple versions of your MkDocs-powered documentation" groups = ["docs-online"] dependencies = [ @@ -628,8 +655,8 @@ dependencies = [ "verspec", ] files = [ - {file = "mike-2.1.1-py3-none-any.whl", hash = "sha256:0b1d01a397a423284593eeb1b5f3194e37169488f929b860c9bfe95c0d5efb79"}, - {file = "mike-2.1.1.tar.gz", hash = "sha256:f39ed39f3737da83ad0adc33e9f885092ed27f8c9e7ff0523add0480352a2c22"}, + {file = "mike-2.1.2-py3-none-any.whl", hash = "sha256:d61d9b423ab412d634ca2bd520136d5114e3cc73f4bbd1aa6a0c6625c04918c0"}, + {file = "mike-2.1.2.tar.gz", hash = "sha256:d59cc8054c50f9c8a046cfd47f9b700cf9ff1b2b19f420bd8812ca6f94fa8bd3"}, ] [[package]] @@ -769,17 +796,17 @@ files = [ [[package]] name = "mkdocstrings-python" -version = "1.10.3" +version = "1.10.5" requires_python = ">=3.8" summary = "A Python handler for mkdocstrings." groups = ["docs-online"] dependencies = [ - "griffe>=0.44", + "griffe>=0.47", "mkdocstrings>=0.25", ] files = [ - {file = "mkdocstrings_python-1.10.3-py3-none-any.whl", hash = "sha256:11ff6d21d3818fb03af82c3ea6225b1534837e17f790aa5f09626524171f949b"}, - {file = "mkdocstrings_python-1.10.3.tar.gz", hash = "sha256:321cf9c732907ab2b1fedaafa28765eaa089d89320f35f7206d00ea266889d03"}, + {file = "mkdocstrings_python-1.10.5-py3-none-any.whl", hash = "sha256:92e3c588ef1b41151f55281d075de7558dd8092e422cb07a65b18ee2b0863ebb"}, + {file = "mkdocstrings_python-1.10.5.tar.gz", hash = "sha256:acdc2a98cd9d46c7ece508193a16ca03ccabcb67520352b7449f84b57c162bdf"}, ] [[package]] @@ -844,7 +871,7 @@ name = "packaging" version = "24.1" requires_python = ">=3.8" summary = "Core utilities for Python packages" -groups = ["docs-offline", "docs-online", "package", "runner", "tooling"] +groups = ["docs-offline", "docs-online", "package", "runner", "testing", "tooling"] files = [ {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, @@ -897,12 +924,42 @@ name = "pluggy" version = "1.5.0" requires_python = ">=3.8" summary = "plugin and hook calling mechanisms for python" -groups = ["runner", "tooling"] +groups = ["runner", "testing", "tooling"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] +[[package]] +name = "pycryptodome" +version = "3.20.0" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +summary = "Cryptographic library for Python" +groups = ["crypto-eth-addresses"] +files = [ + {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac1c7c0624a862f2e53438a15c9259d1655325fc2ec4392e66dc46cdae24d044"}, + {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:76658f0d942051d12a9bd08ca1b6b34fd762a8ee4240984f7c06ddfb55eaf15a"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f35d6cee81fa145333137009d9c8ba90951d7d77b67c79cbe5f03c7eb74d8fe2"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cb39afede7055127e35a444c1c041d2e8d2f1f9c121ecef573757ba4cd2c3c"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a4c4dc60b78ec41d2afa392491d788c2e06edf48580fbfb0dd0f828af49d25"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fb3b87461fa35afa19c971b0a2b7456a7b1db7b4eba9a8424666104925b78128"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:acc2614e2e5346a4a4eab6e199203034924313626f9620b7b4b38e9ad74b7e0c"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:210ba1b647837bfc42dd5a813cdecb5b86193ae11a3f5d972b9a0ae2c7e9e4b4"}, + {file = "pycryptodome-3.20.0-cp35-abi3-win32.whl", hash = "sha256:8d6b98d0d83d21fb757a182d52940d028564efe8147baa9ce0f38d057104ae72"}, + {file = "pycryptodome-3.20.0-cp35-abi3-win_amd64.whl", hash = "sha256:9b3ae153c89a480a0ec402e23db8d8d84a3833b65fa4b15b81b83be9d637aab9"}, + {file = "pycryptodome-3.20.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:4401564ebf37dfde45d096974c7a159b52eeabd9969135f0426907db367a652a"}, + {file = "pycryptodome-3.20.0-pp27-pypy_73-win32.whl", hash = "sha256:ec1f93feb3bb93380ab0ebf8b859e8e5678c0f010d2d78367cf6bc30bfeb148e"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:acae12b9ede49f38eb0ef76fdec2df2e94aad85ae46ec85be3648a57f0a7db04"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f47888542a0633baff535a04726948e876bf1ed880fddb7c10a736fa99146ab3"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e0e4a987d38cfc2e71b4a1b591bae4891eeabe5fa0f56154f576e26287bfdea"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c18b381553638414b38705f07d1ef0a7cf301bc78a5f9bc17a957eb19446834b"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a60fedd2b37b4cb11ccb5d0399efe26db9e0dd149016c1cc6c8161974ceac2d6"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:405002eafad114a2f9a930f5db65feef7b53c4784495dd8758069b89baf68eab"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ab6ab0cb755154ad14e507d1df72de9897e99fd2d4922851a276ccc14f4f1a5"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:acf6e43fa75aca2d33e93409f2dafe386fe051818ee79ee8a3e21de9caa2ac9e"}, + {file = "pycryptodome-3.20.0.tar.gz", hash = "sha256:09609209ed7de61c2b560cc5c8c4fbf892f8b15b1faf7e4cbffac97db1fffda7"}, +] + [[package]] name = "pygments" version = "2.18.0" @@ -958,17 +1015,17 @@ files = [ [[package]] name = "pyproject-api" -version = "1.6.1" +version = "1.7.1" requires_python = ">=3.8" summary = "API to interact with the python pyproject.toml based projects" groups = ["runner"] dependencies = [ - "packaging>=23.1", + "packaging>=24.1", "tomli>=2.0.1; python_version < \"3.11\"", ] files = [ - {file = "pyproject_api-1.6.1-py3-none-any.whl", hash = "sha256:4c0116d60476b0786c88692cf4e325a9814965e2469c5998b830bba16b183675"}, - {file = "pyproject_api-1.6.1.tar.gz", hash = "sha256:1817dc018adc0d1ff9ca1ed8c60e1623d5aaca40814b953af14a9cf9a5cae538"}, + {file = "pyproject_api-1.7.1-py3-none-any.whl", hash = "sha256:2dc1654062c2b27733d8fd4cdda672b22fe8741ef1dde8e3a998a9547b071eeb"}, + {file = "pyproject_api-1.7.1.tar.gz", hash = "sha256:7ebc6cd10710f89f4cf2a2731710a98abce37ebff19427116ff2174c9236a827"}, ] [[package]] @@ -984,7 +1041,7 @@ files = [ [[package]] name = "pyright" -version = "1.1.367" +version = "1.1.369" requires_python = ">=3.7" summary = "Command line wrapper for pyright" groups = ["tooling"] @@ -992,8 +1049,8 @@ dependencies = [ "nodeenv>=1.6.0", ] files = [ - {file = "pyright-1.1.367-py3-none-any.whl", hash = "sha256:89de6502ae02f1552d0c4df4b46867887a419849f379db617695ef9308cf01eb"}, - {file = "pyright-1.1.367.tar.gz", hash = "sha256:b1e5522ceb246ee6bc293a43d6d0162719d6467c1f1e9b81cee741aa11cdacbd"}, + {file = "pyright-1.1.369-py3-none-any.whl", hash = "sha256:06d5167a8d7be62523ced0265c5d2f1e022e110caf57a25d92f50fb2d07bcda0"}, + {file = "pyright-1.1.369.tar.gz", hash = "sha256:ad290710072d021e213b98cc7a2f90ae3a48609ef5b978f749346d1a47eb9af8"}, ] [[package]] @@ -1001,7 +1058,7 @@ name = "pytest" version = "8.2.2" requires_python = ">=3.8" summary = "pytest: simple powerful testing with Python" -groups = ["tooling"] +groups = ["testing", "tooling"] dependencies = [ "colorama; sys_platform == \"win32\"", "exceptiongroup>=1.0.0rc8; python_version < \"3.11\"", @@ -1224,28 +1281,29 @@ files = [ [[package]] name = "ruff" -version = "0.4.9" +version = "0.5.0" requires_python = ">=3.7" summary = "An extremely fast Python linter and code formatter, written in Rust." groups = ["tooling"] files = [ - {file = "ruff-0.4.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b262ed08d036ebe162123170b35703aaf9daffecb698cd367a8d585157732991"}, - {file = "ruff-0.4.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:98ec2775fd2d856dc405635e5ee4ff177920f2141b8e2d9eb5bd6efd50e80317"}, - {file = "ruff-0.4.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4555056049d46d8a381f746680db1c46e67ac3b00d714606304077682832998e"}, - {file = "ruff-0.4.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e91175fbe48f8a2174c9aad70438fe9cb0a5732c4159b2a10a3565fea2d94cde"}, - {file = "ruff-0.4.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e8e7b95673f22e0efd3571fb5b0cf71a5eaaa3cc8a776584f3b2cc878e46bff"}, - {file = "ruff-0.4.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:2d45ddc6d82e1190ea737341326ecbc9a61447ba331b0a8962869fcada758505"}, - {file = "ruff-0.4.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:78de3fdb95c4af084087628132336772b1c5044f6e710739d440fc0bccf4d321"}, - {file = "ruff-0.4.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:06b60f91bfa5514bb689b500a25ba48e897d18fea14dce14b48a0c40d1635893"}, - {file = "ruff-0.4.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88bffe9c6a454bf8529f9ab9091c99490578a593cc9f9822b7fc065ee0712a06"}, - {file = "ruff-0.4.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:673bddb893f21ab47a8334c8e0ea7fd6598ecc8e698da75bcd12a7b9d0a3206e"}, - {file = "ruff-0.4.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8c1aff58c31948cc66d0b22951aa19edb5af0a3af40c936340cd32a8b1ab7438"}, - {file = "ruff-0.4.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:784d3ec9bd6493c3b720a0b76f741e6c2d7d44f6b2be87f5eef1ae8cc1d54c84"}, - {file = "ruff-0.4.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:732dd550bfa5d85af8c3c6cbc47ba5b67c6aed8a89e2f011b908fc88f87649db"}, - {file = "ruff-0.4.9-py3-none-win32.whl", hash = "sha256:8064590fd1a50dcf4909c268b0e7c2498253273309ad3d97e4a752bb9df4f521"}, - {file = "ruff-0.4.9-py3-none-win_amd64.whl", hash = "sha256:e0a22c4157e53d006530c902107c7f550b9233e9706313ab57b892d7197d8e52"}, - {file = "ruff-0.4.9-py3-none-win_arm64.whl", hash = "sha256:5d5460f789ccf4efd43f265a58538a2c24dbce15dbf560676e430375f20a8198"}, - {file = "ruff-0.4.9.tar.gz", hash = "sha256:f1cb0828ac9533ba0135d148d214e284711ede33640465e706772645483427e3"}, + {file = "ruff-0.5.0-py3-none-linux_armv6l.whl", hash = "sha256:ee770ea8ab38918f34e7560a597cc0a8c9a193aaa01bfbd879ef43cb06bd9c4c"}, + {file = "ruff-0.5.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:38f3b8327b3cb43474559d435f5fa65dacf723351c159ed0dc567f7ab735d1b6"}, + {file = "ruff-0.5.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7594f8df5404a5c5c8f64b8311169879f6cf42142da644c7e0ba3c3f14130370"}, + {file = "ruff-0.5.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:adc7012d6ec85032bc4e9065110df205752d64010bed5f958d25dbee9ce35de3"}, + {file = "ruff-0.5.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d505fb93b0fabef974b168d9b27c3960714d2ecda24b6ffa6a87ac432905ea38"}, + {file = "ruff-0.5.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dc5cfd3558f14513ed0d5b70ce531e28ea81a8a3b1b07f0f48421a3d9e7d80a"}, + {file = "ruff-0.5.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:db3ca35265de239a1176d56a464b51557fce41095c37d6c406e658cf80bbb362"}, + {file = "ruff-0.5.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b1a321c4f68809fddd9b282fab6a8d8db796b270fff44722589a8b946925a2a8"}, + {file = "ruff-0.5.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c4dfcd8d34b143916994b3876b63d53f56724c03f8c1a33a253b7b1e6bf2a7d"}, + {file = "ruff-0.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81e5facfc9f4a674c6a78c64d38becfbd5e4f739c31fcd9ce44c849f1fad9e4c"}, + {file = "ruff-0.5.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e589e27971c2a3efff3fadafb16e5aef7ff93250f0134ec4b52052b673cf988d"}, + {file = "ruff-0.5.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d2ffbc3715a52b037bcb0f6ff524a9367f642cdc5817944f6af5479bbb2eb50e"}, + {file = "ruff-0.5.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cd096e23c6a4f9c819525a437fa0a99d1c67a1b6bb30948d46f33afbc53596cf"}, + {file = "ruff-0.5.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:46e193b36f2255729ad34a49c9a997d506e58f08555366b2108783b3064a0e1e"}, + {file = "ruff-0.5.0-py3-none-win32.whl", hash = "sha256:49141d267100f5ceff541b4e06552e98527870eafa1acc9dec9139c9ec5af64c"}, + {file = "ruff-0.5.0-py3-none-win_amd64.whl", hash = "sha256:e9118f60091047444c1b90952736ee7b1792910cab56e9b9a9ac20af94cd0440"}, + {file = "ruff-0.5.0-py3-none-win_arm64.whl", hash = "sha256:ed5c4df5c1fb4518abcb57725b576659542bdbe93366f4f329e8f398c4b71178"}, + {file = "ruff-0.5.0.tar.gz", hash = "sha256:eb641b5873492cf9bd45bc9c5ae5320648218e04386a5f0c264ad6ccce8226a1"}, ] [[package]] @@ -1420,7 +1478,7 @@ name = "tomli" version = "2.0.1" requires_python = ">=3.7" summary = "A lil' TOML parser" -groups = ["package", "runner", "sast", "tooling"] +groups = ["package", "runner", "sast", "testing", "tooling"] marker = "python_version < \"3.11\"" files = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, @@ -1485,7 +1543,7 @@ files = [ [[package]] name = "virtualenv" -version = "20.26.2" +version = "20.26.3" requires_python = ">=3.7" summary = "Virtual Python Environment builder" groups = ["runner"] @@ -1495,8 +1553,8 @@ dependencies = [ "platformdirs<5,>=3.9.1", ] files = [ - {file = "virtualenv-20.26.2-py3-none-any.whl", hash = "sha256:a624db5e94f01ad993d476b9ee5346fdf7b9de43ccaee0e0197012dc838a0e9b"}, - {file = "virtualenv-20.26.2.tar.gz", hash = "sha256:82bf0f4eebbb78d36ddaee0283d43fe5736b53880b8a8cdcd37390a07ac3741c"}, + {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"}, + {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index 1cf7b901..b018767a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,7 +47,8 @@ Changelog = "https://github.com/python-validators/validators/blob/master/CHANGES # Optional Dependencies # ########################### -# [project.optional-dependencies] +[project.optional-dependencies] +crypto-eth-addresses = ["eth-hash[pycryptodome]>=0.7.0"] ############################## # Development Dependencies # @@ -65,15 +66,16 @@ docs-online = [ "mkdocs-git-revision-date-localized-plugin>=1.2.6", "mkdocs-material>=9.5.27", "mkdocstrings[python]>=0.25.1", - "mike>=2.1.1", + "mike>=2.1.2", ] package = ["build>=1.2.1"] runner = ["tox>=4.15.1"] sast = ["bandit[toml]>=1.7.9"] +testing = ["pytest>=8.2.2"] tooling = [ "black>=24.4.2", - "ruff>=0.4.9", - "pyright>=1.1.367", + "ruff>=0.5.0", + "pyright>=1.1.369", "pytest>=8.2.2", "pypandoc-binary>=1.13", # helps with type checking ] @@ -176,6 +178,7 @@ deps = pyright pypandoc-binary pytest + .[crypto-eth-addresses] commands = pyright . [testenv:format] @@ -193,5 +196,6 @@ commands = bandit -c pyproject.toml -r . description = unit tests deps = pytest + .[crypto-eth-addresses] commands = pytest . """ diff --git a/src/validators/__init__.py b/src/validators/__init__.py index f212d30f..a554051e 100644 --- a/src/validators/__init__.py +++ b/src/validators/__init__.py @@ -2,10 +2,10 @@ # local from .between import between -from .btc_address import btc_address from .card import amex, card_number, diners, discover, jcb, mastercard, unionpay, visa from .country import calling_code, country_code, currency from .cron import cron +from .crypto_addresses import btc_address, eth_address from .domain import domain from .email import email from .encoding import base58, base64 @@ -33,13 +33,12 @@ from .utils import ValidationError, validator from .uuid import uuid -# from .crypto_addresses import eth_address - __all__ = ( # ... "between", # crypto_addresses "btc_address", + "eth_address", # cards "amex", "card_number", @@ -105,4 +104,4 @@ "validator", ) -__version__ = "0.28.3" +__version__ = "0.29.0" diff --git a/src/validators/crypto_addresses/__init__.py b/src/validators/crypto_addresses/__init__.py new file mode 100644 index 00000000..87c5e5c8 --- /dev/null +++ b/src/validators/crypto_addresses/__init__.py @@ -0,0 +1,7 @@ +"""Crypto addresses.""" + +# local +from .btc_address import btc_address +from .eth_address import eth_address + +__all__ = ("btc_address", "eth_address") diff --git a/src/validators/btc_address.py b/src/validators/crypto_addresses/btc_address.py similarity index 97% rename from src/validators/btc_address.py rename to src/validators/crypto_addresses/btc_address.py index 409a22fb..8c4aa453 100644 --- a/src/validators/btc_address.py +++ b/src/validators/crypto_addresses/btc_address.py @@ -5,7 +5,7 @@ import re # local -from .utils import validator +from validators.utils import validator def _decode_base58(addr: str): diff --git a/src/validators/crypto_addresses/eth_address.py b/src/validators/crypto_addresses/eth_address.py new file mode 100644 index 00000000..08bd0852 --- /dev/null +++ b/src/validators/crypto_addresses/eth_address.py @@ -0,0 +1,63 @@ +"""ETH Address.""" + +# standard +import re + +# local +from validators.utils import validator + +_keccak_flag = True +try: + # external + from eth_hash.auto import keccak +except ImportError: + _keccak_flag = False + + +def _validate_eth_checksum_address(addr: str): + """Validate ETH type checksum address.""" + addr = addr.replace("0x", "") + addr_hash = keccak.new(addr.lower().encode("ascii")).digest().hex() # type: ignore + + if len(addr) != 40: + return False + + for i in range(0, 40): + if (int(addr_hash[i], 16) > 7 and addr[i].upper() != addr[i]) or ( + int(addr_hash[i], 16) <= 7 and addr[i].lower() != addr[i] + ): + return False + return True + + +@validator +def eth_address(value: str, /): + """Return whether or not given value is a valid ethereum address. + + Full validation is implemented for ERC20 addresses. + + Examples: + >>> eth_address('0x9cc14ba4f9f68ca159ea4ebf2c292a808aaeb598') + # Output: True + >>> eth_address('0x8Ba1f109551bD432803012645Ac136ddd64DBa72') + # Output: ValidationError(func=eth_address, args=...) + + Args: + value: + Ethereum address string to validate. + + Returns: + (Literal[True]): If `value` is a valid ethereum address. + (ValidationError): If `value` is an invalid ethereum address. + """ + if not _keccak_flag: + raise ImportError( + "Do `pip install validators[crypto-eth-addresses]` to perform `eth_address` validation." + ) + + if not value: + return False + + return re.compile(r"^0x[0-9a-f]{40}$|^0x[0-9A-F]{40}$").match( + value + ) or _validate_eth_checksum_address(value) diff --git a/tests/test_btc_address.py b/tests/crypto_addresses/test_btc_address.py similarity index 100% rename from tests/test_btc_address.py rename to tests/crypto_addresses/test_btc_address.py diff --git a/tests/crypto_addresses/test_eth_address.py b/tests/crypto_addresses/test_eth_address.py new file mode 100644 index 00000000..2baaad5c --- /dev/null +++ b/tests/crypto_addresses/test_eth_address.py @@ -0,0 +1,44 @@ +"""Test ETH address.""" + +# external +import pytest + +# local +from validators import ValidationError, eth_address + + +@pytest.mark.parametrize( + "value", + [ + "0x8ba1f109551bd432803012645ac136ddd64dba72", + "0x9cc14ba4f9f68ca159ea4ebf2c292a808aaeb598", + "0x5AEDA56215b167893e80B4fE645BA6d5Bab767DE", + "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "0x742d35Cc6634C0532925a3b844Bc454e4438f44e", + "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984", + "0x1234567890123456789012345678901234567890", + "0x57Ab1ec28D129707052df4dF418D58a2D46d5f51", + ], +) +def test_returns_true_on_valid_eth_address(value: str): + """Test returns true on valid eth address.""" + assert eth_address(value) + + +@pytest.mark.parametrize( + "value", + [ + "0x742d35Cc6634C0532925a3b844Bc454e4438f44g", + "0x742d35Cc6634C0532925a3b844Bc454e4438f44", + "0xAbcdefg1234567890Abcdefg1234567890Abcdefg", + "0x7c8EE9977c6f96b6b9774b3e8e4Cc9B93B12b2c72", + "0x80fBD7F8B3f81D0e1d6EACAb69AF104A6508AFB1", + "0x7c8EE9977c6f96b6b9774b3e8e4Cc9B93B12b2c7g", + "0x7c8EE9977c6f96b6b9774b3e8e4Cc9B93B12b2c", + "0x7Fb21a171205f3B8d8E4d88A2d2f8A56E45DdB5c", + "validators.eth", + ], +) +def test_returns_failed_validation_on_invalid_eth_address(value: str): + """Test returns failed validation on invalid eth address.""" + assert isinstance(eth_address(value), ValidationError) From 860ca4608cb1806cccabccfb9b4f416349001c5e Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Thu, 4 Jul 2024 06:03:54 +0330 Subject: [PATCH 04/47] feat: add validator for trx addresses (#384) - feat: add validator for trx addresses - bump version - fix minor issues in changelog --- CHANGES.md | 20 ++++++ SECURITY.md | 2 +- docs/api/crypto_addresses.md | 1 + docs/api/crypto_addresses.rst | 1 + src/validators/__init__.py | 5 +- src/validators/crypto_addresses/__init__.py | 3 +- .../crypto_addresses/trx_address.py | 62 +++++++++++++++++++ tests/crypto_addresses/test_trx_address.py | 54 ++++++++++++++++ 8 files changed, 144 insertions(+), 4 deletions(-) create mode 100644 src/validators/crypto_addresses/trx_address.py create mode 100644 tests/crypto_addresses/test_trx_address.py diff --git a/CHANGES.md b/CHANGES.md index 75898d1c..e0a3d97a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,6 +9,24 @@ Note to self: Breaking changes must increment either --> +## 0.30.0 (2024-07-04) + +_**Breaking**_ + +> No breaking changes were introduced in this version. + +_**Features**_ + +- feat: add validator for trx addresses by @msamsami in [#384](https://github.com/python-validators/validators/pull/384) + +_**Maintenance**_ + +- maint: bump version by @msamsami in [#384](https://github.com/python-validators/validators/pull/384) + +**Full Changelog**: [`0.29.0...0.30.0`](https://github.com/python-validators/validators/compare/0.29.0...0.30.0) + +--- + ## 0.29.0 (2024-07-01) _**Breaking**_ ⚠️ @@ -25,6 +43,8 @@ _**Maintenance**_ **Full Changelog**: [`0.28.3...0.29.0`](https://github.com/python-validators/validators/compare/0.28.3...0.29.0) +--- + ## 0.28.3 (2024-05-25) _**Breaking**_ diff --git a/SECURITY.md b/SECURITY.md index 2a65546a..2231e167 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -4,7 +4,7 @@ | Version | Supported | | ---------- | ------------------ | -| `>=0.29.0` | :white_check_mark: | +| `>=0.30.0` | :white_check_mark: | ## Reporting a Vulnerability diff --git a/docs/api/crypto_addresses.md b/docs/api/crypto_addresses.md index 628e061b..226ef0c5 100644 --- a/docs/api/crypto_addresses.md +++ b/docs/api/crypto_addresses.md @@ -2,3 +2,4 @@ ::: validators.crypto_addresses.btc_address ::: validators.crypto_addresses.eth_address +::: validators.crypto_addresses.trx_address diff --git a/docs/api/crypto_addresses.rst b/docs/api/crypto_addresses.rst index 60e733b8..09ebfe41 100644 --- a/docs/api/crypto_addresses.rst +++ b/docs/api/crypto_addresses.rst @@ -4,3 +4,4 @@ crypto_addresses .. module:: validators.crypto_addresses .. autofunction:: btc_address .. autofunction:: eth_address +.. autofunction:: trx_address diff --git a/src/validators/__init__.py b/src/validators/__init__.py index a554051e..a58a574c 100644 --- a/src/validators/__init__.py +++ b/src/validators/__init__.py @@ -5,7 +5,7 @@ from .card import amex, card_number, diners, discover, jcb, mastercard, unionpay, visa from .country import calling_code, country_code, currency from .cron import cron -from .crypto_addresses import btc_address, eth_address +from .crypto_addresses import btc_address, eth_address, trx_address from .domain import domain from .email import email from .encoding import base58, base64 @@ -39,6 +39,7 @@ # crypto_addresses "btc_address", "eth_address", + "trx_address", # cards "amex", "card_number", @@ -104,4 +105,4 @@ "validator", ) -__version__ = "0.29.0" +__version__ = "0.30.0" diff --git a/src/validators/crypto_addresses/__init__.py b/src/validators/crypto_addresses/__init__.py index 87c5e5c8..d6bd2d61 100644 --- a/src/validators/crypto_addresses/__init__.py +++ b/src/validators/crypto_addresses/__init__.py @@ -3,5 +3,6 @@ # local from .btc_address import btc_address from .eth_address import eth_address +from .trx_address import trx_address -__all__ = ("btc_address", "eth_address") +__all__ = ("btc_address", "eth_address", "trx_address") diff --git a/src/validators/crypto_addresses/trx_address.py b/src/validators/crypto_addresses/trx_address.py new file mode 100644 index 00000000..3b021fbc --- /dev/null +++ b/src/validators/crypto_addresses/trx_address.py @@ -0,0 +1,62 @@ +"""TRX Address.""" + +# standard +import hashlib +import re + +# local +from validators.utils import validator + + +def _base58_decode(addr: str) -> bytes: + """Decode a base58 encoded address.""" + alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" + num = 0 + for char in addr: + num = num * 58 + alphabet.index(char) + return num.to_bytes(25, byteorder="big") + + +def _validate_trx_checksum_address(addr: str) -> bool: + """Validate TRX type checksum address.""" + if len(addr) != 34: + return False + + try: + address = _base58_decode(addr) + except ValueError: + return False + + if len(address) != 25 or address[0] != 0x41: + return False + + check_sum = hashlib.sha256(hashlib.sha256(address[:-4]).digest()).digest()[:4] + return address[-4:] == check_sum + + +@validator +def trx_address(value: str, /): + """Return whether or not given value is a valid tron address. + + Full validation is implemented for TRC20 tron addresses. + + Examples: + >>> trx_address('TLjfbTbpZYDQ4EoA4N5CLNgGjfbF8ZWz38') + # Output: True + >>> trx_address('TR2G7Rm4vFqF8EpY4U5xdLdQ7XgJ2U8Vd') + # Output: ValidationError(func=trx_address, args=...) + + Args: + value: + Tron address string to validate. + + Returns: + (Literal[True]): If `value` is a valid tron address. + (ValidationError): If `value` is an invalid tron address. + """ + if not value: + return False + + return re.compile(r"^[T][a-km-zA-HJ-NP-Z1-9]{33}$").match( + value + ) and _validate_trx_checksum_address(value) diff --git a/tests/crypto_addresses/test_trx_address.py b/tests/crypto_addresses/test_trx_address.py new file mode 100644 index 00000000..68bb0d94 --- /dev/null +++ b/tests/crypto_addresses/test_trx_address.py @@ -0,0 +1,54 @@ +"""Test TRX address.""" + +# external +import pytest + +# local +from validators import ValidationError, trx_address + + +@pytest.mark.parametrize( + "value", + [ + "TLjfbTbpZYDQ4EoA4N5CLNgGjfbF8ZWz38", + "TDQ6C92wuNqvMWE967sMptCFaXq77uj1PF", + "TFuGbxCQGSL4oLnJzVsen844LDwFbrUY4e", + "TFAPKADDRhkSe3v27CsR8TZSjN8eJ8ycDK", + "TSJHywLNva2MNjCD5iYfn5QAKD9Rk5Ncit", + "TEi1qhi5LuTicg1u9oAstyXCSf5uibSyqo", + "TAGvx5An6VBeHTu91cQwdABNcAYMRPcP4n", + "TXbE5tXTejqT3Q47sYKCDb9NJDm3xrFpab", + "TMTxQWNuWHXvHcYXc5D1wQhFmZFJijAxcG", + "TPHgw9E8QYM3esNWih5KVnUVpUHwLTPfpA", + "TFFLtBTi9jdaGwV3hznjCmPYaJme5AeqwU", + "TC74QG8tbtixG5Raa4fEifywgjrFs45fNz", + ], +) +def test_returns_true_on_valid_trx_address(value: str): + """Test returns true on valid trx address.""" + assert trx_address(value) + + +@pytest.mark.parametrize( + "value", + [ + "T12345678901234567890123456789012345", + "ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678", + "TR2G7Rm4vFqF8EpY4U5xdLdQ7XgJ2U8Vd", + "TP6ah2v5mdsj8Z3hGz1yDMvDq7BzEbK8o", + "TQmmhp6uz2Xre8yL3FsPYZyo4mhtw4vg4XX", + "TQNy2C6VHJPk4P32bsEX3QSGx2Qqm4J2k9", + "TP6ah2v5mdsj8Z3hGz1yDMvDq7BzEbK8oN", + "TSTVdfU1x4L7K3Bc3v5C28Gp2J1rPyeL3f", + "THPByuCzvU5QER9j2NC2mUQ2JPyRCam4e7", + "TW5eZqUZgdW4rxFKAKsc2ryJbfFA94WXvD", + "TR2G7Rm4vFqF8EpY4U5xdLdQ7XgJ2U8Vdd", + "tQmmhp6uz2Xre8yL3FsPYZyo4mhtw4vg4X", + "TR2G7Rm4vFqF8EpY4U5xdLdQ7Xg", + "TQmmhp6uz2Xre8yL3FsPYZyo4mhtw4vg4x", + "my-trox-address.trx", + ], +) +def test_returns_failed_validation_on_invalid_trx_address(value: str): + """Test returns failed validation on invalid trx address.""" + assert isinstance(trx_address(value), ValidationError) From e5d7b4a06fbaf5f8f184ef0af4e6ebd05f541849 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Mon, 8 Jul 2024 15:30:08 +0330 Subject: [PATCH 05/47] feat: add validators for base16 and base32 encodings (#386) - add validators for `base16` and `base32` encodings - fix: typos in `CHANGES.md` --------- Co-authored-by: Yozachar <38415384+yozachar@users.noreply.github.com> --- CHANGES.md | 18 +++++++++++ SECURITY.md | 2 +- docs/api/encoding.md | 2 ++ docs/api/encoding.rst | 2 ++ src/validators/__init__.py | 6 ++-- src/validators/encoding.py | 42 ++++++++++++++++++++++++ tests/test_encoding.py | 66 +++++++++++++++++++++++++++++++++++++- 7 files changed, 134 insertions(+), 4 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index e0a3d97a..3e069692 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,6 +9,24 @@ Note to self: Breaking changes must increment either --> +## 0.31.0 (2024-07-08) + +_**Breaking**_ + +> No breaking changes were introduced in this version. + +_**Features**_ + +- feat: add validators for `base16` and `base32` encodings by @msamsami in [#386](https://github.com/python-validators/validators/pull/386) + +_**Maintenance**_ + +- maint: bump version by @msamsami in [#386](https://github.com/python-validators/validators/pull/386) + +**Full Changelog**: [`0.30.0...0.31.0`](https://github.com/python-validators/validators/compare/0.30.0...0.31.0) + +--- + ## 0.30.0 (2024-07-04) _**Breaking**_ diff --git a/SECURITY.md b/SECURITY.md index 2231e167..dbf9c090 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -4,7 +4,7 @@ | Version | Supported | | ---------- | ------------------ | -| `>=0.30.0` | :white_check_mark: | +| `>=0.31.0` | :white_check_mark: | ## Reporting a Vulnerability diff --git a/docs/api/encoding.md b/docs/api/encoding.md index 8f2794cb..39c24ec4 100644 --- a/docs/api/encoding.md +++ b/docs/api/encoding.md @@ -1,4 +1,6 @@ # encoding +::: validators.encoding.base16 +::: validators.encoding.base32 ::: validators.encoding.base58 ::: validators.encoding.base64 diff --git a/docs/api/encoding.rst b/docs/api/encoding.rst index 55d1799a..2554c933 100644 --- a/docs/api/encoding.rst +++ b/docs/api/encoding.rst @@ -2,5 +2,7 @@ encoding -------- .. module:: validators.encoding +.. autofunction:: base16 +.. autofunction:: base32 .. autofunction:: base58 .. autofunction:: base64 diff --git a/src/validators/__init__.py b/src/validators/__init__.py index a58a574c..cf11e3a7 100644 --- a/src/validators/__init__.py +++ b/src/validators/__init__.py @@ -8,7 +8,7 @@ from .crypto_addresses import btc_address, eth_address, trx_address from .domain import domain from .email import email -from .encoding import base58, base64 +from .encoding import base16, base32, base58, base64 from .finance import cusip, isin, sedol from .hashes import md5, sha1, sha224, sha256, sha512 from .hostname import hostname @@ -60,6 +60,8 @@ # ... "email", # encodings + "base16", + "base32", "base58", "base64", # finance @@ -105,4 +107,4 @@ "validator", ) -__version__ = "0.30.0" +__version__ = "0.31.0" diff --git a/src/validators/encoding.py b/src/validators/encoding.py index f2720748..71efc849 100644 --- a/src/validators/encoding.py +++ b/src/validators/encoding.py @@ -7,6 +7,48 @@ from .utils import validator +@validator +def base16(value: str, /): + """Return whether or not given value is a valid base16 encoding. + + Examples: + >>> base16('a3f4b2') + # Output: True + >>> base16('a3f4Z1') + # Output: ValidationError(func=base16, args={'value': 'a3f4Z1'}) + + Args: + value: + base16 string to validate. + + Returns: + (Literal[True]): If `value` is a valid base16 encoding. + (ValidationError): If `value` is an invalid base16 encoding. + """ + return re.match(r"^[0-9A-Fa-f]+$", value) if value else False + + +@validator +def base32(value: str, /): + """Return whether or not given value is a valid base32 encoding. + + Examples: + >>> base32('MFZWIZLTOQ======') + # Output: True + >>> base32('MfZW3zLT9Q======') + # Output: ValidationError(func=base32, args={'value': 'MfZW3zLT9Q======'}) + + Args: + value: + base32 string to validate. + + Returns: + (Literal[True]): If `value` is a valid base32 encoding. + (ValidationError): If `value` is an invalid base32 encoding. + """ + return re.match(r"^[A-Z2-7]+=*$", value) if value else False + + @validator def base58(value: str, /): """Return whether or not given value is a valid base58 encoding. diff --git a/tests/test_encoding.py b/tests/test_encoding.py index 86567ffb..db5bccf8 100644 --- a/tests/test_encoding.py +++ b/tests/test_encoding.py @@ -4,7 +4,71 @@ import pytest # local -from validators import ValidationError, base58, base64 +from validators import ValidationError, base16, base32, base58, base64 + +# ==> base16 <== # + + +@pytest.mark.parametrize( + "value", + [ + "a3f4b2", + "01ef", + "abcdef0123456789", + "1234567890abcdef", + "1a2b3c", + "abcdef", + "000102030405060708090A0B0C0D0E0F", + ], +) +def test_returns_true_on_valid_base16(value: str): + """Test returns true on valid base16.""" + assert base16(value) + + +@pytest.mark.parametrize( + "value", + ["12345g", "hello world", "1234567890abcdeg", "GHIJKL", "12345G", "!@#$%^", "1a2h3c", "a3f4Z1"], +) +def test_returns_failed_validation_on_invalid_base16(value: str): + """Test returns failed validation on invalid base16.""" + assert isinstance(base16(value), ValidationError) + + +# ==> base32 <== # + + +@pytest.mark.parametrize( + "value", + [ + "JBSWY3DPEHPK3PXP", + "MFRGGZDFMZTWQ2LK", + "MZXW6YTBOI======", + "MFZWIZLTOQ======", + "GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ", + "MFRGGZDFMZTWQ2LKNNWG23Q=", + ], +) +def test_returns_true_on_valid_base32(value: str): + """Test returns true on valid base32.""" + assert base32(value) + + +@pytest.mark.parametrize( + "value", + [ + "ThisIsNotBase32!", + "12345!", + "Any==invalid=base32=", + "MzXW6yTBOI======", + "JBSWY8DPEHPK9PXP", + "MfZW3zLT9Q======", + ], +) +def test_returns_failed_validation_on_invalid_base32(value: str): + """Test returns failed validation on invalid base32.""" + assert isinstance(base32(value), ValidationError) + # ==> base58 <== # From 9ba69a51d1624e89d45504e1a8f23dd05810bd0e Mon Sep 17 00:00:00 2001 From: Yozachar <38415384+yozachar@users.noreply.github.com> Date: Mon, 8 Jul 2024 17:43:57 +0530 Subject: [PATCH 06/47] chore: improve `CONTRIBUTING.md` --- CONTRIBUTING.md | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ba9b1d11..8999b156 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,14 +1,14 @@ -# How to contribute to `validators` +# Contributing to `validators` Hi, to start, you need the following installed on your system. 1. [Git](https://git-scm.com) 2. [Python](https://www.python.org) v3.8 or later 3. [PDM](https://pdm-project.org) for easy dependency management -4. (Optional/Recommended) NodeJS for type checking -5. (Optional/Recommended) [mise](https://github.com/jdx/mise) to manage multiple versions of Python & NodeJS. +4. (Optional/Recommended) [`NodeJS`](https://nodejs.org/en) for type checking +5. (Optional/Recommended) [`mise`](https://github.com/jdx/mise) to manage multiple versions of Python, NodeJS and other such tools. -First [fork this repository](https://github.com/python-validators/validators/fork). Uncheck "fork only `master`", because for versioned docs you'll need `gh-pages` too. Clone it to your system. Install development dependencies. +First [fork this repository](https://github.com/python-validators/validators/fork). (If you are or intend to be a collaborator, uncheck "fork only `master`", because for versioned docs you'll need `gh-pages` branch too.) Clone it to your system and install the development dependencies. ```sh # clone repository @@ -63,8 +63,10 @@ $ python -m http.server -d docs/_build/web > You must be familiar with [semantic versioning](https://semver.org) and [Python packaging](https://packaging.python.org). -1. Take a look at the [`CHANGES.md`](CHANGES.md). They are generated with [GitHub's releaser](https://github.com/python-validators/validators/releases/new), and then modified. -2. Update the changelog. Version number must be updated in both [`SECURITY.md`](SECURITY.md) and [`src/validators/__init__.py`](src/validators/__init__.py). +### Tagging + +1. Take a look at [`CHANGES.md`](CHANGES.md). They are generated with [GitHub's releaser](https://github.com/python-validators/validators/releases/new), and then modified to fit the shown style. +2. Update the [changelog](CHANGES.md). Version number must be updated in both [`SECURITY.md`](SECURITY.md) and [`src/validators/__init__.py`](src/validators/__init__.py). 3. The final merge commit on the upstream (i.e. this repo) is tagged. ```sh @@ -72,18 +74,24 @@ $ python -m http.server -d docs/_build/web $ git pull upstream master $ git push # tagging that final merge commit before release - $ GIT_COMMITTER_DATE=$(git log -n1 --pretty=%aD) git tag -a -m "vMAJOR.MINOR.PATCH" vMAJOR.MINOR.PATCH + $ GIT_COMMITTER_DATE=$(git log -n1 --pretty=%aD) git tag -a -m "vMAJOR.MINOR.PATCH" MAJOR.MINOR.PATCH # pushing tag to remote $ git push --tag $ git push upstream --tag ``` -4. To preview versioned docs, run `mike serve` (`mike` is already a dev dependency). -5. To update it, checkout to the tag you want to include in the versioned documentation `git checkout TAG_NAME`. -6. Then run `mike deploy -p -u VERSION stable` OR run `mike deploy -p -u dev master`, -7. Which will deploy docs in the CURRENT commit as the `latest` documentation, onto `gh-pages` branch. -8. Run `./package/roll.sh` (or `./package/roll.ps1`) to generate both `sdist` and `bdist`. -9. Install [`twine`](https://pypi.org/project/twine) using [`pipx`](https://pipx.pypa.io) to upload package to PyPI. +### Versioned documentation + +1. To preview versioned docs, run `mike serve` (`mike` is a dev dependency). +2. Then (look at ) + - to publish stable docs run `mike deploy -p -u VERSION stable` after checking out to a stable tag name like `0.28.3` (note: document `VERSION = 0.29 if tag_name == 0.29.1`). + - to publish bleeding-edge docs run `mike deploy -p -u dev master` after checking out to the `master` branch. +3. This will deploy docs to the `gh-pages` branch (see: ) + +### Packaging and releasing + +1. Run `./package/roll.sh` (or `./package/roll.ps1`) to generate both `sdist` and `bdist`. +2. Install [`twine`](https://pypi.org/project/twine) using [`pipx`](https://pipx.pypa.io) to upload package to PyPI. ```sh # publishing @@ -91,11 +99,13 @@ $ python -m http.server -d docs/_build/web $ twine upload dist/* ``` -10. Create a GitHub release with the contents from the [changelog](CHANGES.md). Upload the wheel from `dist/` along with the shasum file generated with: +3. Create a GitHub release with the contents from the [changelog](CHANGES.md). Upload the wheel from `dist/` along with the shasum file generated with: ```sh # generate sha256sum $ sha256sum dist/validators-VERSION-py3-none-any.whl > dist/validators-VERSION-py3-none-any.whl.sha256 ``` -Thanks for taking interest in this library! +--- + +Thank your for taking interest in this library! From bae643fc7e06a5ccf7837ebd582747eb441dd28e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 17:59:13 +0530 Subject: [PATCH 07/47] chore(deps): bump certifi from 2024.6.2 to 2024.7.4 in /package (#385) Bumps [certifi](https://github.com/certifi/python-certifi) from 2024.6.2 to 2024.7.4. - [Commits](https://github.com/certifi/python-certifi/compare/2024.06.02...2024.07.04) --- updated-dependencies: - dependency-name: certifi dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package/requirements.sphinx.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package/requirements.sphinx.txt b/package/requirements.sphinx.txt index 42b17cff..0237390b 100644 --- a/package/requirements.sphinx.txt +++ b/package/requirements.sphinx.txt @@ -10,9 +10,9 @@ babel==2.15.0 \ beautifulsoup4==4.12.3 \ --hash=sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051 \ --hash=sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed -certifi==2024.6.2 \ - --hash=sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516 \ - --hash=sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56 +certifi==2024.7.4 \ + --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ + --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 charset-normalizer==3.3.2 \ --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ --hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \ From cd01b4b4bc4954dc72ca35c6a8c41010ed9a8638 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Wed, 10 Jul 2024 14:48:00 +0330 Subject: [PATCH 08/47] add a new validator for sha384 hash (#387) --- CHANGES.md | 18 ++++++++++++++++++ SECURITY.md | 2 +- docs/api/hashes.md | 1 + docs/api/hashes.rst | 1 + src/validators/__init__.py | 5 +++-- src/validators/hashes.py | 24 ++++++++++++++++++++++++ tests/test_hashes.py | 34 ++++++++++++++++++++++++++++++++-- 7 files changed, 80 insertions(+), 5 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 3e069692..46517366 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,6 +9,24 @@ Note to self: Breaking changes must increment either --> +## 0.32.0 (2024-07-10) + +_**Breaking**_ + +> No breaking changes were introduced in this version. + +_**Features**_ + +- feat: add validator for `sha384` hash by @msamsami in [#387](https://github.com/python-validators/validators/pull/387) + +_**Maintenance**_ + +- maint: bump version by @msamsami in [#387](https://github.com/python-validators/validators/pull/387) + +**Full Changelog**: [`0.31.0...0.32.0`](https://github.com/python-validators/validators/compare/0.31.0...0.32.0) + +--- + ## 0.31.0 (2024-07-08) _**Breaking**_ diff --git a/SECURITY.md b/SECURITY.md index dbf9c090..d828d524 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -4,7 +4,7 @@ | Version | Supported | | ---------- | ------------------ | -| `>=0.31.0` | :white_check_mark: | +| `>=0.32.0` | :white_check_mark: | ## Reporting a Vulnerability diff --git a/docs/api/hashes.md b/docs/api/hashes.md index 82b11bf0..8daeb033 100644 --- a/docs/api/hashes.md +++ b/docs/api/hashes.md @@ -4,4 +4,5 @@ ::: validators.hashes.sha1 ::: validators.hashes.sha224 ::: validators.hashes.sha256 +::: validators.hashes.sha384 ::: validators.hashes.sha512 diff --git a/docs/api/hashes.rst b/docs/api/hashes.rst index bc77b7b2..e8c15e5b 100644 --- a/docs/api/hashes.rst +++ b/docs/api/hashes.rst @@ -6,4 +6,5 @@ hashes .. autofunction:: sha1 .. autofunction:: sha224 .. autofunction:: sha256 +.. autofunction:: sha384 .. autofunction:: sha512 diff --git a/src/validators/__init__.py b/src/validators/__init__.py index cf11e3a7..3dfe1634 100644 --- a/src/validators/__init__.py +++ b/src/validators/__init__.py @@ -10,7 +10,7 @@ from .email import email from .encoding import base16, base32, base58, base64 from .finance import cusip, isin, sedol -from .hashes import md5, sha1, sha224, sha256, sha512 +from .hashes import md5, sha1, sha224, sha256, sha384, sha512 from .hostname import hostname from .i18n import ( es_cif, @@ -73,6 +73,7 @@ "sha1", "sha224", "sha256", + "sha384", "sha512", # ... "hostname", @@ -107,4 +108,4 @@ "validator", ) -__version__ = "0.31.0" +__version__ = "0.32.0" diff --git a/src/validators/hashes.py b/src/validators/hashes.py index 6004d30a..e544f7fe 100644 --- a/src/validators/hashes.py +++ b/src/validators/hashes.py @@ -94,6 +94,30 @@ def sha256(value: str, /): return re.match(r"^[0-9a-f]{64}$", value, re.IGNORECASE) if value else False +@validator +def sha384(value: str, /): + """Return whether or not given value is a valid SHA384 hash. + + Examples: + >>> sha384( + ... 'cb00753f45a35e8bb5a03d699ac65007272c32ab0eded163' + ... '1a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7' + ... ) + # Output: True + >>> sha384('900zz11') + # Output: ValidationError(func=sha384, args={'value': '900zz11'}) + + Args: + value: + SHA384 string to validate. + + Returns: + (Literal[True]): If `value` is a valid SHA384 hash. + (ValidationError): If `value` is an invalid SHA384 hash. + """ + return re.match(r"^[0-9a-f]{96}$", value, re.IGNORECASE) if value else False + + @validator def sha512(value: str, /): """Return whether or not given value is a valid SHA512 hash. diff --git a/tests/test_hashes.py b/tests/test_hashes.py index 39af2c4d..64f0affc 100644 --- a/tests/test_hashes.py +++ b/tests/test_hashes.py @@ -4,7 +4,7 @@ import pytest # local -from validators import ValidationError, base58, base64, md5, sha1, sha224, sha256, sha512 +from validators import ValidationError, base58, base64, md5, sha1, sha224, sha256, sha384, sha512 # ==> base58 <== # @@ -158,7 +158,37 @@ def test_returns_failed_validation_on_invalid_sha256(value: str): assert isinstance(sha256(value), ValidationError) -# ==> sha256 <== # +# ==> sha384 <== # + + +@pytest.mark.parametrize( + "value", + [ + "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7", + "CB00753F45A35E8BB5A03D699AC65007272C32AB0EDED1631A8B605A43FF5BED8086072BA1E7CC2358BAECA134C825A7", + "bfd76c0ebbd006fee583410547c1887b0292be76d582d96c242d2a792723e3fd6fd061f9d5cfd13b8f961358e6adba4a", + "F21EF1F8DBF806106813C8504AF864D8D9BFDFA8D67FA9B7DFF1C5B61C2584394A05897C4F157CEEE0E8FBC29205BB8B", + ], +) +def test_returns_true_on_valid_sha384(value: str): + """Test returns true on valid sha384.""" + assert sha384(value) + + +@pytest.mark.parametrize( + "value", + [ + "zb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7", + "c753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7", + "cb00aaaa753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7", + ], +) +def test_returns_failed_validation_on_invalid_sha384(value: str): + """Test returns failed validation on invalid sha384.""" + assert isinstance(sha384(value), ValidationError) + + +# ==> sha512 <== # @pytest.mark.parametrize( From 548960557c376c44516e1a9582869c33f4a65673 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Mon, 15 Jul 2024 06:02:27 +0330 Subject: [PATCH 09/47] feat: add validator for bsc addresses (#389) - add a new validator for bsc addresses - minor fix in test cases - chore: updates CHANGES.md --------- Co-authored-by: Yozachar <38415384+yozachar@users.noreply.github.com> --- CHANGES.md | 18 +++++++ SECURITY.md | 2 +- docs/api/crypto_addresses.md | 1 + docs/api/crypto_addresses.rst | 1 + src/validators/__init__.py | 5 +- src/validators/crypto_addresses/__init__.py | 3 +- .../crypto_addresses/bsc_address.py | 36 +++++++++++++ tests/crypto_addresses/test_bsc_address.py | 52 +++++++++++++++++++ 8 files changed, 114 insertions(+), 4 deletions(-) create mode 100644 src/validators/crypto_addresses/bsc_address.py create mode 100644 tests/crypto_addresses/test_bsc_address.py diff --git a/CHANGES.md b/CHANGES.md index 46517366..b4ae6bba 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,6 +9,24 @@ Note to self: Breaking changes must increment either --> +## 0.33.0 (2024-07-15) + +_**Breaking**_ + +> No breaking changes were introduced in this version. + +_**Features**_ + +- feat: adds validator for `bsc` addresses by @msamsami in [#389](https://github.com/python-validators/validators/pull/389) + +_**Maintenance**_ + +- chore: bump version by @msamsami in [#389](https://github.com/python-validators/validators/pull/389) + +**Full Changelog**: [`0.32.0...0.33.0`](https://github.com/python-validators/validators/compare/0.32.0...0.33.0) + +--- + ## 0.32.0 (2024-07-10) _**Breaking**_ diff --git a/SECURITY.md b/SECURITY.md index d828d524..d666628a 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -4,7 +4,7 @@ | Version | Supported | | ---------- | ------------------ | -| `>=0.32.0` | :white_check_mark: | +| `>=0.33.0` | :white_check_mark: | ## Reporting a Vulnerability diff --git a/docs/api/crypto_addresses.md b/docs/api/crypto_addresses.md index 226ef0c5..1ac24a0c 100644 --- a/docs/api/crypto_addresses.md +++ b/docs/api/crypto_addresses.md @@ -1,5 +1,6 @@ # crypto_addresses +::: validators.crypto_addresses.bsc_address ::: validators.crypto_addresses.btc_address ::: validators.crypto_addresses.eth_address ::: validators.crypto_addresses.trx_address diff --git a/docs/api/crypto_addresses.rst b/docs/api/crypto_addresses.rst index 09ebfe41..85b474fb 100644 --- a/docs/api/crypto_addresses.rst +++ b/docs/api/crypto_addresses.rst @@ -2,6 +2,7 @@ crypto_addresses ---------------- .. module:: validators.crypto_addresses +.. autofunction:: bsc_address .. autofunction:: btc_address .. autofunction:: eth_address .. autofunction:: trx_address diff --git a/src/validators/__init__.py b/src/validators/__init__.py index 3dfe1634..d5e6de83 100644 --- a/src/validators/__init__.py +++ b/src/validators/__init__.py @@ -5,7 +5,7 @@ from .card import amex, card_number, diners, discover, jcb, mastercard, unionpay, visa from .country import calling_code, country_code, currency from .cron import cron -from .crypto_addresses import btc_address, eth_address, trx_address +from .crypto_addresses import bsc_address, btc_address, eth_address, trx_address from .domain import domain from .email import email from .encoding import base16, base32, base58, base64 @@ -37,6 +37,7 @@ # ... "between", # crypto_addresses + "bsc_address", "btc_address", "eth_address", "trx_address", @@ -108,4 +109,4 @@ "validator", ) -__version__ = "0.32.0" +__version__ = "0.33.0" diff --git a/src/validators/crypto_addresses/__init__.py b/src/validators/crypto_addresses/__init__.py index d6bd2d61..9ad7c2c4 100644 --- a/src/validators/crypto_addresses/__init__.py +++ b/src/validators/crypto_addresses/__init__.py @@ -1,8 +1,9 @@ """Crypto addresses.""" # local +from .bsc_address import bsc_address from .btc_address import btc_address from .eth_address import eth_address from .trx_address import trx_address -__all__ = ("btc_address", "eth_address", "trx_address") +__all__ = ("bsc_address", "btc_address", "eth_address", "trx_address") diff --git a/src/validators/crypto_addresses/bsc_address.py b/src/validators/crypto_addresses/bsc_address.py new file mode 100644 index 00000000..c3a24250 --- /dev/null +++ b/src/validators/crypto_addresses/bsc_address.py @@ -0,0 +1,36 @@ +"""BSC Address.""" + +# standard +import re + +# local +from validators.utils import validator + + +@validator +def bsc_address(value: str, /): + """Return whether or not given value is a valid binance smart chain address. + + Full validation is implemented for BSC addresses. + + Examples: + >>> bsc_address('0x4e5acf9684652BEa56F2f01b7101a225Ee33d23f') + # Output: True + >>> bsc_address('0x4g5acf9684652BEa56F2f01b7101a225Eh33d23z') + # Output: ValidationError(func=bsc_address, args=...) + + Args: + value: + BSC address string to validate. + + Returns: + (Literal[True]): If `value` is a valid bsc address. + (ValidationError): If `value` is an invalid bsc address. + """ + if not value: + return False + + if not re.fullmatch(r"0x[a-fA-F0-9]{40}", value): + return False + + return True diff --git a/tests/crypto_addresses/test_bsc_address.py b/tests/crypto_addresses/test_bsc_address.py new file mode 100644 index 00000000..8e61dbc4 --- /dev/null +++ b/tests/crypto_addresses/test_bsc_address.py @@ -0,0 +1,52 @@ +"""Test BSC address.""" + +# external +import pytest + +# local +from validators import ValidationError, bsc_address + + +@pytest.mark.parametrize( + "value", + [ + "0x4e5acf9684652BEa56F2f01b7101a225Ee33d23f", + "0x22B0f92af10FdC25659e4C3A590c2F0D0c809c27", + "0xb61724F993E7942ef2d8e4A94fF7c9e1cc26995F", + "0x9c3dF8a511Fec8076D4B8EFb4d5E733B9F953dD7", + "0x4536337B91c0623a4FD098023E6065e4773117c5", + "0xAC484e1CE274eD1d40A7C2AeAb0bEA863634286F", + "0x1FDE521fBe3483Cbb5957E6275028225a74387e4", + "0x1693c3D1bA787Ba2bf81ac8897614AAaee5cb800", + "0xf4C3Fd476A40658aEd9e595DA49c37d8965D2fFE", + "0xc053E3D4932640787D6Cf67FcA36021E7BE62653", + "0xaFd563A5aED0bC363e802842aD93Af46c1168b8a", + ], +) +def test_returns_true_on_valid_bsc_address(value: str): + """Test returns true on valid bsc address.""" + assert bsc_address(value) + + +@pytest.mark.parametrize( + "value", + [ + "1x32Be343B94f860124dC4fEe278FDCBD38C102D88", + "0x32Be343B94f860124dC4fEe278FDCBD38C102D", + "0x32Be343B94f860124dC4fEe278FDCBD38C102D88aabbcc", + "0x4g5acf9684652BEa56F2f01b7101a225Eh33d23z", + "0x", + "Wrong@Address.com", + "0x32Be343B94f860124dC4fEe278FDCBD38C102D__", + "0x32Be343B94f860124dC4fEe278FDCBD38C102D88G", + "0X32Be343B94f860124dC4fEe278FDCBD38C102D88", + "0X32BE343B94F860124DCFEE278FDCBD38C102D88", + "0x32Be 343B94f860124dC4fEe278FDCBD38C102D88", + "0x32Be343B94f860124dC4fEe278FDCBD38C102D88!", + "ox32Be343B94f860124dC4fEe278FDCBD38C102D88", + "0x32Be343B94f860124dC4fEe278FDCBD38C102D88XYZ", + ], +) +def test_returns_failed_validation_on_invalid_bsc_address(value: str): + """Test returns failed validation on invalid bsc address.""" + assert isinstance(bsc_address(value), ValidationError) From 2dc2a9e5412c92fd7f306d0b45171beb9e87a1e7 Mon Sep 17 00:00:00 2001 From: Ori Avtalion Date: Fri, 19 Jul 2024 11:52:49 +0300 Subject: [PATCH 10/47] feat: cache IANA TLDs for faster lookups (#390) - Cache TLDs if environment variable `PYVLD_CACHE_TLD` is `True` --- src/validators/domain.py | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/src/validators/domain.py b/src/validators/domain.py index ecca605a..23ae263d 100644 --- a/src/validators/domain.py +++ b/src/validators/domain.py @@ -1,20 +1,39 @@ """Domain.""" # standard +from os import environ from pathlib import Path import re +from typing import Optional, Set # local from .utils import validator -def _iana_tld(): - """Load IANA TLDs as a Generator.""" - # source: https://data.iana.org/TLD/tlds-alpha-by-domain.txt - with Path(__file__).parent.joinpath("_tld.txt").open() as tld_f: - _ = next(tld_f) # ignore the first line - for line in tld_f: - yield line.strip() +class _IanaTLD: + """Read IANA TLDs, and optionally cache them.""" + + _full_cache: Optional[Set[str]] = None + # source: https://www.statista.com/statistics/265677 + _popular_cache = {"COM", "ORG", "RU", "DE", "NET", "BR", "UK", "JP", "FR", "IT"} + + @classmethod + def _retrieve(cls): + with Path(__file__).parent.joinpath("_tld.txt").open() as tld_f: + _ = next(tld_f) # ignore the first line + for line in tld_f: + yield line.strip() + + @classmethod + def check(cls, tld: str): + if tld in cls._popular_cache: + return True + if cls._full_cache is None: + if environ.get("PYVLD_CACHE_TLD") == "True": + cls._full_cache = set(cls._retrieve()) + else: + return tld in cls._retrieve() + return tld in cls._full_cache @validator @@ -56,7 +75,7 @@ def domain( if not value: return False - if consider_tld and value.rstrip(".").rsplit(".", 1)[-1].upper() not in _iana_tld(): + if consider_tld and not _IanaTLD.check(value.rstrip(".").rsplit(".", 1)[-1].upper()): return False try: From ca1b41fcc1e32f16e845b53cb29ac8f9b261969b Mon Sep 17 00:00:00 2001 From: Yozachar <38415384+yozachar@users.noreply.github.com> Date: Tue, 3 Sep 2024 22:22:12 +0530 Subject: [PATCH 11/47] chore: update (dev) dependencies; bump version --- CHANGES.md | 415 +++++++++++++++++++------------------ pdm.lock | 194 ++++++++--------- pyproject.toml | 24 +-- src/validators/__init__.py | 2 +- 4 files changed, 330 insertions(+), 305 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index b4ae6bba..fb560a27 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,11 +4,28 @@ Note to self: Breaking changes must increment either -- minor version: as long as versions are in 0.y.z or -- major version: when versions are in in x.y.z (x>0) +* minor version: as long as versions are in 0.y.z or +* major version: when versions are in in x.y.z (x>0) --> +## 0.34.0 (2024-09-03) + +_**Breaking**_ + +> No breaking changes were introduced in this version. + +_**Features**_ + +* feat: cache IANA TLDs for faster lookups by @salty-horse in [#390](https://github.com/python-validators/validators/pull/390) + +_**Maintenance**_ + +* chore: update dependencies by @yozachar in [#394](https://github.com/python-validators/validators/pull/394) +* docs: adds configuration info by @yozachar in [#395](https://github.com/python-validators/validators/pull/395) + +**Full Changelog**: [`0.33.0...0.34.0`](https://github.com/python-validators/validators/compare/0.33.0...0.34.0) + ## 0.33.0 (2024-07-15) _**Breaking**_ @@ -17,11 +34,11 @@ _**Breaking**_ _**Features**_ -- feat: adds validator for `bsc` addresses by @msamsami in [#389](https://github.com/python-validators/validators/pull/389) +* feat: adds validator for `bsc` addresses by @msamsami in [#389](https://github.com/python-validators/validators/pull/389) _**Maintenance**_ -- chore: bump version by @msamsami in [#389](https://github.com/python-validators/validators/pull/389) +* chore: bump version by @msamsami in [#389](https://github.com/python-validators/validators/pull/389) **Full Changelog**: [`0.32.0...0.33.0`](https://github.com/python-validators/validators/compare/0.32.0...0.33.0) @@ -35,11 +52,11 @@ _**Breaking**_ _**Features**_ -- feat: add validator for `sha384` hash by @msamsami in [#387](https://github.com/python-validators/validators/pull/387) +* feat: add validator for `sha384` hash by @msamsami in [#387](https://github.com/python-validators/validators/pull/387) _**Maintenance**_ -- maint: bump version by @msamsami in [#387](https://github.com/python-validators/validators/pull/387) +* maint: bump version by @msamsami in [#387](https://github.com/python-validators/validators/pull/387) **Full Changelog**: [`0.31.0...0.32.0`](https://github.com/python-validators/validators/compare/0.31.0...0.32.0) @@ -53,11 +70,11 @@ _**Breaking**_ _**Features**_ -- feat: add validators for `base16` and `base32` encodings by @msamsami in [#386](https://github.com/python-validators/validators/pull/386) +* feat: add validators for `base16` and `base32` encodings by @msamsami in [#386](https://github.com/python-validators/validators/pull/386) _**Maintenance**_ -- maint: bump version by @msamsami in [#386](https://github.com/python-validators/validators/pull/386) +* maint: bump version by @msamsami in [#386](https://github.com/python-validators/validators/pull/386) **Full Changelog**: [`0.30.0...0.31.0`](https://github.com/python-validators/validators/compare/0.30.0...0.31.0) @@ -71,11 +88,11 @@ _**Breaking**_ _**Features**_ -- feat: add validator for trx addresses by @msamsami in [#384](https://github.com/python-validators/validators/pull/384) +* feat: add validator for trx addresses by @msamsami in [#384](https://github.com/python-validators/validators/pull/384) _**Maintenance**_ -- maint: bump version by @msamsami in [#384](https://github.com/python-validators/validators/pull/384) +* maint: bump version by @msamsami in [#384](https://github.com/python-validators/validators/pull/384) **Full Changelog**: [`0.29.0...0.30.0`](https://github.com/python-validators/validators/compare/0.29.0...0.30.0) @@ -85,15 +102,15 @@ _**Maintenance**_ _**Breaking**_ ⚠️ -- patch: moves `btc_address` to `crypto_addresses` by @msamsami in [#383](https://github.com/python-validators/validators/pull/383) on [`2f300b`](https://github.com/python-validators/validators/pull/383/commits/2f300bccf31e7d8914817cac2ca466fd2a0a4d08) +* patch: moves `btc_address` to `crypto_addresses` by @msamsami in [#383](https://github.com/python-validators/validators/pull/383) on [`2f300b`](https://github.com/python-validators/validators/pull/383/commits/2f300bccf31e7d8914817cac2ca466fd2a0a4d08) _**Features**_ -- feat: add validator for eth addresses by @msamsami in [#383](https://github.com/python-validators/validators/pull/383) +* feat: add validator for eth addresses by @msamsami in [#383](https://github.com/python-validators/validators/pull/383) _**Maintenance**_ -- chore: update dev deps; adds python EOL info by @yozachar in [#381](https://github.com/python-validators/validators/pull/381) +* chore: update dev deps; adds python EOL info by @yozachar in [#381](https://github.com/python-validators/validators/pull/381) **Full Changelog**: [`0.28.3...0.29.0`](https://github.com/python-validators/validators/compare/0.28.3...0.29.0) @@ -111,7 +128,7 @@ _**Features**_ _**Maintenance**_ -- hotfix: ensure `_tld.txt` is in `sdist` and `bdist` by @yozachar in [#379](https://github.com/python-validators/validators/pull/379) +* hotfix: ensure `_tld.txt` is in `sdist` and `bdist` by @yozachar in [#379](https://github.com/python-validators/validators/pull/379) **Full Changelog**: [`0.28.2...0.28.3`](https://github.com/python-validators/validators/compare/0.28.2...0.28.3) @@ -127,12 +144,12 @@ _**Features**_ _**Maintenance**_ -- fix: corrects a few typo by @yozachar in [#371](https://github.com/python-validators/validators/pull/371) -- build(deps): bump jinja2 from 3.1.3 to 3.1.4 in /package by @dependabot in [#372](https://github.com/python-validators/validators/pull/372) -- fix(ip_address): properly handle private is false by @grleblanc in [#374](https://github.com/python-validators/validators/pull/374) -- chore(url): allow symbols and pictographs in url by @prousso in [#375](https://github.com/python-validators/validators/pull/375) -- build(deps): bump requests from 2.31.0 to 2.32.0 in /package by @dependabot in [#376](https://github.com/python-validators/validators/pull/376) -- chore: fix typo; update dev deps; bump version by @yozachar in [#377](https://github.com/python-validators/validators/pull/377) +* fix: corrects a few typo by @yozachar in [#371](https://github.com/python-validators/validators/pull/371) +* build(deps): bump jinja2 from 3.1.3 to 3.1.4 in /package by @dependabot in [#372](https://github.com/python-validators/validators/pull/372) +* fix(ip_address): properly handle private is false by @grleblanc in [#374](https://github.com/python-validators/validators/pull/374) +* chore(url): allow symbols and pictographs in url by @prousso in [#375](https://github.com/python-validators/validators/pull/375) +* build(deps): bump requests from 2.31.0 to 2.32.0 in /package by @dependabot in [#376](https://github.com/python-validators/validators/pull/376) +* chore: fix typo; update dev deps; bump version by @yozachar in [#377](https://github.com/python-validators/validators/pull/377) **Full Changelog**: [`0.28.1...0.28.2`](https://github.com/python-validators/validators/compare/0.28.1...0.28.2) @@ -148,12 +165,12 @@ _**Features**_ _**Maintenance**_ -- fix: reduce memory footprint when loading TLDs by @yozachar in [#362](https://github.com/python-validators/validators/pull/362) -- build(deps): bump idna from 3.6 to 3.7 in /package by @dependabot in [#365](https://github.com/python-validators/validators/pull/365) -- fix: rfc cases in the `domain` validator by @yozachar in [#367](https://github.com/python-validators/validators/pull/367) -- chore: documentation maintenance by @yozachar in [#368](https://github.com/python-validators/validators/pull/368) -- chore: update contribution guidelines by @yozachar in [#369](https://github.com/python-validators/validators/pull/369) -- chore: updated dev dependencies; bump version by @yozachar in [#370](https://github.com/python-validators/validators/pull/370) +* fix: reduce memory footprint when loading TLDs by @yozachar in [#362](https://github.com/python-validators/validators/pull/362) +* build(deps): bump idna from 3.6 to 3.7 in /package by @dependabot in [#365](https://github.com/python-validators/validators/pull/365) +* fix: rfc cases in the `domain` validator by @yozachar in [#367](https://github.com/python-validators/validators/pull/367) +* chore: documentation maintenance by @yozachar in [#368](https://github.com/python-validators/validators/pull/368) +* chore: update contribution guidelines by @yozachar in [#369](https://github.com/python-validators/validators/pull/369) +* chore: updated dev dependencies; bump version by @yozachar in [#370](https://github.com/python-validators/validators/pull/370) **Full Changelog**: [`0.28.0...0.28.1`](https://github.com/python-validators/validators/compare/0.28.0...0.28.1) @@ -161,17 +178,17 @@ _**Maintenance**_ _**Breaking**_ ⚠️ -- patch: moves `country_code` module to `country` module by @yozachar in [#357](https://github.com/python-validators/validators/pull/357) +* patch: moves `country_code` module to `country` module by @yozachar in [#357](https://github.com/python-validators/validators/pull/357) _**Features**_ -- feat: adds indian aadhar and pan validator by @yozachar in [#358](https://github.com/python-validators/validators/pull/358) -- feat: adds `finance` validator by @yozachar in [#359](https://github.com/python-validators/validators/pull/359) -- feat: adds `consider_tld` parameter to `domain`, `hostname` and `url` modules by @yozachar in [#360](https://github.com/python-validators/validators/pull/360) +* feat: adds indian aadhar and pan validator by @yozachar in [#358](https://github.com/python-validators/validators/pull/358) +* feat: adds `finance` validator by @yozachar in [#359](https://github.com/python-validators/validators/pull/359) +* feat: adds `consider_tld` parameter to `domain`, `hostname` and `url` modules by @yozachar in [#360](https://github.com/python-validators/validators/pull/360) _**Maintenance**_ -- maint: updated dev dependencies, doc links; bump version by @yozachar in [#361](https://github.com/python-validators/validators/pull/361) +* maint: updated dev dependencies, doc links; bump version by @yozachar in [#361](https://github.com/python-validators/validators/pull/361) **Full Changelog**: [`0.27.0...0.28.0`](https://github.com/python-validators/validators/compare/0.27.0...0.28.0) @@ -181,16 +198,16 @@ _**Maintenance**_ _**Breaking**_ ⚠️ -- patch: moves `base58` and `base64` into `encoding` by @yozachar in [#354](https://github.com/python-validators/validators/pull/354) +* patch: moves `base58` and `base64` into `encoding` by @yozachar in [#354](https://github.com/python-validators/validators/pull/354) _**Features**_ -- feat: lays foundation for URI validation by @yozachar in [#353](https://github.com/python-validators/validators/pull/353) -- feat: adds `private` parameter to `ip_address`, `hostname` & `url` by @yozachar in [#356](https://github.com/python-validators/validators/pull/356) +* feat: lays foundation for URI validation by @yozachar in [#353](https://github.com/python-validators/validators/pull/353) +* feat: adds `private` parameter to `ip_address`, `hostname` & `url` by @yozachar in [#356](https://github.com/python-validators/validators/pull/356) _**Maintenance**_ -- patch: adds `encoding` tests and docs by @yozachar in [#355](https://github.com/python-validators/validators/pull/355) +* patch: adds `encoding` tests and docs by @yozachar in [#355](https://github.com/python-validators/validators/pull/355) **Full Changelog**: [`0.26.0...0.27.0`](https://github.com/python-validators/validators/compare/0.26.0...0.27.0) @@ -204,12 +221,12 @@ _**Breaking**_ _**Features**_ -- feat: adds `base58` and `base64` validators by @yozachar in [#351](https://github.com/python-validators/validators/pull/351) +* feat: adds `base58` and `base64` validators by @yozachar in [#351](https://github.com/python-validators/validators/pull/351) _**Maintenance**_ -- fix: regex ignore-case uses only `a-z` by @yozachar in [#349](https://github.com/python-validators/validators/pull/349) -- patch: supported extended latin in username by @yozachar in [#350](https://github.com/python-validators/validators/pull/350) +* fix: regex ignore-case uses only `a-z` by @yozachar in [#349](https://github.com/python-validators/validators/pull/349) +* patch: supported extended latin in username by @yozachar in [#350](https://github.com/python-validators/validators/pull/350) **Full Changelog**: [`0.25.0...0.26.0`](https://github.com/python-validators/validators/compare/0.25.0...0.26.0) @@ -223,12 +240,12 @@ _**Breaking**_ _**Features**_ -- feat: adds basic `cron` validator by @yozachar in [#348](https://github.com/python-validators/validators/pull/348) +* feat: adds basic `cron` validator by @yozachar in [#348](https://github.com/python-validators/validators/pull/348) _**Maintenance**_ -- maint: adds quick start docs by @yozachar in [#344](https://github.com/python-validators/validators/pull/344) -- fix: `domain` validation is now more consistent across rfcs by @yozachar in [#347](https://github.com/python-validators/validators/pull/347) +* maint: adds quick start docs by @yozachar in [#344](https://github.com/python-validators/validators/pull/344) +* fix: `domain` validation is now more consistent across rfcs by @yozachar in [#347](https://github.com/python-validators/validators/pull/347) **Full Changelog**: [`0.24.2...0.25.0`](https://github.com/python-validators/validators/compare/0.24.2...0.25.0) @@ -242,13 +259,13 @@ _**Breaking**_ _**Features**_ -- feat: conditionally raises `ValidationError`; bump version by @yozachar in [#343](https://github.com/python-validators/validators/pull/343) +* feat: conditionally raises `ValidationError`; bump version by @yozachar in [#343](https://github.com/python-validators/validators/pull/343) _**Maintenance**_ -- patch: `domain` & `url` modules by @yozachar in [#339](https://github.com/python-validators/validators/pull/339) -- fix: domain name not confirming to rfc_2782 by @yozachar in [#341](https://github.com/python-validators/validators/pull/341) -- maint: update dev dependencies; adds favicon to docs by @yozachar in [#342](https://github.com/python-validators/validators/pull/342) +* patch: `domain` & `url` modules by @yozachar in [#339](https://github.com/python-validators/validators/pull/339) +* fix: domain name not confirming to rfc_2782 by @yozachar in [#341](https://github.com/python-validators/validators/pull/341) +* maint: update dev dependencies; adds favicon to docs by @yozachar in [#342](https://github.com/python-validators/validators/pull/342) **Full Changelog**: [`0.23.2...0.24.0`](https://github.com/python-validators/validators/compare/0.23.2...0.24.0) @@ -266,8 +283,8 @@ _**Features**_ _**Maintenance**_ -- maint: rectifies changelog by @yozachar in [#336](ttps://github.com/python-validators/validators/pull/336) -- fix: packaging as well as `rST` & `md` document generation by @yozachar in [#337](ttps://github.com/python-validators/validators/pull/337) +* maint: rectifies changelog by @yozachar in [#336](ttps://github.com/python-validators/validators/pull/336) +* fix: packaging as well as `rST` & `md` document generation by @yozachar in [#337](ttps://github.com/python-validators/validators/pull/337) **Full Changelog**: [`0.23.1...0.23.2`](https://github.com/python-validators/validators/compare/0.23.1...0.23.2) @@ -283,8 +300,8 @@ _**Features**_ _**Maintenance**_ -- maint: fix `between` & `length` validators by @yozachar in [#334](https://github.com/python-validators/validators/pull/334) -- fix: manual nav reference for mkdocs; bumps version by @yozachar in [#335](https://github.com/python-validators/validators/pull/335) +* maint: fix `between` & `length` validators by @yozachar in [#334](https://github.com/python-validators/validators/pull/334) +* fix: manual nav reference for mkdocs; bumps version by @yozachar in [#335](https://github.com/python-validators/validators/pull/335) **Full Changelog**: [`0.23.0...0.23.1`](https://github.com/python-validators/validators/compare/0.23.0...0.23.1) @@ -296,25 +313,25 @@ _**Breaking**_ _**Features**_ -- feat: add french i18n validation by @imperosol in [#308](https://github.com/python-validators/validators/pull/308) +* feat: add french i18n validation by @imperosol in [#308](https://github.com/python-validators/validators/pull/308) _**Maintenance**_ -- fix: Valid URLs failing validation - query and fragment parts by @danherbriley in [#297](https://github.com/python-validators/validators/pull/297) -- fix: bug in `between` module by @yozachar in [#301](https://github.com/python-validators/validators/pull/301) -- chore: update dependencies, improve packaging by @yozachar in [#304](https://github.com/python-validators/validators/pull/304) -- Fix fragment check by @darkdragon-001 in [#305](https://github.com/python-validators/validators/pull/305) -- build(deps): bump urllib3 from 2.0.6 to 2.0.7 in /package by @dependabot in [#310](https://github.com/python-validators/validators/pull/310) -- fix: allow pct-encoded entities in fragments by @conitrade-as in [#317](https://github.com/python-validators/validators/pull/317) -- chore: update dev dependencies by @yozachar in [#318](https://github.com/python-validators/validators/pull/318) -- build(deps): bump gitpython from 3.1.37 to 3.1.41 in /package by @dependabot in [#321](https://github.com/python-validators/validators/pull/321) -- build(deps): bump jinja2 from 3.1.2 to 3.1.3 in /package by @dependabot in [#322](https://github.com/python-validators/validators/pull/322) -- chore: monthly updates for Jan'24 by @yozachar in [#324](https://github.com/python-validators/validators/pull/324) -- maint: adds versiond docs; update copyright year by @yozachar in [#329](https://github.com/python-validators/validators/pull/329) -- chore: update dev dependencies by @yozachar in [#330](https://github.com/python-validators/validators/pull/330) -- build(deps): bump gitpython from 3.1.37 to 3.1.41 in /package by @dependabot in [#331](https://github.com/python-validators/validators/pull/331) -- build(deps): bump jinja2 from 3.1.2 to 3.1.3 in /package by @dependabot in [#332](https://github.com/python-validators/validators/pull/332) -- build(deps): bump urllib3 from 2.0.6 to 2.0.7 in /package by @dependabot in [#319](https://github.com/python-validators/validators/pull/319) +* fix: Valid URLs failing validation * query and fragment parts by @danherbriley in [#297](https://github.com/python-validators/validators/pull/297) +* fix: bug in `between` module by @yozachar in [#301](https://github.com/python-validators/validators/pull/301) +* chore: update dependencies, improve packaging by @yozachar in [#304](https://github.com/python-validators/validators/pull/304) +* Fix fragment check by @darkdragon-001 in [#305](https://github.com/python-validators/validators/pull/305) +* build(deps): bump urllib3 from 2.0.6 to 2.0.7 in /package by @dependabot in [#310](https://github.com/python-validators/validators/pull/310) +* fix: allow pct-encoded entities in fragments by @conitrade-as in [#317](https://github.com/python-validators/validators/pull/317) +* chore: update dev dependencies by @yozachar in [#318](https://github.com/python-validators/validators/pull/318) +* build(deps): bump gitpython from 3.1.37 to 3.1.41 in /package by @dependabot in [#321](https://github.com/python-validators/validators/pull/321) +* build(deps): bump jinja2 from 3.1.2 to 3.1.3 in /package by @dependabot in [#322](https://github.com/python-validators/validators/pull/322) +* chore: monthly updates for Jan'24 by @yozachar in [#324](https://github.com/python-validators/validators/pull/324) +* maint: adds versiond docs; update copyright year by @yozachar in [#329](https://github.com/python-validators/validators/pull/329) +* chore: update dev dependencies by @yozachar in [#330](https://github.com/python-validators/validators/pull/330) +* build(deps): bump gitpython from 3.1.37 to 3.1.41 in /package by @dependabot in [#331](https://github.com/python-validators/validators/pull/331) +* build(deps): bump jinja2 from 3.1.2 to 3.1.3 in /package by @dependabot in [#332](https://github.com/python-validators/validators/pull/332) +* build(deps): bump urllib3 from 2.0.6 to 2.0.7 in /package by @dependabot in [#319](https://github.com/python-validators/validators/pull/319) **Full Changelog**: [`0.22.0...0.23.0`](https://github.com/python-validators/validators/compare/0.22.0...0.23.0) @@ -324,7 +341,7 @@ _**Maintenance**_ _**Breaking**_ ⚠️ -- A new keyword parameter `host_bit = True`, is added to `validators.ipv4` and `validators.ipv6`. +* A new keyword parameter `host_bit = True`, is added to `validators.ipv4` and `validators.ipv6`. _**Features**_ @@ -332,10 +349,10 @@ _**Features**_ _**Maintenance**_ -- fix: url validator considers urls with /#/ as valid by @adrienthiery in [#289](https://github.com/python-validators/validators/pull/289) -- Add note about ValidationFailure to ValidationError in changes.md by @tswfi in [#291](https://github.com/python-validators/validators/pull/291) -- fix: simple hostname validation regex by @yozachar in [#294](https://github.com/python-validators/validators/pull/294) -- fix: strict CIDR IP validation; bump version by @yozachar in [#295](https://github.com/python-validators/validators/pull/295) +* fix: url validator considers urls with /#/ as valid by @adrienthiery in [#289](https://github.com/python-validators/validators/pull/289) +* Add note about ValidationFailure to ValidationError in changes.md by @tswfi in [#291](https://github.com/python-validators/validators/pull/291) +* fix: simple hostname validation regex by @yozachar in [#294](https://github.com/python-validators/validators/pull/294) +* fix: strict CIDR IP validation; bump version by @yozachar in [#295](https://github.com/python-validators/validators/pull/295) **Full Changelog**: [`0.21.2...0.22.0`](https://github.com/python-validators/validators/compare/0.21.2...0.22.0) @@ -345,19 +362,19 @@ _**Maintenance**_ _**Breaking**_ ⚠️ -- `ValidationFailure` is renamed to `ValidationError` in [`yozachar@12ae1f5`](https://github.com/yozachar/pyvalidators/commit/12ae1f5850555d11e1f1a2c03f597fd10610215a) +* `ValidationFailure` is renamed to `ValidationError` in [`yozachar@12ae1f5`](https://github.com/yozachar/pyvalidators/commit/12ae1f5850555d11e1f1a2c03f597fd10610215a) _**Features**_ -- Added Country Code Validation by @aviiciii in [#280](https://github.com/python-validators/validators/pull/280) -- add validator ETH addresses (ERC20) by @msamsami in [#276](https://github.com/python-validators/validators/pull/276) +* Added Country Code Validation by @aviiciii in [#280](https://github.com/python-validators/validators/pull/280) +* add validator ETH addresses (ERC20) by @msamsami in [#276](https://github.com/python-validators/validators/pull/276) _**Maintenance**_ -- feat: refactoring; updates; fixes; bump version by @yozachar in [#283](https://github.com/python-validators/validators/pull/283)(ref: ) -- build(deps): bump pymdown-extensions from 9.11 to 10.0 by @dependabot in [#273](https://github.com/python-validators/validators/pull/273) -- build(deps): bump requests from 2.28.2 to 2.31.0 by @dependabot in [#275](https://github.com/python-validators/validators/pull/275) -- build(deps-dev): bump certifi from 2022.12.7 to 2023.7.22 by @dependabot in [#281](https://github.com/python-validators/validators/pull/281) +* feat: refactoring; updates; fixes; bump version by @yozachar in [#283](https://github.com/python-validators/validators/pull/283)(ref: ) +* build(deps): bump pymdown-extensions from 9.11 to 10.0 by @dependabot in [#273](https://github.com/python-validators/validators/pull/273) +* build(deps): bump requests from 2.28.2 to 2.31.0 by @dependabot in [#275](https://github.com/python-validators/validators/pull/275) +* build(deps-dev): bump certifi from 2022.12.7 to 2023.7.22 by @dependabot in [#281](https://github.com/python-validators/validators/pull/281) **Full Changelog**: [`0.21.1...0.21.2`](https://github.com/python-validators/validators/compare/0.21.1...0.21.2) @@ -373,11 +390,11 @@ _**Features**_ _**Maintenance**_ -- fix: `source .venv/bin/activate` before build by @yozachar in [#260](https://github.com/python-validators/validators/pull/260) -- fix: id-token write permission at job level by @yozachar in [#261](https://github.com/python-validators/validators/pull/261) -- feat: docs can be built with both sphinx & mkdocs by @yozachar in [#262](https://github.com/python-validators/validators/pull/262) -- fix: improves build process by @yozachar in [#263](https://github.com/python-validators/validators/pull/263) -- fix: removes 64-char limit for url path & query by @yozachar in [#264](https://github.com/python-validators/validators/pull/264) +* fix: `source .venv/bin/activate` before build by @yozachar in [#260](https://github.com/python-validators/validators/pull/260) +* fix: id-token write permission at job level by @yozachar in [#261](https://github.com/python-validators/validators/pull/261) +* feat: docs can be built with both sphinx & mkdocs by @yozachar in [#262](https://github.com/python-validators/validators/pull/262) +* fix: improves build process by @yozachar in [#263](https://github.com/python-validators/validators/pull/263) +* fix: removes 64-char limit for url path & query by @yozachar in [#264](https://github.com/python-validators/validators/pull/264) **Full Changelog**: [`0.21.0...0.21.1`](https://github.com/python-validators/validators/compare/0.21.0...0.21.1) @@ -385,70 +402,70 @@ _**Maintenance**_ _**Breaking**_ ⚠️ -- Drops support for all Python versions below `v3.8`. -- Makes API's primary parameter, `positional`, and the remaining, `keyword-only`. -- Keyword-only parameters like `max` and `min`, has been renamed to `max_val` and `min_val` respectively. -- `domain` API now accepts two new keyword-only arguments: `rfc_1034: bool = False` and `rfc_2782: bool = False`. -- `extremes.py` renamed to `_extremes.py` and is no longer exposed. -- `truthy` was discarded in favour of simple `bool()` function. -- `ipv4_cidr()` and `ipv6_cidr()` has been dropped in favour of `cidr: bool = True` and `cidr: bool = True` keyword-only parameters. -- `email()` API now accepts the following keyword-only arguments: - - `simple_host: bool = False`, - - `ipv6_address: bool = False`, - - `ipv4_address: bool = False`, - - `rfc_1034: bool = False` and - - `rfc_2782: bool = False`. -- `whitelist=None` has been removed from `email()`. -- `url()` has been refactored, it accepts the following keyword-only arguments: - - `skip_ipv6_addr: bool = False`, - - `skip_ipv4_addr: bool = False`, - - `may_have_port: bool = True`, - - `simple_host: bool = False`, - - `rfc_1034: bool = False` and - - `rfc_2782: bool = False`. -- `public=False` keyword argument has been removed from `url()`. -- Exposes `i18n` functions directly via `__init__.py`. -- `@validator` decorator catches `Exception`. - - +* Drops support for all Python versions below `v3.8`. +* Makes API's primary parameter, `positional`, and the remaining, `keyword-only`. +* Keyword-only parameters like `max` and `min`, has been renamed to `max_val` and `min_val` respectively. +* `domain` API now accepts two new keyword-only arguments: `rfc_1034: bool = False` and `rfc_2782: bool = False`. +* `extremes.py` renamed to `_extremes.py` and is no longer exposed. +* `truthy` was discarded in favour of simple `bool()` function. +* `ipv4_cidr()` and `ipv6_cidr()` has been dropped in favour of `cidr: bool = True` and `cidr: bool = True` keyword-only parameters. +* `email()` API now accepts the following keyword-only arguments: + * `simple_host: bool = False`, + * `ipv6_address: bool = False`, + * `ipv4_address: bool = False`, + * `rfc_1034: bool = False` and + * `rfc_2782: bool = False`. +* `whitelist=None` has been removed from `email()`. +* `url()` has been refactored, it accepts the following keyword-only arguments: + * `skip_ipv6_addr: bool = False`, + * `skip_ipv4_addr: bool = False`, + * `may_have_port: bool = True`, + * `simple_host: bool = False`, + * `rfc_1034: bool = False` and + * `rfc_2782: bool = False`. +* `public=False` keyword argument has been removed from `url()`. +* Exposes `i18n` functions directly via `__init__.py`. +* `@validator` decorator catches `Exception`. + + _**Features**_ -- Adds `hostname` validator. +* Adds `hostname` validator. _**Maintenance**_ -- feat: add build for pypi workflow by @yozachar in [#255](https://github.com/python-validators/validators/pull/255) -- feat: @validator now catches `Exception` by @yozachar in [#254](https://github.com/python-validators/validators/pull/254) -- maint: improves `i18n` package by @yozachar in [#252](https://github.com/python-validators/validators/pull/252) -- maint: misc changes to dev and ci by @yozachar in [#251](https://github.com/python-validators/validators/pull/251) -- maint: misc fixes and improvements by @yozachar in [#249](https://github.com/python-validators/validators/pull/249) -- maint: improves state of package development by @yozachar in [#248](https://github.com/python-validators/validators/pull/248) -- fix: generate dynamic reference docs by @yozachar in [#247](https://github.com/python-validators/validators/pull/247) -- maint: moving docs from `.rst` to `.md` by @yozachar in [#246](https://github.com/python-validators/validators/pull/246) -- maint: improves `url` module by @yozachar in [#245](https://github.com/python-validators/validators/pull/245) -- maint: improve `domain`, `email` & `hostname` by @yozachar in [#244](https://github.com/python-validators/validators/pull/244) -- maint: simplified `hostname` module by @yozachar in [#242](https://github.com/python-validators/validators/pull/242) -- maint: update `email` module by @yozachar in [#241](https://github.com/python-validators/validators/pull/241) -- feat: adds `hostname` validator by @yozachar in [#240](https://github.com/python-validators/validators/pull/240) -- maint: improves `ip_address` module by @yozachar in [#239](https://github.com/python-validators/validators/pull/239) -- fix: misc fixes, use bandit by @yozachar in [#238](https://github.com/python-validators/validators/pull/238) -- Create SECURITY.md by @yozachar in [#237](https://github.com/python-validators/validators/pull/237) -- maint: improves `mac_address`, `slug` and `uuid` by @yozachar in [#236](https://github.com/python-validators/validators/pull/236) -- maint: improve `hashes` and `iban` modules by @yozachar in [#235](https://github.com/python-validators/validators/pull/235) -- feat: auto docs using mkdocstrings by @yozachar in [#234](https://github.com/python-validators/validators/pull/234) -- maint: improves `email` module by @yozachar in [#233](https://github.com/python-validators/validators/pull/233) -- maint: minor improvements by @yozachar in [#232](https://github.com/python-validators/validators/pull/232) -- maint: improves `domain` module by @yozachar in [#231](https://github.com/python-validators/validators/pull/231) -- maint: reformats `card` module, fix typo by @yozachar in [#230](https://github.com/python-validators/validators/pull/230) -- feat: formats google pydoc style for mkdocstring by @yozachar in [#229](https://github.com/python-validators/validators/pull/229) -- maint: refresh `btc_address` module by @yozachar in [#228](https://github.com/python-validators/validators/pull/228) -- maint: improve type annotations by @yozachar in [#227](https://github.com/python-validators/validators/pull/227) -- maint: improves `between` and `length` modules by @yozachar in [#225](https://github.com/python-validators/validators/pull/225) -- maint: follows google's python style guide for docstrings by @yozachar in [#224](https://github.com/python-validators/validators/pull/224) -- feat: type hints in utils.py, gh-actions by @yozachar in [#223](https://github.com/python-validators/validators/pull/223) -- feat: add pyproject.toml, README.md, upd gitignore by @yozachar in [#221](https://github.com/python-validators/validators/pull/221) -- remove Travis CI settings by @ktdreyer in [#196](https://github.com/python-validators/validators/pull/196) +* feat: add build for pypi workflow by @yozachar in [#255](https://github.com/python-validators/validators/pull/255) +* feat: @validator now catches `Exception` by @yozachar in [#254](https://github.com/python-validators/validators/pull/254) +* maint: improves `i18n` package by @yozachar in [#252](https://github.com/python-validators/validators/pull/252) +* maint: misc changes to dev and ci by @yozachar in [#251](https://github.com/python-validators/validators/pull/251) +* maint: misc fixes and improvements by @yozachar in [#249](https://github.com/python-validators/validators/pull/249) +* maint: improves state of package development by @yozachar in [#248](https://github.com/python-validators/validators/pull/248) +* fix: generate dynamic reference docs by @yozachar in [#247](https://github.com/python-validators/validators/pull/247) +* maint: moving docs from `.rst` to `.md` by @yozachar in [#246](https://github.com/python-validators/validators/pull/246) +* maint: improves `url` module by @yozachar in [#245](https://github.com/python-validators/validators/pull/245) +* maint: improve `domain`, `email` & `hostname` by @yozachar in [#244](https://github.com/python-validators/validators/pull/244) +* maint: simplified `hostname` module by @yozachar in [#242](https://github.com/python-validators/validators/pull/242) +* maint: update `email` module by @yozachar in [#241](https://github.com/python-validators/validators/pull/241) +* feat: adds `hostname` validator by @yozachar in [#240](https://github.com/python-validators/validators/pull/240) +* maint: improves `ip_address` module by @yozachar in [#239](https://github.com/python-validators/validators/pull/239) +* fix: misc fixes, use bandit by @yozachar in [#238](https://github.com/python-validators/validators/pull/238) +* Create SECURITY.md by @yozachar in [#237](https://github.com/python-validators/validators/pull/237) +* maint: improves `mac_address`, `slug` and `uuid` by @yozachar in [#236](https://github.com/python-validators/validators/pull/236) +* maint: improve `hashes` and `iban` modules by @yozachar in [#235](https://github.com/python-validators/validators/pull/235) +* feat: auto docs using mkdocstrings by @yozachar in [#234](https://github.com/python-validators/validators/pull/234) +* maint: improves `email` module by @yozachar in [#233](https://github.com/python-validators/validators/pull/233) +* maint: minor improvements by @yozachar in [#232](https://github.com/python-validators/validators/pull/232) +* maint: improves `domain` module by @yozachar in [#231](https://github.com/python-validators/validators/pull/231) +* maint: reformats `card` module, fix typo by @yozachar in [#230](https://github.com/python-validators/validators/pull/230) +* feat: formats google pydoc style for mkdocstring by @yozachar in [#229](https://github.com/python-validators/validators/pull/229) +* maint: refresh `btc_address` module by @yozachar in [#228](https://github.com/python-validators/validators/pull/228) +* maint: improve type annotations by @yozachar in [#227](https://github.com/python-validators/validators/pull/227) +* maint: improves `between` and `length` modules by @yozachar in [#225](https://github.com/python-validators/validators/pull/225) +* maint: follows google's python style guide for docstrings by @yozachar in [#224](https://github.com/python-validators/validators/pull/224) +* feat: type hints in utils.py, gh-actions by @yozachar in [#223](https://github.com/python-validators/validators/pull/223) +* feat: add pyproject.toml, README.md, upd gitignore by @yozachar in [#221](https://github.com/python-validators/validators/pull/221) +* remove Travis CI settings by @ktdreyer in [#196](https://github.com/python-validators/validators/pull/196) **Full Changelog**: [`0.20.0...0.21.0`](https://github.com/python-validators/validators/compare/0.20.0...0.21.0) @@ -456,177 +473,177 @@ _**Maintenance**_ ## 0.20.0 (2022-06-05) -- Added ipv4 digit lenghts validation (#191, pull request courtesy of Norbiox) -- Fixes error with international URLs that have more than 2 hyphens (#184, pull request courtesy of automationator) +* Added ipv4 digit lenghts validation (#191, pull request courtesy of Norbiox) +* Fixes error with international URLs that have more than 2 hyphens (#184, pull request courtesy of automationator) ## 0.19.0 (2022-05-04) -- Dropped py34 support -- Improve IPv6 validation (#201, pull request courtesy of SimonIT) +* Dropped py34 support +* Improve IPv6 validation (#201, pull request courtesy of SimonIT) ## 0.18.2 (2020-12-18) -- Implement actual validation for old style BTC addresses including checksumming (#182, pull request courtesy of tpatja) -- Use a regex to guesstimate validity of new segwit BTC addresses (#182, pull request courtesy of tpatja) +* Implement actual validation for old style BTC addresses including checksumming (#182, pull request courtesy of tpatja) +* Use a regex to guesstimate validity of new segwit BTC addresses (#182, pull request courtesy of tpatja) ## 0.18.1 (2020-09-03) -- Made uuid validator accept UUID objects (#174, pull request courtesy of Letsch22) +* Made uuid validator accept UUID objects (#174, pull request courtesy of Letsch22) ## 0.18.0 (2020-08-19) -- Added bitcoin address validator (#166, pull request courtesy of daveusa31) +* Added bitcoin address validator (#166, pull request courtesy of daveusa31) ## 0.17.1 (2020-08-03) -- Fixed python_requires using twine +* Fixed python_requires using twine ## 0.17.0 (2020-08-02) -- Added python_requires='>=3.4' to setup.py (#163, pull request courtesy of vphilippon) -- Fixed URL validator ip_last_octet regex (#145, pull request courtesy of ghost) +* Added python_requires='>=3.4' to setup.py (#163, pull request courtesy of vphilippon) +* Fixed URL validator ip_last_octet regex (#145, pull request courtesy of ghost) ## 0.16.0 (2020-07-16) -- Added support for emojis and more IDNA URLs (#161, pull request courtesy of automationator) +* Added support for emojis and more IDNA URLs (#161, pull request courtesy of automationator) ## 0.15.0 (2020-05-07) -- Added bank card validators (#157, pull request courtesy of TimonPeng) +* Added bank card validators (#157, pull request courtesy of TimonPeng) ## 0.14.3 (2020-04-02) -- Handle None values gracefully in domain validator (#144, pull request courtesy reahaas) -- Local part of the email address should be less or equal than 64 bytes (#147, pull request courtesy mondeja) -- Removed py27 support -- Removed pypy2 support +* Handle None values gracefully in domain validator (#144, pull request courtesy reahaas) +* Local part of the email address should be less or equal than 64 bytes (#147, pull request courtesy mondeja) +* Removed py27 support +* Removed pypy2 support ## 0.14.2 (2020-01-24) -- Made domain validation case-insensitive (#136, pull request courtesy ehmkah) +* Made domain validation case-insensitive (#136, pull request courtesy ehmkah) ## 0.14.1 (2019-12-04) -- Updated domain validator regex to not allow numeric only TLDs (#133, pull request courtesy jmeridth) -- Allow for idna encoded domains (#133, pull request courtesy jmeridth) +* Updated domain validator regex to not allow numeric only TLDs (#133, pull request courtesy jmeridth) +* Allow for idna encoded domains (#133, pull request courtesy jmeridth) ## 0.14.0 (2019-08-21) -- Added new validators `ipv4_cidr`, `ipv6_cidr` (#117, pull request courtesy woodruffw) +* Added new validators `ipv4_cidr`, `ipv6_cidr` (#117, pull request courtesy woodruffw) ## 0.13.0 (2019-05-20) -- Added new validator: `es_doi`, `es_nif`, `es_cif`, `es_nie` (#121, pull request courtesy kingbuzzman) +* Added new validator: `es_doi`, `es_nif`, `es_cif`, `es_nie` (#121, pull request courtesy kingbuzzman) ## 0.12.6 (2019-05-08) -- Fixed domain validator for single character domains (#118, pull request courtesy kingbuzzman) +* Fixed domain validator for single character domains (#118, pull request courtesy kingbuzzman) ## 0.12.5 (2019-04-15) -- Fixed py37 support (#113, pull request courtesy agiletechnologist) +* Fixed py37 support (#113, pull request courtesy agiletechnologist) ## 0.12.4 (2019-01-02) -- Use inspect.getfullargspec() in py3 (#110, pull request courtesy riconnon) +* Use inspect.getfullargspec() in py3 (#110, pull request courtesy riconnon) ## 0.12.3 (2018-11-13) -- Added `allow_temporal_ssn` parameter to fi_ssn validator (#97, pull request courtesy quantus) -- Remove py33 support +* Added `allow_temporal_ssn` parameter to fi_ssn validator (#97, pull request courtesy quantus) +* Remove py33 support ## 0.12.2 (2018-06-03) -- Fixed IPv4 formatted IP address returning True on ipv6 (#85, pull request courtesy johndlong) -- Fixed IPv6 address parsing (#83, pull request courtesy JulianKahnert) -- Fixed domain validator for international domains and certain edge cases (#76, pull request courtesy Ni-Knight) +* Fixed IPv4 formatted IP address returning True on ipv6 (#85, pull request courtesy johndlong) +* Fixed IPv6 address parsing (#83, pull request courtesy JulianKahnert) +* Fixed domain validator for international domains and certain edge cases (#76, pull request courtesy Ni-Knight) ## 0.12.1 (2018-01-30) -- Fixed IDNA encoded TLDs in domain validator (#75, pull request courtesy piewpiew) -- Fixed URL validator for URLs with invalid characters in userinfo part (#69, pull request courtesy timb07) +* Fixed IDNA encoded TLDs in domain validator (#75, pull request courtesy piewpiew) +* Fixed URL validator for URLs with invalid characters in userinfo part (#69, pull request courtesy timb07) ## 0.12.0 (2017-06-03) -- Added hash validators for md5, sha1, sha224, sha256 and sha512 -- Made ipv6 validator support IPv4-mapped IPv6 addresses +* Added hash validators for md5, sha1, sha224, sha256 and sha512 +* Made ipv6 validator support IPv4-mapped IPv6 addresses ## 0.11.3 (2017-03-27) -- Fixed URL validator for URLs containing localhost (#51, pull request courtesy vladimirdotk) +* Fixed URL validator for URLs containing localhost (#51, pull request courtesy vladimirdotk) ## 0.11.2 (2017-01-08) -- Fixed URL validator for urls with query parameters but without path (#44, pull request courtesy zjjw) +* Fixed URL validator for urls with query parameters but without path (#44, pull request courtesy zjjw) ## 0.11.1 (2016-11-19) -- Fixed pyp2rpm build problem (#37, pull request courtesy BOPOHA) +* Fixed pyp2rpm build problem (#37, pull request courtesy BOPOHA) ## 0.11.0 (2016-08-30) -- Fixed public url validation (#29) -- Made URL validator case insensitive (#27) -- Drop Python 2.6 support +* Fixed public url validation (#29) +* Made URL validator case insensitive (#27) +* Drop Python 2.6 support ## 0.10.3 (2016-06-13) -- Added `public` parameter to url validator (#26, pull request courtesy Iconceicao) +* Added `public` parameter to url validator (#26, pull request courtesy Iconceicao) ## 0.10.2 (2016-06-11) -- Fixed various URL validation issues +* Fixed various URL validation issues ## 0.10.1 (2016-04-09) -- Fixed domain name validation for numeric domain names (#21, pull request courtesy shaunpud) -- Fixed IBAN validation for Norwegian and Belgian IBANs (#17, pull request courtesy mboelens91) +* Fixed domain name validation for numeric domain names (#21, pull request courtesy shaunpud) +* Fixed IBAN validation for Norwegian and Belgian IBANs (#17, pull request courtesy mboelens91) ## 0.10.0 (2016-01-09) -- Added support for internationalized domain names (IDN) in `domain` validator +* Added support for internationalized domain names (IDN) in `domain` validator ## 0.9.0 (2015-10-10) -- Added new validator: `domain` -- Added flake8 and isort checks in travis config +* Added new validator: `domain` +* Added flake8 and isort checks in travis config ## 0.8.0 (2015-06-24) -- Added new validator: `iban` +* Added new validator: `iban` ## 0.7.0 (2014-09-07) -- Fixed errors in code examples. -- Fixed `TypeError` when using `between` validator with `datetime` objects +* Fixed errors in code examples. +* Fixed `TypeError` when using `between` validator with `datetime` objects like in the code example. -- Changed validators to always return `True` instead of a truthy object when +* Changed validators to always return `True` instead of a truthy object when the validation succeeds. -- Fixed `truthy` validator to work like it's name suggests. Previously it +* Fixed `truthy` validator to work like it's name suggests. Previously it worked like `falsy`. ## 0.6.0 (2014-06-25) -- Added new validator: `slug` +* Added new validator: `slug` ## 0.5.0 (2013-10-31) -- Renamed `finnish_business_id` to `fi_business_id` -- Added new validator: `fi_ssn` +* Renamed `finnish_business_id` to `fi_business_id` +* Added new validator: `fi_ssn` ## 0.4.0 (2013-10-29) -- Added new validator: `finnish_business_id` +* Added new validator: `finnish_business_id` ## 0.3.0 (2013-10-27) -- `number_range` -> `between` +* `number_range` -> `between` ## 0.2.0 (2013-10-22) -- Various new validators: `ipv4`, `ipv6`, `length`, `number_range`, +* Various new validators: `ipv4`, `ipv6`, `length`, `number_range`, `mac_address`, `url`, `uuid` ## 0.1.0 (2013-10-18) -- Initial public release +* Initial public release diff --git a/pdm.lock b/pdm.lock index 7f6519b9..211be750 100644 --- a/pdm.lock +++ b/pdm.lock @@ -4,8 +4,11 @@ [metadata] groups = ["default", "crypto-eth-addresses", "docs-offline", "docs-online", "package", "runner", "sast", "testing", "tooling"] strategy = ["cross_platform", "inherit_metadata"] -lock_version = "4.4.2" -content_hash = "sha256:2a31be022afd854fd2d7e5b17abff17895885b687d8205f9198bd478cf2e0761" +lock_version = "4.5.0" +content_hash = "sha256:9e235aba5998e1586f07b88afb71a5f3e31c9adfef32bd65d9042c0d38606b6a" + +[[metadata.targets]] +requires_python = ">=3.8" [[package]] name = "alabaster" @@ -96,7 +99,7 @@ files = [ [[package]] name = "black" -version = "24.4.2" +version = "24.8.0" requires_python = ">=3.8" summary = "The uncompromising code formatter." groups = ["tooling"] @@ -110,28 +113,28 @@ dependencies = [ "typing-extensions>=4.0.1; python_version < \"3.11\"", ] files = [ - {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, - {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, - {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, - {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, - {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, - {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, - {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, - {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, - {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, - {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, - {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, - {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, - {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"}, - {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"}, - {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"}, - {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"}, - {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"}, - {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"}, - {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"}, - {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"}, - {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, - {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, + {file = "black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6"}, + {file = "black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb"}, + {file = "black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42"}, + {file = "black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a"}, + {file = "black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1"}, + {file = "black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af"}, + {file = "black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4"}, + {file = "black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af"}, + {file = "black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368"}, + {file = "black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed"}, + {file = "black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018"}, + {file = "black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2"}, + {file = "black-24.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd"}, + {file = "black-24.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2"}, + {file = "black-24.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e"}, + {file = "black-24.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920"}, + {file = "black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c"}, + {file = "black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e"}, + {file = "black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47"}, + {file = "black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb"}, + {file = "black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed"}, + {file = "black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f"}, ] [[package]] @@ -154,13 +157,13 @@ files = [ [[package]] name = "cachetools" -version = "5.3.3" +version = "5.5.0" requires_python = ">=3.7" summary = "Extensible memoizing collections and decorators" groups = ["runner"] files = [ - {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, - {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, + {file = "cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292"}, + {file = "cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"}, ] [[package]] @@ -279,6 +282,7 @@ summary = "Composable command line interface toolkit" groups = ["docs-online", "tooling"] dependencies = [ "colorama; platform_system == \"Windows\"", + "importlib-metadata; python_version < \"3.8\"", ] files = [ {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, @@ -369,7 +373,7 @@ files = [ [[package]] name = "furo" -version = "2024.5.6" +version = "2024.8.6" requires_python = ">=3.8" summary = "A clean customisable Sphinx documentation theme." groups = ["docs-offline"] @@ -377,11 +381,11 @@ dependencies = [ "beautifulsoup4", "pygments>=2.7", "sphinx-basic-ng>=1.0.0.beta2", - "sphinx<8.0,>=6.0", + "sphinx<9.0,>=6.0", ] files = [ - {file = "furo-2024.5.6-py3-none-any.whl", hash = "sha256:490a00d08c0a37ecc90de03ae9227e8eb5d6f7f750edf9807f398a2bdf2358de"}, - {file = "furo-2024.5.6.tar.gz", hash = "sha256:81f205a6605ebccbb883350432b4831c0196dd3d1bc92f61e1f459045b3d2b0b"}, + {file = "furo-2024.8.6-py3-none-any.whl", hash = "sha256:6cd97c58b47813d3619e63e9081169880fbe331f0ca883c871ff1f3f11814f5c"}, + {file = "furo-2024.8.6.tar.gz", hash = "sha256:b63e4cee8abfc3136d3bc03a3d45a76a850bada4d6374d24c1716b0e01394a01"}, ] [[package]] @@ -419,6 +423,7 @@ summary = "GitPython is a Python library used to interact with Git repositories" groups = ["docs-online"] dependencies = [ "gitdb<5,>=4.0.1", + "typing-extensions>=3.7.4.3; python_version < \"3.8\"", ] files = [ {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"}, @@ -469,6 +474,7 @@ requires_python = ">=3.8" summary = "Read metadata from Python packages" groups = ["docs-offline", "docs-online", "package"] dependencies = [ + "typing-extensions>=3.6.4; python_version < \"3.8\"", "zipp>=0.5", ] files = [ @@ -641,7 +647,7 @@ files = [ [[package]] name = "mike" -version = "2.1.2" +version = "2.1.3" summary = "Manage multiple versions of your MkDocs-powered documentation" groups = ["docs-online"] dependencies = [ @@ -655,13 +661,13 @@ dependencies = [ "verspec", ] files = [ - {file = "mike-2.1.2-py3-none-any.whl", hash = "sha256:d61d9b423ab412d634ca2bd520136d5114e3cc73f4bbd1aa6a0c6625c04918c0"}, - {file = "mike-2.1.2.tar.gz", hash = "sha256:d59cc8054c50f9c8a046cfd47f9b700cf9ff1b2b19f420bd8812ca6f94fa8bd3"}, + {file = "mike-2.1.3-py3-none-any.whl", hash = "sha256:d90c64077e84f06272437b464735130d380703a76a5738b152932884c60c062a"}, + {file = "mike-2.1.3.tar.gz", hash = "sha256:abd79b8ea483fb0275b7972825d3082e5ae67a41820f8d8a0dc7a3f49944e810"}, ] [[package]] name = "mkdocs" -version = "1.6.0" +version = "1.6.1" requires_python = ">=3.8" summary = "Project documentation with Markdown." groups = ["docs-online"] @@ -682,13 +688,13 @@ dependencies = [ "watchdog>=2.0", ] files = [ - {file = "mkdocs-1.6.0-py3-none-any.whl", hash = "sha256:1eb5cb7676b7d89323e62b56235010216319217d4af5ddc543a91beb8d125ea7"}, - {file = "mkdocs-1.6.0.tar.gz", hash = "sha256:a73f735824ef83a4f3bcb7a231dcab23f5a838f88b7efc54a0eef5fbdbc3c512"}, + {file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"}, + {file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"}, ] [[package]] name = "mkdocs-autorefs" -version = "1.0.1" +version = "1.2.0" requires_python = ">=3.8" summary = "Automatically link across pages in MkDocs." groups = ["docs-online"] @@ -698,8 +704,8 @@ dependencies = [ "mkdocs>=1.1", ] files = [ - {file = "mkdocs_autorefs-1.0.1-py3-none-any.whl", hash = "sha256:aacdfae1ab197780fb7a2dac92ad8a3d8f7ca8049a9cbe56a4218cd52e8da570"}, - {file = "mkdocs_autorefs-1.0.1.tar.gz", hash = "sha256:f684edf847eced40b570b57846b15f0bf57fb93ac2c510450775dcf16accb971"}, + {file = "mkdocs_autorefs-1.2.0-py3-none-any.whl", hash = "sha256:d588754ae89bd0ced0c70c06f58566a4ee43471eeeee5202427da7de9ef85a2f"}, + {file = "mkdocs_autorefs-1.2.0.tar.gz", hash = "sha256:a86b93abff653521bda71cf3fc5596342b7a23982093915cb74273f67522190f"}, ] [[package]] @@ -721,7 +727,7 @@ files = [ [[package]] name = "mkdocs-git-revision-date-localized-plugin" -version = "1.2.6" +version = "1.2.7" requires_python = ">=3.8" summary = "Mkdocs plugin that enables displaying the localized date of the last git modification of a markdown file." groups = ["docs-online"] @@ -732,13 +738,13 @@ dependencies = [ "pytz", ] files = [ - {file = "mkdocs_git_revision_date_localized_plugin-1.2.6-py3-none-any.whl", hash = "sha256:f015cb0f3894a39b33447b18e270ae391c4e25275cac5a626e80b243784e2692"}, - {file = "mkdocs_git_revision_date_localized_plugin-1.2.6.tar.gz", hash = "sha256:e432942ce4ee8aa9b9f4493e993dee9d2cc08b3ea2b40a3d6b03ca0f2a4bcaa2"}, + {file = "mkdocs_git_revision_date_localized_plugin-1.2.7-py3-none-any.whl", hash = "sha256:d2b30ccb74ec8e118298758d75ae4b4f02c620daf776a6c92fcbb58f2b78f19f"}, + {file = "mkdocs_git_revision_date_localized_plugin-1.2.7.tar.gz", hash = "sha256:2f83b52b4dad642751a79465f80394672cbad022129286f40d36b03aebee490f"}, ] [[package]] name = "mkdocs-material" -version = "9.5.27" +version = "9.5.34" requires_python = ">=3.8" summary = "Documentation that simply works" groups = ["docs-online"] @@ -756,8 +762,8 @@ dependencies = [ "requests~=2.26", ] files = [ - {file = "mkdocs_material-9.5.27-py3-none-any.whl", hash = "sha256:af8cc263fafa98bb79e9e15a8c966204abf15164987569bd1175fd66a7705182"}, - {file = "mkdocs_material-9.5.27.tar.gz", hash = "sha256:a7d4a35f6d4a62b0c43a0cfe7e987da0980c13587b5bc3c26e690ad494427ec0"}, + {file = "mkdocs_material-9.5.34-py3-none-any.whl", hash = "sha256:54caa8be708de2b75167fd4d3b9f3d949579294f49cb242515d4653dbee9227e"}, + {file = "mkdocs_material-9.5.34.tar.gz", hash = "sha256:1e60ddf716cfb5679dfd65900b8a25d277064ed82d9a53cd5190e3f894df7840"}, ] [[package]] @@ -773,25 +779,25 @@ files = [ [[package]] name = "mkdocstrings" -version = "0.25.1" +version = "0.26.0" requires_python = ">=3.8" summary = "Automatic documentation from sources, for MkDocs." groups = ["docs-online"] dependencies = [ "Jinja2>=2.11.1", - "Markdown>=3.3", + "Markdown>=3.6", "MarkupSafe>=1.1", "click>=7.0", "importlib-metadata>=4.6; python_version < \"3.10\"", - "mkdocs-autorefs>=0.3.1", + "mkdocs-autorefs>=1.2", "mkdocs>=1.4", - "platformdirs>=2.2.0", + "platformdirs>=2.2", "pymdown-extensions>=6.3", "typing-extensions>=4.1; python_version < \"3.10\"", ] files = [ - {file = "mkdocstrings-0.25.1-py3-none-any.whl", hash = "sha256:da01fcc2670ad61888e8fe5b60afe9fee5781017d67431996832d63e887c2e51"}, - {file = "mkdocstrings-0.25.1.tar.gz", hash = "sha256:c3a2515f31577f311a9ee58d089e4c51fc6046dbd9e9b4c3de4c3194667fe9bf"}, + {file = "mkdocstrings-0.26.0-py3-none-any.whl", hash = "sha256:1aa227fe94f88e80737d37514523aacd473fc4b50a7f6852ce41447ab23f2654"}, + {file = "mkdocstrings-0.26.0.tar.gz", hash = "sha256:ff9d0de28c8fa877ed9b29a42fe407cfe6736d70a1c48177aa84fcc3dc8518cd"}, ] [[package]] @@ -811,18 +817,18 @@ files = [ [[package]] name = "mkdocstrings" -version = "0.25.1" +version = "0.26.0" extras = ["python"] requires_python = ">=3.8" summary = "Automatic documentation from sources, for MkDocs." groups = ["docs-online"] dependencies = [ "mkdocstrings-python>=0.5.2", - "mkdocstrings==0.25.1", + "mkdocstrings==0.26.0", ] files = [ - {file = "mkdocstrings-0.25.1-py3-none-any.whl", hash = "sha256:da01fcc2670ad61888e8fe5b60afe9fee5781017d67431996832d63e887c2e51"}, - {file = "mkdocstrings-0.25.1.tar.gz", hash = "sha256:c3a2515f31577f311a9ee58d089e4c51fc6046dbd9e9b4c3de4c3194667fe9bf"}, + {file = "mkdocstrings-0.26.0-py3-none-any.whl", hash = "sha256:1aa227fe94f88e80737d37514523aacd473fc4b50a7f6852ce41447ab23f2654"}, + {file = "mkdocstrings-0.26.0.tar.gz", hash = "sha256:ff9d0de28c8fa877ed9b29a42fe407cfe6736d70a1c48177aa84fcc3dc8518cd"}, ] [[package]] @@ -1041,21 +1047,22 @@ files = [ [[package]] name = "pyright" -version = "1.1.369" +version = "1.1.378" requires_python = ">=3.7" summary = "Command line wrapper for pyright" groups = ["tooling"] dependencies = [ "nodeenv>=1.6.0", + "typing-extensions>=3.7; python_version < \"3.8\"", ] files = [ - {file = "pyright-1.1.369-py3-none-any.whl", hash = "sha256:06d5167a8d7be62523ced0265c5d2f1e022e110caf57a25d92f50fb2d07bcda0"}, - {file = "pyright-1.1.369.tar.gz", hash = "sha256:ad290710072d021e213b98cc7a2f90ae3a48609ef5b978f749346d1a47eb9af8"}, + {file = "pyright-1.1.378-py3-none-any.whl", hash = "sha256:8853776138b01bc284da07ac481235be7cc89d3176b073d2dba73636cb95be79"}, + {file = "pyright-1.1.378.tar.gz", hash = "sha256:78a043be2876d12d0af101d667e92c7734f3ebb9db71dccc2c220e7e7eb89ca2"}, ] [[package]] name = "pytest" -version = "8.2.2" +version = "8.3.2" requires_python = ">=3.8" summary = "pytest: simple powerful testing with Python" groups = ["testing", "tooling"] @@ -1064,12 +1071,12 @@ dependencies = [ "exceptiongroup>=1.0.0rc8; python_version < \"3.11\"", "iniconfig", "packaging", - "pluggy<2.0,>=1.5", + "pluggy<2,>=1.5", "tomli>=1; python_version < \"3.11\"", ] files = [ - {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, - {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, + {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, + {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, ] [[package]] @@ -1281,29 +1288,29 @@ files = [ [[package]] name = "ruff" -version = "0.5.0" +version = "0.6.3" requires_python = ">=3.7" summary = "An extremely fast Python linter and code formatter, written in Rust." groups = ["tooling"] files = [ - {file = "ruff-0.5.0-py3-none-linux_armv6l.whl", hash = "sha256:ee770ea8ab38918f34e7560a597cc0a8c9a193aaa01bfbd879ef43cb06bd9c4c"}, - {file = "ruff-0.5.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:38f3b8327b3cb43474559d435f5fa65dacf723351c159ed0dc567f7ab735d1b6"}, - {file = "ruff-0.5.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7594f8df5404a5c5c8f64b8311169879f6cf42142da644c7e0ba3c3f14130370"}, - {file = "ruff-0.5.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:adc7012d6ec85032bc4e9065110df205752d64010bed5f958d25dbee9ce35de3"}, - {file = "ruff-0.5.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d505fb93b0fabef974b168d9b27c3960714d2ecda24b6ffa6a87ac432905ea38"}, - {file = "ruff-0.5.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dc5cfd3558f14513ed0d5b70ce531e28ea81a8a3b1b07f0f48421a3d9e7d80a"}, - {file = "ruff-0.5.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:db3ca35265de239a1176d56a464b51557fce41095c37d6c406e658cf80bbb362"}, - {file = "ruff-0.5.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b1a321c4f68809fddd9b282fab6a8d8db796b270fff44722589a8b946925a2a8"}, - {file = "ruff-0.5.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c4dfcd8d34b143916994b3876b63d53f56724c03f8c1a33a253b7b1e6bf2a7d"}, - {file = "ruff-0.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81e5facfc9f4a674c6a78c64d38becfbd5e4f739c31fcd9ce44c849f1fad9e4c"}, - {file = "ruff-0.5.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e589e27971c2a3efff3fadafb16e5aef7ff93250f0134ec4b52052b673cf988d"}, - {file = "ruff-0.5.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d2ffbc3715a52b037bcb0f6ff524a9367f642cdc5817944f6af5479bbb2eb50e"}, - {file = "ruff-0.5.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cd096e23c6a4f9c819525a437fa0a99d1c67a1b6bb30948d46f33afbc53596cf"}, - {file = "ruff-0.5.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:46e193b36f2255729ad34a49c9a997d506e58f08555366b2108783b3064a0e1e"}, - {file = "ruff-0.5.0-py3-none-win32.whl", hash = "sha256:49141d267100f5ceff541b4e06552e98527870eafa1acc9dec9139c9ec5af64c"}, - {file = "ruff-0.5.0-py3-none-win_amd64.whl", hash = "sha256:e9118f60091047444c1b90952736ee7b1792910cab56e9b9a9ac20af94cd0440"}, - {file = "ruff-0.5.0-py3-none-win_arm64.whl", hash = "sha256:ed5c4df5c1fb4518abcb57725b576659542bdbe93366f4f329e8f398c4b71178"}, - {file = "ruff-0.5.0.tar.gz", hash = "sha256:eb641b5873492cf9bd45bc9c5ae5320648218e04386a5f0c264ad6ccce8226a1"}, + {file = "ruff-0.6.3-py3-none-linux_armv6l.whl", hash = "sha256:97f58fda4e309382ad30ede7f30e2791d70dd29ea17f41970119f55bdb7a45c3"}, + {file = "ruff-0.6.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3b061e49b5cf3a297b4d1c27ac5587954ccb4ff601160d3d6b2f70b1622194dc"}, + {file = "ruff-0.6.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:34e2824a13bb8c668c71c1760a6ac7d795ccbd8d38ff4a0d8471fdb15de910b1"}, + {file = "ruff-0.6.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bddfbb8d63c460f4b4128b6a506e7052bad4d6f3ff607ebbb41b0aa19c2770d1"}, + {file = "ruff-0.6.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ced3eeb44df75353e08ab3b6a9e113b5f3f996bea48d4f7c027bc528ba87b672"}, + {file = "ruff-0.6.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47021dff5445d549be954eb275156dfd7c37222acc1e8014311badcb9b4ec8c1"}, + {file = "ruff-0.6.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:7d7bd20dc07cebd68cc8bc7b3f5ada6d637f42d947c85264f94b0d1cd9d87384"}, + {file = "ruff-0.6.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:500f166d03fc6d0e61c8e40a3ff853fa8a43d938f5d14c183c612df1b0d6c58a"}, + {file = "ruff-0.6.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42844ff678f9b976366b262fa2d1d1a3fe76f6e145bd92c84e27d172e3c34500"}, + {file = "ruff-0.6.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70452a10eb2d66549de8e75f89ae82462159855e983ddff91bc0bce6511d0470"}, + {file = "ruff-0.6.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:65a533235ed55f767d1fc62193a21cbf9e3329cf26d427b800fdeacfb77d296f"}, + {file = "ruff-0.6.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d2e2c23cef30dc3cbe9cc5d04f2899e7f5e478c40d2e0a633513ad081f7361b5"}, + {file = "ruff-0.6.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d8a136aa7d228975a6aee3dd8bea9b28e2b43e9444aa678fb62aeb1956ff2351"}, + {file = "ruff-0.6.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f92fe93bc72e262b7b3f2bba9879897e2d58a989b4714ba6a5a7273e842ad2f8"}, + {file = "ruff-0.6.3-py3-none-win32.whl", hash = "sha256:7a62d3b5b0d7f9143d94893f8ba43aa5a5c51a0ffc4a401aa97a81ed76930521"}, + {file = "ruff-0.6.3-py3-none-win_amd64.whl", hash = "sha256:746af39356fee2b89aada06c7376e1aa274a23493d7016059c3a72e3b296befb"}, + {file = "ruff-0.6.3-py3-none-win_arm64.whl", hash = "sha256:14a9528a8b70ccc7a847637c29e56fd1f9183a9db743bbc5b8e0c4ad60592a82"}, + {file = "ruff-0.6.3.tar.gz", hash = "sha256:183b99e9edd1ef63be34a3b51fee0a9f4ab95add123dbf89a71f7b1f0c991983"}, ] [[package]] @@ -1487,25 +1494,25 @@ files = [ [[package]] name = "tox" -version = "4.15.1" +version = "4.18.0" requires_python = ">=3.8" summary = "tox is a generic virtualenv management and test command line tool" groups = ["runner"] dependencies = [ - "cachetools>=5.3.2", + "cachetools>=5.4", "chardet>=5.2", "colorama>=0.4.6", - "filelock>=3.13.1", - "packaging>=23.2", - "platformdirs>=4.1", - "pluggy>=1.3", - "pyproject-api>=1.6.1", + "filelock>=3.15.4", + "packaging>=24.1", + "platformdirs>=4.2.2", + "pluggy>=1.5", + "pyproject-api>=1.7.1", "tomli>=2.0.1; python_version < \"3.11\"", - "virtualenv>=20.25", + "virtualenv>=20.26.3", ] files = [ - {file = "tox-4.15.1-py3-none-any.whl", hash = "sha256:f00a5dc4222b358e69694e47e3da0227ac41253509bca9f45aa8f012053e8d9d"}, - {file = "tox-4.15.1.tar.gz", hash = "sha256:53a092527d65e873e39213ebd4bd027a64623320b6b0326136384213f95b7076"}, + {file = "tox-4.18.0-py3-none-any.whl", hash = "sha256:0a457400cf70615dc0627eb70d293e80cd95d8ce174bb40ac011011f0c03a249"}, + {file = "tox-4.18.0.tar.gz", hash = "sha256:5dfa1cab9f146becd6e351333a82f9e0ade374451630ba65ee54584624c27b58"}, ] [[package]] @@ -1550,6 +1557,7 @@ groups = ["runner"] dependencies = [ "distlib<1,>=0.3.7", "filelock<4,>=3.12.2", + "importlib-metadata>=6.6; python_version < \"3.8\"", "platformdirs<5,>=3.9.1", ] files = [ diff --git a/pyproject.toml b/pyproject.toml index b018767a..fba675fc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,24 +59,24 @@ docs-offline = [ "myst-parser>=3.0.1", "pypandoc-binary>=1.13", "sphinx>=7.1.2", - "furo>=2024.5.6", + "furo>=2024.8.6", ] docs-online = [ - "mkdocs>=1.6.0", - "mkdocs-git-revision-date-localized-plugin>=1.2.6", - "mkdocs-material>=9.5.27", - "mkdocstrings[python]>=0.25.1", - "mike>=2.1.2", + "mkdocs>=1.6.1", + "mkdocs-git-revision-date-localized-plugin>=1.2.7", + "mkdocs-material>=9.5.34", + "mkdocstrings[python]>=0.26.0", + "mike>=2.1.3", ] package = ["build>=1.2.1"] -runner = ["tox>=4.15.1"] +runner = ["tox>=4.18.0"] sast = ["bandit[toml]>=1.7.9"] -testing = ["pytest>=8.2.2"] +testing = ["pytest>=8.3.2"] tooling = [ - "black>=24.4.2", - "ruff>=0.5.0", - "pyright>=1.1.369", - "pytest>=8.2.2", + "black>=24.8.0", + "ruff>=0.6.3", + "pyright>=1.1.378", + "pytest>=8.3.2", "pypandoc-binary>=1.13", # helps with type checking ] diff --git a/src/validators/__init__.py b/src/validators/__init__.py index d5e6de83..5fdcb8ec 100644 --- a/src/validators/__init__.py +++ b/src/validators/__init__.py @@ -109,4 +109,4 @@ "validator", ) -__version__ = "0.33.0" +__version__ = "0.34.0" From fa9b55060cd5037005f3657c797ff2bb9ab06579 Mon Sep 17 00:00:00 2001 From: Matt Seymour Date: Mon, 9 Sep 2024 12:52:29 +0100 Subject: [PATCH 12/47] Update README.md Add the pypi package name and example installation step. At the moment users need to click into doc, then click installation to get the package name and install steps. Lets just add this most common of steps to the readme. --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 3d7f58a4..260532f4 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,12 @@ require defining a schema or form. I wanted to create a simple validation library where validating a simple value does not require defining a form or a schema. +```shell +pip install validators +``` + +Then, + ```python >>> import validators >>> From 0a791b6a8a0a8e448b2de5148a03b356aabb891f Mon Sep 17 00:00:00 2001 From: davidt99 Date: Sun, 15 Sep 2024 14:35:04 +0300 Subject: [PATCH 13/47] fix(domain): accept .onion as a valid TLD --- src/validators/domain.py | 1 + tests/test_domain.py | 1 + 2 files changed, 2 insertions(+) diff --git a/src/validators/domain.py b/src/validators/domain.py index 23ae263d..384ade0f 100644 --- a/src/validators/domain.py +++ b/src/validators/domain.py @@ -16,6 +16,7 @@ class _IanaTLD: _full_cache: Optional[Set[str]] = None # source: https://www.statista.com/statistics/265677 _popular_cache = {"COM", "ORG", "RU", "DE", "NET", "BR", "UK", "JP", "FR", "IT"} + _popular_cache.add("ONION") @classmethod def _retrieve(cls): diff --git a/tests/test_domain.py b/tests/test_domain.py index 6d8e8675..63342f76 100644 --- a/tests/test_domain.py +++ b/tests/test_domain.py @@ -46,6 +46,7 @@ def test_returns_true_on_valid_domain(value: str, rfc_1034: bool, rfc_2782: bool ("_example.com", True, False, True), ("example_.com", True, False, True), ("somerandomexample.xn--fiqs8s", True, False, False), + ("somerandomexample.onion", True, False, False), ], ) def test_returns_true_on_valid_top_level_domain( From 1231f6a69eef08959d34b1178518ee97f82fd3fd Mon Sep 17 00:00:00 2001 From: David Tufik Date: Sun, 6 Oct 2024 22:06:18 +0300 Subject: [PATCH 14/47] fix(url): add hashtag to allowed fragment characters --- src/validators/url.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/validators/url.py b/src/validators/url.py index 5a87b646..30b7b028 100644 --- a/src/validators/url.py +++ b/src/validators/url.py @@ -144,8 +144,9 @@ def _validate_optionals(path: str, query: str, fragment: str, strict_query: bool optional_segments &= True if fragment: # See RFC3986 Section 3.5 Fragment for allowed characters + # Adding "#", see https://github.com/python-validators/validators/issues/403 optional_segments &= bool( - re.fullmatch(r"[0-9a-z?/:@\-._~%!$&'()*+,;=]*", fragment, re.IGNORECASE) + re.fullmatch(r"[0-9a-z?/:@\-._~%!$&'()*+,;=#]*", fragment, re.IGNORECASE) ) return optional_segments From 711487028444795da3054add2f66edb4266b3fe3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Mar 2025 03:33:39 +0000 Subject: [PATCH 15/47] chore(deps): bump jinja2 from 3.1.4 to 3.1.6 in /package Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.4 to 3.1.6. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.1.4...3.1.6) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package/requirements.sphinx.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package/requirements.sphinx.txt b/package/requirements.sphinx.txt index 0237390b..2f11d0e2 100644 --- a/package/requirements.sphinx.txt +++ b/package/requirements.sphinx.txt @@ -112,9 +112,9 @@ imagesize==1.4.1 \ importlib-metadata==8.0.0 \ --hash=sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f \ --hash=sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812 -jinja2==3.1.4 \ - --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ - --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d +jinja2==3.1.6 \ + --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \ + --hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 markdown-it-py==3.0.0 \ --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \ --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb From 640763f65e2e4c1998dcdca4ffa7aecd8ad421f4 Mon Sep 17 00:00:00 2001 From: "a.shilov" Date: Sun, 27 Oct 2024 02:32:01 +0300 Subject: [PATCH 16/47] Add script validators inn.py --- src/validators/inn.py | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/validators/inn.py diff --git a/src/validators/inn.py b/src/validators/inn.py new file mode 100644 index 00000000..327841ec --- /dev/null +++ b/src/validators/inn.py @@ -0,0 +1,8 @@ +"""Inn.""" + +from .utils import validator + + +@validator +def inn(value: str): + pass From 56f02106b0b5ee01b7219dddfc928ff83d79cdcf Mon Sep 17 00:00:00 2001 From: "a.shilov" Date: Sun, 27 Oct 2024 02:58:27 +0300 Subject: [PATCH 17/47] Validators inn company --- src/validators/inn.py | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/validators/inn.py b/src/validators/inn.py index 327841ec..8f04d166 100644 --- a/src/validators/inn.py +++ b/src/validators/inn.py @@ -1,8 +1,29 @@ """Inn.""" -from .utils import validator +# from .utils import validator -@validator +# @validator def inn(value: str): - pass + """Description""" + if not value: + return False + + try: + digits = list(map(int, value)) + # person + if len(digits) == 10: + weight_coefs = [2, 4, 10, 3, 5, 9, 4, 6, 8, 0] + control_number = sum([d * w for d, w in zip(digits, weight_coefs)]) % 11 + return (control_number % 10) == digits[-1] if control_number > 9 else control_number == digits[-1] + # company + elif len(digits) == 12: + pass + # error inn + else: + return False + except ValueError: + return False + +if "__main__" == __name__: + print(inn('5260355389')) From d1ff35bfaba0936de5a85a5b20eb7949021546ed Mon Sep 17 00:00:00 2001 From: "a.shilov" Date: Sun, 27 Oct 2024 03:08:26 +0300 Subject: [PATCH 18/47] weight coefficients from company --- src/validators/inn.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/validators/inn.py b/src/validators/inn.py index 8f04d166..7fbcc2da 100644 --- a/src/validators/inn.py +++ b/src/validators/inn.py @@ -18,6 +18,8 @@ def inn(value: str): return (control_number % 10) == digits[-1] if control_number > 9 else control_number == digits[-1] # company elif len(digits) == 12: + weight_coefs1 = [7, 2, 4, 10, 3, 5, 9, 4, 6, 6, 0, 0] + weight_coefs2 = [3, 7, 2, 4, 10, 3, 5, 9, 4, 0, 0, 0] pass # error inn else: From b4f1cb9bb0fbce54a89bcc253e32a10b6cfe145a Mon Sep 17 00:00:00 2001 From: "a.shilov" Date: Sun, 27 Oct 2024 03:18:03 +0300 Subject: [PATCH 19/47] validators inn person --- src/validators/inn.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/validators/inn.py b/src/validators/inn.py index 7fbcc2da..147175b8 100644 --- a/src/validators/inn.py +++ b/src/validators/inn.py @@ -11,21 +11,20 @@ def inn(value: str): try: digits = list(map(int, value)) - # person + # company if len(digits) == 10: weight_coefs = [2, 4, 10, 3, 5, 9, 4, 6, 8, 0] control_number = sum([d * w for d, w in zip(digits, weight_coefs)]) % 11 return (control_number % 10) == digits[-1] if control_number > 9 else control_number == digits[-1] - # company + # person elif len(digits) == 12: weight_coefs1 = [7, 2, 4, 10, 3, 5, 9, 4, 6, 6, 0, 0] + control_number1 = sum([d * w for d, w in zip(digits, weight_coefs1)]) % 11 weight_coefs2 = [3, 7, 2, 4, 10, 3, 5, 9, 4, 0, 0, 0] - pass - # error inn + control_number2 = sum([d * w for d, w in zip(digits, weight_coefs2)]) % 11 + return ((control_number1 % 10) == digits[-2] if control_number1 > 9 else control_number1 == digits[-2] and + (control_number2 % 10) == digits[-1] if control_number2 > 9 else control_number2 == digits[-1]) else: return False except ValueError: return False - -if "__main__" == __name__: - print(inn('5260355389')) From 5ffcdb380c6213aff3e3396c3fd9ddbc6bf1746d Mon Sep 17 00:00:00 2001 From: "a.shilov" Date: Sun, 27 Oct 2024 03:23:37 +0300 Subject: [PATCH 20/47] update __init__.py --- src/validators/__init__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/validators/__init__.py b/src/validators/__init__.py index 5fdcb8ec..330c41d6 100644 --- a/src/validators/__init__.py +++ b/src/validators/__init__.py @@ -32,6 +32,7 @@ from .url import url from .utils import ValidationError, validator from .uuid import uuid +from .inn import inn __all__ = ( # ... @@ -104,9 +105,11 @@ "url", # ... "uuid", + # ... + "inn", # utils "ValidationError", "validator", ) -__version__ = "0.34.0" +__version__ = "0.35.0" From 011e861206431b02fcb4a7355d2d610f51c0a0f6 Mon Sep 17 00:00:00 2001 From: "a.shilov" Date: Sun, 27 Oct 2024 03:24:40 +0300 Subject: [PATCH 21/47] update .gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d3cb65aa..89371721 100644 --- a/.gitignore +++ b/.gitignore @@ -161,7 +161,7 @@ cython_debug/ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ +.idea/ # VSCode .vscode/ From 014a6bb1aad69e6adc4cbbcb3891fe0ed0dfdeed Mon Sep 17 00:00:00 2001 From: "a.shilov" Date: Sun, 27 Oct 2024 03:27:40 +0300 Subject: [PATCH 22/47] drop comment --- src/validators/inn.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/validators/inn.py b/src/validators/inn.py index 147175b8..06f1aaef 100644 --- a/src/validators/inn.py +++ b/src/validators/inn.py @@ -1,9 +1,9 @@ """Inn.""" -# from .utils import validator +from .utils import validator -# @validator +@validator def inn(value: str): """Description""" if not value: From 1462c7bb1b064b33d8b1c23dca99ef635baa4739 Mon Sep 17 00:00:00 2001 From: "a.shilov" Date: Sun, 27 Oct 2024 12:09:58 +0300 Subject: [PATCH 23/47] Update weights && add description function --- src/validators/inn.py | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/validators/inn.py b/src/validators/inn.py index 06f1aaef..8fff9877 100644 --- a/src/validators/inn.py +++ b/src/validators/inn.py @@ -1,11 +1,29 @@ """Inn.""" -from .utils import validator +# from .utils import validator -@validator -def inn(value: str): - """Description""" +# @validator +def inn(value: str, /): + """Return whether or not given value is a valid russian individual tax number. + + Examples: + >>> inn('7736050003') + # Output: True + >>> inn('781100086042') + # Output: True + + Args: + value: + Individual tax number string to validate + + Returns: + (Literal[True]): If `value` is a valid russian individual tax number. + (ValidationError): If `value` is an invalid russian individual tax number. + + Returns: + + """ if not value: return False @@ -18,10 +36,11 @@ def inn(value: str): return (control_number % 10) == digits[-1] if control_number > 9 else control_number == digits[-1] # person elif len(digits) == 12: - weight_coefs1 = [7, 2, 4, 10, 3, 5, 9, 4, 6, 6, 0, 0] + weight_coefs1 = [7, 2, 4, 10, 3, 5, 9, 4, 6, 8, 0, 0] control_number1 = sum([d * w for d, w in zip(digits, weight_coefs1)]) % 11 - weight_coefs2 = [3, 7, 2, 4, 10, 3, 5, 9, 4, 0, 0, 0] + weight_coefs2 = [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8, 0] control_number2 = sum([d * w for d, w in zip(digits, weight_coefs2)]) % 11 + print(control_number1, control_number2, value) return ((control_number1 % 10) == digits[-2] if control_number1 > 9 else control_number1 == digits[-2] and (control_number2 % 10) == digits[-1] if control_number2 > 9 else control_number2 == digits[-1]) else: From 71c9bbbbc445c8bf814c929d3b807d0bc8d1a75d Mon Sep 17 00:00:00 2001 From: "a.shilov" Date: Sun, 27 Oct 2024 12:12:06 +0300 Subject: [PATCH 24/47] Add link validator algorithm --- src/validators/inn.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/validators/inn.py b/src/validators/inn.py index 8fff9877..edb578e9 100644 --- a/src/validators/inn.py +++ b/src/validators/inn.py @@ -7,6 +7,10 @@ def inn(value: str, /): """Return whether or not given value is a valid russian individual tax number. + This validator is algorithm [1]. + + [1]: https://ru.wikipedia.org/wiki/Идентификационный_номер_налогоплательщика + Examples: >>> inn('7736050003') # Output: True From 874f0a9c126dfbcfa5a37bc669bb878b5a94241f Mon Sep 17 00:00:00 2001 From: "a.shilov" Date: Sun, 27 Oct 2024 12:12:30 +0300 Subject: [PATCH 25/47] Add decorator validator --- src/validators/inn.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/validators/inn.py b/src/validators/inn.py index edb578e9..17ea89c5 100644 --- a/src/validators/inn.py +++ b/src/validators/inn.py @@ -1,9 +1,9 @@ """Inn.""" -# from .utils import validator +from .utils import validator -# @validator +@validator def inn(value: str, /): """Return whether or not given value is a valid russian individual tax number. From 2398003f67891a387f36573a42add0c37ba5ecfd Mon Sep 17 00:00:00 2001 From: "a.shilov" Date: Tue, 29 Oct 2024 21:47:58 +0300 Subject: [PATCH 26/47] Moved all files to the i18n directory. --- src/__init__.py | 0 src/validators/__init__.py | 5 +---- src/validators/i18n/__init__.py | 3 +++ src/validators/{ => i18n}/inn.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 src/__init__.py rename src/validators/{ => i18n}/inn.py (97%) diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/validators/__init__.py b/src/validators/__init__.py index 330c41d6..5fdcb8ec 100644 --- a/src/validators/__init__.py +++ b/src/validators/__init__.py @@ -32,7 +32,6 @@ from .url import url from .utils import ValidationError, validator from .uuid import uuid -from .inn import inn __all__ = ( # ... @@ -105,11 +104,9 @@ "url", # ... "uuid", - # ... - "inn", # utils "ValidationError", "validator", ) -__version__ = "0.35.0" +__version__ = "0.34.0" diff --git a/src/validators/i18n/__init__.py b/src/validators/i18n/__init__.py index 58385e0b..8b89ace3 100644 --- a/src/validators/i18n/__init__.py +++ b/src/validators/i18n/__init__.py @@ -5,6 +5,7 @@ from .fi import fi_business_id, fi_ssn from .fr import fr_department, fr_ssn from .ind import ind_aadhar, ind_pan +from .inn import inn as ru_inn __all__ = ( "fi_business_id", @@ -17,4 +18,6 @@ "fr_ssn", "ind_aadhar", "ind_pan", + # Russian Individual Tax Number + "ru_inn" ) diff --git a/src/validators/inn.py b/src/validators/i18n/inn.py similarity index 97% rename from src/validators/inn.py rename to src/validators/i18n/inn.py index 17ea89c5..f5c28bc5 100644 --- a/src/validators/inn.py +++ b/src/validators/i18n/inn.py @@ -1,6 +1,6 @@ """Inn.""" -from .utils import validator +from src.validators.utils import validator @validator From 6bf90e2b491b3802185c2c9bab59eb262763ec1f Mon Sep 17 00:00:00 2001 From: "a.shilov" Date: Tue, 29 Oct 2024 22:06:22 +0300 Subject: [PATCH 27/47] add tests --- tests/i18n/test_inn.py | 48 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 tests/i18n/test_inn.py diff --git a/tests/i18n/test_inn.py b/tests/i18n/test_inn.py new file mode 100644 index 00000000..244aad2d --- /dev/null +++ b/tests/i18n/test_inn.py @@ -0,0 +1,48 @@ +"""Test i18n/inn.""" + +# external +import pytest + +# local +from src.validators import ValidationError +from src.validators.i18n import ru_inn + + +@pytest.mark.parametrize( + ("value",), + [ + ("2222058686",), + ("7709439560",), + ("5003052454",), + ("7730257499",), + ("3664016814",), + ("026504247480",), + ("780103209220",), + ("7707012148",), + ("140700989885",), + ("774334078053",), + ], +) +def test_returns_true_on_valid_ru_inn(value: str): + """Test returns true on valid russian individual tax number""" + assert ru_inn(value) + + +@pytest.mark.parametrize( + ("value",), + [ + ("2222058687",), + ("7709439561",), + ("5003052453",), + ("7730257490",), + ("3664016815",), + ("026504247481",), + ("780103209222",), + ("7707012149",), + ("140700989886",), + ("774334078054",), + ], +) +def test_returns_false_on_valid_ru_inn(value: str): + """Test returns true on valid russian individual tax number""" + assert isinstance(ru_inn(value), ValidationError) From e50832ab93795e23e25054c760cf154b285703a4 Mon Sep 17 00:00:00 2001 From: "a.shilov" Date: Sun, 3 Nov 2024 22:45:43 +0300 Subject: [PATCH 28/47] rename function `inn` -> `ru_inn` --- src/validators/i18n/__init__.py | 2 +- src/validators/i18n/{inn.py => ru_inn.py} | 2 +- tests/i18n/{test_inn.py => test_ru_inn.py} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename src/validators/i18n/{inn.py => ru_inn.py} (98%) rename tests/i18n/{test_inn.py => test_ru_inn.py} (100%) diff --git a/src/validators/i18n/__init__.py b/src/validators/i18n/__init__.py index 8b89ace3..1033139d 100644 --- a/src/validators/i18n/__init__.py +++ b/src/validators/i18n/__init__.py @@ -5,7 +5,7 @@ from .fi import fi_business_id, fi_ssn from .fr import fr_department, fr_ssn from .ind import ind_aadhar, ind_pan -from .inn import inn as ru_inn +from .ru_inn import ru_inn __all__ = ( "fi_business_id", diff --git a/src/validators/i18n/inn.py b/src/validators/i18n/ru_inn.py similarity index 98% rename from src/validators/i18n/inn.py rename to src/validators/i18n/ru_inn.py index f5c28bc5..ab753ee3 100644 --- a/src/validators/i18n/inn.py +++ b/src/validators/i18n/ru_inn.py @@ -4,7 +4,7 @@ @validator -def inn(value: str, /): +def ru_inn(value: str, /): """Return whether or not given value is a valid russian individual tax number. This validator is algorithm [1]. diff --git a/tests/i18n/test_inn.py b/tests/i18n/test_ru_inn.py similarity index 100% rename from tests/i18n/test_inn.py rename to tests/i18n/test_ru_inn.py From 7722459b52562427634af0166398158fcff24849 Mon Sep 17 00:00:00 2001 From: "a.shilov" Date: Thu, 27 Mar 2025 23:01:10 +0300 Subject: [PATCH 29/47] add function description and fix validators imports --- src/validators/i18n/__init__.py | 3 +- src/validators/i18n/{ru_inn.py => ru.py} | 36 ++++++++++++----------- tests/i18n/{test_ru_inn.py => test_ru.py} | 4 +-- 3 files changed, 22 insertions(+), 21 deletions(-) rename src/validators/i18n/{ru_inn.py => ru.py} (55%) rename tests/i18n/{test_ru_inn.py => test_ru.py} (92%) diff --git a/src/validators/i18n/__init__.py b/src/validators/i18n/__init__.py index 1033139d..cb212ac1 100644 --- a/src/validators/i18n/__init__.py +++ b/src/validators/i18n/__init__.py @@ -5,7 +5,7 @@ from .fi import fi_business_id, fi_ssn from .fr import fr_department, fr_ssn from .ind import ind_aadhar, ind_pan -from .ru_inn import ru_inn +from .ru import ru_inn __all__ = ( "fi_business_id", @@ -18,6 +18,5 @@ "fr_ssn", "ind_aadhar", "ind_pan", - # Russian Individual Tax Number "ru_inn" ) diff --git a/src/validators/i18n/ru_inn.py b/src/validators/i18n/ru.py similarity index 55% rename from src/validators/i18n/ru_inn.py rename to src/validators/i18n/ru.py index ab753ee3..f51be3d1 100644 --- a/src/validators/i18n/ru_inn.py +++ b/src/validators/i18n/ru.py @@ -1,32 +1,34 @@ -"""Inn.""" +"""Russia INN.""" -from src.validators.utils import validator +from validators.utils import validator @validator -def ru_inn(value: str, /): - """Return whether or not given value is a valid russian individual tax number. +def ru_inn(value: str): + """Validate a Russian INN (Taxpayer Identification Number). - This validator is algorithm [1]. - - [1]: https://ru.wikipedia.org/wiki/Идентификационный_номер_налогоплательщика + The INN can be either 10 digits (for companies) or 12 digits (for individuals). + The function checks both the length and the control digits according to Russian tax rules. Examples: - >>> inn('7736050003') - # Output: True - >>> inn('781100086042') - # Output: True + >>> ru_inn('500100732259') # Valid 12-digit INN + True + >>> ru_inn('7830002293') # Valid 10-digit INN + True + >>> ru_inn('1234567890') # Invalid INN + ValidationFailure(func=ru_inn, args={'value': '1234567890'}) Args: - value: - Individual tax number string to validate - - Returns: - (Literal[True]): If `value` is a valid russian individual tax number. - (ValidationError): If `value` is an invalid russian individual tax number. + value: Russian INN string to validate. Can contain only digits. Returns: + (Literal[True]): If `value` is a valid Russian INN. + (ValidationError): If `value` is an invalid Russian INN. + Note: + The validation follows the official algorithm: + - For 10-digit INN: checks 10th control digit + - For 12-digit INN: checks both 11th and 12th control digits """ if not value: return False diff --git a/tests/i18n/test_ru_inn.py b/tests/i18n/test_ru.py similarity index 92% rename from tests/i18n/test_ru_inn.py rename to tests/i18n/test_ru.py index 244aad2d..7838144e 100644 --- a/tests/i18n/test_ru_inn.py +++ b/tests/i18n/test_ru.py @@ -4,8 +4,8 @@ import pytest # local -from src.validators import ValidationError -from src.validators.i18n import ru_inn +from validators import ValidationError +from validators.i18n.ru import ru_inn @pytest.mark.parametrize( From ad2e2c5bb4e94ff5798b51a9b28a26fa64684ed0 Mon Sep 17 00:00:00 2001 From: Yozachar <38415384+yozachar@users.noreply.github.com> Date: Sat, 29 Mar 2025 01:49:02 +0530 Subject: [PATCH 30/47] chore: linting & formatting --- package/export/__main__.py | 3 ++- src/__init__.py | 1 + src/validators/domain.py | 1 - src/validators/i18n/__init__.py | 2 +- src/validators/i18n/fi.py | 4 +--- src/validators/i18n/ru.py | 15 ++++++++++++--- src/validators/uri.py | 18 ++++++++++++++---- src/validators/url.py | 15 ++++++++++++--- tests/i18n/test_ru.py | 4 ++-- tests/test_url.py | 2 +- 10 files changed, 46 insertions(+), 19 deletions(-) diff --git a/package/export/__main__.py b/package/export/__main__.py index 6f36808e..231b0007 100644 --- a/package/export/__main__.py +++ b/package/export/__main__.py @@ -66,7 +66,8 @@ def _gen_rst_docs(source: Path, refs_path: Path, only_web: bool = False, only_ma with open(source / "docs/index.rst", "wt") as idx_f: idx_f.write( convert_file(source_file=source / "docs/index.md", format="md", to="rst").replace( - "\r\n", "\n" # remove carriage return in windows + "\r\n", + "\n", # remove carriage return in windows ) + "\n\n.. toctree::" + "\n :hidden:" diff --git a/src/__init__.py b/src/__init__.py index e69de29b..f43d946a 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -0,0 +1 @@ +"""Validators.""" diff --git a/src/validators/domain.py b/src/validators/domain.py index 384ade0f..7b906b23 100644 --- a/src/validators/domain.py +++ b/src/validators/domain.py @@ -80,7 +80,6 @@ def domain( return False try: - service_record = r"_" if rfc_2782 else "" trailing_dot = r"\.?$" if rfc_1034 else r"$" diff --git a/src/validators/i18n/__init__.py b/src/validators/i18n/__init__.py index cb212ac1..0a5726f7 100644 --- a/src/validators/i18n/__init__.py +++ b/src/validators/i18n/__init__.py @@ -18,5 +18,5 @@ "fr_ssn", "ind_aadhar", "ind_pan", - "ru_inn" + "ru_inn", ) diff --git a/src/validators/i18n/fi.py b/src/validators/i18n/fi.py index 243ee08f..04b35ff3 100644 --- a/src/validators/i18n/fi.py +++ b/src/validators/i18n/fi.py @@ -24,9 +24,7 @@ def _ssn_pattern(ssn_check_marks: str): (\d{{2}})) [ABCDEFYXWVU+-] (?P(\d{{3}})) - (?P[{check_marks}])$""".format( - check_marks=ssn_check_marks - ), + (?P[{check_marks}])$""".format(check_marks=ssn_check_marks), re.VERBOSE, ) diff --git a/src/validators/i18n/ru.py b/src/validators/i18n/ru.py index f51be3d1..ed1ecc5d 100644 --- a/src/validators/i18n/ru.py +++ b/src/validators/i18n/ru.py @@ -39,7 +39,11 @@ def ru_inn(value: str): if len(digits) == 10: weight_coefs = [2, 4, 10, 3, 5, 9, 4, 6, 8, 0] control_number = sum([d * w for d, w in zip(digits, weight_coefs)]) % 11 - return (control_number % 10) == digits[-1] if control_number > 9 else control_number == digits[-1] + return ( + (control_number % 10) == digits[-1] + if control_number > 9 + else control_number == digits[-1] + ) # person elif len(digits) == 12: weight_coefs1 = [7, 2, 4, 10, 3, 5, 9, 4, 6, 8, 0, 0] @@ -47,8 +51,13 @@ def ru_inn(value: str): weight_coefs2 = [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8, 0] control_number2 = sum([d * w for d, w in zip(digits, weight_coefs2)]) % 11 print(control_number1, control_number2, value) - return ((control_number1 % 10) == digits[-2] if control_number1 > 9 else control_number1 == digits[-2] and - (control_number2 % 10) == digits[-1] if control_number2 > 9 else control_number2 == digits[-1]) + return ( + (control_number1 % 10) == digits[-2] + if control_number1 > 9 + else control_number1 == digits[-2] and (control_number2 % 10) == digits[-1] + if control_number2 > 9 + else control_number2 == digits[-1] + ) else: return False except ValueError: diff --git a/src/validators/uri.py b/src/validators/uri.py index 03b64948..14bab407 100644 --- a/src/validators/uri.py +++ b/src/validators/uri.py @@ -47,10 +47,20 @@ def uri(value: str, /): # url if any( # fmt: off - value.startswith(item) for item in { - "ftp", "ftps", "git", "http", "https", - "irc", "rtmp", "rtmps", "rtsp", "sftp", - "ssh", "telnet", + value.startswith(item) + for item in { + "ftp", + "ftps", + "git", + "http", + "https", + "irc", + "rtmp", + "rtmps", + "rtsp", + "sftp", + "ssh", + "telnet", } # fmt: on ): diff --git a/src/validators/url.py b/src/validators/url.py index 30b7b028..fe1c2e12 100644 --- a/src/validators/url.py +++ b/src/validators/url.py @@ -46,9 +46,18 @@ def _validate_scheme(value: str): value # fmt: off in { - "ftp", "ftps", "git", "http", "https", - "irc", "rtmp", "rtmps", "rtsp", "sftp", - "ssh", "telnet", + "ftp", + "ftps", + "git", + "http", + "https", + "irc", + "rtmp", + "rtmps", + "rtsp", + "sftp", + "ssh", + "telnet", } # fmt: on if value diff --git a/tests/i18n/test_ru.py b/tests/i18n/test_ru.py index 7838144e..1f111087 100644 --- a/tests/i18n/test_ru.py +++ b/tests/i18n/test_ru.py @@ -24,7 +24,7 @@ ], ) def test_returns_true_on_valid_ru_inn(value: str): - """Test returns true on valid russian individual tax number""" + """Test returns true on valid russian individual tax number.""" assert ru_inn(value) @@ -44,5 +44,5 @@ def test_returns_true_on_valid_ru_inn(value: str): ], ) def test_returns_false_on_valid_ru_inn(value: str): - """Test returns true on valid russian individual tax number""" + """Test returns true on valid russian individual tax number.""" assert isinstance(ru_inn(value), ValidationError) diff --git a/tests/test_url.py b/tests/test_url.py index fd846da0..2001a1d5 100644 --- a/tests/test_url.py +++ b/tests/test_url.py @@ -156,7 +156,7 @@ def test_returns_true_on_valid_private_url(value: str, private: Optional[bool]): ":// should fail", "http://foo.bar/foo(bar)baz quux", "http://-error-.invalid/", - "http://www.\uFFFD.ch", + "http://www.\ufffd.ch", "http://-a.b.co", "http://a.b-.co", "http://1.1.1.1.1", From 9dac863b452253f3ae1b7fd3370e509c52c46b85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kriszti=C3=A1n=20Fekete?= <1246751+e3krisztian@users.noreply.github.com> Date: Fri, 28 Mar 2025 21:35:20 +0100 Subject: [PATCH 31/47] feat: allow custom URL scheme validation (#409) Enhances `validators.url` to allow - restricting the allowed schemes (e.g. to accept only https, and nothing else) - relaxing the allowed schemes to also accept less known schemes (e.g. ws, wss, ldap, ...) --- src/validators/url.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/validators/url.py b/src/validators/url.py index fe1c2e12..259bef0f 100644 --- a/src/validators/url.py +++ b/src/validators/url.py @@ -3,7 +3,7 @@ # standard from functools import lru_cache import re -from typing import Optional +from typing import Callable, Optional from urllib.parse import parse_qs, unquote, urlsplit # local @@ -174,6 +174,7 @@ def url( private: Optional[bool] = None, # only for ip-addresses rfc_1034: bool = False, rfc_2782: bool = False, + validate_scheme: Callable[[str], bool] = _validate_scheme, ): r"""Return whether or not given value is a valid URL. @@ -222,6 +223,8 @@ def url( rfc_2782: Domain/Host name is of type service record. Ref: [RFC 2782](https://www.rfc-editor.org/rfc/rfc2782). + validate_scheme: + Function that validates URL scheme. Returns: (Literal[True]): If `value` is a valid url. @@ -238,7 +241,7 @@ def url( return False return ( - _validate_scheme(scheme) + validate_scheme(scheme) and _validate_netloc( netloc, skip_ipv6_addr, From 25fcef05c293def421fd3f6714403a54fce993cf Mon Sep 17 00:00:00 2001 From: Chris Wisdo <5473291+cwisdo@users.noreply.github.com> Date: Fri, 28 Mar 2025 16:52:14 -0400 Subject: [PATCH 32/47] Fix email regex issue 140 (#411) --- src/validators/email.py | 10 +++++++--- tests/test_email.py | 3 +++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/validators/email.py b/src/validators/email.py index eff09bd3..bc17d772 100644 --- a/src/validators/email.py +++ b/src/validators/email.py @@ -85,11 +85,15 @@ def email( ) if re.match( # extended latin - r"(^[\u0100-\u017F\u0180-\u024F]" + r"(^[\u0100-\u017F\u0180-\u024F\u00A0-\u00FF]" # dot-atom - + r"|[-!#$%&'*+/=?^_`{}|~0-9a-z]+(\.[-!#$%&'*+/=?^_`{}|~0-9a-z]+)*$" + + r"|[\u0100-\u017F\u0180-\u024F\u00A0-\u00FF0-9a-z!#$%&'*+/=?^_`{}|~\-]+" + + r"(\.[\u0100-\u017F\u0180-\u024F\u00A0-\u00FF0-9a-z!#$%&'*+/=?^_`{}|~\-]+)*$" # quoted-string - + r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\011.])*"$)', + + r'|^"(' + + r"[\u0100-\u017F\u0180-\u024F\u00A0-\u00FF\001-\010\013\014\016-\037" + + r"!#-\[\]-\177]|\\[\011.]" + + r')*")$', username_part, re.IGNORECASE, ) diff --git a/tests/test_email.py b/tests/test_email.py index 029c45e7..56c95f37 100644 --- a/tests/test_email.py +++ b/tests/test_email.py @@ -48,6 +48,9 @@ def test_returns_true_on_valid_email(value: str): ('"test@test"@example.com',), # Quoted-string format (CR not allowed) ('"\\\012"@here.com',), + # Non-quoted space/semicolon not allowed + ("stephen smith@example.com",), + ("stephen;smith@example.com",), ], ) def test_returns_failed_validation_on_invalid_email(value: str): From d6241fc31f6b46bf81283c6ab3cae07c370fc1f6 Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 29 Mar 2025 06:16:55 +0100 Subject: [PATCH 33/47] fix(uri): remove "mailto:" prefix manually (#418) * the use of `lstrip()` here was a bit too aggressive * `removeprefix()` is only available with python 3.9+ --- src/validators/uri.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/validators/uri.py b/src/validators/uri.py index 14bab407..6699159f 100644 --- a/src/validators/uri.py +++ b/src/validators/uri.py @@ -68,7 +68,7 @@ def uri(value: str, /): # email if value.startswith("mailto:"): - return email(value.lstrip("mailto:")) + return email(value[len("mailto:"):]) # file if value.startswith("file:"): From f7742c55b680036116a7f61e140476ffd4774ccb Mon Sep 17 00:00:00 2001 From: Aleksandr Shilov Date: Thu, 3 Apr 2025 05:18:20 +0300 Subject: [PATCH 34/47] Refactor API: remove print from ru_inn, update description, and expose via __init__ (#419) * fix(api): remove print function from ru_inn method * feat: add ru_inn method to __init__ * docs(ru_inn): update description from "Russia INN." to "Russia." --- src/validators/__init__.py | 2 ++ src/validators/i18n/ru.py | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/validators/__init__.py b/src/validators/__init__.py index 5fdcb8ec..3aceb37c 100644 --- a/src/validators/__init__.py +++ b/src/validators/__init__.py @@ -23,6 +23,7 @@ fr_ssn, ind_aadhar, ind_pan, + ru_inn ) from .iban import iban from .ip_address import ipv4, ipv6 @@ -89,6 +90,7 @@ "fr_ssn", "ind_aadhar", "ind_pan", + "ru_inn", # ... "iban", # ip_addresses diff --git a/src/validators/i18n/ru.py b/src/validators/i18n/ru.py index ed1ecc5d..b3eb02be 100644 --- a/src/validators/i18n/ru.py +++ b/src/validators/i18n/ru.py @@ -1,4 +1,4 @@ -"""Russia INN.""" +"""Russia.""" from validators.utils import validator @@ -50,7 +50,6 @@ def ru_inn(value: str): control_number1 = sum([d * w for d, w in zip(digits, weight_coefs1)]) % 11 weight_coefs2 = [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8, 0] control_number2 = sum([d * w for d, w in zip(digits, weight_coefs2)]) % 11 - print(control_number1, control_number2, value) return ( (control_number1 % 10) == digits[-2] if control_number1 > 9 From b2510d1c5f7ef81cdf9fa90d2548ebd826e4e734 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20D=C3=B6rrer?= Date: Sat, 26 Apr 2025 18:13:55 +0200 Subject: [PATCH 35/47] feat: adds `doctest` (#417) * running `doctest` failes Fixes python-validators/validators#416 * check docstring examples with pytest * changed line-length due doctest output - bsc_address.py:20:101: E501 Line too long (103 > 100) - all tox env passed * chore: ignore line lenght in specific docs * specifing testpath for pytest * fix: lint rule name * chore: update pytest in requirements file * chore: install module before pytest * fix: ru_inn docttest --------- Co-authored-by: Yozachar <38415384+yozachar@users.noreply.github.com> --- .github/workflows/pycqa.yaml | 4 ++- package/requirements.testing.txt | 6 ++-- pyproject.toml | 4 +++ src/validators/_extremes.py | 28 ++++++++-------- src/validators/between.py | 8 ++--- src/validators/card.py | 32 +++++++++---------- src/validators/country.py | 18 +++++------ src/validators/cron.py | 4 +-- .../crypto_addresses/bsc_address.py | 6 ++-- .../crypto_addresses/btc_address.py | 4 +-- .../crypto_addresses/eth_address.py | 6 ++-- .../crypto_addresses/trx_address.py | 4 +-- src/validators/domain.py | 6 ++-- src/validators/email.py | 4 +-- src/validators/encoding.py | 16 +++++----- src/validators/finance.py | 8 ++--- src/validators/hashes.py | 24 +++++++------- src/validators/hostname.py | 20 ++++++------ src/validators/i18n/es.py | 16 +++++----- src/validators/i18n/fi.py | 8 ++--- src/validators/i18n/fr.py | 22 ++++++------- src/validators/i18n/ind.py | 4 +-- src/validators/i18n/ru.py | 2 +- src/validators/iban.py | 4 +-- src/validators/ip_address.py | 12 +++---- src/validators/length.py | 6 ++-- src/validators/mac_address.py | 4 +-- src/validators/slug.py | 4 +-- src/validators/uri.py | 4 +-- src/validators/url.py | 8 ++--- src/validators/utils.py | 4 +-- src/validators/uuid.py | 4 +-- 32 files changed, 155 insertions(+), 149 deletions(-) diff --git a/.github/workflows/pycqa.yaml b/.github/workflows/pycqa.yaml index 13894da0..f5831072 100644 --- a/.github/workflows/pycqa.yaml +++ b/.github/workflows/pycqa.yaml @@ -48,6 +48,8 @@ jobs: cache: "pip" # testing - name: Install 'testing' dependencies - run: pip install -r package/requirements.testing.txt + run: | + pip install -r package/requirements.testing.txt + pip install . - name: Testing run: pytest . diff --git a/package/requirements.testing.txt b/package/requirements.testing.txt index c763dc12..078d6822 100644 --- a/package/requirements.testing.txt +++ b/package/requirements.testing.txt @@ -41,9 +41,9 @@ pycryptodome==3.20.0 \ --hash=sha256:f35d6cee81fa145333137009d9c8ba90951d7d77b67c79cbe5f03c7eb74d8fe2 \ --hash=sha256:f47888542a0633baff535a04726948e876bf1ed880fddb7c10a736fa99146ab3 \ --hash=sha256:fb3b87461fa35afa19c971b0a2b7456a7b1db7b4eba9a8424666104925b78128 -pytest==8.2.2 \ - --hash=sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343 \ - --hash=sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977 +pytest==8.3.2 \ + --hash=sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5 \ + --hash=sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce tomli==2.0.1; python_version < "3.11" \ --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f diff --git a/pyproject.toml b/pyproject.toml index fba675fc..b40020bb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -126,7 +126,11 @@ pythonPlatform = "All" typeCheckingMode = "strict" [tool.pytest.ini_options] +minversion = "6.0" pythonpath = ["src"] +testpaths = "tests" +addopts = ["--doctest-modules"] + [tool.ruff] lint.select = [ diff --git a/src/validators/_extremes.py b/src/validators/_extremes.py index a7ff806d..fda93f98 100644 --- a/src/validators/_extremes.py +++ b/src/validators/_extremes.py @@ -12,13 +12,13 @@ class AbsMax: Inspired by https://pypi.python.org/pypi/Extremes. Examples: - >>> from sys import maxint - >>> AbsMax > AbsMin - # Output: True - >>> AbsMax > maxint - # Output: True - >>> AbsMax > 99999999999999999 - # Output: True + >>> from sys import maxsize + >>> AbsMax() > AbsMin() + True + >>> AbsMax() > maxsize + True + >>> AbsMax() > 99999999999999999 + True """ def __ge__(self, other: Any): @@ -33,13 +33,13 @@ class AbsMin: Inspired by https://pypi.python.org/pypi/Extremes. Examples: - >>> from sys import maxint - >>> AbsMin < -maxint - # Output: True - >>> AbsMin < None - # Output: True - >>> AbsMin < '' - # Output: True + >>> from sys import maxsize + >>> AbsMin() < -maxsize + True + >>> AbsMin() < None + True + >>> AbsMin() < '' + True """ def __le__(self, other: Any): diff --git a/src/validators/between.py b/src/validators/between.py index 6a65d5c9..14ef4e04 100644 --- a/src/validators/between.py +++ b/src/validators/between.py @@ -29,16 +29,16 @@ def between( Examples: >>> from datetime import datetime >>> between(5, min_val=2) - # Output: True + True >>> between(13.2, min_val=13, max_val=14) - # Output: True + True >>> between(500, max_val=400) - # Output: ValidationError(func=between, args=...) + ValidationError(func=between, args={'value': 500, 'max_val': 400}) >>> between( ... datetime(2000, 11, 11), ... min_val=datetime(1999, 11, 11) ... ) - # Output: True + True Args: value: diff --git a/src/validators/card.py b/src/validators/card.py index 7801eb6b..d95643cd 100644 --- a/src/validators/card.py +++ b/src/validators/card.py @@ -17,9 +17,9 @@ def card_number(value: str, /): Examples: >>> card_number('4242424242424242') - # Output: True + True >>> card_number('4242424242424241') - # Output: ValidationError(func=card_number, args={'value': '4242424242424241'}) + ValidationError(func=card_number, args={'value': '4242424242424241'}) Args: value: @@ -46,9 +46,9 @@ def visa(value: str, /): Examples: >>> visa('4242424242424242') - # Output: True + True >>> visa('2223003122003222') - # Output: ValidationError(func=visa, args={'value': '2223003122003222'}) + ValidationError(func=visa, args={'value': '2223003122003222'}) Args: value: @@ -68,9 +68,9 @@ def mastercard(value: str, /): Examples: >>> mastercard('5555555555554444') - # Output: True + True >>> mastercard('4242424242424242') - # Output: ValidationError(func=mastercard, args={'value': '4242424242424242'}) + ValidationError(func=mastercard, args={'value': '4242424242424242'}) Args: value: @@ -90,9 +90,9 @@ def amex(value: str, /): Examples: >>> amex('378282246310005') - # Output: True + True >>> amex('4242424242424242') - # Output: ValidationError(func=amex, args={'value': '4242424242424242'}) + ValidationError(func=amex, args={'value': '4242424242424242'}) Args: value: @@ -112,9 +112,9 @@ def unionpay(value: str, /): Examples: >>> unionpay('6200000000000005') - # Output: True + True >>> unionpay('4242424242424242') - # Output: ValidationError(func=unionpay, args={'value': '4242424242424242'}) + ValidationError(func=unionpay, args={'value': '4242424242424242'}) Args: value: @@ -134,9 +134,9 @@ def diners(value: str, /): Examples: >>> diners('3056930009020004') - # Output: True + True >>> diners('4242424242424242') - # Output: ValidationError(func=diners, args={'value': '4242424242424242'}) + ValidationError(func=diners, args={'value': '4242424242424242'}) Args: value: @@ -156,9 +156,9 @@ def jcb(value: str, /): Examples: >>> jcb('3566002020360505') - # Output: True + True >>> jcb('4242424242424242') - # Output: ValidationError(func=jcb, args={'value': '4242424242424242'}) + ValidationError(func=jcb, args={'value': '4242424242424242'}) Args: value: @@ -178,9 +178,9 @@ def discover(value: str, /): Examples: >>> discover('6011111111111117') - # Output: True + True >>> discover('4242424242424242') - # Output: ValidationError(func=discover, args={'value': '4242424242424242'}) + ValidationError(func=discover, args={'value': '4242424242424242'}) Args: value: diff --git a/src/validators/country.py b/src/validators/country.py index d04b0b06..6cd83ee1 100644 --- a/src/validators/country.py +++ b/src/validators/country.py @@ -245,9 +245,9 @@ def calling_code(value: str, /): Examples: >>> calling_code('+91') - # Output: True + True >>> calling_code('-31') - # Output: ValidationError(func=calling_code, args={'value': '-31'}) + ValidationError(func=calling_code, args={'value': '-31'}) Args: value: @@ -273,15 +273,15 @@ def country_code(value: str, /, *, iso_format: str = "auto", ignore_case: bool = Examples: >>> country_code('GB', iso_format='alpha3') - # Output: False + ValidationError(func=country_code, args={'value': 'GB', 'iso_format': 'alpha3'}) >>> country_code('USA') - # Output: True + True >>> country_code('840', iso_format='numeric') - # Output: True + True >>> country_code('iN', iso_format='alpha2') - # Output: False + ValidationError(func=country_code, args={'value': 'iN', 'iso_format': 'alpha2'}) >>> country_code('ZWE', iso_format='alpha3') - # Output: True + True Args: value: @@ -327,9 +327,9 @@ def currency(value: str, /, *, skip_symbols: bool = True, ignore_case: bool = Fa Examples: >>> currency('USD') - # Output: True + True >>> currency('ZWX') - # Output: ValidationError(func=currency, args={'value': 'ZWX'}) + ValidationError(func=currency, args={'value': 'ZWX'}) Args: value: diff --git a/src/validators/cron.py b/src/validators/cron.py index 58976510..a8449b6a 100644 --- a/src/validators/cron.py +++ b/src/validators/cron.py @@ -44,9 +44,9 @@ def cron(value: str, /): Examples: >>> cron('*/5 * * * *') - # Output: True + True >>> cron('30-20 * * * *') - # Output: ValidationError(func=cron, ...) + ValidationError(func=cron, args={'value': '30-20 * * * *'}) Args: value: diff --git a/src/validators/crypto_addresses/bsc_address.py b/src/validators/crypto_addresses/bsc_address.py index c3a24250..cabefc20 100644 --- a/src/validators/crypto_addresses/bsc_address.py +++ b/src/validators/crypto_addresses/bsc_address.py @@ -15,9 +15,9 @@ def bsc_address(value: str, /): Examples: >>> bsc_address('0x4e5acf9684652BEa56F2f01b7101a225Ee33d23f') - # Output: True + True >>> bsc_address('0x4g5acf9684652BEa56F2f01b7101a225Eh33d23z') - # Output: ValidationError(func=bsc_address, args=...) + ValidationError(func=bsc_address, args={'value': '0x4g5acf9684652BEa56F2f01b7101a225Eh33d23z'}) Args: value: @@ -26,7 +26,7 @@ def bsc_address(value: str, /): Returns: (Literal[True]): If `value` is a valid bsc address. (ValidationError): If `value` is an invalid bsc address. - """ + """ # noqa: E501 if not value: return False diff --git a/src/validators/crypto_addresses/btc_address.py b/src/validators/crypto_addresses/btc_address.py index 8c4aa453..ff401114 100644 --- a/src/validators/crypto_addresses/btc_address.py +++ b/src/validators/crypto_addresses/btc_address.py @@ -33,9 +33,9 @@ def btc_address(value: str, /): Examples: >>> btc_address('3Cwgr2g7vsi1bXDUkpEnVoRLA9w4FZfC69') - # Output: True + True >>> btc_address('1BvBMsEYstWetqTFn5Au4m4GFg7xJaNVN2') - # Output: ValidationError(func=btc_address, args=...) + ValidationError(func=btc_address, args={'value': '1BvBMsEYstWetqTFn5Au4m4GFg7xJaNVN2'}) Args: value: diff --git a/src/validators/crypto_addresses/eth_address.py b/src/validators/crypto_addresses/eth_address.py index 08bd0852..84861861 100644 --- a/src/validators/crypto_addresses/eth_address.py +++ b/src/validators/crypto_addresses/eth_address.py @@ -38,9 +38,9 @@ def eth_address(value: str, /): Examples: >>> eth_address('0x9cc14ba4f9f68ca159ea4ebf2c292a808aaeb598') - # Output: True + True >>> eth_address('0x8Ba1f109551bD432803012645Ac136ddd64DBa72') - # Output: ValidationError(func=eth_address, args=...) + ValidationError(func=eth_address, args={'value': '0x8Ba1f109551bD432803012645Ac136ddd64DBa72'}) Args: value: @@ -49,7 +49,7 @@ def eth_address(value: str, /): Returns: (Literal[True]): If `value` is a valid ethereum address. (ValidationError): If `value` is an invalid ethereum address. - """ + """ # noqa: E501 if not _keccak_flag: raise ImportError( "Do `pip install validators[crypto-eth-addresses]` to perform `eth_address` validation." diff --git a/src/validators/crypto_addresses/trx_address.py b/src/validators/crypto_addresses/trx_address.py index 3b021fbc..3ed9feb9 100644 --- a/src/validators/crypto_addresses/trx_address.py +++ b/src/validators/crypto_addresses/trx_address.py @@ -42,9 +42,9 @@ def trx_address(value: str, /): Examples: >>> trx_address('TLjfbTbpZYDQ4EoA4N5CLNgGjfbF8ZWz38') - # Output: True + True >>> trx_address('TR2G7Rm4vFqF8EpY4U5xdLdQ7XgJ2U8Vd') - # Output: ValidationError(func=trx_address, args=...) + ValidationError(func=trx_address, args={'value': 'TR2G7Rm4vFqF8EpY4U5xdLdQ7XgJ2U8Vd'}) Args: value: diff --git a/src/validators/domain.py b/src/validators/domain.py index 7b906b23..8109573c 100644 --- a/src/validators/domain.py +++ b/src/validators/domain.py @@ -45,12 +45,12 @@ def domain( Examples: >>> domain('example.com') - # Output: True + True >>> domain('example.com/') - # Output: ValidationError(func=domain, ...) + ValidationError(func=domain, args={'value': 'example.com/'}) >>> # Supports IDN domains as well:: >>> domain('xn----gtbspbbmkef.xn--p1ai') - # Output: True + True Args: value: diff --git a/src/validators/email.py b/src/validators/email.py index bc17d772..cba44533 100644 --- a/src/validators/email.py +++ b/src/validators/email.py @@ -31,9 +31,9 @@ def email( Examples: >>> email('someone@example.com') - # Output: True + True >>> email('bogus@@') - # Output: ValidationError(email=email, args={'value': 'bogus@@'}) + ValidationError(func=email, args={'value': 'bogus@@'}) Args: value: diff --git a/src/validators/encoding.py b/src/validators/encoding.py index 71efc849..2cb7c47a 100644 --- a/src/validators/encoding.py +++ b/src/validators/encoding.py @@ -13,9 +13,9 @@ def base16(value: str, /): Examples: >>> base16('a3f4b2') - # Output: True + True >>> base16('a3f4Z1') - # Output: ValidationError(func=base16, args={'value': 'a3f4Z1'}) + ValidationError(func=base16, args={'value': 'a3f4Z1'}) Args: value: @@ -34,9 +34,9 @@ def base32(value: str, /): Examples: >>> base32('MFZWIZLTOQ======') - # Output: True + True >>> base32('MfZW3zLT9Q======') - # Output: ValidationError(func=base32, args={'value': 'MfZW3zLT9Q======'}) + ValidationError(func=base32, args={'value': 'MfZW3zLT9Q======'}) Args: value: @@ -55,9 +55,9 @@ def base58(value: str, /): Examples: >>> base58('14pq6y9H2DLGahPsM4s7ugsNSD2uxpHsJx') - # Output: True + True >>> base58('cUSECm5YzcXJwP') - # Output: ValidationError(func=base58, args={'value': 'cUSECm5YzcXJwP'}) + True Args: value: @@ -76,9 +76,9 @@ def base64(value: str, /): Examples: >>> base64('Y2hhcmFjdGVyIHNldA==') - # Output: True + True >>> base64('cUSECm5YzcXJwP') - # Output: ValidationError(func=base64, args={'value': 'cUSECm5YzcXJwP'}) + ValidationError(func=base64, args={'value': 'cUSECm5YzcXJwP'}) Args: value: diff --git a/src/validators/finance.py b/src/validators/finance.py index 593aab9d..9df5a970 100644 --- a/src/validators/finance.py +++ b/src/validators/finance.py @@ -62,7 +62,7 @@ def cusip(value: str): >>> cusip('037833DP2') True >>> cusip('037833DP3') - ValidationFailure(func=cusip, ...) + ValidationError(func=cusip, args={'value': '037833DP3'}) Args: value: CUSIP string to validate. @@ -83,9 +83,9 @@ def isin(value: str): Examples: >>> isin('037833DP2') - True + ValidationError(func=isin, args={'value': '037833DP2'}) >>> isin('037833DP3') - ValidationFailure(func=isin, ...) + ValidationError(func=isin, args={'value': '037833DP3'}) Args: value: ISIN string to validate. @@ -108,7 +108,7 @@ def sedol(value: str): >>> sedol('2936921') True >>> sedol('29A6922') - ValidationFailure(func=sedol, ...) + ValidationError(func=sedol, args={'value': '29A6922'}) Args: value: SEDOL string to validate. diff --git a/src/validators/hashes.py b/src/validators/hashes.py index e544f7fe..2e9aee62 100644 --- a/src/validators/hashes.py +++ b/src/validators/hashes.py @@ -13,9 +13,9 @@ def md5(value: str, /): Examples: >>> md5('d41d8cd98f00b204e9800998ecf8427e') - # Output: True + True >>> md5('900zz11') - # Output: ValidationError(func=md5, args={'value': '900zz11'}) + ValidationError(func=md5, args={'value': '900zz11'}) Args: value: @@ -34,9 +34,9 @@ def sha1(value: str, /): Examples: >>> sha1('da39a3ee5e6b4b0d3255bfef95601890afd80709') - # Output: True + True >>> sha1('900zz11') - # Output: ValidationError(func=sha1, args={'value': '900zz11'}) + ValidationError(func=sha1, args={'value': '900zz11'}) Args: value: @@ -55,9 +55,9 @@ def sha224(value: str, /): Examples: >>> sha224('d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f') - # Output: True + True >>> sha224('900zz11') - # Output: ValidationError(func=sha224, args={'value': '900zz11'}) + ValidationError(func=sha224, args={'value': '900zz11'}) Args: value: @@ -79,9 +79,9 @@ def sha256(value: str, /): ... 'e3b0c44298fc1c149afbf4c8996fb924' ... '27ae41e4649b934ca495991b7852b855' ... ) - # Output: True + True >>> sha256('900zz11') - # Output: ValidationError(func=sha256, args={'value': '900zz11'}) + ValidationError(func=sha256, args={'value': '900zz11'}) Args: value: @@ -103,9 +103,9 @@ def sha384(value: str, /): ... 'cb00753f45a35e8bb5a03d699ac65007272c32ab0eded163' ... '1a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7' ... ) - # Output: True + True >>> sha384('900zz11') - # Output: ValidationError(func=sha384, args={'value': '900zz11'}) + ValidationError(func=sha384, args={'value': '900zz11'}) Args: value: @@ -128,9 +128,9 @@ def sha512(value: str, /): ... '9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af9' ... '27da3e' ... ) - # Output: True + True >>> sha512('900zz11') - # Output: ValidationError(func=sha512, args={'value': '900zz11'}) + ValidationError(func=sha512, args={'value': '900zz11'}) Args: value: diff --git a/src/validators/hostname.py b/src/validators/hostname.py index 7ad634ae..bdf6bdb0 100644 --- a/src/validators/hostname.py +++ b/src/validators/hostname.py @@ -64,25 +64,25 @@ def hostname( Examples: >>> hostname("ubuntu-pc:443") - # Output: True + True >>> hostname("this-pc") - # Output: True + True >>> hostname("xn----gtbspbbmkef.xn--p1ai:65535") - # Output: True + True >>> hostname("_example.com") - # Output: True + ValidationError(func=hostname, args={'value': '_example.com'}) >>> hostname("123.5.77.88:31000") - # Output: True + True >>> hostname("12.12.12.12") - # Output: True + True >>> hostname("[::1]:22") - # Output: True + True >>> hostname("dead:beef:0:0:0:0000:42:1") - # Output: True + True >>> hostname("[0:0:0:0:0:ffff:1.2.3.4]:-65538") - # Output: ValidationError(func=hostname, ...) + ValidationError(func=hostname, args={'value': '[0:0:0:0:0:ffff:1.2.3.4]:-65538'}) >>> hostname("[0:&:b:c:@:e:f::]:9999") - # Output: ValidationError(func=hostname, ...) + ValidationError(func=hostname, args={'value': '[0:&:b:c:@:e:f::]:9999'}) Args: value: diff --git a/src/validators/i18n/es.py b/src/validators/i18n/es.py index ad5011d0..4bc6bb6d 100644 --- a/src/validators/i18n/es.py +++ b/src/validators/i18n/es.py @@ -39,9 +39,9 @@ def es_cif(value: str, /): Examples: >>> es_cif('B25162520') - # Output: True + True >>> es_cif('B25162529') - # Output: ValidationError(func=es_cif, args=...) + ValidationError(func=es_cif, args={'value': 'B25162529'}) Args: value: @@ -91,9 +91,9 @@ def es_nif(value: str, /): Examples: >>> es_nif('26643189N') - # Output: True + True >>> es_nif('26643189X') - # Output: ValidationError(func=es_nif, args=...) + ValidationError(func=es_nif, args={'value': '26643189X'}) Args: value: @@ -122,9 +122,9 @@ def es_nie(value: str, /): Examples: >>> es_nie('X0095892M') - # Output: True + True >>> es_nie('X0095892X') - # Output: ValidationError(func=es_nie, args=...) + ValidationError(func=es_nie, args={'value': 'X0095892X'}) Args: value: @@ -154,9 +154,9 @@ def es_doi(value: str, /): Examples: >>> es_doi('X0095892M') - # Output: True + True >>> es_doi('X0095892X') - # Output: ValidationError(func=es_doi, args=...) + ValidationError(func=es_doi, args={'value': 'X0095892X'}) Args: value: diff --git a/src/validators/i18n/fi.py b/src/validators/i18n/fi.py index 04b35ff3..534d7dc2 100644 --- a/src/validators/i18n/fi.py +++ b/src/validators/i18n/fi.py @@ -40,9 +40,9 @@ def fi_business_id(value: str, /): Examples: >>> fi_business_id('0112038-9') # Fast Monkeys Ltd - # Output: True + True >>> fi_business_id('1234567-8') # Bogus ID - # Output: ValidationError(func=fi_business_id, ...) + ValidationError(func=fi_business_id, args={'value': '1234567-8'}) Args: value: @@ -73,9 +73,9 @@ def fi_ssn(value: str, /, *, allow_temporal_ssn: bool = True): Examples: >>> fi_ssn('010101-0101') - # Output: True + True >>> fi_ssn('101010-0102') - # Output: ValidationError(func=fi_ssn, args=...) + ValidationError(func=fi_ssn, args={'value': '101010-0102'}) Args: value: diff --git a/src/validators/i18n/fr.py b/src/validators/i18n/fr.py index 49d5830d..cba93bc1 100644 --- a/src/validators/i18n/fr.py +++ b/src/validators/i18n/fr.py @@ -30,19 +30,19 @@ def fr_department(value: typing.Union[str, int]): Examples: >>> fr_department(20) # can be an integer - # Output: True + ValidationError(func=fr_department, args={'value': 20}) >>> fr_department("20") - # Output: True + ValidationError(func=fr_department, args={'value': '20'}) >>> fr_department("971") # Guadeloupe - # Output: True + True >>> fr_department("00") - # Output: ValidationError(func=fr_department, args=...) + ValidationError(func=fr_department, args={'value': '00'}) >>> fr_department('2A') # Corsica - # Output: True + True >>> fr_department('2B') - # Output: True + True >>> fr_department('2C') - # Output: ValidationError(func=fr_department, args=...) + ValidationError(func=fr_department, args={'value': '2C'}) Args: value: @@ -75,13 +75,13 @@ def fr_ssn(value: str): Examples: >>> fr_ssn('1 84 12 76 451 089 46') - # Output: True + True >>> fr_ssn('1 84 12 76 451 089') # control key is optional - # Output: True + True >>> fr_ssn('3 84 12 76 451 089 46') # wrong gender number - # Output: ValidationError(func=fr_ssn, args=...) + ValidationError(func=fr_ssn, args={'value': '3 84 12 76 451 089 46'}) >>> fr_ssn('1 84 12 76 451 089 47') # wrong control key - # Output: ValidationError(func=fr_ssn, args=...) + ValidationError(func=fr_ssn, args={'value': '1 84 12 76 451 089 47'}) Args: value: diff --git a/src/validators/i18n/ind.py b/src/validators/i18n/ind.py index 625e3012..c1d49400 100644 --- a/src/validators/i18n/ind.py +++ b/src/validators/i18n/ind.py @@ -15,7 +15,7 @@ def ind_aadhar(value: str): >>> ind_aadhar('3675 9834 6015') True >>> ind_aadhar('3675 ABVC 2133') - ValidationFailure(func=aadhar, args={'value': '3675 ABVC 2133'}) + ValidationError(func=ind_aadhar, args={'value': '3675 ABVC 2133'}) Args: value: Aadhar card number string to validate. @@ -35,7 +35,7 @@ def ind_pan(value: str): >>> ind_pan('ABCDE9999K') True >>> ind_pan('ABC5d7896B') - ValidationFailure(func=pan, args={'value': 'ABC5d7896B'}) + ValidationError(func=ind_pan, args={'value': 'ABC5d7896B'}) Args: value: PAN card number string to validate. diff --git a/src/validators/i18n/ru.py b/src/validators/i18n/ru.py index b3eb02be..0df5fce0 100644 --- a/src/validators/i18n/ru.py +++ b/src/validators/i18n/ru.py @@ -16,7 +16,7 @@ def ru_inn(value: str): >>> ru_inn('7830002293') # Valid 10-digit INN True >>> ru_inn('1234567890') # Invalid INN - ValidationFailure(func=ru_inn, args={'value': '1234567890'}) + ValidationError(func=ru_inn, args={'value': '1234567890'}) Args: value: Russian INN string to validate. Can contain only digits. diff --git a/src/validators/iban.py b/src/validators/iban.py index 2b1a4d4d..da325ddb 100644 --- a/src/validators/iban.py +++ b/src/validators/iban.py @@ -25,9 +25,9 @@ def iban(value: str, /): Examples: >>> iban('DE29100500001061045672') - # Output: True + True >>> iban('123456') - # Output: ValidationError(func=iban, ...) + ValidationError(func=iban, args={'value': '123456'}) Args: value: diff --git a/src/validators/ip_address.py b/src/validators/ip_address.py index 1bb5d134..94a42c62 100644 --- a/src/validators/ip_address.py +++ b/src/validators/ip_address.py @@ -58,11 +58,11 @@ def ipv4( Examples: >>> ipv4('123.0.0.7') - # Output: True + True >>> ipv4('1.1.1.1/8') - # Output: True + True >>> ipv4('900.80.70.11') - # Output: ValidationError(func=ipv4, args={'value': '900.80.70.11'}) + ValidationError(func=ipv4, args={'value': '900.80.70.11'}) Args: value: @@ -105,11 +105,11 @@ def ipv6(value: str, /, *, cidr: bool = True, strict: bool = False, host_bit: bo Examples: >>> ipv6('::ffff:192.0.2.128') - # Output: True + True >>> ipv6('::1/128') - # Output: True + True >>> ipv6('abc.0.0.1') - # Output: ValidationError(func=ipv6, args={'value': 'abc.0.0.1'}) + ValidationError(func=ipv6, args={'value': 'abc.0.0.1'}) Args: value: diff --git a/src/validators/length.py b/src/validators/length.py index af9413ec..e49091d4 100644 --- a/src/validators/length.py +++ b/src/validators/length.py @@ -14,11 +14,11 @@ def length(value: str, /, *, min_val: Union[int, None] = None, max_val: Union[in Examples: >>> length('something', min_val=2) - # Output: True + True >>> length('something', min_val=9, max_val=9) - # Output: True + True >>> length('something', max_val=5) - # Output: ValidationError(func=length, ...) + ValidationError(func=length, args={'value': 'something', 'max_val': 5}) Args: value: diff --git a/src/validators/mac_address.py b/src/validators/mac_address.py index 5e5dd749..fd681b72 100644 --- a/src/validators/mac_address.py +++ b/src/validators/mac_address.py @@ -17,9 +17,9 @@ def mac_address(value: str, /): Examples: >>> mac_address('01:23:45:67:ab:CD') - # Output: True + True >>> mac_address('00:00:00:00:00') - # Output: ValidationError(func=mac_address, args={'value': '00:00:00:00:00'}) + ValidationError(func=mac_address, args={'value': '00:00:00:00:00'}) Args: value: diff --git a/src/validators/slug.py b/src/validators/slug.py index 2bd83d5b..2a02d206 100644 --- a/src/validators/slug.py +++ b/src/validators/slug.py @@ -16,9 +16,9 @@ def slug(value: str, /): Examples: >>> slug('my-slug-2134') - # Output: True + True >>> slug('my.slug') - # Output: ValidationError(func=slug, args={'value': 'my.slug'}) + ValidationError(func=slug, args={'value': 'my.slug'}) Args: value: Slug string to validate. diff --git a/src/validators/uri.py b/src/validators/uri.py index 6699159f..29092e3e 100644 --- a/src/validators/uri.py +++ b/src/validators/uri.py @@ -27,9 +27,9 @@ def uri(value: str, /): Examples: >>> uri('mailto:example@domain.com') - # Output: True + True >>> uri('file:path.txt') - # Output: ValidationError(func=uri, ...) + ValidationError(func=uri, args={'value': 'file:path.txt'}) Args: value: diff --git a/src/validators/url.py b/src/validators/url.py index 259bef0f..a4277e1c 100644 --- a/src/validators/url.py +++ b/src/validators/url.py @@ -192,13 +192,13 @@ def url( Examples: >>> url('http://duck.com') - # Output: True + True >>> url('ftp://foobar.dk') - # Output: True + True >>> url('http://10.0.0.1') - # Output: True + True >>> url('http://example.com/">user@example.com') - # Output: ValidationError(func=url, ...) + ValidationError(func=url, args={'value': 'http://example.com/">user@example.com'}) Args: value: diff --git a/src/validators/utils.py b/src/validators/utils.py index 639de834..ad7543dc 100644 --- a/src/validators/utils.py +++ b/src/validators/utils.py @@ -53,9 +53,9 @@ def validator(func: Callable[..., Any]): ... def even(value): ... return not (value % 2) >>> even(4) - # Output: True + True >>> even(5) - # Output: ValidationError(func=even, args={'value': 5}) + ValidationError(func=even, args={'value': 5}) Args: func: diff --git a/src/validators/uuid.py b/src/validators/uuid.py index 336974d4..ca6b1ba0 100644 --- a/src/validators/uuid.py +++ b/src/validators/uuid.py @@ -19,9 +19,9 @@ def uuid(value: Union[str, UUID], /): Examples: >>> uuid('2bc1c94f-0deb-43e9-92a1-4775189ec9f8') - # Output: True + True >>> uuid('2bc1c94f 0deb-43e9-92a1-4775189ec9f8') - # Output: ValidationError(func=uuid, ...) + ValidationError(func=uuid, args={'value': '2bc1c94f 0deb-43e9-92a1-4775189ec9f8'}) Args: value: From 7c97eca2990f6d42e27f0f211475eb0d4809de59 Mon Sep 17 00:00:00 2001 From: MaurizioPilia Date: Sat, 26 Apr 2025 18:30:01 +0200 Subject: [PATCH 36/47] Fix: Allow Special DOI Cases Used in Public Administration Tests (#415) * Remove special cases for valid codes The special cases excluded from the validation represent valid codes, used in test environments. * Update test_es.py * Update test_es.py * chore: formatting --------- Co-authored-by: Yozachar <38415384+yozachar@users.noreply.github.com> --- src/validators/__init__.py | 2 +- src/validators/i18n/es.py | 11 +++++------ src/validators/uri.py | 2 +- tests/i18n/test_es.py | 16 +++++----------- 4 files changed, 12 insertions(+), 19 deletions(-) diff --git a/src/validators/__init__.py b/src/validators/__init__.py index 3aceb37c..635a835c 100644 --- a/src/validators/__init__.py +++ b/src/validators/__init__.py @@ -23,7 +23,7 @@ fr_ssn, ind_aadhar, ind_pan, - ru_inn + ru_inn, ) from .iban import iban from .ip_address import ipv4, ipv6 diff --git a/src/validators/i18n/es.py b/src/validators/i18n/es.py index 4bc6bb6d..3d4b1ba3 100644 --- a/src/validators/i18n/es.py +++ b/src/validators/i18n/es.py @@ -1,15 +1,15 @@ """Spain.""" # standard -from typing import Dict, Set +from typing import Dict # local from validators.utils import validator -def _nif_nie_validation(value: str, number_by_letter: Dict[str, str], special_cases: Set[str]): +def _nif_nie_validation(value: str, number_by_letter: Dict[str, str]): """Validate if the doi is a NIF or a NIE.""" - if value in special_cases or len(value) != 9: + if len(value) != 9: return False value = value.upper() table = "TRWAGMYFPDXBNJZSQVHLCKE" @@ -104,8 +104,7 @@ def es_nif(value: str, /): (ValidationError): If `value` is an invalid DOI string. """ number_by_letter = {"L": "0", "M": "0", "K": "0"} - special_cases = {"X0000000T", "00000000T", "00000001R"} - return _nif_nie_validation(value, number_by_letter, special_cases) + return _nif_nie_validation(value, number_by_letter) @validator @@ -137,7 +136,7 @@ def es_nie(value: str, /): number_by_letter = {"X": "0", "Y": "1", "Z": "2"} # NIE must must start with X Y or Z if value and value[0] in number_by_letter: - return _nif_nie_validation(value, number_by_letter, {"X0000000T"}) + return _nif_nie_validation(value, number_by_letter) return False diff --git a/src/validators/uri.py b/src/validators/uri.py index 29092e3e..84b534ea 100644 --- a/src/validators/uri.py +++ b/src/validators/uri.py @@ -68,7 +68,7 @@ def uri(value: str, /): # email if value.startswith("mailto:"): - return email(value[len("mailto:"):]) + return email(value[len("mailto:") :]) # file if value.startswith("file:"): diff --git a/tests/i18n/test_es.py b/tests/i18n/test_es.py index 32f1719a..5b1ce013 100644 --- a/tests/i18n/test_es.py +++ b/tests/i18n/test_es.py @@ -94,18 +94,9 @@ def test_returns_true_on_valid_nif(value: str): assert es_nif(value) -@pytest.mark.parametrize( - ("value",), - [ - ("12345",), - ("X0000000T",), - ("00000000T",), - ("00000001R",), - ], -) -def test_returns_false_on_invalid_nif(value: str): +def test_returns_false_on_invalid_nif(): """Test returns false on invalid nif.""" - result = es_nif(value) + result = es_nif("12345") assert isinstance(result, ValidationError) @@ -117,10 +108,13 @@ def test_returns_false_on_invalid_nif(value: str): ("U4839822F",), ("B96817697",), # NIEs + ("X0000000T",), ("X0095892M",), ("X8868108K",), ("X2911154K",), # NIFs + ("00000001R",), + ("00000000T",), ("26643189N",), ("07060225F",), ("49166693F",), From bafe62e757bd99526129f8dffcfc9795817d08d8 Mon Sep 17 00:00:00 2001 From: Aleksandr Shilov Date: Sat, 26 Apr 2025 19:38:20 +0300 Subject: [PATCH 37/47] feat: add Mir card validation support (#420) * feat(validators): add Mir card number validation * feat: add mir method to __init__ * test(card): add Mir card validation tests * docs(mir): update example valid mir card * fix(tests): update examples mir_cards and drop mir_cards from failed_on_valid_mastercard * fix: rearrangement of imports * fix(tests): update imports * chore: formatting --------- Co-authored-by: Yozachar <38415384+yozachar@users.noreply.github.com> --- src/validators/__init__.py | 5 ++- src/validators/card.py | 22 +++++++++++ tests/test_card.py | 76 ++++++++++++++++++++++++++++++++++---- 3 files changed, 94 insertions(+), 9 deletions(-) diff --git a/src/validators/__init__.py b/src/validators/__init__.py index 635a835c..daa31f21 100644 --- a/src/validators/__init__.py +++ b/src/validators/__init__.py @@ -2,7 +2,7 @@ # local from .between import between -from .card import amex, card_number, diners, discover, jcb, mastercard, unionpay, visa +from .card import amex, card_number, diners, discover, jcb, mastercard, mir, unionpay, visa from .country import calling_code, country_code, currency from .cron import cron from .crypto_addresses import bsc_address, btc_address, eth_address, trx_address @@ -49,8 +49,9 @@ "discover", "jcb", "mastercard", - "visa", "unionpay", + "visa", + "mir", # country "calling_code", "country_code", diff --git a/src/validators/card.py b/src/validators/card.py index d95643cd..94b6637a 100644 --- a/src/validators/card.py +++ b/src/validators/card.py @@ -192,3 +192,25 @@ def discover(value: str, /): """ pattern = re.compile(r"^(60|64|65)") return card_number(value) and len(value) == 16 and pattern.match(value) + + +@validator +def mir(value: str, /): + """Return whether or not given value is a valid Mir card number. + + Examples: + >>> mir('2200123456789019') + True + >>> mir('4242424242424242') + ValidationError(func=mir, args={'value': '4242424242424242'}) + + Args: + value: + Mir card number string to validate. + + Returns: + (Literal[True]): If `value` is a valid Mir card number. + (ValidationError): If `value` is an invalid Mir card number. + """ + pattern = re.compile(r"^(220[0-4])") + return card_number(value) and len(value) == 16 and pattern.match(value) diff --git a/tests/test_card.py b/tests/test_card.py index 1eafa2f7..d0043921 100644 --- a/tests/test_card.py +++ b/tests/test_card.py @@ -12,6 +12,7 @@ discover, jcb, mastercard, + mir, unionpay, visa, ) @@ -23,6 +24,7 @@ diners_cards = ["3056930009020004", "36227206271667"] jcb_cards = ["3566002020360505"] discover_cards = ["6011111111111117", "6011000990139424"] +mir_cards = ["2200123456789019", "2204987654321098"] @pytest.mark.parametrize( @@ -33,14 +35,23 @@ + unionpay_cards + diners_cards + jcb_cards - + discover_cards, + + discover_cards + + mir_cards, ) def test_returns_true_on_valid_card_number(value: str): """Test returns true on valid card number.""" assert card_number(value) -@pytest.mark.parametrize("value", ["4242424242424240", "4000002760003180", "400000276000318X"]) +@pytest.mark.parametrize( + "value", + [ + "4242424242424240", + "4000002760003180", + "400000276000318X", + "220012345678901X", + ], +) def test_returns_failed_on_valid_card_number(value: str): """Test returns failed on valid card number.""" assert isinstance(card_number(value), ValidationError) @@ -84,7 +95,13 @@ def test_returns_true_on_valid_amex(value: str): @pytest.mark.parametrize( "value", - visa_cards + mastercard_cards + unionpay_cards + diners_cards + jcb_cards + discover_cards, + visa_cards + + mastercard_cards + + unionpay_cards + + diners_cards + + jcb_cards + + discover_cards + + mir_cards, ) def test_returns_failed_on_valid_amex(value: str): """Test returns failed on valid amex.""" @@ -99,7 +116,13 @@ def test_returns_true_on_valid_unionpay(value: str): @pytest.mark.parametrize( "value", - visa_cards + mastercard_cards + amex_cards + diners_cards + jcb_cards + discover_cards, + visa_cards + + mastercard_cards + + amex_cards + + diners_cards + + jcb_cards + + discover_cards + + mir_cards, ) def test_returns_failed_on_valid_unionpay(value: str): """Test returns failed on valid unionpay.""" @@ -114,7 +137,13 @@ def test_returns_true_on_valid_diners(value: str): @pytest.mark.parametrize( "value", - visa_cards + mastercard_cards + amex_cards + unionpay_cards + jcb_cards + discover_cards, + visa_cards + + mastercard_cards + + amex_cards + + unionpay_cards + + jcb_cards + + discover_cards + + mir_cards, ) def test_returns_failed_on_valid_diners(value: str): """Test returns failed on valid diners.""" @@ -129,7 +158,13 @@ def test_returns_true_on_valid_jcb(value: str): @pytest.mark.parametrize( "value", - visa_cards + mastercard_cards + amex_cards + unionpay_cards + diners_cards + discover_cards, + visa_cards + + mastercard_cards + + amex_cards + + unionpay_cards + + diners_cards + + discover_cards + + mir_cards, ) def test_returns_failed_on_valid_jcb(value: str): """Test returns failed on valid jcb.""" @@ -144,8 +179,35 @@ def test_returns_true_on_valid_discover(value: str): @pytest.mark.parametrize( "value", - visa_cards + mastercard_cards + amex_cards + unionpay_cards + diners_cards + jcb_cards, + visa_cards + + mastercard_cards + + amex_cards + + unionpay_cards + + diners_cards + + jcb_cards + + mir_cards, ) def test_returns_failed_on_valid_discover(value: str): """Test returns failed on valid discover.""" assert isinstance(discover(value), ValidationError) + + +@pytest.mark.parametrize("value", mir_cards) +def test_returns_true_on_valid_mir(value: str): + """Test returns true on valid Mir card.""" + assert mir(value) + + +@pytest.mark.parametrize( + "value", + visa_cards + + mastercard_cards + + amex_cards + + unionpay_cards + + diners_cards + + jcb_cards + + discover_cards, +) +def test_returns_failed_on_valid_mir(value: str): + """Test returns failed on invalid Mir card (other payment systems).""" + assert isinstance(mir(value), ValidationError) From 8691cead510052aae88f22776b9d6fbe1cf55351 Mon Sep 17 00:00:00 2001 From: Yozachar <38415384+yozachar@users.noreply.github.com> Date: Thu, 1 May 2025 09:35:51 +0530 Subject: [PATCH 38/47] chore: formatting; sync dependencies (#422) --- .github/workflows/pycqa.yaml | 2 +- .gitignore | 3 ++ package/requirements.sphinx.txt | 18 +++---- package/requirements.tooling.txt | 88 +++++++++----------------------- pdm.lock | 65 +++-------------------- pyproject.toml | 9 +--- src/validators/utils.py | 2 +- tests/test_finance.py | 2 +- 8 files changed, 49 insertions(+), 140 deletions(-) diff --git a/.github/workflows/pycqa.yaml b/.github/workflows/pycqa.yaml index f5831072..1251f103 100644 --- a/.github/workflows/pycqa.yaml +++ b/.github/workflows/pycqa.yaml @@ -25,7 +25,7 @@ jobs: run: pip install -r package/requirements.tooling.txt - name: Tooling run: | - black . + ruff format . ruff check . pyright . testing: diff --git a/.gitignore b/.gitignore index 89371721..072cd391 100644 --- a/.gitignore +++ b/.gitignore @@ -175,3 +175,6 @@ cython_debug/ # ruff .ruff_cache + +# taplo +.taplo.toml diff --git a/package/requirements.sphinx.txt b/package/requirements.sphinx.txt index 2f11d0e2..ff2b1bb4 100644 --- a/package/requirements.sphinx.txt +++ b/package/requirements.sphinx.txt @@ -10,9 +10,9 @@ babel==2.15.0 \ beautifulsoup4==4.12.3 \ --hash=sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051 \ --hash=sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed -certifi==2024.7.4 \ - --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ - --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 +certifi==2024.6.2 \ + --hash=sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516 \ + --hash=sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56 charset-normalizer==3.3.2 \ --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ --hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \ @@ -100,9 +100,9 @@ docutils==0.20.1 \ eth-hash[pycryptodome]==0.7.0 \ --hash=sha256:b8d5a230a2b251f4a291e3164a23a14057c4a6de4b0aa4a16fa4dc9161b57e2f \ --hash=sha256:bacdc705bfd85dadd055ecd35fd1b4f846b671add101427e089a4ca2e8db310a -furo==2024.5.6 \ - --hash=sha256:490a00d08c0a37ecc90de03ae9227e8eb5d6f7f750edf9807f398a2bdf2358de \ - --hash=sha256:81f205a6605ebccbb883350432b4831c0196dd3d1bc92f61e1f459045b3d2b0b +furo==2024.8.6 \ + --hash=sha256:6cd97c58b47813d3619e63e9081169880fbe331f0ca883c871ff1f3f11814f5c \ + --hash=sha256:b63e4cee8abfc3136d3bc03a3d45a76a850bada4d6374d24c1716b0e01394a01 idna==3.7 \ --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 @@ -112,9 +112,9 @@ imagesize==1.4.1 \ importlib-metadata==8.0.0 \ --hash=sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f \ --hash=sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812 -jinja2==3.1.6 \ - --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \ - --hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 +jinja2==3.1.4 \ + --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ + --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d markdown-it-py==3.0.0 \ --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \ --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb diff --git a/package/requirements.tooling.txt b/package/requirements.tooling.txt index 81fd4ee0..68d4f1bc 100644 --- a/package/requirements.tooling.txt +++ b/package/requirements.tooling.txt @@ -1,32 +1,6 @@ # This file is @generated by PDM. # Please do not edit it manually. -black==24.4.2 \ - --hash=sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474 \ - --hash=sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1 \ - --hash=sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0 \ - --hash=sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8 \ - --hash=sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96 \ - --hash=sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1 \ - --hash=sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04 \ - --hash=sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021 \ - --hash=sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94 \ - --hash=sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d \ - --hash=sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c \ - --hash=sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7 \ - --hash=sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c \ - --hash=sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc \ - --hash=sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7 \ - --hash=sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d \ - --hash=sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c \ - --hash=sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741 \ - --hash=sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce \ - --hash=sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb \ - --hash=sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063 \ - --hash=sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e -click==8.1.7 \ - --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ - --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de colorama==0.4.6 \ --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 @@ -39,21 +13,12 @@ exceptiongroup==1.2.1; python_version < "3.11" \ iniconfig==2.0.0 \ --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 -mypy-extensions==1.0.0 \ - --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \ - --hash=sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782 nodeenv==1.9.1 \ --hash=sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f \ --hash=sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9 packaging==24.1 \ --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 -pathspec==0.12.1 \ - --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 \ - --hash=sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712 -platformdirs==4.2.2 \ - --hash=sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee \ - --hash=sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3 pluggy==1.5.0 \ --hash=sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1 \ --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 @@ -87,34 +52,31 @@ pypandoc-binary==1.13 \ --hash=sha256:67c0c7af811bcf3cd4f3221be756a4975ec35b2d7df89d8de4313a8caa2cd54f \ --hash=sha256:9455fdd9521cbf4b56d79a56b806afa94c8c22f3c8ef878536e58d941a70f6d6 \ --hash=sha256:946666388eb79b307d7f497b3b33045ef807750f8e5ef3440e0ba3bbab698044 -pyright==1.1.369 \ - --hash=sha256:06d5167a8d7be62523ced0265c5d2f1e022e110caf57a25d92f50fb2d07bcda0 \ - --hash=sha256:ad290710072d021e213b98cc7a2f90ae3a48609ef5b978f749346d1a47eb9af8 -pytest==8.2.2 \ - --hash=sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343 \ - --hash=sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977 -ruff==0.5.0 \ - --hash=sha256:2c4dfcd8d34b143916994b3876b63d53f56724c03f8c1a33a253b7b1e6bf2a7d \ - --hash=sha256:38f3b8327b3cb43474559d435f5fa65dacf723351c159ed0dc567f7ab735d1b6 \ - --hash=sha256:46e193b36f2255729ad34a49c9a997d506e58f08555366b2108783b3064a0e1e \ - --hash=sha256:49141d267100f5ceff541b4e06552e98527870eafa1acc9dec9139c9ec5af64c \ - --hash=sha256:7594f8df5404a5c5c8f64b8311169879f6cf42142da644c7e0ba3c3f14130370 \ - --hash=sha256:81e5facfc9f4a674c6a78c64d38becfbd5e4f739c31fcd9ce44c849f1fad9e4c \ - --hash=sha256:9dc5cfd3558f14513ed0d5b70ce531e28ea81a8a3b1b07f0f48421a3d9e7d80a \ - --hash=sha256:adc7012d6ec85032bc4e9065110df205752d64010bed5f958d25dbee9ce35de3 \ - --hash=sha256:b1a321c4f68809fddd9b282fab6a8d8db796b270fff44722589a8b946925a2a8 \ - --hash=sha256:cd096e23c6a4f9c819525a437fa0a99d1c67a1b6bb30948d46f33afbc53596cf \ - --hash=sha256:d2ffbc3715a52b037bcb0f6ff524a9367f642cdc5817944f6af5479bbb2eb50e \ - --hash=sha256:d505fb93b0fabef974b168d9b27c3960714d2ecda24b6ffa6a87ac432905ea38 \ - --hash=sha256:db3ca35265de239a1176d56a464b51557fce41095c37d6c406e658cf80bbb362 \ - --hash=sha256:e589e27971c2a3efff3fadafb16e5aef7ff93250f0134ec4b52052b673cf988d \ - --hash=sha256:e9118f60091047444c1b90952736ee7b1792910cab56e9b9a9ac20af94cd0440 \ - --hash=sha256:eb641b5873492cf9bd45bc9c5ae5320648218e04386a5f0c264ad6ccce8226a1 \ - --hash=sha256:ed5c4df5c1fb4518abcb57725b576659542bdbe93366f4f329e8f398c4b71178 \ - --hash=sha256:ee770ea8ab38918f34e7560a597cc0a8c9a193aaa01bfbd879ef43cb06bd9c4c +pyright==1.1.378 \ + --hash=sha256:78a043be2876d12d0af101d667e92c7734f3ebb9db71dccc2c220e7e7eb89ca2 \ + --hash=sha256:8853776138b01bc284da07ac481235be7cc89d3176b073d2dba73636cb95be79 +pytest==8.3.2 \ + --hash=sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5 \ + --hash=sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce +ruff==0.6.3 \ + --hash=sha256:14a9528a8b70ccc7a847637c29e56fd1f9183a9db743bbc5b8e0c4ad60592a82 \ + --hash=sha256:183b99e9edd1ef63be34a3b51fee0a9f4ab95add123dbf89a71f7b1f0c991983 \ + --hash=sha256:34e2824a13bb8c668c71c1760a6ac7d795ccbd8d38ff4a0d8471fdb15de910b1 \ + --hash=sha256:3b061e49b5cf3a297b4d1c27ac5587954ccb4ff601160d3d6b2f70b1622194dc \ + --hash=sha256:42844ff678f9b976366b262fa2d1d1a3fe76f6e145bd92c84e27d172e3c34500 \ + --hash=sha256:47021dff5445d549be954eb275156dfd7c37222acc1e8014311badcb9b4ec8c1 \ + --hash=sha256:500f166d03fc6d0e61c8e40a3ff853fa8a43d938f5d14c183c612df1b0d6c58a \ + --hash=sha256:65a533235ed55f767d1fc62193a21cbf9e3329cf26d427b800fdeacfb77d296f \ + --hash=sha256:70452a10eb2d66549de8e75f89ae82462159855e983ddff91bc0bce6511d0470 \ + --hash=sha256:746af39356fee2b89aada06c7376e1aa274a23493d7016059c3a72e3b296befb \ + --hash=sha256:7a62d3b5b0d7f9143d94893f8ba43aa5a5c51a0ffc4a401aa97a81ed76930521 \ + --hash=sha256:7d7bd20dc07cebd68cc8bc7b3f5ada6d637f42d947c85264f94b0d1cd9d87384 \ + --hash=sha256:97f58fda4e309382ad30ede7f30e2791d70dd29ea17f41970119f55bdb7a45c3 \ + --hash=sha256:bddfbb8d63c460f4b4128b6a506e7052bad4d6f3ff607ebbb41b0aa19c2770d1 \ + --hash=sha256:ced3eeb44df75353e08ab3b6a9e113b5f3f996bea48d4f7c027bc528ba87b672 \ + --hash=sha256:d2e2c23cef30dc3cbe9cc5d04f2899e7f5e478c40d2e0a633513ad081f7361b5 \ + --hash=sha256:d8a136aa7d228975a6aee3dd8bea9b28e2b43e9444aa678fb62aeb1956ff2351 \ + --hash=sha256:f92fe93bc72e262b7b3f2bba9879897e2d58a989b4714ba6a5a7273e842ad2f8 tomli==2.0.1; python_version < "3.11" \ --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f -typing-extensions==4.12.2; python_version < "3.11" \ - --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ - --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 diff --git a/pdm.lock b/pdm.lock index 211be750..3aaccd5d 100644 --- a/pdm.lock +++ b/pdm.lock @@ -3,9 +3,9 @@ [metadata] groups = ["default", "crypto-eth-addresses", "docs-offline", "docs-online", "package", "runner", "sast", "testing", "tooling"] -strategy = ["cross_platform", "inherit_metadata"] +strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:9e235aba5998e1586f07b88afb71a5f3e31c9adfef32bd65d9042c0d38606b6a" +content_hash = "sha256:9a263017221313e1b5274495ab0aefdf59efc3c2a91d686e2e2b03ce87d6c621" [[metadata.targets]] requires_python = ">=3.8" @@ -97,46 +97,6 @@ files = [ {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, ] -[[package]] -name = "black" -version = "24.8.0" -requires_python = ">=3.8" -summary = "The uncompromising code formatter." -groups = ["tooling"] -dependencies = [ - "click>=8.0.0", - "mypy-extensions>=0.4.3", - "packaging>=22.0", - "pathspec>=0.9.0", - "platformdirs>=2", - "tomli>=1.1.0; python_version < \"3.11\"", - "typing-extensions>=4.0.1; python_version < \"3.11\"", -] -files = [ - {file = "black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6"}, - {file = "black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb"}, - {file = "black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42"}, - {file = "black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a"}, - {file = "black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1"}, - {file = "black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af"}, - {file = "black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4"}, - {file = "black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af"}, - {file = "black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368"}, - {file = "black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed"}, - {file = "black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018"}, - {file = "black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2"}, - {file = "black-24.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd"}, - {file = "black-24.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2"}, - {file = "black-24.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e"}, - {file = "black-24.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920"}, - {file = "black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c"}, - {file = "black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e"}, - {file = "black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47"}, - {file = "black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb"}, - {file = "black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed"}, - {file = "black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f"}, -] - [[package]] name = "build" version = "1.2.1" @@ -279,7 +239,7 @@ name = "click" version = "8.1.7" requires_python = ">=3.7" summary = "Composable command line interface toolkit" -groups = ["docs-online", "tooling"] +groups = ["docs-online"] dependencies = [ "colorama; platform_system == \"Windows\"", "importlib-metadata; python_version < \"3.8\"", @@ -831,17 +791,6 @@ files = [ {file = "mkdocstrings-0.26.0.tar.gz", hash = "sha256:ff9d0de28c8fa877ed9b29a42fe407cfe6736d70a1c48177aa84fcc3dc8518cd"}, ] -[[package]] -name = "mypy-extensions" -version = "1.0.0" -requires_python = ">=3.5" -summary = "Type system extensions for programs checked with the mypy type checker." -groups = ["tooling"] -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - [[package]] name = "myst-parser" version = "3.0.1" @@ -897,7 +846,7 @@ name = "pathspec" version = "0.12.1" requires_python = ">=3.8" summary = "Utility library for gitignore style pattern matching of file paths." -groups = ["docs-online", "tooling"] +groups = ["docs-online"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -919,7 +868,7 @@ name = "platformdirs" version = "4.2.2" requires_python = ">=3.8" summary = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -groups = ["docs-online", "runner", "tooling"] +groups = ["docs-online", "runner"] files = [ {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, @@ -1520,8 +1469,8 @@ name = "typing-extensions" version = "4.12.2" requires_python = ">=3.8" summary = "Backported and Experimental Type Hints for Python 3.8+" -groups = ["docs-online", "sast", "tooling"] -marker = "python_version < \"3.11\"" +groups = ["docs-online", "sast"] +marker = "python_version < \"3.10\"" files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, diff --git a/pyproject.toml b/pyproject.toml index b40020bb..48e04bfc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -73,7 +73,6 @@ runner = ["tox>=4.18.0"] sast = ["bandit[toml]>=1.7.9"] testing = ["pytest>=8.3.2"] tooling = [ - "black>=24.8.0", "ruff>=0.6.3", "pyright>=1.1.378", "pytest>=8.3.2", @@ -107,10 +106,6 @@ exclude_dirs = [ "tests", ] -[tool.black] -line-length = 100 -target-version = ["py38", "py39", "py310", "py311", "py312"] - [tool.pyright] extraPaths = ["src"] exclude = [ @@ -188,8 +183,8 @@ commands = pyright . [testenv:format] description = code formatter deps = - black -commands = black . + ruff +commands = ruff format . [testenv:sast] deps = diff --git a/src/validators/utils.py b/src/validators/utils.py index ad7543dc..28d3c857 100644 --- a/src/validators/utils.py +++ b/src/validators/utils.py @@ -22,7 +22,7 @@ def __repr__(self): """Repr Validation Failure.""" return ( f"ValidationError(func={self.func.__name__}, " - + f"args={({k: v for (k, v) in self.__dict__.items() if k != 'func'})})" + + f"args={ ({k: v for (k, v) in self.__dict__.items() if k != 'func'}) })" ) def __str__(self): diff --git a/tests/test_finance.py b/tests/test_finance.py index 7beff7fc..a40fd333 100644 --- a/tests/test_finance.py +++ b/tests/test_finance.py @@ -30,7 +30,7 @@ def test_returns_true_on_valid_isin(value: str): assert isin(value) -@pytest.mark.parametrize("value", ["010378331005" "XCVF", "00^^^1234", "A000009"]) +@pytest.mark.parametrize("value", ["010378331005", "XCVF", "00^^^1234", "A000009"]) def test_returns_failed_validation_on_invalid_isin(value: str): """Test returns failed validation on invalid isin.""" assert isinstance(isin(value), ValidationError) From ca2db4692e7888537de34a34da5bd5a14118f85e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 May 2025 04:06:41 +0000 Subject: [PATCH 39/47] chore(deps): bump certifi from 2024.6.2 to 2024.7.4 in /package Bumps [certifi](https://github.com/certifi/python-certifi) from 2024.6.2 to 2024.7.4. - [Commits](https://github.com/certifi/python-certifi/compare/2024.06.02...2024.07.04) --- updated-dependencies: - dependency-name: certifi dependency-version: 2024.7.4 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package/requirements.sphinx.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package/requirements.sphinx.txt b/package/requirements.sphinx.txt index ff2b1bb4..8de2d5aa 100644 --- a/package/requirements.sphinx.txt +++ b/package/requirements.sphinx.txt @@ -10,9 +10,9 @@ babel==2.15.0 \ beautifulsoup4==4.12.3 \ --hash=sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051 \ --hash=sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed -certifi==2024.6.2 \ - --hash=sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516 \ - --hash=sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56 +certifi==2024.7.4 \ + --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ + --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 charset-normalizer==3.3.2 \ --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ --hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \ From 6d8a1abcdf2d92e113b1707bbf372bde4d48e3a5 Mon Sep 17 00:00:00 2001 From: Yozachar <38415384+yozachar@users.noreply.github.com> Date: Thu, 1 May 2025 10:20:23 +0530 Subject: [PATCH 40/47] chore: prepare for new release --- .github/workflows/pycqa.yaml | 6 +++--- .gitignore | 1 + LICENSE.txt | 2 +- README.md | 4 ++-- SECURITY.md | 2 +- docs/api/card.md | 1 + docs/api/card.rst | 1 + docs/api/i18n.md | 1 + docs/api/i18n.rst | 1 + docs/index.md | 10 ++++++++-- docs/index.rst | 12 ++++++++--- mkdocs.yaml | 2 +- package/requirements.sphinx.txt | 3 --- pdm.lock | 35 ++++----------------------------- pyproject.toml | 8 ++++---- src/validators/__init__.py | 2 +- 16 files changed, 39 insertions(+), 52 deletions(-) diff --git a/.github/workflows/pycqa.yaml b/.github/workflows/pycqa.yaml index 1251f103..3b34a53f 100644 --- a/.github/workflows/pycqa.yaml +++ b/.github/workflows/pycqa.yaml @@ -16,10 +16,10 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 # set up specific python version - - name: Set up Python v3.8 + - name: Set up Python v3.9 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.9" # tooling - name: Install 'tooling' dependencies run: pip install -r package/requirements.tooling.txt @@ -33,7 +33,7 @@ jobs: fail-fast: true matrix: os: [ubuntu-latest, macos-latest, windows-latest] - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] + python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] runs-on: ${{ matrix.os }} steps: # checkout repository again! diff --git a/.gitignore b/.gitignore index 072cd391..cdb7d68f 100644 --- a/.gitignore +++ b/.gitignore @@ -172,6 +172,7 @@ cython_debug/ # rtx/mise .rtx.toml .mise.toml +mise.toml # ruff .ruff_cache diff --git a/LICENSE.txt b/LICENSE.txt index d21a342b..0fba9fb0 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2013 - 2024 Konsta Vesterinen +Copyright (c) 2013 - 2025 Konsta Vesterinen Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff --git a/README.md b/README.md index 260532f4..926ac79f 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Then, ```python >>> import validators ->>> +>>> >>> validators.email('someone@example.com') True ``` @@ -36,7 +36,7 @@ True --- -> **_Python 3.8 [reaches EOL in](https://endoflife.date/python) October 2024._** +> **_Python 3.9 [reaches EOL in](https://endoflife.date/python) October 2025._** [sast-badge]: https://github.com/python-validators/validators/actions/workflows/sast.yaml/badge.svg diff --git a/SECURITY.md b/SECURITY.md index d666628a..0f632259 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -4,7 +4,7 @@ | Version | Supported | | ---------- | ------------------ | -| `>=0.33.0` | :white_check_mark: | +| `>=0.35.0` | :white_check_mark: | ## Reporting a Vulnerability diff --git a/docs/api/card.md b/docs/api/card.md index c45cd8ad..0749e60e 100644 --- a/docs/api/card.md +++ b/docs/api/card.md @@ -6,5 +6,6 @@ ::: validators.card.discover ::: validators.card.jcb ::: validators.card.mastercard +::: validators.card.mir ::: validators.card.unionpay ::: validators.card.visa diff --git a/docs/api/card.rst b/docs/api/card.rst index eb9eff7c..efd429c7 100644 --- a/docs/api/card.rst +++ b/docs/api/card.rst @@ -8,5 +8,6 @@ card .. autofunction:: discover .. autofunction:: jcb .. autofunction:: mastercard +.. autofunction:: mir .. autofunction:: unionpay .. autofunction:: visa diff --git a/docs/api/i18n.md b/docs/api/i18n.md index 6999f33f..13aa96a5 100644 --- a/docs/api/i18n.md +++ b/docs/api/i18n.md @@ -10,3 +10,4 @@ ::: validators.i18n.fr_ssn ::: validators.i18n.ind_aadhar ::: validators.i18n.ind_pan +::: validators.i18n.ru_inn diff --git a/docs/api/i18n.rst b/docs/api/i18n.rst index 1284b302..8ab882df 100644 --- a/docs/api/i18n.rst +++ b/docs/api/i18n.rst @@ -12,3 +12,4 @@ i18n .. autofunction:: fr_ssn .. autofunction:: ind_aadhar .. autofunction:: ind_pan +.. autofunction:: ru_inn diff --git a/docs/index.md b/docs/index.md index 3d7f58a4..926ac79f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -9,9 +9,15 @@ require defining a schema or form. I wanted to create a simple validation library where validating a simple value does not require defining a form or a schema. +```shell +pip install validators +``` + +Then, + ```python >>> import validators ->>> +>>> >>> validators.email('someone@example.com') True ``` @@ -30,7 +36,7 @@ True --- -> **_Python 3.8 [reaches EOL in](https://endoflife.date/python) October 2024._** +> **_Python 3.9 [reaches EOL in](https://endoflife.date/python) October 2025._** [sast-badge]: https://github.com/python-validators/validators/actions/workflows/sast.yaml/badge.svg diff --git a/docs/index.rst b/docs/index.rst index 4d24aba4..4553ec5d 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -12,10 +12,16 @@ seems to require defining a schema or form. I wanted to create a simple validation library where validating a simple value does not require defining a form or a schema. +.. code:: shell + + pip install validators + +Then, + .. code:: python >>> import validators - >>> + >>> >>> validators.email('someone@example.com') True @@ -41,8 +47,8 @@ Resources -------------- - **Python 3.8** `reaches EOL in `__ - **October 2024.** + **Python 3.9** `reaches EOL in `__ + **October 2025.** .. raw:: html diff --git a/mkdocs.yaml b/mkdocs.yaml index b7b84f94..cf93965a 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -63,7 +63,7 @@ extra: provider: mike default: stable -copyright: Copyright © 2013 - 2024 Konsta Vesterinen +copyright: Copyright © 2013 - 2025 Konsta Vesterinen nav: - Home: index.md diff --git a/package/requirements.sphinx.txt b/package/requirements.sphinx.txt index ff2b1bb4..a1729207 100644 --- a/package/requirements.sphinx.txt +++ b/package/requirements.sphinx.txt @@ -215,9 +215,6 @@ pypandoc-binary==1.13 \ --hash=sha256:67c0c7af811bcf3cd4f3221be756a4975ec35b2d7df89d8de4313a8caa2cd54f \ --hash=sha256:9455fdd9521cbf4b56d79a56b806afa94c8c22f3c8ef878536e58d941a70f6d6 \ --hash=sha256:946666388eb79b307d7f497b3b33045ef807750f8e5ef3440e0ba3bbab698044 -pytz==2024.1 \ - --hash=sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812 \ - --hash=sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319 pyyaml==6.0.1 \ --hash=sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5 \ --hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \ diff --git a/pdm.lock b/pdm.lock index 3aaccd5d..bcba0e6e 100644 --- a/pdm.lock +++ b/pdm.lock @@ -5,10 +5,10 @@ groups = ["default", "crypto-eth-addresses", "docs-offline", "docs-online", "package", "runner", "sast", "testing", "tooling"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:9a263017221313e1b5274495ab0aefdf59efc3c2a91d686e2e2b03ce87d6c621" +content_hash = "sha256:826f262f5a1e71d775a4860e4cbef5884724bb1e1d2d26b3603879a1acf4d19b" [[metadata.targets]] -requires_python = ">=3.8" +requires_python = ">=3.9" [[package]] name = "alabaster" @@ -21,21 +21,6 @@ files = [ {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, ] -[[package]] -name = "astunparse" -version = "1.6.3" -summary = "An AST unparser for Python" -groups = ["docs-online"] -marker = "python_version < \"3.9\"" -dependencies = [ - "six<2.0,>=1.6.1", - "wheel<1.0,>=0.23.0", -] -files = [ - {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, - {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, -] - [[package]] name = "babel" version = "2.15.0" @@ -1046,7 +1031,7 @@ files = [ name = "pytz" version = "2024.1" summary = "World timezone definitions, modern and historical" -groups = ["docs-offline", "docs-online"] +groups = ["docs-online"] files = [ {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, @@ -1469,7 +1454,7 @@ name = "typing-extensions" version = "4.12.2" requires_python = ">=3.8" summary = "Backported and Experimental Type Hints for Python 3.8+" -groups = ["docs-online", "sast"] +groups = ["docs-online"] marker = "python_version < \"3.10\"" files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, @@ -1555,18 +1540,6 @@ files = [ {file = "watchdog-4.0.1.tar.gz", hash = "sha256:eebaacf674fa25511e8867028d281e602ee6500045b57f43b08778082f7f8b44"}, ] -[[package]] -name = "wheel" -version = "0.43.0" -requires_python = ">=3.8" -summary = "A built-package format for Python" -groups = ["docs-online"] -marker = "python_version < \"3.9\"" -files = [ - {file = "wheel-0.43.0-py3-none-any.whl", hash = "sha256:55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81"}, - {file = "wheel-0.43.0.tar.gz", hash = "sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85"}, -] - [[package]] name = "zipp" version = "3.19.2" diff --git a/pyproject.toml b/pyproject.toml index 48e04bfc..9c1566bf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,7 @@ classifiers = [ "Programming Language :: Python :: Implementation :: CPython", "Topic :: Software Development :: Libraries :: Python Modules", ] -requires-python = ">=3.8" +requires-python = ">=3.9" dynamic = ["version"] dependencies = [] @@ -116,7 +116,7 @@ exclude = [ ".venv.dev/", "site/", ] -pythonVersion = "3.8" +pythonVersion = "3.9" pythonPlatform = "All" typeCheckingMode = "strict" @@ -144,7 +144,7 @@ lint.select = [ "D", ] line-length = 100 -target-version = "py38" +target-version = "py39" extend-exclude = ["**/__pycache__", ".pytest_cache", "site"] [tool.ruff.lint.isort] @@ -163,7 +163,7 @@ legacy_tox_ini = """ [tox] requires = tox>=4 -env_list = lint, type, format, sast, py{38,39,310,311,312} +env_list = lint, type, format, sast, py{39,310,311,312,313} [testenv:lint] description = ruff linter diff --git a/src/validators/__init__.py b/src/validators/__init__.py index daa31f21..c4701d66 100644 --- a/src/validators/__init__.py +++ b/src/validators/__init__.py @@ -112,4 +112,4 @@ "validator", ) -__version__ = "0.34.0" +__version__ = "0.35.0" From 0b1799cdb431e708aff6b1b59e4430bd0828a70b Mon Sep 17 00:00:00 2001 From: Yozachar <38415384+yozachar@users.noreply.github.com> Date: Thu, 1 May 2025 10:41:52 +0530 Subject: [PATCH 41/47] chore: updates changelog --- CHANGES.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index fb560a27..e4f214aa 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,6 +9,35 @@ Note to self: Breaking changes must increment either --> +## 0.35.0 (2025-05-01) + +_**Breaking**_ ⚠️ + +* Drops support for Python `v3.8`. + +_**Features**_ + +* Validator russian individual tax number by @TheDrunkenBear in [#408](https://github.com/python-validators/validators/pull/408) +* feat: allow custom URL scheme validation by @e3krisztian in [#409](https://github.com/python-validators/validators/pull/409) +* Refactor API: remove print from `ru_inn`, update description, and expose via `__init__` by @TheDrunkenBear in [#419](https://github.com/python-validators/validators/pull/419) +* Add Mir card validation support by @TheDrunkenBear in [#420](https://github.com/python-validators/validators/pull/420) + +_**Maintenance**_ + +* Update README.md by @mattseymour in [#400](https://github.com/python-validators/validators/pull/400) +* fix(domain): accept .onion as a valid TLD by @davidt99 in [#402](https://github.com/python-validators/validators/pull/402) +* fix(url): add hashtag to allowed fragment characters by @davidt99 in [#405](https://github.com/python-validators/validators/pull/405) +* chore(deps): bump jinja2 from 3.1.4 to 3.1.6 in /package by @dependabot in [#414](https://github.com/python-validators/validators/pull/414) +* Fix email regex issue 140 by @cwisdo in [#411](https://github.com/python-validators/validators/pull/411) +* fix(uri): replace `lstrip("mailto:")` with manual prefix removal by @max-moser in [#418](https://github.com/python-validators/validators/pull/418) +* running `doctest` failes by @d-chris in [#417](https://github.com/python-validators/validators/pull/417) +* Fix: Allow Special DOI Cases Used in Public Administration Tests by @MaurizioPilia in [#415](https://github.com/python-validators/validators/pull/415) +* chore: formatting; sync dependencies by @yozachar in [#422](https://github.com/python-validators/validators/pull/422) +* chore: prepare for new release by @yozachar in [#424](https://github.com/python-validators/validators/pull/424) +* chore: updates changelog by @yozachar in [#425](https://github.com/python-validators/validators/pull/425) + +**Full Changelog**: [`0.34.0...0.35.0`](https://github.com/python-validators/validators/compare/0.34.0...0.35.0) + ## 0.34.0 (2024-09-03) _**Breaking**_ From 5a80c7e2ad20c753af0913fb5d6a3147d7de3fdb Mon Sep 17 00:00:00 2001 From: Yozachar <38415384+yozachar@users.noreply.github.com> Date: Thu, 1 May 2025 11:07:16 +0530 Subject: [PATCH 42/47] chore: update project classifiers --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 9c1566bf..74cd51f7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,11 +25,11 @@ classifiers = [ "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3 :: Only", - "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 :: Implementation :: CPython", "Topic :: Software Development :: Libraries :: Python Modules", ] From 560428da37765b25b9ba1eb77e397fc192b9c0f5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 May 2025 06:38:35 +0000 Subject: [PATCH 43/47] chore(deps): bump jinja2 from 3.1.4 to 3.1.6 in /package Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.4 to 3.1.6. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.1.4...3.1.6) --- updated-dependencies: - dependency-name: jinja2 dependency-version: 3.1.6 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package/requirements.sphinx.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package/requirements.sphinx.txt b/package/requirements.sphinx.txt index a1729207..c64eceb2 100644 --- a/package/requirements.sphinx.txt +++ b/package/requirements.sphinx.txt @@ -112,9 +112,9 @@ imagesize==1.4.1 \ importlib-metadata==8.0.0 \ --hash=sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f \ --hash=sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812 -jinja2==3.1.4 \ - --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ - --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d +jinja2==3.1.6 \ + --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \ + --hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 markdown-it-py==3.0.0 \ --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \ --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb From 8ff15cb49739fde9d8df72100159648e2e39646e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Jun 2025 08:56:07 +0000 Subject: [PATCH 44/47] chore(deps): bump requests from 2.32.3 to 2.32.4 in /package Bumps [requests](https://github.com/psf/requests) from 2.32.3 to 2.32.4. - [Release notes](https://github.com/psf/requests/releases) - [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md) - [Commits](https://github.com/psf/requests/compare/v2.32.3...v2.32.4) --- updated-dependencies: - dependency-name: requests dependency-version: 2.32.4 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package/requirements.sphinx.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package/requirements.sphinx.txt b/package/requirements.sphinx.txt index 60236e33..7deb75a4 100644 --- a/package/requirements.sphinx.txt +++ b/package/requirements.sphinx.txt @@ -255,9 +255,9 @@ pyyaml==6.0.1 \ --hash=sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c \ --hash=sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d \ --hash=sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f -requests==2.32.3 \ - --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ - --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 +requests==2.32.4 \ + --hash=sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c \ + --hash=sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422 snowballstemmer==2.2.0 \ --hash=sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1 \ --hash=sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a From 402b3517eb09be188df13e5c57ea4d1400b7cc20 Mon Sep 17 00:00:00 2001 From: iCasture Date: Fri, 18 Jul 2025 22:55:38 +0800 Subject: [PATCH 45/47] fix: reject MAC addresses with mixed separators Add validation to prevent MAC addresses that use both ':' and '-' separators simultaneously, ensuring consistent separator usage as per MAC address format standards. --- src/validators/mac_address.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/validators/mac_address.py b/src/validators/mac_address.py index fd681b72..59542606 100644 --- a/src/validators/mac_address.py +++ b/src/validators/mac_address.py @@ -29,4 +29,8 @@ def mac_address(value: str, /): (Literal[True]): If `value` is a valid MAC address. (ValidationError): If `value` is an invalid MAC address. """ + # Check for mixed separators: MAC addresses cannot use both ':' and '-' simultaneously + if ":" in value and "-" in value: + return False + return re.match(r"^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$", value) if value else False From 843a2ab581b51de20043f739242f0eac523fbfd1 Mon Sep 17 00:00:00 2001 From: Joe <38415384+nandgator@users.noreply.github.com> Date: Sat, 14 Mar 2026 11:34:27 +0530 Subject: [PATCH 46/47] chore: update codebase to reflect new username --- CHANGES.md | 164 ++++++++++++++++++++++++------------------------ CONTRIBUTING.md | 4 +- README.md | 8 +-- docs/index.md | 8 +-- docs/index.rst | 8 +-- mkdocs.yaml | 2 +- pyproject.toml | 4 +- 7 files changed, 99 insertions(+), 99 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index e4f214aa..a0975596 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -32,9 +32,9 @@ _**Maintenance**_ * fix(uri): replace `lstrip("mailto:")` with manual prefix removal by @max-moser in [#418](https://github.com/python-validators/validators/pull/418) * running `doctest` failes by @d-chris in [#417](https://github.com/python-validators/validators/pull/417) * Fix: Allow Special DOI Cases Used in Public Administration Tests by @MaurizioPilia in [#415](https://github.com/python-validators/validators/pull/415) -* chore: formatting; sync dependencies by @yozachar in [#422](https://github.com/python-validators/validators/pull/422) -* chore: prepare for new release by @yozachar in [#424](https://github.com/python-validators/validators/pull/424) -* chore: updates changelog by @yozachar in [#425](https://github.com/python-validators/validators/pull/425) +* chore: formatting; sync dependencies by @nandgator in [#422](https://github.com/python-validators/validators/pull/422) +* chore: prepare for new release by @nandgator in [#424](https://github.com/python-validators/validators/pull/424) +* chore: updates changelog by @nandgator in [#425](https://github.com/python-validators/validators/pull/425) **Full Changelog**: [`0.34.0...0.35.0`](https://github.com/python-validators/validators/compare/0.34.0...0.35.0) @@ -50,8 +50,8 @@ _**Features**_ _**Maintenance**_ -* chore: update dependencies by @yozachar in [#394](https://github.com/python-validators/validators/pull/394) -* docs: adds configuration info by @yozachar in [#395](https://github.com/python-validators/validators/pull/395) +* chore: update dependencies by @nandgator in [#394](https://github.com/python-validators/validators/pull/394) +* docs: adds configuration info by @nandgator in [#395](https://github.com/python-validators/validators/pull/395) **Full Changelog**: [`0.33.0...0.34.0`](https://github.com/python-validators/validators/compare/0.33.0...0.34.0) @@ -139,7 +139,7 @@ _**Features**_ _**Maintenance**_ -* chore: update dev deps; adds python EOL info by @yozachar in [#381](https://github.com/python-validators/validators/pull/381) +* chore: update dev deps; adds python EOL info by @nandgator in [#381](https://github.com/python-validators/validators/pull/381) **Full Changelog**: [`0.28.3...0.29.0`](https://github.com/python-validators/validators/compare/0.28.3...0.29.0) @@ -157,7 +157,7 @@ _**Features**_ _**Maintenance**_ -* hotfix: ensure `_tld.txt` is in `sdist` and `bdist` by @yozachar in [#379](https://github.com/python-validators/validators/pull/379) +* hotfix: ensure `_tld.txt` is in `sdist` and `bdist` by @nandgator in [#379](https://github.com/python-validators/validators/pull/379) **Full Changelog**: [`0.28.2...0.28.3`](https://github.com/python-validators/validators/compare/0.28.2...0.28.3) @@ -173,12 +173,12 @@ _**Features**_ _**Maintenance**_ -* fix: corrects a few typo by @yozachar in [#371](https://github.com/python-validators/validators/pull/371) +* fix: corrects a few typo by @nandgator in [#371](https://github.com/python-validators/validators/pull/371) * build(deps): bump jinja2 from 3.1.3 to 3.1.4 in /package by @dependabot in [#372](https://github.com/python-validators/validators/pull/372) * fix(ip_address): properly handle private is false by @grleblanc in [#374](https://github.com/python-validators/validators/pull/374) * chore(url): allow symbols and pictographs in url by @prousso in [#375](https://github.com/python-validators/validators/pull/375) * build(deps): bump requests from 2.31.0 to 2.32.0 in /package by @dependabot in [#376](https://github.com/python-validators/validators/pull/376) -* chore: fix typo; update dev deps; bump version by @yozachar in [#377](https://github.com/python-validators/validators/pull/377) +* chore: fix typo; update dev deps; bump version by @nandgator in [#377](https://github.com/python-validators/validators/pull/377) **Full Changelog**: [`0.28.1...0.28.2`](https://github.com/python-validators/validators/compare/0.28.1...0.28.2) @@ -194,12 +194,12 @@ _**Features**_ _**Maintenance**_ -* fix: reduce memory footprint when loading TLDs by @yozachar in [#362](https://github.com/python-validators/validators/pull/362) +* fix: reduce memory footprint when loading TLDs by @nandgator in [#362](https://github.com/python-validators/validators/pull/362) * build(deps): bump idna from 3.6 to 3.7 in /package by @dependabot in [#365](https://github.com/python-validators/validators/pull/365) -* fix: rfc cases in the `domain` validator by @yozachar in [#367](https://github.com/python-validators/validators/pull/367) -* chore: documentation maintenance by @yozachar in [#368](https://github.com/python-validators/validators/pull/368) -* chore: update contribution guidelines by @yozachar in [#369](https://github.com/python-validators/validators/pull/369) -* chore: updated dev dependencies; bump version by @yozachar in [#370](https://github.com/python-validators/validators/pull/370) +* fix: rfc cases in the `domain` validator by @nandgator in [#367](https://github.com/python-validators/validators/pull/367) +* chore: documentation maintenance by @nandgator in [#368](https://github.com/python-validators/validators/pull/368) +* chore: update contribution guidelines by @nandgator in [#369](https://github.com/python-validators/validators/pull/369) +* chore: updated dev dependencies; bump version by @nandgator in [#370](https://github.com/python-validators/validators/pull/370) **Full Changelog**: [`0.28.0...0.28.1`](https://github.com/python-validators/validators/compare/0.28.0...0.28.1) @@ -207,17 +207,17 @@ _**Maintenance**_ _**Breaking**_ ⚠️ -* patch: moves `country_code` module to `country` module by @yozachar in [#357](https://github.com/python-validators/validators/pull/357) +* patch: moves `country_code` module to `country` module by @nandgator in [#357](https://github.com/python-validators/validators/pull/357) _**Features**_ -* feat: adds indian aadhar and pan validator by @yozachar in [#358](https://github.com/python-validators/validators/pull/358) -* feat: adds `finance` validator by @yozachar in [#359](https://github.com/python-validators/validators/pull/359) -* feat: adds `consider_tld` parameter to `domain`, `hostname` and `url` modules by @yozachar in [#360](https://github.com/python-validators/validators/pull/360) +* feat: adds indian aadhar and pan validator by @nandgator in [#358](https://github.com/python-validators/validators/pull/358) +* feat: adds `finance` validator by @nandgator in [#359](https://github.com/python-validators/validators/pull/359) +* feat: adds `consider_tld` parameter to `domain`, `hostname` and `url` modules by @nandgator in [#360](https://github.com/python-validators/validators/pull/360) _**Maintenance**_ -* maint: updated dev dependencies, doc links; bump version by @yozachar in [#361](https://github.com/python-validators/validators/pull/361) +* maint: updated dev dependencies, doc links; bump version by @nandgator in [#361](https://github.com/python-validators/validators/pull/361) **Full Changelog**: [`0.27.0...0.28.0`](https://github.com/python-validators/validators/compare/0.27.0...0.28.0) @@ -227,16 +227,16 @@ _**Maintenance**_ _**Breaking**_ ⚠️ -* patch: moves `base58` and `base64` into `encoding` by @yozachar in [#354](https://github.com/python-validators/validators/pull/354) +* patch: moves `base58` and `base64` into `encoding` by @nandgator in [#354](https://github.com/python-validators/validators/pull/354) _**Features**_ -* feat: lays foundation for URI validation by @yozachar in [#353](https://github.com/python-validators/validators/pull/353) -* feat: adds `private` parameter to `ip_address`, `hostname` & `url` by @yozachar in [#356](https://github.com/python-validators/validators/pull/356) +* feat: lays foundation for URI validation by @nandgator in [#353](https://github.com/python-validators/validators/pull/353) +* feat: adds `private` parameter to `ip_address`, `hostname` & `url` by @nandgator in [#356](https://github.com/python-validators/validators/pull/356) _**Maintenance**_ -* patch: adds `encoding` tests and docs by @yozachar in [#355](https://github.com/python-validators/validators/pull/355) +* patch: adds `encoding` tests and docs by @nandgator in [#355](https://github.com/python-validators/validators/pull/355) **Full Changelog**: [`0.26.0...0.27.0`](https://github.com/python-validators/validators/compare/0.26.0...0.27.0) @@ -250,12 +250,12 @@ _**Breaking**_ _**Features**_ -* feat: adds `base58` and `base64` validators by @yozachar in [#351](https://github.com/python-validators/validators/pull/351) +* feat: adds `base58` and `base64` validators by @nandgator in [#351](https://github.com/python-validators/validators/pull/351) _**Maintenance**_ -* fix: regex ignore-case uses only `a-z` by @yozachar in [#349](https://github.com/python-validators/validators/pull/349) -* patch: supported extended latin in username by @yozachar in [#350](https://github.com/python-validators/validators/pull/350) +* fix: regex ignore-case uses only `a-z` by @nandgator in [#349](https://github.com/python-validators/validators/pull/349) +* patch: supported extended latin in username by @nandgator in [#350](https://github.com/python-validators/validators/pull/350) **Full Changelog**: [`0.25.0...0.26.0`](https://github.com/python-validators/validators/compare/0.25.0...0.26.0) @@ -269,12 +269,12 @@ _**Breaking**_ _**Features**_ -* feat: adds basic `cron` validator by @yozachar in [#348](https://github.com/python-validators/validators/pull/348) +* feat: adds basic `cron` validator by @nandgator in [#348](https://github.com/python-validators/validators/pull/348) _**Maintenance**_ -* maint: adds quick start docs by @yozachar in [#344](https://github.com/python-validators/validators/pull/344) -* fix: `domain` validation is now more consistent across rfcs by @yozachar in [#347](https://github.com/python-validators/validators/pull/347) +* maint: adds quick start docs by @nandgator in [#344](https://github.com/python-validators/validators/pull/344) +* fix: `domain` validation is now more consistent across rfcs by @nandgator in [#347](https://github.com/python-validators/validators/pull/347) **Full Changelog**: [`0.24.2...0.25.0`](https://github.com/python-validators/validators/compare/0.24.2...0.25.0) @@ -288,13 +288,13 @@ _**Breaking**_ _**Features**_ -* feat: conditionally raises `ValidationError`; bump version by @yozachar in [#343](https://github.com/python-validators/validators/pull/343) +* feat: conditionally raises `ValidationError`; bump version by @nandgator in [#343](https://github.com/python-validators/validators/pull/343) _**Maintenance**_ -* patch: `domain` & `url` modules by @yozachar in [#339](https://github.com/python-validators/validators/pull/339) -* fix: domain name not confirming to rfc_2782 by @yozachar in [#341](https://github.com/python-validators/validators/pull/341) -* maint: update dev dependencies; adds favicon to docs by @yozachar in [#342](https://github.com/python-validators/validators/pull/342) +* patch: `domain` & `url` modules by @nandgator in [#339](https://github.com/python-validators/validators/pull/339) +* fix: domain name not confirming to rfc_2782 by @nandgator in [#341](https://github.com/python-validators/validators/pull/341) +* maint: update dev dependencies; adds favicon to docs by @nandgator in [#342](https://github.com/python-validators/validators/pull/342) **Full Changelog**: [`0.23.2...0.24.0`](https://github.com/python-validators/validators/compare/0.23.2...0.24.0) @@ -312,8 +312,8 @@ _**Features**_ _**Maintenance**_ -* maint: rectifies changelog by @yozachar in [#336](ttps://github.com/python-validators/validators/pull/336) -* fix: packaging as well as `rST` & `md` document generation by @yozachar in [#337](ttps://github.com/python-validators/validators/pull/337) +* maint: rectifies changelog by @nandgator in [#336](ttps://github.com/python-validators/validators/pull/336) +* fix: packaging as well as `rST` & `md` document generation by @nandgator in [#337](ttps://github.com/python-validators/validators/pull/337) **Full Changelog**: [`0.23.1...0.23.2`](https://github.com/python-validators/validators/compare/0.23.1...0.23.2) @@ -329,8 +329,8 @@ _**Features**_ _**Maintenance**_ -* maint: fix `between` & `length` validators by @yozachar in [#334](https://github.com/python-validators/validators/pull/334) -* fix: manual nav reference for mkdocs; bumps version by @yozachar in [#335](https://github.com/python-validators/validators/pull/335) +* maint: fix `between` & `length` validators by @nandgator in [#334](https://github.com/python-validators/validators/pull/334) +* fix: manual nav reference for mkdocs; bumps version by @nandgator in [#335](https://github.com/python-validators/validators/pull/335) **Full Changelog**: [`0.23.0...0.23.1`](https://github.com/python-validators/validators/compare/0.23.0...0.23.1) @@ -347,17 +347,17 @@ _**Features**_ _**Maintenance**_ * fix: Valid URLs failing validation * query and fragment parts by @danherbriley in [#297](https://github.com/python-validators/validators/pull/297) -* fix: bug in `between` module by @yozachar in [#301](https://github.com/python-validators/validators/pull/301) -* chore: update dependencies, improve packaging by @yozachar in [#304](https://github.com/python-validators/validators/pull/304) +* fix: bug in `between` module by @nandgator in [#301](https://github.com/python-validators/validators/pull/301) +* chore: update dependencies, improve packaging by @nandgator in [#304](https://github.com/python-validators/validators/pull/304) * Fix fragment check by @darkdragon-001 in [#305](https://github.com/python-validators/validators/pull/305) * build(deps): bump urllib3 from 2.0.6 to 2.0.7 in /package by @dependabot in [#310](https://github.com/python-validators/validators/pull/310) * fix: allow pct-encoded entities in fragments by @conitrade-as in [#317](https://github.com/python-validators/validators/pull/317) -* chore: update dev dependencies by @yozachar in [#318](https://github.com/python-validators/validators/pull/318) +* chore: update dev dependencies by @nandgator in [#318](https://github.com/python-validators/validators/pull/318) * build(deps): bump gitpython from 3.1.37 to 3.1.41 in /package by @dependabot in [#321](https://github.com/python-validators/validators/pull/321) * build(deps): bump jinja2 from 3.1.2 to 3.1.3 in /package by @dependabot in [#322](https://github.com/python-validators/validators/pull/322) -* chore: monthly updates for Jan'24 by @yozachar in [#324](https://github.com/python-validators/validators/pull/324) -* maint: adds versiond docs; update copyright year by @yozachar in [#329](https://github.com/python-validators/validators/pull/329) -* chore: update dev dependencies by @yozachar in [#330](https://github.com/python-validators/validators/pull/330) +* chore: monthly updates for Jan'24 by @nandgator in [#324](https://github.com/python-validators/validators/pull/324) +* maint: adds versiond docs; update copyright year by @nandgator in [#329](https://github.com/python-validators/validators/pull/329) +* chore: update dev dependencies by @nandgator in [#330](https://github.com/python-validators/validators/pull/330) * build(deps): bump gitpython from 3.1.37 to 3.1.41 in /package by @dependabot in [#331](https://github.com/python-validators/validators/pull/331) * build(deps): bump jinja2 from 3.1.2 to 3.1.3 in /package by @dependabot in [#332](https://github.com/python-validators/validators/pull/332) * build(deps): bump urllib3 from 2.0.6 to 2.0.7 in /package by @dependabot in [#319](https://github.com/python-validators/validators/pull/319) @@ -380,8 +380,8 @@ _**Maintenance**_ * fix: url validator considers urls with /#/ as valid by @adrienthiery in [#289](https://github.com/python-validators/validators/pull/289) * Add note about ValidationFailure to ValidationError in changes.md by @tswfi in [#291](https://github.com/python-validators/validators/pull/291) -* fix: simple hostname validation regex by @yozachar in [#294](https://github.com/python-validators/validators/pull/294) -* fix: strict CIDR IP validation; bump version by @yozachar in [#295](https://github.com/python-validators/validators/pull/295) +* fix: simple hostname validation regex by @nandgator in [#294](https://github.com/python-validators/validators/pull/294) +* fix: strict CIDR IP validation; bump version by @nandgator in [#295](https://github.com/python-validators/validators/pull/295) **Full Changelog**: [`0.21.2...0.22.0`](https://github.com/python-validators/validators/compare/0.21.2...0.22.0) @@ -391,7 +391,7 @@ _**Maintenance**_ _**Breaking**_ ⚠️ -* `ValidationFailure` is renamed to `ValidationError` in [`yozachar@12ae1f5`](https://github.com/yozachar/pyvalidators/commit/12ae1f5850555d11e1f1a2c03f597fd10610215a) +* `ValidationFailure` is renamed to `ValidationError` in [`nandgator@12ae1f5`](https://github.com/nandgator/pyvalidators/commit/12ae1f5850555d11e1f1a2c03f597fd10610215a) _**Features**_ @@ -400,7 +400,7 @@ _**Features**_ _**Maintenance**_ -* feat: refactoring; updates; fixes; bump version by @yozachar in [#283](https://github.com/python-validators/validators/pull/283)(ref: ) +* feat: refactoring; updates; fixes; bump version by @nandgator in [#283](https://github.com/python-validators/validators/pull/283)(ref: ) * build(deps): bump pymdown-extensions from 9.11 to 10.0 by @dependabot in [#273](https://github.com/python-validators/validators/pull/273) * build(deps): bump requests from 2.28.2 to 2.31.0 by @dependabot in [#275](https://github.com/python-validators/validators/pull/275) * build(deps-dev): bump certifi from 2022.12.7 to 2023.7.22 by @dependabot in [#281](https://github.com/python-validators/validators/pull/281) @@ -419,11 +419,11 @@ _**Features**_ _**Maintenance**_ -* fix: `source .venv/bin/activate` before build by @yozachar in [#260](https://github.com/python-validators/validators/pull/260) -* fix: id-token write permission at job level by @yozachar in [#261](https://github.com/python-validators/validators/pull/261) -* feat: docs can be built with both sphinx & mkdocs by @yozachar in [#262](https://github.com/python-validators/validators/pull/262) -* fix: improves build process by @yozachar in [#263](https://github.com/python-validators/validators/pull/263) -* fix: removes 64-char limit for url path & query by @yozachar in [#264](https://github.com/python-validators/validators/pull/264) +* fix: `source .venv/bin/activate` before build by @nandgator in [#260](https://github.com/python-validators/validators/pull/260) +* fix: id-token write permission at job level by @nandgator in [#261](https://github.com/python-validators/validators/pull/261) +* feat: docs can be built with both sphinx & mkdocs by @nandgator in [#262](https://github.com/python-validators/validators/pull/262) +* fix: improves build process by @nandgator in [#263](https://github.com/python-validators/validators/pull/263) +* fix: removes 64-char limit for url path & query by @nandgator in [#264](https://github.com/python-validators/validators/pull/264) **Full Changelog**: [`0.21.0...0.21.1`](https://github.com/python-validators/validators/compare/0.21.0...0.21.1) @@ -464,36 +464,36 @@ _**Features**_ _**Maintenance**_ -* feat: add build for pypi workflow by @yozachar in [#255](https://github.com/python-validators/validators/pull/255) -* feat: @validator now catches `Exception` by @yozachar in [#254](https://github.com/python-validators/validators/pull/254) -* maint: improves `i18n` package by @yozachar in [#252](https://github.com/python-validators/validators/pull/252) -* maint: misc changes to dev and ci by @yozachar in [#251](https://github.com/python-validators/validators/pull/251) -* maint: misc fixes and improvements by @yozachar in [#249](https://github.com/python-validators/validators/pull/249) -* maint: improves state of package development by @yozachar in [#248](https://github.com/python-validators/validators/pull/248) -* fix: generate dynamic reference docs by @yozachar in [#247](https://github.com/python-validators/validators/pull/247) -* maint: moving docs from `.rst` to `.md` by @yozachar in [#246](https://github.com/python-validators/validators/pull/246) -* maint: improves `url` module by @yozachar in [#245](https://github.com/python-validators/validators/pull/245) -* maint: improve `domain`, `email` & `hostname` by @yozachar in [#244](https://github.com/python-validators/validators/pull/244) -* maint: simplified `hostname` module by @yozachar in [#242](https://github.com/python-validators/validators/pull/242) -* maint: update `email` module by @yozachar in [#241](https://github.com/python-validators/validators/pull/241) -* feat: adds `hostname` validator by @yozachar in [#240](https://github.com/python-validators/validators/pull/240) -* maint: improves `ip_address` module by @yozachar in [#239](https://github.com/python-validators/validators/pull/239) -* fix: misc fixes, use bandit by @yozachar in [#238](https://github.com/python-validators/validators/pull/238) -* Create SECURITY.md by @yozachar in [#237](https://github.com/python-validators/validators/pull/237) -* maint: improves `mac_address`, `slug` and `uuid` by @yozachar in [#236](https://github.com/python-validators/validators/pull/236) -* maint: improve `hashes` and `iban` modules by @yozachar in [#235](https://github.com/python-validators/validators/pull/235) -* feat: auto docs using mkdocstrings by @yozachar in [#234](https://github.com/python-validators/validators/pull/234) -* maint: improves `email` module by @yozachar in [#233](https://github.com/python-validators/validators/pull/233) -* maint: minor improvements by @yozachar in [#232](https://github.com/python-validators/validators/pull/232) -* maint: improves `domain` module by @yozachar in [#231](https://github.com/python-validators/validators/pull/231) -* maint: reformats `card` module, fix typo by @yozachar in [#230](https://github.com/python-validators/validators/pull/230) -* feat: formats google pydoc style for mkdocstring by @yozachar in [#229](https://github.com/python-validators/validators/pull/229) -* maint: refresh `btc_address` module by @yozachar in [#228](https://github.com/python-validators/validators/pull/228) -* maint: improve type annotations by @yozachar in [#227](https://github.com/python-validators/validators/pull/227) -* maint: improves `between` and `length` modules by @yozachar in [#225](https://github.com/python-validators/validators/pull/225) -* maint: follows google's python style guide for docstrings by @yozachar in [#224](https://github.com/python-validators/validators/pull/224) -* feat: type hints in utils.py, gh-actions by @yozachar in [#223](https://github.com/python-validators/validators/pull/223) -* feat: add pyproject.toml, README.md, upd gitignore by @yozachar in [#221](https://github.com/python-validators/validators/pull/221) +* feat: add build for pypi workflow by @nandgator in [#255](https://github.com/python-validators/validators/pull/255) +* feat: @validator now catches `Exception` by @nandgator in [#254](https://github.com/python-validators/validators/pull/254) +* maint: improves `i18n` package by @nandgator in [#252](https://github.com/python-validators/validators/pull/252) +* maint: misc changes to dev and ci by @nandgator in [#251](https://github.com/python-validators/validators/pull/251) +* maint: misc fixes and improvements by @nandgator in [#249](https://github.com/python-validators/validators/pull/249) +* maint: improves state of package development by @nandgator in [#248](https://github.com/python-validators/validators/pull/248) +* fix: generate dynamic reference docs by @nandgator in [#247](https://github.com/python-validators/validators/pull/247) +* maint: moving docs from `.rst` to `.md` by @nandgator in [#246](https://github.com/python-validators/validators/pull/246) +* maint: improves `url` module by @nandgator in [#245](https://github.com/python-validators/validators/pull/245) +* maint: improve `domain`, `email` & `hostname` by @nandgator in [#244](https://github.com/python-validators/validators/pull/244) +* maint: simplified `hostname` module by @nandgator in [#242](https://github.com/python-validators/validators/pull/242) +* maint: update `email` module by @nandgator in [#241](https://github.com/python-validators/validators/pull/241) +* feat: adds `hostname` validator by @nandgator in [#240](https://github.com/python-validators/validators/pull/240) +* maint: improves `ip_address` module by @nandgator in [#239](https://github.com/python-validators/validators/pull/239) +* fix: misc fixes, use bandit by @nandgator in [#238](https://github.com/python-validators/validators/pull/238) +* Create SECURITY.md by @nandgator in [#237](https://github.com/python-validators/validators/pull/237) +* maint: improves `mac_address`, `slug` and `uuid` by @nandgator in [#236](https://github.com/python-validators/validators/pull/236) +* maint: improve `hashes` and `iban` modules by @nandgator in [#235](https://github.com/python-validators/validators/pull/235) +* feat: auto docs using mkdocstrings by @nandgator in [#234](https://github.com/python-validators/validators/pull/234) +* maint: improves `email` module by @nandgator in [#233](https://github.com/python-validators/validators/pull/233) +* maint: minor improvements by @nandgator in [#232](https://github.com/python-validators/validators/pull/232) +* maint: improves `domain` module by @nandgator in [#231](https://github.com/python-validators/validators/pull/231) +* maint: reformats `card` module, fix typo by @nandgator in [#230](https://github.com/python-validators/validators/pull/230) +* feat: formats google pydoc style for mkdocstring by @nandgator in [#229](https://github.com/python-validators/validators/pull/229) +* maint: refresh `btc_address` module by @nandgator in [#228](https://github.com/python-validators/validators/pull/228) +* maint: improve type annotations by @nandgator in [#227](https://github.com/python-validators/validators/pull/227) +* maint: improves `between` and `length` modules by @nandgator in [#225](https://github.com/python-validators/validators/pull/225) +* maint: follows google's python style guide for docstrings by @nandgator in [#224](https://github.com/python-validators/validators/pull/224) +* feat: type hints in utils.py, gh-actions by @nandgator in [#223](https://github.com/python-validators/validators/pull/223) +* feat: add pyproject.toml, README.md, upd gitignore by @nandgator in [#221](https://github.com/python-validators/validators/pull/221) * remove Travis CI settings by @ktdreyer in [#196](https://github.com/python-validators/validators/pull/196) **Full Changelog**: [`0.20.0...0.21.0`](https://github.com/python-validators/validators/compare/0.20.0...0.21.0) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8999b156..981a45fb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -42,7 +42,7 @@ $ . ./.venv/bin/activate # generate documentation $ python package/export TYPE # where TYPE is any of `doc`, `man` or `web`. -# doc - generates docs found here: https://yozachar.github.io/pyvalidators +# doc - generates docs found here: https://nandgator.github.io/pyvalidators # man - generates sphinx based manpages # web - generates sphinx based web docs ``` @@ -83,7 +83,7 @@ $ python -m http.server -d docs/_build/web ### Versioned documentation 1. To preview versioned docs, run `mike serve` (`mike` is a dev dependency). -2. Then (look at ) +2. Then (look at ) - to publish stable docs run `mike deploy -p -u VERSION stable` after checking out to a stable tag name like `0.28.3` (note: document `VERSION = 0.29 if tag_name == 0.29.1`). - to publish bleeding-edge docs run `mike deploy -p -u dev master` after checking out to the `master` branch. 3. This will deploy docs to the `gh-pages` branch (see: ) diff --git a/README.md b/README.md index 926ac79f..7456f316 100644 --- a/README.md +++ b/README.md @@ -24,10 +24,10 @@ True ## Resources - + -- [Documentation](https://yozachar.github.io/pyvalidators) +- [Documentation](https://nandgator.github.io/pyvalidators) - [Bugtracker](https://github.com/python-validators/validators/issues) - [Security](https://github.com/python-validators/validators/blob/master/SECURITY.md) - [Code](https://github.com/python-validators/validators/) @@ -43,8 +43,8 @@ True [sast-link]: https://github.com/python-validators/validators/actions/workflows/sast.yaml [pycqa-badge]: https://github.com/python-validators/validators/actions/workflows/pycqa.yaml/badge.svg [pycqa-link]: https://github.com/python-validators/validators/actions/workflows/pycqa.yaml -[docs-badge]: https://github.com/yozachar/pyvalidators/actions/workflows/pages/pages-build-deployment/badge.svg -[docs-link]: https://github.com/yozachar/pyvalidators/actions/workflows/pages/pages-build-deployment +[docs-badge]: https://github.com/nandgator/pyvalidators/actions/workflows/pages/pages-build-deployment/badge.svg +[docs-link]: https://github.com/nandgator/pyvalidators/actions/workflows/pages/pages-build-deployment [vs-badge]: https://img.shields.io/pypi/v/validators?logo=pypi&logoColor=white&label=version&color=blue [vs-link]: https://pypi.python.org/pypi/validators/ [dw-badge]: https://img.shields.io/pypi/dm/validators?logo=pypi&logoColor=white&color=blue diff --git a/docs/index.md b/docs/index.md index 926ac79f..7456f316 100644 --- a/docs/index.md +++ b/docs/index.md @@ -24,10 +24,10 @@ True ## Resources - + -- [Documentation](https://yozachar.github.io/pyvalidators) +- [Documentation](https://nandgator.github.io/pyvalidators) - [Bugtracker](https://github.com/python-validators/validators/issues) - [Security](https://github.com/python-validators/validators/blob/master/SECURITY.md) - [Code](https://github.com/python-validators/validators/) @@ -43,8 +43,8 @@ True [sast-link]: https://github.com/python-validators/validators/actions/workflows/sast.yaml [pycqa-badge]: https://github.com/python-validators/validators/actions/workflows/pycqa.yaml/badge.svg [pycqa-link]: https://github.com/python-validators/validators/actions/workflows/pycqa.yaml -[docs-badge]: https://github.com/yozachar/pyvalidators/actions/workflows/pages/pages-build-deployment/badge.svg -[docs-link]: https://github.com/yozachar/pyvalidators/actions/workflows/pages/pages-build-deployment +[docs-badge]: https://github.com/nandgator/pyvalidators/actions/workflows/pages/pages-build-deployment/badge.svg +[docs-link]: https://github.com/nandgator/pyvalidators/actions/workflows/pages/pages-build-deployment [vs-badge]: https://img.shields.io/pypi/v/validators?logo=pypi&logoColor=white&label=version&color=blue [vs-link]: https://pypi.python.org/pypi/validators/ [dw-badge]: https://img.shields.io/pypi/dm/validators?logo=pypi&logoColor=white&color=blue diff --git a/docs/index.rst b/docs/index.rst index 4553ec5d..67cfb7b2 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -30,13 +30,13 @@ Resources .. raw:: html - + .. raw:: html -- `Documentation `__ +- `Documentation `__ - `Bugtracker `__ - `Security `__ - `Code `__ @@ -63,8 +63,8 @@ Resources :target: https://github.com/python-validators/validators/actions/workflows/pycqa.yaml .. |SAST| image:: https://github.com/python-validators/validators/actions/workflows/sast.yaml/badge.svg :target: https://github.com/python-validators/validators/actions/workflows/sast.yaml -.. |Docs| image:: https://github.com/yozachar/pyvalidators/actions/workflows/pages/pages-build-deployment/badge.svg - :target: https://github.com/yozachar/pyvalidators/actions/workflows/pages/pages-build-deployment +.. |Docs| image:: https://github.com/nandgator/pyvalidators/actions/workflows/pages/pages-build-deployment/badge.svg + :target: https://github.com/nandgator/pyvalidators/actions/workflows/pages/pages-build-deployment .. |Version| image:: https://img.shields.io/pypi/v/validators?logo=pypi&logoColor=white&label=version&color=blue :target: https://pypi.python.org/pypi/validators/ .. |Downloads| image:: https://img.shields.io/pypi/dm/validators?logo=pypi&logoColor=white&color=blue diff --git a/mkdocs.yaml b/mkdocs.yaml index cf93965a..868fad4d 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -1,6 +1,6 @@ site_name: "validators" site_description: "Automatic documentation from sources, for MkDocs." -site_url: "https://yozachar.github.io/pyvalidators/" +site_url: "https://nandgator.github.io/pyvalidators/" repo_url: "https://github.com/python-validators/validators/" edit_uri: "edit/master/docs/" repo_name: "validators/validators" diff --git a/pyproject.toml b/pyproject.toml index 74cd51f7..78cae56c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ dependencies = [] [project.urls] Homepage = "https://python-validators.github.io/validators" -Documentation = "https://yozachar.github.io/pyvalidators" +Documentation = "https://nandgator.github.io/pyvalidators" Repository = "https://github.com/python-validators/validators" Changelog = "https://github.com/python-validators/validators/blob/master/CHANGES.md" @@ -121,7 +121,7 @@ pythonPlatform = "All" typeCheckingMode = "strict" [tool.pytest.ini_options] -minversion = "6.0" +minversion = ".6.0" pythonpath = ["src"] testpaths = "tests" addopts = ["--doctest-modules"] From 73bdebe1f3bd96f8bc45417230c76c81fc6172a5 Mon Sep 17 00:00:00 2001 From: Joe <38415384+nandgator@users.noreply.github.com> Date: Sat, 14 Mar 2026 12:20:11 +0530 Subject: [PATCH 47/47] fix: update CI workflows to use latest actions and Python versions --- .github/workflows/pycqa.yaml | 12 ++++++------ .github/workflows/sast.yaml | 31 ++++++------------------------- pyproject.toml | 2 +- 3 files changed, 13 insertions(+), 32 deletions(-) diff --git a/.github/workflows/pycqa.yaml b/.github/workflows/pycqa.yaml index 3b34a53f..09bc98da 100644 --- a/.github/workflows/pycqa.yaml +++ b/.github/workflows/pycqa.yaml @@ -14,12 +14,12 @@ jobs: steps: # checkout repository - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 # set up specific python version - - name: Set up Python v3.9 - uses: actions/setup-python@v5 + - name: Set up Python v3.10 + uses: actions/setup-python@v6 with: - python-version: "3.9" + python-version: "3.10" # tooling - name: Install 'tooling' dependencies run: pip install -r package/requirements.tooling.txt @@ -32,8 +32,8 @@ jobs: strategy: fail-fast: true matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] + os: [ubuntu-latest] + python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] runs-on: ${{ matrix.os }} steps: # checkout repository again! diff --git a/.github/workflows/sast.yaml b/.github/workflows/sast.yaml index 167b5695..ce70dee1 100644 --- a/.github/workflows/sast.yaml +++ b/.github/workflows/sast.yaml @@ -1,40 +1,21 @@ # Static Application Security Testing name: sast + on: workflow_dispatch: push: branches: ["master"] pull_request: branches: ["master"] - schedule: - - cron: "00 00 * * 0" + jobs: sast: permissions: - contents: read # for actions/checkout to fetch code - security-events: write # for github/codeql-action/upload-sarif to upload SARIF results - actions: read # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status + security-events: write runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - name: Bandit - uses: mdegis/bandit-action@85fcc340c3b0bf5d86029abb49b9aac916d807b2 + uses: PyCQA/bandit-action@v1 with: - # exit with 0, even with results found - # exit_zero: true # optional, default is DEFAULT - # Github token of the repository (automatically created by Github) - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information. - # File or directory to run bandit on - path: ./src/validators # optional, default is . - # Report only issues of a given severity level or higher. Can be LOW, MEDIUM or HIGH. Default is UNDEFINED (everything) - # level: # optional, default is UNDEFINED - # Report only issues of a given confidence level or higher. Can be LOW, MEDIUM or HIGH. Default is UNDEFINED (everything) - # confidence: # optional, default is UNDEFINED - # comma-separated list of paths (glob patterns supported) to exclude from scan (note that these are in addition to the excluded paths provided in the config file) (default: .svn,CVS,.bzr,.hg,.git,__pycache__,.tox,.eggs,*.egg) - excluded_paths: .github,.pytest_cache,.venv,.vscode,site,tests # optional, default is DEFAULT - # comma-separated list of test IDs to skip - # skips: # optional, default is DEFAULT - # path to a .bandit file that supplies command line arguments - # ini_path: # optional, default is DEFAULT -# https://github.com/marketplace/actions/bandit-scan is ISC licensed, by abirismyname -# https://pypi.org/project/bandit/ is Apache v2.0 licensed, by PyCQA + targets: src/validators + exclude: .github,.pytest_cache,.venv,.vscode,site,tests diff --git a/pyproject.toml b/pyproject.toml index 78cae56c..9001e79f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -121,7 +121,7 @@ pythonPlatform = "All" typeCheckingMode = "strict" [tool.pytest.ini_options] -minversion = ".6.0" +minversion = "6.0" pythonpath = ["src"] testpaths = "tests" addopts = ["--doctest-modules"]