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.
Files changed (295) hide show
  1. {globus_cli-3.42.0 → globus_cli-3.43.0}/PKG-INFO +5 -4
  2. {globus_cli-3.42.0 → globus_cli-3.43.0}/changelog.adoc +19 -0
  3. {globus_cli-3.42.0 → globus_cli-3.43.0}/pyproject.toml +5 -5
  4. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/__init__.py +2 -0
  5. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/_common.py +12 -4
  6. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/_fields.py +116 -0
  7. globus_cli-3.43.0/src/globus_cli/commands/flows/web_input/__init__.py +13 -0
  8. globus_cli-3.43.0/src/globus_cli/commands/flows/web_input/list.py +132 -0
  9. globus_cli-3.43.0/src/globus_cli/commands/flows/web_input/respond.py +36 -0
  10. globus_cli-3.43.0/src/globus_cli/commands/flows/web_input/show.py +24 -0
  11. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/get_identities.py +16 -6
  12. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/__init__.py +2 -0
  13. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/delimited.py +11 -5
  14. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/omittable.py +20 -5
  15. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/shared_options/id_args.py +4 -0
  16. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/_display.py +2 -2
  17. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/context.py +1 -1
  18. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/field.py +4 -0
  19. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/folded_table_printer.py +35 -7
  20. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/record_printer.py +21 -3
  21. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/version.py +1 -1
  22. {globus_cli-3.42.0 → globus_cli-3.43.0}/LICENSE +0 -0
  23. {globus_cli-3.42.0 → globus_cli-3.43.0}/README.rst +0 -0
  24. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/__init__.py +0 -0
  25. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/__main__.py +0 -0
  26. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/_warnings.py +0 -0
  27. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/__init__.py +0 -0
  28. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/_common.py +0 -0
  29. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/_removal_stub.py +0 -0
  30. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/api.py +0 -0
  31. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/bookmark/__init__.py +0 -0
  32. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/bookmark/_common.py +0 -0
  33. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/bookmark/create.py +0 -0
  34. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/bookmark/delete.py +0 -0
  35. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/bookmark/list.py +0 -0
  36. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/bookmark/rename.py +0 -0
  37. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/bookmark/show.py +0 -0
  38. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/cli_profile_list.py +0 -0
  39. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/__init__.py +0 -0
  40. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/_common.py +0 -0
  41. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/create/__init__.py +0 -0
  42. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/create/guest.py +0 -0
  43. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/create/mapped.py +0 -0
  44. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/delete.py +0 -0
  45. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/list.py +0 -0
  46. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/role/__init__.py +0 -0
  47. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/role/delete.py +0 -0
  48. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/role/list.py +0 -0
  49. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/role/show.py +0 -0
  50. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/show.py +0 -0
  51. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/collection/update.py +0 -0
  52. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/delete.py +0 -0
  53. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/__init__.py +0 -0
  54. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/_common.py +0 -0
  55. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/delete.py +0 -0
  56. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/local_id.py +0 -0
  57. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/my_shared_endpoint_list.py +0 -0
  58. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/permission/__init__.py +0 -0
  59. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/permission/_common.py +0 -0
  60. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/permission/create.py +0 -0
  61. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/permission/delete.py +0 -0
  62. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/permission/list.py +0 -0
  63. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/permission/show.py +0 -0
  64. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/permission/update.py +0 -0
  65. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/role/__init__.py +0 -0
  66. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/role/_common.py +0 -0
  67. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/role/create.py +0 -0
  68. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/role/delete.py +0 -0
  69. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/role/list.py +0 -0
  70. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/role/show.py +0 -0
  71. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/search.py +0 -0
  72. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/set_subscription_id.py +0 -0
  73. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/show.py +0 -0
  74. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/storage_gateway/__init__.py +0 -0
  75. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/storage_gateway/list.py +0 -0
  76. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/update.py +0 -0
  77. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/__init__.py +0 -0
  78. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/_common.py +0 -0
  79. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/create/__init__.py +0 -0
  80. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/create/from_json.py +0 -0
  81. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/create/posix.py +0 -0
  82. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/create/s3.py +0 -0
  83. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/delete.py +0 -0
  84. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/list.py +0 -0
  85. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/show.py +0 -0
  86. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/update/__init__.py +0 -0
  87. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/endpoint/user_credential/update/from_json.py +0 -0
  88. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/create.py +0 -0
  89. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/delete.py +0 -0
  90. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/list.py +0 -0
  91. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/registered_api/__init__.py +0 -0
  92. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/registered_api/list.py +0 -0
  93. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/registered_api/show.py +0 -0
  94. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/__init__.py +0 -0
  95. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/cancel.py +0 -0
  96. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/delete.py +0 -0
  97. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/list.py +0 -0
  98. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/resume.py +0 -0
  99. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/show.py +0 -0
  100. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/show_definition.py +0 -0
  101. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/show_logs.py +0 -0
  102. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/run/update.py +0 -0
  103. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/show.py +0 -0
  104. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/start.py +0 -0
  105. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/update.py +0 -0
  106. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/flows/validate.py +0 -0
  107. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/__init__.py +0 -0
  108. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/create/__init__.py +0 -0
  109. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/create/_common.py +0 -0
  110. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/create/guest.py +0 -0
  111. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/create/mapped.py +0 -0
  112. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/set_subscription_admin_verified.py +0 -0
  113. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/set_subscription_id.py +0 -0
  114. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/update/__init__.py +0 -0
  115. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/update/guest.py +0 -0
  116. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcp/update/mapped.py +0 -0
  117. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/__init__.py +0 -0
  118. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/__init__.py +0 -0
  119. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/_common.py +0 -0
  120. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/role/__init__.py +0 -0
  121. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/role/_common.py +0 -0
  122. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/role/create.py +0 -0
  123. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/role/delete.py +0 -0
  124. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/role/list.py +0 -0
  125. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/role/show.py +0 -0
  126. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/set_subscription_id.py +0 -0
  127. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/show.py +0 -0
  128. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/gcs/endpoint/update.py +0 -0
  129. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/__init__.py +0 -0
  130. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/_common.py +0 -0
  131. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/create.py +0 -0
  132. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/delete.py +0 -0
  133. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/get_by_subscription.py +0 -0
  134. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/get_subscription_info.py +0 -0
  135. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/invite/__init__.py +0 -0
  136. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/invite/_common.py +0 -0
  137. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/invite/accept.py +0 -0
  138. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/invite/decline.py +0 -0
  139. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/join.py +0 -0
  140. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/leave.py +0 -0
  141. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/list.py +0 -0
  142. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/member/__init__.py +0 -0
  143. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/member/add.py +0 -0
  144. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/member/approve.py +0 -0
  145. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/member/invite.py +0 -0
  146. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/member/list.py +0 -0
  147. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/member/reject.py +0 -0
  148. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/member/remove.py +0 -0
  149. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/set_policies.py +0 -0
  150. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/set_subscription_admin_verified.py +0 -0
  151. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/show.py +0 -0
  152. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/group/update.py +0 -0
  153. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/list_commands.py +0 -0
  154. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/login.py +0 -0
  155. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/logout.py +0 -0
  156. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/ls.py +0 -0
  157. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/mkdir.py +0 -0
  158. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/rename.py +0 -0
  159. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/rm.py +0 -0
  160. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/__init__.py +0 -0
  161. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/_common.py +0 -0
  162. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/delete_by_query.py +0 -0
  163. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/__init__.py +0 -0
  164. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/create.py +0 -0
  165. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/delete.py +0 -0
  166. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/list.py +0 -0
  167. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/role/__init__.py +0 -0
  168. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/role/create.py +0 -0
  169. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/role/delete.py +0 -0
  170. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/role/list.py +0 -0
  171. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/index/show.py +0 -0
  172. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/ingest.py +0 -0
  173. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/query.py +0 -0
  174. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/subject/__init__.py +0 -0
  175. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/subject/delete.py +0 -0
  176. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/subject/show.py +0 -0
  177. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/task/__init__.py +0 -0
  178. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/task/list.py +0 -0
  179. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/search/task/show.py +0 -0
  180. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/session/__init__.py +0 -0
  181. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/session/consent.py +0 -0
  182. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/session/show.py +0 -0
  183. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/session/update.py +0 -0
  184. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/stat.py +0 -0
  185. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/__init__.py +0 -0
  186. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/access_point/__init__.py +0 -0
  187. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/access_point/show.py +0 -0
  188. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/__init__.py +0 -0
  189. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/_common.py +0 -0
  190. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/create.py +0 -0
  191. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/delete.py +0 -0
  192. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/events.py +0 -0
  193. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/list.py +0 -0
  194. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/show.py +0 -0
  195. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/stop.py +0 -0
  196. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/streams/tunnel/update.py +0 -0
  197. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/__init__.py +0 -0
  198. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/_common.py +0 -0
  199. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/cancel.py +0 -0
  200. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/event_list.py +0 -0
  201. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/generate_submission_id.py +0 -0
  202. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/list.py +0 -0
  203. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/pause_info.py +0 -0
  204. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/show.py +0 -0
  205. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/update.py +0 -0
  206. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/task/wait.py +0 -0
  207. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/__init__.py +0 -0
  208. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/_common.py +0 -0
  209. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/create/__init__.py +0 -0
  210. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/create/_common.py +0 -0
  211. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/create/flow.py +0 -0
  212. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/create/transfer.py +0 -0
  213. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/delete.py +0 -0
  214. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/list.py +0 -0
  215. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/pause.py +0 -0
  216. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/resume.py +0 -0
  217. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/timer/show.py +0 -0
  218. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/transfer.py +0 -0
  219. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/update.py +0 -0
  220. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/version.py +0 -0
  221. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/commands/whoami.py +0 -0
  222. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/constants.py +0 -0
  223. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/endpointish/__init__.py +0 -0
  224. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/endpointish/endpointish.py +0 -0
  225. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/endpointish/entity_type.py +0 -0
  226. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/endpointish/errors.py +0 -0
  227. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/__init__.py +0 -0
  228. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/__init__.py +0 -0
  229. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/auth_requirements.py +0 -0
  230. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/authapi_hooks.py +0 -0
  231. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/endpoint_types.py +0 -0
  232. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/flows_hooks.py +0 -0
  233. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/generic_hooks.py +0 -0
  234. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/search_hooks.py +0 -0
  235. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/hooks/transfer_hooks.py +0 -0
  236. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/messages.py +0 -0
  237. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/exception_handling/registry.py +0 -0
  238. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/globus_cli_flake8.py +0 -0
  239. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/__init__.py +0 -0
  240. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/_old_config.py +0 -0
  241. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/auth_flows.py +0 -0
  242. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/client_login.py +0 -0
  243. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/context.py +0 -0
  244. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/errors.py +0 -0
  245. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/local_server.py +0 -0
  246. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/manager.py +0 -0
  247. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/scopes.py +0 -0
  248. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/storage.py +0 -0
  249. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/login_manager/utils.py +0 -0
  250. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/command_state.py +0 -0
  251. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/commands.py +0 -0
  252. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/mutex_group.py +0 -0
  253. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_classes.py +0 -0
  254. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/__init__.py +0 -0
  255. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/endpoint_plus_path.py +0 -0
  256. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/guest_activity_notify_param.py +0 -0
  257. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/identity_type.py +0 -0
  258. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/json_strorfile.py +0 -0
  259. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/location.py +0 -0
  260. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/notify_param.py +0 -0
  261. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/nullable.py +0 -0
  262. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/task_path.py +0 -0
  263. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/param_types/timedelta.py +0 -0
  264. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/shared_callbacks.py +0 -0
  265. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/shared_options/__init__.py +0 -0
  266. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/shared_options/endpointish.py +0 -0
  267. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/shared_options/flow_options.py +0 -0
  268. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/shared_options/transfer_task_options.py +0 -0
  269. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/parsing/shell_completion.py +0 -0
  270. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/reflect.py +0 -0
  271. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/services/__init__.py +0 -0
  272. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/services/auth.py +0 -0
  273. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/services/gcs.py +0 -0
  274. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/services/transfer/__init__.py +0 -0
  275. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/services/transfer/client.py +0 -0
  276. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/services/transfer/data.py +0 -0
  277. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/services/transfer/recursive_ls.py +0 -0
  278. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/__init__.py +0 -0
  279. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/errors.py +0 -0
  280. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/formatters/__init__.py +0 -0
  281. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/formatters/auth.py +0 -0
  282. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/formatters/base.py +0 -0
  283. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/formatters/compound.py +0 -0
  284. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/formatters/primitive.py +0 -0
  285. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/__init__.py +0 -0
  286. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/base.py +0 -0
  287. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/custom_printer.py +0 -0
  288. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/json_printer.py +0 -0
  289. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/table_printer.py +0 -0
  290. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/unix_printer/__init__.py +0 -0
  291. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/unix_printer/_formatter.py +0 -0
  292. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/printers/unix_printer/unix_printer.py +0 -0
  293. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/termio/server_timing.py +0 -0
  294. {globus_cli-3.42.0 → globus_cli-3.43.0}/src/globus_cli/types.py +0 -0
  295. {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.4
1
+ Metadata-Version: 2.5
2
2
  Name: globus-cli
3
- Version: 3.42.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>
@@ -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.8.0
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.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,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.8.0",
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.32.3,<3.0.0",
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.32.4",
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.19.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.4.2",
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, 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,
138
141
  ) -> uuid.UUID | t.Literal["DEFAULT"] | globus_sdk.MissingType:
139
- if self._omittable and value is globus_sdk.MISSING:
140
- 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
+ )
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: dict[str, t.Any]) -> str:
83
+ def resolve_identity(value: str) -> str:
84
84
  """
85
- Helper to deal with variable inputs and uncertain response order.
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
- return t.cast(str, identity["username"])
90
- if identity["username"] == value:
91
- return t.cast(str, identity["id"])
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, value: t.Any, param: click.Parameter | None, ctx: click.Context | None
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 self._omittable and value is globus_sdk.MISSING:
34
- return globus_sdk.MISSING
35
-
36
- value = super().convert(value, param, ctx)
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, value: t.Any, param: click.Parameter | None, ctx: click.Context | None
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, value: t.Any, param: click.Parameter | None, ctx: click.Context | None
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, value: t.Any, param: click.Parameter | None, ctx: click.Context | None
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, value: t.Any, param: click.Parameter | None, ctx: click.Context | None
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, value: t.Any, param: click.Parameter | None, ctx: click.Context | None
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
@@ -29,3 +29,7 @@ def flow_id_arg(f: C) -> C:
29
29
 
30
30
  def run_id_arg(f: C) -> C:
31
31
  return click.argument("run_id", metavar="RUN_ID", type=click.UUID)(f)
32
+
33
+
34
+ def web_input_id_arg(f: C) -> C:
35
+ return click.argument("web_input_id", metavar="WEB_INPUT_ID", type=click.UUID)(f)
@@ -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:
@@ -112,4 +112,4 @@ def term_is_interactive() -> bool:
112
112
 
113
113
  def fold_tables() -> bool | None:
114
114
  val = os.getenv("GLOBUS_CLI_FOLD_TABLES")
115
- return val is None or utils.str2bool(val)
115
+ return None if val is None else utils.str2bool(val)
@@ -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: