3cba5c638fb205567251215539d6e8ae3fbaf31f
[tiramisu.git] / tiramisu / storage / __init__.py
1 # Copyright (C) 2013 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 tiramisu.error import ConfigError
31 from tiramisu.i18n import _
32
33
34 class StorageType(object):
35     """Object to store storage's type. If a Config is already set,
36     default storage is store as selected storage. You cannot change it
37     after.
38     """
39     default_storage = 'dictionary'
40     storage_type = None
41     mod = None
42
43     def set(self, name):  # pragma: optional cover
44         if self.storage_type is not None:
45             if self.storage_type == name:
46                 return
47             raise ConfigError(_('storage_type is already set, cannot rebind it'))
48         self.storage_type = name
49
50     def get(self):
51         if self.storage_type is None:
52             self.storage_type = self.default_storage
53         if self.mod is None:
54             modulepath = 'tiramisu.storage.{0}'.format(self.storage_type)
55             mod = __import__(modulepath)
56             for token in modulepath.split(".")[1:]:
57                 mod = getattr(mod, token)
58             self.mod = mod
59         return self.mod
60
61
62 storage_type = StorageType()
63 storage_option_type = StorageType()
64
65
66 def set_storage(type_, name, **kwargs):  # pragma: optional cover
67     """Change storage's configuration
68
69     :params name: is the storage name. If storage is already set, cannot
70         reset storage name
71
72     Other attributes are differents according to the selected storage's name
73     """
74     if type_ == 'option':
75         storage_option_type.set(name)
76         setting = storage_option_type.get().setting
77     else:
78         storage_type.set(name)
79         setting = storage_type.get().setting
80     for option, value in kwargs.items():
81         try:
82             getattr(setting, option)
83             setattr(setting, option, value)
84         except AttributeError:
85             raise ValueError(_('option {0} not already exists in storage {1}'
86                                '').format(option, name))
87
88
89 def _impl_getstate_setting():
90     setting = storage_type.get().setting
91     state = {'name': storage_type.storage_type}
92     for var in dir(setting):
93         if not var.startswith('_'):
94             state[var] = getattr(setting, var)
95     return state
96
97
98 def get_storage(type_, session_id, persistent, test):  # pragma: optional cover
99     """all used when __setstate__ a Config
100     """
101     if type_ == 'option':
102         return storage_option_type.get().Storage(session_id, persistent, test)
103     else:
104         return storage_type.get().Storage(session_id, persistent, test)
105
106
107 def get_storages(context, session_id, persistent):
108     def gen_id(config):
109         return str(id(config)) + str(time())
110
111     if session_id is None:
112         session_id = gen_id(context)
113     imp = storage_type.get()
114     storage = imp.Storage(session_id, persistent)
115     return imp.Settings(storage), imp.Values(storage)
116
117
118 def get_storages_option(type_):
119     imp = storage_option_type.get()
120     if type_ == 'base':
121         return imp.Base
122     else:
123         return imp.OptionDescription
124
125
126 def list_sessions(type_):  # pragma: optional cover
127     """List all available session (persistent or not persistent)
128     """
129     if type_ == 'option':
130         return storage_option_type.get().list_sessions()
131     else:
132         return storage_type.get().list_sessions()
133
134
135 def delete_session(type_, session_id):  # pragma: optional cover
136     """Delete a selected session, be careful, you can deleted a session
137     use by an other instance
138     :params session_id: id of session to delete
139     """
140     if type_ == 'option':
141         return storage_option_type.get().delete_session(session_id)
142     else:
143         return storage_type.get().delete_session(session_id)
144
145
146 __all__ = (set_storage, list_sessions, delete_session)