'Constructor
Args:
filename: string, File name of client secrets.
scope: string or list of strings, scope(s) of the credentials being
requested.
message: string, A friendly string to display to the user if the
clientsecrets file is missing or invalid. The message may contain HTML and
will be presented on the web interface for any method that uses the
decorator.
cache: An optional cache service client that implements get() and set()
methods. See clientsecrets.loadfile() for details.'

@util.positional(3)
def __init__(self, filename, scope, message=None, cache=None):

    try:
        (client_type, client_info) = clientsecrets.loadfile(filename, cache=cache)
        if (client_type not in [clientsecrets.TYPE_WEB, clientsecrets.TYPE_INSTALLED]):
            raise InvalidClientSecretsError("OAuth2Decorator    doesn't    support    this    OAuth    2.0    flow.")
        super(OAuth2DecoratorFromClientSecrets, self).__init__(client_info['client_id'], client_info['client_secret'], scope, auth_uri=client_info['auth_uri'], token_uri=client_info['token_uri'], message=message)
    except clientsecrets.InvalidClientSecretsError:
        self._in_error = True
    if (message is not None):
        self._message = message
    else:
        self._message = 'Please    configure    your    application    for    OAuth    2.0'
