gnu: python-mypy: Update to 0.971.
* gnu/packages/patches/python-mypy-12332.patch, gnu/packages/patches/python-mypy-use-sys-path.patch: Delete files. * gnu/local.mk (dist_patch_DATA): Adjust accordingly. * gnu/packages/python-check.scm (python-mypy): Update to 0.971. [source](patches): Remove. [arguments]: Skip one test.
parent
1e969dafb7
commit
7e0116740b
|
@ -1731,8 +1731,6 @@ dist_patch_DATA = \
|
||||||
%D%/packages/patches/python-versioneer-guix-support.patch \
|
%D%/packages/patches/python-versioneer-guix-support.patch \
|
||||||
%D%/packages/patches/python-waitress-fix-tests.patch \
|
%D%/packages/patches/python-waitress-fix-tests.patch \
|
||||||
%D%/packages/patches/python-werkzeug-tests.patch \
|
%D%/packages/patches/python-werkzeug-tests.patch \
|
||||||
%D%/packages/patches/python-mypy-12332.patch \
|
|
||||||
%D%/packages/patches/python-mypy-use-sys-path.patch \
|
|
||||||
%D%/packages/patches/python-zeep-Fix-pytest_httpx-test-cases.patch \
|
%D%/packages/patches/python-zeep-Fix-pytest_httpx-test-cases.patch \
|
||||||
%D%/packages/patches/qemu-build-info-manual.patch \
|
%D%/packages/patches/qemu-build-info-manual.patch \
|
||||||
%D%/packages/patches/qemu-glibc-2.27.patch \
|
%D%/packages/patches/qemu-glibc-2.27.patch \
|
||||||
|
|
|
@ -1,68 +0,0 @@
|
||||||
From 518c864805dd93e62d59439e665a0ce9d6778419 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ekin Dursun <ekindursun@gmail.com>
|
|
||||||
Date: Thu, 10 Mar 2022 22:06:48 +0300
|
|
||||||
Subject: [PATCH] mypyc: Fix overflow in id function (CPyTagged_Id)
|
|
||||||
|
|
||||||
In CPython, the id of an object is its address. It's computed by
|
|
||||||
converting the pointer to an unsigned integer (PyLong_FromVoidPtr). A
|
|
||||||
similar logic is present here, pointer is converted to a Py_ssize_t and
|
|
||||||
CPyTagged_FromSsize_t is called with that integer.
|
|
||||||
|
|
||||||
There is a problem with that approach: Py_ssize_t cannot hold every
|
|
||||||
pointer value. Sometimes overflow happens and CPyTagged_FromSsize_t is
|
|
||||||
called with a negative integer.
|
|
||||||
|
|
||||||
With the new approach, the number is checked: If it fits in a
|
|
||||||
Py_ssize_t, CPyTagged_FromSsize_t is called. If not, it is directly
|
|
||||||
converted to a PyObject using PyLong_FromVoidPtr.
|
|
||||||
---
|
|
||||||
mypyc/lib-rt/CPy.h | 1 +
|
|
||||||
mypyc/lib-rt/int_ops.c | 9 +++++++++
|
|
||||||
mypyc/lib-rt/misc_ops.c | 2 +-
|
|
||||||
3 files changed, 11 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/mypyc/lib-rt/CPy.h b/mypyc/lib-rt/CPy.h
|
|
||||||
index 987819154ab..9f5ae52d4e4 100644
|
|
||||||
--- a/mypyc/lib-rt/CPy.h
|
|
||||||
+++ b/mypyc/lib-rt/CPy.h
|
|
||||||
@@ -121,6 +121,7 @@ static inline size_t CPy_FindAttrOffset(PyTypeObject *trait, CPyVTableItem *vtab
|
|
||||||
|
|
||||||
|
|
||||||
CPyTagged CPyTagged_FromSsize_t(Py_ssize_t value);
|
|
||||||
+CPyTagged CPyTagged_FromVoidPtr(void *ptr);
|
|
||||||
CPyTagged CPyTagged_FromObject(PyObject *object);
|
|
||||||
CPyTagged CPyTagged_StealFromObject(PyObject *object);
|
|
||||||
CPyTagged CPyTagged_BorrowFromObject(PyObject *object);
|
|
||||||
diff --git a/mypyc/lib-rt/int_ops.c b/mypyc/lib-rt/int_ops.c
|
|
||||||
index 1275f2c1057..edf06314161 100644
|
|
||||||
--- a/mypyc/lib-rt/int_ops.c
|
|
||||||
+++ b/mypyc/lib-rt/int_ops.c
|
|
||||||
@@ -26,6 +26,15 @@ CPyTagged CPyTagged_FromSsize_t(Py_ssize_t value) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+CPyTagged CPyTagged_FromVoidPtr(void *ptr) {
|
|
||||||
+ if ((uintptr_t)ptr > PY_SSIZE_T_MAX) {
|
|
||||||
+ PyObject *object = PyLong_FromVoidPtr(ptr);
|
|
||||||
+ return ((CPyTagged)object) | CPY_INT_TAG;
|
|
||||||
+ } else {
|
|
||||||
+ return CPyTagged_FromSsize_t((Py_ssize_t)ptr);
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
CPyTagged CPyTagged_FromObject(PyObject *object) {
|
|
||||||
int overflow;
|
|
||||||
// The overflow check knows about CPyTagged's width
|
|
||||||
diff --git a/mypyc/lib-rt/misc_ops.c b/mypyc/lib-rt/misc_ops.c
|
|
||||||
index cebd1cf997f..dcce89d9072 100644
|
|
||||||
--- a/mypyc/lib-rt/misc_ops.c
|
|
||||||
+++ b/mypyc/lib-rt/misc_ops.c
|
|
||||||
@@ -437,7 +437,7 @@ CPyPickle_GetState(PyObject *obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
CPyTagged CPyTagged_Id(PyObject *o) {
|
|
||||||
- return CPyTagged_FromSsize_t((Py_ssize_t)o);
|
|
||||||
+ return CPyTagged_FromVoidPtr(o);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define MAX_INT_CHARS 22
|
|
|
@ -1,130 +0,0 @@
|
||||||
This patch fixes the annotation files search of mypy on non-FHS distributions.
|
|
||||||
|
|
||||||
Submitted upstream: https://github.com/python/mypy/pull/12530
|
|
||||||
|
|
||||||
diff --git a/mypy/main.py b/mypy/main.py
|
|
||||||
index 3d9836587..f9b0cbd39 100644
|
|
||||||
--- a/mypy/main.py
|
|
||||||
+++ b/mypy/main.py
|
|
||||||
@@ -1033,10 +1033,10 @@ def process_options(args: List[str],
|
|
||||||
# Set target.
|
|
||||||
if special_opts.modules + special_opts.packages:
|
|
||||||
options.build_type = BuildType.MODULE
|
|
||||||
- egg_dirs, site_packages = get_site_packages_dirs(options.python_executable)
|
|
||||||
+ site_packages = get_site_packages_dirs(options.python_executable)
|
|
||||||
search_paths = SearchPaths((os.getcwd(),),
|
|
||||||
tuple(mypy_path() + options.mypy_path),
|
|
||||||
- tuple(egg_dirs + site_packages),
|
|
||||||
+ tuple(site_packages),
|
|
||||||
())
|
|
||||||
targets = []
|
|
||||||
# TODO: use the same cache that the BuildManager will
|
|
||||||
diff --git a/mypy/modulefinder.py b/mypy/modulefinder.py
|
|
||||||
index 94d2dd34c..337a2d59b 100644
|
|
||||||
--- a/mypy/modulefinder.py
|
|
||||||
+++ b/mypy/modulefinder.py
|
|
||||||
@@ -629,7 +629,7 @@ def get_prefixes(python_executable: Optional[str]) -> Tuple[str, str]:
|
|
||||||
|
|
||||||
|
|
||||||
@functools.lru_cache(maxsize=None)
|
|
||||||
-def get_site_packages_dirs(python_executable: Optional[str]) -> Tuple[List[str], List[str]]:
|
|
||||||
+def get_site_packages_dirs(python_executable: Optional[str]) -> List[str]:
|
|
||||||
"""Find package directories for given python.
|
|
||||||
|
|
||||||
This runs a subprocess call, which generates a list of the egg directories, and the site
|
|
||||||
@@ -648,51 +648,7 @@ def get_site_packages_dirs(python_executable: Optional[str]) -> Tuple[List[str],
|
|
||||||
site_packages = ast.literal_eval(
|
|
||||||
subprocess.check_output([python_executable, pyinfo.__file__, 'getsitepackages'],
|
|
||||||
stderr=subprocess.PIPE).decode())
|
|
||||||
- return expand_site_packages(site_packages)
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-def expand_site_packages(site_packages: List[str]) -> Tuple[List[str], List[str]]:
|
|
||||||
- """Expands .pth imports in site-packages directories"""
|
|
||||||
- egg_dirs: List[str] = []
|
|
||||||
- for dir in site_packages:
|
|
||||||
- if not os.path.isdir(dir):
|
|
||||||
- continue
|
|
||||||
- pth_filenames = sorted(name for name in os.listdir(dir) if name.endswith(".pth"))
|
|
||||||
- for pth_filename in pth_filenames:
|
|
||||||
- egg_dirs.extend(_parse_pth_file(dir, pth_filename))
|
|
||||||
-
|
|
||||||
- return egg_dirs, site_packages
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-def _parse_pth_file(dir: str, pth_filename: str) -> Iterator[str]:
|
|
||||||
- """
|
|
||||||
- Mimics a subset of .pth import hook from Lib/site.py
|
|
||||||
- See https://github.com/python/cpython/blob/3.5/Lib/site.py#L146-L185
|
|
||||||
- """
|
|
||||||
-
|
|
||||||
- pth_file = os.path.join(dir, pth_filename)
|
|
||||||
- try:
|
|
||||||
- f = open(pth_file, "r")
|
|
||||||
- except OSError:
|
|
||||||
- return
|
|
||||||
- with f:
|
|
||||||
- for line in f.readlines():
|
|
||||||
- if line.startswith("#"):
|
|
||||||
- # Skip comment lines
|
|
||||||
- continue
|
|
||||||
- if line.startswith(("import ", "import\t")):
|
|
||||||
- # import statements in .pth files are not supported
|
|
||||||
- continue
|
|
||||||
-
|
|
||||||
- yield _make_abspath(line.rstrip(), dir)
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-def _make_abspath(path: str, root: str) -> str:
|
|
||||||
- """Take a path and make it absolute relative to root if not already absolute."""
|
|
||||||
- if os.path.isabs(path):
|
|
||||||
- return os.path.normpath(path)
|
|
||||||
- else:
|
|
||||||
- return os.path.join(root, os.path.normpath(path))
|
|
||||||
+ return site_packages
|
|
||||||
|
|
||||||
|
|
||||||
def add_py2_mypypath_entries(mypypath: List[str]) -> List[str]:
|
|
||||||
@@ -781,7 +737,7 @@ def compute_search_paths(sources: List[BuildSource],
|
|
||||||
if options.python_version[0] == 2:
|
|
||||||
mypypath = add_py2_mypypath_entries(mypypath)
|
|
||||||
|
|
||||||
- egg_dirs, site_packages = get_site_packages_dirs(options.python_executable)
|
|
||||||
+ site_packages = get_site_packages_dirs(options.python_executable)
|
|
||||||
base_prefix, prefix = get_prefixes(options.python_executable)
|
|
||||||
is_venv = base_prefix != prefix
|
|
||||||
for site_dir in site_packages:
|
|
||||||
@@ -801,7 +757,7 @@ def compute_search_paths(sources: List[BuildSource],
|
|
||||||
|
|
||||||
return SearchPaths(python_path=tuple(reversed(python_path)),
|
|
||||||
mypy_path=tuple(mypypath),
|
|
||||||
- package_path=tuple(egg_dirs + site_packages),
|
|
||||||
+ package_path=tuple(site_packages),
|
|
||||||
typeshed_path=tuple(lib_path))
|
|
||||||
|
|
||||||
|
|
||||||
diff --git a/mypy/pyinfo.py b/mypy/pyinfo.py
|
|
||||||
index ab2d3286b..9fb0501a1 100644
|
|
||||||
--- a/mypy/pyinfo.py
|
|
||||||
+++ b/mypy/pyinfo.py
|
|
||||||
@@ -24,16 +24,11 @@ def getprefixes():
|
|
||||||
|
|
||||||
def getsitepackages():
|
|
||||||
# type: () -> List[str]
|
|
||||||
- res = []
|
|
||||||
- if hasattr(site, 'getsitepackages'):
|
|
||||||
- res.extend(site.getsitepackages())
|
|
||||||
|
|
||||||
- if hasattr(site, 'getusersitepackages') and site.ENABLE_USER_SITE:
|
|
||||||
- res.insert(0, site.getusersitepackages())
|
|
||||||
- else:
|
|
||||||
- from distutils.sysconfig import get_python_lib
|
|
||||||
- res = [get_python_lib()]
|
|
||||||
- return res
|
|
||||||
+ # Simply return sys.path, which has already been expanded
|
|
||||||
+ # correctly via Python's site.py module, which takes care of .pth,
|
|
||||||
+ # sitecustomize.py files, etc.
|
|
||||||
+ return sys.path
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
|
@ -1771,7 +1771,7 @@ supported by the MyPy typechecker.")
|
||||||
(define-public python-mypy
|
(define-public python-mypy
|
||||||
(package
|
(package
|
||||||
(name "python-mypy")
|
(name "python-mypy")
|
||||||
(version "0.942")
|
(version "0.971")
|
||||||
(source
|
(source
|
||||||
(origin
|
(origin
|
||||||
;; Because of https://github.com/python/mypy/issues/9584, the
|
;; Because of https://github.com/python/mypy/issues/9584, the
|
||||||
|
@ -1788,10 +1788,7 @@ supported by the MyPy typechecker.")
|
||||||
(file-name (git-file-name name version))
|
(file-name (git-file-name name version))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"0hxnrqhvskiclwfj2s4gyfclzjas1dvpfxhyng8v7mq38rqps1j5"))
|
"0i8swdynms1wpiprgqn24za6mx8rlgxr2jash3cb5xi8jyf58n97"))))
|
||||||
(patches
|
|
||||||
(search-patches "python-mypy-12332.patch"
|
|
||||||
"python-mypy-use-sys-path.patch"))))
|
|
||||||
(build-system python-build-system)
|
(build-system python-build-system)
|
||||||
(arguments
|
(arguments
|
||||||
`(#:phases
|
`(#:phases
|
||||||
|
@ -1799,7 +1796,10 @@ supported by the MyPy typechecker.")
|
||||||
(replace 'check
|
(replace 'check
|
||||||
(lambda* (#:key tests? #:allow-other-keys)
|
(lambda* (#:key tests? #:allow-other-keys)
|
||||||
(when tests?
|
(when tests?
|
||||||
(invoke "pytest" "mypyc")))))))
|
(invoke "pytest" "-vv" "mypyc"
|
||||||
|
;; XXX: This test gets an unexpected DeprecationWarning
|
||||||
|
;; from recent versions of setuptools. Ignore for now.
|
||||||
|
"-k" "not testImports")))))))
|
||||||
(native-inputs
|
(native-inputs
|
||||||
(list python-attrs
|
(list python-attrs
|
||||||
python-lxml
|
python-lxml
|
||||||
|
|
Reference in New Issue