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.
- another_ayx_python_sdk/version.py +3 -3
- {another_ayx_python_sdk-2.4.24.dist-info → another_ayx_python_sdk-2.4.25.dist-info}/METADATA +1 -1
- {another_ayx_python_sdk-2.4.24.dist-info → another_ayx_python_sdk-2.4.25.dist-info}/RECORD +7 -212
- {another_ayx_python_sdk-2.4.24.dist-info → another_ayx_python_sdk-2.4.25.dist-info}/top_level.txt +0 -2
- build/lib/another_ayx_python_sdk/__init__.py +0 -14
- build/lib/another_ayx_python_sdk/__main__.py +0 -470
- build/lib/another_ayx_python_sdk/assets/workspace_files/__init__.py +0 -14
- build/lib/another_ayx_python_sdk/assets/workspace_files/setup.py +0 -38
- build/lib/another_ayx_python_sdk/cli/__init__.py +0 -14
- build/lib/another_ayx_python_sdk/cli/utilities.py +0 -103
- build/lib/another_ayx_python_sdk/cli/workspace.py +0 -266
- build/lib/another_ayx_python_sdk/cli/yxi_builder.py +0 -125
- build/lib/another_ayx_python_sdk/cli/yxi_installer.py +0 -45
- build/lib/another_ayx_python_sdk/core/__init__.py +0 -51
- build/lib/another_ayx_python_sdk/core/constants.py +0 -25
- build/lib/another_ayx_python_sdk/core/dcm_base.py +0 -115
- build/lib/another_ayx_python_sdk/core/doc_utilities.py +0 -40
- build/lib/another_ayx_python_sdk/core/environment_base.py +0 -213
- build/lib/another_ayx_python_sdk/core/exceptions.py +0 -59
- build/lib/another_ayx_python_sdk/core/field.py +0 -183
- build/lib/another_ayx_python_sdk/core/input_anchor_base.py +0 -86
- build/lib/another_ayx_python_sdk/core/input_connection_base.py +0 -206
- build/lib/another_ayx_python_sdk/core/io_base.py +0 -139
- build/lib/another_ayx_python_sdk/core/metadata.py +0 -173
- build/lib/another_ayx_python_sdk/core/observable_mixin.py +0 -90
- build/lib/another_ayx_python_sdk/core/output_anchor_base.py +0 -151
- build/lib/another_ayx_python_sdk/core/plugin.py +0 -108
- build/lib/another_ayx_python_sdk/core/plugin_v2.py +0 -97
- build/lib/another_ayx_python_sdk/core/provider_base.py +0 -125
- build/lib/another_ayx_python_sdk/core/proxy_requests.py +0 -51
- build/lib/another_ayx_python_sdk/core/record_packet.py +0 -88
- build/lib/another_ayx_python_sdk/core/record_packet_base.py +0 -123
- build/lib/another_ayx_python_sdk/core/register_plugin.py +0 -127
- build/lib/another_ayx_python_sdk/core/testing.py +0 -191
- build/lib/another_ayx_python_sdk/core/utils.py +0 -146
- build/lib/another_ayx_python_sdk/examples/AyxSdkInput/main.py +0 -89
- build/lib/another_ayx_python_sdk/examples/AyxSdkMultiConnectionsMultiOutputAnchor/main.py +0 -102
- build/lib/another_ayx_python_sdk/examples/AyxSdkMultipleInputAnchors/main.py +0 -84
- build/lib/another_ayx_python_sdk/examples/AyxSdkMultipleOutputAnchors/main.py +0 -96
- build/lib/another_ayx_python_sdk/examples/AyxSdkOptionalInputAnchor/main.py +0 -94
- build/lib/another_ayx_python_sdk/examples/AyxSdkOutput/main.py +0 -78
- build/lib/another_ayx_python_sdk/examples/AyxSdkPassThrough/main.py +0 -82
- build/lib/another_ayx_python_sdk/providers/__init__.py +0 -14
- build/lib/another_ayx_python_sdk/providers/amp_provider/__init__.py +0 -41
- build/lib/another_ayx_python_sdk/providers/amp_provider/__main__.py +0 -85
- build/lib/another_ayx_python_sdk/providers/amp_provider/amp_dcm.py +0 -58
- build/lib/another_ayx_python_sdk/providers/amp_provider/amp_driver.py +0 -358
- build/lib/another_ayx_python_sdk/providers/amp_provider/amp_environment.py +0 -73
- build/lib/another_ayx_python_sdk/providers/amp_provider/amp_environment_v2.py +0 -278
- build/lib/another_ayx_python_sdk/providers/amp_provider/amp_input_anchor.py +0 -73
- build/lib/another_ayx_python_sdk/providers/amp_provider/amp_input_connection.py +0 -132
- build/lib/another_ayx_python_sdk/providers/amp_provider/amp_io.py +0 -64
- build/lib/another_ayx_python_sdk/providers/amp_provider/amp_io_components.py +0 -407
- build/lib/another_ayx_python_sdk/providers/amp_provider/amp_output_anchor.py +0 -107
- build/lib/another_ayx_python_sdk/providers/amp_provider/amp_provider.py +0 -68
- build/lib/another_ayx_python_sdk/providers/amp_provider/amp_provider_v2.py +0 -128
- build/lib/another_ayx_python_sdk/providers/amp_provider/amp_record_packet.py +0 -21
- build/lib/another_ayx_python_sdk/providers/amp_provider/builders/__init__.py +0 -32
- build/lib/another_ayx_python_sdk/providers/amp_provider/builders/input_anchor_builder.py +0 -123
- build/lib/another_ayx_python_sdk/providers/amp_provider/builders/input_connection_builder.py +0 -95
- build/lib/another_ayx_python_sdk/providers/amp_provider/builders/metadata_builder.py +0 -118
- build/lib/another_ayx_python_sdk/providers/amp_provider/builders/output_anchor_builder.py +0 -110
- build/lib/another_ayx_python_sdk/providers/amp_provider/builders/packers.py +0 -458
- build/lib/another_ayx_python_sdk/providers/amp_provider/builders/record_builder.py +0 -204
- build/lib/another_ayx_python_sdk/providers/amp_provider/builders/record_packet_builder.py +0 -133
- build/lib/another_ayx_python_sdk/providers/amp_provider/builders/tool_config_builder.py +0 -59
- build/lib/another_ayx_python_sdk/providers/amp_provider/cng_certs.py +0 -197
- build/lib/another_ayx_python_sdk/providers/amp_provider/data_transport/__init__.py +0 -18
- build/lib/another_ayx_python_sdk/providers/amp_provider/data_transport/amp_transport.py +0 -127
- build/lib/another_ayx_python_sdk/providers/amp_provider/data_transport/transport_base.py +0 -35
- build/lib/another_ayx_python_sdk/providers/amp_provider/grpc_helpers/__init__.py +0 -14
- build/lib/another_ayx_python_sdk/providers/amp_provider/grpc_helpers/control_msgs.py +0 -189
- build/lib/another_ayx_python_sdk/providers/amp_provider/grpc_helpers/dcme_msgs.py +0 -119
- build/lib/another_ayx_python_sdk/providers/amp_provider/grpc_helpers/record_transfer_msgs.py +0 -32
- build/lib/another_ayx_python_sdk/providers/amp_provider/grpc_util.py +0 -161
- build/lib/another_ayx_python_sdk/providers/amp_provider/logger_config.py +0 -63
- build/lib/another_ayx_python_sdk/providers/amp_provider/plugin_class_loader.py +0 -77
- build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/__init__.py +0 -67
- build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/dcm_repository.py +0 -252
- build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/environment_repository.py +0 -212
- build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/grpc_repository.py +0 -119
- build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/input_anchor_repository.py +0 -110
- build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/input_connection_repository.py +0 -276
- build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/input_metadata_repository.py +0 -144
- build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/input_record_packet_repository.py +0 -252
- build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/io_repository.py +0 -188
- build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/output_anchor_repository.py +0 -117
- build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/output_metadata_repository.py +0 -129
- build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/output_record_packet_repository.py +0 -170
- build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/plugin_class_repository.py +0 -55
- build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/singleton.py +0 -32
- build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/test_harness_state_repository.py +0 -172
- build/lib/another_ayx_python_sdk/providers/amp_provider/repositories/tool_config_repository.py +0 -89
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/__init__.py +0 -14
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/__init__.py +0 -0
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/close_outgoing_anchor_pb2.py +0 -25
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/close_outgoing_anchor_pb2_grpc.py +0 -4
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/dcm_e_pb2.py +0 -38
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/dcm_e_pb2_grpc.py +0 -4
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/incoming_anchor_pb2.py +0 -26
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/incoming_anchor_pb2_grpc.py +0 -4
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/incoming_connection_complete_pb2.py +0 -25
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/incoming_connection_complete_pb2_grpc.py +0 -4
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/incoming_connection_pb2.py +0 -26
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/incoming_connection_pb2_grpc.py +0 -4
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/incoming_data_push_pb2.py +0 -26
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/incoming_data_push_pb2_grpc.py +0 -4
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/incoming_record_packet_push_pb2.py +0 -26
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/incoming_record_packet_push_pb2_grpc.py +0 -4
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/metadata_pb2.py +0 -31
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/metadata_pb2_grpc.py +0 -4
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/outgoing_anchor_pb2.py +0 -28
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/outgoing_anchor_pb2_grpc.py +0 -4
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/outgoing_data_push_pb2.py +0 -26
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/outgoing_data_push_pb2_grpc.py +0 -4
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/outgoing_metadata_push_pb2.py +0 -26
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/outgoing_metadata_push_pb2_grpc.py +0 -4
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/outgoing_record_packet_push_pb2.py +0 -26
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/outgoing_record_packet_push_pb2_grpc.py +0 -4
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/output_message_data_pb2.py +0 -29
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/output_message_data_pb2_grpc.py +0 -4
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/password_data_pb2.py +0 -25
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/password_data_pb2_grpc.py +0 -4
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/plugin_initialization_data_pb2.py +0 -33
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/plugin_initialization_data_pb2_grpc.py +0 -4
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/record_batch_pb2.py +0 -25
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/record_batch_pb2_grpc.py +0 -4
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/record_packet_pb2.py +0 -29
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/record_packet_pb2_grpc.py +0 -4
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/sdk_engine_service_pb2.py +0 -34
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/sdk_engine_service_pb2_grpc.py +0 -305
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/sdk_tool_service_pb2.py +0 -30
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/sdk_tool_service_pb2_grpc.py +0 -235
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/sdk_tool_service_startup_info_pb2.py +0 -25
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/sdk_tool_service_startup_info_pb2_grpc.py +0 -4
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/sdk_tool_service_v2_pb2.py +0 -54
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/sdk_tool_service_v2_pb2_grpc.py +0 -99
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/translate_message_data_pb2.py +0 -27
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/translate_message_data_pb2_grpc.py +0 -4
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/transport_pb2.py +0 -31
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/transport_pb2_grpc.py +0 -4
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/update_progress_pb2.py +0 -25
- build/lib/another_ayx_python_sdk/providers/amp_provider/resources/generated/update_progress_pb2_grpc.py +0 -4
- build/lib/another_ayx_python_sdk/providers/amp_provider/sdk_tool_runner.py +0 -115
- build/lib/another_ayx_python_sdk/providers/amp_provider/sdk_tool_service.py +0 -207
- build/lib/another_ayx_python_sdk/providers/amp_provider/sdk_tool_service_v2.py +0 -306
- build/lib/another_ayx_python_sdk/providers/amp_provider/utilities/__init__.py +0 -14
- build/lib/another_ayx_python_sdk/providers/amp_provider/utilities/constants.py +0 -22
- build/lib/another_ayx_python_sdk/providers/amp_provider/utilities/conversions.py +0 -55
- build/lib/another_ayx_python_sdk/providers/amp_provider/utilities/utilities.py +0 -63
- build/lib/another_ayx_python_sdk/providers/e1_provider/__init__.py +0 -36
- build/lib/another_ayx_python_sdk/providers/e1_provider/anchor_builder.py +0 -95
- build/lib/another_ayx_python_sdk/providers/e1_provider/cache_e1_sdk_import.py +0 -31
- build/lib/another_ayx_python_sdk/providers/e1_provider/connection_callback_strategy.py +0 -155
- build/lib/another_ayx_python_sdk/providers/e1_provider/connection_interface.py +0 -125
- build/lib/another_ayx_python_sdk/providers/e1_provider/e1_dcm.py +0 -53
- build/lib/another_ayx_python_sdk/providers/e1_provider/e1_environment.py +0 -127
- build/lib/another_ayx_python_sdk/providers/e1_provider/e1_input_anchor.py +0 -51
- build/lib/another_ayx_python_sdk/providers/e1_provider/e1_input_anchor_proxy.py +0 -33
- build/lib/another_ayx_python_sdk/providers/e1_provider/e1_input_connection.py +0 -87
- build/lib/another_ayx_python_sdk/providers/e1_provider/e1_io.py +0 -71
- build/lib/another_ayx_python_sdk/providers/e1_provider/e1_output_anchor.py +0 -157
- build/lib/another_ayx_python_sdk/providers/e1_provider/e1_output_anchor_proxy.py +0 -97
- build/lib/another_ayx_python_sdk/providers/e1_provider/e1_plugin_driver.py +0 -63
- build/lib/another_ayx_python_sdk/providers/e1_provider/e1_plugin_proxy.py +0 -363
- build/lib/another_ayx_python_sdk/providers/e1_provider/e1_provider.py +0 -71
- build/lib/another_ayx_python_sdk/providers/e1_provider/e1_record_packet.py +0 -21
- build/lib/another_ayx_python_sdk/providers/e1_provider/events.py +0 -36
- build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/__init__.py +0 -37
- build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/alteryx_engine.py +0 -105
- build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/constants.py +0 -50
- build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/field.py +0 -122
- build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/output_anchor.py +0 -55
- build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/output_anchor_manager.py +0 -31
- build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/record_copier.py +0 -65
- build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/record_creator.py +0 -41
- build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/record_info.py +0 -134
- build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/record_ref.py +0 -42
- build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/tool.py +0 -29
- build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/AlteryxPythonSDK/tool_execution_info.py +0 -43
- build/lib/another_ayx_python_sdk/providers/e1_provider/mock_e1_sdk/__init__.py +0 -14
- build/lib/another_ayx_python_sdk/providers/e1_provider/proxies/__init__.py +0 -18
- build/lib/another_ayx_python_sdk/providers/e1_provider/proxies/field_proxy.py +0 -109
- build/lib/another_ayx_python_sdk/providers/e1_provider/proxies/record_copier_proxy.py +0 -49
- build/lib/another_ayx_python_sdk/providers/e1_provider/records/__init__.py +0 -23
- build/lib/another_ayx_python_sdk/providers/e1_provider/records/base_record_container.py +0 -47
- build/lib/another_ayx_python_sdk/providers/e1_provider/records/parsed_record_container.py +0 -67
- build/lib/another_ayx_python_sdk/providers/e1_provider/records/raw_record_container.py +0 -111
- build/lib/another_ayx_python_sdk/providers/e1_provider/tool_config_loader.py +0 -132
- build/lib/another_ayx_python_sdk/providers/e1_provider/utilities/__init__.py +0 -35
- build/lib/another_ayx_python_sdk/providers/e1_provider/utilities/utilities.py +0 -54
- build/lib/another_ayx_python_sdk/providers/e1_provider/workflow_config.py +0 -31
- build/lib/another_ayx_python_sdk/providers/file_provider/__init__.py +0 -32
- build/lib/another_ayx_python_sdk/providers/file_provider/environment.py +0 -131
- build/lib/another_ayx_python_sdk/providers/file_provider/file_adapter.py +0 -286
- build/lib/another_ayx_python_sdk/providers/file_provider/file_provider.py +0 -185
- build/lib/another_ayx_python_sdk/providers/file_provider/file_provider_dcm.py +0 -53
- build/lib/another_ayx_python_sdk/providers/file_provider/file_provider_input_anchor.py +0 -70
- build/lib/another_ayx_python_sdk/providers/file_provider/file_provider_input_connection.py +0 -112
- build/lib/another_ayx_python_sdk/providers/file_provider/file_provider_output_anchor.py +0 -114
- build/lib/another_ayx_python_sdk/providers/file_provider/file_record_packet.py +0 -21
- build/lib/another_ayx_python_sdk/providers/file_provider/iox.py +0 -56
- build/lib/another_ayx_python_sdk/providers/file_provider/tool_input.py +0 -104
- build/lib/another_ayx_python_sdk/test_harness/__init__.py +0 -14
- build/lib/another_ayx_python_sdk/test_harness/__main__.py +0 -120
- build/lib/another_ayx_python_sdk/test_harness/plugin_runner.py +0 -416
- build/lib/another_ayx_python_sdk/test_harness/process_lifecycle_manager.py +0 -80
- build/lib/another_ayx_python_sdk/test_harness/sdk_engine_service.py +0 -106
- build/lib/another_ayx_python_sdk/version.py +0 -8
- {another_ayx_python_sdk-2.4.24.dist-info → another_ayx_python_sdk-2.4.25.dist-info}/WHEEL +0 -0
- {another_ayx_python_sdk-2.4.24.dist-info → another_ayx_python_sdk-2.4.25.dist-info}/entry_points.txt +0 -0
- {another_ayx_python_sdk-2.4.24.dist-info → another_ayx_python_sdk-2.4.25.dist-info}/licenses/LICENSE +0 -0
@@ -1,306 +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
|
-
"""Test harness implementation of the SDK Engine service."""
|
15
|
-
import asyncio
|
16
|
-
import logging
|
17
|
-
|
18
|
-
from another_ayx_python_sdk.core.constants import Anchor
|
19
|
-
from another_ayx_python_sdk.providers.amp_provider.amp_driver import AMPDriver
|
20
|
-
from another_ayx_python_sdk.providers.amp_provider.resources.generated.sdk_tool_service_v2_pb2 import (
|
21
|
-
ControlOut,
|
22
|
-
RecordTransferOut,
|
23
|
-
)
|
24
|
-
from another_ayx_python_sdk.providers.amp_provider.resources.generated.sdk_tool_service_v2_pb2_grpc import (
|
25
|
-
SdkToolV2Servicer,
|
26
|
-
)
|
27
|
-
|
28
|
-
|
29
|
-
class SdkToolServiceV2(SdkToolV2Servicer):
|
30
|
-
"""Implementation of the SDK Engine V2 service."""
|
31
|
-
|
32
|
-
logger = logging.getLogger()
|
33
|
-
driver = AMPDriver()
|
34
|
-
init_data: asyncio.Future = asyncio.Future()
|
35
|
-
driver_guard: asyncio.Lock = asyncio.Lock()
|
36
|
-
cond_teardown = asyncio.Condition(lock=driver_guard)
|
37
|
-
record_teardown = asyncio.Condition(lock=driver_guard)
|
38
|
-
curr_driver_fn = None
|
39
|
-
ready_for_records: asyncio.Event = asyncio.Event()
|
40
|
-
record_batch_received: asyncio.Event = asyncio.Event()
|
41
|
-
|
42
|
-
async def Control(self, request_iterator, context): # type: ignore # noqa: N802
|
43
|
-
"""
|
44
|
-
Handle Control messages.
|
45
|
-
|
46
|
-
Initialize plugin on initialize ControlIn, then send any ControlOut messages
|
47
|
-
to the client as needed, while monitoring for client responses.
|
48
|
-
"""
|
49
|
-
try:
|
50
|
-
# Start read/writes and a worker to handle any callbacks for the driver
|
51
|
-
tasks = [
|
52
|
-
asyncio.create_task(
|
53
|
-
self._ctrl_read(request_iterator), name="_ctrl_read"
|
54
|
-
),
|
55
|
-
asyncio.create_task(self._ctrl_write(context), name="_ctrl_write"),
|
56
|
-
asyncio.create_task(
|
57
|
-
self._driver_callback_worker(), name="_driver_callback_worker"
|
58
|
-
),
|
59
|
-
asyncio.create_task(
|
60
|
-
self._user_callback_worker(), name="_user_callback_worker"
|
61
|
-
),
|
62
|
-
]
|
63
|
-
|
64
|
-
# Clean up tasks
|
65
|
-
async with self.cond_teardown:
|
66
|
-
self.logger.debug("Control waiting on teardown notification")
|
67
|
-
await self.cond_teardown.wait()
|
68
|
-
await asyncio.sleep(0)
|
69
|
-
complete_msg = ControlOut()
|
70
|
-
complete_msg.confirm_complete.SetInParent()
|
71
|
-
self.driver.ctrl_io.ctrl_out.put_nowait(complete_msg)
|
72
|
-
await self.driver.ctrl_io.ctrl_out.join()
|
73
|
-
self.logger.debug("Control starting teardown")
|
74
|
-
await self.driver.ctrl_io.flush()
|
75
|
-
for t in tasks:
|
76
|
-
t.cancel()
|
77
|
-
self.logger.debug("Control stream waiting for close")
|
78
|
-
except asyncio.CancelledError as e:
|
79
|
-
self.logger.error("ERROR: Client side disconnected from server.")
|
80
|
-
self.logger.error(repr(e))
|
81
|
-
|
82
|
-
async def _ctrl_read(self, request_iterator) -> None: # type: ignore
|
83
|
-
awaits_response = {"translated_message", "decrypted_password", "dcm_e_response"}
|
84
|
-
async for request in request_iterator:
|
85
|
-
payload = request.WhichOneof("payload")
|
86
|
-
if payload == "plugin_initialization_data": # TODO update this to const
|
87
|
-
try:
|
88
|
-
asyncio.create_task(
|
89
|
-
self.driver._initialize_plugin(
|
90
|
-
request, self.ready_for_records, self.record_batch_received
|
91
|
-
)
|
92
|
-
)
|
93
|
-
except Exception as e:
|
94
|
-
self.logger.error("%s", repr(e))
|
95
|
-
elif payload == "incoming_connection_complete":
|
96
|
-
conn_info = request.incoming_connection_complete
|
97
|
-
closed_anchor = Anchor(conn_info.anchor_name, conn_info.connection_name)
|
98
|
-
self.logger.debug("Pushing incoming connection complete")
|
99
|
-
if (
|
100
|
-
not self.record_batch_received.is_set()
|
101
|
-
): # OOP sends incoming_connection_complete without sending any records
|
102
|
-
self.logger.debug("empty row bug detected")
|
103
|
-
self.record_batch_received.set()
|
104
|
-
self.driver.ctrl_io.push_driver_callback(
|
105
|
-
self.driver.incoming_connection_complete_callback, closed_anchor
|
106
|
-
)
|
107
|
-
elif payload in awaits_response:
|
108
|
-
try:
|
109
|
-
if self.driver.ctrl_io.awaiting_response.get(request.msg_id):
|
110
|
-
self.driver.ctrl_io.push_callback_action(request)
|
111
|
-
else:
|
112
|
-
self.driver.ctrl_io.blocking_awaiting_response[
|
113
|
-
request.msg_id
|
114
|
-
] = getattr(request, payload)
|
115
|
-
except Exception as e:
|
116
|
-
self.logger.debug(repr(e))
|
117
|
-
elif payload == "notify_complete":
|
118
|
-
# Notify the driver to start completion
|
119
|
-
# The server assumes that the client is done sending RecordIn messages.
|
120
|
-
# Client should have sent any incoming records or otherwise at this point.
|
121
|
-
self.driver.ctrl_io.push_driver_callback(
|
122
|
-
self.driver.on_complete_callback
|
123
|
-
)
|
124
|
-
|
125
|
-
async def _ctrl_write(self, context) -> None: # type: ignore
|
126
|
-
while True:
|
127
|
-
msg = await self.driver.ctrl_io.ctrl_out.get()
|
128
|
-
try:
|
129
|
-
await context.write(msg)
|
130
|
-
except Exception as e: # catch ExecuteBatchError if any
|
131
|
-
self.logger.debug(repr(e))
|
132
|
-
self.driver.ctrl_io.ctrl_out.task_done()
|
133
|
-
|
134
|
-
async def _user_callback_worker(self) -> None:
|
135
|
-
while True:
|
136
|
-
action = await self.driver.ctrl_io.ctrl_user_callback_actions.get()
|
137
|
-
loop = asyncio.get_event_loop()
|
138
|
-
try:
|
139
|
-
fn = action["callback_fn"]
|
140
|
-
if action.get("response_msg"):
|
141
|
-
fut = loop.run_in_executor(None, fn, action["response_msg"])
|
142
|
-
else:
|
143
|
-
fut = loop.run_in_executor(None, fn)
|
144
|
-
await fut
|
145
|
-
# Could collect these in order
|
146
|
-
if fut.exception():
|
147
|
-
raise fut.exception() or BaseException()
|
148
|
-
except Exception as e:
|
149
|
-
report_str = (
|
150
|
-
f"Failed while calling {action['callback_fn'].__name__}\n {repr(e)}"
|
151
|
-
)
|
152
|
-
self.logger.error(report_str)
|
153
|
-
self.driver.provider.io.error(report_str)
|
154
|
-
finally:
|
155
|
-
self.driver.ctrl_io.ctrl_user_callback_actions.task_done()
|
156
|
-
|
157
|
-
async def _driver_callback_worker(self) -> None:
|
158
|
-
while True:
|
159
|
-
action = await self.driver.ctrl_io.ctrl_driver_actions.get()
|
160
|
-
|
161
|
-
# Make sure we clear any queued user callbacks
|
162
|
-
await asyncio.sleep(0)
|
163
|
-
await self.driver.ctrl_io.ctrl_user_callback_actions.join()
|
164
|
-
|
165
|
-
is_on_complete = action["driver_fn"] == self.driver.on_complete_callback
|
166
|
-
if is_on_complete:
|
167
|
-
self.logger.debug("got on_complete, checking if need to requeue")
|
168
|
-
self.logger.debug(
|
169
|
-
f"ready for on_complete: {self._ready_for_on_complete()}, record_batch_received.is_set(): {self.record_batch_received.is_set()}"
|
170
|
-
)
|
171
|
-
if (
|
172
|
-
not self._ready_for_on_complete()
|
173
|
-
or not self.record_batch_received.is_set()
|
174
|
-
):
|
175
|
-
self.logger.debug("requeue on_complete")
|
176
|
-
try:
|
177
|
-
await self._requeue_action(
|
178
|
-
action, self.driver.ctrl_io.ctrl_driver_actions
|
179
|
-
)
|
180
|
-
except Exception as e:
|
181
|
-
self.logger.error(e)
|
182
|
-
continue
|
183
|
-
elif self.driver.provider.environment.update_only:
|
184
|
-
async with self.record_teardown:
|
185
|
-
self.record_teardown.notify_all()
|
186
|
-
return
|
187
|
-
loop = asyncio.get_running_loop()
|
188
|
-
if action["args"]:
|
189
|
-
fut = loop.run_in_executor(None, action["driver_fn"], *action["args"])
|
190
|
-
else:
|
191
|
-
# Other plugin methods have no args
|
192
|
-
fut = loop.run_in_executor(None, action["driver_fn"])
|
193
|
-
# Handle any generated work from calling method
|
194
|
-
while fut.done() is False:
|
195
|
-
await asyncio.sleep(0.1)
|
196
|
-
action["event_cb_complete"].set()
|
197
|
-
if fut.exception():
|
198
|
-
# Driver functions still use an error handling wrapper
|
199
|
-
# So we don't have to log here, just teardown
|
200
|
-
async with self.record_teardown:
|
201
|
-
self.record_teardown.notify_all()
|
202
|
-
raise fut.exception() # type: ignore
|
203
|
-
if is_on_complete:
|
204
|
-
async with self.record_teardown:
|
205
|
-
self.record_teardown.notify_all()
|
206
|
-
return
|
207
|
-
|
208
|
-
async def _requeue_action(self, action: dict, queue: asyncio.Queue) -> None:
|
209
|
-
# Put action back on to passed queue.
|
210
|
-
await asyncio.sleep(0)
|
211
|
-
await queue.put(action)
|
212
|
-
queue.task_done()
|
213
|
-
|
214
|
-
def _ready_for_on_complete(self) -> bool:
|
215
|
-
pre_complete_actions = self.driver.ctrl_io.ctrl_driver_actions.empty()
|
216
|
-
pending_record_batches = self.driver.record_io.completed_streams.empty()
|
217
|
-
awaiting_responses = len(self.driver.ctrl_io.awaiting_response) < 1
|
218
|
-
return all([pre_complete_actions, pending_record_batches, awaiting_responses])
|
219
|
-
|
220
|
-
async def RecordTransfer(self, request_iterator, context): # type: ignore # noqa: N802
|
221
|
-
"""
|
222
|
-
Definition for gRPC RecordTransfer.
|
223
|
-
|
224
|
-
Consumes any data sent by the client, then send any pending RecordTransferOut messages.
|
225
|
-
"""
|
226
|
-
self.logger.debug("Record Transfer stream starting.")
|
227
|
-
tasks = [
|
228
|
-
asyncio.create_task(
|
229
|
-
self._record_read(request_iterator), name="_record_read"
|
230
|
-
),
|
231
|
-
asyncio.create_task(self._record_write(context), name="_record_write"),
|
232
|
-
asyncio.create_task(
|
233
|
-
self._record_driver_actions(), name="_record_driver_actions"
|
234
|
-
),
|
235
|
-
]
|
236
|
-
async with self.record_teardown:
|
237
|
-
self.logger.debug("Waiting on teardown notification")
|
238
|
-
await self.record_teardown.wait()
|
239
|
-
await asyncio.sleep(0)
|
240
|
-
self.logger.debug("Received teardown notice. Cancelling tasks")
|
241
|
-
try:
|
242
|
-
for _, anchor in self.driver.provider.outgoing_anchors.items():
|
243
|
-
if (
|
244
|
-
anchor["num_connections"] > 0 or anchor.get("metadata")
|
245
|
-
) and not self.driver.provider.environment.update_only:
|
246
|
-
rec_out_chunk_end = RecordTransferOut()
|
247
|
-
rec_out_chunk_end.close_outgoing_anchor.name = anchor["name"]
|
248
|
-
self.driver.record_io.pending_writes.put_nowait(
|
249
|
-
{
|
250
|
-
"write_type": "close_outgoing_anchor",
|
251
|
-
"message": rec_out_chunk_end,
|
252
|
-
}
|
253
|
-
)
|
254
|
-
|
255
|
-
await self.driver.record_io.flush()
|
256
|
-
for t in tasks:
|
257
|
-
t.cancel()
|
258
|
-
except Exception as e:
|
259
|
-
self.logger.debug(repr(e))
|
260
|
-
async with self.cond_teardown:
|
261
|
-
self.cond_teardown.notify_all()
|
262
|
-
self.logger.debug("Exiting RecordTransfer...")
|
263
|
-
|
264
|
-
async def _record_read(self, request_iterator) -> None: # type: ignore
|
265
|
-
"""Receive any RecordTransferIn messages from the client."""
|
266
|
-
async for req in request_iterator:
|
267
|
-
payload = req.WhichOneof("payload")
|
268
|
-
if payload == "incoming_records":
|
269
|
-
self.driver.record_io.receive_chunk(req)
|
270
|
-
|
271
|
-
async def _record_write(self, context) -> None: # type: ignore
|
272
|
-
"""Write and send RecordTransferOut.outgoing_records from write queue."""
|
273
|
-
while True:
|
274
|
-
# If user has written to buffer, send records
|
275
|
-
to_write = await self.driver.record_io.pending_writes.get()
|
276
|
-
if to_write["write_type"] == "outgoing_records":
|
277
|
-
for msg in self.driver.record_io.get_stream_msgs(to_write):
|
278
|
-
await context.write(msg)
|
279
|
-
else:
|
280
|
-
try:
|
281
|
-
anchor = self.driver.provider.outgoing_anchors[
|
282
|
-
to_write["message"].close_outgoing_anchor.name
|
283
|
-
]
|
284
|
-
if (
|
285
|
-
anchor["num_connections"] > 0
|
286
|
-
and not anchor.get("metadata", False)
|
287
|
-
) and not self.driver.provider.environment.update_only:
|
288
|
-
self.logger.debug("Wrote close anchor")
|
289
|
-
await context.write(to_write["message"])
|
290
|
-
except Exception as e:
|
291
|
-
self.logger.error("Failed during record_write: %s", repr(e))
|
292
|
-
self.driver.record_io.pending_writes.task_done()
|
293
|
-
|
294
|
-
async def _record_driver_actions(self) -> None:
|
295
|
-
"""Handle events related to receiving or sending batches."""
|
296
|
-
while True:
|
297
|
-
batch_item = await self.driver.record_io.completed_streams.get()
|
298
|
-
self.logger.debug(f"Got a msg from completed_streams queue: {batch_item}")
|
299
|
-
await self.ready_for_records.wait() # wait for plugin_init to finish before calling on_record_batch
|
300
|
-
self.driver.ctrl_io.push_driver_callback(
|
301
|
-
self.driver.record_batch_received,
|
302
|
-
batch_item["record_batch"],
|
303
|
-
batch_item["anchor"],
|
304
|
-
)
|
305
|
-
self.record_batch_received.set()
|
306
|
-
self.driver.record_io.completed_streams.task_done()
|
@@ -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
|
-
"""Resources to be consumed by the amp provider."""
|
@@ -1,22 +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
|
-
"""Workspace constant definitions."""
|
15
|
-
from enum import Enum
|
16
|
-
|
17
|
-
|
18
|
-
class ToolEnvType(str, Enum):
|
19
|
-
"""YXI installation types."""
|
20
|
-
|
21
|
-
Desktop = "Desktop"
|
22
|
-
Service = "Service"
|
@@ -1,55 +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
|
-
"""Conversion methods for AMP Provider classes."""
|
15
|
-
from datetime import date, datetime, timedelta
|
16
|
-
|
17
|
-
from another_ayx_python_sdk.providers.amp_provider.amp_provider_v2 import AMPProviderV2
|
18
|
-
|
19
|
-
import deprecation
|
20
|
-
|
21
|
-
from pyarrow import Date32Scalar, int32
|
22
|
-
|
23
|
-
|
24
|
-
# Alteryx Epoch is based closely on Excel's, not UNIX
|
25
|
-
ALTERYX_DATE32_EPOCH = datetime(1900, 1, 1, 0, 0)
|
26
|
-
|
27
|
-
|
28
|
-
@deprecation.deprecated(
|
29
|
-
deprecated_in="2.1.1",
|
30
|
-
details="This function is no more necessary since version 2022.2 of Designer",
|
31
|
-
) # type: ignore
|
32
|
-
def arrow_scalar_date32_to_py(
|
33
|
-
provider: AMPProviderV2, arrow_date: Date32Scalar
|
34
|
-
) -> date:
|
35
|
-
"""
|
36
|
-
Convert a Arrow Date32Scalar to a Python datetime object.
|
37
|
-
|
38
|
-
Parameters
|
39
|
-
----------
|
40
|
-
provider
|
41
|
-
AMPProviderV2 context, necessary for Designer version
|
42
|
-
arrow_date
|
43
|
-
An Arrow date represented as days since Epoch.
|
44
|
-
|
45
|
-
Returns
|
46
|
-
-------
|
47
|
-
date
|
48
|
-
The converted date value.
|
49
|
-
"""
|
50
|
-
if provider.environment.designer_version < "2022.2":
|
51
|
-
return (
|
52
|
-
ALTERYX_DATE32_EPOCH + timedelta(arrow_date.cast(int32()).as_py() - 2)
|
53
|
-
).date()
|
54
|
-
else:
|
55
|
-
return arrow_date.as_py()
|
@@ -1,63 +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
|
-
"""Utility methods for AMP Provider classes."""
|
15
|
-
import logging
|
16
|
-
import os
|
17
|
-
import uuid
|
18
|
-
from pathlib import Path
|
19
|
-
|
20
|
-
|
21
|
-
from another_ayx_python_sdk.providers.amp_provider.utilities.constants import ToolEnvType
|
22
|
-
|
23
|
-
logger = logging.getLogger()
|
24
|
-
|
25
|
-
|
26
|
-
def tool_type() -> ToolEnvType:
|
27
|
-
"""Determine the Tool Environment Type based on TOOL_SERVICE_ADDRESS env var."""
|
28
|
-
return (
|
29
|
-
ToolEnvType.Service
|
30
|
-
if "TOOL_SERVICE_ADDRESS" in os.environ
|
31
|
-
else ToolEnvType.Desktop
|
32
|
-
)
|
33
|
-
|
34
|
-
|
35
|
-
def get_temp_file(extension: str = "tmp", temp_dir: str = "./") -> "Path":
|
36
|
-
"""
|
37
|
-
Create a temporary file managed by Designer.
|
38
|
-
|
39
|
-
Parameters
|
40
|
-
----------
|
41
|
-
extension
|
42
|
-
The file extension of the temp file.
|
43
|
-
temp_dir
|
44
|
-
Directory in which to place the temp file.
|
45
|
-
|
46
|
-
Returns
|
47
|
-
-------
|
48
|
-
Path
|
49
|
-
The path to where the temp file is.
|
50
|
-
"""
|
51
|
-
temp_file_name = f"temp-file-{str(uuid.uuid4())}.{str(extension)}"
|
52
|
-
engine_temp_dir = temp_dir
|
53
|
-
temp_file_path = Path(engine_temp_dir) / (temp_file_name)
|
54
|
-
try:
|
55
|
-
temp_file_path.touch()
|
56
|
-
except FileNotFoundError:
|
57
|
-
# path does not exist
|
58
|
-
logger.error("Engine.TempFilePath (%s) does not exist", engine_temp_dir)
|
59
|
-
except IOError:
|
60
|
-
# path exists but no write permissions
|
61
|
-
logger.error("No write permissions for directory %s", engine_temp_dir)
|
62
|
-
|
63
|
-
return Path(temp_file_path)
|
@@ -1,36 +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
|
-
"""E1 SDK Provider interface."""
|
15
|
-
# flake8: noqa
|
16
|
-
|
17
|
-
from .cache_e1_sdk_import import cache_e1_sdk_import
|
18
|
-
|
19
|
-
cache_e1_sdk_import()
|
20
|
-
|
21
|
-
from .e1_environment import E1Environment
|
22
|
-
from .e1_input_anchor import E1InputAnchor
|
23
|
-
from .e1_io import E1IO
|
24
|
-
from .e1_output_anchor import E1OutputAnchor
|
25
|
-
from .e1_plugin_proxy import E1PluginProxy
|
26
|
-
from .e1_provider import E1Provider
|
27
|
-
|
28
|
-
|
29
|
-
__all__ = [
|
30
|
-
"E1PluginProxy",
|
31
|
-
"E1Environment",
|
32
|
-
"E1InputAnchor",
|
33
|
-
"E1IO",
|
34
|
-
"E1OutputAnchor",
|
35
|
-
"E1Provider",
|
36
|
-
]
|
@@ -1,95 +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 tool configuration definition."""
|
15
|
-
from typing import Any, Dict, List
|
16
|
-
|
17
|
-
from another_ayx_python_sdk.providers.e1_provider.mock_e1_sdk.AlteryxPythonSDK import OutputAnchorManager
|
18
|
-
|
19
|
-
from another_ayx_python_sdk.providers.e1_provider.e1_input_anchor_proxy import (
|
20
|
-
E1InputAnchorProxy,
|
21
|
-
)
|
22
|
-
from another_ayx_python_sdk.providers.e1_provider.e1_output_anchor_proxy import (
|
23
|
-
E1OutputAnchorProxy,
|
24
|
-
)
|
25
|
-
|
26
|
-
|
27
|
-
class AnchorBuilder:
|
28
|
-
"""Anchor builder definition."""
|
29
|
-
|
30
|
-
__slots__ = ["tool_config", "output_anchor_mgr"]
|
31
|
-
|
32
|
-
def __init__(
|
33
|
-
self, tool_config: Dict[str, Any], output_anchor_mgr: OutputAnchorManager
|
34
|
-
):
|
35
|
-
"""Initialize a tool configuration."""
|
36
|
-
self.tool_config = tool_config
|
37
|
-
self.output_anchor_mgr = output_anchor_mgr
|
38
|
-
|
39
|
-
def build_input_anchors(self) -> List[E1InputAnchorProxy]:
|
40
|
-
"""Build the input anchors based on tool config settings."""
|
41
|
-
anchor_settings = self.tool_config["AlteryxJavaScriptPlugin"]["GuiSettings"]
|
42
|
-
|
43
|
-
input_anchors = anchor_settings.get("InputConnections")
|
44
|
-
if not isinstance(input_anchors, dict):
|
45
|
-
input_anchor_configs: List[Dict] = []
|
46
|
-
else:
|
47
|
-
input_anchor_configs_raw = input_anchors.get("Connection")
|
48
|
-
if not isinstance(input_anchor_configs_raw, dict) and not isinstance(
|
49
|
-
input_anchor_configs_raw, list
|
50
|
-
):
|
51
|
-
input_anchor_configs = []
|
52
|
-
else:
|
53
|
-
if not isinstance(input_anchor_configs_raw, list):
|
54
|
-
input_anchor_configs = [input_anchor_configs_raw]
|
55
|
-
else:
|
56
|
-
input_anchor_configs = input_anchor_configs_raw
|
57
|
-
|
58
|
-
return [
|
59
|
-
E1InputAnchorProxy(
|
60
|
-
config["@Name"],
|
61
|
-
config.get("@AllowMultiple", "false").lower() == "true",
|
62
|
-
config["@Optional"].lower() == "true",
|
63
|
-
)
|
64
|
-
for config in input_anchor_configs
|
65
|
-
]
|
66
|
-
|
67
|
-
def build_output_anchors(self) -> List[E1OutputAnchorProxy]:
|
68
|
-
"""Build the output anchors based on tool config settings."""
|
69
|
-
anchor_settings = self.tool_config["AlteryxJavaScriptPlugin"]["GuiSettings"]
|
70
|
-
|
71
|
-
output_anchors = anchor_settings.get("OutputConnections")
|
72
|
-
|
73
|
-
if not isinstance(output_anchors, dict):
|
74
|
-
output_anchor_configs: List[Dict] = []
|
75
|
-
else:
|
76
|
-
output_anchor_configs_raw = output_anchors.get("Connection")
|
77
|
-
if not isinstance(output_anchor_configs_raw, dict) and not isinstance(
|
78
|
-
output_anchor_configs_raw, list
|
79
|
-
):
|
80
|
-
output_anchor_configs = []
|
81
|
-
else:
|
82
|
-
if not isinstance(output_anchor_configs_raw, list):
|
83
|
-
output_anchor_configs = [output_anchor_configs_raw]
|
84
|
-
else:
|
85
|
-
output_anchor_configs = output_anchor_configs_raw
|
86
|
-
|
87
|
-
return [
|
88
|
-
E1OutputAnchorProxy(
|
89
|
-
config["@Name"],
|
90
|
-
config.get("@AllowMultiple", "true").lower() == "true",
|
91
|
-
config["@Optional"].lower() == "true",
|
92
|
-
self.output_anchor_mgr,
|
93
|
-
)
|
94
|
-
for config in output_anchor_configs
|
95
|
-
]
|
@@ -1,31 +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
|
-
"""Get the E1 package."""
|
15
|
-
import sys
|
16
|
-
from pathlib import Path
|
17
|
-
|
18
|
-
|
19
|
-
def cache_e1_sdk_import() -> None:
|
20
|
-
"""
|
21
|
-
Cache the import for the E1 SDK.
|
22
|
-
|
23
|
-
This is necessary in order to remove the dependency on the
|
24
|
-
AlteryxPythonSDK package.
|
25
|
-
"""
|
26
|
-
try:
|
27
|
-
import another_ayx_python_sdk.providers.e1_provider.mock_e1_sdk.AlteryxPythonSDK as AlteryxPythonSDK # noqa: F401
|
28
|
-
except ModuleNotFoundError:
|
29
|
-
mock_e1_sdk_package_dir = Path(__file__).parent / "mock_e1_sdk"
|
30
|
-
sys.path.append(str(mock_e1_sdk_package_dir))
|
31
|
-
import another_ayx_python_sdk.providers.e1_provider.mock_e1_sdk.AlteryxPythonSDK as AlteryxPythonSDK # noqa: F401
|