another-ayx-python-sdk 2.4.24__py3-none-any.whl → 2.4.25__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 (212) hide show
  1. another_ayx_python_sdk/version.py +3 -3
  2. {another_ayx_python_sdk-2.4.24.dist-info → another_ayx_python_sdk-2.4.25.dist-info}/METADATA +1 -1
  3. {another_ayx_python_sdk-2.4.24.dist-info → another_ayx_python_sdk-2.4.25.dist-info}/RECORD +7 -212
  4. {another_ayx_python_sdk-2.4.24.dist-info → another_ayx_python_sdk-2.4.25.dist-info}/top_level.txt +0 -2
  5. build/lib/another_ayx_python_sdk/__init__.py +0 -14
  6. build/lib/another_ayx_python_sdk/__main__.py +0 -470
  7. build/lib/another_ayx_python_sdk/assets/workspace_files/__init__.py +0 -14
  8. build/lib/another_ayx_python_sdk/assets/workspace_files/setup.py +0 -38
  9. build/lib/another_ayx_python_sdk/cli/__init__.py +0 -14
  10. build/lib/another_ayx_python_sdk/cli/utilities.py +0 -103
  11. build/lib/another_ayx_python_sdk/cli/workspace.py +0 -266
  12. build/lib/another_ayx_python_sdk/cli/yxi_builder.py +0 -125
  13. build/lib/another_ayx_python_sdk/cli/yxi_installer.py +0 -45
  14. build/lib/another_ayx_python_sdk/core/__init__.py +0 -51
  15. build/lib/another_ayx_python_sdk/core/constants.py +0 -25
  16. build/lib/another_ayx_python_sdk/core/dcm_base.py +0 -115
  17. build/lib/another_ayx_python_sdk/core/doc_utilities.py +0 -40
  18. build/lib/another_ayx_python_sdk/core/environment_base.py +0 -213
  19. build/lib/another_ayx_python_sdk/core/exceptions.py +0 -59
  20. build/lib/another_ayx_python_sdk/core/field.py +0 -183
  21. build/lib/another_ayx_python_sdk/core/input_anchor_base.py +0 -86
  22. build/lib/another_ayx_python_sdk/core/input_connection_base.py +0 -206
  23. build/lib/another_ayx_python_sdk/core/io_base.py +0 -139
  24. build/lib/another_ayx_python_sdk/core/metadata.py +0 -173
  25. build/lib/another_ayx_python_sdk/core/observable_mixin.py +0 -90
  26. build/lib/another_ayx_python_sdk/core/output_anchor_base.py +0 -151
  27. build/lib/another_ayx_python_sdk/core/plugin.py +0 -108
  28. build/lib/another_ayx_python_sdk/core/plugin_v2.py +0 -97
  29. build/lib/another_ayx_python_sdk/core/provider_base.py +0 -125
  30. build/lib/another_ayx_python_sdk/core/proxy_requests.py +0 -51
  31. build/lib/another_ayx_python_sdk/core/record_packet.py +0 -88
  32. build/lib/another_ayx_python_sdk/core/record_packet_base.py +0 -123
  33. build/lib/another_ayx_python_sdk/core/register_plugin.py +0 -127
  34. build/lib/another_ayx_python_sdk/core/testing.py +0 -191
  35. build/lib/another_ayx_python_sdk/core/utils.py +0 -146
  36. build/lib/another_ayx_python_sdk/examples/AyxSdkInput/main.py +0 -89
  37. build/lib/another_ayx_python_sdk/examples/AyxSdkMultiConnectionsMultiOutputAnchor/main.py +0 -102
  38. build/lib/another_ayx_python_sdk/examples/AyxSdkMultipleInputAnchors/main.py +0 -84
  39. build/lib/another_ayx_python_sdk/examples/AyxSdkMultipleOutputAnchors/main.py +0 -96
  40. build/lib/another_ayx_python_sdk/examples/AyxSdkOptionalInputAnchor/main.py +0 -94
  41. build/lib/another_ayx_python_sdk/examples/AyxSdkOutput/main.py +0 -78
  42. build/lib/another_ayx_python_sdk/examples/AyxSdkPassThrough/main.py +0 -82
  43. build/lib/another_ayx_python_sdk/providers/__init__.py +0 -14
  44. build/lib/another_ayx_python_sdk/providers/amp_provider/__init__.py +0 -41
  45. build/lib/another_ayx_python_sdk/providers/amp_provider/__main__.py +0 -85
  46. build/lib/another_ayx_python_sdk/providers/amp_provider/amp_dcm.py +0 -58
  47. build/lib/another_ayx_python_sdk/providers/amp_provider/amp_driver.py +0 -358
  48. build/lib/another_ayx_python_sdk/providers/amp_provider/amp_environment.py +0 -73
  49. build/lib/another_ayx_python_sdk/providers/amp_provider/amp_environment_v2.py +0 -278
  50. build/lib/another_ayx_python_sdk/providers/amp_provider/amp_input_anchor.py +0 -73
  51. build/lib/another_ayx_python_sdk/providers/amp_provider/amp_input_connection.py +0 -132
  52. build/lib/another_ayx_python_sdk/providers/amp_provider/amp_io.py +0 -64
  53. build/lib/another_ayx_python_sdk/providers/amp_provider/amp_io_components.py +0 -407
  54. build/lib/another_ayx_python_sdk/providers/amp_provider/amp_output_anchor.py +0 -107
  55. build/lib/another_ayx_python_sdk/providers/amp_provider/amp_provider.py +0 -68
  56. build/lib/another_ayx_python_sdk/providers/amp_provider/amp_provider_v2.py +0 -128
  57. build/lib/another_ayx_python_sdk/providers/amp_provider/amp_record_packet.py +0 -21
  58. build/lib/another_ayx_python_sdk/providers/amp_provider/builders/__init__.py +0 -32
  59. build/lib/another_ayx_python_sdk/providers/amp_provider/builders/input_anchor_builder.py +0 -123
  60. build/lib/another_ayx_python_sdk/providers/amp_provider/builders/input_connection_builder.py +0 -95
  61. build/lib/another_ayx_python_sdk/providers/amp_provider/builders/metadata_builder.py +0 -118
  62. build/lib/another_ayx_python_sdk/providers/amp_provider/builders/output_anchor_builder.py +0 -110
  63. build/lib/another_ayx_python_sdk/providers/amp_provider/builders/packers.py +0 -458
  64. build/lib/another_ayx_python_sdk/providers/amp_provider/builders/record_builder.py +0 -204
  65. build/lib/another_ayx_python_sdk/providers/amp_provider/builders/record_packet_builder.py +0 -133
  66. build/lib/another_ayx_python_sdk/providers/amp_provider/builders/tool_config_builder.py +0 -59
  67. build/lib/another_ayx_python_sdk/providers/amp_provider/cng_certs.py +0 -197
  68. build/lib/another_ayx_python_sdk/providers/amp_provider/data_transport/__init__.py +0 -18
  69. build/lib/another_ayx_python_sdk/providers/amp_provider/data_transport/amp_transport.py +0 -127
  70. build/lib/another_ayx_python_sdk/providers/amp_provider/data_transport/transport_base.py +0 -35
  71. build/lib/another_ayx_python_sdk/providers/amp_provider/grpc_helpers/__init__.py +0 -14
  72. build/lib/another_ayx_python_sdk/providers/amp_provider/grpc_helpers/control_msgs.py +0 -189
  73. build/lib/another_ayx_python_sdk/providers/amp_provider/grpc_helpers/dcme_msgs.py +0 -119
  74. build/lib/another_ayx_python_sdk/providers/amp_provider/grpc_helpers/record_transfer_msgs.py +0 -32
  75. build/lib/another_ayx_python_sdk/providers/amp_provider/grpc_util.py +0 -161
  76. build/lib/another_ayx_python_sdk/providers/amp_provider/logger_config.py +0 -63
  77. build/lib/another_ayx_python_sdk/providers/amp_provider/plugin_class_loader.py +0 -77
  78. build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/__init__.py +0 -67
  79. build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/dcm_repository.py +0 -252
  80. build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/environment_repository.py +0 -212
  81. build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/grpc_repository.py +0 -119
  82. build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/input_anchor_repository.py +0 -110
  83. build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/input_connection_repository.py +0 -276
  84. build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/input_metadata_repository.py +0 -144
  85. build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/input_record_packet_repository.py +0 -252
  86. build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/io_repository.py +0 -188
  87. build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/output_anchor_repository.py +0 -117
  88. build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/output_metadata_repository.py +0 -129
  89. build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/output_record_packet_repository.py +0 -170
  90. build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/plugin_class_repository.py +0 -55
  91. build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/singleton.py +0 -32
  92. build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/test_harness_state_repository.py +0 -172
  93. build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/tool_config_repository.py +0 -89
  94. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/__init__.py +0 -14
  95. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/__init__.py +0 -0
  96. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/close_outgoing_anchor_pb2.py +0 -25
  97. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/close_outgoing_anchor_pb2_grpc.py +0 -4
  98. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/dcm_e_pb2.py +0 -38
  99. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/dcm_e_pb2_grpc.py +0 -4
  100. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/incoming_anchor_pb2.py +0 -26
  101. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/incoming_anchor_pb2_grpc.py +0 -4
  102. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/incoming_connection_complete_pb2.py +0 -25
  103. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/incoming_connection_complete_pb2_grpc.py +0 -4
  104. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/incoming_connection_pb2.py +0 -26
  105. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/incoming_connection_pb2_grpc.py +0 -4
  106. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/incoming_data_push_pb2.py +0 -26
  107. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/incoming_data_push_pb2_grpc.py +0 -4
  108. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/incoming_record_packet_push_pb2.py +0 -26
  109. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/incoming_record_packet_push_pb2_grpc.py +0 -4
  110. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/metadata_pb2.py +0 -31
  111. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/metadata_pb2_grpc.py +0 -4
  112. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/outgoing_anchor_pb2.py +0 -28
  113. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/outgoing_anchor_pb2_grpc.py +0 -4
  114. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/outgoing_data_push_pb2.py +0 -26
  115. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/outgoing_data_push_pb2_grpc.py +0 -4
  116. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/outgoing_metadata_push_pb2.py +0 -26
  117. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/outgoing_metadata_push_pb2_grpc.py +0 -4
  118. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/outgoing_record_packet_push_pb2.py +0 -26
  119. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/outgoing_record_packet_push_pb2_grpc.py +0 -4
  120. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/output_message_data_pb2.py +0 -29
  121. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/output_message_data_pb2_grpc.py +0 -4
  122. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/password_data_pb2.py +0 -25
  123. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/password_data_pb2_grpc.py +0 -4
  124. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/plugin_initialization_data_pb2.py +0 -33
  125. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/plugin_initialization_data_pb2_grpc.py +0 -4
  126. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/record_batch_pb2.py +0 -25
  127. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/record_batch_pb2_grpc.py +0 -4
  128. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/record_packet_pb2.py +0 -29
  129. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/record_packet_pb2_grpc.py +0 -4
  130. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/sdk_engine_service_pb2.py +0 -34
  131. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/sdk_engine_service_pb2_grpc.py +0 -305
  132. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/sdk_tool_service_pb2.py +0 -30
  133. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/sdk_tool_service_pb2_grpc.py +0 -235
  134. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/sdk_tool_service_startup_info_pb2.py +0 -25
  135. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/sdk_tool_service_startup_info_pb2_grpc.py +0 -4
  136. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/sdk_tool_service_v2_pb2.py +0 -54
  137. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/sdk_tool_service_v2_pb2_grpc.py +0 -99
  138. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/translate_message_data_pb2.py +0 -27
  139. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/translate_message_data_pb2_grpc.py +0 -4
  140. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/transport_pb2.py +0 -31
  141. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/transport_pb2_grpc.py +0 -4
  142. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/update_progress_pb2.py +0 -25
  143. build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/update_progress_pb2_grpc.py +0 -4
  144. build/lib/another_ayx_python_sdk/providers/amp_provider/sdk_tool_runner.py +0 -115
  145. build/lib/another_ayx_python_sdk/providers/amp_provider/sdk_tool_service.py +0 -207
  146. build/lib/another_ayx_python_sdk/providers/amp_provider/sdk_tool_service_v2.py +0 -306
  147. build/lib/another_ayx_python_sdk/providers/amp_provider/utilities/__init__.py +0 -14
  148. build/lib/another_ayx_python_sdk/providers/amp_provider/utilities/constants.py +0 -22
  149. build/lib/another_ayx_python_sdk/providers/amp_provider/utilities/conversions.py +0 -55
  150. build/lib/another_ayx_python_sdk/providers/amp_provider/utilities/utilities.py +0 -63
  151. build/lib/another_ayx_python_sdk/providers/e1_provider/__init__.py +0 -36
  152. build/lib/another_ayx_python_sdk/providers/e1_provider/anchor_builder.py +0 -95
  153. build/lib/another_ayx_python_sdk/providers/e1_provider/cache_e1_sdk_import.py +0 -31
  154. build/lib/another_ayx_python_sdk/providers/e1_provider/connection_callback_strategy.py +0 -155
  155. build/lib/another_ayx_python_sdk/providers/e1_provider/connection_interface.py +0 -125
  156. build/lib/another_ayx_python_sdk/providers/e1_provider/e1_dcm.py +0 -53
  157. build/lib/another_ayx_python_sdk/providers/e1_provider/e1_environment.py +0 -127
  158. build/lib/another_ayx_python_sdk/providers/e1_provider/e1_input_anchor.py +0 -51
  159. build/lib/another_ayx_python_sdk/providers/e1_provider/e1_input_anchor_proxy.py +0 -33
  160. build/lib/another_ayx_python_sdk/providers/e1_provider/e1_input_connection.py +0 -87
  161. build/lib/another_ayx_python_sdk/providers/e1_provider/e1_io.py +0 -71
  162. build/lib/another_ayx_python_sdk/providers/e1_provider/e1_output_anchor.py +0 -157
  163. build/lib/another_ayx_python_sdk/providers/e1_provider/e1_output_anchor_proxy.py +0 -97
  164. build/lib/another_ayx_python_sdk/providers/e1_provider/e1_plugin_driver.py +0 -63
  165. build/lib/another_ayx_python_sdk/providers/e1_provider/e1_plugin_proxy.py +0 -363
  166. build/lib/another_ayx_python_sdk/providers/e1_provider/e1_provider.py +0 -71
  167. build/lib/another_ayx_python_sdk/providers/e1_provider/e1_record_packet.py +0 -21
  168. build/lib/another_ayx_python_sdk/providers/e1_provider/events.py +0 -36
  169. build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/__init__.py +0 -37
  170. build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/alteryx_engine.py +0 -105
  171. build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/constants.py +0 -50
  172. build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/field.py +0 -122
  173. build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/output_anchor.py +0 -55
  174. build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/output_anchor_manager.py +0 -31
  175. build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/record_copier.py +0 -65
  176. build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/record_creator.py +0 -41
  177. build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/record_info.py +0 -134
  178. build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/record_ref.py +0 -42
  179. build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/tool.py +0 -29
  180. build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/tool_execution_info.py +0 -43
  181. build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/__init__.py +0 -14
  182. build/lib/another_ayx_python_sdk/providers/e1_provider/proxies/__init__.py +0 -18
  183. build/lib/another_ayx_python_sdk/providers/e1_provider/proxies/field_proxy.py +0 -109
  184. build/lib/another_ayx_python_sdk/providers/e1_provider/proxies/record_copier_proxy.py +0 -49
  185. build/lib/another_ayx_python_sdk/providers/e1_provider/records/__init__.py +0 -23
  186. build/lib/another_ayx_python_sdk/providers/e1_provider/records/base_record_container.py +0 -47
  187. build/lib/another_ayx_python_sdk/providers/e1_provider/records/parsed_record_container.py +0 -67
  188. build/lib/another_ayx_python_sdk/providers/e1_provider/records/raw_record_container.py +0 -111
  189. build/lib/another_ayx_python_sdk/providers/e1_provider/tool_config_loader.py +0 -132
  190. build/lib/another_ayx_python_sdk/providers/e1_provider/utilities/__init__.py +0 -35
  191. build/lib/another_ayx_python_sdk/providers/e1_provider/utilities/utilities.py +0 -54
  192. build/lib/another_ayx_python_sdk/providers/e1_provider/workflow_config.py +0 -31
  193. build/lib/another_ayx_python_sdk/providers/file_provider/__init__.py +0 -32
  194. build/lib/another_ayx_python_sdk/providers/file_provider/environment.py +0 -131
  195. build/lib/another_ayx_python_sdk/providers/file_provider/file_adapter.py +0 -286
  196. build/lib/another_ayx_python_sdk/providers/file_provider/file_provider.py +0 -185
  197. build/lib/another_ayx_python_sdk/providers/file_provider/file_provider_dcm.py +0 -53
  198. build/lib/another_ayx_python_sdk/providers/file_provider/file_provider_input_anchor.py +0 -70
  199. build/lib/another_ayx_python_sdk/providers/file_provider/file_provider_input_connection.py +0 -112
  200. build/lib/another_ayx_python_sdk/providers/file_provider/file_provider_output_anchor.py +0 -114
  201. build/lib/another_ayx_python_sdk/providers/file_provider/file_record_packet.py +0 -21
  202. build/lib/another_ayx_python_sdk/providers/file_provider/iox.py +0 -56
  203. build/lib/another_ayx_python_sdk/providers/file_provider/tool_input.py +0 -104
  204. build/lib/another_ayx_python_sdk/test_harness/__init__.py +0 -14
  205. build/lib/another_ayx_python_sdk/test_harness/__main__.py +0 -120
  206. build/lib/another_ayx_python_sdk/test_harness/plugin_runner.py +0 -416
  207. build/lib/another_ayx_python_sdk/test_harness/process_lifecycle_manager.py +0 -80
  208. build/lib/another_ayx_python_sdk/test_harness/sdk_engine_service.py +0 -106
  209. build/lib/another_ayx_python_sdk/version.py +0 -8
  210. {another_ayx_python_sdk-2.4.24.dist-info → another_ayx_python_sdk-2.4.25.dist-info}/WHEEL +0 -0
  211. {another_ayx_python_sdk-2.4.24.dist-info → another_ayx_python_sdk-2.4.25.dist-info}/entry_points.txt +0 -0
  212. {another_ayx_python_sdk-2.4.24.dist-info → another_ayx_python_sdk-2.4.25.dist-info}/licenses/LICENSE +0 -0
@@ -1,470 +0,0 @@
1
- # Copyright (C) 2022 Alteryx, Inc. All rights reserved.
2
- #
3
- # Licensed under the ALTERYX SDK AND API LICENSE AGREEMENT;
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # https://www.alteryx.com/alteryx-sdk-and-api-license-agreement
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
- """Alteryx Python SDK: Main program."""
15
- import filecmp
16
- import importlib.util
17
- import json
18
- import logging
19
- import os
20
- import re
21
- import shutil
22
- import subprocess
23
- from enum import Enum
24
- from functools import wraps
25
- from pathlib import Path
26
- from typing import Any, Callable, List
27
-
28
- from another_ayx_python_sdk.cli.utilities import get_install_dir
29
- from another_ayx_python_sdk.cli.workspace import (
30
- WorkspaceError,
31
- remove_whitespace,
32
- )
33
- from another_ayx_python_sdk.providers.file_provider import FileProvider
34
- from another_ayx_python_sdk.providers.file_provider.tool_input import ToolInput
35
- from another_ayx_python_sdk.version import short_version
36
-
37
- import deprecation
38
-
39
- import typer
40
-
41
- logger = logging.getLogger(__name__)
42
- app = typer.Typer(
43
- help="Run a tool using file inputs and outputs in a pure Python environment."
44
- )
45
-
46
- REQ_LOCAL = "requirements-local.txt"
47
- REQ_THIRDPARTY = "requirements-thirdparty.txt"
48
-
49
-
50
- class TemplateToolTypes(str, Enum):
51
- """Installation Type of Designer."""
52
-
53
- Input = "input"
54
- MultipleInputs = "multiple-inputs"
55
- MultipleOutputs = "multiple-outputs"
56
- Optional = "optional"
57
- Output = "output"
58
- SingleInputSingleOutput = "single-input-single-output"
59
- MultipleInputConnections = "multi-connection-input-anchor"
60
-
61
-
62
- name_to_tool = {
63
- TemplateToolTypes.Input: "AyxSdkInput",
64
- TemplateToolTypes.MultipleInputs: "AyxSdkMultipleInputAnchors",
65
- TemplateToolTypes.MultipleOutputs: "AyxSdkMultipleOutputAnchors",
66
- TemplateToolTypes.Optional: "AyxSdkOptionalInputAnchor",
67
- TemplateToolTypes.Output: "AyxSdkOutput",
68
- TemplateToolTypes.SingleInputSingleOutput: "AyxSdkPassThrough",
69
- TemplateToolTypes.MultipleInputConnections: "AyxSdkMultiConnectionsMultiOutputAnchor",
70
- }
71
-
72
-
73
- @app.command()
74
- def init_workspace(
75
- workspace_directory: str = typer.Option(
76
- ...,
77
- help="Directory to create a workspace in. "
78
- "If the directory doesn't exist, it will be created.",
79
- ),
80
- yes_to_all: bool = typer.Option(False, "--y", help="Confirm all"),
81
- ) -> None:
82
- """Initialize a plugin workspace with a python backend."""
83
- backend_directory = Path(workspace_directory) / "backend"
84
- plugins_directory = backend_directory / "ayx_plugins"
85
- assets_directory = (
86
- Path(os.path.realpath(__file__)).parent / "assets" / "workspace_files"
87
- )
88
-
89
- typer.echo(f"Creating {plugins_directory}")
90
- plugins_directory.mkdir(parents=True, exist_ok=True)
91
-
92
- files_to_create = {
93
- (assets_directory / REQ_LOCAL)
94
- .resolve(): (backend_directory / REQ_LOCAL)
95
- .resolve(),
96
- (assets_directory / REQ_THIRDPARTY)
97
- .resolve(): (backend_directory / REQ_THIRDPARTY)
98
- .resolve(),
99
- (assets_directory / "setup.py")
100
- .resolve(): (backend_directory / "setup.py")
101
- .resolve(),
102
- (assets_directory / "__init__.py")
103
- .resolve(): (plugins_directory / "__init__.py")
104
- .resolve(),
105
- }
106
- new_files = []
107
- files_to_overwrite = []
108
- for source_path, dest_path in files_to_create.items():
109
- if not dest_path.exists():
110
- new_files.append((source_path, dest_path))
111
- else:
112
- files_to_overwrite.append((source_path, dest_path))
113
- for source_path, dest_path in new_files:
114
- typer.echo(f"Creating file {dest_path}")
115
- shutil.copy(source_path, dest_path)
116
- pin_ayx_version_to_requirements((backend_directory / REQ_THIRDPARTY).resolve())
117
-
118
- if not files_to_overwrite:
119
- return
120
- output_paths = [str(path[1]) for path in files_to_overwrite]
121
- if yes_to_all or typer.confirm(
122
- "\nThe following files will be overwritten:\n\t"
123
- + "\n\t".join(output_paths)
124
- + "\n\nConfirm that it is okay to remove these paths.\n"
125
- ):
126
- for source_path, dest_path in files_to_overwrite:
127
- typer.echo(f"Overwriting file {dest_path}")
128
- shutil.copy(source_path, dest_path)
129
- pin_ayx_version_to_requirements((backend_directory / REQ_THIRDPARTY).resolve())
130
- else:
131
- typer.echo(f"{', '.join(output_paths)} will not be overwritten")
132
-
133
-
134
- def pin_ayx_version_to_requirements(requirements_path: Path) -> None:
135
- """Pins the plugin SDK to third-party requirements."""
136
- with open(requirements_path, "r") as req_file:
137
- lines = req_file.readlines()
138
- for line_num in range(len(lines)):
139
- if re.match(r"^ayx_python_sdk$", lines[line_num]):
140
- lines[line_num] = f"ayx_python_sdk=={short_version}"
141
- req_file = open(requirements_path, "w")
142
- req_file.writelines(lines)
143
-
144
-
145
- @deprecation.deprecated(
146
- deprecated_in="1.0.3",
147
- removed_in="2.0.0",
148
- details="Use the Plugin CLI's test harness instead.",
149
- ) # type: ignore
150
- @app.command(
151
- deprecated=True,
152
- short_help="(DEPRECATED) Run a tool using file inputs and outputs in a pure Python environment.",
153
- )
154
- def run_tool_with_file_provider(
155
- configuration_file: str = typer.Option(
156
- ...,
157
- help="JSON file that specifies the input and output "
158
- "information needed for the file provider to run",
159
- ),
160
- ) -> None:
161
- """
162
- Run a tool using file inputs and outputs in a pure Python environment.
163
-
164
- Parameters
165
- ----------
166
- configuration_file
167
- Specifies the path to the JSON file that contains the tool plugin,
168
- configuration files, input files, and output files.
169
- """
170
- try:
171
- with open(configuration_file) as fd:
172
- json_dict = json.load(fd)
173
- except FileNotFoundError:
174
- raise RuntimeError(f"Couldn't find tool information file {configuration_file}.")
175
-
176
- tool_input = ToolInput(**json_dict)
177
- tool_classname = tool_input.tool.plugin
178
- tool_path = Path(tool_input.tool.path)
179
-
180
- file_provider = FileProvider(
181
- tool_input.tool_config.resolve(),
182
- tool_input.workflow_config.resolve(),
183
- inputs=tool_input.inputs or [],
184
- outputs=tool_input.outputs or [],
185
- update_tool_config=tool_input.update_tool_config,
186
- )
187
-
188
- tool_class = _load_user_plugin_class(tool_classname, tool_path)
189
-
190
- # Initialize and run the plugin
191
- plugin = tool_class(file_provider)
192
- for input_anchor in file_provider.input_anchors:
193
- for input_anchor_connection in input_anchor.connections:
194
- plugin.on_input_connection_opened(input_anchor_connection)
195
- # TODO Support multiple calls to on_record_packet
196
- plugin.on_record_packet(input_anchor_connection)
197
- plugin.on_complete()
198
-
199
-
200
- def _load_user_plugin_class(tool_classname: str, tool_path: Path) -> Any:
201
- """Load the plugin and get a reference to its class."""
202
- root = Path(os.getcwd())
203
- tool_full_path = (root / tool_path).resolve()
204
- original_cwd = os.getcwd()
205
-
206
- try:
207
- os.chdir(tool_full_path.parent)
208
- spec: Any = importlib.util.spec_from_file_location("main", "main.py")
209
- module = importlib.util.module_from_spec(spec)
210
- spec.loader.exec_module(module)
211
- return getattr(module, tool_classname)
212
- finally:
213
- os.chdir(original_cwd)
214
-
215
-
216
- def handle_workspace_errors(function: Callable) -> Callable:
217
- """Handle any workspace errors that occur."""
218
-
219
- @wraps(function)
220
- def decorator(*args: Any, **kwargs: Any) -> None:
221
- try:
222
- function(*args, **kwargs)
223
- except WorkspaceError as e:
224
- typer.echo(f"ERROR: {e}")
225
- raise typer.Exit(code=1)
226
-
227
- return decorator
228
-
229
-
230
- @app.command()
231
- @handle_workspace_errors
232
- def create_ayx_plugin(
233
- name: str = typer.Option(
234
- ..., prompt="Tool Name", help="Name of the tool to create."
235
- ),
236
- workspace_directory: Path = typer.Option(
237
- ..., prompt="Workspace directory", help="Directory to put the new tool in."
238
- ),
239
- tool_type: TemplateToolTypes = typer.Option(
240
- ...,
241
- prompt="Tool type",
242
- help=f"The type of tool to create. Must be one of: {', '.join(name_to_tool.keys())}",
243
- ),
244
- ) -> None:
245
- """Create a new plugin for Alteryx Designer."""
246
- typer.echo("Creating Alteryx Plugin...")
247
- plugin_directory = workspace_directory / "backend" / "ayx_plugins"
248
- if not plugin_directory.is_dir():
249
- raise WorkspaceError(f"Plugin directory doesn't exist: {plugin_directory}")
250
-
251
- if plugin_directory.is_file():
252
- raise WorkspaceError(
253
- f"Plugin directory path is a file, not a directory: {plugin_directory}"
254
- )
255
-
256
- if not (plugin_directory / "__init__.py").exists():
257
- raise WorkspaceError(
258
- "__init__.py not found in the specified directory. "
259
- "Make sure that you've entered the correct path."
260
- )
261
-
262
- new_tool_name = remove_whitespace(name)
263
- new_tool_file_name = re.sub(r"(?<!^)(?=[A-Z])", "_", new_tool_name).lower()
264
- new_tool_path = plugin_directory / f"{new_tool_file_name}.py"
265
-
266
- if not new_tool_name.replace("_", "").isalnum() or not new_tool_name[0].isalpha():
267
- raise WorkspaceError(
268
- f"The name of the tool {new_tool_name} must be alpha-numeric, "
269
- "cannot start with a number, and cannot contain any special characters."
270
- )
271
-
272
- if new_tool_path.exists():
273
- raise WorkspaceError(
274
- "There is already another tool with this name in the directory."
275
- )
276
-
277
- example_tool_name = name_to_tool[tool_type]
278
- example_tool_dir = get_install_dir() / "examples" / example_tool_name
279
-
280
- shutil.copy(
281
- example_tool_dir / "main.py",
282
- new_tool_path,
283
- )
284
- typer.echo(f"Copying example tool to {plugin_directory}...")
285
-
286
- _update_main_py(new_tool_path, example_tool_name, new_tool_name)
287
- _update_init_py(plugin_directory, new_tool_file_name, new_tool_name)
288
-
289
- typer.echo(f"Added new tool to package directory: {new_tool_path}")
290
-
291
-
292
- def _update_main_py(
293
- plugin_path: Path,
294
- example_tool_name: str,
295
- new_tool_name: str,
296
- ) -> None:
297
- try:
298
- with open(str(plugin_path), "r") as f:
299
- content = f.read()
300
-
301
- content = content.replace(example_tool_name, new_tool_name)
302
- with open(str(plugin_path), "w") as f:
303
- f.write(content)
304
- except IOError:
305
- raise WorkspaceError(f"Error updating {plugin_path}")
306
-
307
-
308
- def _update_init_py(
309
- plugin_directory: Path, new_tool_file_name: str, new_tool_name: str
310
- ) -> None:
311
- import_line = f"from .{new_tool_file_name} import {new_tool_name}\n"
312
- try:
313
- with open(str(Path(plugin_directory) / "__init__.py"), "a") as f:
314
- f.write(import_line)
315
- except IOError:
316
- raise WorkspaceError("Error opening the __init__.py file")
317
-
318
-
319
- @app.command()
320
- @handle_workspace_errors
321
- def install_deps(
322
- dependency_cache_dir: Path = typer.Option(
323
- default=Path(".doit_cache"),
324
- prompt="Distribution directory",
325
- help="Creates a distribution directory",
326
- ),
327
- output_path: Path = typer.Option(
328
- ...,
329
- prompt="Output path including filename",
330
- help="The path to save the .pyz bootstrap artifact, example: './bootstrap.pyz'",
331
- ),
332
- ) -> None:
333
- """Install any dependencies for the current workspace tools."""
334
- typer.echo("Installing dependencies...")
335
- logger.info("install_deps called...")
336
- dist_dir = (dependency_cache_dir / "dist").resolve()
337
- dist_dir.mkdir(exist_ok=True, parents=True)
338
- curr_dir = Path(".")
339
- backend_dir = curr_dir / "backend"
340
-
341
- if (
342
- not (backend_dir / REQ_LOCAL).exists()
343
- or not (backend_dir / REQ_THIRDPARTY).exists()
344
- ):
345
- raise WorkspaceError(
346
- "Missing requirements files. Please make sure that both 'requirements-thirdparty.txt' and 'requirements-local.txt' exist in the backend folder."
347
- )
348
- install_local_dependencies = [
349
- "python",
350
- "-m",
351
- "pip",
352
- "install",
353
- "-r",
354
- REQ_LOCAL,
355
- "--upgrade",
356
- "--target",
357
- str(dist_dir),
358
- ]
359
- result = _run_build_artifact_command(
360
- install_local_dependencies, "Installing local dependencies", backend_dir
361
- )
362
- if result != 0:
363
- raise WorkspaceError(
364
- "Installing local dependencies failed, aborting YXI generation."
365
- )
366
- requirements_changed = _check_requirements_changed(
367
- dist_dir / REQ_THIRDPARTY,
368
- backend_dir / REQ_THIRDPARTY,
369
- )
370
-
371
- if requirements_changed:
372
- typer.echo("Installing new dependencies...")
373
- install_third_party_dependencies = [
374
- "python",
375
- "-m",
376
- "pip",
377
- "install",
378
- "-r",
379
- REQ_THIRDPARTY,
380
- "--upgrade",
381
- "--target",
382
- str(dist_dir),
383
- ]
384
-
385
- result = _run_build_artifact_command(
386
- install_third_party_dependencies,
387
- "Installing third party dependencies",
388
- backend_dir,
389
- )
390
-
391
- if result != 0:
392
- Path(dist_dir / REQ_THIRDPARTY).unlink(missing_ok=True)
393
- raise WorkspaceError(
394
- "Installing third party dependencies failed, aborting YXI generation."
395
- )
396
-
397
-
398
- def _run_build_artifact_command(cmd: List[str], label: str, cwd: Path) -> int:
399
- try:
400
- typer.echo(f"[{label}]: {' '.join(cmd)} ")
401
- process = subprocess.run(
402
- cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd
403
- )
404
- if process.returncode != 0:
405
- typer.echo(
406
- f"Process [{label}] failed with error code{process.returncode}\nPlease check log for details"
407
- )
408
- logger.error(
409
- "Process returned with non-zero exit code: %s",
410
- process.stderr,
411
- exc_info=True,
412
- )
413
- return process.returncode
414
- except subprocess.CalledProcessError as e:
415
- typer.echo(
416
- f"Process [{label}] failed with {process.returncode}\nPlease check log for details"
417
- )
418
- logger.error(
419
- "Exception occured during execution of subprocess: %s",
420
- e.__traceback__,
421
- exc_info=True,
422
- )
423
- return -1
424
-
425
-
426
- def _check_requirements_changed(
427
- dist_requirements: Path, backend_requirements: Path
428
- ) -> bool:
429
- try:
430
- if not dist_requirements.exists():
431
- shutil.copy(backend_requirements, dist_requirements)
432
- return True
433
- else:
434
- file_changed = not filecmp.cmp(dist_requirements, backend_requirements)
435
- if file_changed:
436
- shutil.copy(backend_requirements, dist_requirements)
437
- return file_changed
438
-
439
- except Exception:
440
- raise WorkspaceError(
441
- "Could not find /requirements-thirdparty.txt in the specified directories"
442
- )
443
-
444
-
445
- @app.command()
446
- def docs() -> None:
447
- """Open the ayx-plugin-sdk documentation in a browser."""
448
- import webbrowser
449
-
450
- docs_index_html = Path(os.path.dirname(__file__)) / "docs" / "index.html"
451
- webbrowser.open_new_tab(str(docs_index_html))
452
-
453
-
454
- def _log_info(msg: str) -> None:
455
- logger.info("INFO: %s", msg)
456
- typer.echo(f"INFO: {msg}")
457
-
458
-
459
- def _log_error(msg: str) -> None:
460
- logger.error("ERROR: %s", msg)
461
- typer.echo(f"ERROR: {msg}")
462
-
463
-
464
- def main() -> None:
465
- """Define the main entry point to typer."""
466
- app()
467
-
468
-
469
- if __name__ == "__main__":
470
- main()
@@ -1,14 +0,0 @@
1
- # Copyright (C) 2022 Alteryx, Inc. All rights reserved.
2
- #
3
- # Licensed under the ALTERYX SDK AND API LICENSE AGREEMENT;
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # https://www.alteryx.com/alteryx-sdk-and-api-license-agreement
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
- """Alteryx Designer Plugin implementations."""
@@ -1,38 +0,0 @@
1
- # Copyright (C) 2022 Alteryx, Inc. All rights reserved.
2
- #
3
- # Licensed under the ALTERYX SDK AND API LICENSE AGREEMENT;
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # https://www.alteryx.com/alteryx-sdk-and-api-license-agreement
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
- """Alteryx Designer Plugin implementations."""
15
- from setuptools import find_packages, setup
16
-
17
- PACKAGE_NAME = "ayx_plugins"
18
-
19
- MAJOR = 1
20
- MINOR = 0
21
- MICRO = 0
22
- VERSION = f"{MAJOR}.{MINOR}.{MICRO}"
23
-
24
- SUMMARY = (__doc__ or "").split("\n")
25
-
26
- if __name__ == "__main__":
27
- setup(
28
- name=PACKAGE_NAME,
29
- version=VERSION,
30
- description=SUMMARY,
31
- long_description_content_type="text/markdown",
32
- platforms=["Windows"],
33
- author="Alteryx, Inc.",
34
- author_email="support@alteryx.com",
35
- packages=find_packages(
36
- exclude=["examples", "*.tests", "*.tests.*", "tests.*", "tests"]
37
- ),
38
- )
@@ -1,14 +0,0 @@
1
- # Copyright (C) 2022 Alteryx, Inc. All rights reserved.
2
- #
3
- # Licensed under the ALTERYX SDK AND API LICENSE AGREEMENT;
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # https://www.alteryx.com/alteryx-sdk-and-api-license-agreement
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
- """Command line interface definitions."""
@@ -1,103 +0,0 @@
1
- # Copyright (C) 2022 Alteryx, Inc. All rights reserved.
2
- #
3
- # Licensed under the ALTERYX SDK AND API LICENSE AGREEMENT;
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # https://www.alteryx.com/alteryx-sdk-and-api-license-agreement
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
- """Helper methods for managing the virtual environment."""
15
- import os
16
- import xml.etree.ElementTree as Et
17
- from pathlib import Path
18
- from typing import List, TYPE_CHECKING
19
-
20
- if TYPE_CHECKING:
21
- from another_ayx_python_sdk.cli.workspace import Workspace # noqa: F401
22
-
23
-
24
- def get_install_dir() -> Path:
25
- """Get the current directory."""
26
- return Path(__file__).parent.parent
27
-
28
-
29
- def environment_requires_update(workspace: "Workspace") -> bool:
30
- """Determine if the virtual environments for the tools should be updated."""
31
- if not _virtual_environment_exists(workspace.tool_family_name):
32
- return True
33
-
34
- if not workspace.tools:
35
- return False
36
-
37
- tool_family_requirements_path = (
38
- Path(_get_alteryx_tools_path()) / workspace.tools[0] / "requirements.txt"
39
- )
40
-
41
- if not tool_family_requirements_path.is_file():
42
- return True
43
-
44
- workspace_requirements = _get_requirements(
45
- workspace.workspace_dir / "requirements.txt"
46
- )
47
- installed_tool_family_requirements = _get_requirements(
48
- tool_family_requirements_path
49
- )
50
- return workspace_requirements != installed_tool_family_requirements
51
-
52
-
53
- def get_alteryx_path() -> Path:
54
- """Get the path to Alteryx Designer."""
55
- user_designer_install_path = Path(os.getenv("LOCALAPPDATA", "")) / "Alteryx"
56
- user_designer_engine_cmd_path = (
57
- user_designer_install_path / "bin" / "AlteryxEngineCmd.exe"
58
- )
59
- if user_designer_engine_cmd_path.exists():
60
- return user_designer_install_path
61
-
62
- admin_designer_install_path = Path(os.getenv("PROGRAMFILES", "")) / "Alteryx"
63
- admin_designer_engine_cmd_path = (
64
- admin_designer_install_path / "bin" / "AlteryxEngineCmd.exe"
65
- )
66
- if admin_designer_engine_cmd_path.exists():
67
- return admin_designer_install_path
68
-
69
- raise FileNotFoundError("Alteryx Install Path could not be located.")
70
-
71
-
72
- def get_tool_family_attribute_from_config(config_xml_path: Path) -> str:
73
- """Get the ToolFamily attribute from the Config.xml file."""
74
- with open(str(config_xml_path), "r") as config_file:
75
- tree = Et.parse(config_file)
76
- root_node = tree.getroot()
77
- engine_settings = root_node.find("EngineSettings")
78
- if engine_settings is None:
79
- raise ValueError("Config xml doesn't contain engine settings.")
80
-
81
- tool_family = str(engine_settings.attrib["ToolFamily"])
82
- return tool_family
83
-
84
-
85
- def _get_alteryx_tools_path() -> Path:
86
- """Get the path to the Alteryx Tools folder (for 3P plugins)."""
87
- user_install_path = Path(os.getenv("APPDATA", "")) / "Alteryx" / "Tools"
88
- return user_install_path
89
-
90
-
91
- def _get_requirements(requirements_path: Path) -> List[str]:
92
- """Get the workspace level requirements file."""
93
- with open(str(requirements_path), "r") as req_file:
94
- requirements = req_file.readlines()
95
-
96
- return [line for line in requirements if "--find-links" not in line]
97
-
98
-
99
- def _virtual_environment_exists(tool_family_name: str) -> bool:
100
- """Check if the virtual environment exists."""
101
- venv_name = f"{tool_family_name}_venv"
102
- designer_venv_path = Path(_get_alteryx_tools_path()) / venv_name
103
- return designer_venv_path.is_dir()