omnata-plugin-runtime 0.5.7a148__tar.gz → 0.5.7a150__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {omnata_plugin_runtime-0.5.7a148 → omnata_plugin_runtime-0.5.7a150}/PKG-INFO +1 -1
- {omnata_plugin_runtime-0.5.7a148 → omnata_plugin_runtime-0.5.7a150}/pyproject.toml +1 -1
- {omnata_plugin_runtime-0.5.7a148 → omnata_plugin_runtime-0.5.7a150}/src/omnata_plugin_runtime/omnata_plugin.py +73 -52
- {omnata_plugin_runtime-0.5.7a148 → omnata_plugin_runtime-0.5.7a150}/LICENSE +0 -0
- {omnata_plugin_runtime-0.5.7a148 → omnata_plugin_runtime-0.5.7a150}/README.md +0 -0
- {omnata_plugin_runtime-0.5.7a148 → omnata_plugin_runtime-0.5.7a150}/src/omnata_plugin_runtime/__init__.py +0 -0
- {omnata_plugin_runtime-0.5.7a148 → omnata_plugin_runtime-0.5.7a150}/src/omnata_plugin_runtime/api.py +0 -0
- {omnata_plugin_runtime-0.5.7a148 → omnata_plugin_runtime-0.5.7a150}/src/omnata_plugin_runtime/configuration.py +0 -0
- {omnata_plugin_runtime-0.5.7a148 → omnata_plugin_runtime-0.5.7a150}/src/omnata_plugin_runtime/forms.py +0 -0
- {omnata_plugin_runtime-0.5.7a148 → omnata_plugin_runtime-0.5.7a150}/src/omnata_plugin_runtime/logging.py +0 -0
- {omnata_plugin_runtime-0.5.7a148 → omnata_plugin_runtime-0.5.7a150}/src/omnata_plugin_runtime/plugin_entrypoints.py +0 -0
- {omnata_plugin_runtime-0.5.7a148 → omnata_plugin_runtime-0.5.7a150}/src/omnata_plugin_runtime/rate_limiting.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
[tool.poetry]
|
2
2
|
name = "omnata-plugin-runtime"
|
3
|
-
version = "0.5.7-
|
3
|
+
version = "0.5.7-a150"
|
4
4
|
description = "Classes and common runtime components for building and running Omnata Plugins"
|
5
5
|
authors = ["James Weakley <james.weakley@omnata.com>"]
|
6
6
|
readme = "README.md"
|
@@ -2381,56 +2381,68 @@ def omnata_udtf(
|
|
2381
2381
|
"""
|
2382
2382
|
def class_decorator(cls):
|
2383
2383
|
# Get the original 'process' method from the class
|
2384
|
+
if not hasattr(cls, 'process'):
|
2385
|
+
raise ValueError("The class must have a 'process' method.")
|
2384
2386
|
original_process = getattr(cls, 'process')
|
2385
2387
|
sig = signature(original_process)
|
2386
2388
|
function_params = sig.parameters
|
2387
|
-
if len(function_params) <
|
2388
|
-
raise ValueError("The function must have
|
2389
|
-
|
2389
|
+
if len(function_params) < 1:
|
2390
|
+
raise ValueError("The 'process' function must have at least one parameter.")
|
2391
|
+
|
2390
2392
|
first_param_name = list(function_params.keys())[0]
|
2391
|
-
|
2392
2393
|
if first_param_name != 'self':
|
2393
|
-
raise ValueError(f"The first argument should be 'self', instead it was '{first_param_name}'.")
|
2394
|
+
raise ValueError(f"The first argument for the 'process' function should be 'self', instead it was '{first_param_name}'.")
|
2394
2395
|
|
2395
|
-
|
2396
|
+
cls._is_omnata_udtf = True
|
2397
|
+
cls._omnata_udtf_name = name
|
2398
|
+
cls._omnata_udtf_description = description
|
2399
|
+
cls._omnata_udtf_params = params
|
2400
|
+
cls._omnata_udtf_result_columns = result_columns
|
2401
|
+
cls._omnata_udtf_expose_to_consumer = expose_to_consumer
|
2396
2402
|
|
2403
|
+
if not expose_to_consumer:
|
2404
|
+
# If not exposing to the consumer, there are no further requirements
|
2405
|
+
return cls
|
2406
|
+
|
2407
|
+
if len(function_params) < 2:
|
2408
|
+
raise ValueError("When exposing the udtf to consumers, the 'process' function must have the self parameter, plus at least the mandatory 'connection_parameters' parameter.")
|
2409
|
+
second_param_name = list(function_params.keys())[1]
|
2397
2410
|
if second_param_name != 'connection_parameters':
|
2398
2411
|
raise ValueError(f"The second argument should be 'connection_parameters', instead it was {second_param_name}.")
|
2399
|
-
|
2400
|
-
|
2401
2412
|
if function_params[second_param_name].annotation != ConnectionConfigurationParameters:
|
2402
2413
|
raise ValueError(f"The second argument must be a ConnectionConfigurationParameters, instead it was a {function_params[second_param_name].annotation}.")
|
2403
2414
|
|
2404
|
-
|
2405
|
-
|
2406
|
-
|
2407
|
-
|
2415
|
+
if params[0].name.upper() != 'CONNECTION_PARAMETERS':
|
2416
|
+
params_new = [SnowflakeFunctionParameter(
|
2417
|
+
name='CONNECTION_PARAMETERS',
|
2418
|
+
data_type='OBJECT',
|
2419
|
+
description='The connection object, obtained from calling PLUGIN.PLUGIN_CONNECTION.')] + params
|
2420
|
+
cls._omnata_udtf_params = params_new
|
2421
|
+
if len(params) != len(function_params) -1:
|
2422
|
+
raise ValueError(f"You must document all the parameters of the 'process' function in the @omnata_udtf decorator in the same order ('connection_parameters' will be included automatically).")
|
2408
2423
|
|
2424
|
+
@wraps(original_process)
|
2425
|
+
def wrapped_process(self, connection_parameter_arg, *args, **kwargs):
|
2426
|
+
if connection_parameter_arg is None:
|
2427
|
+
raise ValueError("Connection not found")
|
2428
|
+
|
2409
2429
|
# convert the connection parameters dictionary to a ConnectionConfigurationParameters object which includes the real secrets
|
2410
|
-
if 'other_secrets_name' in
|
2430
|
+
if 'other_secrets_name' in connection_parameter_arg:
|
2411
2431
|
# this is the new way, where the sync engine only passes the name of the secret
|
2412
2432
|
oauth_secrets_name = None
|
2413
|
-
if 'oauth_secret_name' in
|
2414
|
-
oauth_secrets_name =
|
2415
|
-
del
|
2416
|
-
result = get_secrets(oauth_secrets_name,
|
2417
|
-
|
2418
|
-
del
|
2419
|
-
|
2420
|
-
|
2421
|
-
# deprecated way, where the sync engine passes the secrets directly
|
2422
|
-
parameters = ConnectionConfigurationParameters.model_validate(connection_parameters)
|
2433
|
+
if 'oauth_secret_name' in connection_parameter_arg:
|
2434
|
+
oauth_secrets_name = connection_parameter_arg['oauth_secret_name']
|
2435
|
+
del connection_parameter_arg['oauth_secret_name']
|
2436
|
+
result = get_secrets(oauth_secrets_name,connection_parameter_arg['other_secrets_name'])
|
2437
|
+
connection_parameter_arg['connection_secrets'] = result
|
2438
|
+
del connection_parameter_arg['other_secrets_name']
|
2439
|
+
|
2440
|
+
parameters = ConnectionConfigurationParameters.model_validate(connection_parameter_arg)
|
2423
2441
|
|
2424
2442
|
# Pass the validated arguments to the function
|
2425
2443
|
return original_process(self, parameters, *args, **kwargs)
|
2426
2444
|
# Replace the original 'process' method with the wrapped version
|
2427
2445
|
setattr(cls, 'process', wrapped_process)
|
2428
|
-
cls._is_omnata_udtf = True
|
2429
|
-
cls._omnata_udtf_name = name
|
2430
|
-
cls._omnata_udtf_description = description
|
2431
|
-
cls._omnata_udtf_params = params
|
2432
|
-
cls._omnata_udtf_result_columns = result_columns
|
2433
|
-
cls._omnata_udtf_expose_to_consumer = expose_to_consumer
|
2434
2446
|
return cls
|
2435
2447
|
|
2436
2448
|
return class_decorator
|
@@ -2457,9 +2469,7 @@ def find_udtf_classes(path:str = '.') -> List[PythonUDTFDefinition | JavaUDTFDef
|
|
2457
2469
|
matching_classes.append(PythonUDTFDefinition(
|
2458
2470
|
name=obj._omnata_udtf_name,
|
2459
2471
|
description=obj._omnata_udtf_description,
|
2460
|
-
params=
|
2461
|
-
data_type='OBJECT',
|
2462
|
-
description='The connection object, obtained from calling PLUGIN.PLUGIN_CONNECTION')]+obj._omnata_udtf_params,
|
2472
|
+
params=obj._omnata_udtf_params,
|
2463
2473
|
result_columns=obj._omnata_udtf_result_columns,
|
2464
2474
|
expose_to_consumer=obj._omnata_udtf_expose_to_consumer,
|
2465
2475
|
handler=obj.__module__+'.'+obj.__name__
|
@@ -2477,11 +2487,22 @@ def omnata_udf(
|
|
2477
2487
|
result_data_type: str,
|
2478
2488
|
expose_to_consumer: bool):
|
2479
2489
|
"""
|
2480
|
-
A decorator for a function which
|
2490
|
+
A decorator for a function which will be created in the native application.
|
2481
2491
|
"""
|
2482
2492
|
def decorator(func):
|
2483
2493
|
sig = signature(func)
|
2484
2494
|
function_params = sig.parameters
|
2495
|
+
|
2496
|
+
if not expose_to_consumer:
|
2497
|
+
# If not exposing to the consumer, there are no further requirements
|
2498
|
+
func._is_omnata_udf = True
|
2499
|
+
func._omnata_udf_name = name
|
2500
|
+
func._omnata_udf_description = description
|
2501
|
+
func._omnata_udf_params = params
|
2502
|
+
func._omnata_udf_result_data_type = result_data_type
|
2503
|
+
func._omnata_udf_expose_to_consumer = expose_to_consumer
|
2504
|
+
return func
|
2505
|
+
|
2485
2506
|
if len(function_params) == 0:
|
2486
2507
|
raise ValueError("The function must have at least one parameter.")
|
2487
2508
|
# Ensure the first argument is mandatory and positional
|
@@ -2490,27 +2511,29 @@ def omnata_udf(
|
|
2490
2511
|
raise ValueError(f"The first argument should be 'connection_parameters', instead it was '{first_param_name}'.")
|
2491
2512
|
if function_params[first_param_name].annotation != ConnectionConfigurationParameters:
|
2492
2513
|
raise ValueError(f"The first argument must be a ConnectionConfigurationParameters, instead it was a {function_params[first_param_name].annotation}.")
|
2514
|
+
if params[0].name.upper() != 'CONNECTION_PARAMETERS':
|
2515
|
+
params_new = [SnowflakeFunctionParameter(
|
2516
|
+
name='CONNECTION_PARAMETERS',
|
2517
|
+
data_type='OBJECT',
|
2518
|
+
description='The connection object, obtained from calling PLUGIN.PLUGIN_CONNECTION.')] + params
|
2519
|
+
func._omnata_udf_params = params_new
|
2520
|
+
if len(params_new) != len(function_params):
|
2521
|
+
raise ValueError(f"You must document all the parameters of the function in the @omnata_udf decorator in the same order ('connection_parameters' will be included automatically).")
|
2493
2522
|
|
2494
2523
|
@wraps(func)
|
2495
|
-
def wrapper(
|
2496
|
-
if connection_parameters is None:
|
2497
|
-
raise ValueError("Connection not found")
|
2498
|
-
|
2499
|
-
|
2524
|
+
def wrapper(connection_parameter_arg, *args, **kwargs):
|
2500
2525
|
# convert the connection parameters dictionary to a ConnectionConfigurationParameters object which includes the real secrets
|
2501
|
-
if 'other_secrets_name' in
|
2526
|
+
if 'other_secrets_name' in connection_parameter_arg:
|
2502
2527
|
# this is the new way, where the sync engine only passes the name of the secret
|
2503
2528
|
oauth_secrets_name = None
|
2504
|
-
if 'oauth_secret_name' in
|
2505
|
-
oauth_secrets_name =
|
2506
|
-
del
|
2507
|
-
result = get_secrets(oauth_secrets_name,
|
2508
|
-
|
2509
|
-
del
|
2510
|
-
|
2511
|
-
|
2512
|
-
# deprecated way, where the sync engine passes the secrets directly
|
2513
|
-
parameters = ConnectionConfigurationParameters.model_validate(connection_parameters)
|
2529
|
+
if 'oauth_secret_name' in connection_parameter_arg:
|
2530
|
+
oauth_secrets_name = connection_parameter_arg['oauth_secret_name']
|
2531
|
+
del connection_parameter_arg['oauth_secret_name']
|
2532
|
+
result = get_secrets(oauth_secrets_name,connection_parameter_arg['other_secrets_name'])
|
2533
|
+
connection_parameter_arg['connection_secrets'] = result
|
2534
|
+
del connection_parameter_arg['other_secrets_name']
|
2535
|
+
|
2536
|
+
parameters = ConnectionConfigurationParameters.model_validate(connection_parameter_arg)
|
2514
2537
|
|
2515
2538
|
# Pass the validated arguments to the function
|
2516
2539
|
return func(parameters, *args, **kwargs)
|
@@ -2547,9 +2570,7 @@ def find_udf_functions(path:str = '.') -> List[PythonUDFDefinition | JavaUDFDefi
|
|
2547
2570
|
matching_classes.append(PythonUDFDefinition(
|
2548
2571
|
name=obj._omnata_udf_name,
|
2549
2572
|
description=obj._omnata_udf_description,
|
2550
|
-
params=
|
2551
|
-
data_type='OBJECT',
|
2552
|
-
description='The connection object, obtained from calling PLUGIN.PLUGIN_CONNECTION')] + obj._omnata_udf_params,
|
2573
|
+
params=obj._omnata_udf_params,
|
2553
2574
|
result_data_type=obj._omnata_udf_result_data_type,
|
2554
2575
|
expose_to_consumer=obj._omnata_udf_expose_to_consumer,
|
2555
2576
|
packages=[],
|
File without changes
|
File without changes
|
File without changes
|
{omnata_plugin_runtime-0.5.7a148 → omnata_plugin_runtime-0.5.7a150}/src/omnata_plugin_runtime/api.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|