diff --git a/examples/adbc_example.py b/examples/adbc_example.py index 532033a..a62e1fc 100644 --- a/examples/adbc_example.py +++ b/examples/adbc_example.py @@ -12,11 +12,12 @@ import adbc_driver_duckdb.dbapi import pyarrow -from substrait.builders.plan import read_named_table, filter -from substrait.builders.extended_expression import scalar_function, column, literal +import pyarrow.substrait as pa_substrait + +from substrait.builders.extended_expression import column, literal, scalar_function +from substrait.builders.plan import filter, read_named_table from substrait.builders.type import i64 from substrait.extension_registry import ExtensionRegistry -import pyarrow.substrait as pa_substrait registry = ExtensionRegistry() diff --git a/examples/builder_example.py b/examples/builder_example.py index c65fa89..86785e4 100644 --- a/examples/builder_example.py +++ b/examples/builder_example.py @@ -1,19 +1,19 @@ +import substrait.gen.proto.algebra_pb2 as stalg +from substrait.builders.extended_expression import ( + column, + literal, + scalar_function, +) from substrait.builders.plan import ( + fetch, + filter, read_named_table, select, - filter, sort, - fetch, -) -from substrait.builders.extended_expression import ( - column, - scalar_function, - literal, ) -from substrait.builders.type import i64, boolean, struct, named_struct, fp64, string +from substrait.builders.type import boolean, fp64, i64, named_struct, string, struct from substrait.extension_registry import ExtensionRegistry -from substrait.utils.display import pretty_print_plan, pretty_print_expression -import substrait.gen.proto.algebra_pb2 as stalg +from substrait.utils.display import pretty_print_expression, pretty_print_plan registry = ExtensionRegistry(load_default_extensions=True) diff --git a/examples/dataframe_example.py b/examples/dataframe_example.py index f2d14d6..ff3d0bb 100644 --- a/examples/dataframe_example.py +++ b/examples/dataframe_example.py @@ -1,7 +1,7 @@ +import substrait.dataframe as sdf from substrait.builders.plan import read_named_table -from substrait.builders.type import i64, boolean, struct, named_struct +from substrait.builders.type import boolean, i64, named_struct, struct from substrait.extension_registry import ExtensionRegistry -import substrait.dataframe as sdf registry = ExtensionRegistry(load_default_extensions=True) diff --git a/examples/duckdb_example.py b/examples/duckdb_example.py index af9d9b1..b6bd1a0 100644 --- a/examples/duckdb_example.py +++ b/examples/duckdb_example.py @@ -9,11 +9,12 @@ import duckdb -from substrait.builders.plan import read_named_table, select, filter -from substrait.builders.extended_expression import column, scalar_function, literal +import pyarrow.substrait as pa_substrait + +from substrait.builders.extended_expression import column, literal, scalar_function +from substrait.builders.plan import filter, read_named_table, select from substrait.builders.type import i32 from substrait.extension_registry import ExtensionRegistry -import pyarrow.substrait as pa_substrait try: duckdb.install_extension("substrait") diff --git a/examples/narwhals_example.py b/examples/narwhals_example.py index 736af04..0819404 100644 --- a/examples/narwhals_example.py +++ b/examples/narwhals_example.py @@ -6,14 +6,13 @@ # ] # /// -from substrait.builders.plan import read_named_table -from substrait.builders.type import i64, boolean, struct, named_struct -from substrait.extension_registry import ExtensionRegistry - -from narwhals.typing import FrameT import narwhals as nw -import substrait.dataframe as sdf +from narwhals.typing import FrameT +import substrait.dataframe as sdf +from substrait.builders.plan import read_named_table +from substrait.builders.type import boolean, i64, named_struct, struct +from substrait.extension_registry import ExtensionRegistry registry = ExtensionRegistry(load_default_extensions=True) diff --git a/examples/pyarrow_example.py b/examples/pyarrow_example.py index 014985b..bba6634 100644 --- a/examples/pyarrow_example.py +++ b/examples/pyarrow_example.py @@ -8,8 +8,9 @@ import pyarrow as pa import pyarrow.compute as pc import pyarrow.substrait as pa_substrait + import substrait -from substrait.builders.plan import select, read_named_table +from substrait.builders.plan import read_named_table, select arrow_schema = pa.schema([pa.field("x", pa.int32()), pa.field("y", pa.int32())]) diff --git a/pixi.lock b/pixi.lock index 0c5b88c..deb59b6 100644 --- a/pixi.lock +++ b/pixi.lock @@ -16,7 +16,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/antlr-4.13.2-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/black-25.12.0-pyh866005b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/buf-1.62.1-ha8f183a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/buf-1.63.0-ha8f183a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda @@ -75,7 +75,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/openjdk-25.0.1-h5755bd7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda @@ -111,7 +111,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - pypi: https://files.pythonhosted.org/packages/56/13/333b8f421738f149d4fe5e49553bc2a2ab75235486259f689b4b91f96cec/protobuf-6.33.2-cp39-abi3-manylinux2014_x86_64.whl - - pypi: ./ linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.1-he30d5cf_0.conda @@ -119,7 +118,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/antlr-4.13.2-h8af1aa0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/black-25.12.0-pyh866005b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/buf-1.62.1-h652cbe9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/buf-1.63.0-h652cbe9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h0b6afd8_1.conda @@ -178,7 +177,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjdk-25.0.1-hda3ab1e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda @@ -214,13 +213,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda - pypi: https://files.pythonhosted.org/packages/7d/4f/f743761e41d3b2b2566748eb76bbff2b43e14d5fcab694f494a16458b05f/protobuf-6.33.2-cp39-abi3-manylinux2014_aarch64.whl - - pypi: ./ osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/antlr-4.13.2-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/black-25.12.0-pyh866005b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/buf-1.62.1-h990441c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/buf-1.63.0-h990441c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda @@ -244,7 +242,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/openjdk-25.0.1-h2014cc5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.41.5-py313hcc225dc_1.conda @@ -264,13 +262,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - pypi: https://files.pythonhosted.org/packages/b2/ca/7e485da88ba45c920fb3f50ae78de29ab925d9e54ef0de678306abfbb497/protobuf-6.33.2-cp39-abi3-macosx_10_9_universal2.whl - - pypi: ./ osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/antlr-4.13.2-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/black-25.12.0-pyh866005b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/buf-1.62.1-h75b854d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/buf-1.63.0-h75b854d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda @@ -293,7 +290,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjdk-25.0.1-hde7fb7b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_1.conda @@ -313,13 +310,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - pypi: https://files.pythonhosted.org/packages/b2/ca/7e485da88ba45c920fb3f50ae78de29ab925d9e54ef0de678306abfbb497/protobuf-6.33.2-cp39-abi3-macosx_10_9_universal2.whl - - pypi: ./ win-64: - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/antlr-4.13.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/black-25.12.0-pyh866005b_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/buf-1.62.1-hd02998f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/buf-1.63.0-hd02998f_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda @@ -342,7 +338,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/openjdk-25.0.1-hda6743d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_1.conda @@ -367,7 +363,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - pypi: https://files.pythonhosted.org/packages/64/20/4d50191997e917ae13ad0a235c8b42d8c1ab9c3e6fd455ca16d416944355/protobuf-6.33.2-cp310-abi3-win_amd64.whl - - pypi: ./ dev: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -384,7 +379,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/antlr-4.13.2-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/black-25.12.0-pyh866005b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/buf-1.62.1-ha8f183a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/buf-1.63.0-ha8f183a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda @@ -443,7 +438,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/openjdk-25.0.1-h5755bd7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda @@ -490,7 +485,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/04/98c216967275cd9a3e517dfeeb513ebff3183f1f22da29180c479c749ac8/sqloxide-0.1.56-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: ./ linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.1-he30d5cf_0.conda @@ -498,7 +492,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/antlr-4.13.2-h8af1aa0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/black-25.12.0-pyh866005b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/buf-1.62.1-h652cbe9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/buf-1.63.0-h652cbe9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h0b6afd8_1.conda @@ -557,7 +551,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjdk-25.0.1-hda3ab1e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda @@ -604,13 +598,12 @@ environments: - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/77/dd27f6e325537126ba0b142fdce63bde4305681662ac58e8e779e3c87635/sqloxide-0.1.56-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - - pypi: ./ osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/antlr-4.13.2-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/black-25.12.0-pyh866005b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/buf-1.62.1-h990441c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/buf-1.63.0-h990441c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda @@ -634,7 +627,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/openjdk-25.0.1-h2014cc5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.41.5-py313hcc225dc_1.conda @@ -665,13 +658,12 @@ environments: - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/c7/79f57728f300079148ac4e4b988000dcbd1f58960040db89594424a58336/sqloxide-0.1.56.tar.gz - - pypi: ./ osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/antlr-4.13.2-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/black-25.12.0-pyh866005b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/buf-1.62.1-h75b854d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/buf-1.63.0-h75b854d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda @@ -694,7 +686,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjdk-25.0.1-hde7fb7b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_1.conda @@ -725,13 +717,12 @@ environments: - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/fd/268d58f8feb4d206d2896dae5e8a4a17c671c9cbb6b15c6e6300d2e168a2/sqloxide-0.1.56-cp313-cp313-macosx_11_0_arm64.whl - - pypi: ./ win-64: - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/antlr-4.13.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/black-25.12.0-pyh866005b_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/buf-1.62.1-hd02998f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/buf-1.63.0-hd02998f_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda @@ -754,7 +745,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/openjdk-25.0.1-hda6743d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_1.conda @@ -790,7 +781,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/5c/487e081a5ac1a8538f7eb3a3e3ea04c39da13acde1f17916ca1767d40c4e/sqloxide-0.1.56-cp313-cp313-win_amd64.whl - - pypi: ./ extensions: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -807,7 +797,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/antlr-4.13.2-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/black-25.12.0-pyh866005b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/buf-1.62.1-ha8f183a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/buf-1.63.0-ha8f183a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda @@ -866,7 +856,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/openjdk-25.0.1-h5755bd7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda @@ -903,7 +893,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - pypi: https://files.pythonhosted.org/packages/89/03/a851e84fcbb85214dc637b6378121ef9a0dd61b4c65264675d8a5c9b1ae7/antlr4_python3_runtime-4.13.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/13/333b8f421738f149d4fe5e49553bc2a2ab75235486259f689b4b91f96cec/protobuf-6.33.2-cp39-abi3-manylinux2014_x86_64.whl - - pypi: ./ linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.1-he30d5cf_0.conda @@ -911,7 +900,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/antlr-4.13.2-h8af1aa0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/black-25.12.0-pyh866005b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/buf-1.62.1-h652cbe9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/buf-1.63.0-h652cbe9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h0b6afd8_1.conda @@ -970,7 +959,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjdk-25.0.1-hda3ab1e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda @@ -1007,13 +996,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda - pypi: https://files.pythonhosted.org/packages/89/03/a851e84fcbb85214dc637b6378121ef9a0dd61b4c65264675d8a5c9b1ae7/antlr4_python3_runtime-4.13.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7d/4f/f743761e41d3b2b2566748eb76bbff2b43e14d5fcab694f494a16458b05f/protobuf-6.33.2-cp39-abi3-manylinux2014_aarch64.whl - - pypi: ./ osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/antlr-4.13.2-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/black-25.12.0-pyh866005b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/buf-1.62.1-h990441c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/buf-1.63.0-h990441c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda @@ -1037,7 +1025,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/openjdk-25.0.1-h2014cc5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.41.5-py313hcc225dc_1.conda @@ -1058,13 +1046,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - pypi: https://files.pythonhosted.org/packages/89/03/a851e84fcbb85214dc637b6378121ef9a0dd61b4c65264675d8a5c9b1ae7/antlr4_python3_runtime-4.13.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/ca/7e485da88ba45c920fb3f50ae78de29ab925d9e54ef0de678306abfbb497/protobuf-6.33.2-cp39-abi3-macosx_10_9_universal2.whl - - pypi: ./ osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/antlr-4.13.2-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/black-25.12.0-pyh866005b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/buf-1.62.1-h75b854d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/buf-1.63.0-h75b854d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda @@ -1087,7 +1074,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjdk-25.0.1-hde7fb7b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_1.conda @@ -1108,13 +1095,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - pypi: https://files.pythonhosted.org/packages/89/03/a851e84fcbb85214dc637b6378121ef9a0dd61b4c65264675d8a5c9b1ae7/antlr4_python3_runtime-4.13.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/ca/7e485da88ba45c920fb3f50ae78de29ab925d9e54ef0de678306abfbb497/protobuf-6.33.2-cp39-abi3-macosx_10_9_universal2.whl - - pypi: ./ win-64: - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/antlr-4.13.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/black-25.12.0-pyh866005b_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/buf-1.62.1-hd02998f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/buf-1.63.0-hd02998f_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda @@ -1137,7 +1123,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/openjdk-25.0.1-hda6743d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_1.conda @@ -1163,7 +1149,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - pypi: https://files.pythonhosted.org/packages/89/03/a851e84fcbb85214dc637b6378121ef9a0dd61b4c65264675d8a5c9b1ae7/antlr4_python3_runtime-4.13.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/20/4d50191997e917ae13ad0a235c8b42d8c1ab9c3e6fd455ca16d416944355/protobuf-6.33.2-cp310-abi3-win_amd64.whl - - pypi: ./ sql: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -1180,7 +1165,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/antlr-4.13.2-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/black-25.12.0-pyh866005b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/buf-1.62.1-ha8f183a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/buf-1.63.0-ha8f183a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda @@ -1239,7 +1224,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/openjdk-25.0.1-h5755bd7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda @@ -1278,7 +1263,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/12/27/fb8d7338b4d551900fa3e580acbe7a0cf655d940e164cb5c00ec31961094/orderly_set-5.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/13/333b8f421738f149d4fe5e49553bc2a2ab75235486259f689b4b91f96cec/protobuf-6.33.2-cp39-abi3-manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f9/04/98c216967275cd9a3e517dfeeb513ebff3183f1f22da29180c479c749ac8/sqloxide-0.1.56-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: ./ linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.1-he30d5cf_0.conda @@ -1286,7 +1270,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/antlr-4.13.2-h8af1aa0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/black-25.12.0-pyh866005b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/buf-1.62.1-h652cbe9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/buf-1.63.0-h652cbe9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h0b6afd8_1.conda @@ -1345,7 +1329,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjdk-25.0.1-hda3ab1e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda @@ -1384,13 +1368,12 @@ environments: - pypi: https://files.pythonhosted.org/packages/12/27/fb8d7338b4d551900fa3e580acbe7a0cf655d940e164cb5c00ec31961094/orderly_set-5.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7d/4f/f743761e41d3b2b2566748eb76bbff2b43e14d5fcab694f494a16458b05f/protobuf-6.33.2-cp39-abi3-manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/de/77/dd27f6e325537126ba0b142fdce63bde4305681662ac58e8e779e3c87635/sqloxide-0.1.56-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - - pypi: ./ osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/antlr-4.13.2-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/black-25.12.0-pyh866005b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/buf-1.62.1-h990441c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/buf-1.63.0-h990441c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda @@ -1414,7 +1397,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/openjdk-25.0.1-h2014cc5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.41.5-py313hcc225dc_1.conda @@ -1437,13 +1420,12 @@ environments: - pypi: https://files.pythonhosted.org/packages/12/27/fb8d7338b4d551900fa3e580acbe7a0cf655d940e164cb5c00ec31961094/orderly_set-5.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/ca/7e485da88ba45c920fb3f50ae78de29ab925d9e54ef0de678306abfbb497/protobuf-6.33.2-cp39-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/10/c7/79f57728f300079148ac4e4b988000dcbd1f58960040db89594424a58336/sqloxide-0.1.56.tar.gz - - pypi: ./ osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/antlr-4.13.2-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/black-25.12.0-pyh866005b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/buf-1.62.1-h75b854d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/buf-1.63.0-h75b854d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda @@ -1466,7 +1448,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjdk-25.0.1-hde7fb7b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_1.conda @@ -1489,13 +1471,12 @@ environments: - pypi: https://files.pythonhosted.org/packages/12/27/fb8d7338b4d551900fa3e580acbe7a0cf655d940e164cb5c00ec31961094/orderly_set-5.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/ca/7e485da88ba45c920fb3f50ae78de29ab925d9e54ef0de678306abfbb497/protobuf-6.33.2-cp39-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/94/fd/268d58f8feb4d206d2896dae5e8a4a17c671c9cbb6b15c6e6300d2e168a2/sqloxide-0.1.56-cp313-cp313-macosx_11_0_arm64.whl - - pypi: ./ win-64: - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/antlr-4.13.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/black-25.12.0-pyh866005b_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/buf-1.62.1-hd02998f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/buf-1.63.0-hd02998f_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda @@ -1518,7 +1499,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/openjdk-25.0.1-hda6743d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_1.conda @@ -1546,7 +1527,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/12/27/fb8d7338b4d551900fa3e580acbe7a0cf655d940e164cb5c00ec31961094/orderly_set-5.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/20/4d50191997e917ae13ad0a235c8b42d8c1ab9c3e6fd455ca16d416944355/protobuf-6.33.2-cp310-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c8/5c/487e081a5ac1a8538f7eb3a3e3ea04c39da13acde1f17916ca1767d40c4e/sqloxide-0.1.56-cp313-cp313-win_amd64.whl - - pypi: ./ packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 @@ -1699,48 +1679,43 @@ packages: - pkg:pypi/black?source=hash-mapping size: 169740 timestamp: 1765222747417 -- conda: https://conda.anaconda.org/conda-forge/linux-64/buf-1.62.1-ha8f183a_0.conda - sha256: 1f7aa03c53acf4e9fd1d67b70eb1279855fff8db3711b7d137dab5b3ca161b56 - md5: bb7f4f7aa02409f437a38de6e1a59a70 +- conda: https://conda.anaconda.org/conda-forge/linux-64/buf-1.63.0-ha8f183a_0.conda + sha256: 0cc9f8377af24a217b39bac851bcfae0eade90c18ec3109c3def555ce62b1d44 + md5: 29d520a248817366377522418ea4c928 license: Apache-2.0 - license_family: APACHE purls: [] - size: 53945030 - timestamp: 1767049365690 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/buf-1.62.1-h652cbe9_0.conda - sha256: 84dd4be5cc663fd1461e7373c9cba622885b1dd978e14a4eb392f3ea46b68dc9 - md5: 98734ac4c0687a0adee6873e6c710706 + size: 53949242 + timestamp: 1767791302486 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/buf-1.63.0-h652cbe9_0.conda + sha256: 0ebfee4dd9c3ae409dd5776bb84f55679e829942f86a67c8337dbdca2446f1af + md5: bc8e1f89c535a6aab8854e039566c777 license: Apache-2.0 - license_family: APACHE purls: [] - size: 49772104 - timestamp: 1767049333181 -- conda: https://conda.anaconda.org/conda-forge/osx-64/buf-1.62.1-h990441c_0.conda - sha256: 999af79aed2a9e8adc8516beabca1ebacc9e0dc676a4d6d172c387fda2f98462 - md5: c3be89ca8ac7f7bc9cf56a85083ac73d + size: 49786894 + timestamp: 1767791184554 +- conda: https://conda.anaconda.org/conda-forge/osx-64/buf-1.63.0-h990441c_0.conda + sha256: 83ef12873e818f637af1fbddb5c13390c2011ab0e89d951894e788bfad412be0 + md5: b2446173b8f26d1afe85c99d58e98aa3 constrains: - __osx>=10.12 license: Apache-2.0 - license_family: APACHE purls: [] - size: 54821098 - timestamp: 1767049565204 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/buf-1.62.1-h75b854d_0.conda - sha256: 7fd51711fefae70c622f3c4b6d6e4f75b69da0f736da53006aba76e585245bd0 - md5: 24cfa2d486807a73a860ddee3b650335 + size: 54787341 + timestamp: 1767791275118 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/buf-1.63.0-h75b854d_0.conda + sha256: 4eef42f23cb82b5f73140e5127bd931da96823ffc626b50be8c89b7d851a9618 + md5: 2f5820598c79cf7d5469c4d1cf9a6c33 license: Apache-2.0 - license_family: APACHE purls: [] - size: 51801365 - timestamp: 1767049452453 -- conda: https://conda.anaconda.org/conda-forge/win-64/buf-1.62.1-hd02998f_0.conda - sha256: 7a7a74d17ac62c93c0d07bd774a141ab90e27c4bc0db22ec2537b83c2a6dc368 - md5: 926f328c5abb522fc2ddb641673425f7 + size: 51801274 + timestamp: 1767791466121 +- conda: https://conda.anaconda.org/conda-forge/win-64/buf-1.63.0-hd02998f_0.conda + sha256: 0c9817a211a328925a388d0e90719909a8fe3989b2c8fbb31b9ab3c31ae42fc9 + md5: 3309e89e41a2b87fbb0041337e9bf2e7 license: Apache-2.0 - license_family: APACHE purls: [] - size: 52988817 - timestamp: 1767049681051 + size: 52998270 + timestamp: 1767791601183 - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda sha256: c30daba32ddebbb7ded490f0e371eae90f51e72db620554089103b4a6934b0d5 md5: 51a19bba1b8ebfb60df25cde030b7ebc @@ -3525,16 +3500,16 @@ packages: - pkg:pypi/packaging?source=hash-mapping size: 62477 timestamp: 1745345660407 -- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.1-pyhd8ed1ab_0.conda - sha256: c2d058ffe4f8caae71793a6e6f52bcbd0be660f11958ed2349b6476287117714 - md5: 9873e55afc3f873196da6ac80382918b +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.2-pyhd8ed1ab_0.conda + sha256: 0fd6fdb104e01a815bf1a625c49c6e5582bd42794f1b11eaa32ae0714f1f3f03 + md5: 90bb10a03797b1793a355be064bcc35c depends: - python >=3.10 license: MPL-2.0 purls: - pkg:pypi/pathspec?source=compressed-mapping - size: 53017 - timestamp: 1767759872637 + size: 53271 + timestamp: 1767870657166 - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda sha256: 5e6f7d161356fefd981948bea5139c5aa0436767751a6930cb1ca801ebb113ff md5: 7a3bff861a6583f1889021facefc08b1 @@ -4173,17 +4148,6 @@ packages: version: 0.1.56 sha256: 5e94f9037d7336bef4e3090b15299c2a405c55aba4ae87ef6d963df2f0b48016 requires_python: '>=3.7' -- pypi: ./ - name: substrait - version: 0.25.1.dev16+gb404a0fc2.d20260108 - sha256: abf8d815f223d799e5615102c87cd34e6882d2dd6e7e2b81d162f4111ca29a8a - requires_dist: - - protobuf>=5,<7 - - antlr4-python3-runtime ; extra == 'extensions' - - pyyaml ; extra == 'extensions' - - sqloxide ; extra == 'sql' - - deepdiff ; extra == 'sql' - requires_python: '>=3.10,<3.14' - conda: https://conda.anaconda.org/conda-forge/win-64/symlink-exe-runtime-1.0-hcfcfb64_0.tar.bz2 sha256: 4a7096df38cf8c7e5ee965ea957c0fadf8b5e1140f5b2da625075cc6d7a22bf7 md5: 2b03b51163e311e87a6d4a4e9776b24b diff --git a/pyproject.toml b/pyproject.toml index aa02722..cdfbe7f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,14 +32,13 @@ respect-gitignore = true target-version = "py310" # never autoformat upstream or generated code exclude = ["third_party/", "src/substrait/gen"] +lint.extend-select = ["I"] + [tool.pixi.workspace] channels = ["conda-forge"] platforms = ["win-64", "linux-64", "osx-64", "osx-arm64", "linux-aarch64"] -[tool.pixi.pypi-dependencies] -substrait = { path = ".", editable = true } - [tool.pixi.environments] dev = { features = ["dev"], solve-group = "default" } extensions = { features = ["extensions"], solve-group = "default" } diff --git a/src/substrait/builders/plan.py b/src/substrait/builders/plan.py index 2b6c6f5..c1d2764 100644 --- a/src/substrait/builders/plan.py +++ b/src/substrait/builders/plan.py @@ -18,13 +18,13 @@ ) from substrait.extension_registry import ExtensionRegistry from substrait.gen.proto.extensions.extensions_pb2 import AdvancedExtension +from substrait.gen.version import substrait_version from substrait.type_inference import infer_plan_schema from substrait.utils import ( merge_extension_declarations, merge_extension_uris, merge_extension_urns, ) -from substrait.gen.version import substrait_version UnboundPlan = Callable[[ExtensionRegistry], stp.Plan] diff --git a/src/substrait/dataframe/__init__.py b/src/substrait/dataframe/__init__.py index 34b5a4f..0a37d04 100644 --- a/src/substrait/dataframe/__init__.py +++ b/src/substrait/dataframe/__init__.py @@ -1,6 +1,5 @@ import substrait.dataframe from substrait.builders.extended_expression import column - from substrait.dataframe.dataframe import DataFrame from substrait.dataframe.expression import Expression diff --git a/src/substrait/dataframe/dataframe.py b/src/substrait/dataframe/dataframe.py index 916c0e7..57f0da3 100644 --- a/src/substrait/dataframe/dataframe.py +++ b/src/substrait/dataframe/dataframe.py @@ -1,4 +1,5 @@ -from typing import Union, Iterable +from typing import Iterable, Union + import substrait.dataframe from substrait.builders.plan import select from substrait.dataframe.expression import Expression diff --git a/src/substrait/dataframe/expression.py b/src/substrait/dataframe/expression.py index 00196b2..e57c6b6 100644 --- a/src/substrait/dataframe/expression.py +++ b/src/substrait/dataframe/expression.py @@ -1,11 +1,11 @@ +import substrait.gen.proto.extended_expression_pb2 as stee +import substrait.gen.proto.type_pb2 as stp from substrait.builders.extended_expression import ( - UnboundExtendedExpression, ExtendedExpressionOrUnbound, + UnboundExtendedExpression, resolve_expression, scalar_function, ) -import substrait.gen.proto.type_pb2 as stp -import substrait.gen.proto.extended_expression_pb2 as stee from substrait.extension_registry import ExtensionRegistry diff --git a/src/substrait/extension_registry/__init__.py b/src/substrait/extension_registry/__init__.py index 6024a0f..f278ccb 100644 --- a/src/substrait/extension_registry/__init__.py +++ b/src/substrait/extension_registry/__init__.py @@ -1,15 +1,15 @@ """Extension Registry module.""" -from .registry import ExtensionRegistry +from .exceptions import UnhandledParameterizedTypeError, UnrecognizedSubstraitTypeError from .function_entry import FunctionEntry, FunctionType +from .registry import ExtensionRegistry from .signature_checker_helpers import ( - normalize_substrait_type_names, - _check_integer_constraint, - types_equal, _bind_type_parameter, + _check_integer_constraint, covers, + normalize_substrait_type_names, + types_equal, ) -from .exceptions import UnrecognizedSubstraitTypeError, UnhandledParameterizedTypeError __all__ = [ "ExtensionRegistry", diff --git a/src/substrait/extension_registry/function_entry.py b/src/substrait/extension_registry/function_entry.py index aae66ab..cec9860 100644 --- a/src/substrait/extension_registry/function_entry.py +++ b/src/substrait/extension_registry/function_entry.py @@ -3,11 +3,11 @@ from enum import Enum from typing import Optional, Union -from substrait.gen.json import simple_extensions as se from substrait.derivation_expression import _parse, evaluate +from substrait.gen.json import simple_extensions as se from substrait.gen.proto.type_pb2 import Type -from .signature_checker_helpers import normalize_substrait_type_names, covers +from .signature_checker_helpers import covers, normalize_substrait_type_names class FunctionType(Enum): diff --git a/src/substrait/extension_registry/registry.py b/src/substrait/extension_registry/registry.py index e8bbc67..7d48388 100644 --- a/src/substrait/extension_registry/registry.py +++ b/src/substrait/extension_registry/registry.py @@ -1,7 +1,7 @@ """Extension Registry class.""" -import re import itertools +import re from collections import defaultdict from importlib.resources import files as importlib_files from pathlib import Path @@ -15,7 +15,6 @@ from .function_entry import FunctionEntry, FunctionType - # Constants DEFAULT_URN_PREFIX = "https://github.com/substrait-io/substrait/blob/main/extensions" # Format: extension:: diff --git a/src/substrait/extension_registry/signature_checker_helpers.py b/src/substrait/extension_registry/signature_checker_helpers.py index 2e95085..1a65c05 100644 --- a/src/substrait/extension_registry/signature_checker_helpers.py +++ b/src/substrait/extension_registry/signature_checker_helpers.py @@ -5,7 +5,8 @@ from substrait.derivation_expression import _evaluate from substrait.gen.antlr.SubstraitTypeParser import SubstraitTypeParser from substrait.gen.proto.type_pb2 import Type -from .exceptions import UnrecognizedSubstraitTypeError, UnhandledParameterizedTypeError + +from .exceptions import UnhandledParameterizedTypeError, UnrecognizedSubstraitTypeError # Type aliases TypeParameterMapping = Dict[str, object] diff --git a/src/substrait/proto.py b/src/substrait/proto.py index 0d33d80..64dc247 100644 --- a/src/substrait/proto.py +++ b/src/substrait/proto.py @@ -11,10 +11,11 @@ def _load(): substrait.gen.proto.extensions.extensions_pb2.SimpleExtensionDeclaration becomes substrait.proto.SimpleExtensionDeclaration """ - import sys + import importlib import inspect import pkgutil - import importlib + import sys + from substrait.gen import proto as _proto selfmodule = sys.modules[__name__] diff --git a/src/substrait/simple_extension_utils.py b/src/substrait/simple_extension_utils.py index 27b300e..06164f0 100644 --- a/src/substrait/simple_extension_utils.py +++ b/src/substrait/simple_extension_utils.py @@ -1,6 +1,7 @@ -from substrait.gen.json import simple_extensions as se from typing import Union +from substrait.gen.json import simple_extensions as se + def build_arg(d: dict) -> Union[se.ValueArg, se.TypeArg, se.EnumerationArg]: if "value" in d: diff --git a/src/substrait/sql/sql_to_substrait.py b/src/substrait/sql/sql_to_substrait.py index e4470aa..85db3b3 100644 --- a/src/substrait/sql/sql_to_substrait.py +++ b/src/substrait/sql/sql_to_substrait.py @@ -1,29 +1,31 @@ import random import string +from typing import Callable + +from deepdiff import DeepDiff from sqloxide import parse_sql + from substrait.builders.extended_expression import ( UnboundExtendedExpression, + aggregate_function, column, - scalar_function, literal, - aggregate_function, + scalar_function, window_function, ) from substrait.builders.plan import ( + aggregate, + fetch, + filter, + join, read_named_table, select, - filter, - sort, - fetch, set, - join, - aggregate, + sort, ) -from substrait.gen.proto import type_pb2 as stt -from substrait.gen.proto import algebra_pb2 as stalg from substrait.extension_registry import ExtensionRegistry -from typing import Callable -from deepdiff import DeepDiff +from substrait.gen.proto import algebra_pb2 as stalg +from substrait.gen.proto import type_pb2 as stt SchemaResolver = Callable[[str], stt.NamedStruct] diff --git a/src/substrait/utils/__init__.py b/src/substrait/utils/__init__.py index 0a4793b..4d260d1 100644 --- a/src/substrait/utils/__init__.py +++ b/src/substrait/utils/__init__.py @@ -2,10 +2,11 @@ Utility and debugging functions for Substrait. """ -import substrait.gen.proto.type_pb2 as stp -import substrait.gen.proto.extensions.extensions_pb2 as ste from typing import Iterable +import substrait.gen.proto.extensions.extensions_pb2 as ste +import substrait.gen.proto.type_pb2 as stp + def type_num_names(typ: stp.Type): kind = typ.WhichOneof("kind") diff --git a/tests/builders/extended_expression/test_aggregate_function.py b/tests/builders/extended_expression/test_aggregate_function.py index cbbe2ea..fd78614 100644 --- a/tests/builders/extended_expression/test_aggregate_function.py +++ b/tests/builders/extended_expression/test_aggregate_function.py @@ -1,9 +1,9 @@ import yaml import substrait.gen.proto.algebra_pb2 as stalg -import substrait.gen.proto.type_pb2 as stt import substrait.gen.proto.extended_expression_pb2 as stee import substrait.gen.proto.extensions.extensions_pb2 as ste +import substrait.gen.proto.type_pb2 as stt from substrait.builders.extended_expression import aggregate_function, literal from substrait.extension_registry import ExtensionRegistry diff --git a/tests/builders/extended_expression/test_column.py b/tests/builders/extended_expression/test_column.py index 5287d13..0a95a07 100644 --- a/tests/builders/extended_expression/test_column.py +++ b/tests/builders/extended_expression/test_column.py @@ -1,6 +1,6 @@ import substrait.gen.proto.algebra_pb2 as stalg -import substrait.gen.proto.type_pb2 as stt import substrait.gen.proto.extended_expression_pb2 as stee +import substrait.gen.proto.type_pb2 as stt from substrait.builders.extended_expression import column struct = stt.Type.Struct( diff --git a/tests/builders/extended_expression/test_if_then.py b/tests/builders/extended_expression/test_if_then.py index 81d27d6..9b600e2 100644 --- a/tests/builders/extended_expression/test_if_then.py +++ b/tests/builders/extended_expression/test_if_then.py @@ -1,16 +1,15 @@ import substrait.gen.proto.algebra_pb2 as stalg -import substrait.gen.proto.type_pb2 as stt import substrait.gen.proto.extended_expression_pb2 as stee import substrait.gen.proto.extensions.extensions_pb2 as ste +import substrait.gen.proto.type_pb2 as stt from substrait.builders.extended_expression import ( + column, if_then, literal, scalar_function, - column, ) from substrait.extension_registry import ExtensionRegistry - struct = stt.Type.Struct( types=[ stt.Type(i64=stt.Type.I64(nullability=stt.Type.NULLABILITY_REQUIRED)), diff --git a/tests/builders/extended_expression/test_literal.py b/tests/builders/extended_expression/test_literal.py index d43f3be..1bd9a7b 100644 --- a/tests/builders/extended_expression/test_literal.py +++ b/tests/builders/extended_expression/test_literal.py @@ -1,7 +1,8 @@ from datetime import date + import substrait.gen.proto.algebra_pb2 as stalg -from substrait.builders.extended_expression import literal from substrait.builders import type as sttb +from substrait.builders.extended_expression import literal def extract_literal(builder): diff --git a/tests/builders/extended_expression/test_multi_or_list.py b/tests/builders/extended_expression/test_multi_or_list.py index 701847f..793dfd8 100644 --- a/tests/builders/extended_expression/test_multi_or_list.py +++ b/tests/builders/extended_expression/test_multi_or_list.py @@ -1,7 +1,7 @@ import substrait.gen.proto.algebra_pb2 as stalg -import substrait.gen.proto.type_pb2 as stt import substrait.gen.proto.extended_expression_pb2 as stee -from substrait.builders.extended_expression import multi_or_list, literal +import substrait.gen.proto.type_pb2 as stt +from substrait.builders.extended_expression import literal, multi_or_list from substrait.builders.type import i8 from substrait.extension_registry import ExtensionRegistry @@ -85,6 +85,7 @@ def test_singular_or_list(): def test_multi_or_list_with_extension(): import yaml + import substrait.gen.proto.extensions.extensions_pb2 as ste from substrait.builders.extended_expression import scalar_function diff --git a/tests/builders/extended_expression/test_scalar_function.py b/tests/builders/extended_expression/test_scalar_function.py index c7819b9..fcc5d42 100644 --- a/tests/builders/extended_expression/test_scalar_function.py +++ b/tests/builders/extended_expression/test_scalar_function.py @@ -1,10 +1,10 @@ import yaml import substrait.gen.proto.algebra_pb2 as stalg -import substrait.gen.proto.type_pb2 as stt import substrait.gen.proto.extended_expression_pb2 as stee import substrait.gen.proto.extensions.extensions_pb2 as ste -from substrait.builders.extended_expression import scalar_function, literal +import substrait.gen.proto.type_pb2 as stt +from substrait.builders.extended_expression import literal, scalar_function from substrait.extension_registry import ExtensionRegistry struct = stt.Type.Struct( diff --git a/tests/builders/extended_expression/test_singular_or_list.py b/tests/builders/extended_expression/test_singular_or_list.py index 82e998e..763c365 100644 --- a/tests/builders/extended_expression/test_singular_or_list.py +++ b/tests/builders/extended_expression/test_singular_or_list.py @@ -1,7 +1,7 @@ import substrait.gen.proto.algebra_pb2 as stalg -import substrait.gen.proto.type_pb2 as stt import substrait.gen.proto.extended_expression_pb2 as stee -from substrait.builders.extended_expression import singular_or_list, literal +import substrait.gen.proto.type_pb2 as stt +from substrait.builders.extended_expression import literal, singular_or_list from substrait.builders.type import i8 from substrait.extension_registry import ExtensionRegistry @@ -54,6 +54,7 @@ def test_singular_or_list(): def test_singular_or_list_with_extension(): import yaml + import substrait.gen.proto.extensions.extensions_pb2 as ste from substrait.builders.extended_expression import scalar_function diff --git a/tests/builders/extended_expression/test_switch.py b/tests/builders/extended_expression/test_switch.py index 0ec8b71..cf988e9 100644 --- a/tests/builders/extended_expression/test_switch.py +++ b/tests/builders/extended_expression/test_switch.py @@ -1,7 +1,7 @@ import substrait.gen.proto.algebra_pb2 as stalg -import substrait.gen.proto.type_pb2 as stt import substrait.gen.proto.extended_expression_pb2 as stee -from substrait.builders.extended_expression import switch, literal +import substrait.gen.proto.type_pb2 as stt +from substrait.builders.extended_expression import literal, switch from substrait.builders.type import i8 from substrait.extension_registry import ExtensionRegistry @@ -78,6 +78,7 @@ def test_switch(): def test_switch_with_extension(): import yaml + import substrait.gen.proto.extensions.extensions_pb2 as ste from substrait.builders.extended_expression import scalar_function diff --git a/tests/builders/extended_expression/test_window_function.py b/tests/builders/extended_expression/test_window_function.py index 2abef07..71508aa 100644 --- a/tests/builders/extended_expression/test_window_function.py +++ b/tests/builders/extended_expression/test_window_function.py @@ -1,9 +1,9 @@ import yaml import substrait.gen.proto.algebra_pb2 as stalg -import substrait.gen.proto.type_pb2 as stt import substrait.gen.proto.extended_expression_pb2 as stee import substrait.gen.proto.extensions.extensions_pb2 as ste +import substrait.gen.proto.type_pb2 as stt from substrait.builders.extended_expression import window_function from substrait.extension_registry import ExtensionRegistry diff --git a/tests/builders/plan/test_aggregate.py b/tests/builders/plan/test_aggregate.py index 1eb3f6c..cb41d0e 100644 --- a/tests/builders/plan/test_aggregate.py +++ b/tests/builders/plan/test_aggregate.py @@ -1,13 +1,14 @@ -import substrait.gen.proto.type_pb2 as stt -import substrait.gen.proto.plan_pb2 as stp +import yaml + import substrait.gen.proto.algebra_pb2 as stalg import substrait.gen.proto.extensions.extensions_pb2 as ste +import substrait.gen.proto.plan_pb2 as stp +import substrait.gen.proto.type_pb2 as stt +from substrait.builders.extended_expression import aggregate_function, column +from substrait.builders.plan import aggregate, default_version, read_named_table from substrait.builders.type import boolean, i64 -from substrait.builders.plan import read_named_table, aggregate, default_version -from substrait.builders.extended_expression import column, aggregate_function from substrait.extension_registry import ExtensionRegistry from substrait.type_inference import infer_plan_schema -import yaml content = """%YAML 1.2 --- diff --git a/tests/builders/plan/test_cross.py b/tests/builders/plan/test_cross.py index 63686c1..468b371 100644 --- a/tests/builders/plan/test_cross.py +++ b/tests/builders/plan/test_cross.py @@ -1,8 +1,8 @@ -import substrait.gen.proto.type_pb2 as stt -import substrait.gen.proto.plan_pb2 as stp import substrait.gen.proto.algebra_pb2 as stalg +import substrait.gen.proto.plan_pb2 as stp +import substrait.gen.proto.type_pb2 as stt +from substrait.builders.plan import cross, default_version, read_named_table from substrait.builders.type import boolean, i64, string -from substrait.builders.plan import read_named_table, cross, default_version from substrait.extension_registry import ExtensionRegistry registry = ExtensionRegistry(load_default_extensions=False) diff --git a/tests/builders/plan/test_fetch.py b/tests/builders/plan/test_fetch.py index 0f6f21b..2a989f2 100644 --- a/tests/builders/plan/test_fetch.py +++ b/tests/builders/plan/test_fetch.py @@ -1,9 +1,9 @@ -import substrait.gen.proto.type_pb2 as stt -import substrait.gen.proto.plan_pb2 as stp import substrait.gen.proto.algebra_pb2 as stalg -from substrait.builders.type import boolean, i64 -from substrait.builders.plan import read_named_table, fetch, default_version +import substrait.gen.proto.plan_pb2 as stp +import substrait.gen.proto.type_pb2 as stt from substrait.builders.extended_expression import literal +from substrait.builders.plan import default_version, fetch, read_named_table +from substrait.builders.type import boolean, i64 from substrait.extension_registry import ExtensionRegistry registry = ExtensionRegistry(load_default_extensions=False) diff --git a/tests/builders/plan/test_filter.py b/tests/builders/plan/test_filter.py index 25959af..e750d81 100644 --- a/tests/builders/plan/test_filter.py +++ b/tests/builders/plan/test_filter.py @@ -1,9 +1,9 @@ -import substrait.gen.proto.type_pb2 as stt -import substrait.gen.proto.plan_pb2 as stp import substrait.gen.proto.algebra_pb2 as stalg -from substrait.builders.type import boolean, i64 -from substrait.builders.plan import read_named_table, filter, default_version +import substrait.gen.proto.plan_pb2 as stp +import substrait.gen.proto.type_pb2 as stt from substrait.builders.extended_expression import literal +from substrait.builders.plan import default_version, filter, read_named_table +from substrait.builders.type import boolean, i64 from substrait.extension_registry import ExtensionRegistry registry = ExtensionRegistry(load_default_extensions=False) diff --git a/tests/builders/plan/test_join.py b/tests/builders/plan/test_join.py index 00cf55a..6ec9ce7 100644 --- a/tests/builders/plan/test_join.py +++ b/tests/builders/plan/test_join.py @@ -1,9 +1,9 @@ -import substrait.gen.proto.type_pb2 as stt -import substrait.gen.proto.plan_pb2 as stp import substrait.gen.proto.algebra_pb2 as stalg -from substrait.builders.type import boolean, i64, string -from substrait.builders.plan import read_named_table, join, default_version +import substrait.gen.proto.plan_pb2 as stp +import substrait.gen.proto.type_pb2 as stt from substrait.builders.extended_expression import literal +from substrait.builders.plan import default_version, join, read_named_table +from substrait.builders.type import boolean, i64, string from substrait.extension_registry import ExtensionRegistry registry = ExtensionRegistry(load_default_extensions=False) diff --git a/tests/builders/plan/test_project.py b/tests/builders/plan/test_project.py index 82febe8..6d541d0 100644 --- a/tests/builders/plan/test_project.py +++ b/tests/builders/plan/test_project.py @@ -1,9 +1,9 @@ -import substrait.gen.proto.type_pb2 as stt -import substrait.gen.proto.plan_pb2 as stp import substrait.gen.proto.algebra_pb2 as stalg -from substrait.builders.type import boolean, i64 -from substrait.builders.plan import read_named_table, select, project, default_version +import substrait.gen.proto.plan_pb2 as stp +import substrait.gen.proto.type_pb2 as stt from substrait.builders.extended_expression import column +from substrait.builders.plan import default_version, project, read_named_table, select +from substrait.builders.type import boolean, i64 from substrait.extension_registry import ExtensionRegistry registry = ExtensionRegistry(load_default_extensions=False) diff --git a/tests/builders/plan/test_read.py b/tests/builders/plan/test_read.py index 9060672..41c41f0 100644 --- a/tests/builders/plan/test_read.py +++ b/tests/builders/plan/test_read.py @@ -1,13 +1,14 @@ -import substrait.gen.proto.type_pb2 as stt -import substrait.gen.proto.plan_pb2 as stp -import substrait.gen.proto.algebra_pb2 as stalg -from substrait.builders.type import boolean, i64 -from substrait.builders.plan import read_named_table, default_version import pytest -from substrait.gen.proto.extensions.extensions_pb2 import AdvancedExtension from google.protobuf import any_pb2 from google.protobuf.wrappers_pb2 import StringValue +import substrait.gen.proto.algebra_pb2 as stalg +import substrait.gen.proto.plan_pb2 as stp +import substrait.gen.proto.type_pb2 as stt +from substrait.builders.plan import default_version, read_named_table +from substrait.builders.type import boolean, i64 +from substrait.gen.proto.extensions.extensions_pb2 import AdvancedExtension + struct = stt.Type.Struct( types=[i64(nullable=False), boolean()], nullability=stt.Type.Nullability.NULLABILITY_REQUIRED, diff --git a/tests/builders/plan/test_set.py b/tests/builders/plan/test_set.py index 24265a8..3c2d322 100644 --- a/tests/builders/plan/test_set.py +++ b/tests/builders/plan/test_set.py @@ -1,8 +1,8 @@ -import substrait.gen.proto.type_pb2 as stt -import substrait.gen.proto.plan_pb2 as stp import substrait.gen.proto.algebra_pb2 as stalg +import substrait.gen.proto.plan_pb2 as stp +import substrait.gen.proto.type_pb2 as stt +from substrait.builders.plan import default_version, read_named_table, set from substrait.builders.type import boolean, i64 -from substrait.builders.plan import read_named_table, set, default_version from substrait.extension_registry import ExtensionRegistry registry = ExtensionRegistry(load_default_extensions=False) diff --git a/tests/builders/plan/test_sort.py b/tests/builders/plan/test_sort.py index c8c18c2..3bfb606 100644 --- a/tests/builders/plan/test_sort.py +++ b/tests/builders/plan/test_sort.py @@ -1,11 +1,11 @@ -import substrait.gen.proto.type_pb2 as stt -import substrait.gen.proto.plan_pb2 as stp import substrait.gen.proto.algebra_pb2 as stalg -from substrait.builders.type import boolean, i64 -from substrait.builders.plan import read_named_table, sort, default_version +import substrait.gen.proto.plan_pb2 as stp +import substrait.gen.proto.type_pb2 as stt from substrait.builders.extended_expression import column -from substrait.type_inference import infer_plan_schema +from substrait.builders.plan import default_version, read_named_table, sort +from substrait.builders.type import boolean, i64 from substrait.extension_registry import ExtensionRegistry +from substrait.type_inference import infer_plan_schema registry = ExtensionRegistry(load_default_extensions=False) diff --git a/tests/builders/test_types.py b/tests/builders/test_types.py index 3d0e2d3..c9fe247 100644 --- a/tests/builders/test_types.py +++ b/tests/builders/test_types.py @@ -1,8 +1,8 @@ -import substrait.gen.proto.type_pb2 as stt -from substrait.builders.type import boolean, i64 -from substrait.builders.type import named_struct import pytest +import substrait.gen.proto.type_pb2 as stt +from substrait.builders.type import boolean, i64, named_struct + def test_named_struct_required(): struct = stt.Type.Struct( diff --git a/tests/dataframe/test_df_project.py b/tests/dataframe/test_df_project.py index 8eeecbd..ced25a4 100644 --- a/tests/dataframe/test_df_project.py +++ b/tests/dataframe/test_df_project.py @@ -1,11 +1,10 @@ -import substrait.gen.proto.type_pb2 as stt -import substrait.gen.proto.plan_pb2 as stp +import substrait.dataframe as sdf import substrait.gen.proto.algebra_pb2 as stalg +import substrait.gen.proto.plan_pb2 as stp +import substrait.gen.proto.type_pb2 as stt +from substrait.builders.plan import default_version, read_named_table from substrait.builders.type import boolean, i64 -from substrait.builders.plan import read_named_table, default_version from substrait.extension_registry import ExtensionRegistry -import substrait.dataframe as sdf - registry = ExtensionRegistry(load_default_extensions=False) diff --git a/tests/extension_registry/test_registry_lookup.py b/tests/extension_registry/test_registry_lookup.py index 904d19f..22199a0 100644 --- a/tests/extension_registry/test_registry_lookup.py +++ b/tests/extension_registry/test_registry_lookup.py @@ -1,4 +1,4 @@ -from substrait.builders.type import i8, decimal, i16 +from substrait.builders.type import decimal, i8, i16 from substrait.gen.proto.type_pb2 import Type diff --git a/tests/sql/test_sql_to_substrait.py b/tests/sql/test_sql_to_substrait.py index eb7b1d7..5a92a33 100644 --- a/tests/sql/test_sql_to_substrait.py +++ b/tests/sql/test_sql_to_substrait.py @@ -1,11 +1,12 @@ -from substrait.extension_registry import ExtensionRegistry -from substrait.sql.sql_to_substrait import convert -import pyarrow +import sys import tempfile + +import pyarrow import pyarrow.substrait as pa_substrait import pytest -import sys +from substrait.extension_registry import ExtensionRegistry +from substrait.sql.sql_to_substrait import convert data: pyarrow.Table = pyarrow.Table.from_batches( [ diff --git a/tests/test_derivation_expression.py b/tests/test_derivation_expression.py index 68c29b0..bd1dca6 100644 --- a/tests/test_derivation_expression.py +++ b/tests/test_derivation_expression.py @@ -1,5 +1,5 @@ -from substrait.gen.proto.type_pb2 import NamedStruct, Type from substrait.derivation_expression import evaluate +from substrait.gen.proto.type_pb2 import NamedStruct, Type def test_simple_arithmetic(): diff --git a/tests/test_literal_type_inference.py b/tests/test_literal_type_inference.py index 07274a2..96c0728 100644 --- a/tests/test_literal_type_inference.py +++ b/tests/test_literal_type_inference.py @@ -1,4 +1,5 @@ import pytest + import substrait.gen.proto.algebra_pb2 as stalg import substrait.gen.proto.type_pb2 as stt from substrait.type_inference import infer_literal_type diff --git a/tests/test_proto.py b/tests/test_proto.py index e59a28b..b30ef0d 100644 --- a/tests/test_proto.py +++ b/tests/test_proto.py @@ -6,12 +6,12 @@ def test_imports(): from substrait.gen.proto.algebra_pb2 import Expression from substrait.gen.proto.capabilities_pb2 import Capabilities from substrait.gen.proto.extended_expression_pb2 import ExtendedExpression + from substrait.gen.proto.extensions.extensions_pb2 import SimpleExtensionURN from substrait.gen.proto.function_pb2 import FunctionSignature from substrait.gen.proto.parameterized_types_pb2 import ParameterizedType from substrait.gen.proto.plan_pb2 import Plan from substrait.gen.proto.type_expressions_pb2 import DerivationExpression from substrait.gen.proto.type_pb2 import Type - from substrait.gen.proto.extensions.extensions_pb2 import SimpleExtensionURN def test_proto_proxy_module(): diff --git a/tests/test_uri_urn_migration.py b/tests/test_uri_urn_migration.py index 926f69c..0724216 100644 --- a/tests/test_uri_urn_migration.py +++ b/tests/test_uri_urn_migration.py @@ -9,25 +9,25 @@ import yaml -import substrait.gen.proto.type_pb2 as stt -import substrait.gen.proto.plan_pb2 as stp import substrait.gen.proto.algebra_pb2 as stalg import substrait.gen.proto.extended_expression_pb2 as stex import substrait.gen.proto.extensions.extensions_pb2 as ste +import substrait.gen.proto.plan_pb2 as stp +import substrait.gen.proto.type_pb2 as stt from substrait.builders.extended_expression import ( - scalar_function, - literal, - column, aggregate_function, + column, + literal, + scalar_function, ) -from substrait.builders.type import i64 from substrait.builders.plan import ( - read_named_table, aggregate, - select, - filter, default_version, + filter, + read_named_table, + select, ) +from substrait.builders.type import i64 from substrait.extension_registry import ExtensionRegistry from substrait.type_inference import infer_plan_schema diff --git a/tests/test_utils.py b/tests/test_utils.py index dbbd17d..2349e41 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,6 +1,6 @@ -import substrait.gen.proto.type_pb2 as stt import substrait.gen.proto.extensions.extensions_pb2 as ste -from substrait.utils import type_num_names, merge_extension_uris, merge_extension_urns +import substrait.gen.proto.type_pb2 as stt +from substrait.utils import merge_extension_uris, merge_extension_urns, type_num_names def test_type_num_names_flat_struct():