globus-cli 3.41.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.
Files changed (298) hide show
  1. {globus_cli-3.41.0 → globus_cli-3.43.0}/PKG-INFO +9 -8
  2. {globus_cli-3.41.0 → globus_cli-3.43.0}/changelog.adoc +46 -0
  3. {globus_cli-3.41.0 → globus_cli-3.43.0}/pyproject.toml +12 -10
  4. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/api.py +20 -17
  5. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/list.py +2 -19
  6. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/set_subscription_id.py +1 -1
  7. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/show.py +2 -0
  8. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/__init__.py +4 -0
  9. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/_common.py +15 -5
  10. globus_cli-3.43.0/src/globus_cli/commands/flows/_fields.py +283 -0
  11. globus_cli-3.43.0/src/globus_cli/commands/flows/registered_api/__init__.py +12 -0
  12. globus_cli-3.43.0/src/globus_cli/commands/flows/registered_api/list.py +92 -0
  13. globus_cli-3.43.0/src/globus_cli/commands/flows/registered_api/show.py +27 -0
  14. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/resume.py +2 -4
  15. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/start.py +0 -2
  16. globus_cli-3.43.0/src/globus_cli/commands/flows/web_input/__init__.py +13 -0
  17. globus_cli-3.43.0/src/globus_cli/commands/flows/web_input/list.py +132 -0
  18. globus_cli-3.43.0/src/globus_cli/commands/flows/web_input/respond.py +36 -0
  19. globus_cli-3.43.0/src/globus_cli/commands/flows/web_input/show.py +24 -0
  20. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/create/_common.py +2 -4
  21. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/set_subscription_id.py +1 -1
  22. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/set_subscription_id.py +3 -1
  23. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/update.py +1 -3
  24. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/get_identities.py +16 -6
  25. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/_common.py +1 -1
  26. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/list.py +1 -0
  27. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/login.py +6 -19
  28. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/__init__.py +1 -0
  29. globus_cli-3.43.0/src/globus_cli/commands/streams/tunnel/events.py +37 -0
  30. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/create/_common.py +2 -4
  31. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/create/transfer.py +2 -4
  32. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/resume.py +2 -4
  33. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/local_server.py +2 -4
  34. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/__init__.py +2 -0
  35. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/commands.py +0 -18
  36. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/delimited.py +14 -25
  37. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/endpoint_plus_path.py +2 -5
  38. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/guest_activity_notify_param.py +3 -3
  39. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/identity_type.py +1 -4
  40. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/json_strorfile.py +1 -3
  41. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/location.py +1 -1
  42. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/notify_param.py +1 -4
  43. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/nullable.py +2 -6
  44. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/omittable.py +39 -28
  45. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/task_path.py +1 -1
  46. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/timedelta.py +1 -1
  47. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/shared_options/__init__.py +2 -4
  48. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/shared_options/id_args.py +4 -0
  49. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/shared_options/transfer_task_options.py +2 -4
  50. globus_cli-3.43.0/src/globus_cli/services/transfer/__init__.py +66 -0
  51. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/termio/_display.py +11 -2
  52. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/termio/context.py +5 -0
  53. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/termio/field.py +4 -0
  54. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/__init__.py +2 -0
  55. globus_cli-3.43.0/src/globus_cli/termio/printers/folded_table_printer.py +383 -0
  56. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/record_printer.py +21 -3
  57. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/version.py +1 -1
  58. globus_cli-3.41.0/src/globus_cli/_click_compat.py +0 -55
  59. globus_cli-3.41.0/src/globus_cli/commands/flows/_fields.py +0 -113
  60. globus_cli-3.41.0/src/globus_cli/services/transfer/__init__.py +0 -35
  61. {globus_cli-3.41.0 → globus_cli-3.43.0}/LICENSE +0 -0
  62. {globus_cli-3.41.0 → globus_cli-3.43.0}/README.rst +0 -0
  63. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/__init__.py +0 -0
  64. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/__main__.py +0 -0
  65. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/_warnings.py +0 -0
  66. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/__init__.py +0 -0
  67. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/_common.py +0 -0
  68. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/_removal_stub.py +0 -0
  69. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/bookmark/__init__.py +0 -0
  70. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/bookmark/_common.py +0 -0
  71. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/bookmark/create.py +0 -0
  72. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/bookmark/delete.py +0 -0
  73. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/bookmark/list.py +0 -0
  74. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/bookmark/rename.py +0 -0
  75. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/bookmark/show.py +0 -0
  76. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/cli_profile_list.py +0 -0
  77. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/__init__.py +0 -0
  78. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/_common.py +0 -0
  79. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/create/__init__.py +0 -0
  80. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/create/guest.py +0 -0
  81. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/create/mapped.py +0 -0
  82. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/delete.py +0 -0
  83. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/role/__init__.py +0 -0
  84. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/role/delete.py +0 -0
  85. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/role/list.py +0 -0
  86. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/role/show.py +0 -0
  87. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/show.py +0 -0
  88. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/update.py +0 -0
  89. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/delete.py +0 -0
  90. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/__init__.py +0 -0
  91. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/_common.py +0 -0
  92. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/delete.py +0 -0
  93. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/local_id.py +0 -0
  94. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/my_shared_endpoint_list.py +0 -0
  95. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/permission/__init__.py +0 -0
  96. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/permission/_common.py +0 -0
  97. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/permission/create.py +0 -0
  98. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/permission/delete.py +0 -0
  99. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/permission/list.py +0 -0
  100. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/permission/show.py +0 -0
  101. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/permission/update.py +0 -0
  102. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/role/__init__.py +0 -0
  103. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/role/_common.py +0 -0
  104. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/role/create.py +0 -0
  105. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/role/delete.py +0 -0
  106. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/role/list.py +0 -0
  107. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/role/show.py +0 -0
  108. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/search.py +0 -0
  109. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/storage_gateway/__init__.py +0 -0
  110. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/storage_gateway/list.py +0 -0
  111. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/update.py +0 -0
  112. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/__init__.py +0 -0
  113. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/_common.py +0 -0
  114. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/create/__init__.py +0 -0
  115. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/create/from_json.py +0 -0
  116. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/create/posix.py +0 -0
  117. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/create/s3.py +0 -0
  118. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/delete.py +0 -0
  119. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/list.py +0 -0
  120. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/show.py +0 -0
  121. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/update/__init__.py +0 -0
  122. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/update/from_json.py +0 -0
  123. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/create.py +0 -0
  124. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/delete.py +0 -0
  125. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/list.py +0 -0
  126. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/__init__.py +0 -0
  127. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/cancel.py +0 -0
  128. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/delete.py +0 -0
  129. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/list.py +0 -0
  130. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/show.py +0 -0
  131. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/show_definition.py +0 -0
  132. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/show_logs.py +0 -0
  133. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/update.py +0 -0
  134. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/show.py +0 -0
  135. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/update.py +0 -0
  136. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/validate.py +0 -0
  137. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/__init__.py +0 -0
  138. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/create/__init__.py +0 -0
  139. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/create/guest.py +0 -0
  140. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/create/mapped.py +0 -0
  141. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/set_subscription_admin_verified.py +0 -0
  142. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/update/__init__.py +0 -0
  143. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/update/guest.py +0 -0
  144. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/update/mapped.py +0 -0
  145. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/__init__.py +0 -0
  146. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/__init__.py +0 -0
  147. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/_common.py +0 -0
  148. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/role/__init__.py +0 -0
  149. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/role/_common.py +0 -0
  150. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/role/create.py +0 -0
  151. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/role/delete.py +0 -0
  152. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/role/list.py +0 -0
  153. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/role/show.py +0 -0
  154. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/show.py +0 -0
  155. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/__init__.py +0 -0
  156. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/create.py +0 -0
  157. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/delete.py +0 -0
  158. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/get_by_subscription.py +0 -0
  159. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/get_subscription_info.py +0 -0
  160. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/invite/__init__.py +0 -0
  161. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/invite/_common.py +0 -0
  162. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/invite/accept.py +0 -0
  163. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/invite/decline.py +0 -0
  164. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/join.py +0 -0
  165. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/leave.py +0 -0
  166. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/member/__init__.py +0 -0
  167. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/member/add.py +0 -0
  168. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/member/approve.py +0 -0
  169. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/member/invite.py +0 -0
  170. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/member/list.py +0 -0
  171. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/member/reject.py +0 -0
  172. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/member/remove.py +0 -0
  173. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/set_policies.py +0 -0
  174. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/set_subscription_admin_verified.py +0 -0
  175. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/show.py +0 -0
  176. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/update.py +0 -0
  177. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/list_commands.py +0 -0
  178. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/logout.py +0 -0
  179. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/ls.py +0 -0
  180. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/mkdir.py +0 -0
  181. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/rename.py +0 -0
  182. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/rm.py +0 -0
  183. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/__init__.py +0 -0
  184. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/_common.py +0 -0
  185. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/delete_by_query.py +0 -0
  186. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/__init__.py +0 -0
  187. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/create.py +0 -0
  188. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/delete.py +0 -0
  189. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/list.py +0 -0
  190. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/role/__init__.py +0 -0
  191. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/role/create.py +0 -0
  192. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/role/delete.py +0 -0
  193. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/role/list.py +0 -0
  194. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/show.py +0 -0
  195. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/ingest.py +0 -0
  196. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/query.py +0 -0
  197. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/subject/__init__.py +0 -0
  198. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/subject/delete.py +0 -0
  199. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/subject/show.py +0 -0
  200. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/task/__init__.py +0 -0
  201. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/task/list.py +0 -0
  202. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/task/show.py +0 -0
  203. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/session/__init__.py +0 -0
  204. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/session/consent.py +0 -0
  205. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/session/show.py +0 -0
  206. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/session/update.py +0 -0
  207. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/stat.py +0 -0
  208. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/__init__.py +0 -0
  209. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/access_point/__init__.py +0 -0
  210. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/access_point/show.py +0 -0
  211. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/_common.py +0 -0
  212. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/create.py +0 -0
  213. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/delete.py +0 -0
  214. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/list.py +0 -0
  215. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/show.py +0 -0
  216. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/stop.py +0 -0
  217. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/update.py +0 -0
  218. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/__init__.py +0 -0
  219. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/_common.py +0 -0
  220. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/cancel.py +0 -0
  221. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/event_list.py +0 -0
  222. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/generate_submission_id.py +0 -0
  223. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/list.py +0 -0
  224. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/pause_info.py +0 -0
  225. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/show.py +0 -0
  226. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/update.py +0 -0
  227. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/wait.py +0 -0
  228. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/__init__.py +0 -0
  229. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/_common.py +0 -0
  230. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/create/__init__.py +0 -0
  231. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/create/flow.py +0 -0
  232. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/delete.py +0 -0
  233. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/list.py +0 -0
  234. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/pause.py +0 -0
  235. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/show.py +0 -0
  236. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/transfer.py +0 -0
  237. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/update.py +0 -0
  238. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/version.py +0 -0
  239. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/commands/whoami.py +0 -0
  240. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/constants.py +0 -0
  241. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/endpointish/__init__.py +0 -0
  242. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/endpointish/endpointish.py +0 -0
  243. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/endpointish/entity_type.py +0 -0
  244. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/endpointish/errors.py +0 -0
  245. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/__init__.py +0 -0
  246. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/__init__.py +0 -0
  247. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/auth_requirements.py +0 -0
  248. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/authapi_hooks.py +0 -0
  249. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/endpoint_types.py +0 -0
  250. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/flows_hooks.py +0 -0
  251. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/generic_hooks.py +0 -0
  252. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/search_hooks.py +0 -0
  253. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/transfer_hooks.py +0 -0
  254. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/messages.py +0 -0
  255. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/registry.py +0 -0
  256. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/globus_cli_flake8.py +0 -0
  257. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/__init__.py +0 -0
  258. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/_old_config.py +0 -0
  259. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/auth_flows.py +0 -0
  260. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/client_login.py +0 -0
  261. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/context.py +0 -0
  262. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/errors.py +0 -0
  263. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/manager.py +0 -0
  264. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/scopes.py +0 -0
  265. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/storage.py +0 -0
  266. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/utils.py +0 -0
  267. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/command_state.py +0 -0
  268. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/mutex_group.py +0 -0
  269. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_classes.py +0 -0
  270. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/__init__.py +0 -0
  271. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/shared_callbacks.py +0 -0
  272. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/shared_options/endpointish.py +0 -0
  273. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/shared_options/flow_options.py +0 -0
  274. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/parsing/shell_completion.py +0 -0
  275. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/reflect.py +0 -0
  276. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/services/__init__.py +0 -0
  277. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/services/auth.py +0 -0
  278. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/services/gcs.py +0 -0
  279. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/services/transfer/client.py +0 -0
  280. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/services/transfer/data.py +0 -0
  281. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/services/transfer/recursive_ls.py +0 -0
  282. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/termio/__init__.py +0 -0
  283. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/termio/errors.py +0 -0
  284. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/termio/formatters/__init__.py +0 -0
  285. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/termio/formatters/auth.py +0 -0
  286. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/termio/formatters/base.py +0 -0
  287. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/termio/formatters/compound.py +0 -0
  288. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/termio/formatters/primitive.py +0 -0
  289. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/base.py +0 -0
  290. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/custom_printer.py +0 -0
  291. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/json_printer.py +0 -0
  292. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/table_printer.py +0 -0
  293. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/unix_printer/__init__.py +0 -0
  294. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/unix_printer/_formatter.py +0 -0
  295. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/unix_printer/unix_printer.py +0 -0
  296. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/termio/server_timing.py +0 -0
  297. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/types.py +0 -0
  298. {globus_cli-3.41.0 → globus_cli-3.43.0}/src/globus_cli/utils.py +0 -0
@@ -1,29 +1,30 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: globus-cli
3
- Version: 3.41.0
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>
7
- Requires-Python: >=3.9
7
+ Requires-Python: >=3.10
8
8
  Description-Content-Type: text/x-rst
9
9
  License-Expression: Apache-2.0
10
10
  Classifier: Development Status :: 5 - Production/Stable
11
11
  Classifier: Intended Audience :: Developers
12
12
  Classifier: Operating System :: POSIX
13
13
  Classifier: Programming Language :: Python
14
- Classifier: Programming Language :: Python :: 3.9
15
14
  Classifier: Programming Language :: Python :: 3.10
16
15
  Classifier: Programming Language :: Python :: 3.11
17
16
  Classifier: Programming Language :: Python :: 3.12
18
17
  Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Programming Language :: Python :: 3.14
19
19
  License-File: LICENSE
20
- Requires-Dist: globus-sdk==4.3.0
21
- Requires-Dist: click>=8.1.4,<8.4
22
- Requires-Dist: jmespath==1.0.1
20
+ Requires-Dist: globus-sdk==4.9.0
21
+ Requires-Dist: click>=8.4,<8.5
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.32.3,<3.0.0
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,52 @@
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
+
24
+ == 3.42.0 (2026-06-10)
25
+
26
+ Bugfixes:
27
+
28
+ * `globus api transfer` no longer prepends `/v0.10/` to `/v2/` paths
29
+
30
+ Enhancements:
31
+
32
+ * Added Domain field to default output of `globus endpoint search` and `globus endpoint show`
33
+
34
+ * Added `globus streams tunnel events` command to show tunnel events
35
+
36
+ * When using table output on narrow terminals, the Globus CLI will now stack
37
+ table elements in a new "folded table" layout. This behavior is only used
38
+ when the output device is a TTY. To disable the new output altogether, users
39
+ can set `GLOBUS_CLI_FOLD_TABLES=0`.
40
+
41
+ * Added Subscription ID to the text output of `globus group list`
42
+
43
+ * Added `globus flows registered-api show` command to display details of a registered API
44
+
45
+ * Added `globus flows registered-api list` command to list registered APIs
46
+
47
+ Other:
48
+
49
+ * Removed support for Python 3.9 .
50
+
5
51
  == 3.41.0 (2026-01-14)
6
52
 
7
53
  Bugfixes:
@@ -20,22 +20,24 @@ classifiers = [
20
20
  "Intended Audience :: Developers",
21
21
  "Operating System :: POSIX",
22
22
  "Programming Language :: Python",
23
- "Programming Language :: Python :: 3.9",
24
23
  "Programming Language :: Python :: 3.10",
25
24
  "Programming Language :: Python :: 3.11",
26
25
  "Programming Language :: Python :: 3.12",
27
26
  "Programming Language :: Python :: 3.13",
27
+ "Programming Language :: Python :: 3.14",
28
28
  ]
29
- requires-python = ">=3.9"
29
+ requires-python = ">=3.10"
30
30
  dependencies = [
31
- "globus-sdk==4.3.0",
32
- "click>=8.1.4,<8.4",
33
- "jmespath==1.0.1",
31
+ "globus-sdk==4.9.0",
32
+ # NOTE: `click` does not use semver; minor releases are expected to contain
33
+ # minor breaking changes
34
+ "click>=8.4,<8.5",
35
+ "jmespath==1.1.0",
34
36
  "packaging>=17.0",
35
37
  "typing_extensions>=4.0;python_version<'3.11'",
36
38
  # these are dependencies of the SDK, but they are used directly in the CLI
37
39
  # declare them here in case the underlying lib ever changes
38
- "requests>=2.32.3,<3.0.0",
40
+ "requests>=2.34.2,<3.0.0",
39
41
  ]
40
42
  dynamic = ["version"]
41
43
 
@@ -61,21 +63,21 @@ test = [
61
63
  ]
62
64
  test-mindeps = [
63
65
  {include-group = "test"},
64
- "click==8.1.8",
65
- "requests==2.32.4",
66
+ "click==8.4.0",
67
+ "requests==2.34.2",
66
68
  "pyjwt==2.0.0",
67
69
  "cryptography==3.3.1",
68
70
  "packaging==17.0",
69
71
  "typing_extensions==4.0",
70
72
  ]
71
73
  typing = [
72
- "mypy==1.19.1",
74
+ "mypy==2.1.0",
73
75
  "types-jwt",
74
76
  "types-requests",
75
77
  "types-jmespath",
76
78
  ]
77
79
  check-project-metadata = [
78
- "mddj==0.4.2",
80
+ "mddj==0.6.0",
79
81
  {include-group = "yaml"},
80
82
  "build",
81
83
  "twine",
@@ -10,7 +10,6 @@ import globus_sdk
10
10
  from globus_sdk.scopes import ScopeParser
11
11
 
12
12
  from globus_cli import termio, version
13
- from globus_cli._click_compat import shim_get_metavar
14
13
  from globus_cli.login_manager import LoginManager, is_client_login
15
14
  from globus_cli.login_manager.scopes import CLI_SCOPE_REQUIREMENTS
16
15
  from globus_cli.parsing import command, endpoint_id_arg, group, mutex_option_group
@@ -20,8 +19,7 @@ from globus_cli.types import AnyCommand, ServiceNameLiteral
20
19
  C = t.TypeVar("C", bound=AnyCommand)
21
20
 
22
21
 
23
- class QueryParamType(click.ParamType):
24
- @shim_get_metavar
22
+ class QueryParamType(click.ParamType[tuple[str, str] | None]):
25
23
  def get_metavar(self, param: click.Parameter, ctx: click.Context) -> str:
26
24
  return "Key=Value"
27
25
 
@@ -33,21 +31,17 @@ class QueryParamType(click.ParamType):
33
31
 
34
32
  def convert(
35
33
  self,
36
- value: str | None,
34
+ value: str,
37
35
  param: click.Parameter | None,
38
36
  ctx: click.Context | None,
39
37
  ) -> tuple[str, str] | None:
40
- value = super().convert(value, param, ctx)
41
- if value is None:
42
- return None
43
38
  if "=" not in value:
44
39
  self.fail("invalid query param", param=param, ctx=ctx)
45
40
  left, right = value.split("=", 1)
46
41
  return (left, right)
47
42
 
48
43
 
49
- class HeaderParamType(click.ParamType):
50
- @shim_get_metavar
44
+ class HeaderParamType(click.ParamType[tuple[str, str] | None]):
51
45
  def get_metavar(self, param: click.Parameter, ctx: click.Context) -> str:
52
46
  return "Key:Value"
53
47
 
@@ -59,13 +53,10 @@ class HeaderParamType(click.ParamType):
59
53
 
60
54
  def convert(
61
55
  self,
62
- value: str | None,
56
+ value: str,
63
57
  param: click.Parameter | None,
64
58
  ctx: click.Context | None,
65
59
  ) -> tuple[str, str] | None:
66
- value = super().convert(value, param, ctx)
67
- if value is None:
68
- return None
69
60
  if ":" not in value:
70
61
  self.fail("invalid header param", param=param, ctx=ctx)
71
62
  left, right = value.split(":", 1)
@@ -172,7 +163,7 @@ def _get_url(service_name: str) -> str:
172
163
  "search": "https://search.api.globus.org/",
173
164
  "transfer": "https://transfer.api.globus.org/v0.10/",
174
165
  "timers": "https://timer.automate.globus.org/",
175
- "gcs": "https://$GCS_MANAGER/",
166
+ "gcs": "https://GCS_MANAGER/",
176
167
  }[service_name]
177
168
 
178
169
 
@@ -324,7 +315,9 @@ def _execute_service_command(
324
315
  if path.startswith("/"):
325
316
  path = path[1:]
326
317
  path = f"/v2/{path}"
327
- if isinstance(client, globus_sdk.TransferClient) and not path.startswith("/v0.10/"):
318
+ if isinstance(client, globus_sdk.TransferClient) and not (
319
+ path.startswith(("/v0.10/", "/v2/"))
320
+ ):
328
321
  if path.startswith("/"):
329
322
  path = path[1:]
330
323
  path = f"/v0.10/{path}"
@@ -379,16 +372,26 @@ def build_command(
379
372
  )
380
373
  hidden: bool = command_name == "timer"
381
374
 
375
+ example_command_name: str = command_name
376
+ helptext_epilog: str = ""
377
+ service_title: str = service_name.title()
378
+
379
+ if command_name == "gcs":
380
+ service_title = "GCS"
381
+ example_command_name = "gcs ENDPOINT_ID"
382
+ helptext_epilog = "\nWhere GCS_MANAGER is looked up from ENDPOINT_ID."
383
+
382
384
  helptext = f"""\
383
- Make API calls to Globus {service_name.title()}
385
+ Make API calls to Globus {service_title}
384
386
 
385
387
  The arguments are an HTTP method name and a path within the service to which the request
386
388
  should be made. The path will be joined with the known service URL.
387
389
  For example, a call of
388
390
 
389
- globus api {command_name} GET /foo/bar
391
+ globus api {example_command_name} GET /foo/bar
390
392
 
391
393
  sends a 'GET' request to `{_get_url(service_name)}foo/bar`
394
+ {helptext_epilog}
392
395
  """
393
396
 
394
397
  if service_name != "gcs":
@@ -1,6 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- import sys
4
3
  import typing as t
5
4
  import uuid
6
5
 
@@ -12,22 +11,8 @@ from globus_cli.parsing import command, endpoint_id_arg
12
11
  from globus_cli.termio import Field, display, formatters
13
12
  from globus_cli.utils import PagingWrapper
14
13
 
15
- if sys.version_info >= (3, 10):
16
- from typing import TypeAlias
17
- else:
18
- from typing_extensions import TypeAlias
19
14
 
20
- # until our minimum click version is 8.2.0+ , we need to handle the fact that
21
- # click.Choice became a generic in 8.2.0
22
- # we cannot leave it without a defined type parameter, as we have
23
- # "no-any-generics" set for mypy
24
- if t.TYPE_CHECKING:
25
- ChoiceType: TypeAlias = click.Choice[str]
26
- else:
27
- ChoiceType = click.Choice
28
-
29
-
30
- class ChoiceSlugified(ChoiceType):
15
+ class ChoiceSlugified(click.Choice[str]):
31
16
  """
32
17
  Allow either hyphens or underscores, e.g. both 'mapped-collections' or
33
18
  'mapped_collections'
@@ -37,10 +22,8 @@ class ChoiceSlugified(ChoiceType):
37
22
  return t.cast(type, t.Literal[tuple(self._slugify(c) for c in self.choices)])
38
23
 
39
24
  def convert(
40
- self, value: t.Any, param: click.Parameter | None, ctx: click.Context | None
25
+ self, value: str, param: click.Parameter | None, ctx: click.Context | None
41
26
  ) -> t.Any:
42
- if value is None:
43
- return None
44
27
  return self._slugify(super().convert(value.replace("_", "-"), param, ctx))
45
28
 
46
29
  def _slugify(self, value: str) -> str:
@@ -9,7 +9,7 @@ from globus_cli.parsing import command, endpoint_id_arg
9
9
  from globus_cli.termio import display
10
10
 
11
11
 
12
- class SubscriptionIdType(click.ParamType):
12
+ class SubscriptionIdType(click.ParamType[str]):
13
13
  def convert(
14
14
  self, value: str, param: click.Parameter | None, ctx: click.Context | None
15
15
  ) -> str:
@@ -5,12 +5,14 @@ import click
5
5
  from globus_cli.endpointish import Endpointish
6
6
  from globus_cli.login_manager import LoginManager
7
7
  from globus_cli.parsing import command, endpoint_id_arg
8
+ from globus_cli.services.transfer import DOMAIN_FIELD
8
9
  from globus_cli.termio import Field, display, formatters
9
10
 
10
11
  STANDARD_FIELDS = [
11
12
  Field("Display Name", "display_name"),
12
13
  Field("ID", "id"),
13
14
  Field("Owner", "owner_string"),
15
+ DOMAIN_FIELD,
14
16
  Field("Description", "description", wrap_enabled=True),
15
17
  Field("Shareable", "shareable"),
16
18
  Field("Keywords", "keywords"),
@@ -13,6 +13,10 @@ from globus_cli.parsing import group
13
13
  "start": (".start", "start_command"),
14
14
  # "run" is a subgroup of commands.
15
15
  "run": (".run", "run_command"),
16
+ # "registered-api" is a subgroup of commands.
17
+ "registered-api": (".registered_api", "registered_api_command"),
18
+ # "web-input" is a subgroup of commands.
19
+ "web-input": (".web_input", "web_input_command"),
16
20
  },
17
21
  )
18
22
  def flows_command() -> None:
@@ -125,17 +125,27 @@ keywords_option = click.option(
125
125
  )
126
126
 
127
127
 
128
- class SubscriptionIdType(click.ParamType):
128
+ class SubscriptionIdType(
129
+ click.ParamType[uuid.UUID | t.Literal["DEFAULT"] | globus_sdk.MissingType]
130
+ ):
129
131
  name = "SUBSCRIPTION_ID"
130
132
 
131
133
  def __init__(self, *, omittable: bool = False) -> None:
132
- self._omittable = omittable
134
+ self._omittable: bool = omittable
133
135
 
134
136
  def convert(
135
- self, value: t.Any, param: click.Parameter | None, ctx: click.Context | None
137
+ self,
138
+ value: t.Any | globus_sdk.MissingType,
139
+ param: click.Parameter | None,
140
+ ctx: click.Context | None,
136
141
  ) -> uuid.UUID | t.Literal["DEFAULT"] | globus_sdk.MissingType:
137
- if self._omittable and value is globus_sdk.MISSING:
138
- return globus_sdk.MISSING
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
+ )
139
149
 
140
150
  if value.upper() == "DEFAULT":
141
151
  return "DEFAULT"
@@ -0,0 +1,283 @@
1
+ import typing as t
2
+
3
+ import globus_sdk
4
+
5
+ from globus_cli.termio import Field, formatters
6
+ from globus_cli.termio.formatters import (
7
+ ArrayFormatter,
8
+ FieldFormatter,
9
+ )
10
+ from globus_cli.termio.formatters.auth import PrincipalURNFormatter
11
+
12
+
13
+ class FlowPrincipalFormatter(PrincipalURNFormatter):
14
+ """A principal formatter which properly pre-registers all principals for a flow."""
15
+
16
+ def __init__(
17
+ self, auth_client: globus_sdk.AuthClient, flow: dict[str, t.Any]
18
+ ) -> None:
19
+ super().__init__(auth_client)
20
+ self.add_items(flow.get("flow_owner"))
21
+ self.add_items(*flow.get("flow_administrators", ()))
22
+ self.add_items(*flow.get("flow_viewers", ()))
23
+ self.add_items(*flow.get("run_managers", ()))
24
+ self.add_items(*flow.get("run_monitors", ()))
25
+
26
+
27
+ def flow_format_fields(
28
+ auth_client: globus_sdk.AuthClient,
29
+ flow: dict[str, t.Any],
30
+ ) -> list[Field]:
31
+ """
32
+ The standard list of fields to render for a standard api flow-resource.
33
+
34
+ :param auth_client: An AuthClient, used to resolve principal URNs.
35
+ :param flow: The flow resource, used to pre-register formattable principals.
36
+ """
37
+ principal = FlowPrincipalFormatter(auth_client, flow)
38
+ csv_principal_list = formatters.ArrayFormatter(
39
+ element_formatter=principal,
40
+ delimiter=", ",
41
+ )
42
+ csv_list = formatters.ArrayFormatter(delimiter=", ")
43
+ fuzzy_bool = formatters.FuzzyBool
44
+
45
+ return [
46
+ Field("Flow ID", "id"),
47
+ Field("Title", "title"),
48
+ Field("Subtitle", "subtitle"),
49
+ Field("Description", "description"),
50
+ Field("Keywords", "keywords", formatter=csv_list),
51
+ Field("Owner", "flow_owner", formatter=principal),
52
+ Field("High Assurance", "authentication_policy_id", formatter=fuzzy_bool),
53
+ Field("Authentication Policy ID", "authentication_policy_id"),
54
+ Field("Subscription ID", "subscription_id"),
55
+ Field("Created At", "created_at", formatter=formatters.Date),
56
+ Field("Updated At", "updated_at", formatter=formatters.Date),
57
+ Field("Administrators", "flow_administrators", formatter=csv_principal_list),
58
+ Field("Viewers", "flow_viewers", formatter=csv_principal_list),
59
+ Field("Starters", "flow_starters", formatter=csv_principal_list),
60
+ Field("Run Managers", "run_managers", formatter=csv_principal_list),
61
+ Field("Run Monitors", "run_monitors", formatter=csv_principal_list),
62
+ ]
63
+
64
+
65
+ class FlowRunPrincipalFormatter(PrincipalURNFormatter):
66
+ """A principal formatter which pre-registers all principals for a flow run."""
67
+
68
+ def __init__(
69
+ self, auth_client: globus_sdk.AuthClient, flow_run: dict[str, t.Any]
70
+ ) -> None:
71
+ super().__init__(auth_client)
72
+ self.add_items(flow_run.get("run_owner"))
73
+ self.add_items(*flow_run.get("run_managers", ()))
74
+ self.add_items(*flow_run.get("run_monitors", ()))
75
+
76
+
77
+ def flow_run_format_fields(
78
+ auth_client: globus_sdk.AuthClient,
79
+ flow_run: dict[str, t.Any],
80
+ ) -> list[Field]:
81
+ """
82
+ The standard list of fields to render for a standard api flow-run resource.
83
+
84
+ :param auth_client: An AuthClient, used to resolve principal URNs.
85
+ :param flow_run: The flow run resource, used to pre-register formattable principals.
86
+ """
87
+ principal = FlowRunPrincipalFormatter(auth_client, flow_run)
88
+ csv_principal_list = formatters.ArrayFormatter(
89
+ element_formatter=principal,
90
+ delimiter=", ",
91
+ )
92
+ csv_list = formatters.ArrayFormatter(delimiter=", ")
93
+
94
+ flow_description_fields = (
95
+ [
96
+ Field("Flow Subtitle", "flow_description.subtitle"),
97
+ Field("Flow Description", "flow_description.description"),
98
+ Field("Flow Keywords", "flow_description.keywords", formatter=csv_list),
99
+ ]
100
+ if "flow_description" in flow_run
101
+ else []
102
+ )
103
+
104
+ return [
105
+ Field("Run ID", "run_id"),
106
+ Field("Run Label", "label"),
107
+ Field("Run Tags", "tags", formatter=csv_list),
108
+ Field("Status", "status"),
109
+ Field("Started At", "start_time", formatter=formatters.Date),
110
+ Field("Completed At", "completion_time", formatter=formatters.Date),
111
+ Field("Flow ID", "flow_id"),
112
+ Field("Flow Title", "flow_title"),
113
+ *flow_description_fields,
114
+ Field("Run Owner", "run_owner", formatter=principal),
115
+ Field("Run Managers", "run_managers", formatter=csv_principal_list),
116
+ Field("Run Monitors", "run_monitors", formatter=csv_principal_list),
117
+ ]
118
+
119
+
120
+ class RegisteredAPIPrincipalFormatter(PrincipalURNFormatter):
121
+ """A principal formatter which pre-registers all principals for a registered API."""
122
+
123
+ def __init__(
124
+ self, auth_client: globus_sdk.AuthClient, registered_api: dict[str, t.Any]
125
+ ) -> None:
126
+ super().__init__(auth_client)
127
+ roles = registered_api.get("roles", {})
128
+ self.add_items(*roles.get("owners", ()))
129
+ self.add_items(*roles.get("administrators", ()))
130
+ self.add_items(*roles.get("viewers", ()))
131
+
132
+
133
+ def registered_api_format_fields(
134
+ auth_client: globus_sdk.AuthClient,
135
+ registered_api: dict[str, t.Any],
136
+ ) -> list[Field]:
137
+ """
138
+ The standard list of fields to render for a registered API resource.
139
+
140
+ :param auth_client: An AuthClient, used to resolve principal URNs.
141
+ :param registered_api: The registered API resource, used to pre-register
142
+ principals.
143
+ """
144
+ principal = RegisteredAPIPrincipalFormatter(auth_client, registered_api)
145
+ csv_principal_list = formatters.ArrayFormatter(
146
+ element_formatter=principal,
147
+ delimiter=", ",
148
+ )
149
+
150
+ return [
151
+ Field("Registered API ID", "id"),
152
+ Field("Name", "name"),
153
+ Field("Description", "description"),
154
+ Field("Status", "status"),
155
+ Field("Subscription ID", "subscription_id"),
156
+ Field("Created At", "created_timestamp", formatter=formatters.Date),
157
+ Field("Updated At", "updated_timestamp", formatter=formatters.Date),
158
+ Field("Edited At", "edited_timestamp", formatter=formatters.Date),
159
+ Field(
160
+ "Scheduled Deletion",
161
+ "scheduled_deletion_timestamp",
162
+ formatter=formatters.Date,
163
+ ),
164
+ Field("Owners", "roles.owners", formatter=csv_principal_list),
165
+ Field("Administrators", "roles.administrators", formatter=csv_principal_list),
166
+ Field("Viewers", "roles.viewers", formatter=csv_principal_list),
167
+ Field("Target Type", "target.type"),
168
+ Field("OpenAPI Version", "target.openapi_version"),
169
+ Field("Destination Method", "target.destination.method"),
170
+ Field("Destination URL", "target.destination.url"),
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,12 @@
1
+ from globus_cli.parsing import group
2
+
3
+
4
+ @group(
5
+ "registered-api",
6
+ lazy_subcommands={
7
+ "show": (".show", "show_command"),
8
+ "list": (".list", "list_command"),
9
+ },
10
+ )
11
+ def registered_api_command() -> None:
12
+ """Interact with registered APIs in the Globus Flows service."""