From 87333bf3dd02f2237f8db80a40c29ce140ccbcf8 Mon Sep 17 00:00:00 2001 From: galaunay Date: Tue, 6 Aug 2019 18:10:02 +0200 Subject: [PATCH 1/3] Use a decent default for django settings path --- elpy-django.el | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/elpy-django.el b/elpy-django.el index eabba9a60..46815bc4f 100644 --- a/elpy-django.el +++ b/elpy-django.el @@ -178,7 +178,7 @@ This is marked with 'manage.py' or 'django-admin.py'." (defvar elpy-django--test-runner-cache nil "Internal cache for elpy-django--get-test-runner. -The cache is keyed on project root and DJANGO_SETTINGS_MODULE env var") +The cache is keyed on project root and django setting path") (defvar elpy-django--test-runner-cache-max-size 100 "Maximum number of entries in test runner cache") @@ -186,14 +186,17 @@ The cache is keyed on project root and DJANGO_SETTINGS_MODULE env var") (defun elpy-django--get-test-runner () "Return the name of the django test runner. -Needs `DJANGO_SETTINGS_MODULE' to be set in order to work. -The result is memoized on project root and `DJANGO_SETTINGS_MODULE'" - (let ((django-import-cmd "import django;django.setup();from django.conf import settings;print(settings.TEST_RUNNER)") - (django-settings-env (getenv "DJANGO_SETTINGS_MODULE")) + +If the `DJANGO_SETTINGS_MODULE' environment variable is not set, +the default setting path is retrieved running `manage.py`. + +The result is memoized on project root and django setting path." + (let ((django-settings-env (or (getenv "DJANGO_SETTINGS_MODULE") + (elpy-django--get-default-settings-path))) (default-directory (elpy-project-root))) ;; If no Django settings has been set, then nothing will work. Warn user (unless django-settings-env - (error "Please set environment variable `DJANGO_SETTINGS_MODULE' if you'd like to run the test runner")) + (Error "Please set environment variable `DJANGO_SETTINGS_MODULE' if you'd like to run the test runner")) (let* ((runner-key (list default-directory django-settings-env)) (runner (or (elpy-django--get-test-runner-from-cache runner-key) @@ -221,7 +224,7 @@ Return the correct string format here." (defun elpy-django--detect-test-runner (django-settings-env) "Detects django test runner in current configuration" - ;; We have to be able to import the DJANGO_SETTINGS_MODULE to detect test + ;; We have to be able to import the django-settings-env to detect test ;; runner; if python process importing settings exits with error, ;; then warn the user that settings is not valid (unless (= 0 (call-process elpy-rpc-python-command nil nil nil @@ -232,6 +235,16 @@ Return the correct string format here." (format "%s -c '%s'" elpy-rpc-python-command django-import-cmd)))) +(defun elpy-django--get-default-settings-path () + "Return the default settings path (from running `manage.py')." + (let ((default-directory (elpy-project-root))) + (with-temp-buffer + (unless (= 0 (call-process shell-file-name nil t nil + "-c" + "./manage.py shell -c 'from django.conf import settings;print(settings.SETTINGS_MODULE)'")) + (error (format "Unable to get the setting path from the django shell"))) + (s-trim (buffer-string))))) + (defun elpy-django--get-test-runner-from-cache (key) "Retrieve from cache test runner with given caching key. From 1793f89ab660a9138f884983feabf703877fb76f Mon Sep 17 00:00:00 2001 From: galaunay Date: Tue, 6 Aug 2019 18:24:18 +0200 Subject: [PATCH 2/3] Put back django-import-cmd --- elpy-django.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/elpy-django.el b/elpy-django.el index 46815bc4f..86994d867 100644 --- a/elpy-django.el +++ b/elpy-django.el @@ -231,9 +231,10 @@ Return the correct string format here." "-c" (format "import %s" django-settings-env))) (error (format "Unable to import DJANGO_SETTINGS_MODULE: '%s'" django-settings-env))) - (s-trim (shell-command-to-string - (format "%s -c '%s'" elpy-rpc-python-command - django-import-cmd)))) + (let ((django-import-cmd "import django;django.setup();from django.conf import settings;print(settings.TEST_RUNNER)")) + (s-trim (shell-command-to-string + (format "%s -c '%s'" elpy-rpc-python-command + django-import-cmd))))) (defun elpy-django--get-default-settings-path () "Return the default settings path (from running `manage.py')." From a7b47f3a3c008d3c24c0c1cab06c7c0bb6f615b4 Mon Sep 17 00:00:00 2001 From: galaunay Date: Sat, 2 May 2020 17:36:07 +0200 Subject: [PATCH 3/3] Remove useless warning --- elpy-django.el | 3 --- 1 file changed, 3 deletions(-) diff --git a/elpy-django.el b/elpy-django.el index 86994d867..e6bcbf201 100644 --- a/elpy-django.el +++ b/elpy-django.el @@ -194,9 +194,6 @@ The result is memoized on project root and django setting path." (let ((django-settings-env (or (getenv "DJANGO_SETTINGS_MODULE") (elpy-django--get-default-settings-path))) (default-directory (elpy-project-root))) - ;; If no Django settings has been set, then nothing will work. Warn user - (unless django-settings-env - (Error "Please set environment variable `DJANGO_SETTINGS_MODULE' if you'd like to run the test runner")) (let* ((runner-key (list default-directory django-settings-env)) (runner (or (elpy-django--get-test-runner-from-cache runner-key)