unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
@ 2024-05-07  6:53 Lin Sun
  2024-05-11  9:05 ` Eli Zaretskii
                   ` (2 more replies)
  0 siblings, 3 replies; 49+ messages in thread
From: Lin Sun @ 2024-05-07  6:53 UTC (permalink / raw)
  To: 70815

[-- Attachment #1: Type: text/plain, Size: 453 bytes --]

Hi,
The python-tests.el will fail on finding interpreter "python" for
there is no "python"  on CentOS8, Ubuntu 20.04,  only "python3" exists
after installation.

And the patch will try to search python/python3/python2 as the python
testing interpreter; it also support a env var
"EMACS_PYTHON_INTERPRETER" to switch between different version of
python (eg: python3.6, python3.11, ...).

Please help review the  enhancement in "python-tests.el". Thanks.

[-- Attachment #2: 0001-Enahnce-python-tests.el-to-adapt-different-python-in.patch --]
[-- Type: text/x-patch, Size: 15880 bytes --]

From 49dfcecbbffaf15aa0414d15f22d8bcbf768ebb3 Mon Sep 17 00:00:00 2001
From: Lin Sun <sunlin7@hotmail.com>
Date: Fri, 3 May 2024 06:52:22 +0000
Subject: [PATCH] ; Enahnce python-tests.el to adapt different python
 interpreters

* test/lisp/progmodes/python-tests.el
  (python-tests-get-shell-interpreter): New function to get python
  interpreter for testing.
---
 test/lisp/progmodes/python-tests.el | 87 ++++++++++++++++-------------
 1 file changed, 48 insertions(+), 39 deletions(-)

diff --git a/test/lisp/progmodes/python-tests.el b/test/lisp/progmodes/python-tests.el
index f50797953c3..6da149925ec 100644
--- a/test/lisp/progmodes/python-tests.el
+++ b/test/lisp/progmodes/python-tests.el
@@ -3718,7 +3718,16 @@ if x:
 \f
 ;;; Shell integration
 
-(defvar python-tests-shell-interpreter "python")
+(defvar python-tests-shell-interpreter nil)
+
+(defun python-tests-get-shell-interpreter (&optional refresh)
+  (if (and python-tests-shell-interpreter (null refresh))
+      python-tests-shell-interpreter
+    (setq python-tests-shell-interpreter
+          (or (when-let* ((interpreter (getenv "EMACS_PYTHON_INTERPRETER")))
+                (or (executable-find interpreter)
+                    (error "Not found EMACS_PYTHON_INTERPRETER: %s" interpreter)))
+              (cl-some #'executable-find '("python" "python3" "python2"))))))
 
 (ert-deftest python-shell-get-process-name-1 ()
   "Check process name calculation sans `buffer-file-name'."
@@ -3980,13 +3989,13 @@ if x:
 
 (ert-deftest python-shell-make-comint-1 ()
   "Check comint creation for global shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   ;; The interpreter can get killed too quickly to allow it to clean
   ;; up the tempfiles that the default python-shell-setup-codes create,
   ;; so it leaves tempfiles behind, which is a minor irritation.
   (let* ((python-shell-setup-codes nil)
          (python-shell-interpreter
-          (executable-find python-tests-shell-interpreter))
+          (python-tests-get-shell-interpreter))
          (proc-name (python-shell-get-process-name nil))
          (shell-buffer
           (python-tests-with-temp-buffer
@@ -4004,10 +4013,10 @@ if x:
 
 (ert-deftest python-shell-make-comint-2 ()
   "Check comint creation for internal shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((python-shell-setup-codes nil)
          (python-shell-interpreter
-          (executable-find python-tests-shell-interpreter))
+          (python-tests-get-shell-interpreter))
          (proc-name (python-shell-internal-get-process-name))
          (shell-buffer
           (python-tests-with-temp-buffer
@@ -4028,13 +4037,13 @@ if x:
 The command passed to `python-shell-make-comint' as argument must
 locally override global values set in `python-shell-interpreter'
 and `python-shell-interpreter-args' in the new shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((python-shell-setup-codes nil)
          (python-shell-interpreter "interpreter")
          (python-shell-interpreter-args "--some-args")
          (proc-name (python-shell-get-process-name nil))
          (interpreter-override
-          (concat (executable-find python-tests-shell-interpreter) " " "-i"))
+          (concat (python-tests-get-shell-interpreter) " " "-i"))
          (shell-buffer
           (python-tests-with-temp-buffer
            "" (python-shell-make-comint interpreter-override proc-name nil)))
@@ -4047,17 +4056,17 @@ and `python-shell-interpreter-args' in the new shell buffer."
             (should (eq major-mode 'inferior-python-mode))
             (should (file-equal-p
                      python-shell-interpreter
-                     (executable-find python-tests-shell-interpreter)))
+                     (python-tests-get-shell-interpreter)))
             (should (string= python-shell-interpreter-args "-i"))))
       (kill-buffer shell-buffer))))
 
 (ert-deftest python-shell-make-comint-4 ()
   "Check shell calculated prompts regexps are set."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((process-environment process-environment)
          (python-shell-setup-codes nil)
          (python-shell-interpreter
-          (executable-find python-tests-shell-interpreter))
+          (python-tests-get-shell-interpreter))
          (python-shell-interpreter-args "-i")
          (python-shell--prompt-calculated-input-regexp nil)
          (python-shell--prompt-calculated-output-regexp nil)
@@ -4099,12 +4108,12 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-get-process-1 ()
   "Check dedicated shell process preference over global."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-file
       ""
     (let* ((python-shell-setup-codes nil)
            (python-shell-interpreter
-            (executable-find python-tests-shell-interpreter))
+            (python-tests-get-shell-interpreter))
            (global-proc-name (python-shell-get-process-name nil))
            (dedicated-proc-name (python-shell-get-process-name t))
            (global-shell-buffer
@@ -4132,12 +4141,12 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-internal-get-or-create-process-1 ()
   "Check internal shell process creation fallback."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-file
    ""
    (should (not (process-live-p (python-shell-internal-get-process-name))))
    (let* ((python-shell-interpreter
-           (executable-find python-tests-shell-interpreter))
+           (python-tests-get-shell-interpreter))
           (internal-process-name (python-shell-internal-get-process-name))
           (internal-process (python-shell-internal-get-or-create-process))
           (internal-shell-buffer (process-buffer internal-process)))
@@ -4155,7 +4164,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-1 ()
   "Check prompt autodetection."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let ((process-environment process-environment))
     ;; Ensure no startup file is enabled
     (setenv "PYTHONSTARTUP" "")
@@ -4164,7 +4173,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-2 ()
   "Check prompt autodetection with startup file.  Bug#17370."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((process-environment process-environment)
          (startup-code (concat "import sys\n"
                                "sys.ps1 = 'py> '\n"
@@ -4181,7 +4190,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-3 ()
   "Check prompts are not autodetected when feature is disabled."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let ((process-environment process-environment)
         (python-shell-prompt-detect-enabled nil))
     ;; Ensure no startup file is enabled
@@ -4190,7 +4199,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-4 ()
   "Check warning is shown when detection fails."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((process-environment process-environment)
          ;; Trigger failure by removing prompts in the startup file
          (startup-code (concat "import sys\n"
@@ -4211,7 +4220,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-5 ()
   "Check disabled warnings are not shown when detection fails."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((process-environment process-environment)
          (startup-code (concat "import sys\n"
                                "sys.ps1 = ''\n"
@@ -4232,7 +4241,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-6 ()
   "Warnings are not shown when detection is disabled."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((process-environment process-environment)
          (startup-code (concat "import sys\n"
                                "sys.ps1 = ''\n"
@@ -4396,7 +4405,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-set-calculated-regexps-6 ()
   "Check detected prompts are included `regexp-quote'd."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((python-shell-prompt-input-regexps '(""))
          (python-shell-prompt-output-regexps '(""))
          (python-shell-prompt-regexp "")
@@ -4779,7 +4788,7 @@ def foo():
     (should (python-shell-completion-native-interpreter-disabled-p))))
 
 (ert-deftest python-shell-completion-at-point-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    ""
    (python-shell-with-shell-buffer
@@ -4793,7 +4802,7 @@ def foo():
      (should-not (nth 2 (python-shell-completion-at-point))))))
 
 (ert-deftest python-shell-completion-at-point-native-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    ""
    (python-shell-completion-native-turn-on)
@@ -4872,14 +4881,14 @@ def foo():
   "Return Jedi readline setup file if PYTHONSTARTUP is not set."
   (or (getenv "PYTHONSTARTUP")
       (with-temp-buffer
-        (if (eql 0 (call-process python-tests-shell-interpreter
+        (if (eql 0 (call-process (python-tests-get-shell-interpreter)
                                  nil t nil "-m" "jedi" "repl"))
             (string-trim (buffer-string))
           ""))))
 
 (ert-deftest python-shell-completion-at-point-jedi-completer ()
   "Check if Python shell completion works when Jedi completer is used."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (with-environment-variables
       (("PYTHONSTARTUP" (python-tests--pythonstartup-file)))
     (python-tests-with-temp-buffer-with-shell
@@ -4924,7 +4933,7 @@ def foo():
 ;;; Symbol completion
 
 (ert-deftest python-completion-at-point-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -4942,7 +4951,7 @@ import abc
 
 (ert-deftest python-completion-at-point-2 ()
   "Should work regardless of the point in the Shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -4960,7 +4969,7 @@ import abc
 
 (ert-deftest python-completion-at-point-pdb-1 ()
   "Should not complete PDB commands in Python buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import pdb
@@ -4979,7 +4988,7 @@ print('Hello')
 
 (ert-deftest python-completion-at-point-while-running-1 ()
   "Should not try to complete when a program is running in the Shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import time
@@ -4995,7 +5004,7 @@ time.sleep(3)
      (should-not (with-timeout (1 t) (completion-at-point))))))
 
 (ert-deftest python-completion-at-point-native-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5014,7 +5023,7 @@ import abc
 
 (ert-deftest python-completion-at-point-native-2 ()
   "Should work regardless of the point in the Shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5032,7 +5041,7 @@ import abc
      (should (completion-at-point)))))
 
 (ert-deftest python-completion-at-point-native-with-ffap-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5050,7 +5059,7 @@ import abc
      (should (completion-at-point)))))
 
 (ert-deftest python-completion-at-point-native-with-eldoc-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5077,7 +5086,7 @@ import abc
 ;;; FFAP
 
 (ert-deftest python-ffap-module-path-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5089,7 +5098,7 @@ import abc
 
 (ert-deftest python-ffap-module-path-while-running-1 ()
   "Should not get module path when a program is running in the Shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5165,7 +5174,7 @@ some_symbol   some_other_symbol
                     "some_symbol"))))
 
 (ert-deftest python-eldoc--get-doc-at-point-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import time
@@ -5178,7 +5187,7 @@ import time
 
 (ert-deftest python-eldoc--get-doc-at-point-while-running-1 ()
   "Should not get documentation when a program is running in the Shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import time
@@ -7396,7 +7405,7 @@ buffer with overlapping strings."
 ;; interpreter.
 (ert-deftest python-tests--run-python-selects-window ()
   "Test for bug#31398.  See also bug#44421 and bug#52380."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((buffer (process-buffer (run-python nil nil 'show)))
          (window (get-buffer-window buffer)))
     ;; We look at `selected-window' rather than `current-buffer'
@@ -7467,7 +7476,7 @@ buffer with overlapping strings."
                        "W0611: Unused import a.b.c (unused-import)"))))))
 
 (ert-deftest python-test--shell-send-block ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
     "print('current 0')
 for x in range(1,3):
-- 
2.20.5


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-07  6:53 bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters Lin Sun
@ 2024-05-11  9:05 ` Eli Zaretskii
  2024-05-11 13:37   ` kobarity
  2024-05-18 22:20 ` Stefan Kangas
  2024-05-26 10:52 ` Mattias Engdegård
  2 siblings, 1 reply; 49+ messages in thread
From: Eli Zaretskii @ 2024-05-11  9:05 UTC (permalink / raw)
  To: Lin Sun, kobarity; +Cc: 70815

> From: Lin Sun <sunlin7.mail@gmail.com>
> Date: Tue, 7 May 2024 06:53:05 +0000
> 
> The python-tests.el will fail on finding interpreter "python" for
> there is no "python"  on CentOS8, Ubuntu 20.04,  only "python3" exists
> after installation.

Thanks, I have some comments, and maybe kobarity will have as well.

> +(defun python-tests-get-shell-interpreter (&optional refresh)

AFAICT, this function is never called with the optional REFRESH
argument non-nil, so why do we need it?

> +  (if (and python-tests-shell-interpreter (null refresh))
> +      python-tests-shell-interpreter
> +    (setq python-tests-shell-interpreter
> +          (or (when-let* ((interpreter (getenv "EMACS_PYTHON_INTERPRETER")))
> +                (or (executable-find interpreter)
> +                    (error "Not found EMACS_PYTHON_INTERPRETER: %s" interpreter)))

Is it indeed useful to error out here?  Should we instead fall back to
the default list, '("python" "python3" "python2") ?

> +              (cl-some #'executable-find '("python" "python3" "python2"))))))

cl-some is in cl-extra, so the test should require it.





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-11  9:05 ` Eli Zaretskii
@ 2024-05-11 13:37   ` kobarity
  2024-05-11 14:27     ` Lin Sun
  0 siblings, 1 reply; 49+ messages in thread
From: kobarity @ 2024-05-11 13:37 UTC (permalink / raw)
  To: Lin Sun, Eli Zaretskii; +Cc: 70815


Eli Zaretskii wrote:
> 
> > From: Lin Sun <sunlin7.mail@gmail.com>
> > Date: Tue, 7 May 2024 06:53:05 +0000
> > 
> > The python-tests.el will fail on finding interpreter "python" for
> > there is no "python"  on CentOS8, Ubuntu 20.04,  only "python3" exists
> > after installation.
> 
> Thanks, I have some comments, and maybe kobarity will have as well.

Hi Lin,

Please correct the typo "Enahnce" in the title.

I think the summary line of this commit should not begin with a
semicolon.  CONTRIBUTE says:

  If the summary line starts with a semicolon and a space "; ", the
  commit message will be skipped and not added to the generated
  ChangeLog file.  Use this for minor commits that do not need to be
  mentioned in the ChangeLog file, such as changes in etc/NEWS, typo
  fixes, etc.

When revising the patch, please include the bug number.  CONTRIBUTE
says:

- The commit message should contain "Bug#NNNNN" if it is related to
  bug number NNNNN in the debbugs database.  This string is often
  parenthesized, as in "(Bug#19003)".

python-tests-get-shell-interpreter should have an docstring.  This can
be checked with checkdoc.  CONTRIBUTE says:

  Use 'checkdoc' to check for documentation errors before submitting a
  patch.

I recommend to use Flymake or Flycheck.  There are many violations in
python-tests.el, but I think it is better for new patches to follow
this rule.

when-let* used in python-tests-get-shell-interpreter could be replaced
with when-let.





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-11 13:37   ` kobarity
@ 2024-05-11 14:27     ` Lin Sun
  2024-05-12  2:06       ` kobarity
  0 siblings, 1 reply; 49+ messages in thread
From: Lin Sun @ 2024-05-11 14:27 UTC (permalink / raw)
  To: kobarity; +Cc: Eli Zaretskii, 70815

[-- Attachment #1: Type: text/plain, Size: 1720 bytes --]

On Sat, May 11, 2024, 06:37 kobarity <kobarity@gmail.com> wrote:

>
> Eli Zaretskii wrote:
> >
> > > From: Lin Sun <sunlin7.mail@gmail.com>
> > > Date: Tue, 7 May 2024 06:53:05 +0000
> > >
> > > The python-tests.el will fail on finding interpreter "python" for
> > > there is no "python"  on CentOS8, Ubuntu 20.04,  only "python3" exists
> > > after installation.
> >
> > Thanks, I have some comments, and maybe kobarity will have as well.
>
> Hi Lin,
>
> Please correct the typo "Enahnce" in the title.
>
> I think the summary line of this commit should not begin with a
> semicolon.  CONTRIBUTE says:
>
>   If the summary line starts with a semicolon and a space "; ", the
>   commit message will be skipped and not added to the generated
>   ChangeLog file.  Use this for minor commits that do not need to be
>   mentioned in the ChangeLog file, such as changes in etc/NEWS, typo
>   fixes, etc.
>
> When revising the patch, please include the bug number.  CONTRIBUTE
> says:
>
> - The commit message should contain "Bug#NNNNN" if it is related to
>   bug number NNNNN in the debbugs database.  This string is often
>   parenthesized, as in "(Bug#19003)".
>
> python-tests-get-shell-interpreter should have an docstring.  This can
> be checked with checkdoc.  CONTRIBUTE says:
>
>   Use 'checkdoc' to check for documentation errors before submitting a
>   patch.
>
> I recommend to use Flymake or Flycheck.  There are many violations in
> python-tests.el, but I think it is better for new patches to follow
> this rule.
>
> when-let* used in python-tests-get-shell-interpreter could be replaced
> with when-let.
>

Hi Eli, kobarit,
I'm trying change the code to follow your comments, will update later,
thank you!

>

[-- Attachment #2: Type: text/html, Size: 2593 bytes --]

^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-11 14:27     ` Lin Sun
@ 2024-05-12  2:06       ` kobarity
  0 siblings, 0 replies; 49+ messages in thread
From: kobarity @ 2024-05-12  2:06 UTC (permalink / raw)
  To: Lin Sun; +Cc: Eli Zaretskii, 70815


Lin Sun wrote:
> On Sat, May 11, 2024, 06:37 kobarity <kobarity@gmail.com> wrote:
> 
>  Eli Zaretskii wrote:
>  > 
>  > > From: Lin Sun <sunlin7.mail@gmail.com>
>  > > Date: Tue, 7 May 2024 06:53:05 +0000
>  > > 
>  > > The python-tests.el will fail on finding interpreter "python" for
>  > > there is no "python"  on CentOS8, Ubuntu 20.04,  only "python3" exists
>  > > after installation.
>  > 
>  > Thanks, I have some comments, and maybe kobarity will have as well.
> 
>  Hi Lin,
> 
>  Please correct the typo "Enahnce" in the title.
> 
>  I think the summary line of this commit should not begin with a
>  semicolon.  CONTRIBUTE says:
> 
>    If the summary line starts with a semicolon and a space "; ", the
>    commit message will be skipped and not added to the generated
>    ChangeLog file.  Use this for minor commits that do not need to be
>    mentioned in the ChangeLog file, such as changes in etc/NEWS, typo
>    fixes, etc.
> 
>  When revising the patch, please include the bug number.  CONTRIBUTE
>  says:
> 
>  - The commit message should contain "Bug#NNNNN" if it is related to
>    bug number NNNNN in the debbugs database.  This string is often
>    parenthesized, as in "(Bug#19003)".
> 
>  python-tests-get-shell-interpreter should have an docstring.  This can
>  be checked with checkdoc.  CONTRIBUTE says:
> 
>    Use 'checkdoc' to check for documentation errors before submitting a
>    patch.
> 
>  I recommend to use Flymake or Flycheck.  There are many violations in
>  python-tests.el, but I think it is better for new patches to follow
>  this rule.
> 
>  when-let* used in python-tests-get-shell-interpreter could be replaced
>  with when-let.
> 
> Hi Eli, kobarit,
> I'm trying change the code to follow your comments, will update later, thank you!

Hi Lin,
I noticed another issue.  If there is only python2 in the PATH and no
python or python3, some tests will fail.

20 unexpected results:
   FAILED  python-completion-at-point-1
   FAILED  python-completion-at-point-2
   FAILED  python-completion-at-point-native-1
   FAILED  python-completion-at-point-native-2
   FAILED  python-completion-at-point-native-with-eldoc-1
   FAILED  python-completion-at-point-native-with-ffap-1
   FAILED  python-completion-at-point-pdb-1
   FAILED  python-completion-at-point-while-running-1
   FAILED  python-eldoc--get-doc-at-point-1
   FAILED  python-eldoc--get-doc-at-point-while-running-1
   FAILED  python-ffap-module-path-1
   FAILED  python-ffap-module-path-while-running-1
   FAILED  python-shell-completion-at-point-1
   FAILED  python-shell-completion-at-point-jedi-completer
   FAILED  python-shell-completion-at-point-native-1
   FAILED  python-shell-prompt-detect-1
   FAILED  python-shell-prompt-detect-2
   FAILED  python-shell-prompt-set-calculated-regexps-6
   FAILED  python-test--shell-send-block
   FAILED  python-tests--run-python-selects-window

This is because `python-shell-interpreter' is not let-bound and is set
to "python3".

One way to resolve these would be to provide a thin wrapper like
`python-tests-shell-with-shell-buffer' and bind
`python-shell-interpreter' to (python-tests-get-shell-interpreter).

Current ERTs seem to support both Python 2/3, but it may become
necessary to write an ERT that supports only Python 3.  It would be
nice if the author of the ERT could specify an interpreter, but there
may be no need to prepare one now.





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-07  6:53 bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters Lin Sun
  2024-05-11  9:05 ` Eli Zaretskii
@ 2024-05-18 22:20 ` Stefan Kangas
  2024-05-19  5:54   ` Eli Zaretskii
  2024-05-26 10:52 ` Mattias Engdegård
  2 siblings, 1 reply; 49+ messages in thread
From: Stefan Kangas @ 2024-05-18 22:20 UTC (permalink / raw)
  To: Lin Sun, 70815; +Cc: kobarity

Lin Sun <sunlin7.mail@gmail.com> writes:

> From 49dfcecbbffaf15aa0414d15f22d8bcbf768ebb3 Mon Sep 17 00:00:00 2001
> From: Lin Sun <sunlin7@hotmail.com>
> Date: Fri, 3 May 2024 06:52:22 +0000
> Subject: [PATCH] ; Enahnce python-tests.el to adapt different python
>  interpreters
>
> * test/lisp/progmodes/python-tests.el
>   (python-tests-get-shell-interpreter): New function to get python
>   interpreter for testing.
> ---
>  test/lisp/progmodes/python-tests.el | 87 ++++++++++++++++-------------
>  1 file changed, 48 insertions(+), 39 deletions(-)
>
> diff --git a/test/lisp/progmodes/python-tests.el b/test/lisp/progmodes/python-tests.el
> index f50797953c3..6da149925ec 100644
> --- a/test/lisp/progmodes/python-tests.el
> +++ b/test/lisp/progmodes/python-tests.el
> @@ -3718,7 +3718,16 @@ if x:
>  \f
>  ;;; Shell integration
>
> -(defvar python-tests-shell-interpreter "python")
> +(defvar python-tests-shell-interpreter nil)
> +
> +(defun python-tests-get-shell-interpreter (&optional refresh)
> +  (if (and python-tests-shell-interpreter (null refresh))
> +      python-tests-shell-interpreter
> +    (setq python-tests-shell-interpreter
> +          (or (when-let* ((interpreter (getenv "EMACS_PYTHON_INTERPRETER")))
> +                (or (executable-find interpreter)
> +                    (error "Not found EMACS_PYTHON_INTERPRETER: %s" interpreter)))
> +              (cl-some #'executable-find '("python" "python3" "python2"))))))

It makes sense to look for "python3", but is it really useful to look
for "python2" at this point?





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-18 22:20 ` Stefan Kangas
@ 2024-05-19  5:54   ` Eli Zaretskii
  2024-05-20  0:08     ` Lin Sun
  0 siblings, 1 reply; 49+ messages in thread
From: Eli Zaretskii @ 2024-05-19  5:54 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: kobarity, sunlin7.mail, 70815

> Cc: kobarity <kobarity@gmail.com>
> From: Stefan Kangas <stefankangas@gmail.com>
> Date: Sat, 18 May 2024 22:20:44 +0000
> 
> It makes sense to look for "python3", but is it really useful to look
> for "python2" at this point?

I don't think we want to drop Python 2.x support, not yet.





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-19  5:54   ` Eli Zaretskii
@ 2024-05-20  0:08     ` Lin Sun
  2024-05-20 15:52       ` kobarity
  0 siblings, 1 reply; 49+ messages in thread
From: Lin Sun @ 2024-05-20  0:08 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: kobarity, Stefan Kangas, 70815

[-- Attachment #1: Type: text/plain, Size: 260 bytes --]

Hi,
I attached the latest patch, hope it resolved all your concerns.
> If there is only python2 in the PATH and no python or python3, some tests will fail.
It's caused by the python.el didn't search "python2", so it may need
another patch to change python.el.

[-- Attachment #2: 0001-Enahnce-python-tests.el-to-adapt-different-python-in.patch --]
[-- Type: text/x-patch, Size: 16203 bytes --]

From 69c63565e2615a73df8cc7f0afd7346b5f0b801e Mon Sep 17 00:00:00 2001
From: Lin Sun <sunlin7@hotmail.com>
Date: Fri, 3 May 2024 06:52:22 +0000
Subject: [PATCH] Enahnce python-tests.el to adapt different python
 interpreters (bug#70815)

* test/lisp/progmodes/python-tests.el
  (python-tests-get-shell-interpreter): New function to get python
  interpreter for testing; and also introduce new env variable
  EMACS_PYTHON_INTERPRETER to support customer python interpreter.
---
 test/lisp/progmodes/python-tests.el | 91 ++++++++++++++++-------------
 1 file changed, 52 insertions(+), 39 deletions(-)

diff --git a/test/lisp/progmodes/python-tests.el b/test/lisp/progmodes/python-tests.el
index f50797953c3..809258e6f66 100644
--- a/test/lisp/progmodes/python-tests.el
+++ b/test/lisp/progmodes/python-tests.el
@@ -21,6 +21,7 @@
 
 ;;; Code:
 
+(require 'cl-extra)
 (require 'ert)
 (require 'ert-x)
 (require 'python)
@@ -3718,7 +3719,19 @@ if x:
 \f
 ;;; Shell integration
 
-(defvar python-tests-shell-interpreter "python")
+(defvar python-tests-shell-interpreter nil)
+
+(defun python-tests-get-shell-interpreter ()
+  "Get the shell interpreter.
+If env string EMACS_PYTHON_INTERPRETER exists, use it as prefered one."
+  (if python-tests-shell-interpreter
+      python-tests-shell-interpreter
+    (setq python-tests-shell-interpreter
+          (or (when-let ((interpreter (getenv "EMACS_PYTHON_INTERPRETER")))
+                (or (executable-find interpreter)
+                    (error "Can't found EMACS_PYTHON_INTERPRETER(%s) in path"
+                           interpreter)))
+              (cl-some #'executable-find '("python" "python3" "python2"))))))
 
 (ert-deftest python-shell-get-process-name-1 ()
   "Check process name calculation sans `buffer-file-name'."
@@ -3980,13 +3993,13 @@ if x:
 
 (ert-deftest python-shell-make-comint-1 ()
   "Check comint creation for global shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   ;; The interpreter can get killed too quickly to allow it to clean
   ;; up the tempfiles that the default python-shell-setup-codes create,
   ;; so it leaves tempfiles behind, which is a minor irritation.
   (let* ((python-shell-setup-codes nil)
          (python-shell-interpreter
-          (executable-find python-tests-shell-interpreter))
+          (python-tests-get-shell-interpreter))
          (proc-name (python-shell-get-process-name nil))
          (shell-buffer
           (python-tests-with-temp-buffer
@@ -4004,10 +4017,10 @@ if x:
 
 (ert-deftest python-shell-make-comint-2 ()
   "Check comint creation for internal shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((python-shell-setup-codes nil)
          (python-shell-interpreter
-          (executable-find python-tests-shell-interpreter))
+          (python-tests-get-shell-interpreter))
          (proc-name (python-shell-internal-get-process-name))
          (shell-buffer
           (python-tests-with-temp-buffer
@@ -4028,13 +4041,13 @@ if x:
 The command passed to `python-shell-make-comint' as argument must
 locally override global values set in `python-shell-interpreter'
 and `python-shell-interpreter-args' in the new shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((python-shell-setup-codes nil)
          (python-shell-interpreter "interpreter")
          (python-shell-interpreter-args "--some-args")
          (proc-name (python-shell-get-process-name nil))
          (interpreter-override
-          (concat (executable-find python-tests-shell-interpreter) " " "-i"))
+          (concat (python-tests-get-shell-interpreter) " " "-i"))
          (shell-buffer
           (python-tests-with-temp-buffer
            "" (python-shell-make-comint interpreter-override proc-name nil)))
@@ -4047,17 +4060,17 @@ and `python-shell-interpreter-args' in the new shell buffer."
             (should (eq major-mode 'inferior-python-mode))
             (should (file-equal-p
                      python-shell-interpreter
-                     (executable-find python-tests-shell-interpreter)))
+                     (python-tests-get-shell-interpreter)))
             (should (string= python-shell-interpreter-args "-i"))))
       (kill-buffer shell-buffer))))
 
 (ert-deftest python-shell-make-comint-4 ()
   "Check shell calculated prompts regexps are set."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((process-environment process-environment)
          (python-shell-setup-codes nil)
          (python-shell-interpreter
-          (executable-find python-tests-shell-interpreter))
+          (python-tests-get-shell-interpreter))
          (python-shell-interpreter-args "-i")
          (python-shell--prompt-calculated-input-regexp nil)
          (python-shell--prompt-calculated-output-regexp nil)
@@ -4099,12 +4112,12 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-get-process-1 ()
   "Check dedicated shell process preference over global."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-file
       ""
     (let* ((python-shell-setup-codes nil)
            (python-shell-interpreter
-            (executable-find python-tests-shell-interpreter))
+            (python-tests-get-shell-interpreter))
            (global-proc-name (python-shell-get-process-name nil))
            (dedicated-proc-name (python-shell-get-process-name t))
            (global-shell-buffer
@@ -4132,12 +4145,12 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-internal-get-or-create-process-1 ()
   "Check internal shell process creation fallback."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-file
    ""
    (should (not (process-live-p (python-shell-internal-get-process-name))))
    (let* ((python-shell-interpreter
-           (executable-find python-tests-shell-interpreter))
+           (python-tests-get-shell-interpreter))
           (internal-process-name (python-shell-internal-get-process-name))
           (internal-process (python-shell-internal-get-or-create-process))
           (internal-shell-buffer (process-buffer internal-process)))
@@ -4155,7 +4168,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-1 ()
   "Check prompt autodetection."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let ((process-environment process-environment))
     ;; Ensure no startup file is enabled
     (setenv "PYTHONSTARTUP" "")
@@ -4164,7 +4177,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-2 ()
   "Check prompt autodetection with startup file.  Bug#17370."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((process-environment process-environment)
          (startup-code (concat "import sys\n"
                                "sys.ps1 = 'py> '\n"
@@ -4181,7 +4194,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-3 ()
   "Check prompts are not autodetected when feature is disabled."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let ((process-environment process-environment)
         (python-shell-prompt-detect-enabled nil))
     ;; Ensure no startup file is enabled
@@ -4190,7 +4203,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-4 ()
   "Check warning is shown when detection fails."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((process-environment process-environment)
          ;; Trigger failure by removing prompts in the startup file
          (startup-code (concat "import sys\n"
@@ -4211,7 +4224,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-5 ()
   "Check disabled warnings are not shown when detection fails."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((process-environment process-environment)
          (startup-code (concat "import sys\n"
                                "sys.ps1 = ''\n"
@@ -4232,7 +4245,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-6 ()
   "Warnings are not shown when detection is disabled."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((process-environment process-environment)
          (startup-code (concat "import sys\n"
                                "sys.ps1 = ''\n"
@@ -4396,7 +4409,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-set-calculated-regexps-6 ()
   "Check detected prompts are included `regexp-quote'd."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((python-shell-prompt-input-regexps '(""))
          (python-shell-prompt-output-regexps '(""))
          (python-shell-prompt-regexp "")
@@ -4779,7 +4792,7 @@ def foo():
     (should (python-shell-completion-native-interpreter-disabled-p))))
 
 (ert-deftest python-shell-completion-at-point-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    ""
    (python-shell-with-shell-buffer
@@ -4793,7 +4806,7 @@ def foo():
      (should-not (nth 2 (python-shell-completion-at-point))))))
 
 (ert-deftest python-shell-completion-at-point-native-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    ""
    (python-shell-completion-native-turn-on)
@@ -4872,14 +4885,14 @@ def foo():
   "Return Jedi readline setup file if PYTHONSTARTUP is not set."
   (or (getenv "PYTHONSTARTUP")
       (with-temp-buffer
-        (if (eql 0 (call-process python-tests-shell-interpreter
+        (if (eql 0 (call-process (python-tests-get-shell-interpreter)
                                  nil t nil "-m" "jedi" "repl"))
             (string-trim (buffer-string))
           ""))))
 
 (ert-deftest python-shell-completion-at-point-jedi-completer ()
   "Check if Python shell completion works when Jedi completer is used."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (with-environment-variables
       (("PYTHONSTARTUP" (python-tests--pythonstartup-file)))
     (python-tests-with-temp-buffer-with-shell
@@ -4924,7 +4937,7 @@ def foo():
 ;;; Symbol completion
 
 (ert-deftest python-completion-at-point-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -4942,7 +4955,7 @@ import abc
 
 (ert-deftest python-completion-at-point-2 ()
   "Should work regardless of the point in the Shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -4960,7 +4973,7 @@ import abc
 
 (ert-deftest python-completion-at-point-pdb-1 ()
   "Should not complete PDB commands in Python buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import pdb
@@ -4979,7 +4992,7 @@ print('Hello')
 
 (ert-deftest python-completion-at-point-while-running-1 ()
   "Should not try to complete when a program is running in the Shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import time
@@ -4995,7 +5008,7 @@ time.sleep(3)
      (should-not (with-timeout (1 t) (completion-at-point))))))
 
 (ert-deftest python-completion-at-point-native-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5014,7 +5027,7 @@ import abc
 
 (ert-deftest python-completion-at-point-native-2 ()
   "Should work regardless of the point in the Shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5032,7 +5045,7 @@ import abc
      (should (completion-at-point)))))
 
 (ert-deftest python-completion-at-point-native-with-ffap-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5050,7 +5063,7 @@ import abc
      (should (completion-at-point)))))
 
 (ert-deftest python-completion-at-point-native-with-eldoc-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5077,7 +5090,7 @@ import abc
 ;;; FFAP
 
 (ert-deftest python-ffap-module-path-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5089,7 +5102,7 @@ import abc
 
 (ert-deftest python-ffap-module-path-while-running-1 ()
   "Should not get module path when a program is running in the Shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5165,7 +5178,7 @@ some_symbol   some_other_symbol
                     "some_symbol"))))
 
 (ert-deftest python-eldoc--get-doc-at-point-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import time
@@ -5178,7 +5191,7 @@ import time
 
 (ert-deftest python-eldoc--get-doc-at-point-while-running-1 ()
   "Should not get documentation when a program is running in the Shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import time
@@ -7396,7 +7409,7 @@ buffer with overlapping strings."
 ;; interpreter.
 (ert-deftest python-tests--run-python-selects-window ()
   "Test for bug#31398.  See also bug#44421 and bug#52380."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((buffer (process-buffer (run-python nil nil 'show)))
          (window (get-buffer-window buffer)))
     ;; We look at `selected-window' rather than `current-buffer'
@@ -7467,7 +7480,7 @@ buffer with overlapping strings."
                        "W0611: Unused import a.b.c (unused-import)"))))))
 
 (ert-deftest python-test--shell-send-block ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
     "print('current 0')
 for x in range(1,3):
-- 
2.20.5


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-20  0:08     ` Lin Sun
@ 2024-05-20 15:52       ` kobarity
  2024-05-20 17:51         ` Lin Sun
  0 siblings, 1 reply; 49+ messages in thread
From: kobarity @ 2024-05-20 15:52 UTC (permalink / raw)
  To: Lin Sun; +Cc: Eli Zaretskii, Stefan Kangas, 70815

[-- Attachment #1: Type: text/plain, Size: 1621 bytes --]


Eli Zaretskii wrote:
> > Cc: kobarity <kobarity@gmail.com>
> > From: Stefan Kangas <stefankangas@gmail.com>
> > Date: Sat, 18 May 2024 22:20:44 +0000
> > 
> > It makes sense to look for "python3", but is it really useful to look
> > for "python2" at this point?
> I don't think we want to drop Python 2.x support, not yet.

I don't want to drop Python 2 support either, but I don't think the
addition of the "python2" command is mandatory.  As the current master
does not run the "python2" command either.  However, I don't think it
is a bad idea to add the "python2" command. 

Lin Sun wrote:
> Hi,
> I attached the latest patch, hope it resolved all your concerns.

Hi Lin,
There is still a typo "Enahnce" in the summary line, and there is a
typo in the docstring of `python-tests-get-shell-interpreter' as well.

> > If there is only python2 in the PATH and no python or python3, some tests will fail.
> It's caused by the python.el didn't search "python2", so it may need
> another patch to change python.el.

I don't think so.  Attached is a diff to your patch to resolve this
issue.  It let-binds `python-shell-interpreter' in some ERTs.  It
also includes the fix of the typo in the docstring of
`python-tests-get-shell-interpreter'.

Without these modifications, EMACS_PYTHON_INTERPRETER will not work as
expected either on those ERTs.

As for EMACS_PYTHON_INTERPRETER, I am a little doubtful that it is the
right thing to introduce.  It allows the ERT runner to specify the
interpreter.  It's OK for ERTs that can be run on both Python 2 and 3,
but you may want to write an ERT that can only be run on Python 3.

[-- Attachment #2: fix-70815.diff --]
[-- Type: application/octet-stream, Size: 3486 bytes --]

diff --git a/test/lisp/progmodes/python-tests.el b/test/lisp/progmodes/python-tests.el
index 3bedf86fb5f..fa8fa74fa88 100644
--- a/test/lisp/progmodes/python-tests.el
+++ b/test/lisp/progmodes/python-tests.el
@@ -59,7 +59,8 @@ python-tests-with-temp-buffer-with-shell
   (let ((dir (make-symbol "dir")))
     `(with-temp-buffer
        (let ((python-indent-guess-indent-offset nil)
-             (python-shell-completion-native-enable nil))
+             (python-shell-completion-native-enable nil)
+             (python-shell-interpreter (python-tests-get-shell-interpreter)))
          (python-mode)
          (unwind-protect
              ;; Prevent test failures when Jedi is used as a completion
@@ -3743,7 +3744,7 @@ python-tests-shell-interpreter
 
 (defun python-tests-get-shell-interpreter ()
   "Get the shell interpreter.
-If env string EMACS_PYTHON_INTERPRETER exists, use it as prefered one."
+If env string EMACS_PYTHON_INTERPRETER exists, use it as preferred one."
   (if python-tests-shell-interpreter
       python-tests-shell-interpreter
     (setq python-tests-shell-interpreter
@@ -4188,8 +4189,9 @@ python-shell-internal-get-or-create-process-1
 
 (ert-deftest python-shell-prompt-detect-1 ()
   "Check prompt autodetection."
-  (skip-unless (python-tests-get-shell-interpreter))
-  (let ((process-environment process-environment))
+  (let ((process-environment process-environment)
+        (python-shell-interpreter (python-tests-get-shell-interpreter)))
+    (skip-unless python-shell-interpreter)
     ;; Ensure no startup file is enabled
     (setenv "PYTHONSTARTUP" "")
     (should python-shell-prompt-detect-enabled)
@@ -4197,13 +4199,14 @@ python-shell-prompt-detect-1
 
 (ert-deftest python-shell-prompt-detect-2 ()
   "Check prompt autodetection with startup file.  Bug#17370."
-  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((process-environment process-environment)
+         (python-shell-interpreter (python-tests-get-shell-interpreter))
          (startup-code (concat "import sys\n"
                                "sys.ps1 = 'py> '\n"
                                "sys.ps2 = '..> '\n"
                                "sys.ps3 = 'out '\n"))
          (startup-file (python-shell--save-temp-file startup-code)))
+    (skip-unless python-shell-interpreter)
     (unwind-protect
         (progn
           ;; Ensure startup file is enabled
@@ -4439,6 +4442,7 @@ python-shell-prompt-set-calculated-regexps-6
          (python-shell--prompt-calculated-input-regexp nil)
          (python-shell--prompt-calculated-output-regexp nil)
          (python-shell-prompt-detect-enabled t)
+         (python-shell-interpreter (python-tests-get-shell-interpreter))
          (process-environment process-environment)
          (startup-code (concat "import sys\n"
                                "sys.ps1 = 'p.> '\n"
@@ -7430,7 +7434,8 @@ python-tests--python-nav-end-of-statement--infloop
 (ert-deftest python-tests--run-python-selects-window ()
   "Test for bug#31398.  See also bug#44421 and bug#52380."
   (skip-unless (python-tests-get-shell-interpreter))
-  (let* ((buffer (process-buffer (run-python nil nil 'show)))
+  (let* ((python-shell-interpreter (python-tests-get-shell-interpreter))
+         (buffer (process-buffer (run-python nil nil 'show)))
          (window (get-buffer-window buffer)))
     ;; We look at `selected-window' rather than `current-buffer'
     ;; because as `(elisp)Current buffer' says, the latter will only

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-20 15:52       ` kobarity
@ 2024-05-20 17:51         ` Lin Sun
  2024-05-21 14:04           ` kobarity
  0 siblings, 1 reply; 49+ messages in thread
From: Lin Sun @ 2024-05-20 17:51 UTC (permalink / raw)
  To: kobarity; +Cc: Eli Zaretskii, Stefan Kangas, 70815

[-- Attachment #1: Type: text/plain, Size: 1998 bytes --]

On Mon, May 20, 2024 at 3:53 PM kobarity <kobarity@gmail.com> wrote:
> Eli Zaretskii wrote:
> > > Cc: kobarity <kobarity@gmail.com>
> > > From: Stefan Kangas <stefankangas@gmail.com>
> > > Date: Sat, 18 May 2024 22:20:44 +0000
> > >
> > > It makes sense to look for "python3", but is it really useful to look
> > > for "python2" at this point?
> > I don't think we want to drop Python 2.x support, not yet.
>
> I don't want to drop Python 2 support either, but I don't think the
> addition of the "python2" command is mandatory.  As the current master
> does not run the "python2" command either.  However, I don't think it
> is a bad idea to add the "python2" command.
>
> Lin Sun wrote:
> > Hi,
> > I attached the latest patch, hope it resolved all your concerns.
>
> Hi Lin,
> There is still a typo "Enahnce" in the summary line, and there is a
> typo in the docstring of `python-tests-get-shell-interpreter' as well.
>
> > > If there is only python2 in the PATH and no python or python3, some tests will fail.
> > It's caused by the python.el didn't search "python2", so it may need
> > another patch to change python.el.
>
> I don't think so.  Attached is a diff to your patch to resolve this
> issue.  It let-binds `python-shell-interpreter' in some ERTs.  It
> also includes the fix of the typo in the docstring of
> `python-tests-get-shell-interpreter'.
>
> Without these modifications, EMACS_PYTHON_INTERPRETER will not work as
> expected either on those ERTs.
>
> As for EMACS_PYTHON_INTERPRETER, I am a little doubtful that it is the
> right thing to introduce.  It allows the ERT runner to specify the
> interpreter.  It's OK for ERTs that can be run on both Python 2 and 3,
> but you may want to write an ERT that can only be run on Python 3.

Thank you for the comments, now get your points and agree with you.
I merged your patch together, also corrected the typo in the commit message.
Please help review the attached patch. Thank you !

[-- Attachment #2: 0001-Enhance-python-tests.el-to-adapt-different-python-in.patch --]
[-- Type: text/x-patch, Size: 17932 bytes --]

From fadff4b761043f26f8a54970358c10a301bad5bd Mon Sep 17 00:00:00 2001
From: Lin Sun <sunlin7@hotmail.com>
Date: Fri, 3 May 2024 06:52:22 +0000
Subject: [PATCH] Enhance python-tests.el to adapt different python
 interpreters (bug#70815)

* test/lisp/progmodes/python-tests.el
  (python-tests-get-shell-interpreter): New function to get python
  interpreter for testing; and also introduce new env variable
  EMACS_PYTHON_INTERPRETER to support customer python interpreter.

Co-authored-by: kobarity <kobarity@gmail.com>
---
 test/lisp/progmodes/python-tests.el | 102 ++++++++++++++++------------
 1 file changed, 60 insertions(+), 42 deletions(-)

diff --git a/test/lisp/progmodes/python-tests.el b/test/lisp/progmodes/python-tests.el
index f50797953c3..bec989520bd 100644
--- a/test/lisp/progmodes/python-tests.el
+++ b/test/lisp/progmodes/python-tests.el
@@ -21,6 +21,7 @@
 
 ;;; Code:
 
+(require 'cl-extra)
 (require 'ert)
 (require 'ert-x)
 (require 'python)
@@ -58,7 +59,8 @@ turned off.  Shell buffer will be killed on exit."
   (let ((dir (make-symbol "dir")))
     `(with-temp-buffer
        (let ((python-indent-guess-indent-offset nil)
-             (python-shell-completion-native-enable nil))
+             (python-shell-completion-native-enable nil)
+             (python-shell-interpreter (python-tests-get-shell-interpreter)))
          (python-mode)
          (unwind-protect
              ;; Prevent test failures when Jedi is used as a completion
@@ -3718,7 +3720,19 @@ if x:
 \f
 ;;; Shell integration
 
-(defvar python-tests-shell-interpreter "python")
+(defvar python-tests-shell-interpreter nil)
+
+(defun python-tests-get-shell-interpreter ()
+  "Get the shell interpreter.
+If env string EMACS_PYTHON_INTERPRETER exists, use it as preferred one."
+  (if python-tests-shell-interpreter
+      python-tests-shell-interpreter
+    (setq python-tests-shell-interpreter
+          (or (when-let ((interpreter (getenv "EMACS_PYTHON_INTERPRETER")))
+                (or (executable-find interpreter)
+                    (error "Can't found EMACS_PYTHON_INTERPRETER(%s) in path"
+                           interpreter)))
+              (cl-some #'executable-find '("python" "python3" "python2"))))))
 
 (ert-deftest python-shell-get-process-name-1 ()
   "Check process name calculation sans `buffer-file-name'."
@@ -3980,13 +3994,13 @@ if x:
 
 (ert-deftest python-shell-make-comint-1 ()
   "Check comint creation for global shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   ;; The interpreter can get killed too quickly to allow it to clean
   ;; up the tempfiles that the default python-shell-setup-codes create,
   ;; so it leaves tempfiles behind, which is a minor irritation.
   (let* ((python-shell-setup-codes nil)
          (python-shell-interpreter
-          (executable-find python-tests-shell-interpreter))
+          (python-tests-get-shell-interpreter))
          (proc-name (python-shell-get-process-name nil))
          (shell-buffer
           (python-tests-with-temp-buffer
@@ -4004,10 +4018,10 @@ if x:
 
 (ert-deftest python-shell-make-comint-2 ()
   "Check comint creation for internal shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((python-shell-setup-codes nil)
          (python-shell-interpreter
-          (executable-find python-tests-shell-interpreter))
+          (python-tests-get-shell-interpreter))
          (proc-name (python-shell-internal-get-process-name))
          (shell-buffer
           (python-tests-with-temp-buffer
@@ -4028,13 +4042,13 @@ if x:
 The command passed to `python-shell-make-comint' as argument must
 locally override global values set in `python-shell-interpreter'
 and `python-shell-interpreter-args' in the new shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((python-shell-setup-codes nil)
          (python-shell-interpreter "interpreter")
          (python-shell-interpreter-args "--some-args")
          (proc-name (python-shell-get-process-name nil))
          (interpreter-override
-          (concat (executable-find python-tests-shell-interpreter) " " "-i"))
+          (concat (python-tests-get-shell-interpreter) " " "-i"))
          (shell-buffer
           (python-tests-with-temp-buffer
            "" (python-shell-make-comint interpreter-override proc-name nil)))
@@ -4047,17 +4061,17 @@ and `python-shell-interpreter-args' in the new shell buffer."
             (should (eq major-mode 'inferior-python-mode))
             (should (file-equal-p
                      python-shell-interpreter
-                     (executable-find python-tests-shell-interpreter)))
+                     (python-tests-get-shell-interpreter)))
             (should (string= python-shell-interpreter-args "-i"))))
       (kill-buffer shell-buffer))))
 
 (ert-deftest python-shell-make-comint-4 ()
   "Check shell calculated prompts regexps are set."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((process-environment process-environment)
          (python-shell-setup-codes nil)
          (python-shell-interpreter
-          (executable-find python-tests-shell-interpreter))
+          (python-tests-get-shell-interpreter))
          (python-shell-interpreter-args "-i")
          (python-shell--prompt-calculated-input-regexp nil)
          (python-shell--prompt-calculated-output-regexp nil)
@@ -4099,12 +4113,12 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-get-process-1 ()
   "Check dedicated shell process preference over global."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-file
       ""
     (let* ((python-shell-setup-codes nil)
            (python-shell-interpreter
-            (executable-find python-tests-shell-interpreter))
+            (python-tests-get-shell-interpreter))
            (global-proc-name (python-shell-get-process-name nil))
            (dedicated-proc-name (python-shell-get-process-name t))
            (global-shell-buffer
@@ -4132,12 +4146,12 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-internal-get-or-create-process-1 ()
   "Check internal shell process creation fallback."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-file
    ""
    (should (not (process-live-p (python-shell-internal-get-process-name))))
    (let* ((python-shell-interpreter
-           (executable-find python-tests-shell-interpreter))
+           (python-tests-get-shell-interpreter))
           (internal-process-name (python-shell-internal-get-process-name))
           (internal-process (python-shell-internal-get-or-create-process))
           (internal-shell-buffer (process-buffer internal-process)))
@@ -4155,8 +4169,9 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-1 ()
   "Check prompt autodetection."
-  (skip-unless (executable-find python-tests-shell-interpreter))
-  (let ((process-environment process-environment))
+  (let ((process-environment process-environment)
+        (python-shell-interpreter (python-tests-get-shell-interpreter)))
+    (skip-unless python-shell-interpreter)
     ;; Ensure no startup file is enabled
     (setenv "PYTHONSTARTUP" "")
     (should python-shell-prompt-detect-enabled)
@@ -4164,13 +4179,14 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-2 ()
   "Check prompt autodetection with startup file.  Bug#17370."
-  (skip-unless (executable-find python-tests-shell-interpreter))
   (let* ((process-environment process-environment)
+         (python-shell-interpreter (python-tests-get-shell-interpreter))
          (startup-code (concat "import sys\n"
                                "sys.ps1 = 'py> '\n"
                                "sys.ps2 = '..> '\n"
                                "sys.ps3 = 'out '\n"))
          (startup-file (python-shell--save-temp-file startup-code)))
+    (skip-unless python-shell-interpreter)
     (unwind-protect
         (progn
           ;; Ensure startup file is enabled
@@ -4181,7 +4197,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-3 ()
   "Check prompts are not autodetected when feature is disabled."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let ((process-environment process-environment)
         (python-shell-prompt-detect-enabled nil))
     ;; Ensure no startup file is enabled
@@ -4190,7 +4206,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-4 ()
   "Check warning is shown when detection fails."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((process-environment process-environment)
          ;; Trigger failure by removing prompts in the startup file
          (startup-code (concat "import sys\n"
@@ -4211,7 +4227,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-5 ()
   "Check disabled warnings are not shown when detection fails."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((process-environment process-environment)
          (startup-code (concat "import sys\n"
                                "sys.ps1 = ''\n"
@@ -4232,7 +4248,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-6 ()
   "Warnings are not shown when detection is disabled."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((process-environment process-environment)
          (startup-code (concat "import sys\n"
                                "sys.ps1 = ''\n"
@@ -4396,7 +4412,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-set-calculated-regexps-6 ()
   "Check detected prompts are included `regexp-quote'd."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((python-shell-prompt-input-regexps '(""))
          (python-shell-prompt-output-regexps '(""))
          (python-shell-prompt-regexp "")
@@ -4406,6 +4422,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
          (python-shell--prompt-calculated-input-regexp nil)
          (python-shell--prompt-calculated-output-regexp nil)
          (python-shell-prompt-detect-enabled t)
+         (python-shell-interpreter (python-tests-get-shell-interpreter))
          (process-environment process-environment)
          (startup-code (concat "import sys\n"
                                "sys.ps1 = 'p.> '\n"
@@ -4779,7 +4796,7 @@ def foo():
     (should (python-shell-completion-native-interpreter-disabled-p))))
 
 (ert-deftest python-shell-completion-at-point-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    ""
    (python-shell-with-shell-buffer
@@ -4793,7 +4810,7 @@ def foo():
      (should-not (nth 2 (python-shell-completion-at-point))))))
 
 (ert-deftest python-shell-completion-at-point-native-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    ""
    (python-shell-completion-native-turn-on)
@@ -4872,14 +4889,14 @@ def foo():
   "Return Jedi readline setup file if PYTHONSTARTUP is not set."
   (or (getenv "PYTHONSTARTUP")
       (with-temp-buffer
-        (if (eql 0 (call-process python-tests-shell-interpreter
+        (if (eql 0 (call-process (python-tests-get-shell-interpreter)
                                  nil t nil "-m" "jedi" "repl"))
             (string-trim (buffer-string))
           ""))))
 
 (ert-deftest python-shell-completion-at-point-jedi-completer ()
   "Check if Python shell completion works when Jedi completer is used."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (with-environment-variables
       (("PYTHONSTARTUP" (python-tests--pythonstartup-file)))
     (python-tests-with-temp-buffer-with-shell
@@ -4924,7 +4941,7 @@ def foo():
 ;;; Symbol completion
 
 (ert-deftest python-completion-at-point-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -4942,7 +4959,7 @@ import abc
 
 (ert-deftest python-completion-at-point-2 ()
   "Should work regardless of the point in the Shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -4960,7 +4977,7 @@ import abc
 
 (ert-deftest python-completion-at-point-pdb-1 ()
   "Should not complete PDB commands in Python buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import pdb
@@ -4979,7 +4996,7 @@ print('Hello')
 
 (ert-deftest python-completion-at-point-while-running-1 ()
   "Should not try to complete when a program is running in the Shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import time
@@ -4995,7 +5012,7 @@ time.sleep(3)
      (should-not (with-timeout (1 t) (completion-at-point))))))
 
 (ert-deftest python-completion-at-point-native-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5014,7 +5031,7 @@ import abc
 
 (ert-deftest python-completion-at-point-native-2 ()
   "Should work regardless of the point in the Shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5032,7 +5049,7 @@ import abc
      (should (completion-at-point)))))
 
 (ert-deftest python-completion-at-point-native-with-ffap-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5050,7 +5067,7 @@ import abc
      (should (completion-at-point)))))
 
 (ert-deftest python-completion-at-point-native-with-eldoc-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5077,7 +5094,7 @@ import abc
 ;;; FFAP
 
 (ert-deftest python-ffap-module-path-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5089,7 +5106,7 @@ import abc
 
 (ert-deftest python-ffap-module-path-while-running-1 ()
   "Should not get module path when a program is running in the Shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5165,7 +5182,7 @@ some_symbol   some_other_symbol
                     "some_symbol"))))
 
 (ert-deftest python-eldoc--get-doc-at-point-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import time
@@ -5178,7 +5195,7 @@ import time
 
 (ert-deftest python-eldoc--get-doc-at-point-while-running-1 ()
   "Should not get documentation when a program is running in the Shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import time
@@ -7396,8 +7413,9 @@ buffer with overlapping strings."
 ;; interpreter.
 (ert-deftest python-tests--run-python-selects-window ()
   "Test for bug#31398.  See also bug#44421 and bug#52380."
-  (skip-unless (executable-find python-tests-shell-interpreter))
-  (let* ((buffer (process-buffer (run-python nil nil 'show)))
+  (skip-unless (python-tests-get-shell-interpreter))
+  (let* ((python-shell-interpreter (python-tests-get-shell-interpreter))
+         (buffer (process-buffer (run-python nil nil 'show)))
          (window (get-buffer-window buffer)))
     ;; We look at `selected-window' rather than `current-buffer'
     ;; because as `(elisp)Current buffer' says, the latter will only
@@ -7467,7 +7485,7 @@ buffer with overlapping strings."
                        "W0611: Unused import a.b.c (unused-import)"))))))
 
 (ert-deftest python-test--shell-send-block ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
     "print('current 0')
 for x in range(1,3):
-- 
2.20.5


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-20 17:51         ` Lin Sun
@ 2024-05-21 14:04           ` kobarity
  2024-05-21 15:34             ` Lin Sun
  0 siblings, 1 reply; 49+ messages in thread
From: kobarity @ 2024-05-21 14:04 UTC (permalink / raw)
  To: Lin Sun; +Cc: Eli Zaretskii, Stefan Kangas, 70815

[-- Attachment #1: Type: text/plain, Size: 2321 bytes --]


Lin Sun wrote:
> On Mon, May 20, 2024 at 3:53 PM kobarity <kobarity@gmail.com> wrote:
> > Eli Zaretskii wrote:
> > > > Cc: kobarity <kobarity@gmail.com>
> > > > From: Stefan Kangas <stefankangas@gmail.com>
> > > > Date: Sat, 18 May 2024 22:20:44 +0000
> > > >
> > > > It makes sense to look for "python3", but is it really useful to look
> > > > for "python2" at this point?
> > > I don't think we want to drop Python 2.x support, not yet.
> >
> > I don't want to drop Python 2 support either, but I don't think the
> > addition of the "python2" command is mandatory.  As the current master
> > does not run the "python2" command either.  However, I don't think it
> > is a bad idea to add the "python2" command.
> >
> > Lin Sun wrote:
> > > Hi,
> > > I attached the latest patch, hope it resolved all your concerns.
> >
> > Hi Lin,
> > There is still a typo "Enahnce" in the summary line, and there is a
> > typo in the docstring of `python-tests-get-shell-interpreter' as well.
> >
> > > > If there is only python2 in the PATH and no python or python3, some tests will fail.
> > > It's caused by the python.el didn't search "python2", so it may need
> > > another patch to change python.el.
> >
> > I don't think so.  Attached is a diff to your patch to resolve this
> > issue.  It let-binds `python-shell-interpreter' in some ERTs.  It
> > also includes the fix of the typo in the docstring of
> > `python-tests-get-shell-interpreter'.
> >
> > Without these modifications, EMACS_PYTHON_INTERPRETER will not work as
> > expected either on those ERTs.
> >
> > As for EMACS_PYTHON_INTERPRETER, I am a little doubtful that it is the
> > right thing to introduce.  It allows the ERT runner to specify the
> > interpreter.  It's OK for ERTs that can be run on both Python 2 and 3,
> > but you may want to write an ERT that can only be run on Python 3.
> 
> Thank you for the comments, now get your points and agree with you.
> I merged your patch together, also corrected the typo in the commit message.
> Please help review the attached patch. Thank you !

Sorry, there was a problem in my diff.  Two tests fail when
EMACS_PYTHON_INTERPRETER is not found.  Please apply the attached
diff.  It also includes a suggestion for improving the error message.
Please consider.

[-- Attachment #2: fix-70815-2.diff --]
[-- Type: application/octet-stream, Size: 1960 bytes --]

diff --git a/test/lisp/progmodes/python-tests.el b/test/lisp/progmodes/python-tests.el
index fa8fa74fa88..b19c5c31f16 100644
--- a/test/lisp/progmodes/python-tests.el
+++ b/test/lisp/progmodes/python-tests.el
@@ -3750,7 +3750,7 @@ python-tests-get-shell-interpreter
     (setq python-tests-shell-interpreter
           (or (when-let ((interpreter (getenv "EMACS_PYTHON_INTERPRETER")))
                 (or (executable-find interpreter)
-                    (error "Can't found EMACS_PYTHON_INTERPRETER(%s) in path"
+                    (error "Couldn't find EMACS_PYTHON_INTERPRETER(%s) in path"
                            interpreter)))
               (cl-some #'executable-find '("python" "python3" "python2"))))))
 
@@ -4189,9 +4189,9 @@ python-shell-internal-get-or-create-process-1
 
 (ert-deftest python-shell-prompt-detect-1 ()
   "Check prompt autodetection."
+  (skip-unless (python-tests-get-shell-interpreter))
   (let ((process-environment process-environment)
         (python-shell-interpreter (python-tests-get-shell-interpreter)))
-    (skip-unless python-shell-interpreter)
     ;; Ensure no startup file is enabled
     (setenv "PYTHONSTARTUP" "")
     (should python-shell-prompt-detect-enabled)
@@ -4199,6 +4199,7 @@ python-shell-prompt-detect-1
 
 (ert-deftest python-shell-prompt-detect-2 ()
   "Check prompt autodetection with startup file.  Bug#17370."
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((process-environment process-environment)
          (python-shell-interpreter (python-tests-get-shell-interpreter))
          (startup-code (concat "import sys\n"
@@ -4206,7 +4207,6 @@ python-shell-prompt-detect-2
                                "sys.ps2 = '..> '\n"
                                "sys.ps3 = 'out '\n"))
          (startup-file (python-shell--save-temp-file startup-code)))
-    (skip-unless python-shell-interpreter)
     (unwind-protect
         (progn
           ;; Ensure startup file is enabled

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-21 14:04           ` kobarity
@ 2024-05-21 15:34             ` Lin Sun
  2024-05-22 14:38               ` kobarity
  0 siblings, 1 reply; 49+ messages in thread
From: Lin Sun @ 2024-05-21 15:34 UTC (permalink / raw)
  To: kobarity; +Cc: Eli Zaretskii, Stefan Kangas, 70815

[-- Attachment #1: Type: text/plain, Size: 2630 bytes --]

On Tue, May 21, 2024 at 2:04 PM kobarity <kobarity@gmail.com> wrote:
>
>
> Lin Sun wrote:
> > On Mon, May 20, 2024 at 3:53 PM kobarity <kobarity@gmail.com> wrote:
> > > Eli Zaretskii wrote:
> > > > > Cc: kobarity <kobarity@gmail.com>
> > > > > From: Stefan Kangas <stefankangas@gmail.com>
> > > > > Date: Sat, 18 May 2024 22:20:44 +0000
> > > > >
> > > > > It makes sense to look for "python3", but is it really useful to look
> > > > > for "python2" at this point?
> > > > I don't think we want to drop Python 2.x support, not yet.
> > >
> > > I don't want to drop Python 2 support either, but I don't think the
> > > addition of the "python2" command is mandatory.  As the current master
> > > does not run the "python2" command either.  However, I don't think it
> > > is a bad idea to add the "python2" command.
> > >
> > > Lin Sun wrote:
> > > > Hi,
> > > > I attached the latest patch, hope it resolved all your concerns.
> > >
> > > Hi Lin,
> > > There is still a typo "Enahnce" in the summary line, and there is a
> > > typo in the docstring of `python-tests-get-shell-interpreter' as well.
> > >
> > > > > If there is only python2 in the PATH and no python or python3, some tests will fail.
> > > > It's caused by the python.el didn't search "python2", so it may need
> > > > another patch to change python.el.
> > >
> > > I don't think so.  Attached is a diff to your patch to resolve this
> > > issue.  It let-binds `python-shell-interpreter' in some ERTs.  It
> > > also includes the fix of the typo in the docstring of
> > > `python-tests-get-shell-interpreter'.
> > >
> > > Without these modifications, EMACS_PYTHON_INTERPRETER will not work as
> > > expected either on those ERTs.
> > >
> > > As for EMACS_PYTHON_INTERPRETER, I am a little doubtful that it is the
> > > right thing to introduce.  It allows the ERT runner to specify the
> > > interpreter.  It's OK for ERTs that can be run on both Python 2 and 3,
> > > but you may want to write an ERT that can only be run on Python 3.
> >
> > Thank you for the comments, now get your points and agree with you.
> > I merged your patch together, also corrected the typo in the commit message.
> > Please help review the attached patch. Thank you !
>
> Sorry, there was a problem in my diff.  Two tests fail when
> EMACS_PYTHON_INTERPRETER is not found.  Please apply the attached
> diff.  It also includes a suggestion for improving the error message.
> Please consider.

Merged your changes and tested on my local (with python/python3), it
works perfectly. Thank you.

And the patch file is attached .

[-- Attachment #2: 0001-Enhance-python-tests.el-to-adapt-different-python-in.patch --]
[-- Type: text/x-patch, Size: 17745 bytes --]

From 918de75b5e5de1c052c6d8067b8232d04d9869ce Mon Sep 17 00:00:00 2001
From: Lin Sun <sunlin7@hotmail.com>
Date: Fri, 3 May 2024 06:52:22 +0000
Subject: [PATCH] Enhance python-tests.el to adapt different python
 interpreters (bug#70815)

* test/lisp/progmodes/python-tests.el
  (python-tests-get-shell-interpreter): New function to get python
  interpreter for testing; and also introduce new env variable
  EMACS_PYTHON_INTERPRETER to support customer python interpreter.

Co-authored-by: kobarity <kobarity@gmail.com>
---
 test/lisp/progmodes/python-tests.el | 102 ++++++++++++++++------------
 1 file changed, 60 insertions(+), 42 deletions(-)

diff --git a/test/lisp/progmodes/python-tests.el b/test/lisp/progmodes/python-tests.el
index f50797953c3..4364c11a76b 100644
--- a/test/lisp/progmodes/python-tests.el
+++ b/test/lisp/progmodes/python-tests.el
@@ -21,6 +21,7 @@
 
 ;;; Code:
 
+(require 'cl-extra)
 (require 'ert)
 (require 'ert-x)
 (require 'python)
@@ -58,7 +59,8 @@ turned off.  Shell buffer will be killed on exit."
   (let ((dir (make-symbol "dir")))
     `(with-temp-buffer
        (let ((python-indent-guess-indent-offset nil)
-             (python-shell-completion-native-enable nil))
+             (python-shell-completion-native-enable nil)
+             (python-shell-interpreter (python-tests-get-shell-interpreter)))
          (python-mode)
          (unwind-protect
              ;; Prevent test failures when Jedi is used as a completion
@@ -3718,7 +3720,19 @@ if x:
 \f
 ;;; Shell integration
 
-(defvar python-tests-shell-interpreter "python")
+(defvar python-tests-shell-interpreter nil)
+
+(defun python-tests-get-shell-interpreter ()
+  "Get the shell interpreter.
+If env string EMACS_PYTHON_INTERPRETER exists, use it as preferred one."
+  (if python-tests-shell-interpreter
+      python-tests-shell-interpreter
+    (setq python-tests-shell-interpreter
+          (or (when-let ((interpreter (getenv "EMACS_PYTHON_INTERPRETER")))
+                (or (executable-find interpreter)
+                    (error "Couldn't find EMACS_PYTHON_INTERPRETER(%s) in path"
+                           interpreter)))
+              (cl-some #'executable-find '("python" "python3" "python2"))))))
 
 (ert-deftest python-shell-get-process-name-1 ()
   "Check process name calculation sans `buffer-file-name'."
@@ -3980,13 +3994,13 @@ if x:
 
 (ert-deftest python-shell-make-comint-1 ()
   "Check comint creation for global shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   ;; The interpreter can get killed too quickly to allow it to clean
   ;; up the tempfiles that the default python-shell-setup-codes create,
   ;; so it leaves tempfiles behind, which is a minor irritation.
   (let* ((python-shell-setup-codes nil)
          (python-shell-interpreter
-          (executable-find python-tests-shell-interpreter))
+          (python-tests-get-shell-interpreter))
          (proc-name (python-shell-get-process-name nil))
          (shell-buffer
           (python-tests-with-temp-buffer
@@ -4004,10 +4018,10 @@ if x:
 
 (ert-deftest python-shell-make-comint-2 ()
   "Check comint creation for internal shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((python-shell-setup-codes nil)
          (python-shell-interpreter
-          (executable-find python-tests-shell-interpreter))
+          (python-tests-get-shell-interpreter))
          (proc-name (python-shell-internal-get-process-name))
          (shell-buffer
           (python-tests-with-temp-buffer
@@ -4028,13 +4042,13 @@ if x:
 The command passed to `python-shell-make-comint' as argument must
 locally override global values set in `python-shell-interpreter'
 and `python-shell-interpreter-args' in the new shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((python-shell-setup-codes nil)
          (python-shell-interpreter "interpreter")
          (python-shell-interpreter-args "--some-args")
          (proc-name (python-shell-get-process-name nil))
          (interpreter-override
-          (concat (executable-find python-tests-shell-interpreter) " " "-i"))
+          (concat (python-tests-get-shell-interpreter) " " "-i"))
          (shell-buffer
           (python-tests-with-temp-buffer
            "" (python-shell-make-comint interpreter-override proc-name nil)))
@@ -4047,17 +4061,17 @@ and `python-shell-interpreter-args' in the new shell buffer."
             (should (eq major-mode 'inferior-python-mode))
             (should (file-equal-p
                      python-shell-interpreter
-                     (executable-find python-tests-shell-interpreter)))
+                     (python-tests-get-shell-interpreter)))
             (should (string= python-shell-interpreter-args "-i"))))
       (kill-buffer shell-buffer))))
 
 (ert-deftest python-shell-make-comint-4 ()
   "Check shell calculated prompts regexps are set."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((process-environment process-environment)
          (python-shell-setup-codes nil)
          (python-shell-interpreter
-          (executable-find python-tests-shell-interpreter))
+          (python-tests-get-shell-interpreter))
          (python-shell-interpreter-args "-i")
          (python-shell--prompt-calculated-input-regexp nil)
          (python-shell--prompt-calculated-output-regexp nil)
@@ -4099,12 +4113,12 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-get-process-1 ()
   "Check dedicated shell process preference over global."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-file
       ""
     (let* ((python-shell-setup-codes nil)
            (python-shell-interpreter
-            (executable-find python-tests-shell-interpreter))
+            (python-tests-get-shell-interpreter))
            (global-proc-name (python-shell-get-process-name nil))
            (dedicated-proc-name (python-shell-get-process-name t))
            (global-shell-buffer
@@ -4132,12 +4146,12 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-internal-get-or-create-process-1 ()
   "Check internal shell process creation fallback."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-file
    ""
    (should (not (process-live-p (python-shell-internal-get-process-name))))
    (let* ((python-shell-interpreter
-           (executable-find python-tests-shell-interpreter))
+           (python-tests-get-shell-interpreter))
           (internal-process-name (python-shell-internal-get-process-name))
           (internal-process (python-shell-internal-get-or-create-process))
           (internal-shell-buffer (process-buffer internal-process)))
@@ -4155,8 +4169,9 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-1 ()
   "Check prompt autodetection."
-  (skip-unless (executable-find python-tests-shell-interpreter))
-  (let ((process-environment process-environment))
+  (skip-unless (python-tests-get-shell-interpreter))
+  (let ((process-environment process-environment)
+        (python-shell-interpreter (python-tests-get-shell-interpreter)))
     ;; Ensure no startup file is enabled
     (setenv "PYTHONSTARTUP" "")
     (should python-shell-prompt-detect-enabled)
@@ -4164,8 +4179,9 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-2 ()
   "Check prompt autodetection with startup file.  Bug#17370."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((process-environment process-environment)
+         (python-shell-interpreter (python-tests-get-shell-interpreter))
          (startup-code (concat "import sys\n"
                                "sys.ps1 = 'py> '\n"
                                "sys.ps2 = '..> '\n"
@@ -4181,7 +4197,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-3 ()
   "Check prompts are not autodetected when feature is disabled."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let ((process-environment process-environment)
         (python-shell-prompt-detect-enabled nil))
     ;; Ensure no startup file is enabled
@@ -4190,7 +4206,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-4 ()
   "Check warning is shown when detection fails."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((process-environment process-environment)
          ;; Trigger failure by removing prompts in the startup file
          (startup-code (concat "import sys\n"
@@ -4211,7 +4227,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-5 ()
   "Check disabled warnings are not shown when detection fails."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((process-environment process-environment)
          (startup-code (concat "import sys\n"
                                "sys.ps1 = ''\n"
@@ -4232,7 +4248,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-detect-6 ()
   "Warnings are not shown when detection is disabled."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((process-environment process-environment)
          (startup-code (concat "import sys\n"
                                "sys.ps1 = ''\n"
@@ -4396,7 +4412,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
 
 (ert-deftest python-shell-prompt-set-calculated-regexps-6 ()
   "Check detected prompts are included `regexp-quote'd."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (let* ((python-shell-prompt-input-regexps '(""))
          (python-shell-prompt-output-regexps '(""))
          (python-shell-prompt-regexp "")
@@ -4406,6 +4422,7 @@ and `python-shell-interpreter-args' in the new shell buffer."
          (python-shell--prompt-calculated-input-regexp nil)
          (python-shell--prompt-calculated-output-regexp nil)
          (python-shell-prompt-detect-enabled t)
+         (python-shell-interpreter (python-tests-get-shell-interpreter))
          (process-environment process-environment)
          (startup-code (concat "import sys\n"
                                "sys.ps1 = 'p.> '\n"
@@ -4779,7 +4796,7 @@ def foo():
     (should (python-shell-completion-native-interpreter-disabled-p))))
 
 (ert-deftest python-shell-completion-at-point-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    ""
    (python-shell-with-shell-buffer
@@ -4793,7 +4810,7 @@ def foo():
      (should-not (nth 2 (python-shell-completion-at-point))))))
 
 (ert-deftest python-shell-completion-at-point-native-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    ""
    (python-shell-completion-native-turn-on)
@@ -4872,14 +4889,14 @@ def foo():
   "Return Jedi readline setup file if PYTHONSTARTUP is not set."
   (or (getenv "PYTHONSTARTUP")
       (with-temp-buffer
-        (if (eql 0 (call-process python-tests-shell-interpreter
+        (if (eql 0 (call-process (python-tests-get-shell-interpreter)
                                  nil t nil "-m" "jedi" "repl"))
             (string-trim (buffer-string))
           ""))))
 
 (ert-deftest python-shell-completion-at-point-jedi-completer ()
   "Check if Python shell completion works when Jedi completer is used."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (with-environment-variables
       (("PYTHONSTARTUP" (python-tests--pythonstartup-file)))
     (python-tests-with-temp-buffer-with-shell
@@ -4924,7 +4941,7 @@ def foo():
 ;;; Symbol completion
 
 (ert-deftest python-completion-at-point-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -4942,7 +4959,7 @@ import abc
 
 (ert-deftest python-completion-at-point-2 ()
   "Should work regardless of the point in the Shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -4960,7 +4977,7 @@ import abc
 
 (ert-deftest python-completion-at-point-pdb-1 ()
   "Should not complete PDB commands in Python buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import pdb
@@ -4979,7 +4996,7 @@ print('Hello')
 
 (ert-deftest python-completion-at-point-while-running-1 ()
   "Should not try to complete when a program is running in the Shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import time
@@ -4995,7 +5012,7 @@ time.sleep(3)
      (should-not (with-timeout (1 t) (completion-at-point))))))
 
 (ert-deftest python-completion-at-point-native-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5014,7 +5031,7 @@ import abc
 
 (ert-deftest python-completion-at-point-native-2 ()
   "Should work regardless of the point in the Shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5032,7 +5049,7 @@ import abc
      (should (completion-at-point)))))
 
 (ert-deftest python-completion-at-point-native-with-ffap-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5050,7 +5067,7 @@ import abc
      (should (completion-at-point)))))
 
 (ert-deftest python-completion-at-point-native-with-eldoc-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5077,7 +5094,7 @@ import abc
 ;;; FFAP
 
 (ert-deftest python-ffap-module-path-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5089,7 +5106,7 @@ import abc
 
 (ert-deftest python-ffap-module-path-while-running-1 ()
   "Should not get module path when a program is running in the Shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5165,7 +5182,7 @@ some_symbol   some_other_symbol
                     "some_symbol"))))
 
 (ert-deftest python-eldoc--get-doc-at-point-1 ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import time
@@ -5178,7 +5195,7 @@ import time
 
 (ert-deftest python-eldoc--get-doc-at-point-while-running-1 ()
   "Should not get documentation when a program is running in the Shell buffer."
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
    "
 import time
@@ -7396,8 +7413,9 @@ buffer with overlapping strings."
 ;; interpreter.
 (ert-deftest python-tests--run-python-selects-window ()
   "Test for bug#31398.  See also bug#44421 and bug#52380."
-  (skip-unless (executable-find python-tests-shell-interpreter))
-  (let* ((buffer (process-buffer (run-python nil nil 'show)))
+  (skip-unless (python-tests-get-shell-interpreter))
+  (let* ((python-shell-interpreter (python-tests-get-shell-interpreter))
+         (buffer (process-buffer (run-python nil nil 'show)))
          (window (get-buffer-window buffer)))
     ;; We look at `selected-window' rather than `current-buffer'
     ;; because as `(elisp)Current buffer' says, the latter will only
@@ -7467,7 +7485,7 @@ buffer with overlapping strings."
                        "W0611: Unused import a.b.c (unused-import)"))))))
 
 (ert-deftest python-test--shell-send-block ()
-  (skip-unless (executable-find python-tests-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter))
   (python-tests-with-temp-buffer-with-shell
     "print('current 0')
 for x in range(1,3):
-- 
2.20.5


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-21 15:34             ` Lin Sun
@ 2024-05-22 14:38               ` kobarity
  2024-05-23 13:09                 ` Eli Zaretskii
  0 siblings, 1 reply; 49+ messages in thread
From: kobarity @ 2024-05-22 14:38 UTC (permalink / raw)
  To: Lin Sun; +Cc: Eli Zaretskii, Stefan Kangas, 70815


Lin Sun wrote:
> On Tue, May 21, 2024 at 2:04 PM kobarity <kobarity@gmail.com> wrote:
> >
> >
> > Lin Sun wrote:
> > > On Mon, May 20, 2024 at 3:53 PM kobarity <kobarity@gmail.com> wrote:
> > > > Eli Zaretskii wrote:
> > > > > > Cc: kobarity <kobarity@gmail.com>
> > > > > > From: Stefan Kangas <stefankangas@gmail.com>
> > > > > > Date: Sat, 18 May 2024 22:20:44 +0000
> > > > > >
> > > > > > It makes sense to look for "python3", but is it really useful to look
> > > > > > for "python2" at this point?
> > > > > I don't think we want to drop Python 2.x support, not yet.
> > > >
> > > > I don't want to drop Python 2 support either, but I don't think the
> > > > addition of the "python2" command is mandatory.  As the current master
> > > > does not run the "python2" command either.  However, I don't think it
> > > > is a bad idea to add the "python2" command.
> > > >
> > > > Lin Sun wrote:
> > > > > Hi,
> > > > > I attached the latest patch, hope it resolved all your concerns.
> > > >
> > > > Hi Lin,
> > > > There is still a typo "Enahnce" in the summary line, and there is a
> > > > typo in the docstring of `python-tests-get-shell-interpreter' as well.
> > > >
> > > > > > If there is only python2 in the PATH and no python or python3, some tests will fail.
> > > > > It's caused by the python.el didn't search "python2", so it may need
> > > > > another patch to change python.el.
> > > >
> > > > I don't think so.  Attached is a diff to your patch to resolve this
> > > > issue.  It let-binds `python-shell-interpreter' in some ERTs.  It
> > > > also includes the fix of the typo in the docstring of
> > > > `python-tests-get-shell-interpreter'.
> > > >
> > > > Without these modifications, EMACS_PYTHON_INTERPRETER will not work as
> > > > expected either on those ERTs.
> > > >
> > > > As for EMACS_PYTHON_INTERPRETER, I am a little doubtful that it is the
> > > > right thing to introduce.  It allows the ERT runner to specify the
> > > > interpreter.  It's OK for ERTs that can be run on both Python 2 and 3,
> > > > but you may want to write an ERT that can only be run on Python 3.
> > >
> > > Thank you for the comments, now get your points and agree with you.
> > > I merged your patch together, also corrected the typo in the commit message.
> > > Please help review the attached patch. Thank you !
> >
> > Sorry, there was a problem in my diff.  Two tests fail when
> > EMACS_PYTHON_INTERPRETER is not found.  Please apply the attached
> > diff.  It also includes a suggestion for improving the error message.
> > Please consider.
> 
> Merged your changes and tested on my local (with python/python3), it
> works perfectly. Thank you.
> 
> And the patch file is attached .

Thanks, it looks good to me.





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-22 14:38               ` kobarity
@ 2024-05-23 13:09                 ` Eli Zaretskii
  0 siblings, 0 replies; 49+ messages in thread
From: Eli Zaretskii @ 2024-05-23 13:09 UTC (permalink / raw)
  To: kobarity; +Cc: sunlin7.mail, stefankangas, 70815-done

> Date: Wed, 22 May 2024 23:38:02 +0900
> From: kobarity <kobarity@gmail.com>
> Cc: Eli Zaretskii <eliz@gnu.org>,
> 	Stefan Kangas <stefankangas@gmail.com>,
> 	70815@debbugs.gnu.org
> 
> 
> Lin Sun wrote:
> > On Tue, May 21, 2024 at 2:04 PM kobarity <kobarity@gmail.com> wrote:
> > >
> > >
> > > Lin Sun wrote:
> > > > On Mon, May 20, 2024 at 3:53 PM kobarity <kobarity@gmail.com> wrote:
> > > > > Eli Zaretskii wrote:
> > > > > > > Cc: kobarity <kobarity@gmail.com>
> > > > > > > From: Stefan Kangas <stefankangas@gmail.com>
> > > > > > > Date: Sat, 18 May 2024 22:20:44 +0000
> > > > > > >
> > > > > > > It makes sense to look for "python3", but is it really useful to look
> > > > > > > for "python2" at this point?
> > > > > > I don't think we want to drop Python 2.x support, not yet.
> > > > >
> > > > > I don't want to drop Python 2 support either, but I don't think the
> > > > > addition of the "python2" command is mandatory.  As the current master
> > > > > does not run the "python2" command either.  However, I don't think it
> > > > > is a bad idea to add the "python2" command.
> > > > >
> > > > > Lin Sun wrote:
> > > > > > Hi,
> > > > > > I attached the latest patch, hope it resolved all your concerns.
> > > > >
> > > > > Hi Lin,
> > > > > There is still a typo "Enahnce" in the summary line, and there is a
> > > > > typo in the docstring of `python-tests-get-shell-interpreter' as well.
> > > > >
> > > > > > > If there is only python2 in the PATH and no python or python3, some tests will fail.
> > > > > > It's caused by the python.el didn't search "python2", so it may need
> > > > > > another patch to change python.el.
> > > > >
> > > > > I don't think so.  Attached is a diff to your patch to resolve this
> > > > > issue.  It let-binds `python-shell-interpreter' in some ERTs.  It
> > > > > also includes the fix of the typo in the docstring of
> > > > > `python-tests-get-shell-interpreter'.
> > > > >
> > > > > Without these modifications, EMACS_PYTHON_INTERPRETER will not work as
> > > > > expected either on those ERTs.
> > > > >
> > > > > As for EMACS_PYTHON_INTERPRETER, I am a little doubtful that it is the
> > > > > right thing to introduce.  It allows the ERT runner to specify the
> > > > > interpreter.  It's OK for ERTs that can be run on both Python 2 and 3,
> > > > > but you may want to write an ERT that can only be run on Python 3.
> > > >
> > > > Thank you for the comments, now get your points and agree with you.
> > > > I merged your patch together, also corrected the typo in the commit message.
> > > > Please help review the attached patch. Thank you !
> > >
> > > Sorry, there was a problem in my diff.  Two tests fail when
> > > EMACS_PYTHON_INTERPRETER is not found.  Please apply the attached
> > > diff.  It also includes a suggestion for improving the error message.
> > > Please consider.
> > 
> > Merged your changes and tested on my local (with python/python3), it
> > works perfectly. Thank you.
> > 
> > And the patch file is attached .
> 
> Thanks, it looks good to me.

Thanks, installed on master, and closing.





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-07  6:53 bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters Lin Sun
  2024-05-11  9:05 ` Eli Zaretskii
  2024-05-18 22:20 ` Stefan Kangas
@ 2024-05-26 10:52 ` Mattias Engdegård
  2024-05-26 12:05   ` kobarity
  2024-05-26 15:36   ` Eli Zaretskii
  2 siblings, 2 replies; 49+ messages in thread
From: Mattias Engdegård @ 2024-05-26 10:52 UTC (permalink / raw)
  To: kobarity; +Cc: Eli Zaretskii, Lin Sun, stefankangas, 70815

[-- Attachment #1: Type: text/plain, Size: 525 bytes --]

This change caused python-tests failures on macOS. See attached log.

On this machine which has the standard macOS Python installation, 'python' is python 2, which apparently the tests don't cope very well with. (Have you verified that they do?)

The tests pass if modified to prefer Python 3:

@@ -3722,2 +3722,2 @@ python-tests-get-shell-interpreter
-              (cl-some #'executable-find '("python" "python3" "python2"))))))
+              (cl-some #'executable-find '("python3" "python" "python2"))))))




[-- Attachment #2: python-tests.log --]
[-- Type: application/octet-stream, Size: 36491 bytes --]

Running 359 tests (2024-05-26 12:39:46+0200, selector `(not (or (tag :unstable) (tag :nativecomp)))')
   passed    1/359  python-auto-fill-docstring (0.000899 sec)
Fontifying  *temp*-953703...
Fontifying  *temp*-953703... (syntactically...)
Fontifying  *temp*-953703... (regexps...)
Fontifying  *temp*-953703... (regexps....)
Fontifying  *temp*-953703... (regexps.....)
Fontifying  *temp*-953703... (regexps......)
Fontifying  *temp*-953703... (regexps.......)
Fontifying  *temp*-953703... (regexps........)
Fontifying  *temp*-953703... (regexps.........)
Fontifying  *temp*-953703... (regexps..........)
Fontifying  *temp*-953703... (regexps...........)
Fontifying  *temp*-953703... (regexps............)
Fontifying  *temp*-953703... (regexps.............)
Fontifying  *temp*-953703... (regexps..............)
Fontifying  *temp*-953703... (regexps...............)
Fontifying  *temp*-953703... (regexps................)
Fontifying  *temp*-953703... (regexps.................)

   passed    2/359  python-bob-infloop-avoid (0.000720 sec)
Test python-completion-at-point-1 backtrace:
  signal(ert-test-failed (((should (completion-at-point)) :form (compl
  ert-fail(((should (completion-at-point)) :form (completion-at-point)
  #f(compiled-function () #<bytecode 0x1e8b4c6a7c79bb47>)()
  #f(compiled-function () #<bytecode -0x15266b19ba44d40b>)()
  handler-bind-1(#f(compiled-function () #<bytecode -0x15266b19ba44d40
  ert--run-test-internal(#s(ert--test-execution-info :test #s(ert-test
  ert-run-test(#s(ert-test :name python-completion-at-point-1 :documen
  ert-run-or-rerun-test(#s(ert--stats :selector ... :tests ... :test-m
  ert-run-tests((not (or (tag :unstable) (tag :nativecomp))) #f(compil
  ert-run-tests-batch((not (or (tag :unstable) (tag :nativecomp))))
  ert-run-tests-batch-and-exit((not (or (tag :unstable) (tag :nativeco
  eval((ert-run-tests-batch-and-exit '(not (or (tag :unstable) (tag :n
  command-line-1(("-L" ":../../emacs/test" "-l" "ert" "--eval" "(setq 
  command-line()
  normal-top-level()
Test python-completion-at-point-1 condition:
    (ert-test-failed
     ((should (completion-at-point)) :form (completion-at-point) :value
      nil))
   FAILED    3/359  python-completion-at-point-1 (0.297276 sec) at ../../emacs/test/lisp/progmodes/python-tests.el:4930
Test python-completion-at-point-2 backtrace:
  signal(ert-test-failed (((should (completion-at-point)) :form (compl
  ert-fail(((should (completion-at-point)) :form (completion-at-point)
  #f(compiled-function () #<bytecode -0xc07eb83eb000dec>)()
  #f(compiled-function () #<bytecode -0x15266b19ba44d40b>)()
  handler-bind-1(#f(compiled-function () #<bytecode -0x15266b19ba44d40
  ert--run-test-internal(#s(ert--test-execution-info :test #s(ert-test
  ert-run-test(#s(ert-test :name python-completion-at-point-2 :documen
  ert-run-or-rerun-test(#s(ert--stats :selector ... :tests ... :test-m
  ert-run-tests((not (or (tag :unstable) (tag :nativecomp))) #f(compil
  ert-run-tests-batch((not (or (tag :unstable) (tag :nativecomp))))
  ert-run-tests-batch-and-exit((not (or (tag :unstable) (tag :nativeco
  eval((ert-run-tests-batch-and-exit '(not (or (tag :unstable) (tag :n
  command-line-1(("-L" ":../../emacs/test" "-l" "ert" "--eval" "(setq 
  command-line()
  normal-top-level()
Test python-completion-at-point-2 condition:
    (ert-test-failed
     ((should (completion-at-point)) :form (completion-at-point) :value
      nil))
   FAILED    4/359  python-completion-at-point-2 (0.276322 sec) at ../../emacs/test/lisp/progmodes/python-tests.el:4947
Test python-completion-at-point-native-1 backtrace:
  signal(ert-test-failed (((should (completion-at-point)) :form (compl
  ert-fail(((should (completion-at-point)) :form (completion-at-point)
  #f(compiled-function () #<bytecode 0x34326b9d63488b8>)()
  #f(compiled-function () #<bytecode -0x15266b19ba44d40b>)()
  handler-bind-1(#f(compiled-function () #<bytecode -0x15266b19ba44d40
  ert--run-test-internal(#s(ert--test-execution-info :test #s(ert-test
  ert-run-test(#s(ert-test :name python-completion-at-point-native-1 :
  ert-run-or-rerun-test(#s(ert--stats :selector ... :tests ... :test-m
  ert-run-tests((not (or (tag :unstable) (tag :nativecomp))) #f(compil
  ert-run-tests-batch((not (or (tag :unstable) (tag :nativecomp))))
  ert-run-tests-batch-and-exit((not (or (tag :unstable) (tag :nativeco
  eval((ert-run-tests-batch-and-exit '(not (or (tag :unstable) (tag :n
  command-line-1(("-L" ":../../emacs/test" "-l" "ert" "--eval" "(setq 
  command-line()
  normal-top-level()
Test python-completion-at-point-native-1 condition:
    (ert-test-failed
     ((should (completion-at-point)) :form (completion-at-point) :value
      nil))
   FAILED    5/359  python-completion-at-point-native-1 (2.287985 sec) at ../../emacs/test/lisp/progmodes/python-tests.el:5001
Test python-completion-at-point-native-2 backtrace:
  signal(ert-test-failed (((should (completion-at-point)) :form (compl
  ert-fail(((should (completion-at-point)) :form (completion-at-point)
  #f(compiled-function () #<bytecode 0x17cc5ab75b63540f>)()
  #f(compiled-function () #<bytecode -0x15266b19ba44d40b>)()
  handler-bind-1(#f(compiled-function () #<bytecode -0x15266b19ba44d40
  ert--run-test-internal(#s(ert--test-execution-info :test #s(ert-test
  ert-run-test(#s(ert-test :name python-completion-at-point-native-2 :
  ert-run-or-rerun-test(#s(ert--stats :selector ... :tests ... :test-m
  ert-run-tests((not (or (tag :unstable) (tag :nativecomp))) #f(compil
  ert-run-tests-batch((not (or (tag :unstable) (tag :nativecomp))))
  ert-run-tests-batch-and-exit((not (or (tag :unstable) (tag :nativeco
  eval((ert-run-tests-batch-and-exit '(not (or (tag :unstable) (tag :n
  command-line-1(("-L" ":../../emacs/test" "-l" "ert" "--eval" "(setq 
  command-line()
  normal-top-level()
Test python-completion-at-point-native-2 condition:
    (ert-test-failed
     ((should (completion-at-point)) :form (completion-at-point) :value
      nil))
   FAILED    6/359  python-completion-at-point-native-2 (2.301811 sec) at ../../emacs/test/lisp/progmodes/python-tests.el:5019
Test python-completion-at-point-native-with-eldoc-1 backtrace:
  signal(ert-test-failed (((should (completion-at-point)) :form (compl
  ert-fail(((should (completion-at-point)) :form (completion-at-point)
  #f(compiled-function () #<bytecode -0xe97b868aec9aafc>)()
  #f(compiled-function () #<bytecode -0x15266b19ba44d40b>)()
  handler-bind-1(#f(compiled-function () #<bytecode -0x15266b19ba44d40
  ert--run-test-internal(#s(ert--test-execution-info :test #s(ert-test
  ert-run-test(#s(ert-test :name python-completion-at-point-native-wit
  ert-run-or-rerun-test(#s(ert--stats :selector ... :tests ... :test-m
  ert-run-tests((not (or (tag :unstable) (tag :nativecomp))) #f(compil
  ert-run-tests-batch((not (or (tag :unstable) (tag :nativecomp))))
  ert-run-tests-batch-and-exit((not (or (tag :unstable) (tag :nativeco
  eval((ert-run-tests-batch-and-exit '(not (or (tag :unstable) (tag :n
  command-line-1(("-L" ":../../emacs/test" "-l" "ert" "--eval" "(setq 
  command-line()
  normal-top-level()
Test python-completion-at-point-native-with-eldoc-1 condition:
    (ert-test-failed
     ((should (completion-at-point)) :form (completion-at-point) :value
      nil))
   FAILED    7/359  python-completion-at-point-native-with-eldoc-1 (2.334841 sec) at ../../emacs/test/lisp/progmodes/python-tests.el:5056
Test python-completion-at-point-native-with-ffap-1 backtrace:
  signal(ert-test-failed (((should (completion-at-point)) :form (compl
  ert-fail(((should (completion-at-point)) :form (completion-at-point)
  #f(compiled-function () #<bytecode -0xee9f54223d6720a>)()
  #f(compiled-function () #<bytecode -0x15266b19ba44d40b>)()
  handler-bind-1(#f(compiled-function () #<bytecode -0x15266b19ba44d40
  ert--run-test-internal(#s(ert--test-execution-info :test #s(ert-test
  ert-run-test(#s(ert-test :name python-completion-at-point-native-wit
  ert-run-or-rerun-test(#s(ert--stats :selector ... :tests ... :test-m
  ert-run-tests((not (or (tag :unstable) (tag :nativecomp))) #f(compil
  ert-run-tests-batch((not (or (tag :unstable) (tag :nativecomp))))
  ert-run-tests-batch-and-exit((not (or (tag :unstable) (tag :nativeco
  eval((ert-run-tests-batch-and-exit '(not (or (tag :unstable) (tag :n
  command-line-1(("-L" ":../../emacs/test" "-l" "ert" "--eval" "(setq 
  command-line()
  normal-top-level()
Test python-completion-at-point-native-with-ffap-1 condition:
    (ert-test-failed
     ((should (completion-at-point)) :form (completion-at-point) :value
      nil))
   FAILED    8/359  python-completion-at-point-native-with-ffap-1 (2.323007 sec) at ../../emacs/test/lisp/progmodes/python-tests.el:5038
   passed    9/359  python-completion-at-point-pdb-1 (0.273743 sec)
   passed   10/359  python-completion-at-point-while-running-1 (0.159660 sec)
   passed   11/359  python-eldoc--get-doc-at-point-1 (0.301881 sec)
   passed   12/359  python-eldoc--get-doc-at-point-while-running-1 (0.154338 sec)
   passed   13/359  python-eldoc--get-symbol-at-point-1 (0.001642 sec)
   passed   14/359  python-eldoc--get-symbol-at-point-2 (0.001778 sec)
   passed   15/359  python-eldoc--get-symbol-at-point-3 (0.000370 sec)
   passed   16/359  python-eldoc--get-symbol-at-point-4 (0.000480 sec)
   passed   17/359  python-end-of-defun-1 (0.000622 sec)
   passed   18/359  python-ffap-module-path-1 (0.298471 sec)
   passed   19/359  python-ffap-module-path-while-running-1 (0.160546 sec)
   passed   20/359  python-fill-docstring (0.001283 sec)
   passed   21/359  python-fill-paragraph-single-quoted-string-1 (0.000362 sec)
   passed   22/359  python-fill-paragraph-single-quoted-string-2 (0.000296 sec)
   passed   23/359  python-fill-paragraph-triple-quoted-string-1 (0.004185 sec)
   passed   24/359  python-font-lock-assignment-statement-1 (0.000521 sec)
   passed   25/359  python-font-lock-assignment-statement-10 (0.000360 sec)
   passed   26/359  python-font-lock-assignment-statement-11 (0.000580 sec)
   passed   27/359  python-font-lock-assignment-statement-12 (0.000373 sec)
   passed   28/359  python-font-lock-assignment-statement-13 (0.000499 sec)
   passed   29/359  python-font-lock-assignment-statement-14 (0.000340 sec)
   passed   30/359  python-font-lock-assignment-statement-15 (0.000333 sec)
   passed   31/359  python-font-lock-assignment-statement-16 (0.000339 sec)
   passed   32/359  python-font-lock-assignment-statement-17 (0.000297 sec)
   passed   33/359  python-font-lock-assignment-statement-18 (0.000789 sec)
   passed   34/359  python-font-lock-assignment-statement-2 (0.000752 sec)
   passed   35/359  python-font-lock-assignment-statement-3 (0.000563 sec)
   passed   36/359  python-font-lock-assignment-statement-4 (0.000558 sec)
   passed   37/359  python-font-lock-assignment-statement-5 (0.000575 sec)
   passed   38/359  python-font-lock-assignment-statement-6 (0.000394 sec)
   passed   39/359  python-font-lock-assignment-statement-7 (0.000447 sec)
   passed   40/359  python-font-lock-assignment-statement-8 (0.000519 sec)
   passed   41/359  python-font-lock-assignment-statement-9 (0.000836 sec)
   passed   42/359  python-font-lock-escape-sequence-bytes-newline (0.000580 sec)
   passed   43/359  python-font-lock-escape-sequence-hex-octal (0.001087 sec)
   passed   44/359  python-font-lock-escape-sequence-multiline-string (0.013170 sec)
   passed   45/359  python-font-lock-escape-sequence-string-newline (0.001243 sec)
   passed   46/359  python-font-lock-escape-sequence-unicode (0.000684 sec)
   passed   47/359  python-font-lock-keywords-level-1-1 (0.000727 sec)
   passed   48/359  python-font-lock-keywords-level-1-2 (0.000425 sec)
   passed   49/359  python-font-lock-raw-escape-sequence (0.000793 sec)
   passed   50/359  python-font-lock-string-literal-concatenation (0.000646 sec)
Hiding all blocks... 
Hiding all blocks...done
   passed   51/359  python-hideshow-hide-all-1 (0.000806 sec)
Hiding all blocks... 
Hiding all blocks...done
   passed   52/359  python-hideshow-hide-all-2 (0.000765 sec)
Hiding all blocks... 
Hiding all blocks...done
   passed   53/359  python-hideshow-hide-all-3 (0.000419 sec)
   passed   54/359  python-hideshow-hide-block-1 (0.000904 sec)
Hiding blocks ...
Hiding blocks ... done
Showing all blocks ...
Showing all blocks ... done
   passed   55/359  python-hideshow-hide-levels-1 (0.001155 sec)
Showing all blocks ...
Showing all blocks ... done
   passed   56/359  python-hideshow-hide-levels-2 (0.000408 sec)
Hiding blocks ...
Hiding blocks ... done
   passed   57/359  python-hideshow-hide-levels-3 (0.000542 sec)
Hiding blocks ...
Hiding blocks ... done
   passed   58/359  python-hideshow-hide-levels-4 (0.001606 sec)
   passed   59/359  python-imenu-create-flat-index-1 (0.001509 sec)
   passed   60/359  python-imenu-create-flat-index-2 (0.000704 sec)
   passed   61/359  python-imenu-create-index-1 (0.000551 sec)
   passed   62/359  python-imenu-create-index-2 (0.000324 sec)
   passed   63/359  python-imenu-create-index-3 (0.000401 sec)
   passed   64/359  python-imenu-create-index-4 (0.000567 sec)
   passed   65/359  python-indent-after-async-block-1 (0.000412 sec)
   passed   66/359  python-indent-after-async-block-2 (0.000337 sec)
   passed   67/359  python-indent-after-async-block-3 (0.000609 sec)
   passed   68/359  python-indent-after-backslash-1 (0.000702 sec)
   passed   69/359  python-indent-after-backslash-2 (0.001052 sec)
   passed   70/359  python-indent-after-backslash-3 (0.000494 sec)
   passed   71/359  python-indent-after-backslash-4 (0.000520 sec)
   passed   72/359  python-indent-after-backslash-5 (0.000502 sec)
   passed   73/359  python-indent-after-backslash-6 (0.000697 sec)
   passed   74/359  python-indent-after-bare-match (0.000356 sec)
   passed   75/359  python-indent-after-block-1 (0.000308 sec)
   passed   76/359  python-indent-after-block-2 (0.000301 sec)
   passed   77/359  python-indent-after-block-3 (0.000656 sec)
   passed   78/359  python-indent-after-case-block (0.000285 sec)
   passed   79/359  python-indent-after-comment-1 (0.001490 sec)
   passed   80/359  python-indent-after-comment-2 (0.002461 sec)
   passed   81/359  python-indent-after-comment-3 (0.000940 sec)
   passed   82/359  python-indent-after-match-block (0.000480 sec)
   passed   83/359  python-indent-after-re-match (0.000323 sec)
   passed   84/359  python-indent-base-case (0.000282 sec)
   passed   85/359  python-indent-block-enders-1 (0.000357 sec)
   passed   86/359  python-indent-block-enders-2 (0.000622 sec)
   passed   87/359  python-indent-block-enders-3 (0.000557 sec)
   passed   88/359  python-indent-block-enders-4 (0.000834 sec)
   passed   89/359  python-indent-block-enders-5 (0.000698 sec)
   passed   90/359  python-indent-dedent-line-backspace-1 (0.000657 sec)
   passed   91/359  python-indent-dedent-line-backspace-2 (0.000314 sec)
   passed   92/359  python-indent-dedent-line-backspace-3 (0.000475 sec)
   passed   93/359  python-indent-dedenters-1 (0.000463 sec)
Closes if hide_details:
Closes except Exception:
Closes if save:
   passed   94/359  python-indent-dedenters-2 (0.002554 sec)
Closes try:
   passed   95/359  python-indent-dedenters-3 (0.000756 sec)
Closes try:
   passed   96/359  python-indent-dedenters-4 (0.000586 sec)
Closes if save:
   passed   97/359  python-indent-dedenters-5 (0.001060 sec)
   passed   98/359  python-indent-dedenters-6 (0.000385 sec)
   passed   99/359  python-indent-dedenters-7 (0.000401 sec)
Closes if (a == 1 or
Closes if (a == 1 or
Closes if (a == 1 or
   passed  100/359  python-indent-dedenters-8 (0.000899 sec)
Closes case 1:
   passed  101/359  python-indent-dedenters-9 (0.000563 sec)
Closes if hide_details:
Closes except Exception:
Closes if save:
   passed  102/359  python-indent-dedenters-comment-else (0.003009 sec)
   passed  103/359  python-indent-electric-colon-1 (0.000340 sec)
Closes if do:
   passed  104/359  python-indent-electric-colon-2 (0.000421 sec)
Closes if do:
Closes if do:
Closes if do:
   passed  105/359  python-indent-electric-colon-3 (0.000766 sec)
Closes if True:
   passed  106/359  python-indent-electric-colon-4 (0.000799 sec)
   passed  107/359  python-indent-electric-comma-after-multiline-string (0.000422 sec)
   passed  108/359  python-indent-electric-comma-inside-multiline-string (0.000966 sec)
   passed  109/359  python-indent-hanging-close-paren (0.000345 sec)
   passed  110/359  python-indent-inside-paren-1 (0.000925 sec)
   passed  111/359  python-indent-inside-paren-2 (0.000701 sec)
   passed  112/359  python-indent-inside-paren-3 (0.000387 sec)
   passed  113/359  python-indent-inside-paren-4 (0.000339 sec)
   passed  114/359  python-indent-inside-paren-5 (0.000899 sec)
   passed  115/359  python-indent-inside-paren-6 (0.000630 sec)
   passed  116/359  python-indent-inside-paren-7 (0.000438 sec)
   passed  117/359  python-indent-inside-paren-8 (0.000524 sec)
   passed  118/359  python-indent-inside-paren-9 (0.000824 sec)
   passed  119/359  python-indent-inside-paren-block-1 (0.000830 sec)
   passed  120/359  python-indent-inside-paren-block-2 (0.001032 sec)
   passed  121/359  python-indent-inside-paren-block-3 (0.000948 sec)
   passed  122/359  python-indent-inside-paren-block-4 (0.000591 sec)
   passed  123/359  python-indent-inside-string-1 (0.000554 sec)
   passed  124/359  python-indent-inside-string-2 (0.001573 sec)
   passed  125/359  python-indent-inside-string-3 (0.000727 sec)
   passed  126/359  python-indent-pep8-1 (0.000396 sec)
   passed  127/359  python-indent-pep8-2 (0.000481 sec)
   passed  128/359  python-indent-pep8-3 (0.000387 sec)
   passed  129/359  python-indent-region-1 (0.000297 sec)
   passed  130/359  python-indent-region-2 (0.000546 sec)
   passed  131/359  python-indent-region-3 (0.000473 sec)
   passed  132/359  python-indent-region-4 (0.000410 sec)
   passed  133/359  python-indent-region-5 (0.002028 sec)
   passed  134/359  python-info-assignment-continuation-line-p-1 (0.000807 sec)
   passed  135/359  python-info-assignment-continuation-line-p-2 (0.000627 sec)
   passed  136/359  python-info-assignment-statement-p-1 (0.001395 sec)
   passed  137/359  python-info-assignment-statement-p-2 (0.000490 sec)
   passed  138/359  python-info-assignment-statement-p-3 (0.000431 sec)
   passed  139/359  python-info-beginning-of-backslash-1 (0.000608 sec)
   passed  140/359  python-info-beginning-of-block-p-1 (0.000352 sec)
   passed  141/359  python-info-beginning-of-block-p-2 (0.000287 sec)
   passed  142/359  python-info-beginning-of-statement-p-1 (0.000264 sec)
   passed  143/359  python-info-beginning-of-statement-p-2 (0.000270 sec)
   passed  144/359  python-info-block-continuation-line-p-1 (0.000291 sec)
   passed  145/359  python-info-block-continuation-line-p-2 (0.000455 sec)
   passed  146/359  python-info-continuation-line-p-1 (0.000420 sec)
   passed  147/359  python-info-current-defun-1 (0.000656 sec)
   passed  148/359  python-info-current-defun-2 (0.012907 sec)
   passed  149/359  python-info-current-defun-3 (0.008910 sec)
   passed  150/359  python-info-current-defun-4 (0.001674 sec)
   passed  151/359  python-info-current-line-comment-p-1 (0.000492 sec)
   passed  152/359  python-info-current-line-empty-p (0.000376 sec)
   passed  153/359  python-info-current-symbol-1 (0.000494 sec)
   passed  154/359  python-info-current-symbol-2 (0.000633 sec)
   failed  155/359  python-info-current-symbol-3 (0.000355 sec)
   passed  156/359  python-info-dedenter-opening-block-message-1 (0.000290 sec)
Closes try:
Closes try:
   passed  157/359  python-info-dedenter-opening-block-message-2 (0.000346 sec)
Closes except:
Closes except:
   passed  158/359  python-info-dedenter-opening-block-message-3 (0.000612 sec)
Closes else:
Closes else:
   passed  159/359  python-info-dedenter-opening-block-message-4 (0.000484 sec)
Closes if a:
Closes if a:
   passed  160/359  python-info-dedenter-opening-block-message-5 (0.034931 sec)
   passed  161/359  python-info-dedenter-opening-block-position-1 (0.000686 sec)
   passed  162/359  python-info-dedenter-opening-block-position-2 (0.000395 sec)
   passed  163/359  python-info-dedenter-opening-block-position-3 (0.002207 sec)
   passed  164/359  python-info-dedenter-opening-block-positions-1 (0.001998 sec)
   passed  165/359  python-info-dedenter-opening-block-positions-2 (0.000844 sec)
   passed  166/359  python-info-dedenter-opening-block-positions-3 (0.000928 sec)
   passed  167/359  python-info-dedenter-opening-block-positions-4 (0.000321 sec)
   passed  168/359  python-info-dedenter-opening-block-positions-5 (0.000371 sec)
   passed  169/359  python-info-dedenter-opening-block-positions-6 (0.000277 sec)
   passed  170/359  python-info-dedenter-opening-block-positions-7 (0.000338 sec)
   passed  171/359  python-info-dedenter-statement-p-1 (0.000242 sec)
   passed  172/359  python-info-dedenter-statement-p-2 (0.000246 sec)
   passed  173/359  python-info-dedenter-statement-p-3 (0.000431 sec)
   passed  174/359  python-info-dedenter-statement-p-4 (0.000277 sec)
   passed  175/359  python-info-dedenter-statement-p-5 (0.000269 sec)
   passed  176/359  python-info-dedenter-statement-p-6 (0.000325 sec)
   passed  177/359  python-info-docstring-p-1 (0.001006 sec)
   passed  178/359  python-info-docstring-p-2 (0.001240 sec)
   passed  179/359  python-info-docstring-p-3 (0.002841 sec)
   passed  180/359  python-info-docstring-p-4 (0.001898 sec)
   passed  181/359  python-info-docstring-p-5 (0.001799 sec)
   passed  182/359  python-info-docstring-p-6 (0.001230 sec)
   passed  183/359  python-info-docstring-p-7 (0.000332 sec)
   passed  184/359  python-info-docstring-p-8 (0.000330 sec)
   passed  185/359  python-info-encoding-1 (0.000240 sec)
   passed  186/359  python-info-encoding-2 (0.000201 sec)
   passed  187/359  python-info-encoding-from-cookie-1 (0.000200 sec)
   passed  188/359  python-info-encoding-from-cookie-2 (0.000199 sec)
   passed  189/359  python-info-encoding-from-cookie-3 (0.000342 sec)
   passed  190/359  python-info-encoding-from-cookie-4 (0.000243 sec)
   passed  191/359  python-info-encoding-from-cookie-5 (0.000211 sec)
   passed  192/359  python-info-encoding-from-cookie-6 (0.000204 sec)
   passed  193/359  python-info-encoding-from-cookie-7 (0.000225 sec)
   passed  194/359  python-info-end-of-block-p-1 (0.000484 sec)
   passed  195/359  python-info-end-of-block-p-2 (0.000612 sec)
   passed  196/359  python-info-end-of-statement-p-1 (0.000690 sec)
   passed  197/359  python-info-end-of-statement-p-2 (0.000862 sec)
   passed  198/359  python-info-line-ends-backslash-p-1 (0.000488 sec)
   passed  199/359  python-info-looking-at-beginning-of-block-1 (0.000827 sec)
   passed  200/359  python-info-looking-at-beginning-of-defun-1 (0.000884 sec)
   passed  201/359  python-info-looking-at-beginning-of-defun-2 (0.000494 sec)
   passed  202/359  python-info-looking-at-beginning-of-defun-3 (0.000291 sec)
   passed  203/359  python-info-statement-ends-block-p-1 (0.000808 sec)
   passed  204/359  python-info-statement-ends-block-p-2 (0.000524 sec)
   passed  205/359  python-info-statement-starts-block-p-1 (0.000860 sec)
   passed  206/359  python-info-statement-starts-block-p-2 (0.000394 sec)
   passed  207/359  python-info-triple-quoted-string-p-1 (0.000480 sec)
   passed  208/359  python-info-triple-quoted-string-p-2 (0.000423 sec)
   passed  209/359  python-info-triple-quoted-string-p-3 (0.000494 sec)
Mark set
Mark set
   passed  210/359  python-mark-defun-1 (0.001315 sec)
Mark set
Mark set
   passed  211/359  python-mark-defun-2 (0.000970 sec)
Mark set
Mark set
   passed  212/359  python-mark-defun-3 (0.000468 sec)
Mark set
Mark set
   passed  213/359  python-mark-defun-4 (0.000501 sec)
Mark set
Mark set
Mark set
Mark set
   passed  214/359  python-mark-defun-5 (0.000926 sec)
   passed  215/359  python-nav-backward-defun-1 (0.000474 sec)
   passed  216/359  python-nav-backward-defun-2 (0.000427 sec)
   passed  217/359  python-nav-backward-defun-3 (0.000443 sec)
   passed  218/359  python-nav-backward-defun-4 (0.000466 sec)
   passed  219/359  python-nav-backward-statement-1 (0.000662 sec)
   failed  220/359  python-nav-backward-statement-2 (0.001177 sec)
   failed  221/359  python-nav-backward-up-list-1 (0.000552 sec)
   passed  222/359  python-nav-beginning-of-block-1 (0.001246 sec)
   passed  223/359  python-nav-beginning-of-block-2 (0.000718 sec)
   passed  224/359  python-nav-beginning-of-defun-1 (0.001096 sec)
   passed  225/359  python-nav-beginning-of-defun-2 (0.000689 sec)
   passed  226/359  python-nav-beginning-of-defun-3 (0.000286 sec)
   passed  227/359  python-nav-beginning-of-defun-4 (0.000408 sec)
   passed  228/359  python-nav-beginning-of-defun-5 (0.000335 sec)
   passed  229/359  python-nav-beginning-of-defun-6 (0.000271 sec)
   passed  230/359  python-nav-beginning-of-statement-1 (0.000348 sec)
   passed  231/359  python-nav-end-of-block-1 (0.001285 sec)
   passed  232/359  python-nav-end-of-block-2 (0.000262 sec)
   passed  233/359  python-nav-end-of-defun-1 (0.001893 sec)
   passed  234/359  python-nav-end-of-defun-2 (0.002456 sec)
   passed  235/359  python-nav-end-of-defun-3 (0.000553 sec)
   passed  236/359  python-nav-end-of-statement-1 (0.000494 sec)
   passed  237/359  python-nav-end-of-statement-2 (0.000269 sec)
   passed  238/359  python-nav-end-of-statement-3 (0.000259 sec)
   passed  239/359  python-nav-end-of-statement-4 (0.000260 sec)
   passed  240/359  python-nav-forward-block-1 (0.000654 sec)
   passed  241/359  python-nav-forward-block-2 (0.000272 sec)
   passed  242/359  python-nav-forward-defun-1 (0.000311 sec)
   passed  243/359  python-nav-forward-defun-2 (0.000300 sec)
   passed  244/359  python-nav-forward-defun-3 (0.000259 sec)
   passed  245/359  python-nav-forward-defun-4 (0.000231 sec)
   passed  246/359  python-nav-forward-sexp-1 (0.000892 sec)
   passed  247/359  python-nav-forward-sexp-2 (0.001402 sec)
   passed  248/359  python-nav-forward-sexp-3 (0.001064 sec)
   passed  249/359  python-nav-forward-sexp-safe-1 (0.001452 sec)
   passed  250/359  python-nav-forward-statement-1 (0.000773 sec)
   passed  251/359  python-nav-up-list-1 (0.000296 sec)
   passed  252/359  python-parens-electric-indent-1 (0.001215 sec)
   passed  253/359  python-shell-buffer-substring-1 (0.000722 sec)
   passed  254/359  python-shell-buffer-substring-10 (0.000488 sec)
   passed  255/359  python-shell-buffer-substring-11 (0.000454 sec)
   passed  256/359  python-shell-buffer-substring-12 (0.000425 sec)
   passed  257/359  python-shell-buffer-substring-13 (0.000391 sec)
   passed  258/359  python-shell-buffer-substring-14 (0.000408 sec)
   passed  259/359  python-shell-buffer-substring-15 (0.000401 sec)
   passed  260/359  python-shell-buffer-substring-16 (0.000395 sec)
   passed  261/359  python-shell-buffer-substring-17 (0.000396 sec)
   passed  262/359  python-shell-buffer-substring-18 (0.000377 sec)
   passed  263/359  python-shell-buffer-substring-2 (0.000515 sec)
   passed  264/359  python-shell-buffer-substring-3 (0.000502 sec)
   passed  265/359  python-shell-buffer-substring-4 (0.000676 sec)
   passed  266/359  python-shell-buffer-substring-5 (0.000531 sec)
   passed  267/359  python-shell-buffer-substring-6 (0.000452 sec)
   passed  268/359  python-shell-buffer-substring-7 (0.000447 sec)
   passed  269/359  python-shell-buffer-substring-8 (0.000498 sec)
   passed  270/359  python-shell-buffer-substring-9 (0.000771 sec)
   passed  271/359  python-shell-calculate-exec-path-1 (0.000130 sec)
   passed  272/359  python-shell-calculate-exec-path-2 (0.000085 sec)
   passed  273/359  python-shell-calculate-exec-path-3 (0.000080 sec)
   passed  274/359  python-shell-calculate-exec-path-4 (0.001710 sec)
   passed  275/359  python-shell-calculate-exec-path-5 (0.000073 sec)
   passed  276/359  python-shell-calculate-exec-path-6 (0.000124 sec)
   passed  277/359  python-shell-calculate-process-environment-1 (0.000054 sec)
   passed  278/359  python-shell-calculate-process-environment-2 (0.000072 sec)
   passed  279/359  python-shell-calculate-process-environment-3 (0.000185 sec)
   passed  280/359  python-shell-calculate-process-environment-4 (0.000072 sec)
   passed  281/359  python-shell-calculate-process-environment-5 (0.000067 sec)
   passed  282/359  python-shell-calculate-process-environment-6 (0.000064 sec)
   passed  283/359  python-shell-calculate-process-environment-7 (0.000076 sec)
   passed  284/359  python-shell-calculate-process-environment-8 (0.000067 sec)
   passed  285/359  python-shell-calculate-pythonpath-1 (0.000064 sec)
   passed  286/359  python-shell-calculate-pythonpath-2 (0.000066 sec)
Test python-shell-completion-at-point-1 backtrace:
  signal(ert-test-failed (((should (nth 2 (python-shell-completion-at-
  ert-fail(((should (nth 2 (python-shell-completion-at-point))) :form 
  #f(compiled-function () #<bytecode -0x1c337af7c9e93016>)()
  #f(compiled-function () #<bytecode -0x15266b19ba44d40b>)()
  handler-bind-1(#f(compiled-function () #<bytecode -0x15266b19ba44d40
  ert--run-test-internal(#s(ert--test-execution-info :test #s(ert-test
  ert-run-test(#s(ert-test :name python-shell-completion-at-point-1 :d
  ert-run-or-rerun-test(#s(ert--stats :selector ... :tests ... :test-m
  ert-run-tests((not (or (tag :unstable) (tag :nativecomp))) #f(compil
  ert-run-tests-batch((not (or (tag :unstable) (tag :nativecomp))))
  ert-run-tests-batch-and-exit((not (or (tag :unstable) (tag :nativeco
  eval((ert-run-tests-batch-and-exit '(not (or (tag :unstable) (tag :n
  command-line-1(("-L" ":../../emacs/test" "-l" "ert" "--eval" "(setq 
  command-line()
  normal-top-level()
Test python-shell-completion-at-point-1 condition:
    (ert-test-failed
     ((should (nth 2 (python-shell-completion-at-point))) :form
      (nth 2 nil) :value nil))
   FAILED  287/359  python-shell-completion-at-point-1 (0.293285 sec) at ../../emacs/test/lisp/progmodes/python-tests.el:4785
  skipped  288/359  python-shell-completion-at-point-ipython (0.000699 sec)
  skipped  289/359  python-shell-completion-at-point-jedi-completer (0.222261 sec)
   passed  290/359  python-shell-completion-at-point-native-1 (0.299456 sec)
   passed  291/359  python-shell-completion-native-interpreter-disabled-p-1 (0.000124 sec)
Can't guess python-indent-offset, using defaults: 4
   passed  292/359  python-shell-get-process-1 (0.113812 sec)
   passed  293/359  python-shell-get-process-name-1 (0.000381 sec)
Can't guess python-indent-offset, using defaults: 4
   passed  294/359  python-shell-get-process-name-2 (0.008759 sec)
Can't guess python-indent-offset, using defaults: 4
   passed  295/359  python-shell-internal-get-or-create-process-1 (0.058572 sec)
   passed  296/359  python-shell-internal-get-process-name-1 (0.000343 sec)
Can't guess python-indent-offset, using defaults: 4
   passed  297/359  python-shell-internal-get-process-name-2 (0.006695 sec)
   passed  298/359  python-shell-make-comint-1 (0.050022 sec)
   passed  299/359  python-shell-make-comint-2 (0.048224 sec)
   passed  300/359  python-shell-make-comint-3 (0.051549 sec)
   passed  301/359  python-shell-make-comint-4 (0.052049 sec)
   passed  302/359  python-shell-prompt-detect-1 (0.040509 sec)
   passed  303/359  python-shell-prompt-detect-2 (0.036072 sec)
   passed  304/359  python-shell-prompt-detect-3 (0.000137 sec)
Warning (python): Python shell prompts cannot be detected.
If your emacs session hangs when starting python shells
recover with `keyboard-quit' and then try fixing the
interactive flag for your interpreter by adjusting the
`python-shell-interpreter-interactive-arg' or add regexps
matching shell prompts in the directory-local friendly vars:
  + `python-shell-prompt-regexp'
  + `python-shell-prompt-block-regexp'
  + `python-shell-prompt-output-regexp'
Or alternatively in:
  + `python-shell-prompt-input-regexps'
  + `python-shell-prompt-output-regexps'
   passed  305/359  python-shell-prompt-detect-4 (0.091465 sec)
   passed  306/359  python-shell-prompt-detect-5 (0.076047 sec)
   passed  307/359  python-shell-prompt-detect-6 (0.000866 sec)
   passed  308/359  python-shell-prompt-set-calculated-regexps-1 (0.000099 sec)
   passed  309/359  python-shell-prompt-set-calculated-regexps-2 (0.000076 sec)
   passed  310/359  python-shell-prompt-set-calculated-regexps-3 (0.000069 sec)
   passed  311/359  python-shell-prompt-set-calculated-regexps-4 (0.000073 sec)
   passed  312/359  python-shell-prompt-set-calculated-regexps-5 (0.000078 sec)
   passed  313/359  python-shell-prompt-set-calculated-regexps-6 (0.042912 sec)
   passed  314/359  python-shell-prompt-validate-regexps-1 (0.000087 sec)
   passed  315/359  python-shell-prompt-validate-regexps-2 (0.000080 sec)
   passed  316/359  python-shell-prompt-validate-regexps-3 (0.000076 sec)
   passed  317/359  python-shell-prompt-validate-regexps-4 (0.000075 sec)
   passed  318/359  python-shell-prompt-validate-regexps-5 (0.000067 sec)
   passed  319/359  python-shell-prompt-validate-regexps-6 (0.000069 sec)
   passed  320/359  python-shell-prompt-validate-regexps-7 (0.000057 sec)
   passed  321/359  python-shell-with-environment-1 (0.000106 sec)
   passed  322/359  python-shell-with-environment-2 (0.000303 sec)
   passed  323/359  python-shell-with-environment-3 (0.000507 sec)
   passed  324/359  python-syntax-after-python-backspace (0.000332 sec)
   passed  325/359  python-syntax-context-1 (0.000307 sec)
Sent: for x in range(1,3):...
Sent:     print('current %s' % x)...
   passed  326/359  python-test--shell-send-block (0.363776 sec)
   passed  327/359  python-tests--fill-long-first-line (0.002034 sec)
   passed  328/359  python-tests--flymake-command-output-pattern (0.000157 sec)
   passed  329/359  python-tests--run-python-selects-window (0.052643 sec)
   passed  330/359  python-tests-look-at-1 (0.000348 sec)
   passed  331/359  python-tests-look-at-2 (0.000258 sec)
   passed  332/359  python-triple-double-quote-pairing (0.002244 sec)
   passed  333/359  python-triple-single-quote-pairing (0.001065 sec)
   passed  334/359  python-ts-mode-assignement-face-2 (0.078170 sec)
   passed  335/359  python-ts-mode-builtin-call-face (0.020583 sec)
   passed  336/359  python-ts-mode-class-patterns-face (0.004865 sec)
   passed  337/359  python-ts-mode-compound-keywords-face (0.003748 sec)
   passed  338/359  python-ts-mode-disabled-string-interpolation (0.001736 sec)
   passed  339/359  python-ts-mode-dotted-decorator-face-1 (0.001627 sec)
   passed  340/359  python-ts-mode-dotted-decorator-face-2 (0.001935 sec)
   passed  341/359  python-ts-mode-interpolation-doc-string (0.001616 sec)
   passed  342/359  python-ts-mode-interpolation-nested-string (0.001567 sec)
   passed  343/359  python-ts-mode-isinstance-type-face-1 (0.001685 sec)
   passed  344/359  python-ts-mode-isinstance-type-face-2 (0.001532 sec)
   passed  345/359  python-ts-mode-isinstance-type-face-3 (0.001694 sec)
   passed  346/359  python-ts-mode-level-fontification-wo-interpolation (0.001645 sec)
   passed  347/359  python-ts-mode-named-assignement-face-1 (0.001592 sec)
   passed  348/359  python-ts-mode-nested-types-face-1 (0.001762 sec)
   passed  349/359  python-ts-mode-superclass-type-face (0.002862 sec)
   passed  350/359  python-ts-mode-types-face-1 (0.002398 sec)
   passed  351/359  python-ts-mode-types-face-2 (0.002358 sec)
   passed  352/359  python-ts-mode-types-face-3 (0.001756 sec)
   passed  353/359  python-ts-mode-union-types-face-1 (0.001789 sec)
   passed  354/359  python-ts-mode-union-types-face-2 (0.001870 sec)
   passed  355/359  python-util-clone-local-variables-1 (0.001066 sec)
   passed  356/359  python-util-forward-comment-1 (0.001229 sec)
   passed  357/359  python-util-goto-line-1 (0.000335 sec)
   passed  358/359  python-util-strip-string-1 (0.000231 sec)
   passed  359/359  python-util-valid-regexp-p-1 (0.000080 sec)

Ran 359 tests, 350 results as expected, 7 unexpected, 2 skipped (2024-05-26 12:40:01+0200, 14.810718 sec)
3 expected failures

7 unexpected results:
   FAILED  python-completion-at-point-1
   FAILED  python-completion-at-point-2
   FAILED  python-completion-at-point-native-1
   FAILED  python-completion-at-point-native-2
   FAILED  python-completion-at-point-native-with-eldoc-1
   FAILED  python-completion-at-point-native-with-ffap-1
   FAILED  python-shell-completion-at-point-1

2 skipped results:
  SKIPPED  python-shell-completion-at-point-ipython
  SKIPPED  python-shell-completion-at-point-jedi-completer

^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-26 10:52 ` Mattias Engdegård
@ 2024-05-26 12:05   ` kobarity
  2024-05-26 12:21     ` Mattias Engdegård
  2024-05-26 15:36   ` Eli Zaretskii
  1 sibling, 1 reply; 49+ messages in thread
From: kobarity @ 2024-05-26 12:05 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: Eli Zaretskii, Lin Sun, stefankangas, 70815

Mattias Engdegård wrote:
> This change caused python-tests failures on macOS. See attached log.
> 
> On this machine which has the standard macOS Python installation, 'python' is python 2, which apparently the tests don't cope very well with. (Have you verified that they do?)
> 
> The tests pass if modified to prefer Python 3:
> 
> @@ -3722,2 +3722,2 @@ python-tests-get-shell-interpreter
> -              (cl-some #'executable-find '("python" "python3" "python2"))))))
> +              (cl-some #'executable-find '("python3" "python" "python2"))))))

All ERTs pass with Python 2 on Linux (Ubuntu 22.04).  So it seems to
me that this is an issue with Python 2 on Mac.  Maybe the workaround
using "tty.setraw(0)" is not working with Python 2 on Mac?  Could you
test if the native completion is working with Python 2?





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-26 12:05   ` kobarity
@ 2024-05-26 12:21     ` Mattias Engdegård
  2024-05-26 12:36       ` kobarity
  0 siblings, 1 reply; 49+ messages in thread
From: Mattias Engdegård @ 2024-05-26 12:21 UTC (permalink / raw)
  To: kobarity; +Cc: Eli Zaretskii, Lin Sun, stefankangas, 70815

26 maj 2024 kl. 14.05 skrev kobarity <kobarity@gmail.com>:

> All ERTs pass with Python 2 on Linux (Ubuntu 22.04).  So it seems to
> me that this is an issue with Python 2 on Mac.  Maybe the workaround
> using "tty.setraw(0)" is not working with Python 2 on Mac?  Could you
> test if the native completion is working with Python 2?

Not sure how to test that, but if I run python 2 interactively from a terminal then no completion appears to be active (although I'm not sure if something could make it work).

Given the status of Python 2 in general and on macOS in particular (there is a warning that it is only present for compatibility with legacy software) this is not very surprising. I don't think it's something we need to fix in Emacs.

Is there a reason not to apply the suggested patch to prefer `python3` to `python`?
Or put differently, why would `python-shell-interpreter` and `python-tests-get-shell-interpreter` use different preferences?






^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-26 12:21     ` Mattias Engdegård
@ 2024-05-26 12:36       ` kobarity
  2024-05-26 13:23         ` Mattias Engdegård
  0 siblings, 1 reply; 49+ messages in thread
From: kobarity @ 2024-05-26 12:36 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: Eli Zaretskii, Lin Sun, stefankangas, 70815

Mattias Engdegård wrote:
> 
> 26 maj 2024 kl. 14.05 skrev kobarity <kobarity@gmail.com>:
> 
> > All ERTs pass with Python 2 on Linux (Ubuntu 22.04).  So it seems to
> > me that this is an issue with Python 2 on Mac.  Maybe the workaround
> > using "tty.setraw(0)" is not working with Python 2 on Mac?  Could you
> > test if the native completion is working with Python 2?
> 
> Not sure how to test that, but if I run python 2 interactively from a terminal then no completion appears to be active (although I'm not sure if something could make it work).

Sorry, I forgot that native completion does not work on Mac, even with
Python 3.  What I wanted to know is if there is unexpected echo backs
with Python 2 on Mac.

> Given the status of Python 2 in general and on macOS in particular (there is a warning that it is only present for compatibility with legacy software) this is not very surprising. I don't think it's something we need to fix in Emacs.

I agree.

> Is there a reason not to apply the suggested patch to prefer `python3` to `python`?
> Or put differently, why would `python-shell-interpreter` and `python-tests-get-shell-interpreter` use different preferences?

Maybe it is better to prefer "python3", but I don't know if that would
reliably prevent the problem.  The best way would be to skip some
tests if the selected interpreter is Python 2 and it is running on
Mac.





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-26 12:36       ` kobarity
@ 2024-05-26 13:23         ` Mattias Engdegård
  2024-05-26 14:15           ` kobarity
  2024-05-26 15:52           ` Eli Zaretskii
  0 siblings, 2 replies; 49+ messages in thread
From: Mattias Engdegård @ 2024-05-26 13:23 UTC (permalink / raw)
  To: kobarity; +Cc: Eli Zaretskii, Lin Sun, stefankangas, 70815

26 maj 2024 kl. 14.36 skrev kobarity <kobarity@gmail.com>:

> Sorry, I forgot that native completion does not work on Mac, even with
> Python 3.  What I wanted to know is if there is unexpected echo backs
> with Python 2 on Mac.

Not that I can see when running an interactive Python shell in Emacs, no.

> Maybe it is better to prefer "python3", but I don't know if that would
> reliably prevent the problem.  The best way would be to skip some
> tests if the selected interpreter is Python 2 and it is running on
> Mac.

Why select Python 2 in the first place? Is it more important to test Python 2 than Python 3 on other platforms?






^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-26 13:23         ` Mattias Engdegård
@ 2024-05-26 14:15           ` kobarity
  2024-05-26 15:00             ` kobarity
  2024-05-26 15:56             ` Eli Zaretskii
  2024-05-26 15:52           ` Eli Zaretskii
  1 sibling, 2 replies; 49+ messages in thread
From: kobarity @ 2024-05-26 14:15 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: Eli Zaretskii, Lin Sun, stefankangas, 70815

Mattias Engdegård wrote:
> 
> 26 maj 2024 kl. 14.36 skrev kobarity <kobarity@gmail.com>:
> 
> > Sorry, I forgot that native completion does not work on Mac, even with
> > Python 3.  What I wanted to know is if there is unexpected echo backs
> > with Python 2 on Mac.
> 
> Not that I can see when running an interactive Python shell in Emacs, no.

Could you see what is returned when you enter the following line in
Inferior Python buffer running Python 2 on Mac?

__PYTHON_EL_eval("print(\"Hello\")\n", "")

> > Maybe it is better to prefer "python3", but I don't know if that would
> > reliably prevent the problem.  The best way would be to skip some
> > tests if the selected interpreter is Python 2 and it is running on
> > Mac.
> 
> Why select Python 2 in the first place? Is it more important to test Python 2 than Python 3 on other platforms?

I am not saying that Python 2 (or simple "python") should be the
first.  I do agree that "python3" should be preferred than "python".

My point is that we cannot assure that Python 2 is not selected.  One
example is EMACS_PYTHON_INTERPRETER environment variable introduced by
the patch.  It can specify the interpreter used in ERTs.  So a Mac
user may set EMACS_PYTHON_INTERPRETER to "python".

I wrote in the previous mail:

> As for EMACS_PYTHON_INTERPRETER, I am a little doubtful that it is the
> right thing to introduce.  It allows the ERT runner to specify the
> interpreter.  It's OK for ERTs that can be run on both Python 2 and 3,
> but you may want to write an ERT that can only be run on Python 3.

At the time of writing, I assumed that current ERTs can be run on both
Python 2 and 3 on all platforms.  However, it turned out that it was
wrong.  Some tests fail with Python 2 on Mac.  So I think we need some
mechanism to skip test based on the interpreter version and the
platform.





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-26 14:15           ` kobarity
@ 2024-05-26 15:00             ` kobarity
  2024-05-26 15:24               ` Mattias Engdegård
  2024-05-26 15:56             ` Eli Zaretskii
  1 sibling, 1 reply; 49+ messages in thread
From: kobarity @ 2024-05-26 15:00 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: Eli Zaretskii, Lin Sun, stefankangas, 70815

kobarity wrote:
> 
> Mattias Engdegård wrote:
> > 
> > 26 maj 2024 kl. 14.36 skrev kobarity <kobarity@gmail.com>:
> > 
> > > Sorry, I forgot that native completion does not work on Mac, even with
> > > Python 3.  What I wanted to know is if there is unexpected echo backs
> > > with Python 2 on Mac.
> > 
> > Not that I can see when running an interactive Python shell in Emacs, no.
> 
> Could you see what is returned when you enter the following line in
> Inferior Python buffer running Python 2 on Mac?
> 
> __PYTHON_EL_eval("print(\"Hello\")\n", "")

Sorry, it was meaningless.
Please try evaluating the following expression in the Python buffer
after invoking Inferior Python buffer running Python 2.

(python-shell-send-string-no-output "print('a')")

Expected value is "a", but I suspect that this is not the case with
Python 2 on Mac.





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-26 15:00             ` kobarity
@ 2024-05-26 15:24               ` Mattias Engdegård
  2024-05-27 12:33                 ` kobarity
  0 siblings, 1 reply; 49+ messages in thread
From: Mattias Engdegård @ 2024-05-26 15:24 UTC (permalink / raw)
  To: kobarity; +Cc: Eli Zaretskii, Lin Sun, stefankangas, 70815

26 maj 2024 kl. 17.00 skrev kobarity <kobarity@gmail.com>:

> Please try evaluating the following expression in the Python buffer
> after invoking Inferior Python buffer running Python 2.
> 
> (python-shell-send-string-no-output "print('a')")

The result is "a".

> My point is that we cannot assure that Python 2 is not selected.  One
> example is EMACS_PYTHON_INTERPRETER environment variable introduced by
> the patch.  It can specify the interpreter used in ERTs.  So a Mac
> user may set EMACS_PYTHON_INTERPRETER to "python".

Fair enough. I take no great interest in making the tests pass with such an environment variable assignment; at the very minimum, they should pass in the default configuration.

> So I think we need some
> mechanism to skip test based on the interpreter version and the
> platform.

Time permitting, I will be happy to run instrumented test runs if it would help you find out exactly why the test fail with Python 2.






^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-26 10:52 ` Mattias Engdegård
  2024-05-26 12:05   ` kobarity
@ 2024-05-26 15:36   ` Eli Zaretskii
  1 sibling, 0 replies; 49+ messages in thread
From: Eli Zaretskii @ 2024-05-26 15:36 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: kobarity, sunlin7.mail, stefankangas, 70815

> From: Mattias Engdegård <mattias.engdegard@gmail.com>
> Date: Sun, 26 May 2024 12:52:54 +0200
> Cc: Lin Sun <sunlin7.mail@gmail.com>,
>  stefankangas@gmail.com,
>  70815@debbugs.gnu.org,
>  Eli Zaretskii <eliz@gnu.org>
> 
> This change caused python-tests failures on macOS. See attached log.
> 
> On this machine which has the standard macOS Python installation, 'python' is python 2, which apparently the tests don't cope very well with. (Have you verified that they do?)
> 
> The tests pass if modified to prefer Python 3:
> 
> @@ -3722,2 +3722,2 @@ python-tests-get-shell-interpreter
> -              (cl-some #'executable-find '("python" "python3" "python2"))))))
> +              (cl-some #'executable-find '("python3" "python" "python2"))))))

I don't like this preference.  It is basically wrong, because it
second-guesses what Python is _the_ Python on the user's machine.

Let's try to find another solution.  If worse comes to worst, we could
make a change specific to macOS, but I hope we won't need to.





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-26 13:23         ` Mattias Engdegård
  2024-05-26 14:15           ` kobarity
@ 2024-05-26 15:52           ` Eli Zaretskii
  2024-05-27 10:24             ` Mattias Engdegård
  1 sibling, 1 reply; 49+ messages in thread
From: Eli Zaretskii @ 2024-05-26 15:52 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: kobarity, sunlin7.mail, stefankangas, 70815

> From: Mattias Engdegård <mattias.engdegard@gmail.com>
> Date: Sun, 26 May 2024 15:23:46 +0200
> Cc: Lin Sun <sunlin7.mail@gmail.com>,
>  stefankangas@gmail.com,
>  70815@debbugs.gnu.org,
>  Eli Zaretskii <eliz@gnu.org>
> 
> Why select Python 2 in the first place? Is it more important to test Python 2 than Python 3 on other platforms?

Why do you have "python" as python2 when you have Python 3.x
installed?  The usual practice is to have "python" invoke the
preferred version, which is normally the latest one.





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-26 14:15           ` kobarity
  2024-05-26 15:00             ` kobarity
@ 2024-05-26 15:56             ` Eli Zaretskii
  2024-05-26 23:06               ` Stefan Kangas
  1 sibling, 1 reply; 49+ messages in thread
From: Eli Zaretskii @ 2024-05-26 15:56 UTC (permalink / raw)
  To: kobarity; +Cc: mattias.engdegard, sunlin7.mail, stefankangas, 70815

> Date: Sun, 26 May 2024 23:15:50 +0900
> From: kobarity <kobarity@gmail.com>
> Cc: Lin Sun <sunlin7.mail@gmail.com>,
> 	stefankangas@gmail.com,
> 	70815@debbugs.gnu.org,
> 	Eli Zaretskii <eliz@gnu.org>
> 
> > Why select Python 2 in the first place? Is it more important to test Python 2 than Python 3 on other platforms?
> 
> I am not saying that Python 2 (or simple "python") should be the
> first.  I do agree that "python3" should be preferred than "python".

I think Python 3 should be preferred if the user prefers it.  And if
the python interpreter invoked by "python" is not the preferred
version, then how can Emacs know which one is the preferred version?

> At the time of writing, I assumed that current ERTs can be run on both
> Python 2 and 3 on all platforms.  However, it turned out that it was
> wrong.  Some tests fail with Python 2 on Mac.  So I think we need some
> mechanism to skip test based on the interpreter version and the
> platform.

If macOS needs special treatment, here, we can install a change
specific to macOS.  But let's not skew all the platforms because of
macOS.





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-26 15:56             ` Eli Zaretskii
@ 2024-05-26 23:06               ` Stefan Kangas
  2024-05-27 11:18                 ` Eli Zaretskii
  0 siblings, 1 reply; 49+ messages in thread
From: Stefan Kangas @ 2024-05-26 23:06 UTC (permalink / raw)
  To: Eli Zaretskii, kobarity; +Cc: mattias.engdegard, sunlin7.mail, 70815

Eli Zaretskii <eliz@gnu.org> writes:

> I think Python 3 should be preferred if the user prefers it.  And if
> the python interpreter invoked by "python" is not the preferred
> version, then how can Emacs know which one is the preferred version?

If we do still care about Python 2, why should we test using only _one_
version?  If both are available, surely it's better to run the test
using both.

If we don't want to do that, it makes more sense to prefer Python 3.
This given that Python 2 is EOL since 4+ years, and is less and less
likely to be relevant.

For example, RHEL 8 will stop offical support for Python 2 next month,
and RHEL 9 doesn't ship with it.  Debian GNU/Linux has already dropped
Python 2 from its stable distribution.  And so on.





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-26 15:52           ` Eli Zaretskii
@ 2024-05-27 10:24             ` Mattias Engdegård
  2024-05-27 11:19               ` Lin Sun
  0 siblings, 1 reply; 49+ messages in thread
From: Mattias Engdegård @ 2024-05-27 10:24 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: kobarity, sunlin7.mail, stefankangas, 70815

26 maj 2024 kl. 17.52 skrev Eli Zaretskii <eliz@gnu.org>:

> Why do you have "python" as python2 when you have Python 3.x
> installed?  The usual practice is to have "python" invoke the
> preferred version, which is normally the latest one.

That is a misunderstanding. It is not at all unusual to have plain `python` being Python 2 for compatibility with old scripts. (A long-running debate point in the transition from Python 2 to 3.)

In any case, this set-up is standard in macOS (at least my version), and I'm quite sure I've seen similar arrangements in other systems.

What we are debating now is whether it is worth making the tests pass for certain Python 2 installations if the user somehow prefers those (with EMACS_PYTHON_INTERPRETER), and if so, how.

Kobarity and Lin Sun, wouldn't it make sense to tie the interpreter to test to `python-shell-interpreter`?






^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-26 23:06               ` Stefan Kangas
@ 2024-05-27 11:18                 ` Eli Zaretskii
  2024-05-27 12:20                   ` Mattias Engdegård
  0 siblings, 1 reply; 49+ messages in thread
From: Eli Zaretskii @ 2024-05-27 11:18 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: kobarity, sunlin7.mail, mattias.engdegard, 70815

> From: Stefan Kangas <stefankangas@gmail.com>
> Date: Sun, 26 May 2024 16:06:31 -0700
> Cc: mattias.engdegard@gmail.com, sunlin7.mail@gmail.com, 70815@debbugs.gnu.org
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > I think Python 3 should be preferred if the user prefers it.  And if
> > the python interpreter invoked by "python" is not the preferred
> > version, then how can Emacs know which one is the preferred version?
> 
> If we do still care about Python 2, why should we test using only _one_
> version?  If both are available, surely it's better to run the test
> using both.

We do care about Python 2 because some users still use it.  There's no
other reasons: Emacs doesn't care which version of Python is
preferable to the user.

We could test both versions if they are installed, I don't think I'd
mind.

> If we don't want to do that, it makes more sense to prefer Python 3.
> This given that Python 2 is EOL since 4+ years, and is less and less
> likely to be relevant.

Mattias's message in this thread indicates otherwise, I think.

> For example, RHEL 8 will stop offical support for Python 2 next month,
> and RHEL 9 doesn't ship with it.  Debian GNU/Linux has already dropped
> Python 2 from its stable distribution.  And so on.

Emacs doesn't need to follow these tendencies.  We try to avoid
forcing our users to upgrade unrelated or loosely-related software
just because they installed a newer version of Emacs, because forcing
them to do that in many cases ends up sending them down an immense
rabbit hole, whereby upgrading some component requires them to upgrade
many others, in a well-known snowball fashion.  So we generally decide
to drop support for some old software only when keeping it supported
becomes a real burden.

I don't think Python is a maintenance burden for us at this time, is
it?





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-27 10:24             ` Mattias Engdegård
@ 2024-05-27 11:19               ` Lin Sun
  0 siblings, 0 replies; 49+ messages in thread
From: Lin Sun @ 2024-05-27 11:19 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: Eli Zaretskii, kobarity, 70815, Stefan Kangas

[-- Attachment #1: Type: text/plain, Size: 1463 bytes --]

On Mon, May 27, 2024, 03:24 Mattias Engdegård <mattias.engdegard@gmail.com>
wrote:

> 26 maj 2024 kl. 17.52 skrev Eli Zaretskii <eliz@gnu.org>:
>
> > Why do you have "python" as python2 when you have Python 3.x
> > installed?  The usual practice is to have "python" invoke the
> > preferred version, which is normally the latest one.
>
> That is a misunderstanding. It is not at all unusual to have plain
> `python` being Python 2 for compatibility with old scripts. (A long-running
> debate point in the transition from Python 2 to 3.)
>
> In any case, this set-up is standard in macOS (at least my version), and
> I'm quite sure I've seen similar arrangements in other systems.
>
> What we are debating now is whether it is worth making the tests pass for
> certain Python 2 installations if the user somehow prefers those (with
> EMACS_PYTHON_INTERPRETER), and if so, how.
>
> Kobarity and Lin Sun, wouldn't it make sense to tie the interpreter to
> test to `python-shell-interpreter`?
>

Hi Eli, it's not worth to make the cases for user perfers
EMACS_PYTHON_INTERPRETER.
It's failed naturally if the interpreter version is not supported anymore
or not supported yet.

For python2, as we discussed on original patch thread, it may be will still
exists for many years, so we need keep compatible with it, but we may skip
the cases that not working for python2 anymore.

And I'm trying to get the details of the failure.

>

[-- Attachment #2: Type: text/html, Size: 2186 bytes --]

^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-27 11:18                 ` Eli Zaretskii
@ 2024-05-27 12:20                   ` Mattias Engdegård
  2024-05-27 12:43                     ` Eli Zaretskii
  0 siblings, 1 reply; 49+ messages in thread
From: Mattias Engdegård @ 2024-05-27 12:20 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: kobarity, sunlin7.mail, Stefan Kangas, 70815

27 maj 2024 kl. 13.18 skrev Eli Zaretskii <eliz@gnu.org>:

>> If we don't want to do that, it makes more sense to prefer Python 3.
>> This given that Python 2 is EOL since 4+ years, and is less and less
>> likely to be relevant.
> 
> Mattias's message in this thread indicates otherwise, I think.

The `python` binary can very well be the one nobody wants to use, it's just that it has a long-term legacy lease on the file name. For example, on this system (with the unmodified system default Python installations):

|~% python
|
|WARNING: Python 2.7 is not recommended. 
|This version is included in macOS for compatibility with legacy software. 
|Future versions of macOS will not include Python 2.7. 
|Instead, it is recommended that you transition to using 'python3' from within Terminal.

I very much agree that we should make our own decision about what platforms and versions to support but in this case it's just a matter of what we want to use for testing our own code, and given more than one Python, the one named `python3` is more likely to be relevant than just `python`.







^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-26 15:24               ` Mattias Engdegård
@ 2024-05-27 12:33                 ` kobarity
  2024-05-27 12:45                   ` Eli Zaretskii
  2024-05-28 12:30                   ` Mattias Engdegård
  0 siblings, 2 replies; 49+ messages in thread
From: kobarity @ 2024-05-27 12:33 UTC (permalink / raw)
  To: Mattias Engdegård, Lin Sun; +Cc: Eli Zaretskii, Stefan Kangas, 70815

Mattias Engdegård wrote:
> > Please try evaluating the following expression in the Python buffer
> > after invoking Inferior Python buffer running Python 2.
> > 
> > (python-shell-send-string-no-output "print('a')")
> 
> The result is "a".

Thanks.  Then I have no idea why it fails.  It's difficult for me to
further investigate as I don't have Mac environment.

Mattias Engdegård wrote:
> Kobarity and Lin Sun, wouldn't it make sense to tie the interpreter to test to `python-shell-interpreter`?

I don't think it is a good idea.  `python-shell-interpreter' can be a
variety of things.  It may be IPython, PyPy, or even Poetry.
`python-tests-shell-interpreter' exists to override
`python-shell-interpreter'.

Lin Sun wrote:
> Hi Eli, it's not worth to make the cases for user perfers EMACS_PYTHON_INTERPRETER. 
> It's failed naturally if the interpreter version is not supported anymore or not supported yet.

I think we are still supporting Python 2 on Mac.  It is just that
there seems to be problems with some features.

ERTs exist to find bugs.  In that sense, I think the ERTs have worked
well.  We probably have found the bug with Python 2 on Mac, unless
there is a bug on the ERTs.  So the natural and best course is to fix
that bug.  Changing the order of the interpreters to find or skipping
some ERTs does not solve the problem.  However, it seems that only a
limited number of people can pursue the problem on Mac, and fewer
people will have trouble with Python 2 issues.  So for now, I think it
is better to skip these ERTs for Python 2 on Mac only.

The problem is that there is no convenient way to skip some ERTs based
on the interpreter's version.  I will think about it, but it will be
over the weekend at the earliest.





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-27 12:20                   ` Mattias Engdegård
@ 2024-05-27 12:43                     ` Eli Zaretskii
  0 siblings, 0 replies; 49+ messages in thread
From: Eli Zaretskii @ 2024-05-27 12:43 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: kobarity, sunlin7.mail, stefankangas, 70815

> From: Mattias Engdegård <mattias.engdegard@gmail.com>
> Date: Mon, 27 May 2024 14:20:21 +0200
> Cc: Stefan Kangas <stefankangas@gmail.com>,
>  kobarity@gmail.com,
>  sunlin7.mail@gmail.com,
>  70815@debbugs.gnu.org
> 
> I very much agree that we should make our own decision about what platforms and versions to support but in this case it's just a matter of what we want to use for testing our own code, and given more than one Python, the one named `python3` is more likely to be relevant than just `python`.

If the Python experts agree, I won't object.

FTR, I have Python 3.x installed here, but no "python3", only
"python".





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-27 12:33                 ` kobarity
@ 2024-05-27 12:45                   ` Eli Zaretskii
  2024-05-28 12:30                   ` Mattias Engdegård
  1 sibling, 0 replies; 49+ messages in thread
From: Eli Zaretskii @ 2024-05-27 12:45 UTC (permalink / raw)
  To: kobarity; +Cc: mattias.engdegard, sunlin7.mail, stefankangas, 70815

> Date: Mon, 27 May 2024 21:33:03 +0900
> From: kobarity <kobarity@gmail.com>
> Cc: Eli Zaretskii <eliz@gnu.org>,
> 	Stefan Kangas <stefankangas@gmail.com>,
> 	70815@debbugs.gnu.org
> 
> ERTs exist to find bugs.  In that sense, I think the ERTs have worked
> well.  We probably have found the bug with Python 2 on Mac, unless
> there is a bug on the ERTs.  So the natural and best course is to fix
> that bug.  Changing the order of the interpreters to find or skipping
> some ERTs does not solve the problem.  However, it seems that only a
> limited number of people can pursue the problem on Mac, and fewer
> people will have trouble with Python 2 issues.  So for now, I think it
> is better to skip these ERTs for Python 2 on Mac only.

I'm okay with that solution as well.





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-27 12:33                 ` kobarity
  2024-05-27 12:45                   ` Eli Zaretskii
@ 2024-05-28 12:30                   ` Mattias Engdegård
  2024-05-28 15:17                     ` kobarity
  1 sibling, 1 reply; 49+ messages in thread
From: Mattias Engdegård @ 2024-05-28 12:30 UTC (permalink / raw)
  To: kobarity; +Cc: Eli Zaretskii, Lin Sun, Stefan Kangas, 70815

27 maj 2024 kl. 14.33 skrev kobarity <kobarity@gmail.com>:

> We probably have found the bug with Python 2 on Mac, unless
> there is a bug on the ERTs.

It could just be a mismatch of expectations. With python-shell-interpreter set to "python2", tab-completion in the Python interactive shell works but in a diminished capacity. For example, 'pri<TAB>' completes to 'print' but 'math.sq<TAB>' does not complete to 'math.sqrt(' as it does in Python 3.

> Changing the order of the interpreters to find or skipping
> some ERTs does not solve the problem.

But it does fix a different problem: it tests python-mode with Python 3, which is more important.

>  However, it seems that only a
> limited number of people can pursue the problem on Mac, and fewer
> people will have trouble with Python 2 issues.  So for now, I think it
> is better to skip these ERTs for Python 2 on Mac only.

We can probably agree that absent explicit information about what version the user wants tested, we should test python-mode with Python 3 on macOS and other platforms.

If you think it is important we can also test it with Python 2 if available. Rejigging the tests to run for multiple Python versions is certainly possible but would be some work.

Meanwhile I'm just going to make the tests use the same logic as python.el for selecting the binary to use, as there does not seem to be a reason why this would make anything worse.






^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-28 12:30                   ` Mattias Engdegård
@ 2024-05-28 15:17                     ` kobarity
  2024-05-28 16:09                       ` Mattias Engdegård
  0 siblings, 1 reply; 49+ messages in thread
From: kobarity @ 2024-05-28 15:17 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: Eli Zaretskii, Lin Sun, Stefan Kangas, 70815

Mattias Engdegård wrote:
> 
> 27 maj 2024 kl. 14.33 skrev kobarity <kobarity@gmail.com>:
> 
> > We probably have found the bug with Python 2 on Mac, unless
> > there is a bug on the ERTs.
> 
> It could just be a mismatch of expectations. With python-shell-interpreter set to "python2", tab-completion in the Python interactive shell works but in a diminished capacity. For example, 'pri<TAB>' completes to 'print' but 'math.sq<TAB>' does not complete to 'math.sqrt(' as it does in Python 3.

I think it is a "bug".  Because it is working with Python 2 on Linux
(with native and non-native completions), and I believe many would
expect it to work.

In any case, to accommodate the ERTs for such differences, a mechanism
to skip an ERT based on the interpreter version (or some other
property) is needed.

> > Changing the order of the interpreters to find or skipping
> > some ERTs does not solve the problem.
> 
> But it does fix a different problem: it tests python-mode with Python 3, which is more important.

As I mentioned before, I am not opposed to prioritize "python3".  I
don't think anyone is arguing that "python" should precede "python3"
anymore.

> >  However, it seems that only a
> > limited number of people can pursue the problem on Mac, and fewer
> > people will have trouble with Python 2 issues.  So for now, I think it
> > is better to skip these ERTs for Python 2 on Mac only.
> 
> We can probably agree that absent explicit information about what version the user wants tested, we should test python-mode with Python 3 on macOS and other platforms.
> 
> If you think it is important we can also test it with Python 2 if available. Rejigging the tests to run for multiple Python versions is certainly possible but would be some work.
> 
> Meanwhile I'm just going to make the tests use the same logic as python.el for selecting the binary to use, as there does not seem to be a reason why this would make anything worse.
> 

You have an option to set EMACS_PYTHON_INTERPRETER environment
variable to "python3", just for now.





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-28 15:17                     ` kobarity
@ 2024-05-28 16:09                       ` Mattias Engdegård
  2024-05-29 14:56                         ` kobarity
  0 siblings, 1 reply; 49+ messages in thread
From: Mattias Engdegård @ 2024-05-28 16:09 UTC (permalink / raw)
  To: kobarity; +Cc: Eli Zaretskii, Lin Sun, Stefan Kangas, 70815

28 maj 2024 kl. 17.17 skrev kobarity <kobarity@gmail.com>:

> I think it is a "bug".  Because it is working with Python 2 on Linux
> (with native and non-native completions), and I believe many would
> expect it to work.

Could be, but it's hard to believe that whatever completion defect we have in python.el for Python 2 on macOS is affecting a lot of people. It seems usable enough to me, given the circumstances.

> As I mentioned before, I am not opposed to prioritize "python3".  I
> don't think anyone is arguing that "python" should precede "python3"
> anymore.

Thank you. I don't want to steamroller a change, but there is a real risk of paralysis from too much deference to code details that might just as well have been a simple oversight, which I believe is what happened here.

And again, I'd be happy to help debug the problem on macOS if someone is very bothered about the problem now or in the future.






^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-28 16:09                       ` Mattias Engdegård
@ 2024-05-29 14:56                         ` kobarity
  2024-05-30 10:09                           ` Mattias Engdegård
  0 siblings, 1 reply; 49+ messages in thread
From: kobarity @ 2024-05-29 14:56 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: Eli Zaretskii, Lin Sun, Stefan Kangas, 70815

Mattias Engdegård wrote:
> 28 maj 2024 kl. 17.17 skrev kobarity <kobarity@gmail.com>:
> 
> > I think it is a "bug".  Because it is working with Python 2 on Linux
> > (with native and non-native completions), and I believe many would
> > expect it to work.
> 
> Could be, but it's hard to believe that whatever completion defect we have in python.el for Python 2 on macOS is affecting a lot of people. It seems usable enough to me, given the circumstances.
> 
> > As I mentioned before, I am not opposed to prioritize "python3".  I
> > don't think anyone is arguing that "python" should precede "python3"
> > anymore.
> 
> Thank you. I don't want to steamroller a change, but there is a real risk of paralysis from too much deference to code details that might just as well have been a simple oversight, which I believe is what happened here.

I'm not sure what you are proposing.  What I want to do now is not to
fix the "bug", but to accept the current situation and express it as
the ERTs.  Otherwise, even if we change the order of the interpreters,
it will fail when some Mac user sets EMACS_PYTHON_INTERPRETER to
"python" and runs ERTs for example.

Even if we could fix this "bug" right away, or even if we made the
decision to stop Python 2 support on Mac, I believe we would still
need a mechanism to skip an ERT based on the interpreter version
because similar stories would still come up.

Unless you are opposed to adding such a mechanism to ERT, I don't see
much difference of opinion between us.  If you want to change the
order of the interpreters as soon as possible, I am not opposed to
that either.





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-29 14:56                         ` kobarity
@ 2024-05-30 10:09                           ` Mattias Engdegård
  2024-06-02 13:20                             ` kobarity
  0 siblings, 1 reply; 49+ messages in thread
From: Mattias Engdegård @ 2024-05-30 10:09 UTC (permalink / raw)
  To: kobarity; +Cc: Eli Zaretskii, Lin Sun, Stefan Kangas, 70815

29 maj 2024 kl. 16.56 skrev kobarity <kobarity@gmail.com>:

> What I want to do now is not to
> fix the "bug", but to accept the current situation and express it as
> the ERTs.  Otherwise, even if we change the order of the interpreters,
> it will fail when some Mac user sets EMACS_PYTHON_INTERPRETER to
> "python" and runs ERTs for example.

That's very generous of you but watch out so that you don't waste time on busywork that isn't strictly necessary.

I did adjust the order of the interpreters in 9c7de10079, by the way; that took care of my own itches for this bug.

Do whatever you feel is necessary but again, your own time is precious.






^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-05-30 10:09                           ` Mattias Engdegård
@ 2024-06-02 13:20                             ` kobarity
  2024-06-03 14:02                               ` Mattias Engdegård
  0 siblings, 1 reply; 49+ messages in thread
From: kobarity @ 2024-06-02 13:20 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: Eli Zaretskii, Lin Sun, Stefan Kangas, 70815

[-- Attachment #1: Type: text/plain, Size: 1648 bytes --]

Mattias Engdegård wrote:
> 29 maj 2024 kl. 16.56 skrev kobarity <kobarity@gmail.com>:
> 
> > What I want to do now is not to
> > fix the "bug", but to accept the current situation and express it as
> > the ERTs.  Otherwise, even if we change the order of the interpreters,
> > it will fail when some Mac user sets EMACS_PYTHON_INTERPRETER to
> > "python" and runs ERTs for example.
> 
> That's very generous of you but watch out so that you don't waste time on busywork that isn't strictly necessary.
> 
> I did adjust the order of the interpreters in 9c7de10079, by the way; that took care of my own itches for this bug.
> 
> Do whatever you feel is necessary but again, your own time is precious.

Thanks, but as I mentioned before, this is something I thought we
would need sooner or later, even before the bug was found.

The attached patch is my proposal.  I added PRED argument to
`python-tests-get-shell-interpreter' to allow conditions to be
specified when selecting an interpreter.  For now, I only provide a
predicate that the major version of the interpreter is 3, but I think
it would be easy to add.

It would be helpful if you could try each of the following on Mac.

1. Set EMACS_PYTHON_INTERPRETER environment variable to "python" and
   run ERTs.  The expectation is that the 7 ERTs that previously
   resulted in errors will be skipped.
2. Revert 9c7de10079 and run ERTs.  The expectation is that the 7 ERTs
   that previously failed will succeed.

BTW, Apple seems to have removed Python 2 in 2022 MacOS 12.3.  Is your
Python 2 installed with brew or something else? Or is it an old Apple
one?

[-- Attachment #2: 0001-Specify-Python-3-in-some-ERTs-on-Mac.patch --]
[-- Type: application/octet-stream, Size: 7744 bytes --]

From e7e40853ea7f310aab50f223ecf17fe7cbf123e8 Mon Sep 17 00:00:00 2001
From: kobarity <kobarity@gmail.com>
Date: Sun, 2 Jun 2024 22:14:07 +0900
Subject: [PATCH] Specify Python 3 in some ERTs on Mac

* test/lisp/progmodes/python-tests.el (cl-extra): Remove
require.
(python-tests-shell-interpreter): Removed.
(python-tests-shell-interpreters): New variable.
(python-tests-get-shell-interpreter): Add an optional PRED
argument to allow ERts to specify Python interpreter version.
(python-tests--get-interpreter-info): New function.
(python-tests-interpreter-3-p): New function to be used as the
PRED argument of 'python-tests-get-shell-interpreter'.
(python-shell-completion-at-point-ipython): Remove setting
'python-tests-shell-interpreter'.
(python-shell-completion-at-point-1)
(python-completion-at-point-1)
(python-completion-at-point-2)
(python-completion-at-point-native-1)
(python-completion-at-point-native-2)
(python-completion-at-point-native-with-ffap-1)
(python-completion-at-point-native-with-eldoc-1): Specify
Python 3 on Mac to avoid errors.  (Bug#70815)
---
 test/lisp/progmodes/python-tests.el | 76 ++++++++++++++++++++---------
 1 file changed, 54 insertions(+), 22 deletions(-)

diff --git a/test/lisp/progmodes/python-tests.el b/test/lisp/progmodes/python-tests.el
index b06547b10ff..970ec32bc0c 100644
--- a/test/lisp/progmodes/python-tests.el
+++ b/test/lisp/progmodes/python-tests.el
@@ -3750,21 +3750,47 @@ python-bob-infloop-avoid
 \f
 ;;; Shell integration
 
-(defvar python-tests-shell-interpreter nil)
+(defvar python-tests-shell-interpreters nil
+  "List of Python interpreter information.
+Set this variable to nil to rescan interpreters.")
 
-(defun python-tests-get-shell-interpreter ()
+(defun python-tests-get-shell-interpreter (&optional pred)
   "Get the shell interpreter.
-If env string EMACS_PYTHON_INTERPRETER exists, use it as preferred one."
-  (if python-tests-shell-interpreter
-      python-tests-shell-interpreter
-    (setq python-tests-shell-interpreter
-          (or (when-let ((interpreter (getenv "EMACS_PYTHON_INTERPRETER")))
-                (or (executable-find interpreter)
-                    (error "Couldn't find EMACS_PYTHON_INTERPRETER(%s) in path"
-                           interpreter)))
-              ;; Use the same order as for the default value of
-              ;; `python-shell-interpreter'.
-              (cl-some #'executable-find '("python3" "python" "python2"))))))
+If an optional PRED is specified, an interpreter is selected that
+matches the predicate.  PRED must return the absolute file name if the
+condition is met.  If env string EMACS_PYTHON_INTERPRETER exists, use it
+as preferred one."
+  (unless python-tests-shell-interpreters
+    (setq python-tests-shell-interpreters
+          (if-let ((interpreter (getenv "EMACS_PYTHON_INTERPRETER")))
+              (if-let ((info (python-tests--get-interpreter-info interpreter)))
+                  (list info)
+                (error "Couldn't find EMACS_PYTHON_INTERPRETER(%s) in path"
+                       interpreter))
+            ;; Use the same order as for the default value of
+            ;; `python-shell-interpreter'.
+            (delq nil (mapcar #'python-tests--get-interpreter-info
+                              '("python3" "python" "python2"))))))
+  (cl-some (or pred #'car) python-tests-shell-interpreters))
+
+(defun python-tests--get-interpreter-info (name)
+  "Get Python interpreter information specified by NAME.
+The information returned is a cons cell consisting of the file path and
+the version string."
+  (when-let ((interpreter (executable-find name)))
+    (with-temp-buffer
+      (and (equal (call-process interpreter nil t nil "--version") 0)
+           (goto-char (point-min))
+           (looking-at
+            (rx (seq "Python" (+ space) (group (+ (any digit ?.))))))
+           (cons interpreter (match-string-no-properties 1))))))
+
+(defun python-tests-interpreter-3-p (info)
+  "Return the absolute file name if the interpreter major version in INFO is 3.
+This function is intended to be used as the PRED argument of
+`python-tests-get-shell-interpreter'."
+  (when (string= (car (split-string (cdr info) "\\.")) "3")
+    (car info)))
 
 (ert-deftest python-shell-get-process-name-1 ()
   "Check process name calculation sans `buffer-file-name'."
@@ -4828,7 +4854,8 @@ python-shell-completion-native-interpreter-disabled-p-1
     (should (python-shell-completion-native-interpreter-disabled-p))))
 
 (ert-deftest python-shell-completion-at-point-1 ()
-  (skip-unless (python-tests-get-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter
+                (when (eq system-type 'darwin) #'python-tests-interpreter-3-p)))
   (python-tests-with-temp-buffer-with-shell
    ""
    (python-shell-with-shell-buffer
@@ -4945,8 +4972,7 @@ python-shell-completion-at-point-jedi-completer
 
 (ert-deftest python-shell-completion-at-point-ipython ()
   "Check if Python shell completion works for IPython."
-  (let ((python-tests-shell-interpreter "ipython")
-        (python-shell-interpreter "ipython")
+  (let ((python-shell-interpreter "ipython")
         (python-shell-interpreter-args "-i --simple-prompt"))
     (skip-unless
      (and
@@ -4973,7 +4999,8 @@ python-shell-completion-at-point-ipython
 ;;; Symbol completion
 
 (ert-deftest python-completion-at-point-1 ()
-  (skip-unless (python-tests-get-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter
+                (when (eq system-type 'darwin) #'python-tests-interpreter-3-p)))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -4991,7 +5018,8 @@ python-completion-at-point-1
 
 (ert-deftest python-completion-at-point-2 ()
   "Should work regardless of the point in the Shell buffer."
-  (skip-unless (python-tests-get-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter
+                (when (eq system-type 'darwin) #'python-tests-interpreter-3-p)))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5044,7 +5072,8 @@ python-completion-at-point-while-running-1
      (should-not (with-timeout (1 t) (completion-at-point))))))
 
 (ert-deftest python-completion-at-point-native-1 ()
-  (skip-unless (python-tests-get-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter
+                (when (eq system-type 'darwin) #'python-tests-interpreter-3-p)))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5063,7 +5092,8 @@ python-completion-at-point-native-1
 
 (ert-deftest python-completion-at-point-native-2 ()
   "Should work regardless of the point in the Shell buffer."
-  (skip-unless (python-tests-get-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter
+                (when (eq system-type 'darwin) #'python-tests-interpreter-3-p)))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5081,7 +5111,8 @@ python-completion-at-point-native-2
      (should (completion-at-point)))))
 
 (ert-deftest python-completion-at-point-native-with-ffap-1 ()
-  (skip-unless (python-tests-get-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter
+                (when (eq system-type 'darwin) #'python-tests-interpreter-3-p)))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
@@ -5099,7 +5130,8 @@ python-completion-at-point-native-with-ffap-1
      (should (completion-at-point)))))
 
 (ert-deftest python-completion-at-point-native-with-eldoc-1 ()
-  (skip-unless (python-tests-get-shell-interpreter))
+  (skip-unless (python-tests-get-shell-interpreter
+                (when (eq system-type 'darwin) #'python-tests-interpreter-3-p)))
   (python-tests-with-temp-buffer-with-shell
    "
 import abc
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-06-02 13:20                             ` kobarity
@ 2024-06-03 14:02                               ` Mattias Engdegård
  2024-06-03 14:34                                 ` kobarity
  0 siblings, 1 reply; 49+ messages in thread
From: Mattias Engdegård @ 2024-06-03 14:02 UTC (permalink / raw)
  To: kobarity; +Cc: Eli Zaretskii, Lin Sun, Stefan Kangas, 70815

2 juni 2024 kl. 15.20 skrev kobarity <kobarity@gmail.com>:

> The attached patch is my proposal.  I added PRED argument to
> `python-tests-get-shell-interpreter' to allow conditions to be
> specified when selecting an interpreter.  For now, I only provide a
> predicate that the major version of the interpreter is 3, but I think
> it would be easy to add.

That would work for me. (It could maybe be simplified a bit but that's not very important.)

> 1. Set EMACS_PYTHON_INTERPRETER environment variable to "python" and
>   run ERTs.  The expectation is that the 7 ERTs that previously
>   resulted in errors will be skipped.

With EMACS_PYTHON_INTERPRETER=python3 or unset

  SKIPPED  python-shell-completion-at-point-ipython
  SKIPPED  python-shell-completion-at-point-jedi-completer

With EMACS_PYTHON_INTERPRETER=python

  SKIPPED  python-completion-at-point-1
  SKIPPED  python-completion-at-point-2
  SKIPPED  python-completion-at-point-native-1
  SKIPPED  python-completion-at-point-native-2
  SKIPPED  python-completion-at-point-native-with-eldoc-1
  SKIPPED  python-completion-at-point-native-with-ffap-1
  SKIPPED  python-shell-completion-at-point-1
  SKIPPED  python-shell-completion-at-point-ipython
  SKIPPED  python-shell-completion-at-point-jedi-completer

> 2. Revert 9c7de10079 and run ERTs.  The expectation is that the 7 ERTs
>   that previously failed will succeed.

No, they still fail:

7 unexpected results:
   FAILED  python-completion-at-point-1
   FAILED  python-completion-at-point-2
   FAILED  python-completion-at-point-native-1
   FAILED  python-completion-at-point-native-2
   FAILED  python-completion-at-point-native-with-eldoc-1
   FAILED  python-completion-at-point-native-with-ffap-1
   FAILED  python-shell-completion-at-point-1

2 skipped results:
  SKIPPED  python-shell-completion-at-point-ipython
  SKIPPED  python-shell-completion-at-point-jedi-completer

> Apple seems to have removed Python 2 in 2022 MacOS 12.3.  Is your
> Python 2 installed with brew or something else? Or is it an old Apple
> one?

It's the standard setup of an older version of macOS (the hardware of that machine can't run 12.3).






^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-06-03 14:02                               ` Mattias Engdegård
@ 2024-06-03 14:34                                 ` kobarity
  2024-06-03 16:24                                   ` kobarity
  0 siblings, 1 reply; 49+ messages in thread
From: kobarity @ 2024-06-03 14:34 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: Eli Zaretskii, Lin Sun, Stefan Kangas, 70815

Mattias Engdegård wrote:
> 2 juni 2024 kl. 15.20 skrev kobarity <kobarity@gmail.com>:
> > 1. Set EMACS_PYTHON_INTERPRETER environment variable to "python" and
> >   run ERTs.  The expectation is that the 7 ERTs that previously
> >   resulted in errors will be skipped.
> 
> With EMACS_PYTHON_INTERPRETER=python3 or unset
> 
>   SKIPPED  python-shell-completion-at-point-ipython
>   SKIPPED  python-shell-completion-at-point-jedi-completer
> 
> With EMACS_PYTHON_INTERPRETER=python
> 
>   SKIPPED  python-completion-at-point-1
>   SKIPPED  python-completion-at-point-2
>   SKIPPED  python-completion-at-point-native-1
>   SKIPPED  python-completion-at-point-native-2
>   SKIPPED  python-completion-at-point-native-with-eldoc-1
>   SKIPPED  python-completion-at-point-native-with-ffap-1
>   SKIPPED  python-shell-completion-at-point-1
>   SKIPPED  python-shell-completion-at-point-ipython
>   SKIPPED  python-shell-completion-at-point-jedi-completer

Thanks, this is as expected.

> > 2. Revert 9c7de10079 and run ERTs.  The expectation is that the 7 ERTs
> >   that previously failed will succeed.
> 
> No, they still fail:
> 
> 7 unexpected results:
>    FAILED  python-completion-at-point-1
>    FAILED  python-completion-at-point-2
>    FAILED  python-completion-at-point-native-1
>    FAILED  python-completion-at-point-native-2
>    FAILED  python-completion-at-point-native-with-eldoc-1
>    FAILED  python-completion-at-point-native-with-ffap-1
>    FAILED  python-shell-completion-at-point-1
> 
> 2 skipped results:
>   SKIPPED  python-shell-completion-at-point-ipython
>   SKIPPED  python-shell-completion-at-point-jedi-completer

Maybe I did not make the right request.  What I wanted you to try was
to make the following changes after applying my patch in the previous
email.

diff --git a/test/lisp/progmodes/python-tests.el b/test/lisp/progmodes/python-tests.el
index 970ec32bc0c..77b30f8bdbc 100644
--- a/test/lisp/progmodes/python-tests.el
+++ b/test/lisp/progmodes/python-tests.el
@@ -3770,7 +3770,7 @@ python-tests-get-shell-interpreter
             ;; Use the same order as for the default value of
             ;; `python-shell-interpreter'.
             (delq nil (mapcar #'python-tests--get-interpreter-info
-                              '("python3" "python" "python2"))))))
+                              '("python" "python3" "python2"))))))
   (cl-some (or pred #'car) python-tests-shell-interpreters))

 (defun python-tests--get-interpreter-info (name)

If you have tried it this way, could you tell me what the value of
`python-tests-shell-interpreters' is?

> > Apple seems to have removed Python 2 in 2022 MacOS 12.3.  Is your
> > Python 2 installed with brew or something else? Or is it an old Apple
> > one?
> 
> It's the standard setup of an older version of macOS (the hardware of that machine can't run 12.3).

I understood.





^ permalink raw reply related	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-06-03 14:34                                 ` kobarity
@ 2024-06-03 16:24                                   ` kobarity
  2024-06-04 14:29                                     ` kobarity
  0 siblings, 1 reply; 49+ messages in thread
From: kobarity @ 2024-06-03 16:24 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: Eli Zaretskii, Lin Sun, Stefan Kangas, 70815

kobarity wrote:
> Mattias Engdegård wrote:
> > > 2. Revert 9c7de10079 and run ERTs.  The expectation is that the 7 ERTs
> > >   that previously failed will succeed.
> > 
> > No, they still fail:
> > 
> > 7 unexpected results:
> >    FAILED  python-completion-at-point-1
> >    FAILED  python-completion-at-point-2
> >    FAILED  python-completion-at-point-native-1
> >    FAILED  python-completion-at-point-native-2
> >    FAILED  python-completion-at-point-native-with-eldoc-1
> >    FAILED  python-completion-at-point-native-with-ffap-1
> >    FAILED  python-shell-completion-at-point-1
> > 
> > 2 skipped results:
> >   SKIPPED  python-shell-completion-at-point-ipython
> >   SKIPPED  python-shell-completion-at-point-jedi-completer
> 
> Maybe I did not make the right request.  What I wanted you to try was
> to make the following changes after applying my patch in the previous
> email.
> 
> diff --git a/test/lisp/progmodes/python-tests.el b/test/lisp/progmodes/python-tests.el
> index 970ec32bc0c..77b30f8bdbc 100644
> --- a/test/lisp/progmodes/python-tests.el
> +++ b/test/lisp/progmodes/python-tests.el
> @@ -3770,7 +3770,7 @@ python-tests-get-shell-interpreter
>              ;; Use the same order as for the default value of
>              ;; `python-shell-interpreter'.
>              (delq nil (mapcar #'python-tests--get-interpreter-info
> -                              '("python3" "python" "python2"))))))
> +                              '("python" "python3" "python2"))))))
>    (cl-some (or pred #'car) python-tests-shell-interpreters))
> 
>  (defun python-tests--get-interpreter-info (name)
> 
> If you have tried it this way, could you tell me what the value of
> `python-tests-shell-interpreters' is?

Sorry, I realized my mistake.  I will revise my patch within a few
days.





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-06-03 16:24                                   ` kobarity
@ 2024-06-04 14:29                                     ` kobarity
  2024-06-05 10:25                                       ` Mattias Engdegård
  0 siblings, 1 reply; 49+ messages in thread
From: kobarity @ 2024-06-04 14:29 UTC (permalink / raw)
  To: Mattias Engdegård, Lin Sun; +Cc: Eli Zaretskii, Stefan Kangas, 70815

[-- Attachment #1: Type: text/plain, Size: 3635 bytes --]

kobarity wrote:
> 
> kobarity wrote:
> > Mattias Engdegård wrote:
> > > > 2. Revert 9c7de10079 and run ERTs.  The expectation is that the 7 ERTs
> > > >   that previously failed will succeed.
> > > 
> > > No, they still fail:
> > > 
> > > 7 unexpected results:
> > >    FAILED  python-completion-at-point-1
> > >    FAILED  python-completion-at-point-2
> > >    FAILED  python-completion-at-point-native-1
> > >    FAILED  python-completion-at-point-native-2
> > >    FAILED  python-completion-at-point-native-with-eldoc-1
> > >    FAILED  python-completion-at-point-native-with-ffap-1
> > >    FAILED  python-shell-completion-at-point-1
> > > 
> > > 2 skipped results:
> > >   SKIPPED  python-shell-completion-at-point-ipython
> > >   SKIPPED  python-shell-completion-at-point-jedi-completer
> > 
> > Maybe I did not make the right request.  What I wanted you to try was
> > to make the following changes after applying my patch in the previous
> > email.
> > 
> > diff --git a/test/lisp/progmodes/python-tests.el b/test/lisp/progmodes/python-tests.el
> > index 970ec32bc0c..77b30f8bdbc 100644
> > --- a/test/lisp/progmodes/python-tests.el
> > +++ b/test/lisp/progmodes/python-tests.el
> > @@ -3770,7 +3770,7 @@ python-tests-get-shell-interpreter
> >              ;; Use the same order as for the default value of
> >              ;; `python-shell-interpreter'.
> >              (delq nil (mapcar #'python-tests--get-interpreter-info
> > -                              '("python3" "python" "python2"))))))
> > +                              '("python" "python3" "python2"))))))
> >    (cl-some (or pred #'car) python-tests-shell-interpreters))
> > 
> >  (defun python-tests--get-interpreter-info (name)
> > 
> > If you have tried it this way, could you tell me what the value of
> > `python-tests-shell-interpreters' is?
> 
> Sorry, I realized my mistake.  I will revise my patch within a few
> days.

The attached is the revised patch.  In order to bind
`python-shell-interpreter' consistently, new macros
`python-tests-with-shell-interpreter' and
`python-tests-with-temp-buffer-with-shell-interpreter' were
introduced.  The patch is larger because some of the indentations have
been changed by using new macros.  I have fixed
`python-shell-interpreter' was not bound correctly in some ERTs, so
you might find new ERTs that fail with Python 2 on Mac.

Same as before, it would be helpful if you could try each of the
following on Mac.

1. Set EMACS_PYTHON_INTERPRETER environment variable to "python" and
   run ERTs.  The expectation is that the 7 ERTs that previously
   resulted in errors will be skipped.
2. Change the order of the interpreters in
   `python-tests-get-shell-interpreter' to  "python" "python3"
   "python2" and run ERTs.  The expectation is that the 7 ERTs that
   previously failed will succeed.

Another change is the behavior when the interpreter specified in
EMACS_PYTHON_INTERPRETER is not found.  In the current master, ERTs
are skipped if the interpreter specified by EMACS_PYTHON_INTERPRETER
is not found.  This is because although
`python-tests-get-shell-interpreter' raises an error, `skip-unless'
ignores it.

However, if the interpreter specified by EMACS_PYTHON_INTERPRETER is
not found, it is likely that EMACS_PYTHON_INTERPRETER is incorrectly
configured, and I would prefer to let it fail rather than let it be
skipped.  If it is better to be skipped, it would be better to have
`python-tests-get-shell-interpreter' return nil without raising an
error.  I would like to hear Lin's and others opinions on this matter.

[-- Attachment #2: 0001-Specify-Python-3-in-some-ERTs-on-Mac.patch --]
[-- Type: application/octet-stream, Size: 41276 bytes --]

From 8721e1e08543f0328f8bf822e64bfea6742d8abf Mon Sep 17 00:00:00 2001
From: kobarity <kobarity@gmail.com>
Date: Tue, 4 Jun 2024 21:51:32 +0900
Subject: [PATCH] Specify Python 3 in some ERTs on Mac

* test/lisp/progmodes/python-tests.el
(python-tests-with-temp-buffer-with-shell): Remove setting
'python-shell-interpreter'.
(python-tests-shell-interpreter): Removed.
(python-tests-shell-interpreters): New variable.
(python-tests-with-shell-interpreter)
(python-tests-with-temp-buffer-with-shell-interpreter): New macros.
(python-tests-get-shell-interpreter): Add an optional PRED
argument to allow ERts to specify Python interpreter version.
(python-tests--get-interpreter-info): New function.
(python-tests-interpreter-3-p): New function to be used as the
PRED argument of 'python-tests-get-shell-interpreter'.
(python-shell-make-comint-1)
(python-shell-make-comint-2)
(python-shell-make-comint-4)
(python-shell-get-process-1)
(python-shell-internal-get-or-create-process-1)
(python-shell-prompt-detect-1)
(python-shell-prompt-detect-2)
(python-shell-prompt-detect-3)
(python-shell-prompt-detect-4)
(python-shell-prompt-detect-5)
(python-shell-prompt-detect-6)
(python-shell-prompt-set-calculated-regexps-6)
(python-shell-completion-at-point-jedi-completer)
(python-completion-at-point-pdb-1)
(python-completion-at-point-while-running-1)
(python-ffap-module-path-1)
(python-ffap-module-path-while-running-1)
(python-eldoc--get-doc-at-point-1)
(python-eldoc--get-doc-at-point-while-running-1)
(python-tests--run-python-selects-window)
(python-test--shell-send-block): Use the new macro.
(python-shell-completion-at-point-ipython): Remove setting
'python-tests-shell-interpreter'.
(python-shell-completion-at-point-1)
(python-completion-at-point-1)
(python-completion-at-point-2)
(python-completion-at-point-native-1)
(python-completion-at-point-native-2)
(python-completion-at-point-native-with-ffap-1)
(python-completion-at-point-native-with-eldoc-1): Use the new
macro and specify Python 3 on Mac to avoid errors.  (Bug#70815)
---
 test/lisp/progmodes/python-tests.el | 660 +++++++++++++++-------------
 1 file changed, 352 insertions(+), 308 deletions(-)

diff --git a/test/lisp/progmodes/python-tests.el b/test/lisp/progmodes/python-tests.el
index b06547b10ff..5fc773026e7 100644
--- a/test/lisp/progmodes/python-tests.el
+++ b/test/lisp/progmodes/python-tests.el
@@ -59,8 +59,7 @@ python-tests-with-temp-buffer-with-shell
   (let ((dir (make-symbol "dir")))
     `(with-temp-buffer
        (let ((python-indent-guess-indent-offset nil)
-             (python-shell-completion-native-enable nil)
-             (python-shell-interpreter (python-tests-get-shell-interpreter)))
+             (python-shell-completion-native-enable nil))
          (python-mode)
          (unwind-protect
              ;; Prevent test failures when Jedi is used as a completion
@@ -3750,21 +3749,67 @@ python-bob-infloop-avoid
 \f
 ;;; Shell integration
 
-(defvar python-tests-shell-interpreter nil)
-
-(defun python-tests-get-shell-interpreter ()
+(defvar python-tests-shell-interpreters nil
+  "List of Python interpreter information.
+Set this variable to nil to rescan interpreters.")
+
+(defmacro python-tests-with-shell-interpreter (pred &rest body)
+  "Bind `python-shell-interpreter' and execute BODY.
+`python-shell-interpreter' is bound to the result of calling
+`python-tests-get-shell-interpreter' with PRED argument.  The calling
+ERT is skipped if `python-tests-get-shell-interpreter' returned nil."
+  `(let ((python-shell-interpreter
+          (python-tests-get-shell-interpreter ,pred)))
+     (skip-unless python-shell-interpreter)
+     ,@body))
+
+(defmacro python-tests-with-temp-buffer-with-shell-interpreter
+    (pred contents &rest body)
+  "Variant of `python-tests-with-temp-buffer-with-shell'.
+It binds `python-shell-interpreter' to the result of calling
+`python-tests-get-shell-interpreter' with PRED argument, and calls
+`python-tests-with-temp-buffer-with-shell' with CONTENTS and BODY."
+  `(python-tests-with-shell-interpreter
+    ,pred
+    (python-tests-with-temp-buffer-with-shell ,contents ,@body)))
+
+(defun python-tests-get-shell-interpreter (&optional pred)
   "Get the shell interpreter.
-If env string EMACS_PYTHON_INTERPRETER exists, use it as preferred one."
-  (if python-tests-shell-interpreter
-      python-tests-shell-interpreter
-    (setq python-tests-shell-interpreter
-          (or (when-let ((interpreter (getenv "EMACS_PYTHON_INTERPRETER")))
-                (or (executable-find interpreter)
-                    (error "Couldn't find EMACS_PYTHON_INTERPRETER(%s) in path"
-                           interpreter)))
-              ;; Use the same order as for the default value of
-              ;; `python-shell-interpreter'.
-              (cl-some #'executable-find '("python3" "python" "python2"))))))
+If an optional PRED is specified, an interpreter is selected that
+matches the predicate.  PRED must return the absolute file name if the
+condition is met.  If env string EMACS_PYTHON_INTERPRETER exists, use it
+as preferred one."
+  (unless python-tests-shell-interpreters
+    (setq python-tests-shell-interpreters
+          (if-let ((interpreter (getenv "EMACS_PYTHON_INTERPRETER")))
+              (if-let ((info (python-tests--get-interpreter-info interpreter)))
+                  (list info)
+                (error "Couldn't find EMACS_PYTHON_INTERPRETER(%s) in path"
+                       interpreter))
+            ;; Use the same order as for the default value of
+            ;; `python-shell-interpreter'.
+            (delq nil (mapcar #'python-tests--get-interpreter-info
+                              '("python3" "python" "python2"))))))
+  (cl-some (or pred #'car) python-tests-shell-interpreters))
+
+(defun python-tests--get-interpreter-info (name)
+  "Get Python interpreter information specified by NAME.
+The information returned is a cons cell consisting of the file path and
+the version string."
+  (when-let ((interpreter (executable-find name)))
+    (with-temp-buffer
+      (and (equal (call-process interpreter nil t nil "--version") 0)
+           (goto-char (point-min))
+           (looking-at
+            (rx (seq "Python" (+ space) (group (+ (any digit ?.))))))
+           (cons interpreter (match-string-no-properties 1))))))
+
+(defun python-tests-interpreter-3-p (info)
+  "Return the absolute file name if the interpreter major version in INFO is 3.
+This function is intended to be used as the PRED argument of
+`python-tests-get-shell-interpreter'."
+  (when (string= (car (split-string (cdr info) "\\.")) "3")
+    (car info)))
 
 (ert-deftest python-shell-get-process-name-1 ()
   "Check process name calculation sans `buffer-file-name'."
@@ -4026,48 +4071,46 @@ python-shell-with-environment-3
 
 (ert-deftest python-shell-make-comint-1 ()
   "Check comint creation for global shell buffer."
-  (skip-unless (python-tests-get-shell-interpreter))
   ;; The interpreter can get killed too quickly to allow it to clean
   ;; up the tempfiles that the default python-shell-setup-codes create,
   ;; so it leaves tempfiles behind, which is a minor irritation.
-  (let* ((python-shell-setup-codes nil)
-         (python-shell-interpreter
-          (python-tests-get-shell-interpreter))
-         (proc-name (python-shell-get-process-name nil))
-         (shell-buffer
-          (python-tests-with-temp-buffer
-           "" (python-shell-make-comint
-               (python-shell-calculate-command) proc-name)))
-         (process (get-buffer-process shell-buffer)))
-    (unwind-protect
-        (progn
-          (set-process-query-on-exit-flag process nil)
-          (should (process-live-p process))
-          (with-current-buffer shell-buffer
-            (should (eq major-mode 'inferior-python-mode))
-            (should (string= (buffer-name) (format "*%s*" proc-name)))))
-      (kill-buffer shell-buffer))))
+  (python-tests-with-shell-interpreter
+   nil
+   (let* ((python-shell-setup-codes nil)
+          (proc-name (python-shell-get-process-name nil))
+          (shell-buffer
+           (python-tests-with-temp-buffer
+            "" (python-shell-make-comint
+                (python-shell-calculate-command) proc-name)))
+          (process (get-buffer-process shell-buffer)))
+     (unwind-protect
+         (progn
+           (set-process-query-on-exit-flag process nil)
+           (should (process-live-p process))
+           (with-current-buffer shell-buffer
+             (should (eq major-mode 'inferior-python-mode))
+             (should (string= (buffer-name) (format "*%s*" proc-name)))))
+       (kill-buffer shell-buffer)))))
 
 (ert-deftest python-shell-make-comint-2 ()
   "Check comint creation for internal shell buffer."
-  (skip-unless (python-tests-get-shell-interpreter))
-  (let* ((python-shell-setup-codes nil)
-         (python-shell-interpreter
-          (python-tests-get-shell-interpreter))
-         (proc-name (python-shell-internal-get-process-name))
-         (shell-buffer
-          (python-tests-with-temp-buffer
-           "" (python-shell-make-comint
-               (python-shell-calculate-command) proc-name nil t)))
-         (process (get-buffer-process shell-buffer)))
-    (unwind-protect
-        (progn
-          (set-process-query-on-exit-flag process nil)
-          (should (process-live-p process))
-          (with-current-buffer shell-buffer
-            (should (eq major-mode 'inferior-python-mode))
-            (should (string= (buffer-name) (format " *%s*" proc-name)))))
-      (kill-buffer shell-buffer))))
+  (python-tests-with-shell-interpreter
+   nil
+   (let* ((python-shell-setup-codes nil)
+          (proc-name (python-shell-internal-get-process-name))
+          (shell-buffer
+           (python-tests-with-temp-buffer
+            "" (python-shell-make-comint
+                (python-shell-calculate-command) proc-name nil t)))
+          (process (get-buffer-process shell-buffer)))
+     (unwind-protect
+         (progn
+           (set-process-query-on-exit-flag process nil)
+           (should (process-live-p process))
+           (with-current-buffer shell-buffer
+             (should (eq major-mode 'inferior-python-mode))
+             (should (string= (buffer-name) (format " *%s*" proc-name)))))
+       (kill-buffer shell-buffer)))))
 
 (ert-deftest python-shell-make-comint-3 ()
   "Check comint creation with overridden python interpreter and args.
@@ -4099,58 +4142,56 @@ python-shell-make-comint-3
 
 (ert-deftest python-shell-make-comint-4 ()
   "Check shell calculated prompts regexps are set."
-  (skip-unless (python-tests-get-shell-interpreter))
-  (let* ((process-environment process-environment)
-         (python-shell-setup-codes nil)
-         (python-shell-interpreter
-          (python-tests-get-shell-interpreter))
-         (python-shell-interpreter-args "-i")
-         (python-shell--prompt-calculated-input-regexp nil)
-         (python-shell--prompt-calculated-output-regexp nil)
-         (python-shell-prompt-detect-enabled t)
-         (python-shell-prompt-input-regexps '("extralargeinputprompt" "sml"))
-         (python-shell-prompt-output-regexps '("extralargeoutputprompt" "sml"))
-         (python-shell-prompt-regexp "in")
-         (python-shell-prompt-block-regexp "block")
-         (python-shell-prompt-pdb-regexp "pdf")
-         (python-shell-prompt-output-regexp "output")
-         (startup-code (concat "import sys\n"
-                               "sys.ps1 = 'py> '\n"
-                               "sys.ps2 = '..> '\n"
-                               "sys.ps3 = 'out '\n"))
-         (startup-file (python-shell--save-temp-file startup-code))
-         (proc-name (python-shell-get-process-name nil))
-         (shell-buffer
-          (progn
-            (setenv "PYTHONSTARTUP" startup-file)
-            (python-tests-with-temp-buffer
-             "" (python-shell-make-comint
-                 (python-shell-calculate-command) proc-name nil))))
-         (process (get-buffer-process shell-buffer)))
-    (unwind-protect
-        (progn
-          (set-process-query-on-exit-flag process nil)
-          (should (process-live-p process))
-          (with-current-buffer shell-buffer
-            (should (eq major-mode 'inferior-python-mode))
-            (should (string=
-                     python-shell--prompt-calculated-input-regexp
-                     (concat "^\\(extralargeinputprompt\\|\\.\\.> \\|"
-                             "block\\|py> \\|pdf\\|sml\\|in\\)")))
-            (should (string=
-                     python-shell--prompt-calculated-output-regexp
-                     "^\\(extralargeoutputprompt\\|output\\|out \\|sml\\)"))))
-      (delete-file startup-file)
-      (kill-buffer shell-buffer))))
+  (python-tests-with-shell-interpreter
+   nil
+   (let* ((process-environment process-environment)
+          (python-shell-setup-codes nil)
+          (python-shell-interpreter-args "-i")
+          (python-shell--prompt-calculated-input-regexp nil)
+          (python-shell--prompt-calculated-output-regexp nil)
+          (python-shell-prompt-detect-enabled t)
+          (python-shell-prompt-input-regexps '("extralargeinputprompt" "sml"))
+          (python-shell-prompt-output-regexps '("extralargeoutputprompt" "sml"))
+          (python-shell-prompt-regexp "in")
+          (python-shell-prompt-block-regexp "block")
+          (python-shell-prompt-pdb-regexp "pdf")
+          (python-shell-prompt-output-regexp "output")
+          (startup-code (concat "import sys\n"
+                                "sys.ps1 = 'py> '\n"
+                                "sys.ps2 = '..> '\n"
+                                "sys.ps3 = 'out '\n"))
+          (startup-file (python-shell--save-temp-file startup-code))
+          (proc-name (python-shell-get-process-name nil))
+          (shell-buffer
+           (progn
+             (setenv "PYTHONSTARTUP" startup-file)
+             (python-tests-with-temp-buffer
+              "" (python-shell-make-comint
+                  (python-shell-calculate-command) proc-name nil))))
+          (process (get-buffer-process shell-buffer)))
+     (unwind-protect
+         (progn
+           (set-process-query-on-exit-flag process nil)
+           (should (process-live-p process))
+           (with-current-buffer shell-buffer
+             (should (eq major-mode 'inferior-python-mode))
+             (should (string=
+                      python-shell--prompt-calculated-input-regexp
+                      (concat "^\\(extralargeinputprompt\\|\\.\\.> \\|"
+                              "block\\|py> \\|pdf\\|sml\\|in\\)")))
+             (should (string=
+                      python-shell--prompt-calculated-output-regexp
+                      "^\\(extralargeoutputprompt\\|output\\|out \\|sml\\)"))))
+       (delete-file startup-file)
+       (kill-buffer shell-buffer)))))
 
 (ert-deftest python-shell-get-process-1 ()
   "Check dedicated shell process preference over global."
-  (skip-unless (python-tests-get-shell-interpreter))
-  (python-tests-with-temp-file
-      ""
+  (python-tests-with-shell-interpreter
+   nil
+   (python-tests-with-temp-file
+    ""
     (let* ((python-shell-setup-codes nil)
-           (python-shell-interpreter
-            (python-tests-get-shell-interpreter))
            (global-proc-name (python-shell-get-process-name nil))
            (dedicated-proc-name (python-shell-get-process-name t))
            (global-shell-buffer
@@ -4174,131 +4215,134 @@ python-shell-get-process-1
             ;; No buffer available.
             (should (not (python-shell-get-process))))
         (ignore-errors (kill-buffer global-shell-buffer))
-        (ignore-errors (kill-buffer dedicated-shell-buffer))))))
+        (ignore-errors (kill-buffer dedicated-shell-buffer)))))))
 
 (ert-deftest python-shell-internal-get-or-create-process-1 ()
   "Check internal shell process creation fallback."
-  (skip-unless (python-tests-get-shell-interpreter))
-  (python-tests-with-temp-file
-   ""
-   (should (not (process-live-p (python-shell-internal-get-process-name))))
-   (let* ((python-shell-interpreter
-           (python-tests-get-shell-interpreter))
-          (internal-process-name (python-shell-internal-get-process-name))
-          (internal-process (python-shell-internal-get-or-create-process))
-          (internal-shell-buffer (process-buffer internal-process)))
-     (unwind-protect
-         (progn
-           (set-process-query-on-exit-flag internal-process nil)
-           (should (equal (process-name internal-process)
-                          internal-process-name))
-           (should (equal internal-process
-                          (python-shell-internal-get-or-create-process)))
-           ;; Assert the internal process is not a user process
-           (should (not (python-shell-get-process)))
-           (kill-buffer internal-shell-buffer))
-       (ignore-errors (kill-buffer internal-shell-buffer))))))
+  (python-tests-with-shell-interpreter
+   nil
+   (python-tests-with-temp-file
+    ""
+    (should (not (process-live-p (python-shell-internal-get-process-name))))
+    (let* ((internal-process-name (python-shell-internal-get-process-name))
+           (internal-process (python-shell-internal-get-or-create-process))
+           (internal-shell-buffer (process-buffer internal-process)))
+      (unwind-protect
+          (progn
+            (set-process-query-on-exit-flag internal-process nil)
+            (should (equal (process-name internal-process)
+                           internal-process-name))
+            (should (equal internal-process
+                           (python-shell-internal-get-or-create-process)))
+            ;; Assert the internal process is not a user process
+            (should (not (python-shell-get-process)))
+            (kill-buffer internal-shell-buffer))
+        (ignore-errors (kill-buffer internal-shell-buffer)))))))
 
 (ert-deftest python-shell-prompt-detect-1 ()
   "Check prompt autodetection."
-  (skip-unless (python-tests-get-shell-interpreter))
-  (let ((process-environment process-environment)
-        (python-shell-interpreter (python-tests-get-shell-interpreter)))
-    ;; Ensure no startup file is enabled
-    (setenv "PYTHONSTARTUP" "")
-    (should python-shell-prompt-detect-enabled)
-    (should (equal (python-shell-prompt-detect) '(">>> " "... " "")))))
+  (python-tests-with-shell-interpreter
+   nil
+   (let ((process-environment process-environment))
+     ;; Ensure no startup file is enabled
+     (setenv "PYTHONSTARTUP" "")
+     (should python-shell-prompt-detect-enabled)
+     (should (equal (python-shell-prompt-detect) '(">>> " "... " ""))))))
 
 (ert-deftest python-shell-prompt-detect-2 ()
   "Check prompt autodetection with startup file.  Bug#17370."
-  (skip-unless (python-tests-get-shell-interpreter))
-  (let* ((process-environment process-environment)
-         (python-shell-interpreter (python-tests-get-shell-interpreter))
-         (startup-code (concat "import sys\n"
-                               "sys.ps1 = 'py> '\n"
-                               "sys.ps2 = '..> '\n"
-                               "sys.ps3 = 'out '\n"))
-         (startup-file (python-shell--save-temp-file startup-code)))
-    (unwind-protect
-        (progn
-          ;; Ensure startup file is enabled
-          (setenv "PYTHONSTARTUP" startup-file)
-          (should python-shell-prompt-detect-enabled)
-          (should (equal (python-shell-prompt-detect) '("py> " "..> " "out "))))
-      (ignore-errors (delete-file startup-file)))))
+  (python-tests-with-shell-interpreter
+   nil
+   (let* ((process-environment process-environment)
+          (startup-code (concat "import sys\n"
+                                "sys.ps1 = 'py> '\n"
+                                "sys.ps2 = '..> '\n"
+                                "sys.ps3 = 'out '\n"))
+          (startup-file (python-shell--save-temp-file startup-code)))
+     (unwind-protect
+         (progn
+           ;; Ensure startup file is enabled
+           (setenv "PYTHONSTARTUP" startup-file)
+           (should python-shell-prompt-detect-enabled)
+           (should (equal (python-shell-prompt-detect) '("py> " "..> " "out "))))
+       (ignore-errors (delete-file startup-file))))))
 
 (ert-deftest python-shell-prompt-detect-3 ()
   "Check prompts are not autodetected when feature is disabled."
-  (skip-unless (python-tests-get-shell-interpreter))
-  (let ((process-environment process-environment)
-        (python-shell-prompt-detect-enabled nil))
-    ;; Ensure no startup file is enabled
-    (should (not python-shell-prompt-detect-enabled))
-    (should (not (python-shell-prompt-detect)))))
+  (python-tests-with-shell-interpreter
+   nil
+   (let ((process-environment process-environment)
+         (python-shell-prompt-detect-enabled nil))
+     ;; Ensure no startup file is enabled
+     (should (not python-shell-prompt-detect-enabled))
+     (should (not (python-shell-prompt-detect))))))
 
 (ert-deftest python-shell-prompt-detect-4 ()
   "Check warning is shown when detection fails."
-  (skip-unless (python-tests-get-shell-interpreter))
-  (let* ((process-environment process-environment)
-         ;; Trigger failure by removing prompts in the startup file
-         (startup-code (concat "import sys\n"
-                               "sys.ps1 = ''\n"
-                               "sys.ps2 = ''\n"
-                               "sys.ps3 = ''\n"))
-         (startup-file (python-shell--save-temp-file startup-code)))
-    (unwind-protect
-        (progn
-          (kill-buffer (get-buffer-create "*Warnings*"))
-          (should (not (get-buffer "*Warnings*")))
-          (setenv "PYTHONSTARTUP" startup-file)
-          (should python-shell-prompt-detect-failure-warning)
-          (should python-shell-prompt-detect-enabled)
-          (should (not (python-shell-prompt-detect)))
-          (should (get-buffer "*Warnings*")))
-      (ignore-errors (delete-file startup-file)))))
+  (python-tests-with-shell-interpreter
+   nil
+   (let* ((process-environment process-environment)
+          ;; Trigger failure by removing prompts in the startup file
+          (startup-code (concat "import sys\n"
+                                "sys.ps1 = ''\n"
+                                "sys.ps2 = ''\n"
+                                "sys.ps3 = ''\n"))
+          (startup-file (python-shell--save-temp-file startup-code)))
+     (unwind-protect
+         (progn
+           (kill-buffer (get-buffer-create "*Warnings*"))
+           (should (not (get-buffer "*Warnings*")))
+           (setenv "PYTHONSTARTUP" startup-file)
+           (should python-shell-prompt-detect-failure-warning)
+           (should python-shell-prompt-detect-enabled)
+           (should (not (python-shell-prompt-detect)))
+           (should (get-buffer "*Warnings*")))
+       (ignore-errors (delete-file startup-file))))))
 
 (ert-deftest python-shell-prompt-detect-5 ()
   "Check disabled warnings are not shown when detection fails."
-  (skip-unless (python-tests-get-shell-interpreter))
-  (let* ((process-environment process-environment)
-         (startup-code (concat "import sys\n"
-                               "sys.ps1 = ''\n"
-                               "sys.ps2 = ''\n"
-                               "sys.ps3 = ''\n"))
-         (startup-file (python-shell--save-temp-file startup-code))
-         (python-shell-prompt-detect-failure-warning nil))
-    (unwind-protect
-        (progn
-          (kill-buffer (get-buffer-create "*Warnings*"))
-          (should (not (get-buffer "*Warnings*")))
-          (setenv "PYTHONSTARTUP" startup-file)
-          (should (not python-shell-prompt-detect-failure-warning))
-          (should python-shell-prompt-detect-enabled)
-          (should (not (python-shell-prompt-detect)))
-          (should (not (get-buffer "*Warnings*"))))
-      (ignore-errors (delete-file startup-file)))))
+  (python-tests-with-shell-interpreter
+   nil
+   (let* ((process-environment process-environment)
+          (startup-code (concat "import sys\n"
+                                "sys.ps1 = ''\n"
+                                "sys.ps2 = ''\n"
+                                "sys.ps3 = ''\n"))
+          (startup-file (python-shell--save-temp-file startup-code))
+          (python-shell-prompt-detect-failure-warning nil))
+     (unwind-protect
+         (progn
+           (kill-buffer (get-buffer-create "*Warnings*"))
+           (should (not (get-buffer "*Warnings*")))
+           (setenv "PYTHONSTARTUP" startup-file)
+           (should (not python-shell-prompt-detect-failure-warning))
+           (should python-shell-prompt-detect-enabled)
+           (should (not (python-shell-prompt-detect)))
+           (should (not (get-buffer "*Warnings*"))))
+       (ignore-errors (delete-file startup-file))))))
 
 (ert-deftest python-shell-prompt-detect-6 ()
   "Warnings are not shown when detection is disabled."
-  (skip-unless (python-tests-get-shell-interpreter))
-  (let* ((process-environment process-environment)
-         (startup-code (concat "import sys\n"
-                               "sys.ps1 = ''\n"
-                               "sys.ps2 = ''\n"
-                               "sys.ps3 = ''\n"))
-         (startup-file (python-shell--save-temp-file startup-code))
-         (python-shell-prompt-detect-failure-warning t)
-         (python-shell-prompt-detect-enabled nil))
-    (unwind-protect
-        (progn
-          (kill-buffer (get-buffer-create "*Warnings*"))
-          (should (not (get-buffer "*Warnings*")))
-          (setenv "PYTHONSTARTUP" startup-file)
-          (should python-shell-prompt-detect-failure-warning)
-          (should (not python-shell-prompt-detect-enabled))
-          (should (not (python-shell-prompt-detect)))
-          (should (not (get-buffer "*Warnings*"))))
-      (ignore-errors (delete-file startup-file)))))
+  (python-tests-with-shell-interpreter
+   nil
+   (let* ((process-environment process-environment)
+          (startup-code (concat "import sys\n"
+                                "sys.ps1 = ''\n"
+                                "sys.ps2 = ''\n"
+                                "sys.ps3 = ''\n"))
+          (startup-file (python-shell--save-temp-file startup-code))
+          (python-shell-prompt-detect-failure-warning t)
+          (python-shell-prompt-detect-enabled nil))
+     (unwind-protect
+         (progn
+           (kill-buffer (get-buffer-create "*Warnings*"))
+           (should (not (get-buffer "*Warnings*")))
+           (setenv "PYTHONSTARTUP" startup-file)
+           (should python-shell-prompt-detect-failure-warning)
+           (should (not python-shell-prompt-detect-enabled))
+           (should (not (python-shell-prompt-detect)))
+           (should (not (get-buffer "*Warnings*"))))
+       (ignore-errors (delete-file startup-file))))))
 
 (ert-deftest python-shell-prompt-validate-regexps-1 ()
   "Check `python-shell-prompt-input-regexps' are validated."
@@ -4444,32 +4488,32 @@ python-shell-prompt-set-calculated-regexps-5
 
 (ert-deftest python-shell-prompt-set-calculated-regexps-6 ()
   "Check detected prompts are included `regexp-quote'd."
-  (skip-unless (python-tests-get-shell-interpreter))
-  (let* ((python-shell-prompt-input-regexps '(""))
-         (python-shell-prompt-output-regexps '(""))
-         (python-shell-prompt-regexp "")
-         (python-shell-prompt-block-regexp "")
-         (python-shell-prompt-pdb-regexp "")
-         (python-shell-prompt-output-regexp "")
-         (python-shell--prompt-calculated-input-regexp nil)
-         (python-shell--prompt-calculated-output-regexp nil)
-         (python-shell-prompt-detect-enabled t)
-         (python-shell-interpreter (python-tests-get-shell-interpreter))
-         (process-environment process-environment)
-         (startup-code (concat "import sys\n"
-                               "sys.ps1 = 'p.> '\n"
-                               "sys.ps2 = '..> '\n"
-                               "sys.ps3 = 'o.t '\n"))
-         (startup-file (python-shell--save-temp-file startup-code)))
-    (unwind-protect
-        (progn
-          (setenv "PYTHONSTARTUP" startup-file)
-          (python-shell-prompt-set-calculated-regexps)
-          (should (string= python-shell--prompt-calculated-input-regexp
-                           "^\\(\\.\\.> \\|p\\.> \\|\\)"))
-          (should (string= python-shell--prompt-calculated-output-regexp
-                           "^\\(o\\.t \\|\\)")))
-      (ignore-errors (delete-file startup-file)))))
+  (python-tests-with-shell-interpreter
+   nil
+   (let* ((python-shell-prompt-input-regexps '(""))
+          (python-shell-prompt-output-regexps '(""))
+          (python-shell-prompt-regexp "")
+          (python-shell-prompt-block-regexp "")
+          (python-shell-prompt-pdb-regexp "")
+          (python-shell-prompt-output-regexp "")
+          (python-shell--prompt-calculated-input-regexp nil)
+          (python-shell--prompt-calculated-output-regexp nil)
+          (python-shell-prompt-detect-enabled t)
+          (process-environment process-environment)
+          (startup-code (concat "import sys\n"
+                                "sys.ps1 = 'p.> '\n"
+                                "sys.ps2 = '..> '\n"
+                                "sys.ps3 = 'o.t '\n"))
+          (startup-file (python-shell--save-temp-file startup-code)))
+     (unwind-protect
+         (progn
+           (setenv "PYTHONSTARTUP" startup-file)
+           (python-shell-prompt-set-calculated-regexps)
+           (should (string= python-shell--prompt-calculated-input-regexp
+                            "^\\(\\.\\.> \\|p\\.> \\|\\)"))
+           (should (string= python-shell--prompt-calculated-output-regexp
+                            "^\\(o\\.t \\|\\)")))
+       (ignore-errors (delete-file startup-file))))))
 
 (ert-deftest python-shell-buffer-substring-1 ()
   "Selecting a substring of the whole buffer must match its contents."
@@ -4828,8 +4872,8 @@ python-shell-completion-native-interpreter-disabled-p-1
     (should (python-shell-completion-native-interpreter-disabled-p))))
 
 (ert-deftest python-shell-completion-at-point-1 ()
-  (skip-unless (python-tests-get-shell-interpreter))
-  (python-tests-with-temp-buffer-with-shell
+  (python-tests-with-temp-buffer-with-shell-interpreter
+   (when (eq system-type 'darwin) #'python-tests-interpreter-3-p)
    ""
    (python-shell-with-shell-buffer
      (skip-unless python-shell-readline-completer-delims)
@@ -4842,8 +4886,8 @@ python-shell-completion-at-point-1
      (should-not (nth 2 (python-shell-completion-at-point))))))
 
 (ert-deftest python-shell-completion-at-point-native-1 ()
-  (skip-unless (python-tests-get-shell-interpreter))
-  (python-tests-with-temp-buffer-with-shell
+  (python-tests-with-temp-buffer-with-shell-interpreter
+   nil
    ""
    (python-shell-completion-native-turn-on)
    (python-shell-with-shell-buffer
@@ -4928,25 +4972,25 @@ python-tests--pythonstartup-file
 
 (ert-deftest python-shell-completion-at-point-jedi-completer ()
   "Check if Python shell completion works when Jedi completer is used."
-  (skip-unless (python-tests-get-shell-interpreter))
-  (with-environment-variables
-      (("PYTHONSTARTUP" (python-tests--pythonstartup-file)))
-    (python-tests-with-temp-buffer-with-shell
-     ""
-     (python-shell-with-shell-buffer
-       (skip-unless (string= python-shell-readline-completer-delims ""))
-       (python-shell-completion-native-turn-off)
-       (python-tests--completion-module)
-       (python-tests--completion-parameters)
-       (python-shell-completion-native-turn-on)
-       (python-tests--completion-module)
-       (python-tests--completion-parameters)
-       (python-tests--completion-extra-context)))))
+  (python-tests-with-shell-interpreter
+   nil
+   (with-environment-variables
+       (("PYTHONSTARTUP" (python-tests--pythonstartup-file)))
+     (python-tests-with-temp-buffer-with-shell
+      ""
+      (python-shell-with-shell-buffer
+        (skip-unless (string= python-shell-readline-completer-delims ""))
+        (python-shell-completion-native-turn-off)
+        (python-tests--completion-module)
+        (python-tests--completion-parameters)
+        (python-shell-completion-native-turn-on)
+        (python-tests--completion-module)
+        (python-tests--completion-parameters)
+        (python-tests--completion-extra-context))))))
 
 (ert-deftest python-shell-completion-at-point-ipython ()
   "Check if Python shell completion works for IPython."
-  (let ((python-tests-shell-interpreter "ipython")
-        (python-shell-interpreter "ipython")
+  (let ((python-shell-interpreter "ipython")
         (python-shell-interpreter-args "-i --simple-prompt"))
     (skip-unless
      (and
@@ -4973,8 +5017,8 @@ python-shell-completion-at-point-ipython
 ;;; Symbol completion
 
 (ert-deftest python-completion-at-point-1 ()
-  (skip-unless (python-tests-get-shell-interpreter))
-  (python-tests-with-temp-buffer-with-shell
+  (python-tests-with-temp-buffer-with-shell-interpreter
+   (when (eq system-type 'darwin) #'python-tests-interpreter-3-p)
    "
 import abc
 "
@@ -4991,8 +5035,8 @@ python-completion-at-point-1
 
 (ert-deftest python-completion-at-point-2 ()
   "Should work regardless of the point in the Shell buffer."
-  (skip-unless (python-tests-get-shell-interpreter))
-  (python-tests-with-temp-buffer-with-shell
+  (python-tests-with-temp-buffer-with-shell-interpreter
+   (when (eq system-type 'darwin) #'python-tests-interpreter-3-p)
    "
 import abc
 "
@@ -5009,8 +5053,8 @@ python-completion-at-point-2
 
 (ert-deftest python-completion-at-point-pdb-1 ()
   "Should not complete PDB commands in Python buffer."
-  (skip-unless (python-tests-get-shell-interpreter))
-  (python-tests-with-temp-buffer-with-shell
+  (python-tests-with-temp-buffer-with-shell-interpreter
+   nil
    "
 import pdb
 
@@ -5028,8 +5072,8 @@ python-completion-at-point-pdb-1
 
 (ert-deftest python-completion-at-point-while-running-1 ()
   "Should not try to complete when a program is running in the Shell buffer."
-  (skip-unless (python-tests-get-shell-interpreter))
-  (python-tests-with-temp-buffer-with-shell
+  (python-tests-with-temp-buffer-with-shell-interpreter
+   nil
    "
 import time
 
@@ -5044,8 +5088,8 @@ python-completion-at-point-while-running-1
      (should-not (with-timeout (1 t) (completion-at-point))))))
 
 (ert-deftest python-completion-at-point-native-1 ()
-  (skip-unless (python-tests-get-shell-interpreter))
-  (python-tests-with-temp-buffer-with-shell
+  (python-tests-with-temp-buffer-with-shell-interpreter
+   (when (eq system-type 'darwin) #'python-tests-interpreter-3-p)
    "
 import abc
 "
@@ -5063,8 +5107,8 @@ python-completion-at-point-native-1
 
 (ert-deftest python-completion-at-point-native-2 ()
   "Should work regardless of the point in the Shell buffer."
-  (skip-unless (python-tests-get-shell-interpreter))
-  (python-tests-with-temp-buffer-with-shell
+  (python-tests-with-temp-buffer-with-shell-interpreter
+   (when (eq system-type 'darwin) #'python-tests-interpreter-3-p)
    "
 import abc
 "
@@ -5081,8 +5125,8 @@ python-completion-at-point-native-2
      (should (completion-at-point)))))
 
 (ert-deftest python-completion-at-point-native-with-ffap-1 ()
-  (skip-unless (python-tests-get-shell-interpreter))
-  (python-tests-with-temp-buffer-with-shell
+  (python-tests-with-temp-buffer-with-shell-interpreter
+   (when (eq system-type 'darwin) #'python-tests-interpreter-3-p)
    "
 import abc
 "
@@ -5099,8 +5143,8 @@ python-completion-at-point-native-with-ffap-1
      (should (completion-at-point)))))
 
 (ert-deftest python-completion-at-point-native-with-eldoc-1 ()
-  (skip-unless (python-tests-get-shell-interpreter))
-  (python-tests-with-temp-buffer-with-shell
+  (python-tests-with-temp-buffer-with-shell-interpreter
+   (when (eq system-type 'darwin) #'python-tests-interpreter-3-p)
    "
 import abc
 "
@@ -5126,8 +5170,8 @@ python-completion-at-point-native-with-eldoc-1
 ;;; FFAP
 
 (ert-deftest python-ffap-module-path-1 ()
-  (skip-unless (python-tests-get-shell-interpreter))
-  (python-tests-with-temp-buffer-with-shell
+  (python-tests-with-temp-buffer-with-shell-interpreter
+   nil
    "
 import abc
 "
@@ -5138,8 +5182,8 @@ python-ffap-module-path-1
 
 (ert-deftest python-ffap-module-path-while-running-1 ()
   "Should not get module path when a program is running in the Shell buffer."
-  (skip-unless (python-tests-get-shell-interpreter))
-  (python-tests-with-temp-buffer-with-shell
+  (python-tests-with-temp-buffer-with-shell-interpreter
+   nil
    "
 import abc
 import time
@@ -5214,8 +5258,8 @@ python-eldoc--get-symbol-at-point-4
                     "some_symbol"))))
 
 (ert-deftest python-eldoc--get-doc-at-point-1 ()
-  (skip-unless (python-tests-get-shell-interpreter))
-  (python-tests-with-temp-buffer-with-shell
+  (python-tests-with-temp-buffer-with-shell-interpreter
+   nil
    "
 import time
 "
@@ -5227,8 +5271,8 @@ python-eldoc--get-doc-at-point-1
 
 (ert-deftest python-eldoc--get-doc-at-point-while-running-1 ()
   "Should not get documentation when a program is running in the Shell buffer."
-  (skip-unless (python-tests-get-shell-interpreter))
-  (python-tests-with-temp-buffer-with-shell
+  (python-tests-with-temp-buffer-with-shell-interpreter
+   nil
    "
 import time
 
@@ -7445,18 +7489,18 @@ python-tests--python-nav-end-of-statement--infloop
 ;; interpreter.
 (ert-deftest python-tests--run-python-selects-window ()
   "Test for bug#31398.  See also bug#44421 and bug#52380."
-  (skip-unless (python-tests-get-shell-interpreter))
-  (let* ((python-shell-interpreter (python-tests-get-shell-interpreter))
-         (buffer (process-buffer (run-python nil nil 'show)))
-         (window (get-buffer-window buffer)))
-    ;; We look at `selected-window' rather than `current-buffer'
-    ;; because as `(elisp)Current buffer' says, the latter will only
-    ;; be synchronized with the former when returning to the "command
-    ;; loop"; until then, `current-buffer' can change arbitrarily.
-    (should (eq window (selected-window)))
-    (pop-to-buffer (other-buffer))
-    (run-python nil nil 'show)
-    (should (eq window (selected-window)))))
+  (python-tests-with-shell-interpreter
+   nil
+   (let* ((buffer (process-buffer (run-python nil nil 'show)))
+          (window (get-buffer-window buffer)))
+     ;; We look at `selected-window' rather than `current-buffer'
+     ;; because as `(elisp)Current buffer' says, the latter will only
+     ;; be synchronized with the former when returning to the "command
+     ;; loop"; until then, `current-buffer' can change arbitrarily.
+     (should (eq window (selected-window)))
+     (pop-to-buffer (other-buffer))
+     (run-python nil nil 'show)
+     (should (eq window (selected-window))))))
 
 (ert-deftest python-tests--fill-long-first-line ()
   (should
@@ -7517,31 +7561,31 @@ python-tests--flymake-command-output-pattern
                        "W0611: Unused import a.b.c (unused-import)"))))))
 
 (ert-deftest python-test--shell-send-block ()
-  (skip-unless (python-tests-get-shell-interpreter))
-  (python-tests-with-temp-buffer-with-shell
-    "print('current 0')
+  (python-tests-with-temp-buffer-with-shell-interpreter
+   nil
+   "print('current 0')
 for x in range(1,3):
     print('current %s' % x)
 print('current 3')"
-    (goto-char (point-min))
-    (should-error (python-shell-send-block) :type 'user-error)
-    (forward-line)
-    (python-shell-send-block t) ;; send block with header
-    (python-tests-shell-wait-for-prompt)
-    (python-shell-with-shell-buffer
-      (goto-char (point-min))
-      (should-not (re-search-forward "current 0" nil t))
-      (should (re-search-forward "current 1" nil t))
-      (should (re-search-forward "current 2" nil t))
-      (should-not (re-search-forward "current 3" nil t)))
-    (forward-line)
-    (python-shell-send-block) ;; send block body only
-    (python-tests-shell-wait-for-prompt)
-    (python-shell-with-shell-buffer
-      ;; should only 1 line output from the block body
-      (should (re-search-forward "current"))
-      (should (looking-at " 2"))
-      (should-not (re-search-forward "current" nil t)))))
+   (goto-char (point-min))
+   (should-error (python-shell-send-block) :type 'user-error)
+   (forward-line)
+   (python-shell-send-block t) ;; send block with header
+   (python-tests-shell-wait-for-prompt)
+   (python-shell-with-shell-buffer
+     (goto-char (point-min))
+     (should-not (re-search-forward "current 0" nil t))
+     (should (re-search-forward "current 1" nil t))
+     (should (re-search-forward "current 2" nil t))
+     (should-not (re-search-forward "current 3" nil t)))
+   (forward-line)
+   (python-shell-send-block) ;; send block body only
+   (python-tests-shell-wait-for-prompt)
+   (python-shell-with-shell-buffer
+     ;; should only 1 line output from the block body
+     (should (re-search-forward "current"))
+     (should (looking-at " 2"))
+     (should-not (re-search-forward "current" nil t)))))
 
 ;;; python-ts-mode font-lock tests
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-06-04 14:29                                     ` kobarity
@ 2024-06-05 10:25                                       ` Mattias Engdegård
  2024-06-05 11:52                                         ` kobarity
  0 siblings, 1 reply; 49+ messages in thread
From: Mattias Engdegård @ 2024-06-05 10:25 UTC (permalink / raw)
  To: kobarity; +Cc: Eli Zaretskii, Lin Sun, Stefan Kangas, 70815

4 juni 2024 kl. 16.29 skrev kobarity <kobarity@gmail.com>:

> The attached is the revised patch.  In order to bind
> `python-shell-interpreter' consistently, new macros
> `python-tests-with-shell-interpreter' and
> `python-tests-with-temp-buffer-with-shell-interpreter' were
> introduced.  The patch is larger because some of the indentations have
> been changed by using new macros.  I have fixed
> `python-shell-interpreter' was not bound correctly in some ERTs, so
> you might find new ERTs that fail with Python 2 on Mac.

It works here.

> 1. Set EMACS_PYTHON_INTERPRETER environment variable to "python" and
>   run ERTs.  The expectation is that the 7 ERTs that previously
>   resulted in errors will be skipped.

Yes.

> 2. Change the order of the interpreters in
>   `python-tests-get-shell-interpreter' to  "python" "python3"
>   "python2" and run ERTs.  The expectation is that the 7 ERTs that
>   previously failed will succeed.

Yes.

> However, if the interpreter specified by EMACS_PYTHON_INTERPRETER is
> not found, it is likely that EMACS_PYTHON_INTERPRETER is incorrectly
> configured, and I would prefer to let it fail rather than let it be
> skipped.

Yes, which is what happens with your patch, and I agree that this is the best outcome.

Would you like me to push your patch?






^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-06-05 10:25                                       ` Mattias Engdegård
@ 2024-06-05 11:52                                         ` kobarity
  2024-06-08 15:34                                           ` kobarity
  0 siblings, 1 reply; 49+ messages in thread
From: kobarity @ 2024-06-05 11:52 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: Eli Zaretskii, Lin Sun, Stefan Kangas, 70815

Mattias Engdegård wrote:
> 
> 4 juni 2024 kl. 16.29 skrev kobarity <kobarity@gmail.com>:
> 
> > The attached is the revised patch.  In order to bind
> > `python-shell-interpreter' consistently, new macros
> > `python-tests-with-shell-interpreter' and
> > `python-tests-with-temp-buffer-with-shell-interpreter' were
> > introduced.  The patch is larger because some of the indentations have
> > been changed by using new macros.  I have fixed
> > `python-shell-interpreter' was not bound correctly in some ERTs, so
> > you might find new ERTs that fail with Python 2 on Mac.
> 
> It works here.
> 
> > 1. Set EMACS_PYTHON_INTERPRETER environment variable to "python" and
> >   run ERTs.  The expectation is that the 7 ERTs that previously
> >   resulted in errors will be skipped.
> 
> Yes.
> 
> > 2. Change the order of the interpreters in
> >   `python-tests-get-shell-interpreter' to  "python" "python3"
> >   "python2" and run ERTs.  The expectation is that the 7 ERTs that
> >   previously failed will succeed.
> 
> Yes.
> 
> > However, if the interpreter specified by EMACS_PYTHON_INTERPRETER is
> > not found, it is likely that EMACS_PYTHON_INTERPRETER is incorrectly
> > configured, and I would prefer to let it fail rather than let it be
> > skipped.
> 
> Yes, which is what happens with your patch, and I agree that this is the best outcome.

Thanks for the early confirmation.

> Would you like me to push your patch?

Thanks again.  I will wait a few days to see if I can get feedback
from others.





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-06-05 11:52                                         ` kobarity
@ 2024-06-08 15:34                                           ` kobarity
  2024-06-09 13:58                                             ` Mattias Engdegård
  0 siblings, 1 reply; 49+ messages in thread
From: kobarity @ 2024-06-08 15:34 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: Eli Zaretskii, Lin Sun, Stefan Kangas, 70815

kobarity wrote:
> 
> Mattias Engdegård wrote:
> > 
> > 4 juni 2024 kl. 16.29 skrev kobarity <kobarity@gmail.com>:
> > 
> > > The attached is the revised patch.  In order to bind
> > > `python-shell-interpreter' consistently, new macros
> > > `python-tests-with-shell-interpreter' and
> > > `python-tests-with-temp-buffer-with-shell-interpreter' were
> > > introduced.  The patch is larger because some of the indentations have
> > > been changed by using new macros.  I have fixed
> > > `python-shell-interpreter' was not bound correctly in some ERTs, so
> > > you might find new ERTs that fail with Python 2 on Mac.
> > 
> > It works here.
> > 
> > > 1. Set EMACS_PYTHON_INTERPRETER environment variable to "python" and
> > >   run ERTs.  The expectation is that the 7 ERTs that previously
> > >   resulted in errors will be skipped.
> > 
> > Yes.
> > 
> > > 2. Change the order of the interpreters in
> > >   `python-tests-get-shell-interpreter' to  "python" "python3"
> > >   "python2" and run ERTs.  The expectation is that the 7 ERTs that
> > >   previously failed will succeed.
> > 
> > Yes.
> > 
> > > However, if the interpreter specified by EMACS_PYTHON_INTERPRETER is
> > > not found, it is likely that EMACS_PYTHON_INTERPRETER is incorrectly
> > > configured, and I would prefer to let it fail rather than let it be
> > > skipped.
> > 
> > Yes, which is what happens with your patch, and I agree that this is the best outcome.
> 
> Thanks for the early confirmation.
> 
> > Would you like me to push your patch?
> 
> Thanks again.  I will wait a few days to see if I can get feedback
> from others.

Since there doesn't seem to be any other feedback, could you please
apply the patch?





^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-06-08 15:34                                           ` kobarity
@ 2024-06-09 13:58                                             ` Mattias Engdegård
  2024-06-10 14:57                                               ` kobarity
  0 siblings, 1 reply; 49+ messages in thread
From: Mattias Engdegård @ 2024-06-09 13:58 UTC (permalink / raw)
  To: kobarity; +Cc: Eli Zaretskii, Lin Sun, Stefan Kangas, 70815

8 juni 2024 kl. 17.34 skrev kobarity <kobarity@gmail.com>:

> Since there doesn't seem to be any other feedback, could you please
> apply the patch?

Certainly, now pushed to master.






^ permalink raw reply	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-06-09 13:58                                             ` Mattias Engdegård
@ 2024-06-10 14:57                                               ` kobarity
  2024-06-10 15:44                                                 ` Mattias Engdegård
  0 siblings, 1 reply; 49+ messages in thread
From: kobarity @ 2024-06-10 14:57 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: Eli Zaretskii, Lin Sun, Stefan Kangas, 70815

[-- Attachment #1: Type: text/plain, Size: 310 bytes --]

Mattias Engdegård wrote:
> 
> 8 juni 2024 kl. 17.34 skrev kobarity <kobarity@gmail.com>:
> 
> > Since there doesn't seem to be any other feedback, could you please
> > apply the patch?
> 
> Certainly, now pushed to master.

Thanks.  I overlooked one thing.  Could you also apply the attached
patch?

[-- Attachment #2: 0001-Fix-recent-change-to-python-tests.el.patch --]
[-- Type: application/octet-stream, Size: 1086 bytes --]

From 9d2adecfc08579041618e2327c9941d6c8f4067b Mon Sep 17 00:00:00 2001
From: kobarity <kobarity@gmail.com>
Date: Mon, 10 Jun 2024 23:50:11 +0900
Subject: [PATCH] ; Fix recent change to python-tests.el

* test/lisp/progmodes/python-tests.el
(python-tests--pythonstartup-file): Use already bound
'python-shell-interpreter'.  (Bug#70815)
---
 test/lisp/progmodes/python-tests.el | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/test/lisp/progmodes/python-tests.el b/test/lisp/progmodes/python-tests.el
index ce103921454..31b1c80a571 100644
--- a/test/lisp/progmodes/python-tests.el
+++ b/test/lisp/progmodes/python-tests.el
@@ -4974,7 +4974,7 @@ python-tests--pythonstartup-file
   "Return Jedi readline setup file if PYTHONSTARTUP is not set."
   (or (getenv "PYTHONSTARTUP")
       (with-temp-buffer
-        (if (eql 0 (call-process (python-tests-get-shell-interpreter)
+        (if (eql 0 (call-process python-shell-interpreter
                                  nil t nil "-m" "jedi" "repl"))
             (string-trim (buffer-string))
           ""))))
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
  2024-06-10 14:57                                               ` kobarity
@ 2024-06-10 15:44                                                 ` Mattias Engdegård
  0 siblings, 0 replies; 49+ messages in thread
From: Mattias Engdegård @ 2024-06-10 15:44 UTC (permalink / raw)
  To: kobarity; +Cc: Eli Zaretskii, Lin Sun, Stefan Kangas, 70815

10 juni 2024 kl. 16.57 skrev kobarity <kobarity@gmail.com>:

> Thanks.  I overlooked one thing.  Could you also apply the attached
> patch?

Of course, pushed.







^ permalink raw reply	[flat|nested] 49+ messages in thread

end of thread, other threads:[~2024-06-10 15:44 UTC | newest]

Thread overview: 49+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-05-07  6:53 bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters Lin Sun
2024-05-11  9:05 ` Eli Zaretskii
2024-05-11 13:37   ` kobarity
2024-05-11 14:27     ` Lin Sun
2024-05-12  2:06       ` kobarity
2024-05-18 22:20 ` Stefan Kangas
2024-05-19  5:54   ` Eli Zaretskii
2024-05-20  0:08     ` Lin Sun
2024-05-20 15:52       ` kobarity
2024-05-20 17:51         ` Lin Sun
2024-05-21 14:04           ` kobarity
2024-05-21 15:34             ` Lin Sun
2024-05-22 14:38               ` kobarity
2024-05-23 13:09                 ` Eli Zaretskii
2024-05-26 10:52 ` Mattias Engdegård
2024-05-26 12:05   ` kobarity
2024-05-26 12:21     ` Mattias Engdegård
2024-05-26 12:36       ` kobarity
2024-05-26 13:23         ` Mattias Engdegård
2024-05-26 14:15           ` kobarity
2024-05-26 15:00             ` kobarity
2024-05-26 15:24               ` Mattias Engdegård
2024-05-27 12:33                 ` kobarity
2024-05-27 12:45                   ` Eli Zaretskii
2024-05-28 12:30                   ` Mattias Engdegård
2024-05-28 15:17                     ` kobarity
2024-05-28 16:09                       ` Mattias Engdegård
2024-05-29 14:56                         ` kobarity
2024-05-30 10:09                           ` Mattias Engdegård
2024-06-02 13:20                             ` kobarity
2024-06-03 14:02                               ` Mattias Engdegård
2024-06-03 14:34                                 ` kobarity
2024-06-03 16:24                                   ` kobarity
2024-06-04 14:29                                     ` kobarity
2024-06-05 10:25                                       ` Mattias Engdegård
2024-06-05 11:52                                         ` kobarity
2024-06-08 15:34                                           ` kobarity
2024-06-09 13:58                                             ` Mattias Engdegård
2024-06-10 14:57                                               ` kobarity
2024-06-10 15:44                                                 ` Mattias Engdegård
2024-05-26 15:56             ` Eli Zaretskii
2024-05-26 23:06               ` Stefan Kangas
2024-05-27 11:18                 ` Eli Zaretskii
2024-05-27 12:20                   ` Mattias Engdegård
2024-05-27 12:43                     ` Eli Zaretskii
2024-05-26 15:52           ` Eli Zaretskii
2024-05-27 10:24             ` Mattias Engdegård
2024-05-27 11:19               ` Lin Sun
2024-05-26 15:36   ` Eli Zaretskii

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).