globus-cli 3.33.0__tar.gz → 3.34.0__tar.gz

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