sqlty 0.3.0__tar.gz → 0.5.1__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.
- {sqlty-0.3.0 → sqlty-0.5.1}/PKG-INFO +25 -19
- {sqlty-0.3.0 → sqlty-0.5.1}/README.md +19 -14
- {sqlty-0.3.0 → sqlty-0.5.1}/pyproject.toml +31 -7
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/Cargo.lock +557 -12
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/Cargo.toml +10 -2
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-ext/Cargo.toml +2 -0
- sqlty-0.5.1/rust/crates/sqlty-ext/src/config.rs +132 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-ext/src/lib.rs +480 -24
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-ext/src/server.rs +37 -1
- sqlty-0.5.1/rust/crates/sqlty-format/Cargo.toml +19 -0
- sqlty-0.5.1/rust/crates/sqlty-format/src/lib.rs +269 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-lsp/Cargo.toml +4 -1
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-lsp/src/actions.rs +7 -7
- sqlty-0.5.1/rust/crates/sqlty-lsp/src/completion.rs +154 -0
- sqlty-0.5.1/rust/crates/sqlty-lsp/src/highlight.rs +100 -0
- sqlty-0.5.1/rust/crates/sqlty-lsp/src/hover.rs +41 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-lsp/src/lib.rs +218 -45
- sqlty-0.5.1/rust/crates/sqlty-lsp/src/tests.rs +905 -0
- sqlty-0.5.1/rust/crates/sqlty-lsp/src/uri.rs +33 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-lsp/src/worker.rs +41 -23
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-python/Cargo.toml +1 -0
- sqlty-0.5.1/rust/crates/sqlty-python/clippy.toml +34 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-python/src/checker.rs +171 -56
- sqlty-0.5.1/rust/crates/sqlty-python/src/config.rs +596 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-python/src/lib.rs +8 -0
- sqlty-0.5.1/rust/crates/sqlty-python/src/locate.rs +532 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-python/src/options.rs +3 -0
- sqlty-0.5.1/rust/crates/sqlty-python/src/params.rs +483 -0
- sqlty-0.5.1/rust/crates/sqlty-python/src/queries.rs +359 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-python/src/rewriter.rs +67 -13
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-python/src/rules.rs +24 -5
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-python/src/scan.rs +49 -2
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-python/src/tokens.rs +13 -4
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/build.rs +2 -0
- sqlty-0.5.1/rust/crates/sqlty-sql/clippy.toml +34 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/README.md +8 -6
- sqlty-0.5.1/rust/crates/sqlty-sql/rules/common/aggregates.inference.toml +111 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/common/arithmetic.inference.toml +9 -6
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/common/comparison.inference.toml +10 -5
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/common/concat.inference.toml +6 -4
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/common/conditional.inference.toml +4 -2
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/common/datetime.inference.toml +3 -3
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/common/json.inference.toml +11 -9
- sqlty-0.5.1/rust/crates/sqlty-sql/rules/common/math.inference.toml +21 -0
- sqlty-0.5.1/rust/crates/sqlty-sql/rules/common/strings.inference.toml +35 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/common/window.inference.toml +11 -5
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/compile.rs +44 -7
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/mysql/aggregates.inference.toml +5 -5
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/mysql/arithmetic.inference.toml +13 -13
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/mysql/bits.inference.toml +1 -1
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/mysql/comparison.inference.toml +3 -3
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/mysql/concat.inference.toml +1 -1
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/mysql/conditional.inference.toml +2 -2
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/mysql/datetime.inference.toml +15 -15
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/mysql/encryption.inference.toml +5 -5
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/mysql/json.inference.toml +11 -11
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/mysql/math.inference.toml +9 -9
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/mysql/misc.inference.toml +12 -12
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/mysql/spatial.inference.toml +13 -13
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/mysql/strings.inference.toml +24 -24
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/mysql/system.inference.toml +13 -13
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/admin.inference.toml +16 -16
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/aggregates.inference.toml +19 -19
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/arithmetic.inference.toml +54 -54
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/arrays.inference.toml +13 -13
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/binary.inference.toml +5 -5
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/comparison.inference.toml +2 -2
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/concat.inference.toml +7 -7
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/conditional.inference.toml +1 -1
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/datetime.inference.toml +14 -14
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/enums.inference.toml +2 -2
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/events.inference.toml +2 -2
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/extensions.inference.toml +3 -3
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/formatting.inference.toml +3 -3
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/geometry.inference.toml +19 -19
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/json.inference.toml +27 -27
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/math.inference.toml +10 -10
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/merge.inference.toml +1 -1
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/network.inference.toml +7 -7
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/ranges.inference.toml +15 -15
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/rows.inference.toml +1 -1
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/sequences.inference.toml +1 -1
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/series.inference.toml +2 -2
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/strings.inference.toml +11 -11
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/system.inference.toml +39 -39
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/textsearch.inference.toml +17 -17
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/uuid.inference.toml +3 -3
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/postgres/xml.inference.toml +6 -6
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/sqlite/aggregates.inference.toml +3 -3
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/sqlite/arithmetic.inference.toml +5 -5
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/sqlite/bitwise.inference.toml +2 -2
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/sqlite/datetime.inference.toml +4 -4
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/sqlite/fts.inference.toml +4 -4
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/sqlite/json.inference.toml +11 -11
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/sqlite/math.inference.toml +4 -4
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/sqlite/scalar.inference.toml +10 -10
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/sqlite/strings.inference.toml +1 -1
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/api.rs +23 -0
- sqlty-0.5.1/rust/crates/sqlty-sql/src/analyzer/complete.rs +969 -0
- sqlty-0.5.1/rust/crates/sqlty-sql/src/analyzer/databases.rs +195 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/dialect.rs +5 -0
- sqlty-0.5.1/rust/crates/sqlty-sql/src/analyzer/entities.rs +194 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/explain.rs +5 -3
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/expr.rs +11 -5
- sqlty-0.5.1/rust/crates/sqlty-sql/src/analyzer/fanout.rs +612 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/grouping.rs +1 -1
- sqlty-0.5.1/rust/crates/sqlty-sql/src/analyzer/hover.rs +428 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/inference.rs +55 -5
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/input.rs +35 -2
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/mod.rs +18 -3
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/narrowing.rs +40 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/nullability.rs +93 -8
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/params.rs +1 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/preprocess.rs +44 -1
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/query.rs +7 -1
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/resolve.rs +40 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/respell.rs +29 -1
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/scope.rs +21 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__expr__tests__literals_and_unary_operators.snap +1 -1
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/sql_type.rs +1 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/star_expand.rs +1 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/tests.rs +31 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/catalog/alter.rs +26 -2
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/catalog/columns.rs +21 -1
- sqlty-0.5.1/rust/crates/sqlty-sql/src/catalog/index.rs +531 -0
- sqlty-0.5.1/rust/crates/sqlty-sql/src/catalog/joins.rs +106 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/catalog/loader.rs +57 -3
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/catalog/mod.rs +119 -6
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/catalog/names.rs +8 -5
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/catalog/read.rs +58 -5
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/catalog/resolve.rs +50 -19
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/ddl.rs +16 -1
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/diagnostics.rs +36 -1
- sqlty-0.5.1/rust/crates/sqlty-sql/src/highlight.rs +370 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/lib.rs +3 -1
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/placeholders.rs +48 -23
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/tests/inference_compiler.rs +7 -3
- {sqlty-0.3.0 → sqlty-0.5.1}/skills/sqlty/SKILL.md +8 -8
- {sqlty-0.3.0 → sqlty-0.5.1}/skills/sqlty-adopt/SKILL.md +12 -7
- {sqlty-0.3.0 → sqlty-0.5.1}/skills/sqlty-breaking/SKILL.md +2 -2
- {sqlty-0.3.0 → sqlty-0.5.1}/skills/sqlty-check/SKILL.md +52 -9
- {sqlty-0.3.0 → sqlty-0.5.1}/skills/sqlty-ci/SKILL.md +7 -6
- {sqlty-0.3.0 → sqlty-0.5.1}/skills/sqlty-rewrite/SKILL.md +4 -4
- {sqlty-0.3.0 → sqlty-0.5.1}/skills/sqlty-server/SKILL.md +21 -7
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_breaking.py +121 -33
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_check.py +145 -26
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_cli.py +389 -31
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_config.py +187 -271
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_core.pyi +87 -2
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_decode.py +1 -1
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_drivers.py +151 -43
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_helpers.py +118 -45
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_json_types.py +0 -10
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_lint.py +45 -3
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_lsp_breaking.py +2 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_lsp_bridge.py +39 -3
- sqlty-0.5.1/src/sqlty/_queries.py +125 -0
- sqlty-0.5.1/src/sqlty/_sarif.py +74 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_snapshot.py +24 -7
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_source.py +25 -8
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_type_extractor/extract.py +8 -1
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_type_extractor/subtype.py +5 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_variants.py +20 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/core.py +283 -16
- sqlty-0.5.1/src/sqlty/lexer.py +74 -0
- sqlty-0.5.1/src/sqlty/rules/chasm-join.md +76 -0
- sqlty-0.5.1/src/sqlty/rules/entity-mismatch.md +66 -0
- sqlty-0.5.1/src/sqlty/rules/fanout-aggregate.md +101 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/param-count-mismatch.md +7 -4
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/param-type-mismatch.md +9 -6
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/select-star.md +2 -1
- sqlty-0.5.1/src/sqlty/rules/sqruff.md +56 -0
- sqlty-0.5.1/src/sqlty/rules/stale-rewrite.md +58 -0
- sqlty-0.5.1/src/sqlty/rules/unknown-database.md +30 -0
- sqlty-0.5.1/src/sqlty/rules/unproven-join.md +55 -0
- sqlty-0.3.0/rust/crates/sqlty-lsp/src/tests.rs +0 -436
- sqlty-0.3.0/rust/crates/sqlty-sql/rules/common/aggregates.inference.toml +0 -101
- sqlty-0.3.0/rust/crates/sqlty-sql/rules/common/math.inference.toml +0 -17
- sqlty-0.3.0/rust/crates/sqlty-sql/rules/common/strings.inference.toml +0 -33
- sqlty-0.3.0/src/sqlty/_param_types.py +0 -141
- sqlty-0.3.0/src/sqlty/rules/stale-rewrite.md +0 -33
- {sqlty-0.3.0 → sqlty-0.5.1}/LICENSE +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-ext/build.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-lsp/src/text.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-python/src/edit.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-python/src/fixer.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-python/src/template.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/Cargo.toml +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/rules/dialects.toml +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/dml.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/functions.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/hashing.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/json.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/literals.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/memo.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/merged_star.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/names.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/operators.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/pg_record_functions.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/planner_hints.sql +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/references.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/registry.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__dml__tests__returning_columns_in_queries.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__expr__tests__arrays_and_subscripts.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__expr__tests__case_expressions.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__expr__tests__casts.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__expr__tests__casts_without_a_schema_do_not_complain.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__expr__tests__composite_fields_and_json_access.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__expr__tests__misc_expressions.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__expr__tests__mysql_and_sqlite_expressions.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__functions__tests__aggregates_in_postgres.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__functions__tests__function_availability_differs_by_dialect.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__functions__tests__return_types_follow_the_argument.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__functions__tests__unknown_functions_are_untyped_and_explained.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__literals__tests__value_sets_flow_through_expressions.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__names__tests__column_names_follow_postgres_figure_colname.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__operators__tests__arithmetic_promotes_numbers_and_types_date_math.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__operators__tests__binary_operators_in_queries.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__operators__tests__common_type_follows_postgres_union_rules.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__operators__tests__division_differs_between_postgres_and_mysql.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__query__tests__column_names_come_from_the_first_branch.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__query__tests__ctes.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__query__tests__dialects_name_and_type_the_same_query_differently.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__query__tests__projection_forms.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__query__tests__recursive_ctes_settle_nullability.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__query__tests__set_operations_combine_nullability.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__query__tests__set_operations_unify_types.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__query__tests__statements_that_are_not_queries_have_no_columns.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__query__tests__unsupported_query_forms_are_explained.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__query__tests__values_lists.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__resolve__tests__ambiguous_names_are_reported_once_per_query.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__resolve__tests__cte_columns_are_resolved_like_tables.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__resolve__tests__names_are_not_judged_without_a_schema.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__resolve__tests__nullability_comes_from_the_declaration.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__resolve__tests__quoted_names_keep_their_case_in_postgres_only.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__resolve__tests__star_over_unreadable_sources_names_the_reason.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__resolve__tests__system_columns_exist_without_being_declared.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__resolve__tests__unknown_names_say_what_is_missing.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__resolve__tests__unqualified_names_resolve_to_the_first_source_that_has_them.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__scope__tests__correlated_subqueries_see_the_outer_scope.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__scope__tests__derived_tables_ctes_and_views.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__scope__tests__nullability_follows_the_join_kind.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__scope__tests__opaque_sources_explain_themselves.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__scope__tests__star_expansion_over_joins.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/snapshots/sqlty_sql__analyzer__scope__tests__table_names_fold_by_dialect.snap +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/suggest.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/table_functions.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/test_support.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/text_names.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/tokens.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/analyzer/typed.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/catalog/builtin_catalog.sql +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/catalog/pg_catalog_views.sql +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/json.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/src/values.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/rust/crates/sqlty-sql/tests/timing.rs +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/__init__.py +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/__main__.py +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_gitignore.py +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_json_shape.py +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_params.py +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_psycopg.py +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_type_extractor/__init__.py +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_type_extractor/_stdlib.py +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_type_extractor/ast_fields.py +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_type_extractor/compat.py +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_type_extractor/generic.py +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_type_extractor/info.py +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_type_extractor/pydantic_types.py +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_type_extractor/stdlib.py +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/_type_extractor/symbols.py +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/drivers/psycopg.py +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/magic.py +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/py.typed +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/ambiguous-column.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/column-count-mismatch.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/column-name-mismatch.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/column-type-mismatch.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/dynamic-query.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/fstring-skipped.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/inline-sql-comment.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/insert-missing-column.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/insert-value-count.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/json-shape-mismatch.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/literal-mismatch.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/mysql-sql-marker.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/narrow-type.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/nullable-mismatch.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/params-type-mismatch.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/redundant-literal.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/redundant-optional.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/select-star-no-schema.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/stale-type.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/tstring-skipped.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/typeddict-inheritance.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/typeddict-key-mismatch.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/unchecked-query.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/ungrouped-column.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/unknown-column.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/unknown-function.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/unknown-table.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/unknown-type.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/unparsed-query.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/unsupported-syntax.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/untyped-query.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty/rules/unused-ignore.md +0 -0
- {sqlty-0.3.0 → sqlty-0.5.1}/src/sqlty_magic.pth +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sqlty
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.1
|
|
4
4
|
Classifier: Development Status :: 4 - Beta
|
|
5
5
|
Classifier: Environment :: Console
|
|
6
6
|
Classifier: Intended Audience :: Developers
|
|
@@ -12,6 +12,7 @@ Classifier: Programming Language :: Rust
|
|
|
12
12
|
Classifier: Programming Language :: SQL
|
|
13
13
|
Classifier: Topic :: Software Development :: Code Generators
|
|
14
14
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
15
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
15
16
|
Classifier: Topic :: Database
|
|
16
17
|
Classifier: Typing :: Typed
|
|
17
18
|
Requires-Dist: pathspec>=0.12.1
|
|
@@ -19,19 +20,24 @@ Requires-Dist: typing-extensions>=4.15.0 ; python_full_version < '3.15'
|
|
|
19
20
|
Requires-Dist: psycopg>=3.2.12 ; extra == 'psycopg'
|
|
20
21
|
Provides-Extra: psycopg
|
|
21
22
|
License-File: LICENSE
|
|
22
|
-
Summary: Type-safe SQL
|
|
23
|
-
Keywords: sql,type-
|
|
23
|
+
Summary: Type-safe raw SQL for Python: row and parameter types inferred from your SQL and schema, no ORM or database needed
|
|
24
|
+
Keywords: sql,raw-sql,type-safety,type-checking,type-hints,static-analysis,linter,mypy,pyright,ty,postgresql,sqlite,mysql,psycopg,migrations,code-generation,orm-alternative
|
|
24
25
|
Author-email: Jiri Kuncar <jiri.kuncar@gmail.com>
|
|
25
26
|
License-Expression: MIT
|
|
26
27
|
Requires-Python: >=3.14
|
|
27
28
|
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
28
29
|
Project-URL: Changelog, https://github.com/jirikuncar/sqlty/releases
|
|
29
|
-
Project-URL: Documentation, https://
|
|
30
|
-
Project-URL: Homepage, https://
|
|
30
|
+
Project-URL: Documentation, https://sqlty.kuncar.dev/
|
|
31
|
+
Project-URL: Homepage, https://sqlty.kuncar.dev/
|
|
31
32
|
Project-URL: Issues, https://github.com/jirikuncar/sqlty/issues
|
|
32
33
|
Project-URL: Repository, https://github.com/jirikuncar/sqlty
|
|
33
34
|
|
|
34
|
-
|
|
35
|
+
<h1>
|
|
36
|
+
<picture>
|
|
37
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jirikuncar/sqlty/main/docs/assets/sqlty-wordmark-dark.svg">
|
|
38
|
+
<img src="https://raw.githubusercontent.com/jirikuncar/sqlty/main/docs/assets/sqlty-wordmark-light.svg" alt="SQLTy" width="300">
|
|
39
|
+
</picture>
|
|
40
|
+
</h1>
|
|
35
41
|
|
|
36
42
|
[](https://pypi.org/project/sqlty/)
|
|
37
43
|
[](https://www.python.org/downloads/)
|
|
@@ -51,13 +57,13 @@ migration that changes a column is caught in review, not in production.
|
|
|
51
57
|
(<a href="https://github.com/jirikuncar/sqlty/blob/main/docs/assets/demo.tape">view source</a>)
|
|
52
58
|
</p>
|
|
53
59
|
|
|
54
|
-
**Documentation: [
|
|
60
|
+
**Documentation: [sqlty.kuncar.dev](https://sqlty.kuncar.dev/)**
|
|
55
61
|
|
|
56
62
|
**Fits if** you write SQL as string literals on Python 3.14+, against
|
|
57
63
|
PostgreSQL, SQLite or MySQL, with a schema dump or SQL migrations in the
|
|
58
64
|
repository. Rows are typed end to end with psycopg 3; with other drivers sqlty
|
|
59
65
|
checks the query and its parameters, and you annotate what the cursor returns
|
|
60
|
-
([Drivers](https://
|
|
66
|
+
([Drivers](https://sqlty.kuncar.dev/guide/drivers-and-orms/)).
|
|
61
67
|
|
|
62
68
|
> **Beta.** APIs and configuration may change before 1.0. Feedback welcome in
|
|
63
69
|
> [GitHub Issues](https://github.com/jirikuncar/sqlty/issues).
|
|
@@ -119,10 +125,10 @@ query = SQL[tuple[int, str]]("--sql\nSELECT id, email FROM users")
|
|
|
119
125
|
caller that now needs a `None` check. `narrow-type` is an error, so CI fails on
|
|
120
126
|
it; an annotation that is only wider than the rows, such as `str | None` for a
|
|
121
127
|
column made `NOT NULL`, is a `stale-type` warning
|
|
122
|
-
([CI](https://
|
|
128
|
+
([CI](https://sqlty.kuncar.dev/recipes/ci/)). For rolling deploys,
|
|
123
129
|
`sqlty breaking --against origin/main` exits 1 when old code breaks on the new
|
|
124
130
|
schema or new code on the old one
|
|
125
|
-
([Breaking schema changes](https://
|
|
131
|
+
([Breaking schema changes](https://sqlty.kuncar.dev/guide/breaking-changes/)).
|
|
126
132
|
|
|
127
133
|
### A row type that doesn't match its query
|
|
128
134
|
|
|
@@ -139,7 +145,7 @@ query = SQL[User]("--sql\nSELECT id::INTEGER, name::TEXT FROM users")
|
|
|
139
145
|
```
|
|
140
146
|
|
|
141
147
|
`TypedDict`, `NamedTuple`, dataclasses and Pydantic models are all checked
|
|
142
|
-
([Row types](https://
|
|
148
|
+
([Row types](https://sqlty.kuncar.dev/guide/row-types/)).
|
|
143
149
|
|
|
144
150
|
### Wrong parameters, misspelled columns
|
|
145
151
|
|
|
@@ -171,11 +177,11 @@ conn.execute(SQL[tuple[str | None]]("--sql\nSELECT email FROM users WHERE id = ?
|
|
|
171
177
|
conn.execute("--sql\nSELECT emial FROM users")
|
|
172
178
|
```
|
|
173
179
|
|
|
174
|
-
`?`, `$1`, `%s` and `:name` placeholders are checked on sqlite3,
|
|
175
|
-
asyncpg calls ([Parameters](https://
|
|
180
|
+
`?`, `$1`, `%s` and `:name` placeholders are checked on sqlite3, aiosqlite,
|
|
181
|
+
psycopg and asyncpg calls ([Parameters](https://sqlty.kuncar.dev/guide/parameters/)).
|
|
176
182
|
These are the mistakes coding agents make: every problem is one
|
|
177
183
|
`file:line: [rule] message` line and a non-zero exit code they can act on, and
|
|
178
|
-
the [sqlty skills](https://
|
|
184
|
+
the [sqlty skills](https://sqlty.kuncar.dev/recipes/agents/) teach
|
|
179
185
|
them the conventions. In Claude Code, `/plugin install sqlty --marketplace jirikuncar/sqlty`
|
|
180
186
|
installs them.
|
|
181
187
|
|
|
@@ -191,13 +197,13 @@ sqlty strip . # undo: back to plain strings
|
|
|
191
197
|
|
|
192
198
|
`rewrite` and `strip` only touch the wrapper, never the SQL, so you can adopt
|
|
193
199
|
sqlty one module at a time and back out. New project:
|
|
194
|
-
[Quickstart](https://
|
|
195
|
-
[Migration](https://
|
|
200
|
+
[Quickstart](https://sqlty.kuncar.dev/quickstart/). Existing codebase:
|
|
201
|
+
[Migration](https://sqlty.kuncar.dev/recipes/migration/), starting
|
|
196
202
|
with `pg_dump --schema-only app > schema.sql`. In the editor:
|
|
197
|
-
[VS Code](https://
|
|
203
|
+
[VS Code](https://sqlty.kuncar.dev/recipes/vscode/).
|
|
198
204
|
|
|
199
205
|
Not a fit for ORMs, SQL built at runtime, or runtime validation;
|
|
200
|
-
[Why SQLTy?](https://
|
|
206
|
+
[Why SQLTy?](https://sqlty.kuncar.dev/motivation/) compares it with
|
|
201
207
|
sqlc, sqlx, PgTyped and others.
|
|
202
208
|
|
|
203
209
|
## About
|
|
@@ -208,6 +214,6 @@ developed with AI coding agents, mainly Claude Code; every change is reviewed by
|
|
|
208
214
|
a maintainer (see the
|
|
209
215
|
[AI-assisted contributions](https://github.com/jirikuncar/sqlty/blob/main/CONTRIBUTING.md#ai-assisted-contributions)
|
|
210
216
|
policy). [Contributing](https://github.com/jirikuncar/sqlty/blob/main/CONTRIBUTING.md) ·
|
|
211
|
-
[Credits](https://
|
|
217
|
+
[Credits](https://sqlty.kuncar.dev/credits/) ·
|
|
212
218
|
MIT [License](https://github.com/jirikuncar/sqlty/blob/main/LICENSE).
|
|
213
219
|
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
<h1>
|
|
2
|
+
<picture>
|
|
3
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jirikuncar/sqlty/main/docs/assets/sqlty-wordmark-dark.svg">
|
|
4
|
+
<img src="https://raw.githubusercontent.com/jirikuncar/sqlty/main/docs/assets/sqlty-wordmark-light.svg" alt="SQLTy" width="300">
|
|
5
|
+
</picture>
|
|
6
|
+
</h1>
|
|
2
7
|
|
|
3
8
|
[](https://pypi.org/project/sqlty/)
|
|
4
9
|
[](https://www.python.org/downloads/)
|
|
@@ -18,13 +23,13 @@ migration that changes a column is caught in review, not in production.
|
|
|
18
23
|
(<a href="https://github.com/jirikuncar/sqlty/blob/main/docs/assets/demo.tape">view source</a>)
|
|
19
24
|
</p>
|
|
20
25
|
|
|
21
|
-
**Documentation: [
|
|
26
|
+
**Documentation: [sqlty.kuncar.dev](https://sqlty.kuncar.dev/)**
|
|
22
27
|
|
|
23
28
|
**Fits if** you write SQL as string literals on Python 3.14+, against
|
|
24
29
|
PostgreSQL, SQLite or MySQL, with a schema dump or SQL migrations in the
|
|
25
30
|
repository. Rows are typed end to end with psycopg 3; with other drivers sqlty
|
|
26
31
|
checks the query and its parameters, and you annotate what the cursor returns
|
|
27
|
-
([Drivers](https://
|
|
32
|
+
([Drivers](https://sqlty.kuncar.dev/guide/drivers-and-orms/)).
|
|
28
33
|
|
|
29
34
|
> **Beta.** APIs and configuration may change before 1.0. Feedback welcome in
|
|
30
35
|
> [GitHub Issues](https://github.com/jirikuncar/sqlty/issues).
|
|
@@ -86,10 +91,10 @@ query = SQL[tuple[int, str]]("--sql\nSELECT id, email FROM users")
|
|
|
86
91
|
caller that now needs a `None` check. `narrow-type` is an error, so CI fails on
|
|
87
92
|
it; an annotation that is only wider than the rows, such as `str | None` for a
|
|
88
93
|
column made `NOT NULL`, is a `stale-type` warning
|
|
89
|
-
([CI](https://
|
|
94
|
+
([CI](https://sqlty.kuncar.dev/recipes/ci/)). For rolling deploys,
|
|
90
95
|
`sqlty breaking --against origin/main` exits 1 when old code breaks on the new
|
|
91
96
|
schema or new code on the old one
|
|
92
|
-
([Breaking schema changes](https://
|
|
97
|
+
([Breaking schema changes](https://sqlty.kuncar.dev/guide/breaking-changes/)).
|
|
93
98
|
|
|
94
99
|
### A row type that doesn't match its query
|
|
95
100
|
|
|
@@ -106,7 +111,7 @@ query = SQL[User]("--sql\nSELECT id::INTEGER, name::TEXT FROM users")
|
|
|
106
111
|
```
|
|
107
112
|
|
|
108
113
|
`TypedDict`, `NamedTuple`, dataclasses and Pydantic models are all checked
|
|
109
|
-
([Row types](https://
|
|
114
|
+
([Row types](https://sqlty.kuncar.dev/guide/row-types/)).
|
|
110
115
|
|
|
111
116
|
### Wrong parameters, misspelled columns
|
|
112
117
|
|
|
@@ -138,11 +143,11 @@ conn.execute(SQL[tuple[str | None]]("--sql\nSELECT email FROM users WHERE id = ?
|
|
|
138
143
|
conn.execute("--sql\nSELECT emial FROM users")
|
|
139
144
|
```
|
|
140
145
|
|
|
141
|
-
`?`, `$1`, `%s` and `:name` placeholders are checked on sqlite3,
|
|
142
|
-
asyncpg calls ([Parameters](https://
|
|
146
|
+
`?`, `$1`, `%s` and `:name` placeholders are checked on sqlite3, aiosqlite,
|
|
147
|
+
psycopg and asyncpg calls ([Parameters](https://sqlty.kuncar.dev/guide/parameters/)).
|
|
143
148
|
These are the mistakes coding agents make: every problem is one
|
|
144
149
|
`file:line: [rule] message` line and a non-zero exit code they can act on, and
|
|
145
|
-
the [sqlty skills](https://
|
|
150
|
+
the [sqlty skills](https://sqlty.kuncar.dev/recipes/agents/) teach
|
|
146
151
|
them the conventions. In Claude Code, `/plugin install sqlty --marketplace jirikuncar/sqlty`
|
|
147
152
|
installs them.
|
|
148
153
|
|
|
@@ -158,13 +163,13 @@ sqlty strip . # undo: back to plain strings
|
|
|
158
163
|
|
|
159
164
|
`rewrite` and `strip` only touch the wrapper, never the SQL, so you can adopt
|
|
160
165
|
sqlty one module at a time and back out. New project:
|
|
161
|
-
[Quickstart](https://
|
|
162
|
-
[Migration](https://
|
|
166
|
+
[Quickstart](https://sqlty.kuncar.dev/quickstart/). Existing codebase:
|
|
167
|
+
[Migration](https://sqlty.kuncar.dev/recipes/migration/), starting
|
|
163
168
|
with `pg_dump --schema-only app > schema.sql`. In the editor:
|
|
164
|
-
[VS Code](https://
|
|
169
|
+
[VS Code](https://sqlty.kuncar.dev/recipes/vscode/).
|
|
165
170
|
|
|
166
171
|
Not a fit for ORMs, SQL built at runtime, or runtime validation;
|
|
167
|
-
[Why SQLTy?](https://
|
|
172
|
+
[Why SQLTy?](https://sqlty.kuncar.dev/motivation/) compares it with
|
|
168
173
|
sqlc, sqlx, PgTyped and others.
|
|
169
174
|
|
|
170
175
|
## About
|
|
@@ -175,5 +180,5 @@ developed with AI coding agents, mainly Claude Code; every change is reviewed by
|
|
|
175
180
|
a maintainer (see the
|
|
176
181
|
[AI-assisted contributions](https://github.com/jirikuncar/sqlty/blob/main/CONTRIBUTING.md#ai-assisted-contributions)
|
|
177
182
|
policy). [Contributing](https://github.com/jirikuncar/sqlty/blob/main/CONTRIBUTING.md) ·
|
|
178
|
-
[Credits](https://
|
|
183
|
+
[Credits](https://sqlty.kuncar.dev/credits/) ·
|
|
179
184
|
MIT [License](https://github.com/jirikuncar/sqlty/blob/main/LICENSE).
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "sqlty"
|
|
3
3
|
dynamic = ["version"]
|
|
4
|
-
description = "Type-safe SQL
|
|
4
|
+
description = "Type-safe raw SQL for Python: row and parameter types inferred from your SQL and schema, no ORM or database needed"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.14"
|
|
7
7
|
license = "MIT"
|
|
@@ -9,11 +9,22 @@ license-files = ["LICENSE"]
|
|
|
9
9
|
authors = [{ name = "Jiri Kuncar", email = "jiri.kuncar@gmail.com" }]
|
|
10
10
|
keywords = [
|
|
11
11
|
"sql",
|
|
12
|
-
"
|
|
13
|
-
"mypy",
|
|
12
|
+
"raw-sql",
|
|
14
13
|
"type-safety",
|
|
14
|
+
"type-checking",
|
|
15
|
+
"type-hints",
|
|
15
16
|
"static-analysis",
|
|
17
|
+
"linter",
|
|
18
|
+
"mypy",
|
|
19
|
+
"pyright",
|
|
20
|
+
"ty",
|
|
21
|
+
"postgresql",
|
|
22
|
+
"sqlite",
|
|
23
|
+
"mysql",
|
|
24
|
+
"psycopg",
|
|
25
|
+
"migrations",
|
|
16
26
|
"code-generation",
|
|
27
|
+
"orm-alternative",
|
|
17
28
|
]
|
|
18
29
|
classifiers = [
|
|
19
30
|
"Development Status :: 4 - Beta",
|
|
@@ -27,6 +38,7 @@ classifiers = [
|
|
|
27
38
|
"Programming Language :: SQL",
|
|
28
39
|
"Topic :: Software Development :: Code Generators",
|
|
29
40
|
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
41
|
+
"Topic :: Software Development :: Quality Assurance",
|
|
30
42
|
"Topic :: Database",
|
|
31
43
|
"Typing :: Typed",
|
|
32
44
|
]
|
|
@@ -36,8 +48,8 @@ dependencies = [
|
|
|
36
48
|
]
|
|
37
49
|
|
|
38
50
|
[project.urls]
|
|
39
|
-
Homepage = "https://
|
|
40
|
-
Documentation = "https://
|
|
51
|
+
Homepage = "https://sqlty.kuncar.dev/"
|
|
52
|
+
Documentation = "https://sqlty.kuncar.dev/"
|
|
41
53
|
Repository = "https://github.com/jirikuncar/sqlty"
|
|
42
54
|
Changelog = "https://github.com/jirikuncar/sqlty/releases"
|
|
43
55
|
Issues = "https://github.com/jirikuncar/sqlty/issues"
|
|
@@ -45,6 +57,9 @@ Issues = "https://github.com/jirikuncar/sqlty/issues"
|
|
|
45
57
|
[project.scripts]
|
|
46
58
|
sqlty = "sqlty._cli:main"
|
|
47
59
|
|
|
60
|
+
[project.entry-points."pygments.lexers"]
|
|
61
|
+
sqlty = "sqlty.lexer:SQLTyLexer"
|
|
62
|
+
|
|
48
63
|
[project.optional-dependencies]
|
|
49
64
|
psycopg = ["psycopg>=3.2.12"]
|
|
50
65
|
|
|
@@ -81,11 +96,16 @@ dev = [
|
|
|
81
96
|
"vale>=3.22.0.0",
|
|
82
97
|
"zizmor>=1.31.1",
|
|
83
98
|
"pydantic[email]>=2.14.1",
|
|
99
|
+
"jsonschema>=4.26.0",
|
|
100
|
+
"pytest-xdist>=3.8.0",
|
|
101
|
+
"types-pygments>=2.19",
|
|
84
102
|
]
|
|
85
103
|
cli = ["rich>=15.0.0"]
|
|
86
104
|
# Only the DuckDB type tests need it, and it has no wheel for every Python.
|
|
87
105
|
duckdb = ["duckdb>=1.4.0"]
|
|
88
106
|
psycopg = ["psycopg>=3.2.12"]
|
|
107
|
+
# The aiosqlite calls sqlty checks, run against aiosqlite (tests/test_aiosqlite.py).
|
|
108
|
+
aiosqlite = ["aiosqlite>=0.22.1"]
|
|
89
109
|
fuzz = [
|
|
90
110
|
"hypothesis>=6.140",
|
|
91
111
|
]
|
|
@@ -94,7 +114,8 @@ bench = [
|
|
|
94
114
|
]
|
|
95
115
|
|
|
96
116
|
[tool.pytest.ini_options]
|
|
97
|
-
|
|
117
|
+
# In parallel and in random order; `make test-timing` runs the `timing` tests alone.
|
|
118
|
+
addopts = ["-p", "tests._mdtest.plugin", "-p", "tests._no_exec", "--cov-report=term-missing", "--cov-report=html", "-v", "-n", "auto", "-m", "not timing"]
|
|
98
119
|
pythonpath = ["."]
|
|
99
120
|
testpaths = ["tests", "docs", "src/sqlty/rules", "README.md"]
|
|
100
121
|
mdtest_paths = ["tests/mdtest", "docs", "src/sqlty/rules", "README.md", "skills"]
|
|
@@ -102,6 +123,7 @@ markers = [
|
|
|
102
123
|
"e2e: end-to-end tests (subprocess + inline-snapshot)",
|
|
103
124
|
"slow: slow tests that can be skipped with -m 'not slow'",
|
|
104
125
|
"pg: needs a PostgreSQL server (SQLTY_PG_DSN); skipped without it",
|
|
126
|
+
"timing: measures wall time, so runs alone: `make test-timing`",
|
|
105
127
|
]
|
|
106
128
|
|
|
107
129
|
[tool.coverage.run]
|
|
@@ -172,5 +194,7 @@ disable = ["MD013", "MD038"]
|
|
|
172
194
|
exclude = ["site", ".vale", ".github", "tests", "scripts/compat/reports", "plans/2026-02-13-future.md", "rust/target", "proofs/.lake"]
|
|
173
195
|
|
|
174
196
|
[tool.rumdl.per-file-ignores]
|
|
175
|
-
# The demo GIF
|
|
197
|
+
# The logo and demo GIF need HTML for light/dark variants, width and centering.
|
|
176
198
|
"README.md" = ["MD033"]
|
|
199
|
+
# The editors and panels of the playground are HTML that its script fills in.
|
|
200
|
+
"docs/playground.md" = ["MD033"]
|