globus-cli 3.42.0__tar.gz → 3.43.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.42.0 → globus_cli-3.43.0}/PKG-INFO +5 -4
- {globus_cli-3.42.0 → globus_cli-3.43.0}/changelog.adoc +19 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/pyproject.toml +5 -5
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/__init__.py +2 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/_common.py +12 -4
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/_fields.py +116 -0
- globus_cli-3.43.0/src/globus_cli/commands/flows/web_input/__init__.py +13 -0
- globus_cli-3.43.0/src/globus_cli/commands/flows/web_input/list.py +132 -0
- globus_cli-3.43.0/src/globus_cli/commands/flows/web_input/respond.py +36 -0
- globus_cli-3.43.0/src/globus_cli/commands/flows/web_input/show.py +24 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/get_identities.py +16 -6
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/__init__.py +2 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/delimited.py +11 -5
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/omittable.py +20 -5
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/shared_options/id_args.py +4 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/_display.py +2 -2
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/context.py +1 -1
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/field.py +4 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/folded_table_printer.py +35 -7
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/record_printer.py +21 -3
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/version.py +1 -1
- {globus_cli-3.42.0 → globus_cli-3.43.0}/LICENSE +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/README.rst +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/__main__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/_warnings.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/_common.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/_removal_stub.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/api.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/bookmark/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/bookmark/_common.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/bookmark/create.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/bookmark/delete.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/bookmark/list.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/bookmark/rename.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/bookmark/show.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/cli_profile_list.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/_common.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/create/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/create/guest.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/create/mapped.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/delete.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/list.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/role/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/role/delete.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/role/list.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/role/show.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/show.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/update.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/delete.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/_common.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/delete.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/local_id.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/my_shared_endpoint_list.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/permission/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/permission/_common.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/permission/create.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/permission/delete.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/permission/list.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/permission/show.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/permission/update.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/role/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/role/_common.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/role/create.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/role/delete.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/role/list.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/role/show.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/search.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/set_subscription_id.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/show.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/storage_gateway/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/storage_gateway/list.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/update.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/_common.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/create/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/create/from_json.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/create/posix.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/create/s3.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/delete.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/list.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/show.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/update/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/update/from_json.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/create.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/delete.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/list.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/registered_api/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/registered_api/list.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/registered_api/show.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/cancel.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/delete.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/list.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/resume.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/show.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/show_definition.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/show_logs.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/update.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/show.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/start.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/update.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/validate.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/create/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/create/_common.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/create/guest.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/create/mapped.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/set_subscription_admin_verified.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/set_subscription_id.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/update/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/update/guest.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/update/mapped.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/_common.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/role/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/role/_common.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/role/create.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/role/delete.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/role/list.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/role/show.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/set_subscription_id.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/show.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/update.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/_common.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/create.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/delete.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/get_by_subscription.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/get_subscription_info.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/invite/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/invite/_common.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/invite/accept.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/invite/decline.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/join.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/leave.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/list.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/member/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/member/add.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/member/approve.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/member/invite.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/member/list.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/member/reject.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/member/remove.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/set_policies.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/set_subscription_admin_verified.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/show.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/update.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/list_commands.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/login.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/logout.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/ls.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/mkdir.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/rename.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/rm.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/_common.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/delete_by_query.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/create.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/delete.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/list.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/role/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/role/create.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/role/delete.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/role/list.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/show.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/ingest.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/query.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/subject/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/subject/delete.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/subject/show.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/task/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/task/list.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/task/show.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/session/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/session/consent.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/session/show.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/session/update.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/stat.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/access_point/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/access_point/show.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/_common.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/create.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/delete.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/events.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/list.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/show.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/stop.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/update.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/_common.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/cancel.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/event_list.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/generate_submission_id.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/list.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/pause_info.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/show.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/update.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/wait.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/_common.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/create/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/create/_common.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/create/flow.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/create/transfer.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/delete.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/list.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/pause.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/resume.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/show.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/transfer.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/update.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/version.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/whoami.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/constants.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/endpointish/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/endpointish/endpointish.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/endpointish/entity_type.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/endpointish/errors.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/auth_requirements.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/authapi_hooks.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/endpoint_types.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/flows_hooks.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/generic_hooks.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/search_hooks.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/transfer_hooks.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/messages.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/registry.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/globus_cli_flake8.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/_old_config.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/auth_flows.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/client_login.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/context.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/errors.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/local_server.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/manager.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/scopes.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/storage.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/utils.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/command_state.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/commands.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/mutex_group.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_classes.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/endpoint_plus_path.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/guest_activity_notify_param.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/identity_type.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/json_strorfile.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/location.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/notify_param.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/nullable.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/task_path.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/timedelta.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/shared_callbacks.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/shared_options/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/shared_options/endpointish.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/shared_options/flow_options.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/shared_options/transfer_task_options.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/shell_completion.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/reflect.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/services/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/services/auth.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/services/gcs.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/services/transfer/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/services/transfer/client.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/services/transfer/data.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/services/transfer/recursive_ls.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/errors.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/formatters/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/formatters/auth.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/formatters/base.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/formatters/compound.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/formatters/primitive.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/base.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/custom_printer.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/json_printer.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/table_printer.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/unix_printer/__init__.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/unix_printer/_formatter.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/unix_printer/unix_printer.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/server_timing.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/types.py +0 -0
- {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: globus-cli
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.43.0
|
|
4
4
|
Summary: Globus CLI
|
|
5
5
|
Keywords: globus,cli,command line
|
|
6
6
|
Author-email: Stephen Rosen <sirosen@globus.org>
|
|
@@ -17,13 +17,14 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
17
17
|
Classifier: Programming Language :: Python :: 3.13
|
|
18
18
|
Classifier: Programming Language :: Python :: 3.14
|
|
19
19
|
License-File: LICENSE
|
|
20
|
-
Requires-Dist: globus-sdk==4.
|
|
20
|
+
Requires-Dist: globus-sdk==4.9.0
|
|
21
21
|
Requires-Dist: click>=8.4,<8.5
|
|
22
22
|
Requires-Dist: jmespath==1.1.0
|
|
23
23
|
Requires-Dist: packaging>=17.0
|
|
24
24
|
Requires-Dist: typing_extensions>=4.0;python_version<'3.11'
|
|
25
|
-
Requires-Dist: requests>=2.
|
|
25
|
+
Requires-Dist: requests>=2.34.2,<3.0.0
|
|
26
26
|
Project-URL: homepage, https://github.com/globus/globus-cli
|
|
27
|
+
Import-Name: globus_cli
|
|
27
28
|
|
|
28
29
|
Globus CLI
|
|
29
30
|
==========
|
|
@@ -2,6 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
// scriv-insert-here
|
|
4
4
|
|
|
5
|
+
== 3.43.0 (2026-08-12)
|
|
6
|
+
|
|
7
|
+
Bugfixes:
|
|
8
|
+
|
|
9
|
+
* Fixed a bug in which terminal device (TTY) detection ran even when
|
|
10
|
+
`GLOBUS_CLI_FOLD_TABLES=1` is set.
|
|
11
|
+
Setting the variable to true now forces use of folded tables.
|
|
12
|
+
Non-TTY output devices will be detected as having a fixed width of 80
|
|
13
|
+
characters.
|
|
14
|
+
|
|
15
|
+
* Fixed `globus get-identities` to lowercase usernames and IDs before
|
|
16
|
+
comparisons for normal text output.
|
|
17
|
+
|
|
18
|
+
Enhancements:
|
|
19
|
+
|
|
20
|
+
* Folded table output will now have bolded headers in interactive terminals.
|
|
21
|
+
|
|
22
|
+
* Add `globus flows web-input` subcommands to interact with Web Inputs.
|
|
23
|
+
|
|
5
24
|
== 3.42.0 (2026-06-10)
|
|
6
25
|
|
|
7
26
|
Bugfixes:
|
|
@@ -28,7 +28,7 @@ classifiers = [
|
|
|
28
28
|
]
|
|
29
29
|
requires-python = ">=3.10"
|
|
30
30
|
dependencies = [
|
|
31
|
-
"globus-sdk==4.
|
|
31
|
+
"globus-sdk==4.9.0",
|
|
32
32
|
# NOTE: `click` does not use semver; minor releases are expected to contain
|
|
33
33
|
# minor breaking changes
|
|
34
34
|
"click>=8.4,<8.5",
|
|
@@ -37,7 +37,7 @@ dependencies = [
|
|
|
37
37
|
"typing_extensions>=4.0;python_version<'3.11'",
|
|
38
38
|
# these are dependencies of the SDK, but they are used directly in the CLI
|
|
39
39
|
# declare them here in case the underlying lib ever changes
|
|
40
|
-
"requests>=2.
|
|
40
|
+
"requests>=2.34.2,<3.0.0",
|
|
41
41
|
]
|
|
42
42
|
dynamic = ["version"]
|
|
43
43
|
|
|
@@ -64,20 +64,20 @@ test = [
|
|
|
64
64
|
test-mindeps = [
|
|
65
65
|
{include-group = "test"},
|
|
66
66
|
"click==8.4.0",
|
|
67
|
-
"requests==2.
|
|
67
|
+
"requests==2.34.2",
|
|
68
68
|
"pyjwt==2.0.0",
|
|
69
69
|
"cryptography==3.3.1",
|
|
70
70
|
"packaging==17.0",
|
|
71
71
|
"typing_extensions==4.0",
|
|
72
72
|
]
|
|
73
73
|
typing = [
|
|
74
|
-
"mypy==1.
|
|
74
|
+
"mypy==2.1.0",
|
|
75
75
|
"types-jwt",
|
|
76
76
|
"types-requests",
|
|
77
77
|
"types-jmespath",
|
|
78
78
|
]
|
|
79
79
|
check-project-metadata = [
|
|
80
|
-
"mddj==0.
|
|
80
|
+
"mddj==0.6.0",
|
|
81
81
|
{include-group = "yaml"},
|
|
82
82
|
"build",
|
|
83
83
|
"twine",
|
|
@@ -15,6 +15,8 @@ from globus_cli.parsing import group
|
|
|
15
15
|
"run": (".run", "run_command"),
|
|
16
16
|
# "registered-api" is a subgroup of commands.
|
|
17
17
|
"registered-api": (".registered_api", "registered_api_command"),
|
|
18
|
+
# "web-input" is a subgroup of commands.
|
|
19
|
+
"web-input": (".web_input", "web_input_command"),
|
|
18
20
|
},
|
|
19
21
|
)
|
|
20
22
|
def flows_command() -> None:
|
|
@@ -131,13 +131,21 @@ class SubscriptionIdType(
|
|
|
131
131
|
name = "SUBSCRIPTION_ID"
|
|
132
132
|
|
|
133
133
|
def __init__(self, *, omittable: bool = False) -> None:
|
|
134
|
-
self._omittable = omittable
|
|
134
|
+
self._omittable: bool = omittable
|
|
135
135
|
|
|
136
136
|
def convert(
|
|
137
|
-
self,
|
|
137
|
+
self,
|
|
138
|
+
value: t.Any | globus_sdk.MissingType,
|
|
139
|
+
param: click.Parameter | None,
|
|
140
|
+
ctx: click.Context | None,
|
|
138
141
|
) -> uuid.UUID | t.Literal["DEFAULT"] | globus_sdk.MissingType:
|
|
139
|
-
if
|
|
140
|
-
|
|
142
|
+
if value is globus_sdk.MISSING:
|
|
143
|
+
if self._omittable:
|
|
144
|
+
return globus_sdk.MISSING
|
|
145
|
+
else:
|
|
146
|
+
raise NotImplementedError(
|
|
147
|
+
"Cannot pass MISSING to non-omittable SubscriptionidType."
|
|
148
|
+
)
|
|
141
149
|
|
|
142
150
|
if value.upper() == "DEFAULT":
|
|
143
151
|
return "DEFAULT"
|
|
@@ -3,6 +3,10 @@ import typing as t
|
|
|
3
3
|
import globus_sdk
|
|
4
4
|
|
|
5
5
|
from globus_cli.termio import Field, formatters
|
|
6
|
+
from globus_cli.termio.formatters import (
|
|
7
|
+
ArrayFormatter,
|
|
8
|
+
FieldFormatter,
|
|
9
|
+
)
|
|
6
10
|
from globus_cli.termio.formatters.auth import PrincipalURNFormatter
|
|
7
11
|
|
|
8
12
|
|
|
@@ -165,3 +169,115 @@ def registered_api_format_fields(
|
|
|
165
169
|
Field("Destination Method", "target.destination.method"),
|
|
166
170
|
Field("Destination URL", "target.destination.url"),
|
|
167
171
|
]
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
class WebInputPrincipalFormatter(PrincipalURNFormatter):
|
|
175
|
+
"""A principal formatter which pre-registers all principals for a web input."""
|
|
176
|
+
|
|
177
|
+
def __init__(
|
|
178
|
+
self, auth_client: globus_sdk.AuthClient, web_input: dict[str, t.Any]
|
|
179
|
+
) -> None:
|
|
180
|
+
super().__init__(auth_client)
|
|
181
|
+
self.add_items(web_input.get("creator_urn"))
|
|
182
|
+
roles = web_input.get("roles", {})
|
|
183
|
+
self.add_items(*roles.get("viewer_urns", ()))
|
|
184
|
+
self.add_items(*roles.get("respondent_urns", ()))
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
class IdentifiedResourceFormatter(FieldFormatter[str]):
|
|
188
|
+
def parse(self, value: t.Any) -> str:
|
|
189
|
+
if not isinstance(value, list) or len(value) != 2:
|
|
190
|
+
raise ValueError("cannot format parenthetical from data of wrong shape")
|
|
191
|
+
name, resource_id = value[0], value[1]
|
|
192
|
+
if not isinstance(resource_id, str):
|
|
193
|
+
raise ValueError("cannot format parenthetical non-str id")
|
|
194
|
+
if isinstance(name, str):
|
|
195
|
+
# If the name can be parsed, render it alongside the resource id
|
|
196
|
+
return f"{name} ({resource_id})"
|
|
197
|
+
# If the name can't be parsed, just render the resource id
|
|
198
|
+
return resource_id
|
|
199
|
+
|
|
200
|
+
def render(self, value: str) -> str:
|
|
201
|
+
return value
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
class _OptionFormatter(FieldFormatter[tuple[t.Any, t.Any]]):
|
|
205
|
+
def parse(self, value: t.Any) -> tuple[t.Any, t.Any]:
|
|
206
|
+
if not isinstance(value, dict):
|
|
207
|
+
raise ValueError("non-dict field value")
|
|
208
|
+
elif "option_id" not in value or "label" not in value:
|
|
209
|
+
raise ValueError("missing key 'option_id' and/or 'label'")
|
|
210
|
+
return value["option_id"], value["label"]
|
|
211
|
+
|
|
212
|
+
def render(self, value: tuple[t.Any, t.Any]) -> str:
|
|
213
|
+
option_id, label = value
|
|
214
|
+
return f"* {option_id} {label}"
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
class _WebInputContextRowsFormatter(FieldFormatter[t.List[t.Tuple[str, str]]]):
|
|
218
|
+
"""Renders a list of {field, value} rows as an aligned 'field: value' block."""
|
|
219
|
+
|
|
220
|
+
def parse(self, value: t.Any) -> list[tuple[str, str]]:
|
|
221
|
+
if not isinstance(value, list):
|
|
222
|
+
raise ValueError("non list context rows value")
|
|
223
|
+
rows = []
|
|
224
|
+
for item in value:
|
|
225
|
+
if not isinstance(item, dict) or "field" not in item or "value" not in item:
|
|
226
|
+
raise ValueError("missing key 'field' and/or 'value'")
|
|
227
|
+
rows.append((item["field"], item["value"]))
|
|
228
|
+
return rows
|
|
229
|
+
|
|
230
|
+
def render(self, value: list[tuple[str, str]]) -> str:
|
|
231
|
+
width = max(len(field) for field, _ in value) + 2
|
|
232
|
+
return "\n".join(f"{field}:".ljust(width) + str(val) for field, val in value)
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
def web_input_format_fields(
|
|
236
|
+
auth_client: globus_sdk.AuthClient,
|
|
237
|
+
web_input: dict[str, t.Any],
|
|
238
|
+
) -> list[Field]:
|
|
239
|
+
"""
|
|
240
|
+
The standard list of fields to render for a web input resource.
|
|
241
|
+
|
|
242
|
+
:param auth_client: An AuthClient, used to resolve principal URNs.
|
|
243
|
+
:param web_input: The web input resource, used to pre-register principals.
|
|
244
|
+
"""
|
|
245
|
+
principal = WebInputPrincipalFormatter(auth_client, web_input)
|
|
246
|
+
csv_principal_list = formatters.ArrayFormatter(
|
|
247
|
+
element_formatter=principal,
|
|
248
|
+
delimiter=", ",
|
|
249
|
+
)
|
|
250
|
+
csv_list = formatters.ArrayFormatter(delimiter=", ")
|
|
251
|
+
flow_run_formatter = IdentifiedResourceFormatter()
|
|
252
|
+
|
|
253
|
+
fields = [
|
|
254
|
+
Field("Web Input ID", "id"),
|
|
255
|
+
Field("Status", "status"),
|
|
256
|
+
Field("Title", "context.title"),
|
|
257
|
+
Field("Your Roles", "user_roles", formatter=csv_list),
|
|
258
|
+
Field("Flow", "[flow.title, flow.id]", formatter=flow_run_formatter),
|
|
259
|
+
Field("Run", "[run.label, run.id]", formatter=flow_run_formatter),
|
|
260
|
+
Field("Creator", "creator_urn", formatter=principal),
|
|
261
|
+
Field("Viewers", "roles.viewer_urns", formatter=csv_principal_list),
|
|
262
|
+
Field("Respondents", "roles.respondent_urns", formatter=csv_principal_list),
|
|
263
|
+
Field("Created At", "created_timestamp", formatter=formatters.Date),
|
|
264
|
+
Field("Closed At", "closed_timestamp", formatter=formatters.Date),
|
|
265
|
+
]
|
|
266
|
+
|
|
267
|
+
if web_input.get("context", {}).get("presentation_style") == "table":
|
|
268
|
+
fields += [
|
|
269
|
+
Field(
|
|
270
|
+
"Context",
|
|
271
|
+
"context.rows",
|
|
272
|
+
section=True,
|
|
273
|
+
formatter=_WebInputContextRowsFormatter(),
|
|
274
|
+
)
|
|
275
|
+
]
|
|
276
|
+
else:
|
|
277
|
+
fields += [Field("Context", "context.text", section=True)]
|
|
278
|
+
|
|
279
|
+
if web_input.get("options"):
|
|
280
|
+
formatter = ArrayFormatter(delimiter="\n", element_formatter=_OptionFormatter())
|
|
281
|
+
fields += [Field("Options", "options", section=True, formatter=formatter)]
|
|
282
|
+
|
|
283
|
+
return fields
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from globus_cli.parsing import group
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
@group(
|
|
5
|
+
"web-input",
|
|
6
|
+
lazy_subcommands={
|
|
7
|
+
"show": (".show", "show_command"),
|
|
8
|
+
"list": (".list", "list_command"),
|
|
9
|
+
"respond": (".respond", "respond_command"),
|
|
10
|
+
},
|
|
11
|
+
)
|
|
12
|
+
def web_input_command() -> None:
|
|
13
|
+
"""Interact with web inputs in the Globus Flows service."""
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing as t
|
|
4
|
+
import uuid
|
|
5
|
+
|
|
6
|
+
import click
|
|
7
|
+
import globus_sdk
|
|
8
|
+
from globus_sdk.paging import Paginator
|
|
9
|
+
|
|
10
|
+
from globus_cli.login_manager import LoginManager
|
|
11
|
+
from globus_cli.parsing import ColonDelimitedChoiceTuple, command
|
|
12
|
+
from globus_cli.termio import Field, display
|
|
13
|
+
from globus_cli.utils import PagingWrapper
|
|
14
|
+
|
|
15
|
+
ROLE_TYPES = ("viewer", "respondent")
|
|
16
|
+
STATE_TYPES = ("open", "closed")
|
|
17
|
+
ORDER_BY_FIELDS = ("created_timestamp", "edited_timestamp", "closed_timestamp")
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@command("list")
|
|
21
|
+
@click.option(
|
|
22
|
+
"--filter-role",
|
|
23
|
+
"filter_roles",
|
|
24
|
+
type=click.Choice(ROLE_TYPES),
|
|
25
|
+
help="Filter results by the caller's role on the web input",
|
|
26
|
+
multiple=True,
|
|
27
|
+
)
|
|
28
|
+
@click.option(
|
|
29
|
+
"--filter-state",
|
|
30
|
+
"filter_states",
|
|
31
|
+
type=click.Choice(STATE_TYPES),
|
|
32
|
+
help="Filter results by the web input's state",
|
|
33
|
+
multiple=True,
|
|
34
|
+
)
|
|
35
|
+
@click.option(
|
|
36
|
+
"--filter-flow-id",
|
|
37
|
+
"filter_flow_ids",
|
|
38
|
+
help=(
|
|
39
|
+
"Filter results to web inputs with a particular flow ID or flow IDs. "
|
|
40
|
+
"This option may be specified multiple times to filter by multiple "
|
|
41
|
+
"flow IDs."
|
|
42
|
+
),
|
|
43
|
+
multiple=True,
|
|
44
|
+
type=click.UUID,
|
|
45
|
+
)
|
|
46
|
+
@click.option(
|
|
47
|
+
"--filter-run-id",
|
|
48
|
+
"filter_run_ids",
|
|
49
|
+
help=(
|
|
50
|
+
"Filter results to web inputs with a particular run ID or run IDs. "
|
|
51
|
+
"This option may be specified multiple times to filter by multiple "
|
|
52
|
+
"run IDs."
|
|
53
|
+
),
|
|
54
|
+
multiple=True,
|
|
55
|
+
type=click.UUID,
|
|
56
|
+
)
|
|
57
|
+
@click.option(
|
|
58
|
+
"--orderby",
|
|
59
|
+
default=("created_timestamp:DESC",),
|
|
60
|
+
show_default=True,
|
|
61
|
+
type=ColonDelimitedChoiceTuple(
|
|
62
|
+
choices=tuple(
|
|
63
|
+
f"{field}:{order}" for field in ORDER_BY_FIELDS for order in ("ASC", "DESC")
|
|
64
|
+
),
|
|
65
|
+
case_sensitive=False,
|
|
66
|
+
),
|
|
67
|
+
multiple=True,
|
|
68
|
+
metavar=f"[{'|'.join(ORDER_BY_FIELDS)}]:[ASC|DESC]",
|
|
69
|
+
help="""
|
|
70
|
+
Sort results by the given field and ordering.
|
|
71
|
+
ASC for ascending, DESC for descending.
|
|
72
|
+
|
|
73
|
+
This option can be specified multiple times to sort by multiple fields.
|
|
74
|
+
""",
|
|
75
|
+
)
|
|
76
|
+
@click.option(
|
|
77
|
+
"--limit",
|
|
78
|
+
default=25,
|
|
79
|
+
show_default=True,
|
|
80
|
+
metavar="N",
|
|
81
|
+
type=click.IntRange(1),
|
|
82
|
+
help="The maximum number of results to return.",
|
|
83
|
+
)
|
|
84
|
+
@LoginManager.requires_login("flows")
|
|
85
|
+
def list_command(
|
|
86
|
+
login_manager: LoginManager,
|
|
87
|
+
*,
|
|
88
|
+
filter_roles: tuple[t.Literal["viewer", "respondent"], ...],
|
|
89
|
+
filter_states: tuple[t.Literal["open", "closed"], ...],
|
|
90
|
+
filter_flow_ids: tuple[uuid.UUID, ...],
|
|
91
|
+
filter_run_ids: tuple[uuid.UUID, ...],
|
|
92
|
+
orderby: tuple[
|
|
93
|
+
tuple[
|
|
94
|
+
t.Literal["created_timestamp", "edited_timestamp", "closed_timestamp"],
|
|
95
|
+
t.Literal["ASC", "DESC"],
|
|
96
|
+
],
|
|
97
|
+
...,
|
|
98
|
+
],
|
|
99
|
+
limit: int,
|
|
100
|
+
) -> None:
|
|
101
|
+
"""
|
|
102
|
+
List web inputs accessible to the current user.
|
|
103
|
+
"""
|
|
104
|
+
flows_client = login_manager.get_flows_client()
|
|
105
|
+
|
|
106
|
+
paginator = Paginator.wrap(flows_client.list_web_inputs)
|
|
107
|
+
web_input_iterator = PagingWrapper(
|
|
108
|
+
paginator(
|
|
109
|
+
filter_roles=filter_roles or globus_sdk.MISSING,
|
|
110
|
+
filter_states=filter_states or globus_sdk.MISSING,
|
|
111
|
+
filter_flow_ids=filter_flow_ids or globus_sdk.MISSING,
|
|
112
|
+
filter_run_ids=filter_run_ids or globus_sdk.MISSING,
|
|
113
|
+
orderby=",".join(f"{field} {order}" for field, order in orderby),
|
|
114
|
+
).items(),
|
|
115
|
+
json_conversion_key="web_input_summaries",
|
|
116
|
+
limit=limit,
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
fields = [
|
|
120
|
+
Field("Web Input ID", "id"),
|
|
121
|
+
Field("Status", "status"),
|
|
122
|
+
Field("Input Type", "input_type"),
|
|
123
|
+
Field("Title", "title"),
|
|
124
|
+
Field("Flow Title", "flow.title"),
|
|
125
|
+
Field("Run Label", "run.label"),
|
|
126
|
+
]
|
|
127
|
+
|
|
128
|
+
display(
|
|
129
|
+
web_input_iterator,
|
|
130
|
+
fields=fields,
|
|
131
|
+
json_converter=web_input_iterator.json_converter,
|
|
132
|
+
)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import uuid
|
|
4
|
+
|
|
5
|
+
import click
|
|
6
|
+
|
|
7
|
+
from globus_cli.login_manager import LoginManager
|
|
8
|
+
from globus_cli.parsing import command, web_input_id_arg
|
|
9
|
+
from globus_cli.termio import Field, display
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@command("respond")
|
|
13
|
+
@web_input_id_arg
|
|
14
|
+
@click.argument("option_id", metavar="OPTION_ID", type=click.UUID, required=True)
|
|
15
|
+
@LoginManager.requires_login("flows")
|
|
16
|
+
def respond_command(
|
|
17
|
+
login_manager: LoginManager,
|
|
18
|
+
*,
|
|
19
|
+
web_input_id: uuid.UUID,
|
|
20
|
+
option_id: uuid.UUID,
|
|
21
|
+
) -> None:
|
|
22
|
+
"""
|
|
23
|
+
Respond to a web input.
|
|
24
|
+
|
|
25
|
+
For "selection" type web inputs, OPTION_ID is the ID of one of the web input's
|
|
26
|
+
available options.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
flows_client = login_manager.get_flows_client()
|
|
30
|
+
response = flows_client.respond_to_web_input(web_input_id, value=option_id)
|
|
31
|
+
|
|
32
|
+
display(
|
|
33
|
+
response,
|
|
34
|
+
text_mode=display.RECORD,
|
|
35
|
+
fields=[Field("Status", "status")],
|
|
36
|
+
)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import uuid
|
|
4
|
+
|
|
5
|
+
from globus_cli.commands.flows._fields import web_input_format_fields
|
|
6
|
+
from globus_cli.login_manager import LoginManager
|
|
7
|
+
from globus_cli.parsing import command, web_input_id_arg
|
|
8
|
+
from globus_cli.termio import display
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@command("show")
|
|
12
|
+
@web_input_id_arg
|
|
13
|
+
@LoginManager.requires_login("auth", "flows")
|
|
14
|
+
def show_command(login_manager: LoginManager, *, web_input_id: uuid.UUID) -> None:
|
|
15
|
+
"""
|
|
16
|
+
Show a web input.
|
|
17
|
+
"""
|
|
18
|
+
flows_client = login_manager.get_flows_client()
|
|
19
|
+
auth_client = login_manager.get_auth_client()
|
|
20
|
+
|
|
21
|
+
response = flows_client.get_web_input(web_input_id)
|
|
22
|
+
fields = web_input_format_fields(auth_client, response.data)
|
|
23
|
+
|
|
24
|
+
display(response, fields=fields, text_mode=display.RECORD)
|
|
@@ -80,15 +80,25 @@ def get_identities_command(
|
|
|
80
80
|
Non-verbose text output is customized.
|
|
81
81
|
"""
|
|
82
82
|
|
|
83
|
-
def resolve_identity(value:
|
|
83
|
+
def resolve_identity(value: str) -> str:
|
|
84
84
|
"""
|
|
85
|
-
|
|
85
|
+
Given an input, resolve it to an output:
|
|
86
|
+
|
|
87
|
+
- IDs resolve to usernames
|
|
88
|
+
- Usernames resolve to IDs
|
|
89
|
+
- Missing values resolve to 'NO_SUCH_IDENTITY'
|
|
90
|
+
- Comparisons are all done lowercased
|
|
86
91
|
"""
|
|
92
|
+
value = value.lower()
|
|
87
93
|
for identity in identities:
|
|
88
|
-
if identity["id"] == value:
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
94
|
+
if identity["id"].lower() == value:
|
|
95
|
+
username = identity["username"]
|
|
96
|
+
if isinstance(username, str):
|
|
97
|
+
return username
|
|
98
|
+
if identity["username"].lower() == value:
|
|
99
|
+
identity_id = identity["id"]
|
|
100
|
+
if isinstance(identity_id, str):
|
|
101
|
+
return identity_id
|
|
92
102
|
return "NO_SUCH_IDENTITY"
|
|
93
103
|
|
|
94
104
|
# standard output is one resolved identity per line in the same order
|
|
@@ -40,6 +40,7 @@ from .shared_options.id_args import (
|
|
|
40
40
|
endpoint_id_arg,
|
|
41
41
|
flow_id_arg,
|
|
42
42
|
run_id_arg,
|
|
43
|
+
web_input_id_arg,
|
|
43
44
|
)
|
|
44
45
|
from .shared_options.transfer_task_options import (
|
|
45
46
|
encrypt_data_option,
|
|
@@ -86,6 +87,7 @@ __all__ = [
|
|
|
86
87
|
"endpoint_id_arg",
|
|
87
88
|
"flow_id_arg",
|
|
88
89
|
"run_id_arg",
|
|
90
|
+
"web_input_id_arg",
|
|
89
91
|
"flow_input_document_option",
|
|
90
92
|
"task_submission_options",
|
|
91
93
|
"delete_and_rm_options",
|
|
@@ -28,12 +28,18 @@ class CommaDelimitedList(click.ParamType[list[str] | globus_sdk.MissingType]):
|
|
|
28
28
|
return "TEXT,TEXT,..."
|
|
29
29
|
|
|
30
30
|
def convert(
|
|
31
|
-
self,
|
|
31
|
+
self,
|
|
32
|
+
value: t.Any | globus_sdk.MissingType,
|
|
33
|
+
param: click.Parameter | None,
|
|
34
|
+
ctx: click.Context | None,
|
|
32
35
|
) -> list[str] | globus_sdk.MissingType:
|
|
33
|
-
if
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
if value is globus_sdk.MISSING:
|
|
37
|
+
if self._omittable:
|
|
38
|
+
return globus_sdk.MISSING
|
|
39
|
+
else:
|
|
40
|
+
raise NotImplementedError(
|
|
41
|
+
"Cannot pass MISSING to non-omittable CommaDelimitedList."
|
|
42
|
+
)
|
|
37
43
|
|
|
38
44
|
# if `--foo` is a comma delimited list and someone passes
|
|
39
45
|
# `--foo ""`, take that as `foo=[]` rather than foo=[""]
|
|
@@ -12,7 +12,10 @@ class OmittableInt(click.ParamType[int | globus_sdk.MissingType]):
|
|
|
12
12
|
name = "integer"
|
|
13
13
|
|
|
14
14
|
def convert(
|
|
15
|
-
self,
|
|
15
|
+
self,
|
|
16
|
+
value: t.Any | globus_sdk.MissingType,
|
|
17
|
+
param: click.Parameter | None,
|
|
18
|
+
ctx: click.Context | None,
|
|
16
19
|
) -> int | globus_sdk.MissingType:
|
|
17
20
|
if value is globus_sdk.MISSING:
|
|
18
21
|
return globus_sdk.MISSING
|
|
@@ -26,7 +29,10 @@ class OmittableString(click.ParamType[str | globus_sdk.MissingType]):
|
|
|
26
29
|
name = "text"
|
|
27
30
|
|
|
28
31
|
def convert(
|
|
29
|
-
self,
|
|
32
|
+
self,
|
|
33
|
+
value: t.Any | globus_sdk.MissingType,
|
|
34
|
+
param: click.Parameter | None,
|
|
35
|
+
ctx: click.Context | None,
|
|
30
36
|
) -> str | globus_sdk.MissingType:
|
|
31
37
|
if value is globus_sdk.MISSING:
|
|
32
38
|
return globus_sdk.MISSING
|
|
@@ -40,7 +46,10 @@ class OmittableUUID(click.ParamType[uuid.UUID | globus_sdk.MissingType]):
|
|
|
40
46
|
name = "uuid"
|
|
41
47
|
|
|
42
48
|
def convert(
|
|
43
|
-
self,
|
|
49
|
+
self,
|
|
50
|
+
value: t.Any | globus_sdk.MissingType,
|
|
51
|
+
param: click.Parameter | None,
|
|
52
|
+
ctx: click.Context | None,
|
|
44
53
|
) -> uuid.UUID | globus_sdk.MissingType:
|
|
45
54
|
if value is globus_sdk.MISSING:
|
|
46
55
|
return globus_sdk.MISSING
|
|
@@ -65,7 +74,10 @@ class OmittableChoice(click.ParamType[str | globus_sdk.MissingType]):
|
|
|
65
74
|
return self._inner_choice.get_missing_message(param, ctx)
|
|
66
75
|
|
|
67
76
|
def convert(
|
|
68
|
-
self,
|
|
77
|
+
self,
|
|
78
|
+
value: t.Any | globus_sdk.MissingType,
|
|
79
|
+
param: click.Parameter | None,
|
|
80
|
+
ctx: click.Context | None,
|
|
69
81
|
) -> str | globus_sdk.MissingType:
|
|
70
82
|
if value is globus_sdk.MISSING:
|
|
71
83
|
return globus_sdk.MISSING
|
|
@@ -92,7 +104,10 @@ class OmittableDateTime(_OmittableDateTimeBase):
|
|
|
92
104
|
name = "datetime"
|
|
93
105
|
|
|
94
106
|
def convert(
|
|
95
|
-
self,
|
|
107
|
+
self,
|
|
108
|
+
value: t.Any | globus_sdk.MissingType,
|
|
109
|
+
param: click.Parameter | None,
|
|
110
|
+
ctx: click.Context | None,
|
|
96
111
|
) -> datetime.datetime | globus_sdk.MissingType:
|
|
97
112
|
if value is globus_sdk.MISSING:
|
|
98
113
|
return globus_sdk.MISSING
|
|
@@ -178,8 +178,8 @@ class Renderer:
|
|
|
178
178
|
|
|
179
179
|
_assert_iterable(data)
|
|
180
180
|
if text_mode == self.TABLE:
|
|
181
|
-
if fold_tables():
|
|
182
|
-
return FoldedTablePrinter(fields)
|
|
181
|
+
if (folding_enabled := fold_tables()) is not False:
|
|
182
|
+
return FoldedTablePrinter(fields, folding_enabled=folding_enabled)
|
|
183
183
|
else:
|
|
184
184
|
return TablePrinter(fields)
|
|
185
185
|
if text_mode == self.RECORD_LIST:
|
|
@@ -13,6 +13,8 @@ class Field:
|
|
|
13
13
|
name for table output
|
|
14
14
|
:param key: a jmespath expression for indexing into print data
|
|
15
15
|
:param wrap_enabled: in record output, is this field allowed to wrap
|
|
16
|
+
:param section: in record output, render this field as a standalone,
|
|
17
|
+
indented block rather than an inline 'key: value' pair
|
|
16
18
|
"""
|
|
17
19
|
|
|
18
20
|
def __init__(
|
|
@@ -21,11 +23,13 @@ class Field:
|
|
|
21
23
|
key: str,
|
|
22
24
|
*,
|
|
23
25
|
wrap_enabled: bool = False,
|
|
26
|
+
section: bool = False,
|
|
24
27
|
formatter: formatters.FieldFormatter[t.Any] = formatters.Str,
|
|
25
28
|
) -> None:
|
|
26
29
|
self.name = name
|
|
27
30
|
self.key = key
|
|
28
31
|
self.wrap_enabled = wrap_enabled
|
|
32
|
+
self.section = section
|
|
29
33
|
self.formatter = formatter
|
|
30
34
|
|
|
31
35
|
def get_value(self, data: t.Any) -> t.Any:
|