sqlspec 0.36.0__cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ac8f31065839703b4e70__mypyc.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/__init__.py +140 -0
- sqlspec/__main__.py +12 -0
- sqlspec/__metadata__.py +14 -0
- sqlspec/_serialization.py +315 -0
- sqlspec/_typing.py +700 -0
- sqlspec/adapters/__init__.py +0 -0
- sqlspec/adapters/adbc/__init__.py +5 -0
- sqlspec/adapters/adbc/_typing.py +82 -0
- sqlspec/adapters/adbc/adk/__init__.py +5 -0
- sqlspec/adapters/adbc/adk/store.py +1273 -0
- sqlspec/adapters/adbc/config.py +295 -0
- sqlspec/adapters/adbc/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/adbc/core.py +735 -0
- sqlspec/adapters/adbc/data_dictionary.py +334 -0
- sqlspec/adapters/adbc/driver.py +529 -0
- sqlspec/adapters/adbc/events/__init__.py +5 -0
- sqlspec/adapters/adbc/events/store.py +285 -0
- sqlspec/adapters/adbc/litestar/__init__.py +5 -0
- sqlspec/adapters/adbc/litestar/store.py +502 -0
- sqlspec/adapters/adbc/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/adbc/type_converter.py +140 -0
- sqlspec/adapters/aiosqlite/__init__.py +25 -0
- sqlspec/adapters/aiosqlite/_typing.py +82 -0
- sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/adk/store.py +818 -0
- sqlspec/adapters/aiosqlite/config.py +334 -0
- sqlspec/adapters/aiosqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/aiosqlite/core.py +315 -0
- sqlspec/adapters/aiosqlite/data_dictionary.py +208 -0
- sqlspec/adapters/aiosqlite/driver.py +313 -0
- sqlspec/adapters/aiosqlite/events/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/events/store.py +20 -0
- sqlspec/adapters/aiosqlite/litestar/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/litestar/store.py +279 -0
- sqlspec/adapters/aiosqlite/pool.py +533 -0
- sqlspec/adapters/asyncmy/__init__.py +21 -0
- sqlspec/adapters/asyncmy/_typing.py +87 -0
- sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
- sqlspec/adapters/asyncmy/adk/store.py +703 -0
- sqlspec/adapters/asyncmy/config.py +302 -0
- sqlspec/adapters/asyncmy/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/asyncmy/core.py +360 -0
- sqlspec/adapters/asyncmy/data_dictionary.py +124 -0
- sqlspec/adapters/asyncmy/driver.py +383 -0
- sqlspec/adapters/asyncmy/events/__init__.py +5 -0
- sqlspec/adapters/asyncmy/events/store.py +104 -0
- sqlspec/adapters/asyncmy/litestar/__init__.py +5 -0
- sqlspec/adapters/asyncmy/litestar/store.py +296 -0
- sqlspec/adapters/asyncpg/__init__.py +19 -0
- sqlspec/adapters/asyncpg/_typing.py +88 -0
- sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
- sqlspec/adapters/asyncpg/adk/store.py +748 -0
- sqlspec/adapters/asyncpg/config.py +569 -0
- sqlspec/adapters/asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/asyncpg/core.py +367 -0
- sqlspec/adapters/asyncpg/data_dictionary.py +162 -0
- sqlspec/adapters/asyncpg/driver.py +487 -0
- sqlspec/adapters/asyncpg/events/__init__.py +6 -0
- sqlspec/adapters/asyncpg/events/backend.py +286 -0
- sqlspec/adapters/asyncpg/events/store.py +40 -0
- sqlspec/adapters/asyncpg/litestar/__init__.py +5 -0
- sqlspec/adapters/asyncpg/litestar/store.py +251 -0
- sqlspec/adapters/bigquery/__init__.py +14 -0
- sqlspec/adapters/bigquery/_typing.py +86 -0
- sqlspec/adapters/bigquery/adk/__init__.py +5 -0
- sqlspec/adapters/bigquery/adk/store.py +827 -0
- sqlspec/adapters/bigquery/config.py +353 -0
- sqlspec/adapters/bigquery/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/bigquery/core.py +715 -0
- sqlspec/adapters/bigquery/data_dictionary.py +128 -0
- sqlspec/adapters/bigquery/driver.py +548 -0
- sqlspec/adapters/bigquery/events/__init__.py +5 -0
- sqlspec/adapters/bigquery/events/store.py +139 -0
- sqlspec/adapters/bigquery/litestar/__init__.py +5 -0
- sqlspec/adapters/bigquery/litestar/store.py +325 -0
- sqlspec/adapters/bigquery/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/bigquery/type_converter.py +107 -0
- sqlspec/adapters/cockroach_asyncpg/__init__.py +24 -0
- sqlspec/adapters/cockroach_asyncpg/_typing.py +72 -0
- sqlspec/adapters/cockroach_asyncpg/adk/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/adk/store.py +410 -0
- sqlspec/adapters/cockroach_asyncpg/config.py +238 -0
- sqlspec/adapters/cockroach_asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/cockroach_asyncpg/core.py +55 -0
- sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +107 -0
- sqlspec/adapters/cockroach_asyncpg/driver.py +144 -0
- sqlspec/adapters/cockroach_asyncpg/events/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/events/store.py +20 -0
- sqlspec/adapters/cockroach_asyncpg/litestar/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/litestar/store.py +142 -0
- sqlspec/adapters/cockroach_psycopg/__init__.py +38 -0
- sqlspec/adapters/cockroach_psycopg/_typing.py +129 -0
- sqlspec/adapters/cockroach_psycopg/adk/__init__.py +13 -0
- sqlspec/adapters/cockroach_psycopg/adk/store.py +868 -0
- sqlspec/adapters/cockroach_psycopg/config.py +484 -0
- sqlspec/adapters/cockroach_psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/cockroach_psycopg/core.py +63 -0
- sqlspec/adapters/cockroach_psycopg/data_dictionary.py +215 -0
- sqlspec/adapters/cockroach_psycopg/driver.py +284 -0
- sqlspec/adapters/cockroach_psycopg/events/__init__.py +6 -0
- sqlspec/adapters/cockroach_psycopg/events/store.py +34 -0
- sqlspec/adapters/cockroach_psycopg/litestar/__init__.py +3 -0
- sqlspec/adapters/cockroach_psycopg/litestar/store.py +325 -0
- sqlspec/adapters/duckdb/__init__.py +25 -0
- sqlspec/adapters/duckdb/_typing.py +81 -0
- sqlspec/adapters/duckdb/adk/__init__.py +14 -0
- sqlspec/adapters/duckdb/adk/store.py +850 -0
- sqlspec/adapters/duckdb/config.py +463 -0
- sqlspec/adapters/duckdb/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/duckdb/core.py +257 -0
- sqlspec/adapters/duckdb/data_dictionary.py +140 -0
- sqlspec/adapters/duckdb/driver.py +430 -0
- sqlspec/adapters/duckdb/events/__init__.py +5 -0
- sqlspec/adapters/duckdb/events/store.py +57 -0
- sqlspec/adapters/duckdb/litestar/__init__.py +5 -0
- sqlspec/adapters/duckdb/litestar/store.py +330 -0
- sqlspec/adapters/duckdb/pool.py +293 -0
- sqlspec/adapters/duckdb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/duckdb/type_converter.py +118 -0
- sqlspec/adapters/mock/__init__.py +72 -0
- sqlspec/adapters/mock/_typing.py +147 -0
- sqlspec/adapters/mock/config.py +483 -0
- sqlspec/adapters/mock/core.py +319 -0
- sqlspec/adapters/mock/data_dictionary.py +366 -0
- sqlspec/adapters/mock/driver.py +721 -0
- sqlspec/adapters/mysqlconnector/__init__.py +36 -0
- sqlspec/adapters/mysqlconnector/_typing.py +141 -0
- sqlspec/adapters/mysqlconnector/adk/__init__.py +15 -0
- sqlspec/adapters/mysqlconnector/adk/store.py +1060 -0
- sqlspec/adapters/mysqlconnector/config.py +394 -0
- sqlspec/adapters/mysqlconnector/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/mysqlconnector/core.py +303 -0
- sqlspec/adapters/mysqlconnector/data_dictionary.py +235 -0
- sqlspec/adapters/mysqlconnector/driver.py +483 -0
- sqlspec/adapters/mysqlconnector/events/__init__.py +8 -0
- sqlspec/adapters/mysqlconnector/events/store.py +98 -0
- sqlspec/adapters/mysqlconnector/litestar/__init__.py +5 -0
- sqlspec/adapters/mysqlconnector/litestar/store.py +426 -0
- sqlspec/adapters/oracledb/__init__.py +60 -0
- sqlspec/adapters/oracledb/_numpy_handlers.py +141 -0
- sqlspec/adapters/oracledb/_typing.py +182 -0
- sqlspec/adapters/oracledb/_uuid_handlers.py +166 -0
- sqlspec/adapters/oracledb/adk/__init__.py +10 -0
- sqlspec/adapters/oracledb/adk/store.py +2369 -0
- sqlspec/adapters/oracledb/config.py +550 -0
- sqlspec/adapters/oracledb/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/oracledb/core.py +543 -0
- sqlspec/adapters/oracledb/data_dictionary.py +536 -0
- sqlspec/adapters/oracledb/driver.py +1229 -0
- sqlspec/adapters/oracledb/events/__init__.py +16 -0
- sqlspec/adapters/oracledb/events/backend.py +347 -0
- sqlspec/adapters/oracledb/events/store.py +420 -0
- sqlspec/adapters/oracledb/litestar/__init__.py +5 -0
- sqlspec/adapters/oracledb/litestar/store.py +781 -0
- sqlspec/adapters/oracledb/migrations.py +535 -0
- sqlspec/adapters/oracledb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/oracledb/type_converter.py +211 -0
- sqlspec/adapters/psqlpy/__init__.py +17 -0
- sqlspec/adapters/psqlpy/_typing.py +79 -0
- sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
- sqlspec/adapters/psqlpy/adk/store.py +766 -0
- sqlspec/adapters/psqlpy/config.py +304 -0
- sqlspec/adapters/psqlpy/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psqlpy/core.py +480 -0
- sqlspec/adapters/psqlpy/data_dictionary.py +126 -0
- sqlspec/adapters/psqlpy/driver.py +438 -0
- sqlspec/adapters/psqlpy/events/__init__.py +6 -0
- sqlspec/adapters/psqlpy/events/backend.py +310 -0
- sqlspec/adapters/psqlpy/events/store.py +20 -0
- sqlspec/adapters/psqlpy/litestar/__init__.py +5 -0
- sqlspec/adapters/psqlpy/litestar/store.py +270 -0
- sqlspec/adapters/psqlpy/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psqlpy/type_converter.py +113 -0
- sqlspec/adapters/psycopg/__init__.py +32 -0
- sqlspec/adapters/psycopg/_typing.py +164 -0
- sqlspec/adapters/psycopg/adk/__init__.py +10 -0
- sqlspec/adapters/psycopg/adk/store.py +1387 -0
- sqlspec/adapters/psycopg/config.py +576 -0
- sqlspec/adapters/psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psycopg/core.py +450 -0
- sqlspec/adapters/psycopg/data_dictionary.py +289 -0
- sqlspec/adapters/psycopg/driver.py +975 -0
- sqlspec/adapters/psycopg/events/__init__.py +20 -0
- sqlspec/adapters/psycopg/events/backend.py +458 -0
- sqlspec/adapters/psycopg/events/store.py +42 -0
- sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
- sqlspec/adapters/psycopg/litestar/store.py +552 -0
- sqlspec/adapters/psycopg/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psycopg/type_converter.py +93 -0
- sqlspec/adapters/pymysql/__init__.py +21 -0
- sqlspec/adapters/pymysql/_typing.py +71 -0
- sqlspec/adapters/pymysql/adk/__init__.py +5 -0
- sqlspec/adapters/pymysql/adk/store.py +540 -0
- sqlspec/adapters/pymysql/config.py +195 -0
- sqlspec/adapters/pymysql/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/pymysql/core.py +299 -0
- sqlspec/adapters/pymysql/data_dictionary.py +122 -0
- sqlspec/adapters/pymysql/driver.py +259 -0
- sqlspec/adapters/pymysql/events/__init__.py +5 -0
- sqlspec/adapters/pymysql/events/store.py +50 -0
- sqlspec/adapters/pymysql/litestar/__init__.py +5 -0
- sqlspec/adapters/pymysql/litestar/store.py +232 -0
- sqlspec/adapters/pymysql/pool.py +137 -0
- sqlspec/adapters/spanner/__init__.py +40 -0
- sqlspec/adapters/spanner/_typing.py +86 -0
- sqlspec/adapters/spanner/adk/__init__.py +5 -0
- sqlspec/adapters/spanner/adk/store.py +732 -0
- sqlspec/adapters/spanner/config.py +352 -0
- sqlspec/adapters/spanner/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/spanner/core.py +188 -0
- sqlspec/adapters/spanner/data_dictionary.py +120 -0
- sqlspec/adapters/spanner/dialect/__init__.py +6 -0
- sqlspec/adapters/spanner/dialect/_spangres.py +57 -0
- sqlspec/adapters/spanner/dialect/_spanner.py +130 -0
- sqlspec/adapters/spanner/driver.py +373 -0
- sqlspec/adapters/spanner/events/__init__.py +5 -0
- sqlspec/adapters/spanner/events/store.py +187 -0
- sqlspec/adapters/spanner/litestar/__init__.py +5 -0
- sqlspec/adapters/spanner/litestar/store.py +291 -0
- sqlspec/adapters/spanner/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/spanner/type_converter.py +331 -0
- sqlspec/adapters/sqlite/__init__.py +19 -0
- sqlspec/adapters/sqlite/_typing.py +80 -0
- sqlspec/adapters/sqlite/adk/__init__.py +5 -0
- sqlspec/adapters/sqlite/adk/store.py +958 -0
- sqlspec/adapters/sqlite/config.py +280 -0
- sqlspec/adapters/sqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/sqlite/core.py +312 -0
- sqlspec/adapters/sqlite/data_dictionary.py +202 -0
- sqlspec/adapters/sqlite/driver.py +359 -0
- sqlspec/adapters/sqlite/events/__init__.py +5 -0
- sqlspec/adapters/sqlite/events/store.py +20 -0
- sqlspec/adapters/sqlite/litestar/__init__.py +5 -0
- sqlspec/adapters/sqlite/litestar/store.py +316 -0
- sqlspec/adapters/sqlite/pool.py +198 -0
- sqlspec/adapters/sqlite/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/sqlite/type_converter.py +114 -0
- sqlspec/base.py +747 -0
- sqlspec/builder/__init__.py +179 -0
- sqlspec/builder/_base.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_base.py +1022 -0
- sqlspec/builder/_column.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_column.py +521 -0
- sqlspec/builder/_ddl.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_ddl.py +1642 -0
- sqlspec/builder/_delete.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_delete.py +95 -0
- sqlspec/builder/_dml.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_dml.py +365 -0
- sqlspec/builder/_explain.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_explain.py +579 -0
- sqlspec/builder/_expression_wrappers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_expression_wrappers.py +46 -0
- sqlspec/builder/_factory.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_factory.py +1697 -0
- sqlspec/builder/_insert.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_insert.py +328 -0
- sqlspec/builder/_join.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_join.py +499 -0
- sqlspec/builder/_merge.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_merge.py +821 -0
- sqlspec/builder/_parsing_utils.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_parsing_utils.py +297 -0
- sqlspec/builder/_select.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_select.py +1660 -0
- sqlspec/builder/_temporal.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_temporal.py +139 -0
- sqlspec/builder/_update.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_update.py +173 -0
- sqlspec/builder/_vector_expressions.py +267 -0
- sqlspec/cli.py +911 -0
- sqlspec/config.py +1755 -0
- sqlspec/core/__init__.py +374 -0
- sqlspec/core/_correlation.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/_correlation.py +176 -0
- sqlspec/core/cache.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/cache.py +1069 -0
- sqlspec/core/compiler.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/compiler.py +954 -0
- sqlspec/core/explain.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/explain.py +275 -0
- sqlspec/core/filters.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/filters.py +952 -0
- sqlspec/core/hashing.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/hashing.py +262 -0
- sqlspec/core/metrics.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/metrics.py +83 -0
- sqlspec/core/parameters/__init__.py +71 -0
- sqlspec/core/parameters/_alignment.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_alignment.py +270 -0
- sqlspec/core/parameters/_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_converter.py +543 -0
- sqlspec/core/parameters/_processor.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_processor.py +505 -0
- sqlspec/core/parameters/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_registry.py +206 -0
- sqlspec/core/parameters/_transformers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_transformers.py +292 -0
- sqlspec/core/parameters/_types.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_types.py +499 -0
- sqlspec/core/parameters/_validator.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_validator.py +180 -0
- sqlspec/core/pipeline.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/pipeline.py +319 -0
- sqlspec/core/query_modifiers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/query_modifiers.py +437 -0
- sqlspec/core/result/__init__.py +23 -0
- sqlspec/core/result/_base.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/result/_base.py +1121 -0
- sqlspec/core/result/_io.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/result/_io.py +28 -0
- sqlspec/core/splitter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/splitter.py +966 -0
- sqlspec/core/stack.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/stack.py +163 -0
- sqlspec/core/statement.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/statement.py +1503 -0
- sqlspec/core/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/type_converter.py +339 -0
- sqlspec/data_dictionary/__init__.py +22 -0
- sqlspec/data_dictionary/_loader.py +123 -0
- sqlspec/data_dictionary/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/_registry.py +74 -0
- sqlspec/data_dictionary/_types.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/_types.py +121 -0
- sqlspec/data_dictionary/dialects/__init__.py +21 -0
- sqlspec/data_dictionary/dialects/bigquery.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/bigquery.py +49 -0
- sqlspec/data_dictionary/dialects/cockroachdb.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/cockroachdb.py +43 -0
- sqlspec/data_dictionary/dialects/duckdb.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/duckdb.py +47 -0
- sqlspec/data_dictionary/dialects/mysql.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/mysql.py +42 -0
- sqlspec/data_dictionary/dialects/oracle.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/oracle.py +34 -0
- sqlspec/data_dictionary/dialects/postgres.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/postgres.py +46 -0
- sqlspec/data_dictionary/dialects/spanner.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/spanner.py +37 -0
- sqlspec/data_dictionary/dialects/sqlite.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/sqlite.py +42 -0
- sqlspec/data_dictionary/sql/.gitkeep +0 -0
- sqlspec/data_dictionary/sql/bigquery/columns.sql +23 -0
- sqlspec/data_dictionary/sql/bigquery/foreign_keys.sql +34 -0
- sqlspec/data_dictionary/sql/bigquery/indexes.sql +19 -0
- sqlspec/data_dictionary/sql/bigquery/tables.sql +33 -0
- sqlspec/data_dictionary/sql/bigquery/version.sql +3 -0
- sqlspec/data_dictionary/sql/cockroachdb/columns.sql +34 -0
- sqlspec/data_dictionary/sql/cockroachdb/foreign_keys.sql +40 -0
- sqlspec/data_dictionary/sql/cockroachdb/indexes.sql +32 -0
- sqlspec/data_dictionary/sql/cockroachdb/tables.sql +44 -0
- sqlspec/data_dictionary/sql/cockroachdb/version.sql +3 -0
- sqlspec/data_dictionary/sql/duckdb/columns.sql +23 -0
- sqlspec/data_dictionary/sql/duckdb/foreign_keys.sql +36 -0
- sqlspec/data_dictionary/sql/duckdb/indexes.sql +19 -0
- sqlspec/data_dictionary/sql/duckdb/tables.sql +38 -0
- sqlspec/data_dictionary/sql/duckdb/version.sql +3 -0
- sqlspec/data_dictionary/sql/mysql/columns.sql +23 -0
- sqlspec/data_dictionary/sql/mysql/foreign_keys.sql +28 -0
- sqlspec/data_dictionary/sql/mysql/indexes.sql +26 -0
- sqlspec/data_dictionary/sql/mysql/tables.sql +33 -0
- sqlspec/data_dictionary/sql/mysql/version.sql +3 -0
- sqlspec/data_dictionary/sql/oracle/columns.sql +23 -0
- sqlspec/data_dictionary/sql/oracle/foreign_keys.sql +48 -0
- sqlspec/data_dictionary/sql/oracle/indexes.sql +44 -0
- sqlspec/data_dictionary/sql/oracle/tables.sql +25 -0
- sqlspec/data_dictionary/sql/oracle/version.sql +20 -0
- sqlspec/data_dictionary/sql/postgres/columns.sql +34 -0
- sqlspec/data_dictionary/sql/postgres/foreign_keys.sql +40 -0
- sqlspec/data_dictionary/sql/postgres/indexes.sql +56 -0
- sqlspec/data_dictionary/sql/postgres/tables.sql +44 -0
- sqlspec/data_dictionary/sql/postgres/version.sql +3 -0
- sqlspec/data_dictionary/sql/spanner/columns.sql +23 -0
- sqlspec/data_dictionary/sql/spanner/foreign_keys.sql +70 -0
- sqlspec/data_dictionary/sql/spanner/indexes.sql +30 -0
- sqlspec/data_dictionary/sql/spanner/tables.sql +9 -0
- sqlspec/data_dictionary/sql/spanner/version.sql +3 -0
- sqlspec/data_dictionary/sql/sqlite/columns.sql +23 -0
- sqlspec/data_dictionary/sql/sqlite/foreign_keys.sql +22 -0
- sqlspec/data_dictionary/sql/sqlite/indexes.sql +7 -0
- sqlspec/data_dictionary/sql/sqlite/tables.sql +28 -0
- sqlspec/data_dictionary/sql/sqlite/version.sql +3 -0
- sqlspec/driver/__init__.py +32 -0
- sqlspec/driver/_async.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_async.py +1737 -0
- sqlspec/driver/_common.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_common.py +1478 -0
- sqlspec/driver/_sql_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_sql_helpers.py +148 -0
- sqlspec/driver/_storage_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_storage_helpers.py +144 -0
- sqlspec/driver/_sync.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_sync.py +1710 -0
- sqlspec/exceptions.py +338 -0
- sqlspec/extensions/__init__.py +0 -0
- sqlspec/extensions/adk/__init__.py +70 -0
- sqlspec/extensions/adk/_types.py +51 -0
- sqlspec/extensions/adk/converters.py +172 -0
- sqlspec/extensions/adk/memory/__init__.py +69 -0
- sqlspec/extensions/adk/memory/_types.py +30 -0
- sqlspec/extensions/adk/memory/converters.py +149 -0
- sqlspec/extensions/adk/memory/service.py +217 -0
- sqlspec/extensions/adk/memory/store.py +569 -0
- sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +246 -0
- sqlspec/extensions/adk/migrations/__init__.py +0 -0
- sqlspec/extensions/adk/service.py +225 -0
- sqlspec/extensions/adk/store.py +567 -0
- sqlspec/extensions/events/__init__.py +51 -0
- sqlspec/extensions/events/_channel.py +703 -0
- sqlspec/extensions/events/_hints.py +45 -0
- sqlspec/extensions/events/_models.py +23 -0
- sqlspec/extensions/events/_payload.py +69 -0
- sqlspec/extensions/events/_protocols.py +134 -0
- sqlspec/extensions/events/_queue.py +461 -0
- sqlspec/extensions/events/_store.py +209 -0
- sqlspec/extensions/events/migrations/0001_create_event_queue.py +59 -0
- sqlspec/extensions/events/migrations/__init__.py +3 -0
- sqlspec/extensions/fastapi/__init__.py +19 -0
- sqlspec/extensions/fastapi/extension.py +351 -0
- sqlspec/extensions/fastapi/providers.py +607 -0
- sqlspec/extensions/flask/__init__.py +37 -0
- sqlspec/extensions/flask/_state.py +76 -0
- sqlspec/extensions/flask/_utils.py +71 -0
- sqlspec/extensions/flask/extension.py +519 -0
- sqlspec/extensions/litestar/__init__.py +28 -0
- sqlspec/extensions/litestar/_utils.py +52 -0
- sqlspec/extensions/litestar/channels.py +165 -0
- sqlspec/extensions/litestar/cli.py +102 -0
- sqlspec/extensions/litestar/config.py +90 -0
- sqlspec/extensions/litestar/handlers.py +316 -0
- sqlspec/extensions/litestar/migrations/0001_create_session_table.py +137 -0
- sqlspec/extensions/litestar/migrations/__init__.py +3 -0
- sqlspec/extensions/litestar/plugin.py +671 -0
- sqlspec/extensions/litestar/providers.py +526 -0
- sqlspec/extensions/litestar/store.py +296 -0
- sqlspec/extensions/otel/__init__.py +58 -0
- sqlspec/extensions/prometheus/__init__.py +113 -0
- sqlspec/extensions/starlette/__init__.py +19 -0
- sqlspec/extensions/starlette/_state.py +30 -0
- sqlspec/extensions/starlette/_utils.py +96 -0
- sqlspec/extensions/starlette/extension.py +346 -0
- sqlspec/extensions/starlette/middleware.py +235 -0
- sqlspec/loader.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/loader.py +702 -0
- sqlspec/migrations/__init__.py +36 -0
- sqlspec/migrations/base.py +731 -0
- sqlspec/migrations/commands.py +1232 -0
- sqlspec/migrations/context.py +157 -0
- sqlspec/migrations/fix.py +204 -0
- sqlspec/migrations/loaders.py +443 -0
- sqlspec/migrations/runner.py +1172 -0
- sqlspec/migrations/templates.py +234 -0
- sqlspec/migrations/tracker.py +611 -0
- sqlspec/migrations/utils.py +256 -0
- sqlspec/migrations/validation.py +207 -0
- sqlspec/migrations/version.py +446 -0
- sqlspec/observability/__init__.py +55 -0
- sqlspec/observability/_common.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_common.py +77 -0
- sqlspec/observability/_config.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_config.py +348 -0
- sqlspec/observability/_diagnostics.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_diagnostics.py +74 -0
- sqlspec/observability/_dispatcher.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_dispatcher.py +152 -0
- sqlspec/observability/_formatters/__init__.py +13 -0
- sqlspec/observability/_formatters/_aws.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_aws.py +102 -0
- sqlspec/observability/_formatters/_azure.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_azure.py +96 -0
- sqlspec/observability/_formatters/_base.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_base.py +57 -0
- sqlspec/observability/_formatters/_gcp.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_gcp.py +131 -0
- sqlspec/observability/_formatting.py +58 -0
- sqlspec/observability/_observer.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_observer.py +357 -0
- sqlspec/observability/_runtime.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_runtime.py +420 -0
- sqlspec/observability/_sampling.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_sampling.py +188 -0
- sqlspec/observability/_spans.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_spans.py +161 -0
- sqlspec/protocols.py +916 -0
- sqlspec/py.typed +0 -0
- sqlspec/storage/__init__.py +48 -0
- sqlspec/storage/_utils.py +104 -0
- sqlspec/storage/backends/__init__.py +1 -0
- sqlspec/storage/backends/base.py +253 -0
- sqlspec/storage/backends/fsspec.py +529 -0
- sqlspec/storage/backends/local.py +441 -0
- sqlspec/storage/backends/obstore.py +916 -0
- sqlspec/storage/errors.py +104 -0
- sqlspec/storage/pipeline.py +582 -0
- sqlspec/storage/registry.py +301 -0
- sqlspec/typing.py +395 -0
- sqlspec/utils/__init__.py +7 -0
- sqlspec/utils/arrow_helpers.py +318 -0
- sqlspec/utils/config_tools.py +332 -0
- sqlspec/utils/correlation.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/correlation.py +134 -0
- sqlspec/utils/deprecation.py +190 -0
- sqlspec/utils/fixtures.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/fixtures.py +258 -0
- sqlspec/utils/logging.py +222 -0
- sqlspec/utils/module_loader.py +306 -0
- sqlspec/utils/portal.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/portal.py +375 -0
- sqlspec/utils/schema.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/schema.py +485 -0
- sqlspec/utils/serializers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/serializers.py +408 -0
- sqlspec/utils/singleton.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/singleton.py +41 -0
- sqlspec/utils/sync_tools.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/sync_tools.py +311 -0
- sqlspec/utils/text.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/text.py +108 -0
- sqlspec/utils/type_converters.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/type_converters.py +128 -0
- sqlspec/utils/type_guards.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/type_guards.py +1360 -0
- sqlspec/utils/uuids.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/uuids.py +225 -0
- sqlspec-0.36.0.dist-info/METADATA +205 -0
- sqlspec-0.36.0.dist-info/RECORD +531 -0
- sqlspec-0.36.0.dist-info/WHEEL +7 -0
- sqlspec-0.36.0.dist-info/entry_points.txt +2 -0
- sqlspec-0.36.0.dist-info/licenses/LICENSE +21 -0
sqlspec/utils/logging.py
ADDED
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"""Logging utilities for SQLSpec.
|
|
2
|
+
|
|
3
|
+
This module provides utilities for structured logging with correlation IDs.
|
|
4
|
+
Users should configure their own logging handlers and levels as needed.
|
|
5
|
+
SQLSpec provides StructuredFormatter for JSON-formatted logs if desired.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import logging
|
|
9
|
+
from logging import LogRecord
|
|
10
|
+
from typing import TYPE_CHECKING, Any, cast
|
|
11
|
+
|
|
12
|
+
from sqlspec._serialization import encode_json
|
|
13
|
+
from sqlspec.utils.correlation import CorrelationContext
|
|
14
|
+
from sqlspec.utils.correlation import correlation_id_var as _correlation_id_var
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from contextvars import ContextVar
|
|
18
|
+
|
|
19
|
+
__all__ = (
|
|
20
|
+
"SqlglotCommandFallbackFilter",
|
|
21
|
+
"StructuredFormatter",
|
|
22
|
+
"correlation_id_var",
|
|
23
|
+
"get_correlation_id",
|
|
24
|
+
"get_logger",
|
|
25
|
+
"set_correlation_id",
|
|
26
|
+
"suppress_erroneous_sqlglot_log_messages",
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
_BASE_RECORD_KEYS: "set[str] | None" = None
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _get_base_record_keys() -> "set[str]":
|
|
33
|
+
"""Get base LogRecord keys lazily to avoid mypyc module-level dict issues."""
|
|
34
|
+
global _BASE_RECORD_KEYS
|
|
35
|
+
if _BASE_RECORD_KEYS is None:
|
|
36
|
+
_BASE_RECORD_KEYS = set(
|
|
37
|
+
logging.LogRecord(
|
|
38
|
+
name="sqlspec", level=logging.INFO, pathname="(unknown file)", lineno=0, msg="", args=(), exc_info=None
|
|
39
|
+
).__dict__.keys()
|
|
40
|
+
)
|
|
41
|
+
_BASE_RECORD_KEYS.update({"message", "asctime"})
|
|
42
|
+
return _BASE_RECORD_KEYS
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
correlation_id_var: "ContextVar[str | None]" = _correlation_id_var
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _get_trace_context() -> "tuple[str | None, str | None]":
|
|
49
|
+
"""Resolve trace context lazily to avoid import cycles.
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
Tuple of (trace_id, span_id) or (None, None) if unavailable.
|
|
53
|
+
"""
|
|
54
|
+
try:
|
|
55
|
+
from sqlspec.observability import get_trace_context
|
|
56
|
+
except Exception:
|
|
57
|
+
return (None, None)
|
|
58
|
+
return get_trace_context()
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def set_correlation_id(correlation_id: "str | None") -> None:
|
|
62
|
+
"""Set the correlation ID for the current context.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
correlation_id: The correlation ID to set, or None to clear
|
|
66
|
+
"""
|
|
67
|
+
CorrelationContext.set(correlation_id)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def get_correlation_id() -> "str | None":
|
|
71
|
+
"""Get the current correlation ID.
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
The current correlation ID or None if not set
|
|
75
|
+
"""
|
|
76
|
+
return CorrelationContext.get()
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class StructuredFormatter(logging.Formatter):
|
|
80
|
+
"""Structured JSON formatter with correlation ID support."""
|
|
81
|
+
|
|
82
|
+
def format(self, record: LogRecord) -> str:
|
|
83
|
+
"""Format log record as structured JSON.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
record: The log record to format
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
JSON formatted log entry
|
|
90
|
+
"""
|
|
91
|
+
log_entry = {
|
|
92
|
+
"timestamp": self.formatTime(record, self.datefmt),
|
|
93
|
+
"level": record.levelname,
|
|
94
|
+
"logger": record.name,
|
|
95
|
+
"message": record.getMessage(),
|
|
96
|
+
"module": record.module,
|
|
97
|
+
"function": record.funcName,
|
|
98
|
+
"line": record.lineno,
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
record_dict = record.__dict__
|
|
102
|
+
correlation_id = cast("str | None", record_dict.get("correlation_id")) or get_correlation_id()
|
|
103
|
+
if correlation_id:
|
|
104
|
+
log_entry["correlation_id"] = correlation_id
|
|
105
|
+
trace_id = cast("str | None", record_dict.get("trace_id"))
|
|
106
|
+
span_id = cast("str | None", record_dict.get("span_id"))
|
|
107
|
+
if trace_id is None or span_id is None:
|
|
108
|
+
trace_id, span_id = _get_trace_context()
|
|
109
|
+
if trace_id:
|
|
110
|
+
log_entry["trace_id"] = trace_id
|
|
111
|
+
if span_id:
|
|
112
|
+
log_entry["span_id"] = span_id
|
|
113
|
+
|
|
114
|
+
extra_fields = record_dict.get("extra_fields")
|
|
115
|
+
if isinstance(extra_fields, dict):
|
|
116
|
+
log_entry.update(extra_fields)
|
|
117
|
+
|
|
118
|
+
extras = {
|
|
119
|
+
key: value
|
|
120
|
+
for key, value in record_dict.items()
|
|
121
|
+
if key not in _get_base_record_keys() and key not in {"extra_fields", "correlation_id"}
|
|
122
|
+
}
|
|
123
|
+
if extras:
|
|
124
|
+
log_entry.update(extras)
|
|
125
|
+
|
|
126
|
+
if record.exc_info:
|
|
127
|
+
log_entry["exception"] = self.formatException(record.exc_info)
|
|
128
|
+
|
|
129
|
+
return encode_json(log_entry)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
class CorrelationIDFilter(logging.Filter):
|
|
133
|
+
"""Filter that adds correlation ID to log records."""
|
|
134
|
+
|
|
135
|
+
def filter(self, record: LogRecord) -> bool:
|
|
136
|
+
"""Add correlation ID to record if available.
|
|
137
|
+
|
|
138
|
+
Args:
|
|
139
|
+
record: The log record to filter
|
|
140
|
+
|
|
141
|
+
Returns:
|
|
142
|
+
Always True to pass the record through
|
|
143
|
+
"""
|
|
144
|
+
if correlation_id := get_correlation_id():
|
|
145
|
+
record.correlation_id = correlation_id
|
|
146
|
+
return True
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
class SqlglotCommandFallbackFilter(logging.Filter):
|
|
150
|
+
"""Filter to suppress sqlglot warnings we consider benign.
|
|
151
|
+
|
|
152
|
+
- "Falling back to parsing as a 'Command'": emitted when sqlglot hits syntax it
|
|
153
|
+
intentionally downgrades; expected in SQLSpec usage.
|
|
154
|
+
- "Cannot traverse scope …": emitted by sqlglot's scope analysis in cases where
|
|
155
|
+
SQLSpec feeds partially constructed expressions; harmless for our flows.
|
|
156
|
+
"""
|
|
157
|
+
|
|
158
|
+
_suppressed_substrings = (
|
|
159
|
+
"falling back to parsing as a 'command'",
|
|
160
|
+
"cannot traverse scope",
|
|
161
|
+
"locking reads using 'for update/share' are not supported",
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
def filter(self, record: LogRecord) -> bool:
|
|
165
|
+
"""Suppress known-safe sqlglot warnings.
|
|
166
|
+
|
|
167
|
+
Args:
|
|
168
|
+
record: The log record to evaluate
|
|
169
|
+
|
|
170
|
+
Returns:
|
|
171
|
+
False if the record message matches a suppressed pattern, True otherwise.
|
|
172
|
+
"""
|
|
173
|
+
message = record.getMessage().lower()
|
|
174
|
+
return not any(substr in message for substr in self._suppressed_substrings)
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def get_logger(name: "str | None" = None) -> logging.Logger:
|
|
178
|
+
"""Get a logger instance with standardized configuration.
|
|
179
|
+
|
|
180
|
+
Args:
|
|
181
|
+
name: Logger name. If not provided, returns the root sqlspec logger.
|
|
182
|
+
|
|
183
|
+
Returns:
|
|
184
|
+
Configured logger instance
|
|
185
|
+
"""
|
|
186
|
+
if name is None:
|
|
187
|
+
return logging.getLogger("sqlspec")
|
|
188
|
+
|
|
189
|
+
if not name.startswith("sqlspec"):
|
|
190
|
+
name = f"sqlspec.{name}"
|
|
191
|
+
|
|
192
|
+
logger = logging.getLogger(name)
|
|
193
|
+
|
|
194
|
+
if not any(isinstance(f, CorrelationIDFilter) for f in logger.filters):
|
|
195
|
+
logger.addFilter(CorrelationIDFilter())
|
|
196
|
+
|
|
197
|
+
return logger
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def log_with_context(logger: logging.Logger, level: int, message: str, **extra_fields: Any) -> None:
|
|
201
|
+
"""Log a message with structured extra fields.
|
|
202
|
+
|
|
203
|
+
Args:
|
|
204
|
+
logger: The logger to use
|
|
205
|
+
level: Log level
|
|
206
|
+
message: Log message
|
|
207
|
+
**extra_fields: Additional fields to include in structured logs
|
|
208
|
+
"""
|
|
209
|
+
logger.log(level, message, extra={"extra_fields": extra_fields}, stacklevel=2)
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def suppress_erroneous_sqlglot_log_messages() -> None:
|
|
213
|
+
"""Suppress confusing sqlglot warning messages.
|
|
214
|
+
|
|
215
|
+
Adds a filter to the sqlglot logger to suppress the warning message
|
|
216
|
+
about falling back to parsing as a Command. This is expected behavior
|
|
217
|
+
in SQLSpec and the warning is confusing to users.
|
|
218
|
+
"""
|
|
219
|
+
for logger_name in ("sqlglot", "sqlglot.scope", "sqlglot.generator"):
|
|
220
|
+
sqlglot_logger = logging.getLogger(logger_name)
|
|
221
|
+
if not any(isinstance(f, SqlglotCommandFallbackFilter) for f in sqlglot_logger.filters):
|
|
222
|
+
sqlglot_logger.addFilter(SqlglotCommandFallbackFilter())
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
"""Module loading utilities for SQLSpec.
|
|
2
|
+
|
|
3
|
+
Provides functions for dynamic module imports, path resolution, and dependency
|
|
4
|
+
availability checking. Used for loading modules from dotted paths, converting
|
|
5
|
+
module paths to filesystem paths, and ensuring optional dependencies are installed.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import importlib
|
|
9
|
+
from importlib.util import find_spec
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import TYPE_CHECKING, Any
|
|
12
|
+
|
|
13
|
+
from sqlspec.exceptions import MissingDependencyError
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from types import ModuleType
|
|
17
|
+
|
|
18
|
+
__all__ = (
|
|
19
|
+
"OptionalDependencyFlag",
|
|
20
|
+
"dependency_flag",
|
|
21
|
+
"ensure_attrs",
|
|
22
|
+
"ensure_cattrs",
|
|
23
|
+
"ensure_fsspec",
|
|
24
|
+
"ensure_litestar",
|
|
25
|
+
"ensure_msgspec",
|
|
26
|
+
"ensure_numpy",
|
|
27
|
+
"ensure_obstore",
|
|
28
|
+
"ensure_opentelemetry",
|
|
29
|
+
"ensure_orjson",
|
|
30
|
+
"ensure_pandas",
|
|
31
|
+
"ensure_pgvector",
|
|
32
|
+
"ensure_polars",
|
|
33
|
+
"ensure_prometheus",
|
|
34
|
+
"ensure_pyarrow",
|
|
35
|
+
"ensure_pydantic",
|
|
36
|
+
"ensure_uvloop",
|
|
37
|
+
"import_string",
|
|
38
|
+
"module_available",
|
|
39
|
+
"module_to_os_path",
|
|
40
|
+
"reset_dependency_cache",
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# =============================================================================
|
|
45
|
+
# Dependency Availability Checking
|
|
46
|
+
# =============================================================================
|
|
47
|
+
|
|
48
|
+
_dependency_cache: "dict[str, bool]" = {}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def module_available(module_name: str) -> bool:
|
|
52
|
+
"""Return True if the given module can be resolved.
|
|
53
|
+
|
|
54
|
+
The result is cached per interpreter session. Call
|
|
55
|
+
:func:`reset_dependency_cache` to invalidate cached entries when
|
|
56
|
+
tests manipulate ``sys.path``.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
module_name: Dotted module path to check.
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
True if :mod:`importlib` can find the module, False otherwise.
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
cached = _dependency_cache.get(module_name)
|
|
66
|
+
if cached is not None:
|
|
67
|
+
return cached
|
|
68
|
+
|
|
69
|
+
try:
|
|
70
|
+
is_available = find_spec(module_name) is not None
|
|
71
|
+
except ModuleNotFoundError:
|
|
72
|
+
is_available = False
|
|
73
|
+
|
|
74
|
+
_dependency_cache[module_name] = is_available
|
|
75
|
+
return is_available
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def reset_dependency_cache(module_name: str | None = None) -> None:
|
|
79
|
+
"""Clear cached availability for one module or the entire cache.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
module_name: Specific dotted module path to drop from the cache.
|
|
83
|
+
Clears the full cache when ``None``.
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
if module_name is None:
|
|
87
|
+
_dependency_cache.clear()
|
|
88
|
+
return
|
|
89
|
+
|
|
90
|
+
_dependency_cache.pop(module_name, None)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class OptionalDependencyFlag:
|
|
94
|
+
"""Boolean-like wrapper that evaluates module availability lazily."""
|
|
95
|
+
|
|
96
|
+
__slots__ = ("module_name",)
|
|
97
|
+
|
|
98
|
+
def __init__(self, module_name: str) -> None:
|
|
99
|
+
self.module_name = module_name
|
|
100
|
+
|
|
101
|
+
def __bool__(self) -> bool:
|
|
102
|
+
return module_available(self.module_name)
|
|
103
|
+
|
|
104
|
+
def __repr__(self) -> str:
|
|
105
|
+
status = "available" if module_available(self.module_name) else "missing"
|
|
106
|
+
return f"OptionalDependencyFlag(module='{self.module_name}', status='{status}')"
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def dependency_flag(module_name: str) -> "OptionalDependencyFlag":
|
|
110
|
+
"""Return a lazily evaluated flag for the supplied module name.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
module_name: Dotted module path to guard.
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
:class:`OptionalDependencyFlag` tracking the module.
|
|
117
|
+
"""
|
|
118
|
+
|
|
119
|
+
return OptionalDependencyFlag(module_name)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
# =============================================================================
|
|
123
|
+
# Module Loading and Import Utilities
|
|
124
|
+
# =============================================================================
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def _require_dependency(
|
|
128
|
+
module_name: str, *, package_name: str | None = None, install_package: str | None = None
|
|
129
|
+
) -> None:
|
|
130
|
+
"""Raise MissingDependencyError when an optional dependency is absent."""
|
|
131
|
+
|
|
132
|
+
if module_available(module_name):
|
|
133
|
+
return
|
|
134
|
+
|
|
135
|
+
package = package_name or module_name
|
|
136
|
+
install = install_package or package
|
|
137
|
+
raise MissingDependencyError(package=package, install_package=install)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def _raise_import_error(msg: str, exc: "Exception | None" = None) -> None:
|
|
141
|
+
"""Raise an ImportError with optional exception chaining."""
|
|
142
|
+
if exc is not None:
|
|
143
|
+
raise ImportError(msg) from exc
|
|
144
|
+
raise ImportError(msg)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def _resolve_import_attr(obj: Any, attr: str, module: "ModuleType | None", dotted_path: str) -> Any:
|
|
148
|
+
"""Resolve a dotted attribute path segment on a module or object."""
|
|
149
|
+
try:
|
|
150
|
+
return obj.__getattribute__(attr)
|
|
151
|
+
except AttributeError as exc:
|
|
152
|
+
module_name = module.__name__ if module is not None else "unknown"
|
|
153
|
+
_raise_import_error(f"Module '{module_name}' has no attribute '{attr}' in '{dotted_path}'", exc)
|
|
154
|
+
raise
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def module_to_os_path(dotted_path: str = "app") -> "Path":
|
|
158
|
+
"""Convert a module dotted path to filesystem path.
|
|
159
|
+
|
|
160
|
+
Args:
|
|
161
|
+
dotted_path: The path to the module.
|
|
162
|
+
|
|
163
|
+
Raises:
|
|
164
|
+
TypeError: The module could not be found.
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
The path to the module.
|
|
168
|
+
"""
|
|
169
|
+
try:
|
|
170
|
+
if (src := find_spec(dotted_path)) is None: # pragma: no cover
|
|
171
|
+
msg = f"Couldn't find the path for {dotted_path}"
|
|
172
|
+
raise TypeError(msg)
|
|
173
|
+
except ModuleNotFoundError as e:
|
|
174
|
+
msg = f"Couldn't find the path for {dotted_path}"
|
|
175
|
+
raise TypeError(msg) from e
|
|
176
|
+
|
|
177
|
+
path = Path(str(src.origin))
|
|
178
|
+
return path.parent if path.is_file() else path
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def import_string(dotted_path: str) -> "Any":
|
|
182
|
+
"""Import a module or attribute from a dotted path string.
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
dotted_path: The path of the module to import.
|
|
186
|
+
|
|
187
|
+
Returns:
|
|
188
|
+
The imported object.
|
|
189
|
+
"""
|
|
190
|
+
|
|
191
|
+
obj: Any = None
|
|
192
|
+
try:
|
|
193
|
+
parts = dotted_path.split(".")
|
|
194
|
+
module = None
|
|
195
|
+
i = len(parts)
|
|
196
|
+
|
|
197
|
+
for i in range(len(parts), 0, -1):
|
|
198
|
+
module_path = ".".join(parts[:i])
|
|
199
|
+
try:
|
|
200
|
+
module = importlib.import_module(module_path)
|
|
201
|
+
break
|
|
202
|
+
except ModuleNotFoundError:
|
|
203
|
+
continue
|
|
204
|
+
else:
|
|
205
|
+
_raise_import_error(f"{dotted_path} doesn't look like a module path")
|
|
206
|
+
|
|
207
|
+
if module is None:
|
|
208
|
+
_raise_import_error(f"Failed to import any module from {dotted_path}")
|
|
209
|
+
|
|
210
|
+
obj = module
|
|
211
|
+
attrs = parts[i:]
|
|
212
|
+
if not attrs and i == len(parts) and len(parts) > 1:
|
|
213
|
+
parent_module_path = ".".join(parts[:-1])
|
|
214
|
+
attr = parts[-1]
|
|
215
|
+
try:
|
|
216
|
+
parent_module = importlib.import_module(parent_module_path)
|
|
217
|
+
except Exception:
|
|
218
|
+
return obj
|
|
219
|
+
if attr not in parent_module.__dict__:
|
|
220
|
+
_raise_import_error(f"Module '{parent_module_path}' has no attribute '{attr}' in '{dotted_path}'")
|
|
221
|
+
|
|
222
|
+
for attr in attrs:
|
|
223
|
+
obj = _resolve_import_attr(obj, attr, module, dotted_path)
|
|
224
|
+
except Exception as e: # pylint: disable=broad-exception-caught
|
|
225
|
+
_raise_import_error(f"Could not import '{dotted_path}': {e}", e)
|
|
226
|
+
return obj
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def ensure_attrs() -> None:
|
|
230
|
+
"""Ensure attrs is available."""
|
|
231
|
+
_require_dependency("attrs")
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def ensure_cattrs() -> None:
|
|
235
|
+
"""Ensure cattrs is available."""
|
|
236
|
+
_require_dependency("cattrs")
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
def ensure_fsspec() -> None:
|
|
240
|
+
"""Ensure fsspec is available for filesystem operations."""
|
|
241
|
+
_require_dependency("fsspec")
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
def ensure_litestar() -> None:
|
|
245
|
+
"""Ensure Litestar is available."""
|
|
246
|
+
_require_dependency("litestar")
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def ensure_msgspec() -> None:
|
|
250
|
+
"""Ensure msgspec is available for serialization."""
|
|
251
|
+
_require_dependency("msgspec")
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def ensure_numpy() -> None:
|
|
255
|
+
"""Ensure NumPy is available for array operations."""
|
|
256
|
+
_require_dependency("numpy")
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
def ensure_obstore() -> None:
|
|
260
|
+
"""Ensure obstore is available for object storage operations."""
|
|
261
|
+
_require_dependency("obstore")
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def ensure_opentelemetry() -> None:
|
|
265
|
+
"""Ensure OpenTelemetry is available for tracing."""
|
|
266
|
+
_require_dependency("opentelemetry", package_name="opentelemetry-api", install_package="opentelemetry")
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
def ensure_orjson() -> None:
|
|
270
|
+
"""Ensure orjson is available for fast JSON operations."""
|
|
271
|
+
_require_dependency("orjson")
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def ensure_pandas() -> None:
|
|
275
|
+
"""Ensure pandas is available for DataFrame operations."""
|
|
276
|
+
_require_dependency("pandas")
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
def ensure_pgvector() -> None:
|
|
280
|
+
"""Ensure pgvector is available for vector operations."""
|
|
281
|
+
_require_dependency("pgvector")
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
def ensure_polars() -> None:
|
|
285
|
+
"""Ensure Polars is available for DataFrame operations."""
|
|
286
|
+
_require_dependency("polars")
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
def ensure_prometheus() -> None:
|
|
290
|
+
"""Ensure Prometheus client is available for metrics."""
|
|
291
|
+
_require_dependency("prometheus_client", package_name="prometheus-client", install_package="prometheus")
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
def ensure_pyarrow() -> None:
|
|
295
|
+
"""Ensure PyArrow is available for Arrow operations."""
|
|
296
|
+
_require_dependency("pyarrow")
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
def ensure_pydantic() -> None:
|
|
300
|
+
"""Ensure Pydantic is available for data validation."""
|
|
301
|
+
_require_dependency("pydantic")
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
def ensure_uvloop() -> None:
|
|
305
|
+
"""Ensure uvloop is available for fast event loops."""
|
|
306
|
+
_require_dependency("uvloop")
|
|
Binary file
|