globus-cli 3.38.0__tar.gz → 3.40.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 (289) hide show
  1. {globus_cli-3.38.0/src/globus_cli.egg-info → globus_cli-3.40.0}/PKG-INFO +2 -2
  2. {globus_cli-3.38.0 → globus_cli-3.40.0}/pyproject.toml +2 -5
  3. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/api.py +19 -7
  4. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/delete.py +11 -7
  5. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/permission/list.py +1 -2
  6. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/role/list.py +1 -2
  7. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/search.py +10 -7
  8. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/set_subscription_id.py +2 -6
  9. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/user_credential/_common.py +8 -1
  10. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/user_credential/create/posix.py +5 -2
  11. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/user_credential/create/s3.py +5 -2
  12. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/user_credential/list.py +5 -4
  13. globus_cli-3.40.0/src/globus_cli/commands/flows/_common.py +284 -0
  14. globus_cli-3.40.0/src/globus_cli/commands/flows/_fields.py +113 -0
  15. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/flows/create.py +26 -47
  16. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/flows/delete.py +8 -13
  17. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/flows/list.py +7 -5
  18. globus_cli-3.40.0/src/globus_cli/commands/flows/run/cancel.py +28 -0
  19. globus_cli-3.40.0/src/globus_cli/commands/flows/run/delete.py +28 -0
  20. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/flows/run/resume.py +15 -15
  21. globus_cli-3.40.0/src/globus_cli/commands/flows/run/show.py +49 -0
  22. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/flows/run/show_definition.py +4 -2
  23. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/flows/run/show_logs.py +15 -9
  24. globus_cli-3.40.0/src/globus_cli/commands/flows/run/update.py +83 -0
  25. globus_cli-3.40.0/src/globus_cli/commands/flows/show.py +27 -0
  26. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/flows/start.py +35 -78
  27. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/flows/update.py +78 -84
  28. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/gcp/set_subscription_id.py +2 -3
  29. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/get_subscription_info.py +1 -1
  30. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/login.py +53 -8
  31. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/ls.py +3 -3
  32. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/mkdir.py +2 -1
  33. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/rename.py +2 -1
  34. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/rm.py +11 -7
  35. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/search/_common.py +1 -2
  36. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/session/update.py +9 -0
  37. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/stat.py +1 -1
  38. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/timer/_common.py +69 -2
  39. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/timer/create/__init__.py +4 -1
  40. globus_cli-3.40.0/src/globus_cli/commands/timer/create/_common.py +152 -0
  41. globus_cli-3.40.0/src/globus_cli/commands/timer/create/flow.py +82 -0
  42. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/timer/create/transfer.py +21 -104
  43. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/transfer.py +33 -22
  44. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/exception_handling/__init__.py +2 -4
  45. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/exception_handling/hooks/auth_requirements.py +1 -1
  46. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/exception_handling/messages.py +16 -11
  47. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/exception_handling/registry.py +19 -5
  48. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/login_manager/manager.py +66 -21
  49. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/login_manager/scopes.py +8 -11
  50. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/login_manager/storage.py +1 -1
  51. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/parsing/__init__.py +12 -0
  52. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/parsing/param_types/__init__.py +12 -0
  53. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/parsing/param_types/delimited.py +15 -2
  54. globus_cli-3.40.0/src/globus_cli/parsing/param_types/omittable.py +113 -0
  55. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/parsing/shared_options/__init__.py +34 -8
  56. globus_cli-3.40.0/src/globus_cli/parsing/shared_options/flow_options.py +27 -0
  57. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/parsing/shared_options/transfer_task_options.py +14 -4
  58. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/services/auth.py +0 -7
  59. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/services/transfer/client.py +1 -1
  60. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/services/transfer/data.py +26 -6
  61. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/termio/formatters/auth.py +16 -8
  62. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/utils.py +35 -8
  63. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/version.py +1 -1
  64. {globus_cli-3.38.0 → globus_cli-3.40.0/src/globus_cli.egg-info}/PKG-INFO +2 -2
  65. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli.egg-info/SOURCES.txt +5 -0
  66. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli.egg-info/requires.txt +1 -1
  67. globus_cli-3.38.0/src/globus_cli/commands/flows/_common.py +0 -143
  68. globus_cli-3.38.0/src/globus_cli/commands/flows/run/cancel.py +0 -31
  69. globus_cli-3.38.0/src/globus_cli/commands/flows/run/delete.py +0 -31
  70. globus_cli-3.38.0/src/globus_cli/commands/flows/run/show.py +0 -77
  71. globus_cli-3.38.0/src/globus_cli/commands/flows/run/update.py +0 -109
  72. globus_cli-3.38.0/src/globus_cli/commands/flows/show.py +0 -69
  73. {globus_cli-3.38.0 → globus_cli-3.40.0}/LICENSE +0 -0
  74. {globus_cli-3.38.0 → globus_cli-3.40.0}/README.rst +0 -0
  75. {globus_cli-3.38.0 → globus_cli-3.40.0}/setup.cfg +0 -0
  76. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/__init__.py +0 -0
  77. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/__main__.py +0 -0
  78. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/_click_compat.py +0 -0
  79. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/_warnings.py +0 -0
  80. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/__init__.py +0 -0
  81. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/_common.py +0 -0
  82. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/_removal_stub.py +0 -0
  83. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/bookmark/__init__.py +0 -0
  84. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/bookmark/_common.py +0 -0
  85. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/bookmark/create.py +0 -0
  86. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/bookmark/delete.py +0 -0
  87. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/bookmark/list.py +0 -0
  88. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/bookmark/rename.py +0 -0
  89. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/bookmark/show.py +0 -0
  90. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/cli_profile_list.py +0 -0
  91. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/collection/__init__.py +0 -0
  92. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/collection/_common.py +0 -0
  93. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/collection/create/__init__.py +0 -0
  94. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/collection/create/guest.py +0 -0
  95. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/collection/create/mapped.py +0 -0
  96. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/collection/delete.py +0 -0
  97. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/collection/list.py +0 -0
  98. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/collection/role/__init__.py +0 -0
  99. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/collection/role/delete.py +0 -0
  100. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/collection/role/list.py +0 -0
  101. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/collection/role/show.py +0 -0
  102. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/collection/show.py +0 -0
  103. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/collection/update.py +0 -0
  104. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/__init__.py +0 -0
  105. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/_common.py +0 -0
  106. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/delete.py +0 -0
  107. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/local_id.py +0 -0
  108. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/my_shared_endpoint_list.py +0 -0
  109. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/permission/__init__.py +0 -0
  110. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/permission/_common.py +0 -0
  111. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/permission/create.py +0 -0
  112. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/permission/delete.py +0 -0
  113. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/permission/show.py +0 -0
  114. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/permission/update.py +0 -0
  115. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/role/__init__.py +0 -0
  116. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/role/_common.py +0 -0
  117. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/role/create.py +0 -0
  118. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/role/delete.py +0 -0
  119. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/role/show.py +0 -0
  120. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/show.py +0 -0
  121. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/storage_gateway/__init__.py +0 -0
  122. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/storage_gateway/list.py +0 -0
  123. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/update.py +0 -0
  124. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/user_credential/__init__.py +0 -0
  125. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/user_credential/create/__init__.py +0 -0
  126. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/user_credential/create/from_json.py +0 -0
  127. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/user_credential/delete.py +0 -0
  128. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/user_credential/show.py +0 -0
  129. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/user_credential/update/__init__.py +0 -0
  130. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/endpoint/user_credential/update/from_json.py +0 -0
  131. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/flows/__init__.py +0 -0
  132. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/flows/run/__init__.py +0 -0
  133. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/flows/run/list.py +0 -0
  134. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/flows/validate.py +0 -0
  135. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/gcp/__init__.py +0 -0
  136. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/gcp/create/__init__.py +0 -0
  137. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/gcp/create/_common.py +0 -0
  138. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/gcp/create/guest.py +0 -0
  139. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/gcp/create/mapped.py +0 -0
  140. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/gcp/set_subscription_admin_verified.py +0 -0
  141. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/gcp/update/__init__.py +0 -0
  142. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/gcp/update/guest.py +0 -0
  143. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/gcp/update/mapped.py +0 -0
  144. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/gcs/__init__.py +0 -0
  145. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/gcs/endpoint/__init__.py +0 -0
  146. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/gcs/endpoint/_common.py +0 -0
  147. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/gcs/endpoint/role/__init__.py +0 -0
  148. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/gcs/endpoint/role/_common.py +0 -0
  149. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/gcs/endpoint/role/create.py +0 -0
  150. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/gcs/endpoint/role/delete.py +0 -0
  151. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/gcs/endpoint/role/list.py +0 -0
  152. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/gcs/endpoint/role/show.py +0 -0
  153. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/gcs/endpoint/set_subscription_id.py +0 -0
  154. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/gcs/endpoint/show.py +0 -0
  155. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/gcs/endpoint/update.py +0 -0
  156. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/get_identities.py +0 -0
  157. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/__init__.py +0 -0
  158. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/_common.py +0 -0
  159. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/create.py +0 -0
  160. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/delete.py +0 -0
  161. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/get_by_subscription.py +0 -0
  162. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/invite/__init__.py +0 -0
  163. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/invite/_common.py +0 -0
  164. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/invite/accept.py +0 -0
  165. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/invite/decline.py +0 -0
  166. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/join.py +0 -0
  167. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/leave.py +0 -0
  168. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/list.py +0 -0
  169. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/member/__init__.py +0 -0
  170. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/member/add.py +0 -0
  171. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/member/approve.py +0 -0
  172. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/member/invite.py +0 -0
  173. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/member/list.py +0 -0
  174. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/member/reject.py +0 -0
  175. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/member/remove.py +0 -0
  176. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/set_policies.py +0 -0
  177. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/set_subscription_admin_verified.py +0 -0
  178. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/show.py +0 -0
  179. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/group/update.py +0 -0
  180. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/list_commands.py +0 -0
  181. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/logout.py +0 -0
  182. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/search/__init__.py +0 -0
  183. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/search/delete_by_query.py +0 -0
  184. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/search/index/__init__.py +0 -0
  185. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/search/index/create.py +0 -0
  186. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/search/index/delete.py +0 -0
  187. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/search/index/list.py +0 -0
  188. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/search/index/role/__init__.py +0 -0
  189. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/search/index/role/create.py +0 -0
  190. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/search/index/role/delete.py +0 -0
  191. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/search/index/role/list.py +0 -0
  192. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/search/index/show.py +0 -0
  193. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/search/ingest.py +0 -0
  194. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/search/query.py +0 -0
  195. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/search/subject/__init__.py +0 -0
  196. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/search/subject/delete.py +0 -0
  197. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/search/subject/show.py +0 -0
  198. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/search/task/__init__.py +0 -0
  199. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/search/task/list.py +0 -0
  200. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/search/task/show.py +0 -0
  201. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/session/__init__.py +0 -0
  202. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/session/consent.py +0 -0
  203. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/session/show.py +0 -0
  204. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/task/__init__.py +0 -0
  205. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/task/_common.py +0 -0
  206. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/task/cancel.py +0 -0
  207. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/task/event_list.py +0 -0
  208. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/task/generate_submission_id.py +0 -0
  209. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/task/list.py +0 -0
  210. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/task/pause_info.py +0 -0
  211. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/task/show.py +0 -0
  212. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/task/update.py +0 -0
  213. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/task/wait.py +0 -0
  214. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/timer/__init__.py +0 -0
  215. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/timer/delete.py +0 -0
  216. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/timer/list.py +0 -0
  217. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/timer/pause.py +0 -0
  218. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/timer/resume.py +0 -0
  219. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/timer/show.py +0 -0
  220. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/update.py +0 -0
  221. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/version.py +0 -0
  222. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/commands/whoami.py +0 -0
  223. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/constants.py +0 -0
  224. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/endpointish/__init__.py +0 -0
  225. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/endpointish/endpointish.py +0 -0
  226. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/endpointish/entity_type.py +0 -0
  227. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/endpointish/errors.py +0 -0
  228. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/exception_handling/hooks/__init__.py +0 -0
  229. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/exception_handling/hooks/authapi_hooks.py +0 -0
  230. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/exception_handling/hooks/endpoint_types.py +0 -0
  231. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/exception_handling/hooks/flows_hooks.py +0 -0
  232. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/exception_handling/hooks/generic_hooks.py +0 -0
  233. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/exception_handling/hooks/search_hooks.py +0 -0
  234. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/exception_handling/hooks/transfer_hooks.py +0 -0
  235. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/globus_cli_flake8.py +0 -0
  236. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/login_manager/__init__.py +0 -0
  237. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/login_manager/_old_config.py +0 -0
  238. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/login_manager/auth_flows.py +0 -0
  239. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/login_manager/client_login.py +0 -0
  240. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/login_manager/context.py +0 -0
  241. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/login_manager/errors.py +0 -0
  242. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/login_manager/local_server.py +0 -0
  243. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/login_manager/utils.py +0 -0
  244. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/parsing/command_state.py +0 -0
  245. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/parsing/commands.py +0 -0
  246. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/parsing/mutex_group.py +0 -0
  247. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/parsing/param_classes.py +0 -0
  248. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/parsing/param_types/endpoint_plus_path.py +0 -0
  249. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/parsing/param_types/guest_activity_notify_param.py +0 -0
  250. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/parsing/param_types/identity_type.py +0 -0
  251. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/parsing/param_types/json_strorfile.py +0 -0
  252. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/parsing/param_types/location.py +0 -0
  253. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/parsing/param_types/notify_param.py +0 -0
  254. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/parsing/param_types/nullable.py +0 -0
  255. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/parsing/param_types/task_path.py +0 -0
  256. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/parsing/param_types/timedelta.py +0 -0
  257. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/parsing/shared_callbacks.py +0 -0
  258. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/parsing/shared_options/endpointish.py +0 -0
  259. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/parsing/shared_options/id_args.py +0 -0
  260. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/parsing/shell_completion.py +0 -0
  261. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/reflect.py +0 -0
  262. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/services/__init__.py +0 -0
  263. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/services/gcs.py +0 -0
  264. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/services/transfer/__init__.py +0 -0
  265. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/services/transfer/activation.py +0 -0
  266. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/services/transfer/recursive_ls.py +0 -0
  267. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/termio/__init__.py +0 -0
  268. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/termio/_display.py +0 -0
  269. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/termio/context.py +0 -0
  270. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/termio/errors.py +0 -0
  271. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/termio/field.py +0 -0
  272. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/termio/formatters/__init__.py +0 -0
  273. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/termio/formatters/base.py +0 -0
  274. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/termio/formatters/compound.py +0 -0
  275. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/termio/formatters/primitive.py +0 -0
  276. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/termio/printers/__init__.py +0 -0
  277. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/termio/printers/base.py +0 -0
  278. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/termio/printers/custom_printer.py +0 -0
  279. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/termio/printers/json_printer.py +0 -0
  280. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/termio/printers/record_printer.py +0 -0
  281. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/termio/printers/table_printer.py +0 -0
  282. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/termio/printers/unix_printer/__init__.py +0 -0
  283. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/termio/printers/unix_printer/_formatter.py +0 -0
  284. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/termio/printers/unix_printer/unix_printer.py +0 -0
  285. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/termio/server_timing.py +0 -0
  286. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli/types.py +0 -0
  287. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli.egg-info/dependency_links.txt +0 -0
  288. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli.egg-info/entry_points.txt +0 -0
  289. {globus_cli-3.38.0 → globus_cli-3.40.0}/src/globus_cli.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: globus-cli
3
- Version: 3.38.0
3
+ Version: 3.40.0
4
4
  Summary: Globus CLI
5
5
  Author-email: Stephen Rosen <sirosen@globus.org>
6
6
  License-Expression: Apache-2.0
@@ -18,7 +18,7 @@ Classifier: Programming Language :: Python :: 3.13
18
18
  Requires-Python: >=3.9
19
19
  Description-Content-Type: text/x-rst
20
20
  License-File: LICENSE
21
- Requires-Dist: globus-sdk==3.63.0
21
+ Requires-Dist: globus-sdk==4.1.0
22
22
  Requires-Dist: click<8.4,>=8.1.4
23
23
  Requires-Dist: jmespath==1.0.1
24
24
  Requires-Dist: packaging>=17.0
@@ -28,7 +28,7 @@ classifiers = [
28
28
  ]
29
29
  requires-python = ">=3.9"
30
30
  dependencies = [
31
- "globus-sdk==3.63.0",
31
+ "globus-sdk==4.1.0",
32
32
  "click>=8.1.4,<8.4",
33
33
  "jmespath==1.0.1",
34
34
  "packaging>=17.0",
@@ -49,7 +49,7 @@ globus = "globus_cli:main"
49
49
  coverage = [
50
50
  "coverage[toml]>=7.10"
51
51
  ]
52
- yaml = ["ruamel.yaml==0.18.15"]
52
+ yaml = ["ruamel.yaml==0.18.16"]
53
53
  test = [
54
54
  {include-group = "coverage"},
55
55
  {include-group = "yaml"}, # loading test fixture data
@@ -96,9 +96,6 @@ profile = "black"
96
96
  addopts = "-n auto --maxprocesses 4 --dist loadscope --timeout 3 --color=yes"
97
97
  filterwarnings = [
98
98
  "error",
99
- # ignore SDK warnings for 'filter_role' until
100
- # 'filter_roles' update is applied
101
- "ignore:The `filter_role` parameter is deprecated.:globus_sdk.exc.RemovedInV4Warning:",
102
99
  ]
103
100
 
104
101
  [tool.coverage.run]
@@ -7,6 +7,7 @@ from collections import defaultdict
7
7
 
8
8
  import click
9
9
  import globus_sdk
10
+ from globus_sdk.scopes import ScopeParser
10
11
 
11
12
  from globus_cli import termio, version
12
13
  from globus_cli._click_compat import shim_get_metavar
@@ -137,7 +138,7 @@ def _get_resource_server(service_name: str) -> str:
137
138
  "groups": globus_sdk.GroupsClient.resource_server,
138
139
  "search": globus_sdk.SearchClient.resource_server,
139
140
  "transfer": globus_sdk.TransferClient.resource_server,
140
- "timers": globus_sdk.TimerClient.resource_server,
141
+ "timers": globus_sdk.TimersClient.resource_server,
141
142
  }.get(service_name)
142
143
  if _resource_server is None:
143
144
  raise NotImplementedError(f"unrecognized service: {service_name}")
@@ -282,7 +283,7 @@ def _execute_service_command(
282
283
 
283
284
  client.app_name = version.app_name + " raw-api-command"
284
285
  if no_retry:
285
- client.transport.max_retries = 0
286
+ client.retry_config.max_retries = 0
286
287
 
287
288
  # Prepare Query Params
288
289
  query_params_d = defaultdict(list)
@@ -316,9 +317,17 @@ def _execute_service_command(
316
317
  for header_name, header_value in header:
317
318
  headers_d[header_name] = header_value
318
319
 
319
- # Strip `/v2` from Groups paths, which are auto-added by `GroupsClient`.
320
- if isinstance(client, globus_sdk.GroupsClient) and path.startswith("/v2"):
321
- path = path[3:]
320
+ # Legacy Behavior: add '/v2/' and '/v0.10/' base paths to Groups and Transfer
321
+ # this was inherited from globus-sdk v3
322
+ # removing it should be done in a controlled manner
323
+ if isinstance(client, globus_sdk.GroupsClient) and not path.startswith("/v2/"):
324
+ if path.startswith("/"):
325
+ path = path[1:]
326
+ path = f"/v2/{path}"
327
+ if isinstance(client, globus_sdk.TransferClient) and not path.startswith("/v0.10/"):
328
+ if path.startswith("/"):
329
+ path = path[1:]
330
+ path = f"/v0.10/{path}"
322
331
 
323
332
  # try sending and handle any error
324
333
  try:
@@ -342,14 +351,17 @@ def _execute_service_command(
342
351
  def _handle_scope_string(
343
352
  login_manager: LoginManager,
344
353
  resource_server: str,
345
- scope_string: tuple[str, ...],
354
+ scope_strings: tuple[str, ...],
346
355
  ) -> None:
347
356
  if not is_client_login():
348
357
  raise click.UsageError(
349
358
  "Scope requirements (--scope-string) are currently only "
350
359
  "supported for confidential-client authorized calls."
351
360
  )
352
- login_manager.add_requirement(resource_server, scope_string)
361
+ login_manager.add_requirement(
362
+ resource_server,
363
+ tuple(scope for s in scope_strings for scope in ScopeParser.parse(s)),
364
+ )
353
365
 
354
366
 
355
367
  @group("api")
@@ -17,6 +17,7 @@ from globus_cli.parsing import (
17
17
  task_submission_options,
18
18
  )
19
19
  from globus_cli.termio import Field, display, err_is_terminal, term_is_interactive
20
+ from globus_cli.utils import make_dict_json_serializable
20
21
 
21
22
 
22
23
  @command(
@@ -74,16 +75,16 @@ def delete_command(
74
75
  batch: t.TextIO | None,
75
76
  ignore_missing: bool,
76
77
  star_silent: bool,
77
- recursive: bool,
78
+ recursive: bool | globus_sdk.MissingType,
78
79
  enable_globs: bool,
79
80
  endpoint_plus_path: tuple[uuid.UUID, str | None],
80
- label: str | None,
81
- submission_id: str | None,
81
+ label: str | globus_sdk.MissingType,
82
+ submission_id: str | globus_sdk.MissingType,
82
83
  dry_run: bool,
83
- deadline: str | None,
84
+ deadline: str | globus_sdk.MissingType,
84
85
  skip_activation_check: bool,
85
86
  notify: dict[str, bool],
86
- local_user: str | None,
87
+ local_user: str | globus_sdk.MissingType,
87
88
  ) -> None:
88
89
  """
89
90
  Submits an asynchronous task that deletes files and/or directories on the target
@@ -122,7 +123,6 @@ def delete_command(
122
123
  transfer_client = login_manager.get_transfer_client()
123
124
 
124
125
  delete_data = globus_sdk.DeleteData(
125
- transfer_client,
126
126
  endpoint_id,
127
127
  label=label,
128
128
  recursive=recursive,
@@ -173,7 +173,11 @@ def delete_command(
173
173
  delete_data.add_item(path)
174
174
 
175
175
  if dry_run:
176
- display(delete_data.data, response_key="DATA", fields=[Field("Path", "path")])
176
+ display(
177
+ make_dict_json_serializable(delete_data),
178
+ response_key="DATA",
179
+ fields=[Field("Path", "path")],
180
+ )
177
181
  # exit safely
178
182
  return
179
183
 
@@ -29,8 +29,7 @@ def list_command(login_manager: LoginManager, *, endpoint_id: uuid.UUID) -> None
29
29
  rules = transfer_client.endpoint_acl_list(endpoint_id)
30
30
 
31
31
  formatter = AclPrincipalFormatter(auth_client)
32
- for r in rules:
33
- formatter.add_item(r)
32
+ formatter.add_items(*rules)
34
33
 
35
34
  display(
36
35
  rules,
@@ -41,8 +41,7 @@ def role_list(login_manager: LoginManager, *, endpoint_id: uuid.UUID) -> None:
41
41
  roles = transfer_client.endpoint_role_list(endpoint_id)
42
42
 
43
43
  formatter = RolePrincipalFormatter(login_manager.get_auth_client())
44
- for r in roles:
45
- formatter.add_item(r)
44
+ formatter.add_items(*roles)
46
45
 
47
46
  display(
48
47
  roles,
@@ -3,10 +3,11 @@ from __future__ import annotations
3
3
  import typing as t
4
4
 
5
5
  import click
6
+ import globus_sdk
6
7
  from globus_sdk.paging import Paginator
7
8
 
8
9
  from globus_cli.login_manager import LoginManager
9
- from globus_cli.parsing import command
10
+ from globus_cli.parsing import OMITTABLE_STRING, OmittableChoice, command
10
11
  from globus_cli.termio import display
11
12
  from globus_cli.utils import PagingWrapper
12
13
 
@@ -70,8 +71,8 @@ $ globus endpoint search --filter-scope my-endpoints
70
71
  )
71
72
  @click.option(
72
73
  "--filter-entity-type",
73
- default=None,
74
- type=click.Choice(
74
+ default=globus_sdk.MISSING,
75
+ type=OmittableChoice(
75
76
  (
76
77
  "GCP_mapped_collection",
77
78
  "GCP_guest_collection",
@@ -83,12 +84,14 @@ $ globus endpoint search --filter-scope my-endpoints
83
84
  ),
84
85
  help="Filter search results to endpoints of a specific entity type.",
85
86
  )
86
- @click.argument("filter_fulltext", required=False)
87
+ @click.argument(
88
+ "filter_fulltext", required=False, default=globus_sdk.MISSING, type=OMITTABLE_STRING
89
+ )
87
90
  @LoginManager.requires_login("auth", "transfer")
88
91
  def endpoint_search(
89
92
  login_manager: LoginManager,
90
93
  *,
91
- filter_fulltext: str | None,
94
+ filter_fulltext: str | globus_sdk.MissingType,
92
95
  limit: int,
93
96
  filter_owner_id: str | None,
94
97
  filter_scope: t.Literal[
@@ -109,7 +112,7 @@ def endpoint_search(
109
112
  "GCSv5_mapped_collection",
110
113
  "GCSv5_guest_collection",
111
114
  ]
112
- | None
115
+ | globus_sdk.MissingType
113
116
  ),
114
117
  ) -> None:
115
118
  """
@@ -145,7 +148,7 @@ def endpoint_search(
145
148
  paginator(
146
149
  filter_fulltext=filter_fulltext,
147
150
  filter_scope=filter_scope,
148
- filter_owner_id=owner_id,
151
+ filter_owner_id=owner_id if owner_id is not None else globus_sdk.MISSING,
149
152
  filter_entity_type=filter_entity_type,
150
153
  ).items(),
151
154
  limit=limit,
@@ -50,11 +50,7 @@ def set_endpoint_subscription_id(
50
50
  """
51
51
  transfer_client = login_manager.get_transfer_client()
52
52
 
53
- optional_subscription_id: str | None = (
54
- None if subscription_id == "null" else subscription_id
55
- )
56
- res = transfer_client.put(
57
- f"/endpoint/{endpoint_id}/subscription",
58
- data={"subscription_id": optional_subscription_id},
53
+ res = transfer_client.set_subscription_id(
54
+ endpoint_id, None if subscription_id == "null" else subscription_id
59
55
  )
60
56
  display(res, text_mode=display.RAW, response_key="message")
@@ -1,7 +1,9 @@
1
1
  import typing as t
2
2
 
3
3
  import click
4
+ import globus_sdk
4
5
 
6
+ from globus_cli.parsing import OMITTABLE_STRING
5
7
  from globus_cli.types import AnyCommand
6
8
 
7
9
  C = t.TypeVar("C", bound=AnyCommand)
@@ -30,7 +32,12 @@ def user_credential_create_and_update_params(
30
32
  f = click.argument("globus-identity")(f)
31
33
  f = click.argument("storage-gateway", type=click.UUID)(f)
32
34
 
33
- f = click.option("--display-name", help="Display name for the credential.")(f)
35
+ f = click.option(
36
+ "--display-name",
37
+ help="Display name for the credential.",
38
+ default=globus_sdk.MISSING,
39
+ type=OMITTABLE_STRING,
40
+ )(f)
34
41
 
35
42
  return f
36
43
 
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import uuid
4
4
 
5
+ import globus_sdk
5
6
  from globus_sdk.services.gcs import UserCredentialDocument
6
7
 
7
8
  from globus_cli.login_manager import LoginManager
@@ -22,7 +23,7 @@ def posix(
22
23
  storage_gateway: uuid.UUID,
23
24
  globus_identity: str,
24
25
  local_username: str,
25
- display_name: str | None,
26
+ display_name: str | globus_sdk.MissingType,
26
27
  ) -> None:
27
28
  """
28
29
  Create a User Credential for a POSIX storage gateway.
@@ -32,7 +33,9 @@ def posix(
32
33
 
33
34
  data = UserCredentialDocument(
34
35
  storage_gateway_id=storage_gateway,
35
- identity_id=auth_client.maybe_lookup_identity_id(globus_identity),
36
+ identity_id=(
37
+ auth_client.maybe_lookup_identity_id(globus_identity) or globus_sdk.MISSING
38
+ ),
36
39
  username=local_username,
37
40
  display_name=display_name,
38
41
  )
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  import uuid
4
4
 
5
5
  import click
6
+ import globus_sdk
6
7
  from globus_sdk.services.gcs import UserCredentialDocument
7
8
 
8
9
  from globus_cli.login_manager import LoginManager
@@ -27,7 +28,7 @@ def s3(
27
28
  local_username: str,
28
29
  s3_key_id: str,
29
30
  s3_secret_key: str,
30
- display_name: str | None,
31
+ display_name: str | globus_sdk.MissingType,
31
32
  ) -> None:
32
33
  """
33
34
  Create a User Credential for an S3 Storage Gateway.
@@ -44,7 +45,9 @@ def s3(
44
45
 
45
46
  data = UserCredentialDocument(
46
47
  storage_gateway_id=storage_gateway,
47
- identity_id=auth_client.maybe_lookup_identity_id(globus_identity),
48
+ identity_id=(
49
+ auth_client.maybe_lookup_identity_id(globus_identity) or globus_sdk.MISSING
50
+ ),
48
51
  username=local_username,
49
52
  policies=policies,
50
53
  display_name=display_name,
@@ -3,9 +3,10 @@ from __future__ import annotations
3
3
  import uuid
4
4
 
5
5
  import click
6
+ import globus_sdk
6
7
 
7
8
  from globus_cli.login_manager import LoginManager
8
- from globus_cli.parsing import command, endpoint_id_arg
9
+ from globus_cli.parsing import OMITTABLE_UUID, command, endpoint_id_arg
9
10
  from globus_cli.termio import Field, display, formatters
10
11
 
11
12
 
@@ -13,8 +14,8 @@ from globus_cli.termio import Field, display, formatters
13
14
  @endpoint_id_arg
14
15
  @click.option(
15
16
  "--storage-gateway",
16
- default=None,
17
- type=click.UUID,
17
+ default=globus_sdk.MISSING,
18
+ type=OMITTABLE_UUID,
18
19
  help=(
19
20
  "Filter results to User Credentials on a Storage Gateway specified by "
20
21
  "this UUID"
@@ -25,7 +26,7 @@ def user_credential_list(
25
26
  login_manager: LoginManager,
26
27
  *,
27
28
  endpoint_id: uuid.UUID,
28
- storage_gateway: uuid.UUID | None,
29
+ storage_gateway: uuid.UUID | globus_sdk.MissingType,
29
30
  ) -> None:
30
31
  """
31
32
  List all of your User Credentials on a Globus Connect Server v5 Endpoint.
@@ -0,0 +1,284 @@
1
+ from __future__ import annotations
2
+
3
+ import contextlib
4
+ import functools
5
+ import typing as t
6
+ import uuid
7
+
8
+ import click
9
+ import globus_sdk
10
+ import globus_sdk.gare
11
+ import globus_sdk.scopes
12
+
13
+ from globus_cli.login_manager import LoginManager
14
+ from globus_cli.parsing import OMITTABLE_STRING, JSONStringOrFile
15
+ from globus_cli.utils import CLIAuthRequirementsError
16
+
17
+ _input_schema_helptext = """
18
+ The JSON input schema that governs the parameters
19
+ used to start the flow.
20
+
21
+ The input document may be specified inline, or it may be a path to a JSON file.
22
+
23
+ Example: Inline JSON:
24
+
25
+ \b
26
+ --input-schema '{"properties": {"src": {"type": "string"}}}'
27
+
28
+ Example: Path to JSON file:
29
+
30
+ \b
31
+ --input-schema schema.json
32
+ """
33
+
34
+ input_schema_option = click.option(
35
+ "--input-schema",
36
+ "input_schema",
37
+ type=JSONStringOrFile(),
38
+ help=_input_schema_helptext,
39
+ )
40
+
41
+ input_schema_option_with_default = click.option(
42
+ "--input-schema",
43
+ "input_schema",
44
+ type=JSONStringOrFile(),
45
+ help=_input_schema_helptext
46
+ + "\n If unspecified, the default is an empty JSON object ('{}').",
47
+ )
48
+
49
+ subtitle_option = click.option(
50
+ "--subtitle",
51
+ type=OMITTABLE_STRING,
52
+ help="A concise summary of the flow's purpose.",
53
+ default=globus_sdk.MISSING,
54
+ )
55
+
56
+
57
+ description_option = click.option(
58
+ "--description",
59
+ type=OMITTABLE_STRING,
60
+ help="A detailed description of the flow's purpose.",
61
+ default=globus_sdk.MISSING,
62
+ )
63
+
64
+
65
+ administrators_option = click.option(
66
+ "--administrator",
67
+ "administrators",
68
+ type=str,
69
+ multiple=True,
70
+ help="""
71
+ A principal that may perform administrative operations
72
+ on the flow (e.g., update, delete).
73
+
74
+ This option can be specified multiple times
75
+ to create a list of flow administrators.
76
+ """,
77
+ )
78
+
79
+
80
+ starters_option = click.option(
81
+ "--starter",
82
+ "starters",
83
+ type=str,
84
+ multiple=True,
85
+ help="""
86
+ A principal that may start a new run of the flow.
87
+
88
+ Use "all_authenticated_users" to allow any authenticated user
89
+ to start a new run of the flow.
90
+
91
+ This option can be specified multiple times
92
+ to create a list of flow starters.
93
+ """,
94
+ )
95
+
96
+
97
+ viewers_option = click.option(
98
+ "--viewer",
99
+ "viewers",
100
+ type=str,
101
+ multiple=True,
102
+ help="""
103
+ A principal that may view the flow.
104
+
105
+ Use "public" to make the flow visible to everyone.
106
+
107
+ This option can be specified multiple times
108
+ to create a list of flow viewers.
109
+ """,
110
+ )
111
+
112
+
113
+ keywords_option = click.option(
114
+ "--keyword",
115
+ "keywords",
116
+ type=str,
117
+ multiple=True,
118
+ help="""
119
+ A term used to help discover this flow when
120
+ browsing and searching.
121
+
122
+ This option can be specified multiple times
123
+ to create a list of keywords.
124
+ """,
125
+ )
126
+
127
+
128
+ class SubscriptionIdType(click.ParamType):
129
+ name = "SUBSCRIPTION_ID"
130
+
131
+ def __init__(self, *, omittable: bool = False) -> None:
132
+ self._omittable = omittable
133
+
134
+ def convert(
135
+ self, value: t.Any, param: click.Parameter | None, ctx: click.Context | None
136
+ ) -> uuid.UUID | t.Literal["DEFAULT"] | globus_sdk.MissingType:
137
+ if self._omittable and value is globus_sdk.MISSING:
138
+ return globus_sdk.MISSING
139
+
140
+ if value.upper() == "DEFAULT":
141
+ return "DEFAULT"
142
+ try:
143
+ return uuid.UUID(value)
144
+ except ValueError:
145
+ self.fail(f"{value} must be either a UUID or 'DEFAULT'", param, ctx)
146
+
147
+ def get_type_annotation(self, param: click.Parameter) -> type:
148
+ if self._omittable:
149
+ return t.Union[ # type: ignore[return-value]
150
+ uuid.UUID, t.Literal["DEFAULT"], globus_sdk.MissingType
151
+ ]
152
+ return t.Union[uuid.UUID, t.Literal["DEFAULT"]] # type: ignore[return-value]
153
+
154
+
155
+ subscription_id_option = click.option(
156
+ "--subscription-id",
157
+ "subscription_id",
158
+ type=SubscriptionIdType(omittable=True),
159
+ multiple=False,
160
+ help="""
161
+ A subscription ID to assign to the flow.
162
+
163
+ The value may be a UUID or the word "DEFAULT".
164
+ """,
165
+ default=globus_sdk.MISSING,
166
+ )
167
+
168
+
169
+ class FlowScopeInjector:
170
+ """
171
+ A context manager for injecting flow-specific scopes into raised GAREs.
172
+
173
+ Usage (flow api):
174
+ >>> with FlowScopeInjector(login_manager).for_flow(flow_id):
175
+ >>> flows_client.get_flow(flow_id)
176
+
177
+ Usage (run api):
178
+ >>> with FlowScopeInjector(login_manager).for_run(run_id):
179
+ >>> flows_client.get_run(run_id)
180
+
181
+ In either case, if the function call raises a GARE-compatible GlobusAPIError,
182
+ the context manager will inject the appropriate flow-specific scope into the
183
+ GARE's required scope section, reraising it as a CLIAuthRequirementsError.
184
+
185
+ Using this ensures that the suggested remediation command will update the relevant
186
+ specific-flow's token, not just the statically-registered flows tokens.
187
+ This can resolve issues where a user, for instance, prints out an HA flow, then
188
+ attempts to run it.
189
+ """
190
+
191
+ def __init__(self, login_manager: LoginManager) -> None:
192
+ self._login_manager = login_manager
193
+
194
+ @contextlib.contextmanager
195
+ def for_flow(self, flow_id: uuid.UUID) -> t.Iterator[None]:
196
+ """
197
+ Context Manager to wrap a flow operation.
198
+
199
+ If the wrapped operation raises a GARE, this manager will re-raise it
200
+ with the flow-specific scope injected.
201
+ """
202
+ try:
203
+ yield
204
+ except globus_sdk.GlobusAPIError as api_error:
205
+ self._inject_and_raise(api_error, lambda: flow_id)
206
+
207
+ @contextlib.contextmanager
208
+ def for_run(self, run_id: uuid.UUID) -> t.Iterator[None]:
209
+ """
210
+ Context manager to wrap a flow run operation.
211
+
212
+ If the wrapped operation raises a GARE, this manager will attempt to look up
213
+ the associated flow ID from search & re-raise it with the flow-specific scope.
214
+
215
+ If the lookup fails, the original error is raised unmodified.
216
+ """
217
+ try:
218
+ yield
219
+ except globus_sdk.GlobusAPIError as api_error:
220
+ resolver = FlowIdResolver(self._login_manager)
221
+ resolve_flow_id = functools.partial(resolver.resolve, run_id)
222
+
223
+ self._inject_and_raise(api_error, resolve_flow_id)
224
+
225
+ @staticmethod
226
+ def _inject_and_raise(
227
+ api_error: globus_sdk.GlobusAPIError,
228
+ resolve_flow_id: t.Callable[[], uuid.UUID | None],
229
+ ) -> None:
230
+ """
231
+ :raises GlobusAPIError: if the supplied api error is not GARE-compatible
232
+ :raises CLIAuthRequirementsError: otherwise with the flow-scope injected into
233
+ the required scopes (assuming it wasn't already there).
234
+ """
235
+ if (gare := globus_sdk.gare.to_gare(api_error)) is None or (
236
+ (flow_id := resolve_flow_id()) is None
237
+ ):
238
+ raise api_error
239
+
240
+ flow_scope = globus_sdk.scopes.SpecificFlowScopes(flow_id).user.scope_string
241
+
242
+ required_scopes = gare.authorization_parameters.required_scopes or []
243
+ # Make sure that no root scopes match the one we want to inject.
244
+ if not any(s.startswith(flow_scope) for s in required_scopes):
245
+ required_scopes.insert(0, flow_scope)
246
+ gare.authorization_parameters.required_scopes = required_scopes
247
+
248
+ raise CLIAuthRequirementsError("", gare=gare, origin=api_error)
249
+
250
+
251
+ class FlowIdResolver:
252
+ RUN_INDEX = "2a318659-a547-4b48-a0fc-e0c19081a960"
253
+
254
+ def __init__(self, login_manager: LoginManager) -> None:
255
+ self._search_client = login_manager.get_search_client()
256
+
257
+ def resolve(self, run_id: uuid.UUID) -> uuid.UUID | None:
258
+ """
259
+ Lookup a run's associated flow ID from search (best-effort).
260
+
261
+ :return: The flow ID as a UUID, or None if the lookup fails or is unparsable
262
+ for any reason.
263
+ """
264
+
265
+ try:
266
+ flow_id = self._search_client.post_search(
267
+ self.RUN_INDEX,
268
+ {
269
+ "filters": [
270
+ {
271
+ "type": "match_any",
272
+ "field_name": "run_id",
273
+ "values": [str(run_id)],
274
+ }
275
+ ],
276
+ "limit": 1,
277
+ },
278
+ )["gmeta"][0]["entries"][0]["content"]["flow_id"]
279
+ return uuid.UUID(flow_id)
280
+ except (globus_sdk.GlobusError, LookupError):
281
+ # This search is a best-effort flows-operation.
282
+ # To avoid mis-categorizing a flows error as a search one, silence any
283
+ # predictable error arising from a failed lookup.
284
+ return None