Source code for geetools.Initialize
"""Tools for the ``ee.Initialize`` function."""
from __future__ import annotations
import json
from pathlib import Path
from typing import Optional
import ee
from google.oauth2.credentials import Credentials
from geetools.accessors import register_function_accessor
_project_id: Optional[str] = None
"The project Id used by the current user."
@register_function_accessor(ee.Initialize, "geetools")
[docs]
class InitializeAccessor:
"""Toolbox for the ``ee.Initialize`` function."""
@staticmethod
[docs]
def from_user(name: str = "", credential_pathname: str = "", project: str = "") -> None:
"""Initialize Earthengine API using a specific user.
Equivalent to the ``ee.initialize`` function but with a specific credential file stored in the machine by the ``ee.Authenticate.to_user`` function.
Args:
name: The name of the user as saved when created. use default if not set
credential_pathname: The path to the folder where the credentials are stored. If not set, it uses the default path
project: The project_id to use. If not set, it uses the default project_id of the saved credentials.
Example:
.. code-block:: python
import ee
import geetools
ee.Initialize.from_user("test")
# check that GEE is connected
ee.Number(1).getInfo()
"""
# gather global variable to be modified
global _project_id
# set the user profile information
name = f"credentials{name}"
credential_pathname = credential_pathname or ee.oauth.get_credentials_path()
credential_folder = Path(credential_pathname).parent
credential_path = credential_folder / name
# check if the user exists
if not credential_path.exists():
msg = "Please register this user first by using geetools.User.create first"
raise ee.EEException(msg)
# Set the credential object and Init GEE API
tokens = json.loads((credential_path / name).read_text())
credentials = Credentials(
None,
refresh_token=tokens["refresh_token"],
token_uri=ee.oauth.TOKEN_URI,
client_id=tokens["client_id"],
client_secret=tokens["client_secret"],
scopes=ee.oauth.SCOPES,
)
ee.Initialize(credentials)
# save the project_id in a dedicated global variable as it's not saved
# from GEE side
_project_id = project or tokens["project_id"]
@staticmethod
[docs]
def project_id() -> str:
"""Get the project_id of the current account.
Returns:
The project_id of the connected profile
Raises:
RuntimeError: If the account is not initialized.
Examples:
.. code-block::
import ee, geetools
ee.Initialize.geetools.project_id()
"""
if _project_id is None:
raise RuntimeError("The GEE account is not initialized")
return _project_id