settings.py revision 0dcbc4b1714260820fd4b8d6536fbb05e139cc0f
1#!/usr/bin/python 2 3# Copyright 2011 Google Inc. All Rights Reserved. 4 5 6class Settings(object): 7 """Class representing settings (a set of fields) from an experiment file.""" 8 9 def __init__(self, name, settings_type): 10 self.name = name 11 self.settings_type = settings_type 12 self.fields = {} 13 self.parent = None 14 15 def SetParentSettings(self, settings): 16 """Set the parent settings which these settings can inherit from.""" 17 self.parent = settings 18 19 def AddField(self, field): 20 name = field.name 21 if name in self.fields: 22 raise Exception("Field %s defined previously." % name) 23 self.fields[name] = field 24 25 def SetField(self, name, value, append=False): 26 if name not in self.fields: 27 raise Exception("'%s' is not a valid field in '%s' settings" 28 % (name, self.settings_type)) 29 if append: 30 self.fields[name].Append(value) 31 else: 32 self.fields[name].Set(value) 33 34 def GetField(self, name): 35 """Get the value of a field with a given name.""" 36 if name not in self.fields: 37 raise Exception("Field '%s' not a valid field in '%s' settings." % 38 (name, self.name)) 39 field = self.fields[name] 40 if not field.assigned and field.required: 41 raise Exception("Required field '%s' not defined in '%s' settings." % 42 (name, self.name)) 43 return self.fields[name].Get() 44 45 def Inherit(self): 46 """Inherit any unset values from the parent settings.""" 47 for name in self.fields: 48 if (not self.fields[name].assigned and self.parent and 49 name in self.parent.fields and self.parent.fields[name].assigned): 50 self.fields[name].Set(self.parent.GetField(name), parse=False) 51 52 def Override(self, settings): 53 """Override settings with settings from a different object.""" 54 for name in settings.fields: 55 if name in self.fields and settings.fields[name].assigned: 56 self.fields[name].Set(settings.GetField(name), parse=False) 57 58 def Validate(self): 59 """Check that all required fields have been set.""" 60 for name in self.fields: 61 if not self.fields[name].assigned and self.fields[name].required: 62 raise Exception("Field %s is invalid." % name) 63