LSSTApplications  11.0-13-gbb96280,12.1.rc1,12.1.rc1+1,12.1.rc1+2,12.1.rc1+5,12.1.rc1+8,12.1.rc1-1-g06d7636+1,12.1.rc1-1-g253890b+5,12.1.rc1-1-g3d31b68+7,12.1.rc1-1-g3db6b75+1,12.1.rc1-1-g5c1385a+3,12.1.rc1-1-g83b2247,12.1.rc1-1-g90cb4cf+6,12.1.rc1-1-g91da24b+3,12.1.rc1-2-g3521f8a,12.1.rc1-2-g39433dd+4,12.1.rc1-2-g486411b+2,12.1.rc1-2-g4c2be76,12.1.rc1-2-gc9c0491,12.1.rc1-2-gda2cd4f+6,12.1.rc1-3-g3391c73+2,12.1.rc1-3-g8c1bd6c+1,12.1.rc1-3-gcf4b6cb+2,12.1.rc1-4-g057223e+1,12.1.rc1-4-g19ed13b+2,12.1.rc1-4-g30492a7
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 oldStringType = str # Need to keep hold of original str type
23 from builtins import str
24 import traceback
25 
26 from .config import Field, _typeStr
27 
28 __all__ = ["ChoiceField"]
29 
30 
31 class ChoiceField(Field):
32  """
33  Defines a Config Field which allows only a set of values
34  All allowed must be of the same type.
35  Allowed values should be provided as a dict of value, doc string pairs
36 
37  """
38  def __init__(self, doc, dtype, allowed, default=None, optional=True):
39  self.allowed = dict(allowed)
40  if optional and None not in self.allowed:
41  self.allowed[None] = "Field is optional"
42 
43  if len(self.allowed) == 0:
44  raise ValueError("ChoiceFields must allow at least one choice")
45 
46  # Use standard string type if we are given a future str
47  if dtype == str:
48  dtype = oldStringType
49 
50  doc += "\nAllowed values:\n"
51  for choice, choiceDoc in self.allowed.items():
52  if choice is not None and not isinstance(choice, dtype):
53  raise ValueError("ChoiceField's allowed choice %s is of incorrect type %s. Expected %s" %
54  (choice, _typeStr(choice), _typeStr(dtype)))
55  doc += "\t%s\t%s\n" % (str(choice), choiceDoc)
56 
57  Field.__init__(self, doc=doc, dtype=dtype, default=default,
58  check=None, optional=optional)
59  self.source = traceback.extract_stack(limit=2)[0]
60 
61  def _validateValue(self, value):
62  Field._validateValue(self, value)
63  if value not in self.allowed:
64  msg = "Value {} is not allowed.\n" \
65  "\tAllowed values: [{}]".format(value, ", ".join(str(key) for key in self.allowed))
66  raise ValueError(msg)