truthound 1.0.8__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 (877) hide show
  1. truthound/__init__.py +162 -0
  2. truthound/adapters.py +100 -0
  3. truthound/api.py +365 -0
  4. truthound/audit/__init__.py +248 -0
  5. truthound/audit/core.py +967 -0
  6. truthound/audit/filters.py +620 -0
  7. truthound/audit/formatters.py +707 -0
  8. truthound/audit/logger.py +902 -0
  9. truthound/audit/middleware.py +571 -0
  10. truthound/audit/storage.py +1083 -0
  11. truthound/benchmark/__init__.py +123 -0
  12. truthound/benchmark/base.py +757 -0
  13. truthound/benchmark/comparison.py +635 -0
  14. truthound/benchmark/generators.py +706 -0
  15. truthound/benchmark/reporters.py +718 -0
  16. truthound/benchmark/runner.py +635 -0
  17. truthound/benchmark/scenarios.py +712 -0
  18. truthound/cache.py +252 -0
  19. truthound/checkpoint/__init__.py +136 -0
  20. truthound/checkpoint/actions/__init__.py +164 -0
  21. truthound/checkpoint/actions/base.py +324 -0
  22. truthound/checkpoint/actions/custom.py +234 -0
  23. truthound/checkpoint/actions/discord_notify.py +290 -0
  24. truthound/checkpoint/actions/email_notify.py +405 -0
  25. truthound/checkpoint/actions/github_action.py +406 -0
  26. truthound/checkpoint/actions/opsgenie.py +1499 -0
  27. truthound/checkpoint/actions/pagerduty.py +226 -0
  28. truthound/checkpoint/actions/slack_notify.py +233 -0
  29. truthound/checkpoint/actions/store_result.py +249 -0
  30. truthound/checkpoint/actions/teams_notify.py +1570 -0
  31. truthound/checkpoint/actions/telegram_notify.py +419 -0
  32. truthound/checkpoint/actions/update_docs.py +552 -0
  33. truthound/checkpoint/actions/webhook.py +293 -0
  34. truthound/checkpoint/analytics/__init__.py +147 -0
  35. truthound/checkpoint/analytics/aggregations/__init__.py +23 -0
  36. truthound/checkpoint/analytics/aggregations/rollup.py +481 -0
  37. truthound/checkpoint/analytics/aggregations/time_bucket.py +306 -0
  38. truthound/checkpoint/analytics/analyzers/__init__.py +17 -0
  39. truthound/checkpoint/analytics/analyzers/anomaly.py +386 -0
  40. truthound/checkpoint/analytics/analyzers/base.py +270 -0
  41. truthound/checkpoint/analytics/analyzers/forecast.py +421 -0
  42. truthound/checkpoint/analytics/analyzers/trend.py +314 -0
  43. truthound/checkpoint/analytics/models.py +292 -0
  44. truthound/checkpoint/analytics/protocols.py +549 -0
  45. truthound/checkpoint/analytics/service.py +718 -0
  46. truthound/checkpoint/analytics/stores/__init__.py +16 -0
  47. truthound/checkpoint/analytics/stores/base.py +306 -0
  48. truthound/checkpoint/analytics/stores/memory_store.py +353 -0
  49. truthound/checkpoint/analytics/stores/sqlite_store.py +557 -0
  50. truthound/checkpoint/analytics/stores/timescale_store.py +501 -0
  51. truthound/checkpoint/async_actions.py +794 -0
  52. truthound/checkpoint/async_base.py +708 -0
  53. truthound/checkpoint/async_checkpoint.py +617 -0
  54. truthound/checkpoint/async_runner.py +639 -0
  55. truthound/checkpoint/checkpoint.py +527 -0
  56. truthound/checkpoint/ci/__init__.py +61 -0
  57. truthound/checkpoint/ci/detector.py +355 -0
  58. truthound/checkpoint/ci/reporter.py +436 -0
  59. truthound/checkpoint/ci/templates.py +454 -0
  60. truthound/checkpoint/circuitbreaker/__init__.py +133 -0
  61. truthound/checkpoint/circuitbreaker/breaker.py +542 -0
  62. truthound/checkpoint/circuitbreaker/core.py +252 -0
  63. truthound/checkpoint/circuitbreaker/detection.py +459 -0
  64. truthound/checkpoint/circuitbreaker/middleware.py +389 -0
  65. truthound/checkpoint/circuitbreaker/registry.py +357 -0
  66. truthound/checkpoint/distributed/__init__.py +139 -0
  67. truthound/checkpoint/distributed/backends/__init__.py +35 -0
  68. truthound/checkpoint/distributed/backends/celery_backend.py +503 -0
  69. truthound/checkpoint/distributed/backends/kubernetes_backend.py +696 -0
  70. truthound/checkpoint/distributed/backends/local_backend.py +397 -0
  71. truthound/checkpoint/distributed/backends/ray_backend.py +625 -0
  72. truthound/checkpoint/distributed/base.py +774 -0
  73. truthound/checkpoint/distributed/orchestrator.py +765 -0
  74. truthound/checkpoint/distributed/protocols.py +842 -0
  75. truthound/checkpoint/distributed/registry.py +449 -0
  76. truthound/checkpoint/idempotency/__init__.py +120 -0
  77. truthound/checkpoint/idempotency/core.py +295 -0
  78. truthound/checkpoint/idempotency/fingerprint.py +454 -0
  79. truthound/checkpoint/idempotency/locking.py +604 -0
  80. truthound/checkpoint/idempotency/service.py +592 -0
  81. truthound/checkpoint/idempotency/stores.py +653 -0
  82. truthound/checkpoint/monitoring/__init__.py +134 -0
  83. truthound/checkpoint/monitoring/aggregators/__init__.py +15 -0
  84. truthound/checkpoint/monitoring/aggregators/base.py +372 -0
  85. truthound/checkpoint/monitoring/aggregators/realtime.py +300 -0
  86. truthound/checkpoint/monitoring/aggregators/window.py +493 -0
  87. truthound/checkpoint/monitoring/collectors/__init__.py +17 -0
  88. truthound/checkpoint/monitoring/collectors/base.py +257 -0
  89. truthound/checkpoint/monitoring/collectors/memory_collector.py +617 -0
  90. truthound/checkpoint/monitoring/collectors/prometheus_collector.py +451 -0
  91. truthound/checkpoint/monitoring/collectors/redis_collector.py +518 -0
  92. truthound/checkpoint/monitoring/events.py +410 -0
  93. truthound/checkpoint/monitoring/protocols.py +636 -0
  94. truthound/checkpoint/monitoring/service.py +578 -0
  95. truthound/checkpoint/monitoring/views/__init__.py +17 -0
  96. truthound/checkpoint/monitoring/views/base.py +172 -0
  97. truthound/checkpoint/monitoring/views/queue_view.py +220 -0
  98. truthound/checkpoint/monitoring/views/task_view.py +240 -0
  99. truthound/checkpoint/monitoring/views/worker_view.py +263 -0
  100. truthound/checkpoint/registry.py +337 -0
  101. truthound/checkpoint/runner.py +356 -0
  102. truthound/checkpoint/transaction/__init__.py +133 -0
  103. truthound/checkpoint/transaction/base.py +389 -0
  104. truthound/checkpoint/transaction/compensatable.py +537 -0
  105. truthound/checkpoint/transaction/coordinator.py +576 -0
  106. truthound/checkpoint/transaction/executor.py +622 -0
  107. truthound/checkpoint/transaction/idempotency.py +534 -0
  108. truthound/checkpoint/transaction/saga/__init__.py +143 -0
  109. truthound/checkpoint/transaction/saga/builder.py +584 -0
  110. truthound/checkpoint/transaction/saga/definition.py +515 -0
  111. truthound/checkpoint/transaction/saga/event_store.py +542 -0
  112. truthound/checkpoint/transaction/saga/patterns.py +833 -0
  113. truthound/checkpoint/transaction/saga/runner.py +718 -0
  114. truthound/checkpoint/transaction/saga/state_machine.py +793 -0
  115. truthound/checkpoint/transaction/saga/strategies.py +780 -0
  116. truthound/checkpoint/transaction/saga/testing.py +886 -0
  117. truthound/checkpoint/triggers/__init__.py +58 -0
  118. truthound/checkpoint/triggers/base.py +237 -0
  119. truthound/checkpoint/triggers/event.py +385 -0
  120. truthound/checkpoint/triggers/schedule.py +355 -0
  121. truthound/cli.py +2358 -0
  122. truthound/cli_modules/__init__.py +124 -0
  123. truthound/cli_modules/advanced/__init__.py +45 -0
  124. truthound/cli_modules/advanced/benchmark.py +343 -0
  125. truthound/cli_modules/advanced/docs.py +225 -0
  126. truthound/cli_modules/advanced/lineage.py +209 -0
  127. truthound/cli_modules/advanced/ml.py +320 -0
  128. truthound/cli_modules/advanced/realtime.py +196 -0
  129. truthound/cli_modules/checkpoint/__init__.py +46 -0
  130. truthound/cli_modules/checkpoint/init.py +114 -0
  131. truthound/cli_modules/checkpoint/list.py +71 -0
  132. truthound/cli_modules/checkpoint/run.py +159 -0
  133. truthound/cli_modules/checkpoint/validate.py +67 -0
  134. truthound/cli_modules/common/__init__.py +71 -0
  135. truthound/cli_modules/common/errors.py +414 -0
  136. truthound/cli_modules/common/options.py +419 -0
  137. truthound/cli_modules/common/output.py +507 -0
  138. truthound/cli_modules/common/protocol.py +552 -0
  139. truthound/cli_modules/core/__init__.py +48 -0
  140. truthound/cli_modules/core/check.py +123 -0
  141. truthound/cli_modules/core/compare.py +104 -0
  142. truthound/cli_modules/core/learn.py +57 -0
  143. truthound/cli_modules/core/mask.py +77 -0
  144. truthound/cli_modules/core/profile.py +65 -0
  145. truthound/cli_modules/core/scan.py +61 -0
  146. truthound/cli_modules/profiler/__init__.py +51 -0
  147. truthound/cli_modules/profiler/auto_profile.py +175 -0
  148. truthound/cli_modules/profiler/metadata.py +107 -0
  149. truthound/cli_modules/profiler/suite.py +283 -0
  150. truthound/cli_modules/registry.py +431 -0
  151. truthound/cli_modules/scaffolding/__init__.py +89 -0
  152. truthound/cli_modules/scaffolding/base.py +631 -0
  153. truthound/cli_modules/scaffolding/commands.py +545 -0
  154. truthound/cli_modules/scaffolding/plugins.py +1072 -0
  155. truthound/cli_modules/scaffolding/reporters.py +594 -0
  156. truthound/cli_modules/scaffolding/validators.py +1127 -0
  157. truthound/common/__init__.py +18 -0
  158. truthound/common/resilience/__init__.py +130 -0
  159. truthound/common/resilience/bulkhead.py +266 -0
  160. truthound/common/resilience/circuit_breaker.py +516 -0
  161. truthound/common/resilience/composite.py +332 -0
  162. truthound/common/resilience/config.py +292 -0
  163. truthound/common/resilience/protocols.py +217 -0
  164. truthound/common/resilience/rate_limiter.py +404 -0
  165. truthound/common/resilience/retry.py +341 -0
  166. truthound/datadocs/__init__.py +260 -0
  167. truthound/datadocs/base.py +571 -0
  168. truthound/datadocs/builder.py +761 -0
  169. truthound/datadocs/charts.py +764 -0
  170. truthound/datadocs/dashboard/__init__.py +63 -0
  171. truthound/datadocs/dashboard/app.py +576 -0
  172. truthound/datadocs/dashboard/components.py +584 -0
  173. truthound/datadocs/dashboard/state.py +240 -0
  174. truthound/datadocs/engine/__init__.py +46 -0
  175. truthound/datadocs/engine/context.py +376 -0
  176. truthound/datadocs/engine/pipeline.py +618 -0
  177. truthound/datadocs/engine/registry.py +469 -0
  178. truthound/datadocs/exporters/__init__.py +49 -0
  179. truthound/datadocs/exporters/base.py +198 -0
  180. truthound/datadocs/exporters/html.py +178 -0
  181. truthound/datadocs/exporters/json_exporter.py +253 -0
  182. truthound/datadocs/exporters/markdown.py +284 -0
  183. truthound/datadocs/exporters/pdf.py +392 -0
  184. truthound/datadocs/i18n/__init__.py +86 -0
  185. truthound/datadocs/i18n/catalog.py +960 -0
  186. truthound/datadocs/i18n/formatting.py +505 -0
  187. truthound/datadocs/i18n/loader.py +256 -0
  188. truthound/datadocs/i18n/plurals.py +378 -0
  189. truthound/datadocs/renderers/__init__.py +42 -0
  190. truthound/datadocs/renderers/base.py +401 -0
  191. truthound/datadocs/renderers/custom.py +342 -0
  192. truthound/datadocs/renderers/jinja.py +697 -0
  193. truthound/datadocs/sections.py +736 -0
  194. truthound/datadocs/styles.py +931 -0
  195. truthound/datadocs/themes/__init__.py +101 -0
  196. truthound/datadocs/themes/base.py +336 -0
  197. truthound/datadocs/themes/default.py +417 -0
  198. truthound/datadocs/themes/enterprise.py +419 -0
  199. truthound/datadocs/themes/loader.py +336 -0
  200. truthound/datadocs/themes.py +301 -0
  201. truthound/datadocs/transformers/__init__.py +57 -0
  202. truthound/datadocs/transformers/base.py +268 -0
  203. truthound/datadocs/transformers/enrichers.py +544 -0
  204. truthound/datadocs/transformers/filters.py +447 -0
  205. truthound/datadocs/transformers/i18n.py +468 -0
  206. truthound/datadocs/versioning/__init__.py +62 -0
  207. truthound/datadocs/versioning/diff.py +639 -0
  208. truthound/datadocs/versioning/storage.py +497 -0
  209. truthound/datadocs/versioning/version.py +358 -0
  210. truthound/datasources/__init__.py +223 -0
  211. truthound/datasources/_async_protocols.py +222 -0
  212. truthound/datasources/_protocols.py +159 -0
  213. truthound/datasources/adapters.py +428 -0
  214. truthound/datasources/async_base.py +599 -0
  215. truthound/datasources/async_factory.py +511 -0
  216. truthound/datasources/base.py +516 -0
  217. truthound/datasources/factory.py +433 -0
  218. truthound/datasources/nosql/__init__.py +47 -0
  219. truthound/datasources/nosql/base.py +487 -0
  220. truthound/datasources/nosql/elasticsearch.py +801 -0
  221. truthound/datasources/nosql/mongodb.py +636 -0
  222. truthound/datasources/pandas_optimized.py +582 -0
  223. truthound/datasources/pandas_source.py +216 -0
  224. truthound/datasources/polars_source.py +395 -0
  225. truthound/datasources/spark_source.py +479 -0
  226. truthound/datasources/sql/__init__.py +154 -0
  227. truthound/datasources/sql/base.py +710 -0
  228. truthound/datasources/sql/bigquery.py +410 -0
  229. truthound/datasources/sql/cloud_base.py +199 -0
  230. truthound/datasources/sql/databricks.py +471 -0
  231. truthound/datasources/sql/mysql.py +316 -0
  232. truthound/datasources/sql/oracle.py +427 -0
  233. truthound/datasources/sql/postgresql.py +321 -0
  234. truthound/datasources/sql/redshift.py +479 -0
  235. truthound/datasources/sql/snowflake.py +439 -0
  236. truthound/datasources/sql/sqlite.py +286 -0
  237. truthound/datasources/sql/sqlserver.py +437 -0
  238. truthound/datasources/streaming/__init__.py +47 -0
  239. truthound/datasources/streaming/base.py +350 -0
  240. truthound/datasources/streaming/kafka.py +670 -0
  241. truthound/decorators.py +98 -0
  242. truthound/docs/__init__.py +69 -0
  243. truthound/docs/extractor.py +971 -0
  244. truthound/docs/generator.py +601 -0
  245. truthound/docs/parser.py +1037 -0
  246. truthound/docs/renderer.py +999 -0
  247. truthound/drift/__init__.py +22 -0
  248. truthound/drift/compare.py +189 -0
  249. truthound/drift/detectors.py +464 -0
  250. truthound/drift/report.py +160 -0
  251. truthound/execution/__init__.py +65 -0
  252. truthound/execution/_protocols.py +324 -0
  253. truthound/execution/base.py +576 -0
  254. truthound/execution/distributed/__init__.py +179 -0
  255. truthound/execution/distributed/aggregations.py +731 -0
  256. truthound/execution/distributed/arrow_bridge.py +817 -0
  257. truthound/execution/distributed/base.py +550 -0
  258. truthound/execution/distributed/dask_engine.py +976 -0
  259. truthound/execution/distributed/mixins.py +766 -0
  260. truthound/execution/distributed/protocols.py +756 -0
  261. truthound/execution/distributed/ray_engine.py +1127 -0
  262. truthound/execution/distributed/registry.py +446 -0
  263. truthound/execution/distributed/spark_engine.py +1011 -0
  264. truthound/execution/distributed/validator_adapter.py +682 -0
  265. truthound/execution/pandas_engine.py +401 -0
  266. truthound/execution/polars_engine.py +497 -0
  267. truthound/execution/pushdown/__init__.py +230 -0
  268. truthound/execution/pushdown/ast.py +1550 -0
  269. truthound/execution/pushdown/builder.py +1550 -0
  270. truthound/execution/pushdown/dialects.py +1072 -0
  271. truthound/execution/pushdown/executor.py +829 -0
  272. truthound/execution/pushdown/optimizer.py +1041 -0
  273. truthound/execution/sql_engine.py +518 -0
  274. truthound/infrastructure/__init__.py +189 -0
  275. truthound/infrastructure/audit.py +1515 -0
  276. truthound/infrastructure/config.py +1133 -0
  277. truthound/infrastructure/encryption.py +1132 -0
  278. truthound/infrastructure/logging.py +1503 -0
  279. truthound/infrastructure/metrics.py +1220 -0
  280. truthound/lineage/__init__.py +89 -0
  281. truthound/lineage/base.py +746 -0
  282. truthound/lineage/impact_analysis.py +474 -0
  283. truthound/lineage/integrations/__init__.py +22 -0
  284. truthound/lineage/integrations/openlineage.py +548 -0
  285. truthound/lineage/tracker.py +512 -0
  286. truthound/lineage/visualization/__init__.py +33 -0
  287. truthound/lineage/visualization/protocols.py +145 -0
  288. truthound/lineage/visualization/renderers/__init__.py +20 -0
  289. truthound/lineage/visualization/renderers/cytoscape.py +329 -0
  290. truthound/lineage/visualization/renderers/d3.py +331 -0
  291. truthound/lineage/visualization/renderers/graphviz.py +276 -0
  292. truthound/lineage/visualization/renderers/mermaid.py +308 -0
  293. truthound/maskers.py +113 -0
  294. truthound/ml/__init__.py +124 -0
  295. truthound/ml/anomaly_models/__init__.py +31 -0
  296. truthound/ml/anomaly_models/ensemble.py +362 -0
  297. truthound/ml/anomaly_models/isolation_forest.py +444 -0
  298. truthound/ml/anomaly_models/statistical.py +392 -0
  299. truthound/ml/base.py +1178 -0
  300. truthound/ml/drift_detection/__init__.py +26 -0
  301. truthound/ml/drift_detection/concept.py +381 -0
  302. truthound/ml/drift_detection/distribution.py +361 -0
  303. truthound/ml/drift_detection/feature.py +442 -0
  304. truthound/ml/drift_detection/multivariate.py +495 -0
  305. truthound/ml/monitoring/__init__.py +88 -0
  306. truthound/ml/monitoring/alerting/__init__.py +33 -0
  307. truthound/ml/monitoring/alerting/handlers.py +427 -0
  308. truthound/ml/monitoring/alerting/rules.py +508 -0
  309. truthound/ml/monitoring/collectors/__init__.py +19 -0
  310. truthound/ml/monitoring/collectors/composite.py +105 -0
  311. truthound/ml/monitoring/collectors/drift.py +324 -0
  312. truthound/ml/monitoring/collectors/performance.py +179 -0
  313. truthound/ml/monitoring/collectors/quality.py +369 -0
  314. truthound/ml/monitoring/monitor.py +536 -0
  315. truthound/ml/monitoring/protocols.py +451 -0
  316. truthound/ml/monitoring/stores/__init__.py +15 -0
  317. truthound/ml/monitoring/stores/memory.py +201 -0
  318. truthound/ml/monitoring/stores/prometheus.py +296 -0
  319. truthound/ml/rule_learning/__init__.py +25 -0
  320. truthound/ml/rule_learning/constraint_miner.py +443 -0
  321. truthound/ml/rule_learning/pattern_learner.py +499 -0
  322. truthound/ml/rule_learning/profile_learner.py +462 -0
  323. truthound/multitenancy/__init__.py +326 -0
  324. truthound/multitenancy/core.py +852 -0
  325. truthound/multitenancy/integration.py +597 -0
  326. truthound/multitenancy/isolation.py +630 -0
  327. truthound/multitenancy/manager.py +770 -0
  328. truthound/multitenancy/middleware.py +765 -0
  329. truthound/multitenancy/quota.py +537 -0
  330. truthound/multitenancy/resolvers.py +603 -0
  331. truthound/multitenancy/storage.py +703 -0
  332. truthound/observability/__init__.py +307 -0
  333. truthound/observability/context.py +531 -0
  334. truthound/observability/instrumentation.py +611 -0
  335. truthound/observability/logging.py +887 -0
  336. truthound/observability/metrics.py +1157 -0
  337. truthound/observability/tracing/__init__.py +178 -0
  338. truthound/observability/tracing/baggage.py +310 -0
  339. truthound/observability/tracing/config.py +426 -0
  340. truthound/observability/tracing/exporter.py +787 -0
  341. truthound/observability/tracing/integration.py +1018 -0
  342. truthound/observability/tracing/otel/__init__.py +146 -0
  343. truthound/observability/tracing/otel/adapter.py +982 -0
  344. truthound/observability/tracing/otel/bridge.py +1177 -0
  345. truthound/observability/tracing/otel/compat.py +681 -0
  346. truthound/observability/tracing/otel/config.py +691 -0
  347. truthound/observability/tracing/otel/detection.py +327 -0
  348. truthound/observability/tracing/otel/protocols.py +426 -0
  349. truthound/observability/tracing/processor.py +561 -0
  350. truthound/observability/tracing/propagator.py +757 -0
  351. truthound/observability/tracing/provider.py +569 -0
  352. truthound/observability/tracing/resource.py +515 -0
  353. truthound/observability/tracing/sampler.py +487 -0
  354. truthound/observability/tracing/span.py +676 -0
  355. truthound/plugins/__init__.py +198 -0
  356. truthound/plugins/base.py +599 -0
  357. truthound/plugins/cli.py +680 -0
  358. truthound/plugins/dependencies/__init__.py +42 -0
  359. truthound/plugins/dependencies/graph.py +422 -0
  360. truthound/plugins/dependencies/resolver.py +417 -0
  361. truthound/plugins/discovery.py +379 -0
  362. truthound/plugins/docs/__init__.py +46 -0
  363. truthound/plugins/docs/extractor.py +444 -0
  364. truthound/plugins/docs/renderer.py +499 -0
  365. truthound/plugins/enterprise_manager.py +877 -0
  366. truthound/plugins/examples/__init__.py +19 -0
  367. truthound/plugins/examples/custom_validators.py +317 -0
  368. truthound/plugins/examples/slack_notifier.py +312 -0
  369. truthound/plugins/examples/xml_reporter.py +254 -0
  370. truthound/plugins/hooks.py +558 -0
  371. truthound/plugins/lifecycle/__init__.py +43 -0
  372. truthound/plugins/lifecycle/hot_reload.py +402 -0
  373. truthound/plugins/lifecycle/manager.py +371 -0
  374. truthound/plugins/manager.py +736 -0
  375. truthound/plugins/registry.py +338 -0
  376. truthound/plugins/security/__init__.py +93 -0
  377. truthound/plugins/security/exceptions.py +332 -0
  378. truthound/plugins/security/policies.py +348 -0
  379. truthound/plugins/security/protocols.py +643 -0
  380. truthound/plugins/security/sandbox/__init__.py +45 -0
  381. truthound/plugins/security/sandbox/context.py +158 -0
  382. truthound/plugins/security/sandbox/engines/__init__.py +19 -0
  383. truthound/plugins/security/sandbox/engines/container.py +379 -0
  384. truthound/plugins/security/sandbox/engines/noop.py +144 -0
  385. truthound/plugins/security/sandbox/engines/process.py +336 -0
  386. truthound/plugins/security/sandbox/factory.py +211 -0
  387. truthound/plugins/security/signing/__init__.py +57 -0
  388. truthound/plugins/security/signing/service.py +330 -0
  389. truthound/plugins/security/signing/trust_store.py +368 -0
  390. truthound/plugins/security/signing/verifier.py +459 -0
  391. truthound/plugins/versioning/__init__.py +41 -0
  392. truthound/plugins/versioning/constraints.py +297 -0
  393. truthound/plugins/versioning/resolver.py +329 -0
  394. truthound/profiler/__init__.py +1729 -0
  395. truthound/profiler/_lazy.py +452 -0
  396. truthound/profiler/ab_testing/__init__.py +80 -0
  397. truthound/profiler/ab_testing/analysis.py +449 -0
  398. truthound/profiler/ab_testing/base.py +257 -0
  399. truthound/profiler/ab_testing/experiment.py +395 -0
  400. truthound/profiler/ab_testing/tracking.py +368 -0
  401. truthound/profiler/auto_threshold.py +1170 -0
  402. truthound/profiler/base.py +579 -0
  403. truthound/profiler/cache_patterns.py +911 -0
  404. truthound/profiler/caching.py +1303 -0
  405. truthound/profiler/column_profiler.py +712 -0
  406. truthound/profiler/comparison.py +1007 -0
  407. truthound/profiler/custom_patterns.py +1170 -0
  408. truthound/profiler/dashboard/__init__.py +50 -0
  409. truthound/profiler/dashboard/app.py +476 -0
  410. truthound/profiler/dashboard/components.py +457 -0
  411. truthound/profiler/dashboard/config.py +72 -0
  412. truthound/profiler/distributed/__init__.py +83 -0
  413. truthound/profiler/distributed/base.py +281 -0
  414. truthound/profiler/distributed/dask_backend.py +498 -0
  415. truthound/profiler/distributed/local_backend.py +293 -0
  416. truthound/profiler/distributed/profiler.py +304 -0
  417. truthound/profiler/distributed/ray_backend.py +374 -0
  418. truthound/profiler/distributed/spark_backend.py +375 -0
  419. truthound/profiler/distributed.py +1366 -0
  420. truthound/profiler/enterprise_sampling.py +1065 -0
  421. truthound/profiler/errors.py +488 -0
  422. truthound/profiler/evolution/__init__.py +91 -0
  423. truthound/profiler/evolution/alerts.py +426 -0
  424. truthound/profiler/evolution/changes.py +206 -0
  425. truthound/profiler/evolution/compatibility.py +365 -0
  426. truthound/profiler/evolution/detector.py +372 -0
  427. truthound/profiler/evolution/protocols.py +121 -0
  428. truthound/profiler/generators/__init__.py +48 -0
  429. truthound/profiler/generators/base.py +384 -0
  430. truthound/profiler/generators/ml_rules.py +375 -0
  431. truthound/profiler/generators/pattern_rules.py +384 -0
  432. truthound/profiler/generators/schema_rules.py +267 -0
  433. truthound/profiler/generators/stats_rules.py +324 -0
  434. truthound/profiler/generators/suite_generator.py +857 -0
  435. truthound/profiler/i18n.py +1542 -0
  436. truthound/profiler/incremental.py +554 -0
  437. truthound/profiler/incremental_validation.py +1710 -0
  438. truthound/profiler/integration/__init__.py +73 -0
  439. truthound/profiler/integration/adapters.py +345 -0
  440. truthound/profiler/integration/context.py +371 -0
  441. truthound/profiler/integration/executor.py +527 -0
  442. truthound/profiler/integration/naming.py +75 -0
  443. truthound/profiler/integration/protocols.py +243 -0
  444. truthound/profiler/memory.py +1185 -0
  445. truthound/profiler/migration/__init__.py +60 -0
  446. truthound/profiler/migration/base.py +345 -0
  447. truthound/profiler/migration/manager.py +444 -0
  448. truthound/profiler/migration/v1_0_to_v1_1.py +484 -0
  449. truthound/profiler/ml/__init__.py +73 -0
  450. truthound/profiler/ml/base.py +244 -0
  451. truthound/profiler/ml/classifier.py +507 -0
  452. truthound/profiler/ml/feature_extraction.py +604 -0
  453. truthound/profiler/ml/pretrained.py +448 -0
  454. truthound/profiler/ml_inference.py +1276 -0
  455. truthound/profiler/native_patterns.py +815 -0
  456. truthound/profiler/observability.py +1184 -0
  457. truthound/profiler/process_timeout.py +1566 -0
  458. truthound/profiler/progress.py +568 -0
  459. truthound/profiler/progress_callbacks.py +1734 -0
  460. truthound/profiler/quality.py +1345 -0
  461. truthound/profiler/resilience.py +1180 -0
  462. truthound/profiler/sampled_matcher.py +794 -0
  463. truthound/profiler/sampling.py +1288 -0
  464. truthound/profiler/scheduling/__init__.py +82 -0
  465. truthound/profiler/scheduling/protocols.py +214 -0
  466. truthound/profiler/scheduling/scheduler.py +474 -0
  467. truthound/profiler/scheduling/storage.py +457 -0
  468. truthound/profiler/scheduling/triggers.py +449 -0
  469. truthound/profiler/schema.py +603 -0
  470. truthound/profiler/streaming.py +685 -0
  471. truthound/profiler/streaming_patterns.py +1354 -0
  472. truthound/profiler/suite_cli.py +625 -0
  473. truthound/profiler/suite_config.py +789 -0
  474. truthound/profiler/suite_export.py +1268 -0
  475. truthound/profiler/table_profiler.py +547 -0
  476. truthound/profiler/timeout.py +565 -0
  477. truthound/profiler/validation.py +1532 -0
  478. truthound/profiler/visualization/__init__.py +118 -0
  479. truthound/profiler/visualization/base.py +346 -0
  480. truthound/profiler/visualization/generator.py +1259 -0
  481. truthound/profiler/visualization/plotly_renderer.py +811 -0
  482. truthound/profiler/visualization/renderers.py +669 -0
  483. truthound/profiler/visualization/sections.py +540 -0
  484. truthound/profiler/visualization.py +2122 -0
  485. truthound/profiler/yaml_validation.py +1151 -0
  486. truthound/py.typed +0 -0
  487. truthound/ratelimit/__init__.py +248 -0
  488. truthound/ratelimit/algorithms.py +1108 -0
  489. truthound/ratelimit/core.py +573 -0
  490. truthound/ratelimit/integration.py +532 -0
  491. truthound/ratelimit/limiter.py +663 -0
  492. truthound/ratelimit/middleware.py +700 -0
  493. truthound/ratelimit/policy.py +792 -0
  494. truthound/ratelimit/storage.py +763 -0
  495. truthound/rbac/__init__.py +340 -0
  496. truthound/rbac/core.py +976 -0
  497. truthound/rbac/integration.py +760 -0
  498. truthound/rbac/manager.py +1052 -0
  499. truthound/rbac/middleware.py +842 -0
  500. truthound/rbac/policy.py +954 -0
  501. truthound/rbac/storage.py +878 -0
  502. truthound/realtime/__init__.py +141 -0
  503. truthound/realtime/adapters/__init__.py +43 -0
  504. truthound/realtime/adapters/base.py +533 -0
  505. truthound/realtime/adapters/kafka.py +487 -0
  506. truthound/realtime/adapters/kinesis.py +479 -0
  507. truthound/realtime/adapters/mock.py +243 -0
  508. truthound/realtime/base.py +553 -0
  509. truthound/realtime/factory.py +382 -0
  510. truthound/realtime/incremental.py +660 -0
  511. truthound/realtime/processing/__init__.py +67 -0
  512. truthound/realtime/processing/exactly_once.py +575 -0
  513. truthound/realtime/processing/state.py +547 -0
  514. truthound/realtime/processing/windows.py +647 -0
  515. truthound/realtime/protocols.py +569 -0
  516. truthound/realtime/streaming.py +605 -0
  517. truthound/realtime/testing/__init__.py +32 -0
  518. truthound/realtime/testing/containers.py +615 -0
  519. truthound/realtime/testing/fixtures.py +484 -0
  520. truthound/report.py +280 -0
  521. truthound/reporters/__init__.py +46 -0
  522. truthound/reporters/_protocols.py +30 -0
  523. truthound/reporters/base.py +324 -0
  524. truthound/reporters/ci/__init__.py +66 -0
  525. truthound/reporters/ci/azure.py +436 -0
  526. truthound/reporters/ci/base.py +509 -0
  527. truthound/reporters/ci/bitbucket.py +567 -0
  528. truthound/reporters/ci/circleci.py +547 -0
  529. truthound/reporters/ci/detection.py +364 -0
  530. truthound/reporters/ci/factory.py +182 -0
  531. truthound/reporters/ci/github.py +388 -0
  532. truthound/reporters/ci/gitlab.py +471 -0
  533. truthound/reporters/ci/jenkins.py +525 -0
  534. truthound/reporters/console_reporter.py +299 -0
  535. truthound/reporters/factory.py +211 -0
  536. truthound/reporters/html_reporter.py +524 -0
  537. truthound/reporters/json_reporter.py +256 -0
  538. truthound/reporters/markdown_reporter.py +280 -0
  539. truthound/reporters/sdk/__init__.py +174 -0
  540. truthound/reporters/sdk/builder.py +558 -0
  541. truthound/reporters/sdk/mixins.py +1150 -0
  542. truthound/reporters/sdk/schema.py +1493 -0
  543. truthound/reporters/sdk/templates.py +666 -0
  544. truthound/reporters/sdk/testing.py +968 -0
  545. truthound/scanners.py +170 -0
  546. truthound/scheduling/__init__.py +122 -0
  547. truthound/scheduling/cron.py +1136 -0
  548. truthound/scheduling/presets.py +212 -0
  549. truthound/schema.py +275 -0
  550. truthound/secrets/__init__.py +173 -0
  551. truthound/secrets/base.py +618 -0
  552. truthound/secrets/cloud.py +682 -0
  553. truthound/secrets/integration.py +507 -0
  554. truthound/secrets/manager.py +633 -0
  555. truthound/secrets/oidc/__init__.py +172 -0
  556. truthound/secrets/oidc/base.py +902 -0
  557. truthound/secrets/oidc/credential_provider.py +623 -0
  558. truthound/secrets/oidc/exchangers.py +1001 -0
  559. truthound/secrets/oidc/github/__init__.py +110 -0
  560. truthound/secrets/oidc/github/claims.py +718 -0
  561. truthound/secrets/oidc/github/enhanced_provider.py +693 -0
  562. truthound/secrets/oidc/github/trust_policy.py +742 -0
  563. truthound/secrets/oidc/github/verification.py +723 -0
  564. truthound/secrets/oidc/github/workflow.py +691 -0
  565. truthound/secrets/oidc/providers.py +825 -0
  566. truthound/secrets/providers.py +506 -0
  567. truthound/secrets/resolver.py +495 -0
  568. truthound/stores/__init__.py +177 -0
  569. truthound/stores/backends/__init__.py +18 -0
  570. truthound/stores/backends/_protocols.py +340 -0
  571. truthound/stores/backends/azure_blob.py +530 -0
  572. truthound/stores/backends/concurrent_filesystem.py +915 -0
  573. truthound/stores/backends/connection_pool.py +1365 -0
  574. truthound/stores/backends/database.py +743 -0
  575. truthound/stores/backends/filesystem.py +538 -0
  576. truthound/stores/backends/gcs.py +399 -0
  577. truthound/stores/backends/memory.py +354 -0
  578. truthound/stores/backends/s3.py +434 -0
  579. truthound/stores/backpressure/__init__.py +84 -0
  580. truthound/stores/backpressure/base.py +375 -0
  581. truthound/stores/backpressure/circuit_breaker.py +434 -0
  582. truthound/stores/backpressure/monitor.py +376 -0
  583. truthound/stores/backpressure/strategies.py +677 -0
  584. truthound/stores/base.py +551 -0
  585. truthound/stores/batching/__init__.py +65 -0
  586. truthound/stores/batching/base.py +305 -0
  587. truthound/stores/batching/buffer.py +370 -0
  588. truthound/stores/batching/store.py +248 -0
  589. truthound/stores/batching/writer.py +521 -0
  590. truthound/stores/caching/__init__.py +60 -0
  591. truthound/stores/caching/backends.py +684 -0
  592. truthound/stores/caching/base.py +356 -0
  593. truthound/stores/caching/store.py +305 -0
  594. truthound/stores/compression/__init__.py +193 -0
  595. truthound/stores/compression/adaptive.py +694 -0
  596. truthound/stores/compression/base.py +514 -0
  597. truthound/stores/compression/pipeline.py +868 -0
  598. truthound/stores/compression/providers.py +672 -0
  599. truthound/stores/compression/streaming.py +832 -0
  600. truthound/stores/concurrency/__init__.py +81 -0
  601. truthound/stores/concurrency/atomic.py +556 -0
  602. truthound/stores/concurrency/index.py +775 -0
  603. truthound/stores/concurrency/locks.py +576 -0
  604. truthound/stores/concurrency/manager.py +482 -0
  605. truthound/stores/encryption/__init__.py +297 -0
  606. truthound/stores/encryption/base.py +952 -0
  607. truthound/stores/encryption/keys.py +1191 -0
  608. truthound/stores/encryption/pipeline.py +903 -0
  609. truthound/stores/encryption/providers.py +953 -0
  610. truthound/stores/encryption/streaming.py +950 -0
  611. truthound/stores/expectations.py +227 -0
  612. truthound/stores/factory.py +246 -0
  613. truthound/stores/migration/__init__.py +75 -0
  614. truthound/stores/migration/base.py +480 -0
  615. truthound/stores/migration/manager.py +347 -0
  616. truthound/stores/migration/registry.py +382 -0
  617. truthound/stores/migration/store.py +559 -0
  618. truthound/stores/observability/__init__.py +106 -0
  619. truthound/stores/observability/audit.py +718 -0
  620. truthound/stores/observability/config.py +270 -0
  621. truthound/stores/observability/factory.py +208 -0
  622. truthound/stores/observability/metrics.py +636 -0
  623. truthound/stores/observability/protocols.py +410 -0
  624. truthound/stores/observability/store.py +570 -0
  625. truthound/stores/observability/tracing.py +784 -0
  626. truthound/stores/replication/__init__.py +76 -0
  627. truthound/stores/replication/base.py +260 -0
  628. truthound/stores/replication/monitor.py +269 -0
  629. truthound/stores/replication/store.py +439 -0
  630. truthound/stores/replication/syncer.py +391 -0
  631. truthound/stores/results.py +359 -0
  632. truthound/stores/retention/__init__.py +77 -0
  633. truthound/stores/retention/base.py +378 -0
  634. truthound/stores/retention/policies.py +621 -0
  635. truthound/stores/retention/scheduler.py +279 -0
  636. truthound/stores/retention/store.py +526 -0
  637. truthound/stores/streaming/__init__.py +138 -0
  638. truthound/stores/streaming/base.py +801 -0
  639. truthound/stores/streaming/database.py +984 -0
  640. truthound/stores/streaming/filesystem.py +719 -0
  641. truthound/stores/streaming/reader.py +629 -0
  642. truthound/stores/streaming/s3.py +843 -0
  643. truthound/stores/streaming/writer.py +790 -0
  644. truthound/stores/tiering/__init__.py +108 -0
  645. truthound/stores/tiering/base.py +462 -0
  646. truthound/stores/tiering/manager.py +249 -0
  647. truthound/stores/tiering/policies.py +692 -0
  648. truthound/stores/tiering/store.py +526 -0
  649. truthound/stores/versioning/__init__.py +56 -0
  650. truthound/stores/versioning/base.py +376 -0
  651. truthound/stores/versioning/store.py +660 -0
  652. truthound/stores/versioning/strategies.py +353 -0
  653. truthound/types.py +56 -0
  654. truthound/validators/__init__.py +774 -0
  655. truthound/validators/aggregate/__init__.py +27 -0
  656. truthound/validators/aggregate/central.py +116 -0
  657. truthound/validators/aggregate/extremes.py +116 -0
  658. truthound/validators/aggregate/spread.py +118 -0
  659. truthound/validators/aggregate/sum.py +64 -0
  660. truthound/validators/aggregate/type.py +78 -0
  661. truthound/validators/anomaly/__init__.py +93 -0
  662. truthound/validators/anomaly/base.py +431 -0
  663. truthound/validators/anomaly/ml_based.py +1190 -0
  664. truthound/validators/anomaly/multivariate.py +647 -0
  665. truthound/validators/anomaly/statistical.py +599 -0
  666. truthound/validators/base.py +1089 -0
  667. truthound/validators/business_rule/__init__.py +46 -0
  668. truthound/validators/business_rule/base.py +147 -0
  669. truthound/validators/business_rule/checksum.py +509 -0
  670. truthound/validators/business_rule/financial.py +526 -0
  671. truthound/validators/cache.py +733 -0
  672. truthound/validators/completeness/__init__.py +39 -0
  673. truthound/validators/completeness/conditional.py +73 -0
  674. truthound/validators/completeness/default.py +98 -0
  675. truthound/validators/completeness/empty.py +103 -0
  676. truthound/validators/completeness/nan.py +337 -0
  677. truthound/validators/completeness/null.py +152 -0
  678. truthound/validators/cross_table/__init__.py +17 -0
  679. truthound/validators/cross_table/aggregate.py +333 -0
  680. truthound/validators/cross_table/row_count.py +122 -0
  681. truthound/validators/datetime/__init__.py +29 -0
  682. truthound/validators/datetime/format.py +78 -0
  683. truthound/validators/datetime/freshness.py +269 -0
  684. truthound/validators/datetime/order.py +73 -0
  685. truthound/validators/datetime/parseable.py +185 -0
  686. truthound/validators/datetime/range.py +202 -0
  687. truthound/validators/datetime/timezone.py +69 -0
  688. truthound/validators/distribution/__init__.py +49 -0
  689. truthound/validators/distribution/distribution.py +128 -0
  690. truthound/validators/distribution/monotonic.py +119 -0
  691. truthound/validators/distribution/outlier.py +178 -0
  692. truthound/validators/distribution/quantile.py +80 -0
  693. truthound/validators/distribution/range.py +254 -0
  694. truthound/validators/distribution/set.py +125 -0
  695. truthound/validators/distribution/statistical.py +459 -0
  696. truthound/validators/drift/__init__.py +79 -0
  697. truthound/validators/drift/base.py +427 -0
  698. truthound/validators/drift/multi_feature.py +401 -0
  699. truthound/validators/drift/numeric.py +395 -0
  700. truthound/validators/drift/psi.py +446 -0
  701. truthound/validators/drift/statistical.py +510 -0
  702. truthound/validators/enterprise.py +1658 -0
  703. truthound/validators/geospatial/__init__.py +80 -0
  704. truthound/validators/geospatial/base.py +97 -0
  705. truthound/validators/geospatial/boundary.py +238 -0
  706. truthound/validators/geospatial/coordinate.py +351 -0
  707. truthound/validators/geospatial/distance.py +399 -0
  708. truthound/validators/geospatial/polygon.py +665 -0
  709. truthound/validators/i18n/__init__.py +308 -0
  710. truthound/validators/i18n/bidi.py +571 -0
  711. truthound/validators/i18n/catalogs.py +570 -0
  712. truthound/validators/i18n/dialects.py +763 -0
  713. truthound/validators/i18n/extended_catalogs.py +549 -0
  714. truthound/validators/i18n/formatting.py +1434 -0
  715. truthound/validators/i18n/loader.py +1020 -0
  716. truthound/validators/i18n/messages.py +521 -0
  717. truthound/validators/i18n/plural.py +683 -0
  718. truthound/validators/i18n/protocols.py +855 -0
  719. truthound/validators/i18n/tms.py +1162 -0
  720. truthound/validators/localization/__init__.py +53 -0
  721. truthound/validators/localization/base.py +122 -0
  722. truthound/validators/localization/chinese.py +362 -0
  723. truthound/validators/localization/japanese.py +275 -0
  724. truthound/validators/localization/korean.py +524 -0
  725. truthound/validators/memory/__init__.py +94 -0
  726. truthound/validators/memory/approximate_knn.py +506 -0
  727. truthound/validators/memory/base.py +547 -0
  728. truthound/validators/memory/sgd_online.py +719 -0
  729. truthound/validators/memory/streaming_ecdf.py +753 -0
  730. truthound/validators/ml_feature/__init__.py +54 -0
  731. truthound/validators/ml_feature/base.py +249 -0
  732. truthound/validators/ml_feature/correlation.py +299 -0
  733. truthound/validators/ml_feature/leakage.py +344 -0
  734. truthound/validators/ml_feature/null_impact.py +270 -0
  735. truthound/validators/ml_feature/scale.py +264 -0
  736. truthound/validators/multi_column/__init__.py +89 -0
  737. truthound/validators/multi_column/arithmetic.py +284 -0
  738. truthound/validators/multi_column/base.py +231 -0
  739. truthound/validators/multi_column/comparison.py +273 -0
  740. truthound/validators/multi_column/consistency.py +312 -0
  741. truthound/validators/multi_column/statistical.py +299 -0
  742. truthound/validators/optimization/__init__.py +164 -0
  743. truthound/validators/optimization/aggregation.py +563 -0
  744. truthound/validators/optimization/covariance.py +556 -0
  745. truthound/validators/optimization/geo.py +626 -0
  746. truthound/validators/optimization/graph.py +587 -0
  747. truthound/validators/optimization/orchestrator.py +970 -0
  748. truthound/validators/optimization/profiling.py +1312 -0
  749. truthound/validators/privacy/__init__.py +223 -0
  750. truthound/validators/privacy/base.py +635 -0
  751. truthound/validators/privacy/ccpa.py +670 -0
  752. truthound/validators/privacy/gdpr.py +728 -0
  753. truthound/validators/privacy/global_patterns.py +604 -0
  754. truthound/validators/privacy/plugins.py +867 -0
  755. truthound/validators/profiling/__init__.py +52 -0
  756. truthound/validators/profiling/base.py +175 -0
  757. truthound/validators/profiling/cardinality.py +312 -0
  758. truthound/validators/profiling/entropy.py +391 -0
  759. truthound/validators/profiling/frequency.py +455 -0
  760. truthound/validators/pushdown_support.py +660 -0
  761. truthound/validators/query/__init__.py +91 -0
  762. truthound/validators/query/aggregate.py +346 -0
  763. truthound/validators/query/base.py +246 -0
  764. truthound/validators/query/column.py +249 -0
  765. truthound/validators/query/expression.py +274 -0
  766. truthound/validators/query/result.py +323 -0
  767. truthound/validators/query/row_count.py +264 -0
  768. truthound/validators/referential/__init__.py +80 -0
  769. truthound/validators/referential/base.py +395 -0
  770. truthound/validators/referential/cascade.py +391 -0
  771. truthound/validators/referential/circular.py +563 -0
  772. truthound/validators/referential/foreign_key.py +624 -0
  773. truthound/validators/referential/orphan.py +485 -0
  774. truthound/validators/registry.py +112 -0
  775. truthound/validators/schema/__init__.py +41 -0
  776. truthound/validators/schema/column_count.py +142 -0
  777. truthound/validators/schema/column_exists.py +80 -0
  778. truthound/validators/schema/column_order.py +82 -0
  779. truthound/validators/schema/column_pair.py +85 -0
  780. truthound/validators/schema/column_pair_set.py +195 -0
  781. truthound/validators/schema/column_type.py +94 -0
  782. truthound/validators/schema/multi_column.py +53 -0
  783. truthound/validators/schema/multi_column_aggregate.py +175 -0
  784. truthound/validators/schema/referential.py +274 -0
  785. truthound/validators/schema/table_schema.py +91 -0
  786. truthound/validators/schema_validator.py +219 -0
  787. truthound/validators/sdk/__init__.py +250 -0
  788. truthound/validators/sdk/builder.py +680 -0
  789. truthound/validators/sdk/decorators.py +474 -0
  790. truthound/validators/sdk/enterprise/__init__.py +211 -0
  791. truthound/validators/sdk/enterprise/docs.py +725 -0
  792. truthound/validators/sdk/enterprise/fuzzing.py +659 -0
  793. truthound/validators/sdk/enterprise/licensing.py +709 -0
  794. truthound/validators/sdk/enterprise/manager.py +543 -0
  795. truthound/validators/sdk/enterprise/resources.py +628 -0
  796. truthound/validators/sdk/enterprise/sandbox.py +766 -0
  797. truthound/validators/sdk/enterprise/signing.py +603 -0
  798. truthound/validators/sdk/enterprise/templates.py +865 -0
  799. truthound/validators/sdk/enterprise/versioning.py +659 -0
  800. truthound/validators/sdk/templates.py +757 -0
  801. truthound/validators/sdk/testing.py +807 -0
  802. truthound/validators/security/__init__.py +181 -0
  803. truthound/validators/security/redos/__init__.py +182 -0
  804. truthound/validators/security/redos/core.py +861 -0
  805. truthound/validators/security/redos/cpu_monitor.py +593 -0
  806. truthound/validators/security/redos/cve_database.py +791 -0
  807. truthound/validators/security/redos/ml/__init__.py +155 -0
  808. truthound/validators/security/redos/ml/base.py +785 -0
  809. truthound/validators/security/redos/ml/datasets.py +618 -0
  810. truthound/validators/security/redos/ml/features.py +359 -0
  811. truthound/validators/security/redos/ml/models.py +1000 -0
  812. truthound/validators/security/redos/ml/predictor.py +507 -0
  813. truthound/validators/security/redos/ml/storage.py +632 -0
  814. truthound/validators/security/redos/ml/training.py +571 -0
  815. truthound/validators/security/redos/ml_analyzer.py +937 -0
  816. truthound/validators/security/redos/optimizer.py +674 -0
  817. truthound/validators/security/redos/profiler.py +682 -0
  818. truthound/validators/security/redos/re2_engine.py +709 -0
  819. truthound/validators/security/redos.py +886 -0
  820. truthound/validators/security/sql_security.py +1247 -0
  821. truthound/validators/streaming/__init__.py +126 -0
  822. truthound/validators/streaming/base.py +292 -0
  823. truthound/validators/streaming/completeness.py +210 -0
  824. truthound/validators/streaming/mixin.py +575 -0
  825. truthound/validators/streaming/range.py +308 -0
  826. truthound/validators/streaming/sources.py +846 -0
  827. truthound/validators/string/__init__.py +57 -0
  828. truthound/validators/string/casing.py +158 -0
  829. truthound/validators/string/charset.py +96 -0
  830. truthound/validators/string/format.py +501 -0
  831. truthound/validators/string/json.py +77 -0
  832. truthound/validators/string/json_schema.py +184 -0
  833. truthound/validators/string/length.py +104 -0
  834. truthound/validators/string/like_pattern.py +237 -0
  835. truthound/validators/string/regex.py +202 -0
  836. truthound/validators/string/regex_extended.py +435 -0
  837. truthound/validators/table/__init__.py +88 -0
  838. truthound/validators/table/base.py +78 -0
  839. truthound/validators/table/column_count.py +198 -0
  840. truthound/validators/table/freshness.py +362 -0
  841. truthound/validators/table/row_count.py +251 -0
  842. truthound/validators/table/schema.py +333 -0
  843. truthound/validators/table/size.py +285 -0
  844. truthound/validators/timeout/__init__.py +102 -0
  845. truthound/validators/timeout/advanced/__init__.py +247 -0
  846. truthound/validators/timeout/advanced/circuit_breaker.py +675 -0
  847. truthound/validators/timeout/advanced/prediction.py +773 -0
  848. truthound/validators/timeout/advanced/priority.py +618 -0
  849. truthound/validators/timeout/advanced/redis_backend.py +770 -0
  850. truthound/validators/timeout/advanced/retry.py +721 -0
  851. truthound/validators/timeout/advanced/sampling.py +788 -0
  852. truthound/validators/timeout/advanced/sla.py +661 -0
  853. truthound/validators/timeout/advanced/telemetry.py +804 -0
  854. truthound/validators/timeout/cascade.py +477 -0
  855. truthound/validators/timeout/deadline.py +657 -0
  856. truthound/validators/timeout/degradation.py +525 -0
  857. truthound/validators/timeout/distributed.py +597 -0
  858. truthound/validators/timeseries/__init__.py +89 -0
  859. truthound/validators/timeseries/base.py +326 -0
  860. truthound/validators/timeseries/completeness.py +617 -0
  861. truthound/validators/timeseries/gap.py +485 -0
  862. truthound/validators/timeseries/monotonic.py +310 -0
  863. truthound/validators/timeseries/seasonality.py +422 -0
  864. truthound/validators/timeseries/trend.py +510 -0
  865. truthound/validators/uniqueness/__init__.py +59 -0
  866. truthound/validators/uniqueness/approximate.py +475 -0
  867. truthound/validators/uniqueness/distinct_values.py +253 -0
  868. truthound/validators/uniqueness/duplicate.py +118 -0
  869. truthound/validators/uniqueness/primary_key.py +140 -0
  870. truthound/validators/uniqueness/unique.py +191 -0
  871. truthound/validators/uniqueness/within_record.py +599 -0
  872. truthound/validators/utils.py +756 -0
  873. truthound-1.0.8.dist-info/METADATA +474 -0
  874. truthound-1.0.8.dist-info/RECORD +877 -0
  875. truthound-1.0.8.dist-info/WHEEL +4 -0
  876. truthound-1.0.8.dist-info/entry_points.txt +2 -0
  877. truthound-1.0.8.dist-info/licenses/LICENSE +190 -0
@@ -0,0 +1,549 @@
1
+ """Extended Language Catalogs.
2
+
3
+ This module provides complete message catalogs for additional languages:
4
+ - Portuguese (pt) - with Brazilian and European variants
5
+ - Italian (it)
6
+ - Russian (ru)
7
+
8
+ These catalogs are complete translations of all validator messages,
9
+ ready for enterprise deployment.
10
+
11
+ Usage:
12
+ from truthound.validators.i18n.extended_catalogs import (
13
+ get_portuguese_messages,
14
+ get_italian_messages,
15
+ get_russian_messages,
16
+ get_arabic_messages,
17
+ get_hebrew_messages,
18
+ )
19
+
20
+ # Get Russian catalog
21
+ catalog = get_russian_messages()
22
+ print(catalog.get("null.values_found"))
23
+ # -> "Обнаружено {count} пустых значений в столбце '{column}'"
24
+ """
25
+
26
+ from __future__ import annotations
27
+
28
+ from truthound.validators.i18n.catalogs import ValidatorMessageCatalog
29
+
30
+
31
+ # ==============================================================================
32
+ # Portuguese Messages (Complete)
33
+ # ==============================================================================
34
+
35
+ _PORTUGUESE_MESSAGES: dict[str, str] = {
36
+ # Null/Completeness
37
+ "null.values_found": "Encontrados {count} valores nulos na coluna '{column}'",
38
+ "null.column_empty": "A coluna '{column}' está completamente vazia",
39
+ "null.above_threshold": "A taxa de nulos ({ratio:.1%}) excede o limite ({threshold:.1%}) na coluna '{column}'",
40
+
41
+ # Uniqueness
42
+ "unique.duplicates_found": "Encontrados {count} valores duplicados na coluna '{column}'",
43
+ "unique.composite_duplicates": "Encontradas {count} combinações duplicadas para as colunas {columns}",
44
+ "unique.key_violation": "Violação de chave primária: {count} chaves duplicadas em '{column}'",
45
+
46
+ # Type
47
+ "type.mismatch": "Incompatibilidade de tipo na coluna '{column}': esperado {expected}, encontrado {actual}",
48
+ "type.coercion_failed": "Não foi possível converter {count} valores na coluna '{column}' para {target_type}",
49
+ "type.inference_failed": "Não foi possível inferir o tipo da coluna '{column}'",
50
+
51
+ # Format
52
+ "format.invalid_email": "Encontrados {count} endereços de email inválidos na coluna '{column}'",
53
+ "format.invalid_phone": "Encontrados {count} números de telefone inválidos na coluna '{column}'",
54
+ "format.invalid_date": "Encontradas {count} datas inválidas na coluna '{column}'",
55
+ "format.invalid_url": "Encontrados {count} URLs inválidos na coluna '{column}'",
56
+ "format.pattern_mismatch": "Encontrados {count} valores que não correspondem ao padrão '{pattern}' na coluna '{column}'",
57
+ "format.regex_failed": "Validação de regex falhou para a coluna '{column}': {count} valores não correspondentes",
58
+
59
+ # Range
60
+ "range.out_of_bounds": "Encontrados {count} valores fora do intervalo [{min}, {max}] na coluna '{column}'",
61
+ "range.below_minimum": "Encontrados {count} valores abaixo do mínimo ({min}) na coluna '{column}'",
62
+ "range.above_maximum": "Encontrados {count} valores acima do máximo ({max}) na coluna '{column}'",
63
+ "range.outlier_detected": "Detectados {count} outliers estatísticos na coluna '{column}'",
64
+
65
+ # Referential
66
+ "ref.foreign_key_violation": "Encontradas {count} violações de chave estrangeira na coluna '{column}'",
67
+ "ref.missing_reference": "Encontrados {count} valores em '{column}' não presentes na coluna de referência '{ref_column}'",
68
+ "ref.orphan_records": "Encontrados {count} registros órfãos sem correspondência na coluna '{column}'",
69
+
70
+ # Statistical
71
+ "stat.distribution_anomaly": "Anomalia de distribuição detectada na coluna '{column}': {details}",
72
+ "stat.mean_out_of_range": "O valor médio ({mean:.2f}) está fora do intervalo esperado [{min}, {max}] para a coluna '{column}'",
73
+ "stat.variance_anomaly": "Variância incomum ({variance:.2f}) detectada na coluna '{column}'",
74
+ "stat.skewness_anomaly": "Assimetria ({skewness:.2f}) indica distribuição não normal na coluna '{column}'",
75
+
76
+ # Schema
77
+ "schema.column_missing": "A coluna esperada '{column}' está faltando no conjunto de dados",
78
+ "schema.column_extra": "Coluna inesperada '{column}' encontrada no conjunto de dados",
79
+ "schema.type_mismatch": "A coluna '{column}' tem tipo {actual}, esperado {expected}",
80
+ "schema.constraint_violated": "Restrição '{constraint}' violada para a coluna '{column}'",
81
+
82
+ # Cross-table
83
+ "cross.column_mismatch": "Valores na coluna '{column1}' não correspondem à coluna '{column2}'",
84
+ "cross.consistency_failed": "Verificação de consistência entre colunas falhou: {details}",
85
+
86
+ # Timeout
87
+ "timeout.exceeded": "A validação expirou após {seconds}s para '{operation}'",
88
+ "timeout.partial_result": "Resultados parciais retornados devido ao tempo limite: {validated}% dos dados validados",
89
+
90
+ # General
91
+ "validation.failed": "Validação falhou para a coluna '{column}': {reason}",
92
+ "validation.skipped": "Validação ignorada para a coluna '{column}': {reason}",
93
+ "validation.error": "Erro durante a validação: {error}",
94
+ }
95
+
96
+
97
+ # Brazilian Portuguese specific overrides
98
+ _PORTUGUESE_BR_MESSAGES: dict[str, str] = {
99
+ "format.invalid_phone": "Encontrados {count} números de celular inválidos na coluna '{column}'",
100
+ "null.column_empty": "A coluna '{column}' tá completamente vazia",
101
+ }
102
+
103
+
104
+ # European Portuguese specific overrides
105
+ _PORTUGUESE_PT_MESSAGES: dict[str, str] = {
106
+ "format.invalid_phone": "Encontrados {count} números de telemóvel inválidos na coluna '{column}'",
107
+ }
108
+
109
+
110
+ # ==============================================================================
111
+ # Italian Messages (Complete)
112
+ # ==============================================================================
113
+
114
+ _ITALIAN_MESSAGES: dict[str, str] = {
115
+ # Null/Completeness
116
+ "null.values_found": "Trovati {count} valori nulli nella colonna '{column}'",
117
+ "null.column_empty": "La colonna '{column}' è completamente vuota",
118
+ "null.above_threshold": "Il rapporto nulli ({ratio:.1%}) supera la soglia ({threshold:.1%}) nella colonna '{column}'",
119
+
120
+ # Uniqueness
121
+ "unique.duplicates_found": "Trovati {count} valori duplicati nella colonna '{column}'",
122
+ "unique.composite_duplicates": "Trovate {count} combinazioni duplicate per le colonne {columns}",
123
+ "unique.key_violation": "Violazione chiave primaria: {count} chiavi duplicate in '{column}'",
124
+
125
+ # Type
126
+ "type.mismatch": "Tipo non corrispondente nella colonna '{column}': previsto {expected}, trovato {actual}",
127
+ "type.coercion_failed": "Impossibile convertire {count} valori nella colonna '{column}' in {target_type}",
128
+ "type.inference_failed": "Impossibile dedurre il tipo della colonna '{column}'",
129
+
130
+ # Format
131
+ "format.invalid_email": "Trovati {count} indirizzi email non validi nella colonna '{column}'",
132
+ "format.invalid_phone": "Trovati {count} numeri di telefono non validi nella colonna '{column}'",
133
+ "format.invalid_date": "Trovate {count} date non valide nella colonna '{column}'",
134
+ "format.invalid_url": "Trovati {count} URL non validi nella colonna '{column}'",
135
+ "format.pattern_mismatch": "Trovati {count} valori che non corrispondono al pattern '{pattern}' nella colonna '{column}'",
136
+ "format.regex_failed": "Validazione regex fallita per la colonna '{column}': {count} valori non corrispondenti",
137
+
138
+ # Range
139
+ "range.out_of_bounds": "Trovati {count} valori fuori dall'intervallo [{min}, {max}] nella colonna '{column}'",
140
+ "range.below_minimum": "Trovati {count} valori sotto il minimo ({min}) nella colonna '{column}'",
141
+ "range.above_maximum": "Trovati {count} valori sopra il massimo ({max}) nella colonna '{column}'",
142
+ "range.outlier_detected": "Rilevati {count} outlier statistici nella colonna '{column}'",
143
+
144
+ # Referential
145
+ "ref.foreign_key_violation": "Trovate {count} violazioni di chiave esterna nella colonna '{column}'",
146
+ "ref.missing_reference": "Trovati {count} valori in '{column}' non presenti nella colonna di riferimento '{ref_column}'",
147
+ "ref.orphan_records": "Trovati {count} record orfani senza corrispondenza in '{column}'",
148
+
149
+ # Statistical
150
+ "stat.distribution_anomaly": "Anomalia di distribuzione rilevata nella colonna '{column}': {details}",
151
+ "stat.mean_out_of_range": "Il valore medio ({mean:.2f}) è fuori dall'intervallo previsto [{min}, {max}] per la colonna '{column}'",
152
+ "stat.variance_anomaly": "Varianza insolita ({variance:.2f}) rilevata nella colonna '{column}'",
153
+ "stat.skewness_anomaly": "L'asimmetria ({skewness:.2f}) indica una distribuzione non normale nella colonna '{column}'",
154
+
155
+ # Schema
156
+ "schema.column_missing": "La colonna prevista '{column}' manca nel dataset",
157
+ "schema.column_extra": "Colonna inaspettata '{column}' trovata nel dataset",
158
+ "schema.type_mismatch": "La colonna '{column}' ha tipo {actual}, previsto {expected}",
159
+ "schema.constraint_violated": "Vincolo '{constraint}' violato per la colonna '{column}'",
160
+
161
+ # Cross-table
162
+ "cross.column_mismatch": "I valori nella colonna '{column1}' non corrispondono alla colonna '{column2}'",
163
+ "cross.consistency_failed": "Controllo di coerenza tra colonne fallito: {details}",
164
+
165
+ # Timeout
166
+ "timeout.exceeded": "La validazione è scaduta dopo {seconds}s per '{operation}'",
167
+ "timeout.partial_result": "Risultati parziali restituiti a causa del timeout: {validated}% dei dati validati",
168
+
169
+ # General
170
+ "validation.failed": "Validazione fallita per la colonna '{column}': {reason}",
171
+ "validation.skipped": "Validazione saltata per la colonna '{column}': {reason}",
172
+ "validation.error": "Errore durante la validazione: {error}",
173
+ }
174
+
175
+
176
+ # ==============================================================================
177
+ # Russian Messages (Complete)
178
+ # ==============================================================================
179
+
180
+ _RUSSIAN_MESSAGES: dict[str, str] = {
181
+ # Null/Completeness
182
+ "null.values_found": "Обнаружено {count} пустых значений в столбце '{column}'",
183
+ "null.column_empty": "Столбец '{column}' полностью пуст",
184
+ "null.above_threshold": "Доля пустых значений ({ratio:.1%}) превышает порог ({threshold:.1%}) в столбце '{column}'",
185
+
186
+ # Uniqueness
187
+ "unique.duplicates_found": "Обнаружено {count} дублирующихся значений в столбце '{column}'",
188
+ "unique.composite_duplicates": "Обнаружено {count} дублирующихся комбинаций для столбцов {columns}",
189
+ "unique.key_violation": "Нарушение первичного ключа: {count} дублирующихся ключей в '{column}'",
190
+
191
+ # Type
192
+ "type.mismatch": "Несоответствие типа в столбце '{column}': ожидался {expected}, найден {actual}",
193
+ "type.coercion_failed": "Не удалось преобразовать {count} значений в столбце '{column}' в {target_type}",
194
+ "type.inference_failed": "Не удалось определить тип столбца '{column}'",
195
+
196
+ # Format
197
+ "format.invalid_email": "Обнаружено {count} недействительных email-адресов в столбце '{column}'",
198
+ "format.invalid_phone": "Обнаружено {count} недействительных номеров телефона в столбце '{column}'",
199
+ "format.invalid_date": "Обнаружено {count} недействительных дат в столбце '{column}'",
200
+ "format.invalid_url": "Обнаружено {count} недействительных URL в столбце '{column}'",
201
+ "format.pattern_mismatch": "Обнаружено {count} значений, не соответствующих шаблону '{pattern}' в столбце '{column}'",
202
+ "format.regex_failed": "Проверка регулярного выражения не прошла для столбца '{column}': {count} несоответствующих значений",
203
+
204
+ # Range
205
+ "range.out_of_bounds": "Обнаружено {count} значений вне диапазона [{min}, {max}] в столбце '{column}'",
206
+ "range.below_minimum": "Обнаружено {count} значений ниже минимума ({min}) в столбце '{column}'",
207
+ "range.above_maximum": "Обнаружено {count} значений выше максимума ({max}) в столбце '{column}'",
208
+ "range.outlier_detected": "Обнаружено {count} статистических выбросов в столбце '{column}'",
209
+
210
+ # Referential
211
+ "ref.foreign_key_violation": "Обнаружено {count} нарушений внешнего ключа в столбце '{column}'",
212
+ "ref.missing_reference": "Обнаружено {count} значений в '{column}', отсутствующих в ссылочном столбце '{ref_column}'",
213
+ "ref.orphan_records": "Обнаружено {count} сиротских записей без соответствия в '{column}'",
214
+
215
+ # Statistical
216
+ "stat.distribution_anomaly": "Обнаружена аномалия распределения в столбце '{column}': {details}",
217
+ "stat.mean_out_of_range": "Среднее значение ({mean:.2f}) выходит за ожидаемый диапазон [{min}, {max}] для столбца '{column}'",
218
+ "stat.variance_anomaly": "Необычная дисперсия ({variance:.2f}) обнаружена в столбце '{column}'",
219
+ "stat.skewness_anomaly": "Асимметрия ({skewness:.2f}) указывает на ненормальное распределение в столбце '{column}'",
220
+
221
+ # Schema
222
+ "schema.column_missing": "Ожидаемый столбец '{column}' отсутствует в наборе данных",
223
+ "schema.column_extra": "Неожиданный столбец '{column}' найден в наборе данных",
224
+ "schema.type_mismatch": "Столбец '{column}' имеет тип {actual}, ожидался {expected}",
225
+ "schema.constraint_violated": "Ограничение '{constraint}' нарушено для столбца '{column}'",
226
+
227
+ # Cross-table
228
+ "cross.column_mismatch": "Значения в столбце '{column1}' не соответствуют столбцу '{column2}'",
229
+ "cross.consistency_failed": "Проверка согласованности между столбцами не прошла: {details}",
230
+
231
+ # Timeout
232
+ "timeout.exceeded": "Время валидации истекло после {seconds}с для '{operation}'",
233
+ "timeout.partial_result": "Частичные результаты возвращены из-за тайм-аута: {validated}% данных проверено",
234
+
235
+ # General
236
+ "validation.failed": "Валидация не прошла для столбца '{column}': {reason}",
237
+ "validation.skipped": "Валидация пропущена для столбца '{column}': {reason}",
238
+ "validation.error": "Ошибка во время валидации: {error}",
239
+ }
240
+
241
+
242
+ # ==============================================================================
243
+ # Arabic Messages (Complete)
244
+ # ==============================================================================
245
+
246
+ _ARABIC_MESSAGES: dict[str, str] = {
247
+ # Null/Completeness
248
+ "null.values_found": "تم العثور على {count} قيمة فارغة في العمود '{column}'",
249
+ "null.column_empty": "العمود '{column}' فارغ تماماً",
250
+ "null.above_threshold": "نسبة القيم الفارغة ({ratio:.1%}) تتجاوز الحد ({threshold:.1%}) في العمود '{column}'",
251
+
252
+ # Uniqueness
253
+ "unique.duplicates_found": "تم العثور على {count} قيمة مكررة في العمود '{column}'",
254
+ "unique.composite_duplicates": "تم العثور على {count} تركيبة مكررة للأعمدة {columns}",
255
+ "unique.key_violation": "انتهاك المفتاح الأساسي: {count} مفتاح مكرر في '{column}'",
256
+
257
+ # Type
258
+ "type.mismatch": "عدم تطابق النوع في العمود '{column}': متوقع {expected}، وُجد {actual}",
259
+ "type.coercion_failed": "تعذر تحويل {count} قيمة في العمود '{column}' إلى {target_type}",
260
+ "type.inference_failed": "تعذر استنتاج نوع العمود '{column}'",
261
+
262
+ # Format
263
+ "format.invalid_email": "تم العثور على {count} عنوان بريد إلكتروني غير صالح في العمود '{column}'",
264
+ "format.invalid_phone": "تم العثور على {count} رقم هاتف غير صالح في العمود '{column}'",
265
+ "format.invalid_date": "تم العثور على {count} تاريخ غير صالح في العمود '{column}'",
266
+ "format.invalid_url": "تم العثور على {count} عنوان URL غير صالح في العمود '{column}'",
267
+ "format.pattern_mismatch": "تم العثور على {count} قيمة لا تطابق النمط '{pattern}' في العمود '{column}'",
268
+ "format.regex_failed": "فشل التحقق من التعبير النمطي للعمود '{column}': {count} قيمة غير مطابقة",
269
+
270
+ # Range
271
+ "range.out_of_bounds": "تم العثور على {count} قيمة خارج النطاق [{min}, {max}] في العمود '{column}'",
272
+ "range.below_minimum": "تم العثور على {count} قيمة أقل من الحد الأدنى ({min}) في العمود '{column}'",
273
+ "range.above_maximum": "تم العثور على {count} قيمة أعلى من الحد الأقصى ({max}) في العمود '{column}'",
274
+ "range.outlier_detected": "تم اكتشاف {count} قيمة شاذة إحصائياً في العمود '{column}'",
275
+
276
+ # Referential
277
+ "ref.foreign_key_violation": "تم العثور على {count} انتهاك للمفتاح الخارجي في العمود '{column}'",
278
+ "ref.missing_reference": "تم العثور على {count} قيمة في '{column}' غير موجودة في العمود المرجعي '{ref_column}'",
279
+ "ref.orphan_records": "تم العثور على {count} سجل يتيم بدون تطابق في '{column}'",
280
+
281
+ # Statistical
282
+ "stat.distribution_anomaly": "تم اكتشاف شذوذ في التوزيع في العمود '{column}': {details}",
283
+ "stat.mean_out_of_range": "القيمة المتوسطة ({mean:.2f}) خارج النطاق المتوقع [{min}, {max}] للعمود '{column}'",
284
+ "stat.variance_anomaly": "تباين غير عادي ({variance:.2f}) تم اكتشافه في العمود '{column}'",
285
+ "stat.skewness_anomaly": "الالتواء ({skewness:.2f}) يشير إلى توزيع غير طبيعي في العمود '{column}'",
286
+
287
+ # Schema
288
+ "schema.column_missing": "العمود المتوقع '{column}' مفقود من مجموعة البيانات",
289
+ "schema.column_extra": "تم العثور على عمود غير متوقع '{column}' في مجموعة البيانات",
290
+ "schema.type_mismatch": "العمود '{column}' له النوع {actual}، المتوقع {expected}",
291
+ "schema.constraint_violated": "تم انتهاك القيد '{constraint}' للعمود '{column}'",
292
+
293
+ # Cross-table
294
+ "cross.column_mismatch": "القيم في العمود '{column1}' لا تتطابق مع العمود '{column2}'",
295
+ "cross.consistency_failed": "فشل التحقق من الاتساق بين الأعمدة: {details}",
296
+
297
+ # Timeout
298
+ "timeout.exceeded": "انتهت مهلة التحقق بعد {seconds} ثانية لـ '{operation}'",
299
+ "timeout.partial_result": "تم إرجاع نتائج جزئية بسبب انتهاء المهلة: تم التحقق من {validated}% من البيانات",
300
+
301
+ # General
302
+ "validation.failed": "فشل التحقق للعمود '{column}': {reason}",
303
+ "validation.skipped": "تم تخطي التحقق للعمود '{column}': {reason}",
304
+ "validation.error": "خطأ أثناء التحقق: {error}",
305
+ }
306
+
307
+
308
+ # ==============================================================================
309
+ # Hebrew Messages (Complete)
310
+ # ==============================================================================
311
+
312
+ _HEBREW_MESSAGES: dict[str, str] = {
313
+ # Null/Completeness
314
+ "null.values_found": "נמצאו {count} ערכים ריקים בעמודה '{column}'",
315
+ "null.column_empty": "העמודה '{column}' ריקה לחלוטין",
316
+ "null.above_threshold": "יחס הערכים הריקים ({ratio:.1%}) חורג מהסף ({threshold:.1%}) בעמודה '{column}'",
317
+
318
+ # Uniqueness
319
+ "unique.duplicates_found": "נמצאו {count} ערכים כפולים בעמודה '{column}'",
320
+ "unique.composite_duplicates": "נמצאו {count} שילובים כפולים עבור העמודות {columns}",
321
+ "unique.key_violation": "הפרת מפתח ראשי: {count} מפתחות כפולים ב-'{column}'",
322
+
323
+ # Type
324
+ "type.mismatch": "אי התאמת סוג בעמודה '{column}': צפוי {expected}, נמצא {actual}",
325
+ "type.coercion_failed": "לא ניתן להמיר {count} ערכים בעמודה '{column}' ל-{target_type}",
326
+ "type.inference_failed": "לא ניתן להסיק את הסוג של העמודה '{column}'",
327
+
328
+ # Format
329
+ "format.invalid_email": "נמצאו {count} כתובות דוא\"ל לא תקינות בעמודה '{column}'",
330
+ "format.invalid_phone": "נמצאו {count} מספרי טלפון לא תקינים בעמודה '{column}'",
331
+ "format.invalid_date": "נמצאו {count} תאריכים לא תקינים בעמודה '{column}'",
332
+ "format.invalid_url": "נמצאו {count} כתובות URL לא תקינות בעמודה '{column}'",
333
+ "format.pattern_mismatch": "נמצאו {count} ערכים שאינם תואמים לתבנית '{pattern}' בעמודה '{column}'",
334
+ "format.regex_failed": "אימות ביטוי רגולרי נכשל עבור העמודה '{column}': {count} ערכים לא תואמים",
335
+
336
+ # Range
337
+ "range.out_of_bounds": "נמצאו {count} ערכים מחוץ לטווח [{min}, {max}] בעמודה '{column}'",
338
+ "range.below_minimum": "נמצאו {count} ערכים מתחת למינימום ({min}) בעמודה '{column}'",
339
+ "range.above_maximum": "נמצאו {count} ערכים מעל המקסימום ({max}) בעמודה '{column}'",
340
+ "range.outlier_detected": "זוהו {count} חריגים סטטיסטיים בעמודה '{column}'",
341
+
342
+ # Referential
343
+ "ref.foreign_key_violation": "נמצאו {count} הפרות מפתח זר בעמודה '{column}'",
344
+ "ref.missing_reference": "נמצאו {count} ערכים ב-'{column}' שאינם קיימים בעמודת ההפניה '{ref_column}'",
345
+ "ref.orphan_records": "נמצאו {count} רשומות יתומות ללא התאמה ב-'{column}'",
346
+
347
+ # Statistical
348
+ "stat.distribution_anomaly": "זוהתה חריגה בהתפלגות בעמודה '{column}': {details}",
349
+ "stat.mean_out_of_range": "הערך הממוצע ({mean:.2f}) מחוץ לטווח הצפוי [{min}, {max}] עבור העמודה '{column}'",
350
+ "stat.variance_anomaly": "שונות חריגה ({variance:.2f}) זוהתה בעמודה '{column}'",
351
+ "stat.skewness_anomaly": "העיוות ({skewness:.2f}) מצביע על התפלגות לא נורמלית בעמודה '{column}'",
352
+
353
+ # Schema
354
+ "schema.column_missing": "העמודה הצפויה '{column}' חסרה ממערך הנתונים",
355
+ "schema.column_extra": "נמצאה עמודה לא צפויה '{column}' במערך הנתונים",
356
+ "schema.type_mismatch": "לעמודה '{column}' יש סוג {actual}, צפוי {expected}",
357
+ "schema.constraint_violated": "האילוץ '{constraint}' הופר עבור העמודה '{column}'",
358
+
359
+ # Cross-table
360
+ "cross.column_mismatch": "הערכים בעמודה '{column1}' אינם תואמים לעמודה '{column2}'",
361
+ "cross.consistency_failed": "בדיקת העקביות בין העמודות נכשלה: {details}",
362
+
363
+ # Timeout
364
+ "timeout.exceeded": "האימות פג תוקף לאחר {seconds} שניות עבור '{operation}'",
365
+ "timeout.partial_result": "תוצאות חלקיות הוחזרו עקב פג תוקף: {validated}% מהנתונים אומתו",
366
+
367
+ # General
368
+ "validation.failed": "האימות נכשל עבור העמודה '{column}': {reason}",
369
+ "validation.skipped": "האימות דולג עבור העמודה '{column}': {reason}",
370
+ "validation.error": "שגיאה במהלך האימות: {error}",
371
+ }
372
+
373
+
374
+ # ==============================================================================
375
+ # Persian/Farsi Messages (Complete)
376
+ # ==============================================================================
377
+
378
+ _PERSIAN_MESSAGES: dict[str, str] = {
379
+ # Null/Completeness
380
+ "null.values_found": "{count} مقدار تهی در ستون '{column}' یافت شد",
381
+ "null.column_empty": "ستون '{column}' کاملاً خالی است",
382
+ "null.above_threshold": "نسبت مقادیر تهی ({ratio:.1%}) از آستانه ({threshold:.1%}) در ستون '{column}' فراتر رفته است",
383
+
384
+ # Uniqueness
385
+ "unique.duplicates_found": "{count} مقدار تکراری در ستون '{column}' یافت شد",
386
+ "unique.composite_duplicates": "{count} ترکیب تکراری برای ستون‌های {columns} یافت شد",
387
+ "unique.key_violation": "نقض کلید اصلی: {count} کلید تکراری در '{column}'",
388
+
389
+ # Type
390
+ "type.mismatch": "عدم تطابق نوع در ستون '{column}': انتظار {expected}، یافت شده {actual}",
391
+ "type.coercion_failed": "امکان تبدیل {count} مقدار در ستون '{column}' به {target_type} وجود ندارد",
392
+ "type.inference_failed": "امکان استنتاج نوع ستون '{column}' وجود ندارد",
393
+
394
+ # Format
395
+ "format.invalid_email": "{count} آدرس ایمیل نامعتبر در ستون '{column}' یافت شد",
396
+ "format.invalid_phone": "{count} شماره تلفن نامعتبر در ستون '{column}' یافت شد",
397
+ "format.invalid_date": "{count} تاریخ نامعتبر در ستون '{column}' یافت شد",
398
+ "format.invalid_url": "{count} آدرس URL نامعتبر در ستون '{column}' یافت شد",
399
+ "format.pattern_mismatch": "{count} مقدار که با الگوی '{pattern}' مطابقت ندارند در ستون '{column}' یافت شد",
400
+ "format.regex_failed": "اعتبارسنجی regex برای ستون '{column}' ناموفق بود: {count} مقدار نامطابق",
401
+
402
+ # Range
403
+ "range.out_of_bounds": "{count} مقدار خارج از محدوده [{min}, {max}] در ستون '{column}' یافت شد",
404
+ "range.below_minimum": "{count} مقدار کمتر از حداقل ({min}) در ستون '{column}' یافت شد",
405
+ "range.above_maximum": "{count} مقدار بیشتر از حداکثر ({max}) در ستون '{column}' یافت شد",
406
+ "range.outlier_detected": "{count} داده پرت آماری در ستون '{column}' شناسایی شد",
407
+
408
+ # General
409
+ "validation.failed": "اعتبارسنجی برای ستون '{column}' ناموفق بود: {reason}",
410
+ "validation.skipped": "اعتبارسنجی برای ستون '{column}' نادیده گرفته شد: {reason}",
411
+ "validation.error": "خطا در حین اعتبارسنجی: {error}",
412
+ }
413
+
414
+
415
+ # ==============================================================================
416
+ # Catalog Accessor Functions
417
+ # ==============================================================================
418
+
419
+ def get_portuguese_messages() -> ValidatorMessageCatalog:
420
+ """Get Portuguese message catalog.
421
+
422
+ Returns:
423
+ Portuguese message catalog
424
+ """
425
+ return ValidatorMessageCatalog.from_dict(
426
+ "pt",
427
+ _PORTUGUESE_MESSAGES,
428
+ metadata={"name": "Português", "complete": True},
429
+ )
430
+
431
+
432
+ def get_portuguese_br_messages() -> ValidatorMessageCatalog:
433
+ """Get Brazilian Portuguese message catalog.
434
+
435
+ Returns:
436
+ Brazilian Portuguese message catalog
437
+ """
438
+ messages = {**_PORTUGUESE_MESSAGES, **_PORTUGUESE_BR_MESSAGES}
439
+ return ValidatorMessageCatalog.from_dict(
440
+ "pt-BR",
441
+ messages,
442
+ metadata={"name": "Português Brasileiro", "complete": True, "base": "pt"},
443
+ )
444
+
445
+
446
+ def get_portuguese_pt_messages() -> ValidatorMessageCatalog:
447
+ """Get European Portuguese message catalog.
448
+
449
+ Returns:
450
+ European Portuguese message catalog
451
+ """
452
+ messages = {**_PORTUGUESE_MESSAGES, **_PORTUGUESE_PT_MESSAGES}
453
+ return ValidatorMessageCatalog.from_dict(
454
+ "pt-PT",
455
+ messages,
456
+ metadata={"name": "Português Europeu", "complete": True, "base": "pt"},
457
+ )
458
+
459
+
460
+ def get_italian_messages() -> ValidatorMessageCatalog:
461
+ """Get Italian message catalog.
462
+
463
+ Returns:
464
+ Italian message catalog
465
+ """
466
+ return ValidatorMessageCatalog.from_dict(
467
+ "it",
468
+ _ITALIAN_MESSAGES,
469
+ metadata={"name": "Italiano", "complete": True},
470
+ )
471
+
472
+
473
+ def get_russian_messages() -> ValidatorMessageCatalog:
474
+ """Get Russian message catalog.
475
+
476
+ Returns:
477
+ Russian message catalog
478
+ """
479
+ return ValidatorMessageCatalog.from_dict(
480
+ "ru",
481
+ _RUSSIAN_MESSAGES,
482
+ metadata={"name": "Русский", "complete": True},
483
+ )
484
+
485
+
486
+ def get_arabic_messages() -> ValidatorMessageCatalog:
487
+ """Get Arabic message catalog.
488
+
489
+ Returns:
490
+ Arabic message catalog (RTL)
491
+ """
492
+ return ValidatorMessageCatalog.from_dict(
493
+ "ar",
494
+ _ARABIC_MESSAGES,
495
+ metadata={"name": "العربية", "complete": True, "direction": "rtl"},
496
+ )
497
+
498
+
499
+ def get_hebrew_messages() -> ValidatorMessageCatalog:
500
+ """Get Hebrew message catalog.
501
+
502
+ Returns:
503
+ Hebrew message catalog (RTL)
504
+ """
505
+ return ValidatorMessageCatalog.from_dict(
506
+ "he",
507
+ _HEBREW_MESSAGES,
508
+ metadata={"name": "עברית", "complete": True, "direction": "rtl"},
509
+ )
510
+
511
+
512
+ def get_persian_messages() -> ValidatorMessageCatalog:
513
+ """Get Persian/Farsi message catalog.
514
+
515
+ Returns:
516
+ Persian message catalog (RTL)
517
+ """
518
+ return ValidatorMessageCatalog.from_dict(
519
+ "fa",
520
+ _PERSIAN_MESSAGES,
521
+ metadata={"name": "فارسی", "complete": False, "direction": "rtl"},
522
+ )
523
+
524
+
525
+ def get_all_extended_catalogs() -> dict[str, ValidatorMessageCatalog]:
526
+ """Get all extended catalogs.
527
+
528
+ Returns:
529
+ Dictionary of locale code to catalog
530
+ """
531
+ return {
532
+ "pt": get_portuguese_messages(),
533
+ "pt-BR": get_portuguese_br_messages(),
534
+ "pt-PT": get_portuguese_pt_messages(),
535
+ "it": get_italian_messages(),
536
+ "ru": get_russian_messages(),
537
+ "ar": get_arabic_messages(),
538
+ "he": get_hebrew_messages(),
539
+ "fa": get_persian_messages(),
540
+ }
541
+
542
+
543
+ def get_extended_supported_locales() -> list[str]:
544
+ """Get list of extended supported locales.
545
+
546
+ Returns:
547
+ List of locale codes
548
+ """
549
+ return ["pt", "pt-BR", "pt-PT", "it", "ru", "ar", "he", "fa"]