# # Copyright (C) 2017 Codethink Limited # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library. If not, see . # # Authors: # Tristan Van Berkom from .. import _yaml from .._exceptions import LoadError, LoadErrorReason from .option import Option, OPTION_SYMBOLS # OptionEnum # # An enumeration project option # class OptionEnum(Option): OPTION_TYPE = 'enum' def load(self, node, allow_default_definition=True): super().load(node) valid_symbols = OPTION_SYMBOLS + ['values'] if allow_default_definition: valid_symbols += ['default'] _yaml.node_validate(node, valid_symbols) self.values = node.get_sequence('values', default=[]).as_str_list() if not self.values: raise LoadError(LoadErrorReason.INVALID_DATA, "{}: No values specified for {} option '{}'" .format(_yaml.node_get_provenance(node), self.OPTION_TYPE, self.name)) # Allow subclass to define the default value self.value = self.load_default_value(node) def load_value(self, node, *, transform=None): self.value = node.get_scalar(self.name).as_str() if transform: self.value = transform(self.value) self.validate(self.value, _yaml.node_get_provenance(node, self.name)) def set_value(self, value): self.validate(value) self.value = value def get_value(self): return self.value def validate(self, value, provenance=None): if value not in self.values: prefix = "" if provenance: prefix = "{}: ".format(provenance) raise LoadError(LoadErrorReason.INVALID_DATA, "{}Invalid value for {} option '{}': {}\n" .format(prefix, self.OPTION_TYPE, self.name, value) + "Valid values: {}".format(", ".join(self.values))) def load_default_value(self, node): value = node.get_scalar('default').as_str() self.validate(value, _yaml.node_get_provenance(node, 'default')) return value