kontra 0.5.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- kontra/__init__.py +1871 -0
- kontra/api/__init__.py +22 -0
- kontra/api/compare.py +340 -0
- kontra/api/decorators.py +153 -0
- kontra/api/results.py +2121 -0
- kontra/api/rules.py +681 -0
- kontra/cli/__init__.py +0 -0
- kontra/cli/commands/__init__.py +1 -0
- kontra/cli/commands/config.py +153 -0
- kontra/cli/commands/diff.py +450 -0
- kontra/cli/commands/history.py +196 -0
- kontra/cli/commands/profile.py +289 -0
- kontra/cli/commands/validate.py +468 -0
- kontra/cli/constants.py +6 -0
- kontra/cli/main.py +48 -0
- kontra/cli/renderers.py +304 -0
- kontra/cli/utils.py +28 -0
- kontra/config/__init__.py +34 -0
- kontra/config/loader.py +127 -0
- kontra/config/models.py +49 -0
- kontra/config/settings.py +797 -0
- kontra/connectors/__init__.py +0 -0
- kontra/connectors/db_utils.py +251 -0
- kontra/connectors/detection.py +323 -0
- kontra/connectors/handle.py +368 -0
- kontra/connectors/postgres.py +127 -0
- kontra/connectors/sqlserver.py +226 -0
- kontra/engine/__init__.py +0 -0
- kontra/engine/backends/duckdb_session.py +227 -0
- kontra/engine/backends/duckdb_utils.py +18 -0
- kontra/engine/backends/polars_backend.py +47 -0
- kontra/engine/engine.py +1205 -0
- kontra/engine/executors/__init__.py +15 -0
- kontra/engine/executors/base.py +50 -0
- kontra/engine/executors/database_base.py +528 -0
- kontra/engine/executors/duckdb_sql.py +607 -0
- kontra/engine/executors/postgres_sql.py +162 -0
- kontra/engine/executors/registry.py +69 -0
- kontra/engine/executors/sqlserver_sql.py +163 -0
- kontra/engine/materializers/__init__.py +14 -0
- kontra/engine/materializers/base.py +42 -0
- kontra/engine/materializers/duckdb.py +110 -0
- kontra/engine/materializers/factory.py +22 -0
- kontra/engine/materializers/polars_connector.py +131 -0
- kontra/engine/materializers/postgres.py +157 -0
- kontra/engine/materializers/registry.py +138 -0
- kontra/engine/materializers/sqlserver.py +160 -0
- kontra/engine/result.py +15 -0
- kontra/engine/sql_utils.py +611 -0
- kontra/engine/sql_validator.py +609 -0
- kontra/engine/stats.py +194 -0
- kontra/engine/types.py +138 -0
- kontra/errors.py +533 -0
- kontra/logging.py +85 -0
- kontra/preplan/__init__.py +5 -0
- kontra/preplan/planner.py +253 -0
- kontra/preplan/postgres.py +179 -0
- kontra/preplan/sqlserver.py +191 -0
- kontra/preplan/types.py +24 -0
- kontra/probes/__init__.py +20 -0
- kontra/probes/compare.py +400 -0
- kontra/probes/relationship.py +283 -0
- kontra/reporters/__init__.py +0 -0
- kontra/reporters/json_reporter.py +190 -0
- kontra/reporters/rich_reporter.py +11 -0
- kontra/rules/__init__.py +35 -0
- kontra/rules/base.py +186 -0
- kontra/rules/builtin/__init__.py +40 -0
- kontra/rules/builtin/allowed_values.py +156 -0
- kontra/rules/builtin/compare.py +188 -0
- kontra/rules/builtin/conditional_not_null.py +213 -0
- kontra/rules/builtin/conditional_range.py +310 -0
- kontra/rules/builtin/contains.py +138 -0
- kontra/rules/builtin/custom_sql_check.py +182 -0
- kontra/rules/builtin/disallowed_values.py +140 -0
- kontra/rules/builtin/dtype.py +203 -0
- kontra/rules/builtin/ends_with.py +129 -0
- kontra/rules/builtin/freshness.py +240 -0
- kontra/rules/builtin/length.py +193 -0
- kontra/rules/builtin/max_rows.py +35 -0
- kontra/rules/builtin/min_rows.py +46 -0
- kontra/rules/builtin/not_null.py +121 -0
- kontra/rules/builtin/range.py +222 -0
- kontra/rules/builtin/regex.py +143 -0
- kontra/rules/builtin/starts_with.py +129 -0
- kontra/rules/builtin/unique.py +124 -0
- kontra/rules/condition_parser.py +203 -0
- kontra/rules/execution_plan.py +455 -0
- kontra/rules/factory.py +103 -0
- kontra/rules/predicates.py +25 -0
- kontra/rules/registry.py +24 -0
- kontra/rules/static_predicates.py +120 -0
- kontra/scout/__init__.py +9 -0
- kontra/scout/backends/__init__.py +17 -0
- kontra/scout/backends/base.py +111 -0
- kontra/scout/backends/duckdb_backend.py +359 -0
- kontra/scout/backends/postgres_backend.py +519 -0
- kontra/scout/backends/sqlserver_backend.py +577 -0
- kontra/scout/dtype_mapping.py +150 -0
- kontra/scout/patterns.py +69 -0
- kontra/scout/profiler.py +801 -0
- kontra/scout/reporters/__init__.py +39 -0
- kontra/scout/reporters/json_reporter.py +165 -0
- kontra/scout/reporters/markdown_reporter.py +152 -0
- kontra/scout/reporters/rich_reporter.py +144 -0
- kontra/scout/store.py +208 -0
- kontra/scout/suggest.py +200 -0
- kontra/scout/types.py +652 -0
- kontra/state/__init__.py +29 -0
- kontra/state/backends/__init__.py +79 -0
- kontra/state/backends/base.py +348 -0
- kontra/state/backends/local.py +480 -0
- kontra/state/backends/postgres.py +1010 -0
- kontra/state/backends/s3.py +543 -0
- kontra/state/backends/sqlserver.py +969 -0
- kontra/state/fingerprint.py +166 -0
- kontra/state/types.py +1061 -0
- kontra/version.py +1 -0
- kontra-0.5.2.dist-info/METADATA +122 -0
- kontra-0.5.2.dist-info/RECORD +124 -0
- kontra-0.5.2.dist-info/WHEEL +5 -0
- kontra-0.5.2.dist-info/entry_points.txt +2 -0
- kontra-0.5.2.dist-info/licenses/LICENSE +17 -0
- kontra-0.5.2.dist-info/top_level.txt +1 -0
kontra/version.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
VERSION = "0.5.2"
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: kontra
|
|
3
|
+
Version: 0.5.2
|
|
4
|
+
Summary: Developer-first data quality engine
|
|
5
|
+
Author: Saevarlb
|
|
6
|
+
License: Apache-2.0
|
|
7
|
+
Project-URL: Homepage, https://github.com/Saevarl/Kontra
|
|
8
|
+
Project-URL: Documentation, https://github.com/Saevarl/Kontra#readme
|
|
9
|
+
Project-URL: Repository, https://github.com/Saevarl/Kontra
|
|
10
|
+
Project-URL: Issues, https://github.com/Saevarl/Kontra/issues
|
|
11
|
+
Keywords: data-quality,validation,data-contracts,polars,duckdb
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Topic :: Database
|
|
21
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
22
|
+
Requires-Python: >=3.10
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
License-File: LICENSE
|
|
25
|
+
Requires-Dist: polars>=0.20.0
|
|
26
|
+
Requires-Dist: duckdb>=0.9.0
|
|
27
|
+
Requires-Dist: pydantic>=2.0.0
|
|
28
|
+
Requires-Dist: typer>=0.9.0
|
|
29
|
+
Requires-Dist: rich>=13.0.0
|
|
30
|
+
Requires-Dist: pyarrow>=14.0.0
|
|
31
|
+
Requires-Dist: pyyaml>=6.0.0
|
|
32
|
+
Requires-Dist: sqlglot>=20.0.0
|
|
33
|
+
Provides-Extra: s3
|
|
34
|
+
Requires-Dist: s3fs>=2024.6.0; extra == "s3"
|
|
35
|
+
Provides-Extra: postgres
|
|
36
|
+
Requires-Dist: psycopg[binary]>=3.0.0; extra == "postgres"
|
|
37
|
+
Provides-Extra: sqlserver
|
|
38
|
+
Requires-Dist: pymssql>=2.2.0; extra == "sqlserver"
|
|
39
|
+
Provides-Extra: all
|
|
40
|
+
Requires-Dist: s3fs>=2024.6.0; extra == "all"
|
|
41
|
+
Requires-Dist: psycopg[binary]>=3.0.0; extra == "all"
|
|
42
|
+
Requires-Dist: pymssql>=2.2.0; extra == "all"
|
|
43
|
+
Provides-Extra: dev
|
|
44
|
+
Requires-Dist: pytest>=8.0.0; extra == "dev"
|
|
45
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
|
|
46
|
+
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
47
|
+
Dynamic: license-file
|
|
48
|
+
|
|
49
|
+
# Kontra
|
|
50
|
+
|
|
51
|
+
**Data quality validation for developers.**
|
|
52
|
+
|
|
53
|
+
Kontra validates datasets against declarative contracts. Define rules in YAML, run them against Parquet, CSV, PostgreSQL, or SQL Server. Get violation counts back.
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
pip install kontra
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## 30-Second Example
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# Profile your data
|
|
63
|
+
kontra profile data.parquet
|
|
64
|
+
|
|
65
|
+
# Draft a starting contract
|
|
66
|
+
kontra profile data.parquet --draft > contract.yml
|
|
67
|
+
|
|
68
|
+
# Validate
|
|
69
|
+
kontra validate contract.yml
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Output:
|
|
73
|
+
```
|
|
74
|
+
PASSED - data.parquet (4 rules)
|
|
75
|
+
COL:user_id:not_null ✓
|
|
76
|
+
COL:email:unique ✓
|
|
77
|
+
COL:status:allowed_values ✓
|
|
78
|
+
COL:age:range ✓
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## What You Write
|
|
82
|
+
|
|
83
|
+
```yaml
|
|
84
|
+
# contract.yml
|
|
85
|
+
name: users_quality
|
|
86
|
+
datasource: data/users.parquet
|
|
87
|
+
|
|
88
|
+
rules:
|
|
89
|
+
- name: not_null
|
|
90
|
+
params: { column: user_id }
|
|
91
|
+
|
|
92
|
+
- name: unique
|
|
93
|
+
params: { column: email }
|
|
94
|
+
|
|
95
|
+
- name: allowed_values
|
|
96
|
+
params:
|
|
97
|
+
column: status
|
|
98
|
+
values: [active, inactive, pending]
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## What You Get
|
|
102
|
+
|
|
103
|
+
- **18 built-in rules**: not_null, unique, range, regex, contains, length, freshness, and more
|
|
104
|
+
- **Fast execution**: Metadata analysis and SQL pushdown before loading data
|
|
105
|
+
- **Multiple sources**: Parquet, CSV, PostgreSQL, SQL Server, S3
|
|
106
|
+
- **Python API**: Use as a library with `kontra.validate(df, rules=[...])`
|
|
107
|
+
- **State tracking**: Compare runs over time with `kontra diff`
|
|
108
|
+
|
|
109
|
+
## Documentation
|
|
110
|
+
|
|
111
|
+
| Doc | Audience |
|
|
112
|
+
|-----|----------|
|
|
113
|
+
| [Getting Started](docs/getting-started.md) | New users |
|
|
114
|
+
| [Python API](docs/python-api.md) | Library users |
|
|
115
|
+
| [Rules Reference](docs/reference/rules.md) | Everyone |
|
|
116
|
+
| [Configuration](docs/reference/config.md) | Project setup |
|
|
117
|
+
| [Advanced Topics](docs/advanced/) | Agents, state, execution model |
|
|
118
|
+
| [Architecture](docs/reference/architecture.md) | Contributors |
|
|
119
|
+
|
|
120
|
+
## License
|
|
121
|
+
|
|
122
|
+
MIT
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
kontra/__init__.py,sha256=1M7J5CeYZy64UDZjbP1BKZXeJEbpsQWuoj5FhoCJW6o,62532
|
|
2
|
+
kontra/errors.py,sha256=dfv3bJFaNpN78Y361Mz_3ChBxjUwHutDpUv-q0QtGZc,16823
|
|
3
|
+
kontra/logging.py,sha256=vDEBnpDTfRr5lc6ZlgEEyqVXdBJbiJydK1RgqJ_QpiE,2256
|
|
4
|
+
kontra/version.py,sha256=H_2wzkwt5P7u9zKSCOnQry4NWS9DJ3fCbX50CHsFMtA,18
|
|
5
|
+
kontra/api/__init__.py,sha256=tSD8E-0EDZda39AWnR5sD_LgQhnLxGohDhOynOw1MJ8,374
|
|
6
|
+
kontra/api/compare.py,sha256=Rl9HNPgMVygs9n4mjiTJdnTN3FDMuptd1qRwSEVmLV8,12425
|
|
7
|
+
kontra/api/decorators.py,sha256=5E92QAIReWgAGpY8B0jeJCMsqj2xl2vYtLvB_TuiUk4,4873
|
|
8
|
+
kontra/api/results.py,sha256=l_2TNSaCaAmMopy_Yyh9edHTA3AvY_OD6WLuh_zQEHA,78905
|
|
9
|
+
kontra/api/rules.py,sha256=3R_4peWK-T6IoC1jWfRPc69l_hHp6rha8E8vld6Ss0M,21425
|
|
10
|
+
kontra/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
|
+
kontra/cli/constants.py,sha256=GKXw6ZIIQKlI-AazeFp6gEmFl6F0sfmK68Os8RlbnYY,131
|
|
12
|
+
kontra/cli/main.py,sha256=4UWx3Rcyhl44owdoyeEWHem35k77TEkUPfB7ISDS6ss,1076
|
|
13
|
+
kontra/cli/renderers.py,sha256=VgAXLq3YlQHybhNcRRz3UMGIkEeWs2QR0P3HyF8Xlb8,11688
|
|
14
|
+
kontra/cli/utils.py,sha256=TsKUyCkvfYdWGrdKHd2oIlHDpeZsL9BpyrpQ4EgvyKc,668
|
|
15
|
+
kontra/cli/commands/__init__.py,sha256=gQ6tnU0Rvm0-ESWFUBU-KDl5dpNOpUTG509hXOQQjwY,27
|
|
16
|
+
kontra/cli/commands/config.py,sha256=LL8IdC42y4HcK4d2TBcN0aOnTm9OsVLUdQ5mdKce-WM,5023
|
|
17
|
+
kontra/cli/commands/diff.py,sha256=toXcDFrV_zIYRauve-TsKeUh9YDNJULsI1AUX0OYPnQ,16934
|
|
18
|
+
kontra/cli/commands/history.py,sha256=gYdne--EnwmTTJFK9My9mdTYuD1HffyvFKQdmnwT_YA,6277
|
|
19
|
+
kontra/cli/commands/profile.py,sha256=8b4DOzHlw-lpO44z9tqJT5km2mKaNRVQzqP8Ls30BGo,9536
|
|
20
|
+
kontra/cli/commands/validate.py,sha256=sOFHScE2BgXEEzUq5wjVpY1wawwM6gDRxEB1c1pWjg8,17379
|
|
21
|
+
kontra/config/__init__.py,sha256=lqUnIw7vdUxmNZjE9HpSs5sMKFcQymiSfW5LdlZoLHE,819
|
|
22
|
+
kontra/config/loader.py,sha256=oNO5spu63i0SMzBmEVG83WajiYhmf5ApZDxFi-PCbZw,4894
|
|
23
|
+
kontra/config/models.py,sha256=8fIinqlthyWvK5CzI33YCm_70l5rKnZiVKV990-qucg,2220
|
|
24
|
+
kontra/config/settings.py,sha256=uUii61b0IiLUav2v46flAul_r4IGoWinG7g-QNrvMxo,26125
|
|
25
|
+
kontra/connectors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
26
|
+
kontra/connectors/db_utils.py,sha256=YBY6FhME-hSYGkhDypb1g4QbrXdHwmZ8LY1EwmfxSqQ,7015
|
|
27
|
+
kontra/connectors/detection.py,sha256=JZxLM8ap-s8Kf6TiYcqtXYJBZ6GRct9Vp51qTBP4Yl4,8942
|
|
28
|
+
kontra/connectors/handle.py,sha256=2L2a38RJxayQ00fFcmI0VIftHkScs-EVMkBe-DWW3uI,14286
|
|
29
|
+
kontra/connectors/postgres.py,sha256=g4YJN2GU8PqfgY5nnOAl-Z7krW01TDxaYwcvVZnBkkM,3742
|
|
30
|
+
kontra/connectors/sqlserver.py,sha256=JL-dw-dxpSkjxve0asOD17cD2ffkMq86SBg2LWn21JI,8112
|
|
31
|
+
kontra/engine/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
32
|
+
kontra/engine/engine.py,sha256=qpdaiW6W5SZk6Thvgf844nQAUZtOOUTVt4Z0zlRbFA8,51863
|
|
33
|
+
kontra/engine/result.py,sha256=Z34SQZ6GjObAvqS6wx2fXc7PG5ypYlgThjcXfaO07M0,372
|
|
34
|
+
kontra/engine/sql_utils.py,sha256=srhdY_v7DpI1pDHth8FJLZsN3B9jgRlTj9qmUYYOm_E,18620
|
|
35
|
+
kontra/engine/sql_validator.py,sha256=xPk1AjJxY8Yfz-U4gCQJG4p-y64yzrZ8C1UHzDc-YTI,17702
|
|
36
|
+
kontra/engine/stats.py,sha256=Mgl0uhomkx4Pme65lnzE9BU6HxClZUxSy8QfcMcoL5o,5769
|
|
37
|
+
kontra/engine/types.py,sha256=oaIAWnxbNIGbyl-CCPTlX3hGD9Z1Er6X5ruFTy93oQ4,3527
|
|
38
|
+
kontra/engine/backends/duckdb_session.py,sha256=pAbaipuXEnWg66DV0o6zfabVqzwTb3_ZzfP4Ja6hRso,7915
|
|
39
|
+
kontra/engine/backends/duckdb_utils.py,sha256=Z4widxZnkzu6A9Mw9kLUn7qASbksuhHvnupnvj62laM,559
|
|
40
|
+
kontra/engine/backends/polars_backend.py,sha256=hBuIEZwehzFHUGWGWvDuGUw2_F2Bo5XPccMzzlBi_Ww,1539
|
|
41
|
+
kontra/engine/executors/__init__.py,sha256=azkKR9xC8SZ3AVVCAAq3DuuAafT-zeJWv7yBXSjkTjU,313
|
|
42
|
+
kontra/engine/executors/base.py,sha256=aaV1RXxLKhmC1fAfvaja3v8Ccl-PFeLU4Exu01uZ5FU,1588
|
|
43
|
+
kontra/engine/executors/database_base.py,sha256=Q2I6IEmFeguTS3FZkLr6dT-wJFdmsZxtXpDD4OOw_to,21135
|
|
44
|
+
kontra/engine/executors/duckdb_sql.py,sha256=4dPlqKA3SnsF4VxgidDpof2VfVBoJWgMJRJ5iP4e8Og,23344
|
|
45
|
+
kontra/engine/executors/postgres_sql.py,sha256=O5qupOa3NZmQKnKgGyd6CN5WQ4iPUPECTjVks8VHQt0,6165
|
|
46
|
+
kontra/engine/executors/registry.py,sha256=eefS661icRNSX5k8kHIOQedUw69S1EqEjJWrJ-pOwIk,2009
|
|
47
|
+
kontra/engine/executors/sqlserver_sql.py,sha256=QDeDWnYwZ3-edYN_lIXt-U_eKJfBG52ZeDfk1dTp2yM,6386
|
|
48
|
+
kontra/engine/materializers/__init__.py,sha256=B_KsDUbXoGc8nWGNCGY3Y7XOvMBZ0Sg5iJxBkocTfUw,323
|
|
49
|
+
kontra/engine/materializers/base.py,sha256=uBIrMwzEOqNImhPQfaNb17H2t1-Fq4UBmjY07Dc6f_k,1208
|
|
50
|
+
kontra/engine/materializers/duckdb.py,sha256=s22-zsiLQNyNQPMrTC8zsl8aWTIZyp-o29MFt-wHeys,3755
|
|
51
|
+
kontra/engine/materializers/factory.py,sha256=KUf4eBytd3wc0FigZrKh9lT3K9eY1Wf0UGWQ9Gtwbn4,1022
|
|
52
|
+
kontra/engine/materializers/polars_connector.py,sha256=6-B82TLCYcYvshGZXGRzNaPxf3RWBib9JId_oymTnPM,4431
|
|
53
|
+
kontra/engine/materializers/postgres.py,sha256=lyzACQvVW4_9L3H1OK25zHn4eoXHyuGvXufUTXaR7_w,5736
|
|
54
|
+
kontra/engine/materializers/registry.py,sha256=Hm5bgG82ZSkzjlTX80TOucpq7LWPHn9fhTMQb0e5JJA,4849
|
|
55
|
+
kontra/engine/materializers/sqlserver.py,sha256=rlVtgF82HfRTtG3aN7GhuQ6QIARzAKePQUlwpgkgQlU,5743
|
|
56
|
+
kontra/preplan/__init__.py,sha256=f0jKsBH_NtuJwrwvFVVBQfBoxysenC1CQ2FuT5u8XhQ,147
|
|
57
|
+
kontra/preplan/planner.py,sha256=oAEpqALttzne8fwWJnezVf9f4y7bMnHANU9ETkPtyJQ,9585
|
|
58
|
+
kontra/preplan/postgres.py,sha256=28LEJRLuKjvUDZsKPB_ljP5lVyvHP8yYyvfNItA32MI,6585
|
|
59
|
+
kontra/preplan/sqlserver.py,sha256=iny3Ti_dETmuXFL6qbGpRKK_WlAQ29iOJwiNCu2-3G8,6589
|
|
60
|
+
kontra/preplan/types.py,sha256=wODH6o8cteqK1IJMrQeCDB_LUNzsvNVtiKBYc1OVl5o,905
|
|
61
|
+
kontra/probes/__init__.py,sha256=T-Y0InLoeivuOl5nTBT9uEG5WdvsRGcYnxvJsKn_C0w,584
|
|
62
|
+
kontra/probes/compare.py,sha256=jSH2xH-ZN62ixdgHNXCpFMmgYjjn6lbQ_u0P7RwLkhw,13168
|
|
63
|
+
kontra/probes/relationship.py,sha256=0LVf4q5XSqn-DjnXwdSOV-aA-YMoNNO8Yf-QUAgSZtA,9763
|
|
64
|
+
kontra/reporters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
65
|
+
kontra/reporters/json_reporter.py,sha256=xU6ys59lZqs7FV1ZXK9HWHulzohbYbMZ7HozdP4SzWk,6212
|
|
66
|
+
kontra/reporters/rich_reporter.py,sha256=tGyHFtCGlznvZ5-N6k_B8UGMUtEm-8kL58ECYWiQLYs,281
|
|
67
|
+
kontra/rules/__init__.py,sha256=5A7z31PgXmDYRasEf8kehZ9M3TxesC9xuVtsBWNhhfA,892
|
|
68
|
+
kontra/rules/base.py,sha256=rLux4vEpjx9taWU2KeBNWuaAPznVSi6Nk3CrVUakiHE,6368
|
|
69
|
+
kontra/rules/condition_parser.py,sha256=xxcYCi4P3WIk9bItQfSUljJhkyJ3Q8rH8GMWWm-zuho,5406
|
|
70
|
+
kontra/rules/execution_plan.py,sha256=8kYpHcN7zhBahBpdyTlIrF6VMKSZQOMNUY9Wr8fEeXQ,17556
|
|
71
|
+
kontra/rules/factory.py,sha256=lLhdMQblkrqrXAQYManfLWCqjHCpJa857iIbN_aOO8s,3703
|
|
72
|
+
kontra/rules/predicates.py,sha256=vf_6_2WARCSG-Id6hYfXcBu7UG8nDgZbWWYNaCnkPPA,648
|
|
73
|
+
kontra/rules/registry.py,sha256=MoQSEygGjzx3ms9ou1drzZ7SNqdP_C0Dr4b9g1Dq6n8,721
|
|
74
|
+
kontra/rules/static_predicates.py,sha256=mSJdfBId-Bfi1Ang22vNeCerVnwwYASJPmhoWDiuQn0,4453
|
|
75
|
+
kontra/rules/builtin/__init__.py,sha256=tJrymnw8hWI16Oy7arGE5tpxrvVFjuzSCweLb1p66Sw,1482
|
|
76
|
+
kontra/rules/builtin/allowed_values.py,sha256=MnThJ6RZf1D1hnGiyRG8dkCfCWhVVOm_bUDVVLKzOnw,5884
|
|
77
|
+
kontra/rules/builtin/compare.py,sha256=7_FTwzBwQt2W59WIZ05_moZjLwDpgbqB_TeYwUApvMI,5740
|
|
78
|
+
kontra/rules/builtin/conditional_not_null.py,sha256=h1cIg0Id8kZk56jYU_phwc7xbheDvgqYKvdJwenHbiA,7290
|
|
79
|
+
kontra/rules/builtin/conditional_range.py,sha256=xukHu1d2VkZQ_LqurnrpKCtMPfjoozNlrid47I3XbTk,11230
|
|
80
|
+
kontra/rules/builtin/contains.py,sha256=XQ54UcmFuKVbpF8cwjNgoLgOGj0PIvbJt92XTVH-jN0,4380
|
|
81
|
+
kontra/rules/builtin/custom_sql_check.py,sha256=zZs2H0beZvl4hqo28rbHaOLutjTLf7P00CySztKM2ns,6334
|
|
82
|
+
kontra/rules/builtin/disallowed_values.py,sha256=JL1VG3atlJl6wDePCrVvZa0Y7eAfii69E0LpVvBHI1k,4684
|
|
83
|
+
kontra/rules/builtin/dtype.py,sha256=55ZF4OuIGcwngl3EIFcF5aIOQ0VzaR62UtpzAOiGX3g,7939
|
|
84
|
+
kontra/rules/builtin/ends_with.py,sha256=6ld68l0BW40qzLycrxRtCeN585SHLO91Utfze4svJ7U,4051
|
|
85
|
+
kontra/rules/builtin/freshness.py,sha256=vkondDg-SWoq9lBdvkRFRtCV_EoyN_FRQJUKcR_Wy1E,8465
|
|
86
|
+
kontra/rules/builtin/length.py,sha256=2TDgyUTIOoDN2KGvllLFSmlYwjtHJN4MmQmBwBDbS64,6563
|
|
87
|
+
kontra/rules/builtin/max_rows.py,sha256=ow6GZeSyTXG74NudpmNVO_4QQDbfeupzvhm0v4WvBAQ,1175
|
|
88
|
+
kontra/rules/builtin/min_rows.py,sha256=-kYzdbmBZqCQWIJfA_qj4bFrq6EW9RJqBfA2V1LQBXs,1660
|
|
89
|
+
kontra/rules/builtin/not_null.py,sha256=Rv_m_lRaKRc1IJQUAR8tZo3o0IiR6JZ6VYS5fbb22z4,4178
|
|
90
|
+
kontra/rules/builtin/range.py,sha256=2d3vfklzCuVMw8oMszM0bYtWXJofuC6RzEqzs5G8DFA,6985
|
|
91
|
+
kontra/rules/builtin/regex.py,sha256=TpST32utgW3Jr4iiesnV0Ec6SRBuq6WYBldTKd7Qar0,4785
|
|
92
|
+
kontra/rules/builtin/starts_with.py,sha256=yii3pInUFK_cz-ljG7Lqz-_efHlgpjDiavCcRxhHJeU,4092
|
|
93
|
+
kontra/rules/builtin/unique.py,sha256=-Yfkc_yodYx849KjmnzDR1zX-JuxFMlvVGBq6Ui09xY,4720
|
|
94
|
+
kontra/scout/__init__.py,sha256=2Z7WoJ35RCjszjuo7ho7fyqHfi5KHMPdSnjYVP2BcAA,286
|
|
95
|
+
kontra/scout/dtype_mapping.py,sha256=IVhjWOrCg0gRUd0OrKaCk8FKR6EoSAZPbWG-LLsfHY0,4162
|
|
96
|
+
kontra/scout/patterns.py,sha256=WlWPuPtCLq5Cn4UIk5pWlSQ0XO8WkemOPD0O7pj3b3w,2252
|
|
97
|
+
kontra/scout/profiler.py,sha256=eLSdMAq89669tVYHCnsCBNwt4O3aU8PTheXn3ih7i2s,31976
|
|
98
|
+
kontra/scout/store.py,sha256=X8_8CiySkeqEjYW8bzZTKPfcSiG8yxnAjgYz4BUFM_8,6319
|
|
99
|
+
kontra/scout/suggest.py,sha256=fzmZId5QBEiUtJ_BbRWdUJc1cmQmhk4Mt2wEkKPU_c4,6923
|
|
100
|
+
kontra/scout/types.py,sha256=e1VivrLWeAYsI8rUVXiXm0r5d7ZjUwZD4SviAuZsnYY,23149
|
|
101
|
+
kontra/scout/backends/__init__.py,sha256=9VXyQKszLEMp5IvXeFFsqApesX3HgO_A_MWiSGadTNU,410
|
|
102
|
+
kontra/scout/backends/base.py,sha256=q0y1eKktRa-qSBOmHS1flh2nC-lRaq0F58g4S8j7u1o,2945
|
|
103
|
+
kontra/scout/backends/duckdb_backend.py,sha256=rHaCwUmzThlQj_fuAqJONW_9WJ1dhySoo_4sTxvqMnA,12894
|
|
104
|
+
kontra/scout/backends/postgres_backend.py,sha256=tTmt97J45Q7T_cGAkA5f70eo3OKEuRVD4OQau9RYyOE,18212
|
|
105
|
+
kontra/scout/backends/sqlserver_backend.py,sha256=164prrUDMoKO-kFmraj4tbvIWhQXakhQautqo3bywG8,20099
|
|
106
|
+
kontra/scout/reporters/__init__.py,sha256=5r0G_rpcaIIh8VIitr49w3bV5zP2LcTVIv1NHW5RsBk,1012
|
|
107
|
+
kontra/scout/reporters/json_reporter.py,sha256=pfLbcRlHD4-rRs_rjE2V60-KADACvH01xDZIBn1bIDs,5301
|
|
108
|
+
kontra/scout/reporters/markdown_reporter.py,sha256=yQS96WBDEDNTGpooWt0Ll3SnN1yh8SeOl4A7jn2ZuPs,5201
|
|
109
|
+
kontra/scout/reporters/rich_reporter.py,sha256=qxv3GY_NZhGmWIgFT5KeMwanOz80IhQAB6tSVnJnEw0,5004
|
|
110
|
+
kontra/state/__init__.py,sha256=ruY1BzYbbSkk1ExtBQtAT22MPRG_9kBX3IBjZCxi99Q,753
|
|
111
|
+
kontra/state/fingerprint.py,sha256=d9Zydhbebtzqr-juKHcx3tizc-6q6Dp2AilINqw63oE,4685
|
|
112
|
+
kontra/state/types.py,sha256=E1plUaMC19mlmq_n5M40G_eSF5R1kipdnkiUYJSP-Iw,39666
|
|
113
|
+
kontra/state/backends/__init__.py,sha256=Z3NLPJsIfm5Jiw7VPhr8wF8TF5_G5o1KCaa5vlb3gBk,2187
|
|
114
|
+
kontra/state/backends/base.py,sha256=_4jH4uoOQdCDM7ryXDjqkJCHwkYkoepLhfYW85kteOA,10579
|
|
115
|
+
kontra/state/backends/local.py,sha256=8sh-yhaUTN83zgEYDKEp_bFDwmwBIU9ta5MNZkMHAz4,16685
|
|
116
|
+
kontra/state/backends/postgres.py,sha256=cKwWFdRrEuXhDt7ZUuGZVh0ft01oW0pvd7fBXlCWBu0,34472
|
|
117
|
+
kontra/state/backends/s3.py,sha256=diMmSrVMveonrRxj8m6DxUzc2pa3BIYdeLuIIZn50cY,17845
|
|
118
|
+
kontra/state/backends/sqlserver.py,sha256=78PdsftgUbbJCorEPJD5PkbJtrlEcL1E_UhICc7i2Sg,33212
|
|
119
|
+
kontra-0.5.2.dist-info/licenses/LICENSE,sha256=GzDOa9QmsvenUwnCVWxDjyVZqMWJfLc7StgKTJhf-KM,641
|
|
120
|
+
kontra-0.5.2.dist-info/METADATA,sha256=rJnGtsrNi4qEMMA4gOrTTGwTp9S5i-4-I61q2lwE8NI,3607
|
|
121
|
+
kontra-0.5.2.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
|
|
122
|
+
kontra-0.5.2.dist-info/entry_points.txt,sha256=1QxNpNJ8iVRKyomgcxOAQptYNgl22LJBgi5ZVYzfLxM,48
|
|
123
|
+
kontra-0.5.2.dist-info/top_level.txt,sha256=rXYiwfM-jSego4KBcAtS6ZObdOoi2g85MkQgpkRfYS0,7
|
|
124
|
+
kontra-0.5.2.dist-info/RECORD,,
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
4
|
+
|
|
5
|
+
Copyright 2025 Sævar Logi Björnsson
|
|
6
|
+
|
|
7
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
you may not use this file except in compliance with the License.
|
|
9
|
+
You may obtain a copy of the License at
|
|
10
|
+
|
|
11
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
|
|
13
|
+
Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
See the License for the specific language governing permissions and
|
|
17
|
+
limitations under the License.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
kontra
|