truthound-dashboard 1.4.4__py3-none-any.whl → 1.5.0__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.
- truthound_dashboard/api/alerts.py +75 -86
- truthound_dashboard/api/anomaly.py +7 -13
- truthound_dashboard/api/cross_alerts.py +38 -52
- truthound_dashboard/api/drift.py +49 -59
- truthound_dashboard/api/drift_monitor.py +234 -79
- truthound_dashboard/api/enterprise_sampling.py +498 -0
- truthound_dashboard/api/history.py +57 -5
- truthound_dashboard/api/lineage.py +3 -48
- truthound_dashboard/api/maintenance.py +104 -49
- truthound_dashboard/api/mask.py +1 -2
- truthound_dashboard/api/middleware.py +2 -1
- truthound_dashboard/api/model_monitoring.py +435 -311
- truthound_dashboard/api/notifications.py +227 -191
- truthound_dashboard/api/notifications_advanced.py +21 -20
- truthound_dashboard/api/observability.py +586 -0
- truthound_dashboard/api/plugins.py +2 -433
- truthound_dashboard/api/profile.py +199 -37
- truthound_dashboard/api/quality_reporter.py +701 -0
- truthound_dashboard/api/reports.py +7 -16
- truthound_dashboard/api/router.py +66 -0
- truthound_dashboard/api/rule_suggestions.py +5 -5
- truthound_dashboard/api/scan.py +17 -19
- truthound_dashboard/api/schedules.py +85 -50
- truthound_dashboard/api/schema_evolution.py +6 -6
- truthound_dashboard/api/schema_watcher.py +667 -0
- truthound_dashboard/api/sources.py +98 -27
- truthound_dashboard/api/tiering.py +1323 -0
- truthound_dashboard/api/triggers.py +14 -11
- truthound_dashboard/api/validations.py +12 -11
- truthound_dashboard/api/versioning.py +1 -6
- truthound_dashboard/core/__init__.py +129 -3
- truthound_dashboard/core/actions/__init__.py +62 -0
- truthound_dashboard/core/actions/custom.py +426 -0
- truthound_dashboard/core/actions/notifications.py +910 -0
- truthound_dashboard/core/actions/storage.py +472 -0
- truthound_dashboard/core/actions/webhook.py +281 -0
- truthound_dashboard/core/anomaly.py +262 -67
- truthound_dashboard/core/anomaly_explainer.py +4 -3
- truthound_dashboard/core/backends/__init__.py +67 -0
- truthound_dashboard/core/backends/base.py +299 -0
- truthound_dashboard/core/backends/errors.py +191 -0
- truthound_dashboard/core/backends/factory.py +423 -0
- truthound_dashboard/core/backends/mock_backend.py +451 -0
- truthound_dashboard/core/backends/truthound_backend.py +718 -0
- truthound_dashboard/core/checkpoint/__init__.py +87 -0
- truthound_dashboard/core/checkpoint/adapters.py +814 -0
- truthound_dashboard/core/checkpoint/checkpoint.py +491 -0
- truthound_dashboard/core/checkpoint/runner.py +270 -0
- truthound_dashboard/core/connections.py +437 -10
- truthound_dashboard/core/converters/__init__.py +14 -0
- truthound_dashboard/core/converters/truthound.py +620 -0
- truthound_dashboard/core/cross_alerts.py +540 -320
- truthound_dashboard/core/datasource_factory.py +1672 -0
- truthound_dashboard/core/drift_monitor.py +216 -20
- truthound_dashboard/core/enterprise_sampling.py +1291 -0
- truthound_dashboard/core/interfaces/__init__.py +225 -0
- truthound_dashboard/core/interfaces/actions.py +652 -0
- truthound_dashboard/core/interfaces/base.py +247 -0
- truthound_dashboard/core/interfaces/checkpoint.py +676 -0
- truthound_dashboard/core/interfaces/protocols.py +664 -0
- truthound_dashboard/core/interfaces/reporters.py +650 -0
- truthound_dashboard/core/interfaces/routing.py +646 -0
- truthound_dashboard/core/interfaces/triggers.py +619 -0
- truthound_dashboard/core/lineage.py +407 -71
- truthound_dashboard/core/model_monitoring.py +431 -3
- truthound_dashboard/core/notifications/base.py +4 -0
- truthound_dashboard/core/notifications/channels.py +501 -1203
- truthound_dashboard/core/notifications/deduplication/__init__.py +81 -115
- truthound_dashboard/core/notifications/deduplication/service.py +131 -348
- truthound_dashboard/core/notifications/dispatcher.py +202 -11
- truthound_dashboard/core/notifications/escalation/__init__.py +119 -106
- truthound_dashboard/core/notifications/escalation/engine.py +168 -358
- truthound_dashboard/core/notifications/routing/__init__.py +88 -128
- truthound_dashboard/core/notifications/routing/engine.py +90 -317
- truthound_dashboard/core/notifications/stats_aggregator.py +246 -1
- truthound_dashboard/core/notifications/throttling/__init__.py +67 -50
- truthound_dashboard/core/notifications/throttling/builder.py +117 -255
- truthound_dashboard/core/notifications/truthound_adapter.py +842 -0
- truthound_dashboard/core/phase5/collaboration.py +1 -1
- truthound_dashboard/core/plugins/lifecycle/__init__.py +0 -13
- truthound_dashboard/core/quality_reporter.py +1359 -0
- truthound_dashboard/core/report_history.py +0 -6
- truthound_dashboard/core/reporters/__init__.py +175 -14
- truthound_dashboard/core/reporters/adapters.py +943 -0
- truthound_dashboard/core/reporters/base.py +0 -3
- truthound_dashboard/core/reporters/builtin/__init__.py +18 -0
- truthound_dashboard/core/reporters/builtin/csv_reporter.py +111 -0
- truthound_dashboard/core/reporters/builtin/html_reporter.py +270 -0
- truthound_dashboard/core/reporters/builtin/json_reporter.py +127 -0
- truthound_dashboard/core/reporters/compat.py +266 -0
- truthound_dashboard/core/reporters/csv_reporter.py +2 -35
- truthound_dashboard/core/reporters/factory.py +526 -0
- truthound_dashboard/core/reporters/interfaces.py +745 -0
- truthound_dashboard/core/reporters/registry.py +1 -10
- truthound_dashboard/core/scheduler.py +165 -0
- truthound_dashboard/core/schema_evolution.py +3 -3
- truthound_dashboard/core/schema_watcher.py +1528 -0
- truthound_dashboard/core/services.py +595 -76
- truthound_dashboard/core/store_manager.py +810 -0
- truthound_dashboard/core/streaming_anomaly.py +169 -4
- truthound_dashboard/core/tiering.py +1309 -0
- truthound_dashboard/core/triggers/evaluators.py +178 -8
- truthound_dashboard/core/truthound_adapter.py +2620 -197
- truthound_dashboard/core/unified_alerts.py +23 -20
- truthound_dashboard/db/__init__.py +8 -0
- truthound_dashboard/db/database.py +8 -2
- truthound_dashboard/db/models.py +944 -25
- truthound_dashboard/db/repository.py +2 -0
- truthound_dashboard/main.py +11 -0
- truthound_dashboard/schemas/__init__.py +177 -16
- truthound_dashboard/schemas/base.py +44 -23
- truthound_dashboard/schemas/collaboration.py +19 -6
- truthound_dashboard/schemas/cross_alerts.py +19 -3
- truthound_dashboard/schemas/drift.py +61 -55
- truthound_dashboard/schemas/drift_monitor.py +67 -23
- truthound_dashboard/schemas/enterprise_sampling.py +653 -0
- truthound_dashboard/schemas/lineage.py +0 -33
- truthound_dashboard/schemas/mask.py +10 -8
- truthound_dashboard/schemas/model_monitoring.py +89 -10
- truthound_dashboard/schemas/notifications_advanced.py +13 -0
- truthound_dashboard/schemas/observability.py +453 -0
- truthound_dashboard/schemas/plugins.py +0 -280
- truthound_dashboard/schemas/profile.py +154 -247
- truthound_dashboard/schemas/quality_reporter.py +403 -0
- truthound_dashboard/schemas/reports.py +2 -2
- truthound_dashboard/schemas/rule_suggestion.py +8 -1
- truthound_dashboard/schemas/scan.py +4 -24
- truthound_dashboard/schemas/schedule.py +11 -3
- truthound_dashboard/schemas/schema_watcher.py +727 -0
- truthound_dashboard/schemas/source.py +17 -2
- truthound_dashboard/schemas/tiering.py +822 -0
- truthound_dashboard/schemas/triggers.py +16 -0
- truthound_dashboard/schemas/unified_alerts.py +7 -0
- truthound_dashboard/schemas/validation.py +0 -13
- truthound_dashboard/schemas/validators/base.py +41 -21
- truthound_dashboard/schemas/validators/business_rule_validators.py +244 -0
- truthound_dashboard/schemas/validators/localization_validators.py +273 -0
- truthound_dashboard/schemas/validators/ml_feature_validators.py +308 -0
- truthound_dashboard/schemas/validators/profiling_validators.py +275 -0
- truthound_dashboard/schemas/validators/referential_validators.py +312 -0
- truthound_dashboard/schemas/validators/registry.py +93 -8
- truthound_dashboard/schemas/validators/timeseries_validators.py +389 -0
- truthound_dashboard/schemas/versioning.py +1 -6
- truthound_dashboard/static/index.html +2 -2
- truthound_dashboard-1.5.0.dist-info/METADATA +309 -0
- {truthound_dashboard-1.4.4.dist-info → truthound_dashboard-1.5.0.dist-info}/RECORD +149 -148
- truthound_dashboard/core/plugins/hooks/__init__.py +0 -63
- truthound_dashboard/core/plugins/hooks/decorators.py +0 -367
- truthound_dashboard/core/plugins/hooks/manager.py +0 -403
- truthound_dashboard/core/plugins/hooks/protocols.py +0 -265
- truthound_dashboard/core/plugins/lifecycle/hot_reload.py +0 -584
- truthound_dashboard/core/reporters/junit_reporter.py +0 -233
- truthound_dashboard/core/reporters/markdown_reporter.py +0 -207
- truthound_dashboard/core/reporters/pdf_reporter.py +0 -209
- truthound_dashboard/static/assets/_baseUniq-BcrSP13d.js +0 -1
- truthound_dashboard/static/assets/arc-DlYjKwIL.js +0 -1
- truthound_dashboard/static/assets/architectureDiagram-VXUJARFQ-Bb2drbQM.js +0 -36
- truthound_dashboard/static/assets/blockDiagram-VD42YOAC-BlsPG1CH.js +0 -122
- truthound_dashboard/static/assets/c4Diagram-YG6GDRKO-B9JdUoaC.js +0 -10
- truthound_dashboard/static/assets/channel-Q6mHF1Hd.js +0 -1
- truthound_dashboard/static/assets/chunk-4BX2VUAB-DmyoPVuJ.js +0 -1
- truthound_dashboard/static/assets/chunk-55IACEB6-Bcz6Siv8.js +0 -1
- truthound_dashboard/static/assets/chunk-B4BG7PRW-Br3G5Rum.js +0 -165
- truthound_dashboard/static/assets/chunk-DI55MBZ5-DuM9c23u.js +0 -220
- truthound_dashboard/static/assets/chunk-FMBD7UC4-DNU-5mvT.js +0 -15
- truthound_dashboard/static/assets/chunk-QN33PNHL-Im2yNcmS.js +0 -1
- truthound_dashboard/static/assets/chunk-QZHKN3VN-kZr8XFm1.js +0 -1
- truthound_dashboard/static/assets/chunk-TZMSLE5B-Q__360q_.js +0 -1
- truthound_dashboard/static/assets/classDiagram-2ON5EDUG-vtixxUyK.js +0 -1
- truthound_dashboard/static/assets/classDiagram-v2-WZHVMYZB-vtixxUyK.js +0 -1
- truthound_dashboard/static/assets/clone-BOt2LwD0.js +0 -1
- truthound_dashboard/static/assets/cose-bilkent-S5V4N54A-CBDw6iac.js +0 -1
- truthound_dashboard/static/assets/dagre-6UL2VRFP-XdKqmmY9.js +0 -4
- truthound_dashboard/static/assets/diagram-PSM6KHXK-DAZ8nx9V.js +0 -24
- truthound_dashboard/static/assets/diagram-QEK2KX5R-BRvDTbGD.js +0 -43
- truthound_dashboard/static/assets/diagram-S2PKOQOG-bQcczUkl.js +0 -24
- truthound_dashboard/static/assets/erDiagram-Q2GNP2WA-DPje7VMN.js +0 -60
- truthound_dashboard/static/assets/flowDiagram-NV44I4VS-B7BVtFVS.js +0 -162
- truthound_dashboard/static/assets/ganttDiagram-JELNMOA3-D6WKSS7U.js +0 -267
- truthound_dashboard/static/assets/gitGraphDiagram-NY62KEGX-D3vtVd3y.js +0 -65
- truthound_dashboard/static/assets/graph-BKgNKZVp.js +0 -1
- truthound_dashboard/static/assets/index-C6JSrkHo.css +0 -1
- truthound_dashboard/static/assets/index-DkU82VsU.js +0 -1800
- truthound_dashboard/static/assets/infoDiagram-WHAUD3N6-DnNCT429.js +0 -2
- truthound_dashboard/static/assets/journeyDiagram-XKPGCS4Q-DGiMozqS.js +0 -139
- truthound_dashboard/static/assets/kanban-definition-3W4ZIXB7-BV2gUgli.js +0 -89
- truthound_dashboard/static/assets/katex-Cu_Erd72.js +0 -261
- truthound_dashboard/static/assets/layout-DI2MfQ5G.js +0 -1
- truthound_dashboard/static/assets/min-DYdgXVcT.js +0 -1
- truthound_dashboard/static/assets/mindmap-definition-VGOIOE7T-C7x4ruxz.js +0 -68
- truthound_dashboard/static/assets/pieDiagram-ADFJNKIX-CAJaAB9f.js +0 -30
- truthound_dashboard/static/assets/quadrantDiagram-AYHSOK5B-DeqwDI46.js +0 -7
- truthound_dashboard/static/assets/requirementDiagram-UZGBJVZJ-e3XDpZIM.js +0 -64
- truthound_dashboard/static/assets/sankeyDiagram-TZEHDZUN-CNnAv5Ux.js +0 -10
- truthound_dashboard/static/assets/sequenceDiagram-WL72ISMW-Dsne-Of3.js +0 -145
- truthound_dashboard/static/assets/stateDiagram-FKZM4ZOC-Ee0sQXyb.js +0 -1
- truthound_dashboard/static/assets/stateDiagram-v2-4FDKWEC3-B26KqW_W.js +0 -1
- truthound_dashboard/static/assets/timeline-definition-IT6M3QCI-DZYi2yl3.js +0 -61
- truthound_dashboard/static/assets/treemap-KMMF4GRG-CY3f8In2.js +0 -128
- truthound_dashboard/static/assets/unmerged_dictionaries-Dd7xcPWG.js +0 -1
- truthound_dashboard/static/assets/xychartDiagram-PRI3JC2R-CS7fydZZ.js +0 -7
- truthound_dashboard-1.4.4.dist-info/METADATA +0 -507
- {truthound_dashboard-1.4.4.dist-info → truthound_dashboard-1.5.0.dist-info}/WHEEL +0 -0
- {truthound_dashboard-1.4.4.dist-info → truthound_dashboard-1.5.0.dist-info}/entry_points.txt +0 -0
- {truthound_dashboard-1.4.4.dist-info → truthound_dashboard-1.5.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
"""Validator registry.
|
|
2
2
|
|
|
3
3
|
Central registry combining all validator categories with metadata and lookup functions.
|
|
4
|
+
|
|
5
|
+
This module aggregates all 21 validator categories from truthound, providing:
|
|
6
|
+
- Complete validator definitions with parameters
|
|
7
|
+
- Category metadata for UI display
|
|
8
|
+
- Search and filter utilities
|
|
4
9
|
"""
|
|
5
10
|
|
|
6
11
|
from __future__ import annotations
|
|
@@ -10,23 +15,44 @@ from typing import Literal
|
|
|
10
15
|
|
|
11
16
|
from .base import ValidatorCategory, ValidatorDefinition
|
|
12
17
|
|
|
13
|
-
# Import all validator category modules
|
|
18
|
+
# Import all validator category modules (21 categories)
|
|
19
|
+
# Core validators
|
|
14
20
|
from .schema_validators import SCHEMA_VALIDATORS
|
|
15
21
|
from .completeness_validators import COMPLETENESS_VALIDATORS
|
|
16
22
|
from .uniqueness_validators import UNIQUENESS_VALIDATORS
|
|
17
23
|
from .distribution_validators import DISTRIBUTION_VALIDATORS
|
|
24
|
+
|
|
25
|
+
# Format validators
|
|
18
26
|
from .string_validators import STRING_VALIDATORS
|
|
19
27
|
from .datetime_validators import DATETIME_VALIDATORS
|
|
28
|
+
|
|
29
|
+
# Statistical validators
|
|
20
30
|
from .aggregate_validators import AGGREGATE_VALIDATORS
|
|
31
|
+
from .drift_validators import DRIFT_VALIDATORS
|
|
32
|
+
from .anomaly_validators import ANOMALY_VALIDATORS
|
|
33
|
+
|
|
34
|
+
# Relational validators
|
|
21
35
|
from .cross_table_validators import CROSS_TABLE_VALIDATORS
|
|
22
36
|
from .multi_column_validators import MULTI_COLUMN_VALIDATORS
|
|
23
37
|
from .query_validators import QUERY_VALIDATORS
|
|
38
|
+
|
|
39
|
+
# Domain validators
|
|
24
40
|
from .table_validators import TABLE_VALIDATORS
|
|
25
41
|
from .geospatial_validators import GEOSPATIAL_VALIDATORS
|
|
26
|
-
from .drift_validators import DRIFT_VALIDATORS
|
|
27
|
-
from .anomaly_validators import ANOMALY_VALIDATORS
|
|
28
42
|
from .privacy_validators import PRIVACY_VALIDATORS
|
|
29
43
|
|
|
44
|
+
# Business validators (new)
|
|
45
|
+
from .business_rule_validators import BUSINESS_RULE_VALIDATORS
|
|
46
|
+
from .profiling_validators import PROFILING_VALIDATORS
|
|
47
|
+
from .localization_validators import LOCALIZATION_VALIDATORS
|
|
48
|
+
|
|
49
|
+
# ML validators (new)
|
|
50
|
+
from .ml_feature_validators import ML_FEATURE_VALIDATORS
|
|
51
|
+
|
|
52
|
+
# Advanced validators (new)
|
|
53
|
+
from .timeseries_validators import TIMESERIES_VALIDATORS
|
|
54
|
+
from .referential_validators import REFERENTIAL_VALIDATORS
|
|
55
|
+
|
|
30
56
|
|
|
31
57
|
@dataclass
|
|
32
58
|
class CategoryInfo:
|
|
@@ -41,7 +67,7 @@ class CategoryInfo:
|
|
|
41
67
|
validator_count: int = 0
|
|
42
68
|
|
|
43
69
|
|
|
44
|
-
# Category metadata with UI information
|
|
70
|
+
# Category metadata with UI information (21 categories)
|
|
45
71
|
CATEGORY_INFO: list[CategoryInfo] = [
|
|
46
72
|
# Core validators (no extra dependencies)
|
|
47
73
|
CategoryInfo(
|
|
@@ -151,31 +177,90 @@ CATEGORY_INFO: list[CategoryInfo] = [
|
|
|
151
177
|
CategoryInfo(
|
|
152
178
|
value="privacy",
|
|
153
179
|
label="Privacy",
|
|
154
|
-
description="PII detection and compliance (GDPR, CCPA)",
|
|
180
|
+
description="PII detection and compliance (GDPR, CCPA, LGPD)",
|
|
155
181
|
icon="shield",
|
|
156
182
|
color="#dc2626", # red-600
|
|
157
183
|
),
|
|
184
|
+
# Business validators (new in truthound 2.x)
|
|
185
|
+
CategoryInfo(
|
|
186
|
+
value="business_rule",
|
|
187
|
+
label="Business Rule",
|
|
188
|
+
description="Domain-specific rules: checksums, IBAN, VAT, credit cards",
|
|
189
|
+
icon="briefcase",
|
|
190
|
+
color="#7c3aed", # violet-600
|
|
191
|
+
),
|
|
192
|
+
CategoryInfo(
|
|
193
|
+
value="profiling",
|
|
194
|
+
label="Profiling",
|
|
195
|
+
description="Cardinality, entropy, and value frequency analysis",
|
|
196
|
+
icon="activity",
|
|
197
|
+
color="#0891b2", # cyan-600
|
|
198
|
+
),
|
|
199
|
+
CategoryInfo(
|
|
200
|
+
value="localization",
|
|
201
|
+
label="Localization",
|
|
202
|
+
description="Regional identifier formats (Korean, Japanese, Chinese)",
|
|
203
|
+
icon="globe",
|
|
204
|
+
color="#059669", # emerald-600
|
|
205
|
+
),
|
|
206
|
+
# ML validators (new in truthound 2.x)
|
|
207
|
+
CategoryInfo(
|
|
208
|
+
value="ml_feature",
|
|
209
|
+
label="ML Feature",
|
|
210
|
+
description="Feature quality: null impact, scale, correlation, leakage",
|
|
211
|
+
icon="cpu",
|
|
212
|
+
color="#7c2d12", # orange-900
|
|
213
|
+
),
|
|
214
|
+
# Advanced validators (new in truthound 2.x)
|
|
215
|
+
CategoryInfo(
|
|
216
|
+
value="timeseries",
|
|
217
|
+
label="Time Series",
|
|
218
|
+
description="Gap detection, monotonicity, seasonality, trend analysis",
|
|
219
|
+
icon="clock",
|
|
220
|
+
color="#4338ca", # indigo-700
|
|
221
|
+
),
|
|
222
|
+
CategoryInfo(
|
|
223
|
+
value="referential",
|
|
224
|
+
label="Referential",
|
|
225
|
+
description="Foreign keys, orphan detection, hierarchy integrity",
|
|
226
|
+
icon="git-merge",
|
|
227
|
+
color="#be185d", # pink-700
|
|
228
|
+
),
|
|
158
229
|
]
|
|
159
230
|
|
|
160
231
|
|
|
161
232
|
def _build_registry() -> list[ValidatorDefinition]:
|
|
162
|
-
"""Build the complete validator registry from all categories."""
|
|
233
|
+
"""Build the complete validator registry from all 21 categories."""
|
|
163
234
|
return [
|
|
235
|
+
# Core validators
|
|
164
236
|
*SCHEMA_VALIDATORS,
|
|
165
237
|
*COMPLETENESS_VALIDATORS,
|
|
166
238
|
*UNIQUENESS_VALIDATORS,
|
|
167
239
|
*DISTRIBUTION_VALIDATORS,
|
|
240
|
+
# Format validators
|
|
168
241
|
*STRING_VALIDATORS,
|
|
169
242
|
*DATETIME_VALIDATORS,
|
|
243
|
+
# Statistical validators
|
|
170
244
|
*AGGREGATE_VALIDATORS,
|
|
245
|
+
*DRIFT_VALIDATORS,
|
|
246
|
+
*ANOMALY_VALIDATORS,
|
|
247
|
+
# Relational validators
|
|
171
248
|
*CROSS_TABLE_VALIDATORS,
|
|
172
249
|
*MULTI_COLUMN_VALIDATORS,
|
|
173
250
|
*QUERY_VALIDATORS,
|
|
251
|
+
# Domain validators
|
|
174
252
|
*TABLE_VALIDATORS,
|
|
175
253
|
*GEOSPATIAL_VALIDATORS,
|
|
176
|
-
*DRIFT_VALIDATORS,
|
|
177
|
-
*ANOMALY_VALIDATORS,
|
|
178
254
|
*PRIVACY_VALIDATORS,
|
|
255
|
+
# Business validators (new)
|
|
256
|
+
*BUSINESS_RULE_VALIDATORS,
|
|
257
|
+
*PROFILING_VALIDATORS,
|
|
258
|
+
*LOCALIZATION_VALIDATORS,
|
|
259
|
+
# ML validators (new)
|
|
260
|
+
*ML_FEATURE_VALIDATORS,
|
|
261
|
+
# Advanced validators (new)
|
|
262
|
+
*TIMESERIES_VALIDATORS,
|
|
263
|
+
*REFERENTIAL_VALIDATORS,
|
|
179
264
|
]
|
|
180
265
|
|
|
181
266
|
|
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
"""Time series validators.
|
|
2
|
+
|
|
3
|
+
Validators for time series data properties including gaps, monotonicity,
|
|
4
|
+
seasonality, and trend analysis.
|
|
5
|
+
|
|
6
|
+
Import path in truthound: `from truthound.validators.timeseries import *`
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from .base import (
|
|
10
|
+
ParameterDefinition,
|
|
11
|
+
ParameterType,
|
|
12
|
+
ValidatorCategory,
|
|
13
|
+
ValidatorDefinition,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
TIMESERIES_VALIDATORS: list[ValidatorDefinition] = [
|
|
17
|
+
ValidatorDefinition(
|
|
18
|
+
name="TimeSeriesGap",
|
|
19
|
+
display_name="Time Series Gap Detection",
|
|
20
|
+
category=ValidatorCategory.TIMESERIES,
|
|
21
|
+
description="Detects unexpected gaps in time series data.",
|
|
22
|
+
parameters=[
|
|
23
|
+
ParameterDefinition(
|
|
24
|
+
name="timestamp_column",
|
|
25
|
+
label="Timestamp Column",
|
|
26
|
+
type=ParameterType.COLUMN,
|
|
27
|
+
required=True,
|
|
28
|
+
description="Column containing timestamps",
|
|
29
|
+
),
|
|
30
|
+
ParameterDefinition(
|
|
31
|
+
name="expected_interval",
|
|
32
|
+
label="Expected Interval",
|
|
33
|
+
type=ParameterType.STRING,
|
|
34
|
+
required=True,
|
|
35
|
+
description="Expected time interval (e.g., '1h', '1d', '5m')",
|
|
36
|
+
placeholder="1h",
|
|
37
|
+
),
|
|
38
|
+
ParameterDefinition(
|
|
39
|
+
name="tolerance",
|
|
40
|
+
label="Tolerance",
|
|
41
|
+
type=ParameterType.FLOAT,
|
|
42
|
+
default=0.1,
|
|
43
|
+
min_value=0,
|
|
44
|
+
max_value=1,
|
|
45
|
+
description="Tolerance ratio for interval variation (0-1)",
|
|
46
|
+
),
|
|
47
|
+
],
|
|
48
|
+
tags=["timeseries", "gap", "missing", "interval"],
|
|
49
|
+
severity_default="high",
|
|
50
|
+
),
|
|
51
|
+
ValidatorDefinition(
|
|
52
|
+
name="TimeSeriesInterval",
|
|
53
|
+
display_name="Time Series Interval Regularity",
|
|
54
|
+
category=ValidatorCategory.TIMESERIES,
|
|
55
|
+
description="Validates that time series has regular intervals.",
|
|
56
|
+
parameters=[
|
|
57
|
+
ParameterDefinition(
|
|
58
|
+
name="timestamp_column",
|
|
59
|
+
label="Timestamp Column",
|
|
60
|
+
type=ParameterType.COLUMN,
|
|
61
|
+
required=True,
|
|
62
|
+
description="Column containing timestamps",
|
|
63
|
+
),
|
|
64
|
+
ParameterDefinition(
|
|
65
|
+
name="interval",
|
|
66
|
+
label="Expected Interval",
|
|
67
|
+
type=ParameterType.STRING,
|
|
68
|
+
required=True,
|
|
69
|
+
description="Expected time interval (e.g., '1h', '1d', '5m')",
|
|
70
|
+
),
|
|
71
|
+
ParameterDefinition(
|
|
72
|
+
name="strict",
|
|
73
|
+
label="Strict Mode",
|
|
74
|
+
type=ParameterType.BOOLEAN,
|
|
75
|
+
default=False,
|
|
76
|
+
description="If true, all intervals must match exactly",
|
|
77
|
+
),
|
|
78
|
+
],
|
|
79
|
+
tags=["timeseries", "interval", "regularity", "frequency"],
|
|
80
|
+
severity_default="medium",
|
|
81
|
+
),
|
|
82
|
+
ValidatorDefinition(
|
|
83
|
+
name="TimeSeriesDuplicate",
|
|
84
|
+
display_name="Time Series Duplicate Timestamp",
|
|
85
|
+
category=ValidatorCategory.TIMESERIES,
|
|
86
|
+
description="Detects duplicate timestamps in time series data.",
|
|
87
|
+
parameters=[
|
|
88
|
+
ParameterDefinition(
|
|
89
|
+
name="timestamp_column",
|
|
90
|
+
label="Timestamp Column",
|
|
91
|
+
type=ParameterType.COLUMN,
|
|
92
|
+
required=True,
|
|
93
|
+
description="Column containing timestamps",
|
|
94
|
+
),
|
|
95
|
+
ParameterDefinition(
|
|
96
|
+
name="group_columns",
|
|
97
|
+
label="Group Columns",
|
|
98
|
+
type=ParameterType.COLUMN_LIST,
|
|
99
|
+
description="Additional columns to group by (for multi-series data)",
|
|
100
|
+
),
|
|
101
|
+
],
|
|
102
|
+
tags=["timeseries", "duplicate", "timestamp", "unique"],
|
|
103
|
+
severity_default="high",
|
|
104
|
+
),
|
|
105
|
+
ValidatorDefinition(
|
|
106
|
+
name="TimeSeriesMonotonic",
|
|
107
|
+
display_name="Time Series Monotonicity",
|
|
108
|
+
category=ValidatorCategory.TIMESERIES,
|
|
109
|
+
description="Validates that timestamps are strictly monotonic (always increasing).",
|
|
110
|
+
parameters=[
|
|
111
|
+
ParameterDefinition(
|
|
112
|
+
name="timestamp_column",
|
|
113
|
+
label="Timestamp Column",
|
|
114
|
+
type=ParameterType.COLUMN,
|
|
115
|
+
required=True,
|
|
116
|
+
description="Column containing timestamps",
|
|
117
|
+
),
|
|
118
|
+
ParameterDefinition(
|
|
119
|
+
name="direction",
|
|
120
|
+
label="Direction",
|
|
121
|
+
type=ParameterType.SELECT,
|
|
122
|
+
options=[
|
|
123
|
+
{"value": "increasing", "label": "Increasing"},
|
|
124
|
+
{"value": "decreasing", "label": "Decreasing"},
|
|
125
|
+
],
|
|
126
|
+
default="increasing",
|
|
127
|
+
description="Expected monotonicity direction",
|
|
128
|
+
),
|
|
129
|
+
ParameterDefinition(
|
|
130
|
+
name="strict",
|
|
131
|
+
label="Strictly Monotonic",
|
|
132
|
+
type=ParameterType.BOOLEAN,
|
|
133
|
+
default=True,
|
|
134
|
+
description="If true, no equal consecutive values allowed",
|
|
135
|
+
),
|
|
136
|
+
],
|
|
137
|
+
tags=["timeseries", "monotonic", "order", "sequence"],
|
|
138
|
+
severity_default="high",
|
|
139
|
+
),
|
|
140
|
+
ValidatorDefinition(
|
|
141
|
+
name="TimeSeriesOrder",
|
|
142
|
+
display_name="Time Series Order",
|
|
143
|
+
category=ValidatorCategory.TIMESERIES,
|
|
144
|
+
description="Validates that timestamps are in chronological order.",
|
|
145
|
+
parameters=[
|
|
146
|
+
ParameterDefinition(
|
|
147
|
+
name="timestamp_column",
|
|
148
|
+
label="Timestamp Column",
|
|
149
|
+
type=ParameterType.COLUMN,
|
|
150
|
+
required=True,
|
|
151
|
+
description="Column containing timestamps",
|
|
152
|
+
),
|
|
153
|
+
ParameterDefinition(
|
|
154
|
+
name="allow_equal",
|
|
155
|
+
label="Allow Equal Timestamps",
|
|
156
|
+
type=ParameterType.BOOLEAN,
|
|
157
|
+
default=False,
|
|
158
|
+
description="Whether equal consecutive timestamps are allowed",
|
|
159
|
+
),
|
|
160
|
+
],
|
|
161
|
+
tags=["timeseries", "order", "chronological", "sequence"],
|
|
162
|
+
severity_default="medium",
|
|
163
|
+
),
|
|
164
|
+
ValidatorDefinition(
|
|
165
|
+
name="Seasonality",
|
|
166
|
+
display_name="Seasonality Validation",
|
|
167
|
+
category=ValidatorCategory.TIMESERIES,
|
|
168
|
+
description="Validates expected seasonal patterns in time series data.",
|
|
169
|
+
parameters=[
|
|
170
|
+
ParameterDefinition(
|
|
171
|
+
name="timestamp_column",
|
|
172
|
+
label="Timestamp Column",
|
|
173
|
+
type=ParameterType.COLUMN,
|
|
174
|
+
required=True,
|
|
175
|
+
description="Column containing timestamps",
|
|
176
|
+
),
|
|
177
|
+
ParameterDefinition(
|
|
178
|
+
name="value_column",
|
|
179
|
+
label="Value Column",
|
|
180
|
+
type=ParameterType.COLUMN,
|
|
181
|
+
required=True,
|
|
182
|
+
description="Column containing the time series values",
|
|
183
|
+
),
|
|
184
|
+
ParameterDefinition(
|
|
185
|
+
name="period",
|
|
186
|
+
label="Seasonal Period",
|
|
187
|
+
type=ParameterType.SELECT,
|
|
188
|
+
options=[
|
|
189
|
+
{"value": "daily", "label": "Daily (24h)"},
|
|
190
|
+
{"value": "weekly", "label": "Weekly (7d)"},
|
|
191
|
+
{"value": "monthly", "label": "Monthly"},
|
|
192
|
+
{"value": "quarterly", "label": "Quarterly"},
|
|
193
|
+
{"value": "yearly", "label": "Yearly"},
|
|
194
|
+
],
|
|
195
|
+
required=True,
|
|
196
|
+
description="Expected seasonal period",
|
|
197
|
+
),
|
|
198
|
+
ParameterDefinition(
|
|
199
|
+
name="min_strength",
|
|
200
|
+
label="Minimum Seasonality Strength",
|
|
201
|
+
type=ParameterType.FLOAT,
|
|
202
|
+
default=0.3,
|
|
203
|
+
min_value=0,
|
|
204
|
+
max_value=1,
|
|
205
|
+
description="Minimum acceptable seasonality strength (0-1)",
|
|
206
|
+
),
|
|
207
|
+
],
|
|
208
|
+
tags=["timeseries", "seasonality", "pattern", "periodic"],
|
|
209
|
+
severity_default="medium",
|
|
210
|
+
),
|
|
211
|
+
ValidatorDefinition(
|
|
212
|
+
name="Trend",
|
|
213
|
+
display_name="Trend Validation",
|
|
214
|
+
category=ValidatorCategory.TIMESERIES,
|
|
215
|
+
description="Validates expected trend direction in time series data.",
|
|
216
|
+
parameters=[
|
|
217
|
+
ParameterDefinition(
|
|
218
|
+
name="timestamp_column",
|
|
219
|
+
label="Timestamp Column",
|
|
220
|
+
type=ParameterType.COLUMN,
|
|
221
|
+
required=True,
|
|
222
|
+
description="Column containing timestamps",
|
|
223
|
+
),
|
|
224
|
+
ParameterDefinition(
|
|
225
|
+
name="value_column",
|
|
226
|
+
label="Value Column",
|
|
227
|
+
type=ParameterType.COLUMN,
|
|
228
|
+
required=True,
|
|
229
|
+
description="Column containing the time series values",
|
|
230
|
+
),
|
|
231
|
+
ParameterDefinition(
|
|
232
|
+
name="expected_trend",
|
|
233
|
+
label="Expected Trend",
|
|
234
|
+
type=ParameterType.SELECT,
|
|
235
|
+
options=[
|
|
236
|
+
{"value": "increasing", "label": "Increasing"},
|
|
237
|
+
{"value": "decreasing", "label": "Decreasing"},
|
|
238
|
+
{"value": "stable", "label": "Stable"},
|
|
239
|
+
],
|
|
240
|
+
required=True,
|
|
241
|
+
description="Expected trend direction",
|
|
242
|
+
),
|
|
243
|
+
ParameterDefinition(
|
|
244
|
+
name="significance",
|
|
245
|
+
label="Significance Level",
|
|
246
|
+
type=ParameterType.FLOAT,
|
|
247
|
+
default=0.05,
|
|
248
|
+
min_value=0.001,
|
|
249
|
+
max_value=0.5,
|
|
250
|
+
description="Statistical significance level for trend detection",
|
|
251
|
+
),
|
|
252
|
+
],
|
|
253
|
+
tags=["timeseries", "trend", "direction", "growth"],
|
|
254
|
+
severity_default="medium",
|
|
255
|
+
),
|
|
256
|
+
ValidatorDefinition(
|
|
257
|
+
name="TrendBreak",
|
|
258
|
+
display_name="Trend Break Detection",
|
|
259
|
+
category=ValidatorCategory.TIMESERIES,
|
|
260
|
+
description="Detects unexpected trend breaks or structural changes in time series.",
|
|
261
|
+
parameters=[
|
|
262
|
+
ParameterDefinition(
|
|
263
|
+
name="timestamp_column",
|
|
264
|
+
label="Timestamp Column",
|
|
265
|
+
type=ParameterType.COLUMN,
|
|
266
|
+
required=True,
|
|
267
|
+
description="Column containing timestamps",
|
|
268
|
+
),
|
|
269
|
+
ParameterDefinition(
|
|
270
|
+
name="value_column",
|
|
271
|
+
label="Value Column",
|
|
272
|
+
type=ParameterType.COLUMN,
|
|
273
|
+
required=True,
|
|
274
|
+
description="Column containing the time series values",
|
|
275
|
+
),
|
|
276
|
+
ParameterDefinition(
|
|
277
|
+
name="sensitivity",
|
|
278
|
+
label="Sensitivity",
|
|
279
|
+
type=ParameterType.FLOAT,
|
|
280
|
+
default=0.5,
|
|
281
|
+
min_value=0,
|
|
282
|
+
max_value=1,
|
|
283
|
+
description="Detection sensitivity (higher = more sensitive)",
|
|
284
|
+
),
|
|
285
|
+
],
|
|
286
|
+
tags=["timeseries", "trend", "break", "change_point"],
|
|
287
|
+
severity_default="medium",
|
|
288
|
+
),
|
|
289
|
+
ValidatorDefinition(
|
|
290
|
+
name="TimeSeriesCompleteness",
|
|
291
|
+
display_name="Time Series Completeness",
|
|
292
|
+
category=ValidatorCategory.TIMESERIES,
|
|
293
|
+
description="Validates that time series covers the expected date range completely.",
|
|
294
|
+
parameters=[
|
|
295
|
+
ParameterDefinition(
|
|
296
|
+
name="timestamp_column",
|
|
297
|
+
label="Timestamp Column",
|
|
298
|
+
type=ParameterType.COLUMN,
|
|
299
|
+
required=True,
|
|
300
|
+
description="Column containing timestamps",
|
|
301
|
+
),
|
|
302
|
+
ParameterDefinition(
|
|
303
|
+
name="start_date",
|
|
304
|
+
label="Expected Start Date",
|
|
305
|
+
type=ParameterType.DATE,
|
|
306
|
+
description="Expected start date of the series",
|
|
307
|
+
),
|
|
308
|
+
ParameterDefinition(
|
|
309
|
+
name="end_date",
|
|
310
|
+
label="Expected End Date",
|
|
311
|
+
type=ParameterType.DATE,
|
|
312
|
+
description="Expected end date of the series",
|
|
313
|
+
),
|
|
314
|
+
ParameterDefinition(
|
|
315
|
+
name="min_completeness",
|
|
316
|
+
label="Minimum Completeness",
|
|
317
|
+
type=ParameterType.FLOAT,
|
|
318
|
+
default=0.95,
|
|
319
|
+
min_value=0,
|
|
320
|
+
max_value=1,
|
|
321
|
+
description="Minimum required completeness ratio (0-1)",
|
|
322
|
+
),
|
|
323
|
+
],
|
|
324
|
+
tags=["timeseries", "completeness", "coverage", "range"],
|
|
325
|
+
severity_default="high",
|
|
326
|
+
),
|
|
327
|
+
ValidatorDefinition(
|
|
328
|
+
name="TimeSeriesDateRange",
|
|
329
|
+
display_name="Time Series Date Range",
|
|
330
|
+
category=ValidatorCategory.TIMESERIES,
|
|
331
|
+
description="Validates that all timestamps fall within an expected date range.",
|
|
332
|
+
parameters=[
|
|
333
|
+
ParameterDefinition(
|
|
334
|
+
name="timestamp_column",
|
|
335
|
+
label="Timestamp Column",
|
|
336
|
+
type=ParameterType.COLUMN,
|
|
337
|
+
required=True,
|
|
338
|
+
description="Column containing timestamps",
|
|
339
|
+
),
|
|
340
|
+
ParameterDefinition(
|
|
341
|
+
name="min_date",
|
|
342
|
+
label="Minimum Date",
|
|
343
|
+
type=ParameterType.DATE,
|
|
344
|
+
description="Earliest acceptable date",
|
|
345
|
+
),
|
|
346
|
+
ParameterDefinition(
|
|
347
|
+
name="max_date",
|
|
348
|
+
label="Maximum Date",
|
|
349
|
+
type=ParameterType.DATE,
|
|
350
|
+
description="Latest acceptable date",
|
|
351
|
+
),
|
|
352
|
+
],
|
|
353
|
+
tags=["timeseries", "date_range", "bounds", "validation"],
|
|
354
|
+
severity_default="medium",
|
|
355
|
+
),
|
|
356
|
+
ValidatorDefinition(
|
|
357
|
+
name="TimeSeriesValueCompleteness",
|
|
358
|
+
display_name="Time Series Value Completeness",
|
|
359
|
+
category=ValidatorCategory.TIMESERIES,
|
|
360
|
+
description="Validates that values are present for all expected time points.",
|
|
361
|
+
parameters=[
|
|
362
|
+
ParameterDefinition(
|
|
363
|
+
name="timestamp_column",
|
|
364
|
+
label="Timestamp Column",
|
|
365
|
+
type=ParameterType.COLUMN,
|
|
366
|
+
required=True,
|
|
367
|
+
description="Column containing timestamps",
|
|
368
|
+
),
|
|
369
|
+
ParameterDefinition(
|
|
370
|
+
name="value_column",
|
|
371
|
+
label="Value Column",
|
|
372
|
+
type=ParameterType.COLUMN,
|
|
373
|
+
required=True,
|
|
374
|
+
description="Column containing the time series values",
|
|
375
|
+
),
|
|
376
|
+
ParameterDefinition(
|
|
377
|
+
name="max_null_ratio",
|
|
378
|
+
label="Maximum Null Ratio",
|
|
379
|
+
type=ParameterType.FLOAT,
|
|
380
|
+
default=0.05,
|
|
381
|
+
min_value=0,
|
|
382
|
+
max_value=1,
|
|
383
|
+
description="Maximum acceptable ratio of null values",
|
|
384
|
+
),
|
|
385
|
+
],
|
|
386
|
+
tags=["timeseries", "completeness", "null", "missing"],
|
|
387
|
+
severity_default="medium",
|
|
388
|
+
),
|
|
389
|
+
]
|
|
@@ -34,7 +34,6 @@ class VersionInfoResponse(BaseSchema):
|
|
|
34
34
|
class VersionListResponse(BaseSchema):
|
|
35
35
|
"""Response for listing versions."""
|
|
36
36
|
|
|
37
|
-
success: bool = Field(default=True)
|
|
38
37
|
data: list[VersionInfoResponse] = Field(..., description="List of versions")
|
|
39
38
|
total: int = Field(..., description="Total number of versions")
|
|
40
39
|
source_id: str = Field(..., description="Source ID for these versions")
|
|
@@ -81,7 +80,6 @@ class VersionCompareRequest(BaseSchema):
|
|
|
81
80
|
class VersionHistoryResponse(BaseSchema):
|
|
82
81
|
"""Response for version history chain."""
|
|
83
82
|
|
|
84
|
-
success: bool = Field(default=True)
|
|
85
83
|
data: list[VersionInfoResponse] = Field(..., description="Version history chain")
|
|
86
84
|
depth: int = Field(..., description="Depth of history returned")
|
|
87
85
|
|
|
@@ -101,8 +99,7 @@ class CreateVersionRequest(BaseSchema):
|
|
|
101
99
|
class CreateVersionResponse(BaseSchema):
|
|
102
100
|
"""Response after creating a version."""
|
|
103
101
|
|
|
104
|
-
|
|
105
|
-
data: VersionInfoResponse = Field(..., description="Created version info")
|
|
102
|
+
version: VersionInfoResponse = Field(..., description="Created version info")
|
|
106
103
|
message: str = Field(..., description="Success message")
|
|
107
104
|
|
|
108
105
|
|
|
@@ -120,7 +117,6 @@ class RollbackRequest(BaseSchema):
|
|
|
120
117
|
class RollbackResponse(BaseSchema):
|
|
121
118
|
"""Response after a rollback operation."""
|
|
122
119
|
|
|
123
|
-
success: bool = Field(default=True)
|
|
124
120
|
source_id: str = Field(..., description="Source ID that was rolled back")
|
|
125
121
|
from_version: VersionInfoResponse | None = Field(
|
|
126
122
|
None, description="Version rolled back from"
|
|
@@ -138,7 +134,6 @@ class RollbackResponse(BaseSchema):
|
|
|
138
134
|
class RollbackAvailabilityResponse(BaseSchema):
|
|
139
135
|
"""Response for checking rollback availability."""
|
|
140
136
|
|
|
141
|
-
success: bool = Field(default=True)
|
|
142
137
|
can_rollback: bool = Field(..., description="Whether rollback is available")
|
|
143
138
|
current_version_id: str | None = Field(
|
|
144
139
|
None, description="Current active version ID"
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<meta name="description" content="Truthound Dashboard - Open-source data quality monitoring" />
|
|
8
8
|
<title>Truthound Dashboard</title>
|
|
9
|
-
<script type="module" crossorigin src="/assets/index-
|
|
10
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
9
|
+
<script type="module" crossorigin src="/assets/index-BnWMZ9K7.js"></script>
|
|
10
|
+
<link rel="stylesheet" crossorigin href="/assets/index-DDRuhd95.css">
|
|
11
11
|
</head>
|
|
12
12
|
<body>
|
|
13
13
|
<div id="root"></div>
|