sqlframe 4.2.0__tar.gz → 4.4.0__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.
Files changed (397) hide show
  1. sqlframe-4.4.0/.github/workflows/main.workflow.yaml +95 -0
  2. sqlframe-4.4.0/.superset/config.json +5 -0
  3. {sqlframe-4.2.0 → sqlframe-4.4.0}/PKG-INFO +2 -2
  4. {sqlframe-4.2.0 → sqlframe-4.4.0}/docs/bigquery.md +1 -0
  5. {sqlframe-4.2.0 → sqlframe-4.4.0}/docs/docs/bigquery.md +1 -0
  6. {sqlframe-4.2.0 → sqlframe-4.4.0}/docs/docs/duckdb.md +1 -0
  7. {sqlframe-4.2.0 → sqlframe-4.4.0}/docs/docs/postgres.md +1 -0
  8. {sqlframe-4.2.0 → sqlframe-4.4.0}/docs/duckdb.md +1 -0
  9. {sqlframe-4.2.0 → sqlframe-4.4.0}/docs/postgres.md +1 -0
  10. {sqlframe-4.2.0 → sqlframe-4.4.0}/docs/snowflake.md +1 -0
  11. {sqlframe-4.2.0 → sqlframe-4.4.0}/docs/spark.md +1 -0
  12. {sqlframe-4.2.0 → sqlframe-4.4.0}/pyproject.toml +1 -1
  13. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/_version.py +3 -3
  14. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/functions.py +9 -1
  15. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/readerwriter.py +71 -27
  16. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/databricks/readwriter.py +0 -11
  17. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/spark/readwriter.py +1 -13
  18. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe.egg-info/PKG-INFO +2 -2
  19. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe.egg-info/SOURCES.txt +4 -0
  20. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe.egg-info/requires.txt +1 -1
  21. sqlframe-4.4.0/sqlframe.egg-info/scm_file_list.json +390 -0
  22. sqlframe-4.4.0/sqlframe.egg-info/scm_version.json +8 -0
  23. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/test_engine_writer.py +32 -0
  24. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/standalone/test_functions.py +57 -0
  25. sqlframe-4.4.0/tests/unit/test_base_writer_options.py +90 -0
  26. {sqlframe-4.2.0 → sqlframe-4.4.0}/uv.lock +4 -4
  27. sqlframe-4.2.0/.github/workflows/main.workflow.yaml +0 -44
  28. {sqlframe-4.2.0 → sqlframe-4.4.0}/.claude/skills/sqlglot-upgrade/SKILL.md +0 -0
  29. {sqlframe-4.2.0 → sqlframe-4.4.0}/.github/CODEOWNERS +0 -0
  30. {sqlframe-4.2.0 → sqlframe-4.4.0}/.github/workflows/publish.workflow.yaml +0 -0
  31. {sqlframe-4.2.0 → sqlframe-4.4.0}/.gitignore +0 -0
  32. {sqlframe-4.2.0 → sqlframe-4.4.0}/.pre-commit-config.yaml +0 -0
  33. {sqlframe-4.2.0 → sqlframe-4.4.0}/.readthedocs.yaml +0 -0
  34. {sqlframe-4.2.0 → sqlframe-4.4.0}/CLAUDE.md +0 -0
  35. {sqlframe-4.2.0 → sqlframe-4.4.0}/LICENSE +0 -0
  36. {sqlframe-4.2.0 → sqlframe-4.4.0}/Makefile +0 -0
  37. {sqlframe-4.2.0 → sqlframe-4.4.0}/README.md +0 -0
  38. {sqlframe-4.2.0 → sqlframe-4.4.0}/blogs/add_chatgpt_support.md +0 -0
  39. {sqlframe-4.2.0 → sqlframe-4.4.0}/blogs/images/add_chatgpt_support/adding_ai_to_meal.jpeg +0 -0
  40. {sqlframe-4.2.0 → sqlframe-4.4.0}/blogs/images/add_chatgpt_support/hype_train.gif +0 -0
  41. {sqlframe-4.2.0 → sqlframe-4.4.0}/blogs/images/add_chatgpt_support/marvin_paranoid_robot.gif +0 -0
  42. {sqlframe-4.2.0 → sqlframe-4.4.0}/blogs/images/add_chatgpt_support/nonsense_sql.png +0 -0
  43. {sqlframe-4.2.0 → sqlframe-4.4.0}/blogs/images/add_chatgpt_support/openai_full_rewrite.png +0 -0
  44. {sqlframe-4.2.0 → sqlframe-4.4.0}/blogs/images/add_chatgpt_support/openai_replacing_cte_names.png +0 -0
  45. {sqlframe-4.2.0 → sqlframe-4.4.0}/blogs/images/add_chatgpt_support/sqlglot_optimized_code.png +0 -0
  46. {sqlframe-4.2.0 → sqlframe-4.4.0}/blogs/images/add_chatgpt_support/sunny_shake_head_no.gif +0 -0
  47. {sqlframe-4.2.0 → sqlframe-4.4.0}/blogs/images/but_wait_theres_more.gif +0 -0
  48. {sqlframe-4.2.0 → sqlframe-4.4.0}/blogs/images/cake.gif +0 -0
  49. {sqlframe-4.2.0 → sqlframe-4.4.0}/blogs/images/you_get_pyspark_api.gif +0 -0
  50. {sqlframe-4.2.0 → sqlframe-4.4.0}/blogs/sqlframe_universal_dataframe_api.md +0 -0
  51. {sqlframe-4.2.0 → sqlframe-4.4.0}/docs/configuration.md +0 -0
  52. {sqlframe-4.2.0 → sqlframe-4.4.0}/docs/databricks.md +0 -0
  53. {sqlframe-4.2.0 → sqlframe-4.4.0}/docs/docs/images/SF.png +0 -0
  54. {sqlframe-4.2.0 → sqlframe-4.4.0}/docs/docs/images/favicon.png +0 -0
  55. {sqlframe-4.2.0 → sqlframe-4.4.0}/docs/docs/images/sqlframe_logo.png +0 -0
  56. {sqlframe-4.2.0 → sqlframe-4.4.0}/docs/images/SF.png +0 -0
  57. {sqlframe-4.2.0 → sqlframe-4.4.0}/docs/images/favicon.png +0 -0
  58. {sqlframe-4.2.0 → sqlframe-4.4.0}/docs/images/sqlframe_logo.png +0 -0
  59. {sqlframe-4.2.0 → sqlframe-4.4.0}/docs/index.md +0 -0
  60. {sqlframe-4.2.0 → sqlframe-4.4.0}/docs/redshift.md +0 -0
  61. {sqlframe-4.2.0 → sqlframe-4.4.0}/docs/requirements.txt +0 -0
  62. {sqlframe-4.2.0 → sqlframe-4.4.0}/docs/standalone.md +0 -0
  63. {sqlframe-4.2.0 → sqlframe-4.4.0}/docs/stylesheets/extra.css +0 -0
  64. {sqlframe-4.2.0 → sqlframe-4.4.0}/mkdocs.yml +0 -0
  65. {sqlframe-4.2.0 → sqlframe-4.4.0}/renovate.json +0 -0
  66. {sqlframe-4.2.0 → sqlframe-4.4.0}/setup.cfg +0 -0
  67. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/LICENSE +0 -0
  68. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/__init__.py +0 -0
  69. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/__init__.py +0 -0
  70. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/_typing.py +0 -0
  71. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/catalog.py +0 -0
  72. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/column.py +0 -0
  73. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/dataframe.py +0 -0
  74. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/decorators.py +0 -0
  75. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/exceptions.py +0 -0
  76. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/function_alternatives.py +0 -0
  77. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/group.py +0 -0
  78. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/mixins/__init__.py +0 -0
  79. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/mixins/catalog_mixins.py +0 -0
  80. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/mixins/dataframe_mixins.py +0 -0
  81. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/mixins/readwriter_mixins.py +0 -0
  82. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/mixins/table_mixins.py +0 -0
  83. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/normalize.py +0 -0
  84. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/operations.py +0 -0
  85. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/session.py +0 -0
  86. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/table.py +0 -0
  87. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/transforms.py +0 -0
  88. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/types.py +0 -0
  89. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/udf.py +0 -0
  90. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/util.py +0 -0
  91. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/base/window.py +0 -0
  92. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/bigquery/__init__.py +0 -0
  93. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/bigquery/catalog.py +0 -0
  94. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/bigquery/column.py +0 -0
  95. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/bigquery/dataframe.py +0 -0
  96. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/bigquery/functions.py +0 -0
  97. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/bigquery/functions.pyi +0 -0
  98. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/bigquery/group.py +0 -0
  99. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/bigquery/readwriter.py +0 -0
  100. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/bigquery/session.py +0 -0
  101. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/bigquery/table.py +0 -0
  102. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/bigquery/types.py +0 -0
  103. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/bigquery/udf.py +0 -0
  104. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/bigquery/window.py +0 -0
  105. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/databricks/__init__.py +0 -0
  106. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/databricks/catalog.py +0 -0
  107. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/databricks/column.py +0 -0
  108. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/databricks/dataframe.py +0 -0
  109. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/databricks/functions.py +0 -0
  110. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/databricks/functions.pyi +0 -0
  111. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/databricks/group.py +0 -0
  112. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/databricks/session.py +0 -0
  113. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/databricks/table.py +0 -0
  114. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/databricks/types.py +0 -0
  115. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/databricks/udf.py +0 -0
  116. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/databricks/window.py +0 -0
  117. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/duckdb/__init__.py +0 -0
  118. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/duckdb/catalog.py +0 -0
  119. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/duckdb/column.py +0 -0
  120. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/duckdb/dataframe.py +0 -0
  121. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/duckdb/functions.py +0 -0
  122. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/duckdb/functions.pyi +0 -0
  123. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/duckdb/group.py +0 -0
  124. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/duckdb/readwriter.py +0 -0
  125. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/duckdb/session.py +0 -0
  126. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/duckdb/table.py +0 -0
  127. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/duckdb/types.py +0 -0
  128. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/duckdb/udf.py +0 -0
  129. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/duckdb/window.py +0 -0
  130. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/postgres/__init__.py +0 -0
  131. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/postgres/catalog.py +0 -0
  132. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/postgres/column.py +0 -0
  133. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/postgres/dataframe.py +0 -0
  134. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/postgres/functions.py +0 -0
  135. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/postgres/functions.pyi +0 -0
  136. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/postgres/group.py +0 -0
  137. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/postgres/readwriter.py +0 -0
  138. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/postgres/session.py +0 -0
  139. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/postgres/table.py +0 -0
  140. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/postgres/types.py +0 -0
  141. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/postgres/udf.py +0 -0
  142. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/postgres/window.py +0 -0
  143. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/py.typed +0 -0
  144. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/redshift/__init__.py +0 -0
  145. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/redshift/catalog.py +0 -0
  146. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/redshift/column.py +0 -0
  147. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/redshift/dataframe.py +0 -0
  148. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/redshift/functions.py +0 -0
  149. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/redshift/group.py +0 -0
  150. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/redshift/readwriter.py +0 -0
  151. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/redshift/session.py +0 -0
  152. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/redshift/table.py +0 -0
  153. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/redshift/types.py +0 -0
  154. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/redshift/udf.py +0 -0
  155. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/redshift/window.py +0 -0
  156. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/snowflake/__init__.py +0 -0
  157. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/snowflake/catalog.py +0 -0
  158. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/snowflake/column.py +0 -0
  159. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/snowflake/dataframe.py +0 -0
  160. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/snowflake/functions.py +0 -0
  161. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/snowflake/functions.pyi +0 -0
  162. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/snowflake/group.py +0 -0
  163. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/snowflake/readwriter.py +0 -0
  164. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/snowflake/session.py +0 -0
  165. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/snowflake/table.py +0 -0
  166. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/snowflake/types.py +0 -0
  167. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/snowflake/udf.py +0 -0
  168. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/snowflake/window.py +0 -0
  169. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/spark/__init__.py +0 -0
  170. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/spark/catalog.py +0 -0
  171. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/spark/column.py +0 -0
  172. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/spark/dataframe.py +0 -0
  173. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/spark/functions.py +0 -0
  174. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/spark/functions.pyi +0 -0
  175. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/spark/group.py +0 -0
  176. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/spark/session.py +0 -0
  177. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/spark/table.py +0 -0
  178. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/spark/types.py +0 -0
  179. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/spark/udf.py +0 -0
  180. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/spark/window.py +0 -0
  181. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/standalone/__init__.py +0 -0
  182. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/standalone/catalog.py +0 -0
  183. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/standalone/column.py +0 -0
  184. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/standalone/dataframe.py +0 -0
  185. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/standalone/functions.py +0 -0
  186. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/standalone/group.py +0 -0
  187. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/standalone/readwriter.py +0 -0
  188. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/standalone/session.py +0 -0
  189. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/standalone/table.py +0 -0
  190. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/standalone/types.py +0 -0
  191. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/standalone/udf.py +0 -0
  192. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/standalone/window.py +0 -0
  193. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/testing/__init__.py +0 -0
  194. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe/testing/utils.py +0 -0
  195. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe.egg-info/dependency_links.txt +0 -0
  196. {sqlframe-4.2.0 → sqlframe-4.4.0}/sqlframe.egg-info/top_level.txt +0 -0
  197. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/__init__.py +0 -0
  198. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/common_fixtures.py +0 -0
  199. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/conftest.py +0 -0
  200. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/employee.csv +0 -0
  201. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/employee.json +0 -0
  202. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/employee.parquet +0 -0
  203. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/employee_delta/.part-00000-e5965c7b-e58f-4d3c-ad56-002876814e3a-c000.snappy.parquet.crc +0 -0
  204. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/employee_delta/.part-00002-3fed7f18-370f-4b16-b232-504d6194eb52-c000.snappy.parquet.crc +0 -0
  205. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/employee_delta/.part-00004-143c5da1-d5ab-4706-8e84-0d2a324c6894-c000.snappy.parquet.crc +0 -0
  206. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/employee_delta/.part-00006-64f07e25-c30e-4075-acc6-b3c69c4ce80b-c000.snappy.parquet.crc +0 -0
  207. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/employee_delta/.part-00008-89ccad8d-df73-4ad5-8850-82ef3884db60-c000.snappy.parquet.crc +0 -0
  208. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/employee_delta/.part-00010-812b3382-8c7f-4c4e-9bcd-09ce8664f6e0-c000.snappy.parquet.crc +0 -0
  209. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/employee_delta/_delta_log/.00000000000000000000.json.crc +0 -0
  210. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/employee_delta/_delta_log/00000000000000000000.json +0 -0
  211. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/employee_delta/part-00000-e5965c7b-e58f-4d3c-ad56-002876814e3a-c000.snappy.parquet +0 -0
  212. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/employee_delta/part-00002-3fed7f18-370f-4b16-b232-504d6194eb52-c000.snappy.parquet +0 -0
  213. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/employee_delta/part-00004-143c5da1-d5ab-4706-8e84-0d2a324c6894-c000.snappy.parquet +0 -0
  214. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/employee_delta/part-00006-64f07e25-c30e-4075-acc6-b3c69c4ce80b-c000.snappy.parquet +0 -0
  215. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/employee_delta/part-00008-89ccad8d-df73-4ad5-8850-82ef3884db60-c000.snappy.parquet +0 -0
  216. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/employee_delta/part-00010-812b3382-8c7f-4c4e-9bcd-09ce8664f6e0-c000.snappy.parquet +0 -0
  217. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/employee_extra_line.csv +0 -0
  218. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/issue_219.csv +0 -0
  219. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/netflix_daily_top_10.parquet +0 -0
  220. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds1.sql +0 -0
  221. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds10.sql +0 -0
  222. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds11.sql +0 -0
  223. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds12.sql +0 -0
  224. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds13.sql +0 -0
  225. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds14.sql +0 -0
  226. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds15.sql +0 -0
  227. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds16.sql +0 -0
  228. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds17.sql +0 -0
  229. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds18.sql +0 -0
  230. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds19.sql +0 -0
  231. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds2.sql +0 -0
  232. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds20.sql +0 -0
  233. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds21.sql +0 -0
  234. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds22.sql +0 -0
  235. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds23.sql +0 -0
  236. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds24.sql +0 -0
  237. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds25.sql +0 -0
  238. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds26.sql +0 -0
  239. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds27.sql +0 -0
  240. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds28.sql +0 -0
  241. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds29.sql +0 -0
  242. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds3.sql +0 -0
  243. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds30.sql +0 -0
  244. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds31.sql +0 -0
  245. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds32.sql +0 -0
  246. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds33.sql +0 -0
  247. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds34.sql +0 -0
  248. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds35.sql +0 -0
  249. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds36.sql +0 -0
  250. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds37.sql +0 -0
  251. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds38.sql +0 -0
  252. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds39.sql +0 -0
  253. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds4.sql +0 -0
  254. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds40.sql +0 -0
  255. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds41.sql +0 -0
  256. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds42.sql +0 -0
  257. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds43.sql +0 -0
  258. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds44.sql +0 -0
  259. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds45.sql +0 -0
  260. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds46.sql +0 -0
  261. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds47.sql +0 -0
  262. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds48.sql +0 -0
  263. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds49.sql +0 -0
  264. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds5.sql +0 -0
  265. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds50.sql +0 -0
  266. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds51.sql +0 -0
  267. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds52.sql +0 -0
  268. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds53.sql +0 -0
  269. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds54.sql +0 -0
  270. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds55.sql +0 -0
  271. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds56.sql +0 -0
  272. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds57.sql +0 -0
  273. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds58.sql +0 -0
  274. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds59.sql +0 -0
  275. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds6.sql +0 -0
  276. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds60.sql +0 -0
  277. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds61.sql +0 -0
  278. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds62.sql +0 -0
  279. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds63.sql +0 -0
  280. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds64.sql +0 -0
  281. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds65.sql +0 -0
  282. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds66.sql +0 -0
  283. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds67.sql +0 -0
  284. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds68.sql +0 -0
  285. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds69.sql +0 -0
  286. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds7.sql +0 -0
  287. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds70.sql +0 -0
  288. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds71.sql +0 -0
  289. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds72.sql +0 -0
  290. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds73.sql +0 -0
  291. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds74.sql +0 -0
  292. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds75.sql +0 -0
  293. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds76.sql +0 -0
  294. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds77.sql +0 -0
  295. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds78.sql +0 -0
  296. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds79.sql +0 -0
  297. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds8.sql +0 -0
  298. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds80.sql +0 -0
  299. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds81.sql +0 -0
  300. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds82.sql +0 -0
  301. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds83.sql +0 -0
  302. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds84.sql +0 -0
  303. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds85.sql +0 -0
  304. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds86.sql +0 -0
  305. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds87.sql +0 -0
  306. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds88.sql +0 -0
  307. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds89.sql +0 -0
  308. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds9.sql +0 -0
  309. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds90.sql +0 -0
  310. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds91.sql +0 -0
  311. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds92.sql +0 -0
  312. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds93.sql +0 -0
  313. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds94.sql +0 -0
  314. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds95.sql +0 -0
  315. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds96.sql +0 -0
  316. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds97.sql +0 -0
  317. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds98.sql +0 -0
  318. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/fixtures/tpcds/tpcds99.sql +0 -0
  319. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/__init__.py +0 -0
  320. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/__init__.py +0 -0
  321. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/bigquery/__init__.py +0 -0
  322. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/bigquery/test_bigquery_catalog.py +0 -0
  323. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/bigquery/test_bigquery_dataframe.py +0 -0
  324. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/bigquery/test_bigquery_session.py +0 -0
  325. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/databricks/__init__.py +0 -0
  326. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/databricks/test_databricks_catalog.py +0 -0
  327. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/databricks/test_databricks_dataframe.py +0 -0
  328. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/databricks/test_databricks_session.py +0 -0
  329. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/duck/__init__.py +0 -0
  330. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/duck/test_duckdb_activate.py +0 -0
  331. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/duck/test_duckdb_catalog.py +0 -0
  332. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/duck/test_duckdb_dataframe.py +0 -0
  333. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/duck/test_duckdb_reader.py +0 -0
  334. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/duck/test_duckdb_session.py +0 -0
  335. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/duck/test_duckdb_udf.py +0 -0
  336. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/duck/test_tpcds.py +0 -0
  337. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/postgres/__init__.py +0 -0
  338. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/postgres/test_postgres_activate.py +0 -0
  339. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/postgres/test_postgres_catalog.py +0 -0
  340. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/postgres/test_postgres_dataframe.py +0 -0
  341. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/postgres/test_postgres_session.py +0 -0
  342. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/redshift/__init__.py +0 -0
  343. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/redshift/test_redshift_catalog.py +0 -0
  344. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/redshift/test_redshift_session.py +0 -0
  345. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/snowflake/__init__.py +0 -0
  346. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/snowflake/test_snowflake_catalog.py +0 -0
  347. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/snowflake/test_snowflake_dataframe.py +0 -0
  348. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/snowflake/test_snowflake_session.py +0 -0
  349. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/spark/__init__.py +0 -0
  350. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/spark/test_spark_catalog.py +0 -0
  351. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/spark/test_spark_dataframe.py +0 -0
  352. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/test_engine_column.py +0 -0
  353. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/test_engine_dataframe.py +0 -0
  354. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/test_engine_reader.py +0 -0
  355. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/test_engine_session.py +0 -0
  356. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/test_engine_table.py +0 -0
  357. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/test_int_functions.py +0 -0
  358. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/engines/test_int_testing.py +0 -0
  359. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/fixtures.py +0 -0
  360. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/test_int_dataframe.py +0 -0
  361. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/test_int_dataframe_stats.py +0 -0
  362. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/test_int_grouped_data.py +0 -0
  363. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/integration/test_int_session.py +0 -0
  364. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/types.py +0 -0
  365. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/__init__.py +0 -0
  366. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/bigquery/__init__.py +0 -0
  367. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/bigquery/test_activate.py +0 -0
  368. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/conftest.py +0 -0
  369. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/databricks/__init__.py +0 -0
  370. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/databricks/test_activate.py +0 -0
  371. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/duck/__init__.py +0 -0
  372. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/duck/test_activate.py +0 -0
  373. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/duck/test_functions.py +0 -0
  374. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/duck/test_reader_options.py +0 -0
  375. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/postgres/__init__.py +0 -0
  376. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/postgres/test_activate.py +0 -0
  377. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/redshift/__init__.py +0 -0
  378. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/redshift/test_activate.py +0 -0
  379. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/snowflake/__init__.py +0 -0
  380. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/snowflake/test_activate.py +0 -0
  381. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/spark/__init__.py +0 -0
  382. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/spark/test_activate.py +0 -0
  383. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/spark/test_reader_options.py +0 -0
  384. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/standalone/__init__.py +0 -0
  385. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/standalone/fixtures.py +0 -0
  386. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/standalone/test_activate.py +0 -0
  387. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/standalone/test_column.py +0 -0
  388. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/standalone/test_dataframe.py +0 -0
  389. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/standalone/test_dataframe_writer.py +0 -0
  390. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/standalone/test_session.py +0 -0
  391. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/standalone/test_session_case_sensitivity.py +0 -0
  392. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/standalone/test_types.py +0 -0
  393. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/standalone/test_window.py +0 -0
  394. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/test_activate.py +0 -0
  395. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/test_base_reader_options.py +0 -0
  396. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/test_catalog.py +0 -0
  397. {sqlframe-4.2.0 → sqlframe-4.4.0}/tests/unit/test_util.py +0 -0
@@ -0,0 +1,95 @@
1
+ name: SQLFrame
2
+ on:
3
+ push:
4
+ branches:
5
+ - main
6
+ paths:
7
+ - 'sqlframe/**'
8
+ - 'tests/**'
9
+ - 'Makefile'
10
+ - 'pyproject.toml'
11
+ pull_request:
12
+ types:
13
+ - synchronize
14
+ - opened
15
+ paths:
16
+ - 'sqlframe/**'
17
+ - 'tests/**'
18
+ - 'Makefile'
19
+ - 'pyproject.toml'
20
+ - 'uv.lock'
21
+ jobs:
22
+ run-tests:
23
+ runs-on: ubuntu-latest
24
+ env:
25
+ PYTEST_XDIST_AUTO_NUM_WORKERS: 4
26
+ strategy:
27
+ matrix:
28
+ python-version: ['3.10', '3.11', '3.12', '3.13']
29
+ steps:
30
+ - name: Checkout
31
+ uses: actions/checkout@v6
32
+ - name: Install uv
33
+ uses: astral-sh/setup-uv@v7
34
+ with:
35
+ python-version: ${{ matrix.python-version }}
36
+ enable-cache: true
37
+ - name: Install dependencies
38
+ run: uv sync --all-extras
39
+ - name: Run Style
40
+ run: uv run make style
41
+ - name: Configure Postgres
42
+ run: |
43
+ echo "/usr/lib/postgresql/16/bin" >> "$GITHUB_PATH"
44
+ /usr/lib/postgresql/16/bin/postgres --version
45
+ - name: Run tests
46
+ run: uv run make local-test
47
+ minimum-sqlglot:
48
+ runs-on: ubuntu-latest
49
+ env:
50
+ PYTEST_XDIST_AUTO_NUM_WORKERS: 4
51
+ steps:
52
+ - name: Checkout
53
+ uses: actions/checkout@v6
54
+ - name: Install uv
55
+ uses: astral-sh/setup-uv@v7
56
+ with:
57
+ python-version: '3.12'
58
+ enable-cache: true
59
+ - name: Resolve SQLGlot minimum from project metadata
60
+ id: resolve_sqlglot
61
+ shell: bash
62
+ run: |
63
+ set -euo pipefail
64
+ requirements_file="$(mktemp)"
65
+ uv pip compile pyproject.toml --resolution lowest-direct --no-deps --quiet --output-file "$requirements_file"
66
+
67
+ sqlglot_pin_count=0
68
+ sqlglot_pin=""
69
+ while IFS= read -r pin; do
70
+ sqlglot_pin_count=$((sqlglot_pin_count + 1))
71
+ sqlglot_pin="$pin"
72
+ done < <(grep -iE '^sqlglot==[^[:space:]]+$' "$requirements_file" || true)
73
+ if [[ "$sqlglot_pin_count" -ne 1 ]]; then
74
+ echo "Expected exactly one SQLGlot pin, found $sqlglot_pin_count" >&2
75
+ cat "$requirements_file" >&2
76
+ exit 1
77
+ fi
78
+
79
+ echo "Resolved SQLGlot minimum from pyproject.toml: $sqlglot_pin"
80
+ echo "sqlglot_pin=$sqlglot_pin" >> "$GITHUB_OUTPUT"
81
+ {
82
+ echo "### SQLGlot minimum compatibility"
83
+ echo
84
+ echo "Resolved from pyproject.toml: $sqlglot_pin."
85
+ } >> "$GITHUB_STEP_SUMMARY"
86
+ - name: Install normal dependencies
87
+ run: uv sync --all-extras --locked
88
+ - name: Layer resolved SQLGlot minimum
89
+ env:
90
+ SQLGLOT_PIN: ${{ steps.resolve_sqlglot.outputs.sqlglot_pin }}
91
+ run: |
92
+ uv pip install --python .venv/bin/python "$SQLGLOT_PIN"
93
+ .venv/bin/python -c 'import sqlglot; print(f"Testing SQLGlot {sqlglot.__version__}")'
94
+ - name: Run unit tests at resolved SQLGlot minimum
95
+ run: uv run --no-sync pytest -n 0 tests/unit
@@ -0,0 +1,5 @@
1
+ {
2
+ "setup": ["make install-dev"],
3
+ "teardown": [],
4
+ "run": ["make docs-serve"]
5
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlframe
3
- Version: 4.2.0
3
+ Version: 4.4.0
4
4
  Summary: Turning PySpark Into a Universal DataFrame API
5
5
  Author-email: Ryan Eakman <eakmanrq@gmail.com>
6
6
  License: MIT
@@ -16,7 +16,7 @@ Requires-Python: >=3.10
16
16
  Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
18
  Requires-Dist: prettytable<4
19
- Requires-Dist: sqlglot<30.9,>=28.0.0
19
+ Requires-Dist: sqlglot<30.13,>=30.0.0
20
20
  Requires-Dist: typing_extensions
21
21
  Requires-Dist: more-itertools
22
22
  Provides-Extra: bigquery
@@ -585,6 +585,7 @@ See something that you would like to see supported? [Open an issue](https://gith
585
585
  * [json](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.json.html)
586
586
  * [mode](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.mode.html)
587
587
  * [parquet](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.parquet.html)
588
+ * [save](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.save.html)
588
589
  * [saveAsTable](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.saveAsTable.html)
589
590
  * sql
590
591
  * SQLFrame Specific: Get the SQL representation of the DataFrame
@@ -426,6 +426,7 @@ print(session.catalog.listColumns(table_path))
426
426
  * [json](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.json.html)
427
427
  * [mode](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.mode.html)
428
428
  * [parquet](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.parquet.html)
429
+ * [save](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.save.html)
429
430
  * [saveAsTable](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.saveAsTable.html)
430
431
  * sql
431
432
  * SQLFrame Specific: Get the SQL representation of the DataFrame
@@ -417,6 +417,7 @@ df_store = session.createDataFrame(
417
417
  * [json](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.json.html)
418
418
  * [mode](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.mode.html)
419
419
  * [parquet](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.parquet.html)
420
+ * [save](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.save.html)
420
421
  * [saveAsTable](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.saveAsTable.html)
421
422
  * sql
422
423
  * SQLFrame Specific: Get the SQL representation of the DataFrame
@@ -378,6 +378,7 @@ df_store = session.createDataFrame(
378
378
  * [json](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.json.html)
379
379
  * [mode](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.mode.html)
380
380
  * [parquet](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.parquet.html)
381
+ * [save](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.save.html)
381
382
  * [saveAsTable](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.saveAsTable.html)
382
383
  * sql
383
384
  * SQLFrame Specific: Get the SQL representation of the DataFrame
@@ -562,6 +562,7 @@ See something that you would like to see supported? [Open an issue](https://gith
562
562
  * [json](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.json.html)
563
563
  * [mode](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.mode.html)
564
564
  * [parquet](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.parquet.html)
565
+ * [save](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.save.html)
565
566
  * [saveAsTable](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.saveAsTable.html)
566
567
  * sql
567
568
  * SQLFrame Specific: Get the SQL representation of the DataFrame
@@ -527,6 +527,7 @@ See something that you would like to see supported? [Open an issue](https://gith
527
527
  * [json](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.json.html)
528
528
  * [mode](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.mode.html)
529
529
  * [parquet](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.parquet.html)
530
+ * [save](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.save.html)
530
531
  * [saveAsTable](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.saveAsTable.html)
531
532
  * sql
532
533
  * SQLFrame Specific: Get the SQL representation of the DataFrame
@@ -593,6 +593,7 @@ See something that you would like to see supported? [Open an issue](https://gith
593
593
  * [json](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.json.html)
594
594
  * [mode](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.mode.html)
595
595
  * [parquet](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.parquet.html)
596
+ * [save](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.save.html)
596
597
  * [saveAsTable](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.saveAsTable.html)
597
598
  * sql
598
599
  * SQLFrame Specific: Get the SQL representation of the DataFrame
@@ -210,6 +210,7 @@ All functions through 4.0 are supported. Please [open an issue](https://github.c
210
210
  * [json](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.json.html)
211
211
  * [mode](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.mode.html)
212
212
  * [parquet](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.parquet.html)
213
+ * [save](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.save.html)
213
214
  * [saveAsTable](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrameWriter.saveAsTable.html)
214
215
  * sql
215
216
  * SQLFrame Specific: Get the SQL representation of the DataFrame
@@ -12,7 +12,7 @@ requires-python = ">=3.10"
12
12
  dynamic = ["version"]
13
13
  dependencies = [
14
14
  "prettytable<4",
15
- "sqlglot>=28.0.0,<30.9",
15
+ "sqlglot>=30.0.0,<30.13",
16
16
  "typing_extensions",
17
17
  "more-itertools",
18
18
  ]
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '4.2.0'
22
- __version_tuple__ = version_tuple = (4, 2, 0)
21
+ __version__ = version = '4.4.0'
22
+ __version_tuple__ = version_tuple = (4, 4, 0)
23
23
 
24
- __commit_id__ = commit_id = 'g7ed017c46'
24
+ __commit_id__ = commit_id = 'g7c98f85ae'
@@ -1731,7 +1731,7 @@ def concat_ws(sep: str, *cols: ColumnOrName) -> Column:
1731
1731
  expression.ConcatWs(
1732
1732
  expressions=[lit(sep).column_expression]
1733
1733
  + [Column.ensure_col(col).column_expression for col in cols],
1734
- coalesce=True,
1734
+ coalesce=getattr(session.execution_dialect, "CONCAT_WS_COALESCE", False),
1735
1735
  )
1736
1736
  )
1737
1737
 
@@ -2937,6 +2937,14 @@ def try_avg(col: ColumnOrName) -> Column:
2937
2937
 
2938
2938
  @meta()
2939
2939
  def try_divide(left: ColumnOrName, right: ColumnOrName) -> Column:
2940
+ session = _get_session()
2941
+ generator = session.execution_dialect.generator_class
2942
+ if (
2943
+ session.execution_dialect_name in {"spark", "databricks"}
2944
+ and expression.SafeDivide not in generator.TRANSFORMS
2945
+ ):
2946
+ return Column.invoke_anonymous_function(left, "TRY_DIVIDE", right)
2947
+
2940
2948
  return Column.invoke_expression_over_column(
2941
2949
  left, expression.SafeDivide, expression=Column.ensure_col(right).column_expression
2942
2950
  )
@@ -485,11 +485,13 @@ class _BaseDataFrameWriter(t.Generic[SESSION, DF]):
485
485
  mode: t.Optional[str] = None,
486
486
  by_name: bool = False,
487
487
  state_format_to_write: t.Optional[str] = None,
488
+ state_options: t.Optional[t.Dict[str, OptionalPrimitiveType]] = None,
488
489
  ):
489
490
  self._df = df
490
491
  self._mode = mode
491
492
  self._by_name = by_name
492
493
  self._state_format_to_write = state_format_to_write
494
+ self.state_options = dict(state_options or {})
493
495
 
494
496
  @property
495
497
  def _session(self) -> SESSION:
@@ -513,6 +515,14 @@ class _BaseDataFrameWriter(t.Generic[SESSION, DF]):
513
515
  def byName(self) -> Self:
514
516
  return self.copy(by_name=True)
515
517
 
518
+ def options(self, **options: OptionalPrimitiveType) -> Self:
519
+ self.state_options = {**self.state_options, **options}
520
+ return self
521
+
522
+ def option(self, key: str, value: OptionalPrimitiveType) -> Self:
523
+ self.state_options[key] = value
524
+ return self
525
+
516
526
  def insertInto(self, tableName: str, overwrite: t.Optional[bool] = None) -> Self:
517
527
  from sqlframe.base.session import _BaseSession
518
528
 
@@ -580,6 +590,20 @@ class _BaseDataFrameWriter(t.Generic[SESSION, DF]):
580
590
  def _write(self, path: str, mode: t.Optional[str], format: str, **options) -> None:
581
591
  raise NotImplementedError
582
592
 
593
+ def save(
594
+ self,
595
+ path: t.Optional[str] = None,
596
+ format: t.Optional[str] = None,
597
+ mode: t.Optional[str] = None,
598
+ partitionBy: t.Optional[t.Union[str, t.List[str]]] = None,
599
+ **options: OptionalPrimitiveType,
600
+ ) -> None:
601
+ assert path is not None, "path is required"
602
+ format = format or self._state_format_to_write or "parquet"
603
+ mode = mode or self._mode
604
+ all_options = {**self.state_options, **{k: v for k, v in options.items() if v is not None}}
605
+ self._write(path=path, mode=mode, format=format, partitionBy=partitionBy, **all_options)
606
+
583
607
  def format(self, source: str) -> "Self":
584
608
  """Specifies the input data source format.
585
609
 
@@ -679,16 +703,23 @@ class _BaseDataFrameWriter(t.Generic[SESSION, DF]):
679
703
  |100|Hyukjin Kwon|
680
704
  +---+------------+
681
705
  """
706
+ method_options = {
707
+ "compression": compression,
708
+ "dateFormat": dateFormat,
709
+ "timestampFormat": timestampFormat,
710
+ "lineSep": lineSep,
711
+ "encoding": encoding,
712
+ "ignoreNullFields": ignoreNullFields,
713
+ }
714
+ all_options = {
715
+ **self.state_options,
716
+ **{k: v for k, v in method_options.items() if v is not None},
717
+ }
682
718
  self._write(
683
719
  path=path,
684
- mode=mode,
720
+ mode=mode or self._mode,
685
721
  format="json",
686
- compression=compression,
687
- dateFormat=dateFormat,
688
- timestampFormat=timestampFormat,
689
- lineSep=lineSep,
690
- encoding=encoding,
691
- ignoreNullFields=ignoreNullFields,
722
+ **all_options,
692
723
  )
693
724
 
694
725
  def parquet(
@@ -748,9 +779,15 @@ class _BaseDataFrameWriter(t.Generic[SESSION, DF]):
748
779
  |100|Hyukjin Kwon|
749
780
  +---+------------+
750
781
  """
751
- self._write(
752
- path=path, mode=mode, format="parquet", compression=compression, partitionBy=partitionBy
753
- )
782
+ method_options = {
783
+ "compression": compression,
784
+ "partitionBy": partitionBy,
785
+ }
786
+ all_options = {
787
+ **self.state_options,
788
+ **{k: v for k, v in method_options.items() if v is not None},
789
+ }
790
+ self._write(path=path, mode=mode or self._mode, format="parquet", **all_options)
754
791
 
755
792
  def csv(
756
793
  self,
@@ -821,26 +858,33 @@ class _BaseDataFrameWriter(t.Generic[SESSION, DF]):
821
858
  |100|NULL|
822
859
  +---+----+
823
860
  """
861
+ method_options = {
862
+ "compression": compression,
863
+ "sep": sep,
864
+ "quote": quote,
865
+ "escape": escape,
866
+ "header": header,
867
+ "nullValue": nullValue,
868
+ "escapeQuotes": escapeQuotes,
869
+ "quoteAll": quoteAll,
870
+ "dateFormat": dateFormat,
871
+ "timestampFormat": timestampFormat,
872
+ "ignoreLeadingWhiteSpace": ignoreLeadingWhiteSpace,
873
+ "ignoreTrailingWhiteSpace": ignoreTrailingWhiteSpace,
874
+ "charToEscapeQuoteEscaping": charToEscapeQuoteEscaping,
875
+ "encoding": encoding,
876
+ "emptyValue": emptyValue,
877
+ "lineSep": lineSep,
878
+ }
879
+ all_options = {
880
+ **self.state_options,
881
+ **{k: v for k, v in method_options.items() if v is not None},
882
+ }
824
883
  self._write(
825
884
  path=path,
826
- mode=mode,
885
+ mode=mode or self._mode,
827
886
  format="csv",
828
- compression=compression,
829
- sep=sep,
830
- quote=quote,
831
- escape=escape,
832
- header=header,
833
- nullValue=nullValue,
834
- escapeQuotes=escapeQuotes,
835
- quoteAll=quoteAll,
836
- dateFormat=dateFormat,
837
- timestampFormat=timestampFormat,
838
- ignoreLeadingWhiteSpace=ignoreLeadingWhiteSpace,
839
- ignoreTrailingWhiteSpace=ignoreTrailingWhiteSpace,
840
- charToEscapeQuoteEscaping=charToEscapeQuoteEscaping,
841
- encoding=encoding,
842
- emptyValue=emptyValue,
843
- lineSep=lineSep,
887
+ **all_options,
844
888
  )
845
889
 
846
890
 
@@ -148,17 +148,6 @@ class DatabricksDataFrameWriter(
148
148
  PandasWriterMixin["DatabricksSession", "DatabricksDataFrame"],
149
149
  _BaseDataFrameWriter["DatabricksSession", "DatabricksDataFrame"],
150
150
  ):
151
- def save(
152
- self,
153
- path: str,
154
- mode: t.Optional[str] = None,
155
- format: t.Optional[str] = None,
156
- partitionBy: t.Optional[t.Union[str, t.List[str]]] = None,
157
- **options,
158
- ):
159
- format = str(format or self._state_format_to_write)
160
- self._write(path, mode, format, partitionBy=partitionBy, **options)
161
-
162
151
  def _write(self, path: str, mode: t.Optional[str], format: str, **options):
163
152
  fs_prefix, filepath = split_filepath(path)
164
153
  if fs_prefix == "":
@@ -134,17 +134,6 @@ class SparkDataFrameReader(
134
134
  class SparkDataFrameWriter(
135
135
  _BaseDataFrameWriter["SparkSession", "SparkDataFrame"],
136
136
  ):
137
- def save(
138
- self,
139
- path: str,
140
- mode: t.Optional[str] = None,
141
- format: t.Optional[str] = None,
142
- partitionBy: t.Optional[t.Union[str, t.List[str]]] = None,
143
- **options,
144
- ):
145
- format = str(format or self._state_format_to_write)
146
- self._write(path, mode, format, partitionBy=partitionBy, **options)
147
-
148
137
  def _write(self, path: str, mode: t.Optional[str], format: str, **options):
149
138
  spark_df = None
150
139
  expressions = self._df._get_expressions()
@@ -161,8 +150,7 @@ class SparkDataFrameWriter(
161
150
  partition_columns = options.pop("partitionBy", None)
162
151
  compression = options.pop("compression", None)
163
152
  if partition_columns:
164
- partition_columns = options.pop("partitionBy")
165
- spark_writer = spark_writer.partitionBy(*partition_columns)
153
+ spark_writer = spark_writer.partitionBy(*ensure_list(partition_columns))
166
154
  if compression:
167
155
  spark_writer = spark_writer.option("compression", compression)
168
156
  spark_writer.save(path=path, **options)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlframe
3
- Version: 4.2.0
3
+ Version: 4.4.0
4
4
  Summary: Turning PySpark Into a Universal DataFrame API
5
5
  Author-email: Ryan Eakman <eakmanrq@gmail.com>
6
6
  License: MIT
@@ -16,7 +16,7 @@ Requires-Python: >=3.10
16
16
  Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
18
  Requires-Dist: prettytable<4
19
- Requires-Dist: sqlglot<30.9,>=28.0.0
19
+ Requires-Dist: sqlglot<30.13,>=30.0.0
20
20
  Requires-Dist: typing_extensions
21
21
  Requires-Dist: more-itertools
22
22
  Provides-Extra: bigquery
@@ -13,6 +13,7 @@ uv.lock
13
13
  .github/CODEOWNERS
14
14
  .github/workflows/main.workflow.yaml
15
15
  .github/workflows/publish.workflow.yaml
16
+ .superset/config.json
16
17
  blogs/add_chatgpt_support.md
17
18
  blogs/sqlframe_universal_dataframe_api.md
18
19
  blogs/images/but_wait_theres_more.gif
@@ -55,6 +56,8 @@ sqlframe.egg-info/PKG-INFO
55
56
  sqlframe.egg-info/SOURCES.txt
56
57
  sqlframe.egg-info/dependency_links.txt
57
58
  sqlframe.egg-info/requires.txt
59
+ sqlframe.egg-info/scm_file_list.json
60
+ sqlframe.egg-info/scm_version.json
58
61
  sqlframe.egg-info/top_level.txt
59
62
  sqlframe/base/__init__.py
60
63
  sqlframe/base/_typing.py
@@ -358,6 +361,7 @@ tests/unit/__init__.py
358
361
  tests/unit/conftest.py
359
362
  tests/unit/test_activate.py
360
363
  tests/unit/test_base_reader_options.py
364
+ tests/unit/test_base_writer_options.py
361
365
  tests/unit/test_catalog.py
362
366
  tests/unit/test_util.py
363
367
  tests/unit/bigquery/__init__.py
@@ -1,5 +1,5 @@
1
1
  prettytable<4
2
- sqlglot<30.9,>=28.0.0
2
+ sqlglot<30.13,>=30.0.0
3
3
  typing_extensions
4
4
  more-itertools
5
5