├── .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 | [](https://github.com/dry-python/lambdas)
2 |
3 | -----
4 |
5 | [](https://github.com/dry-python/lambdas/actions?query=workflow%3Atest)
6 | [](https://codecov.io/gh/dry-python/lambdas)
7 | [](https://lambdas.readthedocs.io/en/latest/?badge=latest)
8 | [](https://pypi.org/project/lambdas/)
9 | [](https://github.com/wemake-services/wemake-python-styleguide)
10 | [](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
--------------------------------------------------------------------------------