From 60078fe99e815df9fbc0dcd5c2b0745f297cf200 Mon Sep 17 00:00:00 2001 From: DIOD Date: Wed, 1 Nov 2023 16:48:49 +0100 Subject: [PATCH 1/3] Added Industrial_developed_hangman --- Industrial_developed_hangman/Makefile | 14 + Industrial_developed_hangman/README.md | 7 + Industrial_developed_hangman/poetry.lock | 1235 +++++++++++++++++ Industrial_developed_hangman/pyproject.toml | 35 + Industrial_developed_hangman/pytest.ini | 5 + Industrial_developed_hangman/setup.cfg | 48 + .../src/hangman/__init__.py | 0 .../src/hangman/main.py | 170 +++ 8 files changed, 1514 insertions(+) create mode 100644 Industrial_developed_hangman/Makefile create mode 100644 Industrial_developed_hangman/README.md create mode 100644 Industrial_developed_hangman/poetry.lock create mode 100644 Industrial_developed_hangman/pyproject.toml create mode 100644 Industrial_developed_hangman/pytest.ini create mode 100644 Industrial_developed_hangman/setup.cfg create mode 100644 Industrial_developed_hangman/src/hangman/__init__.py create mode 100644 Industrial_developed_hangman/src/hangman/main.py diff --git a/Industrial_developed_hangman/Makefile b/Industrial_developed_hangman/Makefile new file mode 100644 index 00000000000..e4e05f18fb2 --- /dev/null +++ b/Industrial_developed_hangman/Makefile @@ -0,0 +1,14 @@ +lint: + poetry run isort src tests + poetry run flake8 src tests + poetry run mypy src + poetry run mypy tests + +test: + poetry run pytest + +build: + python src/hangman/main.py +install: + pip install poetry + poetry install \ No newline at end of file diff --git a/Industrial_developed_hangman/README.md b/Industrial_developed_hangman/README.md new file mode 100644 index 00000000000..60147752200 --- /dev/null +++ b/Industrial_developed_hangman/README.md @@ -0,0 +1,7 @@ +This is a simple game hangman + +to install dependencies got to repository "Industrial_developed_hangman" by `cd .\Industrial_developed_hangman\` and run `make install` + +to start it use `make build` command + +also makefile have lint command to lint source code \ No newline at end of file diff --git a/Industrial_developed_hangman/poetry.lock b/Industrial_developed_hangman/poetry.lock new file mode 100644 index 00000000000..99bcf936a62 --- /dev/null +++ b/Industrial_developed_hangman/poetry.lock @@ -0,0 +1,1235 @@ +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. + +[[package]] +name = "astor" +version = "0.8.1" +description = "Read/rewrite/write Python ASTs" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +files = [ + {file = "astor-0.8.1-py2.py3-none-any.whl", hash = "sha256:070a54e890cefb5b3739d19f30f5a5ec840ffc9c50ffa7d23cc9fc1a38ebbfc5"}, + {file = "astor-0.8.1.tar.gz", hash = "sha256:6a6effda93f4e1ce9f618779b2dd1d9d84f1e32812c23a29b3fff6fd7f63fa5e"}, +] + +[[package]] +name = "attrs" +version = "23.1.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] + +[[package]] +name = "bandit" +version = "1.7.5" +description = "Security oriented static analyser for python code." +optional = false +python-versions = ">=3.7" +files = [ + {file = "bandit-1.7.5-py3-none-any.whl", hash = "sha256:75665181dc1e0096369112541a056c59d1c5f66f9bb74a8d686c3c362b83f549"}, + {file = "bandit-1.7.5.tar.gz", hash = "sha256:bdfc739baa03b880c2d15d0431b31c658ffc348e907fe197e54e0389dd59e11e"}, +] + +[package.dependencies] +colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} +GitPython = ">=1.0.1" +PyYAML = ">=5.3.1" +rich = "*" +stevedore = ">=1.20.0" + +[package.extras] +test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "tomli (>=1.1.0)"] +toml = ["tomli (>=1.1.0)"] +yaml = ["PyYAML"] + +[[package]] +name = "beautifulsoup4" +version = "4.12.0" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.0-py3-none-any.whl", hash = "sha256:2130a5ad7f513200fae61a17abb5e338ca980fa28c439c0571014bc0217e9591"}, + {file = "beautifulsoup4-4.12.0.tar.gz", hash = "sha256:c5fceeaec29d09c84970e47c65f2f0efe57872f7cff494c9691a26ec0ff13234"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "certifi" +version = "2023.7.22" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "coverage" +version = "7.3.2" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"}, + {file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"}, + {file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"}, + {file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"}, + {file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"}, + {file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"}, + {file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"}, + {file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"}, + {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"}, + {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"}, + {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"}, + {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"}, + {file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"}, + {file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"}, + {file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"}, + {file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"}, + {file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"}, + {file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"}, + {file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"}, + {file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"}, + {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"}, + {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, +] + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "darglint" +version = "1.8.1" +description = "A utility for ensuring Google-style docstrings stay up to date with the source code." +optional = false +python-versions = ">=3.6,<4.0" +files = [ + {file = "darglint-1.8.1-py3-none-any.whl", hash = "sha256:5ae11c259c17b0701618a20c3da343a3eb98b3bc4b5a83d31cdd94f5ebdced8d"}, + {file = "darglint-1.8.1.tar.gz", hash = "sha256:080d5106df149b199822e7ee7deb9c012b49891538f14a11be681044f0bb20da"}, +] + +[[package]] +name = "docutils" +version = "0.20.1" +description = "Docutils -- Python Documentation Utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, + {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, +] + +[[package]] +name = "eradicate" +version = "2.3.0" +description = "Removes commented-out code." +optional = false +python-versions = "*" +files = [ + {file = "eradicate-2.3.0-py3-none-any.whl", hash = "sha256:2b29b3dd27171f209e4ddd8204b70c02f0682ae95eecb353f10e8d72b149c63e"}, + {file = "eradicate-2.3.0.tar.gz", hash = "sha256:06df115be3b87d0fc1c483db22a2ebb12bcf40585722810d809cc770f5031c37"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.3" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "flake8" +version = "6.1.0" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.8.1" +files = [ + {file = "flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"}, + {file = "flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.11.0,<2.12.0" +pyflakes = ">=3.1.0,<3.2.0" + +[[package]] +name = "flake8-bandit" +version = "4.1.1" +description = "Automated security testing with bandit and flake8." +optional = false +python-versions = ">=3.6" +files = [ + {file = "flake8_bandit-4.1.1-py3-none-any.whl", hash = "sha256:4c8a53eb48f23d4ef1e59293657181a3c989d0077c9952717e98a0eace43e06d"}, + {file = "flake8_bandit-4.1.1.tar.gz", hash = "sha256:068e09287189cbfd7f986e92605adea2067630b75380c6b5733dab7d87f9a84e"}, +] + +[package.dependencies] +bandit = ">=1.7.3" +flake8 = ">=5.0.0" + +[[package]] +name = "flake8-broken-line" +version = "1.0.0" +description = "Flake8 plugin to forbid backslashes for line breaks" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "flake8_broken_line-1.0.0-py3-none-any.whl", hash = "sha256:96c964336024a5030dc536a9f6fb02aa679e2d2a6b35b80a558b5136c35832a9"}, + {file = "flake8_broken_line-1.0.0.tar.gz", hash = "sha256:e2c6a17f8d9a129e99c1320fce89b33843e2963871025c4c2bb7b8b8d8732a85"}, +] + +[package.dependencies] +flake8 = ">5" + +[[package]] +name = "flake8-bugbear" +version = "23.9.16" +description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle." +optional = false +python-versions = ">=3.8.1" +files = [ + {file = "flake8-bugbear-23.9.16.tar.gz", hash = "sha256:90cf04b19ca02a682feb5aac67cae8de742af70538590509941ab10ae8351f71"}, + {file = "flake8_bugbear-23.9.16-py3-none-any.whl", hash = "sha256:b182cf96ea8f7a8595b2f87321d7d9b28728f4d9c3318012d896543d19742cb5"}, +] + +[package.dependencies] +attrs = ">=19.2.0" +flake8 = ">=6.0.0" + +[package.extras] +dev = ["coverage", "hypothesis", "hypothesmith (>=0.2)", "pre-commit", "pytest", "tox"] + +[[package]] +name = "flake8-commas" +version = "2.1.0" +description = "Flake8 lint for trailing commas." +optional = false +python-versions = "*" +files = [ + {file = "flake8-commas-2.1.0.tar.gz", hash = "sha256:940441ab8ee544df564ae3b3f49f20462d75d5c7cac2463e0b27436e2050f263"}, + {file = "flake8_commas-2.1.0-py2.py3-none-any.whl", hash = "sha256:ebb96c31e01d0ef1d0685a21f3f0e2f8153a0381430e748bf0bbbb5d5b453d54"}, +] + +[package.dependencies] +flake8 = ">=2" + +[[package]] +name = "flake8-comprehensions" +version = "3.14.0" +description = "A flake8 plugin to help you write better list/set/dict comprehensions." +optional = false +python-versions = ">=3.8" +files = [ + {file = "flake8_comprehensions-3.14.0-py3-none-any.whl", hash = "sha256:7b9d07d94aa88e62099a6d1931ddf16c344d4157deedf90fe0d8ee2846f30e97"}, + {file = "flake8_comprehensions-3.14.0.tar.gz", hash = "sha256:81768c61bfc064e1a06222df08a2580d97de10cb388694becaf987c331c6c0cf"}, +] + +[package.dependencies] +flake8 = ">=3.0,<3.2.0 || >3.2.0" + +[[package]] +name = "flake8-debugger" +version = "4.1.2" +description = "ipdb/pdb statement checker plugin for flake8" +optional = false +python-versions = ">=3.7" +files = [ + {file = "flake8-debugger-4.1.2.tar.gz", hash = "sha256:52b002560941e36d9bf806fca2523dc7fb8560a295d5f1a6e15ac2ded7a73840"}, + {file = "flake8_debugger-4.1.2-py3-none-any.whl", hash = "sha256:0a5e55aeddcc81da631ad9c8c366e7318998f83ff00985a49e6b3ecf61e571bf"}, +] + +[package.dependencies] +flake8 = ">=3.0" +pycodestyle = "*" + +[[package]] +name = "flake8-docstrings" +version = "1.7.0" +description = "Extension for flake8 which uses pydocstyle to check docstrings" +optional = false +python-versions = ">=3.7" +files = [ + {file = "flake8_docstrings-1.7.0-py2.py3-none-any.whl", hash = "sha256:51f2344026da083fc084166a9353f5082b01f72901df422f74b4d953ae88ac75"}, + {file = "flake8_docstrings-1.7.0.tar.gz", hash = "sha256:4c8cc748dc16e6869728699e5d0d685da9a10b0ea718e090b1ba088e67a941af"}, +] + +[package.dependencies] +flake8 = ">=3" +pydocstyle = ">=2.1" + +[[package]] +name = "flake8-eradicate" +version = "1.5.0" +description = "Flake8 plugin to find commented out code" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "flake8_eradicate-1.5.0-py3-none-any.whl", hash = "sha256:18acc922ad7de623f5247c7d5595da068525ec5437dd53b22ec2259b96ce9d22"}, + {file = "flake8_eradicate-1.5.0.tar.gz", hash = "sha256:aee636cb9ecb5594a7cd92d67ad73eb69909e5cc7bd81710cf9d00970f3983a6"}, +] + +[package.dependencies] +attrs = "*" +eradicate = ">=2.0,<3.0" +flake8 = ">5" + +[[package]] +name = "flake8-isort" +version = "6.1.0" +description = "flake8 plugin that integrates isort ." +optional = false +python-versions = ">=3.8" +files = [ + {file = "flake8-isort-6.1.0.tar.gz", hash = "sha256:d4639343bac540194c59fb1618ac2c285b3e27609f353bef6f50904d40c1643e"}, +] + +[package.dependencies] +flake8 = "*" +isort = ">=5.0.0,<6" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "flake8-quotes" +version = "3.3.2" +description = "Flake8 lint for quotes." +optional = false +python-versions = "*" +files = [ + {file = "flake8-quotes-3.3.2.tar.gz", hash = "sha256:6e26892b632dacba517bf27219c459a8396dcfac0f5e8204904c5a4ba9b480e1"}, +] + +[package.dependencies] +flake8 = "*" + +[[package]] +name = "flake8-rst-docstrings" +version = "0.3.0" +description = "Python docstring reStructuredText (RST) validator for flake8" +optional = false +python-versions = ">=3.7" +files = [ + {file = "flake8-rst-docstrings-0.3.0.tar.gz", hash = "sha256:d1ce22b4bd37b73cd86b8d980e946ef198cfcc18ed82fedb674ceaa2f8d1afa4"}, + {file = "flake8_rst_docstrings-0.3.0-py3-none-any.whl", hash = "sha256:f8c3c6892ff402292651c31983a38da082480ad3ba253743de52989bdc84ca1c"}, +] + +[package.dependencies] +flake8 = ">=3" +pygments = "*" +restructuredtext-lint = "*" + +[package.extras] +develop = ["build", "twine"] + +[[package]] +name = "flake8-string-format" +version = "0.3.0" +description = "string format checker, plugin for flake8" +optional = false +python-versions = "*" +files = [ + {file = "flake8-string-format-0.3.0.tar.gz", hash = "sha256:65f3da786a1461ef77fca3780b314edb2853c377f2e35069723348c8917deaa2"}, + {file = "flake8_string_format-0.3.0-py2.py3-none-any.whl", hash = "sha256:812ff431f10576a74c89be4e85b8e075a705be39bc40c4b4278b5b13e2afa9af"}, +] + +[package.dependencies] +flake8 = "*" + +[[package]] +name = "freezegun" +version = "1.2.2" +description = "Let your Python tests travel through time" +optional = false +python-versions = ">=3.6" +files = [ + {file = "freezegun-1.2.2-py3-none-any.whl", hash = "sha256:ea1b963b993cb9ea195adbd893a48d573fda951b0da64f60883d7e988b606c9f"}, + {file = "freezegun-1.2.2.tar.gz", hash = "sha256:cd22d1ba06941384410cd967d8a99d5ae2442f57dfafeff2fda5de8dc5c05446"}, +] + +[package.dependencies] +python-dateutil = ">=2.7" + +[[package]] +name = "gitdb" +version = "4.0.11" +description = "Git Object Database" +optional = false +python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, +] + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.40" +description = "GitPython is a Python library used to interact with Git repositories" +optional = false +python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.40-py3-none-any.whl", hash = "sha256:cf14627d5a8049ffbf49915732e5eddbe8134c3bdb9d476e6182b676fc573f8a"}, + {file = "GitPython-3.1.40.tar.gz", hash = "sha256:22b126e9ffb671fdd0c129796343a02bf67bf2994b35449ffc9321aa755e18a4"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[package.extras] +test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-instafail", "pytest-subtests", "pytest-sugar"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "importlib-metadata" +version = "6.8.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, + {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "isort" +version = "5.12.0" +description = "A Python utility / library to sort Python imports." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, + {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, +] + +[package.extras] +colors = ["colorama (>=0.4.3)"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] +plugins = ["setuptools"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "mypy" +version = "1.5.1" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mypy-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f33592ddf9655a4894aef22d134de7393e95fcbdc2d15c1ab65828eee5c66c70"}, + {file = "mypy-1.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:258b22210a4a258ccd077426c7a181d789d1121aca6db73a83f79372f5569ae0"}, + {file = "mypy-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9ec1f695f0c25986e6f7f8778e5ce61659063268836a38c951200c57479cc12"}, + {file = "mypy-1.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:abed92d9c8f08643c7d831300b739562b0a6c9fcb028d211134fc9ab20ccad5d"}, + {file = "mypy-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:a156e6390944c265eb56afa67c74c0636f10283429171018446b732f1a05af25"}, + {file = "mypy-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6ac9c21bfe7bc9f7f1b6fae441746e6a106e48fc9de530dea29e8cd37a2c0cc4"}, + {file = "mypy-1.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51cb1323064b1099e177098cb939eab2da42fea5d818d40113957ec954fc85f4"}, + {file = "mypy-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:596fae69f2bfcb7305808c75c00f81fe2829b6236eadda536f00610ac5ec2243"}, + {file = "mypy-1.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:32cb59609b0534f0bd67faebb6e022fe534bdb0e2ecab4290d683d248be1b275"}, + {file = "mypy-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:159aa9acb16086b79bbb0016145034a1a05360626046a929f84579ce1666b315"}, + {file = "mypy-1.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f6b0e77db9ff4fda74de7df13f30016a0a663928d669c9f2c057048ba44f09bb"}, + {file = "mypy-1.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:26f71b535dfc158a71264e6dc805a9f8d2e60b67215ca0bfa26e2e1aa4d4d373"}, + {file = "mypy-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc3a600f749b1008cc75e02b6fb3d4db8dbcca2d733030fe7a3b3502902f161"}, + {file = "mypy-1.5.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:26fb32e4d4afa205b24bf645eddfbb36a1e17e995c5c99d6d00edb24b693406a"}, + {file = "mypy-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:82cb6193de9bbb3844bab4c7cf80e6227d5225cc7625b068a06d005d861ad5f1"}, + {file = "mypy-1.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4a465ea2ca12804d5b34bb056be3a29dc47aea5973b892d0417c6a10a40b2d65"}, + {file = "mypy-1.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9fece120dbb041771a63eb95e4896791386fe287fefb2837258925b8326d6160"}, + {file = "mypy-1.5.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d28ddc3e3dfeab553e743e532fb95b4e6afad51d4706dd22f28e1e5e664828d2"}, + {file = "mypy-1.5.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:57b10c56016adce71fba6bc6e9fd45d8083f74361f629390c556738565af8eeb"}, + {file = "mypy-1.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:ff0cedc84184115202475bbb46dd99f8dcb87fe24d5d0ddfc0fe6b8575c88d2f"}, + {file = "mypy-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8f772942d372c8cbac575be99f9cc9d9fb3bd95c8bc2de6c01411e2c84ebca8a"}, + {file = "mypy-1.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5d627124700b92b6bbaa99f27cbe615c8ea7b3402960f6372ea7d65faf376c14"}, + {file = "mypy-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:361da43c4f5a96173220eb53340ace68cda81845cd88218f8862dfb0adc8cddb"}, + {file = "mypy-1.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:330857f9507c24de5c5724235e66858f8364a0693894342485e543f5b07c8693"}, + {file = "mypy-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:c543214ffdd422623e9fedd0869166c2f16affe4ba37463975043ef7d2ea8770"}, + {file = "mypy-1.5.1-py3-none-any.whl", hash = "sha256:f757063a83970d67c444f6e01d9550a7402322af3557ce7630d3c957386fa8f5"}, + {file = "mypy-1.5.1.tar.gz", hash = "sha256:b031b9601f1060bf1281feab89697324726ba0c0bae9d7cd7ab4b690940f0b92"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = ">=4.1.0" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +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 = "packaging" +version = "23.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "pbr" +version = "5.11.1" +description = "Python Build Reasonableness" +optional = false +python-versions = ">=2.6" +files = [ + {file = "pbr-5.11.1-py2.py3-none-any.whl", hash = "sha256:567f09558bae2b3ab53cb3c1e2e33e726ff3338e7bae3db5dc954b3a44eef12b"}, + {file = "pbr-5.11.1.tar.gz", hash = "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"}, +] + +[[package]] +name = "pep8-naming" +version = "0.13.3" +description = "Check PEP-8 naming conventions, plugin for flake8" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pep8-naming-0.13.3.tar.gz", hash = "sha256:1705f046dfcd851378aac3be1cd1551c7c1e5ff363bacad707d43007877fa971"}, + {file = "pep8_naming-0.13.3-py3-none-any.whl", hash = "sha256:1a86b8c71a03337c97181917e2b472f0f5e4ccb06844a0d6f0a33522549e7a80"}, +] + +[package.dependencies] +flake8 = ">=5.0.0" + +[[package]] +name = "pluggy" +version = "1.3.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pycodestyle" +version = "2.11.1" +description = "Python style guide checker" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, + {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, +] + +[[package]] +name = "pydocstyle" +version = "6.3.0" +description = "Python docstring style checker" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pydocstyle-6.3.0-py3-none-any.whl", hash = "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019"}, + {file = "pydocstyle-6.3.0.tar.gz", hash = "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1"}, +] + +[package.dependencies] +snowballstemmer = ">=2.2.0" + +[package.extras] +toml = ["tomli (>=1.2.3)"] + +[[package]] +name = "pyflakes" +version = "3.1.0" +description = "passive checker of Python programs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"}, + {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"}, +] + +[[package]] +name = "pygments" +version = "2.16.1" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pytest" +version = "7.4.2" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, + {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "4.1.0" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, + {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, +] + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] + +[[package]] +name = "pytest-freezer" +version = "0.4.8" +description = "Pytest plugin providing a fixture interface for spulec/freezegun" +optional = false +python-versions = ">= 3.6" +files = [ + {file = "pytest_freezer-0.4.8-py3-none-any.whl", hash = "sha256:644ce7ddb8ba52b92a1df0a80a699bad2b93514c55cf92e9f2517b68ebe74814"}, + {file = "pytest_freezer-0.4.8.tar.gz", hash = "sha256:8ee2f724b3ff3540523fa355958a22e6f4c1c819928b78a7a183ae4248ce6ee6"}, +] + +[package.dependencies] +freezegun = ">=1.0" +pytest = ">=3.6" + +[[package]] +name = "pytest-randomly" +version = "3.15.0" +description = "Pytest plugin to randomly order tests and control random.seed." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest_randomly-3.15.0-py3-none-any.whl", hash = "sha256:0516f4344b29f4e9cdae8bce31c4aeebf59d0b9ef05927c33354ff3859eeeca6"}, + {file = "pytest_randomly-3.15.0.tar.gz", hash = "sha256:b908529648667ba5e54723088edd6f82252f540cc340d748d1fa985539687047"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=3.6.0", markers = "python_version < \"3.10\""} +pytest = "*" + +[[package]] +name = "pytest-timeout" +version = "2.2.0" +description = "pytest plugin to abort hanging tests" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-timeout-2.2.0.tar.gz", hash = "sha256:3b0b95dabf3cb50bac9ef5ca912fa0cfc286526af17afc806824df20c2f72c90"}, + {file = "pytest_timeout-2.2.0-py3-none-any.whl", hash = "sha256:bde531e096466f49398a59f2dde76fa78429a09a12411466f88a07213e220de2"}, +] + +[package.dependencies] +pytest = ">=5.0.0" + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-mock" +version = "1.11.0" +description = "Mock out responses from the requests package" +optional = false +python-versions = "*" +files = [ + {file = "requests-mock-1.11.0.tar.gz", hash = "sha256:ef10b572b489a5f28e09b708697208c4a3b2b89ef80a9f01584340ea357ec3c4"}, + {file = "requests_mock-1.11.0-py2.py3-none-any.whl", hash = "sha256:f7fae383f228633f6bececebdab236c478ace2284d6292c6e7e2867b9ab74d15"}, +] + +[package.dependencies] +requests = ">=2.3,<3" +six = "*" + +[package.extras] +fixture = ["fixtures"] +test = ["fixtures", "mock", "purl", "pytest", "requests-futures", "sphinx", "testtools"] + +[[package]] +name = "restructuredtext-lint" +version = "1.4.0" +description = "reStructuredText linter" +optional = false +python-versions = "*" +files = [ + {file = "restructuredtext_lint-1.4.0.tar.gz", hash = "sha256:1b235c0c922341ab6c530390892eb9e92f90b9b75046063e047cacfb0f050c45"}, +] + +[package.dependencies] +docutils = ">=0.11,<1.0" + +[[package]] +name = "rich" +version = "13.6.0" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.6.0-py3-none-any.whl", hash = "sha256:2b38e2fe9ca72c9a00170a1a2d20c63c790d0e10ef1fe35eba76e1e7b1d7d245"}, + {file = "rich-13.6.0.tar.gz", hash = "sha256:5c14d22737e6d5084ef4771b62d5d4363165b403455a30a1c8ca39dc7b644bef"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "setuptools" +version = "68.2.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, + {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "smmap" +version = "5.0.1" +description = "A pure Python implementation of a sliding window memory map manager" +optional = false +python-versions = ">=3.7" +files = [ + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, +] + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +optional = false +python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] + +[[package]] +name = "soupsieve" +version = "2.5" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] + +[[package]] +name = "stevedore" +version = "5.1.0" +description = "Manage dynamic plugins for Python applications" +optional = false +python-versions = ">=3.8" +files = [ + {file = "stevedore-5.1.0-py3-none-any.whl", hash = "sha256:8cc040628f3cea5d7128f2e76cf486b2251a4e543c7b938f58d9a377f6694a2d"}, + {file = "stevedore-5.1.0.tar.gz", hash = "sha256:a54534acf9b89bc7ed264807013b505bf07f74dbe4bcfa37d32bd063870b087c"}, +] + +[package.dependencies] +pbr = ">=2.0.0,<2.1.0 || >2.1.0" + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "types-requests" +version = "2.31.0.2" +description = "Typing stubs for requests" +optional = false +python-versions = "*" +files = [ + {file = "types-requests-2.31.0.2.tar.gz", hash = "sha256:6aa3f7faf0ea52d728bb18c0a0d1522d9bfd8c72d26ff6f61bfc3d06a411cf40"}, + {file = "types_requests-2.31.0.2-py3-none-any.whl", hash = "sha256:56d181c85b5925cbc59f4489a57e72a8b2166f18273fd8ba7b6fe0c0b986f12a"}, +] + +[package.dependencies] +types-urllib3 = "*" + +[[package]] +name = "types-urllib3" +version = "1.26.25.14" +description = "Typing stubs for urllib3" +optional = false +python-versions = "*" +files = [ + {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, + {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, +] + +[[package]] +name = "typing-extensions" +version = "4.8.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, +] + +[[package]] +name = "urllib3" +version = "2.0.7" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"}, + {file = "urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "wemake-python-styleguide" +version = "0.18.0" +description = "The strictest and most opinionated python linter ever" +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "wemake_python_styleguide-0.18.0-py3-none-any.whl", hash = "sha256:2219be145185edcd5e01f4ce49e3dea11acc34f2c377face0c175bb6ea6ac988"}, + {file = "wemake_python_styleguide-0.18.0.tar.gz", hash = "sha256:69139858cf5b2a9ba09dac136e2873a4685515768f68fdef2684ebefd7b1dafd"}, +] + +[package.dependencies] +astor = ">=0.8,<0.9" +attrs = "*" +darglint = ">=1.2,<2.0" +flake8 = ">5" +flake8-bandit = ">=4.1,<5.0" +flake8-broken-line = ">=1.0,<2.0" +flake8-bugbear = ">=23.5,<24.0" +flake8-commas = ">=2.0,<3.0" +flake8-comprehensions = ">=3.1,<4.0" +flake8-debugger = ">=4.0,<5.0" +flake8-docstrings = ">=1.3,<2.0" +flake8-eradicate = ">=1.5,<2.0" +flake8-isort = ">=6.0,<7.0" +flake8-quotes = ">=3.0,<4.0" +flake8-rst-docstrings = ">=0.3,<0.4" +flake8-string-format = ">=0.3,<0.4" +pep8-naming = ">=0.13,<0.14" +pygments = ">=2.4,<3.0" +setuptools = "*" +typing_extensions = ">=4.0,<5.0" + +[[package]] +name = "zipp" +version = "3.17.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.9" +content-hash = "b725c780b419b14540a1d4801f1849230d4e8a1b51a9381e36ff476eb8ab598c" diff --git a/Industrial_developed_hangman/pyproject.toml b/Industrial_developed_hangman/pyproject.toml new file mode 100644 index 00000000000..b70606ab82f --- /dev/null +++ b/Industrial_developed_hangman/pyproject.toml @@ -0,0 +1,35 @@ +[tool.poetry] +name = "Hangman" +version = "0.2.0" +description = "" +authors = ["DiodDan "] +readme = "README.md" +packages = [{include = "hangman", from = "src"}] + +[tool.poetry.dependencies] +python = "^3.9" +requests = "2.31.0" +colorama = "0.4.6" +beautifulsoup4 = "4.12" + + +[tool.poetry.group.dev.dependencies] +mypy = "1.5.1" +wemake-python-styleguide = "0.18.0" +isort = "5.12.0" +pytest = "7.4.2" +pytest-cov = "4.1.0" +pytest-timeout = "2.2.0" +pytest-randomly = "3.15.0" +requests-mock = "1.11.0" +pytest-freezer = "0.4.8" +types-requests = " 2.31.0.2" + +[build-system] +requires = ["poetry-core", "colorama", "bs4", "requests"] +build-backend = "poetry.core.masonry.api" + +[tool.isort] +line_length = 80 +multi_line_output = 3 +include_trailing_comma = true diff --git a/Industrial_developed_hangman/pytest.ini b/Industrial_developed_hangman/pytest.ini new file mode 100644 index 00000000000..f51da414608 --- /dev/null +++ b/Industrial_developed_hangman/pytest.ini @@ -0,0 +1,5 @@ +[pytest] +markers = + internet_required: marks tests that requires internet connection (deselect with '-m "not internet_required"') + serial +timeout = 20 diff --git a/Industrial_developed_hangman/setup.cfg b/Industrial_developed_hangman/setup.cfg new file mode 100644 index 00000000000..f57029a0492 --- /dev/null +++ b/Industrial_developed_hangman/setup.cfg @@ -0,0 +1,48 @@ +[flake8] +max-line-length = 120 +docstring_style = sphinx +max-arguments = 6 +exps-for-one-empty-line = 0 +ignore = + D100, + D104, + +per-file-ignores = + tests/*: + # Missing docstring in public class + D101, + # Missing docstring in public method + D102, + # Missing docstring in public function + D103, + # Missing docstring in magic method + D105, + # Missing docstring in __init__ + D107, + # Use of assert detected. The enclosed code will be removed when compiling to optimised byte code. + S101, + # Found magic number + WPS432, + # Found wrong keyword: pass + WPS420, + # Found incorrect node inside `class` body + WPS604, + # Found outer scope names shadowing: message_update + WPS442, + # Found comparison with float or complex number + WPS459, + # split between test action and assert + WPS473, + # Found compare with falsy constant + WPS520, + # Found string literal over-use + WPS226 + # Found overused expression + WPS204 + # Found too many module members + WPS202 + +[mypy] +ignore_missing_imports = True +check_untyped_defs = True +disallow_untyped_calls = True diff --git a/Industrial_developed_hangman/src/hangman/__init__.py b/Industrial_developed_hangman/src/hangman/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/Industrial_developed_hangman/src/hangman/main.py b/Industrial_developed_hangman/src/hangman/main.py new file mode 100644 index 00000000000..bad2a4470d0 --- /dev/null +++ b/Industrial_developed_hangman/src/hangman/main.py @@ -0,0 +1,170 @@ +import random +import time +from enum import Enum +from pathlib import Path +from typing import Callable, List + +import requests +from bs4 import BeautifulSoup +from colorama import Fore, Style + +DEBUG = False +success_code = 200 +request_timeout = 1000 +data_path = Path(__file__).parent.parent.parent / 'Data' +year = 4800566455 + + +class Source(Enum): + """Enum that represents switch between local and web word parsing.""" + + FROM_FILE = 0 # noqa: WPS115 + FROM_INTERNET = 1 # noqa: WPS115 + + +def print_wrong(text: str, print_function: Callable[[str], None]) -> None: + """ + Print styled text(red). + + :parameter text: text to print. + :parameter print_function: Function that will be used to print in game. + """ + text_to_print = Style.RESET_ALL + Fore.RED + text + print_function(text_to_print) + + +def print_right(text: str, print_function: Callable[[str], None]) -> None: + """ + Print styled text(red). + + :parameter text: text to print. + :parameter print_function: Function that will be used to print in game. + """ + print_function(Style.RESET_ALL + Fore.GREEN + text) + + +def parse_word_from_local(choice_function: Callable[[List[str]], str] = random.choice) -> str: + # noqa: DAR201 + """ + Parse word from local file. + + :parameter choice_function: Function that will be used to choice a word from file. + :returns str: string that contains the word. + :raises FileNotFoundError: file to read words not found. + """ + try: + with open(data_path / 'local_words.txt', encoding='utf8') as words_file: + return choice_function(words_file.read().split('\n')) + except FileNotFoundError: + raise FileNotFoundError('File local_words.txt was not found') + + +def parse_word_from_site(url: str = 'https://randomword.com') -> str: + # noqa: DAR201 + """ + Parse word from website. + + :param url: url that word will be parsed from. + :return Optional[str]: string that contains the word. + :raises ConnectionError: no connection to the internet. + :raises RuntimeError: something go wrong with getting the word from site. + """ + try: + page: requests.Response = requests.get(url, timeout=request_timeout) + except ConnectionError: + raise ConnectionError('There is no connection to the internet') + if page.status_code == success_code: + soup = BeautifulSoup(page.text, 'html.parser') + return soup.find('div', id='random_word').text + raise RuntimeError('Something go wrong with getting the word from site') + + +class MainProcess(object): + """Manages game process.""" + + def __init__(self, source: Enum, pr_func: Callable, in_func: Callable, ch_func: Callable) -> None: + """ + Init MainProcess object. + + :parameter in_func: Function that will be used to get input in game. + :parameter source: Represents source to get word. + :parameter pr_func: Function that will be used to print in game. + :parameter ch_func: Function that will be used to choice word. + """ + self._source = source + self._answer_word = '' + self._word_string_to_show = '' + self._guess_attempts_coefficient = 2 + self._print_function = pr_func + self._input_function = in_func + self._choice_function = ch_func + + def get_word(self) -> str: + # noqa: DAR201 + """ + Parse word(wrapper for local and web parse). + + :returns str: string that contains the word. + :raises AttributeError: Not existing enum + """ + if self._source == Source.FROM_INTERNET: + return parse_word_from_site() + elif self._source == Source.FROM_FILE: + return parse_word_from_local(self._choice_function) + raise AttributeError('Non existing enum') + + def user_lose(self) -> None: + """Print text for end of game and exits.""" + print_wrong(f"YOU LOST(the word was '{self._answer_word}')", self._print_function) # noqa:WPS305 + + def user_win(self) -> None: + """Print text for end of game and exits.""" + print_wrong(f'{self._word_string_to_show} YOU WON', self._print_function) # noqa:WPS305 + + def game_process(self, user_character: str) -> bool: + # noqa: DAR201 + """ + Process user input. + + :parameter user_character: User character. + :returns bool: state of game. + """ + if user_character in self._answer_word: + word_list_to_show = list(self._word_string_to_show) + for index, character in enumerate(self._answer_word): + if character == user_character: + word_list_to_show[index] = user_character + self._word_string_to_show = ''.join(word_list_to_show) + else: + print_wrong('There is no such character in word', self._print_function) + if self._answer_word == self._word_string_to_show: + self.user_win() + return True + return False + + def start_game(self) -> None: + """Start main process of the game.""" + if time.time() > year: + print_right('this program is more then 100years age', self._print_function) + with open(data_path / 'text_images.txt', encoding='utf8') as text_images_file: + print_wrong(text_images_file.read(), self._print_function) + print_wrong('Start guessing...', self._print_function) + self._answer_word = self.get_word() + self._word_string_to_show = '_' * len(self._answer_word) + attempts_amount = int(self._guess_attempts_coefficient * len(self._answer_word)) + if DEBUG: + print_right(self._answer_word, self._print_function) + for attempts in range(attempts_amount): + user_remaining_attempts = attempts_amount - attempts + print_right(f'You have {user_remaining_attempts} more attempts', self._print_function) # noqa:WPS305 + print_right(f'{self._word_string_to_show} enter character to guess: ', self._print_function) # noqa:WPS305 + user_character = self._input_function().lower() + if self.game_process(user_character): + break + if '_' in self._word_string_to_show: + self.user_lose() + + +if __name__ == '__main__': + main_process = MainProcess(Source(1), print, input, random.choice) + main_process.start_game() From 1c04b3a094eb4cd4f7b67bbdab6e2f382d132762 Mon Sep 17 00:00:00 2001 From: DIOD Date: Wed, 1 Nov 2023 18:53:30 +0100 Subject: [PATCH 2/3] Image Added into Industrial_developed_hangman readme --- .../Data/local_words.txt | 200 ++++++++++++++++++ .../Data/text_images.txt | 16 ++ Industrial_developed_hangman/README.md | 5 + Industrial_developed_hangman/recorces/img.png | Bin 0 -> 42763 bytes .../tests/__init__.py | 0 .../tests/test_hangman/__init__.py | 0 .../tests/test_hangman/test_main.py | 105 +++++++++ 7 files changed, 326 insertions(+) create mode 100644 Industrial_developed_hangman/Data/local_words.txt create mode 100644 Industrial_developed_hangman/Data/text_images.txt create mode 100644 Industrial_developed_hangman/recorces/img.png create mode 100644 Industrial_developed_hangman/tests/__init__.py create mode 100644 Industrial_developed_hangman/tests/test_hangman/__init__.py create mode 100644 Industrial_developed_hangman/tests/test_hangman/test_main.py diff --git a/Industrial_developed_hangman/Data/local_words.txt b/Industrial_developed_hangman/Data/local_words.txt new file mode 100644 index 00000000000..ba958fe23e4 --- /dev/null +++ b/Industrial_developed_hangman/Data/local_words.txt @@ -0,0 +1,200 @@ +jam +veteran +environmental +sound +make +first-hand +disposition +handy +dance +expression +take +professor +swipe +publisher +tube +thread +paradox +bold +feeling +seal +medicine +ancestor +designer +sustain +define +stomach +minister +coffee +disorder +cow +clash +sector +discount +anger +nationalist +cater +mole +speculate +far +retirement +rub +sample +contribution +distance +palace +holiday +native +debut +steak +tired +pump +mayor +develop +cool +economics +prospect +regular +suntan +husband +praise +rule +soprano +secular +interactive +barrel +permanent +childish +ministry +rank +ball +difficult +linger +comfortable +education +grief +check +user +fish +catch +aquarium +photograph +aisle +justice +preoccupation +liberal +diagram +disturbance +separation +concentration +tidy +appointment +fling +exception +gutter +nature +relieve +illustrate +bathtub +cord +bus +divorce +country +mountain +slump +acquit +inn +achieve +bloodshed +bundle +spell +petty +closed +mud +begin +robot +chorus +prison +lend +bomb +exploration +wrist +fist +agency +example +factory +disagreement +assault +absolute +consider +sign +raw +flood +definition +implication +judge +extraterrestrial +corn +breakfast +shelter +buffet +seize +credit +hardship +growth +velvet +application +cheese +secretion +loop +smile +withdrawal +execute +daughter +quota +deny +defeat +knee +brain +packet +ignorance +core +stumble +glide +reign +huge +position +alive +we +gate +replacement +mourning +incapable +reach +rehearsal +profile +fax +sit +compete +smart +gradient +tough +house +pocket +spider +ditch +critical +ignorant +policy +experience +exhibition +forum +contribution +wrestle +cave +bet +stool +store +formal +basketball +journal diff --git a/Industrial_developed_hangman/Data/text_images.txt b/Industrial_developed_hangman/Data/text_images.txt new file mode 100644 index 00000000000..06338355b18 --- /dev/null +++ b/Industrial_developed_hangman/Data/text_images.txt @@ -0,0 +1,16 @@ +╔══╗─╔╗╔╗╔══╗╔═══╗─╔══╗╔╗╔╗╔╗╔╗╔══╗ +║╔╗║─║║║║║╔═╝║╔══╝─║╔╗║║║║║║║║║║╔╗║ +║╚╝╚╗║║║║║║──║╚══╗─║║║║║║║║║║║║║╚╝║ +║╔═╗║║║╔║║║──║╔══╝─║║║║║║╔║║║║║║╔╗║ +║╚═╝║║╚╝║║╚═╗║╚══╗╔╝║║║║╚╝║║╚╝║║║║║ +╚═══╝╚══╝╚══╝╚═══╝╚═╝╚╝╚══╝╚══╗╚╝╚╝ + ⡖⠒⢒⣶⠖⠒⠒⠒⡖⠒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⡇⣠⠟⠁⠀⠀⠀⡖⠓⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⡿⠉⠀⠀⠀⠀⠀⢹⣞⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⡇⠀⠀⠀⠀⠀⣠⠻⡟⢧⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀ ⡇⠀⠀⠀⠀⠐⠃⢨⡧⠀⠳⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀ ⡇⠀⠀⠀⠀⠀⠀⠠⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀ ⡇⠀⠀⠀⠀⠀⠀⢨⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀ ⡇⠀⠀⠀⠀⠀⠀⠆⠘⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀ ⡇⠀⠀⠀⠀⠀⠈⠀⠀⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀ ⠧⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤ diff --git a/Industrial_developed_hangman/README.md b/Industrial_developed_hangman/README.md index 60147752200..71fb5bd5724 100644 --- a/Industrial_developed_hangman/README.md +++ b/Industrial_developed_hangman/README.md @@ -4,4 +4,9 @@ to install dependencies got to repository "Industrial_developed_hangman" by `cd to start it use `make build` command +example of programm run: + + +![img.png](recorces/img.png) + also makefile have lint command to lint source code \ No newline at end of file diff --git a/Industrial_developed_hangman/recorces/img.png b/Industrial_developed_hangman/recorces/img.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9930e1d230194900cf7c7b1aaf7edd25866963 GIT binary patch literal 42763 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 None: + self.container: List[str] = [] + + def __call__(self, value_to_print: str) -> None: + self.container.append(str(value_to_print)) + + +class FkInput(object): + def __init__(self, values_to_input: List[str]) -> None: + self.values_to_input: List[str] = values_to_input + + def __call__(self) -> str: + return self.values_to_input.pop(0) + + +@pytest.fixture +def choice_fn() -> Callable: + return lambda array: array[0] # noqa: E731 + + +def test_parse_word_from_local() -> None: + assert isinstance(parse_word_from_local(), str) + + +def test_parse_word_from_local_error() -> None: + data_path = Path(os.path.abspath('')) / 'Data' + real_name = 'local_words.txt' + time_name = 'local_words_not_exist.txt' + + os.rename(data_path / real_name, data_path / time_name) + with pytest.raises(FileNotFoundError): + parse_word_from_local() + os.rename(data_path / time_name, data_path / real_name) + + +@pytest.mark.internet_required +def test_parse_word_from_site() -> None: + assert isinstance(parse_word_from_site(), str) + + +def test_parse_word_from_site_no_internet() -> None: + with requests_mock.Mocker() as mock: + mock.get('https://randomword.com', text='
some text
') + assert parse_word_from_site() == 'some text' + + +def test_parse_word_from_site_err() -> None: + with pytest.raises(RuntimeError): + parse_word_from_site(url='https://www.google.com/dsfsdfds/sdfsdf/sdfds') + + +def test_get_word(choice_fn: Callable) -> None: + fk_print = FkPrint() + fk_input = FkInput(['none']) + main_process = MainProcess(Source(1), pr_func=fk_print, in_func=fk_input, ch_func=choice_fn) + + assert isinstance(main_process.get_word(), str) + + +def test_start_game_win(choice_fn: Callable) -> None: + fk_print = FkPrint() + fk_input = FkInput(['j', 'a', 'm']) + main_process = MainProcess(Source(0), pr_func=fk_print, in_func=fk_input, ch_func=choice_fn) + + main_process.start_game() + + assert 'YOU WON' in fk_print.container[-1] + + +@pytest.mark.parametrize('input_str', [[letter] * 10 for letter in 'qwertyuiopasdfghjklzxcvbnm']) # noqa: WPS435 +def test_start_game_loose(input_str: List[str], choice_fn: Callable) -> None: + fk_print = FkPrint() + fk_input = FkInput(input_str) + main_process = MainProcess(Source(0), pr_func=fk_print, in_func=fk_input, ch_func=choice_fn) + + main_process.start_game() + + assert 'YOU LOST' in fk_print.container[-1] + + +def test_wow_year(freezer, choice_fn: Callable) -> None: + freezer.move_to('2135-10-17') + fk_print = FkPrint() + fk_input = FkInput(['none'] * 100) # noqa: WPS435 + main_process = MainProcess(Source(0), pr_func=fk_print, in_func=fk_input, ch_func=choice_fn) + + main_process.start_game() + + assert 'this program' in fk_print.container[0] From c5997d4a4e2960b4d5f4c85534b7169c6cd50ddd Mon Sep 17 00:00:00 2001 From: DIOD Date: Fri, 3 Nov 2023 02:19:36 +0100 Subject: [PATCH 3/3] Industrial_developed_hangman changed to api usage --- Industrial_developed_hangman/src/hangman/main.py | 11 +++++------ .../tests/test_hangman/test_main.py | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Industrial_developed_hangman/src/hangman/main.py b/Industrial_developed_hangman/src/hangman/main.py index bad2a4470d0..b2a7e780ac3 100644 --- a/Industrial_developed_hangman/src/hangman/main.py +++ b/Industrial_developed_hangman/src/hangman/main.py @@ -1,3 +1,4 @@ +import json import random import time from enum import Enum @@ -5,7 +6,6 @@ from typing import Callable, List import requests -from bs4 import BeautifulSoup from colorama import Fore, Style DEBUG = False @@ -59,7 +59,7 @@ def parse_word_from_local(choice_function: Callable[[List[str]], str] = random.c raise FileNotFoundError('File local_words.txt was not found') -def parse_word_from_site(url: str = 'https://randomword.com') -> str: +def parse_word_from_site(url: str = 'https://random-word-api.herokuapp.com/word') -> str: # noqa: DAR201 """ Parse word from website. @@ -70,12 +70,11 @@ def parse_word_from_site(url: str = 'https://randomword.com') -> str: :raises RuntimeError: something go wrong with getting the word from site. """ try: - page: requests.Response = requests.get(url, timeout=request_timeout) + response: requests.Response = requests.get(url, timeout=request_timeout) except ConnectionError: raise ConnectionError('There is no connection to the internet') - if page.status_code == success_code: - soup = BeautifulSoup(page.text, 'html.parser') - return soup.find('div', id='random_word').text + if response.status_code == success_code: + return json.loads(response.content.decode())[0] raise RuntimeError('Something go wrong with getting the word from site') diff --git a/Industrial_developed_hangman/tests/test_hangman/test_main.py b/Industrial_developed_hangman/tests/test_hangman/test_main.py index 052c1960aab..46d0b1d6f0e 100644 --- a/Industrial_developed_hangman/tests/test_hangman/test_main.py +++ b/Industrial_developed_hangman/tests/test_hangman/test_main.py @@ -56,7 +56,7 @@ def test_parse_word_from_site() -> None: def test_parse_word_from_site_no_internet() -> None: with requests_mock.Mocker() as mock: - mock.get('https://randomword.com', text='
some text
') + mock.get('https://random-word-api.herokuapp.com/word', text='["some text"]') assert parse_word_from_site() == 'some text'