Source code for geetools.Authenticate
"""Toolbox for the ``ee.Authenticate`` function."""
from __future__ import annotations
from contextlib import suppress
from pathlib import Path
from shutil import move
from tempfile import TemporaryDirectory
import ee
from geetools.accessors import register_function_accessor
@register_function_accessor(ee.Authenticate, "geetools")
[docs]
class AuthenticateAccessor:
"""Create an accessor for the ``ee.Authenticate`` function."""
@staticmethod
[docs]
def new_user(name: str = "", credential_pathname: str = "") -> None:
"""Authenticate the user and save the credentials in a specific folder.
Equivalent to ee.Authenticate but where the registered user will not be the default one (the one you get when running ee.initialize())
Args:
name: The name of the user. If not set, it will reauthenticate default.
credential_pathname: The path to the folder where the credentials are stored. If not set, it uses the default path
Example:
.. code-block:: python
import ee
import geetools
# cannot be displayed in the documentation as the creation
# of a new user requires user interaction
# geetools.User.create("secondary")
# geetools.User.set("secondary")
# ee.Number(1).getInfo()
"""
name = f"credentials{name}"
credential_pathname = credential_pathname or ee.oauth.get_credentials_path()
credential_path = Path(credential_pathname).parent
# the authenticate method will write the credentials in the default
# folder and with the default name. We have to save the existing one in tmp,
# and then exchange places between the newly created and the existing one
default = Path(ee.oauth.get_credentials_path())
with TemporaryDirectory() as dir:
with suppress(FileNotFoundError):
move(default, Path(dir) / default.name)
ee.Authenticate()
move(default, credential_path / name)
with suppress(FileNotFoundError):
move(Path(dir) / default.name, default)
@staticmethod
[docs]
def delete_user(name: str = "", credential_pathname: str = "") -> None:
"""Delete a user credential file.
Args:
name: The name of the user. If not set, it will delete the default user
credential_pathname: The path to the folder where the credentials are stored. If not set, it uses the default path
Example:
.. code-block:: python
import ee
import geetools
# cannot be displayed in the documentation as the creation
# of a new user requires user interaction
# geetools.User.create("secondary")
# geetools.User.delete("secondary")
# geetools.User.set("secondary")
# will raise an error as the user does not exist anymore
"""
name = f"credentials{name}"
credential_pathname = credential_pathname or ee.oauth.get_credentials_path()
credential_path = Path(credential_pathname).parent
with suppress(FileNotFoundError):
(credential_path / name).unlink()
@staticmethod
[docs]
def list_user(credential_pathname: str = "") -> list:
"""return all the available users in the set folder.
To reach "default" simply omit the ``name`` parameter in the User methods
Args:
credential_pathname: The path to the folder where the credentials are stored. If not set, it uses the default path
Returns:
A list of strings with the names of the users
Example:
.. code-block:: python
import ee
import geetools
geetools.User.list(
"""
credential_pathname = credential_pathname or ee.oauth.get_credentials_path()
credential_path = Path(credential_pathname).parent
files = [f for f in credential_path.glob("credentials*") if f.is_file()]
return [f.name.replace("credentials", "") or "default" for f in files]
@staticmethod
[docs]
def rename_user(new: str, old: str = "", credential_pathname: str = "") -> None:
"""Rename a user without changing the credentials.
Args:
new: The new name of the user
old: The name of the user to rename
credential_pathname: The path to the folder where the credentials are stored. If not set, it uses the default path
Example:
.. code-block:: python
import ee
import geetools
geetools.user.create("secondary")
geetools.User.rename("secondary", "new_default")
geetools.User.list()
"""
old = f"credentials{old}"
new = f"credentials{new}"
credential_pathname = credential_pathname or ee.oauth.get_credentials_path()
credential_path = Path(credential_pathname).parent
with suppress(FileNotFoundError):
(credential_path / old).rename(credential_path / new)