summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--python-pytest-mypy-plugins.spec630
-rw-r--r--sources1
3 files changed, 632 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..bb2459b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/pytest-mypy-plugins-1.10.1.tar.gz
diff --git a/python-pytest-mypy-plugins.spec b/python-pytest-mypy-plugins.spec
new file mode 100644
index 0000000..435f52e
--- /dev/null
+++ b/python-pytest-mypy-plugins.spec
@@ -0,0 +1,630 @@
+%global _empty_manifest_terminate_build 0
+Name: python-pytest-mypy-plugins
+Version: 1.10.1
+Release: 1
+Summary: pytest plugin for writing tests for mypy plugins
+License: MIT
+URL: https://github.com/TypedDjango/pytest-mypy-plugins
+Source0: https://mirrors.nju.edu.cn/pypi/web/packages/26/a3/0823c09b0d1fc23616d0e208e78e320b04e47986d83628ea12ab68db4779/pytest-mypy-plugins-1.10.1.tar.gz
+BuildArch: noarch
+
+Requires: python3-pytest
+Requires: python3-mypy
+Requires: python3-decorator
+Requires: python3-pyyaml
+Requires: python3-chevron
+Requires: python3-regex
+
+%description
+<img src="http://mypy-lang.org/static/mypy_light.svg" alt="mypy logo" width="300px"/>
+
+# pytest plugin for testing mypy types, stubs, and plugins
+
+[![Tests Status](https://github.com/typeddjango/pytest-mypy-plugins/actions/workflows/test.yml/badge.svg)](https://github.com/typeddjango/pytest-mypy-plugins/actions/workflows/test.yml)
+[![Checked with mypy](http://www.mypy-lang.org/static/mypy_badge.svg)](http://mypy-lang.org/)
+[![Gitter](https://badges.gitter.im/mypy-django/Lobby.svg)](https://gitter.im/mypy-django/Lobby)
+[![PyPI](https://img.shields.io/pypi/v/pytest-mypy-plugins?color=blue)](https://pypi.org/project/pytest-mypy-plugins/)
+[![Conda Version](https://img.shields.io/conda/vn/conda-forge/pytest-mypy-plugins.svg?color=blue)](https://anaconda.org/conda-forge/pytest-mypy-plugins)
+
+## Installation
+
+This package is available on [PyPI](https://pypi.org/project/pytest-mypy-plugins/)
+
+```bash
+pip install pytest-mypy-plugins
+```
+
+and [conda-forge](https://anaconda.org/conda-forge/pytest-mypy-plugins)
+
+```bash
+conda install -c conda-forge pytest-mypy-plugins
+```
+
+## Usage
+
+### Running
+
+Plugin, after installation, is automatically picked up by `pytest` therefore it is sufficient to
+just execute:
+
+```bash
+pytest
+```
+
+### Paths
+
+The `PYTHONPATH` and `MYPYPATH` environment variables, if set, are passed to `mypy` on invocation.
+This may be helpful if you are testing a local plugin and need to provide an import path to it.
+
+Be aware that when `mypy` is run in a subprocess (the default) the test cases are run in temporary working directories
+where relative paths such as `PYTHONPATH=./my_plugin` do not reference the directory which you are running `pytest` from.
+If you encounter this, consider invoking `pytest` with `--mypy-same-process` or make your paths absolute,
+e.g. `PYTHONPATH=$(pwd)/my_plugin pytest`.
+
+You can also specify `PYTHONPATH`, `MYPYPATH`, or any other environment variable in `env:` section of `yml` spec:
+
+```yml
+- case: mypy_path_from_env
+ main: |
+ from pair import Pair
+
+ instance: Pair
+ reveal_type(instance) # N: Revealed type is 'pair.Pair'
+ env:
+ - MYPYPATH=../fixtures
+```
+
+
+### What is a test case?
+
+In general each test case is just an element in an array written in a properly formatted `YAML` file.
+On top of that, each case must comply to following types:
+
+| Property | Type | Description |
+| --------------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------- |
+| `case` | `str` | Name of the test case, complies to `[a-zA-Z0-9]` pattern |
+| `main` | `str` | Portion of the code as if written in `.py` file |
+| `files` | `Optional[List[File]]=[]`\* | List of extra files to simulate imports if needed |
+| `disable_cache` | `Optional[bool]=False` | Set to `true` disables `mypy` caching |
+| `mypy_config` | `Optional[Dict[str, Union[str, int, bool, float]]]={}` | Inline `mypy` configuration, passed directly to `mypy` as `--config-file` option |
+| `env` | `Optional[Dict[str, str]]={}` | Environmental variables to be provided inside of test run |
+| `parametrized` | `Optional[List[Parameter]]=[]`\* | List of parameters, similar to [`@pytest.mark.parametrize`](https://docs.pytest.org/en/stable/parametrize.html) |
+| `skip` | `str` | Expression evaluated with following globals set: `sys`, `os`, `pytest` and `platform` |
+| `expect_fail` | `bool` | Mark test case as an expected failure, like [`@pytest.mark.xfail`](https://docs.pytest.org/en/stable/skipping.html) |
+| `regex` | `str` | Allow regular expressions in comments to be matched against actual output. Defaults to "no", i.e. matches full text.|
+
+(*) Appendix to **pseudo** types used above:
+
+```python
+class File:
+ path: str
+ content: Optional[str] = None
+Parameter = Mapping[str, Any]
+```
+
+Implementation notes:
+
+- `main` must be non-empty string that evaluates to valid **Python** code,
+- `content` of each of extra files must evaluate to valid **Python** code,
+- `parametrized` entries must all be the objects of the same _type_. It simply means that each
+ entry must have **exact** same set of keys,
+- `skip` - an expression set in `skip` is passed directly into
+ [`eval`](https://docs.python.org/3/library/functions.html#eval). It is advised to take a peek and
+ learn about how `eval` works.
+
+### Example
+
+#### 1. Inline type expectations
+
+```yaml
+# typesafety/test_request.yml
+- case: request_object_has_user_of_type_auth_user_model
+ main: |
+ from django.http.request import HttpRequest
+ reveal_type(HttpRequest().user) # N: Revealed type is 'myapp.models.MyUser'
+ # check that other fields work ok
+ reveal_type(HttpRequest().method) # N: Revealed type is 'Union[builtins.str, None]'
+ files:
+ - path: myapp/__init__.py
+ - path: myapp/models.py
+ content: |
+ from django.db import models
+ class MyUser(models.Model):
+ pass
+```
+
+#### 2. `@parametrized`
+
+```yaml
+- case: with_params
+ parametrized:
+ - val: 1
+ rt: builtins.int
+ - val: 1.0
+ rt: builtins.float
+ main: |
+ reveal_type({{ val }}) # N: Revealed type is '{{ rt }}'
+```
+
+#### 3. Longer type expectations
+
+```yaml
+- case: with_out
+ main: |
+ reveal_type('abc')
+ out: |
+ main:1: note: Revealed type is 'builtins.str'
+```
+
+#### 4. Regular expressions in expectations
+
+```yaml
+- case: expected_message_regex_with_out
+ regex: yes
+ main: |
+ a = 'abc'
+ reveal_type(a)
+ out: |
+ main:2: note: .*str.*
+```
+
+#### 5. Regular expressions specific lines of output.
+
+```yaml
+- case: expected_single_message_regex
+ main: |
+ a = 'hello'
+ reveal_type(a) # NR: .*str.*
+```
+
+## Options
+
+```
+mypy-tests:
+ --mypy-testing-base=MYPY_TESTING_BASE
+ Base directory for tests to use
+ --mypy-ini-file=MYPY_INI_FILE
+ Which .ini file to use as a default config for tests
+ --mypy-same-process Run in the same process. Useful for debugging, will create problems with import cache
+ --mypy-extension-hook=MYPY_EXTENSION_HOOK
+ Fully qualified path to the extension hook function, in case you need custom yaml keys. Has to be top-level.
+ --mypy-only-local-stub
+ mypy will ignore errors from site-packages
+
+```
+
+## Further reading
+
+- [Testing mypy stubs, plugins, and types](https://sobolevn.me/2019/08/testing-mypy-types)
+
+## License
+
+[MIT](https://github.com/typeddjango/pytest-mypy-plugins/blob/master/LICENSE)
+
+
+%package -n python3-pytest-mypy-plugins
+Summary: pytest plugin for writing tests for mypy plugins
+Provides: python-pytest-mypy-plugins
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-pytest-mypy-plugins
+<img src="http://mypy-lang.org/static/mypy_light.svg" alt="mypy logo" width="300px"/>
+
+# pytest plugin for testing mypy types, stubs, and plugins
+
+[![Tests Status](https://github.com/typeddjango/pytest-mypy-plugins/actions/workflows/test.yml/badge.svg)](https://github.com/typeddjango/pytest-mypy-plugins/actions/workflows/test.yml)
+[![Checked with mypy](http://www.mypy-lang.org/static/mypy_badge.svg)](http://mypy-lang.org/)
+[![Gitter](https://badges.gitter.im/mypy-django/Lobby.svg)](https://gitter.im/mypy-django/Lobby)
+[![PyPI](https://img.shields.io/pypi/v/pytest-mypy-plugins?color=blue)](https://pypi.org/project/pytest-mypy-plugins/)
+[![Conda Version](https://img.shields.io/conda/vn/conda-forge/pytest-mypy-plugins.svg?color=blue)](https://anaconda.org/conda-forge/pytest-mypy-plugins)
+
+## Installation
+
+This package is available on [PyPI](https://pypi.org/project/pytest-mypy-plugins/)
+
+```bash
+pip install pytest-mypy-plugins
+```
+
+and [conda-forge](https://anaconda.org/conda-forge/pytest-mypy-plugins)
+
+```bash
+conda install -c conda-forge pytest-mypy-plugins
+```
+
+## Usage
+
+### Running
+
+Plugin, after installation, is automatically picked up by `pytest` therefore it is sufficient to
+just execute:
+
+```bash
+pytest
+```
+
+### Paths
+
+The `PYTHONPATH` and `MYPYPATH` environment variables, if set, are passed to `mypy` on invocation.
+This may be helpful if you are testing a local plugin and need to provide an import path to it.
+
+Be aware that when `mypy` is run in a subprocess (the default) the test cases are run in temporary working directories
+where relative paths such as `PYTHONPATH=./my_plugin` do not reference the directory which you are running `pytest` from.
+If you encounter this, consider invoking `pytest` with `--mypy-same-process` or make your paths absolute,
+e.g. `PYTHONPATH=$(pwd)/my_plugin pytest`.
+
+You can also specify `PYTHONPATH`, `MYPYPATH`, or any other environment variable in `env:` section of `yml` spec:
+
+```yml
+- case: mypy_path_from_env
+ main: |
+ from pair import Pair
+
+ instance: Pair
+ reveal_type(instance) # N: Revealed type is 'pair.Pair'
+ env:
+ - MYPYPATH=../fixtures
+```
+
+
+### What is a test case?
+
+In general each test case is just an element in an array written in a properly formatted `YAML` file.
+On top of that, each case must comply to following types:
+
+| Property | Type | Description |
+| --------------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------- |
+| `case` | `str` | Name of the test case, complies to `[a-zA-Z0-9]` pattern |
+| `main` | `str` | Portion of the code as if written in `.py` file |
+| `files` | `Optional[List[File]]=[]`\* | List of extra files to simulate imports if needed |
+| `disable_cache` | `Optional[bool]=False` | Set to `true` disables `mypy` caching |
+| `mypy_config` | `Optional[Dict[str, Union[str, int, bool, float]]]={}` | Inline `mypy` configuration, passed directly to `mypy` as `--config-file` option |
+| `env` | `Optional[Dict[str, str]]={}` | Environmental variables to be provided inside of test run |
+| `parametrized` | `Optional[List[Parameter]]=[]`\* | List of parameters, similar to [`@pytest.mark.parametrize`](https://docs.pytest.org/en/stable/parametrize.html) |
+| `skip` | `str` | Expression evaluated with following globals set: `sys`, `os`, `pytest` and `platform` |
+| `expect_fail` | `bool` | Mark test case as an expected failure, like [`@pytest.mark.xfail`](https://docs.pytest.org/en/stable/skipping.html) |
+| `regex` | `str` | Allow regular expressions in comments to be matched against actual output. Defaults to "no", i.e. matches full text.|
+
+(*) Appendix to **pseudo** types used above:
+
+```python
+class File:
+ path: str
+ content: Optional[str] = None
+Parameter = Mapping[str, Any]
+```
+
+Implementation notes:
+
+- `main` must be non-empty string that evaluates to valid **Python** code,
+- `content` of each of extra files must evaluate to valid **Python** code,
+- `parametrized` entries must all be the objects of the same _type_. It simply means that each
+ entry must have **exact** same set of keys,
+- `skip` - an expression set in `skip` is passed directly into
+ [`eval`](https://docs.python.org/3/library/functions.html#eval). It is advised to take a peek and
+ learn about how `eval` works.
+
+### Example
+
+#### 1. Inline type expectations
+
+```yaml
+# typesafety/test_request.yml
+- case: request_object_has_user_of_type_auth_user_model
+ main: |
+ from django.http.request import HttpRequest
+ reveal_type(HttpRequest().user) # N: Revealed type is 'myapp.models.MyUser'
+ # check that other fields work ok
+ reveal_type(HttpRequest().method) # N: Revealed type is 'Union[builtins.str, None]'
+ files:
+ - path: myapp/__init__.py
+ - path: myapp/models.py
+ content: |
+ from django.db import models
+ class MyUser(models.Model):
+ pass
+```
+
+#### 2. `@parametrized`
+
+```yaml
+- case: with_params
+ parametrized:
+ - val: 1
+ rt: builtins.int
+ - val: 1.0
+ rt: builtins.float
+ main: |
+ reveal_type({{ val }}) # N: Revealed type is '{{ rt }}'
+```
+
+#### 3. Longer type expectations
+
+```yaml
+- case: with_out
+ main: |
+ reveal_type('abc')
+ out: |
+ main:1: note: Revealed type is 'builtins.str'
+```
+
+#### 4. Regular expressions in expectations
+
+```yaml
+- case: expected_message_regex_with_out
+ regex: yes
+ main: |
+ a = 'abc'
+ reveal_type(a)
+ out: |
+ main:2: note: .*str.*
+```
+
+#### 5. Regular expressions specific lines of output.
+
+```yaml
+- case: expected_single_message_regex
+ main: |
+ a = 'hello'
+ reveal_type(a) # NR: .*str.*
+```
+
+## Options
+
+```
+mypy-tests:
+ --mypy-testing-base=MYPY_TESTING_BASE
+ Base directory for tests to use
+ --mypy-ini-file=MYPY_INI_FILE
+ Which .ini file to use as a default config for tests
+ --mypy-same-process Run in the same process. Useful for debugging, will create problems with import cache
+ --mypy-extension-hook=MYPY_EXTENSION_HOOK
+ Fully qualified path to the extension hook function, in case you need custom yaml keys. Has to be top-level.
+ --mypy-only-local-stub
+ mypy will ignore errors from site-packages
+
+```
+
+## Further reading
+
+- [Testing mypy stubs, plugins, and types](https://sobolevn.me/2019/08/testing-mypy-types)
+
+## License
+
+[MIT](https://github.com/typeddjango/pytest-mypy-plugins/blob/master/LICENSE)
+
+
+%package help
+Summary: Development documents and examples for pytest-mypy-plugins
+Provides: python3-pytest-mypy-plugins-doc
+%description help
+<img src="http://mypy-lang.org/static/mypy_light.svg" alt="mypy logo" width="300px"/>
+
+# pytest plugin for testing mypy types, stubs, and plugins
+
+[![Tests Status](https://github.com/typeddjango/pytest-mypy-plugins/actions/workflows/test.yml/badge.svg)](https://github.com/typeddjango/pytest-mypy-plugins/actions/workflows/test.yml)
+[![Checked with mypy](http://www.mypy-lang.org/static/mypy_badge.svg)](http://mypy-lang.org/)
+[![Gitter](https://badges.gitter.im/mypy-django/Lobby.svg)](https://gitter.im/mypy-django/Lobby)
+[![PyPI](https://img.shields.io/pypi/v/pytest-mypy-plugins?color=blue)](https://pypi.org/project/pytest-mypy-plugins/)
+[![Conda Version](https://img.shields.io/conda/vn/conda-forge/pytest-mypy-plugins.svg?color=blue)](https://anaconda.org/conda-forge/pytest-mypy-plugins)
+
+## Installation
+
+This package is available on [PyPI](https://pypi.org/project/pytest-mypy-plugins/)
+
+```bash
+pip install pytest-mypy-plugins
+```
+
+and [conda-forge](https://anaconda.org/conda-forge/pytest-mypy-plugins)
+
+```bash
+conda install -c conda-forge pytest-mypy-plugins
+```
+
+## Usage
+
+### Running
+
+Plugin, after installation, is automatically picked up by `pytest` therefore it is sufficient to
+just execute:
+
+```bash
+pytest
+```
+
+### Paths
+
+The `PYTHONPATH` and `MYPYPATH` environment variables, if set, are passed to `mypy` on invocation.
+This may be helpful if you are testing a local plugin and need to provide an import path to it.
+
+Be aware that when `mypy` is run in a subprocess (the default) the test cases are run in temporary working directories
+where relative paths such as `PYTHONPATH=./my_plugin` do not reference the directory which you are running `pytest` from.
+If you encounter this, consider invoking `pytest` with `--mypy-same-process` or make your paths absolute,
+e.g. `PYTHONPATH=$(pwd)/my_plugin pytest`.
+
+You can also specify `PYTHONPATH`, `MYPYPATH`, or any other environment variable in `env:` section of `yml` spec:
+
+```yml
+- case: mypy_path_from_env
+ main: |
+ from pair import Pair
+
+ instance: Pair
+ reveal_type(instance) # N: Revealed type is 'pair.Pair'
+ env:
+ - MYPYPATH=../fixtures
+```
+
+
+### What is a test case?
+
+In general each test case is just an element in an array written in a properly formatted `YAML` file.
+On top of that, each case must comply to following types:
+
+| Property | Type | Description |
+| --------------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------- |
+| `case` | `str` | Name of the test case, complies to `[a-zA-Z0-9]` pattern |
+| `main` | `str` | Portion of the code as if written in `.py` file |
+| `files` | `Optional[List[File]]=[]`\* | List of extra files to simulate imports if needed |
+| `disable_cache` | `Optional[bool]=False` | Set to `true` disables `mypy` caching |
+| `mypy_config` | `Optional[Dict[str, Union[str, int, bool, float]]]={}` | Inline `mypy` configuration, passed directly to `mypy` as `--config-file` option |
+| `env` | `Optional[Dict[str, str]]={}` | Environmental variables to be provided inside of test run |
+| `parametrized` | `Optional[List[Parameter]]=[]`\* | List of parameters, similar to [`@pytest.mark.parametrize`](https://docs.pytest.org/en/stable/parametrize.html) |
+| `skip` | `str` | Expression evaluated with following globals set: `sys`, `os`, `pytest` and `platform` |
+| `expect_fail` | `bool` | Mark test case as an expected failure, like [`@pytest.mark.xfail`](https://docs.pytest.org/en/stable/skipping.html) |
+| `regex` | `str` | Allow regular expressions in comments to be matched against actual output. Defaults to "no", i.e. matches full text.|
+
+(*) Appendix to **pseudo** types used above:
+
+```python
+class File:
+ path: str
+ content: Optional[str] = None
+Parameter = Mapping[str, Any]
+```
+
+Implementation notes:
+
+- `main` must be non-empty string that evaluates to valid **Python** code,
+- `content` of each of extra files must evaluate to valid **Python** code,
+- `parametrized` entries must all be the objects of the same _type_. It simply means that each
+ entry must have **exact** same set of keys,
+- `skip` - an expression set in `skip` is passed directly into
+ [`eval`](https://docs.python.org/3/library/functions.html#eval). It is advised to take a peek and
+ learn about how `eval` works.
+
+### Example
+
+#### 1. Inline type expectations
+
+```yaml
+# typesafety/test_request.yml
+- case: request_object_has_user_of_type_auth_user_model
+ main: |
+ from django.http.request import HttpRequest
+ reveal_type(HttpRequest().user) # N: Revealed type is 'myapp.models.MyUser'
+ # check that other fields work ok
+ reveal_type(HttpRequest().method) # N: Revealed type is 'Union[builtins.str, None]'
+ files:
+ - path: myapp/__init__.py
+ - path: myapp/models.py
+ content: |
+ from django.db import models
+ class MyUser(models.Model):
+ pass
+```
+
+#### 2. `@parametrized`
+
+```yaml
+- case: with_params
+ parametrized:
+ - val: 1
+ rt: builtins.int
+ - val: 1.0
+ rt: builtins.float
+ main: |
+ reveal_type({{ val }}) # N: Revealed type is '{{ rt }}'
+```
+
+#### 3. Longer type expectations
+
+```yaml
+- case: with_out
+ main: |
+ reveal_type('abc')
+ out: |
+ main:1: note: Revealed type is 'builtins.str'
+```
+
+#### 4. Regular expressions in expectations
+
+```yaml
+- case: expected_message_regex_with_out
+ regex: yes
+ main: |
+ a = 'abc'
+ reveal_type(a)
+ out: |
+ main:2: note: .*str.*
+```
+
+#### 5. Regular expressions specific lines of output.
+
+```yaml
+- case: expected_single_message_regex
+ main: |
+ a = 'hello'
+ reveal_type(a) # NR: .*str.*
+```
+
+## Options
+
+```
+mypy-tests:
+ --mypy-testing-base=MYPY_TESTING_BASE
+ Base directory for tests to use
+ --mypy-ini-file=MYPY_INI_FILE
+ Which .ini file to use as a default config for tests
+ --mypy-same-process Run in the same process. Useful for debugging, will create problems with import cache
+ --mypy-extension-hook=MYPY_EXTENSION_HOOK
+ Fully qualified path to the extension hook function, in case you need custom yaml keys. Has to be top-level.
+ --mypy-only-local-stub
+ mypy will ignore errors from site-packages
+
+```
+
+## Further reading
+
+- [Testing mypy stubs, plugins, and types](https://sobolevn.me/2019/08/testing-mypy-types)
+
+## License
+
+[MIT](https://github.com/typeddjango/pytest-mypy-plugins/blob/master/LICENSE)
+
+
+%prep
+%autosetup -n pytest-mypy-plugins-1.10.1
+
+%build
+%py3_build
+
+%install
+%py3_install
+install -d -m755 %{buildroot}/%{_pkgdocdir}
+if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
+if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
+if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
+if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
+pushd %{buildroot}
+if [ -d usr/lib ]; then
+ find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/lib64 ]; then
+ find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/bin ]; then
+ find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/sbin ]; then
+ find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+touch doclist.lst
+if [ -d usr/share/man ]; then
+ find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst
+fi
+popd
+mv %{buildroot}/filelist.lst .
+mv %{buildroot}/doclist.lst .
+
+%files -n python3-pytest-mypy-plugins -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Wed Apr 12 2023 Python_Bot <Python_Bot@openeuler.org> - 1.10.1-1
+- Package Spec generated
diff --git a/sources b/sources
new file mode 100644
index 0000000..27d89af
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+fd146e49e13ee50c8c9ffe30b4ae19b3 pytest-mypy-plugins-1.10.1.tar.gz