| #!/usr/bin/python |
| |
| # Copyright 2011 Google Inc. All Rights Reserved. |
| |
| |
| class Settings(object): |
| """Class representing settings (a set of fields) from an experiment file.""" |
| |
| def __init__(self, name, settings_type): |
| self.name = name |
| self.settings_type = settings_type |
| self.fields = {} |
| self.parent = None |
| |
| def SetParentSettings(self, settings): |
| """Set the parent settings which these settings can inherit from.""" |
| self.parent = settings |
| |
| def AddField(self, field): |
| name = field.name |
| if name in self.fields: |
| raise Exception("Field %s defined previously." % name) |
| self.fields[name] = field |
| |
| def SetField(self, name, value, append=False): |
| if name not in self.fields: |
| raise Exception("'%s' is not a valid field in '%s' settings" |
| % (name, self.settings_type)) |
| if append: |
| self.fields[name].Append(value) |
| else: |
| self.fields[name].Set(value) |
| |
| def GetField(self, name): |
| """Get the value of a field with a given name.""" |
| if name not in self.fields: |
| raise Exception("Field '%s' not a valid field in '%s' settings." % |
| (name, self.name)) |
| field = self.fields[name] |
| if not field.assigned and field.required: |
| raise Exception("Required field '%s' not defined in '%s' settings." % |
| (name, self.name)) |
| return self.fields[name].Get() |
| |
| def Inherit(self): |
| """Inherit any unset values from the parent settings.""" |
| for name in self.fields: |
| if (not self.fields[name].assigned and self.parent and |
| name in self.parent.fields and self.parent.fields[name].assigned): |
| self.fields[name].Set(self.parent.GetField(name), parse=False) |
| |
| def Override(self, settings): |
| """Override settings with settings from a different object.""" |
| for name in settings.fields: |
| if name in self.fields and settings.fields[name].assigned: |
| self.fields[name].Set(settings.GetField(name), parse=False) |
| |
| def Validate(self): |
| """Check that all required fields have been set.""" |
| for name in self.fields: |
| if not self.fields[name].assigned and self.fields[name].required: |
| raise Exception("Field %s is invalid." % name) |