Completed
Push — master ( b812f7...ce9ec0 )
by Bertrand
01:05
created

Settings.load()   A

Complexity

Conditions 3

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
c 0
b 0
f 0
dl 0
loc 7
rs 9.4285
1
from django.conf import settings
2
from django.utils.module_loading import import_string
3
4
5
SUPPORTED_DATABASE_ENGINES = {
6
    'django.db.backends.sqlite3',
7
    'django.db.backends.postgresql',
8
    'django.db.backends.mysql',
9
    # TODO: Remove when we drop Django 1.8 support.
10
    'django.db.backends.postgresql_psycopg2',
11
12
    # GeoDjango
13
    'django.contrib.gis.db.backends.spatialite',
14
    'django.contrib.gis.db.backends.postgis',
15
    'django.contrib.gis.db.backends.mysql',
16
17
    # django-transaction-hooks
18
    'transaction_hooks.backends.sqlite3',
19
    'transaction_hooks.backends.postgis',
20
    'transaction_hooks.backends.postgresql_psycopg2',
21
    'transaction_hooks.backends.mysql',
22
}
23
24
SUPPORTED_CACHE_BACKENDS = {
25
    'django.core.cache.backends.dummy.DummyCache',
26
    'django.core.cache.backends.locmem.LocMemCache',
27
    'django.core.cache.backends.filebased.FileBasedCache',
28
    'django_redis.cache.RedisCache',
29
    'django.core.cache.backends.memcached.MemcachedCache',
30
    'django.core.cache.backends.memcached.PyLibMCCache',
31
}
32
33
SUPPORTED_ONLY = 'supported_only'
34
ITERABLES = {tuple, list, frozenset, set}
35
36
37
class Settings(object):
38
    converters = {}
39
40
    CACHALOT_ENABLED = True
41
    CACHALOT_CACHE = 'default'
42
    CACHALOT_DATABASES = 'supported_only'
43
    CACHALOT_TIMEOUT = None
44
    CACHALOT_CACHE_RANDOM = False
45
    CACHALOT_INVALIDATE_RAW = True
46
    CACHALOT_ONLY_CACHABLE_TABLES = frozenset()
47
    CACHALOT_UNCACHABLE_TABLES = frozenset(('django_migrations',))
48
    CACHALOT_QUERY_KEYGEN = 'cachalot.utils.get_query_cache_key'
49
    CACHALOT_TABLE_KEYGEN = 'cachalot.utils.get_table_cache_key'
50
51
    @classmethod
52
    def add_converter(cls, setting):
53
        def inner(func):
54
            cls.converters[setting] = func
55
56
        return inner
57
58
    @classmethod
59
    def get_names(cls):
60
        return {name for name in cls.__dict__
61
                if name[:2] != '__' and name.isupper()}
62
63
    def load(self):
64
        for name in self.get_names():
65
            value = getattr(settings, name, getattr(self.__class__, name))
66
            converter = self.converters.get(name)
67
            if converter is not None:
68
                value = converter(value)
69
            setattr(self, name, value)
70
71
72
@Settings.add_converter('CACHALOT_DATABASES')
73
def convert(value):
74
    if value == SUPPORTED_ONLY:
75
        value = {alias for alias, setting in settings.DATABASES.items()
76
                 if setting['ENGINE'] in SUPPORTED_DATABASE_ENGINES}
77
    if value.__class__ in ITERABLES:
78
        return frozenset(value)
79
    return value
80
81
82
@Settings.add_converter('CACHALOT_ONLY_CACHABLE_TABLES')
83
def convert(value):
84
    return frozenset(value)
85
86
87
@Settings.add_converter('CACHALOT_ONLY_UNCACHABLE_TABLES')
88
def convert(value):
89
    return frozenset(value)
90
91
92
@Settings.add_converter('CACHALOT_QUERY_KEYGEN')
93
def convert(value):
94
    return import_string(value)
95
96
97
@Settings.add_converter('CACHALOT_TABLE_KEYGEN')
98
def convert(value):
99
    return import_string(value)
100
101
102
cachalot_settings = Settings()
103