From a63096072ce08841c88c0554d62198c88bd3c359 Mon Sep 17 00:00:00 2001 From: Stephen Rosen Date: Tue, 17 Sep 2024 14:17:39 -0500 Subject: [PATCH] Rename 'TokenData' to 'TokenStorageData' This is an experimental component which has not yet been documented and does not appear in the changelog history; therefore, no documentation changes or changelog are included with this change and it is considered purely internal. --- .../globus_app/_validating_token_storage.py | 27 ++++++++++--------- .../experimental/tokenstorage/__init__.py | 4 +-- .../experimental/tokenstorage/base.py | 16 +++++------ .../experimental/tokenstorage/json.py | 12 ++++----- .../experimental/tokenstorage/memory.py | 8 +++--- .../experimental/tokenstorage/sqlite.py | 14 +++++----- .../experimental/tokenstorage/token_data.py | 2 +- tests/functional/tokenstorage_v2/conftest.py | 6 ++--- .../globus_app/test_authorizer_factory.py | 4 +-- .../globus_app/test_globus_app.py | 4 +-- 10 files changed, 50 insertions(+), 47 deletions(-) diff --git a/src/globus_sdk/experimental/globus_app/_validating_token_storage.py b/src/globus_sdk/experimental/globus_app/_validating_token_storage.py index 7a7317147..aaba183fa 100644 --- a/src/globus_sdk/experimental/globus_app/_validating_token_storage.py +++ b/src/globus_sdk/experimental/globus_app/_validating_token_storage.py @@ -3,7 +3,7 @@ import typing as t from globus_sdk import AuthClient, Scope -from globus_sdk.experimental.tokenstorage import TokenData, TokenStorage +from globus_sdk.experimental.tokenstorage import TokenStorage, TokenStorageData from globus_sdk.scopes.consents import ConsentForest from ..._types import UUIDLike @@ -16,10 +16,10 @@ def _get_identity_id_from_token_data_by_resource_server( - token_data_by_resource_server: t.Mapping[str, TokenData] + token_data_by_resource_server: t.Mapping[str, TokenStorageData] ) -> str | None: """ - Get the identity_id attribute from all TokenData objects by resource server + Get the identity_id attribute from all TokenStorageData objects by resource server Sanity check that they are all the same, and then return that identity_id or None """ token_data_identity_ids: set[str] = set() @@ -34,7 +34,7 @@ def _get_identity_id_from_token_data_by_resource_server( return token_data_identity_ids.pop() else: raise ValueError( - "token_data_by_resource_server contained TokenData objects with " + "token_data_by_resource_server contained TokenStorageData objects with " f"different identity_id values: {token_data_identity_ids}" ) @@ -105,11 +105,11 @@ def set_consent_client(self, consent_client: AuthClient) -> None: self._consent_client = consent_client def store_token_data_by_resource_server( - self, token_data_by_resource_server: t.Mapping[str, TokenData] + self, token_data_by_resource_server: t.Mapping[str, TokenStorageData] ) -> None: """ - :param token_data_by_resource_server: A dict of TokenData objects indexed by - their resource server + :param token_data_by_resource_server: A dict of TokenStorageData objects + indexed by their resource server :raises: :exc:`MissingIdentityError` if the token data does not contain identity information. @@ -130,9 +130,9 @@ def store_token_data_by_resource_server( token_data_by_resource_server ) - def get_token_data_by_resource_server(self) -> dict[str, TokenData]: + def get_token_data_by_resource_server(self) -> dict[str, TokenStorageData]: """ - :returns: A dict of TokenData objects indexed by their resource server + :returns: A dict of TokenStorageData objects indexed by their resource server :raises: :exc:`UnmetScopeRequirementsError` if any token data does not meet the attached scope requirements. """ @@ -145,7 +145,7 @@ def get_token_data_by_resource_server(self) -> dict[str, TokenData]: return by_resource_server - def get_token_data(self, resource_server: str) -> TokenData: + def get_token_data(self, resource_server: str) -> TokenStorageData: """ :param resource_server: A resource server with cached token data. :returns: The token data for the given resource server. @@ -170,7 +170,7 @@ def remove_token_data(self, resource_server: str) -> bool: return self.token_storage.remove_token_data(resource_server) def _validate_token_data_by_resource_server_meets_identity_requirements( - self, token_data_by_resource_server: t.Mapping[str, TokenData] + self, token_data_by_resource_server: t.Mapping[str, TokenStorageData] ) -> None: """ Validate that the identity info in the token data matches the stored identity @@ -209,7 +209,10 @@ def _validate_token_data_by_resource_server_meets_identity_requirements( ) def _validate_token_data_meets_scope_requirements( - self, resource_server: str, token_data: TokenData, eval_dependent: bool = True + self, + resource_server: str, + token_data: TokenStorageData, + eval_dependent: bool = True, ) -> None: """ Given a particular resource server/token data, evaluate whether the token + diff --git a/src/globus_sdk/experimental/tokenstorage/__init__.py b/src/globus_sdk/experimental/tokenstorage/__init__.py index 9f6b5b68b..9765d90cc 100644 --- a/src/globus_sdk/experimental/tokenstorage/__init__.py +++ b/src/globus_sdk/experimental/tokenstorage/__init__.py @@ -2,7 +2,7 @@ from globus_sdk.experimental.tokenstorage.json import JSONTokenStorage from globus_sdk.experimental.tokenstorage.memory import MemoryTokenStorage from globus_sdk.experimental.tokenstorage.sqlite import SQLiteTokenStorage -from globus_sdk.experimental.tokenstorage.token_data import TokenData +from globus_sdk.experimental.tokenstorage.token_data import TokenStorageData __all__ = ( "JSONTokenStorage", @@ -10,5 +10,5 @@ "TokenStorage", "FileTokenStorage", "MemoryTokenStorage", - "TokenData", + "TokenStorageData", ) diff --git a/src/globus_sdk/experimental/tokenstorage/base.py b/src/globus_sdk/experimental/tokenstorage/base.py index 287f45df6..4e6877dc8 100644 --- a/src/globus_sdk/experimental/tokenstorage/base.py +++ b/src/globus_sdk/experimental/tokenstorage/base.py @@ -12,7 +12,7 @@ from ... import GlobusSDKUsageError from ..._types import UUIDLike -from .token_data import TokenData +from .token_data import TokenStorageData if t.TYPE_CHECKING: from globus_sdk.experimental.globus_app import GlobusAppConfig @@ -37,30 +37,30 @@ def __init__(self, namespace: str = "DEFAULT") -> None: @abc.abstractmethod def store_token_data_by_resource_server( - self, token_data_by_resource_server: t.Mapping[str, TokenData] + self, token_data_by_resource_server: t.Mapping[str, TokenStorageData] ) -> None: """ Store token data in underlying storage partitioned by the resource server and the current namespace. - :param token_data_by_resource_server: a ``dict`` of ``TokenData`` objects + :param token_data_by_resource_server: a ``dict`` of ``TokenStorageData`` objects indexed by their ``resource_server``. """ @abc.abstractmethod - def get_token_data_by_resource_server(self) -> dict[str, TokenData]: + def get_token_data_by_resource_server(self) -> dict[str, TokenStorageData]: """ Lookup all token data under the current namespace in the underlying storage. - Returns a dict of ``TokenData`` objects indexed by their resource server. + Returns a dict of ``TokenStorageData`` objects indexed by their resource server. """ - def get_token_data(self, resource_server: str) -> TokenData | None: + def get_token_data(self, resource_server: str) -> TokenStorageData | None: """ Lookup token data for a resource server in the underlying storage under the current namespace. - Either returns a ``TokenData`` object containing tokens and metadata for + Either returns a ``TokenStorageData`` object containing tokens and metadata for the given resource server or ``None`` indicating that there was no data for that resource server. @@ -96,7 +96,7 @@ def store_token_response(self, token_response: OAuthTokenResponse) -> None: identity_id = None for resource_server, token_dict in token_response.by_resource_server.items(): - token_data_by_resource_server[resource_server] = TokenData( + token_data_by_resource_server[resource_server] = TokenStorageData( resource_server=token_dict["resource_server"], identity_id=identity_id, scope=token_dict["scope"], diff --git a/src/globus_sdk/experimental/tokenstorage/json.py b/src/globus_sdk/experimental/tokenstorage/json.py index 8498bf0e0..98bb52300 100644 --- a/src/globus_sdk/experimental/tokenstorage/json.py +++ b/src/globus_sdk/experimental/tokenstorage/json.py @@ -6,7 +6,7 @@ from globus_sdk.experimental.tokenstorage.base import FileTokenStorage from globus_sdk.version import __version__ -from .token_data import TokenData +from .token_data import TokenStorageData # use the non-annotation form of TypedDict to apply a non-identifier key _JSONFileData_0 = t.TypedDict("_JSONFileData_0", {"globus-sdk.version": str}) @@ -116,7 +116,7 @@ def _load(self) -> _JSONFileData: return self._handle_formats(data) def store_token_data_by_resource_server( - self, token_data_by_resource_server: t.Mapping[str, TokenData] + self, token_data_by_resource_server: t.Mapping[str, TokenStorageData] ) -> None: """ Store token data as JSON data in ``self.filepath`` under the current namespace @@ -127,7 +127,7 @@ def store_token_data_by_resource_server( local users, this sets the umask such that only the owner of the resulting file can read or write it. - :param token_data_by_resource_server: a ``dict`` of ``TokenData`` objects + :param token_data_by_resource_server: a ``dict`` of ``TokenStorageData`` objects indexed by their ``resource_server``. """ to_write = self._load() @@ -148,16 +148,16 @@ def store_token_data_by_resource_server( with open(self.filepath, "w", encoding="utf-8") as f: json.dump(to_write, f) - def get_token_data_by_resource_server(self) -> dict[str, TokenData]: + def get_token_data_by_resource_server(self) -> dict[str, TokenStorageData]: """ Lookup all token data under the current namespace from the JSON file. - Returns a dict of ``TokenData`` objects indexed by their resource server. + Returns a dict of ``TokenStorageData`` objects indexed by their resource server. """ ret = {} dicts_by_resource_server = self._load()["data"].get(self.namespace, {}) for resource_server, token_data_dict in dicts_by_resource_server.items(): - ret[resource_server] = TokenData.from_dict(token_data_dict) + ret[resource_server] = TokenStorageData.from_dict(token_data_dict) return ret def remove_token_data(self, resource_server: str) -> bool: diff --git a/src/globus_sdk/experimental/tokenstorage/memory.py b/src/globus_sdk/experimental/tokenstorage/memory.py index b32ba6514..7dc31c7e1 100644 --- a/src/globus_sdk/experimental/tokenstorage/memory.py +++ b/src/globus_sdk/experimental/tokenstorage/memory.py @@ -4,7 +4,7 @@ from globus_sdk.experimental.tokenstorage.base import TokenStorage -from .token_data import TokenData +from .token_data import TokenStorageData if t.TYPE_CHECKING: from globus_sdk._types import UUIDLike @@ -35,7 +35,7 @@ def for_globus_app( return cls(namespace=namespace) def store_token_data_by_resource_server( - self, token_data_by_resource_server: t.Mapping[str, TokenData] + self, token_data_by_resource_server: t.Mapping[str, TokenStorageData] ) -> None: if self.namespace not in self._tokens: self._tokens[self.namespace] = {} @@ -43,11 +43,11 @@ def store_token_data_by_resource_server( for resource_server, token_data in token_data_by_resource_server.items(): self._tokens[self.namespace][resource_server] = token_data.to_dict() - def get_token_data_by_resource_server(self) -> dict[str, TokenData]: + def get_token_data_by_resource_server(self) -> dict[str, TokenStorageData]: ret = {} dicts_by_resource_server = self._tokens.get(self.namespace, {}) for resource_server, token_data_dict in dicts_by_resource_server.items(): - ret[resource_server] = TokenData.from_dict(token_data_dict) + ret[resource_server] = TokenStorageData.from_dict(token_data_dict) return ret def remove_token_data(self, resource_server: str) -> bool: diff --git a/src/globus_sdk/experimental/tokenstorage/sqlite.py b/src/globus_sdk/experimental/tokenstorage/sqlite.py index 4c0f9543f..b47a1ccda 100644 --- a/src/globus_sdk/experimental/tokenstorage/sqlite.py +++ b/src/globus_sdk/experimental/tokenstorage/sqlite.py @@ -10,7 +10,7 @@ from globus_sdk.experimental.tokenstorage.base import FileTokenStorage from globus_sdk.version import __version__ -from .token_data import TokenData +from .token_data import TokenStorageData class SQLiteTokenStorage(FileTokenStorage): @@ -107,13 +107,13 @@ def close(self) -> None: self._connection.close() def store_token_data_by_resource_server( - self, token_data_by_resource_server: t.Mapping[str, TokenData] + self, token_data_by_resource_server: t.Mapping[str, TokenStorageData] ) -> None: """ Given a dict of token data indexed by resource server, convert the data into JSON dicts and write it to ``self.filepath`` under the current namespace - :param token_data_by_resource_server: a ``dict`` of ``TokenData`` objects + :param token_data_by_resource_server: a ``dict`` of ``TokenStorageData`` objects indexed by their ``resource_server``. """ pairs = [] @@ -130,13 +130,13 @@ def store_token_data_by_resource_server( ) self._connection.commit() - def get_token_data_by_resource_server(self) -> dict[str, TokenData]: + def get_token_data_by_resource_server(self) -> dict[str, TokenStorageData]: """ Lookup all token data under the current namespace from the database. - Returns a dict of ``TokenData`` objects indexed by their resource server. + Returns a dict of ``TokenStorageData`` objects indexed by their resource server. """ - ret: dict[str, TokenData] = {} + ret: dict[str, TokenStorageData] = {} for row in self._connection.execute( "SELECT resource_server, token_data_json " "FROM token_storage WHERE namespace=?", @@ -144,7 +144,7 @@ def get_token_data_by_resource_server(self) -> dict[str, TokenData]: ): resource_server, token_data_json = row token_data_dict = json.loads(token_data_json) - ret[resource_server] = TokenData.from_dict(token_data_dict) + ret[resource_server] = TokenStorageData.from_dict(token_data_dict) return ret def remove_token_data(self, resource_server: str) -> bool: diff --git a/src/globus_sdk/experimental/tokenstorage/token_data.py b/src/globus_sdk/experimental/tokenstorage/token_data.py index 9a78ada58..8b0b59df6 100644 --- a/src/globus_sdk/experimental/tokenstorage/token_data.py +++ b/src/globus_sdk/experimental/tokenstorage/token_data.py @@ -6,7 +6,7 @@ from globus_sdk._serializable import Serializable -class TokenData(Serializable): +class TokenStorageData(Serializable): """ Data class containing tokens and metadata for a specific resource server used as the python interface for ``TokenStorage``. diff --git a/tests/functional/tokenstorage_v2/conftest.py b/tests/functional/tokenstorage_v2/conftest.py index ffa1aed95..2c339a193 100644 --- a/tests/functional/tokenstorage_v2/conftest.py +++ b/tests/functional/tokenstorage_v2/conftest.py @@ -3,14 +3,14 @@ import pytest -from globus_sdk.experimental.tokenstorage import TokenData +from globus_sdk.experimental.tokenstorage import TokenStorageData @pytest.fixture def mock_token_data_by_resource_server(): expiration_time = int(time.time()) + 3600 ret = { - "resource_server_1": TokenData( + "resource_server_1": TokenStorageData( resource_server="resource_server_1", identity_id="user_id", scope="scope1", @@ -19,7 +19,7 @@ def mock_token_data_by_resource_server(): expires_at_seconds=expiration_time, token_type="Bearer", ), - "resource_server_2": TokenData( + "resource_server_2": TokenStorageData( resource_server="resource_server_2", identity_id="user_id", scope="scope2 scope2:0 scope2:1", diff --git a/tests/unit/experimental/globus_app/test_authorizer_factory.py b/tests/unit/experimental/globus_app/test_authorizer_factory.py index 956b310f5..acefdbb06 100644 --- a/tests/unit/experimental/globus_app/test_authorizer_factory.py +++ b/tests/unit/experimental/globus_app/test_authorizer_factory.py @@ -12,7 +12,7 @@ ExpiredTokenError, MissingTokenError, ) -from globus_sdk.experimental.tokenstorage import TokenData +from globus_sdk.experimental.tokenstorage import TokenStorageData def make_mock_token_response(token_number=1): @@ -40,7 +40,7 @@ def get_token_data(self, resource_server): msg = f"No token data for {resource_server}" raise MissingTokenError(msg, resource_server=resource_server) - return TokenData.from_dict(self.token_data[resource_server]) + return TokenStorageData.from_dict(self.token_data[resource_server]) def store_token_response(self, mock_token_response): self.token_data = mock_token_response.by_resource_server diff --git a/tests/unit/experimental/globus_app/test_globus_app.py b/tests/unit/experimental/globus_app/test_globus_app.py index 8b68fd57b..968b1ec58 100644 --- a/tests/unit/experimental/globus_app/test_globus_app.py +++ b/tests/unit/experimental/globus_app/test_globus_app.py @@ -33,7 +33,7 @@ JSONTokenStorage, MemoryTokenStorage, SQLiteTokenStorage, - TokenData, + TokenStorageData, ) from globus_sdk.gare import GlobusAuthorizationParameters from globus_sdk.scopes import AuthScopes, Scope @@ -42,7 +42,7 @@ def _mock_token_data_by_rs(): return { - "auth.globus.org": TokenData( + "auth.globus.org": TokenStorageData( resource_server="auth.globus.org", identity_id="mock_identity_id", scope="openid",