refactor validation
[tiramisu.git] / tiramisu / storage / __init__.py
1 # Copyright (C) 2013-2014 Team tiramisu (see AUTHORS for all contributors)
2 #
3 # This program is free software: you can redistribute it and/or modify it
4 # under the terms of the GNU Lesser General Public License as published by the
5 # Free Software Foundation, either version 3 of the License, or (at your
6 # option) any later version.
7 #
8 # This program is distributed in the hope that it will be useful, but WITHOUT
9 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
10 # FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
11 # details.
12 #
13 # You should have received a copy of the GNU Lesser General Public License
14 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
15 # ____________________________________________________________
16
17 """Config's informations are, by default, volatiles. This means, all values and
18 settings changes will be lost.
19
20 The storage is the system Tiramisu uses to communicate with various DB.
21 You can specified a persistent storage.
22
23 Storage is basic components used to set Config informations in DB.
24 The primary "entry point" class is the StorageType and it's public
25 configurator ``set_storage()``.
26 """
27
28
29 from time import time
30 from random import randint
31 import os
32 from tiramisu.error import ConfigError
33 from tiramisu.i18n import _
34
35
36 class StorageType(object):
37     """Object to store storage's type. If a Config is already set,
38     default storage is store as selected storage. You cannot change it
39     after.
40     """
41     default_storage = os.environ.get('TIRAMISU_STORAGE', 'dictionary')
42     storage_type = None
43     mod = None
44
45     def set(self, name):  # pragma: optional cover
46         if self.storage_type is not None:
47             if self.storage_type == name:
48                 return
49             raise ConfigError(_('storage_type is already set, cannot rebind it'))
50         self.storage_type = name
51
52     def get(self):
53         if self.storage_type is None:
54             self.storage_type = self.default_storage
55         if self.mod is None:
56             modulepath = 'tiramisu.storage.{0}'.format(self.storage_type)
57             try:
58                 mod = __import__(modulepath)
59             except ImportError:
60                 raise SystemError(_('cannot import the storage {0}').format(
61                     self.default_storage))
62             for token in modulepath.split(".")[1:]:
63                 mod = getattr(mod, token)
64             self.mod = mod
65         return self.mod
66
67
68 storage_type = StorageType()
69 storage_option_type = StorageType()
70 storage_validation = StorageType()
71 storage_validation.set('dictionary')
72
73
74 def set_storage(type_, name, **kwargs):  # pragma: optional cover
75     """Change storage's configuration
76
77     :params name: is the storage name. If storage is already set, cannot
78         reset storage name
79
80     Other attributes are differents according to the selected storage's name
81     """
82     if type_ == 'option':
83         storage_option_type.set(name)
84         setting = storage_option_type.get().setting
85     else:
86         storage_type.set(name)
87         setting = storage_type.get().setting
88     for option, value in kwargs.items():
89         try:
90             getattr(setting, option)
91             setattr(setting, option, value)
92         except AttributeError:
93             raise ValueError(_('option {0} not already exists in storage {1}'
94                                '').format(option, name))
95
96
97 def _impl_getstate_setting():
98     setting = storage_type.get().setting
99     state = {'name': storage_type.storage_type}
100     for var in dir(setting):
101         if not var.startswith('_'):
102             state[var] = getattr(setting, var)
103     return state
104
105
106 def get_storage(type_, session_id, persistent, test):  # pragma: optional cover
107     """all used when __setstate__ a Config
108     """
109     if type_ == 'option':
110         return storage_option_type.get().Storage(session_id, persistent, test)
111     elif type_ == 'config':
112         return storage_type.get().Storage(session_id, persistent, test)
113     else:
114         return storage_validation.get().Storage(session_id, persistent, test)
115
116
117 def get_storages(context, session_id, persistent):
118     def gen_id(config):
119         return str(id(config)) + str(time()) + str(randint(0, 500))
120
121     if session_id is None:
122         session_id = gen_id(context)
123     imp = storage_type.get()
124     storage = imp.Storage(session_id, persistent)
125     try:
126         return imp.Settings(storage), imp.Values(storage)
127     except Exception, err:
128         raise Exception(_('unable to get storages:') + str(err))
129
130
131 def get_storages_option(type_):
132     imp = storage_option_type.get()
133     if type_ == 'base':
134         return imp.StorageBase
135     else:
136         return imp.StorageOptionDescription
137
138
139 def get_storages_validation():
140     imp = storage_validation.get()
141     storage = imp.Storage('pouet', persistent=False, test=True)
142     return imp.Settings(storage), imp.Values(storage)
143
144
145 def list_sessions(type_):  # pragma: optional cover
146     """List all available session (persistent or not persistent)
147     """
148     if type_ == 'option':
149         return storage_option_type.get().list_sessions()
150     else:
151         return storage_type.get().list_sessions()
152
153
154 def delete_session(type_, session_id):  # pragma: optional cover
155     """Delete a selected session, be careful, you can deleted a session
156     use by an other instance
157     :params session_id: id of session to delete
158     """
159     if type_ == 'option':
160         return storage_option_type.get().delete_session(session_id)
161     else:
162         return storage_type.get().delete_session(session_id)
163
164
165 __all__ = (set_storage, list_sessions, delete_session)