gnu: python-mypy: Update to 0.942 and fix search path.

* gnu/packages/patches/python-mypy-use-sys-path.patch: New patch.
* gnu/local.mk: Register it.
* gnu/packages/python-check.scm (python-mypy): Update to 0.942.
[source]: Apply patch.
This commit is contained in:
Maxim Cournoyer 2022-04-05 16:53:20 -04:00
parent c014b00b28
commit c29f9f72cd
No known key found for this signature in database
GPG key ID: 1260E46482E63562
3 changed files with 139 additions and 7 deletions

View file

@ -1722,6 +1722,7 @@ dist_patch_DATA = \
%D%/packages/patches/python-waitress-fix-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/qemu-build-info-manual.patch \
%D%/packages/patches/qemu-glibc-2.27.patch \
%D%/packages/patches/qemu-glibc-2.30.patch \

View file

@ -0,0 +1,130 @@
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__':

View file

@ -2,7 +2,7 @@
;;; Copyright © 2019, 2021, 2022 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2019, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
;;; Copyright © 2019, 2020, 2021 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2019, 2020, 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2019, 2020, 2021, 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2019, 2021 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;; Copyright © 2020 Julien Lepiller <julien@lepiller.eu>
;;; Copyright © 2020, 2022 Marius Bakke <marius@gnu.org>
@ -1673,7 +1673,7 @@ (define-public python-mypy-extensions
(define-public python-mypy
(package
(name "python-mypy")
(version "0.931")
(version "0.942")
(source
(origin
;; Because of https://github.com/python/mypy/issues/9584, the
@ -1690,9 +1690,10 @@ (define-public python-mypy
(file-name (git-file-name name version))
(sha256
(base32
"1v83flrdxh8grcp40qw04q4hzjflih9xwib64078vsxv2w36f817"))
"0hxnrqhvskiclwfj2s4gyfclzjas1dvpfxhyng8v7mq38rqps1j5"))
(patches
(search-patches "python-mypy-12332.patch"))))
(search-patches "python-mypy-12332.patch"
"python-mypy-use-sys-path.patch"))))
(build-system python-build-system)
(arguments
`(#:phases
@ -1714,10 +1715,10 @@ (define-public python-mypy
(home-page "http://www.mypy-lang.org/")
(synopsis "Static type checker for Python")
(description "Mypy is an optional static type checker for Python that aims
to combine the benefits of dynamic (or 'duck') typing and static typing. Mypy combines
to combine the benefits of dynamic typing and static typing. Mypy combines
the expressive power and convenience of Python with a powerful type system and
compile-time type checking. Mypy type checks standard Python programs; run them using
any Python VM with basically no runtime overhead.")
compile-time type checking. Mypy type checks standard Python programs; run
them using any Python VM with basically no runtime overhead.")
;; Most of the code is under MIT license; Some files are under Python Software
;; Foundation License version 2: stdlib-samples/*, mypyc/lib-rt/pythonsupport.h and
;; mypyc/lib-rt/getargs.c