This commit is contained in:
@@ -1,41 +1,29 @@
|
||||
import importlib
|
||||
import os
|
||||
import sys
|
||||
import django
|
||||
import mock
|
||||
|
||||
from .config import DJANGO_SETTINGS_DIR
|
||||
|
||||
|
||||
class DjangoEnvironment(object):
|
||||
def __init__(self, project_dir=None, settings_module_name=None):
|
||||
self.project_dir = project_dir
|
||||
def get_root_urlconf(project_dir):
|
||||
if 'django.contrib' in sys.modules:
|
||||
original_contrib = sys.modules['django.contrib']
|
||||
else:
|
||||
original_contrib = None
|
||||
mock_contrib = mock.Mock(name='django.contrib')
|
||||
sys.modules['django.contrib'] = mock_contrib
|
||||
|
||||
if settings_module_name is not None:
|
||||
self.settings_module_name = settings_module_name
|
||||
else:
|
||||
self.settings_module_name = '{}.settings'.format(DJANGO_SETTINGS_DIR)
|
||||
settings_dir = os.path.join(project_dir, DJANGO_SETTINGS_DIR)
|
||||
sys.path.insert(0, settings_dir)
|
||||
root_urlconf = importlib.import_module('urls')
|
||||
if sys.version_info.major == 2: # pragma: no cover
|
||||
reload(root_urlconf) # pylint: disable=undefined-variable
|
||||
else: # pragma: no cover
|
||||
importlib.reload(root_urlconf) # pylint: disable=no-member
|
||||
sys.path.pop(0)
|
||||
|
||||
self._original_sys_path = None
|
||||
self._modified_sys_path = None
|
||||
if original_contrib:
|
||||
sys.modules['django.contrib'] = original_contrib
|
||||
|
||||
def __enter__(self):
|
||||
if self.project_dir:
|
||||
self._original_sys_path = sys.path
|
||||
sys.path.insert(0, self.project_dir)
|
||||
self._modified_sys_path = sys.path
|
||||
|
||||
print('Debug: %s' % self.settings_module_name)
|
||||
os.environ['DJANGO_SETTINGS_MODULE'] = self.settings_module_name
|
||||
django.setup()
|
||||
|
||||
from django.conf import settings
|
||||
self.settings = settings
|
||||
if hasattr(settings, 'ROOT_URLCONF'):
|
||||
self.root_urlconf = importlib.import_module(settings.ROOT_URLCONF)
|
||||
|
||||
return self
|
||||
|
||||
def __exit__(self, *args):
|
||||
if self._modified_sys_path is not None and self._original_sys_path is not None:
|
||||
if sys.path == self._modified_sys_path:
|
||||
sys.path = self._original_sys_path
|
||||
return root_urlconf
|
||||
|
||||
Reference in New Issue
Block a user