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.
Files changed (124) hide show
  1. kontra/__init__.py +1871 -0
  2. kontra/api/__init__.py +22 -0
  3. kontra/api/compare.py +340 -0
  4. kontra/api/decorators.py +153 -0
  5. kontra/api/results.py +2121 -0
  6. kontra/api/rules.py +681 -0
  7. kontra/cli/__init__.py +0 -0
  8. kontra/cli/commands/__init__.py +1 -0
  9. kontra/cli/commands/config.py +153 -0
  10. kontra/cli/commands/diff.py +450 -0
  11. kontra/cli/commands/history.py +196 -0
  12. kontra/cli/commands/profile.py +289 -0
  13. kontra/cli/commands/validate.py +468 -0
  14. kontra/cli/constants.py +6 -0
  15. kontra/cli/main.py +48 -0
  16. kontra/cli/renderers.py +304 -0
  17. kontra/cli/utils.py +28 -0
  18. kontra/config/__init__.py +34 -0
  19. kontra/config/loader.py +127 -0
  20. kontra/config/models.py +49 -0
  21. kontra/config/settings.py +797 -0
  22. kontra/connectors/__init__.py +0 -0
  23. kontra/connectors/db_utils.py +251 -0
  24. kontra/connectors/detection.py +323 -0
  25. kontra/connectors/handle.py +368 -0
  26. kontra/connectors/postgres.py +127 -0
  27. kontra/connectors/sqlserver.py +226 -0
  28. kontra/engine/__init__.py +0 -0
  29. kontra/engine/backends/duckdb_session.py +227 -0
  30. kontra/engine/backends/duckdb_utils.py +18 -0
  31. kontra/engine/backends/polars_backend.py +47 -0
  32. kontra/engine/engine.py +1205 -0
  33. kontra/engine/executors/__init__.py +15 -0
  34. kontra/engine/executors/base.py +50 -0
  35. kontra/engine/executors/database_base.py +528 -0
  36. kontra/engine/executors/duckdb_sql.py +607 -0
  37. kontra/engine/executors/postgres_sql.py +162 -0
  38. kontra/engine/executors/registry.py +69 -0
  39. kontra/engine/executors/sqlserver_sql.py +163 -0
  40. kontra/engine/materializers/__init__.py +14 -0
  41. kontra/engine/materializers/base.py +42 -0
  42. kontra/engine/materializers/duckdb.py +110 -0
  43. kontra/engine/materializers/factory.py +22 -0
  44. kontra/engine/materializers/polars_connector.py +131 -0
  45. kontra/engine/materializers/postgres.py +157 -0
  46. kontra/engine/materializers/registry.py +138 -0
  47. kontra/engine/materializers/sqlserver.py +160 -0
  48. kontra/engine/result.py +15 -0
  49. kontra/engine/sql_utils.py +611 -0
  50. kontra/engine/sql_validator.py +609 -0
  51. kontra/engine/stats.py +194 -0
  52. kontra/engine/types.py +138 -0
  53. kontra/errors.py +533 -0
  54. kontra/logging.py +85 -0
  55. kontra/preplan/__init__.py +5 -0
  56. kontra/preplan/planner.py +253 -0
  57. kontra/preplan/postgres.py +179 -0
  58. kontra/preplan/sqlserver.py +191 -0
  59. kontra/preplan/types.py +24 -0
  60. kontra/probes/__init__.py +20 -0
  61. kontra/probes/compare.py +400 -0
  62. kontra/probes/relationship.py +283 -0
  63. kontra/reporters/__init__.py +0 -0
  64. kontra/reporters/json_reporter.py +190 -0
  65. kontra/reporters/rich_reporter.py +11 -0
  66. kontra/rules/__init__.py +35 -0
  67. kontra/rules/base.py +186 -0
  68. kontra/rules/builtin/__init__.py +40 -0
  69. kontra/rules/builtin/allowed_values.py +156 -0
  70. kontra/rules/builtin/compare.py +188 -0
  71. kontra/rules/builtin/conditional_not_null.py +213 -0
  72. kontra/rules/builtin/conditional_range.py +310 -0
  73. kontra/rules/builtin/contains.py +138 -0
  74. kontra/rules/builtin/custom_sql_check.py +182 -0
  75. kontra/rules/builtin/disallowed_values.py +140 -0
  76. kontra/rules/builtin/dtype.py +203 -0
  77. kontra/rules/builtin/ends_with.py +129 -0
  78. kontra/rules/builtin/freshness.py +240 -0
  79. kontra/rules/builtin/length.py +193 -0
  80. kontra/rules/builtin/max_rows.py +35 -0
  81. kontra/rules/builtin/min_rows.py +46 -0
  82. kontra/rules/builtin/not_null.py +121 -0
  83. kontra/rules/builtin/range.py +222 -0
  84. kontra/rules/builtin/regex.py +143 -0
  85. kontra/rules/builtin/starts_with.py +129 -0
  86. kontra/rules/builtin/unique.py +124 -0
  87. kontra/rules/condition_parser.py +203 -0
  88. kontra/rules/execution_plan.py +455 -0
  89. kontra/rules/factory.py +103 -0
  90. kontra/rules/predicates.py +25 -0
  91. kontra/rules/registry.py +24 -0
  92. kontra/rules/static_predicates.py +120 -0
  93. kontra/scout/__init__.py +9 -0
  94. kontra/scout/backends/__init__.py +17 -0
  95. kontra/scout/backends/base.py +111 -0
  96. kontra/scout/backends/duckdb_backend.py +359 -0
  97. kontra/scout/backends/postgres_backend.py +519 -0
  98. kontra/scout/backends/sqlserver_backend.py +577 -0
  99. kontra/scout/dtype_mapping.py +150 -0
  100. kontra/scout/patterns.py +69 -0
  101. kontra/scout/profiler.py +801 -0
  102. kontra/scout/reporters/__init__.py +39 -0
  103. kontra/scout/reporters/json_reporter.py +165 -0
  104. kontra/scout/reporters/markdown_reporter.py +152 -0
  105. kontra/scout/reporters/rich_reporter.py +144 -0
  106. kontra/scout/store.py +208 -0
  107. kontra/scout/suggest.py +200 -0
  108. kontra/scout/types.py +652 -0
  109. kontra/state/__init__.py +29 -0
  110. kontra/state/backends/__init__.py +79 -0
  111. kontra/state/backends/base.py +348 -0
  112. kontra/state/backends/local.py +480 -0
  113. kontra/state/backends/postgres.py +1010 -0
  114. kontra/state/backends/s3.py +543 -0
  115. kontra/state/backends/sqlserver.py +969 -0
  116. kontra/state/fingerprint.py +166 -0
  117. kontra/state/types.py +1061 -0
  118. kontra/version.py +1 -0
  119. kontra-0.5.2.dist-info/METADATA +122 -0
  120. kontra-0.5.2.dist-info/RECORD +124 -0
  121. kontra-0.5.2.dist-info/WHEEL +5 -0
  122. kontra-0.5.2.dist-info/entry_points.txt +2 -0
  123. kontra-0.5.2.dist-info/licenses/LICENSE +17 -0
  124. 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,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.10.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ kontra = kontra.cli.main:main
@@ -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