;;; Code:
+(require 'cl-extra)
(require 'ert)
(require 'ert-x)
(require 'python)
(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
\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'."
(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
(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
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)))
(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)
(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
(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)))
(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)
(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"
(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
(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"
(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"
(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"
(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 "")
(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"
(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
(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)
"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
;;; 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
(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
(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
(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
(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
(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
(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
(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
;;; 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
(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
"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
(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
;; 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
"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):