sqlspec 0.29.0__tar.gz → 0.30.0__tar.gz
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.
- {sqlspec-0.29.0 → sqlspec-0.30.0}/.gitignore +1 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/.pre-commit-config.yaml +2 -1
- {sqlspec-0.29.0 → sqlspec-0.30.0}/AGENTS.md +44 -0
- sqlspec-0.30.0/PKG-INFO +202 -0
- sqlspec-0.30.0/README.md +108 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/pyproject.toml +20 -10
- sqlspec-0.30.0/specs/guides/docs_examples_alignment.md +33 -0
- sqlspec-0.30.0/specs/guides/query-stack.md +67 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/__init__.py +8 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/_typing.py +5 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/adbc/config.py +9 -3
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/adbc/driver.py +2 -2
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/aiosqlite/config.py +8 -3
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/aiosqlite/driver.py +2 -2
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/asyncmy/config.py +8 -3
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/asyncmy/driver.py +2 -2
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/asyncpg/__init__.py +2 -1
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/asyncpg/_types.py +5 -3
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/asyncpg/config.py +10 -4
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/asyncpg/driver.py +153 -5
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/bigquery/config.py +27 -12
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/bigquery/driver.py +59 -6
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/duckdb/config.py +54 -19
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/duckdb/driver.py +2 -2
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/duckdb/pool.py +33 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/oracledb/config.py +7 -13
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/oracledb/data_dictionary.py +106 -53
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/oracledb/driver.py +430 -10
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/psqlpy/config.py +4 -3
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/psqlpy/driver.py +2 -2
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/psycopg/config.py +7 -13
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/psycopg/driver.py +295 -26
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/sqlite/config.py +8 -3
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/sqlite/driver.py +2 -2
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/base.py +145 -41
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/cli.py +44 -37
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/config.py +246 -15
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/core/__init__.py +16 -1
- sqlspec-0.30.0/sqlspec/core/metrics.py +83 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/core/parameters/_alignment.py +36 -1
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/core/result.py +115 -5
- sqlspec-0.30.0/sqlspec/core/stack.py +163 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/driver/__init__.py +9 -1
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/driver/_async.py +163 -14
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/driver/_common.py +181 -4
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/driver/_sync.py +162 -15
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/driver/mixins/__init__.py +1 -1
- sqlspec-0.29.0/sqlspec/driver/mixins/storage.py → sqlspec-0.30.0/sqlspec/driver/mixins/_storage.py +89 -2
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/exceptions.py +41 -1
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/litestar/handlers.py +11 -5
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/litestar/plugin.py +122 -3
- sqlspec-0.30.0/sqlspec/extensions/otel/__init__.py +58 -0
- sqlspec-0.30.0/sqlspec/extensions/prometheus/__init__.py +107 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/loader.py +66 -6
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/migrations/base.py +71 -9
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/migrations/commands.py +236 -25
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/migrations/runner.py +230 -61
- sqlspec-0.30.0/sqlspec/migrations/templates.py +234 -0
- sqlspec-0.30.0/sqlspec/migrations/utils.py +256 -0
- sqlspec-0.30.0/sqlspec/observability/__init__.py +22 -0
- sqlspec-0.30.0/sqlspec/observability/_config.py +228 -0
- sqlspec-0.30.0/sqlspec/observability/_diagnostics.py +66 -0
- sqlspec-0.30.0/sqlspec/observability/_dispatcher.py +129 -0
- sqlspec-0.30.0/sqlspec/observability/_observer.py +180 -0
- sqlspec-0.30.0/sqlspec/observability/_runtime.py +381 -0
- sqlspec-0.30.0/sqlspec/observability/_spans.py +148 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/protocols.py +25 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/storage/pipeline.py +34 -4
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/utils/config_resolver.py +5 -1
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/utils/portal.py +22 -6
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/test_adbc_driver.py +47 -1
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_aiosqlite/test_connection.py +42 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_aiosqlite/test_driver.py +49 -1
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncmy/test_driver.py +48 -1
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncpg/test_driver.py +66 -1
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncpg/test_extensions/test_adk/test_owner_id_column.py +5 -5
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_bigquery/test_driver.py +45 -1
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_duckdb/test_connection.py +46 -4
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_duckdb/test_driver.py +47 -1
- sqlspec-0.30.0/tests/integration/test_adapters/test_oracledb/test_stack.py +144 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psqlpy/test_driver.py +46 -1
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psycopg/test_async_copy.py +53 -1
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psycopg/test_driver.py +57 -1
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_sqlite/test_driver.py +49 -1
- sqlspec-0.30.0/tests/integration/test_extensions/test_litestar/test_correlation_middleware.py +91 -0
- sqlspec-0.30.0/tests/integration/test_stack_edge_cases.py +183 -0
- sqlspec-0.30.0/tests/unit/test_adapters/test_duckdb/test_extension_flags.py +42 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_extension_config.py +31 -21
- sqlspec-0.30.0/tests/unit/test_adapters/test_oracledb/test_data_dictionary.py +139 -0
- sqlspec-0.30.0/tests/unit/test_adapters/test_oracledb/test_pipeline_helpers.py +121 -0
- sqlspec-0.30.0/tests/unit/test_adapters/test_oracledb/test_uuid_handlers.py +240 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_cli/test_migration_commands.py +92 -2
- sqlspec-0.30.0/tests/unit/test_config/test_observability_extensions.py +49 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_config_resolver.py +66 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_core/test_result.py +30 -1
- sqlspec-0.30.0/tests/unit/test_core/test_stack.py +94 -0
- sqlspec-0.30.0/tests/unit/test_core/test_stack_metrics.py +42 -0
- sqlspec-0.30.0/tests/unit/test_driver/test_stack_base.py +121 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_exceptions.py +19 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_extensions/test_litestar/test_handlers.py +24 -0
- sqlspec-0.30.0/tests/unit/test_extensions/test_observability_integrations.py +42 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_migrations/test_migration_runner.py +51 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_migrations/test_utils.py +111 -0
- sqlspec-0.30.0/tests/unit/test_observability.py +461 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_utils/test_portal.py +31 -1
- sqlspec-0.30.0/tools/run_pre_commit.py +57 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/uv.lock +491 -475
- sqlspec-0.29.0/PKG-INFO +0 -575
- sqlspec-0.29.0/README.md +0 -481
- sqlspec-0.29.0/sqlspec/migrations/utils.py +0 -177
- sqlspec-0.29.0/tests/unit/adapters/test_oracledb_uuid_handlers.py +0 -358
- {sqlspec-0.29.0 → sqlspec-0.30.0}/.claude/AGENTS.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/.claude/README.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/.claude/agents/docs-vision.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/.claude/agents/expert.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/.claude/agents/prd.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/.claude/agents/testing.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/.claude/bootstrap.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/.claude/commands/implement.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/.claude/commands/prd.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/.claude/commands/review.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/.claude/commands/test.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/.gemini/GEMINI.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/.gemini/bootstrap.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/.gemini/commands/implement.toml +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/.gemini/commands/prd.toml +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/.gemini/commands/review.toml +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/.gemini/commands/sync-guides.toml +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/.gemini/commands/test.toml +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/CLAUDE.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/CONTRIBUTING.rst +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/GEMINI.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/LICENSE +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/Makefile +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/specs/AGENTS.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/specs/README.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/specs/active/.gitkeep +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/specs/agents/expert.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/specs/agents/guides.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/specs/agents/prd.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/specs/agents/review.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/specs/agents/testing.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/specs/archive/.gitkeep +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/specs/template-spec/README.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/specs/template-spec/prd.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/specs/template-spec/recovery.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/specs/template-spec/research/.gitkeep +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/specs/template-spec/tasks.md +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/__main__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/__metadata__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/_serialization.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/adbc/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/adbc/_types.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/adbc/adk/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/adbc/adk/store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/adbc/data_dictionary.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/adbc/litestar/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/adbc/litestar/store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/adbc/type_converter.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/aiosqlite/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/aiosqlite/_types.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/aiosqlite/adk/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/aiosqlite/adk/store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/aiosqlite/data_dictionary.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/aiosqlite/litestar/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/aiosqlite/litestar/store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/aiosqlite/pool.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/asyncmy/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/asyncmy/_types.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/asyncmy/adk/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/asyncmy/adk/store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/asyncmy/data_dictionary.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/asyncmy/litestar/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/asyncmy/litestar/store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/asyncpg/_type_handlers.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/asyncpg/adk/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/asyncpg/adk/store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/asyncpg/data_dictionary.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/asyncpg/litestar/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/asyncpg/litestar/store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/bigquery/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/bigquery/_types.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/bigquery/adk/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/bigquery/adk/store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/bigquery/data_dictionary.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/bigquery/litestar/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/bigquery/litestar/store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/bigquery/type_converter.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/duckdb/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/duckdb/_types.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/duckdb/adk/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/duckdb/adk/store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/duckdb/data_dictionary.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/duckdb/litestar/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/duckdb/litestar/store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/duckdb/type_converter.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/oracledb/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/oracledb/_numpy_handlers.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/oracledb/_types.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/oracledb/_uuid_handlers.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/oracledb/adk/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/oracledb/adk/store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/oracledb/litestar/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/oracledb/litestar/store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/oracledb/migrations.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/oracledb/type_converter.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/psqlpy/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/psqlpy/_type_handlers.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/psqlpy/_types.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/psqlpy/adk/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/psqlpy/adk/store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/psqlpy/data_dictionary.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/psqlpy/litestar/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/psqlpy/litestar/store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/psqlpy/type_converter.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/psycopg/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/psycopg/_type_handlers.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/psycopg/_types.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/psycopg/adk/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/psycopg/adk/store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/psycopg/data_dictionary.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/psycopg/litestar/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/psycopg/litestar/store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/sqlite/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/sqlite/_type_handlers.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/sqlite/_types.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/sqlite/adk/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/sqlite/adk/store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/sqlite/data_dictionary.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/sqlite/litestar/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/sqlite/litestar/store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/adapters/sqlite/pool.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/builder/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/builder/_base.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/builder/_column.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/builder/_ddl.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/builder/_delete.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/builder/_dml.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/builder/_expression_wrappers.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/builder/_factory.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/builder/_insert.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/builder/_join.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/builder/_merge.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/builder/_parsing_utils.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/builder/_select.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/builder/_update.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/core/cache.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/core/compiler.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/core/filters.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/core/hashing.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/core/parameters/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/core/parameters/_converter.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/core/parameters/_processor.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/core/parameters/_registry.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/core/parameters/_transformers.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/core/parameters/_types.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/core/parameters/_validator.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/core/pipeline.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/core/splitter.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/core/statement.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/core/type_conversion.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/driver/mixins/_result_tools.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/driver/mixins/_sql_translator.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/adk/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/adk/_types.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/adk/converters.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/adk/migrations/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/adk/service.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/adk/store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/aiosql/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/aiosql/adapter.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/fastapi/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/fastapi/extension.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/fastapi/providers.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/flask/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/flask/_state.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/flask/_utils.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/flask/extension.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/litestar/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/litestar/_utils.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/litestar/cli.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/litestar/config.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/litestar/migrations/0001_create_session_table.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/litestar/migrations/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/litestar/providers.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/litestar/store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/starlette/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/starlette/_state.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/starlette/_utils.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/starlette/extension.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/extensions/starlette/middleware.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/migrations/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/migrations/context.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/migrations/fix.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/migrations/loaders.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/migrations/tracker.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/migrations/validation.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/py.typed +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/storage/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/storage/_utils.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/storage/backends/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/storage/backends/base.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/storage/backends/fsspec.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/storage/backends/local.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/storage/backends/obstore.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/storage/errors.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/storage/registry.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/typing.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/utils/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/utils/arrow_helpers.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/utils/correlation.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/utils/data_transformation.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/utils/deprecation.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/utils/fixtures.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/utils/logging.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/utils/module_loader.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/utils/schema.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/utils/serializers.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/utils/singleton.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/utils/sync_tools.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/utils/text.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/utils/type_converters.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/utils/type_guards.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/sqlspec/utils/version.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/conftest.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/asset_maintenance.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/ddls-mysql-collection.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/ddls-postgres-collection.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/example_usage.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/init.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/mysql/collection-config.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/mysql/collection-data_types.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/mysql/collection-database_details.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/mysql/collection-engines.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/mysql/collection-hostname.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/mysql/collection-plugins.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/mysql/collection-process_list.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/mysql/collection-resource-groups.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/mysql/collection-schema_objects.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/mysql/collection-table_details.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/mysql/collection-users.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/mysql/init.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/oracle.ddl.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/postgres/collection-applications.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/postgres/collection-aws_extension_dependency.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/postgres/collection-aws_oracle_exists.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/postgres/collection-bg_writer_stats.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/postgres/collection-calculated_metrics.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/postgres/collection-data_types.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/postgres/collection-database_details.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/postgres/collection-extensions.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/postgres/collection-index_details.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/postgres/collection-pglogical-details.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/postgres/collection-privileges.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/postgres/collection-replication_slots.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/postgres/collection-replication_stats.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/postgres/collection-schema_details.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/postgres/collection-schema_objects.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/postgres/collection-settings.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/postgres/collection-source_details.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/postgres/collection-table_details.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/postgres/extended-collection-all-databases.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/postgres/init.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/readiness-check.sql +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/fixtures/sql_utils.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/conftest.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/_storage_bridge_helpers.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/conftest.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/test_adbc_arrow_features.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/test_adbc_backends.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/test_adbc_connection.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/test_adbc_edge_cases.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/test_adbc_results.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/test_arrow_duckdb.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/test_data_dictionary.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/test_exceptions.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/test_extensions/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/test_extensions/test_adk/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/test_extensions/test_adk/test_dialect_integration.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/test_extensions/test_adk/test_dialect_support.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/test_extensions/test_adk/test_edge_cases.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/test_extensions/test_adk/test_event_operations.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/test_extensions/test_adk/test_owner_id_column.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/test_extensions/test_adk/test_session_operations.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/test_extensions/test_litestar/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/test_extensions/test_litestar/test_store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/test_migrations.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/test_parameter_styles.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_adbc/test_storage_bridge.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_aiosqlite/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_aiosqlite/conftest.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_aiosqlite/test_arrow.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_aiosqlite/test_exceptions.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_aiosqlite/test_extensions/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_aiosqlite/test_extensions/test_litestar/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_aiosqlite/test_extensions/test_litestar/test_numpy_serialization.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_aiosqlite/test_extensions/test_litestar/test_store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_aiosqlite/test_migrations.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_aiosqlite/test_parameter_styles.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_aiosqlite/test_pooling.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_aiosqlite/test_storage_bridge.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncmy/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncmy/conftest.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncmy/test_arrow.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncmy/test_asyncmy_features.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncmy/test_config.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncmy/test_exceptions.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncmy/test_extensions/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncmy/test_extensions/test_adk/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncmy/test_extensions/test_adk/conftest.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncmy/test_extensions/test_adk/test_store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncmy/test_extensions/test_litestar/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncmy/test_extensions/test_litestar/test_store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncmy/test_migrations.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncmy/test_parameter_styles.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncmy/test_storage_bridge.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncpg/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncpg/conftest.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncpg/test_arrow.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncpg/test_cloud_connectors_integration.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncpg/test_connection.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncpg/test_data_dictionary.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncpg/test_exceptions.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncpg/test_execute_many.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncpg/test_extensions/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncpg/test_extensions/test_adk/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncpg/test_extensions/test_adk/conftest.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncpg/test_extensions/test_adk/test_session_operations.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncpg/test_extensions/test_litestar/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncpg/test_extensions/test_litestar/test_store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncpg/test_merge.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncpg/test_merge_bulk.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncpg/test_migrations.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncpg/test_parameter_styles.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncpg/test_schema_migration.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_asyncpg/test_storage_bridge.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_bigquery/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_bigquery/conftest.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_bigquery/test_arrow_bigquery.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_bigquery/test_bigquery_features.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_bigquery/test_config.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_bigquery/test_connection.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_bigquery/test_exceptions.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_duckdb/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_duckdb/conftest.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_duckdb/test_arrow.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_duckdb/test_driver_features.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_duckdb/test_exceptions.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_duckdb/test_execute_many.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_duckdb/test_extensions/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_duckdb/test_extensions/test_adk/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_duckdb/test_extensions/test_adk/test_store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_duckdb/test_extensions/test_litestar/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_duckdb/test_extensions/test_litestar/test_store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_duckdb/test_migrations.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_duckdb/test_mixed_parameter_styles.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_duckdb/test_parameter_styles.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_duckdb/test_pooling.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_duckdb/test_storage_bridge.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_duckdb/utils.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/conftest.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/test_arrow.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/test_connection.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/test_driver_async.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/test_driver_sync.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/test_exceptions.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/test_execute_many.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/test_extensions/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/test_extensions/test_adk/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/test_extensions/test_adk/test_inmemory.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/test_extensions/test_adk/test_oracle_specific.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/test_extensions/test_litestar/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/test_extensions/test_litestar/test_inmemory.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/test_extensions/test_litestar/test_store_async.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/test_extensions/test_litestar/test_store_sync.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/test_merge.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/test_merge_bulk.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/test_migrations.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/test_msgspec_clob.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/test_numpy_vectors.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/test_oracle_features.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/test_parameter_styles.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_oracledb/test_uuid_binary.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psqlpy/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psqlpy/conftest.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psqlpy/test_arrow.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psqlpy/test_connection.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psqlpy/test_exceptions.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psqlpy/test_extensions/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psqlpy/test_extensions/test_adk/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psqlpy/test_extensions/test_adk/test_owner_id_column.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psqlpy/test_extensions/test_litestar/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psqlpy/test_extensions/test_litestar/test_store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psqlpy/test_merge_bulk.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psqlpy/test_migrations.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psqlpy/test_parameter_styles.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psqlpy/test_psqlpy_features.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psqlpy/test_storage_bridge.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psycopg/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psycopg/conftest.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psycopg/test_arrow.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psycopg/test_connection.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psycopg/test_exceptions.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psycopg/test_execute_many.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psycopg/test_extensions/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psycopg/test_extensions/test_adk/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psycopg/test_extensions/test_adk/test_owner_id_column.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psycopg/test_extensions/test_litestar/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psycopg/test_extensions/test_litestar/test_store_async.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psycopg/test_extensions/test_litestar/test_store_sync.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psycopg/test_merge_bulk.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psycopg/test_migrations.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psycopg/test_parameter_styles.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_psycopg/test_storage_bridge.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_sqlite/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_sqlite/conftest.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_sqlite/test_arrow.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_sqlite/test_data_dictionary.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_sqlite/test_driver_features.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_sqlite/test_exceptions.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_sqlite/test_extensions/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_sqlite/test_extensions/test_adk/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_sqlite/test_extensions/test_adk/test_owner_id_column.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_sqlite/test_extensions/test_litestar/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_sqlite/test_extensions/test_litestar/test_store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_sqlite/test_migrations.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_sqlite/test_parameter_styles.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_sqlite/test_pooling.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_sqlite/test_query_mixin.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_adapters/test_sqlite/test_storage_bridge.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_async_migrations.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_dishka/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_dishka/conftest.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_dishka/test_dishka_integration.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_extensions/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_extensions/test_fastapi/test_fastapi_filters_integration.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_extensions/test_fastapi/test_fastapi_integration.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_extensions/test_flask/test_flask_disable_di.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_extensions/test_flask/test_flask_integration.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_extensions/test_litestar/test_litestar_disable_di.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_extensions/test_starlette/test_starlette_disable_di.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_extensions/test_starlette/test_starlette_integration.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_loader/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_loader/test_file_system_loading.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_migrations/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_migrations/test_auto_sync.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_migrations/test_fix_checksum_stability.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_migrations/test_fix_file_operations.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_migrations/test_fix_idempotency_workflow.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_migrations/test_schema_migration.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_migrations/test_upgrade_downgrade_versions.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_storage/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/integration/test_storage/test_storage_integration.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/conftest.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/conftest.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_adapter_implementations.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_adbc/test_adbc_serialization.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_async_adapters.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_asyncmy/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_asyncmy/test_config.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_asyncpg/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_asyncpg/test_cloud_connectors.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_asyncpg/test_config.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_asyncpg/test_type_handlers.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_bigquery/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_bigquery/test_config.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_bigquery/test_parameters.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_duckdb/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_duckdb/test_config.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_duckdb/test_type_converter.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_oracledb/test_adk_store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_oracledb/test_numpy_handlers.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_oracledb/test_type_converter_vectors.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_psqlpy/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_psqlpy/test_config.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_psycopg/test_config.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_psycopg/test_type_handlers.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_sqlite/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_sqlite/test_type_handlers.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_adapters/test_sync_adapters.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_arrow_helpers.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_arrow_result.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_base/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_base/test_sql_integration.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_base/test_sqlspec_class.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_builder/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_builder/test_copy_helpers.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_builder/test_dialect_override.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_builder/test_insert_builder.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_builder/test_lateral_joins.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_builder/test_merge.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_builder/test_merge_dialect_validation.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_builder/test_merge_property_shorthand.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_builder/test_parameter_naming.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_builder/test_select_locking.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_builder/test_to_sql.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_builder/test_to_sql_edge_cases.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_builder/test_upsert_factory.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_builder/test_upsert_factory_edge_cases.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_builder_parameter_naming.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_cli/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_cli/test_config_loading.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_cli/test_shell_completion.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_config/test_migration_methods.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_config/test_storage_capabilities.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_core/test_cache.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_core/test_compiler.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_core/test_filters.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_core/test_hashing.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_core/test_parameter_regex_performance.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_core/test_parameters.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_core/test_statement.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_cte_parameter_collisions.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_driver/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_driver/test_data_dictionary.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_driver/test_result_tools.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_extensions/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_extensions/test_fastapi/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_extensions/test_fastapi/test_extension.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_extensions/test_fastapi/test_providers.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_extensions/test_flask/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_extensions/test_flask/test_extension.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_extensions/test_flask/test_state.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_extensions/test_litestar/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_extensions/test_starlette/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_extensions/test_starlette/test_config_state.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_extensions/test_starlette/test_extension.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_extensions/test_starlette/test_utils.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_loader/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_loader/test_cache_integration.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_loader/test_fixtures_directory_loading.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_loader/test_loading_patterns.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_loader/test_sql_file_loader.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_migration_context.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_migrations/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_migrations/test_checksum_canonicalization.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_migrations/test_extension_discovery.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_migrations/test_fix_regex_precision.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_migrations/test_migration.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_migrations/test_migration_commands.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_migrations/test_migration_context.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_migrations/test_migration_execution.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_migrations/test_null_handling_fixes.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_migrations/test_tracker_idempotency.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_migrations/test_validation.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_migrations/test_version.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_migrations/test_version_conversion.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_migrations/test_version_parsing_edge_cases.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_parsing_utils.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_serialization.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_sql_factory.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_storage/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_storage/test_errors.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_storage/test_fsspec_backend.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_storage/test_local_store.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_storage/test_obstore_backend.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_storage/test_storage_registry.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_storage/test_storage_utils.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_storage_bridge.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_type_conversion.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_utils/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_utils/test_correlation.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_utils/test_data_transformation.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_utils/test_dependencies.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_utils/test_deprecation.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_utils/test_fixtures.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_utils/test_logging.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_utils/test_module_loader.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_utils/test_serializers.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_utils/test_singleton.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_utils/test_sync_tools.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_utils/test_text.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_utils/test_type_guards.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tests/unit/test_where_or_operations.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tools/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tools/build_docs.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tools/fix_documentation.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tools/local-infra.sh +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tools/pypi_readme.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tools/sphinx_ext/__init__.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tools/sphinx_ext/changelog.py +0 -0
- {sqlspec-0.29.0 → sqlspec-0.30.0}/tools/sphinx_ext/missing_references.py +0 -0
|
@@ -17,7 +17,7 @@ repos:
|
|
|
17
17
|
- id: mixed-line-ending
|
|
18
18
|
- id: trailing-whitespace
|
|
19
19
|
- repo: https://github.com/charliermarsh/ruff-pre-commit
|
|
20
|
-
rev: "v0.14.
|
|
20
|
+
rev: "v0.14.5"
|
|
21
21
|
hooks:
|
|
22
22
|
- id: ruff
|
|
23
23
|
args: ["--fix"]
|
|
@@ -43,6 +43,7 @@ repos:
|
|
|
43
43
|
rev: "v1.0.1"
|
|
44
44
|
hooks:
|
|
45
45
|
- id: sphinx-lint
|
|
46
|
+
args: ["--jobs", "1"]
|
|
46
47
|
- repo: local
|
|
47
48
|
hooks:
|
|
48
49
|
- id: pypi-readme
|
|
@@ -185,6 +185,25 @@ SQLSpec is a type-safe SQL query mapper designed for minimal abstraction between
|
|
|
185
185
|
- **Single-Pass Processing**: Parse once → transform once → validate once - SQL object is single source of truth
|
|
186
186
|
- **Abstract Methods with Concrete Implementations**: Protocol defines abstract methods, base classes provide concrete sync/async implementations
|
|
187
187
|
|
|
188
|
+
### Query Stack Implementation Guidelines
|
|
189
|
+
|
|
190
|
+
- **Builder Discipline**
|
|
191
|
+
- `StatementStack` and `StackOperation` are immutable (`__slots__`, tuple storage). Every push helper returns a new stack; never mutate `_operations` in place.
|
|
192
|
+
- Validate inputs at push time (non-empty SQL, execute_many payloads, reject nested stacks) so drivers can assume well-formed operations.
|
|
193
|
+
- **Adapter Responsibilities**
|
|
194
|
+
- Add a single capability gate per adapter (e.g., Oracle pipeline version check, `psycopg.capabilities.has_pipeline()`), return `super().execute_stack()` immediately when unsupported.
|
|
195
|
+
- Preserve `StackResult.result` by building SQL/Arrow results via `create_sql_result()` / `create_arrow_result()` instead of copying row data.
|
|
196
|
+
- Honor manual toggles via `driver_features={"stack_native_disabled": True}` and document the behavior in the adapter guide.
|
|
197
|
+
- **Telemetry + Tracing**
|
|
198
|
+
- Always wrap adapter overrides with `StackExecutionObserver(self, stack, continue_on_error, native_pipeline=bool)`.
|
|
199
|
+
- Do **not** emit duplicate metrics; the observer already increments `stack.execute.*`, logs `stack.execute.start/complete/failed`, and publishes the `sqlspec.stack.execute` span.
|
|
200
|
+
- **Error Handling**
|
|
201
|
+
- Wrap driver exceptions in `StackExecutionError` with `operation_index`, summarized SQL (`describe_stack_statement()`), adapter name, and execution mode.
|
|
202
|
+
- Continue-on-error stacks append `StackResult.from_error()` and keep executing. Fail-fast stacks roll back (if they started the transaction) before re-raising the wrapped error.
|
|
203
|
+
- **Testing Expectations**
|
|
204
|
+
- Add integration tests under `tests/integration/test_adapters/<adapter>/test_driver.py::test_*statement_stack*` that cover native path, sequential fallback, and continue-on-error.
|
|
205
|
+
- Guard base behavior (empty stacks, large stacks, transaction boundaries) via `tests/integration/test_stack_edge_cases.py`.
|
|
206
|
+
|
|
188
207
|
### Driver Parameter Profile Registry
|
|
189
208
|
|
|
190
209
|
- All adapter parameter defaults live in `DriverParameterProfile` entries inside `sqlspec/core/parameters.py`.
|
|
@@ -507,6 +526,23 @@ When processing user input that may be incomplete or malformed, use a two-tier a
|
|
|
507
526
|
|
|
508
527
|
**Implementation Pattern:**
|
|
509
528
|
|
|
529
|
+
## Recent edit: Configuration examples (2025-11-04)
|
|
530
|
+
|
|
531
|
+
- Updated docs/examples/usage examples: consolidated example filenames to
|
|
532
|
+
docs/examples/usage/test_configuration_*.py and ensured the documentation
|
|
533
|
+
references match the renamed examples.
|
|
534
|
+
- Added an explicit :lines: range and a :dedent: directive to the
|
|
535
|
+
literalinclude for test_configuration_23.py so Sphinx renders the snippet
|
|
536
|
+
with correct indentation.
|
|
537
|
+
- Built the Sphinx documentation (make docs) and verified HTML output was
|
|
538
|
+
generated successfully. Two minor warnings were reported (dedent and a
|
|
539
|
+
missing stylesheet copy) but they did not prevent the build.
|
|
540
|
+
- Updated project TODOs to reflect completed steps.
|
|
541
|
+
|
|
542
|
+
This summary documents the small documentation and example maintenance
|
|
543
|
+
performed on the configuration usage guide and can be expanded into a
|
|
544
|
+
longer changelog entry if desired.
|
|
545
|
+
|
|
510
546
|
```python
|
|
511
547
|
def parse_user_input(content: str, source: str) -> "dict[str, Result]":
|
|
512
548
|
"""Parse user input with two-tier error handling.
|
|
@@ -2025,6 +2061,14 @@ class GoodDriverFeatures(TypedDict):
|
|
|
2025
2061
|
|
|
2026
2062
|
### Compliance Table
|
|
2027
2063
|
|
|
2064
|
+
### Change log: configuration examples
|
|
2065
|
+
|
|
2066
|
+
- Renamed documentation example references to use docs/examples/usage/test_configuration_*.py
|
|
2067
|
+
- Added explicit :lines: ranges and :dedent: directive for the literalinclude at the top of docs/usage/configuration.rst
|
|
2068
|
+
- Rebuilt documentation to verify the changes (make docs). Build completed with 2 warnings about dedent and a missing stylesheet; output HTML written to docs/_build/html
|
|
2069
|
+
|
|
2070
|
+
### Compliance Table
|
|
2071
|
+
|
|
2028
2072
|
Current state of all adapters (as of type-cleanup branch):
|
|
2029
2073
|
|
|
2030
2074
|
| Adapter | TypedDict | Auto-Detect | enable_ Prefix | Defaults | Grade | Notes |
|
sqlspec-0.30.0/PKG-INFO
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: sqlspec
|
|
3
|
+
Version: 0.30.0
|
|
4
|
+
Summary: SQL Experiments in Python
|
|
5
|
+
Project-URL: Discord, https://discord.gg/litestar
|
|
6
|
+
Project-URL: Issue, https://github.com/litestar-org/sqlspec/issues/
|
|
7
|
+
Project-URL: Source, https://github.com/litestar-org/sqlspec
|
|
8
|
+
Author-email: Cody Fincher <cody@litestar.dev>
|
|
9
|
+
Maintainer-email: Litestar Developers <hello@litestar.dev>
|
|
10
|
+
License-Expression: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Requires-Python: <4.0,>=3.10
|
|
13
|
+
Requires-Dist: mypy-extensions
|
|
14
|
+
Requires-Dist: rich-click
|
|
15
|
+
Requires-Dist: sqlglot>=19.9.0
|
|
16
|
+
Requires-Dist: typing-extensions
|
|
17
|
+
Provides-Extra: adbc
|
|
18
|
+
Requires-Dist: adbc-driver-manager; extra == 'adbc'
|
|
19
|
+
Requires-Dist: pyarrow; extra == 'adbc'
|
|
20
|
+
Provides-Extra: adk
|
|
21
|
+
Requires-Dist: google-adk; extra == 'adk'
|
|
22
|
+
Provides-Extra: aioodbc
|
|
23
|
+
Requires-Dist: aioodbc; extra == 'aioodbc'
|
|
24
|
+
Provides-Extra: aiosql
|
|
25
|
+
Requires-Dist: aiosql; extra == 'aiosql'
|
|
26
|
+
Provides-Extra: aiosqlite
|
|
27
|
+
Requires-Dist: aiosqlite; extra == 'aiosqlite'
|
|
28
|
+
Provides-Extra: alloydb
|
|
29
|
+
Requires-Dist: google-cloud-alloydb-connector; extra == 'alloydb'
|
|
30
|
+
Provides-Extra: asyncmy
|
|
31
|
+
Requires-Dist: asyncmy; extra == 'asyncmy'
|
|
32
|
+
Provides-Extra: asyncpg
|
|
33
|
+
Requires-Dist: asyncpg; extra == 'asyncpg'
|
|
34
|
+
Provides-Extra: attrs
|
|
35
|
+
Requires-Dist: attrs; extra == 'attrs'
|
|
36
|
+
Requires-Dist: cattrs; extra == 'attrs'
|
|
37
|
+
Provides-Extra: bigquery
|
|
38
|
+
Requires-Dist: google-cloud-bigquery; extra == 'bigquery'
|
|
39
|
+
Requires-Dist: google-cloud-storage; extra == 'bigquery'
|
|
40
|
+
Provides-Extra: cli
|
|
41
|
+
Requires-Dist: rich-click; extra == 'cli'
|
|
42
|
+
Provides-Extra: cloud-sql
|
|
43
|
+
Requires-Dist: cloud-sql-python-connector; extra == 'cloud-sql'
|
|
44
|
+
Provides-Extra: duckdb
|
|
45
|
+
Requires-Dist: duckdb; extra == 'duckdb'
|
|
46
|
+
Provides-Extra: fastapi
|
|
47
|
+
Requires-Dist: fastapi; extra == 'fastapi'
|
|
48
|
+
Provides-Extra: flask
|
|
49
|
+
Requires-Dist: flask; extra == 'flask'
|
|
50
|
+
Provides-Extra: fsspec
|
|
51
|
+
Requires-Dist: fsspec; extra == 'fsspec'
|
|
52
|
+
Provides-Extra: litestar
|
|
53
|
+
Requires-Dist: litestar; extra == 'litestar'
|
|
54
|
+
Provides-Extra: msgspec
|
|
55
|
+
Requires-Dist: msgspec; extra == 'msgspec'
|
|
56
|
+
Provides-Extra: mypyc
|
|
57
|
+
Provides-Extra: nanoid
|
|
58
|
+
Requires-Dist: fastnanoid>=0.4.1; extra == 'nanoid'
|
|
59
|
+
Provides-Extra: obstore
|
|
60
|
+
Requires-Dist: obstore; extra == 'obstore'
|
|
61
|
+
Provides-Extra: opentelemetry
|
|
62
|
+
Requires-Dist: opentelemetry-instrumentation; extra == 'opentelemetry'
|
|
63
|
+
Provides-Extra: oracledb
|
|
64
|
+
Requires-Dist: oracledb; extra == 'oracledb'
|
|
65
|
+
Provides-Extra: orjson
|
|
66
|
+
Requires-Dist: orjson; extra == 'orjson'
|
|
67
|
+
Provides-Extra: pandas
|
|
68
|
+
Requires-Dist: pandas; extra == 'pandas'
|
|
69
|
+
Requires-Dist: pyarrow; extra == 'pandas'
|
|
70
|
+
Provides-Extra: performance
|
|
71
|
+
Requires-Dist: msgspec; extra == 'performance'
|
|
72
|
+
Requires-Dist: sqlglot[rs]; extra == 'performance'
|
|
73
|
+
Provides-Extra: polars
|
|
74
|
+
Requires-Dist: polars; extra == 'polars'
|
|
75
|
+
Requires-Dist: pyarrow; extra == 'polars'
|
|
76
|
+
Provides-Extra: prometheus
|
|
77
|
+
Requires-Dist: prometheus-client; extra == 'prometheus'
|
|
78
|
+
Provides-Extra: psqlpy
|
|
79
|
+
Requires-Dist: psqlpy; extra == 'psqlpy'
|
|
80
|
+
Provides-Extra: psycopg
|
|
81
|
+
Requires-Dist: psycopg[binary,pool]; extra == 'psycopg'
|
|
82
|
+
Provides-Extra: pydantic
|
|
83
|
+
Requires-Dist: pydantic; extra == 'pydantic'
|
|
84
|
+
Requires-Dist: pydantic-extra-types; extra == 'pydantic'
|
|
85
|
+
Provides-Extra: pymssql
|
|
86
|
+
Requires-Dist: pymssql; extra == 'pymssql'
|
|
87
|
+
Provides-Extra: pymysql
|
|
88
|
+
Requires-Dist: pymysql; extra == 'pymysql'
|
|
89
|
+
Provides-Extra: spanner
|
|
90
|
+
Requires-Dist: google-cloud-spanner; extra == 'spanner'
|
|
91
|
+
Provides-Extra: uuid
|
|
92
|
+
Requires-Dist: uuid-utils; extra == 'uuid'
|
|
93
|
+
Description-Content-Type: text/markdown
|
|
94
|
+
|
|
95
|
+
# SQLSpec
|
|
96
|
+
|
|
97
|
+
**Type-safe SQL execution layer for Python.**
|
|
98
|
+
|
|
99
|
+
SQLSpec handles database connectivity and result mapping so you can focus on SQL. Write raw queries when you need precision, use the builder API when you need composability, or load SQL from files when you need organization. Every statement passes through a [sqlglot](https://github.com/tobymao/sqlglot)-powered AST pipeline for validation, dialect conversion, and optimization before execution. Export results as Python objects, Arrow tables, Polars or pandas DataFrames.
|
|
100
|
+
|
|
101
|
+
It's not an ORM. It's the connectivity and processing layer between your application and your database that provides the right abstraction for each situation without dictating how you write SQL.
|
|
102
|
+
|
|
103
|
+
## Status
|
|
104
|
+
|
|
105
|
+
SQLSpec is currently in active development. The public API may change. Follow the [docs](https://sqlspec.dev/) and changelog for updates.
|
|
106
|
+
|
|
107
|
+
## What You Get
|
|
108
|
+
|
|
109
|
+
**Connection Management**
|
|
110
|
+
|
|
111
|
+
- Connection pooling with configurable size, timeout, and lifecycle hooks
|
|
112
|
+
- Sync and async support with a unified API surface
|
|
113
|
+
- Adapters for PostgreSQL (psycopg, asyncpg, psqlpy), SQLite (sqlite3, aiosqlite), DuckDB, MySQL (asyncmy), Oracle, BigQuery, and ADBC-compatible databases
|
|
114
|
+
|
|
115
|
+
**Query Execution**
|
|
116
|
+
|
|
117
|
+
- Raw SQL strings with automatic parameter binding and dialect translation
|
|
118
|
+
- SQL AST parsing via sqlglot for validation, optimization, and dialect conversion
|
|
119
|
+
- Builder API for programmatic query construction without string concatenation
|
|
120
|
+
- SQL file loading to keep queries organized alongside your code (aiosql-style)
|
|
121
|
+
- Statement stacks for batching multiple operations with transaction control
|
|
122
|
+
|
|
123
|
+
**Result Handling**
|
|
124
|
+
|
|
125
|
+
- Type-safe result mapping to Pydantic, msgspec, attrs, or dataclasses
|
|
126
|
+
- Apache Arrow export for zero-copy integration with pandas, Polars, and analytical tools
|
|
127
|
+
- Result iteration, single-row fetch, or bulk retrieval based on your use case
|
|
128
|
+
|
|
129
|
+
**Framework Integration**
|
|
130
|
+
|
|
131
|
+
- Litestar plugin with dependency injection for connections, sessions, and pools
|
|
132
|
+
- Starlette/FastAPI middleware for automatic transaction management
|
|
133
|
+
- Flask extension with sync/async portal support
|
|
134
|
+
|
|
135
|
+
**Production Features**
|
|
136
|
+
|
|
137
|
+
- SQL validation and caching via sqlglot AST parsing
|
|
138
|
+
- OpenTelemetry and Prometheus instrumentation hooks
|
|
139
|
+
- Structured logging with correlation ID support
|
|
140
|
+
- Migration CLI for schema versioning
|
|
141
|
+
|
|
142
|
+
## Quick Start
|
|
143
|
+
|
|
144
|
+
### Install
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
pip install "sqlspec"
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Run your first query
|
|
151
|
+
|
|
152
|
+
```python
|
|
153
|
+
from pydantic import BaseModel
|
|
154
|
+
from sqlspec import SQLSpec
|
|
155
|
+
from sqlspec.adapters.sqlite import SqliteConfig
|
|
156
|
+
|
|
157
|
+
class Greeting(BaseModel):
|
|
158
|
+
message: str
|
|
159
|
+
|
|
160
|
+
spec = SQLSpec()
|
|
161
|
+
db = sql.add_config(SqliteConfig(pool_config={"database": ":memory:"}))
|
|
162
|
+
|
|
163
|
+
with spec.provide_session(db) as session:
|
|
164
|
+
greeting = session.select_one(
|
|
165
|
+
"SELECT 'Hello, SQLSpec!' AS message",
|
|
166
|
+
schema_type=Greeting,
|
|
167
|
+
)
|
|
168
|
+
print(greeting.message) # Output: Hello, SQLSpec!
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
That's it. Write SQL, define a schema, get typed objects back. Connection pooling, parameter binding, and result mapping are handled automatically.
|
|
172
|
+
|
|
173
|
+
See the [Getting Started guide](https://sqlspec.dev/getting_started/) for installation variants, adapter selection, and advanced result mapping options.
|
|
174
|
+
|
|
175
|
+
## Documentation
|
|
176
|
+
|
|
177
|
+
- [Getting Started](https://sqlspec.dev/getting_started/)
|
|
178
|
+
- [Usage Guides](https://sqlspec.dev/usage/)
|
|
179
|
+
- [Examples Gallery](https://sqlspec.dev/examples/)
|
|
180
|
+
- [API Reference](https://sqlspec.dev/reference/)
|
|
181
|
+
- [CLI Reference](https://sqlspec.dev/usage/cli.html)
|
|
182
|
+
|
|
183
|
+
## Reference Applications
|
|
184
|
+
|
|
185
|
+
- **[PostgreSQL + Vertex AI Demo](https://github.com/cofin/postgres-vertexai-demo)** - Vector search with pgvector and real-time chat using Litestar and Google ADK. Shows connection pooling, migrations, type-safe result mapping, vector embeddings, and response caching.
|
|
186
|
+
- **[Oracle + Vertex AI Demo](https://github.com/cofin/oracledb-vertexai-demo)** - Oracle 23ai vector search with semantic similarity using HNSW indexes. Demonstrates NumPy array conversion, large object (CLOB) handling, and real-time performance metrics.
|
|
187
|
+
|
|
188
|
+
See the [usage docs](https://sqlspec.dev/usage/) for detailed guides on adapters, configuration patterns, and features like the [SQL file loader](https://sqlspec.dev/usage/loader.html).
|
|
189
|
+
|
|
190
|
+
## Built With
|
|
191
|
+
|
|
192
|
+
- **[sqlglot](https://github.com/tobymao/sqlglot)** - SQL parser, transpiler, and optimizer powering SQLSpec's AST pipeline
|
|
193
|
+
|
|
194
|
+
## Contributing
|
|
195
|
+
|
|
196
|
+
Contributions, issue reports, and adapter ideas are welcome. Review the
|
|
197
|
+
[contributor guide](https://sqlspec.dev/contributing/) and follow the project
|
|
198
|
+
coding standards before opening a pull request.
|
|
199
|
+
|
|
200
|
+
## License
|
|
201
|
+
|
|
202
|
+
SQLSpec is distributed under the MIT License.
|
sqlspec-0.30.0/README.md
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# SQLSpec
|
|
2
|
+
|
|
3
|
+
**Type-safe SQL execution layer for Python.**
|
|
4
|
+
|
|
5
|
+
SQLSpec handles database connectivity and result mapping so you can focus on SQL. Write raw queries when you need precision, use the builder API when you need composability, or load SQL from files when you need organization. Every statement passes through a [sqlglot](https://github.com/tobymao/sqlglot)-powered AST pipeline for validation, dialect conversion, and optimization before execution. Export results as Python objects, Arrow tables, Polars or pandas DataFrames.
|
|
6
|
+
|
|
7
|
+
It's not an ORM. It's the connectivity and processing layer between your application and your database that provides the right abstraction for each situation without dictating how you write SQL.
|
|
8
|
+
|
|
9
|
+
## Status
|
|
10
|
+
|
|
11
|
+
SQLSpec is currently in active development. The public API may change. Follow the [docs](https://sqlspec.dev/) and changelog for updates.
|
|
12
|
+
|
|
13
|
+
## What You Get
|
|
14
|
+
|
|
15
|
+
**Connection Management**
|
|
16
|
+
|
|
17
|
+
- Connection pooling with configurable size, timeout, and lifecycle hooks
|
|
18
|
+
- Sync and async support with a unified API surface
|
|
19
|
+
- Adapters for PostgreSQL (psycopg, asyncpg, psqlpy), SQLite (sqlite3, aiosqlite), DuckDB, MySQL (asyncmy), Oracle, BigQuery, and ADBC-compatible databases
|
|
20
|
+
|
|
21
|
+
**Query Execution**
|
|
22
|
+
|
|
23
|
+
- Raw SQL strings with automatic parameter binding and dialect translation
|
|
24
|
+
- SQL AST parsing via sqlglot for validation, optimization, and dialect conversion
|
|
25
|
+
- Builder API for programmatic query construction without string concatenation
|
|
26
|
+
- SQL file loading to keep queries organized alongside your code (aiosql-style)
|
|
27
|
+
- Statement stacks for batching multiple operations with transaction control
|
|
28
|
+
|
|
29
|
+
**Result Handling**
|
|
30
|
+
|
|
31
|
+
- Type-safe result mapping to Pydantic, msgspec, attrs, or dataclasses
|
|
32
|
+
- Apache Arrow export for zero-copy integration with pandas, Polars, and analytical tools
|
|
33
|
+
- Result iteration, single-row fetch, or bulk retrieval based on your use case
|
|
34
|
+
|
|
35
|
+
**Framework Integration**
|
|
36
|
+
|
|
37
|
+
- Litestar plugin with dependency injection for connections, sessions, and pools
|
|
38
|
+
- Starlette/FastAPI middleware for automatic transaction management
|
|
39
|
+
- Flask extension with sync/async portal support
|
|
40
|
+
|
|
41
|
+
**Production Features**
|
|
42
|
+
|
|
43
|
+
- SQL validation and caching via sqlglot AST parsing
|
|
44
|
+
- OpenTelemetry and Prometheus instrumentation hooks
|
|
45
|
+
- Structured logging with correlation ID support
|
|
46
|
+
- Migration CLI for schema versioning
|
|
47
|
+
|
|
48
|
+
## Quick Start
|
|
49
|
+
|
|
50
|
+
### Install
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
pip install "sqlspec"
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Run your first query
|
|
57
|
+
|
|
58
|
+
```python
|
|
59
|
+
from pydantic import BaseModel
|
|
60
|
+
from sqlspec import SQLSpec
|
|
61
|
+
from sqlspec.adapters.sqlite import SqliteConfig
|
|
62
|
+
|
|
63
|
+
class Greeting(BaseModel):
|
|
64
|
+
message: str
|
|
65
|
+
|
|
66
|
+
spec = SQLSpec()
|
|
67
|
+
db = sql.add_config(SqliteConfig(pool_config={"database": ":memory:"}))
|
|
68
|
+
|
|
69
|
+
with spec.provide_session(db) as session:
|
|
70
|
+
greeting = session.select_one(
|
|
71
|
+
"SELECT 'Hello, SQLSpec!' AS message",
|
|
72
|
+
schema_type=Greeting,
|
|
73
|
+
)
|
|
74
|
+
print(greeting.message) # Output: Hello, SQLSpec!
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
That's it. Write SQL, define a schema, get typed objects back. Connection pooling, parameter binding, and result mapping are handled automatically.
|
|
78
|
+
|
|
79
|
+
See the [Getting Started guide](https://sqlspec.dev/getting_started/) for installation variants, adapter selection, and advanced result mapping options.
|
|
80
|
+
|
|
81
|
+
## Documentation
|
|
82
|
+
|
|
83
|
+
- [Getting Started](https://sqlspec.dev/getting_started/)
|
|
84
|
+
- [Usage Guides](https://sqlspec.dev/usage/)
|
|
85
|
+
- [Examples Gallery](https://sqlspec.dev/examples/)
|
|
86
|
+
- [API Reference](https://sqlspec.dev/reference/)
|
|
87
|
+
- [CLI Reference](https://sqlspec.dev/usage/cli.html)
|
|
88
|
+
|
|
89
|
+
## Reference Applications
|
|
90
|
+
|
|
91
|
+
- **[PostgreSQL + Vertex AI Demo](https://github.com/cofin/postgres-vertexai-demo)** - Vector search with pgvector and real-time chat using Litestar and Google ADK. Shows connection pooling, migrations, type-safe result mapping, vector embeddings, and response caching.
|
|
92
|
+
- **[Oracle + Vertex AI Demo](https://github.com/cofin/oracledb-vertexai-demo)** - Oracle 23ai vector search with semantic similarity using HNSW indexes. Demonstrates NumPy array conversion, large object (CLOB) handling, and real-time performance metrics.
|
|
93
|
+
|
|
94
|
+
See the [usage docs](https://sqlspec.dev/usage/) for detailed guides on adapters, configuration patterns, and features like the [SQL file loader](https://sqlspec.dev/usage/loader.html).
|
|
95
|
+
|
|
96
|
+
## Built With
|
|
97
|
+
|
|
98
|
+
- **[sqlglot](https://github.com/tobymao/sqlglot)** - SQL parser, transpiler, and optimizer powering SQLSpec's AST pipeline
|
|
99
|
+
|
|
100
|
+
## Contributing
|
|
101
|
+
|
|
102
|
+
Contributions, issue reports, and adapter ideas are welcome. Review the
|
|
103
|
+
[contributor guide](https://sqlspec.dev/contributing/) and follow the project
|
|
104
|
+
coding standards before opening a pull request.
|
|
105
|
+
|
|
106
|
+
## License
|
|
107
|
+
|
|
108
|
+
SQLSpec is distributed under the MIT License.
|
|
@@ -7,7 +7,7 @@ maintainers = [{ name = "Litestar Developers", email = "hello@litestar.dev" }]
|
|
|
7
7
|
name = "sqlspec"
|
|
8
8
|
readme = "README.md"
|
|
9
9
|
requires-python = ">=3.10, <4.0"
|
|
10
|
-
version = "0.
|
|
10
|
+
version = "0.30.0"
|
|
11
11
|
|
|
12
12
|
[project.urls]
|
|
13
13
|
Discord = "https://discord.gg/litestar"
|
|
@@ -179,13 +179,21 @@ include = [
|
|
|
179
179
|
"sqlspec/utils/fixtures.py", # File fixture loading
|
|
180
180
|
"sqlspec/utils/data_transformation.py", # Data transformation utilities
|
|
181
181
|
|
|
182
|
+
# === OBSERVABILITY ===
|
|
183
|
+
"sqlspec/observability/_config.py",
|
|
184
|
+
"sqlspec/observability/_diagnostics.py",
|
|
185
|
+
"sqlspec/observability/_dispatcher.py",
|
|
186
|
+
"sqlspec/observability/_observer.py",
|
|
187
|
+
"sqlspec/observability/_runtime.py",
|
|
188
|
+
"sqlspec/observability/_spans.py",
|
|
189
|
+
|
|
182
190
|
# === STORAGE LAYER ===
|
|
183
|
-
"sqlspec/storage/_utils.py",
|
|
184
|
-
"sqlspec/storage/registry.py",
|
|
185
|
-
"sqlspec/storage/backends/base.py",
|
|
186
|
-
"sqlspec/storage/backends/obstore.py",
|
|
187
|
-
"sqlspec/storage/backends/fsspec.py",
|
|
188
|
-
"sqlspec/storage/backends/local.py",
|
|
191
|
+
# "sqlspec/storage/_utils.py",
|
|
192
|
+
# "sqlspec/storage/registry.py",
|
|
193
|
+
# "sqlspec/storage/backends/base.py",
|
|
194
|
+
# "sqlspec/storage/backends/obstore.py",
|
|
195
|
+
# "sqlspec/storage/backends/fsspec.py",
|
|
196
|
+
# "sqlspec/storage/backends/local.py",
|
|
189
197
|
]
|
|
190
198
|
mypy-args = [
|
|
191
199
|
"--ignore-missing-imports",
|
|
@@ -209,7 +217,7 @@ opt_level = "3" # Maximum optimization (0-3)
|
|
|
209
217
|
allow_dirty = true
|
|
210
218
|
commit = false
|
|
211
219
|
commit_args = "--no-verify"
|
|
212
|
-
current_version = "0.
|
|
220
|
+
current_version = "0.30.0"
|
|
213
221
|
ignore_missing_files = false
|
|
214
222
|
ignore_missing_version = false
|
|
215
223
|
message = "chore(release): bump to v{new_version}"
|
|
@@ -322,7 +330,8 @@ markers = [
|
|
|
322
330
|
"pymysql: marks tests using pymysql",
|
|
323
331
|
"psqlpy: marks tests using psqlpy",
|
|
324
332
|
]
|
|
325
|
-
|
|
333
|
+
python_files = ["test_*.py", "quickstart_*.py", "usage_*.py"]
|
|
334
|
+
testpaths = ["tests", "docs/examples/quickstart", "docs/examples/usage"]
|
|
326
335
|
|
|
327
336
|
[tool.mypy]
|
|
328
337
|
exclude = ["tmp/", ".tmp/", ".bugs/"]
|
|
@@ -490,10 +499,11 @@ known-first-party = ["sqlspec", "tests"]
|
|
|
490
499
|
split-on-trailing-comma = false
|
|
491
500
|
|
|
492
501
|
[tool.ruff.lint.per-file-ignores]
|
|
493
|
-
"docs/**/*.*" = ["S", "B", "DTZ", "A", "TC", "ERA", "D", "RET", "PLW0127"]
|
|
502
|
+
"docs/**/*.*" = ["S", "B", "DTZ", "A", "TC", "ERA", "D", "RET", "PLW0127", "PLR2004"]
|
|
494
503
|
"docs/examples/**" = ["T201"]
|
|
495
504
|
"sqlspec/builder/mixins/**/*.*" = ["SLF001"]
|
|
496
505
|
"sqlspec/extensions/adk/converters.py" = ["S403"]
|
|
506
|
+
"sqlspec/migrations/utils.py" = ["S404"]
|
|
497
507
|
"tests/**/*.*" = [
|
|
498
508
|
"A",
|
|
499
509
|
"ARG",
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Docs & Example Alignment
|
|
2
|
+
|
|
3
|
+
## Why
|
|
4
|
+
|
|
5
|
+
- Keep literalincluded snippets in `docs/` authoritative and executable.
|
|
6
|
+
- Reduce drift between prose and runnable code by treating documentation examples as pytest cases.
|
|
7
|
+
|
|
8
|
+
## Workflow
|
|
9
|
+
|
|
10
|
+
1. Update the Python example under `docs/examples/...` first and keep it function-based (`def test_*`).
|
|
11
|
+
2. Refresh the corresponding ``literalinclude`` in the `.rst` file:
|
|
12
|
+
- Adjust `:lines:` and `:dedent:` ranges so the rendered snippet only shows the relevant part of the test.
|
|
13
|
+
- Mention any helper imports or context (e.g., `contextlib.suppress`) in nearby prose.
|
|
14
|
+
3. Re-run the targeted example tests locally and record failures that require external services (Postgres, etc.) so reviewers know what still needs coverage. Use helpers like `SQLSPEC_QUICKSTART_PG_*` to keep DSNs out of docs snippets.
|
|
15
|
+
4. When SQLite pooling is involved, use `tempfile.NamedTemporaryFile` (or `tmp_path`) to guarantee isolation. Delete any prior tables at the top of the example to keep re-runs deterministic.
|
|
16
|
+
5. Reference this checklist in PR descriptions whenever docs/examples are touched.
|
|
17
|
+
|
|
18
|
+
## Testing Command Examples
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
uv run pytest docs/examples/quickstart docs/examples/usage -q
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- `docs/examples/quickstart/conftest.py` sets `SQLSPEC_QUICKSTART_PG_*` from `pytest-databases` so `quickstart_5.py` stays copy/paste friendly in the docs.
|
|
25
|
+
- Usage samples are function-based (`usage_*.py`) and collected automatically because `python_files` now includes that pattern.
|
|
26
|
+
- Prefer smaller batches (per topic/section) to keep feedback loops fast.
|
|
27
|
+
|
|
28
|
+
## Review Checklist
|
|
29
|
+
|
|
30
|
+
- [ ] Example is function-based and runnable via pytest.
|
|
31
|
+
- [ ] Docs include/excerpt ranges match the function body.
|
|
32
|
+
- [ ] Tests were re-run or limitations were documented.
|
|
33
|
+
- [ ] Temporary SQLite files are used for pooled configs to avoid leakage between examples.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Query Stack Guide
|
|
2
|
+
|
|
3
|
+
Query Stack executes multiple SQL statements in a single driver call while preserving raw SQL semantics. Each stack is immutable, MyPy-friendly, and can be shared across asyncio tasks or worker threads without synchronization.
|
|
4
|
+
|
|
5
|
+
## When to Use Query Stack
|
|
6
|
+
|
|
7
|
+
- Multi-step workflows (audit insert + update + permission read) that would otherwise require multiple round-trips.
|
|
8
|
+
- Adapter-specific native pipelines (Oracle 23ai+, psycopg pipeline mode, asyncpg batch execution) where batching reduces latency.
|
|
9
|
+
- Sequential fallback adapters (SQLite, DuckDB, BigQuery, ADBC, AsyncMy) when you still want the ergonomic benefits of a single API call.
|
|
10
|
+
- Continue-on-error workflows that need to run every statement but report failures alongside successful operations.
|
|
11
|
+
|
|
12
|
+
## Building StatementStack Instances
|
|
13
|
+
|
|
14
|
+
1. Start with an empty stack: `stack = StatementStack()`.
|
|
15
|
+
2. Add operations via the push helpers (each returns a new instance):
|
|
16
|
+
- `.push_execute(sql, parameters, *, statement_config=None, **kwargs)`
|
|
17
|
+
- `.push_execute_many(sql, parameter_sets, *filters, statement_config=None, **kwargs)`
|
|
18
|
+
- `.push_execute_script(sql, *filters, statement_config=None, **kwargs)`
|
|
19
|
+
- `.push_execute_arrow(sql, *filters, statement_config=None, **kwargs)`
|
|
20
|
+
3. Use `.extend()` or `StatementStack.from_operations()` to combine stacks.
|
|
21
|
+
4. Store stacks at module scope or factory functions—the tuple-based storage makes them hashable and thread-safe.
|
|
22
|
+
|
|
23
|
+
## Execution Modes
|
|
24
|
+
|
|
25
|
+
`Session.execute_stack(stack, continue_on_error=False)` mirrors the driver’s transaction rules:
|
|
26
|
+
|
|
27
|
+
- **Fail-fast (default):** The driver creates a transaction if one is not already active. Any failure raises `StackExecutionError` and rolls back the transaction.
|
|
28
|
+
- **Continue-on-error:** Each operation commits immediately. Failures still raise `StackExecutionError`, but execution continues and the error is preserved on the corresponding `StackResult`.
|
|
29
|
+
|
|
30
|
+
When using adapters with native pipelines (Oracle, psycopg, asyncpg), continue-on-error downgrades to sequential mode if the native API cannot honor the semantics (e.g., psycopg pipeline requires fail-fast).
|
|
31
|
+
|
|
32
|
+
## Transaction Boundaries
|
|
33
|
+
|
|
34
|
+
- Existing transactions are respected—`execute_stack()` never commits or rolls back a transaction it did not create.
|
|
35
|
+
- For fail-fast stacks, drivers call `begin()`/`commit()` (or `rollback()` on error) only when no transaction is active.
|
|
36
|
+
- Continue-on-error uses commit/rollback hooks after each operation to keep the connection clean.
|
|
37
|
+
|
|
38
|
+
## Arrow Operations
|
|
39
|
+
|
|
40
|
+
`push_execute_arrow()` delegates to `select_to_arrow()` when the adapter implements Arrow support (DuckDB, BigQuery, ADBC, etc.). The returned `StackResult.result` is an `ArrowResult`, so downstream helpers like `to_pandas()` or `to_polars()` continue to work.
|
|
41
|
+
|
|
42
|
+
## Telemetry and Tracing
|
|
43
|
+
|
|
44
|
+
Every stack execution routes through `StackExecutionObserver`, which provides:
|
|
45
|
+
|
|
46
|
+
- `StackExecutionMetrics`: increments `stack.execute.*` counters (invocations, statements, partial errors, duration) for any observability runtime (built-in logger, OTLP exporter, Prometheus bridge, etc.).
|
|
47
|
+
- `sqlspec.stack.execute` tracing spans containing adapter, statement count, native pipeline flag, continue-on-error, and hashed SQL identifiers.
|
|
48
|
+
- Structured DEBUG/ERROR logs (`stack.execute.start`, `stack.execute.complete`, `stack.execute.failed`).
|
|
49
|
+
|
|
50
|
+
Adapters only need to report whether they used a native pipeline; the observer handles the rest.
|
|
51
|
+
|
|
52
|
+
## Troubleshooting
|
|
53
|
+
|
|
54
|
+
| Symptom | Cause | Fix |
|
|
55
|
+
| --- | --- | --- |
|
|
56
|
+
| `ValueError: Cannot execute an empty StatementStack` | Stack has zero operations | Ensure you push at least one statement before calling `execute_stack()` |
|
|
57
|
+
| `StackExecutionError(operation_index=1, ...)` | Driver error on a specific statement | Inspect `StackResult.error` to see the wrapped exception; use `StackResult.result` to inspect partial data |
|
|
58
|
+
| `push_execute_many` raising `TypeError` | Parameter payload not a sequence | Pass an actual list/tuple of parameter sets |
|
|
59
|
+
| Continue-on-error seems to run sequentially on psycopg | Psycopg pipeline mode does not support partial failures | Expected—SQLSpec downgrades to sequential mode automatically |
|
|
60
|
+
|
|
61
|
+
## Related Resources
|
|
62
|
+
|
|
63
|
+
- [Query Stack API Reference](/reference/query-stack)
|
|
64
|
+
- :doc:`/examples/patterns/stacks/query_stack_example`
|
|
65
|
+
- [Adapter Guides](/guides/adapters/) for native vs. fallback behavior per database
|
|
66
|
+
|
|
67
|
+
Use the new :doc:`/reference/query-stack` page for low-level API details and :doc:`/examples/patterns/stacks/query_stack_example` to see the end-to-end workflow.
|
|
@@ -29,11 +29,15 @@ from sqlspec.core import (
|
|
|
29
29
|
ParameterStyle,
|
|
30
30
|
ParameterStyleConfig,
|
|
31
31
|
SQLResult,
|
|
32
|
+
StackOperation,
|
|
33
|
+
StackResult,
|
|
32
34
|
Statement,
|
|
33
35
|
StatementConfig,
|
|
36
|
+
StatementStack,
|
|
34
37
|
)
|
|
35
38
|
from sqlspec.core import filters as filters
|
|
36
39
|
from sqlspec.driver import AsyncDriverAdapterBase, ExecutionResult, SyncDriverAdapterBase
|
|
40
|
+
from sqlspec.exceptions import StackExecutionError
|
|
37
41
|
from sqlspec.loader import SQLFile, SQLFileLoader
|
|
38
42
|
from sqlspec.typing import ConnectionT, PoolT, SchemaT, StatementParameters, SupportedSchemaModel
|
|
39
43
|
from sqlspec.utils.logging import suppress_erroneous_sqlglot_log_messages
|
|
@@ -70,9 +74,13 @@ __all__ = (
|
|
|
70
74
|
"SQLSpec",
|
|
71
75
|
"SchemaT",
|
|
72
76
|
"Select",
|
|
77
|
+
"StackExecutionError",
|
|
78
|
+
"StackOperation",
|
|
79
|
+
"StackResult",
|
|
73
80
|
"Statement",
|
|
74
81
|
"StatementConfig",
|
|
75
82
|
"StatementParameters",
|
|
83
|
+
"StatementStack",
|
|
76
84
|
"SupportedSchemaModel",
|
|
77
85
|
"SyncDatabaseConfig",
|
|
78
86
|
"SyncDriverAdapterBase",
|
|
@@ -568,6 +568,9 @@ except ImportError:
|
|
|
568
568
|
) -> Tracer:
|
|
569
569
|
return Tracer() # type: ignore[abstract] # pragma: no cover
|
|
570
570
|
|
|
571
|
+
def get_tracer_provider(self) -> Any: # pragma: no cover
|
|
572
|
+
return None
|
|
573
|
+
|
|
571
574
|
TracerProvider = type(None) # Shim for TracerProvider if needed elsewhere
|
|
572
575
|
StatusCode = type(None) # Shim for StatusCode
|
|
573
576
|
Status = type(None) # Shim for Status
|
|
@@ -600,6 +603,8 @@ except ImportError:
|
|
|
600
603
|
unit: str = "",
|
|
601
604
|
registry: Any = None,
|
|
602
605
|
ejemplar_fn: Any = None,
|
|
606
|
+
buckets: Any = None,
|
|
607
|
+
**_: Any,
|
|
603
608
|
) -> None:
|
|
604
609
|
return None
|
|
605
610
|
|