'Constructor
Args:
filename: string, File name of client secrets.
scope: string or iterable 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.
**kwargs: dict, Keyword arguments are passed along as kwargs to
the OAuth2WebServerFlow constructor.'

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

    (client_type, client_info) = clientsecrets.loadfile(filename, cache=cache)
    if (client_type not in (clientsecrets.TYPE_WEB, clientsecrets.TYPE_INSTALLED)):
        raise clientsecrets.InvalidClientSecretsError("OAuth2Decorator    doesn't    support    this    OAuth    2.0    flow.")
    constructor_kwargs = dict(kwargs)
    constructor_kwargs.update({'auth_uri': client_info['auth_uri'], 'token_uri': client_info['token_uri'], 'message': message})
    revoke_uri = client_info.get('revoke_uri')
    if (revoke_uri is not None):
        constructor_kwargs['revoke_uri'] = revoke_uri
    super(OAuth2DecoratorFromClientSecrets, self).__init__(client_info['client_id'], client_info['client_secret'], scope, **constructor_kwargs)
    if (message is not None):
        self._message = message
    else:
        self._message = 'Please    configure    your    application    for    OAuth    2.0.'
