Subject: bug#70815: closed (Re: bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters)

From: [email-masked] (GNU bug Tracking System)
Date: Thu, 23 May 2024 13:10:01 +0000

Your bug report

#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
70815: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=70815
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#70815: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
From: Eli Zaretskii <[email-masked]>
To: kobarity <[email-masked]>
Cc: [email-masked], [email-masked], [email-masked]
Date: Thu, 23 May 2024 16:09:01 +0300
List-Id: <debbugs-submit.debbugs.gnu.org>

> Date: Wed, 22 May 2024 23:38:02 +0900
> From: kobarity <[email-masked]>
> Cc: Eli Zaretskii <[email-masked]>,
> 	Stefan Kangas <[email-masked]>,
> 	[email-masked]
> 
> 
> Lin Sun wrote:
> > On Tue, May 21, 2024 at 2:04 PM kobarity <[email-masked]> wrote:
> > >
> > >
> > > Lin Sun wrote:
> > > > On Mon, May 20, 2024 at 3:53 PM kobarity <[email-masked]> wrote:
> > > > > Eli Zaretskii wrote:
> > > > > > > Cc: kobarity <[email-masked]>
> > > > > > > From: Stefan Kangas <[email-masked]>
> > > > > > > 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.

Subject: [PATCH] ; Enahnce python-tests.el to adapt different python interpreters
From: Lin Sun <[email-masked]>
To: [email-masked]
Date: Tue, 7 May 2024 06:53:05 +0000
List-Id: <debbugs-submit.debbugs.gnu.org>

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.
From 49dfcecbbffaf15aa0414d15f22d8bcbf768ebb3 Mon Sep 17 00:00:00 2001
From: Lin Sun <[email-masked]>
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:
 
 ;;; 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