summaryrefslogtreecommitdiff
path: root/dev-python/mypy
diff options
context:
space:
mode:
Diffstat (limited to 'dev-python/mypy')
-rw-r--r--dev-python/mypy/Manifest3
-rw-r--r--dev-python/mypy/files/mypy-1.10.1-py313.patch153
-rw-r--r--dev-python/mypy/mypy-1.10.1.ebuild31
3 files changed, 181 insertions, 6 deletions
diff --git a/dev-python/mypy/Manifest b/dev-python/mypy/Manifest
index 51e477dc4751..a90ab87d0acc 100644
--- a/dev-python/mypy/Manifest
+++ b/dev-python/mypy/Manifest
@@ -1,5 +1,6 @@
+AUX mypy-1.10.1-py313.patch 5922 BLAKE2B 3dd0e1feb0351f9b83424c0b9e31ddee82134332c8610f9a211c815701019a3e760a0d3656eb9457f5de0a72d4d0bcfe1bec489462b905b739aa66e25c6c0765 SHA512 f944d7b3e44ed84a8bc7cf333e5806dedf9d9989bb5d356acca088209c0d425abd01c87bd88307771bb3a4e44d4e54124bdd1750dce5bde24ac02f64a02aef7d
DIST mypy-1.10.0.gh.tar.gz 3062151 BLAKE2B ddc7354b2b62247387fd04b309c50d4ffa5c1b8af58873cc8787bd17c04069b528850bfb586925aa7df6634a65af6a1e951e4d6036d5bd0e688b8608980510bd SHA512 c936c299d9d4b6911505ef7b7df6f8d7344bd199a2d654e66467291f6e6ba4432dfa7aed5a504e6ec9518d9d53ac85f771e7b31dc6a72e06e79c443547bc2b66
DIST mypy-1.10.1.gh.tar.gz 3062383 BLAKE2B 326fb33e42ad8920a235e510b3d39663f333dc46d0dd3ffc59f4604e9a4f29f0be95f73bac42166aae00b53987d6a2a54446f1f58033dce389c43044dbaa9cdd SHA512 10d29ae145d71911dc7c9b4538371bf1caa64f333984ab3a4cbf9561d7c4e752c68380496489f56d0941f143d6684d84d28f157be578d6f55f1e81d3d47b204c
EBUILD mypy-1.10.0.ebuild 3636 BLAKE2B 6743ea6ae4c646ff7024731a3ce102596168db3ad9037816bd3e701933accdb0358f75bcf35bcf30c3f0206f72e56c1f3488e2e25dae450c1deb5751482e8d62 SHA512 4615b351f6254ace77b5646ac2c377c433054da83c40270151f724e62ef45b7016b1905a61ebb18dbc800444a5c1ee881f0acbfc6ef164b9a536bc8099c9f3d8
-EBUILD mypy-1.10.1.ebuild 3640 BLAKE2B c060a7a0352fe49d96442066db59f9527e7109cd1c69ba10b41c7b1b9490f2fae5311c02f3e3c4459cb5e4b1863d34956a2a6e74fc8fa16c27941ec45489998a SHA512 76239def60f6ed7b9ca23d4d16ce13a556ed85ebf8c8e7bed81c2ba2f36992a81fb1831293b0dd95f454ffb47da1a2c3222b7374c25fc82780e8d598f3f0945e
+EBUILD mypy-1.10.1.ebuild 4089 BLAKE2B cbc1f669fc62d00096c2c0d210fdbb49948c85ada5ed1d115622a3bbaa3778534cd0c21105e18e114a2880c5e10a3f1978fd337514d0b0cf85546bf1e9d0e3c7 SHA512 15208625c5fc3a77d99d3b2e54e06f2759209d9f6258376e1a90a6f5e5005be359a067cec3050b8decb248e69c0ec91ea88e8e557058592148445cabdae37ff1
MISC metadata.xml 661 BLAKE2B df57cc2dfde5b112f8c26b51ca5cc9e7727d318ee274ea7e1abf448819daf0307f471aeb7c32b19f20e87ce1ccffd47a5529415003765c275523e1b5236f3bb1 SHA512 eddd19c4b0b5211f73f9619f388a799ced108b62bb43d852ed2d01d0b1717e7b9ef118d34b9d61db543c7b47080fb8058c3d35f7359cc456069636f357e080c9
diff --git a/dev-python/mypy/files/mypy-1.10.1-py313.patch b/dev-python/mypy/files/mypy-1.10.1-py313.patch
new file mode 100644
index 000000000000..5b9932852e19
--- /dev/null
+++ b/dev-python/mypy/files/mypy-1.10.1-py313.patch
@@ -0,0 +1,153 @@
+From 29b4303e905f43556043efde95e19f32e04df9a5 Mon Sep 17 00:00:00 2001
+From: Jelle Zijlstra <jelle.zijlstra@gmail.com>
+Date: Fri, 24 May 2024 21:00:17 -0700
+Subject: [PATCH] Fix stubgen for Python 3.13
+
+__firstlineno__ and __static_attributes__ are new in 3.13.
+__annotate__ will be new in 3.14, so we might as well add it now.
+---
+ mypy/stubgenc.py | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/mypy/stubgenc.py b/mypy/stubgenc.py
+index 29b2636d39cc..7e3ef49c6e9a 100755
+--- a/mypy/stubgenc.py
++++ b/mypy/stubgenc.py
+@@ -466,6 +466,9 @@ def is_skipped_attribute(self, attr: str) -> bool:
+ "__module__",
+ "__weakref__",
+ "__annotations__",
++ "__firstlineno__",
++ "__static_attributes__",
++ "__annotate__",
+ )
+ or attr in self.IGNORED_DUNDERS
+ or is_pybind_skipped_attribute(attr) # For pickling
+From 071e3f5f4685470f55dab7fc474e9f89a8e49fb9 Mon Sep 17 00:00:00 2001
+From: hauntsaninja <hauntsaninja@gmail.com>
+Date: Fri, 17 May 2024 18:49:27 -0400
+Subject: [PATCH] stubtest: changes for py313
+
+Technically it feels like we should be able to put the new dunders on
+`type` or something, but that wasn't enough to make false positives go
+away. But also we might not want to do that because it only applies to
+pure Python types
+---
+ mypy/stubtest.py | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/mypy/stubtest.py b/mypy/stubtest.py
+index dd43c472d67f..d78b71715159 100644
+--- a/mypy/stubtest.py
++++ b/mypy/stubtest.py
+@@ -634,6 +634,10 @@ def strip_prefix(s: str, prefix: str) -> str:
+ if strip_prefix(stub_arg.variable.name, "__") == runtime_arg.name:
+ return
+
++ nonspecific_names = {"object", "args"}
++ if runtime_arg.name in nonspecific_names:
++ return
++
+ def names_approx_match(a: str, b: str) -> bool:
+ a = a.strip("_")
+ b = b.strip("_")
+@@ -1455,6 +1459,8 @@ def verify_typealias(
+ "__getattr__", # resulting behaviour might be typed explicitly
+ "__setattr__", # defining this on a class can cause worse type checking
+ "__vectorcalloffset__", # undocumented implementation detail of the vectorcall protocol
++ "__firstlineno__",
++ "__static_attributes__",
+ # isinstance/issubclass hooks that type-checkers don't usually care about
+ "__instancecheck__",
+ "__subclasshook__",
+diff --git a/mypy/plugins/dataclasses.py b/mypy/plugins/dataclasses.py
+index dd2eceab217f..edfc6840fc37 100644
+--- a/mypy/plugins/dataclasses.py
++++ b/mypy/plugins/dataclasses.py
+@@ -385,6 +385,9 @@ def transform(self) -> bool:
+
+ self._add_dataclass_fields_magic_attribute()
+ self._add_internal_replace_method(attributes)
++ if self._api.options.python_version >= (3, 13):
++ self._add_dunder_replace(attributes)
++
+ if "__post_init__" in info.names:
+ self._add_internal_post_init_method(attributes)
+
+@@ -395,6 +398,18 @@ def transform(self) -> bool:
+
+ return True
+
++ def _add_dunder_replace(self, attributes: list[DataclassAttribute]) -> None:
++ """Add a `__replace__` method to the class, which is used to replace attributes in the `copy` module."""
++ args = [attr.to_argument(self._cls.info, of="replace") for attr in attributes]
++ type_vars = [tv for tv in self._cls.type_vars]
++ add_method_to_class(
++ self._api,
++ self._cls,
++ "__replace__",
++ args=args,
++ return_type=Instance(self._cls.info, type_vars),
++ )
++
+ def _add_internal_replace_method(self, attributes: list[DataclassAttribute]) -> None:
+ """
+ Stashes the signature of 'dataclasses.replace(...)' for this specific dataclass
+From 160a9c767324460e916978d49f8d770738572119 Mon Sep 17 00:00:00 2001
+From: hauntsaninja <hauntsaninja@gmail.com>
+Date: Fri, 17 May 2024 18:23:01 -0400
+Subject: [PATCH 1/2] Support namedtuple.__replace__ in Python 3.13
+
+---
+ mypy/semanal_namedtuple.py | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/mypy/semanal_namedtuple.py b/mypy/semanal_namedtuple.py
+index 9a0be9d9c14c..bdd633a60635 100644
+--- a/mypy/semanal_namedtuple.py
++++ b/mypy/semanal_namedtuple.py
+@@ -599,6 +599,12 @@ def add_method(
+ ret=selftype,
+ args=[Argument(var, var.type, EllipsisExpr(), ARG_NAMED_OPT) for var in vars],
+ )
++ if self.options.python_version >= (3, 13):
++ add_method(
++ "__replace__",
++ ret=selftype,
++ args=[Argument(var, var.type, EllipsisExpr(), ARG_NAMED_OPT) for var in vars],
++ )
+
+ def make_init_arg(var: Var) -> Argument:
+ default = default_items.get(var.name, None)
+
+From 9fcaedb9f757595486ed231dbdb9433151ec669d Mon Sep 17 00:00:00 2001
+From: hauntsaninja <hauntsaninja@gmail.com>
+Date: Sat, 18 May 2024 18:40:09 -0400
+Subject: [PATCH 2/2] .
+
+---
+ test-data/unit/check-namedtuple.test | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+diff --git a/test-data/unit/check-namedtuple.test b/test-data/unit/check-namedtuple.test
+index 23e109e1af78..b2ba69abb045 100644
+--- a/test-data/unit/check-namedtuple.test
++++ b/test-data/unit/check-namedtuple.test
+@@ -1376,3 +1376,17 @@ class Test3(NamedTuple, metaclass=type): # E: Unexpected keyword argument "meta
+ ...
+ [builtins fixtures/tuple.pyi]
+ [typing fixtures/typing-namedtuple.pyi]
++
++
++[case testNamedTupleDunderReplace]
++# flags: --python-version 3.13
++from typing import NamedTuple
++
++class A(NamedTuple):
++ x: int
++
++A(x=0).__replace__(x=1)
++A(x=0).__replace__(x="asdf") # E: Argument "x" to "__replace__" of "A" has incompatible type "str"; expected "int"
++A(x=0).__replace__(y=1) # E: Unexpected keyword argument "y" for "__replace__" of "A"
++[builtins fixtures/tuple.pyi]
++[typing fixtures/typing-namedtuple.pyi]
diff --git a/dev-python/mypy/mypy-1.10.1.ebuild b/dev-python/mypy/mypy-1.10.1.ebuild
index 2f0a69442d64..9bd317074557 100644
--- a/dev-python/mypy/mypy-1.10.1.ebuild
+++ b/dev-python/mypy/mypy-1.10.1.ebuild
@@ -5,9 +5,9 @@ EAPI=8
DISTUTILS_EXT=1
DISTUTILS_USE_PEP517=setuptools
-PYTHON_COMPAT=( python3_{10..12} )
+PYTHON_COMPAT=( python3_{10..13} )
-inherit distutils-r1 multiprocessing
+inherit distutils-r1
DESCRIPTION="Optional static typing for Python"
HOMEPAGE="
@@ -51,14 +51,27 @@ BDEPEND="
EPYTEST_XDIST=1
distutils_enable_tests pytest
+PATCHES=(
+ # https://github.com/python/mypy/pull/17259
+ # https://github.com/python/mypy/pull/17261
+ # https://github.com/python/mypy/pull/17290
+ "${FILESDIR}/${P}-py313.patch"
+)
+
# frustratingly, mypyc produces non-deterministic output. If ccache is enabled it will be a waste of time,
# but simultaneously it might trash your system and fill up the cache with a giant wave of non-reproducible
# test files (https://github.com/mypyc/mypyc/issues/1014)
export CCACHE_DISABLE=1
-src_compile() {
+python_compile() {
local -x MYPY_USE_MYPYC=$(usex native-extensions 1 0)
- distutils-r1_src_compile
+ case ${EPYTHON} in
+ python3.13)
+ # https://github.com/mypyc/mypyc/issues/1056
+ MYPY_USE_MYPYC=0
+ ;;
+ esac
+ distutils-r1_python_compile
}
python_test() {
@@ -87,6 +100,14 @@ python_test() {
mypyc/test/test_run.py::TestRun::run-i64.test::testI64ErrorValuesAndUndefined
)
;;
+ python3.13)
+ EPYTEST_DESELECT+=(
+ # https://github.com/mypyc/mypyc/issues/1056
+ mypyc/test
+ # requires typeshed update
+ mypy/test/teststubtest.py::StubtestUnit::test_type_alias
+ )
+ ;;
esac
# Some mypy/test/testcmdline.py::PythonCmdlineSuite tests
@@ -104,7 +125,7 @@ python_test() {
local failed=
local -x PYTEST_DISABLE_PLUGIN_AUTOLOAD=1
- nonfatal epytest -n "$(makeopts_jobs)" --dist=worksteal || failed=1
+ nonfatal epytest || failed=1
rm conftest.py pyproject.toml || die