omnata-plugin-runtime 0.5.7a132__py3-none-any.whl → 0.5.7a134__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -38,6 +38,7 @@ import jinja2
38
38
  import pandas
39
39
  from pydantic_core import to_jsonable_python
40
40
  from pydantic import Field, TypeAdapter, ValidationError, create_model, root_validator, BaseModel
41
+ from pydantic.dataclasses import dataclass
41
42
  from dateutil.parser import parse
42
43
  from jinja2 import Environment
43
44
  from snowflake.connector.pandas_tools import write_pandas
@@ -2228,7 +2229,25 @@ def get_nested_value(nested_dict:Dict, keys:List[str]):
2228
2229
  keys = [keys]
2229
2230
  return reduce(lambda d, key: d.get(key) if isinstance(d, dict) else None, keys, nested_dict)
2230
2231
 
2231
- def consumer_udtf(param_docs: Dict[str, Dict[str, Any]]):
2232
+
2233
+ @dataclass
2234
+ class SnowflakeFunctionParameter:
2235
+ arg_name: str
2236
+ description: str
2237
+ arg_data_type: str
2238
+ has_default_value: bool = False
2239
+ default_value_clause: Optional[str] = None
2240
+
2241
+ @dataclass
2242
+ class SnowflakeUDTFResultColumn:
2243
+ column_name: str
2244
+ column_data_type: str
2245
+ description: str
2246
+
2247
+ def consumer_udtf(
2248
+ description: str,
2249
+ params: List[SnowflakeFunctionParameter],
2250
+ result_columns: List[SnowflakeUDTFResultColumn]):
2232
2251
  def class_decorator(cls):
2233
2252
  # Get the original 'process' method from the class
2234
2253
  cls._is_omnata_consumer_udtf = True
@@ -2242,21 +2261,14 @@ def consumer_udtf(param_docs: Dict[str, Dict[str, Any]]):
2242
2261
 
2243
2262
  if list(params.keys())[1] != 'connection_parameters':
2244
2263
  raise ValueError("The second argument should be 'connection_parameters'.")
2245
-
2246
- # Create a Pydantic model based on the function signature and the provided documentation
2247
- fields = {
2248
- name: (param.annotation, param_docs.get(name, {}).get("default", param.default))
2249
- for name, param in params.items()
2250
- if name != 'cls' and name != 'connection_parameters'
2251
- }
2264
+
2265
+ if params[list(params.keys())[1]].annotation != Dict:
2266
+ raise ValueError("The second argument must be a dict.")
2252
2267
 
2253
2268
  @wraps(original_process)
2254
2269
  def wrapped_process(self, connection_parameters, *args, **kwargs):
2255
2270
  if connection_parameters is None:
2256
2271
  raise ValueError("Connection not found")
2257
-
2258
- if not isinstance(connection_parameters, Dict):
2259
- raise ValueError("The first argument must be an object, the result of calling PLUGIN_CONNECTION.")
2260
2272
 
2261
2273
  # convert the connection parameters dictionary to a ConnectionConfigurationParameters object which includes the real secrets
2262
2274
  if 'other_secrets_name' in connection_parameters:
@@ -2282,7 +2294,7 @@ def consumer_udtf(param_docs: Dict[str, Dict[str, Any]]):
2282
2294
 
2283
2295
  return class_decorator
2284
2296
 
2285
- def find_classes_with_attribute(attribute_name: str,path:str = '.'):
2297
+ def find_consumer_udtf_classes(path:str = '.'):
2286
2298
  # Get the directory's absolute path
2287
2299
  current_dir = os.path.abspath(path)
2288
2300
 
@@ -2297,11 +2309,15 @@ def find_classes_with_attribute(attribute_name: str,path:str = '.'):
2297
2309
  # Iterate over all members of the module
2298
2310
  for name, obj in inspect.getmembers(module, inspect.isclass):
2299
2311
  # Check if the class has the specified attribute
2300
- if hasattr(obj, attribute_name):
2312
+ if hasattr(obj, '_is_omnata_consumer_udtf'):
2301
2313
  matching_classes.append(obj)
2314
+ return matching_classes
2302
2315
 
2303
2316
 
2304
- def consumer_udf(param_docs: Dict[str, Dict[str, Any]]):
2317
+ def consumer_udf(
2318
+ description: str,
2319
+ params: List[SnowflakeFunctionParameter],
2320
+ result_data_type: str):
2305
2321
  def decorator(func):
2306
2322
  sig = signature(func)
2307
2323
  params = sig.parameters
@@ -2309,14 +2325,14 @@ def consumer_udf(param_docs: Dict[str, Dict[str, Any]]):
2309
2325
  # Ensure the first argument is mandatory and positional
2310
2326
  if list(params.keys())[0] != 'connection_parameters':
2311
2327
  raise ValueError("The first argument should be 'connection_parameters'.")
2328
+ if params[list(params.keys())[0]].annotation != Dict:
2329
+ raise ValueError("The first argument must be a dict.")
2312
2330
 
2313
2331
  @wraps(func)
2314
2332
  def wrapper(self, connection_parameters, *args, **kwargs):
2315
2333
  if connection_parameters is None:
2316
2334
  raise ValueError("Connection not found")
2317
2335
 
2318
- if not isinstance(connection_parameters, Dict):
2319
- raise ValueError("The first argument must be an object, the result of calling PLUGIN_CONNECTION.")
2320
2336
 
2321
2337
  # convert the connection parameters dictionary to a ConnectionConfigurationParameters object which includes the real secrets
2322
2338
  if 'other_secrets_name' in connection_parameters:
@@ -2340,3 +2356,23 @@ def consumer_udf(param_docs: Dict[str, Dict[str, Any]]):
2340
2356
  return wrapper
2341
2357
 
2342
2358
  return decorator
2359
+
2360
+ def find_consumer_udf_functions(path:str = '.'):
2361
+ # Get the current directory's absolute path
2362
+ current_dir = os.path.abspath(path)
2363
+
2364
+ # List to hold the classes that match the attribute
2365
+ matching_classes = []
2366
+
2367
+ # Iterate over all modules in the current directory
2368
+ for _, module_name, _ in pkgutil.iter_modules([current_dir]):
2369
+ # Import the module
2370
+ module = importlib.import_module(module_name)
2371
+
2372
+ # Iterate over all members of the module
2373
+ for name, obj in inspect.getmembers(module, inspect.isfunction):
2374
+ # Check if the class has the specified attribute
2375
+ if hasattr(obj, '_is_omnata_consumer_udf'):
2376
+ matching_classes.append(obj)
2377
+
2378
+ return matching_classes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omnata-plugin-runtime
3
- Version: 0.5.7a132
3
+ Version: 0.5.7a134
4
4
  Summary: Classes and common runtime components for building and running Omnata Plugins
5
5
  Author: James Weakley
6
6
  Author-email: james.weakley@omnata.com
@@ -3,10 +3,10 @@ omnata_plugin_runtime/api.py,sha256=FxzTqri4no8ClkOm7vZADG8aD47jcGBCTTQDEORmOJM,
3
3
  omnata_plugin_runtime/configuration.py,sha256=TI6GaVFhewVawBCaYN34GujY57qEP6q2nik4YpSEk5s,38100
4
4
  omnata_plugin_runtime/forms.py,sha256=GzSPEwcijsoPCXEO1mHiE8ylvX_KSE5TkhwqkymA2Ss,19755
5
5
  omnata_plugin_runtime/logging.py,sha256=bn7eKoNWvtuyTk7RTwBS9UARMtqkiICtgMtzq3KA2V0,3272
6
- omnata_plugin_runtime/omnata_plugin.py,sha256=eV1QKOqdxktkVB3ZEQPS7A9a9q7UOsyEhfyZ-JwV5iw,117231
6
+ omnata_plugin_runtime/omnata_plugin.py,sha256=WgdUO5PvwwhekdB-hSLr_4hqjK--BXmm6G3opgeDMA8,118075
7
7
  omnata_plugin_runtime/plugin_entrypoints.py,sha256=PFSLsYEVnWHVvSoOYTtTK2JY6pp6_8_eYP53WqLRiPE,27975
8
8
  omnata_plugin_runtime/rate_limiting.py,sha256=DVQ_bc-mVLBkrU1PTns1MWXhHiLpSB5HkWCcdePtJ2A,25611
9
- omnata_plugin_runtime-0.5.7a132.dist-info/LICENSE,sha256=IMF9i4xIpgCADf0U-V1cuf9HBmqWQd3qtI3FSuyW4zE,26526
10
- omnata_plugin_runtime-0.5.7a132.dist-info/METADATA,sha256=YHhi631jWmg1ZBJuNsry--DCdhMxWVNynL2ZreqnS7w,1985
11
- omnata_plugin_runtime-0.5.7a132.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
12
- omnata_plugin_runtime-0.5.7a132.dist-info/RECORD,,
9
+ omnata_plugin_runtime-0.5.7a134.dist-info/LICENSE,sha256=IMF9i4xIpgCADf0U-V1cuf9HBmqWQd3qtI3FSuyW4zE,26526
10
+ omnata_plugin_runtime-0.5.7a134.dist-info/METADATA,sha256=JGVpgMpr1s7vVOCc9qdKTNKKLxoFnOjx27LtePTLDmM,1985
11
+ omnata_plugin_runtime-0.5.7a134.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
12
+ omnata_plugin_runtime-0.5.7a134.dist-info/RECORD,,