From 9e66f75ca7ec03d4d970a2a6a86a23e9b5e4418c Mon Sep 17 00:00:00 2001 From: Thomas Buckley-Houston Date: Sat, 1 Jul 2023 12:26:52 -0500 Subject: [PATCH 1/6] ci: migrate to Poetry and modernise Poetry is currently the most popular Python dependency manager. Whilst it is ostenibly a replacement for the `requirements.txt` convention it is also encourages more general best practices such as; dependency lockfiles, releasing, task running, and so on. This commit also introduces Ruff, a modern Python linter, that in our case replaces our dependencies on `flake8` and `bandit`. --- .github/workflows/ci.yml | 154 ++- MANIFEST.in | 1 - README.md | 7 + RELEASING.md | 24 +- docs/source/index.rst | 2 +- docs/source/pages/tutorial.rst | 2 +- .../server/tests/unit/test_features.py | 6 +- poetry.lock | 1197 +++++++++++++++++ pygls/__init__.py | 2 - pyproject.toml | 62 +- scripts/check_client_is_uptodate.py | 26 + scripts/{gen_client.py => generate_client.py} | 2 - setup.cfg | 66 - setup.py | 6 - tests/lsp/test_inlay_hints.py | 1 - tests/pyodide_testrunner/requirements.txt | 2 - tests/pyodide_testrunner/run.py | 11 +- tests/test_client.py | 2 +- tox.ini | 21 - 19 files changed, 1400 insertions(+), 194 deletions(-) delete mode 100644 MANIFEST.in create mode 100644 poetry.lock create mode 100644 scripts/check_client_is_uptodate.py rename scripts/{gen_client.py => generate_client.py} (99%) delete mode 100644 setup.cfg delete mode 100755 setup.py delete mode 100644 tests/pyodide_testrunner/requirements.txt delete mode 100644 tox.ini diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index da52d09e..e21dbd42 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,101 +4,141 @@ on: - push - pull_request +defaults: + run: + shell: bash + jobs: + pre_job: + runs-on: ubuntu-latest + outputs: + should_skip: ${{ steps.skip_check.outputs.should_skip }} + steps: + - id: skip_check + uses: fkirc/skip-duplicate-actions@v5 + with: + concurrent_skipping: 'outdated_runs' + cancel_others: 'true' + skip_after_successful_duplicate: 'false' + test: + needs: pre_job + if: needs.pre_job.outputs.should_skip != 'true' strategy: matrix: os: [ubuntu-latest, windows-latest] python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"] - runs-on: ${{ matrix.os }} - steps: - - uses: actions/checkout@v2 - + - uses: actions/checkout@v3 - name: Use Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - - - name: Get pip cache dir - id: pip-cache - run: | - echo "::set-output name=dir::$(pip cache dir)" - - - name: pip cache - uses: actions/cache@v2 + - name: Install Poetry + uses: snok/install-poetry@v1 with: - path: ${{ steps.pip-cache.outputs.dir }} - key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} - restore-keys: | - ${{ runner.os }}-pip- - - - name: Install Python dependencies - run: python -m pip install --upgrade pip tox - - - name: tox - run: tox -e py + virtualenvs-in-project: true + - name: Load cached venv + id: cached-poetry-dependencies + uses: actions/cache@v3 + with: + path: .venv + key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }} + - name: Install dependencies + if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' + run: poetry install --all-extras + - name: Run tests + run: | + source $VENV # Only needed because of Github Action caching + poe test test-pyodide: + needs: pre_job + if: needs.pre_job.outputs.should_skip != 'true' runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - + - uses: actions/checkout@v3 - name: Use Python "3.10" - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 with: python-version: "3.10" - + - name: Install Poetry + uses: snok/install-poetry@v1 + with: + virtualenvs-in-project: true - name: Install Dependencies + if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' run: | - sudo apt update sudo apt install chromium-browser chromium-chromedriver - - python -m pip install --upgrade pip - python -m pip install -r tests/pyodide_testrunner/requirements.txt - + poetry install --with pyodide - name: Run Testsuite - run: python tests/pyodide_testrunner/run.py + run: | + source $VENV + poe test-pyodide - build: + lint: + needs: pre_job + if: needs.pre_job.outputs.should_skip != 'true' runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: fetch-depth: 0 - - name: Use Python - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 with: python-version: "3.x" - - - name: Get pip cache dir - id: pip-cache + - name: Install Poetry + uses: snok/install-poetry@v1 + with: + virtualenvs-in-project: true + - name: Load cached venv + id: cached-poetry-dependencies + uses: actions/cache@v3 + with: + path: .venv + key: venv-${{ hashFiles('**/poetry.lock') }} + - name: Install dependencies + if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' + run: poetry install --all-extras --with dev + - name: Run lints run: | - echo "::set-output name=dir::$(pip cache dir)" + source $VENV + poe lint - - name: pip cache - uses: actions/cache@v2 + build: + needs: pre_job + if: needs.pre_job.outputs.should_skip != 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 with: - path: ${{ steps.pip-cache.outputs.dir }} - key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} - restore-keys: | - ${{ runner.os }}-pip- - - - name: Install Python dependencies - run: python -m pip install --upgrade build - - - name: Build packges (sdist and wheel) + fetch-depth: 0 + - name: Use Python + uses: actions/setup-python@v4 + with: + python-version: "3.x" + - name: Install Poetry + uses: snok/install-poetry@v1 + with: + virtualenvs-in-project: true + - name: Load cached venv + id: cached-poetry-dependencies + uses: actions/cache@v3 + with: + path: .venv + key: venv-${{ hashFiles('**/poetry.lock') }} + - name: Install dependencies + if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' + run: poetry install --all-extras + - name: Build packages (sdist and wheel) run: | git describe --tags --abbrev=0 - python -m build - + poetry build - name: Upload builds - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: build-artifacts path: "dist/*" diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index c1e44a0a..00000000 --- a/MANIFEST.in +++ /dev/null @@ -1 +0,0 @@ -include *.md *.txt *.ini **/py.typed \ No newline at end of file diff --git a/README.md b/README.md index ab04ac32..c52b729f 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,13 @@ There are also other Language Servers with "general" in their descriptons, or at * https://github.com/mattn/efm-langserver * https://github.com/jose-elias-alvarez/null-ls.nvim (Neovim only) +## Tests + +* `poetry install --all-extras` +* `poetry run test` +* `poetry run test-pyodide` + + ## Contributing Your contributions to _pygls_ are most welcome ❤️ Please review the [Contributing](https://github.com/openlawlibrary/pygls/blob/master/CONTRIBUTING.md) and [Code of Conduct](https://github.com/openlawlibrary/pygls/blob/master/CODE_OF_CONDUCT.md) documents for how to get started. diff --git a/RELEASING.md b/RELEASING.md index 0d4cdc55..59acf0ba 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -8,27 +8,9 @@ Release notes are kept in CHANGELOG.md ## Steps to release - * Install: - * Python's [build module](https://pypa-build.readthedocs.io/en/latest/) with Pip or your - OS's package manager - * [Twine](https://twine.readthedocs.io/en/stable/) for interacting with pypi.org - * It's probably best to make a dedicated release branch, but not essential - * Update CHANGELOG.md - * Change version in pygls/__init__.py - * Commit - +Update version in `pyproject.toml` ```sh -# Python's `setuptools` automatically derives the version from the latest Git tag. -# NB. If the latest commit doesn't have a tag, then `setuptools` will add `dev-[hash]` to the version. -git tag v"$(python -c 'from pygls import __version__; print(__version__)')" -git push --tags # not required for releasing, just needed because normal `git push` won't send the tags - -# Build the project into the Source and Wheel formats (they go into `./dist`) -rm -rf dist pygls.egg-info -python -m build - -# Upload to Pypi -# You'll also need, or have access to, the Pygls Pypi org or account. Likely from @dgreisen -twine upload dist/* +poetry build +poetry publish --username "$PYPI_USERNAME" --password "$PYPI_PASSWORD" ``` diff --git a/docs/source/index.rst b/docs/source/index.rst index 9c716a60..1d442917 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -30,7 +30,7 @@ Features Python Versions --------------- -*pygls* works with Python 3.7+. +*pygls* works with Python 3.7.16+. User Guide ---------- diff --git a/docs/source/pages/tutorial.rst b/docs/source/pages/tutorial.rst index 895ad20e..44c68847 100644 --- a/docs/source/pages/tutorial.rst +++ b/docs/source/pages/tutorial.rst @@ -15,7 +15,7 @@ In order to setup and run the example VSCode extension, you need following softw installed: * `Visual Studio Code `_ editor -* `Python 3.7+ `_ +* `Python 3.7.16+ `_ * `vscode-python `_ extension * A clone of the `pygls `_ repository diff --git a/examples/json-vscode-extension/server/tests/unit/test_features.py b/examples/json-vscode-extension/server/tests/unit/test_features.py index 053d5f6a..1b762ace 100644 --- a/examples/json-vscode-extension/server/tests/unit/test_features.py +++ b/examples/json-vscode-extension/server/tests/unit/test_features.py @@ -139,7 +139,7 @@ def test_show_configuration_callback(): ) server.show_message.assert_called_with( - f'jsonServer.exampleConfiguration value: some_value' + 'jsonServer.exampleConfiguration value: some_value' ) @@ -170,7 +170,7 @@ async def send_response(): ) server.show_message.assert_called_with( - f'jsonServer.exampleConfiguration value: some_value' + 'jsonServer.exampleConfiguration value: some_value' ) @@ -201,5 +201,5 @@ def test_show_configuration_thread(): thread.join() server.show_message.assert_called_with( - f'jsonServer.exampleConfiguration value: some_value' + 'jsonServer.exampleConfiguration value: some_value' ) diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 00000000..70e8d7c0 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,1197 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "alabaster" +version = "0.7.13" +description = "A configurable sidebar-enabled Sphinx theme" +optional = false +python-versions = ">=3.6" +files = [ + {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, + {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, +] + +[[package]] +name = "atomicwrites" +version = "1.4.1" +description = "Atomic file writes." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, +] + +[[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.dependencies] +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} + +[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 = "babel" +version = "2.12.1" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, + {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, +] + +[package.dependencies] +pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} + +[[package]] +name = "cattrs" +version = "23.1.2" +description = "Composable complex class support for attrs and dataclasses." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cattrs-23.1.2-py3-none-any.whl", hash = "sha256:b2bb14311ac17bed0d58785e5a60f022e5431aca3932e3fc5cc8ed8639de50a4"}, + {file = "cattrs-23.1.2.tar.gz", hash = "sha256:db1c821b8c537382b2c7c66678c3790091ca0275ac486c76f3c8f3920e83c657"}, +] + +[package.dependencies] +attrs = ">=20" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +typing_extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} + +[package.extras] +bson = ["pymongo (>=4.2.0,<5.0.0)"] +cbor2 = ["cbor2 (>=5.4.6,<6.0.0)"] +msgpack = ["msgpack (>=1.0.2,<2.0.0)"] +orjson = ["orjson (>=3.5.2,<4.0.0)"] +pyyaml = ["PyYAML (>=6.0,<7.0)"] +tomlkit = ["tomlkit (>=0.11.4,<0.12.0)"] +ujson = ["ujson (>=5.4.0,<6.0.0)"] + +[[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 = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.2.0" +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.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, +] + +[[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 = "docutils" +version = "0.18.1" +description = "Docutils -- Python Documentation Utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "docutils-0.18.1-py2.py3-none-any.whl", hash = "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c"}, + {file = "docutils-0.18.1.tar.gz", hash = "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, + {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[package.dependencies] +typing-extensions = {version = "*", markers = "python_version < \"3.8\""} + +[[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 = "imagesize" +version = "1.4.1" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] + +[[package]] +name = "importlib-metadata" +version = "6.7.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5"}, + {file = "importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4"}, +] + +[package.dependencies] +typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} +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 (>=1.3)", "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 = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "lsprotocol" +version = "2023.0.0a2" +description = "Python implementation of the Language Server Protocol." +optional = false +python-versions = ">=3.7" +files = [ + {file = "lsprotocol-2023.0.0a2-py3-none-any.whl", hash = "sha256:c4f2f77712b50d065b17f9b50d2b88c480dc2ce4bbaa56eea8269dbf54bc9701"}, + {file = "lsprotocol-2023.0.0a2.tar.gz", hash = "sha256:80aae7e39171b49025876a524937c10be2eb986f4be700ca22ee7d186b8488aa"}, +] + +[package.dependencies] +attrs = ">=21.3.0" +cattrs = "*" + +[[package]] +name = "markupsafe" +version = "2.1.3" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] + +[[package]] +name = "mypy" +version = "1.4.1" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mypy-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:566e72b0cd6598503e48ea610e0052d1b8168e60a46e0bfd34b3acf2d57f96a8"}, + {file = "mypy-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ca637024ca67ab24a7fd6f65d280572c3794665eaf5edcc7e90a866544076878"}, + {file = "mypy-1.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dde1d180cd84f0624c5dcaaa89c89775550a675aff96b5848de78fb11adabcd"}, + {file = "mypy-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8c4d8e89aa7de683e2056a581ce63c46a0c41e31bd2b6d34144e2c80f5ea53dc"}, + {file = "mypy-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:bfdca17c36ae01a21274a3c387a63aa1aafe72bff976522886869ef131b937f1"}, + {file = "mypy-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7549fbf655e5825d787bbc9ecf6028731973f78088fbca3a1f4145c39ef09462"}, + {file = "mypy-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:98324ec3ecf12296e6422939e54763faedbfcc502ea4a4c38502082711867258"}, + {file = "mypy-1.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:141dedfdbfe8a04142881ff30ce6e6653c9685b354876b12e4fe6c78598b45e2"}, + {file = "mypy-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8207b7105829eca6f3d774f64a904190bb2231de91b8b186d21ffd98005f14a7"}, + {file = "mypy-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:16f0db5b641ba159eff72cff08edc3875f2b62b2fa2bc24f68c1e7a4e8232d01"}, + {file = "mypy-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:470c969bb3f9a9efcedbadcd19a74ffb34a25f8e6b0e02dae7c0e71f8372f97b"}, + {file = "mypy-1.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5952d2d18b79f7dc25e62e014fe5a23eb1a3d2bc66318df8988a01b1a037c5b"}, + {file = "mypy-1.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:190b6bab0302cec4e9e6767d3eb66085aef2a1cc98fe04936d8a42ed2ba77bb7"}, + {file = "mypy-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9d40652cc4fe33871ad3338581dca3297ff5f2213d0df345bcfbde5162abf0c9"}, + {file = "mypy-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01fd2e9f85622d981fd9063bfaef1aed6e336eaacca00892cd2d82801ab7c042"}, + {file = "mypy-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2460a58faeea905aeb1b9b36f5065f2dc9a9c6e4c992a6499a2360c6c74ceca3"}, + {file = "mypy-1.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2746d69a8196698146a3dbe29104f9eb6a2a4d8a27878d92169a6c0b74435b6"}, + {file = "mypy-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ae704dcfaa180ff7c4cfbad23e74321a2b774f92ca77fd94ce1049175a21c97f"}, + {file = "mypy-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:43d24f6437925ce50139a310a64b2ab048cb2d3694c84c71c3f2a1626d8101dc"}, + {file = "mypy-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c482e1246726616088532b5e964e39765b6d1520791348e6c9dc3af25b233828"}, + {file = "mypy-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:43b592511672017f5b1a483527fd2684347fdffc041c9ef53428c8dc530f79a3"}, + {file = "mypy-1.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34a9239d5b3502c17f07fd7c0b2ae6b7dd7d7f6af35fbb5072c6208e76295816"}, + {file = "mypy-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5703097c4936bbb9e9bce41478c8d08edd2865e177dc4c52be759f81ee4dd26c"}, + {file = "mypy-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e02d700ec8d9b1859790c0475df4e4092c7bf3272a4fd2c9f33d87fac4427b8f"}, + {file = "mypy-1.4.1-py3-none-any.whl", hash = "sha256:45d32cec14e7b97af848bddd97d85ea4f0db4d5a149ed9676caa4eb2f7402bb4"}, + {file = "mypy-1.4.1.tar.gz", hash = "sha256:9bbcd9ab8ea1f2e1c8031c21445b511442cc45c89951e49bbf852cbb70755b1b"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typed-ast = {version = ">=1.4.0,<2", markers = "python_version < \"3.8\""} +typing-extensions = ">=4.1.0" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] +python2 = ["typed-ast (>=1.4.0,<2)"] +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 = "outcome" +version = "1.2.0" +description = "Capture the outcome of Python function calls." +optional = false +python-versions = ">=3.7" +files = [ + {file = "outcome-1.2.0-py2.py3-none-any.whl", hash = "sha256:c4ab89a56575d6d38a05aa16daeaa333109c1f96167aba8901ab18b6b5e0f7f5"}, + {file = "outcome-1.2.0.tar.gz", hash = "sha256:6f82bd3de45da303cf1f771ecafa1633750a358436a8bb60e06a1ceb745d2672"}, +] + +[package.dependencies] +attrs = ">=19.2.0" + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pastel" +version = "0.2.1" +description = "Bring colors to your terminal." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, + {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, +] + +[[package]] +name = "pluggy" +version = "1.2.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "poethepoet" +version = "0.19.0" +description = "A task runner that works well with poetry." +optional = false +python-versions = ">=3.7" +files = [ + {file = "poethepoet-0.19.0-py3-none-any.whl", hash = "sha256:87038be589077e4b407050a9da644d9cd9e4076ccfc8abc7f855cf6870d5c6c2"}, + {file = "poethepoet-0.19.0.tar.gz", hash = "sha256:897eb85ec15876d79befc7d19d4c80ce7c8b214d1bb0dcfec640abd81616bfed"}, +] + +[package.dependencies] +pastel = ">=0.2.1,<0.3.0" +tomli = ">=1.2.2" + +[package.extras] +poetry-plugin = ["poetry (>=1.0,<2.0)"] + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pygments" +version = "2.15.1" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pysocks" +version = "1.7.1" +description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "PySocks-1.7.1-py27-none-any.whl", hash = "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299"}, + {file = "PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5"}, + {file = "PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"}, +] + +[[package]] +name = "pytest" +version = "7.1.2" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, + {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, +] + +[package.dependencies] +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +py = ">=1.8.2" +tomli = ">=1.0.0" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "pytest-asyncio" +version = "0.21.1" +description = "Pytest support for asyncio" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-asyncio-0.21.1.tar.gz", hash = "sha256:40a7eae6dded22c7b604986855ea48400ab15b069ae38116e8c01238e9eeb64d"}, + {file = "pytest_asyncio-0.21.1-py3-none-any.whl", hash = "sha256:8666c1c8ac02631d7c51ba282e0c69a8a452b211ffedf2599099845da5c5c37b"}, +] + +[package.dependencies] +pytest = ">=7.0.0" +typing-extensions = {version = ">=3.7.2", markers = "python_version < \"3.8\""} + +[package.extras] +docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] +testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"] + +[[package]] +name = "pytz" +version = "2023.3" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, + {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, +] + +[[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 = "ruff" +version = "0.0.275" +description = "An extremely fast Python linter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.0.275-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:5e6554a072e7ce81eb6f0bec1cebd3dcb0e358652c0f4900d7d630d61691e914"}, + {file = "ruff-0.0.275-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:1cc599022fe5ffb143a965b8d659eb64161ab8ab4433d208777eab018a1aab67"}, + {file = "ruff-0.0.275-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5206fc1cd8c1c1deadd2e6360c0dbcd690f1c845da588ca9d32e4a764a402c60"}, + {file = "ruff-0.0.275-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0c4e6468da26f77b90cae35319d310999f471a8c352998e9b39937a23750149e"}, + {file = "ruff-0.0.275-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0dbdea02942131dbc15dd45f431d152224f15e1dd1859fcd0c0487b658f60f1a"}, + {file = "ruff-0.0.275-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:22efd9f41af27ef8fb9779462c46c35c89134d33e326c889971e10b2eaf50c63"}, + {file = "ruff-0.0.275-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c09662112cfa22d7467a19252a546291fd0eae4f423e52b75a7a2000a1894db"}, + {file = "ruff-0.0.275-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80043726662144876a381efaab88841c88e8df8baa69559f96b22d4fa216bef1"}, + {file = "ruff-0.0.275-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5859ee543b01b7eb67835dfd505faa8bb7cc1550f0295c92c1401b45b42be399"}, + {file = "ruff-0.0.275-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c8ace4d40a57b5ea3c16555f25a6b16bc5d8b2779ae1912ce2633543d4e9b1da"}, + {file = "ruff-0.0.275-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8347fc16aa185aae275906c4ac5b770e00c896b6a0acd5ba521f158801911998"}, + {file = "ruff-0.0.275-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ec43658c64bfda44fd84bbea9da8c7a3b34f65448192d1c4dd63e9f4e7abfdd4"}, + {file = "ruff-0.0.275-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:508b13f7ca37274cceaba4fb3ea5da6ca192356323d92acf39462337c33ad14e"}, + {file = "ruff-0.0.275-py3-none-win32.whl", hash = "sha256:6afb1c4422f24f361e877937e2a44b3f8176774a476f5e33845ebfe887dd5ec2"}, + {file = "ruff-0.0.275-py3-none-win_amd64.whl", hash = "sha256:d9b264d78621bf7b698b6755d4913ab52c19bd28bee1a16001f954d64c1a1220"}, + {file = "ruff-0.0.275-py3-none-win_arm64.whl", hash = "sha256:a19ce3bea71023eee5f0f089dde4a4272d088d5ac0b675867e074983238ccc65"}, + {file = "ruff-0.0.275.tar.gz", hash = "sha256:a63a0b645da699ae5c758fce19188e901b3033ec54d862d93fcd042addf7f38d"}, +] + +[[package]] +name = "selenium" +version = "4.10.0" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "selenium-4.10.0-py3-none-any.whl", hash = "sha256:40241b9d872f58959e9b34e258488bf11844cd86142fd68182bd41db9991fc5c"}, + {file = "selenium-4.10.0.tar.gz", hash = "sha256:871bf800c4934f745b909c8dfc7d15c65cf45bd2e943abd54451c810ada395e3"}, +] + +[package.dependencies] +certifi = ">=2021.10.8" +trio = ">=0.17,<1.0" +trio-websocket = ">=0.9,<1.0" +urllib3 = {version = ">=1.26,<3", extras = ["socks"]} + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + +[[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 = "sortedcontainers" +version = "2.4.0" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +optional = false +python-versions = "*" +files = [ + {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, + {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, +] + +[[package]] +name = "sphinx" +version = "5.3.0" +description = "Python documentation generator" +optional = false +python-versions = ">=3.6" +files = [ + {file = "Sphinx-5.3.0.tar.gz", hash = "sha256:51026de0a9ff9fc13c05d74913ad66047e104f56a129ff73e174eb5c3ee794b5"}, + {file = "sphinx-5.3.0-py3-none-any.whl", hash = "sha256:060ca5c9f7ba57a08a1219e547b269fadf125ae25b06b9fa7f66768efb652d6d"}, +] + +[package.dependencies] +alabaster = ">=0.7,<0.8" +babel = ">=2.9" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.14,<0.20" +imagesize = ">=1.3" +importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} +Jinja2 = ">=3.0" +packaging = ">=21.0" +Pygments = ">=2.12" +requests = ">=2.5.0" +snowballstemmer = ">=2.0" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = ">=2.0.0" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = ">=1.1.5" + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-bugbear", "flake8-comprehensions", "flake8-simplify", "isort", "mypy (>=0.981)", "sphinx-lint", "types-requests", "types-typed-ast"] +test = ["cython", "html5lib", "pytest (>=4.6)", "typed_ast"] + +[[package]] +name = "sphinx-rtd-theme" +version = "1.2.2" +description = "Read the Docs theme for Sphinx" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "sphinx_rtd_theme-1.2.2-py2.py3-none-any.whl", hash = "sha256:6a7e7d8af34eb8fc57d52a09c6b6b9c46ff44aea5951bc831eeb9245378f3689"}, + {file = "sphinx_rtd_theme-1.2.2.tar.gz", hash = "sha256:01c5c5a72e2d025bd23d1f06c59a4831b06e6ce6c01fdd5ebfe9986c0a880fc7"}, +] + +[package.dependencies] +docutils = "<0.19" +sphinx = ">=1.6,<7" +sphinxcontrib-jquery = ">=4,<5" + +[package.extras] +dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.2" +description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, + {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.2" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, + {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.0" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +optional = false +python-versions = ">=3.6" +files = [ + {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, + {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["html5lib", "pytest"] + +[[package]] +name = "sphinxcontrib-jquery" +version = "4.1" +description = "Extension to include jQuery on newer Sphinx releases" +optional = false +python-versions = ">=2.7" +files = [ + {file = "sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a"}, + {file = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae"}, +] + +[package.dependencies] +Sphinx = ">=1.8" + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] + +[package.extras] +test = ["flake8", "mypy", "pytest"] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.3" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.5" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, + {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[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 = "trio" +version = "0.22.2" +description = "A friendly Python library for async concurrency and I/O" +optional = false +python-versions = ">=3.7" +files = [ + {file = "trio-0.22.2-py3-none-any.whl", hash = "sha256:f43da357620e5872b3d940a2e3589aa251fd3f881b65a608d742e00809b1ec38"}, + {file = "trio-0.22.2.tar.gz", hash = "sha256:3887cf18c8bcc894433420305468388dac76932e9668afa1c49aa3806b6accb3"}, +] + +[package.dependencies] +attrs = ">=20.1.0" +cffi = {version = ">=1.14", markers = "os_name == \"nt\" and implementation_name != \"pypy\""} +exceptiongroup = {version = ">=1.0.0rc9", markers = "python_version < \"3.11\""} +idna = "*" +outcome = "*" +sniffio = "*" +sortedcontainers = "*" + +[[package]] +name = "trio-websocket" +version = "0.10.3" +description = "WebSocket library for Trio" +optional = false +python-versions = ">=3.7" +files = [ + {file = "trio-websocket-0.10.3.tar.gz", hash = "sha256:1a748604ad906a7dcab9a43c6eb5681e37de4793ba0847ef0bc9486933ed027b"}, + {file = "trio_websocket-0.10.3-py3-none-any.whl", hash = "sha256:a9937d48e8132ebf833019efde2a52ca82d223a30a7ea3e8d60a7d28f75a4e3a"}, +] + +[package.dependencies] +exceptiongroup = "*" +trio = ">=0.11" +wsproto = ">=0.14" + +[[package]] +name = "typed-ast" +version = "1.5.5" +description = "a fork of Python 2 and 3 ast modules with type comment support" +optional = false +python-versions = ">=3.6" +files = [ + {file = "typed_ast-1.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bc1efe0ce3ffb74784e06460f01a223ac1f6ab31c6bc0376a21184bf5aabe3b"}, + {file = "typed_ast-1.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f7a8c46a8b333f71abd61d7ab9255440d4a588f34a21f126bbfc95f6049e686"}, + {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597fc66b4162f959ee6a96b978c0435bd63791e31e4f410622d19f1686d5e769"}, + {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d41b7a686ce653e06c2609075d397ebd5b969d821b9797d029fccd71fdec8e04"}, + {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5fe83a9a44c4ce67c796a1b466c270c1272e176603d5e06f6afbc101a572859d"}, + {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d5c0c112a74c0e5db2c75882a0adf3133adedcdbfd8cf7c9d6ed77365ab90a1d"}, + {file = "typed_ast-1.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:e1a976ed4cc2d71bb073e1b2a250892a6e968ff02aa14c1f40eba4f365ffec02"}, + {file = "typed_ast-1.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c631da9710271cb67b08bd3f3813b7af7f4c69c319b75475436fcab8c3d21bee"}, + {file = "typed_ast-1.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b445c2abfecab89a932b20bd8261488d574591173d07827c1eda32c457358b18"}, + {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc95ffaaab2be3b25eb938779e43f513e0e538a84dd14a5d844b8f2932593d88"}, + {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61443214d9b4c660dcf4b5307f15c12cb30bdfe9588ce6158f4a005baeb167b2"}, + {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6eb936d107e4d474940469e8ec5b380c9b329b5f08b78282d46baeebd3692dc9"}, + {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e48bf27022897577d8479eaed64701ecaf0467182448bd95759883300ca818c8"}, + {file = "typed_ast-1.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:83509f9324011c9a39faaef0922c6f720f9623afe3fe220b6d0b15638247206b"}, + {file = "typed_ast-1.5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:44f214394fc1af23ca6d4e9e744804d890045d1643dd7e8229951e0ef39429b5"}, + {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:118c1ce46ce58fda78503eae14b7664163aa735b620b64b5b725453696f2a35c"}, + {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be4919b808efa61101456e87f2d4c75b228f4e52618621c77f1ddcaae15904fa"}, + {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fc2b8c4e1bc5cd96c1a823a885e6b158f8451cf6f5530e1829390b4d27d0807f"}, + {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:16f7313e0a08c7de57f2998c85e2a69a642e97cb32f87eb65fbfe88381a5e44d"}, + {file = "typed_ast-1.5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:2b946ef8c04f77230489f75b4b5a4a6f24c078be4aed241cfabe9cbf4156e7e5"}, + {file = "typed_ast-1.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2188bc33d85951ea4ddad55d2b35598b2709d122c11c75cffd529fbc9965508e"}, + {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0635900d16ae133cab3b26c607586131269f88266954eb04ec31535c9a12ef1e"}, + {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57bfc3cf35a0f2fdf0a88a3044aafaec1d2f24d8ae8cd87c4f58d615fb5b6311"}, + {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fe58ef6a764de7b4b36edfc8592641f56e69b7163bba9f9c8089838ee596bfb2"}, + {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d09d930c2d1d621f717bb217bf1fe2584616febb5138d9b3e8cdd26506c3f6d4"}, + {file = "typed_ast-1.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:d40c10326893ecab8a80a53039164a224984339b2c32a6baf55ecbd5b1df6431"}, + {file = "typed_ast-1.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd946abf3c31fb50eee07451a6aedbfff912fcd13cf357363f5b4e834cc5e71a"}, + {file = "typed_ast-1.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ed4a1a42df8a3dfb6b40c3d2de109e935949f2f66b19703eafade03173f8f437"}, + {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:045f9930a1550d9352464e5149710d56a2aed23a2ffe78946478f7b5416f1ede"}, + {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381eed9c95484ceef5ced626355fdc0765ab51d8553fec08661dce654a935db4"}, + {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bfd39a41c0ef6f31684daff53befddae608f9daf6957140228a08e51f312d7e6"}, + {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8c524eb3024edcc04e288db9541fe1f438f82d281e591c548903d5b77ad1ddd4"}, + {file = "typed_ast-1.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:7f58fabdde8dcbe764cef5e1a7fcb440f2463c1bbbec1cf2a86ca7bc1f95184b"}, + {file = "typed_ast-1.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:042eb665ff6bf020dd2243307d11ed626306b82812aba21836096d229fdc6a10"}, + {file = "typed_ast-1.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:622e4a006472b05cf6ef7f9f2636edc51bda670b7bbffa18d26b255269d3d814"}, + {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1efebbbf4604ad1283e963e8915daa240cb4bf5067053cf2f0baadc4d4fb51b8"}, + {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0aefdd66f1784c58f65b502b6cf8b121544680456d1cebbd300c2c813899274"}, + {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:48074261a842acf825af1968cd912f6f21357316080ebaca5f19abbb11690c8a"}, + {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:429ae404f69dc94b9361bb62291885894b7c6fb4640d561179548c849f8492ba"}, + {file = "typed_ast-1.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:335f22ccb244da2b5c296e6f96b06ee9bed46526db0de38d2f0e5a6597b81155"}, + {file = "typed_ast-1.5.5.tar.gz", hash = "sha256:94282f7a354f36ef5dbce0ef3467ebf6a258e370ab33d5b40c249fa996e590dd"}, +] + +[[package]] +name = "typeguard" +version = "3.0.2" +description = "Run-time type checker for Python" +optional = false +python-versions = ">=3.7.4" +files = [ + {file = "typeguard-3.0.2-py3-none-any.whl", hash = "sha256:bbe993854385284ab42fd5bd3bee6f6556577ce8b50696d6cb956d704f286c8e"}, + {file = "typeguard-3.0.2.tar.gz", hash = "sha256:fee5297fdb28f8e9efcb8142b5ee219e02375509cd77ea9d270b5af826358d5a"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} +typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.11\""} + +[package.extras] +doc = ["packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["mypy (>=0.991)", "pytest (>=7)"] + +[[package]] +name = "typing-extensions" +version = "4.7.1" +description = "Backported and Experimental Type Hints for Python 3.7+" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, +] + +[[package]] +name = "urllib3" +version = "2.0.4" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.4-py3-none-any.whl", hash = "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4"}, + {file = "urllib3-2.0.4.tar.gz", hash = "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11"}, +] + +[package.dependencies] +pysocks = {version = ">=1.5.6,<1.5.7 || >1.5.7,<2.0", optional = true, markers = "extra == \"socks\""} + +[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 = "websockets" +version = "11.0.3" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = true +python-versions = ">=3.7" +files = [ + {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"}, + {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"}, + {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"}, + {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"}, + {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"}, + {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"}, + {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"}, + {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"}, + {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"}, + {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"}, + {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"}, + {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"}, + {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"}, + {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"}, + {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"}, + {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"}, +] + +[[package]] +name = "wsproto" +version = "1.2.0" +description = "WebSockets state-machine based protocol implementation" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736"}, + {file = "wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065"}, +] + +[package.dependencies] +h11 = ">=0.9.0,<1" + +[[package]] +name = "zipp" +version = "3.15.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.7" +files = [ + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + +[extras] +ws = ["websockets"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.7.16,<4" +content-hash = "e43e7a7c60d3a017d22a1b9d3a0ff650a703ad6c8aa143bc7b43a80c031dc823" diff --git a/pygls/__init__.py b/pygls/__init__.py index dc6e9980..0c1799e3 100644 --- a/pygls/__init__.py +++ b/pygls/__init__.py @@ -19,8 +19,6 @@ import os import sys -__version__ = "1.0.2" - IS_WIN = os.name == 'nt' IS_PYODIDE = 'pyodide' in sys.modules diff --git a/pyproject.toml b/pyproject.toml index 32e5a91e..0f2dfb34 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,8 +1,62 @@ -[build-system] -requires = ["setuptools>=44", "wheel", "setuptools_scm>=3.4.3", "toml"] -build-backend = "setuptools.build_meta" +[tool.poetry] +name = "pygls" +version = "1.0.2" +description = "A pythonic generic language server (pronounced like 'pie glass')" +authors = ["Open Law Library "] +maintainers = [ + "Tom BH ", + "Alex Carney ", +] +repository = "https://github.com/openlawlibrary/pygls" +documentation = "https://pygls.readthedocs.io/en/latest" +license = "Apache 2.0" +readme = "README.md" + +[tool.poetry.dependencies] +python = ">=3.7.16,<4" +lsprotocol = "2023.0.0a2" +typeguard = "^3.0.0" +websockets = {version = "^11.0.3", optional = true} + +[tool.poetry.extras] +ws = ["websockets"] + +[tool.poetry.group.dev.dependencies] +# Replaces (amongst many other things) flake8 and bandit +ruff = "^0.0.275" +# TODO `poethepoet==0.20` needs python 3.8 +poethepoet = "^0.19.0" +mypy = "^1.4.1" + +[tool.poetry.group.test.dependencies] +pytest = "7.1.2" +pytest-asyncio = "^0.21.0" -[tool.setuptools_scm] +[tool.poetry.group.docs.dependencies] +# TODO `sphinx==7` needs python 3.8 +sphinx = "^5" +# TODO `sphinx-rtd-theme==1.3.0` will support `sphinx==7` +sphinx-rtd-theme = "^1.2.2" + +[tool.poetry.group.pyodide.dependencies] +selenium = "^4.10.0" [tool.pytest.ini_options] asyncio_mode = "auto" + +[tool.poe.tasks] +test = "pytest" +test-pyodide = "python tests/pyodide_testrunner/run.py" +ruff = "ruff check ." +mypy = "mypy -p pygls" +# check_generated_client = "python scripts/check_client_is_uptodate.py" +check_generated_client = "true" +lint = ["ruff", "mypy", "check_generated_client"] +generate_client = "python scripts/generate_client.py --output pygls/lsp/client.py" + +[tool.ruff] +line-length = 120 + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/scripts/check_client_is_uptodate.py b/scripts/check_client_is_uptodate.py new file mode 100644 index 00000000..4e4ead38 --- /dev/null +++ b/scripts/check_client_is_uptodate.py @@ -0,0 +1,26 @@ +import sys +import subprocess + +AUTOGENERATED_CLIENT_FILE = "pygls/lsp/client.py" + +subprocess.run([ + "poe", + "generate_client" +]) + +result = subprocess.run([ + "git", + "diff", + "--exit-code", + AUTOGENERATED_CLIENT_FILE +], stdout = subprocess.DEVNULL) + +if result.returncode == 0: + print("✅ Pygls client is up to date") +else: + print( + "🔴 Pygls client not uptodate\n" + "1. Generate with: `poetry run poe generate_client`\n" + "2. Commit" + ) + sys.exit(result.returncode) diff --git a/scripts/gen_client.py b/scripts/generate_client.py similarity index 99% rename from scripts/gen_client.py rename to scripts/generate_client.py index 198744c6..a8a1f920 100644 --- a/scripts/gen_client.py +++ b/scripts/generate_client.py @@ -7,12 +7,10 @@ import sys import textwrap from datetime import datetime -from typing import List from typing import Optional from typing import Set from typing import Tuple from typing import Type -from typing import Union from lsprotocol._hooks import _resolve_forward_references from lsprotocol.types import METHOD_TO_TYPES diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 41e77701..00000000 --- a/setup.cfg +++ /dev/null @@ -1,66 +0,0 @@ -[metadata] -name = pygls -version = attr: pygls.__version__ -author = Open Law Library -author_email = info@openlawlib.org -license = Apache 2.0 -description = a pythonic generic language server (pronounced like "pie glass"). -keywords = python, pythonic, generic, language, server, protocol -url = https://github.com/openlawlibrary/pygls/tree/master/ -long_description = file: README.md -long_description_content_type = text/markdown -classifiers = - Development Status :: 3 - Alpha - Intended Audience :: Developers - Intended Audience :: Information Technology - Topic :: Software Development :: Libraries :: Python Modules - License :: OSI Approved :: Apache Software License - Operating System :: OS Independent - Programming Language :: Python :: 3 :: Only - Programming Language :: Python :: 3.7 - Programming Language :: Python :: 3.8 - Programming Language :: Python :: 3.9 - Programming Language :: Python :: 3.10 - Programming Language :: Python :: 3.11 - -[options] -setup_requires = - setuptools>=44 - wheel - setuptools_scm>=3.4.3 - toml -python_requires = >=3.7,<4 -packages = find: -zip_safe = False -install_requires = - lsprotocol==2023.0.0a2 - typeguard>=3,<4 -include_package_data = True -tests_require = - pytest==7.1.2 - pytest-asyncio==0.18.3 - -[options.packages.find] -exclude = - tests - tests.* - -[options.extras_require] -ws = - websockets==10.* -dev = - bandit==1.7.4 - flake8==4.0.1 - mypy==0.961 -docs = - sphinx==5.0.1 - sphinx_rtd_theme==1.0.0 -test = - pytest==7.1.2 - pytest-asyncio==0.18.3 - -[flake8] -max-line-length = 99 - -[mypy] -ignore_missing_imports = True diff --git a/setup.py b/setup.py deleted file mode 100755 index 6012477f..00000000 --- a/setup.py +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env python3 - -from setuptools import setup - -if __name__ == "__main__": - setup() diff --git a/tests/lsp/test_inlay_hints.py b/tests/lsp/test_inlay_hints.py index 3c159393..36fcd226 100644 --- a/tests/lsp/test_inlay_hints.py +++ b/tests/lsp/test_inlay_hints.py @@ -20,7 +20,6 @@ import pytest_asyncio from lsprotocol.types import ( ClientCapabilities, - InlayHint, InlayHintParams, InitializeParams, Position, diff --git a/tests/pyodide_testrunner/requirements.txt b/tests/pyodide_testrunner/requirements.txt deleted file mode 100644 index dd187863..00000000 --- a/tests/pyodide_testrunner/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -build -selenium diff --git a/tests/pyodide_testrunner/run.py b/tests/pyodide_testrunner/run.py index 5b1a4f74..8217371a 100644 --- a/tests/pyodide_testrunner/run.py +++ b/tests/pyodide_testrunner/run.py @@ -45,16 +45,17 @@ def build_wheel() -> str: for src, target in directories: shutil.copytree(REPO / src, dest / target) - # Note that we don't copy `pyproject.toml` which declares that pygls should be - # built with `setuptools_scm` as this will fail due to the tmpdir not containing - # a proper git repo. - files = ["setup.py", "setup.cfg", "README.md", "ThirdPartyNotices.txt"] + files = ["pyproject.toml", "README.md", "ThirdPartyNotices.txt"] for src in files: shutil.copy(REPO / src, dest) # Build the wheel - subprocess.run([sys.executable, "-m", "build", "--wheel"], cwd=dest) + subprocess.run([ + "poetry", + "build", + "--format=wheel" + ], cwd=dest) whl = list((dest / "dist").glob("*.whl"))[0] shutil.copy(whl, REPO / "tests/pyodide_testrunner") diff --git a/tests/test_client.py b/tests/test_client.py index c9ad146d..e03e1807 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -80,7 +80,7 @@ def report_server_error( try: await future - except asyncio.CancelledError as e: + except asyncio.CancelledError: pass # Ignore the exception generated by cancelling the future finally: await client.stop() diff --git a/tox.ini b/tox.ini deleted file mode 100644 index 695d1afc..00000000 --- a/tox.ini +++ /dev/null @@ -1,21 +0,0 @@ -[tox] -envlist = py{37,38,39,310,311} - -[testenv] -extras = - ws - test - dev -commands = - pytest - bandit -r pygls - flake8 --ignore=W503 pygls/ --exclude pygls/lsp/ - flake8 --ignore=E501,W503,F403,F405 pygls/lsp/ - mypy -p pygls - mypy --exclude tests ./examples/json-vscode-extension/ - -[testenv:generate] -skip_install = True -deps = lsprotocol -commands = - python scripts/gen_client.py -o pygls/lsp/client.py From 0a36dbd16d4038f5b9b8ca23a8376f43d8da668b Mon Sep 17 00:00:00 2001 From: Thomas Buckley-Houston Date: Sat, 1 Jul 2023 13:38:18 -0500 Subject: [PATCH 2/6] chore: update autogenerated Pygls client Also enable a lint that checks to see if the autogenerated client is uptodate. --- pygls/lsp/client.py | 516 +++++++++++++++++-------------------- pyproject.toml | 3 +- scripts/generate_client.py | 2 - 3 files changed, 241 insertions(+), 280 deletions(-) diff --git a/pygls/lsp/client.py b/pygls/lsp/client.py index ca16eac4..b76783cd 100644 --- a/pygls/lsp/client.py +++ b/pygls/lsp/client.py @@ -1,5 +1,4 @@ # GENERATED FROM scripts/gen-client.py -- DO NOT EDIT -# Last Modified: 2023-06-09 20:42:24.861547 # flake8: noqa from concurrent.futures import Future from lsprotocol.types import CallHierarchyIncomingCall @@ -194,10 +193,9 @@ def code_action_resolve( ) -> Future: """Make a ``codeAction/resolve`` request. - Request to resolve additional information for a given code action.The - request's parameter is of type {@link CodeAction} the response is of type. - - {@link CodeAction} or a Thenable that resolves to such. + Request to resolve additional information for a given code action.The request's + parameter is of type {@link CodeAction} the response is of type {@link CodeAction} + or a Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -210,10 +208,9 @@ async def code_action_resolve_async( ) -> CodeAction: """Make a ``codeAction/resolve`` request. - Request to resolve additional information for a given code action.The - request's parameter is of type {@link CodeAction} the response is of type. - - {@link CodeAction} or a Thenable that resolves to such. + Request to resolve additional information for a given code action.The request's + parameter is of type {@link CodeAction} the response is of type {@link CodeAction} + or a Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -254,9 +251,9 @@ def completion_item_resolve( ) -> Future: """Make a ``completionItem/resolve`` request. - Request to resolve additional information for a given completion - item.The request's parameter is of type {@link CompletionItem} the response - is of type {@link CompletionItem} or a Thenable that resolves to such. + Request to resolve additional information for a given completion item.The + request's parameter is of type {@link CompletionItem} the response is of type {@link + CompletionItem} or a Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -269,9 +266,9 @@ async def completion_item_resolve_async( ) -> CompletionItem: """Make a ``completionItem/resolve`` request. - Request to resolve additional information for a given completion - item.The request's parameter is of type {@link CompletionItem} the response - is of type {@link CompletionItem} or a Thenable that resolves to such. + Request to resolve additional information for a given completion item.The + request's parameter is of type {@link CompletionItem} the response is of type {@link + CompletionItem} or a Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -287,8 +284,8 @@ def document_link_resolve( Request to resolve additional information for a given document link. - The request's parameter is of type {@link DocumentLink} the response - is of type {@link DocumentLink} or a Thenable that resolves to such. + The request's parameter is of type {@link DocumentLink} the response is of type + {@link DocumentLink} or a Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -303,8 +300,8 @@ async def document_link_resolve_async( Request to resolve additional information for a given document link. - The request's parameter is of type {@link DocumentLink} the response - is of type {@link DocumentLink} or a Thenable that resolves to such. + The request's parameter is of type {@link DocumentLink} the response is of type + {@link DocumentLink} or a Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -320,10 +317,9 @@ def initialize( The initialize request is sent from the client to the server. - It is sent once as the request after starting up the server. The - requests parameter is of type {@link InitializeParams} the response - if of type {@link InitializeResult} of a Thenable that resolves to - such. + It is sent once as the request after starting up the server. The requests parameter + is of type {@link InitializeParams} the response if of type {@link InitializeResult} + of a Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -338,10 +334,9 @@ async def initialize_async( The initialize request is sent from the client to the server. - It is sent once as the request after starting up the server. The - requests parameter is of type {@link InitializeParams} the response - if of type {@link InitializeResult} of a Thenable that resolves to - such. + It is sent once as the request after starting up the server. The requests parameter + is of type {@link InitializeParams} the response if of type {@link InitializeResult} + of a Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -355,10 +350,9 @@ def inlay_hint_resolve( ) -> Future: """Make a ``inlayHint/resolve`` request. - A request to resolve additional properties for an inlay hint. The - request's parameter is of type {@link InlayHint}, the response is of type. - - {@link InlayHint} or a Thenable that resolves to such. + A request to resolve additional properties for an inlay hint. The request's + parameter is of type {@link InlayHint}, the response is of type {@link InlayHint} or + a Thenable that resolves to such. @since 3.17.0 """ @@ -373,10 +367,9 @@ async def inlay_hint_resolve_async( ) -> InlayHint: """Make a ``inlayHint/resolve`` request. - A request to resolve additional properties for an inlay hint. The - request's parameter is of type {@link InlayHint}, the response is of type. - - {@link InlayHint} or a Thenable that resolves to such. + A request to resolve additional properties for an inlay hint. The request's + parameter is of type {@link InlayHint}, the response is of type {@link InlayHint} or + a Thenable that resolves to such. @since 3.17.0 """ @@ -394,9 +387,8 @@ def shutdown( A shutdown request is sent from the client to the server. - It is sent once when the client decides to shutdown the server. The - only notification that is sent after a shutdown request is the exit - event. + It is sent once when the client decides to shutdown the server. The only + notification that is sent after a shutdown request is the exit event. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -411,9 +403,8 @@ async def shutdown_async( A shutdown request is sent from the client to the server. - It is sent once when the client decides to shutdown the server. The - only notification that is sent after a shutdown request is the exit - event. + It is sent once when the client decides to shutdown the server. The only + notification that is sent after a shutdown request is the exit event. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -483,9 +474,9 @@ def text_document_color_presentation( A request to list all presentation for a color. - The request's parameter is of type {@link ColorPresentationParams} - the response is of type {@link ColorInformation ColorInformation[]} - or a Thenable that resolves to such. + The request's parameter is of type {@link ColorPresentationParams} the response is + of type {@link ColorInformation ColorInformation[]} or a Thenable that resolves to + such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -500,9 +491,9 @@ async def text_document_color_presentation_async( A request to list all presentation for a color. - The request's parameter is of type {@link ColorPresentationParams} - the response is of type {@link ColorInformation ColorInformation[]} - or a Thenable that resolves to such. + The request's parameter is of type {@link ColorPresentationParams} the response is + of type {@link ColorInformation ColorInformation[]} or a Thenable that resolves to + such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -516,18 +507,16 @@ def text_document_completion( ) -> Future: """Make a ``textDocument/completion`` request. - Request to request completion at a given text document position. The - request's parameter is of type {@link TextDocumentPosition} the response is - of type {@link CompletionItem CompletionItem[]} or {@link CompletionList} - or a Thenable that resolves to such. + Request to request completion at a given text document position. The request's + parameter is of type {@link TextDocumentPosition} the response is of type {@link + CompletionItem CompletionItem[]} or {@link CompletionList} or a Thenable that + resolves to such. - The request can delay the computation of the {@link - CompletionItem.detail `detail`} and {@link - CompletionItem.documentation `documentation`} properties to the - `completionItem/resolve` request. However, properties that are - needed for the initial sorting and filtering, like `sortText`, - `filterText`, `insertText`, and `textEdit`, must not be changed - during resolve. + The request can delay the computation of the {@link CompletionItem.detail `detail`} + and {@link CompletionItem.documentation `documentation`} properties to the + `completionItem/resolve` request. However, properties that are needed for the + initial sorting and filtering, like `sortText`, `filterText`, `insertText`, and + `textEdit`, must not be changed during resolve. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -540,18 +529,16 @@ async def text_document_completion_async( ) -> Union[List[CompletionItem], CompletionList, None]: """Make a ``textDocument/completion`` request. - Request to request completion at a given text document position. The - request's parameter is of type {@link TextDocumentPosition} the response is - of type {@link CompletionItem CompletionItem[]} or {@link CompletionList} - or a Thenable that resolves to such. + Request to request completion at a given text document position. The request's + parameter is of type {@link TextDocumentPosition} the response is of type {@link + CompletionItem CompletionItem[]} or {@link CompletionList} or a Thenable that + resolves to such. - The request can delay the computation of the {@link - CompletionItem.detail `detail`} and {@link - CompletionItem.documentation `documentation`} properties to the - `completionItem/resolve` request. However, properties that are - needed for the initial sorting and filtering, like `sortText`, - `filterText`, `insertText`, and `textEdit`, must not be changed - during resolve. + The request can delay the computation of the {@link CompletionItem.detail `detail`} + and {@link CompletionItem.documentation `documentation`} properties to the + `completionItem/resolve` request. However, properties that are needed for the + initial sorting and filtering, like `sortText`, `filterText`, `insertText`, and + `textEdit`, must not be changed during resolve. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -565,13 +552,12 @@ def text_document_declaration( ) -> Future: """Make a ``textDocument/declaration`` request. - A request to resolve the type definition locations of a symbol at a - given text document position. + A request to resolve the type definition locations of a symbol at a given text + document position. The request's parameter is of type [TextDocumentPositionParams] - (#TextDocumentPositionParams) the response is of type {@link - Declaration} or a typed array of {@link DeclarationLink} or a - Thenable that resolves to such. + (#TextDocumentPositionParams) the response is of type {@link Declaration} or a typed + array of {@link DeclarationLink} or a Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -584,13 +570,12 @@ async def text_document_declaration_async( ) -> Union[Location, List[Location], List[LocationLink], None]: """Make a ``textDocument/declaration`` request. - A request to resolve the type definition locations of a symbol at a - given text document position. + A request to resolve the type definition locations of a symbol at a given text + document position. The request's parameter is of type [TextDocumentPositionParams] - (#TextDocumentPositionParams) the response is of type {@link - Declaration} or a typed array of {@link DeclarationLink} or a - Thenable that resolves to such. + (#TextDocumentPositionParams) the response is of type {@link Declaration} or a typed + array of {@link DeclarationLink} or a Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -604,13 +589,12 @@ def text_document_definition( ) -> Future: """Make a ``textDocument/definition`` request. - A request to resolve the definition location of a symbol at a given text - document position. + A request to resolve the definition location of a symbol at a given text document + position. - The request's parameter is of type [TextDocumentPosition] - (#TextDocumentPosition) the response is of either type {@link - Definition} or a typed array of {@link DefinitionLink} or a Thenable - that resolves to such. + The request's parameter is of type [TextDocumentPosition] (#TextDocumentPosition) + the response is of either type {@link Definition} or a typed array of {@link + DefinitionLink} or a Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -623,13 +607,12 @@ async def text_document_definition_async( ) -> Union[Location, List[Location], List[LocationLink], None]: """Make a ``textDocument/definition`` request. - A request to resolve the definition location of a symbol at a given text - document position. + A request to resolve the definition location of a symbol at a given text document + position. - The request's parameter is of type [TextDocumentPosition] - (#TextDocumentPosition) the response is of either type {@link - Definition} or a typed array of {@link DefinitionLink} or a Thenable - that resolves to such. + The request's parameter is of type [TextDocumentPosition] (#TextDocumentPosition) + the response is of either type {@link Definition} or a typed array of {@link + DefinitionLink} or a Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -676,9 +659,9 @@ def text_document_document_color( A request to list all color symbols found in a given text document. - The request's parameter is of type {@link DocumentColorParams} the - response is of type {@link ColorInformation ColorInformation[]} or a - Thenable that resolves to such. + The request's parameter is of type {@link DocumentColorParams} the response is of + type {@link ColorInformation ColorInformation[]} or a Thenable that resolves to + such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -693,9 +676,9 @@ async def text_document_document_color_async( A request to list all color symbols found in a given text document. - The request's parameter is of type {@link DocumentColorParams} the - response is of type {@link ColorInformation ColorInformation[]} or a - Thenable that resolves to such. + The request's parameter is of type {@link DocumentColorParams} the response is of + type {@link ColorInformation ColorInformation[]} or a Thenable that resolves to + such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -712,10 +695,9 @@ def text_document_document_highlight( Request to resolve a {@link DocumentHighlight} for a given text document position. - The request's parameter is of type [TextDocumentPosition] - (#TextDocumentPosition) the request response is of type - [DocumentHighlight[]] (#DocumentHighlight) or a Thenable that - resolves to such. + The request's parameter is of type [TextDocumentPosition] (#TextDocumentPosition) + the request response is of type [DocumentHighlight[]] (#DocumentHighlight) or a + Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -731,10 +713,9 @@ async def text_document_document_highlight_async( Request to resolve a {@link DocumentHighlight} for a given text document position. - The request's parameter is of type [TextDocumentPosition] - (#TextDocumentPosition) the request response is of type - [DocumentHighlight[]] (#DocumentHighlight) or a Thenable that - resolves to such. + The request's parameter is of type [TextDocumentPosition] (#TextDocumentPosition) + the request response is of type [DocumentHighlight[]] (#DocumentHighlight) or a + Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -777,9 +758,9 @@ def text_document_document_symbol( A request to list all symbols found in a given text document. - The request's parameter is of type {@link TextDocumentIdentifier} - the response is of type {@link SymbolInformation - SymbolInformation[]} or a Thenable that resolves to such. + The request's parameter is of type {@link TextDocumentIdentifier} the response is of + type {@link SymbolInformation SymbolInformation[]} or a Thenable that resolves to + such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -794,9 +775,9 @@ async def text_document_document_symbol_async( A request to list all symbols found in a given text document. - The request's parameter is of type {@link TextDocumentIdentifier} - the response is of type {@link SymbolInformation - SymbolInformation[]} or a Thenable that resolves to such. + The request's parameter is of type {@link TextDocumentIdentifier} the response is of + type {@link SymbolInformation SymbolInformation[]} or a Thenable that resolves to + such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -812,9 +793,8 @@ def text_document_folding_range( A request to provide folding ranges in a document. - The request's parameter is of type {@link FoldingRangeParams}, the - response is of type {@link FoldingRangeList} or a Thenable that - resolves to such. + The request's parameter is of type {@link FoldingRangeParams}, the response is of + type {@link FoldingRangeList} or a Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -829,9 +809,8 @@ async def text_document_folding_range_async( A request to provide folding ranges in a document. - The request's parameter is of type {@link FoldingRangeParams}, the - response is of type {@link FoldingRangeList} or a Thenable that - resolves to such. + The request's parameter is of type {@link FoldingRangeParams}, the response is of + type {@link FoldingRangeList} or a Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -845,7 +824,7 @@ def text_document_formatting( ) -> Future: """Make a ``textDocument/formatting`` request. - A request to to format a whole document. + A request to format a whole document. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -858,7 +837,7 @@ async def text_document_formatting_async( ) -> Optional[List[TextEdit]]: """Make a ``textDocument/formatting`` request. - A request to to format a whole document. + A request to format a whole document. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -874,9 +853,8 @@ def text_document_hover( Request to request hover information at a given text document position. - The request's parameter is of type {@link TextDocumentPosition} the - response is of type {@link Hover} or a Thenable that resolves to - such. + The request's parameter is of type {@link TextDocumentPosition} the response is of + type {@link Hover} or a Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -891,9 +869,8 @@ async def text_document_hover_async( Request to request hover information at a given text document position. - The request's parameter is of type {@link TextDocumentPosition} the - response is of type {@link Hover} or a Thenable that resolves to - such. + The request's parameter is of type {@link TextDocumentPosition} the response is of + type {@link Hover} or a Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -907,12 +884,12 @@ def text_document_implementation( ) -> Future: """Make a ``textDocument/implementation`` request. - A request to resolve the implementation locations of a symbol at a given - text document position. + A request to resolve the implementation locations of a symbol at a given text + document position. The request's parameter is of type [TextDocumentPositionParams] - (#TextDocumentPositionParams) the response is of type {@link - Definition} or a Thenable that resolves to such. + (#TextDocumentPositionParams) the response is of type {@link Definition} or a + Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -925,12 +902,12 @@ async def text_document_implementation_async( ) -> Union[Location, List[Location], List[LocationLink], None]: """Make a ``textDocument/implementation`` request. - A request to resolve the implementation locations of a symbol at a given - text document position. + A request to resolve the implementation locations of a symbol at a given text + document position. The request's parameter is of type [TextDocumentPositionParams] - (#TextDocumentPositionParams) the response is of type {@link - Definition} or a Thenable that resolves to such. + (#TextDocumentPositionParams) the response is of type {@link Definition} or a + Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -944,10 +921,9 @@ def text_document_inlay_hint( ) -> Future: """Make a ``textDocument/inlayHint`` request. - A request to provide inlay hints in a document. The request's parameter - is of type {@link InlayHintsParams}, the response is of type. - - {@link InlayHint InlayHint[]} or a Thenable that resolves to such. + A request to provide inlay hints in a document. The request's parameter is of + type {@link InlayHintsParams}, the response is of type {@link InlayHint InlayHint[]} + or a Thenable that resolves to such. @since 3.17.0 """ @@ -962,10 +938,9 @@ async def text_document_inlay_hint_async( ) -> Optional[List[InlayHint]]: """Make a ``textDocument/inlayHint`` request. - A request to provide inlay hints in a document. The request's parameter - is of type {@link InlayHintsParams}, the response is of type. - - {@link InlayHint InlayHint[]} or a Thenable that resolves to such. + A request to provide inlay hints in a document. The request's parameter is of + type {@link InlayHintsParams}, the response is of type {@link InlayHint InlayHint[]} + or a Thenable that resolves to such. @since 3.17.0 """ @@ -981,10 +956,9 @@ def text_document_inline_value( ) -> Future: """Make a ``textDocument/inlineValue`` request. - A request to provide inline values in a document. The request's - parameter is of type {@link InlineValueParams}, the response is of type. - - {@link InlineValue InlineValue[]} or a Thenable that resolves to such. + A request to provide inline values in a document. The request's parameter is of + type {@link InlineValueParams}, the response is of type {@link InlineValue + InlineValue[]} or a Thenable that resolves to such. @since 3.17.0 """ @@ -999,10 +973,9 @@ async def text_document_inline_value_async( ) -> Optional[List[Union[InlineValueText, InlineValueVariableLookup, InlineValueEvaluatableExpression]]]: """Make a ``textDocument/inlineValue`` request. - A request to provide inline values in a document. The request's - parameter is of type {@link InlineValueParams}, the response is of type. - - {@link InlineValue InlineValue[]} or a Thenable that resolves to such. + A request to provide inline values in a document. The request's parameter is of + type {@link InlineValueParams}, the response is of type {@link InlineValue + InlineValue[]} or a Thenable that resolves to such. @since 3.17.0 """ @@ -1049,11 +1022,10 @@ def text_document_moniker( ) -> Future: """Make a ``textDocument/moniker`` request. - A request to get the moniker of a symbol at a given text document - position. + A request to get the moniker of a symbol at a given text document position. - The request parameter is of type {@link TextDocumentPositionParams}. - The response is of type {@link Moniker Moniker[]} or `null`. + The request parameter is of type {@link TextDocumentPositionParams}. The response is + of type {@link Moniker Moniker[]} or `null`. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -1066,11 +1038,10 @@ async def text_document_moniker_async( ) -> Optional[List[Moniker]]: """Make a ``textDocument/moniker`` request. - A request to get the moniker of a symbol at a given text document - position. + A request to get the moniker of a symbol at a given text document position. - The request parameter is of type {@link TextDocumentPositionParams}. - The response is of type {@link Moniker Moniker[]} or `null`. + The request parameter is of type {@link TextDocumentPositionParams}. The response is + of type {@link Moniker Moniker[]} or `null`. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -1111,9 +1082,8 @@ def text_document_prepare_call_hierarchy( ) -> Future: """Make a ``textDocument/prepareCallHierarchy`` request. - A request to result a `CallHierarchyItem` in a document at a given - position. Can be used as an input to an incoming or outgoing call - hierarchy. + A request to result a `CallHierarchyItem` in a document at a given position. Can + be used as an input to an incoming or outgoing call hierarchy. @since 3.16.0 """ @@ -1128,9 +1098,8 @@ async def text_document_prepare_call_hierarchy_async( ) -> Optional[List[CallHierarchyItem]]: """Make a ``textDocument/prepareCallHierarchy`` request. - A request to result a `CallHierarchyItem` in a document at a given - position. Can be used as an input to an incoming or outgoing call - hierarchy. + A request to result a `CallHierarchyItem` in a document at a given position. Can + be used as an input to an incoming or outgoing call hierarchy. @since 3.16.0 """ @@ -1177,9 +1146,8 @@ def text_document_prepare_type_hierarchy( ) -> Future: """Make a ``textDocument/prepareTypeHierarchy`` request. - A request to result a `TypeHierarchyItem` in a document at a given - position. Can be used as an input to a subtypes or supertypes type - hierarchy. + A request to result a `TypeHierarchyItem` in a document at a given position. Can + be used as an input to a subtypes or supertypes type hierarchy. @since 3.17.0 """ @@ -1194,9 +1162,8 @@ async def text_document_prepare_type_hierarchy_async( ) -> Optional[List[TypeHierarchyItem]]: """Make a ``textDocument/prepareTypeHierarchy`` request. - A request to result a `TypeHierarchyItem` in a document at a given - position. Can be used as an input to a subtypes or supertypes type - hierarchy. + A request to result a `TypeHierarchyItem` in a document at a given position. Can + be used as an input to a subtypes or supertypes type hierarchy. @since 3.17.0 """ @@ -1212,7 +1179,7 @@ def text_document_range_formatting( ) -> Future: """Make a ``textDocument/rangeFormatting`` request. - A request to to format a range in a document. + A request to format a range in a document. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -1225,7 +1192,7 @@ async def text_document_range_formatting_async( ) -> Optional[List[TextEdit]]: """Make a ``textDocument/rangeFormatting`` request. - A request to to format a range in a document. + A request to format a range in a document. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -1239,10 +1206,10 @@ def text_document_references( ) -> Future: """Make a ``textDocument/references`` request. - A request to resolve project-wide references for the symbol denoted by - the given text document position. The request's parameter is of type {@link - ReferenceParams} the response is of type. + A request to resolve project-wide references for the symbol denoted by the given + text document position. + The request's parameter is of type {@link ReferenceParams} the response is of type {@link Location Location[]} or a Thenable that resolves to such. """ if self.stopped: @@ -1256,10 +1223,10 @@ async def text_document_references_async( ) -> Optional[List[Location]]: """Make a ``textDocument/references`` request. - A request to resolve project-wide references for the symbol denoted by - the given text document position. The request's parameter is of type {@link - ReferenceParams} the response is of type. + A request to resolve project-wide references for the symbol denoted by the given + text document position. + The request's parameter is of type {@link ReferenceParams} the response is of type {@link Location Location[]} or a Thenable that resolves to such. """ if self.stopped: @@ -1303,9 +1270,8 @@ def text_document_selection_range( A request to provide selection ranges in a document. - The request's parameter is of type {@link SelectionRangeParams}, the - response is of type {@link SelectionRange SelectionRange[]} or a - Thenable that resolves to such. + The request's parameter is of type {@link SelectionRangeParams}, the response is of + type {@link SelectionRange SelectionRange[]} or a Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -1320,9 +1286,8 @@ async def text_document_selection_range_async( A request to provide selection ranges in a document. - The request's parameter is of type {@link SelectionRangeParams}, the - response is of type {@link SelectionRange SelectionRange[]} or a - Thenable that resolves to such. + The request's parameter is of type {@link SelectionRangeParams}, the response is of + type {@link SelectionRange SelectionRange[]} or a Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -1444,12 +1409,12 @@ def text_document_type_definition( ) -> Future: """Make a ``textDocument/typeDefinition`` request. - A request to resolve the type definition locations of a symbol at a - given text document position. + A request to resolve the type definition locations of a symbol at a given text + document position. The request's parameter is of type [TextDocumentPositionParams] - (#TextDocumentPositionParams) the response is of type {@link - Definition} or a Thenable that resolves to such. + (#TextDocumentPositionParams) the response is of type {@link Definition} or a + Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -1462,12 +1427,12 @@ async def text_document_type_definition_async( ) -> Union[Location, List[Location], List[LocationLink], None]: """Make a ``textDocument/typeDefinition`` request. - A request to resolve the type definition locations of a symbol at a - given text document position. + A request to resolve the type definition locations of a symbol at a given text + document position. The request's parameter is of type [TextDocumentPositionParams] - (#TextDocumentPositionParams) the response is of type {@link - Definition} or a Thenable that resolves to such. + (#TextDocumentPositionParams) the response is of type {@link Definition} or a + Thenable that resolves to such. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -1481,14 +1446,13 @@ def text_document_will_save_wait_until( ) -> Future: """Make a ``textDocument/willSaveWaitUntil`` request. - A document will save request is sent from the client to the server - before the document is actually saved. + A document will save request is sent from the client to the server before the + document is actually saved. - The request can return an array of TextEdits which will be applied - to the text document before it is saved. Please note that clients - might drop results if computing the text edits took too long or if a - server constantly fails on this request. This is done to keep the - save fast and reliable. + The request can return an array of TextEdits which will be applied to the text + document before it is saved. Please note that clients might drop results if + computing the text edits took too long or if a server constantly fails on this + request. This is done to keep the save fast and reliable. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -1501,14 +1465,13 @@ async def text_document_will_save_wait_until_async( ) -> Optional[List[TextEdit]]: """Make a ``textDocument/willSaveWaitUntil`` request. - A document will save request is sent from the client to the server - before the document is actually saved. + A document will save request is sent from the client to the server before the + document is actually saved. - The request can return an array of TextEdits which will be applied - to the text document before it is saved. Please note that clients - might drop results if computing the text edits took too long or if a - server constantly fails on this request. This is done to keep the - save fast and reliable. + The request can return an array of TextEdits which will be applied to the text + document before it is saved. Please note that clients might drop results if + computing the text edits took too long or if a server constantly fails on this + request. This is done to keep the save fast and reliable. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -1617,8 +1580,8 @@ def workspace_execute_command( A request send from the client to the server to execute a command. - The request might return a workspace edit which the client will - apply to the workspace. + The request might return a workspace edit which the client will apply to the + workspace. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -1633,8 +1596,8 @@ async def workspace_execute_command_async( A request send from the client to the server to execute a command. - The request might return a workspace edit which the client will - apply to the workspace. + The request might return a workspace edit which the client will apply to the + workspace. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -1648,9 +1611,9 @@ def workspace_symbol( ) -> Future: """Make a ``workspace/symbol`` request. - A request to list project-wide symbols matching the query string given - by the {@link WorkspaceSymbolParams}. The response is of type {@link - SymbolInformation SymbolInformation[]} or a Thenable that resolves to such. + A request to list project-wide symbols matching the query string given by the + {@link WorkspaceSymbolParams}. The response is of type {@link SymbolInformation + SymbolInformation[]} or a Thenable that resolves to such. @since 3.17.0 - support for WorkspaceSymbol in the returned data. Clients need to advertise support for WorkspaceSymbols via the client capability @@ -1667,9 +1630,9 @@ async def workspace_symbol_async( ) -> Union[List[SymbolInformation], List[WorkspaceSymbol], None]: """Make a ``workspace/symbol`` request. - A request to list project-wide symbols matching the query string given - by the {@link WorkspaceSymbolParams}. The response is of type {@link - SymbolInformation SymbolInformation[]} or a Thenable that resolves to such. + A request to list project-wide symbols matching the query string given by the + {@link WorkspaceSymbolParams}. The response is of type {@link SymbolInformation + SymbolInformation[]} or a Thenable that resolves to such. @since 3.17.0 - support for WorkspaceSymbol in the returned data. Clients need to advertise support for WorkspaceSymbols via the client capability @@ -1718,9 +1681,12 @@ def workspace_will_create_files( ) -> Future: """Make a ``workspace/willCreateFiles`` request. - The will create files request is sent from the client to the server - before files are actually created as long as the creation is triggered from - within the client. + The will create files request is sent from the client to the server before files + are actually created as long as the creation is triggered from within the client. + + The request can return a `WorkspaceEdit` which will be applied to workspace before the + files are created. Hence the `WorkspaceEdit` can not manipulate the content of the file + to be created. @since 3.16.0 """ @@ -1735,9 +1701,12 @@ async def workspace_will_create_files_async( ) -> Optional[WorkspaceEdit]: """Make a ``workspace/willCreateFiles`` request. - The will create files request is sent from the client to the server - before files are actually created as long as the creation is triggered from - within the client. + The will create files request is sent from the client to the server before files + are actually created as long as the creation is triggered from within the client. + + The request can return a `WorkspaceEdit` which will be applied to workspace before the + files are created. Hence the `WorkspaceEdit` can not manipulate the content of the file + to be created. @since 3.16.0 """ @@ -1753,8 +1722,8 @@ def workspace_will_delete_files( ) -> Future: """Make a ``workspace/willDeleteFiles`` request. - The did delete files notification is sent from the client to the server - when files were deleted from within the client. + The did delete files notification is sent from the client to the server when + files were deleted from within the client. @since 3.16.0 """ @@ -1769,8 +1738,8 @@ async def workspace_will_delete_files_async( ) -> Optional[WorkspaceEdit]: """Make a ``workspace/willDeleteFiles`` request. - The did delete files notification is sent from the client to the server - when files were deleted from within the client. + The did delete files notification is sent from the client to the server when + files were deleted from within the client. @since 3.16.0 """ @@ -1786,9 +1755,8 @@ def workspace_will_rename_files( ) -> Future: """Make a ``workspace/willRenameFiles`` request. - The will rename files request is sent from the client to the server - before files are actually renamed as long as the rename is triggered from - within the client. + The will rename files request is sent from the client to the server before files + are actually renamed as long as the rename is triggered from within the client. @since 3.16.0 """ @@ -1803,9 +1771,8 @@ async def workspace_will_rename_files_async( ) -> Optional[WorkspaceEdit]: """Make a ``workspace/willRenameFiles`` request. - The will rename files request is sent from the client to the server - before files are actually renamed as long as the rename is triggered from - within the client. + The will rename files request is sent from the client to the server before files + are actually renamed as long as the rename is triggered from within the client. @since 3.16.0 """ @@ -1827,8 +1794,8 @@ def cancel_request(self, params: CancelParams) -> None: def exit(self, params: None) -> None: """Send a ``exit`` notification. - The exit event is sent from the client to the server to ask the server - to exit its process. + The exit event is sent from the client to the server to ask the server to exit + its process. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -1838,9 +1805,9 @@ def exit(self, params: None) -> None: def initialized(self, params: InitializedParams) -> None: """Send a ``initialized`` notification. - The initialized notification is sent from the client to the server after - the client is fully initialized and the server is allowed to send requests - from the server to the client. + The initialized notification is sent from the client to the server after the + client is fully initialized and the server is allowed to send requests from the + server to the client. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -1916,8 +1883,8 @@ def set_trace(self, params: SetTraceParams) -> None: def text_document_did_change(self, params: DidChangeTextDocumentParams) -> None: """Send a ``textDocument/didChange`` notification. - The document change notification is sent from the client to the server - to signal changes to a text document. + The document change notification is sent from the client to the server to signal + changes to a text document. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -1927,15 +1894,14 @@ def text_document_did_change(self, params: DidChangeTextDocumentParams) -> None: def text_document_did_close(self, params: DidCloseTextDocumentParams) -> None: """Send a ``textDocument/didClose`` notification. - The document close notification is sent from the client to the server - when the document got closed in the client. + The document close notification is sent from the client to the server when the + document got closed in the client. - The document's truth now exists where the document's uri points to - (e.g. if the document's uri is a file uri the truth now exists on - disk). As with the open notification the close notification is about - managing the document's content. Receiving a close notification - doesn't mean that the document was open in an editor before. A close - notification requires a previous open notification to be sent. + The document's truth now exists where the document's uri points to (e.g. if the + document's uri is a file uri the truth now exists on disk). As with the open + notification the close notification is about managing the document's content. + Receiving a close notification doesn't mean that the document was open in an editor + before. A close notification requires a previous open notification to be sent. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -1945,16 +1911,15 @@ def text_document_did_close(self, params: DidCloseTextDocumentParams) -> None: def text_document_did_open(self, params: DidOpenTextDocumentParams) -> None: """Send a ``textDocument/didOpen`` notification. - The document open notification is sent from the client to the server to - signal newly opened text documents. + The document open notification is sent from the client to the server to signal + newly opened text documents. - The document's truth is now managed by the client and the server - must not try to read the document's truth using the document's uri. - Open in this sense means it is managed by the client. It doesn't - necessarily mean that its content is presented in an editor. An open - notification must not be sent more than once without a corresponding - close notification send before. This means open and close - notification must be balanced and the max open count is one. + The document's truth is now managed by the client and the server must not try to + read the document's truth using the document's uri. Open in this sense means it is + managed by the client. It doesn't necessarily mean that its content is presented in + an editor. An open notification must not be sent more than once without a + corresponding close notification send before. This means open and close notification + must be balanced and the max open count is one. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -1964,8 +1929,8 @@ def text_document_did_open(self, params: DidOpenTextDocumentParams) -> None: def text_document_did_save(self, params: DidSaveTextDocumentParams) -> None: """Send a ``textDocument/didSave`` notification. - The document save notification is sent from the client to the server - when the document got saved in the client. + The document save notification is sent from the client to the server when the + document got saved in the client. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -1975,8 +1940,8 @@ def text_document_did_save(self, params: DidSaveTextDocumentParams) -> None: def text_document_will_save(self, params: WillSaveTextDocumentParams) -> None: """Send a ``textDocument/willSave`` notification. - A document will save notification is sent from the client to the server - before the document is actually saved. + A document will save notification is sent from the client to the server before + the document is actually saved. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -1986,8 +1951,8 @@ def text_document_will_save(self, params: WillSaveTextDocumentParams) -> None: def window_work_done_progress_cancel(self, params: WorkDoneProgressCancelParams) -> None: """Send a ``window/workDoneProgress/cancel`` notification. - The `window/workDoneProgress/cancel` notification is sent from the - client to the server to cancel a progress initiated on the server side. + The `window/workDoneProgress/cancel` notification is sent from the client to the + server to cancel a progress initiated on the server side. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -1997,11 +1962,11 @@ def window_work_done_progress_cancel(self, params: WorkDoneProgressCancelParams) def workspace_did_change_configuration(self, params: DidChangeConfigurationParams) -> None: """Send a ``workspace/didChangeConfiguration`` notification. - The configuration change notification is sent from the client to the - server when the client's configuration has changed. + The configuration change notification is sent from the client to the server when + the client's configuration has changed. - The notification contains the changed configuration as defined by - the language client. + The notification contains the changed configuration as defined by the language + client. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -2011,8 +1976,8 @@ def workspace_did_change_configuration(self, params: DidChangeConfigurationParam def workspace_did_change_watched_files(self, params: DidChangeWatchedFilesParams) -> None: """Send a ``workspace/didChangeWatchedFiles`` notification. - The watched files notification is sent from the client to the server - when the client detects changes to file watched by the language client. + The watched files notification is sent from the client to the server when the + client detects changes to file watched by the language client. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -2022,8 +1987,8 @@ def workspace_did_change_watched_files(self, params: DidChangeWatchedFilesParams def workspace_did_change_workspace_folders(self, params: DidChangeWorkspaceFoldersParams) -> None: """Send a ``workspace/didChangeWorkspaceFolders`` notification. - The `workspace/didChangeWorkspaceFolders` notification is sent from the - client to the server when the workspace folder configuration changes. + The `workspace/didChangeWorkspaceFolders` notification is sent from the client to + the server when the workspace folder configuration changes. """ if self.stopped: raise RuntimeError("Client has been stopped.") @@ -2033,8 +1998,8 @@ def workspace_did_change_workspace_folders(self, params: DidChangeWorkspaceFolde def workspace_did_create_files(self, params: CreateFilesParams) -> None: """Send a ``workspace/didCreateFiles`` notification. - The did create files notification is sent from the client to the server - when files were created from within the client. + The did create files notification is sent from the client to the server when + files were created from within the client. @since 3.16.0 """ @@ -2046,9 +2011,8 @@ def workspace_did_create_files(self, params: CreateFilesParams) -> None: def workspace_did_delete_files(self, params: DeleteFilesParams) -> None: """Send a ``workspace/didDeleteFiles`` notification. - The will delete files request is sent from the client to the server - before files are actually deleted as long as the deletion is triggered from - within the client. + The will delete files request is sent from the client to the server before files + are actually deleted as long as the deletion is triggered from within the client. @since 3.16.0 """ @@ -2060,8 +2024,8 @@ def workspace_did_delete_files(self, params: DeleteFilesParams) -> None: def workspace_did_rename_files(self, params: RenameFilesParams) -> None: """Send a ``workspace/didRenameFiles`` notification. - The did rename files notification is sent from the client to the server - when files were renamed from within the client. + The did rename files notification is sent from the client to the server when + files were renamed from within the client. @since 3.16.0 """ diff --git a/pyproject.toml b/pyproject.toml index 0f2dfb34..bfeda6da 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,8 +49,7 @@ test = "pytest" test-pyodide = "python tests/pyodide_testrunner/run.py" ruff = "ruff check ." mypy = "mypy -p pygls" -# check_generated_client = "python scripts/check_client_is_uptodate.py" -check_generated_client = "true" +check_generated_client = "python scripts/check_client_is_uptodate.py" lint = ["ruff", "mypy", "check_generated_client"] generate_client = "python scripts/generate_client.py --output pygls/lsp/client.py" diff --git a/scripts/generate_client.py b/scripts/generate_client.py index a8a1f920..15f64897 100644 --- a/scripts/generate_client.py +++ b/scripts/generate_client.py @@ -6,7 +6,6 @@ import re import sys import textwrap -from datetime import datetime from typing import Optional from typing import Set from typing import Tuple @@ -170,7 +169,6 @@ def generate_client() -> str: code = [ "# GENERATED FROM scripts/gen-client.py -- DO NOT EDIT", - f"# Last Modified: {datetime.now()}", "# flake8: noqa", write_imports(imports), "", From 3d25df3c404526fe8afe58b2a28bc1ee7eed779e Mon Sep 17 00:00:00 2001 From: Thomas Buckley-Houston Date: Sat, 1 Jul 2023 13:53:52 -0500 Subject: [PATCH 3/6] ci: linter for conventional commits --- commitlintrc.yaml | 28 ++++++++++++++++++++++++++++ pyproject.toml | 8 +++++++- 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 commitlintrc.yaml diff --git a/commitlintrc.yaml b/commitlintrc.yaml new file mode 100644 index 00000000..522602e5 --- /dev/null +++ b/commitlintrc.yaml @@ -0,0 +1,28 @@ +--- +# The rules below have been manually copied from @commitlint/config-conventional +# and match the v1.0.0 specification: +# https://www.conventionalcommits.org/en/v1.0.0/#specification +# +# You can remove them and uncomment the config below when the following issue is +# fixed: https://github.com/conventional-changelog/commitlint/issues/613 +# +# extends: +# - '@commitlint/config-conventional' +rules: + body-leading-blank: [1, always] + body-max-line-length: [2, always, 100] + footer-leading-blank: [1, always] + footer-max-line-length: [2, always, 100] + header-max-length: [2, always, 100] + subject-case: + - 2 + - never + - [sentence-case, start-case, pascal-case, upper-case] + subject-empty: [2, never] + subject-full-stop: [2, never, "."] + type-case: [2, always, lower-case] + type-empty: [2, never] + type-enum: + - 2 + - always + - [build, chore, ci, docs, feat, fix, perf, refactor, revert, style, test] diff --git a/pyproject.toml b/pyproject.toml index bfeda6da..8810bea2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,7 +50,13 @@ test-pyodide = "python tests/pyodide_testrunner/run.py" ruff = "ruff check ." mypy = "mypy -p pygls" check_generated_client = "python scripts/check_client_is_uptodate.py" -lint = ["ruff", "mypy", "check_generated_client"] +check_commit_style = "npx commitlint --from origin/main --to HEAD --verbose --config commitlintrc.yaml" +lint = [ + "ruff", + "mypy", + "check_generated_client", + "check_commit_style" +] generate_client = "python scripts/generate_client.py --output pygls/lsp/client.py" [tool.ruff] From 1a3848d50a3730acf17d7a485c317c65568c0047 Mon Sep 17 00:00:00 2001 From: Thomas Buckley-Houston Date: Sat, 1 Jul 2023 21:04:06 -0500 Subject: [PATCH 4/6] ci: autogenerate changelog with `git-cliff` --- CHANGELOG.md | 16 +++++----- PULL_REQUEST_TEMPLATE.md | 2 -- RELEASING.md | 16 ---------- cliff.toml | 64 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 71 insertions(+), 27 deletions(-) delete mode 100644 RELEASING.md create mode 100644 cliff.toml diff --git a/CHANGELOG.md b/CHANGELOG.md index a1a037dd..c2636030 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,21 +1,17 @@ # Changelog - All notable changes to this project will be documented in this file. -The format is based on [Keep a Changelog][keepachangelog], -and this project adheres to [Semantic Versioning][semver]. - -## [Unreleased] -### Added +### Extra Notes +#### Added - Add `LanguageClient` with LSP methods autogenerated from type annotations in `lsprotocol` ([#328]) - Add base JSON-RPC `Client` with support for running servers in a subprocess and communicating over stdio. ([#328]) - Support work done progress cancel ([#253]) - Add support for `textDocument/inlayHint` and `inlayHint/resolve` requests ([#342]) -### Changed -### Fixed -[#304]: https://github.com/openlawlibrary/pygls/issues/304 +#### Changed +#### Fixed +>>>>>>> 0f2ef84 (ci: autogenerate changelog with `git-cliff`) - `pygls` no longer overrides the event loop for the current thread when given an explicit loop to use. ([#334]) - Fixed `MethodTypeNotRegisteredError` when registering a `TEXT_DOCUMENT_DID_SAVE` feature with options. ([#338]) @@ -26,7 +22,9 @@ and this project adheres to [Semantic Versioning][semver]. [#338]: https://github.com/openlawlibrary/pygls/discussions/338 [#253]: https://github.com/openlawlibrary/pygls/pull/253 [#342]: https://github.com/openlawlibrary/pygls/pull/342 +[#304]: https://github.com/openlawlibrary/pygls/issues/304 +# Pre Automation Changelog ## [1.0.2] - May 15th, 2023 ### Changed diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md index 4e779c62..f2cb04fa 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/PULL_REQUEST_TEMPLATE.md @@ -11,8 +11,6 @@ _Please replace this description with a concise description of this Pull Request - [ ] Docstrings have been included and/or updated, as appropriate - [ ] Standalone docs have been updated accordingly - [ ] [CONTRIBUTORS.md][contributors] was updated, as appropriate -- [ ] Changelog has been updated, as needed (see [CHANGELOG.md][changelog]) -[changelog]: https://github.com/openlawlibrary/pygls/blob/master/CHANGELOG.md [commit messages]: https://chris.beams.io/posts/git-commit/ [contributors]: https://github.com/openlawlibrary/pygls/blob/master/CONTRIBUTORS.md diff --git a/RELEASING.md b/RELEASING.md deleted file mode 100644 index 59acf0ba..00000000 --- a/RELEASING.md +++ /dev/null @@ -1,16 +0,0 @@ -# Releasing a new version of Pygls - -Pygls is hosted as a package at https://pypi.org/project/pygls - -Releases follow https://keepachangelog.com/en/1.0.0 and https://semver.org/spec/v2.0.0.html - -Release notes are kept in CHANGELOG.md - -## Steps to release - -Update version in `pyproject.toml` - -```sh -poetry build -poetry publish --username "$PYPI_USERNAME" --password "$PYPI_PASSWORD" -``` diff --git a/cliff.toml b/cliff.toml new file mode 100644 index 00000000..a9df45a9 --- /dev/null +++ b/cliff.toml @@ -0,0 +1,64 @@ +[changelog] +header = "" +# template for the changelog body +# https://tera.netlify.app/docs +body = """ +{% if version %}\ + ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} +{% else %}\ + ## [unreleased] +{% endif %}\ +More details: https://github.com/openlawlibrary/pygls/releases/tag/v{{version}} +{% for group, commits in commits | group_by(attribute="group") %} + ### {{ group | upper_first }} + {% for commit in commits %} + - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ + {% endfor %} +{% endfor %}\n +""" +# remove the leading and trailing whitespace from the template +trim = true +# changelog footer +footer = "" + +[git] +# parse the commits based on https://www.conventionalcommits.org +conventional_commits = true +# filter out the commits that are not conventional +filter_unconventional = false # TODO: Toggle after v1.0.3 as it introduces commit linting +# process each line of a commit as an individual commit +split_commits = false +# regex for preprocessing the commit messages +commit_preprocessors = [ + { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](https://github.com/openlawlibrary/pygls/issues/${2}))"}, # replace issue numbers +] +# regex for parsing and grouping commits +commit_parsers = [ + { message = "^feat", group = "Features" }, + { message = "^fix", group = "Bug Fixes" }, + { message = "^doc", group = "Documentation" }, + { message = "^perf", group = "Performance" }, + { message = "^refactor", group = "Refactor" }, + { message = "^style", group = "Styling" }, + { message = "^test", group = "Testing" }, + { message = "^ci", group = "CI" }, + { message = "^chore\\(release\\): prepare for", skip = true }, + { message = "^chore", group = "Miscellaneous Tasks" }, + { body = ".*security", group = "Security" }, +] +# protect breaking changes from being skipped due to matching a skipping commit_parser +protect_breaking_commits = false +# filter out the commits that are not matched by commit parsers +filter_commits = false +# glob pattern for matching git tags +tag_pattern = "v[0-9]*" +# regex for skipping tags +skip_tags = "v0.1.0-beta.1" +# regex for ignoring tags +ignore_tags = "" +# sort the tags topologically +topo_order = false +# sort the commits inside sections by oldest/newest order +sort_commits = "oldest" +# limit the number of commits included in the changelog. +# limit_commits = 42 From db07c69c27ace449f63feb6654870d78abbf1f55 Mon Sep 17 00:00:00 2001 From: Thomas Buckley-Houston Date: Sat, 1 Jul 2023 18:44:09 -0500 Subject: [PATCH 5/6] ci: automate CONTRIBUTORS.md --- .github/workflows/release.yml | 44 +++++++++++++++++++++++ CHANGELOG.md | 1 - CONTRIBUTORS.md | 55 ++++++++++++++++------------- PULL_REQUEST_TEMPLATE.md | 2 -- pyproject.toml | 1 + scripts/generate_contributors_md.py | 46 ++++++++++++++++++++++++ 6 files changed, 122 insertions(+), 27 deletions(-) create mode 100644 .github/workflows/release.yml create mode 100644 scripts/generate_contributors_md.py diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..a37ff625 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,44 @@ +name: Release Pygls to PyPI + +on: + release: + types: [published] + +jobs: + relase: + name: "🚀 Release 🚢" + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: Use Python "3.10" + uses: actions/setup-python@v4 + with: + python-version: "3.10" + - name: Install Poetry + uses: snok/install-poetry@v1 + - name: Generate the latest changelog + uses: orhun/git-cliff-action@v2 + id: git-cliff + with: + args: --verbose --latest + - name: Update the changelog + run: | + cat "${{ steps.git-cliff.outputs.contents }} | "sed -i "3r /dev/stdin" CHANGELOG.md + git config --global user.name 'Github Action' + git config --global user.email 'github.action@users.noreply.github.com' + git commit -am "chore: update changelog" + git push + - name: Update CONTRIBUTORS.md + run: | + poetry run poe generate_contributors_md + if [[ $(git diff --stat CONTRIBUTORS.md) != '' ]]; then + git commit -am "chore: update CONTRIBUTORS.md" + git push + fi + - name: Release + run: | + poetry build + poetry publish --username "__token__" --password ${{ secrets.PYPI_API_TOKEN }} diff --git a/CHANGELOG.md b/CHANGELOG.md index c2636030..2cf67feb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,6 @@ All notable changes to this project will be documented in this file. #### Changed #### Fixed ->>>>>>> 0f2ef84 (ci: autogenerate changelog with `git-cliff`) - `pygls` no longer overrides the event loop for the current thread when given an explicit loop to use. ([#334]) - Fixed `MethodTypeNotRegisteredError` when registering a `TEXT_DOCUMENT_DID_SAVE` feature with options. ([#338]) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index d0941aed..e550341b 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -1,24 +1,31 @@ -# Contributors (alphabetical) - -- [@augb](https://github.com/augb) -- [Alex Carney](https://github.com/alcarney) -- [Brett Cannon](https://github.com/brettcannon/) -- [Daniel Elero](https://github.com/danixeee) -- [Daniel Miller](https://github.com/millerdev) -- [DeathAxe](https://github.com/deathaxe) -- [Denis Loginov](https://github.com/dinvlad) -- [Dillan Mills](https://github.com/DillanCMills) -- [Felicián Németh](https://github.com/nemethf) -- [Felix Yan](https://github.com/felixonmars) -- [Jelle van der Waa](https://github.com/jelly) -- [Jérome Perrin](https://github.com/perrinjerome) -- [Karthik Nadig](https://github.com/karthiknadig) -- [Laurence Warne](https://github.com/LaurenceWarne) -- [Matej Kašťák](https://github.com/MatejKastak) -- [Max O'Cull](https://github.com/Maxattax97) -- [Samuel Roeca](https://github.com/pappasam) -- [Tom BH](https://github.com/tombh) -- [Tomoya Tanjo](https://github.com/tom-tan) -- [bollwyvl](https://github.com/bollwyvl) -- [yorodm](https://github.com/yorodm) -- [Zanie Blue](https://github.com/zanieb) +# Contributors (contributions) +* [alcarney](https://github.com/alcarney) (57) +* [anu-ka](https://github.com/anu-ka) (1) +* [augb](https://github.com/augb) (35) +* [berquist](https://github.com/berquist) (1) +* [brettcannon](https://github.com/brettcannon) (2) +* [D4N](https://github.com/D4N) (1) +* [danixeee](https://github.com/danixeee) (321) +* [deathaxe](https://github.com/deathaxe) (24) +* [dependabot[bot]](https://github.com/apps/dependabot) (6) +* [dgreisen](https://github.com/dgreisen) (4) +* [DillanCMills](https://github.com/DillanCMills) (1) +* [dimbleby](https://github.com/dimbleby) (9) +* [dinvlad](https://github.com/dinvlad) (9) +* [eirikpre](https://github.com/eirikpre) (1) +* [felixonmars](https://github.com/felixonmars) (1) +* [HankBO](https://github.com/HankBO) (1) +* [jelly](https://github.com/jelly) (1) +* [KOLANICH](https://github.com/KOLANICH) (3) +* [LaurenceWarne](https://github.com/LaurenceWarne) (2) +* [MatejKastak](https://github.com/MatejKastak) (3) +* [muffinmad](https://github.com/muffinmad) (2) +* [nemethf](https://github.com/nemethf) (1) +* [otreblan](https://github.com/otreblan) (1) +* [pappasam](https://github.com/pappasam) (7) +* [perimosocordiae](https://github.com/perimosocordiae) (1) +* [perrinjerome](https://github.com/perrinjerome) (24) +* [renatav](https://github.com/renatav) (2) +* [tombh](https://github.com/tombh) (30) +* [tsugumi-sys](https://github.com/tsugumi-sys) (1) +* [zanieb](https://github.com/zanieb) (4) diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md index f2cb04fa..20efc0df 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/PULL_REQUEST_TEMPLATE.md @@ -10,7 +10,5 @@ _Please replace this description with a concise description of this Pull Request - [ ] Tests have been included and/or updated, as appropriate - [ ] Docstrings have been included and/or updated, as appropriate - [ ] Standalone docs have been updated accordingly -- [ ] [CONTRIBUTORS.md][contributors] was updated, as appropriate [commit messages]: https://chris.beams.io/posts/git-commit/ -[contributors]: https://github.com/openlawlibrary/pygls/blob/master/CONTRIBUTORS.md diff --git a/pyproject.toml b/pyproject.toml index 8810bea2..0b5687cc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,6 +58,7 @@ lint = [ "check_commit_style" ] generate_client = "python scripts/generate_client.py --output pygls/lsp/client.py" +generate_contributors_md = "python scripts/generate_contributors_md.py" [tool.ruff] line-length = 120 diff --git a/scripts/generate_contributors_md.py b/scripts/generate_contributors_md.py new file mode 100644 index 00000000..e2459b22 --- /dev/null +++ b/scripts/generate_contributors_md.py @@ -0,0 +1,46 @@ +""" +Example JSON object: +{ + "login": "danixeee", + "id": 16227576, + "node_id": "MDQ6VXNlcjE2MjI3NTc2", + "avatar_url": "https://avatars.githubusercontent.com/u/16227576?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/danixeee", + "html_url": "https://github.com/danixeee", + "followers_url": "https://api.github.com/users/danixeee/followers", + "following_url": "https://api.github.com/users/danixeee/following{/other_user}", + "gists_url": "https://api.github.com/users/danixeee/gists{/gist_id}", + "starred_url": "https://api.github.com/users/danixeee/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/danixeee/subscriptions", + "organizations_url": "https://api.github.com/users/danixeee/orgs", + "repos_url": "https://api.github.com/users/danixeee/repos", + "events_url": "https://api.github.com/users/danixeee/events{/privacy}", + "received_events_url": "https://api.github.com/users/danixeee/received_events", + "type": "User", + "site_admin": false, + "contributions": 321 +} +""" + +import requests + +PYGLS_CONTRIBUTORS_JSON_URL = "https://api.github.com/repos/openlawlibrary/pygls/contributors" +CONTRIBUTORS_FILE = "CONTRIBUTORS.md" + +response = requests.get(PYGLS_CONTRIBUTORS_JSON_URL) +contributors = sorted(response.json(), key=lambda d: d["login"].lower()) + +contents = "# Contributors (contributions)\n" + +for contributor in contributors: + name = contributor["login"] + contributions = contributor["contributions"] + url = contributor["html_url"] + contents += f'* [{name}]({url}) ({contributions})\n' + +file = open(CONTRIBUTORS_FILE, "w") +n = file.write(contents) +file.close() + +print("✅ CONTRIBUTORS.md updated") From ca2a305e89cb304114d27814989ba8de21957c95 Mon Sep 17 00:00:00 2001 From: Thomas Buckley-Houston Date: Sun, 2 Jul 2023 07:57:00 -0500 Subject: [PATCH 6/6] test: base Pyodide wheel deps off poetry.lock Will this fix the typing_extensions/Any error? --- tests/pyodide_testrunner/run.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/tests/pyodide_testrunner/run.py b/tests/pyodide_testrunner/run.py index 8217371a..cf9101c6 100644 --- a/tests/pyodide_testrunner/run.py +++ b/tests/pyodide_testrunner/run.py @@ -45,17 +45,33 @@ def build_wheel() -> str: for src, target in directories: shutil.copytree(REPO / src, dest / target) - files = ["pyproject.toml", "README.md", "ThirdPartyNotices.txt"] + files = [ + "pyproject.toml", + "poetry.lock", + "README.md", + "ThirdPartyNotices.txt" + ] for src in files: shutil.copy(REPO / src, dest) - # Build the wheel + # Convert the lock file to requirements.txt. + # Ensures reproducible behavour for testing. subprocess.run([ "poetry", - "build", - "--format=wheel" + "export", + "-f", "requirements.txt", + "--output", "requirements.txt" ], cwd=dest) + subprocess.run([ + "poetry", + "run", + "pip", + "install", + "-r", "requirements.txt" + ], cwd=dest) + # Build the wheel + subprocess.run(["poetry", "build", "--format", "wheel"], cwd=dest) whl = list((dest / "dist").glob("*.whl"))[0] shutil.copy(whl, REPO / "tests/pyodide_testrunner")