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
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
"""Serialization utilities for SQLSpec.
|
|
2
|
+
|
|
3
|
+
Provides JSON helpers, serializer pipelines, optional dependency hooks,
|
|
4
|
+
and cache instrumentation aligned with the core pipeline counters.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
from functools import partial
|
|
9
|
+
from threading import RLock
|
|
10
|
+
from typing import TYPE_CHECKING, Any, Final, Literal, cast, overload
|
|
11
|
+
|
|
12
|
+
from sqlspec._serialization import decode_json, encode_json
|
|
13
|
+
from sqlspec.typing import NUMPY_INSTALLED, UNSET, ArrowReturnFormat, attrs_asdict
|
|
14
|
+
from sqlspec.utils.arrow_helpers import convert_dict_to_arrow
|
|
15
|
+
from sqlspec.utils.type_guards import (
|
|
16
|
+
dataclass_to_dict,
|
|
17
|
+
has_dict_attribute,
|
|
18
|
+
is_attrs_instance,
|
|
19
|
+
is_dataclass_instance,
|
|
20
|
+
is_dict,
|
|
21
|
+
is_msgspec_struct,
|
|
22
|
+
is_pydantic_model,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from collections.abc import Callable, Iterable
|
|
27
|
+
|
|
28
|
+
__all__ = (
|
|
29
|
+
"SchemaSerializer",
|
|
30
|
+
"from_json",
|
|
31
|
+
"get_collection_serializer",
|
|
32
|
+
"get_serializer_metrics",
|
|
33
|
+
"numpy_array_dec_hook",
|
|
34
|
+
"numpy_array_enc_hook",
|
|
35
|
+
"numpy_array_predicate",
|
|
36
|
+
"reset_serializer_cache",
|
|
37
|
+
"schema_dump",
|
|
38
|
+
"serialize_collection",
|
|
39
|
+
"to_json",
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
DEBUG_ENV_FLAG: Final[str] = "SQLSPEC_DEBUG_PIPELINE_CACHE"
|
|
43
|
+
_PRIMITIVE_TYPES: Final[tuple[type[Any], ...]] = (str, bytes, int, float, bool)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _is_truthy(value: "str | None") -> bool:
|
|
47
|
+
if value is None:
|
|
48
|
+
return False
|
|
49
|
+
normalized = value.strip().lower()
|
|
50
|
+
return normalized in {"1", "true", "yes", "on"}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _metrics_enabled() -> bool:
|
|
54
|
+
return _is_truthy(os.getenv(DEBUG_ENV_FLAG))
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class _SerializerCacheMetrics:
|
|
58
|
+
__slots__ = ("hits", "max_size", "misses", "size")
|
|
59
|
+
|
|
60
|
+
def __init__(self) -> None:
|
|
61
|
+
self.hits = 0
|
|
62
|
+
self.misses = 0
|
|
63
|
+
self.size = 0
|
|
64
|
+
self.max_size = 0
|
|
65
|
+
|
|
66
|
+
def record_hit(self, cache_size: int) -> None:
|
|
67
|
+
if not _metrics_enabled():
|
|
68
|
+
return
|
|
69
|
+
self.hits += 1
|
|
70
|
+
self.size = cache_size
|
|
71
|
+
self.max_size = max(self.max_size, cache_size)
|
|
72
|
+
|
|
73
|
+
def record_miss(self, cache_size: int) -> None:
|
|
74
|
+
if not _metrics_enabled():
|
|
75
|
+
return
|
|
76
|
+
self.misses += 1
|
|
77
|
+
self.size = cache_size
|
|
78
|
+
self.max_size = max(self.max_size, cache_size)
|
|
79
|
+
|
|
80
|
+
def reset(self) -> None:
|
|
81
|
+
self.hits = 0
|
|
82
|
+
self.misses = 0
|
|
83
|
+
self.size = 0
|
|
84
|
+
self.max_size = 0
|
|
85
|
+
|
|
86
|
+
def snapshot(self) -> "dict[str, int]":
|
|
87
|
+
return {
|
|
88
|
+
"hits": self.hits if _metrics_enabled() else 0,
|
|
89
|
+
"misses": self.misses if _metrics_enabled() else 0,
|
|
90
|
+
"max_size": self.max_size if _metrics_enabled() else 0,
|
|
91
|
+
"size": self.size if _metrics_enabled() else 0,
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@overload
|
|
96
|
+
def to_json(data: Any, *, as_bytes: Literal[False] = ...) -> str: ...
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
@overload
|
|
100
|
+
def to_json(data: Any, *, as_bytes: Literal[True]) -> bytes: ...
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def to_json(data: Any, *, as_bytes: bool = False) -> str | bytes:
|
|
104
|
+
"""Encode data to JSON string or bytes.
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
data: Data to encode.
|
|
108
|
+
as_bytes: Whether to return bytes instead of string for optimal performance.
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
JSON string or bytes representation based on as_bytes parameter.
|
|
112
|
+
"""
|
|
113
|
+
if as_bytes:
|
|
114
|
+
return encode_json(data, as_bytes=True)
|
|
115
|
+
return encode_json(data, as_bytes=False)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@overload
|
|
119
|
+
def from_json(data: str) -> Any: ...
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
@overload
|
|
123
|
+
def from_json(data: bytes, *, decode_bytes: bool = ...) -> Any: ...
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def from_json(data: str | bytes, *, decode_bytes: bool = True) -> Any:
|
|
127
|
+
"""Decode JSON string or bytes to Python object.
|
|
128
|
+
|
|
129
|
+
Args:
|
|
130
|
+
data: JSON string or bytes to decode.
|
|
131
|
+
decode_bytes: Whether to decode bytes input (vs passing through).
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
Decoded Python object.
|
|
135
|
+
"""
|
|
136
|
+
if isinstance(data, bytes):
|
|
137
|
+
return decode_json(data, decode_bytes=decode_bytes)
|
|
138
|
+
return decode_json(data)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def numpy_array_enc_hook(value: Any) -> Any:
|
|
142
|
+
"""Encode NumPy array to JSON-compatible list.
|
|
143
|
+
|
|
144
|
+
Converts NumPy ndarrays to Python lists for JSON serialization.
|
|
145
|
+
Gracefully handles cases where NumPy is not installed by returning
|
|
146
|
+
the original value unchanged.
|
|
147
|
+
|
|
148
|
+
Args:
|
|
149
|
+
value: Value to encode (checked for ndarray type).
|
|
150
|
+
|
|
151
|
+
Returns:
|
|
152
|
+
List representation if value is ndarray, original value otherwise.
|
|
153
|
+
|
|
154
|
+
Example:
|
|
155
|
+
>>> import numpy as np
|
|
156
|
+
>>> arr = np.array([1.0, 2.0, 3.0])
|
|
157
|
+
>>> numpy_array_enc_hook(arr)
|
|
158
|
+
[1.0, 2.0, 3.0]
|
|
159
|
+
|
|
160
|
+
>>> # Multi-dimensional arrays work automatically
|
|
161
|
+
>>> arr_2d = np.array([[1, 2], [3, 4]])
|
|
162
|
+
>>> numpy_array_enc_hook(arr_2d)
|
|
163
|
+
[[1, 2], [3, 4]]
|
|
164
|
+
"""
|
|
165
|
+
if not NUMPY_INSTALLED:
|
|
166
|
+
return value
|
|
167
|
+
|
|
168
|
+
import numpy as np
|
|
169
|
+
|
|
170
|
+
if isinstance(value, np.ndarray):
|
|
171
|
+
return value.tolist()
|
|
172
|
+
return value
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def numpy_array_dec_hook(value: Any) -> Any:
|
|
176
|
+
"""Decode list to NumPy array.
|
|
177
|
+
|
|
178
|
+
Converts Python lists to NumPy arrays when appropriate.
|
|
179
|
+
Works best with typed schemas (Pydantic, msgspec) that expect ndarray.
|
|
180
|
+
|
|
181
|
+
Args:
|
|
182
|
+
value: List to potentially convert to ndarray.
|
|
183
|
+
|
|
184
|
+
Returns:
|
|
185
|
+
NumPy array if conversion successful, original value otherwise.
|
|
186
|
+
|
|
187
|
+
Note:
|
|
188
|
+
Dtype is inferred by NumPy and may differ from original array.
|
|
189
|
+
For explicit dtype control, construct arrays manually in application code.
|
|
190
|
+
|
|
191
|
+
Example:
|
|
192
|
+
>>> numpy_array_dec_hook([1.0, 2.0, 3.0])
|
|
193
|
+
array([1., 2., 3.])
|
|
194
|
+
|
|
195
|
+
>>> # Returns original value if NumPy not installed
|
|
196
|
+
>>> # (when NUMPY_INSTALLED is False)
|
|
197
|
+
>>> numpy_array_dec_hook([1, 2, 3])
|
|
198
|
+
[1, 2, 3]
|
|
199
|
+
"""
|
|
200
|
+
if not NUMPY_INSTALLED:
|
|
201
|
+
return value
|
|
202
|
+
|
|
203
|
+
import numpy as np
|
|
204
|
+
|
|
205
|
+
if isinstance(value, list):
|
|
206
|
+
try:
|
|
207
|
+
return np.array(value)
|
|
208
|
+
except Exception:
|
|
209
|
+
return value
|
|
210
|
+
return value
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def numpy_array_predicate(value: Any) -> bool:
|
|
214
|
+
"""Check if value is NumPy array instance.
|
|
215
|
+
|
|
216
|
+
Type checker for decoder registration in framework plugins.
|
|
217
|
+
Returns False when NumPy is not installed.
|
|
218
|
+
|
|
219
|
+
Args:
|
|
220
|
+
value: Value to type-check.
|
|
221
|
+
|
|
222
|
+
Returns:
|
|
223
|
+
True if value is ndarray, False otherwise.
|
|
224
|
+
|
|
225
|
+
Example:
|
|
226
|
+
>>> import numpy as np
|
|
227
|
+
>>> numpy_array_predicate(np.array([1, 2, 3]))
|
|
228
|
+
True
|
|
229
|
+
|
|
230
|
+
>>> numpy_array_predicate([1, 2, 3])
|
|
231
|
+
False
|
|
232
|
+
|
|
233
|
+
>>> # Returns False when NumPy not installed
|
|
234
|
+
>>> # (when NUMPY_INSTALLED is False)
|
|
235
|
+
>>> numpy_array_predicate([1, 2, 3])
|
|
236
|
+
False
|
|
237
|
+
"""
|
|
238
|
+
if not NUMPY_INSTALLED:
|
|
239
|
+
return False
|
|
240
|
+
|
|
241
|
+
import numpy as np
|
|
242
|
+
|
|
243
|
+
return isinstance(value, np.ndarray)
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
class SchemaSerializer:
|
|
247
|
+
"""Serializer pipeline that caches conversions for repeated schema dumps."""
|
|
248
|
+
|
|
249
|
+
__slots__ = ("_dump", "_key")
|
|
250
|
+
|
|
251
|
+
def __init__(self, key: "tuple[type[Any] | None, bool]", dump: "Callable[[Any], dict[str, Any]]") -> None:
|
|
252
|
+
self._key = key
|
|
253
|
+
self._dump = dump
|
|
254
|
+
|
|
255
|
+
@property
|
|
256
|
+
def key(self) -> "tuple[type[Any] | None, bool]":
|
|
257
|
+
return self._key
|
|
258
|
+
|
|
259
|
+
def dump_one(self, item: Any) -> "dict[str, Any]":
|
|
260
|
+
return self._dump(item)
|
|
261
|
+
|
|
262
|
+
def dump_many(self, items: "Iterable[Any]") -> "list[dict[str, Any]]":
|
|
263
|
+
return [self._dump(item) for item in items]
|
|
264
|
+
|
|
265
|
+
def to_arrow(
|
|
266
|
+
self, items: "Iterable[Any]", *, return_format: "ArrowReturnFormat" = "table", batch_size: int | None = None
|
|
267
|
+
) -> Any:
|
|
268
|
+
payload = self.dump_many(items)
|
|
269
|
+
return convert_dict_to_arrow(payload, return_format=return_format, batch_size=batch_size)
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
_SERIALIZER_LOCK: RLock = RLock()
|
|
273
|
+
_SCHEMA_SERIALIZERS: dict[tuple[type[Any] | None, bool], SchemaSerializer] = {}
|
|
274
|
+
_SERIALIZER_METRICS = _SerializerCacheMetrics()
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
def _make_serializer_key(sample: Any, exclude_unset: bool) -> "tuple[type[Any] | None, bool]":
|
|
278
|
+
if sample is None or isinstance(sample, dict):
|
|
279
|
+
return (None, exclude_unset)
|
|
280
|
+
return (type(sample), exclude_unset)
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
def _dump_identity_dict(value: Any) -> "dict[str, Any]":
|
|
284
|
+
return cast("dict[str, Any]", value)
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
def _dump_msgspec_fields(value: Any) -> "dict[str, Any]":
|
|
288
|
+
return {f: value.__getattribute__(f) for f in value.__struct_fields__}
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
def _dump_msgspec_excluding_unset(value: Any) -> "dict[str, Any]":
|
|
292
|
+
return {f: field_value for f in value.__struct_fields__ if (field_value := value.__getattribute__(f)) != UNSET}
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
def _dump_dataclass(value: Any, *, exclude_unset: bool) -> "dict[str, Any]":
|
|
296
|
+
return dataclass_to_dict(value, exclude_empty=exclude_unset)
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
def _dump_pydantic(value: Any, *, exclude_unset: bool) -> "dict[str, Any]":
|
|
300
|
+
return cast("dict[str, Any]", value.model_dump(exclude_unset=exclude_unset))
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
def _dump_attrs(value: Any) -> "dict[str, Any]":
|
|
304
|
+
return attrs_asdict(value, recurse=True)
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
def _dump_dict_attr(value: Any) -> "dict[str, Any]":
|
|
308
|
+
return dict(value.__dict__)
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
def _dump_mapping(value: Any) -> "dict[str, Any]":
|
|
312
|
+
return dict(value)
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
def _build_dump_function(sample: Any, exclude_unset: bool) -> "Callable[[Any], dict[str, Any]]":
|
|
316
|
+
if sample is None or isinstance(sample, dict):
|
|
317
|
+
return _dump_identity_dict
|
|
318
|
+
|
|
319
|
+
if is_dataclass_instance(sample):
|
|
320
|
+
return cast("Callable[[Any], dict[str, Any]]", partial(_dump_dataclass, exclude_unset=exclude_unset))
|
|
321
|
+
if is_pydantic_model(sample):
|
|
322
|
+
return cast("Callable[[Any], dict[str, Any]]", partial(_dump_pydantic, exclude_unset=exclude_unset))
|
|
323
|
+
if is_msgspec_struct(sample):
|
|
324
|
+
if exclude_unset:
|
|
325
|
+
return _dump_msgspec_excluding_unset
|
|
326
|
+
return _dump_msgspec_fields
|
|
327
|
+
|
|
328
|
+
if is_attrs_instance(sample):
|
|
329
|
+
return _dump_attrs
|
|
330
|
+
|
|
331
|
+
if has_dict_attribute(sample):
|
|
332
|
+
return _dump_dict_attr
|
|
333
|
+
|
|
334
|
+
return _dump_mapping
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
def get_collection_serializer(sample: Any, *, exclude_unset: bool = True) -> "SchemaSerializer":
|
|
338
|
+
"""Return cached serializer pipeline for the provided sample object."""
|
|
339
|
+
|
|
340
|
+
key = _make_serializer_key(sample, exclude_unset)
|
|
341
|
+
with _SERIALIZER_LOCK:
|
|
342
|
+
pipeline = _SCHEMA_SERIALIZERS.get(key)
|
|
343
|
+
if pipeline is not None:
|
|
344
|
+
_SERIALIZER_METRICS.record_hit(len(_SCHEMA_SERIALIZERS))
|
|
345
|
+
return pipeline
|
|
346
|
+
|
|
347
|
+
dump = _build_dump_function(sample, exclude_unset)
|
|
348
|
+
pipeline = SchemaSerializer(key, dump)
|
|
349
|
+
_SCHEMA_SERIALIZERS[key] = pipeline
|
|
350
|
+
_SERIALIZER_METRICS.record_miss(len(_SCHEMA_SERIALIZERS))
|
|
351
|
+
return pipeline
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
def serialize_collection(items: "Iterable[Any]", *, exclude_unset: bool = True) -> "list[Any]":
|
|
355
|
+
"""Serialize a collection using cached pipelines keyed by item type."""
|
|
356
|
+
|
|
357
|
+
serialized: list[Any] = []
|
|
358
|
+
cache: dict[tuple[type[Any] | None, bool], SchemaSerializer] = {}
|
|
359
|
+
|
|
360
|
+
for item in items:
|
|
361
|
+
if isinstance(item, _PRIMITIVE_TYPES) or item is None or isinstance(item, dict):
|
|
362
|
+
serialized.append(item)
|
|
363
|
+
continue
|
|
364
|
+
|
|
365
|
+
key = _make_serializer_key(item, exclude_unset)
|
|
366
|
+
pipeline = cache.get(key)
|
|
367
|
+
if pipeline is None:
|
|
368
|
+
pipeline = get_collection_serializer(item, exclude_unset=exclude_unset)
|
|
369
|
+
cache[key] = pipeline
|
|
370
|
+
serialized.append(pipeline.dump_one(item))
|
|
371
|
+
return serialized
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
def reset_serializer_cache() -> None:
|
|
375
|
+
"""Clear cached serializer pipelines."""
|
|
376
|
+
|
|
377
|
+
with _SERIALIZER_LOCK:
|
|
378
|
+
_SCHEMA_SERIALIZERS.clear()
|
|
379
|
+
_SERIALIZER_METRICS.reset()
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
def get_serializer_metrics() -> "dict[str, int]":
|
|
383
|
+
"""Return cache metrics aligned with the core pipeline counters."""
|
|
384
|
+
|
|
385
|
+
with _SERIALIZER_LOCK:
|
|
386
|
+
metrics = _SERIALIZER_METRICS.snapshot()
|
|
387
|
+
metrics["size"] = len(_SCHEMA_SERIALIZERS)
|
|
388
|
+
return metrics
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
def schema_dump(data: Any, *, exclude_unset: bool = True) -> Any:
|
|
392
|
+
"""Dump a schema model or dict to a plain representation.
|
|
393
|
+
|
|
394
|
+
Args:
|
|
395
|
+
data: Schema model instance or dictionary to dump.
|
|
396
|
+
exclude_unset: Whether to exclude unset fields (for models that support it).
|
|
397
|
+
|
|
398
|
+
Returns:
|
|
399
|
+
A plain representation of the schema model or value.
|
|
400
|
+
"""
|
|
401
|
+
if is_dict(data):
|
|
402
|
+
return data
|
|
403
|
+
|
|
404
|
+
if isinstance(data, _PRIMITIVE_TYPES) or data is None:
|
|
405
|
+
return data
|
|
406
|
+
|
|
407
|
+
serializer = get_collection_serializer(data, exclude_unset=exclude_unset)
|
|
408
|
+
return serializer.dump_one(data)
|
|
Binary file
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"""Singleton pattern implementation for SQLSpec.
|
|
2
|
+
|
|
3
|
+
Provides a thread-safe metaclass for implementing the singleton pattern.
|
|
4
|
+
Used for creating classes that should have only one instance per class type.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import threading
|
|
8
|
+
from typing import Any, TypeVar
|
|
9
|
+
|
|
10
|
+
from mypy_extensions import mypyc_attr
|
|
11
|
+
|
|
12
|
+
__all__ = ("SingletonMeta",)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
_T = TypeVar("_T")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@mypyc_attr(native_class=False)
|
|
19
|
+
class SingletonMeta(type):
|
|
20
|
+
"""Metaclass for singleton pattern."""
|
|
21
|
+
|
|
22
|
+
_instances: "dict[type, object]" = {}
|
|
23
|
+
_lock = threading.Lock()
|
|
24
|
+
|
|
25
|
+
def __call__(cls: type[_T], *args: Any, **kwargs: Any) -> _T:
|
|
26
|
+
"""Call method for the singleton metaclass.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
cls: The class being instantiated.
|
|
30
|
+
*args: Positional arguments for the class constructor.
|
|
31
|
+
**kwargs: Keyword arguments for the class constructor.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
The singleton instance of the class.
|
|
35
|
+
"""
|
|
36
|
+
if cls not in SingletonMeta._instances: # pyright: ignore[reportUnnecessaryContains]
|
|
37
|
+
with SingletonMeta._lock:
|
|
38
|
+
if cls not in SingletonMeta._instances:
|
|
39
|
+
instance = super().__call__(*args, **kwargs) # type: ignore[misc]
|
|
40
|
+
SingletonMeta._instances[cls] = instance
|
|
41
|
+
return SingletonMeta._instances[cls] # type: ignore[return-value]
|
|
Binary file
|