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,348 @@
|
|
|
1
|
+
"""Configuration objects for the observability suite."""
|
|
2
|
+
|
|
3
|
+
from collections.abc import Callable, Iterable
|
|
4
|
+
from typing import TYPE_CHECKING, Any, cast
|
|
5
|
+
|
|
6
|
+
if TYPE_CHECKING: # pragma: no cover - import cycle guard
|
|
7
|
+
from sqlspec.config import LifecycleConfig
|
|
8
|
+
from sqlspec.observability._formatters._base import CloudLogFormatter
|
|
9
|
+
from sqlspec.observability._observer import StatementEvent
|
|
10
|
+
from sqlspec.observability._sampling import SamplingConfig
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
StatementObserver = Callable[["StatementEvent"], None]
|
|
14
|
+
LifecycleHook = Callable[[dict[str, Any]], None]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class RedactionConfig:
|
|
18
|
+
"""Controls SQL and parameter redaction before observers run."""
|
|
19
|
+
|
|
20
|
+
__slots__ = ("mask_literals", "mask_parameters", "parameter_allow_list")
|
|
21
|
+
|
|
22
|
+
def __init__(
|
|
23
|
+
self,
|
|
24
|
+
*,
|
|
25
|
+
mask_parameters: bool | None = None,
|
|
26
|
+
mask_literals: bool | None = None,
|
|
27
|
+
parameter_allow_list: tuple[str, ...] | Iterable[str] | None = None,
|
|
28
|
+
) -> None:
|
|
29
|
+
self.mask_parameters = mask_parameters
|
|
30
|
+
self.mask_literals = mask_literals
|
|
31
|
+
self.parameter_allow_list = tuple(parameter_allow_list) if parameter_allow_list is not None else None
|
|
32
|
+
|
|
33
|
+
def __hash__(self) -> int: # pragma: no cover - explicit to mirror dataclass behavior
|
|
34
|
+
msg = "RedactionConfig objects are mutable and unhashable"
|
|
35
|
+
raise TypeError(msg)
|
|
36
|
+
|
|
37
|
+
def copy(self) -> "RedactionConfig":
|
|
38
|
+
"""Return a copy to avoid sharing mutable state."""
|
|
39
|
+
|
|
40
|
+
allow_list = tuple(self.parameter_allow_list) if self.parameter_allow_list else None
|
|
41
|
+
return RedactionConfig(
|
|
42
|
+
mask_parameters=self.mask_parameters, mask_literals=self.mask_literals, parameter_allow_list=allow_list
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
def __repr__(self) -> str:
|
|
46
|
+
return f"RedactionConfig(mask_parameters={self.mask_parameters!r}, mask_literals={self.mask_literals!r}, parameter_allow_list={self.parameter_allow_list!r})"
|
|
47
|
+
|
|
48
|
+
def __eq__(self, other: object) -> bool:
|
|
49
|
+
if not isinstance(other, RedactionConfig):
|
|
50
|
+
return NotImplemented
|
|
51
|
+
return (
|
|
52
|
+
self.mask_parameters == other.mask_parameters
|
|
53
|
+
and self.mask_literals == other.mask_literals
|
|
54
|
+
and self.parameter_allow_list == other.parameter_allow_list
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class TelemetryConfig:
|
|
59
|
+
"""Span emission and tracer provider settings."""
|
|
60
|
+
|
|
61
|
+
__slots__ = ("enable_spans", "provider_factory", "resource_attributes")
|
|
62
|
+
|
|
63
|
+
def __init__(
|
|
64
|
+
self,
|
|
65
|
+
*,
|
|
66
|
+
enable_spans: bool = False,
|
|
67
|
+
provider_factory: Callable[[], Any] | None = None,
|
|
68
|
+
resource_attributes: dict[str, Any] | None = None,
|
|
69
|
+
) -> None:
|
|
70
|
+
self.enable_spans = enable_spans
|
|
71
|
+
self.provider_factory = provider_factory
|
|
72
|
+
self.resource_attributes = dict(resource_attributes) if resource_attributes else None
|
|
73
|
+
|
|
74
|
+
def __hash__(self) -> int: # pragma: no cover - explicit to mirror dataclass behavior
|
|
75
|
+
msg = "TelemetryConfig objects are mutable and unhashable"
|
|
76
|
+
raise TypeError(msg)
|
|
77
|
+
|
|
78
|
+
def copy(self) -> "TelemetryConfig":
|
|
79
|
+
"""Return a shallow copy preserving optional dictionaries."""
|
|
80
|
+
|
|
81
|
+
attributes = dict(self.resource_attributes) if self.resource_attributes else None
|
|
82
|
+
return TelemetryConfig(
|
|
83
|
+
enable_spans=self.enable_spans, provider_factory=self.provider_factory, resource_attributes=attributes
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
def __repr__(self) -> str:
|
|
87
|
+
return f"TelemetryConfig(enable_spans={self.enable_spans!r}, provider_factory={self.provider_factory!r}, resource_attributes={self.resource_attributes!r})"
|
|
88
|
+
|
|
89
|
+
def __eq__(self, other: object) -> bool:
|
|
90
|
+
if not isinstance(other, TelemetryConfig):
|
|
91
|
+
return NotImplemented
|
|
92
|
+
return (
|
|
93
|
+
self.enable_spans == other.enable_spans
|
|
94
|
+
and self.provider_factory == other.provider_factory
|
|
95
|
+
and self.resource_attributes == other.resource_attributes
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class LoggingConfig:
|
|
100
|
+
"""Controls log output format and verbosity."""
|
|
101
|
+
|
|
102
|
+
__slots__ = ("include_sql_hash", "include_trace_context", "parameter_truncation_count", "sql_truncation_length")
|
|
103
|
+
|
|
104
|
+
def __init__(
|
|
105
|
+
self,
|
|
106
|
+
*,
|
|
107
|
+
include_sql_hash: bool = True,
|
|
108
|
+
sql_truncation_length: int = 2000,
|
|
109
|
+
parameter_truncation_count: int = 100,
|
|
110
|
+
include_trace_context: bool = True,
|
|
111
|
+
) -> None:
|
|
112
|
+
self.include_sql_hash = include_sql_hash
|
|
113
|
+
self.sql_truncation_length = sql_truncation_length
|
|
114
|
+
self.parameter_truncation_count = parameter_truncation_count
|
|
115
|
+
self.include_trace_context = include_trace_context
|
|
116
|
+
|
|
117
|
+
def __hash__(self) -> int: # pragma: no cover - explicit to mirror dataclass behavior
|
|
118
|
+
msg = "LoggingConfig objects are mutable and unhashable"
|
|
119
|
+
raise TypeError(msg)
|
|
120
|
+
|
|
121
|
+
def copy(self) -> "LoggingConfig":
|
|
122
|
+
"""Return a shallow copy of the logging configuration."""
|
|
123
|
+
|
|
124
|
+
return LoggingConfig(
|
|
125
|
+
include_sql_hash=self.include_sql_hash,
|
|
126
|
+
sql_truncation_length=self.sql_truncation_length,
|
|
127
|
+
parameter_truncation_count=self.parameter_truncation_count,
|
|
128
|
+
include_trace_context=self.include_trace_context,
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
def __repr__(self) -> str:
|
|
132
|
+
return (
|
|
133
|
+
f"LoggingConfig(include_sql_hash={self.include_sql_hash!r}, sql_truncation_length={self.sql_truncation_length!r}, "
|
|
134
|
+
f"parameter_truncation_count={self.parameter_truncation_count!r}, include_trace_context={self.include_trace_context!r})"
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
def __eq__(self, other: object) -> bool:
|
|
138
|
+
if not isinstance(other, LoggingConfig):
|
|
139
|
+
return NotImplemented
|
|
140
|
+
return (
|
|
141
|
+
self.include_sql_hash == other.include_sql_hash
|
|
142
|
+
and self.sql_truncation_length == other.sql_truncation_length
|
|
143
|
+
and self.parameter_truncation_count == other.parameter_truncation_count
|
|
144
|
+
and self.include_trace_context == other.include_trace_context
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
class ObservabilityConfig:
|
|
149
|
+
"""Aggregates lifecycle hooks, observers, and telemetry toggles."""
|
|
150
|
+
|
|
151
|
+
__slots__ = (
|
|
152
|
+
"cloud_formatter",
|
|
153
|
+
"lifecycle",
|
|
154
|
+
"logging",
|
|
155
|
+
"print_sql",
|
|
156
|
+
"redaction",
|
|
157
|
+
"sampling",
|
|
158
|
+
"statement_observers",
|
|
159
|
+
"telemetry",
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
def __init__(
|
|
163
|
+
self,
|
|
164
|
+
*,
|
|
165
|
+
lifecycle: "LifecycleConfig | None" = None,
|
|
166
|
+
print_sql: bool | None = None,
|
|
167
|
+
statement_observers: tuple[StatementObserver, ...] | Iterable[StatementObserver] | None = None,
|
|
168
|
+
telemetry: "TelemetryConfig | None" = None,
|
|
169
|
+
redaction: "RedactionConfig | None" = None,
|
|
170
|
+
logging: "LoggingConfig | None" = None,
|
|
171
|
+
sampling: "SamplingConfig | None" = None,
|
|
172
|
+
cloud_formatter: "CloudLogFormatter | None" = None,
|
|
173
|
+
) -> None:
|
|
174
|
+
self.lifecycle = lifecycle
|
|
175
|
+
self.print_sql = print_sql
|
|
176
|
+
self.statement_observers = tuple(statement_observers) if statement_observers is not None else None
|
|
177
|
+
self.telemetry = telemetry
|
|
178
|
+
self.redaction = redaction
|
|
179
|
+
self.logging = logging
|
|
180
|
+
self.sampling = sampling
|
|
181
|
+
self.cloud_formatter = cloud_formatter
|
|
182
|
+
|
|
183
|
+
def __hash__(self) -> int: # pragma: no cover - explicit to mirror dataclass behavior
|
|
184
|
+
msg = "ObservabilityConfig objects are mutable and unhashable"
|
|
185
|
+
raise TypeError(msg)
|
|
186
|
+
|
|
187
|
+
def copy(self) -> "ObservabilityConfig":
|
|
188
|
+
"""Return a deep copy of the configuration."""
|
|
189
|
+
|
|
190
|
+
lifecycle_copy = _normalize_lifecycle(self.lifecycle)
|
|
191
|
+
observers = tuple(self.statement_observers) if self.statement_observers else None
|
|
192
|
+
telemetry_copy = self.telemetry.copy() if self.telemetry else None
|
|
193
|
+
redaction_copy = self.redaction.copy() if self.redaction else None
|
|
194
|
+
logging_copy = self.logging.copy() if self.logging else None
|
|
195
|
+
sampling_copy = self.sampling.copy() if self.sampling else None
|
|
196
|
+
return ObservabilityConfig(
|
|
197
|
+
lifecycle=lifecycle_copy,
|
|
198
|
+
print_sql=self.print_sql,
|
|
199
|
+
statement_observers=observers,
|
|
200
|
+
telemetry=telemetry_copy,
|
|
201
|
+
redaction=redaction_copy,
|
|
202
|
+
logging=logging_copy,
|
|
203
|
+
sampling=sampling_copy,
|
|
204
|
+
cloud_formatter=self.cloud_formatter,
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
@classmethod
|
|
208
|
+
def merge(
|
|
209
|
+
cls, base_config: "ObservabilityConfig | None", override_config: "ObservabilityConfig | None"
|
|
210
|
+
) -> "ObservabilityConfig":
|
|
211
|
+
"""Merge registry-level and adapter-level configuration objects."""
|
|
212
|
+
|
|
213
|
+
if base_config is None and override_config is None:
|
|
214
|
+
return cls()
|
|
215
|
+
|
|
216
|
+
base = base_config.copy() if base_config else cls()
|
|
217
|
+
override = override_config
|
|
218
|
+
if override is None:
|
|
219
|
+
return base
|
|
220
|
+
|
|
221
|
+
lifecycle = _merge_lifecycle(base.lifecycle, override.lifecycle)
|
|
222
|
+
observers: tuple[StatementObserver, ...] | None
|
|
223
|
+
if base.statement_observers and override.statement_observers:
|
|
224
|
+
observers = base.statement_observers + tuple(override.statement_observers)
|
|
225
|
+
elif override.statement_observers:
|
|
226
|
+
observers = tuple(override.statement_observers)
|
|
227
|
+
else:
|
|
228
|
+
observers = base.statement_observers
|
|
229
|
+
|
|
230
|
+
print_sql = base.print_sql
|
|
231
|
+
if override.print_sql is not None:
|
|
232
|
+
print_sql = override.print_sql
|
|
233
|
+
|
|
234
|
+
telemetry = override.telemetry.copy() if override.telemetry else base.telemetry
|
|
235
|
+
redaction = _merge_redaction(base.redaction, override.redaction)
|
|
236
|
+
logging = _merge_logging(base.logging, override.logging)
|
|
237
|
+
sampling = _merge_sampling(base.sampling, override.sampling)
|
|
238
|
+
cloud_formatter = override.cloud_formatter if override.cloud_formatter is not None else base.cloud_formatter
|
|
239
|
+
|
|
240
|
+
return ObservabilityConfig(
|
|
241
|
+
lifecycle=lifecycle,
|
|
242
|
+
print_sql=print_sql,
|
|
243
|
+
statement_observers=observers,
|
|
244
|
+
telemetry=telemetry,
|
|
245
|
+
redaction=redaction,
|
|
246
|
+
logging=logging,
|
|
247
|
+
sampling=sampling,
|
|
248
|
+
cloud_formatter=cloud_formatter,
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
def __repr__(self) -> str:
|
|
252
|
+
return (
|
|
253
|
+
f"ObservabilityConfig(lifecycle={self.lifecycle!r}, print_sql={self.print_sql!r}, statement_observers={self.statement_observers!r}, telemetry={self.telemetry!r}, "
|
|
254
|
+
f"redaction={self.redaction!r}, logging={self.logging!r}, sampling={self.sampling!r}, cloud_formatter={self.cloud_formatter!r})"
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
def __eq__(self, other: object) -> bool:
|
|
258
|
+
if not isinstance(other, ObservabilityConfig):
|
|
259
|
+
return NotImplemented
|
|
260
|
+
return (
|
|
261
|
+
_normalize_lifecycle(self.lifecycle) == _normalize_lifecycle(other.lifecycle)
|
|
262
|
+
and self.print_sql == other.print_sql
|
|
263
|
+
and self.statement_observers == other.statement_observers
|
|
264
|
+
and self.telemetry == other.telemetry
|
|
265
|
+
and self.redaction == other.redaction
|
|
266
|
+
and self.logging == other.logging
|
|
267
|
+
and self.sampling == other.sampling
|
|
268
|
+
and self.cloud_formatter == other.cloud_formatter
|
|
269
|
+
)
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
def _merge_redaction(base: "RedactionConfig | None", override: "RedactionConfig | None") -> "RedactionConfig | None":
|
|
273
|
+
if base is None and override is None:
|
|
274
|
+
return None
|
|
275
|
+
if override is None:
|
|
276
|
+
return base.copy() if base else None
|
|
277
|
+
if base is None:
|
|
278
|
+
return override.copy()
|
|
279
|
+
merged = base.copy()
|
|
280
|
+
if override.mask_parameters is not None:
|
|
281
|
+
merged.mask_parameters = override.mask_parameters
|
|
282
|
+
if override.mask_literals is not None:
|
|
283
|
+
merged.mask_literals = override.mask_literals
|
|
284
|
+
if override.parameter_allow_list is not None:
|
|
285
|
+
merged.parameter_allow_list = tuple(override.parameter_allow_list)
|
|
286
|
+
return merged
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
def _merge_logging(base: "LoggingConfig | None", override: "LoggingConfig | None") -> "LoggingConfig | None":
|
|
290
|
+
if base is None and override is None:
|
|
291
|
+
return None
|
|
292
|
+
if override is None:
|
|
293
|
+
return base.copy() if base else None
|
|
294
|
+
return override.copy()
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
def _merge_sampling(base: "SamplingConfig | None", override: "SamplingConfig | None") -> "SamplingConfig | None":
|
|
298
|
+
if base is None and override is None:
|
|
299
|
+
return None
|
|
300
|
+
if override is None:
|
|
301
|
+
return base.copy() if base else None
|
|
302
|
+
if base is None:
|
|
303
|
+
return override.copy()
|
|
304
|
+
merged = base.copy()
|
|
305
|
+
if override.sample_rate != 1.0:
|
|
306
|
+
merged.sample_rate = override.sample_rate
|
|
307
|
+
if override.deterministic:
|
|
308
|
+
merged.deterministic = override.deterministic
|
|
309
|
+
if override.force_sample_on_error:
|
|
310
|
+
merged.force_sample_on_error = override.force_sample_on_error
|
|
311
|
+
if override.force_sample_slow_queries_ms is not None:
|
|
312
|
+
merged.force_sample_slow_queries_ms = override.force_sample_slow_queries_ms
|
|
313
|
+
return merged
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
def _normalize_lifecycle(config: "LifecycleConfig | None") -> "LifecycleConfig | None":
|
|
317
|
+
if config is None:
|
|
318
|
+
return None
|
|
319
|
+
normalized: dict[str, list[LifecycleHook]] = {}
|
|
320
|
+
for event, hooks in config.items():
|
|
321
|
+
normalized[event] = list(cast("Iterable[LifecycleHook]", hooks))
|
|
322
|
+
return cast("LifecycleConfig", normalized)
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
def _merge_lifecycle(base: "LifecycleConfig | None", override: "LifecycleConfig | None") -> "LifecycleConfig | None":
|
|
326
|
+
if base is None and override is None:
|
|
327
|
+
return None
|
|
328
|
+
if base is None:
|
|
329
|
+
return _normalize_lifecycle(override)
|
|
330
|
+
if override is None:
|
|
331
|
+
return _normalize_lifecycle(base)
|
|
332
|
+
merged_dict: dict[str, list[LifecycleHook]] = (
|
|
333
|
+
cast("dict[str, list[LifecycleHook]]", _normalize_lifecycle(base)) or {}
|
|
334
|
+
)
|
|
335
|
+
for event, hooks in override.items():
|
|
336
|
+
merged_dict.setdefault(event, [])
|
|
337
|
+
merged_dict[event].extend(cast("Iterable[LifecycleHook]", hooks))
|
|
338
|
+
return cast("LifecycleConfig", merged_dict)
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
__all__ = (
|
|
342
|
+
"LifecycleHook",
|
|
343
|
+
"LoggingConfig",
|
|
344
|
+
"ObservabilityConfig",
|
|
345
|
+
"RedactionConfig",
|
|
346
|
+
"StatementObserver",
|
|
347
|
+
"TelemetryConfig",
|
|
348
|
+
)
|
|
Binary file
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""Diagnostics aggregation utilities for observability exports."""
|
|
2
|
+
|
|
3
|
+
from collections.abc import Iterable
|
|
4
|
+
|
|
5
|
+
from sqlspec.storage.pipeline import (
|
|
6
|
+
StorageDiagnostics,
|
|
7
|
+
StorageTelemetry,
|
|
8
|
+
get_recent_storage_events,
|
|
9
|
+
get_storage_bridge_diagnostics,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
DiagnosticsPayload = dict[str, float | list[StorageTelemetry]]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _increment_metric(payload: "dict[str, float]", metric: str, amount: float) -> None:
|
|
16
|
+
payload[metric] = payload.get(metric, 0.0) + amount
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class TelemetryDiagnostics:
|
|
20
|
+
"""Aggregates lifecycle counters, custom metrics, and storage telemetry."""
|
|
21
|
+
|
|
22
|
+
__slots__ = ("_lifecycle_sections", "_metrics")
|
|
23
|
+
|
|
24
|
+
def __init__(self) -> None:
|
|
25
|
+
self._lifecycle_sections: list[tuple[str, dict[str, float]]] = []
|
|
26
|
+
self._metrics: StorageDiagnostics = {}
|
|
27
|
+
|
|
28
|
+
def add_lifecycle_snapshot(self, config_key: str, counters: dict[str, int]) -> None:
|
|
29
|
+
"""Store lifecycle counters for later snapshot generation."""
|
|
30
|
+
|
|
31
|
+
if not counters:
|
|
32
|
+
return
|
|
33
|
+
float_counters = {metric: float(value) for metric, value in counters.items()}
|
|
34
|
+
self._lifecycle_sections.append((config_key, float_counters))
|
|
35
|
+
|
|
36
|
+
def add_metric_snapshot(self, metrics: StorageDiagnostics) -> None:
|
|
37
|
+
"""Store custom metric snapshots."""
|
|
38
|
+
|
|
39
|
+
for key, value in metrics.items():
|
|
40
|
+
if key in self._metrics:
|
|
41
|
+
self._metrics[key] += value
|
|
42
|
+
else:
|
|
43
|
+
self._metrics[key] = value
|
|
44
|
+
|
|
45
|
+
def snapshot(self) -> "DiagnosticsPayload":
|
|
46
|
+
"""Return aggregated diagnostics payload."""
|
|
47
|
+
|
|
48
|
+
numeric_payload: dict[str, float] = {}
|
|
49
|
+
|
|
50
|
+
for key, value in get_storage_bridge_diagnostics().items():
|
|
51
|
+
_increment_metric(numeric_payload, key, float(value))
|
|
52
|
+
for _prefix, counters in self._lifecycle_sections:
|
|
53
|
+
for metric, value in counters.items():
|
|
54
|
+
_increment_metric(numeric_payload, metric, value)
|
|
55
|
+
for metric, value in self._metrics.items():
|
|
56
|
+
_increment_metric(numeric_payload, metric, float(value))
|
|
57
|
+
|
|
58
|
+
payload: DiagnosticsPayload = dict(numeric_payload)
|
|
59
|
+
recent_jobs = get_recent_storage_events()
|
|
60
|
+
if recent_jobs:
|
|
61
|
+
payload["storage_bridge.recent_jobs"] = recent_jobs
|
|
62
|
+
return payload
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def collect_diagnostics(sections: Iterable[tuple[str, dict[str, int]]]) -> DiagnosticsPayload:
|
|
66
|
+
"""Convenience helper for aggregating sections without constructing a class."""
|
|
67
|
+
|
|
68
|
+
diag = TelemetryDiagnostics()
|
|
69
|
+
for prefix, counters in sections:
|
|
70
|
+
diag.add_lifecycle_snapshot(prefix, counters)
|
|
71
|
+
return diag.snapshot()
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
__all__ = ("DiagnosticsPayload", "TelemetryDiagnostics", "collect_diagnostics")
|
|
Binary file
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"""Lifecycle dispatcher used by drivers and registry hooks."""
|
|
2
|
+
|
|
3
|
+
from collections.abc import Callable, Iterable
|
|
4
|
+
from typing import Any, Literal
|
|
5
|
+
|
|
6
|
+
from sqlspec.utils.logging import get_logger
|
|
7
|
+
|
|
8
|
+
logger = get_logger("sqlspec.observability.lifecycle")
|
|
9
|
+
|
|
10
|
+
LifecycleContext = dict[str, Any]
|
|
11
|
+
LifecycleHook = Callable[[LifecycleContext], None]
|
|
12
|
+
|
|
13
|
+
LifecycleEvent = Literal[
|
|
14
|
+
"on_pool_create",
|
|
15
|
+
"on_pool_destroy",
|
|
16
|
+
"on_connection_create",
|
|
17
|
+
"on_connection_destroy",
|
|
18
|
+
"on_session_start",
|
|
19
|
+
"on_session_end",
|
|
20
|
+
"on_query_start",
|
|
21
|
+
"on_query_complete",
|
|
22
|
+
"on_error",
|
|
23
|
+
]
|
|
24
|
+
EVENT_ATTRS: tuple[LifecycleEvent, ...] = (
|
|
25
|
+
"on_pool_create",
|
|
26
|
+
"on_pool_destroy",
|
|
27
|
+
"on_connection_create",
|
|
28
|
+
"on_connection_destroy",
|
|
29
|
+
"on_session_start",
|
|
30
|
+
"on_session_end",
|
|
31
|
+
"on_query_start",
|
|
32
|
+
"on_query_complete",
|
|
33
|
+
"on_error",
|
|
34
|
+
)
|
|
35
|
+
GUARD_ATTRS = tuple(f"has_{name[3:]}" for name in EVENT_ATTRS)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class LifecycleDispatcher:
|
|
39
|
+
"""Dispatches lifecycle hooks with guard flags and diagnostics counters."""
|
|
40
|
+
|
|
41
|
+
__slots__ = (
|
|
42
|
+
"_counters",
|
|
43
|
+
"_hooks",
|
|
44
|
+
"has_connection_create",
|
|
45
|
+
"has_connection_destroy",
|
|
46
|
+
"has_error",
|
|
47
|
+
"has_pool_create",
|
|
48
|
+
"has_pool_destroy",
|
|
49
|
+
"has_query_complete",
|
|
50
|
+
"has_query_start",
|
|
51
|
+
"has_session_end",
|
|
52
|
+
"has_session_start",
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
def __init__(self, hooks: "dict[str, Iterable[LifecycleHook]] | None" = None) -> None:
|
|
56
|
+
self.has_pool_create = False
|
|
57
|
+
self.has_pool_destroy = False
|
|
58
|
+
self.has_connection_create = False
|
|
59
|
+
self.has_connection_destroy = False
|
|
60
|
+
self.has_session_start = False
|
|
61
|
+
self.has_session_end = False
|
|
62
|
+
self.has_query_start = False
|
|
63
|
+
self.has_query_complete = False
|
|
64
|
+
self.has_error = False
|
|
65
|
+
|
|
66
|
+
normalized: dict[LifecycleEvent, tuple[LifecycleHook, ...]] = {}
|
|
67
|
+
for event_name, guard_attr in zip(EVENT_ATTRS, GUARD_ATTRS, strict=False):
|
|
68
|
+
callables = hooks.get(event_name) if hooks else None
|
|
69
|
+
normalized[event_name] = tuple(callables) if callables else ()
|
|
70
|
+
setattr(self, guard_attr, bool(normalized[event_name]))
|
|
71
|
+
self._hooks: dict[LifecycleEvent, tuple[LifecycleHook, ...]] = normalized
|
|
72
|
+
self._counters: dict[LifecycleEvent, int] = dict.fromkeys(EVENT_ATTRS, 0)
|
|
73
|
+
|
|
74
|
+
@property
|
|
75
|
+
def is_enabled(self) -> bool:
|
|
76
|
+
"""Return True when at least one hook is registered."""
|
|
77
|
+
|
|
78
|
+
return any(self._hooks[name] for name in EVENT_ATTRS)
|
|
79
|
+
|
|
80
|
+
def emit_pool_create(self, context: "LifecycleContext") -> None:
|
|
81
|
+
"""Fire pool creation hooks."""
|
|
82
|
+
|
|
83
|
+
self._emit("on_pool_create", context)
|
|
84
|
+
|
|
85
|
+
def emit_pool_destroy(self, context: "LifecycleContext") -> None:
|
|
86
|
+
"""Fire pool destruction hooks."""
|
|
87
|
+
|
|
88
|
+
self._emit("on_pool_destroy", context)
|
|
89
|
+
|
|
90
|
+
def emit_connection_create(self, context: "LifecycleContext") -> None:
|
|
91
|
+
"""Fire connection creation hooks."""
|
|
92
|
+
|
|
93
|
+
self._emit("on_connection_create", context)
|
|
94
|
+
|
|
95
|
+
def emit_connection_destroy(self, context: "LifecycleContext") -> None:
|
|
96
|
+
"""Fire connection teardown hooks."""
|
|
97
|
+
|
|
98
|
+
self._emit("on_connection_destroy", context)
|
|
99
|
+
|
|
100
|
+
def emit_session_start(self, context: "LifecycleContext") -> None:
|
|
101
|
+
"""Fire session start hooks."""
|
|
102
|
+
|
|
103
|
+
self._emit("on_session_start", context)
|
|
104
|
+
|
|
105
|
+
def emit_session_end(self, context: "LifecycleContext") -> None:
|
|
106
|
+
"""Fire session end hooks."""
|
|
107
|
+
|
|
108
|
+
self._emit("on_session_end", context)
|
|
109
|
+
|
|
110
|
+
def emit_query_start(self, context: "LifecycleContext") -> None:
|
|
111
|
+
"""Fire query start hooks."""
|
|
112
|
+
|
|
113
|
+
self._emit("on_query_start", context)
|
|
114
|
+
|
|
115
|
+
def emit_query_complete(self, context: "LifecycleContext") -> None:
|
|
116
|
+
"""Fire query completion hooks."""
|
|
117
|
+
|
|
118
|
+
self._emit("on_query_complete", context)
|
|
119
|
+
|
|
120
|
+
def emit_error(self, context: "LifecycleContext") -> None:
|
|
121
|
+
"""Fire error hooks with failure context."""
|
|
122
|
+
|
|
123
|
+
self._emit("on_error", context)
|
|
124
|
+
|
|
125
|
+
def snapshot(self, *, prefix: str | None = None) -> "dict[str, int]":
|
|
126
|
+
"""Return counter snapshot keyed for diagnostics export."""
|
|
127
|
+
|
|
128
|
+
metrics: dict[str, int] = {}
|
|
129
|
+
for event_name, count in self._counters.items():
|
|
130
|
+
key = event_name.replace("on_", "lifecycle.")
|
|
131
|
+
if prefix:
|
|
132
|
+
key = f"{prefix}.{key}"
|
|
133
|
+
metrics[key] = count
|
|
134
|
+
return metrics
|
|
135
|
+
|
|
136
|
+
def _emit(self, event: LifecycleEvent, context: "LifecycleContext") -> None:
|
|
137
|
+
callbacks = self._hooks.get(event)
|
|
138
|
+
if not callbacks:
|
|
139
|
+
return
|
|
140
|
+
self._counters[event] += 1
|
|
141
|
+
for callback in callbacks:
|
|
142
|
+
self._invoke_callback(callback, context, event)
|
|
143
|
+
|
|
144
|
+
@staticmethod
|
|
145
|
+
def _invoke_callback(callback: LifecycleHook, context: "LifecycleContext", event: LifecycleEvent) -> None:
|
|
146
|
+
try:
|
|
147
|
+
callback(context)
|
|
148
|
+
except Exception as exc: # pragma: no cover - defensive logging
|
|
149
|
+
logger.warning("Lifecycle hook failed: event=%s error=%s", event, exc)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
__all__ = ("LifecycleContext", "LifecycleDispatcher", "LifecycleHook")
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"""Cloud log formatters for observability.
|
|
2
|
+
|
|
3
|
+
This module provides cloud-specific log formatters for GCP, AWS, and Azure
|
|
4
|
+
that produce structured JSON output compatible with each provider's logging
|
|
5
|
+
requirements.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from sqlspec.observability._formatters._aws import AWSLogFormatter
|
|
9
|
+
from sqlspec.observability._formatters._azure import AzureLogFormatter
|
|
10
|
+
from sqlspec.observability._formatters._base import CloudLogFormatter
|
|
11
|
+
from sqlspec.observability._formatters._gcp import GCPLogFormatter
|
|
12
|
+
|
|
13
|
+
__all__ = ("AWSLogFormatter", "AzureLogFormatter", "CloudLogFormatter", "GCPLogFormatter")
|
|
Binary file
|