globus-cli 3.33.0__tar.gz → 3.34.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {globus_cli-3.33.0/src/globus_cli.egg-info → globus_cli-3.34.0}/PKG-INFO +4 -3
- {globus_cli-3.33.0 → globus_cli-3.34.0}/pyproject.toml +2 -2
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/api.py +15 -7
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/search/index/list.py +1 -4
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/task/list.py +2 -2
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/timer/create/transfer.py +1 -1
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/timer/delete.py +1 -1
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/timer/list.py +1 -1
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/timer/pause.py +1 -1
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/timer/resume.py +1 -1
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/timer/show.py +1 -1
- globus_cli-3.34.0/src/globus_cli/exception_handling/hooks/__init__.py +70 -0
- globus_cli-3.34.0/src/globus_cli/exception_handling/hooks/auth_requirements.py +94 -0
- globus_cli-3.34.0/src/globus_cli/exception_handling/hooks/authapi_hooks.py +35 -0
- globus_cli-3.34.0/src/globus_cli/exception_handling/hooks/endpoint_types.py +24 -0
- globus_cli-3.34.0/src/globus_cli/exception_handling/hooks/flows_hooks.py +179 -0
- globus_cli-3.34.0/src/globus_cli/exception_handling/hooks/generic_hooks.py +51 -0
- globus_cli-3.34.0/src/globus_cli/exception_handling/hooks/search_hooks.py +55 -0
- globus_cli-3.34.0/src/globus_cli/exception_handling/hooks/transfer_hooks.py +29 -0
- globus_cli-3.34.0/src/globus_cli/exception_handling/messages.py +179 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/exception_handling/registry.py +19 -16
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/login_manager/scopes.py +1 -1
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/termio/printers/table_printer.py +25 -7
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/types.py +1 -1
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/version.py +1 -1
- {globus_cli-3.33.0 → globus_cli-3.34.0/src/globus_cli.egg-info}/PKG-INFO +4 -3
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli.egg-info/SOURCES.txt +9 -1
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli.egg-info/requires.txt +1 -1
- globus_cli-3.33.0/src/globus_cli/exception_handling/hooks.py +0 -594
- {globus_cli-3.33.0 → globus_cli-3.34.0}/LICENSE +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/README.rst +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/setup.cfg +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/setup.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/__main__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/_warnings.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/_common.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/bookmark/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/bookmark/_common.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/bookmark/create.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/bookmark/delete.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/bookmark/list.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/bookmark/rename.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/bookmark/show.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/cli_profile_list.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/collection/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/collection/_common.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/collection/create/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/collection/create/guest.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/collection/create/mapped.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/collection/delete.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/collection/list.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/collection/show.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/collection/update.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/delete.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/_common.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/activate.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/create.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/deactivate.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/delete.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/is_activated.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/local_id.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/my_shared_endpoint_list.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/permission/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/permission/_common.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/permission/create.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/permission/delete.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/permission/list.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/permission/show.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/permission/update.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/role/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/role/_common.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/role/create.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/role/delete.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/role/list.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/role/show.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/search.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/server/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/server/_common.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/server/add.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/server/delete.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/server/list.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/server/show.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/server/update.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/set_subscription_id.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/show.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/storage_gateway/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/storage_gateway/list.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/update.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/user_credential/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/user_credential/_common.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/user_credential/create/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/user_credential/create/from_json.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/user_credential/create/posix.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/user_credential/create/s3.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/user_credential/delete.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/user_credential/list.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/user_credential/show.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/user_credential/update/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/endpoint/user_credential/update/from_json.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/flows/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/flows/_common.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/flows/create.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/flows/delete.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/flows/list.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/flows/run/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/flows/run/cancel.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/flows/run/delete.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/flows/run/list.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/flows/run/resume.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/flows/run/show.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/flows/run/show_definition.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/flows/run/show_logs.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/flows/run/update.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/flows/show.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/flows/start.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/flows/update.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/flows/validate.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/gcp/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/gcp/create/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/gcp/create/_common.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/gcp/create/guest.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/gcp/create/mapped.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/gcp/set_subscription_id.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/gcp/update/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/gcp/update/guest.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/gcp/update/mapped.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/gcs/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/gcs/endpoint/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/gcs/endpoint/_common.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/gcs/endpoint/role/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/gcs/endpoint/role/_common.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/gcs/endpoint/role/create.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/gcs/endpoint/role/delete.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/gcs/endpoint/role/list.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/gcs/endpoint/role/show.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/gcs/endpoint/set_subscription_id.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/gcs/endpoint/show.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/gcs/endpoint/update.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/get_identities.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/group/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/group/_common.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/group/create.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/group/delete.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/group/get_by_subscription.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/group/get_subscription_info.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/group/invite/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/group/invite/_common.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/group/invite/accept.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/group/invite/decline.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/group/join.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/group/leave.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/group/list.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/group/member/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/group/member/add.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/group/member/approve.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/group/member/invite.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/group/member/list.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/group/member/reject.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/group/member/remove.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/group/set_policies.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/group/show.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/group/update.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/list_commands.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/login.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/logout.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/ls.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/mkdir.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/rename.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/rm.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/search/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/search/_common.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/search/delete_by_query.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/search/index/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/search/index/create.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/search/index/delete.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/search/index/role/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/search/index/role/create.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/search/index/role/delete.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/search/index/role/list.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/search/index/show.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/search/ingest.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/search/query.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/search/subject/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/search/subject/delete.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/search/subject/show.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/search/task/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/search/task/list.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/search/task/show.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/session/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/session/consent.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/session/show.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/session/update.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/stat.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/task/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/task/_common.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/task/cancel.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/task/event_list.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/task/generate_submission_id.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/task/pause_info.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/task/show.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/task/update.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/task/wait.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/timer/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/timer/_common.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/timer/create/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/transfer.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/update.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/version.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/commands/whoami.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/constants.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/endpointish/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/endpointish/endpointish.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/endpointish/entity_type.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/endpointish/errors.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/exception_handling/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/globus_cli_flake8.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/login_manager/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/login_manager/_old_config.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/login_manager/auth_flows.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/login_manager/client_login.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/login_manager/context.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/login_manager/errors.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/login_manager/local_server.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/login_manager/manager.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/login_manager/storage.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/login_manager/utils.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/parsing/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/parsing/command_state.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/parsing/commands.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/parsing/mutex_group.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/parsing/param_classes.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/parsing/param_types/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/parsing/param_types/delimited.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/parsing/param_types/endpoint_plus_path.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/parsing/param_types/identity_type.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/parsing/param_types/json_strorfile.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/parsing/param_types/location.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/parsing/param_types/notify_param.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/parsing/param_types/nullable.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/parsing/param_types/task_path.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/parsing/param_types/timedelta.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/parsing/shared_callbacks.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/parsing/shared_options/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/parsing/shared_options/endpointish.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/parsing/shared_options/id_args.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/parsing/shared_options/transfer_task_options.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/parsing/shell_completion.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/reflect.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/services/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/services/auth.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/services/gcs.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/services/transfer/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/services/transfer/activation.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/services/transfer/client.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/services/transfer/data.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/services/transfer/recursive_ls.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/termio/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/termio/_display.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/termio/context.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/termio/errors.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/termio/field.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/termio/formatters/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/termio/formatters/auth.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/termio/formatters/base.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/termio/formatters/compound.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/termio/formatters/primitive.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/termio/printers/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/termio/printers/base.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/termio/printers/custom_printer.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/termio/printers/json_printer.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/termio/printers/record_printer.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/termio/printers/unix_printer/__init__.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/termio/printers/unix_printer/awscli_text.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/termio/printers/unix_printer/unix_printer.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/termio/server_timing.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli/utils.py +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli.egg-info/dependency_links.txt +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli.egg-info/entry_points.txt +0 -0
- {globus_cli-3.33.0 → globus_cli-3.34.0}/src/globus_cli.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: globus-cli
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.34.0
|
|
4
4
|
Summary: Globus CLI
|
|
5
5
|
Author-email: Stephen Rosen <sirosen@globus.org>
|
|
6
6
|
Project-URL: homepage, https://github.com/globus/globus-cli
|
|
@@ -19,12 +19,13 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
19
19
|
Requires-Python: >=3.8
|
|
20
20
|
Description-Content-Type: text/x-rst
|
|
21
21
|
License-File: LICENSE
|
|
22
|
-
Requires-Dist: globus-sdk==3.
|
|
22
|
+
Requires-Dist: globus-sdk==3.55.0
|
|
23
23
|
Requires-Dist: click<9,>=8.1.4
|
|
24
24
|
Requires-Dist: jmespath==1.0.1
|
|
25
25
|
Requires-Dist: packaging>=17.0
|
|
26
26
|
Requires-Dist: typing_extensions>=4.0; python_version < "3.11"
|
|
27
27
|
Requires-Dist: requests<3.0.0,>=2.32.3
|
|
28
|
+
Dynamic: license-file
|
|
28
29
|
|
|
29
30
|
.. image:: https://github.com/globus/globus-cli/workflows/build/badge.svg?event=push
|
|
30
31
|
:alt: build status
|
|
@@ -29,7 +29,7 @@ classifiers = [
|
|
|
29
29
|
]
|
|
30
30
|
requires-python = ">=3.8"
|
|
31
31
|
dependencies = [
|
|
32
|
-
"globus-sdk==3.
|
|
32
|
+
"globus-sdk==3.55.0",
|
|
33
33
|
"click>=8.1.4,<9",
|
|
34
34
|
"jmespath==1.0.1",
|
|
35
35
|
"packaging>=17.0",
|
|
@@ -56,7 +56,7 @@ test = [
|
|
|
56
56
|
"pytest-xdist<4",
|
|
57
57
|
"pytest-timeout<3",
|
|
58
58
|
"click-type-test==1.1.0;python_version>='3.10'",
|
|
59
|
-
"responses==0.25.
|
|
59
|
+
"responses==0.25.7",
|
|
60
60
|
# loading test fixture data
|
|
61
61
|
"ruamel.yaml==0.18.10",
|
|
62
62
|
]
|
|
@@ -134,7 +134,7 @@ def _get_resource_server(service_name: str) -> str:
|
|
|
134
134
|
"groups": globus_sdk.GroupsClient.resource_server,
|
|
135
135
|
"search": globus_sdk.SearchClient.resource_server,
|
|
136
136
|
"transfer": globus_sdk.TransferClient.resource_server,
|
|
137
|
-
"
|
|
137
|
+
"timers": globus_sdk.TimerClient.resource_server,
|
|
138
138
|
}.get(service_name)
|
|
139
139
|
if _resource_server is None:
|
|
140
140
|
raise NotImplementedError(f"unrecognized service: {service_name}")
|
|
@@ -154,7 +154,7 @@ def _get_client(
|
|
|
154
154
|
return login_manager.get_search_client()
|
|
155
155
|
elif service_name == "transfer":
|
|
156
156
|
return login_manager.get_transfer_client()
|
|
157
|
-
elif service_name == "
|
|
157
|
+
elif service_name == "timers":
|
|
158
158
|
return login_manager.get_timer_client()
|
|
159
159
|
else:
|
|
160
160
|
raise NotImplementedError(f"unrecognized service: {service_name}")
|
|
@@ -167,7 +167,7 @@ def _get_url(service_name: str) -> str:
|
|
|
167
167
|
"groups": "https://groups.api.globus.org/v2/",
|
|
168
168
|
"search": "https://search.api.globus.org/",
|
|
169
169
|
"transfer": "https://transfer.api.globus.org/v0.10/",
|
|
170
|
-
"
|
|
170
|
+
"timers": "https://timer.automate.globus.org/",
|
|
171
171
|
"gcs": "https://$GCS_MANAGER/",
|
|
172
172
|
}[service_name]
|
|
173
173
|
|
|
@@ -356,7 +356,14 @@ def api_command() -> None:
|
|
|
356
356
|
|
|
357
357
|
# note: this must be written as a separate call and not inlined into the loop body
|
|
358
358
|
# this ensures that it acts as a closure over 'service_name'
|
|
359
|
-
def build_command(
|
|
359
|
+
def build_command(
|
|
360
|
+
command_name: ServiceNameLiteral | t.Literal["gcs", "timer"],
|
|
361
|
+
) -> click.Command:
|
|
362
|
+
service_name: ServiceNameLiteral | t.Literal["gcs"] = (
|
|
363
|
+
"timers" if command_name == "timer" else command_name
|
|
364
|
+
)
|
|
365
|
+
hidden: bool = command_name == "timer"
|
|
366
|
+
|
|
360
367
|
helptext = f"""\
|
|
361
368
|
Make API calls to Globus {service_name.title()}
|
|
362
369
|
|
|
@@ -364,14 +371,14 @@ The arguments are an HTTP method name and a path within the service to which the
|
|
|
364
371
|
should be made. The path will be joined with the known service URL.
|
|
365
372
|
For example, a call of
|
|
366
373
|
|
|
367
|
-
globus api {
|
|
374
|
+
globus api {command_name} GET /foo/bar
|
|
368
375
|
|
|
369
|
-
sends a 'GET' request to
|
|
376
|
+
sends a 'GET' request to `{_get_url(service_name)}foo/bar`
|
|
370
377
|
"""
|
|
371
378
|
|
|
372
379
|
if service_name != "gcs":
|
|
373
380
|
|
|
374
|
-
@command(
|
|
381
|
+
@command(command_name, help=helptext, hidden=hidden)
|
|
375
382
|
@LoginManager.requires_login(service_name)
|
|
376
383
|
@_service_command_params
|
|
377
384
|
def service_command(
|
|
@@ -457,3 +464,4 @@ for service_name_ in CLI_SCOPE_REQUIREMENTS:
|
|
|
457
464
|
del service_name_
|
|
458
465
|
|
|
459
466
|
api_command.add_command(build_command("gcs"))
|
|
467
|
+
api_command.add_command(build_command("timer"))
|
|
@@ -15,8 +15,5 @@ def list_command(login_manager: LoginManager) -> None:
|
|
|
15
15
|
"""List indices where you have some permissions."""
|
|
16
16
|
search_client = login_manager.get_search_client()
|
|
17
17
|
display(
|
|
18
|
-
search_client.
|
|
19
|
-
fields=INDEX_LIST_FIELDS,
|
|
20
|
-
text_mode=display.TABLE,
|
|
21
|
-
response_key="index_list",
|
|
18
|
+
search_client.index_list(), fields=INDEX_LIST_FIELDS, text_mode=display.TABLE
|
|
22
19
|
)
|
|
@@ -213,10 +213,10 @@ def task_list(
|
|
|
213
213
|
[
|
|
214
214
|
_process_filterval("label", label_data),
|
|
215
215
|
_process_filterval(
|
|
216
|
-
"request_time", [
|
|
216
|
+
"request_time", [filter_requested_after, filter_requested_before]
|
|
217
217
|
),
|
|
218
218
|
_process_filterval(
|
|
219
|
-
"completion_time", [
|
|
219
|
+
"completion_time", [filter_completed_after, filter_completed_before]
|
|
220
220
|
),
|
|
221
221
|
]
|
|
222
222
|
)
|
|
@@ -117,7 +117,7 @@ e.g. '1h30m', '500s', '10d'
|
|
|
117
117
|
),
|
|
118
118
|
)
|
|
119
119
|
@mutex_option_group("--delete", "--delete-destination-extra")
|
|
120
|
-
@LoginManager.requires_login("auth", "
|
|
120
|
+
@LoginManager.requires_login("auth", "timers", "transfer")
|
|
121
121
|
def transfer_command(
|
|
122
122
|
login_manager: LoginManager,
|
|
123
123
|
*,
|
|
@@ -11,7 +11,7 @@ from ._common import DELETED_TIMER_FORMAT_FIELDS
|
|
|
11
11
|
|
|
12
12
|
@command("delete", short_help="Delete a timer.")
|
|
13
13
|
@click.argument("TIMER_ID", type=click.UUID)
|
|
14
|
-
@LoginManager.requires_login("
|
|
14
|
+
@LoginManager.requires_login("timers")
|
|
15
15
|
def delete_command(login_manager: LoginManager, *, timer_id: uuid.UUID) -> None:
|
|
16
16
|
"""
|
|
17
17
|
Delete a timer.
|
|
@@ -9,7 +9,7 @@ from globus_cli.termio import display
|
|
|
9
9
|
|
|
10
10
|
@command("pause", short_help="Pause a timer.")
|
|
11
11
|
@click.argument("TIMER_ID", type=click.UUID)
|
|
12
|
-
@LoginManager.requires_login("
|
|
12
|
+
@LoginManager.requires_login("timers")
|
|
13
13
|
def pause_command(login_manager: LoginManager, *, timer_id: uuid.UUID) -> None:
|
|
14
14
|
"""
|
|
15
15
|
Pause a timer.
|
|
@@ -11,7 +11,7 @@ from ._common import TIMER_FORMAT_FIELDS
|
|
|
11
11
|
|
|
12
12
|
@command("show", short_help="Display a timer.")
|
|
13
13
|
@click.argument("TIMER_ID", type=click.UUID)
|
|
14
|
-
@LoginManager.requires_login("
|
|
14
|
+
@LoginManager.requires_login("timers")
|
|
15
15
|
def show_command(login_manager: LoginManager, *, timer_id: uuid.UUID) -> None:
|
|
16
16
|
"""
|
|
17
17
|
Display information about a particular timer.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing as t
|
|
4
|
+
|
|
5
|
+
from ..registry import DeclaredHook, register_hook
|
|
6
|
+
from .auth_requirements import (
|
|
7
|
+
consent_required_hook,
|
|
8
|
+
handle_internal_auth_requirements,
|
|
9
|
+
missing_login_error_hook,
|
|
10
|
+
session_hook,
|
|
11
|
+
)
|
|
12
|
+
from .authapi_hooks import (
|
|
13
|
+
authapi_hook,
|
|
14
|
+
authapi_unauthenticated_hook,
|
|
15
|
+
invalidrefresh_hook,
|
|
16
|
+
)
|
|
17
|
+
from .endpoint_types import wrong_endpoint_type_error_hook
|
|
18
|
+
from .flows_hooks import (
|
|
19
|
+
flows_error_hook,
|
|
20
|
+
flows_validation_error_hook,
|
|
21
|
+
handle_flows_gare,
|
|
22
|
+
)
|
|
23
|
+
from .generic_hooks import (
|
|
24
|
+
globus_error_hook,
|
|
25
|
+
globusapi_hook,
|
|
26
|
+
json_error_handler,
|
|
27
|
+
null_data_error_handler,
|
|
28
|
+
)
|
|
29
|
+
from .search_hooks import searchapi_hook, searchapi_validationerror_hook
|
|
30
|
+
from .transfer_hooks import transfer_unauthenticated_hook, transferapi_hook
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def register_all_hooks() -> None:
|
|
34
|
+
"""
|
|
35
|
+
Load and register all hook functions.
|
|
36
|
+
"""
|
|
37
|
+
for hook in _sort_all_hooks():
|
|
38
|
+
register_hook(hook)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _sort_all_hooks() -> t.Iterable[DeclaredHook[t.Any]]:
|
|
42
|
+
"""
|
|
43
|
+
Iterate over all hooks in priority order.
|
|
44
|
+
"""
|
|
45
|
+
# format as a list of lists for readability
|
|
46
|
+
sorted_hook_collections: list[list[DeclaredHook[t.Any]]] = [
|
|
47
|
+
# first, the generic hooks which filter out conditions
|
|
48
|
+
# running 'null data' first ensures that every other
|
|
49
|
+
# hook can assume that there is a JSON body
|
|
50
|
+
# and running json_error_handler at the start means we know (in the
|
|
51
|
+
# following hooks) that the output format is not JSON
|
|
52
|
+
[null_data_error_handler, json_error_handler],
|
|
53
|
+
# next, authn and session requirements, from most specific to most general
|
|
54
|
+
[handle_internal_auth_requirements, handle_flows_gare],
|
|
55
|
+
[session_hook, consent_required_hook],
|
|
56
|
+
# CLI internal error types, which cannot be confused with external causes
|
|
57
|
+
[missing_login_error_hook, wrong_endpoint_type_error_hook],
|
|
58
|
+
# service-specific hooks uncaptured by earlier checks
|
|
59
|
+
# each service has internal precedence ordering, but the collections could
|
|
60
|
+
# probably be put in any order
|
|
61
|
+
[authapi_unauthenticated_hook, invalidrefresh_hook, authapi_hook],
|
|
62
|
+
[transfer_unauthenticated_hook, transferapi_hook],
|
|
63
|
+
[flows_validation_error_hook, flows_error_hook],
|
|
64
|
+
[searchapi_validationerror_hook, searchapi_hook],
|
|
65
|
+
# finally, the catch-all hooks
|
|
66
|
+
[globusapi_hook, globus_error_hook],
|
|
67
|
+
]
|
|
68
|
+
|
|
69
|
+
for hook_collection in sorted_hook_collections:
|
|
70
|
+
yield from hook_collection
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import click
|
|
4
|
+
import globus_sdk
|
|
5
|
+
|
|
6
|
+
from globus_cli.login_manager import MissingLoginError
|
|
7
|
+
from globus_cli.utils import CLIAuthRequirementsError
|
|
8
|
+
|
|
9
|
+
from ..messages import (
|
|
10
|
+
DEFAULT_CONSENT_REAUTH_MESSAGE,
|
|
11
|
+
DEFAULT_SESSION_REAUTH_MESSAGE,
|
|
12
|
+
emit_consent_required_message,
|
|
13
|
+
emit_message_for_gare,
|
|
14
|
+
emit_session_update_message,
|
|
15
|
+
)
|
|
16
|
+
from ..registry import error_handler, sdk_error_handler
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@error_handler(error_class=CLIAuthRequirementsError, exit_status=4)
|
|
20
|
+
def handle_internal_auth_requirements(
|
|
21
|
+
exception: CLIAuthRequirementsError,
|
|
22
|
+
) -> int | None:
|
|
23
|
+
gare = exception.gare
|
|
24
|
+
if not gare:
|
|
25
|
+
msg = "Fatal Error: Unsupported internal auth requirements error!"
|
|
26
|
+
click.secho(msg, bold=True, fg="red")
|
|
27
|
+
return 255
|
|
28
|
+
|
|
29
|
+
emit_message_for_gare(gare, exception.message)
|
|
30
|
+
|
|
31
|
+
if exception.epilog:
|
|
32
|
+
click.echo("\n* * *\n")
|
|
33
|
+
click.echo(exception.epilog)
|
|
34
|
+
|
|
35
|
+
return None
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@sdk_error_handler(
|
|
39
|
+
condition=lambda err: bool(err.info.authorization_parameters), exit_status=4
|
|
40
|
+
)
|
|
41
|
+
def session_hook(exception: globus_sdk.GlobusAPIError) -> None:
|
|
42
|
+
"""
|
|
43
|
+
Expects an exception with a valid authorization_paramaters info field.
|
|
44
|
+
"""
|
|
45
|
+
message = exception.info.authorization_parameters.session_message
|
|
46
|
+
if message:
|
|
47
|
+
message = f"{DEFAULT_SESSION_REAUTH_MESSAGE}\nmessage: {message}"
|
|
48
|
+
else:
|
|
49
|
+
message = DEFAULT_SESSION_REAUTH_MESSAGE
|
|
50
|
+
|
|
51
|
+
emit_session_update_message(
|
|
52
|
+
identities=exception.info.authorization_parameters.session_required_identities,
|
|
53
|
+
domains=exception.info.authorization_parameters.session_required_single_domain,
|
|
54
|
+
policies=exception.info.authorization_parameters.session_required_policies,
|
|
55
|
+
message=message,
|
|
56
|
+
)
|
|
57
|
+
return None
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@sdk_error_handler(condition=lambda err: bool(err.info.consent_required), exit_status=4)
|
|
61
|
+
def consent_required_hook(exception: globus_sdk.GlobusAPIError) -> int | None:
|
|
62
|
+
"""
|
|
63
|
+
Expects an exception with a required_scopes field in its raw_json.
|
|
64
|
+
"""
|
|
65
|
+
if not exception.info.consent_required.required_scopes:
|
|
66
|
+
msg = (
|
|
67
|
+
"Fatal Error: A ConsentRequired error was encountered "
|
|
68
|
+
"but the error did not contain a required_scopes field!"
|
|
69
|
+
)
|
|
70
|
+
click.secho(msg, bold=True, fg="red")
|
|
71
|
+
return 255
|
|
72
|
+
|
|
73
|
+
# specialized message for data_access errors
|
|
74
|
+
# otherwise, use more generic phrasing
|
|
75
|
+
if exception.message == "Missing required data_access consent":
|
|
76
|
+
message = (
|
|
77
|
+
"The collection you are trying to access data on requires you to "
|
|
78
|
+
"grant consent for the Globus CLI to access it."
|
|
79
|
+
)
|
|
80
|
+
else:
|
|
81
|
+
message = f"{DEFAULT_CONSENT_REAUTH_MESSAGE}\nMessage: {exception.message}"
|
|
82
|
+
|
|
83
|
+
emit_consent_required_message(
|
|
84
|
+
required_scopes=exception.info.consent_required.required_scopes, message=message
|
|
85
|
+
)
|
|
86
|
+
return None
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@error_handler(error_class=MissingLoginError, exit_status=4)
|
|
90
|
+
def missing_login_error_hook(exception: MissingLoginError) -> None:
|
|
91
|
+
click.echo(
|
|
92
|
+
click.style("MissingLoginError: ", fg="yellow") + exception.message,
|
|
93
|
+
err=True,
|
|
94
|
+
)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import globus_sdk
|
|
4
|
+
|
|
5
|
+
from globus_cli.termio import PrintableErrorField, write_error_info
|
|
6
|
+
|
|
7
|
+
from ..messages import emit_unauthorized_message
|
|
8
|
+
from ..registry import sdk_error_handler
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@sdk_error_handler(
|
|
12
|
+
error_class="AuthAPIError", condition=lambda err: err.code == "UNAUTHORIZED"
|
|
13
|
+
)
|
|
14
|
+
def authapi_unauthenticated_hook(exception: globus_sdk.AuthAPIError) -> None:
|
|
15
|
+
emit_unauthorized_message()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@sdk_error_handler(
|
|
19
|
+
error_class="AuthAPIError",
|
|
20
|
+
condition=lambda err: err.message == "invalid_grant",
|
|
21
|
+
)
|
|
22
|
+
def invalidrefresh_hook(exception: globus_sdk.AuthAPIError) -> None:
|
|
23
|
+
emit_unauthorized_message()
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@sdk_error_handler(error_class="AuthAPIError")
|
|
27
|
+
def authapi_hook(exception: globus_sdk.AuthAPIError) -> None:
|
|
28
|
+
write_error_info(
|
|
29
|
+
"Auth API Error",
|
|
30
|
+
[
|
|
31
|
+
PrintableErrorField("HTTP status", exception.http_status),
|
|
32
|
+
PrintableErrorField("code", exception.code),
|
|
33
|
+
PrintableErrorField("message", exception.message, multiline=True),
|
|
34
|
+
],
|
|
35
|
+
)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import click
|
|
4
|
+
|
|
5
|
+
from globus_cli.endpointish import WrongEntityTypeError
|
|
6
|
+
|
|
7
|
+
from ..registry import error_handler
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@error_handler(error_class=WrongEntityTypeError, exit_status=3)
|
|
11
|
+
def wrong_endpoint_type_error_hook(exception: WrongEntityTypeError) -> None:
|
|
12
|
+
msg = exception.expected_message + "\n" + exception.actual_message + "\n\n"
|
|
13
|
+
click.secho(msg, fg="yellow", err=True)
|
|
14
|
+
|
|
15
|
+
should_use = exception.should_use_command()
|
|
16
|
+
if should_use:
|
|
17
|
+
click.echo(
|
|
18
|
+
"Please run the following command instead:\n\n"
|
|
19
|
+
f" {should_use} {exception.endpoint_id}\n",
|
|
20
|
+
err=True,
|
|
21
|
+
)
|
|
22
|
+
else:
|
|
23
|
+
msg = "This operation is not supported on objects of this type."
|
|
24
|
+
click.secho(msg, fg="red", bold=True, err=True)
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import textwrap
|
|
4
|
+
import typing as t
|
|
5
|
+
|
|
6
|
+
import globus_sdk
|
|
7
|
+
import globus_sdk.gare
|
|
8
|
+
|
|
9
|
+
from globus_cli.termio import PrintableErrorField, write_error_info
|
|
10
|
+
|
|
11
|
+
from ..messages import emit_message_for_gare, pretty_json
|
|
12
|
+
from ..registry import sdk_error_handler
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@sdk_error_handler(
|
|
16
|
+
error_class="FlowsAPIError",
|
|
17
|
+
condition=lambda err: globus_sdk.gare.is_gare(err.raw_json or {}),
|
|
18
|
+
exit_status=4,
|
|
19
|
+
)
|
|
20
|
+
def handle_flows_gare(exception: globus_sdk.FlowsAPIError) -> int | None:
|
|
21
|
+
gare = globus_sdk.gare.to_gare(exception.raw_json or {})
|
|
22
|
+
if not gare:
|
|
23
|
+
raise ValueError("Expected a GARE, but got None")
|
|
24
|
+
|
|
25
|
+
emit_message_for_gare(gare)
|
|
26
|
+
return None
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@sdk_error_handler(
|
|
30
|
+
error_class="FlowsAPIError",
|
|
31
|
+
condition=lambda err: err.code == "UNPROCESSABLE_ENTITY",
|
|
32
|
+
)
|
|
33
|
+
def flows_validation_error_hook(exception: globus_sdk.FlowsAPIError) -> None:
|
|
34
|
+
# we know the data must be a dict because `code` parsed (condition above)
|
|
35
|
+
error_data: dict[str, t.Any] = exception.raw_json # type: ignore[assignment]
|
|
36
|
+
|
|
37
|
+
# try to pull the details array, empty on failure
|
|
38
|
+
details_list: list[dict[str, t.Any]] = []
|
|
39
|
+
try:
|
|
40
|
+
detail = error_data["error"]["detail"]
|
|
41
|
+
if isinstance(detail, list):
|
|
42
|
+
details_list = detail
|
|
43
|
+
except KeyError:
|
|
44
|
+
pass
|
|
45
|
+
|
|
46
|
+
# try to pull the 'message' string into a list of fields to render
|
|
47
|
+
message_fields: list[PrintableErrorField] = []
|
|
48
|
+
try:
|
|
49
|
+
message_fields = [
|
|
50
|
+
PrintableErrorField("message", error_data["error"]["message"])
|
|
51
|
+
]
|
|
52
|
+
except KeyError:
|
|
53
|
+
pass
|
|
54
|
+
|
|
55
|
+
# if there are multiple details or we couldn't get a message
|
|
56
|
+
# then rewrite the messages to display as formatted pydantic error data
|
|
57
|
+
if len(details_list) > 1 or not message_fields:
|
|
58
|
+
num_errors = len(details_list)
|
|
59
|
+
# try to extract 'loc' and 'msg' from the details, but only
|
|
60
|
+
# update 'message_fields' if the data are present
|
|
61
|
+
try:
|
|
62
|
+
messages = [
|
|
63
|
+
f"{_jsonpath_from_pydantic_loc(data['loc'])}: {data['msg']}"
|
|
64
|
+
for data in details_list
|
|
65
|
+
]
|
|
66
|
+
except KeyError:
|
|
67
|
+
pass
|
|
68
|
+
else:
|
|
69
|
+
message_fields = [
|
|
70
|
+
PrintableErrorField(
|
|
71
|
+
"message", f"{num_errors} validation errors", multiline=True
|
|
72
|
+
),
|
|
73
|
+
PrintableErrorField(
|
|
74
|
+
"errors",
|
|
75
|
+
"\n".join(messages),
|
|
76
|
+
multiline=True,
|
|
77
|
+
),
|
|
78
|
+
]
|
|
79
|
+
|
|
80
|
+
# ultimate fallback: get the SDK's interpreted message
|
|
81
|
+
# this only applies if neither $.error.message nor $.error.detail worked
|
|
82
|
+
if not message_fields:
|
|
83
|
+
message_fields = [PrintableErrorField("message", exception.message)]
|
|
84
|
+
|
|
85
|
+
write_error_info(
|
|
86
|
+
"Flows API Error",
|
|
87
|
+
[
|
|
88
|
+
PrintableErrorField("HTTP status", exception.http_status),
|
|
89
|
+
PrintableErrorField("code", exception.code),
|
|
90
|
+
*message_fields,
|
|
91
|
+
],
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@sdk_error_handler(error_class="FlowsAPIError")
|
|
96
|
+
def flows_error_hook(exception: globus_sdk.FlowsAPIError) -> None:
|
|
97
|
+
assert exception.raw_json is not None # Influence mypy's knowledge of `raw_json`.
|
|
98
|
+
details: list[dict[str, t.Any]] | str = exception.raw_json["error"]["detail"]
|
|
99
|
+
detail_fields: list[PrintableErrorField] = []
|
|
100
|
+
|
|
101
|
+
# if the detail is a string, return that as a single field
|
|
102
|
+
if isinstance(details, str):
|
|
103
|
+
if len(details) > 120:
|
|
104
|
+
details = textwrap.fill(details, width=80)
|
|
105
|
+
detail_fields = [PrintableErrorField("detail", details, multiline=True)]
|
|
106
|
+
# if it's a list of objects, wrap them into a multiline detail field
|
|
107
|
+
elif isinstance(details, list):
|
|
108
|
+
num_errors = len(details)
|
|
109
|
+
if all((isinstance(d, dict) and "loc" in d and "msg" in d) for d in details):
|
|
110
|
+
detail_strings = [
|
|
111
|
+
(
|
|
112
|
+
((data["type"] + " ") if "type" in data else "")
|
|
113
|
+
+ f"{_jsonpath_from_pydantic_loc(data['loc'])}: {data['msg']}"
|
|
114
|
+
)
|
|
115
|
+
for data in details
|
|
116
|
+
]
|
|
117
|
+
if num_errors == 1:
|
|
118
|
+
detail_fields = [PrintableErrorField("detail", detail_strings[0])]
|
|
119
|
+
else:
|
|
120
|
+
detail_fields = [
|
|
121
|
+
PrintableErrorField("detail", f"{num_errors} errors"),
|
|
122
|
+
PrintableErrorField(
|
|
123
|
+
"errors",
|
|
124
|
+
"\n".join(detail_strings),
|
|
125
|
+
multiline=True,
|
|
126
|
+
),
|
|
127
|
+
]
|
|
128
|
+
else:
|
|
129
|
+
detail_fields = [
|
|
130
|
+
PrintableErrorField(
|
|
131
|
+
"detail",
|
|
132
|
+
"\n".join(pretty_json(detail, compact=True) for detail in details),
|
|
133
|
+
multiline=True,
|
|
134
|
+
)
|
|
135
|
+
]
|
|
136
|
+
|
|
137
|
+
fields = [
|
|
138
|
+
PrintableErrorField("HTTP status", exception.http_status),
|
|
139
|
+
PrintableErrorField("code", exception.code),
|
|
140
|
+
]
|
|
141
|
+
if "message" in exception.raw_json["error"]:
|
|
142
|
+
fields.append(
|
|
143
|
+
PrintableErrorField("message", exception.raw_json["error"]["message"])
|
|
144
|
+
)
|
|
145
|
+
fields.extend(detail_fields)
|
|
146
|
+
|
|
147
|
+
write_error_info("Flows API Error", fields)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
_JSONPATH_SPECIAL_CHARS = "[]'\"\\."
|
|
151
|
+
_JSONPATH_ESCAPE_MAP = str.maketrans(
|
|
152
|
+
{
|
|
153
|
+
"'": "\\'",
|
|
154
|
+
"\\": "\\\\",
|
|
155
|
+
}
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def _jsonpath_from_pydantic_loc(loc: list[str | int]) -> str:
|
|
160
|
+
"""
|
|
161
|
+
Given a 'loc' from pydantic error data, convert it into a JSON Path expression.
|
|
162
|
+
|
|
163
|
+
Takes the following steps:
|
|
164
|
+
- turns integers into integer indices
|
|
165
|
+
- turns most strings into dotted access
|
|
166
|
+
- turns strings containing special characters into single-quoted bracket access
|
|
167
|
+
with ' and \\ escaped
|
|
168
|
+
"""
|
|
169
|
+
path = "$"
|
|
170
|
+
for part in loc:
|
|
171
|
+
if isinstance(part, int):
|
|
172
|
+
path += f"[{part}]"
|
|
173
|
+
else:
|
|
174
|
+
if any(c in part for c in _JSONPATH_SPECIAL_CHARS):
|
|
175
|
+
part = f"'{part.translate(_JSONPATH_ESCAPE_MAP)}'"
|
|
176
|
+
path += f"[{part}]"
|
|
177
|
+
else:
|
|
178
|
+
path += f".{part}"
|
|
179
|
+
return path
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
|
|
5
|
+
import click
|
|
6
|
+
import globus_sdk
|
|
7
|
+
|
|
8
|
+
from globus_cli.termio import PrintableErrorField, outformat_is_json, write_error_info
|
|
9
|
+
|
|
10
|
+
from ..registry import sdk_error_handler
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@sdk_error_handler(
|
|
14
|
+
error_class="GlobusAPIError", condition=lambda err: err.raw_json is None
|
|
15
|
+
)
|
|
16
|
+
def null_data_error_handler(exception: globus_sdk.GlobusAPIError) -> None:
|
|
17
|
+
write_error_info(
|
|
18
|
+
"GlobusAPINullDataError",
|
|
19
|
+
[PrintableErrorField("error_type", exception.__class__.__name__)],
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@sdk_error_handler(
|
|
24
|
+
error_class="GlobusAPIError", condition=lambda err: outformat_is_json()
|
|
25
|
+
)
|
|
26
|
+
def json_error_handler(exception: globus_sdk.GlobusAPIError) -> None:
|
|
27
|
+
msg = json.dumps(exception.raw_json, indent=2)
|
|
28
|
+
click.secho(msg, fg="yellow", err=True)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@sdk_error_handler() # catch-all
|
|
32
|
+
def globusapi_hook(exception: globus_sdk.GlobusAPIError) -> None:
|
|
33
|
+
write_error_info(
|
|
34
|
+
"Globus API Error",
|
|
35
|
+
[
|
|
36
|
+
PrintableErrorField("HTTP status", exception.http_status),
|
|
37
|
+
PrintableErrorField("code", exception.code),
|
|
38
|
+
PrintableErrorField("message", exception.message, multiline=True),
|
|
39
|
+
],
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@sdk_error_handler(error_class="GlobusError")
|
|
44
|
+
def globus_error_hook(exception: globus_sdk.GlobusError) -> None:
|
|
45
|
+
write_error_info(
|
|
46
|
+
"Globus Error",
|
|
47
|
+
[
|
|
48
|
+
PrintableErrorField("error_type", exception.__class__.__name__),
|
|
49
|
+
PrintableErrorField("message", str(exception), multiline=True),
|
|
50
|
+
],
|
|
51
|
+
)
|