workato-platform-cli 1.0.0rc5.dev5__py3-none-any.whl

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 (306) hide show
  1. workato_platform_cli/__init__.py +135 -0
  2. workato_platform_cli/_version.py +34 -0
  3. workato_platform_cli/cli/__init__.py +126 -0
  4. workato_platform_cli/cli/commands/__init__.py +0 -0
  5. workato_platform_cli/cli/commands/api_clients.py +627 -0
  6. workato_platform_cli/cli/commands/api_collections.py +497 -0
  7. workato_platform_cli/cli/commands/assets.py +82 -0
  8. workato_platform_cli/cli/commands/connections.py +1205 -0
  9. workato_platform_cli/cli/commands/connectors/__init__.py +0 -0
  10. workato_platform_cli/cli/commands/connectors/command.py +178 -0
  11. workato_platform_cli/cli/commands/connectors/connector_manager.py +351 -0
  12. workato_platform_cli/cli/commands/data_tables.py +345 -0
  13. workato_platform_cli/cli/commands/guide.py +315 -0
  14. workato_platform_cli/cli/commands/init.py +229 -0
  15. workato_platform_cli/cli/commands/profiles.py +364 -0
  16. workato_platform_cli/cli/commands/projects/__init__.py +0 -0
  17. workato_platform_cli/cli/commands/projects/command.py +513 -0
  18. workato_platform_cli/cli/commands/projects/project_manager.py +338 -0
  19. workato_platform_cli/cli/commands/properties.py +174 -0
  20. workato_platform_cli/cli/commands/pull.py +327 -0
  21. workato_platform_cli/cli/commands/push/__init__.py +0 -0
  22. workato_platform_cli/cli/commands/push/command.py +320 -0
  23. workato_platform_cli/cli/commands/recipes/__init__.py +0 -0
  24. workato_platform_cli/cli/commands/recipes/command.py +847 -0
  25. workato_platform_cli/cli/commands/recipes/validator.py +1740 -0
  26. workato_platform_cli/cli/commands/workspace.py +73 -0
  27. workato_platform_cli/cli/containers.py +80 -0
  28. workato_platform_cli/cli/resources/data/connection-data.json +7364 -0
  29. workato_platform_cli/cli/resources/data/picklist-data.json +3706 -0
  30. workato_platform_cli/cli/resources/docs/README.md +178 -0
  31. workato_platform_cli/cli/resources/docs/actions.md +452 -0
  32. workato_platform_cli/cli/resources/docs/block-structure.md +424 -0
  33. workato_platform_cli/cli/resources/docs/connections-parameters.md +11946 -0
  34. workato_platform_cli/cli/resources/docs/data-mapping.md +779 -0
  35. workato_platform_cli/cli/resources/docs/formulas/array-list-formulas.md +1276 -0
  36. workato_platform_cli/cli/resources/docs/formulas/conditions.md +102 -0
  37. workato_platform_cli/cli/resources/docs/formulas/date-formulas.md +798 -0
  38. workato_platform_cli/cli/resources/docs/formulas/number-formulas.md +507 -0
  39. workato_platform_cli/cli/resources/docs/formulas/other-formulas.md +419 -0
  40. workato_platform_cli/cli/resources/docs/formulas/string-formulas.md +1353 -0
  41. workato_platform_cli/cli/resources/docs/formulas.md +214 -0
  42. workato_platform_cli/cli/resources/docs/naming-conventions.md +163 -0
  43. workato_platform_cli/cli/resources/docs/recipe-deployment-workflow.md +352 -0
  44. workato_platform_cli/cli/resources/docs/recipe-fundamentals.md +179 -0
  45. workato_platform_cli/cli/resources/docs/triggers.md +360 -0
  46. workato_platform_cli/cli/utils/__init__.py +10 -0
  47. workato_platform_cli/cli/utils/config/__init__.py +33 -0
  48. workato_platform_cli/cli/utils/config/manager.py +1001 -0
  49. workato_platform_cli/cli/utils/config/models.py +89 -0
  50. workato_platform_cli/cli/utils/config/profiles.py +491 -0
  51. workato_platform_cli/cli/utils/config/workspace.py +113 -0
  52. workato_platform_cli/cli/utils/exception_handler.py +531 -0
  53. workato_platform_cli/cli/utils/gitignore.py +32 -0
  54. workato_platform_cli/cli/utils/ignore_patterns.py +44 -0
  55. workato_platform_cli/cli/utils/spinner.py +63 -0
  56. workato_platform_cli/cli/utils/version_checker.py +237 -0
  57. workato_platform_cli/client/__init__.py +0 -0
  58. workato_platform_cli/client/workato_api/__init__.py +202 -0
  59. workato_platform_cli/client/workato_api/api/__init__.py +15 -0
  60. workato_platform_cli/client/workato_api/api/api_platform_api.py +2875 -0
  61. workato_platform_cli/client/workato_api/api/connections_api.py +1807 -0
  62. workato_platform_cli/client/workato_api/api/connectors_api.py +840 -0
  63. workato_platform_cli/client/workato_api/api/data_tables_api.py +604 -0
  64. workato_platform_cli/client/workato_api/api/export_api.py +621 -0
  65. workato_platform_cli/client/workato_api/api/folders_api.py +621 -0
  66. workato_platform_cli/client/workato_api/api/packages_api.py +1197 -0
  67. workato_platform_cli/client/workato_api/api/projects_api.py +590 -0
  68. workato_platform_cli/client/workato_api/api/properties_api.py +620 -0
  69. workato_platform_cli/client/workato_api/api/recipes_api.py +1379 -0
  70. workato_platform_cli/client/workato_api/api/users_api.py +285 -0
  71. workato_platform_cli/client/workato_api/api_client.py +807 -0
  72. workato_platform_cli/client/workato_api/api_response.py +21 -0
  73. workato_platform_cli/client/workato_api/configuration.py +601 -0
  74. workato_platform_cli/client/workato_api/docs/APIPlatformApi.md +844 -0
  75. workato_platform_cli/client/workato_api/docs/ApiClient.md +46 -0
  76. workato_platform_cli/client/workato_api/docs/ApiClientApiCollectionsInner.md +30 -0
  77. workato_platform_cli/client/workato_api/docs/ApiClientApiPoliciesInner.md +30 -0
  78. workato_platform_cli/client/workato_api/docs/ApiClientCreateRequest.md +46 -0
  79. workato_platform_cli/client/workato_api/docs/ApiClientListResponse.md +32 -0
  80. workato_platform_cli/client/workato_api/docs/ApiClientResponse.md +29 -0
  81. workato_platform_cli/client/workato_api/docs/ApiCollection.md +38 -0
  82. workato_platform_cli/client/workato_api/docs/ApiCollectionCreateRequest.md +32 -0
  83. workato_platform_cli/client/workato_api/docs/ApiEndpoint.md +41 -0
  84. workato_platform_cli/client/workato_api/docs/ApiKey.md +36 -0
  85. workato_platform_cli/client/workato_api/docs/ApiKeyCreateRequest.md +32 -0
  86. workato_platform_cli/client/workato_api/docs/ApiKeyListResponse.md +32 -0
  87. workato_platform_cli/client/workato_api/docs/ApiKeyResponse.md +29 -0
  88. workato_platform_cli/client/workato_api/docs/Asset.md +39 -0
  89. workato_platform_cli/client/workato_api/docs/AssetReference.md +37 -0
  90. workato_platform_cli/client/workato_api/docs/Connection.md +44 -0
  91. workato_platform_cli/client/workato_api/docs/ConnectionCreateRequest.md +35 -0
  92. workato_platform_cli/client/workato_api/docs/ConnectionUpdateRequest.md +34 -0
  93. workato_platform_cli/client/workato_api/docs/ConnectionsApi.md +526 -0
  94. workato_platform_cli/client/workato_api/docs/ConnectorAction.md +33 -0
  95. workato_platform_cli/client/workato_api/docs/ConnectorVersion.md +32 -0
  96. workato_platform_cli/client/workato_api/docs/ConnectorsApi.md +249 -0
  97. workato_platform_cli/client/workato_api/docs/CreateExportManifestRequest.md +29 -0
  98. workato_platform_cli/client/workato_api/docs/CreateFolderRequest.md +30 -0
  99. workato_platform_cli/client/workato_api/docs/CustomConnector.md +35 -0
  100. workato_platform_cli/client/workato_api/docs/CustomConnectorCodeResponse.md +29 -0
  101. workato_platform_cli/client/workato_api/docs/CustomConnectorCodeResponseData.md +29 -0
  102. workato_platform_cli/client/workato_api/docs/CustomConnectorListResponse.md +29 -0
  103. workato_platform_cli/client/workato_api/docs/DataTable.md +34 -0
  104. workato_platform_cli/client/workato_api/docs/DataTableColumn.md +37 -0
  105. workato_platform_cli/client/workato_api/docs/DataTableColumnRequest.md +37 -0
  106. workato_platform_cli/client/workato_api/docs/DataTableCreateRequest.md +31 -0
  107. workato_platform_cli/client/workato_api/docs/DataTableCreateResponse.md +29 -0
  108. workato_platform_cli/client/workato_api/docs/DataTableListResponse.md +29 -0
  109. workato_platform_cli/client/workato_api/docs/DataTableRelation.md +30 -0
  110. workato_platform_cli/client/workato_api/docs/DataTablesApi.md +172 -0
  111. workato_platform_cli/client/workato_api/docs/DeleteProject403Response.md +29 -0
  112. workato_platform_cli/client/workato_api/docs/Error.md +29 -0
  113. workato_platform_cli/client/workato_api/docs/ExportApi.md +175 -0
  114. workato_platform_cli/client/workato_api/docs/ExportManifestRequest.md +35 -0
  115. workato_platform_cli/client/workato_api/docs/ExportManifestResponse.md +29 -0
  116. workato_platform_cli/client/workato_api/docs/ExportManifestResponseResult.md +36 -0
  117. workato_platform_cli/client/workato_api/docs/Folder.md +35 -0
  118. workato_platform_cli/client/workato_api/docs/FolderAssetsResponse.md +29 -0
  119. workato_platform_cli/client/workato_api/docs/FolderAssetsResponseResult.md +29 -0
  120. workato_platform_cli/client/workato_api/docs/FolderCreationResponse.md +35 -0
  121. workato_platform_cli/client/workato_api/docs/FoldersApi.md +176 -0
  122. workato_platform_cli/client/workato_api/docs/ImportResults.md +32 -0
  123. workato_platform_cli/client/workato_api/docs/OAuthUrlResponse.md +29 -0
  124. workato_platform_cli/client/workato_api/docs/OAuthUrlResponseData.md +29 -0
  125. workato_platform_cli/client/workato_api/docs/OpenApiSpec.md +30 -0
  126. workato_platform_cli/client/workato_api/docs/PackageDetailsResponse.md +35 -0
  127. workato_platform_cli/client/workato_api/docs/PackageDetailsResponseRecipeStatusInner.md +30 -0
  128. workato_platform_cli/client/workato_api/docs/PackageResponse.md +33 -0
  129. workato_platform_cli/client/workato_api/docs/PackagesApi.md +364 -0
  130. workato_platform_cli/client/workato_api/docs/PicklistRequest.md +30 -0
  131. workato_platform_cli/client/workato_api/docs/PicklistResponse.md +29 -0
  132. workato_platform_cli/client/workato_api/docs/PlatformConnector.md +36 -0
  133. workato_platform_cli/client/workato_api/docs/PlatformConnectorListResponse.md +32 -0
  134. workato_platform_cli/client/workato_api/docs/Project.md +32 -0
  135. workato_platform_cli/client/workato_api/docs/ProjectsApi.md +173 -0
  136. workato_platform_cli/client/workato_api/docs/PropertiesApi.md +186 -0
  137. workato_platform_cli/client/workato_api/docs/Recipe.md +58 -0
  138. workato_platform_cli/client/workato_api/docs/RecipeConfigInner.md +33 -0
  139. workato_platform_cli/client/workato_api/docs/RecipeConnectionUpdateRequest.md +30 -0
  140. workato_platform_cli/client/workato_api/docs/RecipeListResponse.md +29 -0
  141. workato_platform_cli/client/workato_api/docs/RecipeStartResponse.md +31 -0
  142. workato_platform_cli/client/workato_api/docs/RecipesApi.md +367 -0
  143. workato_platform_cli/client/workato_api/docs/RuntimeUserConnectionCreateRequest.md +34 -0
  144. workato_platform_cli/client/workato_api/docs/RuntimeUserConnectionResponse.md +29 -0
  145. workato_platform_cli/client/workato_api/docs/RuntimeUserConnectionResponseData.md +30 -0
  146. workato_platform_cli/client/workato_api/docs/SuccessResponse.md +29 -0
  147. workato_platform_cli/client/workato_api/docs/UpsertProjectPropertiesRequest.md +29 -0
  148. workato_platform_cli/client/workato_api/docs/User.md +48 -0
  149. workato_platform_cli/client/workato_api/docs/UsersApi.md +84 -0
  150. workato_platform_cli/client/workato_api/docs/ValidationError.md +30 -0
  151. workato_platform_cli/client/workato_api/docs/ValidationErrorErrorsValue.md +28 -0
  152. workato_platform_cli/client/workato_api/exceptions.py +216 -0
  153. workato_platform_cli/client/workato_api/models/__init__.py +83 -0
  154. workato_platform_cli/client/workato_api/models/api_client.py +185 -0
  155. workato_platform_cli/client/workato_api/models/api_client_api_collections_inner.py +89 -0
  156. workato_platform_cli/client/workato_api/models/api_client_api_policies_inner.py +89 -0
  157. workato_platform_cli/client/workato_api/models/api_client_create_request.py +138 -0
  158. workato_platform_cli/client/workato_api/models/api_client_list_response.py +101 -0
  159. workato_platform_cli/client/workato_api/models/api_client_response.py +91 -0
  160. workato_platform_cli/client/workato_api/models/api_collection.py +110 -0
  161. workato_platform_cli/client/workato_api/models/api_collection_create_request.py +97 -0
  162. workato_platform_cli/client/workato_api/models/api_endpoint.py +117 -0
  163. workato_platform_cli/client/workato_api/models/api_key.py +102 -0
  164. workato_platform_cli/client/workato_api/models/api_key_create_request.py +93 -0
  165. workato_platform_cli/client/workato_api/models/api_key_list_response.py +101 -0
  166. workato_platform_cli/client/workato_api/models/api_key_response.py +91 -0
  167. workato_platform_cli/client/workato_api/models/asset.py +124 -0
  168. workato_platform_cli/client/workato_api/models/asset_reference.py +110 -0
  169. workato_platform_cli/client/workato_api/models/connection.py +173 -0
  170. workato_platform_cli/client/workato_api/models/connection_create_request.py +99 -0
  171. workato_platform_cli/client/workato_api/models/connection_update_request.py +97 -0
  172. workato_platform_cli/client/workato_api/models/connector_action.py +100 -0
  173. workato_platform_cli/client/workato_api/models/connector_version.py +99 -0
  174. workato_platform_cli/client/workato_api/models/create_export_manifest_request.py +91 -0
  175. workato_platform_cli/client/workato_api/models/create_folder_request.py +89 -0
  176. workato_platform_cli/client/workato_api/models/custom_connector.py +117 -0
  177. workato_platform_cli/client/workato_api/models/custom_connector_code_response.py +91 -0
  178. workato_platform_cli/client/workato_api/models/custom_connector_code_response_data.py +87 -0
  179. workato_platform_cli/client/workato_api/models/custom_connector_list_response.py +95 -0
  180. workato_platform_cli/client/workato_api/models/data_table.py +107 -0
  181. workato_platform_cli/client/workato_api/models/data_table_column.py +125 -0
  182. workato_platform_cli/client/workato_api/models/data_table_column_request.py +130 -0
  183. workato_platform_cli/client/workato_api/models/data_table_create_request.py +99 -0
  184. workato_platform_cli/client/workato_api/models/data_table_create_response.py +91 -0
  185. workato_platform_cli/client/workato_api/models/data_table_list_response.py +95 -0
  186. workato_platform_cli/client/workato_api/models/data_table_relation.py +90 -0
  187. workato_platform_cli/client/workato_api/models/delete_project403_response.py +87 -0
  188. workato_platform_cli/client/workato_api/models/error.py +87 -0
  189. workato_platform_cli/client/workato_api/models/export_manifest_request.py +107 -0
  190. workato_platform_cli/client/workato_api/models/export_manifest_response.py +91 -0
  191. workato_platform_cli/client/workato_api/models/export_manifest_response_result.py +112 -0
  192. workato_platform_cli/client/workato_api/models/folder.py +110 -0
  193. workato_platform_cli/client/workato_api/models/folder_assets_response.py +91 -0
  194. workato_platform_cli/client/workato_api/models/folder_assets_response_result.py +95 -0
  195. workato_platform_cli/client/workato_api/models/folder_creation_response.py +110 -0
  196. workato_platform_cli/client/workato_api/models/import_results.py +93 -0
  197. workato_platform_cli/client/workato_api/models/o_auth_url_response.py +91 -0
  198. workato_platform_cli/client/workato_api/models/o_auth_url_response_data.py +87 -0
  199. workato_platform_cli/client/workato_api/models/open_api_spec.py +96 -0
  200. workato_platform_cli/client/workato_api/models/package_details_response.py +126 -0
  201. workato_platform_cli/client/workato_api/models/package_details_response_recipe_status_inner.py +99 -0
  202. workato_platform_cli/client/workato_api/models/package_response.py +109 -0
  203. workato_platform_cli/client/workato_api/models/picklist_request.py +89 -0
  204. workato_platform_cli/client/workato_api/models/picklist_response.py +88 -0
  205. workato_platform_cli/client/workato_api/models/platform_connector.py +116 -0
  206. workato_platform_cli/client/workato_api/models/platform_connector_list_response.py +101 -0
  207. workato_platform_cli/client/workato_api/models/project.py +93 -0
  208. workato_platform_cli/client/workato_api/models/recipe.py +174 -0
  209. workato_platform_cli/client/workato_api/models/recipe_config_inner.py +100 -0
  210. workato_platform_cli/client/workato_api/models/recipe_connection_update_request.py +89 -0
  211. workato_platform_cli/client/workato_api/models/recipe_list_response.py +95 -0
  212. workato_platform_cli/client/workato_api/models/recipe_start_response.py +91 -0
  213. workato_platform_cli/client/workato_api/models/runtime_user_connection_create_request.py +97 -0
  214. workato_platform_cli/client/workato_api/models/runtime_user_connection_response.py +91 -0
  215. workato_platform_cli/client/workato_api/models/runtime_user_connection_response_data.py +89 -0
  216. workato_platform_cli/client/workato_api/models/success_response.py +87 -0
  217. workato_platform_cli/client/workato_api/models/upsert_project_properties_request.py +88 -0
  218. workato_platform_cli/client/workato_api/models/user.py +151 -0
  219. workato_platform_cli/client/workato_api/models/validation_error.py +102 -0
  220. workato_platform_cli/client/workato_api/models/validation_error_errors_value.py +143 -0
  221. workato_platform_cli/client/workato_api/rest.py +213 -0
  222. workato_platform_cli/client/workato_api/test/__init__.py +0 -0
  223. workato_platform_cli/client/workato_api/test/test_api_client.py +94 -0
  224. workato_platform_cli/client/workato_api/test/test_api_client_api_collections_inner.py +52 -0
  225. workato_platform_cli/client/workato_api/test/test_api_client_api_policies_inner.py +52 -0
  226. workato_platform_cli/client/workato_api/test/test_api_client_create_request.py +75 -0
  227. workato_platform_cli/client/workato_api/test/test_api_client_list_response.py +114 -0
  228. workato_platform_cli/client/workato_api/test/test_api_client_response.py +104 -0
  229. workato_platform_cli/client/workato_api/test/test_api_collection.py +72 -0
  230. workato_platform_cli/client/workato_api/test/test_api_collection_create_request.py +57 -0
  231. workato_platform_cli/client/workato_api/test/test_api_endpoint.py +75 -0
  232. workato_platform_cli/client/workato_api/test/test_api_key.py +64 -0
  233. workato_platform_cli/client/workato_api/test/test_api_key_create_request.py +56 -0
  234. workato_platform_cli/client/workato_api/test/test_api_key_list_response.py +78 -0
  235. workato_platform_cli/client/workato_api/test/test_api_key_response.py +68 -0
  236. workato_platform_cli/client/workato_api/test/test_api_platform_api.py +101 -0
  237. workato_platform_cli/client/workato_api/test/test_asset.py +67 -0
  238. workato_platform_cli/client/workato_api/test/test_asset_reference.py +62 -0
  239. workato_platform_cli/client/workato_api/test/test_connection.py +81 -0
  240. workato_platform_cli/client/workato_api/test/test_connection_create_request.py +59 -0
  241. workato_platform_cli/client/workato_api/test/test_connection_update_request.py +56 -0
  242. workato_platform_cli/client/workato_api/test/test_connections_api.py +73 -0
  243. workato_platform_cli/client/workato_api/test/test_connector_action.py +59 -0
  244. workato_platform_cli/client/workato_api/test/test_connector_version.py +58 -0
  245. workato_platform_cli/client/workato_api/test/test_connectors_api.py +52 -0
  246. workato_platform_cli/client/workato_api/test/test_create_export_manifest_request.py +88 -0
  247. workato_platform_cli/client/workato_api/test/test_create_folder_request.py +53 -0
  248. workato_platform_cli/client/workato_api/test/test_custom_connector.py +76 -0
  249. workato_platform_cli/client/workato_api/test/test_custom_connector_code_response.py +54 -0
  250. workato_platform_cli/client/workato_api/test/test_custom_connector_code_response_data.py +52 -0
  251. workato_platform_cli/client/workato_api/test/test_custom_connector_list_response.py +82 -0
  252. workato_platform_cli/client/workato_api/test/test_data_table.py +88 -0
  253. workato_platform_cli/client/workato_api/test/test_data_table_column.py +72 -0
  254. workato_platform_cli/client/workato_api/test/test_data_table_column_request.py +64 -0
  255. workato_platform_cli/client/workato_api/test/test_data_table_create_request.py +82 -0
  256. workato_platform_cli/client/workato_api/test/test_data_table_create_response.py +90 -0
  257. workato_platform_cli/client/workato_api/test/test_data_table_list_response.py +94 -0
  258. workato_platform_cli/client/workato_api/test/test_data_table_relation.py +54 -0
  259. workato_platform_cli/client/workato_api/test/test_data_tables_api.py +45 -0
  260. workato_platform_cli/client/workato_api/test/test_delete_project403_response.py +51 -0
  261. workato_platform_cli/client/workato_api/test/test_error.py +52 -0
  262. workato_platform_cli/client/workato_api/test/test_export_api.py +45 -0
  263. workato_platform_cli/client/workato_api/test/test_export_manifest_request.py +69 -0
  264. workato_platform_cli/client/workato_api/test/test_export_manifest_response.py +68 -0
  265. workato_platform_cli/client/workato_api/test/test_export_manifest_response_result.py +66 -0
  266. workato_platform_cli/client/workato_api/test/test_folder.py +64 -0
  267. workato_platform_cli/client/workato_api/test/test_folder_assets_response.py +80 -0
  268. workato_platform_cli/client/workato_api/test/test_folder_assets_response_result.py +78 -0
  269. workato_platform_cli/client/workato_api/test/test_folder_creation_response.py +64 -0
  270. workato_platform_cli/client/workato_api/test/test_folders_api.py +45 -0
  271. workato_platform_cli/client/workato_api/test/test_import_results.py +58 -0
  272. workato_platform_cli/client/workato_api/test/test_o_auth_url_response.py +54 -0
  273. workato_platform_cli/client/workato_api/test/test_o_auth_url_response_data.py +52 -0
  274. workato_platform_cli/client/workato_api/test/test_open_api_spec.py +54 -0
  275. workato_platform_cli/client/workato_api/test/test_package_details_response.py +64 -0
  276. workato_platform_cli/client/workato_api/test/test_package_details_response_recipe_status_inner.py +52 -0
  277. workato_platform_cli/client/workato_api/test/test_package_response.py +58 -0
  278. workato_platform_cli/client/workato_api/test/test_packages_api.py +59 -0
  279. workato_platform_cli/client/workato_api/test/test_picklist_request.py +53 -0
  280. workato_platform_cli/client/workato_api/test/test_picklist_response.py +52 -0
  281. workato_platform_cli/client/workato_api/test/test_platform_connector.py +94 -0
  282. workato_platform_cli/client/workato_api/test/test_platform_connector_list_response.py +106 -0
  283. workato_platform_cli/client/workato_api/test/test_project.py +57 -0
  284. workato_platform_cli/client/workato_api/test/test_projects_api.py +45 -0
  285. workato_platform_cli/client/workato_api/test/test_properties_api.py +45 -0
  286. workato_platform_cli/client/workato_api/test/test_recipe.py +124 -0
  287. workato_platform_cli/client/workato_api/test/test_recipe_config_inner.py +55 -0
  288. workato_platform_cli/client/workato_api/test/test_recipe_connection_update_request.py +54 -0
  289. workato_platform_cli/client/workato_api/test/test_recipe_list_response.py +134 -0
  290. workato_platform_cli/client/workato_api/test/test_recipe_start_response.py +54 -0
  291. workato_platform_cli/client/workato_api/test/test_recipes_api.py +59 -0
  292. workato_platform_cli/client/workato_api/test/test_runtime_user_connection_create_request.py +59 -0
  293. workato_platform_cli/client/workato_api/test/test_runtime_user_connection_response.py +56 -0
  294. workato_platform_cli/client/workato_api/test/test_runtime_user_connection_response_data.py +54 -0
  295. workato_platform_cli/client/workato_api/test/test_success_response.py +52 -0
  296. workato_platform_cli/client/workato_api/test/test_upsert_project_properties_request.py +52 -0
  297. workato_platform_cli/client/workato_api/test/test_user.py +85 -0
  298. workato_platform_cli/client/workato_api/test/test_users_api.py +38 -0
  299. workato_platform_cli/client/workato_api/test/test_validation_error.py +52 -0
  300. workato_platform_cli/client/workato_api/test/test_validation_error_errors_value.py +50 -0
  301. workato_platform_cli/client/workato_api_README.md +205 -0
  302. workato_platform_cli-1.0.0rc5.dev5.dist-info/METADATA +185 -0
  303. workato_platform_cli-1.0.0rc5.dev5.dist-info/RECORD +306 -0
  304. workato_platform_cli-1.0.0rc5.dev5.dist-info/WHEEL +4 -0
  305. workato_platform_cli-1.0.0rc5.dev5.dist-info/entry_points.txt +2 -0
  306. workato_platform_cli-1.0.0rc5.dev5.dist-info/licenses/LICENSE +7 -0
@@ -0,0 +1,338 @@
1
+ """ProjectManager for handling Workato project operations"""
2
+
3
+ import os
4
+ import shutil
5
+ import subprocess # noqa: S404
6
+ import time
7
+ import zipfile
8
+
9
+ from pathlib import Path
10
+
11
+ import asyncclick as click
12
+ import inquirer
13
+
14
+ from workato_platform_cli import Workato
15
+ from workato_platform_cli.cli.utils.spinner import Spinner
16
+ from workato_platform_cli.client.workato_api.models.asset import Asset
17
+ from workato_platform_cli.client.workato_api.models.create_export_manifest_request import ( # noqa: E501
18
+ CreateExportManifestRequest,
19
+ )
20
+ from workato_platform_cli.client.workato_api.models.create_folder_request import (
21
+ CreateFolderRequest,
22
+ )
23
+ from workato_platform_cli.client.workato_api.models.export_manifest_request import (
24
+ ExportManifestRequest,
25
+ )
26
+ from workato_platform_cli.client.workato_api.models.project import Project
27
+
28
+
29
+ class ProjectManager:
30
+ """Manages Workato project operations using the new API client"""
31
+
32
+ def __init__(self, workato_api_client: Workato):
33
+ self.client = workato_api_client
34
+
35
+ def _format_project_display(self, project: Project) -> str:
36
+ """Format a project object for display - returns formatted string"""
37
+ return f"{project.name} (ID: {project.id})"
38
+
39
+ def _get_project_by_display_name(
40
+ self,
41
+ projects: list[Project],
42
+ display_name: str,
43
+ ) -> Project | None:
44
+ """Find a project by its display name - returns project object or None"""
45
+ for project in projects:
46
+ if self._format_project_display(project) == display_name:
47
+ return project
48
+ return None
49
+
50
+ async def get_projects(self, page: int = 1, per_page: int = 100) -> list[Project]:
51
+ """Get list of projects with pagination"""
52
+ return await self.client.projects_api.list_projects(
53
+ page=page, per_page=per_page
54
+ )
55
+
56
+ async def get_all_projects(self) -> list[Project]:
57
+ """Get all projects by handling pagination"""
58
+ all_projects = []
59
+ page = 1
60
+ per_page = 100
61
+
62
+ while True:
63
+ projects = await self.get_projects(page, per_page)
64
+
65
+ if not projects:
66
+ break
67
+
68
+ all_projects.extend(projects)
69
+
70
+ # If we got fewer than per_page results, we're on the last page
71
+ if len(projects) < per_page:
72
+ break
73
+
74
+ page += 1
75
+
76
+ return all_projects
77
+
78
+ async def create_project(self, project_name: str) -> Project:
79
+ """Create a new project folder"""
80
+ folder_data = await self.client.folders_api.create_folder(
81
+ create_folder_request=CreateFolderRequest(name=project_name)
82
+ )
83
+
84
+ for project in await self.get_all_projects():
85
+ if project.folder_id == folder_data.id:
86
+ return project
87
+
88
+ return Project(
89
+ id=folder_data.id,
90
+ name=project_name,
91
+ folder_id=folder_data.id,
92
+ description="",
93
+ )
94
+
95
+ async def check_folder_assets(self, folder_id: int) -> list[Asset]:
96
+ """Check if a folder has any assets"""
97
+ assets_response = await self.client.export_api.list_assets_in_folder(
98
+ folder_id=folder_id
99
+ )
100
+ assets = (
101
+ assets_response.result.assets
102
+ if assets_response.result and assets_response.result.assets
103
+ else []
104
+ )
105
+ return assets
106
+
107
+ async def export_project(
108
+ self,
109
+ folder_id: int,
110
+ project_name: str,
111
+ target_dir: str = "project",
112
+ ) -> str | None:
113
+ """Export project assets and return project directory path"""
114
+ # Check if project has any assets before attempting export
115
+ assets = await self.check_folder_assets(folder_id)
116
+
117
+ if not assets:
118
+ # Empty project - just create the directory structure
119
+ click.echo("📂 Project is empty, creating directory structure...")
120
+ project_dir = Path(target_dir)
121
+ project_dir.mkdir(exist_ok=True)
122
+ return str(project_dir)
123
+
124
+ # Create export manifest with spinner
125
+ spinner = Spinner("Creating export manifest")
126
+ spinner.start()
127
+ try:
128
+ manifest_data = await self.client.export_api.create_export_manifest(
129
+ create_export_manifest_request=CreateExportManifestRequest(
130
+ export_manifest=ExportManifestRequest(
131
+ name=project_name,
132
+ folder_id=folder_id,
133
+ auto_generate_assets=True,
134
+ )
135
+ )
136
+ )
137
+ manifest_id = manifest_data.result.id
138
+ finally:
139
+ elapsed = spinner.stop()
140
+
141
+ click.echo(f"✅ Export manifest created: {manifest_id} ({elapsed:.1f}s)")
142
+
143
+ # Trigger the export package creation
144
+ spinner = Spinner("Triggering export package")
145
+ spinner.start()
146
+ try:
147
+ package_data = await self.client.packages_api.export_package(
148
+ id=str(manifest_id)
149
+ )
150
+ package_id = package_data.id
151
+ finally:
152
+ elapsed = spinner.stop()
153
+
154
+ click.echo(f"✅ Export package triggered: {package_id} ({elapsed:.1f}s)")
155
+
156
+ # Poll for package completion and download
157
+ extracted_project_dir = await self.download_and_extract_package(
158
+ package_id,
159
+ target_dir,
160
+ )
161
+ return str(extracted_project_dir)
162
+
163
+ async def download_and_extract_package(
164
+ self, package_id: int, target_dir: str = "project"
165
+ ) -> Path | None:
166
+ """Download and extract the package, return project directory path"""
167
+
168
+ # Poll package status until completed with dynamic status
169
+ spinner = Spinner("Preparing package")
170
+ spinner.start()
171
+
172
+ max_wait_time = 300 # 5 minutes timeout
173
+ start_time = time.time()
174
+
175
+ try:
176
+ while time.time() - start_time < max_wait_time:
177
+ package_response = await self.client.packages_api.get_package(
178
+ package_id=package_id
179
+ )
180
+ status = package_response.status
181
+
182
+ if status == "completed":
183
+ break
184
+ elif status == "failed":
185
+ spinner.stop()
186
+ click.echo("❌ Package export failed")
187
+
188
+ # Show error details if available
189
+ if package_response.error:
190
+ click.echo(f" 📄 Error: {package_response.error}")
191
+ if package_response.recipe_status:
192
+ click.echo(" 📋 Detailed errors:")
193
+ for error in package_response.recipe_status:
194
+ click.echo(f" â€ĸ {error}")
195
+
196
+ return None
197
+ else:
198
+ # Update spinner message with current status
199
+ spinner.update_message(f"Processing package ({status})")
200
+ time.sleep(2) # Wait 2 seconds before polling again
201
+
202
+ # Check if we timed out
203
+ if time.time() - start_time >= max_wait_time:
204
+ spinner.stop()
205
+ click.echo(
206
+ f"⏰ Package still processing after {max_wait_time // 60} minutes"
207
+ )
208
+ click.echo(" 💡 Check status manually or try again later")
209
+ click.echo(f" 📊 Package ID: {package_id}")
210
+ return None
211
+
212
+ finally:
213
+ elapsed = spinner.stop()
214
+
215
+ click.echo(f"✅ Package ready for download ({elapsed:.1f}s)")
216
+
217
+ # Download the package using the direct download API
218
+ spinner = Spinner("Downloading package")
219
+ spinner.start()
220
+ try:
221
+ download_response = await self.client.packages_api.download_package(
222
+ package_id=package_id
223
+ )
224
+ finally:
225
+ elapsed = spinner.stop()
226
+
227
+ click.echo(f"✅ Package downloaded ({elapsed:.1f}s)")
228
+
229
+ # Create project directory and extract
230
+ spinner = Spinner("Extracting files")
231
+ spinner.start()
232
+ try:
233
+ project_dir = Path(target_dir)
234
+ project_dir.mkdir(exist_ok=True)
235
+
236
+ # Save and extract zip file
237
+ zip_path = f"{target_dir}.zip"
238
+ with open(zip_path, "wb") as f:
239
+ f.write(download_response)
240
+
241
+ with zipfile.ZipFile(zip_path, "r") as zip_ref:
242
+ zip_ref.extractall(project_dir)
243
+
244
+ os.remove(zip_path)
245
+ finally:
246
+ elapsed = spinner.stop()
247
+
248
+ # Show clean message - don't expose internal temp paths to the user
249
+ click.echo(f"✅ Project assets extracted ({elapsed:.1f}s)")
250
+ return project_dir
251
+
252
+ async def handle_post_api_sync(
253
+ self,
254
+ ) -> None:
255
+ """Handle syncing project files after API resource operations"""
256
+ # Auto-sync is always enabled - run pull automatically
257
+ click.echo()
258
+ click.echo("🔄 Auto-syncing project files...")
259
+ try:
260
+ # Find the workato executable to use full path for security
261
+ workato_exe = shutil.which("workato")
262
+ if workato_exe is None:
263
+ click.echo("âš ī¸ Could not find workato executable for auto-sync")
264
+ return
265
+
266
+ # Secure subprocess call: hardcoded command, validated executable path
267
+ result = subprocess.run( # noqa: S603
268
+ [workato_exe, "pull"],
269
+ capture_output=True,
270
+ text=True,
271
+ timeout=30,
272
+ )
273
+ if result.returncode == 0:
274
+ click.echo("✅ Project synced successfully")
275
+ else:
276
+ click.echo(f"âš ī¸ Sync completed with warnings: {result.stderr.strip()}")
277
+ except subprocess.TimeoutExpired:
278
+ click.echo("âš ī¸ Sync timed out - please run 'workato pull' manually")
279
+
280
+ async def delete_project(self, project_id: int) -> None:
281
+ """Delete a project (folder and assets are automatically cleaned up)"""
282
+ await self.client.projects_api.delete_project(project_id=project_id)
283
+
284
+ def save_project_to_config(self, project: Project) -> None:
285
+ """Save project info to config - returns True if successful"""
286
+ from workato_platform_cli.cli.utils.config import ConfigManager
287
+
288
+ config_manager = ConfigManager()
289
+
290
+ meta_data = config_manager.load_config()
291
+ meta_data.project_id = project.id
292
+ meta_data.project_name = project.name
293
+ meta_data.folder_id = project.folder_id
294
+
295
+ config_manager.save_config(meta_data)
296
+
297
+ async def import_existing_project(self) -> Project | None:
298
+ """Import an existing project - returns project info or None if failed"""
299
+ projects = await self.client.projects_api.list_projects()
300
+
301
+ if not projects:
302
+ click.echo("No projects found in your workspace.")
303
+ return None
304
+
305
+ # Create project choices using utility function
306
+ choices = [self._format_project_display(p) for p in projects]
307
+ questions = [
308
+ inquirer.List(
309
+ "project", # noboost
310
+ message="Select a project:", # noboost
311
+ choices=choices,
312
+ )
313
+ ]
314
+
315
+ answers = inquirer.prompt(questions)
316
+ if not answers:
317
+ return None
318
+
319
+ # Find selected project using utility function
320
+ selected_project = self._get_project_by_display_name(
321
+ projects, answers["project"]
322
+ )
323
+
324
+ if not selected_project:
325
+ return None
326
+ # Save project info using utility function
327
+
328
+ self.save_project_to_config(selected_project)
329
+ click.echo(f"✅ Selected project: {selected_project.name}")
330
+
331
+ # Export project files
332
+ if selected_project.folder_id:
333
+ await self.export_project(
334
+ folder_id=selected_project.folder_id,
335
+ project_name=selected_project.name,
336
+ )
337
+
338
+ return selected_project
@@ -0,0 +1,174 @@
1
+ import asyncclick as click
2
+
3
+ from dependency_injector.wiring import Provide, inject
4
+
5
+ from workato_platform_cli import Workato
6
+ from workato_platform_cli.cli.containers import Container
7
+ from workato_platform_cli.cli.utils import Spinner
8
+ from workato_platform_cli.cli.utils.config import ConfigManager
9
+ from workato_platform_cli.cli.utils.exception_handler import (
10
+ handle_api_exceptions,
11
+ handle_cli_exceptions,
12
+ )
13
+ from workato_platform_cli.client.workato_api.models.upsert_project_properties_request import ( # noqa: E501
14
+ UpsertProjectPropertiesRequest,
15
+ )
16
+
17
+
18
+ @click.group()
19
+ def properties() -> None:
20
+ """Manage project properties"""
21
+ pass
22
+
23
+
24
+ @properties.command(name="list")
25
+ @click.option("--prefix", required=True, help="Property name prefix to filter by")
26
+ @click.option(
27
+ "--project-id",
28
+ type=int,
29
+ help="Project ID to get properties for. Defaults to current project.",
30
+ )
31
+ @handle_cli_exceptions
32
+ @inject
33
+ @handle_api_exceptions
34
+ async def list_properties(
35
+ prefix: str,
36
+ project_id: int | None = None,
37
+ workato_api_client: Workato = Provide[Container.workato_api_client],
38
+ config_manager: ConfigManager = Provide[Container.config_manager],
39
+ ) -> None:
40
+ """List project properties with a given prefix"""
41
+
42
+ # Use provided project_id or get from config
43
+ if not project_id:
44
+ config = config_manager.load_config()
45
+ project_id = config.project_id
46
+
47
+ if not project_id:
48
+ click.echo("❌ No project ID provided and no project configured.")
49
+ click.echo("💡 Use --project-id <ID> or run 'workato init' first.")
50
+ return
51
+
52
+ spinner = Spinner(
53
+ f"Fetching properties with prefix '{prefix}' for project {project_id}"
54
+ )
55
+ spinner.start()
56
+
57
+ try:
58
+ properties = await workato_api_client.properties_api.list_project_properties(
59
+ prefix=prefix,
60
+ project_id=project_id,
61
+ )
62
+ finally:
63
+ elapsed = spinner.stop()
64
+
65
+ click.echo(f"📋 Properties ({len(properties)} found) - ({elapsed:.1f}s)")
66
+ click.echo(f" 🔍 Prefix: {prefix}")
67
+ click.echo(f" 📁 Project ID: {project_id}")
68
+
69
+ if not properties:
70
+ click.echo(" â„šī¸ No properties found")
71
+ return
72
+
73
+ click.echo()
74
+
75
+ # Display properties as a table
76
+ max_key_length = max(len(key) for key in properties) if properties else 0
77
+ for key, value in properties.items():
78
+ click.echo(f" {key:<{max_key_length}} = {value}")
79
+
80
+ click.echo()
81
+ click.echo("💡 Commands:")
82
+ click.echo(" â€ĸ Update properties: workato properties upsert --project-id <ID>")
83
+
84
+
85
+ @properties.command(name="upsert")
86
+ @click.option("--project-id", type=int, help="Project ID to upsert properties for")
87
+ @click.option(
88
+ "--property",
89
+ "property_pairs",
90
+ multiple=True,
91
+ help="Property in key=value format (can be used multiple times)",
92
+ )
93
+ @handle_cli_exceptions
94
+ @inject
95
+ @handle_api_exceptions
96
+ async def upsert_properties(
97
+ project_id: int | None = None,
98
+ property_pairs: tuple[str, ...] = (),
99
+ workato_api_client: Workato = Provide[Container.workato_api_client],
100
+ config_manager: ConfigManager = Provide[Container.config_manager],
101
+ ) -> None:
102
+ """Upsert (create or update) project properties"""
103
+
104
+ # Use provided project_id or get from config
105
+ if not project_id:
106
+ config = config_manager.load_config()
107
+ project_id = config.project_id
108
+
109
+ if not project_id:
110
+ click.echo("❌ No project ID provided and no project configured.")
111
+ click.echo("💡 Use --project-id <ID> or run 'workato init' first.")
112
+ return
113
+
114
+ properties = {}
115
+
116
+ # Parse properties from command line
117
+ if property_pairs:
118
+ for pair in property_pairs:
119
+ if "=" not in pair:
120
+ click.echo(f"❌ Invalid property format: {pair}")
121
+ click.echo("💡 Use format: key=value")
122
+ return
123
+ key, value = pair.split("=", 1)
124
+ properties[key] = value
125
+
126
+ if not properties:
127
+ click.echo("❌ No properties provided")
128
+ click.echo("💡 Examples:")
129
+ click.echo(
130
+ " workato properties upsert --property admin_email=user@example.com"
131
+ )
132
+ return
133
+
134
+ # Validate property limits
135
+ for key, value in properties.items():
136
+ if len(key) > 100:
137
+ click.echo(f"❌ Property name too long (max 100 chars): {key}")
138
+ return
139
+ if len(value) > 1024:
140
+ click.echo(f"❌ Property value too long (max 1,024 chars): {key}")
141
+ return
142
+
143
+ spinner = Spinner(
144
+ f"Upserting {len(properties)} properties for project {project_id}"
145
+ )
146
+ spinner.start()
147
+
148
+ try:
149
+ request = UpsertProjectPropertiesRequest(properties=properties)
150
+
151
+ response = await workato_api_client.properties_api.upsert_project_properties(
152
+ project_id=project_id,
153
+ upsert_project_properties_request=request,
154
+ )
155
+ finally:
156
+ elapsed = spinner.stop()
157
+
158
+ if response.success:
159
+ click.echo(f"✅ Properties upserted successfully ({elapsed:.1f}s)")
160
+ click.echo(f" 📁 Project ID: {project_id}")
161
+ click.echo(f" 📝 Properties updated: {len(properties)}")
162
+
163
+ click.echo()
164
+ click.echo("Updated properties:")
165
+ max_key_length = max(len(key) for key in properties)
166
+ for key, value in properties.items():
167
+ click.echo(f" {key:<{max_key_length}} = {value}")
168
+
169
+ else:
170
+ click.echo(f"❌ Failed to upsert properties ({elapsed:.1f}s)")
171
+
172
+ click.echo()
173
+ click.echo("💡 Commands:")
174
+ click.echo(" â€ĸ List properties: workato properties list --prefix <prefix>")