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.
- workato_platform_cli/__init__.py +135 -0
- workato_platform_cli/_version.py +34 -0
- workato_platform_cli/cli/__init__.py +126 -0
- workato_platform_cli/cli/commands/__init__.py +0 -0
- workato_platform_cli/cli/commands/api_clients.py +627 -0
- workato_platform_cli/cli/commands/api_collections.py +497 -0
- workato_platform_cli/cli/commands/assets.py +82 -0
- workato_platform_cli/cli/commands/connections.py +1205 -0
- workato_platform_cli/cli/commands/connectors/__init__.py +0 -0
- workato_platform_cli/cli/commands/connectors/command.py +178 -0
- workato_platform_cli/cli/commands/connectors/connector_manager.py +351 -0
- workato_platform_cli/cli/commands/data_tables.py +345 -0
- workato_platform_cli/cli/commands/guide.py +315 -0
- workato_platform_cli/cli/commands/init.py +229 -0
- workato_platform_cli/cli/commands/profiles.py +364 -0
- workato_platform_cli/cli/commands/projects/__init__.py +0 -0
- workato_platform_cli/cli/commands/projects/command.py +513 -0
- workato_platform_cli/cli/commands/projects/project_manager.py +338 -0
- workato_platform_cli/cli/commands/properties.py +174 -0
- workato_platform_cli/cli/commands/pull.py +327 -0
- workato_platform_cli/cli/commands/push/__init__.py +0 -0
- workato_platform_cli/cli/commands/push/command.py +320 -0
- workato_platform_cli/cli/commands/recipes/__init__.py +0 -0
- workato_platform_cli/cli/commands/recipes/command.py +847 -0
- workato_platform_cli/cli/commands/recipes/validator.py +1740 -0
- workato_platform_cli/cli/commands/workspace.py +73 -0
- workato_platform_cli/cli/containers.py +80 -0
- workato_platform_cli/cli/resources/data/connection-data.json +7364 -0
- workato_platform_cli/cli/resources/data/picklist-data.json +3706 -0
- workato_platform_cli/cli/resources/docs/README.md +178 -0
- workato_platform_cli/cli/resources/docs/actions.md +452 -0
- workato_platform_cli/cli/resources/docs/block-structure.md +424 -0
- workato_platform_cli/cli/resources/docs/connections-parameters.md +11946 -0
- workato_platform_cli/cli/resources/docs/data-mapping.md +779 -0
- workato_platform_cli/cli/resources/docs/formulas/array-list-formulas.md +1276 -0
- workato_platform_cli/cli/resources/docs/formulas/conditions.md +102 -0
- workato_platform_cli/cli/resources/docs/formulas/date-formulas.md +798 -0
- workato_platform_cli/cli/resources/docs/formulas/number-formulas.md +507 -0
- workato_platform_cli/cli/resources/docs/formulas/other-formulas.md +419 -0
- workato_platform_cli/cli/resources/docs/formulas/string-formulas.md +1353 -0
- workato_platform_cli/cli/resources/docs/formulas.md +214 -0
- workato_platform_cli/cli/resources/docs/naming-conventions.md +163 -0
- workato_platform_cli/cli/resources/docs/recipe-deployment-workflow.md +352 -0
- workato_platform_cli/cli/resources/docs/recipe-fundamentals.md +179 -0
- workato_platform_cli/cli/resources/docs/triggers.md +360 -0
- workato_platform_cli/cli/utils/__init__.py +10 -0
- workato_platform_cli/cli/utils/config/__init__.py +33 -0
- workato_platform_cli/cli/utils/config/manager.py +1001 -0
- workato_platform_cli/cli/utils/config/models.py +89 -0
- workato_platform_cli/cli/utils/config/profiles.py +491 -0
- workato_platform_cli/cli/utils/config/workspace.py +113 -0
- workato_platform_cli/cli/utils/exception_handler.py +531 -0
- workato_platform_cli/cli/utils/gitignore.py +32 -0
- workato_platform_cli/cli/utils/ignore_patterns.py +44 -0
- workato_platform_cli/cli/utils/spinner.py +63 -0
- workato_platform_cli/cli/utils/version_checker.py +237 -0
- workato_platform_cli/client/__init__.py +0 -0
- workato_platform_cli/client/workato_api/__init__.py +202 -0
- workato_platform_cli/client/workato_api/api/__init__.py +15 -0
- workato_platform_cli/client/workato_api/api/api_platform_api.py +2875 -0
- workato_platform_cli/client/workato_api/api/connections_api.py +1807 -0
- workato_platform_cli/client/workato_api/api/connectors_api.py +840 -0
- workato_platform_cli/client/workato_api/api/data_tables_api.py +604 -0
- workato_platform_cli/client/workato_api/api/export_api.py +621 -0
- workato_platform_cli/client/workato_api/api/folders_api.py +621 -0
- workato_platform_cli/client/workato_api/api/packages_api.py +1197 -0
- workato_platform_cli/client/workato_api/api/projects_api.py +590 -0
- workato_platform_cli/client/workato_api/api/properties_api.py +620 -0
- workato_platform_cli/client/workato_api/api/recipes_api.py +1379 -0
- workato_platform_cli/client/workato_api/api/users_api.py +285 -0
- workato_platform_cli/client/workato_api/api_client.py +807 -0
- workato_platform_cli/client/workato_api/api_response.py +21 -0
- workato_platform_cli/client/workato_api/configuration.py +601 -0
- workato_platform_cli/client/workato_api/docs/APIPlatformApi.md +844 -0
- workato_platform_cli/client/workato_api/docs/ApiClient.md +46 -0
- workato_platform_cli/client/workato_api/docs/ApiClientApiCollectionsInner.md +30 -0
- workato_platform_cli/client/workato_api/docs/ApiClientApiPoliciesInner.md +30 -0
- workato_platform_cli/client/workato_api/docs/ApiClientCreateRequest.md +46 -0
- workato_platform_cli/client/workato_api/docs/ApiClientListResponse.md +32 -0
- workato_platform_cli/client/workato_api/docs/ApiClientResponse.md +29 -0
- workato_platform_cli/client/workato_api/docs/ApiCollection.md +38 -0
- workato_platform_cli/client/workato_api/docs/ApiCollectionCreateRequest.md +32 -0
- workato_platform_cli/client/workato_api/docs/ApiEndpoint.md +41 -0
- workato_platform_cli/client/workato_api/docs/ApiKey.md +36 -0
- workato_platform_cli/client/workato_api/docs/ApiKeyCreateRequest.md +32 -0
- workato_platform_cli/client/workato_api/docs/ApiKeyListResponse.md +32 -0
- workato_platform_cli/client/workato_api/docs/ApiKeyResponse.md +29 -0
- workato_platform_cli/client/workato_api/docs/Asset.md +39 -0
- workato_platform_cli/client/workato_api/docs/AssetReference.md +37 -0
- workato_platform_cli/client/workato_api/docs/Connection.md +44 -0
- workato_platform_cli/client/workato_api/docs/ConnectionCreateRequest.md +35 -0
- workato_platform_cli/client/workato_api/docs/ConnectionUpdateRequest.md +34 -0
- workato_platform_cli/client/workato_api/docs/ConnectionsApi.md +526 -0
- workato_platform_cli/client/workato_api/docs/ConnectorAction.md +33 -0
- workato_platform_cli/client/workato_api/docs/ConnectorVersion.md +32 -0
- workato_platform_cli/client/workato_api/docs/ConnectorsApi.md +249 -0
- workato_platform_cli/client/workato_api/docs/CreateExportManifestRequest.md +29 -0
- workato_platform_cli/client/workato_api/docs/CreateFolderRequest.md +30 -0
- workato_platform_cli/client/workato_api/docs/CustomConnector.md +35 -0
- workato_platform_cli/client/workato_api/docs/CustomConnectorCodeResponse.md +29 -0
- workato_platform_cli/client/workato_api/docs/CustomConnectorCodeResponseData.md +29 -0
- workato_platform_cli/client/workato_api/docs/CustomConnectorListResponse.md +29 -0
- workato_platform_cli/client/workato_api/docs/DataTable.md +34 -0
- workato_platform_cli/client/workato_api/docs/DataTableColumn.md +37 -0
- workato_platform_cli/client/workato_api/docs/DataTableColumnRequest.md +37 -0
- workato_platform_cli/client/workato_api/docs/DataTableCreateRequest.md +31 -0
- workato_platform_cli/client/workato_api/docs/DataTableCreateResponse.md +29 -0
- workato_platform_cli/client/workato_api/docs/DataTableListResponse.md +29 -0
- workato_platform_cli/client/workato_api/docs/DataTableRelation.md +30 -0
- workato_platform_cli/client/workato_api/docs/DataTablesApi.md +172 -0
- workato_platform_cli/client/workato_api/docs/DeleteProject403Response.md +29 -0
- workato_platform_cli/client/workato_api/docs/Error.md +29 -0
- workato_platform_cli/client/workato_api/docs/ExportApi.md +175 -0
- workato_platform_cli/client/workato_api/docs/ExportManifestRequest.md +35 -0
- workato_platform_cli/client/workato_api/docs/ExportManifestResponse.md +29 -0
- workato_platform_cli/client/workato_api/docs/ExportManifestResponseResult.md +36 -0
- workato_platform_cli/client/workato_api/docs/Folder.md +35 -0
- workato_platform_cli/client/workato_api/docs/FolderAssetsResponse.md +29 -0
- workato_platform_cli/client/workato_api/docs/FolderAssetsResponseResult.md +29 -0
- workato_platform_cli/client/workato_api/docs/FolderCreationResponse.md +35 -0
- workato_platform_cli/client/workato_api/docs/FoldersApi.md +176 -0
- workato_platform_cli/client/workato_api/docs/ImportResults.md +32 -0
- workato_platform_cli/client/workato_api/docs/OAuthUrlResponse.md +29 -0
- workato_platform_cli/client/workato_api/docs/OAuthUrlResponseData.md +29 -0
- workato_platform_cli/client/workato_api/docs/OpenApiSpec.md +30 -0
- workato_platform_cli/client/workato_api/docs/PackageDetailsResponse.md +35 -0
- workato_platform_cli/client/workato_api/docs/PackageDetailsResponseRecipeStatusInner.md +30 -0
- workato_platform_cli/client/workato_api/docs/PackageResponse.md +33 -0
- workato_platform_cli/client/workato_api/docs/PackagesApi.md +364 -0
- workato_platform_cli/client/workato_api/docs/PicklistRequest.md +30 -0
- workato_platform_cli/client/workato_api/docs/PicklistResponse.md +29 -0
- workato_platform_cli/client/workato_api/docs/PlatformConnector.md +36 -0
- workato_platform_cli/client/workato_api/docs/PlatformConnectorListResponse.md +32 -0
- workato_platform_cli/client/workato_api/docs/Project.md +32 -0
- workato_platform_cli/client/workato_api/docs/ProjectsApi.md +173 -0
- workato_platform_cli/client/workato_api/docs/PropertiesApi.md +186 -0
- workato_platform_cli/client/workato_api/docs/Recipe.md +58 -0
- workato_platform_cli/client/workato_api/docs/RecipeConfigInner.md +33 -0
- workato_platform_cli/client/workato_api/docs/RecipeConnectionUpdateRequest.md +30 -0
- workato_platform_cli/client/workato_api/docs/RecipeListResponse.md +29 -0
- workato_platform_cli/client/workato_api/docs/RecipeStartResponse.md +31 -0
- workato_platform_cli/client/workato_api/docs/RecipesApi.md +367 -0
- workato_platform_cli/client/workato_api/docs/RuntimeUserConnectionCreateRequest.md +34 -0
- workato_platform_cli/client/workato_api/docs/RuntimeUserConnectionResponse.md +29 -0
- workato_platform_cli/client/workato_api/docs/RuntimeUserConnectionResponseData.md +30 -0
- workato_platform_cli/client/workato_api/docs/SuccessResponse.md +29 -0
- workato_platform_cli/client/workato_api/docs/UpsertProjectPropertiesRequest.md +29 -0
- workato_platform_cli/client/workato_api/docs/User.md +48 -0
- workato_platform_cli/client/workato_api/docs/UsersApi.md +84 -0
- workato_platform_cli/client/workato_api/docs/ValidationError.md +30 -0
- workato_platform_cli/client/workato_api/docs/ValidationErrorErrorsValue.md +28 -0
- workato_platform_cli/client/workato_api/exceptions.py +216 -0
- workato_platform_cli/client/workato_api/models/__init__.py +83 -0
- workato_platform_cli/client/workato_api/models/api_client.py +185 -0
- workato_platform_cli/client/workato_api/models/api_client_api_collections_inner.py +89 -0
- workato_platform_cli/client/workato_api/models/api_client_api_policies_inner.py +89 -0
- workato_platform_cli/client/workato_api/models/api_client_create_request.py +138 -0
- workato_platform_cli/client/workato_api/models/api_client_list_response.py +101 -0
- workato_platform_cli/client/workato_api/models/api_client_response.py +91 -0
- workato_platform_cli/client/workato_api/models/api_collection.py +110 -0
- workato_platform_cli/client/workato_api/models/api_collection_create_request.py +97 -0
- workato_platform_cli/client/workato_api/models/api_endpoint.py +117 -0
- workato_platform_cli/client/workato_api/models/api_key.py +102 -0
- workato_platform_cli/client/workato_api/models/api_key_create_request.py +93 -0
- workato_platform_cli/client/workato_api/models/api_key_list_response.py +101 -0
- workato_platform_cli/client/workato_api/models/api_key_response.py +91 -0
- workato_platform_cli/client/workato_api/models/asset.py +124 -0
- workato_platform_cli/client/workato_api/models/asset_reference.py +110 -0
- workato_platform_cli/client/workato_api/models/connection.py +173 -0
- workato_platform_cli/client/workato_api/models/connection_create_request.py +99 -0
- workato_platform_cli/client/workato_api/models/connection_update_request.py +97 -0
- workato_platform_cli/client/workato_api/models/connector_action.py +100 -0
- workato_platform_cli/client/workato_api/models/connector_version.py +99 -0
- workato_platform_cli/client/workato_api/models/create_export_manifest_request.py +91 -0
- workato_platform_cli/client/workato_api/models/create_folder_request.py +89 -0
- workato_platform_cli/client/workato_api/models/custom_connector.py +117 -0
- workato_platform_cli/client/workato_api/models/custom_connector_code_response.py +91 -0
- workato_platform_cli/client/workato_api/models/custom_connector_code_response_data.py +87 -0
- workato_platform_cli/client/workato_api/models/custom_connector_list_response.py +95 -0
- workato_platform_cli/client/workato_api/models/data_table.py +107 -0
- workato_platform_cli/client/workato_api/models/data_table_column.py +125 -0
- workato_platform_cli/client/workato_api/models/data_table_column_request.py +130 -0
- workato_platform_cli/client/workato_api/models/data_table_create_request.py +99 -0
- workato_platform_cli/client/workato_api/models/data_table_create_response.py +91 -0
- workato_platform_cli/client/workato_api/models/data_table_list_response.py +95 -0
- workato_platform_cli/client/workato_api/models/data_table_relation.py +90 -0
- workato_platform_cli/client/workato_api/models/delete_project403_response.py +87 -0
- workato_platform_cli/client/workato_api/models/error.py +87 -0
- workato_platform_cli/client/workato_api/models/export_manifest_request.py +107 -0
- workato_platform_cli/client/workato_api/models/export_manifest_response.py +91 -0
- workato_platform_cli/client/workato_api/models/export_manifest_response_result.py +112 -0
- workato_platform_cli/client/workato_api/models/folder.py +110 -0
- workato_platform_cli/client/workato_api/models/folder_assets_response.py +91 -0
- workato_platform_cli/client/workato_api/models/folder_assets_response_result.py +95 -0
- workato_platform_cli/client/workato_api/models/folder_creation_response.py +110 -0
- workato_platform_cli/client/workato_api/models/import_results.py +93 -0
- workato_platform_cli/client/workato_api/models/o_auth_url_response.py +91 -0
- workato_platform_cli/client/workato_api/models/o_auth_url_response_data.py +87 -0
- workato_platform_cli/client/workato_api/models/open_api_spec.py +96 -0
- workato_platform_cli/client/workato_api/models/package_details_response.py +126 -0
- workato_platform_cli/client/workato_api/models/package_details_response_recipe_status_inner.py +99 -0
- workato_platform_cli/client/workato_api/models/package_response.py +109 -0
- workato_platform_cli/client/workato_api/models/picklist_request.py +89 -0
- workato_platform_cli/client/workato_api/models/picklist_response.py +88 -0
- workato_platform_cli/client/workato_api/models/platform_connector.py +116 -0
- workato_platform_cli/client/workato_api/models/platform_connector_list_response.py +101 -0
- workato_platform_cli/client/workato_api/models/project.py +93 -0
- workato_platform_cli/client/workato_api/models/recipe.py +174 -0
- workato_platform_cli/client/workato_api/models/recipe_config_inner.py +100 -0
- workato_platform_cli/client/workato_api/models/recipe_connection_update_request.py +89 -0
- workato_platform_cli/client/workato_api/models/recipe_list_response.py +95 -0
- workato_platform_cli/client/workato_api/models/recipe_start_response.py +91 -0
- workato_platform_cli/client/workato_api/models/runtime_user_connection_create_request.py +97 -0
- workato_platform_cli/client/workato_api/models/runtime_user_connection_response.py +91 -0
- workato_platform_cli/client/workato_api/models/runtime_user_connection_response_data.py +89 -0
- workato_platform_cli/client/workato_api/models/success_response.py +87 -0
- workato_platform_cli/client/workato_api/models/upsert_project_properties_request.py +88 -0
- workato_platform_cli/client/workato_api/models/user.py +151 -0
- workato_platform_cli/client/workato_api/models/validation_error.py +102 -0
- workato_platform_cli/client/workato_api/models/validation_error_errors_value.py +143 -0
- workato_platform_cli/client/workato_api/rest.py +213 -0
- workato_platform_cli/client/workato_api/test/__init__.py +0 -0
- workato_platform_cli/client/workato_api/test/test_api_client.py +94 -0
- workato_platform_cli/client/workato_api/test/test_api_client_api_collections_inner.py +52 -0
- workato_platform_cli/client/workato_api/test/test_api_client_api_policies_inner.py +52 -0
- workato_platform_cli/client/workato_api/test/test_api_client_create_request.py +75 -0
- workato_platform_cli/client/workato_api/test/test_api_client_list_response.py +114 -0
- workato_platform_cli/client/workato_api/test/test_api_client_response.py +104 -0
- workato_platform_cli/client/workato_api/test/test_api_collection.py +72 -0
- workato_platform_cli/client/workato_api/test/test_api_collection_create_request.py +57 -0
- workato_platform_cli/client/workato_api/test/test_api_endpoint.py +75 -0
- workato_platform_cli/client/workato_api/test/test_api_key.py +64 -0
- workato_platform_cli/client/workato_api/test/test_api_key_create_request.py +56 -0
- workato_platform_cli/client/workato_api/test/test_api_key_list_response.py +78 -0
- workato_platform_cli/client/workato_api/test/test_api_key_response.py +68 -0
- workato_platform_cli/client/workato_api/test/test_api_platform_api.py +101 -0
- workato_platform_cli/client/workato_api/test/test_asset.py +67 -0
- workato_platform_cli/client/workato_api/test/test_asset_reference.py +62 -0
- workato_platform_cli/client/workato_api/test/test_connection.py +81 -0
- workato_platform_cli/client/workato_api/test/test_connection_create_request.py +59 -0
- workato_platform_cli/client/workato_api/test/test_connection_update_request.py +56 -0
- workato_platform_cli/client/workato_api/test/test_connections_api.py +73 -0
- workato_platform_cli/client/workato_api/test/test_connector_action.py +59 -0
- workato_platform_cli/client/workato_api/test/test_connector_version.py +58 -0
- workato_platform_cli/client/workato_api/test/test_connectors_api.py +52 -0
- workato_platform_cli/client/workato_api/test/test_create_export_manifest_request.py +88 -0
- workato_platform_cli/client/workato_api/test/test_create_folder_request.py +53 -0
- workato_platform_cli/client/workato_api/test/test_custom_connector.py +76 -0
- workato_platform_cli/client/workato_api/test/test_custom_connector_code_response.py +54 -0
- workato_platform_cli/client/workato_api/test/test_custom_connector_code_response_data.py +52 -0
- workato_platform_cli/client/workato_api/test/test_custom_connector_list_response.py +82 -0
- workato_platform_cli/client/workato_api/test/test_data_table.py +88 -0
- workato_platform_cli/client/workato_api/test/test_data_table_column.py +72 -0
- workato_platform_cli/client/workato_api/test/test_data_table_column_request.py +64 -0
- workato_platform_cli/client/workato_api/test/test_data_table_create_request.py +82 -0
- workato_platform_cli/client/workato_api/test/test_data_table_create_response.py +90 -0
- workato_platform_cli/client/workato_api/test/test_data_table_list_response.py +94 -0
- workato_platform_cli/client/workato_api/test/test_data_table_relation.py +54 -0
- workato_platform_cli/client/workato_api/test/test_data_tables_api.py +45 -0
- workato_platform_cli/client/workato_api/test/test_delete_project403_response.py +51 -0
- workato_platform_cli/client/workato_api/test/test_error.py +52 -0
- workato_platform_cli/client/workato_api/test/test_export_api.py +45 -0
- workato_platform_cli/client/workato_api/test/test_export_manifest_request.py +69 -0
- workato_platform_cli/client/workato_api/test/test_export_manifest_response.py +68 -0
- workato_platform_cli/client/workato_api/test/test_export_manifest_response_result.py +66 -0
- workato_platform_cli/client/workato_api/test/test_folder.py +64 -0
- workato_platform_cli/client/workato_api/test/test_folder_assets_response.py +80 -0
- workato_platform_cli/client/workato_api/test/test_folder_assets_response_result.py +78 -0
- workato_platform_cli/client/workato_api/test/test_folder_creation_response.py +64 -0
- workato_platform_cli/client/workato_api/test/test_folders_api.py +45 -0
- workato_platform_cli/client/workato_api/test/test_import_results.py +58 -0
- workato_platform_cli/client/workato_api/test/test_o_auth_url_response.py +54 -0
- workato_platform_cli/client/workato_api/test/test_o_auth_url_response_data.py +52 -0
- workato_platform_cli/client/workato_api/test/test_open_api_spec.py +54 -0
- workato_platform_cli/client/workato_api/test/test_package_details_response.py +64 -0
- workato_platform_cli/client/workato_api/test/test_package_details_response_recipe_status_inner.py +52 -0
- workato_platform_cli/client/workato_api/test/test_package_response.py +58 -0
- workato_platform_cli/client/workato_api/test/test_packages_api.py +59 -0
- workato_platform_cli/client/workato_api/test/test_picklist_request.py +53 -0
- workato_platform_cli/client/workato_api/test/test_picklist_response.py +52 -0
- workato_platform_cli/client/workato_api/test/test_platform_connector.py +94 -0
- workato_platform_cli/client/workato_api/test/test_platform_connector_list_response.py +106 -0
- workato_platform_cli/client/workato_api/test/test_project.py +57 -0
- workato_platform_cli/client/workato_api/test/test_projects_api.py +45 -0
- workato_platform_cli/client/workato_api/test/test_properties_api.py +45 -0
- workato_platform_cli/client/workato_api/test/test_recipe.py +124 -0
- workato_platform_cli/client/workato_api/test/test_recipe_config_inner.py +55 -0
- workato_platform_cli/client/workato_api/test/test_recipe_connection_update_request.py +54 -0
- workato_platform_cli/client/workato_api/test/test_recipe_list_response.py +134 -0
- workato_platform_cli/client/workato_api/test/test_recipe_start_response.py +54 -0
- workato_platform_cli/client/workato_api/test/test_recipes_api.py +59 -0
- workato_platform_cli/client/workato_api/test/test_runtime_user_connection_create_request.py +59 -0
- workato_platform_cli/client/workato_api/test/test_runtime_user_connection_response.py +56 -0
- workato_platform_cli/client/workato_api/test/test_runtime_user_connection_response_data.py +54 -0
- workato_platform_cli/client/workato_api/test/test_success_response.py +52 -0
- workato_platform_cli/client/workato_api/test/test_upsert_project_properties_request.py +52 -0
- workato_platform_cli/client/workato_api/test/test_user.py +85 -0
- workato_platform_cli/client/workato_api/test/test_users_api.py +38 -0
- workato_platform_cli/client/workato_api/test/test_validation_error.py +52 -0
- workato_platform_cli/client/workato_api/test/test_validation_error_errors_value.py +50 -0
- workato_platform_cli/client/workato_api_README.md +205 -0
- workato_platform_cli-1.0.0rc5.dev5.dist-info/METADATA +185 -0
- workato_platform_cli-1.0.0rc5.dev5.dist-info/RECORD +306 -0
- workato_platform_cli-1.0.0rc5.dev5.dist-info/WHEEL +4 -0
- workato_platform_cli-1.0.0rc5.dev5.dist-info/entry_points.txt +2 -0
- 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>")
|