1# -*- coding: utf-8 -*- 2# Copyright 2011 The Chromium OS Authors. All rights reserved. 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5 6"""Module to represent a Field in an experiment file.""" 7 8 9class Field(object): 10 """Class representing a Field in an experiment file.""" 11 12 def __init__(self, name, required, default, inheritable, description): 13 self.name = name 14 self.required = required 15 self.assigned = False 16 self.default = default 17 self._value = default 18 self.inheritable = inheritable 19 self.description = description 20 21 def Set(self, value, parse=True): 22 if parse: 23 self._value = self._Parse(value) 24 else: 25 self._value = value 26 self.assigned = True 27 28 def Append(self, value): 29 self._value += self._Parse(value) 30 self.assigned = True 31 32 def _Parse(self, value): 33 return value 34 35 def Get(self): 36 return self._value 37 38 def GetString(self): 39 return str(self._value) 40 41 42class TextField(Field): 43 """Class of text field.""" 44 45 def __init__(self, 46 name, 47 required=False, 48 default='', 49 inheritable=False, 50 description=''): 51 super(TextField, self).__init__(name, required, default, inheritable, 52 description) 53 54 def _Parse(self, value): 55 return str(value) 56 57 58class BooleanField(Field): 59 """Class of boolean field.""" 60 61 def __init__(self, 62 name, 63 required=False, 64 default=False, 65 inheritable=False, 66 description=''): 67 super(BooleanField, self).__init__(name, required, default, inheritable, 68 description) 69 70 def _Parse(self, value): 71 if value.lower() == 'true': 72 return True 73 elif value.lower() == 'false': 74 return False 75 raise TypeError( 76 "Invalid value for '%s'. Must be true or false." % self.name) 77 78 79class IntegerField(Field): 80 """Class of integer field.""" 81 82 def __init__(self, 83 name, 84 required=False, 85 default=0, 86 inheritable=False, 87 description=''): 88 super(IntegerField, self).__init__(name, required, default, inheritable, 89 description) 90 91 def _Parse(self, value): 92 return int(value) 93 94 95class FloatField(Field): 96 """Class of float field.""" 97 98 def __init__(self, 99 name, 100 required=False, 101 default=0, 102 inheritable=False, 103 description=''): 104 super(FloatField, self).__init__(name, required, default, inheritable, 105 description) 106 107 def _Parse(self, value): 108 return float(value) 109 110 111class ListField(Field): 112 """Class of list field.""" 113 114 def __init__(self, 115 name, 116 required=False, 117 default=None, 118 inheritable=False, 119 description=''): 120 super(ListField, self).__init__(name, required, default, inheritable, 121 description) 122 123 def _Parse(self, value): 124 return value.split() 125 126 def GetString(self): 127 return ' '.join(self._value) 128 129 def Append(self, value): 130 v = self._Parse(value) 131 if not self._value: 132 self._value = v 133 else: 134 self._value += v 135 self.assigned = True 136 137 138class EnumField(Field): 139 """Class of enum field.""" 140 141 def __init__(self, 142 name, 143 options, 144 required=False, 145 default='', 146 inheritable=False, 147 description=''): 148 super(EnumField, self).__init__(name, required, default, inheritable, 149 description) 150 self.options = options 151 152 def _Parse(self, value): 153 if value not in self.options: 154 raise TypeError("Invalid enum value for field '%s'. Must be one of (%s)" % 155 (self.name, ', '.join(self.options))) 156 return str(value) 157