Merge pull request #191 from blueyed/setup-once

_setup: do not call django.setup() if settings are configured already
This commit is contained in:
Daniel Hahler 2018-08-16 18:12:52 +02:00 committed by GitHub
commit 5ea0db0aee
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 46 additions and 5 deletions

3
.gitignore vendored
View file

@ -1,6 +1,5 @@
.coverage.* .coverage
coverage.xml coverage.xml
sitecustomize.py
docs/_build docs/_build
*.egg-info *.egg-info
*.egg *.egg

View file

@ -11,8 +11,10 @@ def _setup():
importer.install() importer.install()
import django from django.apps import apps
django.setup() if not apps.ready:
import django
django.setup()
def load_ipython_extension(ipython): def load_ipython_extension(ipython):

9
sitecustomize.py Normal file
View file

@ -0,0 +1,9 @@
"""Setup coverage tracking for subprocesses.
Any ImportError is silently ignored.
Requires COVERAGE_PROCESS_START in the environments, which gets set in
tox.ini.
"""
import coverage
coverage.process_startup()

17
tests/setup_test.py Normal file
View file

@ -0,0 +1,17 @@
"""Used by tests to ensure logging is kept when calling setup() twice."""
try:
from unittest import mock
except ImportError:
from mock import mock
import configurations
print('setup_1')
configurations.setup()
with mock.patch('django.setup', side_effect=Exception('setup called twice')):
print('setup_2')
configurations.setup()
print('setup_done')

View file

@ -105,3 +105,16 @@ class MainTests(TestCase):
proc = subprocess.Popen(['django-cadmin', 'runserver', '--help'], proc = subprocess.Popen(['django-cadmin', 'runserver', '--help'],
stdout=subprocess.PIPE) stdout=subprocess.PIPE)
self.assertIn('--configuration', proc.communicate()[0].decode('utf-8')) self.assertIn('--configuration', proc.communicate()[0].decode('utf-8'))
def test_django_setup_only_called_once(self):
proc = subprocess.Popen(
[sys.executable, os.path.join(os.path.dirname(__file__),
'setup_test.py')],
stdout=subprocess.PIPE)
res = proc.communicate()
stdout = res[0].decode('utf-8')
self.assertIn('setup_1', stdout)
self.assertIn('setup_2', stdout)
self.assertIn('setup_done', stdout)
self.assertEqual(proc.returncode, 0)

View file

@ -25,11 +25,12 @@ deps =
dj20: django>=2.0a1,<2.1 dj20: django>=2.0a1,<2.1
dj21: django>=2.1a1,<2.2 dj21: django>=2.1a1,<2.2
djmaster: https://github.com/django/django/archive/master.tar.gz#egg=django djmaster: https://github.com/django/django/archive/master.tar.gz#egg=django
py27,pypy: mock
commands = commands =
python --version python --version
coverage run {envbindir}/django-cadmin test -v2 {posargs:tests} coverage run {envbindir}/django-cadmin test -v2 {posargs:tests}
coverage combine coverage combine . tests/docs
coverage report -m --skip-covered coverage report -m --skip-covered
[testenv:readme-py27] [testenv:readme-py27]