# Path: keyring/util/properties.py
# class ClassProperty(property):
# class NonDataProperty:
#     def __get__(self, cls, owner):
#     def __init__(self, fget):
#     def __get__(self, obj, objtype=None):
# 
# Path: keyring/backend.py
# class KeyringBackend(metaclass=KeyringBackendMeta):
#     """The abstract base class of the keyring, every backend must implement
#     this interface.
#     """
# 
#     def __init__(self):
#         self.set_properties_from_env()
# 
#     # @abc.abstractproperty
#     def priority(cls):
#         """
#         Each backend class must supply a priority, a number (float or integer)
#         indicating the priority of the backend relative to all other backends.
#         The priority need not be static -- it may (and should) vary based
#         attributes of the environment in which is runs (platform, available
#         packages, etc.).
# 
#         A higher number indicates a higher priority. The priority should raise
#         a RuntimeError with a message indicating the underlying cause if the
#         backend is not suitable for the current environment.
# 
#         As a rule of thumb, a priority between zero but less than one is
#         suitable, but a priority of one or greater is recommended.
#         """
# 
#     @properties.ClassProperty
#     @classmethod
#     def viable(cls):
#         with errors.ExceptionRaisedContext() as exc:
#             cls.priority
#         return not exc
# 
#     @classmethod
#     def get_viable_backends(cls):
#         """
#         Return all subclasses deemed viable.
#         """
#         return filter(operator.attrgetter('viable'), cls._classes)
# 
#     @properties.ClassProperty
#     @classmethod
#     def name(cls):
#         """
#         The keyring name, suitable for display.
# 
#         The name is derived from module and class name.
#         """
#         parent, sep, mod_name = cls.__module__.rpartition('.')
#         mod_name = mod_name.replace('_', ' ')
#         return ' '.join([mod_name, cls.__name__])
# 
#     def __str__(self):
#         keyring_class = type(self)
#         return "{}.{} (priority: {:g})".format(
#             keyring_class.__module__, keyring_class.__name__, keyring_class.priority
#         )
# 
#     @abc.abstractmethod
#     def get_password(self, service: str, username: str) -> Optional[str]:
#         """Get password of the username for the service"""
#         return None
# 
#     @abc.abstractmethod
#     def set_password(self, service: str, username: str, password: str) -> None:
#         """Set password for the username of the service.
# 
#         If the backend cannot store passwords, raise
#         PasswordSetError.
#         """
#         raise errors.PasswordSetError("reason")
# 
#     # for backward-compatibility, don't require a backend to implement
#     #  delete_password
#     # @abc.abstractmethod
#     def delete_password(self, service: str, username: str) -> None:
#         """Delete the password for the username of the service.
# 
#         If the backend cannot delete passwords, raise
#         PasswordDeleteError.
#         """
#         raise errors.PasswordDeleteError("reason")
# 
#     # for backward-compatibility, don't require a backend to implement
#     #  get_credential
#     # @abc.abstractmethod
#     def get_credential(
#         self,
#         service: str,
#         username: Optional[str],
#     ) -> Optional[credentials.Credential]:
#         """Gets the username and password for the service.
#         Returns a Credential instance.
# 
#         The *username* argument is optional and may be omitted by
#         the caller or ignored by the backend. Callers must use the
#         returned username.
#         """
#         # The default implementation requires a username here.
#         if username is not None:
#             password = self.get_password(service, username)
#             if password is not None:
#                 return credentials.SimpleCredential(username, password)
#         return None
# 
#     def set_properties_from_env(self):
#         """For all KEYRING_PROPERTY_* env var, set that property."""
# 
#         def parse(item):
#             key, value = item
#             pre, sep, name = key.partition('KEYRING_PROPERTY_')
#             return sep and (name.lower(), value)
# 
#         props = filter(None, map(parse, os.environ.items()))
#         for name, value in props:
#             setattr(self, name, value)
# 
# Path: keyring/credentials.py
# class SimpleCredential(Credential):
#     """Simple credentials implementation"""
# 
#     def __init__(self, username, password):
#         self._username = username
#         self._password = password
# 
#     @property
#     def username(self):
#         return self._username
# 
#     @property
#     def password(self):
#         return self._password
# 
# Path: keyring/errors.py
# class InitError(KeyringError):
#     """Raised when the keyring could not be initialised"""
# 
# class PasswordDeleteError(KeyringError):
#     """Raised when the password can't be deleted."""
# 
# class ExceptionRaisedContext:
#     """
#     An exception-trapping context that indicates whether an exception was
#     raised.
#     """
# 
#     def __init__(self, ExpectedException=Exception):
#         self.ExpectedException = ExpectedException
#         self.exc_info = None
# 
#     def __enter__(self):
#         self.exc_info = object.__new__(ExceptionInfo)
#         return self.exc_info
# 
#     def __exit__(self, *exc_info):
#         self.exc_info.__init__(*exc_info)
#         return self.exc_info.type and issubclass(
#             self.exc_info.type, self.ExpectedException
#         )
# 
# class KeyringLocked(KeyringError):
#     """Raised when the keyring failed unlocking"""


from contextlib import closing
from ..util import properties
from ..backend import KeyringBackend
from ..credentials import SimpleCredential
from ..errors import (
    InitError,
    PasswordDeleteError,
    ExceptionRaisedContext,
    KeyringLocked,
)
import logging
    import secretstorage
    import secretstorage.exceptions as exceptions


try:
except ImportError:
    pass
except AttributeError:
    # See https://github.com/jaraco/keyring/issues/296
    pass

log = logging.getLogger(__name__)


class Keyring(KeyringBackend):
    """Secret Service Keyring"""

    appid = 'Python keyring library'


# Path: keyring/util/properties.py
# class ClassProperty(property):
# class NonDataProperty:
#     def __get__(self, cls, owner):
#     def __init__(self, fget):
#     def __get__(self, obj, objtype=None):
# 
# Path: keyring/backend.py
# class KeyringBackend(metaclass=KeyringBackendMeta):
#     """The abstract base class of the keyring, every backend must implement
#     this interface.
#     """
# 
#     def __init__(self):
#         self.set_properties_from_env()
# 
#     # @abc.abstractproperty
#     def priority(cls):
#         """
#         Each backend class must supply a priority, a number (float or integer)
#         indicating the priority of the backend relative to all other backends.
#         The priority need not be static -- it may (and should) vary based
#         attributes of the environment in which is runs (platform, available
#         packages, etc.).
# 
#         A higher number indicates a higher priority. The priority should raise
#         a RuntimeError with a message indicating the underlying cause if the
#         backend is not suitable for the current environment.
# 
#         As a rule of thumb, a priority between zero but less than one is
#         suitable, but a priority of one or greater is recommended.
#         """
# 
#     @properties.ClassProperty
#     @classmethod
#     def viable(cls):
#         with errors.ExceptionRaisedContext() as exc:
#             cls.priority
#         return not exc
# 
#     @classmethod
#     def get_viable_backends(cls):
#         """
#         Return all subclasses deemed viable.
#         """
#         return filter(operator.attrgetter('viable'), cls._classes)
# 
#     @properties.ClassProperty
#     @classmethod
#     def name(cls):
#         """
#         The keyring name, suitable for display.
# 
#         The name is derived from module and class name.
#         """
#         parent, sep, mod_name = cls.__module__.rpartition('.')
#         mod_name = mod_name.replace('_', ' ')
#         return ' '.join([mod_name, cls.__name__])
# 
#     def __str__(self):
#         keyring_class = type(self)
#         return "{}.{} (priority: {:g})".format(
#             keyring_class.__module__, keyring_class.__name__, keyring_class.priority
#         )
# 
#     @abc.abstractmethod
#     def get_password(self, service: str, username: str) -> Optional[str]:
#         """Get password of the username for the service"""
#         return None
# 
#     @abc.abstractmethod
#     def set_password(self, service: str, username: str, password: str) -> None:
#         """Set password for the username of the service.
# 
#         If the backend cannot store passwords, raise
#         PasswordSetError.
#         """
#         raise errors.PasswordSetError("reason")
# 
#     # for backward-compatibility, don't require a backend to implement
#     #  delete_password
#     # @abc.abstractmethod
#     def delete_password(self, service: str, username: str) -> None:
#         """Delete the password for the username of the service.
# 
#         If the backend cannot delete passwords, raise
#         PasswordDeleteError.
#         """
#         raise errors.PasswordDeleteError("reason")
# 
#     # for backward-compatibility, don't require a backend to implement
#     #  get_credential
#     # @abc.abstractmethod
#     def get_credential(
#         self,
#         service: str,
#         username: Optional[str],
#     ) -> Optional[credentials.Credential]:
#         """Gets the username and password for the service.
#         Returns a Credential instance.
# 
#         The *username* argument is optional and may be omitted by
#         the caller or ignored by the backend. Callers must use the
#         returned username.
#         """
#         # The default implementation requires a username here.
#         if username is not None:
#             password = self.get_password(service, username)
#             if password is not None:
#                 return credentials.SimpleCredential(username, password)
#         return None
# 
#     def set_properties_from_env(self):
#         """For all KEYRING_PROPERTY_* env var, set that property."""
# 
#         def parse(item):
#             key, value = item
#             pre, sep, name = key.partition('KEYRING_PROPERTY_')
#             return sep and (name.lower(), value)
# 
#         props = filter(None, map(parse, os.environ.items()))
#         for name, value in props:
#             setattr(self, name, value)
# 
# Path: keyring/credentials.py
# class SimpleCredential(Credential):
#     """Simple credentials implementation"""
# 
#     def __init__(self, username, password):
#         self._username = username
#         self._password = password
# 
#     @property
#     def username(self):
#         return self._username
# 
#     @property
#     def password(self):
#         return self._password
# 
# Path: keyring/errors.py
# class InitError(KeyringError):
#     """Raised when the keyring could not be initialised"""
# 
# class PasswordDeleteError(KeyringError):
#     """Raised when the password can't be deleted."""
# 
# class ExceptionRaisedContext:
#     """
#     An exception-trapping context that indicates whether an exception was
#     raised.
#     """
# 
#     def __init__(self, ExpectedException=Exception):
#         self.ExpectedException = ExpectedException
#         self.exc_info = None
# 
#     def __enter__(self):
#         self.exc_info = object.__new__(ExceptionInfo)
#         return self.exc_info
# 
#     def __exit__(self, *exc_info):
#         self.exc_info.__init__(*exc_info)
#         return self.exc_info.type and issubclass(
#             self.exc_info.type, self.ExpectedException
#         )
# 
# class KeyringLocked(KeyringError):
#     """Raised when the keyring failed unlocking"""


# Path: keyring/backends/SecretService.py
from contextlib import closing
from ..util import properties
from ..backend import KeyringBackend
from ..credentials import SimpleCredential
from ..errors import (
    InitError,
    PasswordDeleteError,
    ExceptionRaisedContext,
    KeyringLocked,
)
import logging
    import secretstorage
    import secretstorage.exceptions as exceptions



try:
except ImportError:
    pass
except AttributeError:
    # See https://github.com/jaraco/keyring/issues/296
    pass

log = logging.getLogger(__name__)


class Keyring(KeyringBackend):
    """Secret Service Keyring"""

    appid = 'Python keyring library'


    @properties.ClassProperty