Helper function to manage a credentials cache during testing.

    This function attempts to load and refresh a credentials object from a
    json cache file, using the cache_key and client_id as a lookup.

    If this isn't found then it starts an OAuth2 authentication flow, using
    the client_id and client_secret and if successful, saves those to the local
    cache. See :ref:`helper`.
  
    Args:
        client_id (str): Google Drive API client id string for an installed app
        client_secret (str): The corresponding client secret.
        credentials_cache_file (str): Filepath to the json credentials cache file
        cache_key (str): Optional string to allow multiple credentials for a client
           to be stored in the cache.

    Returns:
        OAuth2Credentials: A google api credentials object. As described here:
        https://developers.google.com/api-client-library/python/guide/aaa_oauth

def ia_credentials_helper(client_id, client_secret, 
                          credentials_cache_file="credentials.json",
                          cache_key="default"):
    """Helper function to manage a credentials cache during testing.

    This function attempts to load and refresh a credentials object from a
    json cache file, using the cache_key and client_id as a lookup.

    If this isn't found then it starts an OAuth2 authentication flow, using
    the client_id and client_secret and if successful, saves those to the local
    cache. See :ref:`helper`.
  
    Args:
        client_id (str): Google Drive API client id string for an installed app
        client_secret (str): The corresponding client secret.
        credentials_cache_file (str): Filepath to the json credentials cache file
        cache_key (str): Optional string to allow multiple credentials for a client
           to be stored in the cache.

    Returns:
        OAuth2Credentials: A google api credentials object. As described here:
        https://developers.google.com/api-client-library/python/guide/aaa_oauth

    """
    def _load_credentials(key):
        with open(credentials_cache_file, 'rb') as inf:
            cache = json.load(inf)
        cred_json = cache[key]
        return OAuth2Credentials.from_json(cred_json)

    def _save_credentials(key, credentials):
        cache = {}
        try:
            with open(credentials_cache_file, 'rb') as inf:
                cache = json.load(inf)
        except (IOError, ValueError), e:
            pass
        cache[key] = credentials.to_json()
        with open(credentials_cache_file, 'wb') as ouf:
            json.dump(cache, ouf)

    credentials_key = "%s/%s/%s" % (client_id, client_secret, cache_key)
    try:
        credentials = _load_credentials(credentials_key)
        if credentials.access_token_expired:
            http = httplib2.Http()
            credentials.refresh(http)
    except (IOError, 
            ValueError, 
            KeyError, 
            AccessTokenRefreshError), e:
        # Check https://developers.google.com/drive/scopes for all available scopes
        OAUTH_SCOPE = ('https://www.googleapis.com/auth/drive '+
                       'https://spreadsheets.google.com/feeds')
        # Redirect URI for installed apps
        REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob'

        # Run through the OAuth flow and retrieve credentials
        flow = OAuth2WebServerFlow(client_id, client_secret, OAUTH_SCOPE,
                                   redirect_uri=REDIRECT_URI)
        authorize_url = flow.step1_get_authorize_url()
        print('Go to the following link in your browser:\n' + authorize_url)
        code = raw_input('Enter verification code: ').strip()
        credentials = flow.step2_exchange(code)

    _save_credentials(credentials_key, credentials)
    return credentials