LSSTApplications  10.0+286,10.0+36,10.0+46,10.0-2-g4f67435,10.1+152,10.1+37,11.0,11.0+1,11.0-1-g47edd16,11.0-1-g60db491,11.0-1-g7418c06,11.0-2-g04d2804,11.0-2-g68503cd,11.0-2-g818369d,11.0-2-gb8b8ce7
LSSTDataManagementBasePackage
choiceField.py
Go to the documentation of this file.
1 #
2 # LSST Data Management System
3 # Copyright 2008, 2009, 2010 LSST Corporation.
4 #
5 # This product includes software developed by the
6 # LSST Project (http://www.lsst.org/).
7 #
8 # This program is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
12 #
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the LSST License Statement and
19 # the GNU General Public License along with this program. If not,
20 # see <http://www.lsstcorp.org/LegalNotices/>.
21 #
22 import traceback
23 
24 from .config import Field, _typeStr
25 
26 __all__ = ["ChoiceField"]
27 
28 class ChoiceField(Field):
29  """
30  Defines a Config Field which allows only a set of values
31  All allowed must be of the same type.
32  Allowed values should be provided as a dict of value, doc string pairs
33 
34  """
35  def __init__(self, doc, dtype, allowed, default=None, optional=True):
36  self.allowed = dict(allowed)
37  if optional and None not in self.allowed:
38  self.allowed[None]="Field is optional"
39 
40  if len(self.allowed)==0:
41  raise ValueError("ChoiceFields must allow at least one choice")
42 
43  doc += "\nAllowed values:\n"
44  for choice, choiceDoc in self.allowed.iteritems():
45  if choice is not None and not isinstance(choice, dtype):
46  raise ValueError("ChoiceField's allowed choice %s is of incorrect type %s. Expected %s"%\
47  (choice, _typeStr(choice), _typeStr(dtype)))
48  doc += "\t%s\t%s\n"%(str(choice), choiceDoc)
49 
50  Field.__init__(self, doc=doc, dtype=dtype, default=default,
51  check=None, optional=optional)
52  self.source = traceback.extract_stack(limit=2)[0]
53 
54  def _validateValue(self, value):
55  Field._validateValue(self, value)
56  if value not in self.allowed:
57  allowedStr = "{%s"%self.allowed.keys()[0]
58  for x in self.allowed:
59  allowedStr += ", %s"%x
60  allowedStr+="}"
61  msg = "Value %s is not allowed.\n\tAllowed values: %s"%\
62  (value, allowedStr)
63  raise ValueError(msg)