Skip to content

Commit

Permalink
dev-python/pytest-mypy-plugins: backport compatibility with >=mypy-1.8.0
Browse files Browse the repository at this point in the history
Both versions were previously incompatible with dev-python/mypy-1.8.0 due
to an incompatibility with mypy's new flush_errors signature.
See also: typeddjango/pytest-mypy-plugins#139

Signed-off-by: Lucio Sauer <watermanpaint@posteo.net>
  • Loading branch information
antecrescent committed Feb 26, 2024
1 parent 90b0c16 commit 2d2203d
Show file tree
Hide file tree
Showing 4 changed files with 198 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
Adapted from:
https://github.com/typeddjango/pytest-mypy-plugins/commit/97aff1e9ae5022384542ce98b8a401c7f4c420e7
From: antecrescent <watermanpaint@posteo.net>
Date: Sun, 25 Feb 2024 20:53:26 +0100
Subject: [PATCH] Test inline mypy configuration with more stable mypy option
(#138)

* Test inline mypy configuration with more stable mypy option

The mypy configuration --no-strict-optional is discouraged and not much
tested. It caused the test to fail with >=mypy-1.6.0.

Closes #137

* Update flush_errors to match the signature of >=mypy-1.8.0

Necessity to bump to >=mypy-1.8.0 explained here:
https://github.com/typeddjango/pytest-mypy-plugins/pull/139
--- a/pytest_mypy_plugins/item.py
+++ b/pytest_mypy_plugins/item.py
@@ -82,7 +82,10 @@ def run_mypy_typechecking(cmd_options: List[str], stdout: TextIO, stderr: TextIO

error_messages = []

- def flush_errors(new_messages: List[str], serious: bool) -> None:
+ # discard filename parameter '_'. Mypy uses it to generate
+ # one junit-xml test entry per file with failures (--junit-format per_file)
+ # and we don't support mypy's --junit-xml option in the first place.
+ def flush_errors(_: str | None, new_messages: List[str], serious: bool) -> None:
error_messages.extend(new_messages)
f = stderr if serious else stdout
try:
--- a/pytest_mypy_plugins/tests/test-simple-cases.yml
+++ b/pytest_mypy_plugins/tests/test-simple-cases.yml
@@ -60,13 +60,13 @@
a.lower() # E: "int" has no attribute "lower" [attr-defined]


-- case: custom_mypy_config_strict_optional_true_set
+- case: custom_mypy_config_disallow_any_explicit_set
+ expect_fail: yes
main: |
- from typing import Optional
- a: Optional[int] = None
- a + 1
+ from typing import Any
+ a: Any = None # shoud raise an error
mypy_config: |
- strict_optional = False
+ disallow_any_explicit = true


- case: skip_incorrect_test_case
@@ -101,4 +101,4 @@
a = 'abc'
reveal_type(a)
out: |
- main:2: note: Some other message
\ No newline at end of file
+ main:2: note: Some other message
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
https://github.com/typeddjango/pytest-mypy-plugins/commit/97aff1e9ae5022384542ce98b8a401c7f4c420e7
From: antecrescent <watermanpaint@posteo.net>
Date: Sun, 25 Feb 2024 20:53:26 +0100
Subject: [PATCH] Test inline mypy configuration with more stable mypy option
(#138)

* Test inline mypy configuration with more stable mypy option

The mypy configuration --no-strict-optional is discouraged and not much
tested. It caused the test to fail with >=mypy-1.6.0.

Closes #137

* Update flush_errors to match the signature of >=mypy-1.8.0

Necessity to bump to >=mypy-1.8.0 explained here:
https://github.com/typeddjango/pytest-mypy-plugins/pull/139
--- a/pytest_mypy_plugins/item.py
+++ b/pytest_mypy_plugins/item.py
@@ -82,7 +82,10 @@ def run_mypy_typechecking(cmd_options: List[str], stdout: TextIO, stderr: TextIO

error_messages = []

- def flush_errors(new_messages: List[str], serious: bool) -> None:
+ # discard filename parameter '_'. Mypy uses it to generate
+ # one junit-xml test entry per file with failures (--junit-format per_file)
+ # and we don't support mypy's --junit-xml option in the first place.
+ def flush_errors(_: str | None, new_messages: List[str], serious: bool) -> None:
error_messages.extend(new_messages)
f = stderr if serious else stdout
try:
--- a/pytest_mypy_plugins/tests/test-mypy-config.yml
+++ b/pytest_mypy_plugins/tests/test-mypy-config.yml
@@ -1,9 +1,9 @@
# Also used in `test_explicit_configs.py`

-- case: custom_mypy_config_strict_optional_true_set
+- case: custom_mypy_config_disallow_any_explicit_set
+ expect_fail: yes
main: |
- from typing import Optional
- a: Optional[int] = None
- a + 1 # should not raise an error
+ from typing import Any
+ a: Any = None # should raise an error
mypy_config: |
- strict_optional = false
+ disallow_any_explicit = true
--
2.43.2

35 changes: 35 additions & 0 deletions dev-python/pytest-mypy-plugins/pytest-mypy-plugins-2.0.0-r1.ebuild
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Copyright 2023-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

DISTUTILS_USE_PEP517=setuptools
PYTHON_COMPAT=( python3_{11,12} )
inherit distutils-r1

DESCRIPTION="pytest plugin for testing mypy types, stubs, plugins"
HOMEPAGE="
https://pypi.org/project/pytest-mypy-plugins/
https://github.com/typeddjango/pytest-mypy-plugins/
"

SRC_URI="https://github.com/typeddjango/pytest-mypy-plugins/archive/refs/tags/${PV}.tar.gz
-> ${P}.gh.tar.gz"
LICENSE="MIT"
SLOT="0"
KEYWORDS="~amd64"

PATCHES="${FILESDIR}"/${P}-compat-mypy-1.8.0.patch
DOCS="README* CHANGELOG*"

RDEPEND="
>=dev-python/mypy-1.8.0[${PYTHON_USEDEP}]
>=dev-python/pytest-7.0.0[${PYTHON_USEDEP}]
dev-python/decorator[${PYTHON_USEDEP}]
dev-python/jinja[${PYTHON_USEDEP}]
dev-python/packaging[${PYTHON_USEDEP}]
dev-python/pyyaml[${PYTHON_USEDEP}]
dev-python/regex[${PYTHON_USEDEP}]
"

distutils_enable_tests pytest
52 changes: 52 additions & 0 deletions dev-python/pytest-mypy-plugins/pytest-mypy-plugins-3.0.0-r1.ebuild
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# Copyright 2023-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

DISTUTILS_USE_PEP517=setuptools
PYTHON_COMPAT=( python3_{11,12} )
inherit distutils-r1

DESCRIPTION="pytest plugin for testing mypy types, stubs, plugins"
HOMEPAGE="
https://pypi.org/project/pytest-mypy-plugins/
https://github.com/typeddjango/pytest-mypy-plugins/
"

SRC_URI="https://github.com/typeddjango/pytest-mypy-plugins/archive/refs/tags/${PV}.tar.gz
-> ${P}.gh.tar.gz"
LICENSE="MIT"
SLOT="0"
KEYWORDS="~amd64"

PATCHES="${FILESDIR}"/${P}-compat-mypy-1.8.0.patch
DOCS="README* CHANGELOG*"

RDEPEND="
>=dev-python/mypy-1.8.0[${PYTHON_USEDEP}]
>=dev-python/pytest-7.0.0[${PYTHON_USEDEP}]
>=dev-python/tomlkit-0.11[${PYTHON_USEDEP}]
dev-python/decorator[${PYTHON_USEDEP}]
dev-python/jinja[${PYTHON_USEDEP}]
dev-python/packaging[${PYTHON_USEDEP}]
dev-python/pyyaml[${PYTHON_USEDEP}]
dev-python/regex[${PYTHON_USEDEP}]
"

distutils_enable_tests pytest

python_prepare_all() {
# tests need pytest_mypy_plugins.tests on the modules search path and
# python -m pytest preprends sys.path with ${PWD}/${S}
sed "s/\"pytest\"/\"MY_EPYTHON\", \"-m\", \"pytest\"/" \
-i pytest_mypy_plugins/tests/test_explicit_configs.py || die
distutils-r1_python_prepare_all
}

python_test() {
# substitute the correct interpreter
sed "s/MY_EPYTHON/${EPYTHON}/" -i pytest_mypy_plugins/tests/test_explicit_configs.py || die
distutils-r1_python_test
# reset for next interpreter run
sed "s/${EPYTHON}/MY_EPYTHON/" -i pytest_mypy_plugins/tests/test_explicit_configs.py || die
}

0 comments on commit 2d2203d

Please sign in to comment.