2bc3a9f0f865114e9ccae8925e8ff0d27a3b986d
[tiramisu.git] / tiramisu / setting.py
1 # -*- coding: utf-8 -*-
2 "sets the options of the configuration objects Config object itself"
3 # Copyright (C) 2012 Team tiramisu (see AUTHORS for all contributors)
4 #
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 2 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 #
19 # The original `Config` design model is unproudly borrowed from
20 # the rough pypy's guys: http://codespeak.net/svn/pypy/dist/pypy/config/
21 # the whole pypy projet is under MIT licence
22 # ____________________________________________________________
23
24 class _const:
25     """convenient class that emulates a module
26     and builds constants (that is, unique group names)"""
27     class GroupError(TypeError): pass
28
29     def __setattr__(self, name, value):
30         if self.__dict__.has_key(name):
31             raise self.GroupError, "Can't rebind group (%s)"%name
32         self.__dict__[name] = value
33
34     def __delattr__(self, name):
35         if self.__dict__.has_key(name):
36             raise self.GroupError, "Can't unbind group (%s)"%name
37         raise NameError, name
38
39 groups = _const()
40 def populate_groups():
41     "populates the available groups in the appropriate namespaces"
42     _available_group_names = ('default', 'family', 'group')
43     _available_groups_with_a_master = ('group', )
44     class GroupName(str):
45         """allowed normal group (OptionDescription) names
46         *normal* means : groups that are not master
47         """
48         pass
49
50     class MasterGroupName(GroupName):
51         """allowed normal group (OptionDescription) names
52         *master* means : groups that have the 'master' attribute set
53         """
54         pass
55
56     groups.GroupName = GroupName
57     groups.MasterGroupName = MasterGroupName
58     # populates normal or master groups
59     for grp in _available_group_names:
60         if grp in _available_groups_with_a_master:
61             setattr(groups, grp, MasterGroupName(grp))
62         else:
63             setattr(groups, grp, GroupName(grp))
64
65 populate_groups()
66 # ____________________________________________________________
67
68 class Setting():
69     "``Config()``'s configuration options"
70     # properties attribute: the name of a property enables this property
71     properties = ['hidden', 'disabled']
72     # overrides the validations in the acces of the option values
73     permissive = []
74     # a mandatory option must have a value that is not None
75     mandatory = True
76     frozen = True
77     # enables validation function for options if set
78     validator = False
79     # generic owner. 'default' is the general config owner after init time
80     owner = 'user'
81     # ____________________________________________________________
82     # properties methods
83     def has_properties(self):
84         "has properties means the Config's properties attribute is not empty"
85         return bool(len(self.properties))
86
87     def has_property(self, propname):
88         """has property propname in the Config's properties attribute
89         :param property: string wich is the name of the property"""
90         return propname in self.properties
91
92     def enable_property(self, propname):
93         "puts property propname in the Config's properties attribute"
94         if propname not in self.properties:
95             self.properties.append(propname)
96
97     def disable_property(self, propname):
98         "deletes property propname in the Config's properties attribute"
99         if self.has_property(propname):
100             self.properties.remove(propname)
101
102     def set_permissive(self, permissive):
103         if not isinstance(permissive, list):
104             raise TypeError('permissive must be a list')
105         self.permissive = permissive
106
107     def read_only(self):
108         "convenience method to freeze, hidde and disable"
109         self.freeze()
110         self.disable_property('hidden')
111         self.enable_property('disabled')
112         self.mandatory = True
113         self.validator = True
114
115     def read_write(self):
116         "convenience method to freeze, hidde and disable"
117         self.freeze()
118         self.enable_property('hidden')
119         self.enable_property('disabled')
120         self.mandatory = False
121
122     def non_mandatory(self):
123         """mandatory at the Config level means that the Config raises an error
124         if a mandatory option is found"""
125         self.mandatory = False
126
127     def mandatory(self):
128         """mandatory at the Config level means that the Config raises an error
129         if a mandatory option is found"""
130         self.mandatory = True
131
132     def is_mandatory(self):
133         "all mandatory Options shall have a value"
134         return self.mandatory
135
136     def freeze(self):
137         "cannot modify the frozen `Option`'s"
138         self.frozen = True
139
140     def unfreeze(self):
141         "can modify the Options that are frozen"
142         self.frozen = False
143
144     def is_frozen(self):
145         "freeze flag at Config level"
146         return self.frozen
147
148     def set_owner(self, owner):
149         ":param owner: sets the default value for owner at the Config level"
150         self.owner = owner
151
152 # Setting is actually a singleton
153 settings = Setting()