settings.py revision 42bb3ad0094669f0b9eae95e8da5fa278175f0a5
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 64 def GetXbuddyPath(self, path_str, board): 65 prefix = "xbuddy://remote" 66 if path_str.find("trybot") < 0 and path_str.find(board) < 0: 67 xbuddy_path = "%s/%s/%s" % (prefix, board, path_str) 68 else: 69 xbuddy_path = "%s/%s" % (prefix, path_str) 70 return xbuddy_path 71