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/schema.py
ADDED
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
"""Schema transformation utilities for converting data to various schema types."""
|
|
2
|
+
|
|
3
|
+
import datetime
|
|
4
|
+
from collections.abc import Callable, Sequence
|
|
5
|
+
from enum import Enum
|
|
6
|
+
from functools import lru_cache, partial
|
|
7
|
+
from pathlib import Path, PurePath
|
|
8
|
+
from typing import Any, Final, TypeGuard, cast, overload
|
|
9
|
+
from uuid import UUID
|
|
10
|
+
|
|
11
|
+
from typing_extensions import TypeVar
|
|
12
|
+
|
|
13
|
+
from sqlspec.exceptions import SQLSpecError
|
|
14
|
+
from sqlspec.typing import (
|
|
15
|
+
CATTRS_INSTALLED,
|
|
16
|
+
NUMPY_INSTALLED,
|
|
17
|
+
SchemaT,
|
|
18
|
+
attrs_asdict,
|
|
19
|
+
cattrs_structure,
|
|
20
|
+
cattrs_unstructure,
|
|
21
|
+
convert,
|
|
22
|
+
get_type_adapter,
|
|
23
|
+
)
|
|
24
|
+
from sqlspec.utils.logging import get_logger
|
|
25
|
+
from sqlspec.utils.text import camelize, kebabize, pascalize
|
|
26
|
+
from sqlspec.utils.type_guards import (
|
|
27
|
+
get_msgspec_rename_config,
|
|
28
|
+
is_attrs_instance,
|
|
29
|
+
is_attrs_schema,
|
|
30
|
+
is_dataclass,
|
|
31
|
+
is_dict,
|
|
32
|
+
is_msgspec_struct,
|
|
33
|
+
is_pydantic_model,
|
|
34
|
+
is_typed_dict,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
__all__ = (
|
|
38
|
+
"_DEFAULT_TYPE_DECODERS",
|
|
39
|
+
"DataT",
|
|
40
|
+
"_convert_numpy_recursive",
|
|
41
|
+
"_convert_numpy_to_list",
|
|
42
|
+
"_default_msgspec_deserializer",
|
|
43
|
+
"_is_list_type_target",
|
|
44
|
+
"to_schema",
|
|
45
|
+
"transform_dict_keys",
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
DataT = TypeVar("DataT", default=dict[str, Any])
|
|
49
|
+
|
|
50
|
+
logger = get_logger(__name__)
|
|
51
|
+
|
|
52
|
+
_DATETIME_TYPES: Final[set[type]] = {datetime.datetime, datetime.date, datetime.time}
|
|
53
|
+
_DATETIME_TYPE_TUPLE: Final[tuple[type, ...]] = (datetime.datetime, datetime.date, datetime.time)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
# =============================================================================
|
|
57
|
+
# Dict Key Transformation
|
|
58
|
+
# =============================================================================
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _safe_convert_key(key: Any, converter: Callable[[str], str]) -> Any:
|
|
62
|
+
"""Safely convert a key using the converter function.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
key: Key to convert (may not be a string).
|
|
66
|
+
converter: Function to convert string keys.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
Converted key if conversion succeeds, original key otherwise.
|
|
70
|
+
"""
|
|
71
|
+
if not isinstance(key, str):
|
|
72
|
+
return key
|
|
73
|
+
|
|
74
|
+
try:
|
|
75
|
+
return converter(key)
|
|
76
|
+
except (TypeError, ValueError, AttributeError):
|
|
77
|
+
return key
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def transform_dict_keys(data: dict | list | Any, converter: Callable[[str], str]) -> dict | list | Any:
|
|
81
|
+
"""Transform dictionary keys using the provided converter function.
|
|
82
|
+
|
|
83
|
+
Recursively transforms all dictionary keys in a data structure using
|
|
84
|
+
the provided converter function. Handles nested dictionaries, lists
|
|
85
|
+
of dictionaries, and preserves non-dict values unchanged.
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
data: The data structure to transform. Can be a dict, list, or any other type.
|
|
89
|
+
converter: Function to convert string keys (e.g., camelize, kebabize).
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
The transformed data structure with converted keys. Non-dict values
|
|
93
|
+
are returned unchanged.
|
|
94
|
+
|
|
95
|
+
Examples:
|
|
96
|
+
Transform snake_case keys to camelCase:
|
|
97
|
+
|
|
98
|
+
>>> from sqlspec.utils.text import camelize
|
|
99
|
+
>>> data = {"user_id": 123, "created_at": "2024-01-01"}
|
|
100
|
+
>>> transform_dict_keys(data, camelize)
|
|
101
|
+
{"userId": 123, "createdAt": "2024-01-01"}
|
|
102
|
+
|
|
103
|
+
Transform nested structures:
|
|
104
|
+
|
|
105
|
+
>>> nested = {
|
|
106
|
+
... "user_data": {"first_name": "John", "last_name": "Doe"},
|
|
107
|
+
... "order_items": [
|
|
108
|
+
... {"item_id": 1, "item_name": "Product A"},
|
|
109
|
+
... {"item_id": 2, "item_name": "Product B"},
|
|
110
|
+
... ],
|
|
111
|
+
... }
|
|
112
|
+
>>> transform_dict_keys(nested, camelize)
|
|
113
|
+
{
|
|
114
|
+
"userData": {
|
|
115
|
+
"firstName": "John",
|
|
116
|
+
"lastName": "Doe"
|
|
117
|
+
},
|
|
118
|
+
"orderItems": [
|
|
119
|
+
{"itemId": 1, "itemName": "Product A"},
|
|
120
|
+
{"itemId": 2, "itemName": "Product B"}
|
|
121
|
+
]
|
|
122
|
+
}
|
|
123
|
+
"""
|
|
124
|
+
if isinstance(data, dict):
|
|
125
|
+
return _transform_dict(data, converter)
|
|
126
|
+
if isinstance(data, list):
|
|
127
|
+
return _transform_list(data, converter)
|
|
128
|
+
return data
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def _transform_dict(data: dict, converter: Callable[[str], str]) -> dict:
|
|
132
|
+
"""Transform a dictionary's keys recursively.
|
|
133
|
+
|
|
134
|
+
Args:
|
|
135
|
+
data: Dictionary to transform.
|
|
136
|
+
converter: Function to convert string keys.
|
|
137
|
+
|
|
138
|
+
Returns:
|
|
139
|
+
Dictionary with transformed keys and recursively transformed values.
|
|
140
|
+
"""
|
|
141
|
+
transformed = {}
|
|
142
|
+
|
|
143
|
+
for key, value in data.items():
|
|
144
|
+
converted_key = _safe_convert_key(key, converter)
|
|
145
|
+
transformed_value = transform_dict_keys(value, converter)
|
|
146
|
+
transformed[converted_key] = transformed_value
|
|
147
|
+
|
|
148
|
+
return transformed
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def _transform_list(data: list, converter: Callable[[str], str]) -> list:
|
|
152
|
+
"""Transform a list's elements recursively.
|
|
153
|
+
|
|
154
|
+
Args:
|
|
155
|
+
data: List to transform.
|
|
156
|
+
converter: Function to convert string keys in nested structures.
|
|
157
|
+
|
|
158
|
+
Returns:
|
|
159
|
+
List with recursively transformed elements.
|
|
160
|
+
"""
|
|
161
|
+
return [transform_dict_keys(item, converter) for item in data]
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
# =============================================================================
|
|
165
|
+
# Schema Type Detection
|
|
166
|
+
# =============================================================================
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def _is_list_type_target(target_type: Any) -> "TypeGuard[list[object]]":
|
|
170
|
+
"""Check if target type is a list type (e.g., list[float])."""
|
|
171
|
+
try:
|
|
172
|
+
origin = target_type.__origin__
|
|
173
|
+
except (AttributeError, TypeError):
|
|
174
|
+
return False
|
|
175
|
+
return origin is list
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def _convert_numpy_to_list(target_type: Any, value: Any) -> Any:
|
|
179
|
+
"""Convert numpy array to list if target is a list type."""
|
|
180
|
+
if not NUMPY_INSTALLED:
|
|
181
|
+
return value
|
|
182
|
+
|
|
183
|
+
import numpy as np
|
|
184
|
+
|
|
185
|
+
if isinstance(value, np.ndarray) and _is_list_type_target(target_type):
|
|
186
|
+
return value.tolist()
|
|
187
|
+
|
|
188
|
+
return value
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
@lru_cache(maxsize=128)
|
|
192
|
+
def _detect_schema_type(schema_type: type) -> "str | None":
|
|
193
|
+
"""Detect schema type with LRU caching.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
schema_type: Type to detect
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
Type identifier string or None if unsupported
|
|
200
|
+
"""
|
|
201
|
+
return (
|
|
202
|
+
"typed_dict"
|
|
203
|
+
if is_typed_dict(schema_type)
|
|
204
|
+
else "dataclass"
|
|
205
|
+
if is_dataclass(schema_type)
|
|
206
|
+
else "msgspec"
|
|
207
|
+
if is_msgspec_struct(schema_type)
|
|
208
|
+
else "pydantic"
|
|
209
|
+
if is_pydantic_model(schema_type)
|
|
210
|
+
else "attrs"
|
|
211
|
+
if is_attrs_schema(schema_type)
|
|
212
|
+
else None
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def _is_foreign_key_metadata_type(schema_type: type) -> bool:
|
|
217
|
+
if schema_type.__name__ != "ForeignKeyMetadata":
|
|
218
|
+
return False
|
|
219
|
+
|
|
220
|
+
# Check module for stronger guarantee without importing
|
|
221
|
+
module = getattr(schema_type, "__module__", "")
|
|
222
|
+
if "sqlspec" in module and ("driver" in module or "data_dictionary" in module):
|
|
223
|
+
return True
|
|
224
|
+
|
|
225
|
+
slots = getattr(schema_type, "__slots__", None)
|
|
226
|
+
if not slots:
|
|
227
|
+
return False
|
|
228
|
+
return {"table_name", "column_name", "referenced_table", "referenced_column"}.issubset(set(slots))
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def _convert_foreign_key_metadata(data: Any, schema_type: Any) -> Any:
|
|
232
|
+
if not is_dict(data):
|
|
233
|
+
return data
|
|
234
|
+
payload = {
|
|
235
|
+
"table_name": data.get("table_name") or data.get("table"),
|
|
236
|
+
"column_name": data.get("column_name") or data.get("column"),
|
|
237
|
+
"referenced_table": data.get("referenced_table") or data.get("referenced_table_name"),
|
|
238
|
+
"referenced_column": data.get("referenced_column") or data.get("referenced_column_name"),
|
|
239
|
+
"constraint_name": data.get("constraint_name"),
|
|
240
|
+
"schema": data.get("schema") or data.get("table_schema"),
|
|
241
|
+
"referenced_schema": data.get("referenced_schema") or data.get("referenced_table_schema"),
|
|
242
|
+
}
|
|
243
|
+
return schema_type(**payload)
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def _convert_typed_dict(data: Any, schema_type: Any) -> Any:
|
|
247
|
+
"""Convert data to TypedDict."""
|
|
248
|
+
return [item for item in data if is_dict(item)] if isinstance(data, list) else data
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
def _convert_dataclass(data: Any, schema_type: Any) -> Any:
|
|
252
|
+
"""Convert data to dataclass."""
|
|
253
|
+
if isinstance(data, list):
|
|
254
|
+
return [schema_type(**dict(item)) if is_dict(item) else item for item in data]
|
|
255
|
+
return schema_type(**dict(data)) if is_dict(data) else (schema_type(**data) if isinstance(data, dict) else data)
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
class _IsTypePredicate:
|
|
259
|
+
"""Callable predicate to check if a type matches a target type."""
|
|
260
|
+
|
|
261
|
+
__slots__ = ("_type",)
|
|
262
|
+
|
|
263
|
+
def __init__(self, target_type: type) -> None:
|
|
264
|
+
self._type = target_type
|
|
265
|
+
|
|
266
|
+
def __call__(self, x: Any) -> bool:
|
|
267
|
+
return x is self._type
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
class _UUIDDecoder:
|
|
271
|
+
"""Decoder for UUID types."""
|
|
272
|
+
|
|
273
|
+
__slots__ = ()
|
|
274
|
+
|
|
275
|
+
def __call__(self, t: type, v: Any) -> Any:
|
|
276
|
+
return t(v.hex)
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
class _ISOFormatDecoder:
|
|
280
|
+
"""Decoder for types with isoformat() method (datetime, date, time)."""
|
|
281
|
+
|
|
282
|
+
__slots__ = ()
|
|
283
|
+
|
|
284
|
+
def __call__(self, t: type, v: Any) -> Any:
|
|
285
|
+
return t(v.isoformat())
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
class _EnumDecoder:
|
|
289
|
+
"""Decoder for Enum types."""
|
|
290
|
+
|
|
291
|
+
__slots__ = ()
|
|
292
|
+
|
|
293
|
+
def __call__(self, t: type, v: Any) -> Any:
|
|
294
|
+
return t(v.value)
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
_DEFAULT_TYPE_DECODERS: Final[list[tuple[Callable[[Any], bool], Callable[[Any, Any], Any]]]] = [
|
|
298
|
+
(_IsTypePredicate(UUID), _UUIDDecoder()),
|
|
299
|
+
(_IsTypePredicate(datetime.datetime), _ISOFormatDecoder()),
|
|
300
|
+
(_IsTypePredicate(datetime.date), _ISOFormatDecoder()),
|
|
301
|
+
(_IsTypePredicate(datetime.time), _ISOFormatDecoder()),
|
|
302
|
+
(_IsTypePredicate(Enum), _EnumDecoder()),
|
|
303
|
+
(_is_list_type_target, _convert_numpy_to_list),
|
|
304
|
+
]
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
def _default_msgspec_deserializer(
|
|
308
|
+
target_type: Any, value: Any, type_decoders: "Sequence[tuple[Any, Any]] | None" = None
|
|
309
|
+
) -> Any:
|
|
310
|
+
"""Convert msgspec types with type decoder support.
|
|
311
|
+
|
|
312
|
+
Args:
|
|
313
|
+
target_type: Type to convert to
|
|
314
|
+
value: Value to convert
|
|
315
|
+
type_decoders: Optional sequence of (predicate, decoder) pairs
|
|
316
|
+
|
|
317
|
+
Returns:
|
|
318
|
+
Converted value or original value if conversion not applicable
|
|
319
|
+
"""
|
|
320
|
+
if NUMPY_INSTALLED:
|
|
321
|
+
import numpy as np
|
|
322
|
+
|
|
323
|
+
if isinstance(value, np.ndarray) and _is_list_type_target(target_type):
|
|
324
|
+
return value.tolist()
|
|
325
|
+
|
|
326
|
+
if type_decoders:
|
|
327
|
+
for predicate, decoder in type_decoders:
|
|
328
|
+
if predicate(target_type):
|
|
329
|
+
return decoder(target_type, value)
|
|
330
|
+
|
|
331
|
+
if target_type is UUID and isinstance(value, UUID):
|
|
332
|
+
return value.hex
|
|
333
|
+
|
|
334
|
+
if target_type in _DATETIME_TYPES and isinstance(value, _DATETIME_TYPE_TUPLE):
|
|
335
|
+
datetime_value = cast("datetime.datetime | datetime.date | datetime.time", value)
|
|
336
|
+
return datetime_value.isoformat()
|
|
337
|
+
|
|
338
|
+
if isinstance(target_type, type) and issubclass(target_type, Enum) and isinstance(value, Enum):
|
|
339
|
+
return value.value
|
|
340
|
+
|
|
341
|
+
try:
|
|
342
|
+
if isinstance(target_type, type) and isinstance(value, target_type):
|
|
343
|
+
return value
|
|
344
|
+
except TypeError:
|
|
345
|
+
pass
|
|
346
|
+
|
|
347
|
+
if isinstance(target_type, type):
|
|
348
|
+
try:
|
|
349
|
+
if issubclass(target_type, (Path, PurePath)) or issubclass(target_type, UUID):
|
|
350
|
+
return target_type(str(value))
|
|
351
|
+
except (TypeError, ValueError):
|
|
352
|
+
pass
|
|
353
|
+
|
|
354
|
+
return value
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
def _convert_numpy_recursive(obj: Any) -> Any:
|
|
358
|
+
"""Recursively convert numpy arrays to lists.
|
|
359
|
+
|
|
360
|
+
This is a module-level function to avoid nested function definitions
|
|
361
|
+
which are problematic for mypyc compilation.
|
|
362
|
+
|
|
363
|
+
Args:
|
|
364
|
+
obj: Object to convert (may contain numpy arrays nested in dicts/lists)
|
|
365
|
+
|
|
366
|
+
Returns:
|
|
367
|
+
Object with all numpy arrays converted to lists
|
|
368
|
+
"""
|
|
369
|
+
if not NUMPY_INSTALLED:
|
|
370
|
+
return obj
|
|
371
|
+
|
|
372
|
+
import numpy as np
|
|
373
|
+
|
|
374
|
+
if isinstance(obj, np.ndarray):
|
|
375
|
+
return obj.tolist()
|
|
376
|
+
if isinstance(obj, dict):
|
|
377
|
+
return {k: _convert_numpy_recursive(v) for k, v in obj.items()}
|
|
378
|
+
if isinstance(obj, (list, tuple)):
|
|
379
|
+
converted = [_convert_numpy_recursive(item) for item in obj]
|
|
380
|
+
return type(obj)(converted)
|
|
381
|
+
return obj
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
def _convert_msgspec(data: Any, schema_type: Any) -> Any:
|
|
385
|
+
"""Convert data to msgspec Struct."""
|
|
386
|
+
rename_config = get_msgspec_rename_config(schema_type)
|
|
387
|
+
deserializer = partial(_default_msgspec_deserializer, type_decoders=_DEFAULT_TYPE_DECODERS)
|
|
388
|
+
|
|
389
|
+
transformed_data = data
|
|
390
|
+
if (rename_config and is_dict(data)) or (isinstance(data, Sequence) and data and is_dict(data[0])):
|
|
391
|
+
try:
|
|
392
|
+
converter_map: dict[str, Callable[[str], str]] = {"camel": camelize, "kebab": kebabize, "pascal": pascalize}
|
|
393
|
+
converter = converter_map.get(rename_config) if rename_config else None
|
|
394
|
+
if converter:
|
|
395
|
+
transformed_data = (
|
|
396
|
+
[transform_dict_keys(item, converter) if is_dict(item) else item for item in data]
|
|
397
|
+
if isinstance(data, Sequence)
|
|
398
|
+
else (transform_dict_keys(data, converter) if is_dict(data) else data)
|
|
399
|
+
)
|
|
400
|
+
except Exception as e:
|
|
401
|
+
logger.debug("Field name transformation failed for msgspec schema: %s", e)
|
|
402
|
+
|
|
403
|
+
if NUMPY_INSTALLED:
|
|
404
|
+
transformed_data = _convert_numpy_recursive(transformed_data)
|
|
405
|
+
|
|
406
|
+
return convert(
|
|
407
|
+
obj=transformed_data,
|
|
408
|
+
type=(list[schema_type] if isinstance(transformed_data, Sequence) else schema_type),
|
|
409
|
+
from_attributes=True,
|
|
410
|
+
dec_hook=deserializer,
|
|
411
|
+
)
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
def _convert_pydantic(data: Any, schema_type: Any) -> Any:
|
|
415
|
+
"""Convert data to Pydantic model."""
|
|
416
|
+
if isinstance(data, Sequence):
|
|
417
|
+
return get_type_adapter(list[schema_type]).validate_python(data, from_attributes=True)
|
|
418
|
+
return get_type_adapter(schema_type).validate_python(data, from_attributes=True)
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
def _convert_attrs(data: Any, schema_type: Any) -> Any:
|
|
422
|
+
"""Convert data to attrs class."""
|
|
423
|
+
if CATTRS_INSTALLED:
|
|
424
|
+
if isinstance(data, Sequence):
|
|
425
|
+
return cattrs_structure(data, list[schema_type])
|
|
426
|
+
structured = cattrs_unstructure(data) if is_attrs_instance(data) else data
|
|
427
|
+
return cattrs_structure(structured, schema_type)
|
|
428
|
+
|
|
429
|
+
if isinstance(data, list):
|
|
430
|
+
return [schema_type(**dict(item)) if is_dict(item) else schema_type(**attrs_asdict(item)) for item in data]
|
|
431
|
+
return schema_type(**dict(data)) if is_dict(data) else data
|
|
432
|
+
|
|
433
|
+
|
|
434
|
+
_SCHEMA_CONVERTERS: "dict[str, Callable[[Any, Any], Any]]" = {
|
|
435
|
+
"typed_dict": _convert_typed_dict,
|
|
436
|
+
"dataclass": _convert_dataclass,
|
|
437
|
+
"msgspec": _convert_msgspec,
|
|
438
|
+
"pydantic": _convert_pydantic,
|
|
439
|
+
"attrs": _convert_attrs,
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
@overload
|
|
444
|
+
def to_schema(data: "list[DataT]", *, schema_type: "type[SchemaT]") -> "list[SchemaT]": ...
|
|
445
|
+
@overload
|
|
446
|
+
def to_schema(data: "list[DataT]", *, schema_type: None = None) -> "list[DataT]": ...
|
|
447
|
+
@overload
|
|
448
|
+
def to_schema(data: "DataT", *, schema_type: "type[SchemaT]") -> "SchemaT": ...
|
|
449
|
+
@overload
|
|
450
|
+
def to_schema(data: "DataT", *, schema_type: None = None) -> "DataT": ...
|
|
451
|
+
|
|
452
|
+
|
|
453
|
+
def to_schema(data: Any, *, schema_type: Any = None) -> Any:
|
|
454
|
+
"""Convert data to a specified schema type.
|
|
455
|
+
|
|
456
|
+
Supports transformation to various schema types including:
|
|
457
|
+
- TypedDict
|
|
458
|
+
- dataclasses
|
|
459
|
+
- msgspec Structs
|
|
460
|
+
- Pydantic models
|
|
461
|
+
- attrs classes
|
|
462
|
+
|
|
463
|
+
Args:
|
|
464
|
+
data: Input data to convert (dict, list of dicts, or other)
|
|
465
|
+
schema_type: Target schema type for conversion. If None, returns data unchanged.
|
|
466
|
+
|
|
467
|
+
Returns:
|
|
468
|
+
Converted data in the specified schema type, or original data if schema_type is None
|
|
469
|
+
|
|
470
|
+
Raises:
|
|
471
|
+
SQLSpecError: If schema_type is not a supported type
|
|
472
|
+
"""
|
|
473
|
+
if schema_type is None:
|
|
474
|
+
return data
|
|
475
|
+
|
|
476
|
+
schema_type_key = _detect_schema_type(schema_type)
|
|
477
|
+
if schema_type_key is None:
|
|
478
|
+
if _is_foreign_key_metadata_type(schema_type):
|
|
479
|
+
if isinstance(data, list):
|
|
480
|
+
return [_convert_foreign_key_metadata(item, schema_type) for item in data]
|
|
481
|
+
return _convert_foreign_key_metadata(data, schema_type)
|
|
482
|
+
msg = "`schema_type` should be a valid Dataclass, Pydantic model, Msgspec struct, Attrs class, or TypedDict"
|
|
483
|
+
raise SQLSpecError(msg)
|
|
484
|
+
|
|
485
|
+
return _SCHEMA_CONVERTERS[schema_type_key](data, schema_type)
|
|
Binary file
|