forked from mmerickel/anykeystore
/
store.py
45 lines (39 loc) · 1.32 KB
/
store.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import sys
from anykeystore.exceptions import ConfigurationError
def _load_backend(name):
try:
module_name = 'anykeystore.backends.%s' % name
__import__(module_name)
module = sys.modules[module_name]
if hasattr(module, 'backend'):
backend = module.backend
else:
module = _load_entry_point(name)
if module is None:
raise ConfigurationError(
'Could not determine backend for "%s"' % name)
return backend
except ImportError:
module = _load_entry_point(name)
if module is not None:
return module
raise ConfigurationError(
'Could not determine backend for "%s"' % name)
def _load_entry_point(name):
try:
import pkg_resources
except ImportError:
return None
for res in pkg_resources.iter_entry_points('anykeystore.backends'):
if res.name == name:
return res.load()
def create_store(name, **kwargs):
backend_cls = _load_backend(name)
return backend_cls(**kwargs)
def create_store_from_settings(settings, prefix='', **kwargs):
plen = len(prefix)
for k, v in settings.items():
if k.startswith(prefix):
kwargs[k[plen:]] = v
name = kwargs.pop('store')
return create_store(name, **kwargs)