diff --git a/constance/config.py b/constance/config.py index c272802..0bf670a 100644 --- a/constance/config.py +++ b/constance/config.py @@ -23,7 +23,10 @@ class Config(object): super(Config, self).__setattr__('_rd', redis.Redis(**settings.CONSTANCE_CONNECTION)) def __getattr__(self, key): - default, help_text = settings.CONSTANCE_CONFIG[key] + try: + default, help_text = settings.CONSTANCE_CONFIG[key] + except KeyError, e: + raise AttributeError(key) result = self._rd.get("%s%s" % (self._prefix, key)) if result is None: result = default @@ -32,6 +35,8 @@ class Config(object): return loads(result) def __setattr__(self, key, value): + if key not in settings.CONSTANCE_CONFIG: + raise AttributeError(key) self._rd.set("%s%s" % (self._prefix, key), dumps(value)) def __dir__(self): diff --git a/constance/tests/__init__.py b/constance/tests/__init__.py deleted file mode 100644 index 2276fe6..0000000 --- a/constance/tests/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from constance.tests.test_config import * diff --git a/constance/tests/test_config.py b/constance/tests/test_config.py deleted file mode 100644 index 43f79e0..0000000 --- a/constance/tests/test_config.py +++ /dev/null @@ -1,21 +0,0 @@ -from django.test import TestCase -from django.conf import settings - -from constance import config - - - -class TestStorage(TestCase): - - def test_store(self): - # read defaults - self.assertEquals(config.INT_VALUE, 1) - self.assertEquals(config.BOOL_VALUE, True) - self.assertEquals(config.STRING_VALUE, 'Hello world') - - config.INT_VALUE = 100 - config.BOOL_VALUE = False - - self.assertEquals(config.INT_VALUE, 100) - self.assertEquals(config.BOOL_VALUE, False) - self.assertEquals(config.STRING_VALUE, 'Hello world') diff --git a/constance/tests/test_settings.py b/constance/tests/test_settings.py deleted file mode 100644 index 07402b0..0000000 --- a/constance/tests/test_settings.py +++ /dev/null @@ -1,7 +0,0 @@ -CONSTANCE_CONFIG = { - 'INT_VALUE': (1, 'some int'), - 'BOOL_VALUE': (True, 'true or false'), - 'STRING_VALUE': ('Hello world', 'greetings'), -} - -CONSTANCE_CONNECTION_CLASS = 'redis_mockup.Connection' diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1 @@ + diff --git a/tests/models.py b/tests/models.py new file mode 100644 index 0000000..e69de29 diff --git a/constance/tests/redis_mockup.py b/tests/redis_mockup.py similarity index 100% rename from constance/tests/redis_mockup.py rename to tests/redis_mockup.py diff --git a/constance/tests/runtests.py b/tests/runtests.py similarity index 95% rename from constance/tests/runtests.py rename to tests/runtests.py index 7a302fc..9258151 100644 --- a/constance/tests/runtests.py +++ b/tests/runtests.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python """Borrowed from Carl Meyer's django-adminfiles.""" @@ -11,6 +10,7 @@ os.environ['DJANGO_SETTINGS_MODULE'] = 'tests.test_settings' from django.test.simple import run_tests + def runtests(): failures = run_tests(['tests'], verbosity=1, interactive=True) sys.exit(failures) diff --git a/tests/test_config.py.orig b/tests/test_config.py.orig new file mode 100644 index 0000000..128d8f9 --- /dev/null +++ b/tests/test_config.py.orig @@ -0,0 +1,49 @@ +from django.test import TestCase +from django.conf import settings + +from constance import config + + + +class TestStorage(TestCase): + + def setUp(self): + self.old_config = getattr(settings, 'CONSTANCE_CONFIG', None) + settings.CONSTANCE_CONFIG = { + 'INT_VALUE': (1, 'some int'), + 'BOOL_VALUE': (True, 'true or false'), + 'STRING_VALUE': ('Hello world', 'greetings'), + } + config._rd.clear() + + def test_store(self): + # read defaults + self.assertEquals(config.INT_VALUE, 1) + self.assertEquals(config.BOOL_VALUE, True) + self.assertEquals(config.STRING_VALUE, 'Hello world') + + # set values + config.INT_VALUE = 100 + config.BOOL_VALUE = False + + # read again + self.assertEquals(config.INT_VALUE, 100) + self.assertEquals(config.BOOL_VALUE, False) + self.assertEquals(config.STRING_VALUE, 'Hello world') + + def test_nonexistent(self): + try: + config.NON_EXISTENT + except Exception, e: + pass + self.assertEquals(type(e), AttributeError) + + try: + config.NON_EXISTENT = 1 + except Exception, e: + pass + self.assertEquals(type(e), AttributeError) + + def tearDown(self): + if self.old_config: + settings.CONSTANCE_CONFIG = self.old_config diff --git a/tests/test_settings.py b/tests/test_settings.py new file mode 100644 index 0000000..47c64fd --- /dev/null +++ b/tests/test_settings.py @@ -0,0 +1,14 @@ +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + } +} + + +CONSTANCE_CONNECTION_CLASS = 'tests.redis_mockup.Connection' + +INSTALLED_APPS = ( + 'tests', + 'constance', +) + diff --git a/tests/tests.py b/tests/tests.py new file mode 100644 index 0000000..128d8f9 --- /dev/null +++ b/tests/tests.py @@ -0,0 +1,49 @@ +from django.test import TestCase +from django.conf import settings + +from constance import config + + + +class TestStorage(TestCase): + + def setUp(self): + self.old_config = getattr(settings, 'CONSTANCE_CONFIG', None) + settings.CONSTANCE_CONFIG = { + 'INT_VALUE': (1, 'some int'), + 'BOOL_VALUE': (True, 'true or false'), + 'STRING_VALUE': ('Hello world', 'greetings'), + } + config._rd.clear() + + def test_store(self): + # read defaults + self.assertEquals(config.INT_VALUE, 1) + self.assertEquals(config.BOOL_VALUE, True) + self.assertEquals(config.STRING_VALUE, 'Hello world') + + # set values + config.INT_VALUE = 100 + config.BOOL_VALUE = False + + # read again + self.assertEquals(config.INT_VALUE, 100) + self.assertEquals(config.BOOL_VALUE, False) + self.assertEquals(config.STRING_VALUE, 'Hello world') + + def test_nonexistent(self): + try: + config.NON_EXISTENT + except Exception, e: + pass + self.assertEquals(type(e), AttributeError) + + try: + config.NON_EXISTENT = 1 + except Exception, e: + pass + self.assertEquals(type(e), AttributeError) + + def tearDown(self): + if self.old_config: + settings.CONSTANCE_CONFIG = self.old_config