sqlframe 2.0.0__py3-none-any.whl → 2.1.0__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.
sqlframe/_version.py CHANGED
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '2.0.0'
16
- __version_tuple__ = version_tuple = (2, 0, 0)
15
+ __version__ = version = '2.1.0'
16
+ __version_tuple__ = version_tuple = (2, 1, 0)
sqlframe/base/_typing.py CHANGED
@@ -24,6 +24,7 @@ OutputExpressionContainer = t.Union[exp.Select, exp.Create, exp.Insert]
24
24
  StorageLevel = str
25
25
  PathOrPaths = t.Union[str, t.List[str]]
26
26
  OptionalPrimitiveType = t.Optional[PrimitiveType]
27
+ DataTypeOrString = t.Union[DataType, str]
27
28
 
28
29
 
29
30
  class UserDefinedFunctionLike(t.Protocol):
@@ -2070,14 +2070,19 @@ def contains(left: ColumnOrName, right: ColumnOrName) -> Column:
2070
2070
  return Column.invoke_anonymous_function(left, "contains", right)
2071
2071
 
2072
2072
 
2073
- @meta(unsupported_engines="*")
2073
+ @meta(unsupported_engines=["bigquery", "postgres"])
2074
2074
  def convert_timezone(
2075
2075
  sourceTz: t.Optional[Column], targetTz: Column, sourceTs: ColumnOrName
2076
2076
  ) -> Column:
2077
- if sourceTz is None:
2078
- return Column.invoke_anonymous_function(targetTz, "convert_timezone", sourceTs)
2079
- else:
2080
- return Column.invoke_anonymous_function(sourceTz, "convert_timezone", targetTz, sourceTs)
2077
+ to_timestamp = get_func_from_session("to_timestamp")
2078
+
2079
+ return Column(
2080
+ expression.ConvertTimezone(
2081
+ timestamp=to_timestamp(Column.ensure_col(sourceTs)).expression,
2082
+ source_tz=sourceTz.expression if sourceTz else None,
2083
+ target_tz=Column.ensure_col(targetTz).expression,
2084
+ )
2085
+ )
2081
2086
 
2082
2087
 
2083
2088
  @meta(unsupported_engines="postgres")
sqlframe/base/session.py CHANGED
@@ -27,6 +27,7 @@ from sqlframe.base.catalog import _BaseCatalog
27
27
  from sqlframe.base.dataframe import _BaseDataFrame
28
28
  from sqlframe.base.normalize import normalize_dict
29
29
  from sqlframe.base.readerwriter import _BaseDataFrameReader, _BaseDataFrameWriter
30
+ from sqlframe.base.udf import _BaseUDFRegistration
30
31
  from sqlframe.base.util import (
31
32
  get_column_mapping_from_schema_input,
32
33
  normalize_string,
@@ -64,16 +65,18 @@ CATALOG = t.TypeVar("CATALOG", bound=_BaseCatalog)
64
65
  READER = t.TypeVar("READER", bound=_BaseDataFrameReader)
65
66
  WRITER = t.TypeVar("WRITER", bound=_BaseDataFrameWriter)
66
67
  DF = t.TypeVar("DF", bound=_BaseDataFrame)
68
+ UDF_REGISTRATION = t.TypeVar("UDF_REGISTRATION", bound=_BaseUDFRegistration)
67
69
 
68
70
  _MISSING = "MISSING"
69
71
 
70
72
 
71
- class _BaseSession(t.Generic[CATALOG, READER, WRITER, DF, CONN]):
73
+ class _BaseSession(t.Generic[CATALOG, READER, WRITER, DF, CONN, UDF_REGISTRATION]):
72
74
  _instance = None
73
75
  _reader: t.Type[READER]
74
76
  _writer: t.Type[WRITER]
75
77
  _catalog: t.Type[CATALOG]
76
78
  _df: t.Type[DF]
79
+ _udf_registration: t.Type[UDF_REGISTRATION]
77
80
 
78
81
  SANITIZE_COLUMN_NAMES = False
79
82
 
@@ -81,7 +84,6 @@ class _BaseSession(t.Generic[CATALOG, READER, WRITER, DF, CONN]):
81
84
  self,
82
85
  conn: t.Optional[CONN] = None,
83
86
  schema: t.Optional[MappingSchema] = None,
84
- case_sensitive: bool = False,
85
87
  *args,
86
88
  **kwargs,
87
89
  ):
@@ -91,11 +93,6 @@ class _BaseSession(t.Generic[CATALOG, READER, WRITER, DF, CONN]):
91
93
  self.execution_dialect: Dialect = Dialect.get_or_raise(
92
94
  self.builder.DEFAULT_EXECUTION_DIALECT
93
95
  )
94
- self.case_sensitive: bool = case_sensitive
95
- if self.case_sensitive:
96
- self.input_dialect.NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_SENSITIVE
97
- self.output_dialect.NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_SENSITIVE
98
- self.execution_dialect.NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_SENSITIVE
99
96
  self.known_ids: t.Set[str] = set()
100
97
  self.known_branch_ids: t.Set[str] = set()
101
98
  self.known_sequence_ids: t.Set[str] = set()
@@ -176,6 +173,13 @@ class _BaseSession(t.Generic[CATALOG, READER, WRITER, DF, CONN]):
176
173
  def _has_connection(self) -> bool:
177
174
  return hasattr(self, "_connection") and bool(self._connection)
178
175
 
176
+ @property
177
+ def udf(self) -> UDF_REGISTRATION:
178
+ return self._udf_registration(self)
179
+
180
+ def getActiveSession(self) -> Self:
181
+ return self
182
+
179
183
  def range(self, *args):
180
184
  start = 0
181
185
  step = 1
@@ -573,53 +577,10 @@ class _BaseSession(t.Generic[CATALOG, READER, WRITER, DF, CONN]):
573
577
  converted_values.append(cls._to_value(value))
574
578
  return _create_row(columns, converted_values)
575
579
 
576
- @property
577
- def _is_standalone(self) -> bool:
578
- from sqlframe.standalone.session import StandaloneSession
579
-
580
- return isinstance(self, StandaloneSession)
581
-
582
- @property
583
- def _is_duckdb(self) -> bool:
584
- from sqlframe.duckdb.session import DuckDBSession
585
-
586
- return isinstance(self, DuckDBSession)
587
-
588
- @property
589
- def _is_postgres(self) -> bool:
590
- from sqlframe.postgres.session import PostgresSession
591
-
592
- return isinstance(self, PostgresSession)
593
-
594
- @property
595
- def _is_spark(self) -> bool:
596
- from sqlframe.spark.session import SparkSession
597
-
598
- return isinstance(self, SparkSession)
599
-
600
- @property
601
- def _is_bigquery(self) -> bool:
602
- from sqlframe.bigquery.session import BigQuerySession
603
-
604
- return isinstance(self, BigQuerySession)
605
-
606
- @property
607
- def _is_redshift(self) -> bool:
608
- from sqlframe.redshift.session import RedshiftSession
609
-
610
- return isinstance(self, RedshiftSession)
611
-
612
- @property
613
- def _is_snowflake(self) -> bool:
614
- from sqlframe.snowflake.session import SnowflakeSession
615
-
616
- return isinstance(self, SnowflakeSession)
617
-
618
580
  class Builder:
619
581
  SQLFRAME_INPUT_DIALECT_KEY = "sqlframe.input.dialect"
620
582
  SQLFRAME_OUTPUT_DIALECT_KEY = "sqlframe.output.dialect"
621
583
  SQLFRAME_EXECUTION_DIALECT_KEY = "sqlframe.execution.dialect"
622
- SQLFRAME_CASE_SENSITIVE_KEY = "spark.sql.caseSensitive"
623
584
  SQLFRAME_CONN_KEY = "sqlframe.conn"
624
585
  SQLFRAME_SCHEMA_KEY = "sqlframe.schema"
625
586
  DEFAULT_INPUT_DIALECT = "spark"
@@ -665,8 +626,6 @@ class _BaseSession(t.Generic[CATALOG, READER, WRITER, DF, CONN]):
665
626
  self._session_kwargs["conn"] = value
666
627
  elif key == self.SQLFRAME_SCHEMA_KEY:
667
628
  self._session_kwargs["schema"] = value
668
- elif key == self.SQLFRAME_CASE_SENSITIVE_KEY:
669
- self._session_kwargs["case_sensitive"] = value
670
629
  else:
671
630
  self._session_kwargs[key] = value
672
631
  if map:
@@ -676,8 +635,6 @@ class _BaseSession(t.Generic[CATALOG, READER, WRITER, DF, CONN]):
676
635
  self.output_dialect = map[self.SQLFRAME_OUTPUT_DIALECT_KEY]
677
636
  if self.SQLFRAME_EXECUTION_DIALECT_KEY in map:
678
637
  self.execution_dialect = map[self.SQLFRAME_EXECUTION_DIALECT_KEY]
679
- if self.SQLFRAME_CASE_SENSITIVE_KEY in map:
680
- self._session_kwargs["case_sensitive"] = map[self.SQLFRAME_CASE_SENSITIVE_KEY]
681
638
  if self.SQLFRAME_CONN_KEY in map:
682
639
  self._session_kwargs["conn"] = map[self.SQLFRAME_CONN_KEY]
683
640
  if self.SQLFRAME_SCHEMA_KEY in map:
@@ -700,15 +657,5 @@ class _BaseSession(t.Generic[CATALOG, READER, WRITER, DF, CONN]):
700
657
  self.session.execution_dialect = Dialect.get_or_raise(self.execution_dialect)
701
658
  if hasattr(self.session, "_connection") and not self.session._connection:
702
659
  self.session._connection = self._conn
703
- if self.session.case_sensitive:
704
- self.session.input_dialect.NORMALIZATION_STRATEGY = (
705
- NormalizationStrategy.CASE_SENSITIVE
706
- )
707
- self.session.output_dialect.NORMALIZATION_STRATEGY = (
708
- NormalizationStrategy.CASE_SENSITIVE
709
- )
710
- self.session.execution_dialect.NORMALIZATION_STRATEGY = (
711
- NormalizationStrategy.CASE_SENSITIVE
712
- )
713
660
 
714
661
  builder = Builder()
sqlframe/base/udf.py ADDED
@@ -0,0 +1,36 @@
1
+ # This code is based on code from Apache Spark under the license found in the LICENSE file located in the 'sqlframe' folder.
2
+ from __future__ import annotations
3
+
4
+ import typing as t
5
+
6
+ if t.TYPE_CHECKING:
7
+ from sqlframe.base._typing import DataTypeOrString, UserDefinedFunctionLike
8
+ from sqlframe.base.session import _BaseSession
9
+
10
+ SESSION = t.TypeVar("SESSION", bound=_BaseSession)
11
+ else:
12
+ SESSION = t.TypeVar("SESSION")
13
+
14
+
15
+ class _BaseUDFRegistration(t.Generic[SESSION]):
16
+ def __init__(self, sparkSession: SESSION):
17
+ self.sparkSession = sparkSession
18
+
19
+ def register(
20
+ self,
21
+ name: str,
22
+ f: t.Union[t.Callable[..., t.Any], UserDefinedFunctionLike],
23
+ returnType: t.Optional[DataTypeOrString] = None,
24
+ ) -> UserDefinedFunctionLike:
25
+ raise NotImplementedError
26
+
27
+ def registerJavaFunction(
28
+ self,
29
+ name: str,
30
+ javaClassName: str,
31
+ returnType: t.Optional[DataTypeOrString] = None,
32
+ ) -> None:
33
+ raise NotImplementedError
34
+
35
+ def registerJavaUDAF(self, name: str, javaClassName: str) -> None:
36
+ raise NotImplementedError
@@ -9,6 +9,7 @@ from sqlframe.bigquery.readwriter import (
9
9
  BigQueryDataFrameReader,
10
10
  BigQueryDataFrameWriter,
11
11
  )
12
+ from sqlframe.bigquery.udf import BigQueryUDFRegistration
12
13
 
13
14
  if t.TYPE_CHECKING:
14
15
  from google.cloud.bigquery.client import Client as BigQueryClient
@@ -25,12 +26,14 @@ class BigQuerySession(
25
26
  BigQueryDataFrameWriter,
26
27
  BigQueryDataFrame,
27
28
  BigQueryConnection,
29
+ BigQueryUDFRegistration,
28
30
  ],
29
31
  ):
30
32
  _catalog = BigQueryCatalog
31
33
  _reader = BigQueryDataFrameReader
32
34
  _writer = BigQueryDataFrameWriter
33
35
  _df = BigQueryDataFrame
36
+ _udf_registration = BigQueryUDFRegistration
34
37
 
35
38
  QUALIFY_INFO_SCHEMA_WITH_DATABASE = True
36
39
  SANITIZE_COLUMN_NAMES = True
@@ -0,0 +1,11 @@
1
+ from __future__ import annotations
2
+
3
+ import typing as t
4
+
5
+ from sqlframe.base.udf import _BaseUDFRegistration
6
+
7
+ if t.TYPE_CHECKING:
8
+ from sqlframe.bigquery.session import BigQuerySession
9
+
10
+
11
+ class BigQueryUDFRegistration(_BaseUDFRegistration["BigQuerySession"]): ...
@@ -11,6 +11,7 @@ from sqlframe.duckdb.readwriter import (
11
11
  DuckDBDataFrameReader,
12
12
  DuckDBDataFrameWriter,
13
13
  )
14
+ from sqlframe.duckdb.udf import DuckDBUDFRegistration
14
15
 
15
16
  if t.TYPE_CHECKING:
16
17
  from duckdb import DuckDBPyConnection
@@ -26,12 +27,14 @@ class DuckDBSession(
26
27
  DuckDBDataFrameWriter,
27
28
  DuckDBDataFrame,
28
29
  DuckDBPyConnection,
30
+ DuckDBUDFRegistration,
29
31
  ]
30
32
  ):
31
33
  _catalog = DuckDBCatalog
32
34
  _reader = DuckDBDataFrameReader
33
35
  _writer = DuckDBDataFrameWriter
34
36
  _df = DuckDBDataFrame
37
+ _udf_registration = DuckDBUDFRegistration
35
38
 
36
39
  def __init__(self, conn: t.Optional[DuckDBPyConnection] = None, *args, **kwargs):
37
40
  import duckdb
sqlframe/duckdb/udf.py ADDED
@@ -0,0 +1,19 @@
1
+ from __future__ import annotations
2
+
3
+ import typing as t
4
+
5
+ from sqlframe.base.udf import _BaseUDFRegistration
6
+
7
+ if t.TYPE_CHECKING:
8
+ from sqlframe.base._typing import DataTypeOrString, UserDefinedFunctionLike
9
+ from sqlframe.duckdb.session import DuckDBSession
10
+
11
+
12
+ class DuckDBUDFRegistration(_BaseUDFRegistration["DuckDBSession"]):
13
+ def register( # type: ignore
14
+ self,
15
+ name: str,
16
+ f: t.Union[t.Callable[..., t.Any], UserDefinedFunctionLike],
17
+ returnType: t.Optional[DataTypeOrString] = None,
18
+ ) -> UserDefinedFunctionLike:
19
+ self.sparkSession._conn.create_function(name, f, return_type=returnType) # type: ignore
@@ -11,6 +11,7 @@ from sqlframe.postgres.readwriter import (
11
11
  PostgresDataFrameReader,
12
12
  PostgresDataFrameWriter,
13
13
  )
14
+ from sqlframe.postgres.udf import PostgresUDFRegistration
14
15
 
15
16
  if t.TYPE_CHECKING:
16
17
  from psycopg2.extensions import connection as psycopg2_connection
@@ -27,12 +28,14 @@ class PostgresSession(
27
28
  PostgresDataFrameWriter,
28
29
  PostgresDataFrame,
29
30
  psycopg2_connection,
31
+ PostgresUDFRegistration,
30
32
  ],
31
33
  ):
32
34
  _catalog = PostgresCatalog
33
35
  _reader = PostgresDataFrameReader
34
36
  _writer = PostgresDataFrameWriter
35
37
  _df = PostgresDataFrame
38
+ _udf_registration = PostgresUDFRegistration
36
39
 
37
40
  def __init__(self, conn: t.Optional[psycopg2_connection] = None):
38
41
  if not hasattr(self, "_conn"):
@@ -0,0 +1,11 @@
1
+ from __future__ import annotations
2
+
3
+ import typing as t
4
+
5
+ from sqlframe.base.udf import _BaseUDFRegistration
6
+
7
+ if t.TYPE_CHECKING:
8
+ from sqlframe.postgres.session import PostgresSession
9
+
10
+
11
+ class PostgresUDFRegistration(_BaseUDFRegistration["PostgresSession"]): ...
@@ -10,6 +10,7 @@ from sqlframe.redshift.readwriter import (
10
10
  RedshiftDataFrameReader,
11
11
  RedshiftDataFrameWriter,
12
12
  )
13
+ from sqlframe.redshift.udf import RedshiftUDFRegistration
13
14
 
14
15
  if t.TYPE_CHECKING:
15
16
  from redshift_connector.core import Connection as RedshiftConnection
@@ -24,12 +25,14 @@ class RedshiftSession(
24
25
  RedshiftDataFrameWriter,
25
26
  RedshiftDataFrame,
26
27
  RedshiftConnection,
28
+ RedshiftUDFRegistration,
27
29
  ],
28
30
  ):
29
31
  _catalog = RedshiftCatalog
30
32
  _reader = RedshiftDataFrameReader
31
33
  _writer = RedshiftDataFrameWriter
32
34
  _df = RedshiftDataFrame
35
+ _udf_registration = RedshiftUDFRegistration
33
36
 
34
37
  def __init__(self, conn: t.Optional[RedshiftConnection] = None):
35
38
  warnings.warn(
@@ -0,0 +1,11 @@
1
+ from __future__ import annotations
2
+
3
+ import typing as t
4
+
5
+ from sqlframe.base.udf import _BaseUDFRegistration
6
+
7
+ if t.TYPE_CHECKING:
8
+ from sqlframe.redshift.session import RedshiftSession
9
+
10
+
11
+ class RedshiftUDFRegistration(_BaseUDFRegistration["RedshiftSession"]): ...
@@ -4,6 +4,8 @@ import json
4
4
  import typing as t
5
5
  import warnings
6
6
 
7
+ from sqlframe.snowflake.udf import SnowflakeUDFRegistration
8
+
7
9
  try:
8
10
  from snowflake.connector.converter import SnowflakeConverter
9
11
  except ImportError:
@@ -50,12 +52,14 @@ class SnowflakeSession(
50
52
  SnowflakeDataFrameWriter,
51
53
  SnowflakeDataFrame,
52
54
  SnowflakeConnection,
55
+ SnowflakeUDFRegistration,
53
56
  ],
54
57
  ):
55
58
  _catalog = SnowflakeCatalog
56
59
  _reader = SnowflakeDataFrameReader
57
60
  _writer = SnowflakeDataFrameWriter
58
61
  _df = SnowflakeDataFrame
62
+ _udf_registration = SnowflakeUDFRegistration
59
63
 
60
64
  def __init__(self, conn: t.Optional[SnowflakeConnection] = None):
61
65
  import snowflake
@@ -0,0 +1,11 @@
1
+ from __future__ import annotations
2
+
3
+ import typing as t
4
+
5
+ from sqlframe.base.udf import _BaseUDFRegistration
6
+
7
+ if t.TYPE_CHECKING:
8
+ from sqlframe.snowflake.session import SnowflakeSession
9
+
10
+
11
+ class SnowflakeUDFRegistration(_BaseUDFRegistration["SnowflakeSession"]): ...
sqlframe/spark/session.py CHANGED
@@ -14,6 +14,7 @@ from sqlframe.spark.readwriter import (
14
14
  SparkDataFrameWriter,
15
15
  )
16
16
  from sqlframe.spark.types import Row
17
+ from sqlframe.spark.udf import SparkUDFRegistration
17
18
 
18
19
  if t.TYPE_CHECKING:
19
20
  import pandas as pd
@@ -32,12 +33,14 @@ class SparkSession(
32
33
  SparkDataFrameWriter,
33
34
  SparkDataFrame,
34
35
  PySparkSession,
36
+ SparkUDFRegistration,
35
37
  ],
36
38
  ):
37
39
  _catalog = SparkCatalog
38
40
  _reader = SparkDataFrameReader
39
41
  _writer = SparkDataFrameWriter
40
42
  _df = SparkDataFrame
43
+ _udf_registration = SparkUDFRegistration
41
44
 
42
45
  def __init__(self, conn: t.Optional[PySparkSession] = None, *args, **kwargs):
43
46
  from pyspark.sql.session import DataFrame, SparkSession
sqlframe/spark/udf.py ADDED
@@ -0,0 +1,34 @@
1
+ from __future__ import annotations
2
+
3
+ import typing as t
4
+
5
+ from sqlframe.base.udf import _BaseUDFRegistration
6
+
7
+ if t.TYPE_CHECKING:
8
+ from sqlframe.base._typing import DataTypeOrString, UserDefinedFunctionLike
9
+ from sqlframe.spark.session import SparkSession # type: ignore
10
+
11
+
12
+ class SparkUDFRegistration(_BaseUDFRegistration["SparkSession"]):
13
+ def register(
14
+ self,
15
+ name: str,
16
+ f: t.Union[t.Callable[..., t.Any], UserDefinedFunctionLike],
17
+ returnType: t.Optional[DataTypeOrString] = None,
18
+ ) -> UserDefinedFunctionLike:
19
+ return self.sparkSession.spark_session.udf.register(name, f, returnType=returnType) # type: ignore
20
+
21
+ def registerJavaFunction(
22
+ self,
23
+ name: str,
24
+ javaClassName: str,
25
+ returnType: t.Optional[DataTypeOrString] = None,
26
+ ) -> None:
27
+ self.sparkSession.spark_session.udf.registerJavaFunction(
28
+ name,
29
+ javaClassName,
30
+ returnType=returnType, # type: ignore
31
+ )
32
+
33
+ def registerJavaUDAF(self, name: str, javaClassName: str) -> None:
34
+ self.sparkSession.spark_session.udf.registerJavaUDAF(name, javaClassName)
@@ -9,6 +9,7 @@ from sqlframe.standalone.readwriter import (
9
9
  StandaloneDataFrameReader,
10
10
  StandaloneDataFrameWriter,
11
11
  )
12
+ from sqlframe.standalone.udf import StandaloneUDFRegistration
12
13
 
13
14
 
14
15
  class StandaloneSession(
@@ -18,12 +19,14 @@ class StandaloneSession(
18
19
  StandaloneDataFrameWriter,
19
20
  StandaloneDataFrame,
20
21
  object,
22
+ StandaloneUDFRegistration,
21
23
  ]
22
24
  ): # type: ignore
23
25
  _catalog = StandaloneCatalog
24
26
  _reader = StandaloneDataFrameReader
25
27
  _writer = StandaloneDataFrameWriter
26
28
  _df = StandaloneDataFrame
29
+ _udf_registration = StandaloneUDFRegistration
27
30
 
28
31
  class Builder(_BaseSession.Builder):
29
32
  DEFAULT_INPUT_DIALECT = "spark"
@@ -0,0 +1,11 @@
1
+ from __future__ import annotations
2
+
3
+ import typing as t
4
+
5
+ from sqlframe.base.udf import _BaseUDFRegistration
6
+
7
+ if t.TYPE_CHECKING:
8
+ from sqlframe.standalone.session import StandaloneSession
9
+
10
+
11
+ class StandaloneUDFRegistration(_BaseUDFRegistration["StandaloneSession"]): ...
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sqlframe
3
- Version: 2.0.0
3
+ Version: 2.1.0
4
4
  Summary: Turning PySpark Into a Universal DataFrame API
5
5
  Home-page: https://github.com/eakmanrq/sqlframe
6
6
  Author: Ryan Eakman
@@ -18,7 +18,7 @@ Requires-Python: >=3.8
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
20
  Requires-Dist: prettytable (<3.11.0)
21
- Requires-Dist: sqlglot (<25.9,>=24.0.0)
21
+ Requires-Dist: sqlglot (<25.11,>=24.0.0)
22
22
  Requires-Dist: typing-extensions (<5,>=4.8)
23
23
  Provides-Extra: bigquery
24
24
  Requires-Dist: google-cloud-bigquery-storage (<3,>=2) ; extra == 'bigquery'
@@ -26,7 +26,7 @@ Requires-Dist: google-cloud-bigquery[pandas] (<4,>=3) ; extra == 'bigquery'
26
26
  Provides-Extra: dev
27
27
  Requires-Dist: duckdb (<1.1,>=0.9) ; extra == 'dev'
28
28
  Requires-Dist: mypy (<1.12,>=1.10.0) ; extra == 'dev'
29
- Requires-Dist: openai (<1.38,>=1.30) ; extra == 'dev'
29
+ Requires-Dist: openai (<1.41,>=1.30) ; extra == 'dev'
30
30
  Requires-Dist: pandas-stubs (<3,>=2) ; extra == 'dev'
31
31
  Requires-Dist: pandas (<3,>=2) ; extra == 'dev'
32
32
  Requires-Dist: psycopg (<4,>=3.1) ; extra == 'dev'
@@ -49,7 +49,7 @@ Provides-Extra: duckdb
49
49
  Requires-Dist: duckdb (<1.1,>=0.9) ; extra == 'duckdb'
50
50
  Requires-Dist: pandas (<3,>=2) ; extra == 'duckdb'
51
51
  Provides-Extra: openai
52
- Requires-Dist: openai (<1.38,>=1.30) ; extra == 'openai'
52
+ Requires-Dist: openai (<1.41,>=1.30) ; extra == 'openai'
53
53
  Provides-Extra: pandas
54
54
  Requires-Dist: pandas (<3,>=2) ; extra == 'pandas'
55
55
  Provides-Extra: postgres
@@ -1,21 +1,22 @@
1
1
  sqlframe/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- sqlframe/_version.py,sha256=o9XMlNC6GoiUn7mwoOOgJdijgp3B_2fLdgizcKs1i2o,411
2
+ sqlframe/_version.py,sha256=N_eoCB5RSZeFANRJsHZ9FylE5ILLKrp6YmjX8ezqFpA,411
3
3
  sqlframe/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- sqlframe/base/_typing.py,sha256=DuTay8-o9W-pw3RPZCgLunKNJLS9PkaV11G_pxXp9NY,1256
4
+ sqlframe/base/_typing.py,sha256=b2clI5HI1zEZKB_3Msx3FeAJQyft44ubUifJwQRVXyQ,1298
5
5
  sqlframe/base/catalog.py,sha256=SzFQalTWdhWzxUY-4ut1f9TfOECp_JmJEgNPfrRKCe0,38457
6
6
  sqlframe/base/column.py,sha256=csci74Cdi7S7xpyAUfX6QVvlPDe4uR-S8Ejb50uCIfI,17698
7
7
  sqlframe/base/dataframe.py,sha256=OPDdOIlhVG8tytp94IR0qKPzEz3CDreTluB2NTV7Viw,70765
8
8
  sqlframe/base/decorators.py,sha256=Jy4bf8MhZ-AJ6CWTj59bBJRqamtLbPC0USUMFrY6g0w,449
9
9
  sqlframe/base/exceptions.py,sha256=9Uwvqn2eAkDpqm4BrRgbL61qM-GMCbJEMAW8otxO46s,370
10
10
  sqlframe/base/function_alternatives.py,sha256=VpBE1-p4_WifKoqeLJbZQFZ5MWJhNAEYCiQ2eE3hAOk,50015
11
- sqlframe/base/functions.py,sha256=nKnRTWf6NeyWVrctCFhqp9Ct-Ggu9t8JG0Ikma-dJ3o,189827
11
+ sqlframe/base/functions.py,sha256=2dDfPepAuQvLcxwaZbj9qJeEeiqOaYJDI3vPoZXoM1Q,189959
12
12
  sqlframe/base/group.py,sha256=TES9CleVmH3x-0X-tqmuUKfCKSWjH5vg1aU3R6dDmFc,4059
13
13
  sqlframe/base/normalize.py,sha256=nXAJ5CwxVf4DV0GsH-q1w0p8gmjSMlv96k_ez1eVul8,3880
14
14
  sqlframe/base/operations.py,sha256=-AhNuEzcV7ZExoP1oY3blaKip-joQyJeQVvfBTs_2g4,3456
15
15
  sqlframe/base/readerwriter.py,sha256=FkImnUR_qNASmXktk0JDsFeOzfh799hd09vI2uznNH8,25350
16
- sqlframe/base/session.py,sha256=IG9rNUSCDR8d6m3-zLNHLL5S2zG6uvdRn7FA17cKi_M,27065
16
+ sqlframe/base/session.py,sha256=YGlrc5nB2TOtrAzzgHynrkdRyl39DqczurnxyoqcfTg,25024
17
17
  sqlframe/base/transforms.py,sha256=y0j3SGDz3XCmNGrvassk1S-owllUWfkHyMgZlY6SFO4,467
18
18
  sqlframe/base/types.py,sha256=iBNk9bpFtb2NBIogYS8i7OlQZMRvpR6XxqzBebsjQDU,12280
19
+ sqlframe/base/udf.py,sha256=O6hMhBUy9NVv-mhJRtfFhXTIa_-Z8Y_FkmmuOHu0l90,1117
19
20
  sqlframe/base/util.py,sha256=ktQfPBcYyXXLPWCOg9Gg_acjMc83xNykC8CFjuqGU5E,14879
20
21
  sqlframe/base/window.py,sha256=8hOv-ignPPIsZA9FzvYzcLE9J_glalVaYjIAUdRUX3o,4943
21
22
  sqlframe/base/mixins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -30,8 +31,9 @@ sqlframe/bigquery/functions.py,sha256=CxXiBzSLRf9h-9lAM8xSz1CFcVk2tVXU1eFPJ4d_L0
30
31
  sqlframe/bigquery/functions.pyi,sha256=BCYqHpZzv4KWVtTuiC9wCSzXdxeHsz9gwkEvKzwHnoY,13583
31
32
  sqlframe/bigquery/group.py,sha256=UVBNBRTo8OqS-_cS5YwvTeJYgYxeG-d6R3kfyHmlFqw,391
32
33
  sqlframe/bigquery/readwriter.py,sha256=WAD3ZMwkkjOpvPPoZXfaLLNM6tRTeUvdEj-hQZAzXeo,870
33
- sqlframe/bigquery/session.py,sha256=RU3Ompf71sLkW9miuYbMdA4HYTSra0-LI-rMCOa-9oQ,2623
34
+ sqlframe/bigquery/session.py,sha256=-ySvZGbV-EeUJ6Z1SEFT8Es_80Lu3Db0WF333ktxoIQ,2762
34
35
  sqlframe/bigquery/types.py,sha256=KwNyuXIo-2xVVd4bZED3YrQOobKCtemlxGrJL7DrTC8,34
36
+ sqlframe/bigquery/udf.py,sha256=ZZ1-P1zWZhQqmhBqwAxfNeKl31nDkkZgkuz7Dn28P_0,264
35
37
  sqlframe/bigquery/window.py,sha256=6GKPzuxeSapJakBaKBeT9VpED1ACdjggDv9JRILDyV0,35
36
38
  sqlframe/duckdb/__init__.py,sha256=t85TA3ufZtL1weQNFmEs8itCSwbJFtw03-p0GT4XGf8,669
37
39
  sqlframe/duckdb/catalog.py,sha256=YYYVmetLUaJOdObKw4AJ7L0P-msshkta4xHlcZQ9zEA,4795
@@ -41,8 +43,9 @@ sqlframe/duckdb/functions.py,sha256=ZCmiHegr7484nNmTycxI9f5pDIDhIV3m5zTFK4hMD4Q,
41
43
  sqlframe/duckdb/functions.pyi,sha256=nU-6a2cfLDkuMCdYrNRLfa6-i8Aa0CxQQ1nLT6roIdI,5813
42
44
  sqlframe/duckdb/group.py,sha256=IkhbW42Ng1U5YT3FkIdiB4zBqRkW4QyTb-1detY1e_4,383
43
45
  sqlframe/duckdb/readwriter.py,sha256=0qZcARQoWYlx9P2m0uS2vuMj_tG_ka4NhHzg7qdaR3I,4597
44
- sqlframe/duckdb/session.py,sha256=WsPImstaJUrRec1RDb81fTE0t10wnNLS5685F1Ezj0k,2209
46
+ sqlframe/duckdb/session.py,sha256=dj8kOTklBHKTyFGc3UwbgFlloPnfIDUf1Sh4uaO1hSg,2340
45
47
  sqlframe/duckdb/types.py,sha256=KwNyuXIo-2xVVd4bZED3YrQOobKCtemlxGrJL7DrTC8,34
48
+ sqlframe/duckdb/udf.py,sha256=Du9LnOtT1lJvB90D4HSR2tB7MXy179jZngDR-EjVjQk,656
46
49
  sqlframe/duckdb/window.py,sha256=6GKPzuxeSapJakBaKBeT9VpED1ACdjggDv9JRILDyV0,35
47
50
  sqlframe/postgres/__init__.py,sha256=Sz_MtgV_oh_QhfZTC7iKM07ICUmNcJEDV0kEkSW9ZKU,712
48
51
  sqlframe/postgres/catalog.py,sha256=9XVXXDW04mY_KmeB52NsCny8n0evqdDCBxhGH1Xce6s,8956
@@ -52,8 +55,9 @@ sqlframe/postgres/functions.py,sha256=ZWfb2sX3ZplT-tBsrsaXDc9lPzXoE-8ZflzP_FUfwD
52
55
  sqlframe/postgres/functions.pyi,sha256=um-qE2g9iPs0-53vJ46lArbfvDqAbFIwrxLJgcrPM_8,5536
53
56
  sqlframe/postgres/group.py,sha256=KUXeSFKWTSH9yCRJAhW85OvjZaG6Zr4In9LR_ie3yGU,391
54
57
  sqlframe/postgres/readwriter.py,sha256=L1e3yKXzFVNR_W5s1DHaWol7G8x7l4jcZ5sLGualyMk,870
55
- sqlframe/postgres/session.py,sha256=C7cYx3W6QuSCyfZ4x2ELyED566Sxc0kjEjz6uv6NA0w,2356
58
+ sqlframe/postgres/session.py,sha256=LkM35-ADkIh2OSNT6HRVfJ8jLOoFlrdgkSSVhFGMYRc,2495
56
59
  sqlframe/postgres/types.py,sha256=KwNyuXIo-2xVVd4bZED3YrQOobKCtemlxGrJL7DrTC8,34
60
+ sqlframe/postgres/udf.py,sha256=TylVxrmPzycAqnpTiueGvvetiMCfCX31QatgQMIgpME,264
57
61
  sqlframe/postgres/window.py,sha256=6GKPzuxeSapJakBaKBeT9VpED1ACdjggDv9JRILDyV0,35
58
62
  sqlframe/redshift/__init__.py,sha256=jamKYQtQaKjjXnQ01QGPHvatbrZSw9sWno_VOUGSz6I,712
59
63
  sqlframe/redshift/catalog.py,sha256=x-sfVwoOS_0MeLICCqu7YUiFRgBam7vV1sHfaAKZGjE,5410
@@ -62,8 +66,9 @@ sqlframe/redshift/dataframe.py,sha256=aTC0DOPDFwWH1_b9T0Pif80cYSGudIp0D-cmkR7Ci_
62
66
  sqlframe/redshift/functions.py,sha256=DR5kodYAcKatUqopwrEQtxryI4ZSqaH47_y3WLht4Wg,455
63
67
  sqlframe/redshift/group.py,sha256=5MGZYJfHpzoRSQ0N_pn4KUk4Mk2gocQwU3K1-jAbvGg,391
64
68
  sqlframe/redshift/readwriter.py,sha256=g3FYKSsJKqcSnElprzzz29ZctoXq9tRB0Mj9Bm1HycI,870
65
- sqlframe/redshift/session.py,sha256=Hy49PMCHjY6c_BriW43yIp0mfjNmUp8MbCFx6cFYn3w,1454
69
+ sqlframe/redshift/session.py,sha256=nqqFxplCcIa_mN59xq3yHclMQ_dKchwuodx31xog55o,1593
66
70
  sqlframe/redshift/types.py,sha256=KwNyuXIo-2xVVd4bZED3YrQOobKCtemlxGrJL7DrTC8,34
71
+ sqlframe/redshift/udf.py,sha256=xOi7vtO56MyYprC3ys3FCSVJ5EVjEq2l_KqEVgKJrkw,264
67
72
  sqlframe/redshift/window.py,sha256=6GKPzuxeSapJakBaKBeT9VpED1ACdjggDv9JRILDyV0,35
68
73
  sqlframe/snowflake/__init__.py,sha256=nuQ3cuHjDpW4ELZfbd2qOYmtXmcYl7MtsrdOrRdozo0,746
69
74
  sqlframe/snowflake/catalog.py,sha256=Tp_B9oMTInnqLTiZNsT0UNc-a-aKXu3zFThlCwLeKCA,6507
@@ -73,8 +78,9 @@ sqlframe/snowflake/functions.py,sha256=iX67xU8Czy5k3HiNjNbN-x-via6yqGNaMPw1maV9H
73
78
  sqlframe/snowflake/functions.pyi,sha256=wqUPXuZxjRY0rPY2BRAb7XXkWYP1DyuDzvlriRySdSw,6185
74
79
  sqlframe/snowflake/group.py,sha256=pPP1l2RRo_LgkXrji8a87n2PKo-63ZRPT-WUtvVcBME,395
75
80
  sqlframe/snowflake/readwriter.py,sha256=yhRc2HcMq6PwV3ghZWC-q-qaE7LE4aEjZEXCip4OOlQ,884
76
- sqlframe/snowflake/session.py,sha256=YtcoKz4vII6NmC3hWahQlthImoCbzQO37Ww0-ZzSGDk,3194
81
+ sqlframe/snowflake/session.py,sha256=pCTb39olI5fzj7mrnuWupJs5EenDVDSH9goxueTXwiU,3338
77
82
  sqlframe/snowflake/types.py,sha256=KwNyuXIo-2xVVd4bZED3YrQOobKCtemlxGrJL7DrTC8,34
83
+ sqlframe/snowflake/udf.py,sha256=yzMmky-n5BXFbdldgfzLP8hCrVm0DgruSUCUUy1_3sk,268
78
84
  sqlframe/snowflake/window.py,sha256=6GKPzuxeSapJakBaKBeT9VpED1ACdjggDv9JRILDyV0,35
79
85
  sqlframe/spark/__init__.py,sha256=WhYQAZMJN1EMNAVGUH7BEinxNdYtXOrrr-6HUniJOyI,649
80
86
  sqlframe/spark/catalog.py,sha256=3T4aivgQmAhPTmlVk53jk3VvFBJlp1pKvWKNmTHz1W8,39741
@@ -84,8 +90,9 @@ sqlframe/spark/functions.py,sha256=AQfqfvaojJzCuo9DyDklz0JYZPhn_3dzWvztsklBO0o,5
84
90
  sqlframe/spark/functions.pyi,sha256=bjz6s8E6OB0c4KfTTsls7rhb_R9mIYvkaeaXefMziqM,11617
85
91
  sqlframe/spark/group.py,sha256=MrvV_v-YkBc6T1zz882WrEqtWjlooWIyHBCmTQg3fCA,379
86
92
  sqlframe/spark/readwriter.py,sha256=w68EImTcGJv64X7pc1tk5tDjDxb1nAnn-MiIaaN9Dc8,812
87
- sqlframe/spark/session.py,sha256=ADein7FMCutOriYVhQVQFMW--rdbuk-Y7Wzervs4DW0,5156
93
+ sqlframe/spark/session.py,sha256=eYwEANEMkP6djzUlm-p1WPkB6QZ4cdW_P4sx1K1wOwQ,5283
88
94
  sqlframe/spark/types.py,sha256=KwNyuXIo-2xVVd4bZED3YrQOobKCtemlxGrJL7DrTC8,34
95
+ sqlframe/spark/udf.py,sha256=owB8NDaGVkUQ0WGm7SZt2t9zfvLFCfi0W48QiPfgjck,1153
89
96
  sqlframe/spark/window.py,sha256=6GKPzuxeSapJakBaKBeT9VpED1ACdjggDv9JRILDyV0,35
90
97
  sqlframe/standalone/__init__.py,sha256=yu4A97HwhyDwllDEzG7io4ScyWipWSAH2tqUKS545OA,767
91
98
  sqlframe/standalone/catalog.py,sha256=oJAPxrXtra_YP_JBZCJY2qsr0TRhWG7FFSq0RHDszcU,389
@@ -94,13 +101,14 @@ sqlframe/standalone/dataframe.py,sha256=o6weWJvDX1w351p_14PQ52qopbPozVG9OFmhaqVv
94
101
  sqlframe/standalone/functions.py,sha256=NW-k7NP_Y9DzQq6fjX5-CL8oOUGAiaMo4SBuDd8-JUA,38
95
102
  sqlframe/standalone/group.py,sha256=oGEbAQMSm6AlkwnBxNI8r9enZWRwsRxc8zpzoz3rArk,399
96
103
  sqlframe/standalone/readwriter.py,sha256=EZNyDJ4ID6sGNog3uP4-e9RvchX4biJJDNtc5hkKkrY,633
97
- sqlframe/standalone/session.py,sha256=wQmdu2sv6KMTAv0LRFk7TY7yzlh3xvmsyqilEtRecbY,1191
104
+ sqlframe/standalone/session.py,sha256=h8EpjZOt4GiDBkqEC5dFdkv5PtCDF9TkD9spqp4olSE,1338
98
105
  sqlframe/standalone/types.py,sha256=KwNyuXIo-2xVVd4bZED3YrQOobKCtemlxGrJL7DrTC8,34
106
+ sqlframe/standalone/udf.py,sha256=azmgtUjHNIPs0WMVNId05SHwiYn41MKVBhKXsQJ5dmY,272
99
107
  sqlframe/standalone/window.py,sha256=6GKPzuxeSapJakBaKBeT9VpED1ACdjggDv9JRILDyV0,35
100
108
  sqlframe/testing/__init__.py,sha256=VVCosQhitU74A3NnE52O4mNtGZONapuEXcc20QmSlnQ,132
101
109
  sqlframe/testing/utils.py,sha256=9DDYVuocO7tygee3RaajuJNZ24sJwf_LY556kKg7kTw,13011
102
- sqlframe-2.0.0.dist-info/LICENSE,sha256=VZu79YgW780qxaFJMr0t5ZgbOYEh04xWoxaWOaqIGWk,1068
103
- sqlframe-2.0.0.dist-info/METADATA,sha256=Eluga2lgMiRawpetmiV1JF5aV9kxRvqK-F_4NKaKN7Q,7809
104
- sqlframe-2.0.0.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
105
- sqlframe-2.0.0.dist-info/top_level.txt,sha256=T0_RpoygaZSF6heeWwIDQgaP0varUdSK1pzjeJZRjM8,9
106
- sqlframe-2.0.0.dist-info/RECORD,,
110
+ sqlframe-2.1.0.dist-info/LICENSE,sha256=VZu79YgW780qxaFJMr0t5ZgbOYEh04xWoxaWOaqIGWk,1068
111
+ sqlframe-2.1.0.dist-info/METADATA,sha256=LkxVdNzdiCYsXSIsY-SSZ2qDq9RWvqA2_-cBS5p_N8Q,7810
112
+ sqlframe-2.1.0.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
113
+ sqlframe-2.1.0.dist-info/top_level.txt,sha256=T0_RpoygaZSF6heeWwIDQgaP0varUdSK1pzjeJZRjM8,9
114
+ sqlframe-2.1.0.dist-info/RECORD,,