├── .editorconfig ├── .github ├── dependabot.yml └── workflows │ └── test.yml ├── .gitignore ├── .readthedocs.yml ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── docs ├── Makefile ├── _static │ └── override.css ├── _templates │ ├── layout.html │ └── moreinfo.html ├── conf.py ├── index.rst ├── make.bat └── pages │ └── changelog.rst ├── lambdas ├── __init__.py ├── contrib │ ├── __init__.py │ └── mypy │ │ ├── __init__.py │ │ └── lambdas_plugin.py └── py.typed ├── poetry.lock ├── pyproject.toml ├── setup.cfg ├── tests ├── test_callable │ ├── test_add.py │ ├── test_complex_expression.py │ ├── test_floordiv.py │ ├── test_getattr.py │ ├── test_getitem.py │ ├── test_mod.py │ ├── test_mul.py │ ├── test_pow.py │ ├── test_sub.py │ ├── test_truediv.py │ └── test_unary │ │ └── test_negate.py └── test_math_expression │ ├── test_add_expression.py │ ├── test_complex_math_expression.py │ ├── test_floordiv_expression.py │ ├── test_mod_expression.py │ ├── test_mul_expression.py │ ├── test_pow_expression.py │ ├── test_sub_expression.py │ └── test_truediv_expression.py └── typesafety ├── test_add_type.yml ├── test_getattr.yml ├── test_getitem_type.yml └── test_negate_type.yml /.editorconfig: -------------------------------------------------------------------------------- 1 | # Check http://editorconfig.org for more information 2 | # This is the main config file for this project: 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | trim_trailing_whitespace = true 8 | end_of_line = lf 9 | indent_style = space 10 | insert_final_newline = true 11 | indent_size = 2 12 | 13 | [*.py] 14 | indent_size = 4 15 | 16 | [*.pyi] 17 | indent_size = 4 18 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: pip 4 | directory: "/" 5 | schedule: 6 | interval: daily 7 | open-pull-requests-limit: 10 8 | ignore: 9 | - dependency-name: nitpick 10 | versions: 11 | - 0.24.0 12 | - dependency-name: wemake-python-styleguide 13 | versions: 14 | - 0.15.0 15 | - 0.15.1 16 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: test 2 | 3 | on: [push, pull_request, workflow_dispatch] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | strategy: 9 | matrix: 10 | python-version: ['3.8', '3.9', '3.10', '3.11'] 11 | 12 | steps: 13 | - name: Checkout 14 | uses: actions/checkout@v4 15 | 16 | - name: Set up Python ${{ matrix.python-version }} 17 | uses: actions/setup-python@v4 18 | with: 19 | python-version: ${{ matrix.python-version }} 20 | 21 | - name: Install poetry 22 | run: curl -sSL "https://install.python-poetry.org" | python 23 | 24 | - name: Set up cache 25 | uses: actions/cache@v3 26 | with: 27 | path: .venv 28 | key: venv-${{ matrix.python-version }}-${{ hashFiles('poetry.lock') }} 29 | 30 | - name: Install dependencies 31 | run: | 32 | poetry config virtualenvs.in-project true 33 | poetry install 34 | 35 | poetry run pip install -U pip 36 | 37 | - name: Run tests 38 | run: | 39 | poetry run flake8 . 40 | poetry run mypy lambdas tests/**/*.py 41 | poetry run pytest lambdas tests 42 | poetry run doc8 -q docs 43 | poetry run poetry check 44 | poetry run pip check 45 | poetry run safety check --full-report 46 | # We do this to speed up the build: 47 | poetry run pytest typesafety -p no:cov -o addopts="" --mypy-ini-file=setup.cfg 48 | 49 | - name: Upload coverage to Codecov 50 | if: matrix.python-version == 3.8 51 | uses: codecov/codecov-action@v3 52 | with: 53 | file: ./coverage.xml 54 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | #### joe made this: http://goel.io/joe 2 | #### python #### 3 | # Byte-compiled / optimized / DLL files 4 | .pytest_cache 5 | __pycache__/ 6 | *.py[cod] 7 | *$py.class 8 | 9 | # C extensions 10 | *.so 11 | 12 | # Distribution / packaging 13 | .Python 14 | build/ 15 | develop-eggs/ 16 | dist/ 17 | downloads/ 18 | eggs/ 19 | .eggs/ 20 | lib/ 21 | lib64/ 22 | parts/ 23 | sdist/ 24 | var/ 25 | wheels/ 26 | *.egg-info/ 27 | .installed.cfg 28 | *.egg 29 | pip-wheel-metadata/ 30 | 31 | # PyInstaller 32 | # Usually these files are written by a python script from a template 33 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 34 | *.manifest 35 | *.spec 36 | 37 | # Installer logs 38 | pip-log.txt 39 | pip-delete-this-directory.txt 40 | 41 | # Unit test / coverage reports 42 | htmlcov/ 43 | .tox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | .hypothesis/ 51 | 52 | # Translations 53 | *.mo 54 | *.pot 55 | 56 | # Django stuff: 57 | *.log 58 | local_settings.py 59 | 60 | # Flask stuff: 61 | instance/ 62 | .webassets-cache 63 | 64 | # Scrapy stuff: 65 | .scrapy 66 | 67 | # Sphinx documentation 68 | docs/_build/ 69 | 70 | # PyBuilder 71 | target/ 72 | 73 | # Jupyter Notebook 74 | .ipynb_checkpoints 75 | 76 | # pyenv 77 | .python-version 78 | 79 | # celery beat schedule file 80 | celerybeat-schedule 81 | 82 | # SageMath parsed files 83 | *.sage.py 84 | 85 | # Environments 86 | .env 87 | .venv 88 | env/ 89 | venv/ 90 | ENV/ 91 | 92 | # Spyder project settings 93 | .spyderproject 94 | .spyproject 95 | 96 | # Rope project settings 97 | .ropeproject 98 | 99 | # mkdocs documentation 100 | /site 101 | 102 | # mypy 103 | .mypy_cache/ 104 | #### macos #### 105 | # General 106 | *.DS_Store 107 | .AppleDouble 108 | .LSOverride 109 | 110 | # Icon must end with two \r 111 | Icon 112 | 113 | 114 | # Thumbnails 115 | ._* 116 | 117 | # Files that might appear in the root of a volume 118 | .DocumentRevisions-V100 119 | .fseventsd 120 | .Spotlight-V100 121 | .TemporaryItems 122 | .Trashes 123 | .VolumeIcon.icns 124 | .com.apple.timemachine.donotpresent 125 | 126 | # Directories potentially created on remote AFP share 127 | .AppleDB 128 | .AppleDesktop 129 | Network Trash Folder 130 | Temporary Items 131 | .apdisk 132 | #### windows #### 133 | # Windows thumbnail cache files 134 | Thumbs.db 135 | ehthumbs.db 136 | ehthumbs_vista.db 137 | 138 | # Dump file 139 | *.stackdump 140 | 141 | # Folder config file 142 | Desktop.ini 143 | 144 | # Recycle Bin used on file shares 145 | $RECYCLE.BIN/ 146 | 147 | # Windows Installer files 148 | *.cab 149 | *.msi 150 | *.msm 151 | *.msp 152 | 153 | # Windows shortcuts 154 | *.lnk 155 | #### linux #### 156 | *~ 157 | 158 | # temporary files which can be created if a process still has a handle open of a deleted file 159 | .fuse_hidden* 160 | 161 | # KDE directory preferences 162 | .directory 163 | 164 | # Linux trash folder which might appear on any partition or disk 165 | .Trash-* 166 | 167 | # .nfs files are created when an open file is removed but is still being accessed 168 | .nfs* 169 | #### jetbrains #### 170 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm 171 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 172 | 173 | # User-specific stuff: 174 | .idea/ 175 | 176 | ## File-based project format: 177 | *.iws 178 | 179 | ## Plugin-specific files: 180 | 181 | # IntelliJ 182 | /out/ 183 | 184 | # mpeltonen/sbt-idea plugin 185 | .idea_modules/ 186 | 187 | # JIRA plugin 188 | atlassian-ide-plugin.xml 189 | 190 | # Cursive Clojure plugin 191 | .idea/replstate.xml 192 | 193 | # Crashlytics plugin (for Android Studio and IntelliJ) 194 | com_crashlytics_export_strings.xml 195 | crashlytics.properties 196 | crashlytics-build.properties 197 | fabric.properties 198 | 199 | ### Custom ### 200 | ex.py 201 | -------------------------------------------------------------------------------- /.readthedocs.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | build: 4 | os: ubuntu-22.04 5 | tools: 6 | python: "3.10" 7 | jobs: 8 | pre_create_environment: 9 | - asdf plugin add poetry 10 | - asdf install poetry latest 11 | - asdf global poetry latest 12 | - poetry config virtualenvs.create false 13 | - poetry export --with docs --format=requirements.txt --output=requirements.txt 14 | 15 | sphinx: 16 | configuration: docs/conf.py 17 | fail_on_warning: true 18 | 19 | python: 20 | install: 21 | - requirements: requirements.txt 22 | 23 | formats: all 24 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Version history 2 | 3 | We follow Semantic Versions since the `1.0.0` release. 4 | Versions before `1.0.0` are `0Ver`-based: 5 | incremental in minor, bugfixes only are patches. 6 | See (0Ver)[https://0ver.org/]. 7 | 8 | ## Version 0.2.0 9 | 10 | ### Features 11 | 12 | * Add support for `_.attr` call 13 | * Add complex math expressions support 14 | 15 | ### Misc 16 | 17 | * Breaking: Drops Python 3.6 support 18 | * Breaking: Drops Python 3.7 support 19 | 20 | ## Version 0.1.0 21 | 22 | Initial release. Featuring only simple cases with lambdas. 23 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # How to contribute 2 | 3 | 4 | ## Dependencies 5 | 6 | We use [`poetry`](https://github.com/sdispater/poetry) to manage the dependencies. 7 | 8 | To install them you would need to run `install` command: 9 | 10 | ```bash 11 | poetry install 12 | ``` 13 | 14 | To activate your `virtualenv` run `poetry shell`. 15 | 16 | 17 | ## Tests 18 | 19 | We use `pytest` and `flake8` for quality control. 20 | We also use `wemake_python_styleguide` to enforce the code quality. 21 | 22 | To run all tests: 23 | 24 | ```bash 25 | pytest 26 | ``` 27 | 28 | To run linting: 29 | 30 | ```bash 31 | flake8 . 32 | ``` 33 | 34 | These steps are mandatory during the CI. 35 | 36 | ## Type checks 37 | 38 | We use `mypy` to run type checks on our code. 39 | To use it: 40 | 41 | ```bash 42 | mypy lambdas tests/**/*.py 43 | ``` 44 | 45 | This step is mandatory during the CI. 46 | 47 | 48 | ## Submitting your code 49 | 50 | We use [trunk based](https://trunkbaseddevelopment.com/) 51 | development (we also sometimes call it `wemake-git-flow`). 52 | 53 | What the point of this method? 54 | 55 | 1. We use protected `master` branch, 56 | so the only way to push your code is via pull request 57 | 2. We use issue branches: to implement a new feature or to fix a bug 58 | create a new branch named `issue-$TASKNUMBER` 59 | 3. Then create a pull request to `master` branch 60 | 4. We use `git tag`s to make releases, so we can track what has changed 61 | since the latest release 62 | 63 | So, this way we achieve an easy and scalable development process 64 | which frees us from merging hell and long-living branches. 65 | 66 | In this method, the latest version of the app is always in the `master` branch. 67 | 68 | ### Before submitting 69 | 70 | Before submitting your code please do the following steps: 71 | 72 | 1. Run `pytest` to make sure everything was working before 73 | 2. Add any changes you want 74 | 3. Add tests for the new changes 75 | 4. Edit documentation if you have changed something significant 76 | 5. Update `CHANGELOG.md` with a quick summary of your changes 77 | 6. Run `pytest` again to make sure it is still working 78 | 7. Run `mypy` to ensure that types are correct 79 | 8. Run `flake8` to ensure that style is correct 80 | 9. Run `doc8` to ensure that docs are correct 81 | 82 | 83 | ## Other help 84 | 85 | You can contribute by spreading a word about this library. 86 | It would also be a huge contribution to write 87 | a short article on how you are using this project. 88 | You can also share your best practices with us. 89 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2016-2021 dry-python organization 2 | 3 | Redistribution and use in source and binary forms, with or without 4 | modification, are permitted provided that the following conditions are 5 | met: 6 | 7 | 1. Redistributions of source code must retain the above copyright 8 | notice, this list of conditions and the following disclaimer. 9 | 10 | 2. Redistributions in binary form must reproduce the above copyright 11 | notice, this list of conditions and the following disclaimer in the 12 | documentation and/or other materials provided with the 13 | distribution. 14 | 15 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 18 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 19 | HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![lambdas logo](https://raw.githubusercontent.com/dry-python/brand/master/logo/lambdas.png)](https://github.com/dry-python/lambdas) 2 | 3 | ----- 4 | 5 | [![Build Status](https://github.com/dry-python/lambdas/workflows/test/badge.svg?branch=master&event=push)](https://github.com/dry-python/lambdas/actions?query=workflow%3Atest) 6 | [![codecov](https://codecov.io/gh/dry-python/lambdas/branch/master/graph/badge.svg)](https://codecov.io/gh/dry-python/lambdas) 7 | [![Documentation Status](https://readthedocs.org/projects/lambdas/badge/?version=latest)](https://lambdas.readthedocs.io/en/latest/?badge=latest) 8 | [![Python Version](https://img.shields.io/pypi/pyversions/lambdas.svg)](https://pypi.org/project/lambdas/) 9 | [![wemake-python-styleguide](https://img.shields.io/badge/style-wemake-000000.svg)](https://github.com/wemake-services/wemake-python-styleguide) 10 | [![Telegram chat](https://img.shields.io/badge/chat-join-blue?logo=telegram)](https://t.me/drypython) 11 | 12 | ----- 13 | 14 | Write short and fully-typed `lambda`s where you need them. 15 | 16 | 17 | ## Features 18 | 19 | - Allows to write `lambda`s as `_` 20 | - Fully typed with annotations and checked with `mypy`, [PEP561 compatible](https://www.python.org/dev/peps/pep-0561/) 21 | - Has a bunch of helpers for better composition 22 | - Easy to start: has lots of docs, tests, and tutorials 23 | 24 | 25 | ## Installation 26 | 27 | ```bash 28 | pip install lambdas 29 | ``` 30 | 31 | You also need to configure `mypy` correctly and install our plugin: 32 | 33 | ```ini 34 | # In setup.cfg or mypy.ini: 35 | [mypy] 36 | plugins = 37 | lambdas.contrib.mypy.lambdas_plugin 38 | ``` 39 | 40 | We recommend to use the same `mypy` settings [we use](https://github.com/wemake-services/wemake-python-styleguide/blob/master/styles/mypy.toml). 41 | 42 | 43 | ## Examples 44 | 45 | Imagine that you need to sort an array of dictionaries like so: 46 | 47 | ```python 48 | >>> scores = [ 49 | ... {'name': 'Nikita', 'score': 2}, 50 | ... {'name': 'Oleg', 'score': 1}, 51 | ... {'name': 'Pavel', 'score': 4}, 52 | ... ] 53 | 54 | >>> print(sorted(scores, key=lambda item: item['score'])) 55 | [{'name': 'Oleg', 'score': 1}, {'name': 'Nikita', 'score': 2}, {'name': 'Pavel', 'score': 4}] 56 | ``` 57 | 58 | And it works perfectly fine. 59 | Except, that you have to do a lot of typing for such a simple operation. 60 | 61 | That's where `lambdas` helper steps in: 62 | 63 | ```python 64 | >>> from lambdas import _ 65 | 66 | >>> scores = [ 67 | ... {'name': 'Nikita', 'score': 2}, 68 | ... {'name': 'Oleg', 'score': 1}, 69 | ... {'name': 'Pavel', 'score': 4}, 70 | ... ] 71 | 72 | >>> print(sorted(scores, key=_['score'])) 73 | [{'name': 'Oleg', 'score': 1}, {'name': 'Nikita', 'score': 2}, {'name': 'Pavel', 'score': 4}] 74 | ``` 75 | 76 | It might really save you a lot of effort, 77 | when you use a lot of `lambda` functions. 78 | Like when using [`returns`](https://github.com/dry-python/returns) library. 79 | 80 | We can easily create math expressions: 81 | 82 | ```python 83 | >>> from lambdas import _ 84 | 85 | >>> math_expression = _ * 2 + 1 86 | >>> print(math_expression(10)) 87 | 21 88 | >>> complex_math_expression = 50 / (_ ** 2) * 2 89 | >>> print(complex_math_expression(5)) 90 | 100.0 91 | ``` 92 | 93 | Work in progress: 94 | 95 | - `_.method()` is not supported yet for the same reason 96 | - `TypedDict`s are not tested with `__getitem__` 97 | - `__getitem__` does not work with list and tuples (collections), only dicts (mappings) 98 | 99 | For now you will have to use regular `lamdba`s in these cases. 100 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line, and also 5 | # from the environment for the first two. 6 | SPHINXOPTS ?= 7 | SPHINXBUILD ?= sphinx-build 8 | SOURCEDIR = . 9 | BUILDDIR = _build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 21 | -------------------------------------------------------------------------------- /docs/_static/override.css: -------------------------------------------------------------------------------- 1 | .globaltoc > p.caption { 2 | display: block; 3 | font-size: 1.05em; 4 | font-weight: 700; 5 | text-decoration: none; 6 | margin-bottom: 1em; 7 | border: 0; 8 | } 9 | 10 | /* For some reason it did not have a scroll attached. */ 11 | 12 | .mermaid { 13 | overflow: scroll; 14 | } 15 | -------------------------------------------------------------------------------- /docs/_templates/layout.html: -------------------------------------------------------------------------------- 1 | {# layout.html #} 2 | {# Import the layout of the theme. #} 3 | {% extends "!layout.html" %} 4 | 5 | {% set css_files = css_files + ['_static/overrides.css'] %} 6 | -------------------------------------------------------------------------------- /docs/_templates/moreinfo.html: -------------------------------------------------------------------------------- 1 |

2 | Links 3 |

4 | 15 | -------------------------------------------------------------------------------- /docs/conf.py: -------------------------------------------------------------------------------- 1 | # Configuration file for the Sphinx documentation builder. 2 | # 3 | # This file only contains a selection of the most common options. For a full 4 | # list see the documentation: 5 | # https://www.sphinx-doc.org/en/master/usage/configuration.html 6 | 7 | # -- Path setup -------------------------------------------------------------- 8 | 9 | # If extensions (or modules to document with autodoc) are in another directory, 10 | # add these directories to sys.path here. If the directory is relative to the 11 | # documentation root, use os.path.abspath to make it absolute, like shown here. 12 | 13 | import os 14 | import sys 15 | 16 | sys.path.insert(0, os.path.abspath('.')) 17 | 18 | 19 | # -- Project information ----------------------------------------------------- 20 | 21 | def _get_project_meta(): 22 | import tomlkit # noqa: WPS433 23 | 24 | with open('../pyproject.toml') as pyproject: 25 | file_contents = pyproject.read() 26 | 27 | return tomlkit.parse(file_contents)['tool']['poetry'] 28 | 29 | 30 | pkg_meta = _get_project_meta() 31 | project = 'lambdas' 32 | copyright = '2021, dry-python team' 33 | author = 'dry-python team' 34 | 35 | # The short X.Y version 36 | version = str(pkg_meta['version']) 37 | # The full version, including alpha/beta/rc tags 38 | release = version 39 | 40 | 41 | # -- General configuration --------------------------------------------------- 42 | 43 | # Add any Sphinx extension module names here, as strings. They can be 44 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 45 | # ones. 46 | extensions = [ 47 | 'sphinx.ext.autodoc', 48 | 'sphinx.ext.doctest', 49 | 'sphinx.ext.todo', 50 | 'sphinx.ext.coverage', 51 | 'sphinx.ext.viewcode', 52 | 'sphinx.ext.autosummary', 53 | 'sphinx.ext.napoleon', 54 | 55 | # Used to include .md files: 56 | 'm2r2', 57 | 58 | # Used to insert typehints into the final docs: 59 | 'sphinx_autodoc_typehints', 60 | ] 61 | 62 | autoclass_content = 'class' 63 | autodoc_member_order = 'bysource' 64 | 65 | autodoc_default_options = { 66 | 'members': True, 67 | 'show-inheritance': True, 68 | } 69 | 70 | # Set `typing.TYPE_CHECKING` to `True`: 71 | # https://pypi.org/project/sphinx-autodoc-typehints/ 72 | set_type_checking_flag = False 73 | always_document_param_types = True 74 | 75 | # Add any paths that contain templates here, relative to this directory. 76 | templates_path = ['_templates'] 77 | 78 | # The suffix(es) of source filenames. 79 | # You can specify multiple suffix as a list of string: 80 | source_suffix = ['.rst', '.md'] 81 | 82 | # List of patterns, relative to source directory, that match files and 83 | # directories to ignore when looking for source files. 84 | # This pattern also affects html_static_path and html_extra_path. 85 | exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] 86 | 87 | # The name of the Pygments (syntax highlighting) style to use. 88 | pygments_style = 'sphinx' 89 | 90 | add_module_names = False 91 | 92 | # -- Options for HTML output ------------------------------------------------- 93 | 94 | # The theme to use for HTML and HTML Help pages. See the documentation for 95 | # a list of builtin themes. 96 | html_theme = 'sphinx_typlog_theme' 97 | 98 | # Theme options are theme-specific and customize the look and feel of a theme 99 | # further. For a list of options available for each theme, see the 100 | # documentation. 101 | html_theme_options = { 102 | 'logo_name': 'lambdas', 103 | 'description': ( 104 | 'Write short and fully-typed lambdas where you need them.' 105 | ), 106 | 'github_user': 'dry-python', 107 | 'github_repo': 'lambdas', 108 | 'color': '#E8371A', 109 | } 110 | 111 | # Add any paths that contain custom static files (such as style sheets) here, 112 | # relative to this directory. They are copied after the builtin static files, 113 | # so a file named "default.css" will overwrite the builtin "default.css". 114 | html_static_path = ['_static'] 115 | 116 | # Custom sidebar templates, must be a dictionary that maps document names 117 | # to template names. 118 | html_sidebars = { 119 | '**': [ 120 | 'logo.html', 121 | 'globaltoc.html', 122 | 'github.html', 123 | 'searchbox.html', 124 | 'moreinfo.html', 125 | ], 126 | } 127 | 128 | # -- Extension configuration ------------------------------------------------- 129 | 130 | napoleon_numpy_docstring = False 131 | 132 | # -- Options for todo extension ---------------------------------------------- 133 | 134 | # If true, `todo` and `todoList` produce output, else they produce nothing. 135 | todo_include_todos = True 136 | -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | .. mdinclude:: ../README.md 2 | 3 | Contents 4 | -------- 5 | 6 | .. toctree:: 7 | :maxdepth: 1 8 | :caption: Changelog 9 | 10 | pages/changelog.rst 11 | 12 | 13 | Indices and tables 14 | ------------------ 15 | 16 | * :ref:`genindex` 17 | * :ref:`modindex` 18 | * :ref:`search` 19 | -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=. 11 | set BUILDDIR=_build 12 | 13 | if "%1" == "" goto help 14 | 15 | %SPHINXBUILD% >NUL 2>NUL 16 | if errorlevel 9009 ( 17 | echo. 18 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 19 | echo.installed, then set the SPHINXBUILD environment variable to point 20 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 21 | echo.may add the Sphinx directory to PATH. 22 | echo. 23 | echo.If you don't have Sphinx installed, grab it from 24 | echo.http://sphinx-doc.org/ 25 | exit /b 1 26 | ) 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /docs/pages/changelog.rst: -------------------------------------------------------------------------------- 1 | .. mdinclude:: ../../CHANGELOG.md 2 | -------------------------------------------------------------------------------- /lambdas/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import operator 4 | from functools import partial, reduce 5 | from typing import Callable, List, Mapping, TypeVar, Union 6 | 7 | from typing_extensions import Protocol 8 | 9 | T1 = TypeVar('T1') 10 | T2 = TypeVar('T2') 11 | 12 | _Number = Union[int, float, complex] 13 | 14 | 15 | def _fmap(callback): # pragma: nocover 16 | # TODO: Remove `pragma` after https://github.com/dry-python/lambdas/issues/4 17 | """Convers callback to instance method with two arguments.""" 18 | def decorator(self, second): 19 | return lambda first: callback(first, second) 20 | return decorator 21 | 22 | 23 | def _unary_fmap(callback): 24 | """Convers callback to unary instance method.""" 25 | def decorator(self): 26 | return callback 27 | return decorator 28 | 29 | 30 | def _flip(callback): 31 | """Flips arguments: the first one becomes the second.""" 32 | return lambda first, second: callback(second, first) 33 | 34 | 35 | class _LambdaDynamicProtocol(Protocol[T1]): 36 | """ 37 | This is one of the most complicated parts in this library. 38 | 39 | This is a generic protocol definition that works fine, 40 | except it cannot change the field name in runtime. 41 | 42 | And we need this field name to change when we call ``_.some``. 43 | When this happens we use our ``mypy`` plugin 44 | to change the field name from ``lambdas_generic_field`` to ``some``. 45 | 46 | And it continues to work as is. 47 | """ 48 | 49 | lambdas_generic_field: T1 50 | 51 | 52 | class _MathExpression(object): # noqa: WPS214 53 | """ 54 | Mathmatical expression callable class. 55 | 56 | This class helps us to build an callable with complex mathematical 57 | expression, basically it's the substitute of `x` in a expression. 58 | When we call this class the number passed trought the instance will be 59 | the `x`. 60 | 61 | See the example below: 62 | 63 | >>> from lambdas import _MathExpression 64 | >>> complex_expression = (10 ** 2) / _MathExpression() * 10 65 | >>> complex_expression(2) 66 | 500.0 67 | 68 | """ 69 | 70 | def __init__(self) -> None: 71 | self._operations: List[Callable[[_Number], _Number]] = [] 72 | 73 | def __call__(self, number: _Number) -> _Number: 74 | first_operation, *rest_of_the_operations = self._operations 75 | return reduce( 76 | lambda partial_result, operation: operation(partial_result), 77 | rest_of_the_operations, 78 | first_operation(number), 79 | ) 80 | 81 | def __add__(self, other: _Number) -> '_MathExpression': 82 | return self._add_operation(_flip(operator.add), other) 83 | 84 | def __sub__(self, other: _Number) -> '_MathExpression': 85 | return self._add_operation(_flip(operator.sub), other) 86 | 87 | def __mul__(self, other: _Number) -> '_MathExpression': 88 | return self._add_operation(_flip(operator.mul), other) 89 | 90 | def __floordiv__(self, other: _Number) -> '_MathExpression': 91 | return self._add_operation(_flip(operator.floordiv), other) 92 | 93 | def __truediv__(self, other: _Number) -> '_MathExpression': 94 | return self._add_operation(_flip(operator.truediv), other) 95 | 96 | def __mod__(self, other: _Number) -> '_MathExpression': 97 | return self._add_operation(_flip(operator.mod), other) 98 | 99 | def __pow__(self, other: _Number) -> '_MathExpression': 100 | return self._add_operation(_flip(operator.pow), other) 101 | 102 | def __radd__(self, other: _Number) -> '_MathExpression': 103 | return self._add_operation(operator.add, other) 104 | 105 | def __rsub__(self, other: _Number) -> '_MathExpression': 106 | return self._add_operation(operator.sub, other) 107 | 108 | def __rmul__(self, other: _Number) -> '_MathExpression': 109 | return self._add_operation(operator.mul, other) 110 | 111 | def __rfloordiv__(self, other: _Number) -> '_MathExpression': 112 | return self._add_operation(operator.floordiv, other) 113 | 114 | def __rtruediv__(self, other: _Number) -> '_MathExpression': 115 | return self._add_operation(operator.truediv, other) 116 | 117 | def __rmod__(self, other: _Number) -> '_MathExpression': 118 | return self._add_operation(operator.mod, other) 119 | 120 | def __rpow__(self, other: _Number) -> '_MathExpression': 121 | return self._add_operation(operator.pow, other) 122 | 123 | def _add_operation( 124 | self, 125 | operation: Callable[[_Number, _Number], _Number], 126 | other: _Number, 127 | ) -> '_MathExpression': 128 | self._operations.append(partial(operation, other)) 129 | return self 130 | 131 | 132 | class _Callable(object): # noqa: WPS214 133 | """ 134 | Short lambda implementation. 135 | 136 | It is useful when you have 137 | a lot of single-argument ``lambda`` functions here and there. 138 | 139 | It can be used like so: 140 | 141 | >>> from lambdas import _ 142 | >>> response = [{'count': 3}, {'count': 1}, {'count': 2}] 143 | >>> sorted(response, key=_['count']) 144 | [{'count': 1}, {'count': 2}, {'count': 3}] 145 | 146 | """ 147 | 148 | def __getattr__( 149 | self, 150 | key: str, 151 | ) -> Callable[[_LambdaDynamicProtocol[T1]], T1]: 152 | return operator.attrgetter(key) 153 | 154 | def __getitem__( 155 | self, key: T1, 156 | ) -> Callable[[Mapping[T1, T2]], T2]: 157 | return operator.itemgetter(key) 158 | 159 | def __add__(self, other: _Number) -> _MathExpression: 160 | return _MathExpression() + other 161 | 162 | def __sub__(self, other: _Number) -> _MathExpression: 163 | return _MathExpression() - other 164 | 165 | def __mul__(self, other: _Number) -> _MathExpression: 166 | return _MathExpression() * other 167 | 168 | def __floordiv__(self, other: _Number) -> _MathExpression: 169 | return _MathExpression() // other 170 | 171 | def __truediv__(self, other: _Number) -> _MathExpression: 172 | return _MathExpression() / other 173 | 174 | def __mod__(self, other: _Number) -> _MathExpression: 175 | return _MathExpression() % other 176 | 177 | def __pow__(self, other: _Number) -> _MathExpression: 178 | return _MathExpression() ** other 179 | 180 | def __radd__(self, other: _Number) -> _MathExpression: 181 | return other + _MathExpression() 182 | 183 | def __rsub__(self, other: _Number) -> _MathExpression: 184 | return other - _MathExpression() 185 | 186 | def __rmul__(self, other: _Number) -> _MathExpression: 187 | return other * _MathExpression() 188 | 189 | def __rfloordiv__(self, other: _Number) -> _MathExpression: 190 | return other // _MathExpression() 191 | 192 | def __rtruediv__(self, other: _Number) -> _MathExpression: 193 | return other / _MathExpression() 194 | 195 | def __rmod__(self, other: _Number) -> _MathExpression: 196 | return other % _MathExpression() # noqa: S001 197 | 198 | def __rpow__(self, other: _Number) -> _MathExpression: 199 | return other ** _MathExpression() 200 | 201 | __and__: Callable[['_Callable', T1], Callable[[T1], T1]] = _fmap( 202 | operator.and_, 203 | ) 204 | __or__: Callable[['_Callable', T1], Callable[[T1], T1]] = _fmap( 205 | operator.or_, 206 | ) 207 | __xor__: Callable[['_Callable', T1], Callable[[T1], T1]] = _fmap( 208 | operator.xor, 209 | ) 210 | __divmod__: Callable[['_Callable', T1], Callable[[T1], T1]] = _fmap(divmod) 211 | 212 | __lshift__: Callable[['_Callable', T1], Callable[[T1], T1]] = _fmap( 213 | operator.lshift, 214 | ) 215 | __rshift__: Callable[['_Callable', T1], Callable[[T1], T1]] = _fmap( 216 | operator.rshift, 217 | ) 218 | 219 | __lt__: Callable[['_Callable', T1], Callable[[T1], T1]] = _fmap( 220 | operator.lt, 221 | ) 222 | __le__: Callable[['_Callable', T1], Callable[[T1], T1]] = _fmap( 223 | operator.le, 224 | ) 225 | __gt__: Callable[['_Callable', T1], Callable[[T1], T1]] = _fmap( 226 | operator.gt, 227 | ) 228 | __ge__: Callable[['_Callable', T1], Callable[[T1], T1]] = _fmap( 229 | operator.ge, 230 | ) 231 | __eq__: Callable[ 232 | ['_Callable', object], Callable[[object], bool], 233 | ] = _fmap( # type: ignore 234 | operator.eq, 235 | ) 236 | __ne__: Callable[ 237 | ['_Callable', object], Callable[[object], bool], 238 | ] = _fmap( # type: ignore 239 | operator.ne, 240 | ) 241 | 242 | __neg__: Callable[['_Callable'], Callable[[T1], T1]] = _unary_fmap( 243 | operator.neg, 244 | ) 245 | __pos__: Callable[['_Callable'], Callable[[T1], T1]] = _unary_fmap( 246 | operator.pos, 247 | ) 248 | __invert__: Callable[['_Callable'], Callable[[T1], T1]] = _unary_fmap( 249 | operator.invert, 250 | ) 251 | 252 | __rdivmod__: Callable[['_Callable', T1], Callable[[T1], T1]] = _fmap( 253 | _flip(divmod), 254 | ) 255 | 256 | __rlshift__: Callable[['_Callable', T1], Callable[[T1], T1]] = _fmap( 257 | _flip(operator.lshift), 258 | ) 259 | __rrshift__: Callable[['_Callable', T1], Callable[[T1], T1]] = _fmap( 260 | _flip(operator.rshift), 261 | ) 262 | 263 | __rand__: Callable[['_Callable', T1], Callable[[T1], T1]] = _fmap( 264 | _flip(operator.and_), 265 | ) 266 | __ror__: Callable[['_Callable', T1], Callable[[T1], T1]] = _fmap( 267 | _flip(operator.or_), 268 | ) 269 | __rxor__: Callable[['_Callable', T1], Callable[[T1], T1]] = _fmap( 270 | _flip(operator.xor), 271 | ) 272 | 273 | 274 | #: Our main alias for the lambda object: 275 | _ = _Callable() # noqa: WPS122 276 | -------------------------------------------------------------------------------- /lambdas/contrib/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | -------------------------------------------------------------------------------- /lambdas/contrib/mypy/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dry-python/lambdas/eb89d3704eec9c0683b2e058ebadc9bc28feb055/lambdas/contrib/mypy/__init__.py -------------------------------------------------------------------------------- /lambdas/contrib/mypy/lambdas_plugin.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from typing import Type 4 | 5 | from mypy.nodes import MemberExpr 6 | from mypy.plugin import AttributeContext, Plugin 7 | 8 | 9 | def _mutate_field_name(ctx): 10 | default = ctx.default_attr_type.arg_types[0] 11 | if not default.type.names: 12 | return 13 | 14 | old_field_name = next(iter(default.type.names.keys())) 15 | actual_field = default.type.names[old_field_name].copy() 16 | actual_field.cross_ref = None 17 | 18 | actual_field.node._name = ctx.context.name 19 | fullname = actual_field.node._fullname.rsplit('.', 1) 20 | fullname[-1] = ctx.context.name 21 | actual_field.node._fullname = '.'.join(fullname) 22 | 23 | default.type.names[ctx.context.name] = actual_field 24 | default.type.names.pop(old_field_name) 25 | 26 | 27 | def _analyze_lambda(plugin: Plugin): 28 | def factory(ctx: AttributeContext): 29 | if isinstance(ctx.context, MemberExpr): 30 | _mutate_field_name(ctx) 31 | 32 | return ctx.default_attr_type 33 | return factory 34 | 35 | 36 | class _TypedShortLambdasPlugin(Plugin): 37 | def get_attribute_hook(self, fullname: str): 38 | """ 39 | This method is called on expressions like: ``_.attr``. 40 | 41 | We use it to change the default generic protocol field name. 42 | In case it was called as ``_.attr`` we change the name to ``attr``. 43 | 44 | See also: 45 | https://github.com/python/mypy/blob/master/mypy/nodes.py 46 | https://github.com/python/mypy/blob/master/mypy/types.py 47 | https://github.com/python/mypy/blob/master/mypy/plugin.py 48 | 49 | """ 50 | if fullname.startswith('lambdas._Callable.'): 51 | return _analyze_lambda(self) 52 | return None 53 | 54 | 55 | def plugin(version: str) -> Type[Plugin]: 56 | """Plugin's public API and entrypoint.""" 57 | return _TypedShortLambdasPlugin 58 | -------------------------------------------------------------------------------- /lambdas/py.typed: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dry-python/lambdas/eb89d3704eec9c0683b2e058ebadc9bc28feb055/lambdas/py.typed -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. 2 | 3 | [[package]] 4 | name = "alabaster" 5 | version = "0.7.13" 6 | description = "A configurable sidebar-enabled Sphinx theme" 7 | optional = false 8 | python-versions = ">=3.6" 9 | files = [ 10 | {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, 11 | {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, 12 | ] 13 | 14 | [[package]] 15 | name = "ast-decompiler" 16 | version = "0.7.0" 17 | description = "Python module to decompile AST to Python code" 18 | optional = false 19 | python-versions = ">=3.6" 20 | files = [ 21 | {file = "ast_decompiler-0.7.0-py3-none-any.whl", hash = "sha256:5ebd37ba129227484daff4a15dd6056d87c488fa372036dd004ee84196b207d3"}, 22 | {file = "ast_decompiler-0.7.0.tar.gz", hash = "sha256:efc3a507e5f8963ec7b4b2ce2ea693e3755c2f52b741c231bc344a4526738337"}, 23 | ] 24 | 25 | [[package]] 26 | name = "astor" 27 | version = "0.8.1" 28 | description = "Read/rewrite/write Python ASTs" 29 | optional = false 30 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" 31 | files = [ 32 | {file = "astor-0.8.1-py2.py3-none-any.whl", hash = "sha256:070a54e890cefb5b3739d19f30f5a5ec840ffc9c50ffa7d23cc9fc1a38ebbfc5"}, 33 | {file = "astor-0.8.1.tar.gz", hash = "sha256:6a6effda93f4e1ce9f618779b2dd1d9d84f1e32812c23a29b3fff6fd7f63fa5e"}, 34 | ] 35 | 36 | [[package]] 37 | name = "attrs" 38 | version = "23.1.0" 39 | description = "Classes Without Boilerplate" 40 | optional = false 41 | python-versions = ">=3.7" 42 | files = [ 43 | {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, 44 | {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, 45 | ] 46 | 47 | [package.extras] 48 | cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] 49 | dev = ["attrs[docs,tests]", "pre-commit"] 50 | docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] 51 | tests = ["attrs[tests-no-zope]", "zope-interface"] 52 | tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] 53 | 54 | [[package]] 55 | name = "autorepr" 56 | version = "0.3.0" 57 | description = "Makes civilized __repr__, __str__, and __unicode__ methods" 58 | optional = false 59 | python-versions = "*" 60 | files = [ 61 | {file = "autorepr-0.3.0-py2-none-any.whl", hash = "sha256:c34567e4073630feb52d9c788fc198085e9e9de4817e3b93b7c4c534fc689f11"}, 62 | {file = "autorepr-0.3.0-py2.py3-none-any.whl", hash = "sha256:1d9010d14fb325d3961e3aa73692685563f97d6ba4a2f0f735329fb37422599c"}, 63 | {file = "autorepr-0.3.0.tar.gz", hash = "sha256:ef770b84793d5433e6bb893054973b8c7ce6b487274f9c3f734f678cae11e85e"}, 64 | ] 65 | 66 | [[package]] 67 | name = "babel" 68 | version = "2.12.1" 69 | description = "Internationalization utilities" 70 | optional = false 71 | python-versions = ">=3.7" 72 | files = [ 73 | {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, 74 | {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, 75 | ] 76 | 77 | [package.dependencies] 78 | pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} 79 | 80 | [[package]] 81 | name = "bandit" 82 | version = "1.7.5" 83 | description = "Security oriented static analyser for python code." 84 | optional = false 85 | python-versions = ">=3.7" 86 | files = [ 87 | {file = "bandit-1.7.5-py3-none-any.whl", hash = "sha256:75665181dc1e0096369112541a056c59d1c5f66f9bb74a8d686c3c362b83f549"}, 88 | {file = "bandit-1.7.5.tar.gz", hash = "sha256:bdfc739baa03b880c2d15d0431b31c658ffc348e907fe197e54e0389dd59e11e"}, 89 | ] 90 | 91 | [package.dependencies] 92 | colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} 93 | GitPython = ">=1.0.1" 94 | PyYAML = ">=5.3.1" 95 | rich = "*" 96 | stevedore = ">=1.20.0" 97 | 98 | [package.extras] 99 | test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "tomli (>=1.1.0)"] 100 | toml = ["tomli (>=1.1.0)"] 101 | yaml = ["PyYAML"] 102 | 103 | [[package]] 104 | name = "cattrs" 105 | version = "23.1.2" 106 | description = "Composable complex class support for attrs and dataclasses." 107 | optional = false 108 | python-versions = ">=3.7" 109 | files = [ 110 | {file = "cattrs-23.1.2-py3-none-any.whl", hash = "sha256:b2bb14311ac17bed0d58785e5a60f022e5431aca3932e3fc5cc8ed8639de50a4"}, 111 | {file = "cattrs-23.1.2.tar.gz", hash = "sha256:db1c821b8c537382b2c7c66678c3790091ca0275ac486c76f3c8f3920e83c657"}, 112 | ] 113 | 114 | [package.dependencies] 115 | attrs = ">=20" 116 | exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} 117 | typing_extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} 118 | 119 | [package.extras] 120 | bson = ["pymongo (>=4.2.0,<5.0.0)"] 121 | cbor2 = ["cbor2 (>=5.4.6,<6.0.0)"] 122 | msgpack = ["msgpack (>=1.0.2,<2.0.0)"] 123 | orjson = ["orjson (>=3.5.2,<4.0.0)"] 124 | pyyaml = ["PyYAML (>=6.0,<7.0)"] 125 | tomlkit = ["tomlkit (>=0.11.4,<0.12.0)"] 126 | ujson = ["ujson (>=5.4.0,<6.0.0)"] 127 | 128 | [[package]] 129 | name = "certifi" 130 | version = "2023.7.22" 131 | description = "Python package for providing Mozilla's CA Bundle." 132 | optional = false 133 | python-versions = ">=3.6" 134 | files = [ 135 | {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, 136 | {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, 137 | ] 138 | 139 | [[package]] 140 | name = "charset-normalizer" 141 | version = "3.2.0" 142 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 143 | optional = false 144 | python-versions = ">=3.7.0" 145 | files = [ 146 | {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, 147 | {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, 148 | {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, 149 | {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, 150 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, 151 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, 152 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, 153 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, 154 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, 155 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, 156 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, 157 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, 158 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, 159 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, 160 | {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, 161 | {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, 162 | {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, 163 | {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, 164 | {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, 165 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, 166 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, 167 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, 168 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, 169 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, 170 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, 171 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, 172 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, 173 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, 174 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, 175 | {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, 176 | {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, 177 | {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, 178 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, 179 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, 180 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, 181 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, 182 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, 183 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, 184 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, 185 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, 186 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, 187 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, 188 | {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, 189 | {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, 190 | {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, 191 | {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, 192 | {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, 193 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, 194 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, 195 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, 196 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, 197 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, 198 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, 199 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, 200 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, 201 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, 202 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, 203 | {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, 204 | {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, 205 | {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, 206 | {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, 207 | {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, 208 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, 209 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, 210 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, 211 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, 212 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, 213 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, 214 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, 215 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, 216 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, 217 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, 218 | {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, 219 | {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, 220 | {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, 221 | ] 222 | 223 | [[package]] 224 | name = "click" 225 | version = "8.1.7" 226 | description = "Composable command line interface toolkit" 227 | optional = false 228 | python-versions = ">=3.7" 229 | files = [ 230 | {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, 231 | {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, 232 | ] 233 | 234 | [package.dependencies] 235 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 236 | 237 | [[package]] 238 | name = "colorama" 239 | version = "0.4.6" 240 | description = "Cross-platform colored terminal text." 241 | optional = false 242 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 243 | files = [ 244 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 245 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 246 | ] 247 | 248 | [[package]] 249 | name = "configupdater" 250 | version = "3.1.1" 251 | description = "Parser like ConfigParser but for updating configuration files" 252 | optional = false 253 | python-versions = ">=3.6" 254 | files = [ 255 | {file = "ConfigUpdater-3.1.1-py2.py3-none-any.whl", hash = "sha256:805986dbeba317886c7a8d348b2e34986dc9e3128cd3761ecc35decbd372b286"}, 256 | {file = "ConfigUpdater-3.1.1.tar.gz", hash = "sha256:46f0c74d73efa723776764b43c9739f68052495dd3d734319c1d0eb58511f15b"}, 257 | ] 258 | 259 | [package.extras] 260 | testing = ["flake8", "pytest", "pytest-cov", "pytest-virtualenv", "pytest-xdist", "sphinx"] 261 | 262 | [[package]] 263 | name = "coverage" 264 | version = "7.3.1" 265 | description = "Code coverage measurement for Python" 266 | optional = false 267 | python-versions = ">=3.8" 268 | files = [ 269 | {file = "coverage-7.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cd0f7429ecfd1ff597389907045ff209c8fdb5b013d38cfa7c60728cb484b6e3"}, 270 | {file = "coverage-7.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:966f10df9b2b2115da87f50f6a248e313c72a668248be1b9060ce935c871f276"}, 271 | {file = "coverage-7.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0575c37e207bb9b98b6cf72fdaaa18ac909fb3d153083400c2d48e2e6d28bd8e"}, 272 | {file = "coverage-7.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:245c5a99254e83875c7fed8b8b2536f040997a9b76ac4c1da5bff398c06e860f"}, 273 | {file = "coverage-7.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c96dd7798d83b960afc6c1feb9e5af537fc4908852ef025600374ff1a017392"}, 274 | {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:de30c1aa80f30af0f6b2058a91505ea6e36d6535d437520067f525f7df123887"}, 275 | {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:50dd1e2dd13dbbd856ffef69196781edff26c800a74f070d3b3e3389cab2600d"}, 276 | {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9c0c19f70d30219113b18fe07e372b244fb2a773d4afde29d5a2f7930765136"}, 277 | {file = "coverage-7.3.1-cp310-cp310-win32.whl", hash = "sha256:770f143980cc16eb601ccfd571846e89a5fe4c03b4193f2e485268f224ab602f"}, 278 | {file = "coverage-7.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:cdd088c00c39a27cfa5329349cc763a48761fdc785879220d54eb785c8a38520"}, 279 | {file = "coverage-7.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:74bb470399dc1989b535cb41f5ca7ab2af561e40def22d7e188e0a445e7639e3"}, 280 | {file = "coverage-7.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:025ded371f1ca280c035d91b43252adbb04d2aea4c7105252d3cbc227f03b375"}, 281 | {file = "coverage-7.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6191b3a6ad3e09b6cfd75b45c6aeeffe7e3b0ad46b268345d159b8df8d835f9"}, 282 | {file = "coverage-7.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7eb0b188f30e41ddd659a529e385470aa6782f3b412f860ce22b2491c89b8593"}, 283 | {file = "coverage-7.3.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c8f0df9dfd8ff745bccff75867d63ef336e57cc22b2908ee725cc552689ec8"}, 284 | {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7eb3cd48d54b9bd0e73026dedce44773214064be93611deab0b6a43158c3d5a0"}, 285 | {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ac3c5b7e75acac31e490b7851595212ed951889918d398b7afa12736c85e13ce"}, 286 | {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b4ee7080878077af0afa7238df1b967f00dc10763f6e1b66f5cced4abebb0a3"}, 287 | {file = "coverage-7.3.1-cp311-cp311-win32.whl", hash = "sha256:229c0dd2ccf956bf5aeede7e3131ca48b65beacde2029f0361b54bf93d36f45a"}, 288 | {file = "coverage-7.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:c6f55d38818ca9596dc9019eae19a47410d5322408140d9a0076001a3dcb938c"}, 289 | {file = "coverage-7.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5289490dd1c3bb86de4730a92261ae66ea8d44b79ed3cc26464f4c2cde581fbc"}, 290 | {file = "coverage-7.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca833941ec701fda15414be400c3259479bfde7ae6d806b69e63b3dc423b1832"}, 291 | {file = "coverage-7.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd694e19c031733e446c8024dedd12a00cda87e1c10bd7b8539a87963685e969"}, 292 | {file = "coverage-7.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aab8e9464c00da5cb9c536150b7fbcd8850d376d1151741dd0d16dfe1ba4fd26"}, 293 | {file = "coverage-7.3.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87d38444efffd5b056fcc026c1e8d862191881143c3aa80bb11fcf9dca9ae204"}, 294 | {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8a07b692129b8a14ad7a37941a3029c291254feb7a4237f245cfae2de78de037"}, 295 | {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2829c65c8faaf55b868ed7af3c7477b76b1c6ebeee99a28f59a2cb5907a45760"}, 296 | {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1f111a7d85658ea52ffad7084088277135ec5f368457275fc57f11cebb15607f"}, 297 | {file = "coverage-7.3.1-cp312-cp312-win32.whl", hash = "sha256:c397c70cd20f6df7d2a52283857af622d5f23300c4ca8e5bd8c7a543825baa5a"}, 298 | {file = "coverage-7.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:5ae4c6da8b3d123500f9525b50bf0168023313963e0e2e814badf9000dd6ef92"}, 299 | {file = "coverage-7.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca70466ca3a17460e8fc9cea7123c8cbef5ada4be3140a1ef8f7b63f2f37108f"}, 300 | {file = "coverage-7.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f2781fd3cabc28278dc982a352f50c81c09a1a500cc2086dc4249853ea96b981"}, 301 | {file = "coverage-7.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6407424621f40205bbe6325686417e5e552f6b2dba3535dd1f90afc88a61d465"}, 302 | {file = "coverage-7.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04312b036580ec505f2b77cbbdfb15137d5efdfade09156961f5277149f5e344"}, 303 | {file = "coverage-7.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9ad38204887349853d7c313f53a7b1c210ce138c73859e925bc4e5d8fc18e7"}, 304 | {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:53669b79f3d599da95a0afbef039ac0fadbb236532feb042c534fbb81b1a4e40"}, 305 | {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:614f1f98b84eb256e4f35e726bfe5ca82349f8dfa576faabf8a49ca09e630086"}, 306 | {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f1a317fdf5c122ad642db8a97964733ab7c3cf6009e1a8ae8821089993f175ff"}, 307 | {file = "coverage-7.3.1-cp38-cp38-win32.whl", hash = "sha256:defbbb51121189722420a208957e26e49809feafca6afeef325df66c39c4fdb3"}, 308 | {file = "coverage-7.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:f4f456590eefb6e1b3c9ea6328c1e9fa0f1006e7481179d749b3376fc793478e"}, 309 | {file = "coverage-7.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f12d8b11a54f32688b165fd1a788c408f927b0960984b899be7e4c190ae758f1"}, 310 | {file = "coverage-7.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f09195dda68d94a53123883de75bb97b0e35f5f6f9f3aa5bf6e496da718f0cb6"}, 311 | {file = "coverage-7.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6601a60318f9c3945be6ea0f2a80571f4299b6801716f8a6e4846892737ebe4"}, 312 | {file = "coverage-7.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07d156269718670d00a3b06db2288b48527fc5f36859425ff7cec07c6b367745"}, 313 | {file = "coverage-7.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:636a8ac0b044cfeccae76a36f3b18264edcc810a76a49884b96dd744613ec0b7"}, 314 | {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5d991e13ad2ed3aced177f524e4d670f304c8233edad3210e02c465351f785a0"}, 315 | {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:586649ada7cf139445da386ab6f8ef00e6172f11a939fc3b2b7e7c9082052fa0"}, 316 | {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4aba512a15a3e1e4fdbfed2f5392ec221434a614cc68100ca99dcad7af29f3f8"}, 317 | {file = "coverage-7.3.1-cp39-cp39-win32.whl", hash = "sha256:6bc6f3f4692d806831c136c5acad5ccedd0262aa44c087c46b7101c77e139140"}, 318 | {file = "coverage-7.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:553d7094cb27db58ea91332e8b5681bac107e7242c23f7629ab1316ee73c4981"}, 319 | {file = "coverage-7.3.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:220eb51f5fb38dfdb7e5d54284ca4d0cd70ddac047d750111a68ab1798945194"}, 320 | {file = "coverage-7.3.1.tar.gz", hash = "sha256:6cb7fe1581deb67b782c153136541e20901aa312ceedaf1467dcb35255787952"}, 321 | ] 322 | 323 | [package.dependencies] 324 | tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} 325 | 326 | [package.extras] 327 | toml = ["tomli"] 328 | 329 | [[package]] 330 | name = "darglint" 331 | version = "1.8.1" 332 | description = "A utility for ensuring Google-style docstrings stay up to date with the source code." 333 | optional = false 334 | python-versions = ">=3.6,<4.0" 335 | files = [ 336 | {file = "darglint-1.8.1-py3-none-any.whl", hash = "sha256:5ae11c259c17b0701618a20c3da343a3eb98b3bc4b5a83d31cdd94f5ebdced8d"}, 337 | {file = "darglint-1.8.1.tar.gz", hash = "sha256:080d5106df149b199822e7ee7deb9c012b49891538f14a11be681044f0bb20da"}, 338 | ] 339 | 340 | [[package]] 341 | name = "decorator" 342 | version = "5.1.1" 343 | description = "Decorators for Humans" 344 | optional = false 345 | python-versions = ">=3.5" 346 | files = [ 347 | {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, 348 | {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, 349 | ] 350 | 351 | [[package]] 352 | name = "dictdiffer" 353 | version = "0.9.0" 354 | description = "Dictdiffer is a library that helps you to diff and patch dictionaries." 355 | optional = false 356 | python-versions = "*" 357 | files = [ 358 | {file = "dictdiffer-0.9.0-py2.py3-none-any.whl", hash = "sha256:442bfc693cfcadaf46674575d2eba1c53b42f5e404218ca2c2ff549f2df56595"}, 359 | {file = "dictdiffer-0.9.0.tar.gz", hash = "sha256:17bacf5fbfe613ccf1b6d512bd766e6b21fb798822a133aa86098b8ac9997578"}, 360 | ] 361 | 362 | [package.extras] 363 | all = ["Sphinx (>=3)", "check-manifest (>=0.42)", "mock (>=1.3.0)", "numpy (>=1.13.0)", "numpy (>=1.15.0)", "numpy (>=1.18.0)", "numpy (>=1.20.0)", "pytest (==5.4.3)", "pytest (>=6)", "pytest-cov (>=2.10.1)", "pytest-isort (>=1.2.0)", "pytest-pycodestyle (>=2)", "pytest-pycodestyle (>=2.2.0)", "pytest-pydocstyle (>=2)", "pytest-pydocstyle (>=2.2.0)", "sphinx (>=3)", "sphinx-rtd-theme (>=0.2)", "tox (>=3.7.0)"] 364 | docs = ["Sphinx (>=3)", "sphinx-rtd-theme (>=0.2)"] 365 | numpy = ["numpy (>=1.13.0)", "numpy (>=1.15.0)", "numpy (>=1.18.0)", "numpy (>=1.20.0)"] 366 | tests = ["check-manifest (>=0.42)", "mock (>=1.3.0)", "pytest (==5.4.3)", "pytest (>=6)", "pytest-cov (>=2.10.1)", "pytest-isort (>=1.2.0)", "pytest-pycodestyle (>=2)", "pytest-pycodestyle (>=2.2.0)", "pytest-pydocstyle (>=2)", "pytest-pydocstyle (>=2.2.0)", "sphinx (>=3)", "tox (>=3.7.0)"] 367 | 368 | [[package]] 369 | name = "doc8" 370 | version = "1.1.1" 371 | description = "Style checker for Sphinx (or other) RST documentation" 372 | optional = false 373 | python-versions = ">=3.8" 374 | files = [ 375 | {file = "doc8-1.1.1-py3-none-any.whl", hash = "sha256:e493aa3f36820197c49f407583521bb76a0fde4fffbcd0e092be946ff95931ac"}, 376 | {file = "doc8-1.1.1.tar.gz", hash = "sha256:d97a93e8f5a2efc4713a0804657dedad83745cca4cd1d88de9186f77f9776004"}, 377 | ] 378 | 379 | [package.dependencies] 380 | docutils = ">=0.19,<0.21" 381 | Pygments = "*" 382 | restructuredtext-lint = ">=0.7" 383 | stevedore = "*" 384 | tomli = {version = "*", markers = "python_version < \"3.11\""} 385 | 386 | [[package]] 387 | name = "docutils" 388 | version = "0.19" 389 | description = "Docutils -- Python Documentation Utilities" 390 | optional = false 391 | python-versions = ">=3.7" 392 | files = [ 393 | {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, 394 | {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, 395 | ] 396 | 397 | [[package]] 398 | name = "dparse" 399 | version = "0.6.3" 400 | description = "A parser for Python dependency files" 401 | optional = false 402 | python-versions = ">=3.6" 403 | files = [ 404 | {file = "dparse-0.6.3-py3-none-any.whl", hash = "sha256:0d8fe18714056ca632d98b24fbfc4e9791d4e47065285ab486182288813a5318"}, 405 | {file = "dparse-0.6.3.tar.gz", hash = "sha256:27bb8b4bcaefec3997697ba3f6e06b2447200ba273c0b085c3d012a04571b528"}, 406 | ] 407 | 408 | [package.dependencies] 409 | packaging = "*" 410 | tomli = {version = "*", markers = "python_version < \"3.11\""} 411 | 412 | [package.extras] 413 | conda = ["pyyaml"] 414 | pipenv = ["pipenv (<=2022.12.19)"] 415 | 416 | [[package]] 417 | name = "dpath" 418 | version = "2.1.6" 419 | description = "Filesystem-like pathing and searching for dictionaries" 420 | optional = false 421 | python-versions = ">=3.7" 422 | files = [ 423 | {file = "dpath-2.1.6-py3-none-any.whl", hash = "sha256:31407395b177ab63ef72e2f6ae268c15e938f2990a8ecf6510f5686c02b6db73"}, 424 | {file = "dpath-2.1.6.tar.gz", hash = "sha256:f1e07c72e8605c6a9e80b64bc8f42714de08a789c7de417e49c3f87a19692e47"}, 425 | ] 426 | 427 | [[package]] 428 | name = "eradicate" 429 | version = "2.3.0" 430 | description = "Removes commented-out code." 431 | optional = false 432 | python-versions = "*" 433 | files = [ 434 | {file = "eradicate-2.3.0-py3-none-any.whl", hash = "sha256:2b29b3dd27171f209e4ddd8204b70c02f0682ae95eecb353f10e8d72b149c63e"}, 435 | {file = "eradicate-2.3.0.tar.gz", hash = "sha256:06df115be3b87d0fc1c483db22a2ebb12bcf40585722810d809cc770f5031c37"}, 436 | ] 437 | 438 | [[package]] 439 | name = "exceptiongroup" 440 | version = "1.1.3" 441 | description = "Backport of PEP 654 (exception groups)" 442 | optional = false 443 | python-versions = ">=3.7" 444 | files = [ 445 | {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, 446 | {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, 447 | ] 448 | 449 | [package.extras] 450 | test = ["pytest (>=6)"] 451 | 452 | [[package]] 453 | name = "flake8" 454 | version = "6.1.0" 455 | description = "the modular source code checker: pep8 pyflakes and co" 456 | optional = false 457 | python-versions = ">=3.8.1" 458 | files = [ 459 | {file = "flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"}, 460 | {file = "flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23"}, 461 | ] 462 | 463 | [package.dependencies] 464 | mccabe = ">=0.7.0,<0.8.0" 465 | pycodestyle = ">=2.11.0,<2.12.0" 466 | pyflakes = ">=3.1.0,<3.2.0" 467 | 468 | [[package]] 469 | name = "flake8-bandit" 470 | version = "4.1.1" 471 | description = "Automated security testing with bandit and flake8." 472 | optional = false 473 | python-versions = ">=3.6" 474 | files = [ 475 | {file = "flake8_bandit-4.1.1-py3-none-any.whl", hash = "sha256:4c8a53eb48f23d4ef1e59293657181a3c989d0077c9952717e98a0eace43e06d"}, 476 | {file = "flake8_bandit-4.1.1.tar.gz", hash = "sha256:068e09287189cbfd7f986e92605adea2067630b75380c6b5733dab7d87f9a84e"}, 477 | ] 478 | 479 | [package.dependencies] 480 | bandit = ">=1.7.3" 481 | flake8 = ">=5.0.0" 482 | 483 | [[package]] 484 | name = "flake8-broken-line" 485 | version = "1.0.0" 486 | description = "Flake8 plugin to forbid backslashes for line breaks" 487 | optional = false 488 | python-versions = ">=3.8,<4.0" 489 | files = [ 490 | {file = "flake8_broken_line-1.0.0-py3-none-any.whl", hash = "sha256:96c964336024a5030dc536a9f6fb02aa679e2d2a6b35b80a558b5136c35832a9"}, 491 | {file = "flake8_broken_line-1.0.0.tar.gz", hash = "sha256:e2c6a17f8d9a129e99c1320fce89b33843e2963871025c4c2bb7b8b8d8732a85"}, 492 | ] 493 | 494 | [package.dependencies] 495 | flake8 = ">5" 496 | 497 | [[package]] 498 | name = "flake8-bugbear" 499 | version = "23.9.16" 500 | description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle." 501 | optional = false 502 | python-versions = ">=3.8.1" 503 | files = [ 504 | {file = "flake8-bugbear-23.9.16.tar.gz", hash = "sha256:90cf04b19ca02a682feb5aac67cae8de742af70538590509941ab10ae8351f71"}, 505 | {file = "flake8_bugbear-23.9.16-py3-none-any.whl", hash = "sha256:b182cf96ea8f7a8595b2f87321d7d9b28728f4d9c3318012d896543d19742cb5"}, 506 | ] 507 | 508 | [package.dependencies] 509 | attrs = ">=19.2.0" 510 | flake8 = ">=6.0.0" 511 | 512 | [package.extras] 513 | dev = ["coverage", "hypothesis", "hypothesmith (>=0.2)", "pre-commit", "pytest", "tox"] 514 | 515 | [[package]] 516 | name = "flake8-commas" 517 | version = "2.1.0" 518 | description = "Flake8 lint for trailing commas." 519 | optional = false 520 | python-versions = "*" 521 | files = [ 522 | {file = "flake8-commas-2.1.0.tar.gz", hash = "sha256:940441ab8ee544df564ae3b3f49f20462d75d5c7cac2463e0b27436e2050f263"}, 523 | {file = "flake8_commas-2.1.0-py2.py3-none-any.whl", hash = "sha256:ebb96c31e01d0ef1d0685a21f3f0e2f8153a0381430e748bf0bbbb5d5b453d54"}, 524 | ] 525 | 526 | [package.dependencies] 527 | flake8 = ">=2" 528 | 529 | [[package]] 530 | name = "flake8-comprehensions" 531 | version = "3.14.0" 532 | description = "A flake8 plugin to help you write better list/set/dict comprehensions." 533 | optional = false 534 | python-versions = ">=3.8" 535 | files = [ 536 | {file = "flake8_comprehensions-3.14.0-py3-none-any.whl", hash = "sha256:7b9d07d94aa88e62099a6d1931ddf16c344d4157deedf90fe0d8ee2846f30e97"}, 537 | {file = "flake8_comprehensions-3.14.0.tar.gz", hash = "sha256:81768c61bfc064e1a06222df08a2580d97de10cb388694becaf987c331c6c0cf"}, 538 | ] 539 | 540 | [package.dependencies] 541 | flake8 = ">=3.0,<3.2.0 || >3.2.0" 542 | 543 | [[package]] 544 | name = "flake8-debugger" 545 | version = "4.1.2" 546 | description = "ipdb/pdb statement checker plugin for flake8" 547 | optional = false 548 | python-versions = ">=3.7" 549 | files = [ 550 | {file = "flake8-debugger-4.1.2.tar.gz", hash = "sha256:52b002560941e36d9bf806fca2523dc7fb8560a295d5f1a6e15ac2ded7a73840"}, 551 | {file = "flake8_debugger-4.1.2-py3-none-any.whl", hash = "sha256:0a5e55aeddcc81da631ad9c8c366e7318998f83ff00985a49e6b3ecf61e571bf"}, 552 | ] 553 | 554 | [package.dependencies] 555 | flake8 = ">=3.0" 556 | pycodestyle = "*" 557 | 558 | [[package]] 559 | name = "flake8-docstrings" 560 | version = "1.7.0" 561 | description = "Extension for flake8 which uses pydocstyle to check docstrings" 562 | optional = false 563 | python-versions = ">=3.7" 564 | files = [ 565 | {file = "flake8_docstrings-1.7.0-py2.py3-none-any.whl", hash = "sha256:51f2344026da083fc084166a9353f5082b01f72901df422f74b4d953ae88ac75"}, 566 | {file = "flake8_docstrings-1.7.0.tar.gz", hash = "sha256:4c8cc748dc16e6869728699e5d0d685da9a10b0ea718e090b1ba088e67a941af"}, 567 | ] 568 | 569 | [package.dependencies] 570 | flake8 = ">=3" 571 | pydocstyle = ">=2.1" 572 | 573 | [[package]] 574 | name = "flake8-eradicate" 575 | version = "1.5.0" 576 | description = "Flake8 plugin to find commented out code" 577 | optional = false 578 | python-versions = ">=3.8,<4.0" 579 | files = [ 580 | {file = "flake8_eradicate-1.5.0-py3-none-any.whl", hash = "sha256:18acc922ad7de623f5247c7d5595da068525ec5437dd53b22ec2259b96ce9d22"}, 581 | {file = "flake8_eradicate-1.5.0.tar.gz", hash = "sha256:aee636cb9ecb5594a7cd92d67ad73eb69909e5cc7bd81710cf9d00970f3983a6"}, 582 | ] 583 | 584 | [package.dependencies] 585 | attrs = "*" 586 | eradicate = ">=2.0,<3.0" 587 | flake8 = ">5" 588 | 589 | [[package]] 590 | name = "flake8-isort" 591 | version = "6.1.0" 592 | description = "flake8 plugin that integrates isort ." 593 | optional = false 594 | python-versions = ">=3.8" 595 | files = [ 596 | {file = "flake8-isort-6.1.0.tar.gz", hash = "sha256:d4639343bac540194c59fb1618ac2c285b3e27609f353bef6f50904d40c1643e"}, 597 | ] 598 | 599 | [package.dependencies] 600 | flake8 = "*" 601 | isort = ">=5.0.0,<6" 602 | 603 | [package.extras] 604 | test = ["pytest"] 605 | 606 | [[package]] 607 | name = "flake8-plugin-utils" 608 | version = "1.3.3" 609 | description = "The package provides base classes and utils for flake8 plugin writing" 610 | optional = false 611 | python-versions = ">=3.6,<4.0" 612 | files = [ 613 | {file = "flake8-plugin-utils-1.3.3.tar.gz", hash = "sha256:39f6f338d038b301c6fd344b06f2e81e382b68fa03c0560dff0d9b1791a11a2c"}, 614 | {file = "flake8_plugin_utils-1.3.3-py3-none-any.whl", hash = "sha256:e4848c57d9d50f19100c2d75fa794b72df068666a9041b4b0409be923356a3ed"}, 615 | ] 616 | 617 | [[package]] 618 | name = "flake8-pyi" 619 | version = "23.6.0" 620 | description = "A plugin for flake8 to enable linting .pyi stub files." 621 | optional = false 622 | python-versions = ">=3.8" 623 | files = [ 624 | {file = "flake8_pyi-23.6.0-py3-none-any.whl", hash = "sha256:3b7f23b83eeaa4ec776240894cb9882560a42edefd60e604a44db0a7cbecd5d8"}, 625 | {file = "flake8_pyi-23.6.0.tar.gz", hash = "sha256:597c750fd0394a237d4e0b51feb222b3cc7a7ebee5b3c59a15b58f6b3f2836a7"}, 626 | ] 627 | 628 | [package.dependencies] 629 | ast-decompiler = {version = ">=0.7.0,<1.0", markers = "python_version < \"3.9\""} 630 | flake8 = ">=6.0.0,<7.0.0" 631 | pyflakes = ">=2.1.1" 632 | 633 | [package.extras] 634 | dev = ["black (==23.3.0)", "flake8-bugbear (==23.6.5)", "flake8-noqa (==1.3.2)", "isort (==5.12.0)", "mypy (==1.4.1)", "pre-commit-hooks (==4.4.0)", "pytest (==7.4.0)", "types-pyflakes (<4)"] 635 | 636 | [[package]] 637 | name = "flake8-pytest" 638 | version = "1.4" 639 | description = "pytest assert checker plugin for flake8" 640 | optional = false 641 | python-versions = "*" 642 | files = [ 643 | {file = "flake8-pytest-1.4.tar.gz", hash = "sha256:19f543b2d1cc89d61b76f19d0a9e58e9a110a035175f701b3425c363a7732c56"}, 644 | {file = "flake8_pytest-1.4-py2.py3-none-any.whl", hash = "sha256:97328f258ffad9fe18babb3b0714a16b121505ad3ac87d4e33020874555d0784"}, 645 | ] 646 | 647 | [package.dependencies] 648 | flake8 = "*" 649 | 650 | [[package]] 651 | name = "flake8-pytest-style" 652 | version = "1.7.2" 653 | description = "A flake8 plugin checking common style issues or inconsistencies with pytest-based tests." 654 | optional = false 655 | python-versions = ">=3.7.2,<4.0.0" 656 | files = [ 657 | {file = "flake8_pytest_style-1.7.2-py3-none-any.whl", hash = "sha256:f5d2aa3219163a052dd92226589d45fab8ea027a3269922f0c4029f548ea5cd1"}, 658 | {file = "flake8_pytest_style-1.7.2.tar.gz", hash = "sha256:b924197c99b951315949920b0e5547f34900b1844348432e67a44ab191582109"}, 659 | ] 660 | 661 | [package.dependencies] 662 | flake8-plugin-utils = ">=1.3.2,<2.0.0" 663 | 664 | [[package]] 665 | name = "flake8-quotes" 666 | version = "3.3.2" 667 | description = "Flake8 lint for quotes." 668 | optional = false 669 | python-versions = "*" 670 | files = [ 671 | {file = "flake8-quotes-3.3.2.tar.gz", hash = "sha256:6e26892b632dacba517bf27219c459a8396dcfac0f5e8204904c5a4ba9b480e1"}, 672 | ] 673 | 674 | [package.dependencies] 675 | flake8 = "*" 676 | 677 | [[package]] 678 | name = "flake8-rst-docstrings" 679 | version = "0.3.0" 680 | description = "Python docstring reStructuredText (RST) validator for flake8" 681 | optional = false 682 | python-versions = ">=3.7" 683 | files = [ 684 | {file = "flake8-rst-docstrings-0.3.0.tar.gz", hash = "sha256:d1ce22b4bd37b73cd86b8d980e946ef198cfcc18ed82fedb674ceaa2f8d1afa4"}, 685 | {file = "flake8_rst_docstrings-0.3.0-py3-none-any.whl", hash = "sha256:f8c3c6892ff402292651c31983a38da082480ad3ba253743de52989bdc84ca1c"}, 686 | ] 687 | 688 | [package.dependencies] 689 | flake8 = ">=3" 690 | pygments = "*" 691 | restructuredtext-lint = "*" 692 | 693 | [package.extras] 694 | develop = ["build", "twine"] 695 | 696 | [[package]] 697 | name = "flake8-string-format" 698 | version = "0.3.0" 699 | description = "string format checker, plugin for flake8" 700 | optional = false 701 | python-versions = "*" 702 | files = [ 703 | {file = "flake8-string-format-0.3.0.tar.gz", hash = "sha256:65f3da786a1461ef77fca3780b314edb2853c377f2e35069723348c8917deaa2"}, 704 | {file = "flake8_string_format-0.3.0-py2.py3-none-any.whl", hash = "sha256:812ff431f10576a74c89be4e85b8e075a705be39bc40c4b4278b5b13e2afa9af"}, 705 | ] 706 | 707 | [package.dependencies] 708 | flake8 = "*" 709 | 710 | [[package]] 711 | name = "flatten-dict" 712 | version = "0.4.2" 713 | description = "A flexible utility for flattening and unflattening dict-like objects in Python." 714 | optional = false 715 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 716 | files = [ 717 | {file = "flatten-dict-0.4.2.tar.gz", hash = "sha256:506a96b6e6f805b81ae46a0f9f31290beb5fa79ded9d80dbe1b7fa236ab43076"}, 718 | {file = "flatten_dict-0.4.2-py2.py3-none-any.whl", hash = "sha256:7e245b20c4c718981212210eec4284a330c9f713e632e98765560e05421e48ad"}, 719 | ] 720 | 721 | [package.dependencies] 722 | six = ">=1.12,<2.0" 723 | 724 | [[package]] 725 | name = "furl" 726 | version = "2.1.3" 727 | description = "URL manipulation made simple." 728 | optional = false 729 | python-versions = "*" 730 | files = [ 731 | {file = "furl-2.1.3-py2.py3-none-any.whl", hash = "sha256:9ab425062c4217f9802508e45feb4a83e54324273ac4b202f1850363309666c0"}, 732 | {file = "furl-2.1.3.tar.gz", hash = "sha256:5a6188fe2666c484a12159c18be97a1977a71d632ef5bb867ef15f54af39cc4e"}, 733 | ] 734 | 735 | [package.dependencies] 736 | orderedmultidict = ">=1.0.1" 737 | six = ">=1.8.0" 738 | 739 | [[package]] 740 | name = "gitdb" 741 | version = "4.0.10" 742 | description = "Git Object Database" 743 | optional = false 744 | python-versions = ">=3.7" 745 | files = [ 746 | {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, 747 | {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, 748 | ] 749 | 750 | [package.dependencies] 751 | smmap = ">=3.0.1,<6" 752 | 753 | [[package]] 754 | name = "gitpython" 755 | version = "3.1.36" 756 | description = "GitPython is a Python library used to interact with Git repositories" 757 | optional = false 758 | python-versions = ">=3.7" 759 | files = [ 760 | {file = "GitPython-3.1.36-py3-none-any.whl", hash = "sha256:8d22b5cfefd17c79914226982bb7851d6ade47545b1735a9d010a2a4c26d8388"}, 761 | {file = "GitPython-3.1.36.tar.gz", hash = "sha256:4bb0c2a6995e85064140d31a33289aa5dce80133a23d36fcd372d716c54d3ebf"}, 762 | ] 763 | 764 | [package.dependencies] 765 | gitdb = ">=4.0.1,<5" 766 | 767 | [package.extras] 768 | test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-sugar", "virtualenv"] 769 | 770 | [[package]] 771 | name = "identify" 772 | version = "2.5.29" 773 | description = "File identification library for Python" 774 | optional = false 775 | python-versions = ">=3.8" 776 | files = [ 777 | {file = "identify-2.5.29-py2.py3-none-any.whl", hash = "sha256:24437fbf6f4d3fe6efd0eb9d67e24dd9106db99af5ceb27996a5f7895f24bf1b"}, 778 | {file = "identify-2.5.29.tar.gz", hash = "sha256:d43d52b86b15918c137e3a74fff5224f60385cd0e9c38e99d07c257f02f151a5"}, 779 | ] 780 | 781 | [package.extras] 782 | license = ["ukkonen"] 783 | 784 | [[package]] 785 | name = "idna" 786 | version = "3.4" 787 | description = "Internationalized Domain Names in Applications (IDNA)" 788 | optional = false 789 | python-versions = ">=3.5" 790 | files = [ 791 | {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, 792 | {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, 793 | ] 794 | 795 | [[package]] 796 | name = "imagesize" 797 | version = "1.4.1" 798 | description = "Getting image size from png/jpeg/jpeg2000/gif file" 799 | optional = false 800 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 801 | files = [ 802 | {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, 803 | {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, 804 | ] 805 | 806 | [[package]] 807 | name = "importlib-metadata" 808 | version = "6.8.0" 809 | description = "Read metadata from Python packages" 810 | optional = false 811 | python-versions = ">=3.8" 812 | files = [ 813 | {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, 814 | {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, 815 | ] 816 | 817 | [package.dependencies] 818 | zipp = ">=0.5" 819 | 820 | [package.extras] 821 | docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] 822 | perf = ["ipython"] 823 | testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] 824 | 825 | [[package]] 826 | name = "importlib-resources" 827 | version = "6.0.1" 828 | description = "Read resources from Python packages" 829 | optional = false 830 | python-versions = ">=3.8" 831 | files = [ 832 | {file = "importlib_resources-6.0.1-py3-none-any.whl", hash = "sha256:134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf"}, 833 | {file = "importlib_resources-6.0.1.tar.gz", hash = "sha256:4359457e42708462b9626a04657c6208ad799ceb41e5c58c57ffa0e6a098a5d4"}, 834 | ] 835 | 836 | [package.dependencies] 837 | zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} 838 | 839 | [package.extras] 840 | docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] 841 | testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] 842 | 843 | [[package]] 844 | name = "iniconfig" 845 | version = "2.0.0" 846 | description = "brain-dead simple config-ini parsing" 847 | optional = false 848 | python-versions = ">=3.7" 849 | files = [ 850 | {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, 851 | {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, 852 | ] 853 | 854 | [[package]] 855 | name = "isort" 856 | version = "5.12.0" 857 | description = "A Python utility / library to sort Python imports." 858 | optional = false 859 | python-versions = ">=3.8.0" 860 | files = [ 861 | {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, 862 | {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, 863 | ] 864 | 865 | [package.extras] 866 | colors = ["colorama (>=0.4.3)"] 867 | pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] 868 | plugins = ["setuptools"] 869 | requirements-deprecated-finder = ["pip-api", "pipreqs"] 870 | 871 | [[package]] 872 | name = "jinja2" 873 | version = "3.1.2" 874 | description = "A very fast and expressive template engine." 875 | optional = false 876 | python-versions = ">=3.7" 877 | files = [ 878 | {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, 879 | {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, 880 | ] 881 | 882 | [package.dependencies] 883 | MarkupSafe = ">=2.0" 884 | 885 | [package.extras] 886 | i18n = ["Babel (>=2.7)"] 887 | 888 | [[package]] 889 | name = "jmespath" 890 | version = "1.0.1" 891 | description = "JSON Matching Expressions" 892 | optional = false 893 | python-versions = ">=3.7" 894 | files = [ 895 | {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, 896 | {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, 897 | ] 898 | 899 | [[package]] 900 | name = "loguru" 901 | version = "0.7.2" 902 | description = "Python logging made (stupidly) simple" 903 | optional = false 904 | python-versions = ">=3.5" 905 | files = [ 906 | {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, 907 | {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, 908 | ] 909 | 910 | [package.dependencies] 911 | colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} 912 | win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} 913 | 914 | [package.extras] 915 | dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "mypy (==v1.5.1)", "pre-commit (==3.4.0)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"] 916 | 917 | [[package]] 918 | name = "m2r2" 919 | version = "0.3.3.post2" 920 | description = "Markdown and reStructuredText in a single file." 921 | optional = false 922 | python-versions = ">=3.7" 923 | files = [ 924 | {file = "m2r2-0.3.3.post2-py3-none-any.whl", hash = "sha256:86157721eb6eabcd54d4eea7195890cc58fa6188b8d0abea633383cfbb5e11e3"}, 925 | {file = "m2r2-0.3.3.post2.tar.gz", hash = "sha256:e62bcb0e74b3ce19cda0737a0556b04cf4a43b785072fcef474558f2c1482ca8"}, 926 | ] 927 | 928 | [package.dependencies] 929 | docutils = ">=0.19" 930 | mistune = "0.8.4" 931 | 932 | [[package]] 933 | name = "markdown-it-py" 934 | version = "3.0.0" 935 | description = "Python port of markdown-it. Markdown parsing, done right!" 936 | optional = false 937 | python-versions = ">=3.8" 938 | files = [ 939 | {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, 940 | {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, 941 | ] 942 | 943 | [package.dependencies] 944 | mdurl = ">=0.1,<1.0" 945 | 946 | [package.extras] 947 | benchmarking = ["psutil", "pytest", "pytest-benchmark"] 948 | code-style = ["pre-commit (>=3.0,<4.0)"] 949 | compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] 950 | linkify = ["linkify-it-py (>=1,<3)"] 951 | plugins = ["mdit-py-plugins"] 952 | profiling = ["gprof2dot"] 953 | rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] 954 | testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] 955 | 956 | [[package]] 957 | name = "markupsafe" 958 | version = "2.1.3" 959 | description = "Safely add untrusted strings to HTML/XML markup." 960 | optional = false 961 | python-versions = ">=3.7" 962 | files = [ 963 | {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, 964 | {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, 965 | {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, 966 | {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, 967 | {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, 968 | {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, 969 | {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, 970 | {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, 971 | {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, 972 | {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, 973 | {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, 974 | {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, 975 | {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, 976 | {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, 977 | {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, 978 | {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, 979 | {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, 980 | {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, 981 | {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, 982 | {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, 983 | {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, 984 | {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, 985 | {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, 986 | {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, 987 | {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, 988 | {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, 989 | {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, 990 | {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, 991 | {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, 992 | {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, 993 | {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, 994 | {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, 995 | {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, 996 | {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, 997 | {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, 998 | {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, 999 | {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, 1000 | {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, 1001 | {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, 1002 | {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, 1003 | {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, 1004 | {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, 1005 | {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, 1006 | {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, 1007 | {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, 1008 | {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, 1009 | {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, 1010 | {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, 1011 | {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, 1012 | {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, 1013 | ] 1014 | 1015 | [[package]] 1016 | name = "marshmallow" 1017 | version = "3.20.1" 1018 | description = "A lightweight library for converting complex datatypes to and from native Python datatypes." 1019 | optional = false 1020 | python-versions = ">=3.8" 1021 | files = [ 1022 | {file = "marshmallow-3.20.1-py3-none-any.whl", hash = "sha256:684939db93e80ad3561392f47be0230743131560a41c5110684c16e21ade0a5c"}, 1023 | {file = "marshmallow-3.20.1.tar.gz", hash = "sha256:5d2371bbe42000f2b3fb5eaa065224df7d8f8597bc19a1bbfa5bfe7fba8da889"}, 1024 | ] 1025 | 1026 | [package.dependencies] 1027 | packaging = ">=17.0" 1028 | 1029 | [package.extras] 1030 | dev = ["flake8 (==6.0.0)", "flake8-bugbear (==23.7.10)", "mypy (==1.4.1)", "pre-commit (>=2.4,<4.0)", "pytest", "pytz", "simplejson", "tox"] 1031 | docs = ["alabaster (==0.7.13)", "autodocsumm (==0.2.11)", "sphinx (==7.0.1)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] 1032 | lint = ["flake8 (==6.0.0)", "flake8-bugbear (==23.7.10)", "mypy (==1.4.1)", "pre-commit (>=2.4,<4.0)"] 1033 | tests = ["pytest", "pytz", "simplejson"] 1034 | 1035 | [[package]] 1036 | name = "marshmallow-polyfield" 1037 | version = "5.11" 1038 | description = "An unofficial extension to Marshmallow to allow for polymorphic fields" 1039 | optional = false 1040 | python-versions = ">=3.5" 1041 | files = [ 1042 | {file = "marshmallow-polyfield-5.11.tar.gz", hash = "sha256:8075a9cc490da4af58b902b4a40a99882dd031adb7aaa96abd147a4fcd53415f"}, 1043 | ] 1044 | 1045 | [package.dependencies] 1046 | marshmallow = ">=3.0.0b10" 1047 | 1048 | [[package]] 1049 | name = "mccabe" 1050 | version = "0.7.0" 1051 | description = "McCabe checker, plugin for flake8" 1052 | optional = false 1053 | python-versions = ">=3.6" 1054 | files = [ 1055 | {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, 1056 | {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, 1057 | ] 1058 | 1059 | [[package]] 1060 | name = "mdurl" 1061 | version = "0.1.2" 1062 | description = "Markdown URL utilities" 1063 | optional = false 1064 | python-versions = ">=3.7" 1065 | files = [ 1066 | {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, 1067 | {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, 1068 | ] 1069 | 1070 | [[package]] 1071 | name = "mistune" 1072 | version = "0.8.4" 1073 | description = "The fastest markdown parser in pure Python" 1074 | optional = false 1075 | python-versions = "*" 1076 | files = [ 1077 | {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, 1078 | {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, 1079 | ] 1080 | 1081 | [[package]] 1082 | name = "more-itertools" 1083 | version = "10.1.0" 1084 | description = "More routines for operating on iterables, beyond itertools" 1085 | optional = false 1086 | python-versions = ">=3.8" 1087 | files = [ 1088 | {file = "more-itertools-10.1.0.tar.gz", hash = "sha256:626c369fa0eb37bac0291bce8259b332fd59ac792fa5497b59837309cd5b114a"}, 1089 | {file = "more_itertools-10.1.0-py3-none-any.whl", hash = "sha256:64e0735fcfdc6f3464ea133afe8ea4483b1c5fe3a3d69852e6503b43a0b222e6"}, 1090 | ] 1091 | 1092 | [[package]] 1093 | name = "mypy" 1094 | version = "1.5.1" 1095 | description = "Optional static typing for Python" 1096 | optional = false 1097 | python-versions = ">=3.8" 1098 | files = [ 1099 | {file = "mypy-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f33592ddf9655a4894aef22d134de7393e95fcbdc2d15c1ab65828eee5c66c70"}, 1100 | {file = "mypy-1.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:258b22210a4a258ccd077426c7a181d789d1121aca6db73a83f79372f5569ae0"}, 1101 | {file = "mypy-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9ec1f695f0c25986e6f7f8778e5ce61659063268836a38c951200c57479cc12"}, 1102 | {file = "mypy-1.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:abed92d9c8f08643c7d831300b739562b0a6c9fcb028d211134fc9ab20ccad5d"}, 1103 | {file = "mypy-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:a156e6390944c265eb56afa67c74c0636f10283429171018446b732f1a05af25"}, 1104 | {file = "mypy-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6ac9c21bfe7bc9f7f1b6fae441746e6a106e48fc9de530dea29e8cd37a2c0cc4"}, 1105 | {file = "mypy-1.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51cb1323064b1099e177098cb939eab2da42fea5d818d40113957ec954fc85f4"}, 1106 | {file = "mypy-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:596fae69f2bfcb7305808c75c00f81fe2829b6236eadda536f00610ac5ec2243"}, 1107 | {file = "mypy-1.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:32cb59609b0534f0bd67faebb6e022fe534bdb0e2ecab4290d683d248be1b275"}, 1108 | {file = "mypy-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:159aa9acb16086b79bbb0016145034a1a05360626046a929f84579ce1666b315"}, 1109 | {file = "mypy-1.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f6b0e77db9ff4fda74de7df13f30016a0a663928d669c9f2c057048ba44f09bb"}, 1110 | {file = "mypy-1.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:26f71b535dfc158a71264e6dc805a9f8d2e60b67215ca0bfa26e2e1aa4d4d373"}, 1111 | {file = "mypy-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc3a600f749b1008cc75e02b6fb3d4db8dbcca2d733030fe7a3b3502902f161"}, 1112 | {file = "mypy-1.5.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:26fb32e4d4afa205b24bf645eddfbb36a1e17e995c5c99d6d00edb24b693406a"}, 1113 | {file = "mypy-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:82cb6193de9bbb3844bab4c7cf80e6227d5225cc7625b068a06d005d861ad5f1"}, 1114 | {file = "mypy-1.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4a465ea2ca12804d5b34bb056be3a29dc47aea5973b892d0417c6a10a40b2d65"}, 1115 | {file = "mypy-1.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9fece120dbb041771a63eb95e4896791386fe287fefb2837258925b8326d6160"}, 1116 | {file = "mypy-1.5.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d28ddc3e3dfeab553e743e532fb95b4e6afad51d4706dd22f28e1e5e664828d2"}, 1117 | {file = "mypy-1.5.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:57b10c56016adce71fba6bc6e9fd45d8083f74361f629390c556738565af8eeb"}, 1118 | {file = "mypy-1.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:ff0cedc84184115202475bbb46dd99f8dcb87fe24d5d0ddfc0fe6b8575c88d2f"}, 1119 | {file = "mypy-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8f772942d372c8cbac575be99f9cc9d9fb3bd95c8bc2de6c01411e2c84ebca8a"}, 1120 | {file = "mypy-1.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5d627124700b92b6bbaa99f27cbe615c8ea7b3402960f6372ea7d65faf376c14"}, 1121 | {file = "mypy-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:361da43c4f5a96173220eb53340ace68cda81845cd88218f8862dfb0adc8cddb"}, 1122 | {file = "mypy-1.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:330857f9507c24de5c5724235e66858f8364a0693894342485e543f5b07c8693"}, 1123 | {file = "mypy-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:c543214ffdd422623e9fedd0869166c2f16affe4ba37463975043ef7d2ea8770"}, 1124 | {file = "mypy-1.5.1-py3-none-any.whl", hash = "sha256:f757063a83970d67c444f6e01d9550a7402322af3557ce7630d3c957386fa8f5"}, 1125 | {file = "mypy-1.5.1.tar.gz", hash = "sha256:b031b9601f1060bf1281feab89697324726ba0c0bae9d7cd7ab4b690940f0b92"}, 1126 | ] 1127 | 1128 | [package.dependencies] 1129 | mypy-extensions = ">=1.0.0" 1130 | tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} 1131 | typing-extensions = ">=4.1.0" 1132 | 1133 | [package.extras] 1134 | dmypy = ["psutil (>=4.0)"] 1135 | install-types = ["pip"] 1136 | reports = ["lxml"] 1137 | 1138 | [[package]] 1139 | name = "mypy-extensions" 1140 | version = "1.0.0" 1141 | description = "Type system extensions for programs checked with the mypy type checker." 1142 | optional = false 1143 | python-versions = ">=3.5" 1144 | files = [ 1145 | {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, 1146 | {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, 1147 | ] 1148 | 1149 | [[package]] 1150 | name = "nitpick" 1151 | version = "0.34.0" 1152 | description = "Enforce the same settings across multiple language-independent projects" 1153 | optional = false 1154 | python-versions = ">=3.8,<4.0" 1155 | files = [ 1156 | {file = "nitpick-0.34.0-py3-none-any.whl", hash = "sha256:ca346dfdd256dadb7c0e6d5c939ba4182a826c40ea395705d9653cf56469cdef"}, 1157 | {file = "nitpick-0.34.0.tar.gz", hash = "sha256:ea01639a02a01e4a49e06e3018e2c0da8fb3a25068467884f5a178d8d8d81023"}, 1158 | ] 1159 | 1160 | [package.dependencies] 1161 | attrs = ">=20.1.0" 1162 | autorepr = "*" 1163 | click = "*" 1164 | ConfigUpdater = "*" 1165 | dictdiffer = "*" 1166 | dpath = "*" 1167 | flake8 = ">=3.0.0" 1168 | flatten-dict = "*" 1169 | furl = "*" 1170 | identify = "*" 1171 | importlib-resources = {version = "*", markers = "python_version >= \"3.8\" and python_version < \"3.9\""} 1172 | jmespath = "*" 1173 | loguru = "*" 1174 | marshmallow = ">=3.0.0b10" 1175 | marshmallow-polyfield = ">=5.10,<6.0" 1176 | more-itertools = "*" 1177 | pluggy = "*" 1178 | python-slugify = "*" 1179 | requests = "*" 1180 | requests-cache = ">=1.0.0" 1181 | "ruamel.yaml" = "*" 1182 | sortedcontainers = "*" 1183 | StrEnum = "*" 1184 | toml = "*" 1185 | tomlkit = ">=0.8.0" 1186 | 1187 | [package.extras] 1188 | doc = ["sphinx", "sphinx-gitref", "sphinx_rtd_theme", "sphobjinv"] 1189 | lint = ["pylint"] 1190 | test = ["freezegun", "pytest", "pytest-cov", "pytest-datadir", "pytest-socket", "pytest-testmon", "pytest-watch", "responses", "testfixtures"] 1191 | 1192 | [[package]] 1193 | name = "orderedmultidict" 1194 | version = "1.0.1" 1195 | description = "Ordered Multivalue Dictionary" 1196 | optional = false 1197 | python-versions = "*" 1198 | files = [ 1199 | {file = "orderedmultidict-1.0.1-py2.py3-none-any.whl", hash = "sha256:43c839a17ee3cdd62234c47deca1a8508a3f2ca1d0678a3bf791c87cf84adbf3"}, 1200 | {file = "orderedmultidict-1.0.1.tar.gz", hash = "sha256:04070bbb5e87291cc9bfa51df413677faf2141c73c61d2a5f7b26bea3cd882ad"}, 1201 | ] 1202 | 1203 | [package.dependencies] 1204 | six = ">=1.8.0" 1205 | 1206 | [[package]] 1207 | name = "packaging" 1208 | version = "23.1" 1209 | description = "Core utilities for Python packages" 1210 | optional = false 1211 | python-versions = ">=3.7" 1212 | files = [ 1213 | {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, 1214 | {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, 1215 | ] 1216 | 1217 | [[package]] 1218 | name = "pbr" 1219 | version = "5.11.1" 1220 | description = "Python Build Reasonableness" 1221 | optional = false 1222 | python-versions = ">=2.6" 1223 | files = [ 1224 | {file = "pbr-5.11.1-py2.py3-none-any.whl", hash = "sha256:567f09558bae2b3ab53cb3c1e2e33e726ff3338e7bae3db5dc954b3a44eef12b"}, 1225 | {file = "pbr-5.11.1.tar.gz", hash = "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"}, 1226 | ] 1227 | 1228 | [[package]] 1229 | name = "pep8-naming" 1230 | version = "0.13.3" 1231 | description = "Check PEP-8 naming conventions, plugin for flake8" 1232 | optional = false 1233 | python-versions = ">=3.7" 1234 | files = [ 1235 | {file = "pep8-naming-0.13.3.tar.gz", hash = "sha256:1705f046dfcd851378aac3be1cd1551c7c1e5ff363bacad707d43007877fa971"}, 1236 | {file = "pep8_naming-0.13.3-py3-none-any.whl", hash = "sha256:1a86b8c71a03337c97181917e2b472f0f5e4ccb06844a0d6f0a33522549e7a80"}, 1237 | ] 1238 | 1239 | [package.dependencies] 1240 | flake8 = ">=5.0.0" 1241 | 1242 | [[package]] 1243 | name = "platformdirs" 1244 | version = "3.10.0" 1245 | description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 1246 | optional = false 1247 | python-versions = ">=3.7" 1248 | files = [ 1249 | {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, 1250 | {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, 1251 | ] 1252 | 1253 | [package.extras] 1254 | docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] 1255 | test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] 1256 | 1257 | [[package]] 1258 | name = "pluggy" 1259 | version = "1.3.0" 1260 | description = "plugin and hook calling mechanisms for python" 1261 | optional = false 1262 | python-versions = ">=3.8" 1263 | files = [ 1264 | {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, 1265 | {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, 1266 | ] 1267 | 1268 | [package.extras] 1269 | dev = ["pre-commit", "tox"] 1270 | testing = ["pytest", "pytest-benchmark"] 1271 | 1272 | [[package]] 1273 | name = "pycodestyle" 1274 | version = "2.11.0" 1275 | description = "Python style guide checker" 1276 | optional = false 1277 | python-versions = ">=3.8" 1278 | files = [ 1279 | {file = "pycodestyle-2.11.0-py2.py3-none-any.whl", hash = "sha256:5d1013ba8dc7895b548be5afb05740ca82454fd899971563d2ef625d090326f8"}, 1280 | {file = "pycodestyle-2.11.0.tar.gz", hash = "sha256:259bcc17857d8a8b3b4a2327324b79e5f020a13c16074670f9c8c8f872ea76d0"}, 1281 | ] 1282 | 1283 | [[package]] 1284 | name = "pydocstyle" 1285 | version = "6.3.0" 1286 | description = "Python docstring style checker" 1287 | optional = false 1288 | python-versions = ">=3.6" 1289 | files = [ 1290 | {file = "pydocstyle-6.3.0-py3-none-any.whl", hash = "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019"}, 1291 | {file = "pydocstyle-6.3.0.tar.gz", hash = "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1"}, 1292 | ] 1293 | 1294 | [package.dependencies] 1295 | snowballstemmer = ">=2.2.0" 1296 | 1297 | [package.extras] 1298 | toml = ["tomli (>=1.2.3)"] 1299 | 1300 | [[package]] 1301 | name = "pyflakes" 1302 | version = "3.1.0" 1303 | description = "passive checker of Python programs" 1304 | optional = false 1305 | python-versions = ">=3.8" 1306 | files = [ 1307 | {file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"}, 1308 | {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"}, 1309 | ] 1310 | 1311 | [[package]] 1312 | name = "pygments" 1313 | version = "2.16.1" 1314 | description = "Pygments is a syntax highlighting package written in Python." 1315 | optional = false 1316 | python-versions = ">=3.7" 1317 | files = [ 1318 | {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, 1319 | {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, 1320 | ] 1321 | 1322 | [package.extras] 1323 | plugins = ["importlib-metadata"] 1324 | 1325 | [[package]] 1326 | name = "pytest" 1327 | version = "7.4.2" 1328 | description = "pytest: simple powerful testing with Python" 1329 | optional = false 1330 | python-versions = ">=3.7" 1331 | files = [ 1332 | {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, 1333 | {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, 1334 | ] 1335 | 1336 | [package.dependencies] 1337 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 1338 | exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} 1339 | iniconfig = "*" 1340 | packaging = "*" 1341 | pluggy = ">=0.12,<2.0" 1342 | tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} 1343 | 1344 | [package.extras] 1345 | testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] 1346 | 1347 | [[package]] 1348 | name = "pytest-cov" 1349 | version = "4.1.0" 1350 | description = "Pytest plugin for measuring coverage." 1351 | optional = false 1352 | python-versions = ">=3.7" 1353 | files = [ 1354 | {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, 1355 | {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, 1356 | ] 1357 | 1358 | [package.dependencies] 1359 | coverage = {version = ">=5.2.1", extras = ["toml"]} 1360 | pytest = ">=4.6" 1361 | 1362 | [package.extras] 1363 | testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] 1364 | 1365 | [[package]] 1366 | name = "pytest-mypy-plugins" 1367 | version = "3.0.0" 1368 | description = "pytest plugin for writing tests for mypy plugins" 1369 | optional = false 1370 | python-versions = ">=3.8" 1371 | files = [ 1372 | {file = "pytest-mypy-plugins-3.0.0.tar.gz", hash = "sha256:05a728c7cbc4f33610f97fe9266b2c3eb209e41c28935011b4fc9531662625f6"}, 1373 | {file = "pytest_mypy_plugins-3.0.0-py3-none-any.whl", hash = "sha256:a1e3f51b68898bc25713cc53718a28d9dc0cfd51d28a537ef18c7df3b123ed84"}, 1374 | ] 1375 | 1376 | [package.dependencies] 1377 | decorator = "*" 1378 | Jinja2 = "*" 1379 | mypy = ">=1.3" 1380 | packaging = "*" 1381 | pytest = ">=7.0.0" 1382 | pyyaml = "*" 1383 | regex = "*" 1384 | tomlkit = ">=0.11" 1385 | 1386 | [[package]] 1387 | name = "pytest-randomly" 1388 | version = "3.15.0" 1389 | description = "Pytest plugin to randomly order tests and control random.seed." 1390 | optional = false 1391 | python-versions = ">=3.8" 1392 | files = [ 1393 | {file = "pytest_randomly-3.15.0-py3-none-any.whl", hash = "sha256:0516f4344b29f4e9cdae8bce31c4aeebf59d0b9ef05927c33354ff3859eeeca6"}, 1394 | {file = "pytest_randomly-3.15.0.tar.gz", hash = "sha256:b908529648667ba5e54723088edd6f82252f540cc340d748d1fa985539687047"}, 1395 | ] 1396 | 1397 | [package.dependencies] 1398 | importlib-metadata = {version = ">=3.6.0", markers = "python_version < \"3.10\""} 1399 | pytest = "*" 1400 | 1401 | [[package]] 1402 | name = "python-slugify" 1403 | version = "8.0.1" 1404 | description = "A Python slugify application that also handles Unicode" 1405 | optional = false 1406 | python-versions = ">=3.7" 1407 | files = [ 1408 | {file = "python-slugify-8.0.1.tar.gz", hash = "sha256:ce0d46ddb668b3be82f4ed5e503dbc33dd815d83e2eb6824211310d3fb172a27"}, 1409 | {file = "python_slugify-8.0.1-py2.py3-none-any.whl", hash = "sha256:70ca6ea68fe63ecc8fa4fcf00ae651fc8a5d02d93dcd12ae6d4fc7ca46c4d395"}, 1410 | ] 1411 | 1412 | [package.dependencies] 1413 | text-unidecode = ">=1.3" 1414 | 1415 | [package.extras] 1416 | unidecode = ["Unidecode (>=1.1.1)"] 1417 | 1418 | [[package]] 1419 | name = "pytz" 1420 | version = "2023.3.post1" 1421 | description = "World timezone definitions, modern and historical" 1422 | optional = false 1423 | python-versions = "*" 1424 | files = [ 1425 | {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, 1426 | {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, 1427 | ] 1428 | 1429 | [[package]] 1430 | name = "pyyaml" 1431 | version = "6.0.1" 1432 | description = "YAML parser and emitter for Python" 1433 | optional = false 1434 | python-versions = ">=3.6" 1435 | files = [ 1436 | {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, 1437 | {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, 1438 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, 1439 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, 1440 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, 1441 | {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, 1442 | {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, 1443 | {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, 1444 | {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, 1445 | {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, 1446 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, 1447 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, 1448 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, 1449 | {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, 1450 | {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, 1451 | {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, 1452 | {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, 1453 | {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, 1454 | {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, 1455 | {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, 1456 | {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, 1457 | {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, 1458 | {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, 1459 | {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, 1460 | {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, 1461 | {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, 1462 | {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, 1463 | {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, 1464 | {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, 1465 | {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, 1466 | {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, 1467 | {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, 1468 | {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, 1469 | {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, 1470 | {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, 1471 | {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, 1472 | {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, 1473 | {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, 1474 | {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, 1475 | {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, 1476 | {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, 1477 | {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, 1478 | {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, 1479 | {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, 1480 | {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, 1481 | {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, 1482 | {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, 1483 | {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, 1484 | {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, 1485 | {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, 1486 | ] 1487 | 1488 | [[package]] 1489 | name = "regex" 1490 | version = "2023.8.8" 1491 | description = "Alternative regular expression module, to replace re." 1492 | optional = false 1493 | python-versions = ">=3.6" 1494 | files = [ 1495 | {file = "regex-2023.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88900f521c645f784260a8d346e12a1590f79e96403971241e64c3a265c8ecdb"}, 1496 | {file = "regex-2023.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3611576aff55918af2697410ff0293d6071b7e00f4b09e005d614686ac4cd57c"}, 1497 | {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0ccc8f2698f120e9e5742f4b38dc944c38744d4bdfc427616f3a163dd9de5"}, 1498 | {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c662a4cbdd6280ee56f841f14620787215a171c4e2d1744c9528bed8f5816c96"}, 1499 | {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf0633e4a1b667bfe0bb10b5e53fe0d5f34a6243ea2530eb342491f1adf4f739"}, 1500 | {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:551ad543fa19e94943c5b2cebc54c73353ffff08228ee5f3376bd27b3d5b9800"}, 1501 | {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54de2619f5ea58474f2ac211ceea6b615af2d7e4306220d4f3fe690c91988a61"}, 1502 | {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ec4b3f0aebbbe2fc0134ee30a791af522a92ad9f164858805a77442d7d18570"}, 1503 | {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ae646c35cb9f820491760ac62c25b6d6b496757fda2d51be429e0e7b67ae0ab"}, 1504 | {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca339088839582d01654e6f83a637a4b8194d0960477b9769d2ff2cfa0fa36d2"}, 1505 | {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d9b6627408021452dcd0d2cdf8da0534e19d93d070bfa8b6b4176f99711e7f90"}, 1506 | {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:bd3366aceedf274f765a3a4bc95d6cd97b130d1dda524d8f25225d14123c01db"}, 1507 | {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7aed90a72fc3654fba9bc4b7f851571dcc368120432ad68b226bd593f3f6c0b7"}, 1508 | {file = "regex-2023.8.8-cp310-cp310-win32.whl", hash = "sha256:80b80b889cb767cc47f31d2b2f3dec2db8126fbcd0cff31b3925b4dc6609dcdb"}, 1509 | {file = "regex-2023.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:b82edc98d107cbc7357da7a5a695901b47d6eb0420e587256ba3ad24b80b7d0b"}, 1510 | {file = "regex-2023.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1e7d84d64c84ad97bf06f3c8cb5e48941f135ace28f450d86af6b6512f1c9a71"}, 1511 | {file = "regex-2023.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce0f9fbe7d295f9922c0424a3637b88c6c472b75eafeaff6f910494a1fa719ef"}, 1512 | {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06c57e14ac723b04458df5956cfb7e2d9caa6e9d353c0b4c7d5d54fcb1325c46"}, 1513 | {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7a9aaa5a1267125eef22cef3b63484c3241aaec6f48949b366d26c7250e0357"}, 1514 | {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b7408511fca48a82a119d78a77c2f5eb1b22fe88b0d2450ed0756d194fe7a9a"}, 1515 | {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14dc6f2d88192a67d708341f3085df6a4f5a0c7b03dec08d763ca2cd86e9f559"}, 1516 | {file = "regex-2023.8.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48c640b99213643d141550326f34f0502fedb1798adb3c9eb79650b1ecb2f177"}, 1517 | {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0085da0f6c6393428bf0d9c08d8b1874d805bb55e17cb1dfa5ddb7cfb11140bf"}, 1518 | {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:964b16dcc10c79a4a2be9f1273fcc2684a9eedb3906439720598029a797b46e6"}, 1519 | {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7ce606c14bb195b0e5108544b540e2c5faed6843367e4ab3deb5c6aa5e681208"}, 1520 | {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:40f029d73b10fac448c73d6eb33d57b34607f40116e9f6e9f0d32e9229b147d7"}, 1521 | {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3b8e6ea6be6d64104d8e9afc34c151926f8182f84e7ac290a93925c0db004bfd"}, 1522 | {file = "regex-2023.8.8-cp311-cp311-win32.whl", hash = "sha256:942f8b1f3b223638b02df7df79140646c03938d488fbfb771824f3d05fc083a8"}, 1523 | {file = "regex-2023.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:51d8ea2a3a1a8fe4f67de21b8b93757005213e8ac3917567872f2865185fa7fb"}, 1524 | {file = "regex-2023.8.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e951d1a8e9963ea51efd7f150450803e3b95db5939f994ad3d5edac2b6f6e2b4"}, 1525 | {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704f63b774218207b8ccc6c47fcef5340741e5d839d11d606f70af93ee78e4d4"}, 1526 | {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22283c769a7b01c8ac355d5be0715bf6929b6267619505e289f792b01304d898"}, 1527 | {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91129ff1bb0619bc1f4ad19485718cc623a2dc433dff95baadbf89405c7f6b57"}, 1528 | {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de35342190deb7b866ad6ba5cbcccb2d22c0487ee0cbb251efef0843d705f0d4"}, 1529 | {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b993b6f524d1e274a5062488a43e3f9f8764ee9745ccd8e8193df743dbe5ee61"}, 1530 | {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3026cbcf11d79095a32d9a13bbc572a458727bd5b1ca332df4a79faecd45281c"}, 1531 | {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:293352710172239bf579c90a9864d0df57340b6fd21272345222fb6371bf82b3"}, 1532 | {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d909b5a3fff619dc7e48b6b1bedc2f30ec43033ba7af32f936c10839e81b9217"}, 1533 | {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3d370ff652323c5307d9c8e4c62efd1956fb08051b0e9210212bc51168b4ff56"}, 1534 | {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:b076da1ed19dc37788f6a934c60adf97bd02c7eea461b73730513921a85d4235"}, 1535 | {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e9941a4ada58f6218694f382e43fdd256e97615db9da135e77359da257a7168b"}, 1536 | {file = "regex-2023.8.8-cp36-cp36m-win32.whl", hash = "sha256:a8c65c17aed7e15a0c824cdc63a6b104dfc530f6fa8cb6ac51c437af52b481c7"}, 1537 | {file = "regex-2023.8.8-cp36-cp36m-win_amd64.whl", hash = "sha256:aadf28046e77a72f30dcc1ab185639e8de7f4104b8cb5c6dfa5d8ed860e57236"}, 1538 | {file = "regex-2023.8.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:423adfa872b4908843ac3e7a30f957f5d5282944b81ca0a3b8a7ccbbfaa06103"}, 1539 | {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ae594c66f4a7e1ea67232a0846649a7c94c188d6c071ac0210c3e86a5f92109"}, 1540 | {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e51c80c168074faa793685656c38eb7a06cbad7774c8cbc3ea05552d615393d8"}, 1541 | {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09b7f4c66aa9d1522b06e31a54f15581c37286237208df1345108fcf4e050c18"}, 1542 | {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e73e5243af12d9cd6a9d6a45a43570dbe2e5b1cdfc862f5ae2b031e44dd95a8"}, 1543 | {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941460db8fe3bd613db52f05259c9336f5a47ccae7d7def44cc277184030a116"}, 1544 | {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f0ccf3e01afeb412a1a9993049cb160d0352dba635bbca7762b2dc722aa5742a"}, 1545 | {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2e9216e0d2cdce7dbc9be48cb3eacb962740a09b011a116fd7af8c832ab116ca"}, 1546 | {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5cd9cd7170459b9223c5e592ac036e0704bee765706445c353d96f2890e816c8"}, 1547 | {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4873ef92e03a4309b3ccd8281454801b291b689f6ad45ef8c3658b6fa761d7ac"}, 1548 | {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:239c3c2a339d3b3ddd51c2daef10874410917cd2b998f043c13e2084cb191684"}, 1549 | {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1005c60ed7037be0d9dea1f9c53cc42f836188227366370867222bda4c3c6bd7"}, 1550 | {file = "regex-2023.8.8-cp37-cp37m-win32.whl", hash = "sha256:e6bd1e9b95bc5614a7a9c9c44fde9539cba1c823b43a9f7bc11266446dd568e3"}, 1551 | {file = "regex-2023.8.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9a96edd79661e93327cfeac4edec72a4046e14550a1d22aa0dd2e3ca52aec921"}, 1552 | {file = "regex-2023.8.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2181c20ef18747d5f4a7ea513e09ea03bdd50884a11ce46066bb90fe4213675"}, 1553 | {file = "regex-2023.8.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a2ad5add903eb7cdde2b7c64aaca405f3957ab34f16594d2b78d53b8b1a6a7d6"}, 1554 | {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9233ac249b354c54146e392e8a451e465dd2d967fc773690811d3a8c240ac601"}, 1555 | {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920974009fb37b20d32afcdf0227a2e707eb83fe418713f7a8b7de038b870d0b"}, 1556 | {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2b6c5dfe0929b6c23dde9624483380b170b6e34ed79054ad131b20203a1a63"}, 1557 | {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96979d753b1dc3b2169003e1854dc67bfc86edf93c01e84757927f810b8c3c93"}, 1558 | {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ae54a338191e1356253e7883d9d19f8679b6143703086245fb14d1f20196be9"}, 1559 | {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2162ae2eb8b079622176a81b65d486ba50b888271302190870b8cc488587d280"}, 1560 | {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c884d1a59e69e03b93cf0dfee8794c63d7de0ee8f7ffb76e5f75be8131b6400a"}, 1561 | {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf9273e96f3ee2ac89ffcb17627a78f78e7516b08f94dc435844ae72576a276e"}, 1562 | {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:83215147121e15d5f3a45d99abeed9cf1fe16869d5c233b08c56cdf75f43a504"}, 1563 | {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f7454aa427b8ab9101f3787eb178057c5250478e39b99540cfc2b889c7d0586"}, 1564 | {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0640913d2c1044d97e30d7c41728195fc37e54d190c5385eacb52115127b882"}, 1565 | {file = "regex-2023.8.8-cp38-cp38-win32.whl", hash = "sha256:0c59122ceccb905a941fb23b087b8eafc5290bf983ebcb14d2301febcbe199c7"}, 1566 | {file = "regex-2023.8.8-cp38-cp38-win_amd64.whl", hash = "sha256:c12f6f67495ea05c3d542d119d270007090bad5b843f642d418eb601ec0fa7be"}, 1567 | {file = "regex-2023.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:82cd0a69cd28f6cc3789cc6adeb1027f79526b1ab50b1f6062bbc3a0ccb2dbc3"}, 1568 | {file = "regex-2023.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bb34d1605f96a245fc39790a117ac1bac8de84ab7691637b26ab2c5efb8f228c"}, 1569 | {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:987b9ac04d0b38ef4f89fbc035e84a7efad9cdd5f1e29024f9289182c8d99e09"}, 1570 | {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dd6082f4e2aec9b6a0927202c85bc1b09dcab113f97265127c1dc20e2e32495"}, 1571 | {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7eb95fe8222932c10d4436e7a6f7c99991e3fdd9f36c949eff16a69246dee2dc"}, 1572 | {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7098c524ba9f20717a56a8d551d2ed491ea89cbf37e540759ed3b776a4f8d6eb"}, 1573 | {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b694430b3f00eb02c594ff5a16db30e054c1b9589a043fe9174584c6efa8033"}, 1574 | {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2aeab3895d778155054abea5238d0eb9a72e9242bd4b43f42fd911ef9a13470"}, 1575 | {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:988631b9d78b546e284478c2ec15c8a85960e262e247b35ca5eaf7ee22f6050a"}, 1576 | {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:67ecd894e56a0c6108ec5ab1d8fa8418ec0cff45844a855966b875d1039a2e34"}, 1577 | {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:14898830f0a0eb67cae2bbbc787c1a7d6e34ecc06fbd39d3af5fe29a4468e2c9"}, 1578 | {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f2200e00b62568cfd920127782c61bc1c546062a879cdc741cfcc6976668dfcf"}, 1579 | {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9691a549c19c22d26a4f3b948071e93517bdf86e41b81d8c6ac8a964bb71e5a6"}, 1580 | {file = "regex-2023.8.8-cp39-cp39-win32.whl", hash = "sha256:6ab2ed84bf0137927846b37e882745a827458689eb969028af8032b1b3dac78e"}, 1581 | {file = "regex-2023.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5543c055d8ec7801901e1193a51570643d6a6ab8751b1f7dd9af71af467538bb"}, 1582 | {file = "regex-2023.8.8.tar.gz", hash = "sha256:fcbdc5f2b0f1cd0f6a56cdb46fe41d2cce1e644e3b68832f3eeebc5fb0f7712e"}, 1583 | ] 1584 | 1585 | [[package]] 1586 | name = "requests" 1587 | version = "2.31.0" 1588 | description = "Python HTTP for Humans." 1589 | optional = false 1590 | python-versions = ">=3.7" 1591 | files = [ 1592 | {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, 1593 | {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, 1594 | ] 1595 | 1596 | [package.dependencies] 1597 | certifi = ">=2017.4.17" 1598 | charset-normalizer = ">=2,<4" 1599 | idna = ">=2.5,<4" 1600 | urllib3 = ">=1.21.1,<3" 1601 | 1602 | [package.extras] 1603 | socks = ["PySocks (>=1.5.6,!=1.5.7)"] 1604 | use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] 1605 | 1606 | [[package]] 1607 | name = "requests-cache" 1608 | version = "1.1.0" 1609 | description = "A persistent cache for python requests" 1610 | optional = false 1611 | python-versions = ">=3.7,<4.0" 1612 | files = [ 1613 | {file = "requests_cache-1.1.0-py3-none-any.whl", hash = "sha256:178282bce704b912c59e7f88f367c42bddd6cde6bf511b2a3e3cfb7e5332a92a"}, 1614 | {file = "requests_cache-1.1.0.tar.gz", hash = "sha256:41b79166aa8e300cc4de982f7ab7c52af914a785160be1eda25c6e9265969a67"}, 1615 | ] 1616 | 1617 | [package.dependencies] 1618 | attrs = ">=21.2" 1619 | cattrs = ">=22.2" 1620 | platformdirs = ">=2.5" 1621 | requests = ">=2.22" 1622 | url-normalize = ">=1.4" 1623 | urllib3 = ">=1.25.5" 1624 | 1625 | [package.extras] 1626 | all = ["boto3 (>=1.15)", "botocore (>=1.18)", "itsdangerous (>=2.0)", "pymongo (>=3)", "pyyaml (>=5.4)", "redis (>=3)", "ujson (>=5.4)"] 1627 | bson = ["bson (>=0.5)"] 1628 | docs = ["furo (>=2023.3,<2024.0)", "linkify-it-py (>=2.0,<3.0)", "myst-parser (>=1.0,<2.0)", "sphinx (>=5.0.2,<6.0.0)", "sphinx-autodoc-typehints (>=1.19)", "sphinx-automodapi (>=0.14)", "sphinx-copybutton (>=0.5)", "sphinx-design (>=0.2)", "sphinx-notfound-page (>=0.8)", "sphinxcontrib-apidoc (>=0.3)", "sphinxext-opengraph (>=0.6)"] 1629 | dynamodb = ["boto3 (>=1.15)", "botocore (>=1.18)"] 1630 | json = ["ujson (>=5.4)"] 1631 | mongodb = ["pymongo (>=3)"] 1632 | redis = ["redis (>=3)"] 1633 | security = ["itsdangerous (>=2.0)"] 1634 | yaml = ["pyyaml (>=5.4)"] 1635 | 1636 | [[package]] 1637 | name = "restructuredtext-lint" 1638 | version = "1.4.0" 1639 | description = "reStructuredText linter" 1640 | optional = false 1641 | python-versions = "*" 1642 | files = [ 1643 | {file = "restructuredtext_lint-1.4.0.tar.gz", hash = "sha256:1b235c0c922341ab6c530390892eb9e92f90b9b75046063e047cacfb0f050c45"}, 1644 | ] 1645 | 1646 | [package.dependencies] 1647 | docutils = ">=0.11,<1.0" 1648 | 1649 | [[package]] 1650 | name = "rich" 1651 | version = "13.5.3" 1652 | description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" 1653 | optional = false 1654 | python-versions = ">=3.7.0" 1655 | files = [ 1656 | {file = "rich-13.5.3-py3-none-any.whl", hash = "sha256:9257b468badc3d347e146a4faa268ff229039d4c2d176ab0cffb4c4fbc73d5d9"}, 1657 | {file = "rich-13.5.3.tar.gz", hash = "sha256:87b43e0543149efa1253f485cd845bb7ee54df16c9617b8a893650ab84b4acb6"}, 1658 | ] 1659 | 1660 | [package.dependencies] 1661 | markdown-it-py = ">=2.2.0" 1662 | pygments = ">=2.13.0,<3.0.0" 1663 | typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9\""} 1664 | 1665 | [package.extras] 1666 | jupyter = ["ipywidgets (>=7.5.1,<9)"] 1667 | 1668 | [[package]] 1669 | name = "ruamel-yaml" 1670 | version = "0.17.32" 1671 | description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" 1672 | optional = false 1673 | python-versions = ">=3" 1674 | files = [ 1675 | {file = "ruamel.yaml-0.17.32-py3-none-any.whl", hash = "sha256:23cd2ed620231677564646b0c6a89d138b6822a0d78656df7abda5879ec4f447"}, 1676 | {file = "ruamel.yaml-0.17.32.tar.gz", hash = "sha256:ec939063761914e14542972a5cba6d33c23b0859ab6342f61cf070cfc600efc2"}, 1677 | ] 1678 | 1679 | [package.dependencies] 1680 | "ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.12\""} 1681 | 1682 | [package.extras] 1683 | docs = ["ryd"] 1684 | jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] 1685 | 1686 | [[package]] 1687 | name = "ruamel-yaml-clib" 1688 | version = "0.2.7" 1689 | description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" 1690 | optional = false 1691 | python-versions = ">=3.5" 1692 | files = [ 1693 | {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5859983f26d8cd7bb5c287ef452e8aacc86501487634573d260968f753e1d71"}, 1694 | {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:debc87a9516b237d0466a711b18b6ebeb17ba9f391eb7f91c649c5c4ec5006c7"}, 1695 | {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:df5828871e6648db72d1c19b4bd24819b80a755c4541d3409f0f7acd0f335c80"}, 1696 | {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:efa08d63ef03d079dcae1dfe334f6c8847ba8b645d08df286358b1f5293d24ab"}, 1697 | {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win32.whl", hash = "sha256:763d65baa3b952479c4e972669f679fe490eee058d5aa85da483ebae2009d231"}, 1698 | {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:d000f258cf42fec2b1bbf2863c61d7b8918d31ffee905da62dede869254d3b8a"}, 1699 | {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:045e0626baf1c52e5527bd5db361bc83180faaba2ff586e763d3d5982a876a9e"}, 1700 | {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:1a6391a7cabb7641c32517539ca42cf84b87b667bad38b78d4d42dd23e957c81"}, 1701 | {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:9c7617df90c1365638916b98cdd9be833d31d337dbcd722485597b43c4a215bf"}, 1702 | {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:41d0f1fa4c6830176eef5b276af04c89320ea616655d01327d5ce65e50575c94"}, 1703 | {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-win32.whl", hash = "sha256:f6d3d39611ac2e4f62c3128a9eed45f19a6608670c5a2f4f07f24e8de3441d38"}, 1704 | {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:da538167284de58a52109a9b89b8f6a53ff8437dd6dc26d33b57bf6699153122"}, 1705 | {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4b3a93bb9bc662fc1f99c5c3ea8e623d8b23ad22f861eb6fce9377ac07ad6072"}, 1706 | {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_12_0_arm64.whl", hash = "sha256:a234a20ae07e8469da311e182e70ef6b199d0fbeb6c6cc2901204dd87fb867e8"}, 1707 | {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:15910ef4f3e537eea7fe45f8a5d19997479940d9196f357152a09031c5be59f3"}, 1708 | {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:370445fd795706fd291ab00c9df38a0caed0f17a6fb46b0f607668ecb16ce763"}, 1709 | {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win32.whl", hash = "sha256:ecdf1a604009bd35c674b9225a8fa609e0282d9b896c03dd441a91e5f53b534e"}, 1710 | {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win_amd64.whl", hash = "sha256:f34019dced51047d6f70cb9383b2ae2853b7fc4dce65129a5acd49f4f9256646"}, 1711 | {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2aa261c29a5545adfef9296b7e33941f46aa5bbd21164228e833412af4c9c75f"}, 1712 | {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f01da5790e95815eb5a8a138508c01c758e5f5bc0ce4286c4f7028b8dd7ac3d0"}, 1713 | {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:40d030e2329ce5286d6b231b8726959ebbe0404c92f0a578c0e2482182e38282"}, 1714 | {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c3ca1fbba4ae962521e5eb66d72998b51f0f4d0f608d3c0347a48e1af262efa7"}, 1715 | {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win32.whl", hash = "sha256:7bdb4c06b063f6fd55e472e201317a3bb6cdeeee5d5a38512ea5c01e1acbdd93"}, 1716 | {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:be2a7ad8fd8f7442b24323d24ba0b56c51219513cfa45b9ada3b87b76c374d4b"}, 1717 | {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91a789b4aa0097b78c93e3dc4b40040ba55bef518f84a40d4442f713b4094acb"}, 1718 | {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:99e77daab5d13a48a4054803d052ff40780278240a902b880dd37a51ba01a307"}, 1719 | {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:3243f48ecd450eddadc2d11b5feb08aca941b5cd98c9b1db14b2fd128be8c697"}, 1720 | {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8831a2cedcd0f0927f788c5bdf6567d9dc9cc235646a434986a852af1cb54b4b"}, 1721 | {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win32.whl", hash = "sha256:3110a99e0f94a4a3470ff67fc20d3f96c25b13d24c6980ff841e82bafe827cac"}, 1722 | {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:92460ce908546ab69770b2e576e4f99fbb4ce6ab4b245345a3869a0a0410488f"}, 1723 | {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5bc0667c1eb8f83a3752b71b9c4ba55ef7c7058ae57022dd9b29065186a113d9"}, 1724 | {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:4a4d8d417868d68b979076a9be6a38c676eca060785abaa6709c7b31593c35d1"}, 1725 | {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf9a6bc4a0221538b1a7de3ed7bca4c93c02346853f44e1cd764be0023cd3640"}, 1726 | {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:a7b301ff08055d73223058b5c46c55638917f04d21577c95e00e0c4d79201a6b"}, 1727 | {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win32.whl", hash = "sha256:d5e51e2901ec2366b79f16c2299a03e74ba4531ddcfacc1416639c557aef0ad8"}, 1728 | {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:184faeaec61dbaa3cace407cffc5819f7b977e75360e8d5ca19461cd851a5fc5"}, 1729 | {file = "ruamel.yaml.clib-0.2.7.tar.gz", hash = "sha256:1f08fd5a2bea9c4180db71678e850b995d2a5f4537be0e94557668cf0f5f9497"}, 1730 | ] 1731 | 1732 | [[package]] 1733 | name = "safety" 1734 | version = "2.3.4" 1735 | description = "Checks installed dependencies for known vulnerabilities and licenses." 1736 | optional = false 1737 | python-versions = "*" 1738 | files = [ 1739 | {file = "safety-2.3.4-py3-none-any.whl", hash = "sha256:6224dcd9b20986a2b2c5e7acfdfba6bca42bb11b2783b24ed04f32317e5167ea"}, 1740 | {file = "safety-2.3.4.tar.gz", hash = "sha256:b9e74e794e82f54d11f4091c5d820c4d2d81de9f953bf0b4f33ac8bc402ae72c"}, 1741 | ] 1742 | 1743 | [package.dependencies] 1744 | Click = ">=8.0.2" 1745 | dparse = ">=0.6.2" 1746 | packaging = ">=21.0" 1747 | requests = "*" 1748 | "ruamel.yaml" = ">=0.17.21" 1749 | setuptools = ">=19.3" 1750 | 1751 | [package.extras] 1752 | github = ["jinja2 (>=3.1.0)", "pygithub (>=1.43.3)"] 1753 | gitlab = ["python-gitlab (>=1.3.0)"] 1754 | 1755 | [[package]] 1756 | name = "setuptools" 1757 | version = "68.2.2" 1758 | description = "Easily download, build, install, upgrade, and uninstall Python packages" 1759 | optional = false 1760 | python-versions = ">=3.8" 1761 | files = [ 1762 | {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, 1763 | {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, 1764 | ] 1765 | 1766 | [package.extras] 1767 | docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] 1768 | testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] 1769 | testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] 1770 | 1771 | [[package]] 1772 | name = "six" 1773 | version = "1.16.0" 1774 | description = "Python 2 and 3 compatibility utilities" 1775 | optional = false 1776 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 1777 | files = [ 1778 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 1779 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 1780 | ] 1781 | 1782 | [[package]] 1783 | name = "smmap" 1784 | version = "5.0.1" 1785 | description = "A pure Python implementation of a sliding window memory map manager" 1786 | optional = false 1787 | python-versions = ">=3.7" 1788 | files = [ 1789 | {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, 1790 | {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, 1791 | ] 1792 | 1793 | [[package]] 1794 | name = "snowballstemmer" 1795 | version = "2.2.0" 1796 | description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." 1797 | optional = false 1798 | python-versions = "*" 1799 | files = [ 1800 | {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, 1801 | {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, 1802 | ] 1803 | 1804 | [[package]] 1805 | name = "sortedcontainers" 1806 | version = "2.4.0" 1807 | description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" 1808 | optional = false 1809 | python-versions = "*" 1810 | files = [ 1811 | {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, 1812 | {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, 1813 | ] 1814 | 1815 | [[package]] 1816 | name = "sphinx" 1817 | version = "6.2.1" 1818 | description = "Python documentation generator" 1819 | optional = false 1820 | python-versions = ">=3.8" 1821 | files = [ 1822 | {file = "Sphinx-6.2.1.tar.gz", hash = "sha256:6d56a34697bb749ffa0152feafc4b19836c755d90a7c59b72bc7dfd371b9cc6b"}, 1823 | {file = "sphinx-6.2.1-py3-none-any.whl", hash = "sha256:97787ff1fa3256a3eef9eda523a63dbf299f7b47e053cfcf684a1c2a8380c912"}, 1824 | ] 1825 | 1826 | [package.dependencies] 1827 | alabaster = ">=0.7,<0.8" 1828 | babel = ">=2.9" 1829 | colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} 1830 | docutils = ">=0.18.1,<0.20" 1831 | imagesize = ">=1.3" 1832 | importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} 1833 | Jinja2 = ">=3.0" 1834 | packaging = ">=21.0" 1835 | Pygments = ">=2.13" 1836 | requests = ">=2.25.0" 1837 | snowballstemmer = ">=2.0" 1838 | sphinxcontrib-applehelp = "*" 1839 | sphinxcontrib-devhelp = "*" 1840 | sphinxcontrib-htmlhelp = ">=2.0.0" 1841 | sphinxcontrib-jsmath = "*" 1842 | sphinxcontrib-qthelp = "*" 1843 | sphinxcontrib-serializinghtml = ">=1.1.5" 1844 | 1845 | [package.extras] 1846 | docs = ["sphinxcontrib-websupport"] 1847 | lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"] 1848 | test = ["cython", "filelock", "html5lib", "pytest (>=4.6)"] 1849 | 1850 | [[package]] 1851 | name = "sphinx-autodoc-typehints" 1852 | version = "1.23.0" 1853 | description = "Type hints (PEP 484) support for the Sphinx autodoc extension" 1854 | optional = false 1855 | python-versions = ">=3.7" 1856 | files = [ 1857 | {file = "sphinx_autodoc_typehints-1.23.0-py3-none-any.whl", hash = "sha256:ac099057e66b09e51b698058ba7dd76e57e1fe696cd91b54e121d3dad188f91d"}, 1858 | {file = "sphinx_autodoc_typehints-1.23.0.tar.gz", hash = "sha256:5d44e2996633cdada499b6d27a496ddf9dbc95dd1f0f09f7b37940249e61f6e9"}, 1859 | ] 1860 | 1861 | [package.dependencies] 1862 | sphinx = ">=5.3" 1863 | 1864 | [package.extras] 1865 | docs = ["furo (>=2022.12.7)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23.4)"] 1866 | testing = ["covdefaults (>=2.2.2)", "coverage (>=7.2.2)", "diff-cover (>=7.5)", "nptyping (>=2.5)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "sphobjinv (>=2.3.1)", "typing-extensions (>=4.5)"] 1867 | type-comment = ["typed-ast (>=1.5.4)"] 1868 | 1869 | [[package]] 1870 | name = "sphinx-typlog-theme" 1871 | version = "0.8.0" 1872 | description = "A typlog Sphinx theme" 1873 | optional = false 1874 | python-versions = "*" 1875 | files = [ 1876 | {file = "sphinx_typlog_theme-0.8.0-py2.py3-none-any.whl", hash = "sha256:b0ab728ab31d071523af0229bcb6427a13493958b3fc2bb7db381520fab77de4"}, 1877 | {file = "sphinx_typlog_theme-0.8.0.tar.gz", hash = "sha256:61dbf97b1fde441bd03a5409874571e229898b67fb3080400837b8f4cee46659"}, 1878 | ] 1879 | 1880 | [package.extras] 1881 | dev = ["livereload", "sphinx"] 1882 | 1883 | [[package]] 1884 | name = "sphinxcontrib-applehelp" 1885 | version = "1.0.4" 1886 | description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" 1887 | optional = false 1888 | python-versions = ">=3.8" 1889 | files = [ 1890 | {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"}, 1891 | {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"}, 1892 | ] 1893 | 1894 | [package.extras] 1895 | lint = ["docutils-stubs", "flake8", "mypy"] 1896 | test = ["pytest"] 1897 | 1898 | [[package]] 1899 | name = "sphinxcontrib-devhelp" 1900 | version = "1.0.2" 1901 | description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." 1902 | optional = false 1903 | python-versions = ">=3.5" 1904 | files = [ 1905 | {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, 1906 | {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, 1907 | ] 1908 | 1909 | [package.extras] 1910 | lint = ["docutils-stubs", "flake8", "mypy"] 1911 | test = ["pytest"] 1912 | 1913 | [[package]] 1914 | name = "sphinxcontrib-htmlhelp" 1915 | version = "2.0.1" 1916 | description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" 1917 | optional = false 1918 | python-versions = ">=3.8" 1919 | files = [ 1920 | {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"}, 1921 | {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"}, 1922 | ] 1923 | 1924 | [package.extras] 1925 | lint = ["docutils-stubs", "flake8", "mypy"] 1926 | test = ["html5lib", "pytest"] 1927 | 1928 | [[package]] 1929 | name = "sphinxcontrib-jsmath" 1930 | version = "1.0.1" 1931 | description = "A sphinx extension which renders display math in HTML via JavaScript" 1932 | optional = false 1933 | python-versions = ">=3.5" 1934 | files = [ 1935 | {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, 1936 | {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, 1937 | ] 1938 | 1939 | [package.extras] 1940 | test = ["flake8", "mypy", "pytest"] 1941 | 1942 | [[package]] 1943 | name = "sphinxcontrib-mermaid" 1944 | version = "0.9.2" 1945 | description = "Mermaid diagrams in yours Sphinx powered docs" 1946 | optional = false 1947 | python-versions = ">=3.7" 1948 | files = [ 1949 | {file = "sphinxcontrib-mermaid-0.9.2.tar.gz", hash = "sha256:252ef13dd23164b28f16d8b0205cf184b9d8e2b714a302274d9f59eb708e77af"}, 1950 | {file = "sphinxcontrib_mermaid-0.9.2-py3-none-any.whl", hash = "sha256:6795a72037ca55e65663d2a2c1a043d636dc3d30d418e56dd6087d1459d98a5d"}, 1951 | ] 1952 | 1953 | [[package]] 1954 | name = "sphinxcontrib-qthelp" 1955 | version = "1.0.3" 1956 | description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." 1957 | optional = false 1958 | python-versions = ">=3.5" 1959 | files = [ 1960 | {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, 1961 | {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, 1962 | ] 1963 | 1964 | [package.extras] 1965 | lint = ["docutils-stubs", "flake8", "mypy"] 1966 | test = ["pytest"] 1967 | 1968 | [[package]] 1969 | name = "sphinxcontrib-serializinghtml" 1970 | version = "1.1.5" 1971 | description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." 1972 | optional = false 1973 | python-versions = ">=3.5" 1974 | files = [ 1975 | {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, 1976 | {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, 1977 | ] 1978 | 1979 | [package.extras] 1980 | lint = ["docutils-stubs", "flake8", "mypy"] 1981 | test = ["pytest"] 1982 | 1983 | [[package]] 1984 | name = "stevedore" 1985 | version = "5.1.0" 1986 | description = "Manage dynamic plugins for Python applications" 1987 | optional = false 1988 | python-versions = ">=3.8" 1989 | files = [ 1990 | {file = "stevedore-5.1.0-py3-none-any.whl", hash = "sha256:8cc040628f3cea5d7128f2e76cf486b2251a4e543c7b938f58d9a377f6694a2d"}, 1991 | {file = "stevedore-5.1.0.tar.gz", hash = "sha256:a54534acf9b89bc7ed264807013b505bf07f74dbe4bcfa37d32bd063870b087c"}, 1992 | ] 1993 | 1994 | [package.dependencies] 1995 | pbr = ">=2.0.0,<2.1.0 || >2.1.0" 1996 | 1997 | [[package]] 1998 | name = "strenum" 1999 | version = "0.4.15" 2000 | description = "An Enum that inherits from str." 2001 | optional = false 2002 | python-versions = "*" 2003 | files = [ 2004 | {file = "StrEnum-0.4.15-py3-none-any.whl", hash = "sha256:a30cda4af7cc6b5bf52c8055bc4bf4b2b6b14a93b574626da33df53cf7740659"}, 2005 | {file = "StrEnum-0.4.15.tar.gz", hash = "sha256:878fb5ab705442070e4dd1929bb5e2249511c0bcf2b0eeacf3bcd80875c82eff"}, 2006 | ] 2007 | 2008 | [package.extras] 2009 | docs = ["myst-parser[linkify]", "sphinx", "sphinx-rtd-theme"] 2010 | release = ["twine"] 2011 | test = ["pylint", "pytest", "pytest-black", "pytest-cov", "pytest-pylint"] 2012 | 2013 | [[package]] 2014 | name = "text-unidecode" 2015 | version = "1.3" 2016 | description = "The most basic Text::Unidecode port" 2017 | optional = false 2018 | python-versions = "*" 2019 | files = [ 2020 | {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, 2021 | {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, 2022 | ] 2023 | 2024 | [[package]] 2025 | name = "toml" 2026 | version = "0.10.2" 2027 | description = "Python Library for Tom's Obvious, Minimal Language" 2028 | optional = false 2029 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 2030 | files = [ 2031 | {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, 2032 | {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, 2033 | ] 2034 | 2035 | [[package]] 2036 | name = "tomli" 2037 | version = "2.0.1" 2038 | description = "A lil' TOML parser" 2039 | optional = false 2040 | python-versions = ">=3.7" 2041 | files = [ 2042 | {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, 2043 | {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, 2044 | ] 2045 | 2046 | [[package]] 2047 | name = "tomlkit" 2048 | version = "0.12.1" 2049 | description = "Style preserving TOML library" 2050 | optional = false 2051 | python-versions = ">=3.7" 2052 | files = [ 2053 | {file = "tomlkit-0.12.1-py3-none-any.whl", hash = "sha256:712cbd236609acc6a3e2e97253dfc52d4c2082982a88f61b640ecf0817eab899"}, 2054 | {file = "tomlkit-0.12.1.tar.gz", hash = "sha256:38e1ff8edb991273ec9f6181244a6a391ac30e9f5098e7535640ea6be97a7c86"}, 2055 | ] 2056 | 2057 | [[package]] 2058 | name = "typing-extensions" 2059 | version = "4.7.1" 2060 | description = "Backported and Experimental Type Hints for Python 3.7+" 2061 | optional = false 2062 | python-versions = ">=3.7" 2063 | files = [ 2064 | {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, 2065 | {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, 2066 | ] 2067 | 2068 | [[package]] 2069 | name = "url-normalize" 2070 | version = "1.4.3" 2071 | description = "URL normalization for Python" 2072 | optional = false 2073 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" 2074 | files = [ 2075 | {file = "url-normalize-1.4.3.tar.gz", hash = "sha256:d23d3a070ac52a67b83a1c59a0e68f8608d1cd538783b401bc9de2c0fac999b2"}, 2076 | {file = "url_normalize-1.4.3-py2.py3-none-any.whl", hash = "sha256:ec3c301f04e5bb676d333a7fa162fa977ad2ca04b7e652bfc9fac4e405728eed"}, 2077 | ] 2078 | 2079 | [package.dependencies] 2080 | six = "*" 2081 | 2082 | [[package]] 2083 | name = "urllib3" 2084 | version = "2.0.4" 2085 | description = "HTTP library with thread-safe connection pooling, file post, and more." 2086 | optional = false 2087 | python-versions = ">=3.7" 2088 | files = [ 2089 | {file = "urllib3-2.0.4-py3-none-any.whl", hash = "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4"}, 2090 | {file = "urllib3-2.0.4.tar.gz", hash = "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11"}, 2091 | ] 2092 | 2093 | [package.extras] 2094 | brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] 2095 | secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] 2096 | socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] 2097 | zstd = ["zstandard (>=0.18.0)"] 2098 | 2099 | [[package]] 2100 | name = "wemake-python-styleguide" 2101 | version = "0.18.0" 2102 | description = "The strictest and most opinionated python linter ever" 2103 | optional = false 2104 | python-versions = ">=3.8.1,<4.0" 2105 | files = [ 2106 | {file = "wemake_python_styleguide-0.18.0-py3-none-any.whl", hash = "sha256:2219be145185edcd5e01f4ce49e3dea11acc34f2c377face0c175bb6ea6ac988"}, 2107 | {file = "wemake_python_styleguide-0.18.0.tar.gz", hash = "sha256:69139858cf5b2a9ba09dac136e2873a4685515768f68fdef2684ebefd7b1dafd"}, 2108 | ] 2109 | 2110 | [package.dependencies] 2111 | astor = ">=0.8,<0.9" 2112 | attrs = "*" 2113 | darglint = ">=1.2,<2.0" 2114 | flake8 = ">5" 2115 | flake8-bandit = ">=4.1,<5.0" 2116 | flake8-broken-line = ">=1.0,<2.0" 2117 | flake8-bugbear = ">=23.5,<24.0" 2118 | flake8-commas = ">=2.0,<3.0" 2119 | flake8-comprehensions = ">=3.1,<4.0" 2120 | flake8-debugger = ">=4.0,<5.0" 2121 | flake8-docstrings = ">=1.3,<2.0" 2122 | flake8-eradicate = ">=1.5,<2.0" 2123 | flake8-isort = ">=6.0,<7.0" 2124 | flake8-quotes = ">=3.0,<4.0" 2125 | flake8-rst-docstrings = ">=0.3,<0.4" 2126 | flake8-string-format = ">=0.3,<0.4" 2127 | pep8-naming = ">=0.13,<0.14" 2128 | pygments = ">=2.4,<3.0" 2129 | setuptools = "*" 2130 | typing_extensions = ">=4.0,<5.0" 2131 | 2132 | [[package]] 2133 | name = "win32-setctime" 2134 | version = "1.1.0" 2135 | description = "A small Python utility to set file creation time on Windows" 2136 | optional = false 2137 | python-versions = ">=3.5" 2138 | files = [ 2139 | {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, 2140 | {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, 2141 | ] 2142 | 2143 | [package.extras] 2144 | dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] 2145 | 2146 | [[package]] 2147 | name = "zipp" 2148 | version = "3.16.2" 2149 | description = "Backport of pathlib-compatible object wrapper for zip files" 2150 | optional = false 2151 | python-versions = ">=3.8" 2152 | files = [ 2153 | {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, 2154 | {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, 2155 | ] 2156 | 2157 | [package.extras] 2158 | docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] 2159 | testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] 2160 | 2161 | [metadata] 2162 | lock-version = "2.0" 2163 | python-versions = ">=3.8.1,<4" 2164 | content-hash = "5ee23a216a2726faab74bcb9cce3a16de6a1e9fc187ed22d729de06b85d11993" 2165 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "lambdas" 3 | version = "0.2.0" 4 | description = "Typed lambdas that are short and readable" 5 | license = "BSD-2-Clause" 6 | 7 | authors = [ 8 | "sobolevn " 9 | ] 10 | 11 | readme = "README.md" 12 | 13 | repository = "https://github.com/dry-python/lambdas" 14 | homepage = "https://lambdas.readthedocs.io" 15 | 16 | keywords = [ 17 | "functional programming", 18 | "fp", 19 | "lambda", 20 | "lambdas", 21 | "composition", 22 | "type-safety", 23 | "mypy", 24 | "stubs" 25 | ] 26 | 27 | classifiers = [ 28 | "Development Status :: 4 - Beta", 29 | "Intended Audience :: Developers", 30 | "Operating System :: OS Independent", 31 | "Topic :: Software Development :: Libraries :: Python Modules", 32 | "Topic :: Utilities", 33 | "Typing :: Typed" 34 | ] 35 | 36 | [tool.poetry.dependencies] 37 | python = ">=3.8.1,<4" 38 | typing-extensions = ">=4.0,<5.0" 39 | 40 | [tool.poetry.group.dev.dependencies] 41 | mypy = "^1.5.1" 42 | 43 | wemake-python-styleguide = "^0.18" 44 | flake8-pytest = "^1.4" 45 | flake8-pytest-style = "^1.7" 46 | flake8-pyi = "^23.6" 47 | nitpick = "^0.34" 48 | 49 | safety = "^2.3" 50 | 51 | pytest = "^7.4" 52 | pytest-cov = "^4.1" 53 | pytest-randomly = "^3.15" 54 | pytest-mypy-plugins = "^3.0" 55 | 56 | doc8 = "^1.1" 57 | 58 | [tool.poetry.group.docs] 59 | optional = true 60 | 61 | [tool.poetry.group.docs.dependencies] 62 | sphinx = "^6.2" 63 | sphinx-autodoc-typehints = "^1.23" 64 | sphinxcontrib-mermaid = "^0.9" 65 | sphinx-typlog-theme = "^0.8" 66 | m2r2 = "^0.3" 67 | tomlkit = "^0.12" 68 | pygments = "^2.16" 69 | 70 | [tool.nitpick] 71 | style = "https://raw.githubusercontent.com/wemake-services/wemake-python-styleguide/0.18.0/styles/nitpick-style-wemake.toml" 72 | 73 | [build-system] 74 | requires = ["poetry-core>=1.6.0"] 75 | build-backend = "poetry.core.masonry.api" 76 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | # All configuration for plugins and other utils is defined here. 2 | # Read more about `setup.cfg`: 3 | # https://docs.python.org/3/distutils/configfile.html 4 | 5 | 6 | [coverage:run] 7 | omit = 8 | # We test mypy plugins with `pytest-mypy-plugins`, 9 | # which does not work with coverage: 10 | lambdas/contrib/mypy/* 11 | 12 | 13 | [flake8] 14 | format = wemake 15 | show-source = True 16 | doctests = False 17 | enable-extensions = G 18 | statistics = False 19 | 20 | # darglint configuration: 21 | # https://github.com/terrencepreilly/darglint 22 | strictness = long 23 | docstring-style = numpy 24 | 25 | # Plugins: 26 | accept-encodings = utf-8 27 | max-complexity = 6 28 | max-line-length = 80 29 | radon-max-cc = 10 30 | radon-no-assert = True 31 | radon-show-closures = True 32 | 33 | # wemake-python-styleguide 34 | max-line-complexity = 16 35 | i-control-code = False 36 | 37 | exclude = 38 | # Trash and cache: 39 | .git 40 | __pycache__ 41 | .venv 42 | .eggs 43 | *.egg 44 | temp 45 | # Bad code that I write to test things: 46 | ex.py 47 | 48 | ignore = 49 | D100, 50 | D104, 51 | D401, 52 | W504, 53 | X100, 54 | WPS121, 55 | RST303, 56 | RST304, 57 | WPS204, 58 | DAR103, 59 | DAR203, 60 | 61 | per-file-ignores = 62 | # Disable imports in `__init__.py`: 63 | lambdas/__init__.py: WPS226, WPS413 64 | lambdas/contrib/mypy/lambdas_plugin.py: WPS437 65 | # There are multiple assert's in tests: 66 | tests/*.py: S101, WPS226, WPS432, WPS436, WPS450 67 | # We need to write tests to our private class: 68 | tests/test_math_expression/*.py: S101, WPS432, WPS450 69 | 70 | 71 | [tool:pytest] 72 | # py.test options: 73 | norecursedirs = temp *.egg .eggs dist build docs .tox .git __pycache__ 74 | 75 | # You will need to measure your tests speed with `-n auto` and without it, 76 | # so you can see whether it gives you any performance gain, or just gives 77 | # you an overhead. See `docs/template/development-process.rst`. 78 | addopts = 79 | --doctest-modules 80 | --cov=lambdas 81 | --cov-report=term:skip-covered 82 | --cov-report=html 83 | --cov-report=xml 84 | --cov-branch 85 | --cov-fail-under=100 86 | --mypy-ini-file=setup.cfg 87 | 88 | 89 | [isort] 90 | # isort configuration: 91 | # https://pycqa.github.io/isort/docs/configuration/profiles.html 92 | profile = wemake 93 | 94 | 95 | [mypy] 96 | # mypy configurations: http://bit.ly/2zEl9WI 97 | 98 | # Plugins, includes custom: 99 | plugins = 100 | lambdas.contrib.mypy.lambdas_plugin 101 | 102 | allow_redefinition = False 103 | check_untyped_defs = True 104 | disallow_any_explicit = True 105 | disallow_any_generics = True 106 | # disallow_untyped_calls = True 107 | ignore_errors = False 108 | ignore_missing_imports = True 109 | implicit_reexport = False 110 | strict_optional = True 111 | strict_equality = True 112 | no_implicit_optional = True 113 | local_partial_types = True 114 | warn_no_return = True 115 | warn_unused_ignores = True 116 | warn_redundant_casts = True 117 | warn_unused_configs = True 118 | warn_unreachable = True 119 | 120 | 121 | [doc8] 122 | ignore-path = docs/_build 123 | max-line-length = 80 124 | sphinx = True 125 | -------------------------------------------------------------------------------- /tests/test_callable/test_add.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from lambdas import _ 4 | 5 | 6 | def test_add(): 7 | """Ensures that add works correctly.""" 8 | assert (_ + 2)(1) + 1 == 4 9 | 10 | 11 | def test_radd(): 12 | """Ensures that add works correctly.""" 13 | assert (2 + _)(1) == (_ + 2)(1) 14 | -------------------------------------------------------------------------------- /tests/test_callable/test_complex_expression.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import math 4 | 5 | from lambdas import _ 6 | 7 | 8 | def test_complex_expression(): 9 | """Ensures that add works correctly.""" 10 | complex_expression = ((10 ** 5) / (_ % 3) * 9) 11 | assert math.isclose(complex_expression(5), 450000.0) # type: ignore 12 | -------------------------------------------------------------------------------- /tests/test_callable/test_floordiv.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from lambdas import _ 4 | 5 | 6 | def test_floordiv(): 7 | """Ensures that add works correctly.""" 8 | assert (_ // 5)(33) == 6 9 | 10 | 11 | def test_rfloordiv(): 12 | """Ensures that add works correctly.""" 13 | assert (_ // 5)(33) == (33 // _)(5) 14 | -------------------------------------------------------------------------------- /tests/test_callable/test_getattr.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from lambdas import _ 4 | 5 | 6 | class _ForTest(object): 7 | def __init__(self) -> None: 8 | self.first = 1 9 | self.second = 'a' 10 | 11 | 12 | def test_getattr_attr(): 13 | """Ensures that getattr works correctly.""" 14 | assert (_.first)(_ForTest()) + 1 == 2 15 | assert (_.second)(_ForTest()) == 'a' 16 | -------------------------------------------------------------------------------- /tests/test_callable/test_getitem.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from lambdas import _ 4 | 5 | 6 | def test_getitem(): 7 | """Ensures that getitem works correctly.""" 8 | assert _['a']({'a': 1}) + 2 == 3 9 | assert _[0]({0: 'a'}) + 'b' == 'ab' # noqa: WPS336 10 | -------------------------------------------------------------------------------- /tests/test_callable/test_mod.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from lambdas import _ 4 | 5 | 6 | def test_mod(): 7 | """Ensures that add works correctly.""" 8 | assert (_ % 35)(140) == 0 9 | 10 | 11 | def test_rmod(): 12 | """Ensures that add works correctly.""" 13 | assert (149 % _)(36) == (_ % 36)(149) 14 | -------------------------------------------------------------------------------- /tests/test_callable/test_mul.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from lambdas import _ 4 | 5 | 6 | def test_mul(): 7 | """Ensures that add works correctly.""" 8 | assert (_ * 20)(10) == 200 9 | 10 | 11 | def test_rmul(): 12 | """Ensures that add works correctly.""" 13 | assert (99 * _)(4) == (_ * 99)(4) 14 | -------------------------------------------------------------------------------- /tests/test_callable/test_pow.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from lambdas import _ 4 | 5 | 6 | def test_pow(): 7 | """Ensures that add works correctly.""" 8 | assert (_ ** 3)(2) == 8 9 | 10 | 11 | def test_rpow(): 12 | """Ensures that add works correctly.""" 13 | assert (3 ** _)(4) == (_ ** 4)(3) 14 | -------------------------------------------------------------------------------- /tests/test_callable/test_sub.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from lambdas import _ 4 | 5 | 6 | def test_sub(): 7 | """Ensures that add works correctly.""" 8 | assert (_ - 10)(1) + 1 == -8 9 | 10 | 11 | def test_rsub(): 12 | """Ensures that add works correctly.""" 13 | assert (10 - _)(1) + (_ - 10)(1) == 0 14 | -------------------------------------------------------------------------------- /tests/test_callable/test_truediv.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import math 4 | 5 | from lambdas import _ 6 | 7 | 8 | def test_truediv(): 9 | """Ensures that add works correctly.""" 10 | math_expression = (_ / 6) 11 | assert math.isclose(math_expression(39), 6.5) # type: ignore 12 | 13 | 14 | def test_rtruediv(): 15 | """Ensures that add works correctly.""" 16 | assert (42 / _)(8) == (_ / 8)(42) 17 | -------------------------------------------------------------------------------- /tests/test_callable/test_unary/test_negate.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from lambdas import _ 4 | 5 | 6 | def test_negate(): 7 | """Ensures that negate works correctly.""" 8 | assert (-_)(1) - 1 == -2 9 | -------------------------------------------------------------------------------- /tests/test_math_expression/test_add_expression.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from lambdas import _MathExpression 4 | 5 | 6 | def test_add(): 7 | """Ensures that add works correctly.""" 8 | add = _MathExpression() + 2 9 | assert add(1) + 1 == 4 10 | 11 | 12 | def test_radd(): 13 | """Ensures that add works correctly.""" 14 | add = _MathExpression() + 2 15 | radd = 2 + _MathExpression() 16 | assert add(1) == radd(1) 17 | -------------------------------------------------------------------------------- /tests/test_math_expression/test_complex_math_expression.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from lambdas import _MathExpression 4 | 5 | 6 | def test_complex_expression(): 7 | """Ensures that add works correctly.""" 8 | complex_expression = _MathExpression() * 2 + 1 9 | assert complex_expression(1) == 3 10 | -------------------------------------------------------------------------------- /tests/test_math_expression/test_floordiv_expression.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from lambdas import _MathExpression 4 | 5 | 6 | def test_floordiv(): 7 | """Ensures that add works correctly.""" 8 | floordiv = _MathExpression() // 2 9 | assert floordiv(5) == 2 10 | 11 | 12 | def test_rfloordiv(): 13 | """Ensures that add works correctly.""" 14 | floordiv = _MathExpression() // 2 15 | rfloordiv = 5 // _MathExpression() 16 | assert floordiv(5) == rfloordiv(2) 17 | -------------------------------------------------------------------------------- /tests/test_math_expression/test_mod_expression.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from lambdas import _MathExpression 4 | 5 | 6 | def test_mod(): 7 | """Ensures that add works correctly.""" 8 | mod = _MathExpression() % 3 9 | assert mod(25) == 1 10 | 11 | 12 | def test_rmod(): 13 | """Ensures that add works correctly.""" 14 | mod = _MathExpression() % 3 15 | rmod = 25 % _MathExpression() 16 | assert mod(25) == rmod(3) 17 | -------------------------------------------------------------------------------- /tests/test_math_expression/test_mul_expression.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from lambdas import _MathExpression 4 | 5 | 6 | def test_mul(): 7 | """Ensures that add works correctly.""" 8 | mul = _MathExpression() * 10 9 | assert mul(10) == 100 10 | 11 | 12 | def test_rmul(): 13 | """Ensures that add works correctly.""" 14 | mul = _MathExpression() * 2 15 | rmul = 2 * _MathExpression() 16 | assert mul(4) == rmul(4) 17 | -------------------------------------------------------------------------------- /tests/test_math_expression/test_pow_expression.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from lambdas import _MathExpression 4 | 5 | 6 | def test_pow(): 7 | """Ensures that add works correctly.""" 8 | pow_ = _MathExpression() ** 2 9 | assert pow_(3) == 9 10 | 11 | 12 | def test_rpow(): 13 | """Ensures that add works correctly.""" 14 | pow_ = _MathExpression() ** 2 15 | rpow = 3 ** _MathExpression() 16 | assert pow_(3) == rpow(2) 17 | -------------------------------------------------------------------------------- /tests/test_math_expression/test_sub_expression.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from lambdas import _MathExpression 4 | 5 | 6 | def test_sub(): 7 | """Ensures that add works correctly.""" 8 | sub = _MathExpression() - 4 9 | assert sub(4) == 0 10 | 11 | 12 | def test_rsub(): 13 | """Ensures that add works correctly.""" 14 | sub = _MathExpression() - 4 15 | rsub = 4 - _MathExpression() 16 | assert rsub(1) + sub(1) == 0 17 | -------------------------------------------------------------------------------- /tests/test_math_expression/test_truediv_expression.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import math 4 | 5 | from lambdas import _MathExpression 6 | 7 | 8 | def test_truediv(): 9 | """Ensures that add works correctly.""" 10 | truediv = _MathExpression() / 2 11 | assert math.isclose(truediv(9), 4.5) # type: ignore 12 | 13 | 14 | def test_rtruediv(): 15 | """Ensures that add works correctly.""" 16 | truediv = _MathExpression() / 2 17 | rtruediv = 9 / _MathExpression() 18 | assert truediv(9) == rtruediv(2) 19 | -------------------------------------------------------------------------------- /typesafety/test_add_type.yml: -------------------------------------------------------------------------------- 1 | - case: callable_add_correct 2 | disable_cache: true 3 | main: | 4 | from lambdas import _ 5 | 6 | reveal_type((_ + 1)(2)) # N: Revealed type is "Union[builtins.int, builtins.float, builtins.complex]" 7 | 8 | 9 | - case: callable_add_wrong_bellow_py310 10 | skip: sys.version_info[:2] >= (3, 10) 11 | disable_cache: true 12 | main: | 13 | from lambdas import _ 14 | 15 | reveal_type((_ + 1)('a')) 16 | out: | 17 | main:3: note: Revealed type is "Union[builtins.int, builtins.float, builtins.complex]" 18 | main:3: error: Argument 1 to "__call__" of "_MathExpression" has incompatible type "str"; expected "Union[int, float, complex]" [arg-type] 19 | 20 | - case: callable_add_above_py39 21 | skip: sys.version_info[:2] <= (3, 9) 22 | disable_cache: true 23 | main: | 24 | from lambdas import _ 25 | 26 | reveal_type((_ + 1)('a')) 27 | out: | 28 | main:3: note: Revealed type is "Union[builtins.int, builtins.float, builtins.complex]" 29 | main:3: error: Argument 1 to "__call__" of "_MathExpression" has incompatible type "str"; expected "int | float | complex" [arg-type] 30 | -------------------------------------------------------------------------------- /typesafety/test_getattr.yml: -------------------------------------------------------------------------------- 1 | - case: callable_getattr_attr_correct 2 | disable_cache: true 3 | main: | 4 | from lambdas import _ 5 | 6 | class Test(object): 7 | attr: int 8 | 9 | reveal_type((_.attr)(Test())) # N: Revealed type is "builtins.int" 10 | 11 | 12 | - case: callable_getattr_attr_incorrect 13 | disable_cache: true 14 | main: | 15 | from lambdas import _ 16 | 17 | class Test(object): 18 | other: int 19 | 20 | reveal_type((_.attr)(Test())) 21 | out: | 22 | main:6: note: Revealed type is "" 23 | main:6: error: Argument 1 has incompatible type "Test"; expected "_LambdaDynamicProtocol[]" [arg-type] 24 | -------------------------------------------------------------------------------- /typesafety/test_getitem_type.yml: -------------------------------------------------------------------------------- 1 | - case: callable_getitem_correct1 2 | disable_cache: true 3 | main: | 4 | from lambdas import _ 5 | 6 | reveal_type(_['item']({'item': 1})) # N: Revealed type is "builtins.int" 7 | 8 | 9 | - case: callable_getitem_correct2 10 | disable_cache: true 11 | main: | 12 | from lambdas import _ 13 | 14 | reveal_type(_[1]({1: 'str'})) # N: Revealed type is "builtins.str" 15 | 16 | 17 | - case: collable_getitem_wrong 18 | disable_cache: true 19 | main: | 20 | from lambdas import _ 21 | 22 | reveal_type(_[0]({'item': 1})) 23 | out: | 24 | main:3: note: Revealed type is "builtins.int" 25 | main:3: error: Dict entry 0 has incompatible type "str": "int"; expected "int": "int" [dict-item] 26 | 27 | -------------------------------------------------------------------------------- /typesafety/test_negate_type.yml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dry-python/lambdas/eb89d3704eec9c0683b2e058ebadc9bc28feb055/typesafety/test_negate_type.yml --------------------------------------------------------------------------------