constants heritage
[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 class _const:
24     """convenient class that emulates a module
25     and builds constants (that is, unique names)"""
26     class ConstError(TypeError): pass
27
28     def __setattr__(self, name, value):
29         if self.__dict__.has_key(name):
30             raise self.ConstError, "Can't rebind group (%s)"%name
31         self.__dict__[name] = value
32
33     def __delattr__(self, name):
34         if self.__dict__.has_key(name):
35             raise self.ConstError, "Can't unbind group (%s)"%name
36         raise NameError, name
37 # ____________________________________________________________
38 class GroupModule(_const):
39     "emulates a module to manage unique group (OptionDescription) names"
40     class GroupName(str):
41         """allowed normal group (OptionDescription) names
42         *normal* means : groups that are not master
43         """
44         pass
45     class MasterGroupName(GroupName):
46         """allowed normal group (OptionDescription) names
47         *master* means : groups that have the 'master' attribute set
48         """
49         pass
50 # setting.groups (emulates a module)
51 groups = GroupModule()
52
53 def populate_groups():
54     "populates the available groups in the appropriate namespaces"
55     _available_group_names = ('default', 'family', 'group')
56     _available_groups_with_a_master = ('group', )
57     # populates normal or master groups
58     for grp in _available_group_names:
59         if grp in _available_groups_with_a_master:
60             setattr(groups, grp, groups.MasterGroupName(grp))
61         else:
62             setattr(groups, grp, groups.GroupName(grp))
63 # names are in the module now
64 populate_groups()
65 # ____________________________________________________________
66
67 class Setting():
68     "``Config()``'s configuration options"
69     # properties attribute: the name of a property enables this property
70     properties = ['hidden', 'disabled']
71     # overrides the validations in the acces of the option values
72     permissive = []
73     # a mandatory option must have a value that is not None
74     mandatory = True
75     frozen = True
76     # enables validation function for options if set
77     validator = False
78     # generic owner. 'default' is the general config owner after init time
79     owner = 'user'
80     # ____________________________________________________________
81     # properties methods
82     def has_properties(self):
83         "has properties means the Config's properties attribute is not empty"
84         return bool(len(self.properties))
85
86     def has_property(self, propname):
87         """has property propname in the Config's properties attribute
88         :param property: string wich is the name of the property"""
89         return propname in self.properties
90
91     def enable_property(self, propname):
92         "puts property propname in the Config's properties attribute"
93         if propname not in self.properties:
94             self.properties.append(propname)
95
96     def disable_property(self, propname):
97         "deletes property propname in the Config's properties attribute"
98         if self.has_property(propname):
99             self.properties.remove(propname)
100
101     def set_permissive(self, permissive):
102         if not isinstance(permissive, list):
103             raise TypeError('permissive must be a list')
104         self.permissive = permissive
105
106     def read_only(self):
107         "convenience method to freeze, hidde and disable"
108         self.freeze()
109         self.disable_property('hidden')
110         self.enable_property('disabled')
111         self.mandatory = True
112         self.validator = True
113
114     def read_write(self):
115         "convenience method to freeze, hidde and disable"
116         self.freeze()
117         self.enable_property('hidden')
118         self.enable_property('disabled')
119         self.mandatory = False
120
121     def non_mandatory(self):
122         """mandatory at the Config level means that the Config raises an error
123         if a mandatory option is found"""
124         self.mandatory = False
125
126     def mandatory(self):
127         """mandatory at the Config level means that the Config raises an error
128         if a mandatory option is found"""
129         self.mandatory = True
130
131     def is_mandatory(self):
132         "all mandatory Options shall have a value"
133         return self.mandatory
134
135     def freeze(self):
136         "cannot modify the frozen `Option`'s"
137         self.frozen = True
138
139     def unfreeze(self):
140         "can modify the Options that are frozen"
141         self.frozen = False
142
143     def is_frozen(self):
144         "freeze flag at Config level"
145         return self.frozen
146
147     def set_owner(self, owner):
148         ":param owner: sets the default value for owner at the Config level"
149         self.owner = owner
150
151 # Setting is actually a singleton
152 settings = Setting()