setting.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. # pylint: disable=W0401,W0223
  2. import re
  3. from .datatype import *
  4. from .exception import NamingError
  5. __all__ = (
  6. "Setting",
  7. "StringSetting",
  8. "IntegerSetting",
  9. "FloatSetting",
  10. "BooleanSetting",
  11. "ListSetting",
  12. "ChoiceSetting",
  13. )
  14. class Setting(DataType):
  15. RE_NAME = re.compile(r"^[a-z](?:[a-z0-9]|[_](?![_]))*[a-z0-9]$")
  16. def __init__(self, name, default=None, required=False):
  17. if Setting.RE_NAME.match(name):
  18. self.name = name
  19. else:
  20. raise NamingError(name)
  21. self._value = None
  22. self.default = self.sanitize(default)
  23. self.required = required
  24. self.established = False
  25. @property
  26. def value(self):
  27. return self._value
  28. @value.setter
  29. def value(self, value):
  30. self._value = self.sanitize(value)
  31. self.established = True
  32. def __str__(self): # pragma: no cover
  33. return unicode(self.name)
  34. def __repr__(self): # pragma: no cover
  35. return "<%s(%s=%s)>" % (
  36. self.__class__.__name__,
  37. self.name,
  38. self.value if self.established else "",
  39. )
  40. class StringSetting(Setting, String):
  41. pass
  42. class IntegerSetting(Setting, Integer):
  43. pass
  44. class FloatSetting(Setting, Float):
  45. pass
  46. class BooleanSetting(Setting, Boolean):
  47. pass
  48. class ListSetting(Setting, List):
  49. def __init__(self, name, subtype, **kwargs):
  50. List.__init__(self, subtype)
  51. Setting.__init__(self, name, **kwargs)
  52. class ChoiceSetting(Setting, Choice):
  53. def __init__(self, name, choices, subtype=None, **kwargs):
  54. Choice.__init__(self, choices, subtype=subtype)
  55. Setting.__init__(self, name, **kwargs)