omnata-plugin-runtime 0.5.7a152__tar.gz → 0.5.7a153__tar.gz

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omnata-plugin-runtime
3
- Version: 0.5.7a152
3
+ Version: 0.5.7a153
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
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "omnata-plugin-runtime"
3
- version = "0.5.7-a152"
3
+ version = "0.5.7-a153"
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"
@@ -39,7 +39,6 @@ import jinja2
39
39
  import pandas
40
40
  from pydantic_core import to_jsonable_python
41
41
  from pydantic import Field, TypeAdapter, ValidationError, create_model, root_validator, BaseModel
42
- from pydantic.dataclasses import dataclass
43
42
  from dateutil.parser import parse
44
43
  from jinja2 import Environment
45
44
  from snowflake.connector.pandas_tools import write_pandas
@@ -2231,8 +2230,7 @@ def get_nested_value(nested_dict:Dict, keys:List[str]):
2231
2230
  return reduce(lambda d, key: d.get(key) if isinstance(d, dict) else None, keys, nested_dict)
2232
2231
 
2233
2232
 
2234
- @dataclass
2235
- class SnowflakeFunctionParameter:
2233
+ class SnowflakeFunctionParameter(BaseModel):
2236
2234
  """
2237
2235
  Represents a parameter for a Snowflake UDF or UDTF
2238
2236
  """
@@ -2246,8 +2244,7 @@ class SnowflakeFunctionParameter:
2246
2244
  return f"{self.name} {self.data_type} default {self.default_value_clause}"
2247
2245
  return f"{self.name} {self.data_type}"
2248
2246
 
2249
- @dataclass
2250
- class SnowflakeUDTFResultColumn:
2247
+ class SnowflakeUDTFResultColumn(BaseModel):
2251
2248
  """
2252
2249
  Represents a result column for a Snowflake UDTF
2253
2250
  """
@@ -2256,49 +2253,21 @@ class SnowflakeUDTFResultColumn:
2256
2253
  def __str__(self):
2257
2254
  return f"{self.name} {self.data_type}"
2258
2255
 
2259
- @dataclass
2260
- class PythonUDTFDefinition:
2256
+ class UDTFDefinition(BaseModel):
2261
2257
  """
2262
2258
  The information needed by the plugin uploader to put a Python UDTF definition into the setup script.
2263
2259
  Do not use this class directly in plugins, instead use the omnata_udtf decorator.
2264
2260
  """
2265
- name: str
2266
- description: str
2267
- params: List[SnowflakeFunctionParameter]
2268
- result_columns: List[SnowflakeUDTFResultColumn]
2269
- handler: str
2270
- expose_to_consumer: bool
2271
- packages: Optional[List[str]] = None
2272
-
2273
- def __str__(self):
2274
- param_str = ', '.join([str(param) for param in self.params])
2275
- table_result_columns = ', '.join([f"{col.name} {col.data_type}" for col in self.result_columns])
2276
- packages_str = ', '.join([f"'{p}'" for p in self.packages])
2277
- return f"""CREATE OR REPLACE FUNCTION UDFS.{self.name}({param_str})
2278
- RETURNS TABLE({table_result_columns})
2279
- LANGUAGE PYTHON
2280
- RUNTIME_VERSION=3.10
2281
- COMMENT = $${self.description}$$
2282
- PACKAGES = ({packages_str})
2283
- IMPORTS = ('/app.zip')
2284
- HANDLER='{self.handler}';
2285
- """
2286
-
2287
- @dataclass
2288
- class JavaUDTFDefinition:
2289
- """
2290
- The information needed by the plugin uploader to put a Java UDTF definition into the setup script.
2291
- These are created directly in python, since we don't want the omnata cli to need to do any Java reflection.
2292
- Any .jar files placed in the udf_direct_imports directory will be uploaded to the stage and can be
2293
- added to the imports parameter as (e.g.) '/my_jar.jar'.
2294
- """
2295
- name: str
2296
- description: str
2297
- params: List[SnowflakeFunctionParameter]
2298
- result_columns: List[SnowflakeUDTFResultColumn]
2299
- packages: List[str]
2300
- imports: List[str]
2301
- handler: str
2261
+ name: str = Field(..., title="The name of the UDTF")
2262
+ language: Literal['python','java'] = Field(..., title="The language of the UDF")
2263
+ runtime_version: str = Field(..., title="The runtime version of the UDF (language dependent)")
2264
+ description: str = Field(..., title="A description of the UDTF")
2265
+ params: List[SnowflakeFunctionParameter] = Field(..., title="The parameters of the UDTF")
2266
+ result_columns: List[SnowflakeUDTFResultColumn] = Field(..., title="The result columns of the UDTF")
2267
+ handler: str = Field(..., title="The handler class/function for the UDTF")
2268
+ expose_to_consumer: bool = Field(..., title="Whether the UDTF should be exposed to consumers")
2269
+ imports: Optional[List[str]] = Field(None, title="A list of imports required by the UDF")
2270
+ packages: Optional[List[str]] = Field(None, title="A list of packages required by the UDTF")
2302
2271
 
2303
2272
  def __str__(self):
2304
2273
  param_str = ', '.join([str(param) for param in self.params])
@@ -2307,54 +2276,29 @@ class JavaUDTFDefinition:
2307
2276
  imports_str = ', '.join([f"'{i}'" for i in self.imports])
2308
2277
  return f"""CREATE OR REPLACE FUNCTION UDFS.{self.name}({param_str})
2309
2278
  RETURNS TABLE({table_result_columns})
2310
- LANGUAGE PYTHON
2311
- RUNTIME_VERSION=3.10
2279
+ LANGUAGE {self.language.upper()}
2280
+ RUNTIME_VERSION={self.runtime_version}
2312
2281
  COMMENT = $${self.description}$$
2313
2282
  PACKAGES = ({packages_str})
2314
2283
  IMPORTS = ({imports_str})
2315
2284
  HANDLER='{self.handler}';
2316
2285
  """
2317
2286
 
2318
- @dataclass
2319
- class PythonUDFDefinition:
2287
+ class UDFDefinition(BaseModel):
2320
2288
  """
2321
2289
  The information needed by the plugin uploader to put a Python UDF definition into the setup script.
2322
2290
  Do not use this class directly in plugins, instead use the omnata_udf decorator.
2323
2291
  """
2324
- name: str
2325
- description: str
2326
- params: List[SnowflakeFunctionParameter]
2327
- result_data_type: str
2328
- handler: str
2329
- expose_to_consumer: bool
2330
- packages: Optional[List[str]] = None
2331
-
2332
- def __str__(self):
2333
- param_str = ', '.join([str(param) for param in self.params])
2334
- packages_str = ', '.join([f"'{p}'" for p in self.packages])
2335
- return f"""CREATE OR REPLACE FUNCTION UDFS.{self.name}({param_str})
2336
- RETURNS {self.result_data_type}
2337
- LANGUAGE PYTHON
2338
- RUNTIME_VERSION=3.10
2339
- COMMENT = $${self.description}$$
2340
- PACKAGES = ({packages_str})
2341
- IMPORTS = ('/app.zip')
2342
- HANDLER='{self.handler}';
2343
- """
2344
-
2345
- @dataclass
2346
- class JavaUDFDefinition:
2347
- """
2348
- The information needed by the plugin uploader to put a java UDF definition into the setup script.
2349
- """
2350
- name: str
2351
- description: str
2352
- params: List[SnowflakeFunctionParameter]
2353
- result_data_type: str
2354
- packages: List[str]
2355
- imports: List[str]
2356
- handler: str
2357
- expose_to_consumer: bool
2292
+ name: str = Field(..., title="The name of the UDF")
2293
+ language: Literal['python','java'] = Field(..., title="The language of the UDF")
2294
+ runtime_version: str = Field(..., title="The runtime version of the UDF (language dependent)")
2295
+ description: str = Field(..., title="A description of the UDF")
2296
+ params: List[SnowflakeFunctionParameter] = Field(..., title="The parameters of the UDF")
2297
+ result_data_type: str = Field(..., title="The data type returned by the UDF")
2298
+ handler: str = Field(..., title="The handler class/function for the UDF")
2299
+ expose_to_consumer: bool = Field(..., title="Whether the UDF should be exposed to consumers")
2300
+ imports: Optional[List[str]] = Field(None, title="A list of imports required by the UDF")
2301
+ packages: Optional[List[str]] = Field(None, title="A list of packages required by the UDF")
2358
2302
 
2359
2303
  def __str__(self):
2360
2304
  param_str = ', '.join([str(param) for param in self.params])
@@ -2362,8 +2306,8 @@ class JavaUDFDefinition:
2362
2306
  imports_str = ', '.join([f"'{i}'" for i in self.imports])
2363
2307
  return f"""CREATE OR REPLACE FUNCTION UDFS.{self.name}({param_str})
2364
2308
  RETURNS {self.result_data_type}
2365
- LANGUAGE PYTHON
2366
- RUNTIME_VERSION=3.10
2309
+ LANGUAGE {self.language.upper()}
2310
+ RUNTIME_VERSION={self.runtime_version}
2367
2311
  COMMENT = $${self.description}$$
2368
2312
  PACKAGES = ({packages_str})
2369
2313
  IMPORTS = ({imports_str})
@@ -2447,7 +2391,7 @@ def omnata_udtf(
2447
2391
 
2448
2392
  return class_decorator
2449
2393
 
2450
- def find_udtf_classes(path:str = '.') -> List[PythonUDTFDefinition | JavaUDTFDefinition]:
2394
+ def find_udtf_classes(path:str = '.') -> List[UDTFDefinition]:
2451
2395
  """
2452
2396
  Finds all classes in the specified directory which have the 'omnata_udtf' decorator applied
2453
2397
  """
@@ -2466,15 +2410,16 @@ def find_udtf_classes(path:str = '.') -> List[PythonUDTFDefinition | JavaUDTFDef
2466
2410
  for name, obj in inspect.getmembers(module, inspect.isclass):
2467
2411
  # Check if the class has the specified attribute
2468
2412
  if hasattr(obj, '_is_omnata_udtf'):
2469
- matching_classes.append(PythonUDTFDefinition(
2413
+ matching_classes.append(UDTFDefinition(
2470
2414
  name=obj._omnata_udtf_name,
2415
+
2471
2416
  description=obj._omnata_udtf_description,
2472
2417
  params=obj._omnata_udtf_params,
2473
2418
  result_columns=obj._omnata_udtf_result_columns,
2474
2419
  expose_to_consumer=obj._omnata_udtf_expose_to_consumer,
2475
2420
  handler=obj.__module__+'.'+obj.__name__
2476
2421
  ))
2477
- elif isinstance(obj, JavaUDTFDefinition):
2422
+ elif isinstance(obj, UDTFDefinition) and cast(UDTFDefinition,obj).language == 'java':
2478
2423
  matching_classes.append(obj)
2479
2424
 
2480
2425
  return matching_classes
@@ -2547,7 +2492,7 @@ def omnata_udf(
2547
2492
 
2548
2493
  return decorator
2549
2494
 
2550
- def find_udf_functions(path:str = '.') -> List[PythonUDFDefinition | JavaUDFDefinition]:
2495
+ def find_udf_functions(path:str = '.') -> List[UDFDefinition]:
2551
2496
  """
2552
2497
  Finds all functions in the specified directory which have the 'omnata_udf' decorator applied
2553
2498
  """
@@ -2566,8 +2511,11 @@ def find_udf_functions(path:str = '.') -> List[PythonUDFDefinition | JavaUDFDefi
2566
2511
  for name, obj in inspect.getmembers(module, inspect.isfunction):
2567
2512
  # Check if the class has the specified attribute
2568
2513
  if hasattr(obj, '_is_omnata_udf'):
2569
- matching_classes.append(PythonUDFDefinition(
2514
+ matching_classes.append(UDFDefinition(
2570
2515
  name=obj._omnata_udf_name,
2516
+ language='python',
2517
+ runtime_version='3.10',
2518
+ imports=['/app.zip'],
2571
2519
  description=obj._omnata_udf_description,
2572
2520
  params=obj._omnata_udf_params,
2573
2521
  result_data_type=obj._omnata_udf_result_data_type,
@@ -2575,7 +2523,7 @@ def find_udf_functions(path:str = '.') -> List[PythonUDFDefinition | JavaUDFDefi
2575
2523
  packages=[],
2576
2524
  handler=obj.__module__+'.'+obj.__name__
2577
2525
  ))
2578
- elif isinstance(obj, JavaUDFDefinition):
2526
+ elif isinstance(obj, UDFDefinition) and cast(UDFDefinition,obj).language == 'java':
2579
2527
  matching_classes.append(obj)
2580
2528
 
2581
2529
  return matching_classes