Added prototype support for custom keyring backends.

This commit is contained in:
facetoe 2015-01-25 20:07:37 +08:00
parent f9fe7653b3
commit 215b85e431

View File

@ -2,6 +2,7 @@ from i3pystatus.core.util import KeyConstraintDict
from i3pystatus.core.exceptions import ConfigKeyError, ConfigMissingError from i3pystatus.core.exceptions import ConfigKeyError, ConfigMissingError
import inspect import inspect
import logging import logging
import getpass
class SettingsBase: class SettingsBase:
@ -19,6 +20,7 @@ class SettingsBase:
""" """
__PROTECTED_SETTINGS = ["password", "email", "username"] __PROTECTED_SETTINGS = ["password", "email", "username"]
settings = ( settings = (
("log_level", "Set to true to log error to .i3pystatus-<pid> file"), ("log_level", "Set to true to log error to .i3pystatus-<pid> file"),
) )
@ -45,7 +47,6 @@ class SettingsBase:
return kwargs return kwargs
def merge_with_parents_settings(): def merge_with_parents_settings():
settings = tuple() settings = tuple()
# getmro returns base classes according to Method Resolution Order # getmro returns base classes according to Method Resolution Order
@ -76,22 +77,27 @@ class SettingsBase:
self.logger = logging.getLogger(self.__name__) self.logger = logging.getLogger(self.__name__)
self.logger.setLevel(self.log_level) self.logger.setLevel(self.log_level)
self.set_protected_settings()
self.init()
def set_protected_settings(self):
for setting_name in self.__PROTECTED_SETTINGS: for setting_name in self.__PROTECTED_SETTINGS:
if hasattr(self, setting_name) and not getattr(self, setting_name): if hasattr(self, setting_name) and not getattr(self, setting_name):
print("%s.%s" % (self.__name__, setting_name))
setting = self.get_protected_setting("%s.%s" % (self.__name__, setting_name)) setting = self.get_protected_setting("%s.%s" % (self.__name__, setting_name))
if setting: if setting:
setattr(self, setting_name, setting) setattr(self, setting_name, setting)
self.init() def get_protected_setting(self, setting_name):
# If a custom keyring backend has been defined, use it.
if hasattr(self, 'keyring_backend') and self.keyring_backend:
return self.keyring_backend.get_password(setting_name, getpass.getuser())
@staticmethod # Otherwise try and use defualt keyring.
def get_protected_setting(setting_name):
import getpass
try: try:
import keyring import keyring
except ImportError: except ImportError:
keyring = None pass
else: else:
return keyring.get_password(setting_name, getpass.getuser()) return keyring.get_password(setting_name, getpass.getuser())