Fix Python shell completion test failures

* test/lisp/progmodes/python-tests.el
(python-tests-with-temp-buffer-with-shell): Set XDG_CACHE_HOME
to a temporary directory.
(python-tests--pythonstartup-file): New function.
(python-shell-completion-at-point-jedi-completer)
(python-shell-completion-at-point-ipython): Use Jedi as the
native completion backend when possible.  (bug#68559)
This commit is contained in:
Liu Hui 2024-02-21 12:40:06 +08:00 committed by Basil L. Contovounesios
parent 3412b64ac8
commit 8a2d013be3

View file

@ -55,21 +55,27 @@ BODY is code to be executed within the temp buffer. Point is
always located at the beginning of buffer. Native completion is
turned off. Shell buffer will be killed on exit."
(declare (indent 1) (debug t))
`(with-temp-buffer
(let ((python-indent-guess-indent-offset nil)
(python-shell-completion-native-enable nil))
(python-mode)
(unwind-protect
(progn
(run-python nil t)
(insert ,contents)
(goto-char (point-min))
(python-tests-shell-wait-for-prompt)
,@body)
(when (python-shell-get-buffer)
(python-shell-with-shell-buffer
(let (kill-buffer-hook kill-buffer-query-functions)
(kill-buffer))))))))
(let ((dir (make-symbol "dir")))
`(with-temp-buffer
(let ((python-indent-guess-indent-offset nil)
(python-shell-completion-native-enable nil))
(python-mode)
(unwind-protect
;; Prevent test failures when Jedi is used as a completion
;; backend, either directly or indirectly (e.g., via
;; IPython). Jedi needs to store cache, but the
;; "/nonexistent" HOME directory is not writable.
(ert-with-temp-directory ,dir
(with-environment-variables (("XDG_CACHE_HOME" ,dir))
(run-python nil t)
(insert ,contents)
(goto-char (point-min))
(python-tests-shell-wait-for-prompt)
,@body))
(when (python-shell-get-buffer)
(python-shell-with-shell-buffer
(let (kill-buffer-hook kill-buffer-query-functions)
(kill-buffer)))))))))
(defmacro python-tests-with-temp-file (contents &rest body)
"Create a `python-mode' enabled file with CONTENTS.
@ -4860,17 +4866,28 @@ def foo():
(should (string= "IGNORECASE"
(buffer-substring (line-beginning-position) (point)))))
(defun 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-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))
(python-tests-with-temp-buffer-with-shell
""
(python-shell-with-shell-buffer
(python-shell-completion-native-turn-on)
(skip-unless (string= python-shell-readline-completer-delims ""))
(python-tests--completion-module)
(python-tests--completion-parameters)
(python-tests--completion-extra-context))))
(with-environment-variables
(("PYTHONSTARTUP" (python-tests--pythonstartup-file)))
(python-tests-with-temp-buffer-with-shell
""
(python-shell-with-shell-buffer
(python-shell-completion-native-turn-on)
(skip-unless (string= python-shell-readline-completer-delims ""))
(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."
@ -4880,17 +4897,19 @@ def foo():
(and
(executable-find python-shell-interpreter)
(eql (call-process python-shell-interpreter nil nil nil "--version") 0)))
(python-tests-with-temp-buffer-with-shell
""
(python-shell-with-shell-buffer
(python-shell-completion-native-turn-off)
(python-tests--completion-module)
(python-tests--completion-parameters)
(python-shell-completion-native-turn-on)
(skip-unless (string= python-shell-readline-completer-delims ""))
(python-tests--completion-module)
(python-tests--completion-parameters)
(python-tests--completion-extra-context)))))
(with-environment-variables
(("PYTHONSTARTUP" (python-tests--pythonstartup-file)))
(python-tests-with-temp-buffer-with-shell
""
(python-shell-with-shell-buffer
(python-shell-completion-native-turn-off)
(python-tests--completion-module)
(python-tests--completion-parameters)
(python-shell-completion-native-turn-on)
(skip-unless (string= python-shell-readline-completer-delims ""))
(python-tests--completion-module)
(python-tests--completion-parameters)
(python-tests--completion-extra-context))))))
;;; PDB Track integration