Skip to content

Instantly share code, notes, and snippets.

@kipanshi
Created May 20, 2012 20:47
Show Gist options
  • Save kipanshi/2759479 to your computer and use it in GitHub Desktop.
Save kipanshi/2759479 to your computer and use it in GitHub Desktop.
Overriding settings in Django tests
class SettingsContextManager(object):
"""Allow to change ``settings.*`` in ``with`` context."""
def __init__(self, *settings_tuples):
self.settings = dict(settings_tuples)
self.orig_settings = dict([(key, getattr(settings, key))
for key in self.settings])
def __enter__(self, *args, **kwargs):
[setattr(settings, key, self.settings[key])
for key in self.settings]
def __exit__(self, *args, **kwargs):
[setattr(settings, key, self.orig_settings[key])
for key in self.settings]
def patch_settings(*settings_tuples):
"""Patch ``settings`` inside ``with`` context.
INPUT:
*settings_tuples one or several tuples
representing (setting_name, value)
"""
return SettingsContextManager(*settings_tuples)
def with_settings(**settings_dict):
"""Decorator for executing function within given ``settings`` context.
Example: @with_settings(CELERY_ALWAYS_EAGER=False)
"""
def wrap(func):
def wrapper(self, *args, **kwargs):
with patch_settings(*settings_dict.items()):
result = func(self, *args, **kwargs)
return result
return wrapper
return wrap
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment