Releases: globus/globus-sdk-python
v3.45.0
Added
-
The scope builder for
SpecificFlowClient
is now available for direct access and use viaglobus_sdk.scopes.SpecificFlowScopeBuilder
. Callers can initialize this class with aflow_id
to get a scope builder for a specific flow, e.g.,SpecificFlowScopeBuilder(flow_id).user
.SpecificFlowClient
now uses this class internally. (#1030) -
TransferClient.add_app_data_access_scope
now accepts iterables of collection IDs as an alternative to individual collection IDs. (#1034)
Experimental
-
Added
login(...)
,logout(...)
, andlogin_required(...)
to the experimentalGlobusApp
construct. (#1041)-
login(...)
initiates a login flow if:- the current entity requires a login to satisfy local scope requirements or
auth_params
/force=True
is passed to the method.
-
logout(...)
remove and revokes the current entity's app-associated tokens. -
login_required(...)
returns a boolean indicating whether the app believes
a login is required to satisfy local scope requirements.
-
Removed
Experimental
-
Made
run_login_flow
private in the experimentalGlobusApp
construct. Usage sites should be replaced with eitherapp.login()
orapp.login(force=True)
. (#1041)-
Old Usage
app = UserApp("my-app", client_id="<my-client-id>") app.run_login_flow()
-
New Usage
app = UserApp("my-app", client_id="<my-client-id>") app.login(force=True)
-
Changed
-
The client for Globus Timers has been renamed to
TimersClient
. The prior name,TimerClient
, has been retained as an alias. (#1032)-
Similarly, the error and scopes classes have been renamed and aliased:
TimersAPIError
replacesTimerAPIError
andTimersScopes
replacesTimerScopes
. -
Internal module names have been changed to
timers
fromtimer
where possible. -
The
service_name
attribute is left astimer
for now, as it is integrated into URL and_testing
logic.
-
Experimental
-
The experimental
TokenStorageProvider
andLoginFlowManagerProvider
protocols have been updated to require keyword-only arguments for theirfor_globus_app
methods. This protects against potential ordering confusion for their arguments. (#1028) -
The
default_scope_requirements
forglobus_sdk.FlowsClient
has been updated to list the Flowsall
scope. (#1029) -
The
CommandLineLoginFlowManager
now exposesprint_authorize_url
andprompt_for_code
as methods, which replace thelogin_prompt
andcode_prompt
parameters. Users who wish to customize prompting behavior now have a greater degree of control, and can effect this by subclassing theCommandLineLoginFlowManager
. (#1039)Example usage, which uses the popular
click
library to handle the prompts:import click from globus_sdk.experimental.login_flow_manager import CommandLineLoginFlowManager class ClickLoginFlowManager(CommandLineLoginFlowManager): def print_authorize_url(self, authorize_url: str) -> None: click.echo(click.style("Login here for a code:", fg="yellow")) click.echo(authorize_url) def prompt_for_code(self) -> str: return click.prompt("Enter the code here:")
-
GlobusApp.token_storage
is now a public property, allowing users direct access to theValidatingTokenStorage
used by the app to build authorizers. (#1040) -
The experimental
GlobusApp
construct's scope exploration interface has changed fromapp.get_scope_requirements(resource_server: str) -> tuple[Scope]
toapp.scope_requirements
. The new property will return a deep copy of the internal requirements dictionary mapping resource server to a list of Scopes. (#1042)
Deprecated
TimerScopes
is now a deprecated name. UseTimersScopes
instead. (#1032)
Fixed
Experimental
- Container types in
GlobusApp
function argument annotations are now generally covariant collections likeMapping
rather than invariant types likedict
. (#1035)
Documentation
- The Globus Timers examples have been significantly enhanced and now leverage more modern usage patterns. (#1032)
v3.44.0
Added
- Added a reference to the new Flows all scope under
globus_sdk.scopes.FlowsScopes.all
. (#1016)
Experimental
- Added support for
ScopeCollectionType
to GlobusApp's__init__
and
add_scope_requirements
methods. (#1020)
Changed
-
Updated
ScopeCollectionType
to be defined recursively. (#1020) -
TransferClient.add_app_data_access_scope
now raises an error if it is
given an invalid collection ID. (#1022)
Experimental
-
Changed the experimental
GlobusApp
class in the following way (#1017):-
app_name
is no longer required (defaults to "Unnamed Globus App") -
Token storage now defaults to including the client id in the path.
-
Old (unix) :
~/.globus/app/{app_name}/tokens.json
-
New (unix):
~/.globus/app/{client_id}/{app_name}/tokens.json
-
Old (win):
~\AppData\Local\globus\app\{app_name}\tokens.json
-
New (win):
~\AppData\Local\globus\app\{client_id}\{app_name}\tokens.json
-
-
GlobusAppConfig.token_storage
now accepts shorthand string references:
"json"
to use aJSONTokenStorage
,"sqlite"
to use a
SQLiteTokenStorage
and"memory"
to use aMemoryTokenStorage
. -
GlobusAppConfig.token_storage
also now accepts aTokenStorageProvider
,
a class with afor_globus_app(...) -> TokenStorage
class method. -
Renamed the experimental
FileTokenStorage
attribute.filename
to
.filepath
.
-
-
Changed the experimental
GlobusApp
class in the following ways (#1018):-
LoginFlowManagers
now insertGlobusApp.app_name
into any native
client login flows as theprefill_named_grant
. -
GlobusAppConfig
now accepts alogin_redirect_uri
parameter to specify
the redirect URI for a login flow.-
Invalid when used with a
LocalServerLoginFlowManager
. -
Defaults to
"https://auth.globus.org/v2/web/auth-code"
for native
client flows. Raises an error if not set for confidential ones.
-
-
UserApp
now allows for the use of confidential client flows with the use of
either aLocalServerLoginFlowManager
or a configuredlogin_redirect_uri
. -
GlobusAppConfig.login_flow_manager
now accepts shorthand string references
"command-line"
to use aCommandLineLoginFlowManager
and
"local-server"
to use aLocalServerLoginFlowManager
. -
GlobusAppConfig.login_flow_manager
also now accepts a
LoginFlowManagerProvider
, a class with a
for_globus_app(...) -> LoginFlowManager
class method.
-
Development
- Added a scope normalization function
globus_sdk.scopes.scopes_to_scope_list
to
translate fromScopeCollectionType
to a list ofScope
objects.
(#1020)
v3.43.0
Added
- The
TransferClient.task_list
method now supportsorderby
as a
parameter. (#1011)
Changed
-
The
SQLiteTokenStorage
component inglobus_sdk.experimental
has been
changed in several ways to improve its interface. (#1004)-
:memory:
is no longer accepted as a database name. Attempts to use it
will trigger errors directing users to useMemoryTokenStorage
instead. -
Parent directories for a target file are automatically created, and this
behavior is inherited from theFileTokenStorage
base class. (This was
previously a feature only of theJSONTokenStorage
.) -
The
config_storage
table has been removed from the generated database
schema, the schema version number has been incremented to2
, and
methods and parameters related to manipulation ofconfig_storage
have
been removed.
-
Documentation
-
Added a new experimental "Updated Examples" section which rewrites and reorders
many examples to aid in discovery. (#1008) -
GlobusApp
,UserApp
, andClientApp
class reference docs. (#1013) -
Added a narrative example titled
Using a GlobusApp
detailing the basics of
constructing and using a GlobusApp. (#1013) -
Remove unwritten example updates from toctree. (#1014)
v3.42.0
Python Support
- Remove support for Python 3.7. (#997)
Added
-
Add
globus_sdk.ConnectorTable
which provides information on supported Globus Connect Server connectors. This object maps names to IDs and vice versa. (#955) -
Support adding query parameters to
ConfidentialAppAuthClient.oauth2_token_introspect
via aquery_params
argument. (#984) -
Add
get_gcs_info
as a helper method toGCSClient
for getting information from a Globus Connect Server'sinfo
API route. -
Add
endpoint_client_id
as a property toGCSClient
. -
Clients will now emit a
X-Globus-Client-Info
header which reports the version of theglobus-sdk
which was used to send a request. Users may customize this header further by modifying theglobus_client_info
object attached to the transport object. (#990)
Experimental
-
Add a new abstract class,
TokenStorage
, toexperimental
.TokenStorage
expands the functionality ofStorageAdapter
but is not fully backwards compatible. (#980)FileTokenStorage
,JSONTokenStorage
,MemoryTokenStorage
andSQLiteTokenStorage
are new concrete implementations ofTokenStorage
.
-
Add
ValidatingStorageAdapter
toexperimental
, which validates that identity is maintained and scope requirements are met on token storage/retrieval. (#978, #980) -
Add a new abstract class,
AuthorizerFactory
toexperimental
.AuthorizerFactory
provides an interface for getting aGlobusAuthorizer
from aValidatingTokenStorage
. (#985)AccessTokenAuthorizerFactory
,RefreshTokenAuthorizerFactory
, andClientCredentialsAuthorizerFactory
are new concrete implementations ofAuthorizerFactory
.
-
Add a new abstract class,
GlobusApp
toexperimental
. AGlobusApp
is an abstraction which allows users to define their authorization requirements implicitly and explicitly, attach that state to their various clients, and drive login flows. (#986)-
UserApp
andClientApp
are new implementations ofGlobusApp
which handle authentications for user-login and client-credentials. -
GlobusAppConfig
is an object which can be used to controlGlobusApp
behaviors.
-
-
Add
app
as an optional argument toBaseClient
which will accept aGlobusApp
to handle authentication, token validation, and token storage when using the client. -
Add
default_scope_requirements
as a property toBaseClient
for subclasses to define scopes to automatically be used with aGlobusApp
. The default implementation raises aNotImplementedError
. -
Add
add_app_scope
toBaseClient
as an interface for adding additional scope requirements to itsapp
. -
AuthClient
,FlowsClient
,GCSClient
,GroupsClient
,SearchClient
,TimerClient
, andTransferClient
all addapp
as an optional argument and definedefault_scope_requirements
so that they can be used with aGlobusApp
. -
Add
add_app_data_access_scope
toTransferClient
as an interface for adding a dependent data access scope requirements needed for interacting with standard Globus Connect Server mapped collections to itsapp
. -
Auto-login (overridable in config) GlobusApp login retry on token validation error. (#994)
-
Added the configuration parameter
GlobusAppConfig.environment
. (#1001)
Changed
-
GCSClient
instances now have a non-Noneresource_server
property. -
GlobusAuthorizationParameters
no longer enforces that at least one field is set. (#989) -
Improved the validation and checking used inside of
globus_sdk.tokenstorage.SimpleJSONFileAdapter
andglobus_sdk.experimental.tokenstorage.JSONTokenStorage
. (#997)
Deprecated
GCSClient.connector_id_to_name
has been deprecated. UseConnectorTable.lookup
instead. (#955)
Fixed
Experimental
-
When a
JSONTokenStorage
is used, the containing directory will be automatically be created if it doesn't exist. (#998) -
GlobusApp.add_scope_requirements
now has the side effect of clearing the authorizer cache for any referenced resource servers. (#1000) -
GlobusAuthorizer.scope_requirements
was made private and a new method for accessing scope requirements was added atGlobusAuthorizer.get_scope_requirements
. (#1000) -
A
GlobusApp
will now auto-create an Auth consent client for dependent scope evaluation against consents as a part of instantiation. (#1000) -
Fixed a bug where specifying dependent tokens in a new
GlobusApp
would cause the app to infinitely prompt for log in. (#1002) -
Fixed a
GlobusApp
bug which would cause LocalServerLoginFlowManager to error on MacOS when versions earlier than Python 3.11. (#1003)
Documentation
- Document how to manage Globus SDK warnings. (#988)
v3.41.0
Added
-
Added a new AuthClient method
get_consents
and supporting local data objects.
These allows a client to poll and interact with the current Globus Auth consent state
of a particular identity rooted at their client. (#971) -
Added
LoginFlowManager
andCommandLineLoginFLowManager
to experimental (#972) -
Added
LocalServerLoginFlowManager
to experimental (#977) -
Added support to
FlowsClient
for thevalidate_flow
operation of the
Globus Flows service. (#979)
v3.40.0
Added
-
Add
globus_sdk.tokenstorage.MemoryAdapter
for the simplest possible in-memory token storage mechanism. (#964) -
ConfidentialAppAuthClient.oauth2_get_dependent_tokens
now supports thescope
parameter as a string or iterable of strings. (#965) -
Moved scope parsing out of experimental. The
Scope
construct is now importable from the top levelglobus_sdk
module. (#966) -
Support updating subscriptions assigned to flows in the Flows service. (#974)
Development
- Fix concurrency problems in the test suite caused by isort's
.isorted
temporary files. (#973)
v3.39.0
v3.38.0
Added
-
IterableGCSResponse
andUnpackingGCSResponse
are now available as top-level exported names. (#956) -
Add
GroupsClient.get_group_by_subscription_id
for resolving subscriptions to groups. This also expands the_testing
data forget_group
to include a subscription group case. (#957) -
Added
prompt
to the recognized Globus Authorization Requirements Errorauthorization_parameters
fields. (#958)
v3.37.0
Added
- All of the basic HTTP methods of
BaseClient
and its derived classes which accept adata
parameter for a request body, e.g.TransferClient.post
orGroupsClient.put
, now allow thedata
to be passed in the form of already encodedbytes
. (#951)
Fixed
- Update
ensure_datatype
to work with documents that setDATA_TYPE
toMISSING
instead of omitting it (#952)
v3.36.0
Added
-
Added support for GCS endpoint get & update operations. (#933)
gcs_client.get_endpoint()
gcs_client.update_endpoint(EndpointDocument(...))
-
TransferClient.endpoint_manager_task_list()
now supportsfilter_endpoint_use
as a parameter. (#948) -
FlowsClient.create_flow
now supportssubscription_id
as a parameter. (#949)