Author: mtredinnick
Date: 2009-03-01 22:48:22 -0600 (Sun, 01 Mar 2009)
New Revision: 9945

Modified:
   django/trunk/django/conf/__init__.py
   django/trunk/django/utils/functional.py
   django/trunk/tests/regressiontests/comment_tests/tests/app_api_tests.py
Log:
Factor out some common pieces of django.conf.LazySettings.

This is in preparation for some reuse elsewhere in the core code.

Modified: django/trunk/django/conf/__init__.py
===================================================================
--- django/trunk/django/conf/__init__.py        2009-03-02 04:17:00 UTC (rev 
9944)
+++ django/trunk/django/conf/__init__.py        2009-03-02 04:48:22 UTC (rev 
9945)
@@ -8,40 +8,19 @@
 
 import os
 import time     # Needed for Windows
+
 from django.conf import global_settings
+from django.utils.functional import LazyObject
 
 ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE"
 
-class LazySettings(object):
+class LazySettings(LazyObject):
     """
     A lazy proxy for either global Django settings or a custom settings object.
     The user can manually configure settings prior to using them. Otherwise,
     Django uses the settings module pointed to by DJANGO_SETTINGS_MODULE.
     """
-    def __init__(self):
-        # _target must be either None or something that supports attribute
-        # access (getattr, hasattr, etc).
-        self._target = None
-
-    def __getattr__(self, name):
-        if self._target is None:
-            self._import_settings()
-        if name == '__members__':
-            # Used to implement dir(obj), for example.
-            return self._target.get_all_members()
-        return getattr(self._target, name)
-
-    def __setattr__(self, name, value):
-        if name == '_target':
-            # Assign directly to self.__dict__, because otherwise we'd call
-            # __setattr__(), which would be an infinite loop.
-            self.__dict__['_target'] = value
-        else:
-            if self._target is None:
-                self._import_settings()
-            setattr(self._target, name, value)
-
-    def _import_settings(self):
+    def _setup(self):
         """
         Load the settings module pointed to by the environment variable. This
         is used the first time we need any settings at all, if the user has not
@@ -56,7 +35,7 @@
             # problems with Python's interactive help.
             raise ImportError("Settings cannot be imported, because 
environment variable %s is undefined." % ENVIRONMENT_VARIABLE)
 
-        self._target = Settings(settings_module)
+        self._wrapped = Settings(settings_module)
 
     def configure(self, default_settings=global_settings, **options):
         """
@@ -69,13 +48,13 @@
         holder = UserSettingsHolder(default_settings)
         for name, value in options.items():
             setattr(holder, name, value)
-        self._target = holder
+        self._wrapped = holder
 
     def configured(self):
         """
         Returns True if the settings have already been configured.
         """
-        return bool(self._target)
+        return bool(self._wrapped)
     configured = property(configured)
 
 class Settings(object):

Modified: django/trunk/django/utils/functional.py
===================================================================
--- django/trunk/django/utils/functional.py     2009-03-02 04:17:00 UTC (rev 
9944)
+++ django/trunk/django/utils/functional.py     2009-03-02 04:48:22 UTC (rev 
9945)
@@ -251,3 +251,39 @@
             return func(*args, **kwargs)
         return lazy(func, *resultclasses)(*args, **kwargs)
     return wraps(func)(wrapper)
+
+class LazyObject(object):
+    """
+    A wrapper for another class that can be used to delay instantiation of the
+    wrapped class.
+
+    This is useful, for example, if the wrapped class needs to use Django
+    settings at creation time: we want to permit it to be imported without
+    accessing settings.
+    """
+    def __init__(self):
+        self._wrapped = None
+
+    def __getattr__(self, name):
+        if self._wrapped is None:
+            self._setup()
+        if name == "__members__":
+            # Used to implement dir(obj)
+            return self._wrapped.get_all_members()
+        return getattr(self._wrapped, name)
+
+    def __setattr__(self, name, value):
+        if name == "_wrapped":
+            # Assign to __dict__ to avoid infinite __setattr__ loops.
+            self.__dict__["_wrapped"] = value
+        else:
+            if self._wrapped is None:
+                self._setup()
+            setattr(self._wrapped, name, value)
+
+    def _setup(self):
+        """
+        Must be implemented by subclasses to initialise the wrapped object.
+        """
+        raise NotImplementedError
+

Modified: 
django/trunk/tests/regressiontests/comment_tests/tests/app_api_tests.py
===================================================================
--- django/trunk/tests/regressiontests/comment_tests/tests/app_api_tests.py     
2009-03-02 04:17:00 UTC (rev 9944)
+++ django/trunk/tests/regressiontests/comment_tests/tests/app_api_tests.py     
2009-03-02 04:48:22 UTC (rev 9945)
@@ -41,7 +41,7 @@
         del settings.INSTALLED_APPS[-1]
         settings.COMMENTS_APP = self.old_comments_app
         if settings.COMMENTS_APP is None:
-            delattr(settings._target, 'COMMENTS_APP')
+            delattr(settings._wrapped, 'COMMENTS_APP')
 
     def testGetCommentApp(self):
         from regressiontests.comment_tests import custom_comments


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-updates@googlegroups.com
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to