| # -*- coding: utf-8 -*- |
| # Copyright 2011 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Module to represent a Field in an experiment file.""" |
| |
| |
| class Field(object): |
| """Class representing a Field in an experiment file.""" |
| |
| def __init__(self, name, required, default, inheritable, description): |
| self.name = name |
| self.required = required |
| self.assigned = False |
| self.default = default |
| self._value = default |
| self.inheritable = inheritable |
| self.description = description |
| |
| def Set(self, value, parse=True): |
| if parse: |
| self._value = self._Parse(value) |
| else: |
| self._value = value |
| self.assigned = True |
| |
| def Append(self, value): |
| self._value += self._Parse(value) |
| self.assigned = True |
| |
| def _Parse(self, value): |
| return value |
| |
| def Get(self): |
| return self._value |
| |
| def GetString(self): |
| return str(self._value) |
| |
| |
| class TextField(Field): |
| """Class of text field.""" |
| |
| def __init__(self, |
| name, |
| required=False, |
| default='', |
| inheritable=False, |
| description=''): |
| super(TextField, self).__init__(name, required, default, inheritable, |
| description) |
| |
| def _Parse(self, value): |
| return str(value) |
| |
| |
| class BooleanField(Field): |
| """Class of boolean field.""" |
| |
| def __init__(self, |
| name, |
| required=False, |
| default=False, |
| inheritable=False, |
| description=''): |
| super(BooleanField, self).__init__(name, required, default, inheritable, |
| description) |
| |
| def _Parse(self, value): |
| if value.lower() == 'true': |
| return True |
| elif value.lower() == 'false': |
| return False |
| raise TypeError( |
| "Invalid value for '%s'. Must be true or false." % self.name) |
| |
| |
| class IntegerField(Field): |
| """Class of integer field.""" |
| |
| def __init__(self, |
| name, |
| required=False, |
| default=0, |
| inheritable=False, |
| description=''): |
| super(IntegerField, self).__init__(name, required, default, inheritable, |
| description) |
| |
| def _Parse(self, value): |
| return int(value) |
| |
| |
| class FloatField(Field): |
| """Class of float field.""" |
| |
| def __init__(self, |
| name, |
| required=False, |
| default=0, |
| inheritable=False, |
| description=''): |
| super(FloatField, self).__init__(name, required, default, inheritable, |
| description) |
| |
| def _Parse(self, value): |
| return float(value) |
| |
| |
| class ListField(Field): |
| """Class of list field.""" |
| |
| def __init__(self, |
| name, |
| required=False, |
| default=None, |
| inheritable=False, |
| description=''): |
| super(ListField, self).__init__(name, required, default, inheritable, |
| description) |
| |
| def _Parse(self, value): |
| return value.split() |
| |
| def GetString(self): |
| return ' '.join(self._value) |
| |
| def Append(self, value): |
| v = self._Parse(value) |
| if not self._value: |
| self._value = v |
| else: |
| self._value += v |
| self.assigned = True |
| |
| |
| class EnumField(Field): |
| """Class of enum field.""" |
| |
| def __init__(self, |
| name, |
| options, |
| required=False, |
| default='', |
| inheritable=False, |
| description=''): |
| super(EnumField, self).__init__(name, required, default, inheritable, |
| description) |
| self.options = options |
| |
| def _Parse(self, value): |
| if value not in self.options: |
| raise TypeError("Invalid enum value for field '%s'. Must be one of (%s)" % |
| (self.name, ', '.join(self.options))) |
| return str(value) |