├── test ├── empty.py ├── pylintrc ├── pyproject.toml └── test.sh ├── .gitignore ├── LICENSE.txt ├── pyproject.toml ├── .github └── workflows │ └── ci.yml ├── CHANGES.md ├── pylint_venv.py ├── README.rst └── poetry.lock /test/empty.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.egg-info/ 2 | *.pyc 3 | .DS_Store 4 | .vscode 5 | MANIFEST 6 | build 7 | dist 8 | -------------------------------------------------------------------------------- /test/pylintrc: -------------------------------------------------------------------------------- 1 | [MAIN] 2 | init-hook= 3 | import pylint_venv 4 | pylint_venv.inithook(force_venv_activation=True) 5 | -------------------------------------------------------------------------------- /test/pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.pylint.MAIN] 2 | init-hook = """ 3 | import pylint_venv 4 | pylint_venv.inithook(force_venv_activation=True) 5 | """ 6 | -------------------------------------------------------------------------------- /test/test.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -o errexit -o nounset -o pipefail -o xtrace 4 | 5 | WORKDIR=$(dirname "$0") 6 | VENV_DIR=$(mktemp -d) 7 | 8 | python3 -m venv "$VENV_DIR" 9 | source "$VENV_DIR/bin/activate" 10 | pylint --rcfile "$WORKDIR/pylintrc" "$WORKDIR/empty.py" 2>&1 | tee "$VENV_DIR/pylint.log" | grep "^Using venv: $VENV_DIR\$" 11 | pylint --rcfile "$WORKDIR/pyproject.toml" "$WORKDIR/empty.py" 2>&1 | tee "$VENV_DIR/pylint.log" | grep "^Using venv: $VENV_DIR\$" 12 | rm -r "$VENV_DIR" 13 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Jan Gosmann 4 | Copyright (c) 2019 Federico Jaramillo 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy of 7 | this software and associated documentation files (the "Software"), to deal in 8 | the Software without restriction, including without limitation the rights to 9 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 10 | the Software, and to permit persons to whom the Software is furnished to do so, 11 | subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 18 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 19 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 20 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | authors = ["Jan Gosmann ", "Federico Jaramillo "] 3 | classifiers = [ 4 | 'Development Status :: 5 - Production/Stable', 5 | 'Environment :: Plugins', 6 | 'Intended Audience :: Developers', 7 | 'License :: OSI Approved :: MIT License', 8 | 'Programming Language :: Python', 9 | 'Programming Language :: Python :: 3', 10 | 'Programming Language :: Python :: 3.7', 11 | 'Programming Language :: Python :: 3.8', 12 | 'Programming Language :: Python :: 3.9', 13 | 'Programming Language :: Python :: 3.10', 14 | 'Programming Language :: Python :: 3.11', 15 | 'Programming Language :: Python :: 3.12', 16 | 'Programming Language :: Python :: 3.13', 17 | 'Programming Language :: Python :: Implementation :: CPython', 18 | 'Programming Language :: Python :: Implementation :: PyPy', 19 | 'Topic :: Software Development', 20 | ] 21 | description = "pylint-venv provides a Pylint init-hook to use the same Pylint installation with different virtual environments." 22 | homepage = "https://github.com/jgosmann/pylint-venv/" 23 | include = ["pylint_venv.py", {path = "CHANGES.md", format = "sdist"}] 24 | keywords = ["pylint", "virtualenv", "venv"] 25 | license = "MIT" 26 | maintainers = ["Jan Gosmann "] 27 | name = "pylint-venv" 28 | readme = "README.rst" 29 | repository = "https://github.com/jgosmann/pylint-venv/" 30 | version = "3.0.4" 31 | 32 | [tool.poetry.dependencies] 33 | python = "^3.7.2" 34 | 35 | [tool.poetry.dev-dependencies] 36 | pylint = '>=2.14.0' 37 | 38 | [build-system] 39 | build-backend = "poetry.core.masonry.api" 40 | requires = ["poetry-core>=1.0.0"] 41 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI and release pipeline 2 | 3 | on: 4 | pull_request: 5 | push: 6 | branches: ["main", "develop"] 7 | tags: ["*"] 8 | 9 | jobs: 10 | test: 11 | runs-on: ubuntu-latest 12 | strategy: 13 | matrix: 14 | python-version: ["3.7", "3.8", "3.9", "3.10", "pypy3.8", "pypy3.9", "pypy3.10"] 15 | pylint-version: ["~=2.14.0"] 16 | include: 17 | - python-version: "3.11" 18 | pylint-version: "~=2.17.7" 19 | - python-version: "3.12" 20 | pylint-version: "~=3.0.2" 21 | - python-version: "3.12" 22 | pylint-version: "" 23 | - python-version: "3.13" 24 | pylint-version: "" 25 | steps: 26 | - uses: actions/checkout@v4 27 | 28 | - name: Set up Python 29 | uses: actions/setup-python@v5.3.0 30 | with: 31 | python-version: ${{ matrix.python-version }} 32 | 33 | - uses: actions/cache@v4.1.2 34 | with: 35 | path: ~/.cache/pip 36 | key: ${{ runner.os }}-pip 37 | - uses: actions/cache@v4.1.2 38 | with: 39 | path: .venv 40 | key: ${{ runner.os }}-py${{ matrix.python-version }}-pylint${{ matrix.pylint-version }}-venv-${{ hashFiles('pyproject.toml') }} 41 | restore-keys: | 42 | ${{ runner.os }}-py${{ matrix.python-version }}-pylint${{ matrix.pylint-version }}-venv- 43 | ${{ runner.os }}-py${{ matrix.python-version }}-pylint 44 | 45 | - name: Install poetry 46 | run: pip install poetry 47 | 48 | - name: Install dependencies 49 | run: poetry install 50 | env: 51 | POETRY_VIRTUALENVS_IN_PROJECT: true 52 | 53 | - name: Install pylint ${{ matrix.pylint-version }} 54 | run: poetry run pip install pylint${{ matrix.pylint-version }} 55 | 56 | - name: Run test 57 | run: poetry run test/test.sh 58 | 59 | release: 60 | runs-on: ubuntu-latest 61 | needs: [test] 62 | if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') 63 | steps: 64 | - uses: actions/checkout@v4 65 | 66 | - name: Set up Python 67 | uses: actions/setup-python@v4.3.0 68 | with: 69 | python-version: '3.13' 70 | 71 | - uses: actions/cache@v4.1.2 72 | with: 73 | path: ~/.cache/pip 74 | key: ${{ runner.os }}-pip 75 | 76 | - name: Install poetry 77 | run: pip install poetry 78 | 79 | - name: Publish to PyPI 80 | run: poetry publish --build 81 | env: 82 | POETRY_PYPI_TOKEN_PYPI: ${{ secrets.PYPI_TOKEN }} 83 | 84 | - name: Set version 85 | id: version 86 | run: echo "version=${GITHUB_REF#refs/*/v}" >> $GITHUB_OUTPUT 87 | 88 | - name: Extract changelog 89 | id: changelog 90 | run: sed -E -n '/^## \[${{ steps.version.outputs.version }}\]/,/^## \[[0-9\.]+\]/{/^\[[0-9\.]+\]/!p;}' CHANGES.md | sed '1d;$d' > release-body-raw.md 91 | 92 | - uses: docker://pandoc/core:2.10 93 | with: 94 | args: --wrap none --from markdown --to gfm+hard_line_breaks --output release-body.md release-body-raw.md 95 | 96 | - name: Create GitHub release 97 | uses: softprops/action-gh-release@v1 98 | with: 99 | body_path: release-body.md 100 | tag_name: v${{ steps.version.outputs.version }} 101 | env: 102 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 103 | -------------------------------------------------------------------------------- /CHANGES.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | ## [3.0.4] - 2024-10-27 9 | 10 | ### Added 11 | 12 | - Official support for Python 3.13. 13 | 14 | 15 | ## [3.0.3] - 2023-10-24 16 | 17 | ### Added 18 | 19 | - Official support for Pylint 3. 20 | - Official support for Python 3.12. 21 | - Documentation for configuration within `pyproject.toml` 22 | ([#17](https://github.com/jgosmann/pylint-venv/issues/17), 23 | [#19](https://github.com/jgosmann/pylint-venv/pull/19)). 24 | 25 | 26 | ## [3.0.2] - 2023-06-12 27 | 28 | ### Fixed 29 | 30 | - Handle symlinks pointing to the main `python3.x` directory in a venv. 31 | In particular, this fixes an issue with Conda and Python 3.10 32 | ([#16](https://github.com/jgosmann/pylint-venv/pull/16)). 33 | 34 | 35 | ## [3.0.1] - 2023-02-23 36 | 37 | ### Fixed 38 | 39 | - Add changelog (`CHANGES.md`) back into source distribution. 40 | 41 | 42 | ## [3.0.0] - 2023-02-22 43 | 44 | ### Changed 45 | 46 | - Require that the `force_venv_activation` argument to `inithook` is passed 47 | as keyword argument. 48 | 49 | ### Removed 50 | 51 | - Remove (official) support for Python 3.6. 52 | 53 | ### Fixed 54 | 55 | - Do not include documentation files in pure library distribution 56 | ([#13](https://github.com/jgosmann/pylint-venv/pull/13)). 57 | - Clarify that the hook has to be configured in the `[MAIN]` section 58 | ([#14](https://github.com/jgosmann/pylint-venv/pull/14)) 59 | 60 | 61 | ## [2.3.0] - 2022-06-24 62 | 63 | ### Added 64 | 65 | - Add `quiet` argument to `inithook` method. It suppresses all output from the 66 | plugin. 67 | 68 | ## [2.2.0] - 2022-06-07 69 | 70 | ### Added 71 | 72 | - Check alternative directory locations given by the `PYLINT_VENV_PATH` 73 | environment variable. The variable consists of paths separated by a 74 | colon `:`. 75 | 76 | ## [2.1.1] - 2020-08-17 77 | 78 | ### Fixed 79 | 80 | - Activate virtual environment even if its Python version does not match the 81 | Python version used by pylint. Note that Python packages in the virtual 82 | environment incombatible with pylint's Python version will not work. 83 | 84 | ## [2.1.0] - 2020-03-22 85 | 86 | ### Added 87 | 88 | - Support for using pylint installed in a virtual environment. 89 | See `force_venv_activation` parameter on `inithook` method. 90 | 91 | ## [2.0.0] - 2019-10-19 92 | 93 | ### Added 94 | 95 | - Support for Conda and PyPy 96 | - Documentation improvements 97 | 98 | ### Removed 99 | 100 | - Support for Python 2.7. 101 | 102 | ## [1.1.0] - 2019-03-26 103 | 104 | ### Added 105 | 106 | - Compatibility with Python 3 venv module. 107 | 108 | ## [1.0.0] - 2015-03-01 109 | 110 | ### Added 111 | 112 | - Initial release of inithook for pylint to activate virtual env. 113 | 114 | [unreleased]: https://github.com/jgosmann/pylint-venv/compare/v3.0.4...HEAD 115 | [3.0.4]: https://github.com/jgosmann/pylint-venv/compare/v3.0.3...v3.0.4 116 | [3.0.3]: https://github.com/jgosmann/pylint-venv/compare/v3.0.2...v3.0.3 117 | [3.0.2]: https://github.com/jgosmann/pylint-venv/compare/v3.0.1...v3.0.2 118 | [3.0.1]: https://github.com/jgosmann/pylint-venv/compare/v3.0.0...v3.0.1 119 | [3.0.0]: https://github.com/jgosmann/pylint-venv/compare/v2.3.0...v3.0.0 120 | [2.3.0]: https://github.com/jgosmann/pylint-venv/compare/v2.2.0...v2.3.0 121 | [2.2.0]: https://github.com/jgosmann/pylint-venv/compare/v2.1.0...v2.2.0 122 | [2.1.1]: https://github.com/jgosmann/pylint-venv/compare/v2.1.0...v2.1.1 123 | [2.1.0]: https://github.com/jgosmann/pylint-venv/compare/v2.0.0...v2.1.0 124 | [2.0.0]: https://github.com/jgosmann/pylint-venv/compare/v1.1.0...v2.0.0 125 | [1.1.0]: https://github.com/jgosmann/pylint-venv/compare/v1.0.0...v1.1.0 126 | [1.0.0]: https://github.com/jgosmann/pylint-venv/releases/tag/v1.0.0 127 | -------------------------------------------------------------------------------- /pylint_venv.py: -------------------------------------------------------------------------------- 1 | """ 2 | Allow a globally installed Pylint to lint an (active) virtual or Conda 3 | environment. 4 | 5 | If a globally installed Pylint is invoked from an active virtualenv or Conda 6 | environment, add the environment's paths to Pylint. 7 | 8 | If no virtualenv is active but the CWD contains a virtualenv in a ``.venv`` 9 | folder, activate that env and add its paths to Pylint. 10 | 11 | Do nothing if no virtualenv is active or if Pylint is installed within the 12 | active virtualenv. 13 | 14 | Activation logic taken from https://github.com/pypa/virtualenv 15 | 16 | Usage: 17 | 18 | - Add an init hook to your ``.pylintrc``:: 19 | init-hook= 20 | try: import pylint_venv 21 | except ImportError: pass 22 | else: pylint_venv.inithook() 23 | 24 | - Add the init hook as command line argument:: 25 | 26 | pylint --init-hook="import pylint_venv; pylint_venv.inithook()" 27 | 28 | - Add the init hook as command line argument and explicitly pass a venv:: 29 | 30 | pylint --init-hook="import pylint_venv; pylint_venv.inithook('$(pwd)/env')" 31 | 32 | - If Pylint itself is installed in a virtualenv, then you can ignore it by passing 33 | ``force_venv_activation=True`` to force activation of a different virtualenv:: 34 | 35 | pylint --init--hook="import pylint_venv; pylint_venv.inithook(force_venv_activation=True)" 36 | 37 | """ 38 | 39 | import os 40 | import platform 41 | import re 42 | import site 43 | import sys 44 | 45 | 46 | IS_WIN = platform.system() == "Windows" 47 | IS_PYPY = platform.python_implementation() == "PyPy" 48 | 49 | 50 | class IncompatibleVenvError(Exception): 51 | pass 52 | 53 | 54 | def is_venv(): 55 | """Return *True* if a virtual environment is currently active.""" 56 | is_conda_env = getattr(sys, "base_prefix", sys.prefix) != sys.prefix 57 | is_virtualenv = hasattr(sys, "real_prefix") 58 | return is_conda_env or is_virtualenv 59 | 60 | 61 | def detect_venv(): 62 | """Check for a virtualenv or Conda env""" 63 | for var in ["VIRTUAL_ENV", "CONDA_PREFIX"]: 64 | venv = os.getenv(var, "") 65 | if venv: 66 | return venv 67 | 68 | # Check if a virtualenv directory exists (.venv by default, or alternative 69 | # paths given by environment variable) 70 | venv_paths = os.getenv("PYLINT_VENV_PATH", ".venv").split(":") 71 | cwd = os.getcwd() 72 | exec_path = "Scripts" if IS_WIN else "bin" 73 | for venv_dir in venv_paths: 74 | if os.path.isfile(os.path.join(cwd, venv_dir, exec_path, "activate")): 75 | return os.path.join(cwd, venv_dir) 76 | 77 | return None 78 | 79 | 80 | def activate_venv(venv): 81 | """Activate the virtual environment with prefix *venv*""" 82 | if IS_PYPY: 83 | site_packages = os.path.join(venv, "site-packages") 84 | elif IS_WIN: 85 | site_packages = os.path.join(venv, "Lib", "site-packages") 86 | else: 87 | lib_dir = os.path.join(venv, "lib") 88 | python_dirs = [d for d in os.listdir(lib_dir) if re.match(r"python\d+.\d+", d)] 89 | 90 | # Resolve symlinks and remove repeated directories 91 | python_dirs = set([os.path.realpath(os.path.join(lib_dir, d)) for d in python_dirs]) 92 | 93 | if len(python_dirs) == 0: 94 | raise IncompatibleVenvError( 95 | f"The virtual environment {venv!r} is missing a lib/pythonX.Y directory." 96 | ) 97 | if len(python_dirs) > 1: 98 | raise IncompatibleVenvError( 99 | f"The virtual environment {venv!r} has multiple lib/pythonX.Y directories." 100 | ) 101 | site_packages = os.path.join(list(python_dirs)[0], "site-packages") 102 | 103 | prev = set(sys.path) 104 | site.addsitedir(site_packages) 105 | sys.real_prefix = sys.prefix 106 | sys.prefix = venv 107 | 108 | # Move the added items to the front of sys.path (in place!) 109 | new = list(sys.path) 110 | new_paths = [i for i in new if i not in prev] 111 | kept_paths = [i for i in new if i in prev] 112 | sys.path[:] = new_paths + kept_paths 113 | 114 | 115 | def inithook(venv=None, *, force_venv_activation=False, quiet=False): 116 | """Add virtualenv's paths and site_packages to Pylint. 117 | 118 | Use environment with prefix *venv* if provided else try to auto-detect an active virtualenv. 119 | Pass *force_venv_activation=True* if Pylint itself is installed in a different virtualenv. 120 | 121 | Passing in *quiet=True* suppresses all output. 122 | """ 123 | if not force_venv_activation and is_venv(): 124 | # pylint was invoked from within a venv. Nothing to do. 125 | return 126 | 127 | if venv is None: 128 | venv = detect_venv() 129 | 130 | if venv is None: 131 | return 132 | 133 | if not quiet: 134 | print(f"Using venv: {venv}", file=sys.stderr) 135 | activate_venv(venv) 136 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | .. image:: https://github.com/jgosmann/pylint-venv/actions/workflows/ci.yml/badge.svg 2 | :target: https://github.com/jgosmann/pylint-venv/actions/workflows/ci.yml 3 | :alt: CI and release pipeline 4 | .. image:: https://img.shields.io/pypi/v/pylint-venv 5 | :target: https://pypi.org/project/pylint-venv/ 6 | :alt: PyPI 7 | .. image:: https://img.shields.io/pypi/pyversions/pylint-venv 8 | :target: https://pypi.org/project/pylint-venv/ 9 | :alt: PyPI - Python Version 10 | .. image:: https://img.shields.io/pypi/l/pylint-venv 11 | :target: https://pypi.org/project/pylint-venv/ 12 | :alt: PyPI - License 13 | 14 | 15 | pylint-venv 16 | =========== 17 | 18 | Pylint_ does not respect the currently activated virtualenv_ if it is not 19 | installed in every virtual environment individually. This module provides 20 | a Pylint init-hook to use the same Pylint installation with different virtual 21 | environments. 22 | 23 | Installation 24 | ------------ 25 | 26 | .. code:: bash 27 | 28 | pip install pylint-venv 29 | 30 | Add the hook to your Pylint configuration. See the section below corresponding 31 | to the type of configuration file you use. 32 | 33 | Configure with ``pyproject.toml`` 34 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 35 | 36 | Add the following to your ``pyproject.toml``: 37 | 38 | .. code:: toml 39 | 40 | [tool.pylint.MAIN] 41 | init-hook = """ 42 | try: import pylint_venv 43 | except ImportError: pass 44 | else: pylint_venv.inithook() 45 | """ 46 | 47 | 48 | Configure with ``.pylintrc`` 49 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 50 | 51 | Add the following to your ``.pylintrc``: 52 | 53 | .. code:: ini 54 | 55 | [MAIN] 56 | init-hook= 57 | try: import pylint_venv 58 | except ImportError: pass 59 | else: pylint_venv.inithook() 60 | 61 | If you add this to your ``~/.pylintrc`` in your home directory, it will be 62 | applied to all projects by default. 63 | 64 | 65 | Usage 66 | ----- 67 | 68 | The hook will then be used automatically if 69 | 70 | - a virtualenv without pylint is active, 71 | 72 | - or a Conda environment without pylint is active, 73 | 74 | - or no environment is active but your CWD contains virtualenv directory. 75 | 76 | Anything listed in the ``PYLINT_VENV_PATH`` environment variable is considered 77 | a virtualenv directory. The default, if the variable is unset, is `.venv`. Use 78 | a colon (`:`) as path separator. Example for checking directories ``.venv`` and 79 | ``.virtualenv``: 80 | 81 | .. code:: console 82 | 83 | PYLINT_VENV_PATH=.venv:.virtualenv 84 | 85 | You can also call the hook via a command line argument: 86 | 87 | .. code:: console 88 | 89 | $ pylint --init-hook="import pylint_venv; pylint_venv.inithook()" 90 | 91 | This way you can also explicitly set an environment to be used: 92 | 93 | .. code:: console 94 | 95 | $ pylint --init-hook="import pylint_venv; pylint_venv.inithook('$(pwd)/env')" 96 | 97 | If ``pylint`` itself is installed in a virtualenv, then you can ignore it by passing 98 | ``force_venv_activation=True`` to force the activation of a different virtualenv: 99 | 100 | .. code:: console 101 | 102 | $ pylint --init-hook="import pylint_venv; pylint_venv.inithook(force_venv_activation=True)" 103 | 104 | 105 | This will try to automatically detect virtualenv and activate it. 106 | 107 | 108 | Troubleshooting 109 | --------------- 110 | 111 | General 112 | ^^^^^^^ 113 | 114 | pylint_venv fails to import 115 | """"""""""""""""""""""""""" 116 | 117 | Most likely pylint-venv is not installed in the same virtual environment as 118 | pylint. Either make sure to ensure pylint-venv into the same virtual environment 119 | as pylint, or add the appropriate path in the init hook: 120 | 121 | .. code:: python 122 | 123 | import sys 124 | sys.path.append("/path/to/installation/folder/of/pylint_venv") 125 | 126 | 127 | pylint_venv breaks parsing with tools 128 | """"""""""""""""""""""""""""""""""""" 129 | 130 | When tools call pylint with :code:`-f json`, an extra line may break the parser, as the 131 | output is no longer valid json. To avoid printing "using venv ...", pass :code:`quiet=True` 132 | to :code:`inithook` 133 | 134 | .. code:: console 135 | 136 | $ pylint -f json --init-hook="import pylint_venv; pylint_venv.inithook(quiet=True)" 137 | 138 | 139 | Virtual environment does not get used (installed modules are reported as 'unable to import') 140 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 141 | 142 | Most likely the virtual environment does not get activated because pylint itself 143 | runs in a virtual environment. You can force the activation of the virtual 144 | environment with the :code:`force_venv_activation=True` flag to the 145 | :code:`pylint_venv.inithook` function. 146 | 147 | 148 | Homebrew 149 | ^^^^^^^^ 150 | 151 | Homebrew installs pylint into a separate virtual environment, thus you will 152 | need to set the `force_venv_activation=True` flag. This also means, that 153 | pylint_venv will be in a different search path and you must add the proper 154 | path to `sys.path`. You can use the following configuration adjusted to your 155 | Python version: 156 | 157 | .. code:: ini 158 | 159 | [MAIN] 160 | init-hook= 161 | import sys 162 | sys.path.append("/usr/local/lib/python3.8/site-packages") 163 | try: import pylint_venv 164 | except ImportError: pass 165 | else: pylint_venv.inithook(force_venv_activation=True) 166 | 167 | 168 | .. _Pylint: http://www.pylint.org/ 169 | .. _virtualenv: https://virtualenv.pypa.io/en/latest/ 170 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. 2 | 3 | [[package]] 4 | name = "astroid" 5 | version = "2.15.8" 6 | description = "An abstract syntax tree for Python with inference support." 7 | optional = false 8 | python-versions = ">=3.7.2" 9 | files = [ 10 | {file = "astroid-2.15.8-py3-none-any.whl", hash = "sha256:1aa149fc5c6589e3d0ece885b4491acd80af4f087baafa3fb5203b113e68cd3c"}, 11 | {file = "astroid-2.15.8.tar.gz", hash = "sha256:6c107453dffee9055899705de3c9ead36e74119cee151e5a9aaf7f0b0e020a6a"}, 12 | ] 13 | 14 | [package.dependencies] 15 | lazy-object-proxy = ">=1.4.0" 16 | typed-ast = {version = ">=1.4.0,<2.0", markers = "implementation_name == \"cpython\" and python_version < \"3.8\""} 17 | typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} 18 | wrapt = [ 19 | {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, 20 | {version = ">=1.14,<2", markers = "python_version >= \"3.11\""}, 21 | ] 22 | 23 | [[package]] 24 | name = "colorama" 25 | version = "0.4.6" 26 | description = "Cross-platform colored terminal text." 27 | optional = false 28 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 29 | files = [ 30 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 31 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 32 | ] 33 | 34 | [[package]] 35 | name = "dill" 36 | version = "0.3.7" 37 | description = "serialize all of Python" 38 | optional = false 39 | python-versions = ">=3.7" 40 | files = [ 41 | {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, 42 | {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, 43 | ] 44 | 45 | [package.extras] 46 | graph = ["objgraph (>=1.7.2)"] 47 | 48 | [[package]] 49 | name = "dill" 50 | version = "0.3.9" 51 | description = "serialize all of Python" 52 | optional = false 53 | python-versions = ">=3.8" 54 | files = [ 55 | {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, 56 | {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, 57 | ] 58 | 59 | [package.extras] 60 | graph = ["objgraph (>=1.7.2)"] 61 | profile = ["gprof2dot (>=2022.7.29)"] 62 | 63 | [[package]] 64 | name = "isort" 65 | version = "5.11.5" 66 | description = "A Python utility / library to sort Python imports." 67 | optional = false 68 | python-versions = ">=3.7.0" 69 | files = [ 70 | {file = "isort-5.11.5-py3-none-any.whl", hash = "sha256:ba1d72fb2595a01c7895a5128f9585a5cc4b6d395f1c8d514989b9a7eb2a8746"}, 71 | {file = "isort-5.11.5.tar.gz", hash = "sha256:6be1f76a507cb2ecf16c7cf14a37e41609ca082330be4e3436a18ef74add55db"}, 72 | ] 73 | 74 | [package.extras] 75 | colors = ["colorama (>=0.4.3,<0.5.0)"] 76 | pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] 77 | plugins = ["setuptools"] 78 | requirements-deprecated-finder = ["pip-api", "pipreqs"] 79 | 80 | [[package]] 81 | name = "lazy-object-proxy" 82 | version = "1.9.0" 83 | description = "A fast and thorough lazy object proxy." 84 | optional = false 85 | python-versions = ">=3.7" 86 | files = [ 87 | {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, 88 | {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, 89 | {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, 90 | {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, 91 | {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, 92 | {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, 93 | {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, 94 | {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, 95 | {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, 96 | {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, 97 | {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, 98 | {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, 99 | {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, 100 | {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, 101 | {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, 102 | {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, 103 | {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, 104 | {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, 105 | {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, 106 | {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, 107 | {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, 108 | {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, 109 | {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, 110 | {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, 111 | {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, 112 | {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, 113 | {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, 114 | {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, 115 | {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, 116 | {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, 117 | {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, 118 | {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, 119 | {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, 120 | {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, 121 | {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, 122 | {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, 123 | ] 124 | 125 | [[package]] 126 | name = "mccabe" 127 | version = "0.7.0" 128 | description = "McCabe checker, plugin for flake8" 129 | optional = false 130 | python-versions = ">=3.6" 131 | files = [ 132 | {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, 133 | {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, 134 | ] 135 | 136 | [[package]] 137 | name = "platformdirs" 138 | version = "4.0.0" 139 | description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 140 | optional = false 141 | python-versions = ">=3.7" 142 | files = [ 143 | {file = "platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b"}, 144 | {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, 145 | ] 146 | 147 | [package.dependencies] 148 | typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.8\""} 149 | 150 | [package.extras] 151 | docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] 152 | test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] 153 | 154 | [[package]] 155 | name = "pylint" 156 | version = "2.17.7" 157 | description = "python code static checker" 158 | optional = false 159 | python-versions = ">=3.7.2" 160 | files = [ 161 | {file = "pylint-2.17.7-py3-none-any.whl", hash = "sha256:27a8d4c7ddc8c2f8c18aa0050148f89ffc09838142193fdbe98f172781a3ff87"}, 162 | {file = "pylint-2.17.7.tar.gz", hash = "sha256:f4fcac7ae74cfe36bc8451e931d8438e4a476c20314b1101c458ad0f05191fad"}, 163 | ] 164 | 165 | [package.dependencies] 166 | astroid = ">=2.15.8,<=2.17.0-dev0" 167 | colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} 168 | dill = [ 169 | {version = ">=0.2", markers = "python_version < \"3.11\""}, 170 | {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, 171 | ] 172 | isort = ">=4.2.5,<6" 173 | mccabe = ">=0.6,<0.8" 174 | platformdirs = ">=2.2.0" 175 | tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} 176 | tomlkit = ">=0.10.1" 177 | typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} 178 | 179 | [package.extras] 180 | spelling = ["pyenchant (>=3.2,<4.0)"] 181 | testutils = ["gitpython (>3)"] 182 | 183 | [[package]] 184 | name = "tomli" 185 | version = "2.0.1" 186 | description = "A lil' TOML parser" 187 | optional = false 188 | python-versions = ">=3.7" 189 | files = [ 190 | {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, 191 | {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, 192 | ] 193 | 194 | [[package]] 195 | name = "tomlkit" 196 | version = "0.12.5" 197 | description = "Style preserving TOML library" 198 | optional = false 199 | python-versions = ">=3.7" 200 | files = [ 201 | {file = "tomlkit-0.12.5-py3-none-any.whl", hash = "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f"}, 202 | {file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"}, 203 | ] 204 | 205 | [[package]] 206 | name = "typed-ast" 207 | version = "1.5.5" 208 | description = "a fork of Python 2 and 3 ast modules with type comment support" 209 | optional = false 210 | python-versions = ">=3.6" 211 | files = [ 212 | {file = "typed_ast-1.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bc1efe0ce3ffb74784e06460f01a223ac1f6ab31c6bc0376a21184bf5aabe3b"}, 213 | {file = "typed_ast-1.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f7a8c46a8b333f71abd61d7ab9255440d4a588f34a21f126bbfc95f6049e686"}, 214 | {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597fc66b4162f959ee6a96b978c0435bd63791e31e4f410622d19f1686d5e769"}, 215 | {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d41b7a686ce653e06c2609075d397ebd5b969d821b9797d029fccd71fdec8e04"}, 216 | {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5fe83a9a44c4ce67c796a1b466c270c1272e176603d5e06f6afbc101a572859d"}, 217 | {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d5c0c112a74c0e5db2c75882a0adf3133adedcdbfd8cf7c9d6ed77365ab90a1d"}, 218 | {file = "typed_ast-1.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:e1a976ed4cc2d71bb073e1b2a250892a6e968ff02aa14c1f40eba4f365ffec02"}, 219 | {file = "typed_ast-1.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c631da9710271cb67b08bd3f3813b7af7f4c69c319b75475436fcab8c3d21bee"}, 220 | {file = "typed_ast-1.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b445c2abfecab89a932b20bd8261488d574591173d07827c1eda32c457358b18"}, 221 | {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc95ffaaab2be3b25eb938779e43f513e0e538a84dd14a5d844b8f2932593d88"}, 222 | {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61443214d9b4c660dcf4b5307f15c12cb30bdfe9588ce6158f4a005baeb167b2"}, 223 | {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6eb936d107e4d474940469e8ec5b380c9b329b5f08b78282d46baeebd3692dc9"}, 224 | {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e48bf27022897577d8479eaed64701ecaf0467182448bd95759883300ca818c8"}, 225 | {file = "typed_ast-1.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:83509f9324011c9a39faaef0922c6f720f9623afe3fe220b6d0b15638247206b"}, 226 | {file = "typed_ast-1.5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:44f214394fc1af23ca6d4e9e744804d890045d1643dd7e8229951e0ef39429b5"}, 227 | {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:118c1ce46ce58fda78503eae14b7664163aa735b620b64b5b725453696f2a35c"}, 228 | {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be4919b808efa61101456e87f2d4c75b228f4e52618621c77f1ddcaae15904fa"}, 229 | {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fc2b8c4e1bc5cd96c1a823a885e6b158f8451cf6f5530e1829390b4d27d0807f"}, 230 | {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:16f7313e0a08c7de57f2998c85e2a69a642e97cb32f87eb65fbfe88381a5e44d"}, 231 | {file = "typed_ast-1.5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:2b946ef8c04f77230489f75b4b5a4a6f24c078be4aed241cfabe9cbf4156e7e5"}, 232 | {file = "typed_ast-1.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2188bc33d85951ea4ddad55d2b35598b2709d122c11c75cffd529fbc9965508e"}, 233 | {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0635900d16ae133cab3b26c607586131269f88266954eb04ec31535c9a12ef1e"}, 234 | {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57bfc3cf35a0f2fdf0a88a3044aafaec1d2f24d8ae8cd87c4f58d615fb5b6311"}, 235 | {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fe58ef6a764de7b4b36edfc8592641f56e69b7163bba9f9c8089838ee596bfb2"}, 236 | {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d09d930c2d1d621f717bb217bf1fe2584616febb5138d9b3e8cdd26506c3f6d4"}, 237 | {file = "typed_ast-1.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:d40c10326893ecab8a80a53039164a224984339b2c32a6baf55ecbd5b1df6431"}, 238 | {file = "typed_ast-1.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd946abf3c31fb50eee07451a6aedbfff912fcd13cf357363f5b4e834cc5e71a"}, 239 | {file = "typed_ast-1.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ed4a1a42df8a3dfb6b40c3d2de109e935949f2f66b19703eafade03173f8f437"}, 240 | {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:045f9930a1550d9352464e5149710d56a2aed23a2ffe78946478f7b5416f1ede"}, 241 | {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381eed9c95484ceef5ced626355fdc0765ab51d8553fec08661dce654a935db4"}, 242 | {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bfd39a41c0ef6f31684daff53befddae608f9daf6957140228a08e51f312d7e6"}, 243 | {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8c524eb3024edcc04e288db9541fe1f438f82d281e591c548903d5b77ad1ddd4"}, 244 | {file = "typed_ast-1.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:7f58fabdde8dcbe764cef5e1a7fcb440f2463c1bbbec1cf2a86ca7bc1f95184b"}, 245 | {file = "typed_ast-1.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:042eb665ff6bf020dd2243307d11ed626306b82812aba21836096d229fdc6a10"}, 246 | {file = "typed_ast-1.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:622e4a006472b05cf6ef7f9f2636edc51bda670b7bbffa18d26b255269d3d814"}, 247 | {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1efebbbf4604ad1283e963e8915daa240cb4bf5067053cf2f0baadc4d4fb51b8"}, 248 | {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0aefdd66f1784c58f65b502b6cf8b121544680456d1cebbd300c2c813899274"}, 249 | {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:48074261a842acf825af1968cd912f6f21357316080ebaca5f19abbb11690c8a"}, 250 | {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:429ae404f69dc94b9361bb62291885894b7c6fb4640d561179548c849f8492ba"}, 251 | {file = "typed_ast-1.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:335f22ccb244da2b5c296e6f96b06ee9bed46526db0de38d2f0e5a6597b81155"}, 252 | {file = "typed_ast-1.5.5.tar.gz", hash = "sha256:94282f7a354f36ef5dbce0ef3467ebf6a258e370ab33d5b40c249fa996e590dd"}, 253 | ] 254 | 255 | [[package]] 256 | name = "typing-extensions" 257 | version = "4.7.1" 258 | description = "Backported and Experimental Type Hints for Python 3.7+" 259 | optional = false 260 | python-versions = ">=3.7" 261 | files = [ 262 | {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, 263 | {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, 264 | ] 265 | 266 | [[package]] 267 | name = "wrapt" 268 | version = "1.16.0" 269 | description = "Module for decorators, wrappers and monkey patching." 270 | optional = false 271 | python-versions = ">=3.6" 272 | files = [ 273 | {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, 274 | {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, 275 | {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, 276 | {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, 277 | {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, 278 | {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, 279 | {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, 280 | {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, 281 | {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, 282 | {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, 283 | {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, 284 | {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, 285 | {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, 286 | {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, 287 | {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, 288 | {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, 289 | {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, 290 | {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, 291 | {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, 292 | {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, 293 | {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, 294 | {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, 295 | {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, 296 | {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, 297 | {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, 298 | {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, 299 | {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, 300 | {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, 301 | {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, 302 | {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, 303 | {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, 304 | {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, 305 | {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, 306 | {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, 307 | {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, 308 | {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, 309 | {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, 310 | {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, 311 | {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, 312 | {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, 313 | {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, 314 | {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, 315 | {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, 316 | {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, 317 | {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, 318 | {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, 319 | {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, 320 | {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, 321 | {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, 322 | {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, 323 | {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, 324 | {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, 325 | {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, 326 | {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, 327 | {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, 328 | {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, 329 | {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, 330 | {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, 331 | {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, 332 | {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, 333 | {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, 334 | {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, 335 | {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, 336 | {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, 337 | {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, 338 | {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, 339 | {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, 340 | {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, 341 | {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, 342 | {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, 343 | ] 344 | 345 | [metadata] 346 | lock-version = "2.0" 347 | python-versions = "^3.7.2" 348 | content-hash = "9c6ddbb0cd3628e2b8c5e0d47007bcb5292ba21cf0b5a77d55b23bb895d770a2" 349 | --------------------------------------------------------------------------------