13942587717a8cd97d96264d69bf800560351170
[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
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version.
7 #
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU General Public License
14 # along with this program; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16 #
17 # The original `Config` design model is unproudly borrowed from
18 # the rough gus of pypy: pypy: http://codespeak.net/svn/pypy/dist/pypy/config/
19 # the whole pypy projet is under MIT licence
20 # ____________________________________________________________
21
22 """Config's informations are, by default, volatiles. This means, all values and
23 settings changes will be lost.
24
25 The storage is the system Tiramisu uses to communicate with various DB.
26 You can specified a persistent storage.
27
28 Storage is basic components used to set Config informations in DB.
29 The primary "entry point" class is the StorageType and it's public
30 configurator ``set_storage()``.
31 """
32
33
34 from time import time
35 from tiramisu.error import ConfigError
36 from tiramisu.i18n import _
37
38
39 class StorageType(object):
40     """Object to store storage's type. If a Config is already set,
41     default storage is store as selected storage. You cannot change it
42     after.
43     """
44     default_storage = 'dictionary'
45     storage_type = None
46     mod = None
47
48     def set(self, name):
49         if self.storage_type is not None:
50             if self.storage_type == name:
51                 return
52             raise ConfigError(_('storage_type is already set, cannot rebind it'))
53         self.storage_type = name
54
55     def get(self):
56         if self.storage_type is None:
57             self.storage_type = self.default_storage
58         storage = self.storage_type
59         if self.mod is None:
60             modulepath = 'tiramisu.storage.{0}'.format(storage)
61             mod = __import__(modulepath)
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
70
71 def set_storage(name, **args):
72     """Change storage's configuration
73
74     :params name: is the storage name. If storage is already set, cannot
75         reset storage name
76
77     Other attributes are differents according to the selected storage's name
78     """
79     storage_type.set(name)
80     settings = storage_type.get().Setting()
81     for option, value in args.items():
82         try:
83             getattr(settings, option)
84             setattr(settings, option, value)
85         except AttributeError:
86             raise ValueError(_('option {0} not already exists in storage {1}'
87                                '').format(option, name))
88
89
90 def get_storages(context, session_id, persistent):
91     def gen_id(config):
92         return str(id(config)) + str(time())
93
94     if session_id is None:
95         session_id = gen_id(context)
96     imp = storage_type.get()
97     storage = imp.Storage(session_id, persistent)
98     return imp.Settings(storage), imp.Values(storage)
99
100
101 def list_sessions():
102     """List all available session (persistent or not persistent)
103     """
104     return storage_type.get().list_sessions()
105
106
107 def delete_session(session_id):
108     """Delete a selected session, be careful, you can deleted a session
109     use by an other instance
110     :params session_id: id of session to delete
111     """
112     return storage_type.get().delete_session(session_id)
113
114
115 __all__ = (set_storage, list_sessions, delete_session)