truthound-dashboard 1.4.4__py3-none-any.whl → 1.5.1__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 +645 -23
- 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 +15 -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.1.dist-info/METADATA +312 -0
- {truthound_dashboard-1.4.4.dist-info → truthound_dashboard-1.5.1.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.1.dist-info}/WHEEL +0 -0
- {truthound_dashboard-1.4.4.dist-info → truthound_dashboard-1.5.1.dist-info}/entry_points.txt +0 -0
- {truthound_dashboard-1.4.4.dist-info → truthound_dashboard-1.5.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -18,6 +18,8 @@ from truthound_dashboard.schemas.triggers import (
|
|
|
18
18
|
TriggerCheckStatus,
|
|
19
19
|
TriggerMonitoringResponse,
|
|
20
20
|
TriggerMonitoringStats,
|
|
21
|
+
WebhookTestReceivedData,
|
|
22
|
+
WebhookTestResponse,
|
|
21
23
|
WebhookTriggerRequest,
|
|
22
24
|
WebhookTriggerResponse,
|
|
23
25
|
)
|
|
@@ -95,9 +97,10 @@ async def get_trigger_monitoring() -> TriggerMonitoringResponse:
|
|
|
95
97
|
|
|
96
98
|
@router.get(
|
|
97
99
|
"/schedules/{schedule_id}/status",
|
|
100
|
+
response_model=TriggerCheckStatus,
|
|
98
101
|
summary="Get trigger status for a specific schedule",
|
|
99
102
|
)
|
|
100
|
-
async def get_schedule_trigger_status(schedule_id: str) ->
|
|
103
|
+
async def get_schedule_trigger_status(schedule_id: str) -> TriggerCheckStatus:
|
|
101
104
|
"""Get trigger status for a specific schedule.
|
|
102
105
|
|
|
103
106
|
Args:
|
|
@@ -111,7 +114,7 @@ async def get_schedule_trigger_status(schedule_id: str) -> dict[str, Any]:
|
|
|
111
114
|
|
|
112
115
|
for schedule in schedules:
|
|
113
116
|
if schedule["schedule_id"] == schedule_id:
|
|
114
|
-
return schedule
|
|
117
|
+
return TriggerCheckStatus(**schedule)
|
|
115
118
|
|
|
116
119
|
raise HTTPException(
|
|
117
120
|
status_code=404,
|
|
@@ -163,12 +166,13 @@ async def receive_webhook(
|
|
|
163
166
|
|
|
164
167
|
@router.post(
|
|
165
168
|
"/webhook/test",
|
|
169
|
+
response_model=WebhookTestResponse,
|
|
166
170
|
summary="Test webhook configuration",
|
|
167
171
|
)
|
|
168
172
|
async def test_webhook(
|
|
169
173
|
source: str = "test",
|
|
170
174
|
event_type: str = "test_event",
|
|
171
|
-
) ->
|
|
175
|
+
) -> WebhookTestResponse:
|
|
172
176
|
"""Test webhook endpoint without triggering any schedules.
|
|
173
177
|
|
|
174
178
|
Useful for verifying connectivity and configuration.
|
|
@@ -180,11 +184,10 @@ async def test_webhook(
|
|
|
180
184
|
Returns:
|
|
181
185
|
Test result.
|
|
182
186
|
"""
|
|
183
|
-
return
|
|
184
|
-
"
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
}
|
|
187
|
+
return WebhookTestResponse(
|
|
188
|
+
message="Webhook endpoint is accessible",
|
|
189
|
+
received=WebhookTestReceivedData(
|
|
190
|
+
source=source,
|
|
191
|
+
event_type=event_type,
|
|
192
|
+
),
|
|
193
|
+
)
|
|
@@ -37,11 +37,10 @@ async def run_validation(
|
|
|
37
37
|
|
|
38
38
|
Supports all th.check() parameters for maximum flexibility:
|
|
39
39
|
- validators: Specific validators to run
|
|
40
|
+
- validator_configs: Per-validator parameter configuration
|
|
40
41
|
- schema_path: Path to schema YAML file
|
|
41
42
|
- auto_schema: Auto-learn and cache schema
|
|
42
|
-
- columns: Specific columns to validate
|
|
43
43
|
- min_severity: Minimum severity to report
|
|
44
|
-
- strict: Raise exception on failures
|
|
45
44
|
- parallel: Use parallel execution
|
|
46
45
|
- max_workers: Max threads for parallel
|
|
47
46
|
- pushdown: Enable query pushdown for SQL
|
|
@@ -58,13 +57,14 @@ async def run_validation(
|
|
|
58
57
|
HTTPException: 404 if source not found.
|
|
59
58
|
"""
|
|
60
59
|
try:
|
|
61
|
-
# Determine validators and
|
|
60
|
+
# Determine validators and config based on request mode
|
|
62
61
|
validators: list[str] | None = None
|
|
63
|
-
|
|
62
|
+
validator_config: dict | None = None
|
|
64
63
|
|
|
65
64
|
if request.validator_configs:
|
|
66
65
|
# Advanced mode: use validator_configs (takes precedence)
|
|
67
|
-
|
|
66
|
+
# configs_to_truthound_format returns (names, config) for truthound 2.x
|
|
67
|
+
validators, validator_config = configs_to_truthound_format(
|
|
68
68
|
request.validator_configs
|
|
69
69
|
)
|
|
70
70
|
elif request.validators:
|
|
@@ -86,13 +86,11 @@ async def run_validation(
|
|
|
86
86
|
validation = await service.run_validation(
|
|
87
87
|
source_id,
|
|
88
88
|
validators=validators,
|
|
89
|
-
|
|
89
|
+
validator_config=validator_config,
|
|
90
90
|
custom_validators=custom_validators,
|
|
91
91
|
schema_path=request.schema_path,
|
|
92
92
|
auto_schema=request.auto_schema,
|
|
93
|
-
columns=request.columns,
|
|
94
93
|
min_severity=request.min_severity,
|
|
95
|
-
strict=request.strict,
|
|
96
94
|
parallel=request.parallel,
|
|
97
95
|
max_workers=request.max_workers,
|
|
98
96
|
pushdown=request.pushdown,
|
|
@@ -140,7 +138,8 @@ async def list_source_validations(
|
|
|
140
138
|
service: ValidationServiceDep,
|
|
141
139
|
source_service: SourceServiceDep,
|
|
142
140
|
source_id: Annotated[str, Path(description="Source ID")],
|
|
143
|
-
|
|
141
|
+
offset: Annotated[int, Query(ge=0, description="Offset for pagination")] = 0,
|
|
142
|
+
limit: Annotated[int, Query(ge=1, le=100, description="Maximum items")] = 10,
|
|
144
143
|
) -> ValidationListResponse:
|
|
145
144
|
"""List validation history for a source.
|
|
146
145
|
|
|
@@ -148,6 +147,7 @@ async def list_source_validations(
|
|
|
148
147
|
service: Injected validation service.
|
|
149
148
|
source_service: Injected source service.
|
|
150
149
|
source_id: Source to get validations for.
|
|
150
|
+
offset: Number of items to skip.
|
|
151
151
|
limit: Maximum validations to return.
|
|
152
152
|
|
|
153
153
|
Returns:
|
|
@@ -161,10 +161,11 @@ async def list_source_validations(
|
|
|
161
161
|
if source is None:
|
|
162
162
|
raise HTTPException(status_code=404, detail="Source not found")
|
|
163
163
|
|
|
164
|
-
validations = await service.list_for_source(source_id, limit=limit)
|
|
164
|
+
validations, total = await service.list_for_source(source_id, offset=offset, limit=limit)
|
|
165
165
|
|
|
166
166
|
return ValidationListResponse(
|
|
167
167
|
data=[ValidationListItem.from_model(v) for v in validations],
|
|
168
|
-
total=
|
|
168
|
+
total=total,
|
|
169
|
+
offset=offset,
|
|
169
170
|
limit=limit,
|
|
170
171
|
)
|
|
@@ -68,7 +68,6 @@ async def list_source_versions(
|
|
|
68
68
|
versions = await manager.list_versions(source_id=source_id, limit=limit)
|
|
69
69
|
|
|
70
70
|
return VersionListResponse(
|
|
71
|
-
success=True,
|
|
72
71
|
data=[_version_info_to_response(v) for v in versions],
|
|
73
72
|
total=len(versions),
|
|
74
73
|
source_id=source_id,
|
|
@@ -202,7 +201,6 @@ async def get_version_history(
|
|
|
202
201
|
history = await manager.get_version_history(version_id=version_id, depth=depth)
|
|
203
202
|
|
|
204
203
|
return VersionHistoryResponse(
|
|
205
|
-
success=True,
|
|
206
204
|
data=[_version_info_to_response(v) for v in history],
|
|
207
205
|
depth=len(history),
|
|
208
206
|
)
|
|
@@ -244,8 +242,7 @@ async def create_version(
|
|
|
244
242
|
)
|
|
245
243
|
|
|
246
244
|
return CreateVersionResponse(
|
|
247
|
-
|
|
248
|
-
data=_version_info_to_response(version),
|
|
245
|
+
version=_version_info_to_response(version),
|
|
249
246
|
message=f"Created version {version.version_number} for validation {request.validation_id}",
|
|
250
247
|
)
|
|
251
248
|
|
|
@@ -264,7 +261,6 @@ async def check_rollback_availability(
|
|
|
264
261
|
availability = await manager.can_rollback(source_id)
|
|
265
262
|
|
|
266
263
|
return RollbackAvailabilityResponse(
|
|
267
|
-
success=True,
|
|
268
264
|
can_rollback=availability["can_rollback"],
|
|
269
265
|
current_version_id=availability["current_version_id"],
|
|
270
266
|
available_versions=availability["available_versions"],
|
|
@@ -299,7 +295,6 @@ async def rollback_to_version(
|
|
|
299
295
|
)
|
|
300
296
|
|
|
301
297
|
return RollbackResponse(
|
|
302
|
-
success=result.success,
|
|
303
298
|
source_id=result.source_id,
|
|
304
299
|
from_version=_version_info_to_response(result.from_version) if result.from_version else None,
|
|
305
300
|
to_version=_version_info_to_response(result.to_version) if result.to_version else None,
|
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
"""Core business logic module.
|
|
2
2
|
|
|
3
3
|
This module contains the core business logic for the dashboard,
|
|
4
|
-
including services, adapters, and domain models.
|
|
4
|
+
including services, adapters, backends, and domain models.
|
|
5
5
|
|
|
6
6
|
Exports:
|
|
7
|
-
-
|
|
7
|
+
- Backends: BackendFactory, BaseDataQualityBackend, TruthoundBackend, MockBackend
|
|
8
|
+
- Interfaces: IDataQualityBackend, DataInput, ICheckResult, etc.
|
|
9
|
+
- Converters: TruthoundResultConverter
|
|
10
|
+
- Adapter (legacy): TruthoundAdapter, get_adapter
|
|
11
|
+
- DataSource Factory: DataSourceFactory, SourceConfig, SourceType, create_datasource
|
|
8
12
|
- Services: SourceService, ValidationService, SchemaService, RuleService, ProfileService,
|
|
9
13
|
HistoryService, DriftService, ScheduleService
|
|
10
|
-
- Result types: CheckResult, LearnResult, ProfileResult,
|
|
14
|
+
- Result types: CheckResult, LearnResult, ProfileResult, ColumnProfileResult,
|
|
15
|
+
CompareResult, ScanResult, MaskResult, GenerateSuiteResult
|
|
11
16
|
- Scheduler: ValidationScheduler, get_scheduler, start_scheduler, stop_scheduler
|
|
12
17
|
- Notifications: NotificationDispatcher, create_dispatcher, get_dispatcher
|
|
13
18
|
- Cache: CacheBackend, MemoryCache, FileCache, get_cache, get_cache_manager
|
|
@@ -16,9 +21,50 @@ Exports:
|
|
|
16
21
|
- Exceptions: TruthoundDashboardError, SourceNotFoundError, ValidationError, etc.
|
|
17
22
|
- Encryption: encrypt_value, decrypt_value, encrypt_config, decrypt_config
|
|
18
23
|
- Logging: setup_logging, get_logger, get_audit_logger
|
|
24
|
+
|
|
25
|
+
Note:
|
|
26
|
+
The profiler module now supports the new truthound profiler API with:
|
|
27
|
+
- ProfilerConfig for fine-grained control over profiling behavior
|
|
28
|
+
- TableProfile and ColumnProfile for comprehensive data profiling
|
|
29
|
+
- generate_suite() for automatic validation rule generation from profiles
|
|
30
|
+
|
|
31
|
+
Architecture:
|
|
32
|
+
The backend abstraction layer provides loose coupling with truthound:
|
|
33
|
+
|
|
34
|
+
API Endpoints → Services → BackendFactory → IDataQualityBackend
|
|
35
|
+
↓
|
|
36
|
+
┌───────────────┴───────────────┐
|
|
37
|
+
│ TruthoundBackend │ MockBackend │
|
|
38
|
+
└───────────────────────────────┘
|
|
19
39
|
"""
|
|
20
40
|
|
|
41
|
+
# Backend abstraction (loose coupling with truthound)
|
|
42
|
+
from .backends import (
|
|
43
|
+
BackendError,
|
|
44
|
+
BackendFactory,
|
|
45
|
+
BackendOperationError,
|
|
46
|
+
BackendUnavailableError,
|
|
47
|
+
BackendVersionError,
|
|
48
|
+
BaseDataQualityBackend,
|
|
49
|
+
MockBackend,
|
|
50
|
+
TruthoundBackend,
|
|
51
|
+
get_backend,
|
|
52
|
+
reset_backend,
|
|
53
|
+
)
|
|
21
54
|
from .base import BaseService, CRUDService
|
|
55
|
+
from .converters import TruthoundResultConverter
|
|
56
|
+
from .datasource_factory import (
|
|
57
|
+
DataSourceFactory,
|
|
58
|
+
SourceConfig,
|
|
59
|
+
SourceType,
|
|
60
|
+
create_datasource,
|
|
61
|
+
create_datasource_async,
|
|
62
|
+
get_datasource_auto,
|
|
63
|
+
get_datasource_factory,
|
|
64
|
+
get_source_capabilities,
|
|
65
|
+
get_source_path_or_datasource,
|
|
66
|
+
test_connection,
|
|
67
|
+
)
|
|
22
68
|
from .cache import (
|
|
23
69
|
CacheBackend,
|
|
24
70
|
CacheManager,
|
|
@@ -148,10 +194,14 @@ from .services import (
|
|
|
148
194
|
SchemaService,
|
|
149
195
|
SourceService,
|
|
150
196
|
ValidationService,
|
|
197
|
+
get_data_input_from_source,
|
|
198
|
+
get_async_data_input_from_source,
|
|
151
199
|
)
|
|
152
200
|
from .truthound_adapter import (
|
|
153
201
|
CheckResult,
|
|
202
|
+
ColumnProfileResult,
|
|
154
203
|
CompareResult,
|
|
204
|
+
GenerateSuiteResult,
|
|
155
205
|
LearnResult,
|
|
156
206
|
MaskResult,
|
|
157
207
|
ProfileResult,
|
|
@@ -167,11 +217,61 @@ from .phase5 import (
|
|
|
167
217
|
CollaborationService,
|
|
168
218
|
GlossaryService,
|
|
169
219
|
)
|
|
220
|
+
# Quality Reporter
|
|
221
|
+
from .quality_reporter import (
|
|
222
|
+
QualityFilter,
|
|
223
|
+
QualityLevel,
|
|
224
|
+
QualityMetrics,
|
|
225
|
+
QualityReportConfig,
|
|
226
|
+
QualityReportFormat,
|
|
227
|
+
QualityReportResult,
|
|
228
|
+
QualityReportStatus,
|
|
229
|
+
QualityReporterService,
|
|
230
|
+
QualityScore,
|
|
231
|
+
QualityScoreResult,
|
|
232
|
+
QualityStatistics,
|
|
233
|
+
QualityThresholds,
|
|
234
|
+
)
|
|
235
|
+
# Storage Tiering
|
|
236
|
+
from .tiering import (
|
|
237
|
+
TieringAdapter,
|
|
238
|
+
TieringService,
|
|
239
|
+
TierInfo,
|
|
240
|
+
MigrationItem,
|
|
241
|
+
MigrationResult,
|
|
242
|
+
TieringExecutionResult,
|
|
243
|
+
get_tiering_adapter,
|
|
244
|
+
process_tiering_policies,
|
|
245
|
+
)
|
|
170
246
|
|
|
171
247
|
__all__ = [
|
|
248
|
+
# Backend abstraction (loose coupling with truthound)
|
|
249
|
+
"BackendFactory",
|
|
250
|
+
"BaseDataQualityBackend",
|
|
251
|
+
"TruthoundBackend",
|
|
252
|
+
"MockBackend",
|
|
253
|
+
"get_backend",
|
|
254
|
+
"reset_backend",
|
|
255
|
+
"BackendError",
|
|
256
|
+
"BackendUnavailableError",
|
|
257
|
+
"BackendVersionError",
|
|
258
|
+
"BackendOperationError",
|
|
259
|
+
# Converters
|
|
260
|
+
"TruthoundResultConverter",
|
|
172
261
|
# Base classes
|
|
173
262
|
"BaseService",
|
|
174
263
|
"CRUDService",
|
|
264
|
+
# DataSource Factory
|
|
265
|
+
"DataSourceFactory",
|
|
266
|
+
"SourceConfig",
|
|
267
|
+
"SourceType",
|
|
268
|
+
"create_datasource",
|
|
269
|
+
"create_datasource_async",
|
|
270
|
+
"get_datasource_auto",
|
|
271
|
+
"get_datasource_factory",
|
|
272
|
+
"get_source_capabilities",
|
|
273
|
+
"get_source_path_or_datasource",
|
|
274
|
+
"test_connection",
|
|
175
275
|
# Services
|
|
176
276
|
"SourceService",
|
|
177
277
|
"ValidationService",
|
|
@@ -183,6 +283,8 @@ __all__ = [
|
|
|
183
283
|
"ScheduleService",
|
|
184
284
|
"PIIScanService",
|
|
185
285
|
"MaskService",
|
|
286
|
+
"get_data_input_from_source",
|
|
287
|
+
"get_async_data_input_from_source",
|
|
186
288
|
# Adapter
|
|
187
289
|
"TruthoundAdapter",
|
|
188
290
|
"get_adapter",
|
|
@@ -191,9 +293,11 @@ __all__ = [
|
|
|
191
293
|
"CheckResult",
|
|
192
294
|
"LearnResult",
|
|
193
295
|
"ProfileResult",
|
|
296
|
+
"ColumnProfileResult",
|
|
194
297
|
"CompareResult",
|
|
195
298
|
"ScanResult",
|
|
196
299
|
"MaskResult",
|
|
300
|
+
"GenerateSuiteResult",
|
|
197
301
|
# Scheduler
|
|
198
302
|
"ValidationScheduler",
|
|
199
303
|
"get_scheduler",
|
|
@@ -308,4 +412,26 @@ __all__ = [
|
|
|
308
412
|
"clear_limits_cache",
|
|
309
413
|
"validate_positive_int",
|
|
310
414
|
"validate_positive_float",
|
|
415
|
+
# Quality Reporter
|
|
416
|
+
"QualityReporterService",
|
|
417
|
+
"QualityScore",
|
|
418
|
+
"QualityScoreResult",
|
|
419
|
+
"QualityMetrics",
|
|
420
|
+
"QualityStatistics",
|
|
421
|
+
"QualityFilter",
|
|
422
|
+
"QualityReportConfig",
|
|
423
|
+
"QualityReportResult",
|
|
424
|
+
"QualityReportFormat",
|
|
425
|
+
"QualityReportStatus",
|
|
426
|
+
"QualityLevel",
|
|
427
|
+
"QualityThresholds",
|
|
428
|
+
# Storage Tiering
|
|
429
|
+
"TieringAdapter",
|
|
430
|
+
"TieringService",
|
|
431
|
+
"TierInfo",
|
|
432
|
+
"MigrationItem",
|
|
433
|
+
"MigrationResult",
|
|
434
|
+
"TieringExecutionResult",
|
|
435
|
+
"get_tiering_adapter",
|
|
436
|
+
"process_tiering_policies",
|
|
311
437
|
]
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"""Concrete action implementations for checkpoint pipelines.
|
|
2
|
+
|
|
3
|
+
This module provides built-in action implementations for common use cases:
|
|
4
|
+
- Notification actions: Slack, Email, Teams, Discord, PagerDuty
|
|
5
|
+
- Storage actions: Filesystem, S3, GCS
|
|
6
|
+
- Webhook actions: HTTP POST to external endpoints
|
|
7
|
+
- Custom actions: Python callbacks and shell commands
|
|
8
|
+
|
|
9
|
+
All actions are loosely coupled from truthound and implement the
|
|
10
|
+
ActionProtocol interface defined in interfaces.actions.
|
|
11
|
+
|
|
12
|
+
Usage:
|
|
13
|
+
from truthound_dashboard.core.actions import SlackNotificationAction
|
|
14
|
+
|
|
15
|
+
action = SlackNotificationAction(
|
|
16
|
+
webhook_url="https://hooks.slack.com/services/...",
|
|
17
|
+
channel="#data-quality-alerts",
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
# Execute with context
|
|
21
|
+
result = action.execute(context)
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from truthound_dashboard.core.actions.notifications import (
|
|
25
|
+
DiscordNotificationAction,
|
|
26
|
+
EmailNotificationAction,
|
|
27
|
+
PagerDutyNotificationAction,
|
|
28
|
+
SlackNotificationAction,
|
|
29
|
+
TeamsNotificationAction,
|
|
30
|
+
TelegramNotificationAction,
|
|
31
|
+
)
|
|
32
|
+
from truthound_dashboard.core.actions.storage import (
|
|
33
|
+
FileStorageAction,
|
|
34
|
+
GCSStorageAction,
|
|
35
|
+
S3StorageAction,
|
|
36
|
+
)
|
|
37
|
+
from truthound_dashboard.core.actions.webhook import (
|
|
38
|
+
WebhookAction,
|
|
39
|
+
)
|
|
40
|
+
from truthound_dashboard.core.actions.custom import (
|
|
41
|
+
CallbackAction,
|
|
42
|
+
ShellCommandAction,
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
__all__ = [
|
|
46
|
+
# Notification actions
|
|
47
|
+
"SlackNotificationAction",
|
|
48
|
+
"EmailNotificationAction",
|
|
49
|
+
"TeamsNotificationAction",
|
|
50
|
+
"DiscordNotificationAction",
|
|
51
|
+
"TelegramNotificationAction",
|
|
52
|
+
"PagerDutyNotificationAction",
|
|
53
|
+
# Storage actions
|
|
54
|
+
"FileStorageAction",
|
|
55
|
+
"S3StorageAction",
|
|
56
|
+
"GCSStorageAction",
|
|
57
|
+
# Webhook action
|
|
58
|
+
"WebhookAction",
|
|
59
|
+
# Custom actions
|
|
60
|
+
"CallbackAction",
|
|
61
|
+
"ShellCommandAction",
|
|
62
|
+
]
|