[Bio] / KahApp / KahConfigSection.py Repository:
ViewVC logotype

Annotation of /KahApp/KahConfigSection.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (view) (download) (as text)

1 : efrank 1.1 #--------------------------------------------------------------
2 :     #
3 :     # KahConfigSection
4 :     # Holds configuration values and is passed to a module when it is
5 :     # called by the framework. See KahConfigMgr.
6 :     #
7 :     # Why are there int, float, string methods rather than using
8 :     # some kind of genericity? A) So that this will work in other
9 :     # languages. B) Prior experience shows that if it isn't clear
10 :     # what value type is expected for config variables, the system
11 :     # does not scale and you fight mis-configuration errors. So,
12 :     # this is meant to be a straight jacket over top of pythons Configure.
13 :     #
14 :     #
15 :     # HISTORY:
16 :     # 07Jul04 efrank first version
17 :     #
18 :     # BUGS:
19 :     #--------------------------------------------------------------
20 :    
21 : efrank 1.2 import re
22 : efrank 1.1
23 :     class KahConfigSection:
24 :     """
25 :     Holds the configuration informtion (paramter values) associated
26 :     with one module in the application
27 :     """
28 :    
29 :     #------------------------------------------------------------------------
30 :     def __init__( self, name ):
31 :     #------------------------------------------------------------------------
32 :     """
33 :     @type sectionName: string
34 :     """
35 :    
36 :     self.__sectionName = name
37 : efrank 1.2 self.__dict = {} #need to rewrite to replace tuple with obj
38 : efrank 1.1 return
39 :    
40 :    
41 :     #------------------------------------------------------------------------
42 :     def name( self):
43 :     #------------------------------------------------------------------------
44 :     return self.__sectionName
45 :    
46 :    
47 :     #------------------------------------------------------------------------
48 :     def wasOverridden( self, keyName):
49 :     #------------------------------------------------------------------------
50 :     """
51 :     Returns 0/1, was this param changed from its defaultValue?
52 :     """
53 :    
54 :     return self.__dict[keyName][3]
55 :    
56 :     #------------------------------------------------------------------------
57 :     def override(self, keyName, value):
58 :     #------------------------------------------------------------------------
59 :     """
60 :     Used by the KahConfigMgr to override values in this ConfigSection.
61 :     """
62 :    
63 :     v=self.__dict[keyName]
64 :     v[2] = apply( v[1], [value] )
65 :     v[3]=1
66 :    
67 :     return
68 :    
69 :     #------------------------------------------------------------------------
70 :     def getInt( self, keyName):
71 :     #------------------------------------------------------------------------
72 :     """
73 :     Gets integral value.
74 :     """
75 :    
76 :     return self.__get( "int", keyName)
77 :    
78 :     #------------------------------------------------------------------------
79 :     def getFloat( self, keyName):
80 :     #------------------------------------------------------------------------
81 :     """
82 :     Gets float value.
83 :     """
84 :    
85 :     return self.__get( "float", keyName)
86 :    
87 :     #------------------------------------------------------------------------
88 :     def getString( self, keyName):
89 :     #------------------------------------------------------------------------
90 :     """
91 :     Gets string value.
92 :     """
93 :    
94 :     return self.__get( "str", keyName)
95 :    
96 :     #------------------------------------------------------------------------
97 : efrank 1.2 def getStringList( self, keyName):
98 :     #------------------------------------------------------------------------
99 :     """
100 :     Gets string value.
101 :     """
102 :    
103 :     return self.__get( "stringList", keyName)
104 :    
105 :     #------------------------------------------------------------------------
106 :     def regInt( self, keyName, defaultVal, docString="No doc string" ):
107 : efrank 1.1 #------------------------------------------------------------------------
108 :     """
109 :     Register an integer with this keyName and default value.
110 :    
111 :     @type keyName: string
112 :     @type defaultValue: integer
113 :     """
114 :    
115 : efrank 1.2 self.__register( "int", int, keyName, defaultVal, docString)
116 : efrank 1.1 return
117 :    
118 :     #------------------------------------------------------------------------
119 : efrank 1.2 def regFloat( self, keyName, defaultVal, docString="No doc string" ):
120 : efrank 1.1 #------------------------------------------------------------------------
121 :    
122 :     """
123 :     Register a float with this keyName and default value.
124 :    
125 :     @type keyName: string
126 :     @type defaultValue: float
127 :     """
128 :    
129 : efrank 1.2 self.__register( "float", float, keyName, defaultVal, docString)
130 : efrank 1.1 return
131 :    
132 :     #------------------------------------------------------------------------
133 : efrank 1.2 def regString( self, keyName, defaultVal, docString="No doc string" ):
134 : efrank 1.1 #------------------------------------------------------------------------
135 :    
136 :     """
137 :     Register an integer with this keyName and default value.
138 :    
139 :     @type keyName: string
140 :     @type defaultValue: string
141 :     """
142 :    
143 : efrank 1.2 self.__register( "str", str, keyName, defaultVal, docString)
144 :     return
145 :    
146 :     #------------------------------------------------------------------------
147 :     def regStringList( self, keyName, defaultVal, docString="No doc string" ):
148 :     #------------------------------------------------------------------------
149 :    
150 :     """
151 :     Register an integer with this keyName and default value.
152 :    
153 :     @type keyName: string
154 :     @type defaultValue: list of strings
155 :     """
156 :    
157 :     s = "%s" % defaultVal
158 :    
159 :     self.__register( "stringList", self.__stringList, keyName, s, docString)
160 : efrank 1.1 return
161 :    
162 :    
163 :     #------------------------------------------------------------------------
164 : efrank 1.2 def __register( self, type, cast, keyName, defaultValue, docString="No doc string."):
165 : efrank 1.1 #------------------------------------------------------------------------
166 :     """
167 :     Register a datum with this keyName and default value.
168 :     Remember the type.
169 :    
170 :     @type keyName: string
171 :     @type defaultValue: integer
172 :     """
173 :    
174 :     if self.__dict.has_key( keyName ):
175 :     raise Exception, "Duplicated key"
176 :     else:
177 :     # record value and 0/1 flag for "was overridden"
178 : efrank 1.2 self.__dict[keyName] = [type, cast, apply(cast, [defaultValue]), 0, docString]
179 : efrank 1.1
180 :     return
181 :    
182 :    
183 :     #------------------------------------------------------------------------
184 :     def __get( self, type, keyName):
185 :     #------------------------------------------------------------------------
186 :     """
187 :     Gets value of specified name and type.
188 :     """
189 :    
190 :     v = self.__dict[keyName] #can throw
191 :     if ( v[0] == type):
192 :     return v[2]
193 :     else:
194 :     raise Exception, "Wrong type"
195 :    
196 :     #------------------------------------------------------------------------
197 : efrank 1.2 def __stringList( self, arg):
198 :     #------------------------------------------------------------------------
199 :     """
200 :     Gets value of specified name and type.
201 :     """
202 :    
203 :     l = []
204 :    
205 :     #drop [ and ] and whitespace
206 :     m=re.search(r'\s*\[\s*(.*)\s*\]\s*', arg)
207 :     if (not m):
208 :     raise TypeError
209 :    
210 :     listguts =m.group(1)
211 :    
212 :     if ""==listguts:
213 :     return l
214 :    
215 :     # ignore problem that strings could have , in them
216 :    
217 :     rawElems = listguts.split(",")
218 :    
219 :     # strings still have " or ' in them.
220 :    
221 :     for e in rawElems:
222 :     m=re.search(r'\w*\"(.*)\"\w*', e)
223 :     if m:
224 :     l.append( m.group(1))
225 :     else:
226 :     m=re.search(r"\w*\'(.*)\'\w*", e)
227 :     if m:
228 :     l.append(m.group(1))
229 :     else:
230 :     raise TypeError, arg
231 :    
232 :    
233 :     return l
234 :    
235 :    
236 :     #------------------------------------------------------------------------
237 : efrank 1.1 def dump( self ):
238 :     #------------------------------------------------------------------------
239 :     """
240 :     Dump for debugging.
241 :     """
242 :    
243 :     for k in self.__dict.keys():
244 :     print k, self.__dict[k]
245 :     return
246 :    
247 :    
248 :     #------------------------------------------------------------------------
249 :     if (__name__ == "__main__"):
250 :     #------------------------------------------------------------------------
251 :     print "Testing KahConfigSection.py"
252 :    
253 :     cfg = KahConfigSection( "testSection" )
254 :     print "Made section named [testSection] :", cfg.name()
255 :    
256 :     cfg.regInt( "int1", 1 )
257 :     cfg.regInt( "int2", 2 )
258 :     cfg.regFloat( "float1", 10.0 )
259 :     cfg.regFloat( "float2", 20.0)
260 :     cfg.regString( "string1", "theString1")
261 :     cfg.regString( "string2", "theString2")
262 :     cfg.dump()
263 :    
264 :     # try cross-wire
265 :    
266 :     try:
267 :     cfg.regInt( "int3", "gork")
268 :     print "Error: regInt from string"
269 :     except:
270 :     pass
271 :    
272 :     try:
273 :     cfg.regFloat( "float3", "gork")
274 :     print "Error: regFloat from string"
275 :     except:
276 :     pass
277 :    
278 :     try:
279 :     cfg.regString( "string3", self ) # a funky way to get a non stringable
280 :     print "Error: regString from self"
281 :     except:
282 :     pass
283 :    
284 :    
285 :     print "done test"
286 :    
287 :     ##
288 :     # Now override some
289 :     ##
290 :    
291 :     cfg.override( "int1", 11)
292 :     cfg.override( "float1", "110.0")
293 :     cfg.override( "string1", "theNewString1")
294 :    
295 :     cfg.dump()
296 :    
297 :     ##
298 :     # try some gets
299 :     ##
300 :    
301 :     print cfg.getInt( "int1")
302 :     print cfg.getInt( "int2")
303 :     print cfg.getFloat( "float1")
304 :     print cfg.getFloat( "float2")
305 :     print cfg.getString( "string1")
306 :     print cfg.getString( "string2")
307 :    
308 :     try:
309 :     cfg.getInt( "feh" )
310 :     print "getInt should have failed"
311 :     except:
312 :     pass
313 :    
314 :     try:
315 :     cfg.getInt( "float1" )
316 :     print "getInt should have failed"
317 :     except:
318 :     pass
319 :    
320 :     try:
321 :     cfg.getFloat( "feh" )
322 :     print "getFloat shhould have failed"
323 :     except:
324 :     pass
325 :    
326 :     try:
327 :     cfg.getFloat( "int1" )
328 :     print "getFloat shhould have failed"
329 :     except:
330 :     pass
331 :    
332 :     try:
333 :     cfg.getString( "feh" )
334 :     print "getString shhould have failed"
335 :     except:
336 :     pass
337 :    
338 :    
339 :     try:
340 :     cfg.getString( "int1" )
341 :     print "getString should have failed"
342 :     except:
343 :     pass
344 :    
345 :    

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3