Source code for globus_sdk.experimental.gcs_collection_client
from __future__ import annotations
import typing as t
import uuid
import globus_sdk
from globus_sdk.authorizers import GlobusAuthorizer
from globus_sdk.scopes import GCSCollectionScopes
# NOTE: this stub class idea is inspired by the SpecificFlowScopes class stub
# it implements the same interface as the base class, so it's type-compatible
# but it raises errors at runtime -- because it can't *actually* be populated with data
class _GCSCollectionScopesClassStub(GCSCollectionScopes):
"""
This internal stub object ensures that the type deductions for type checkers (e.g.
mypy) on GCSCollectionClient.scopes are correct.
Primarily, it should be possible to access the `scopes` attribute, the `user`
scope, and the `resource_server`, but these usages should raise specific and
informative runtime errors.
Our types are therefore less accurate for class-var access, but more accurate for
instance-var access.
"""
def __init__(self) -> None:
super().__init__("<stub>")
def __getattribute__(self, name: str) -> t.Any:
if name == "https":
_raise_attr_error("https")
if name == "data_access":
_raise_attr_error("data_access")
if name == "resource_server":
_raise_attr_error("resource_server")
return object.__getattribute__(self, name)
[docs]
class GCSCollectionClient(globus_sdk.BaseClient):
"""
A client for interacting directly with a GCS Collection.
Typically for HTTPS upload/download via HTTPS-enabled collections.
.. sdk-sphinx-copy-params:: BaseClient
:param collection_id: The ID of the collection.
:param collection_address: The URL of the collection, as might be retrieved from
the ``https_server`` field in Globus Transfer.
"""
scopes: GCSCollectionScopes = _GCSCollectionScopesClassStub()
def __init__(
self,
collection_id: str | uuid.UUID,
collection_address: str,
*,
environment: str | None = None,
app: globus_sdk.GlobusApp | None = None,
app_scopes: list[globus_sdk.scopes.Scope] | None = None,
authorizer: GlobusAuthorizer | None = None,
app_name: str | None = None,
transport: globus_sdk.transport.RequestsTransport | None = None,
retry_config: globus_sdk.transport.RetryConfig | None = None,
) -> None:
self.collection_id = str(collection_id)
self.scopes = GCSCollectionScopes(self.collection_id)
if not collection_address.startswith("https://"):
collection_address = f"https://{collection_address}"
super().__init__(
environment=environment,
base_url=collection_address,
app=app,
app_scopes=app_scopes,
authorizer=authorizer,
app_name=app_name,
transport=transport,
retry_config=retry_config,
)
@property
def default_scope_requirements(self) -> list[globus_sdk.Scope]:
return [self.scopes.https]
def _raise_attr_error(name: str) -> t.NoReturn:
raise AttributeError(
f"It is not valid to attempt to access the '{name}' attribute of the "
"GCSCollectionClient class. "
f"Instead, instantiate a GCSCollectionClient and access the '{name}' attribute "
"from that instance."
)