1# -*- coding: utf-8 -*- 2# Copyright 2011 The ChromiumOS Authors 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__( 46 self, 47 name, 48 required=False, 49 default="", 50 inheritable=False, 51 description="", 52 ): 53 super(TextField, self).__init__( 54 name, required, default, inheritable, description 55 ) 56 57 def _Parse(self, value): 58 return str(value) 59 60 61class BooleanField(Field): 62 """Class of boolean field.""" 63 64 def __init__( 65 self, 66 name, 67 required=False, 68 default=False, 69 inheritable=False, 70 description="", 71 ): 72 super(BooleanField, self).__init__( 73 name, required, default, inheritable, description 74 ) 75 76 def _Parse(self, value): 77 if value.lower() == "true": 78 return True 79 elif value.lower() == "false": 80 return False 81 raise TypeError( 82 "Invalid value for '%s'. Must be true or false." % self.name 83 ) 84 85 86class IntegerField(Field): 87 """Class of integer field.""" 88 89 def __init__( 90 self, name, required=False, default=0, inheritable=False, description="" 91 ): 92 super(IntegerField, self).__init__( 93 name, required, default, inheritable, description 94 ) 95 96 def _Parse(self, value): 97 return int(value) 98 99 100class FloatField(Field): 101 """Class of float field.""" 102 103 def __init__( 104 self, name, required=False, default=0, inheritable=False, description="" 105 ): 106 super(FloatField, self).__init__( 107 name, required, default, inheritable, description 108 ) 109 110 def _Parse(self, value): 111 return float(value) 112 113 114class ListField(Field): 115 """Class of list field.""" 116 117 def __init__( 118 self, 119 name, 120 required=False, 121 default=None, 122 inheritable=False, 123 description="", 124 ): 125 super(ListField, self).__init__( 126 name, required, default, inheritable, description 127 ) 128 129 def _Parse(self, value): 130 return value.split() 131 132 def GetString(self): 133 return " ".join(self._value) 134 135 def Append(self, value): 136 v = self._Parse(value) 137 if not self._value: 138 self._value = v 139 else: 140 self._value += v 141 self.assigned = True 142 143 144class EnumField(Field): 145 """Class of enum field.""" 146 147 def __init__( 148 self, 149 name, 150 options, 151 required=False, 152 default="", 153 inheritable=False, 154 description="", 155 ): 156 super(EnumField, self).__init__( 157 name, required, default, inheritable, description 158 ) 159 self.options = options 160 161 def _Parse(self, value): 162 if value not in self.options: 163 raise TypeError( 164 "Invalid enum value for field '%s'. Must be one of (%s)" 165 % (self.name, ", ".join(self.options)) 166 ) 167 return str(value) 168