From ace8adfbaecc8a9f1ce725617f87673afbfaca06 Mon Sep 17 00:00:00 2001 From: Konstantin Weddige Date: Thu, 4 Nov 2021 15:32:57 +0100 Subject: [PATCH 1/7] Install types to correct environment --- mypy/main.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mypy/main.py b/mypy/main.py index e478d65a6fcaf..916b5cc2df9a2 100644 --- a/mypy/main.py +++ b/mypy/main.py @@ -81,7 +81,7 @@ def main(script_path: Optional[str], stderr, options) if options.install_types and not sources: - install_types(options.cache_dir, formatter, non_interactive=options.non_interactive) + install_types(options.cache_dir, formatter, options, non_interactive=options.non_interactive) return res, messages, blockers = run_build(sources, options, fscache, t0, stdout, stderr) @@ -90,7 +90,7 @@ def main(script_path: Optional[str], missing_pkgs = read_types_packages_to_install(options.cache_dir, after_run=True) if missing_pkgs: # Install missing type packages and rerun build. - install_types(options.cache_dir, formatter, after_run=True, non_interactive=True) + install_types(options.cache_dir, formatter, options, after_run=True, non_interactive=True) fscache.flush() print() res, messages, blockers = run_build(sources, options, fscache, t0, stdout, stderr) @@ -117,7 +117,7 @@ def main(script_path: Optional[str], stdout.flush() if options.install_types and not options.non_interactive: - result = install_types(options.cache_dir, formatter, after_run=True, + result = install_types(options.cache_dir, formatter, options, after_run=True, non_interactive=False) if result: print() @@ -1148,6 +1148,7 @@ def read_types_packages_to_install(cache_dir: str, after_run: bool) -> List[str] def install_types(cache_dir: str, formatter: util.FancyFormatter, + options: Options, *, after_run: bool = False, non_interactive: bool = False) -> bool: @@ -1159,7 +1160,7 @@ def install_types(cache_dir: str, if after_run and not non_interactive: print() print('Installing missing stub packages:') - cmd = [sys.executable, '-m', 'pip', 'install'] + packages + cmd = [options.python_executable, '-m', 'pip', 'install'] + packages print(formatter.style(' '.join(cmd), 'none', bold=True)) print() if not non_interactive: From 7fea2323347578add44f5fcb7155e33c5bb75bf6 Mon Sep 17 00:00:00 2001 From: Konstantin Weddige Date: Thu, 4 Nov 2021 15:45:01 +0100 Subject: [PATCH 2/7] Fix line width --- mypy/main.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mypy/main.py b/mypy/main.py index 916b5cc2df9a2..b26d2230f10d0 100644 --- a/mypy/main.py +++ b/mypy/main.py @@ -81,7 +81,9 @@ def main(script_path: Optional[str], stderr, options) if options.install_types and not sources: - install_types(options.cache_dir, formatter, options, non_interactive=options.non_interactive) + install_types( + options.cache_dir, formatter, options, non_interactive=options.non_interactive + ) return res, messages, blockers = run_build(sources, options, fscache, t0, stdout, stderr) @@ -90,7 +92,9 @@ def main(script_path: Optional[str], missing_pkgs = read_types_packages_to_install(options.cache_dir, after_run=True) if missing_pkgs: # Install missing type packages and rerun build. - install_types(options.cache_dir, formatter, options, after_run=True, non_interactive=True) + install_types( + options.cache_dir, formatter, options, after_run=True, non_interactive=True + ) fscache.flush() print() res, messages, blockers = run_build(sources, options, fscache, t0, stdout, stderr) From 19ce4a68b34e85f973926ea045d6571379d462fc Mon Sep 17 00:00:00 2001 From: Konstantin Weddige Date: Thu, 4 Nov 2021 16:36:23 +0100 Subject: [PATCH 3/7] Fall back to previous behavior --- mypy/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mypy/main.py b/mypy/main.py index b26d2230f10d0..318549f6e4f54 100644 --- a/mypy/main.py +++ b/mypy/main.py @@ -1164,7 +1164,7 @@ def install_types(cache_dir: str, if after_run and not non_interactive: print() print('Installing missing stub packages:') - cmd = [options.python_executable, '-m', 'pip', 'install'] + packages + cmd = [options.python_executable or sys.executable, '-m', 'pip', 'install'] + packages print(formatter.style(' '.join(cmd), 'none', bold=True)) print() if not non_interactive: From 44342c3f5210a766864cddd2414969355cc33a74 Mon Sep 17 00:00:00 2001 From: Konstantin Weddige Date: Fri, 5 Nov 2021 10:14:11 +0100 Subject: [PATCH 4/7] Require python executable for install_types --- mypy/main.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mypy/main.py b/mypy/main.py index 318549f6e4f54..470d3cf0eed93 100644 --- a/mypy/main.py +++ b/mypy/main.py @@ -80,6 +80,10 @@ def main(script_path: Optional[str], fail("error: --install-types not supported with incremental mode disabled", stderr, options) + if options.install_types and options.python_executable is None: + fail("error: --install-types not supported without python executable or site packages", + stderr, options) + if options.install_types and not sources: install_types( options.cache_dir, formatter, options, non_interactive=options.non_interactive @@ -1164,7 +1168,8 @@ def install_types(cache_dir: str, if after_run and not non_interactive: print() print('Installing missing stub packages:') - cmd = [options.python_executable or sys.executable, '-m', 'pip', 'install'] + packages + assert options.python_executable, 'Python executable required to install types' + cmd = [options.python_executable, '-m', 'pip', 'install'] + packages print(formatter.style(' '.join(cmd), 'none', bold=True)) print() if not non_interactive: From ed52bad6c5b957447f18377201e5af6c9a1941ac Mon Sep 17 00:00:00 2001 From: Konstantin Weddige Date: Sun, 7 Nov 2021 16:11:13 +0100 Subject: [PATCH 5/7] Use options --- mypy/main.py | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/mypy/main.py b/mypy/main.py index 470d3cf0eed93..88a783c5162e8 100644 --- a/mypy/main.py +++ b/mypy/main.py @@ -85,9 +85,7 @@ def main(script_path: Optional[str], stderr, options) if options.install_types and not sources: - install_types( - options.cache_dir, formatter, options, non_interactive=options.non_interactive - ) + install_types(formatter, options, non_interactive=options.non_interactive) return res, messages, blockers = run_build(sources, options, fscache, t0, stdout, stderr) @@ -96,9 +94,7 @@ def main(script_path: Optional[str], missing_pkgs = read_types_packages_to_install(options.cache_dir, after_run=True) if missing_pkgs: # Install missing type packages and rerun build. - install_types( - options.cache_dir, formatter, options, after_run=True, non_interactive=True - ) + install_types(formatter, options, after_run=True, non_interactive=True) fscache.flush() print() res, messages, blockers = run_build(sources, options, fscache, t0, stdout, stderr) @@ -125,8 +121,7 @@ def main(script_path: Optional[str], stdout.flush() if options.install_types and not options.non_interactive: - result = install_types(options.cache_dir, formatter, options, after_run=True, - non_interactive=False) + result = install_types(formatter, options, after_run=True, non_interactive=False) if result: print() print("note: Run mypy again for up-to-date results with installed types") @@ -1154,14 +1149,13 @@ def read_types_packages_to_install(cache_dir: str, after_run: bool) -> List[str] return [line.strip() for line in f.readlines()] -def install_types(cache_dir: str, - formatter: util.FancyFormatter, +def install_types(formatter: util.FancyFormatter, options: Options, *, after_run: bool = False, non_interactive: bool = False) -> bool: """Install stub packages using pip if some missing stubs were detected.""" - packages = read_types_packages_to_install(cache_dir, after_run) + packages = read_types_packages_to_install(options.cache_dir, after_run) if not packages: # If there are no missing stubs, generate no output. return False From a4da93ad05abc4b362b3def3cdfed05bdeeba1a4 Mon Sep 17 00:00:00 2001 From: Konstantin Weddige Date: Wed, 24 Nov 2021 17:26:45 +0100 Subject: [PATCH 6/7] Add test case testCmdlineNonInteractiveInstallTypesNoSitepackages --- test-data/unit/cmdline.test | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test-data/unit/cmdline.test b/test-data/unit/cmdline.test index 93eb893d3c009..eff232e0d9a22 100644 --- a/test-data/unit/cmdline.test +++ b/test-data/unit/cmdline.test @@ -1303,6 +1303,12 @@ pkg.py:1: error: "int" not callable 1 + 2 [out] +[case testCmdlineNonInteractiveInstallTypesNoSitepackages] +# cmd: mypy --install-types --non-interactive --no-sitepackages -m pkg +[out] +error: --install-types not supported without python executable or site packages +== Return code: 2 + [case testCmdlineInteractiveInstallTypesNothingToDo] # cmd: mypy --install-types -m pkg [file pkg.py] From c28b89aefd5bbf3599c7948a6efa6f31428c2eda Mon Sep 17 00:00:00 2001 From: Konstantin Weddige Date: Wed, 24 Nov 2021 18:03:17 +0100 Subject: [PATCH 7/7] Fix typo --- test-data/unit/cmdline.test | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test-data/unit/cmdline.test b/test-data/unit/cmdline.test index eff232e0d9a22..dce924ea45c01 100644 --- a/test-data/unit/cmdline.test +++ b/test-data/unit/cmdline.test @@ -1303,8 +1303,8 @@ pkg.py:1: error: "int" not callable 1 + 2 [out] -[case testCmdlineNonInteractiveInstallTypesNoSitepackages] -# cmd: mypy --install-types --non-interactive --no-sitepackages -m pkg +[case testCmdlineNonInteractiveInstallTypesNoSitePackages] +# cmd: mypy --install-types --non-interactive --no-site-packages -m pkg [out] error: --install-types not supported without python executable or site packages == Return code: 2