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