config.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. from .exception import MissingRequiredError, ReadOnlyError
  2. __all__ = ("Configuration",)
  3. class Configuration:
  4. def __init__(self, settings, parent=None):
  5. self.__dict__["_parent"] = parent
  6. self.__dict__["_settings"] = {}
  7. for setting in settings:
  8. self._settings[setting.name] = setting
  9. def validate_setting(self, name):
  10. if name in self._settings:
  11. setting = self._settings[name]
  12. if setting.required and not setting.established:
  13. if self._parent:
  14. self._parent.validate_setting(name)
  15. else:
  16. raise MissingRequiredError(name)
  17. elif self._parent:
  18. self._parent.validate_setting(name)
  19. else:
  20. raise AttributeError('No such setting "%s"' % name)
  21. def validate(self):
  22. for name in self:
  23. self.validate_setting(name)
  24. def __getattr__(self, name):
  25. if name in self._settings:
  26. if self._settings[name].established:
  27. return self._settings[name].value
  28. elif self._parent:
  29. return getattr(self._parent, name)
  30. else:
  31. return self._settings[name].default
  32. elif self._parent:
  33. return getattr(self._parent, name)
  34. else:
  35. raise AttributeError('No such setting "%s"' % name)
  36. def __getitem__(self, key):
  37. return getattr(self, key)
  38. def __setattr__(self, name, value):
  39. raise ReadOnlyError("Cannot change the value of settings")
  40. def __setitem__(self, key, value):
  41. setattr(self, key, value)
  42. def __delattr__(self, name):
  43. raise ReadOnlyError("Cannot delete settings")
  44. def __delitem__(self, key):
  45. delattr(self, key)
  46. def __iter__(self):
  47. all_names = set(self._settings.keys())
  48. if self._parent:
  49. all_names.update(iter(self._parent))
  50. return iter(all_names)
  51. def __len__(self):
  52. return len(list(iter(self)))
  53. def __contains__(self, item):
  54. return item in list(iter(self))
  55. def __str__(self): # pragma: no cover
  56. return "Configuration(%s)" % (
  57. ", ".join([u"%s=%s" % (name, repr(self[name])) for name in self])
  58. )
  59. def __repr__(self): # pragma: no cover
  60. return "<%s>" % str(self)