From 4304c91381cbebd42d8d810a53d3b2aa0be9f080 Mon Sep 17 00:00:00 2001 From: Ohad Livne Date: Wed, 4 Jun 2025 22:44:58 +0300 Subject: [PATCH] Create a keybinding for running Python tests --- .config/emacs/init.el | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/.config/emacs/init.el b/.config/emacs/init.el index 6f3a382..43bdd3e 100644 --- a/.config/emacs/init.el +++ b/.config/emacs/init.el @@ -168,10 +168,41 @@ (lsp)) (pyvenv-deactivate)))) +(defun symbols-at-point () + (let* ((lsp--document-symbols-request-async t) + (symbols (lsp--get-document-symbols)) + (symbols-hierarchy (lsp--symbols->document-symbols-hierarchy symbols))) + (mapcar (lambda (symb) + (list (gethash "name" symb) (lsp--get-symbol-type symb))) + symbols-hierarchy))) + +(defun python-test-at-point () + (let ((symbols (symbols-at-point))) + (pcase symbols + (`((,class "Class") (,method "Method") . ,_) + (if (equal "test_" (substring method 0 5)) + `(,class ,method) + `(,class))) + (`((,class "Class") . ,_) `(,class)) + (_ ())))) + +(defun python-test-name-at-point () + (let* ((path (mapcar #'substring-no-properties lsp-headerline--path-up-to-project-segments)) + (filename (f-no-ext (f-filename (buffer-file-name))))) + (string-join (append path (list filename) (python-test-at-point)) "."))) + +(defun python-run-test-at-point () + (interactive) + (let ((python (executable-find "python")) + (test-name (python-test-name-at-point))) + (compile (concat python " -m unittest " test-name)))) + (use-package python :bind (:map python-mode-map ("C-c C-p" . nil) - ("C-c C-l" . nil)) + ("C-c C-l" . nil) + ("C-c C-t" . python-run-test-at-point) + ("C-M-t" . recompile)) :hook ((python-mode . load-python-env))) ; Requires the Python package "black"