truthound-dashboard 1.4.3__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.
Files changed (205) hide show
  1. truthound_dashboard/api/alerts.py +75 -86
  2. truthound_dashboard/api/anomaly.py +7 -13
  3. truthound_dashboard/api/cross_alerts.py +38 -52
  4. truthound_dashboard/api/drift.py +49 -59
  5. truthound_dashboard/api/drift_monitor.py +234 -79
  6. truthound_dashboard/api/enterprise_sampling.py +498 -0
  7. truthound_dashboard/api/history.py +57 -5
  8. truthound_dashboard/api/lineage.py +3 -48
  9. truthound_dashboard/api/maintenance.py +104 -49
  10. truthound_dashboard/api/mask.py +1 -2
  11. truthound_dashboard/api/middleware.py +2 -1
  12. truthound_dashboard/api/model_monitoring.py +435 -311
  13. truthound_dashboard/api/notifications.py +227 -191
  14. truthound_dashboard/api/notifications_advanced.py +21 -20
  15. truthound_dashboard/api/observability.py +586 -0
  16. truthound_dashboard/api/plugins.py +2 -433
  17. truthound_dashboard/api/profile.py +199 -37
  18. truthound_dashboard/api/quality_reporter.py +701 -0
  19. truthound_dashboard/api/reports.py +7 -16
  20. truthound_dashboard/api/router.py +66 -0
  21. truthound_dashboard/api/rule_suggestions.py +5 -5
  22. truthound_dashboard/api/scan.py +17 -19
  23. truthound_dashboard/api/schedules.py +85 -50
  24. truthound_dashboard/api/schema_evolution.py +6 -6
  25. truthound_dashboard/api/schema_watcher.py +667 -0
  26. truthound_dashboard/api/sources.py +98 -27
  27. truthound_dashboard/api/tiering.py +1323 -0
  28. truthound_dashboard/api/triggers.py +14 -11
  29. truthound_dashboard/api/validations.py +12 -11
  30. truthound_dashboard/api/versioning.py +1 -6
  31. truthound_dashboard/core/__init__.py +129 -3
  32. truthound_dashboard/core/actions/__init__.py +62 -0
  33. truthound_dashboard/core/actions/custom.py +426 -0
  34. truthound_dashboard/core/actions/notifications.py +910 -0
  35. truthound_dashboard/core/actions/storage.py +472 -0
  36. truthound_dashboard/core/actions/webhook.py +281 -0
  37. truthound_dashboard/core/anomaly.py +262 -67
  38. truthound_dashboard/core/anomaly_explainer.py +4 -3
  39. truthound_dashboard/core/backends/__init__.py +67 -0
  40. truthound_dashboard/core/backends/base.py +299 -0
  41. truthound_dashboard/core/backends/errors.py +191 -0
  42. truthound_dashboard/core/backends/factory.py +423 -0
  43. truthound_dashboard/core/backends/mock_backend.py +451 -0
  44. truthound_dashboard/core/backends/truthound_backend.py +718 -0
  45. truthound_dashboard/core/checkpoint/__init__.py +87 -0
  46. truthound_dashboard/core/checkpoint/adapters.py +814 -0
  47. truthound_dashboard/core/checkpoint/checkpoint.py +491 -0
  48. truthound_dashboard/core/checkpoint/runner.py +270 -0
  49. truthound_dashboard/core/connections.py +437 -10
  50. truthound_dashboard/core/converters/__init__.py +14 -0
  51. truthound_dashboard/core/converters/truthound.py +620 -0
  52. truthound_dashboard/core/cross_alerts.py +540 -320
  53. truthound_dashboard/core/datasource_factory.py +1672 -0
  54. truthound_dashboard/core/drift_monitor.py +216 -20
  55. truthound_dashboard/core/enterprise_sampling.py +1291 -0
  56. truthound_dashboard/core/interfaces/__init__.py +225 -0
  57. truthound_dashboard/core/interfaces/actions.py +652 -0
  58. truthound_dashboard/core/interfaces/base.py +247 -0
  59. truthound_dashboard/core/interfaces/checkpoint.py +676 -0
  60. truthound_dashboard/core/interfaces/protocols.py +664 -0
  61. truthound_dashboard/core/interfaces/reporters.py +650 -0
  62. truthound_dashboard/core/interfaces/routing.py +646 -0
  63. truthound_dashboard/core/interfaces/triggers.py +619 -0
  64. truthound_dashboard/core/lineage.py +407 -71
  65. truthound_dashboard/core/model_monitoring.py +431 -3
  66. truthound_dashboard/core/notifications/base.py +4 -0
  67. truthound_dashboard/core/notifications/channels.py +501 -1203
  68. truthound_dashboard/core/notifications/deduplication/__init__.py +81 -115
  69. truthound_dashboard/core/notifications/deduplication/service.py +131 -348
  70. truthound_dashboard/core/notifications/dispatcher.py +202 -11
  71. truthound_dashboard/core/notifications/escalation/__init__.py +119 -106
  72. truthound_dashboard/core/notifications/escalation/engine.py +168 -358
  73. truthound_dashboard/core/notifications/routing/__init__.py +88 -128
  74. truthound_dashboard/core/notifications/routing/engine.py +90 -317
  75. truthound_dashboard/core/notifications/stats_aggregator.py +246 -1
  76. truthound_dashboard/core/notifications/throttling/__init__.py +67 -50
  77. truthound_dashboard/core/notifications/throttling/builder.py +117 -255
  78. truthound_dashboard/core/notifications/truthound_adapter.py +842 -0
  79. truthound_dashboard/core/phase5/collaboration.py +1 -1
  80. truthound_dashboard/core/plugins/lifecycle/__init__.py +0 -13
  81. truthound_dashboard/core/quality_reporter.py +1359 -0
  82. truthound_dashboard/core/report_history.py +0 -6
  83. truthound_dashboard/core/reporters/__init__.py +175 -14
  84. truthound_dashboard/core/reporters/adapters.py +943 -0
  85. truthound_dashboard/core/reporters/base.py +0 -3
  86. truthound_dashboard/core/reporters/builtin/__init__.py +18 -0
  87. truthound_dashboard/core/reporters/builtin/csv_reporter.py +111 -0
  88. truthound_dashboard/core/reporters/builtin/html_reporter.py +270 -0
  89. truthound_dashboard/core/reporters/builtin/json_reporter.py +127 -0
  90. truthound_dashboard/core/reporters/compat.py +266 -0
  91. truthound_dashboard/core/reporters/csv_reporter.py +2 -35
  92. truthound_dashboard/core/reporters/factory.py +526 -0
  93. truthound_dashboard/core/reporters/interfaces.py +745 -0
  94. truthound_dashboard/core/reporters/registry.py +1 -10
  95. truthound_dashboard/core/scheduler.py +165 -0
  96. truthound_dashboard/core/schema_evolution.py +3 -3
  97. truthound_dashboard/core/schema_watcher.py +1528 -0
  98. truthound_dashboard/core/services.py +595 -76
  99. truthound_dashboard/core/store_manager.py +810 -0
  100. truthound_dashboard/core/streaming_anomaly.py +169 -4
  101. truthound_dashboard/core/tiering.py +1309 -0
  102. truthound_dashboard/core/triggers/evaluators.py +178 -8
  103. truthound_dashboard/core/truthound_adapter.py +2620 -197
  104. truthound_dashboard/core/unified_alerts.py +23 -20
  105. truthound_dashboard/db/__init__.py +8 -0
  106. truthound_dashboard/db/database.py +8 -2
  107. truthound_dashboard/db/models.py +944 -25
  108. truthound_dashboard/db/repository.py +2 -0
  109. truthound_dashboard/main.py +11 -0
  110. truthound_dashboard/schemas/__init__.py +177 -16
  111. truthound_dashboard/schemas/base.py +44 -23
  112. truthound_dashboard/schemas/collaboration.py +19 -6
  113. truthound_dashboard/schemas/cross_alerts.py +19 -3
  114. truthound_dashboard/schemas/drift.py +61 -55
  115. truthound_dashboard/schemas/drift_monitor.py +67 -23
  116. truthound_dashboard/schemas/enterprise_sampling.py +653 -0
  117. truthound_dashboard/schemas/lineage.py +0 -33
  118. truthound_dashboard/schemas/mask.py +10 -8
  119. truthound_dashboard/schemas/model_monitoring.py +89 -10
  120. truthound_dashboard/schemas/notifications_advanced.py +13 -0
  121. truthound_dashboard/schemas/observability.py +453 -0
  122. truthound_dashboard/schemas/plugins.py +0 -280
  123. truthound_dashboard/schemas/profile.py +154 -247
  124. truthound_dashboard/schemas/quality_reporter.py +403 -0
  125. truthound_dashboard/schemas/reports.py +2 -2
  126. truthound_dashboard/schemas/rule_suggestion.py +8 -1
  127. truthound_dashboard/schemas/scan.py +4 -24
  128. truthound_dashboard/schemas/schedule.py +11 -3
  129. truthound_dashboard/schemas/schema_watcher.py +727 -0
  130. truthound_dashboard/schemas/source.py +17 -2
  131. truthound_dashboard/schemas/tiering.py +822 -0
  132. truthound_dashboard/schemas/triggers.py +16 -0
  133. truthound_dashboard/schemas/unified_alerts.py +7 -0
  134. truthound_dashboard/schemas/validation.py +0 -13
  135. truthound_dashboard/schemas/validators/base.py +41 -21
  136. truthound_dashboard/schemas/validators/business_rule_validators.py +244 -0
  137. truthound_dashboard/schemas/validators/localization_validators.py +273 -0
  138. truthound_dashboard/schemas/validators/ml_feature_validators.py +308 -0
  139. truthound_dashboard/schemas/validators/profiling_validators.py +275 -0
  140. truthound_dashboard/schemas/validators/referential_validators.py +312 -0
  141. truthound_dashboard/schemas/validators/registry.py +93 -8
  142. truthound_dashboard/schemas/validators/timeseries_validators.py +389 -0
  143. truthound_dashboard/schemas/versioning.py +1 -6
  144. truthound_dashboard/static/index.html +2 -2
  145. truthound_dashboard-1.5.0.dist-info/METADATA +309 -0
  146. {truthound_dashboard-1.4.3.dist-info → truthound_dashboard-1.5.0.dist-info}/RECORD +149 -148
  147. truthound_dashboard/core/plugins/hooks/__init__.py +0 -63
  148. truthound_dashboard/core/plugins/hooks/decorators.py +0 -367
  149. truthound_dashboard/core/plugins/hooks/manager.py +0 -403
  150. truthound_dashboard/core/plugins/hooks/protocols.py +0 -265
  151. truthound_dashboard/core/plugins/lifecycle/hot_reload.py +0 -584
  152. truthound_dashboard/core/reporters/junit_reporter.py +0 -233
  153. truthound_dashboard/core/reporters/markdown_reporter.py +0 -207
  154. truthound_dashboard/core/reporters/pdf_reporter.py +0 -209
  155. truthound_dashboard/static/assets/_baseUniq-BcrSP13d.js +0 -1
  156. truthound_dashboard/static/assets/arc-DlYjKwIL.js +0 -1
  157. truthound_dashboard/static/assets/architectureDiagram-VXUJARFQ-Bb2drbQM.js +0 -36
  158. truthound_dashboard/static/assets/blockDiagram-VD42YOAC-BlsPG1CH.js +0 -122
  159. truthound_dashboard/static/assets/c4Diagram-YG6GDRKO-B9JdUoaC.js +0 -10
  160. truthound_dashboard/static/assets/channel-Q6mHF1Hd.js +0 -1
  161. truthound_dashboard/static/assets/chunk-4BX2VUAB-DmyoPVuJ.js +0 -1
  162. truthound_dashboard/static/assets/chunk-55IACEB6-Bcz6Siv8.js +0 -1
  163. truthound_dashboard/static/assets/chunk-B4BG7PRW-Br3G5Rum.js +0 -165
  164. truthound_dashboard/static/assets/chunk-DI55MBZ5-DuM9c23u.js +0 -220
  165. truthound_dashboard/static/assets/chunk-FMBD7UC4-DNU-5mvT.js +0 -15
  166. truthound_dashboard/static/assets/chunk-QN33PNHL-Im2yNcmS.js +0 -1
  167. truthound_dashboard/static/assets/chunk-QZHKN3VN-kZr8XFm1.js +0 -1
  168. truthound_dashboard/static/assets/chunk-TZMSLE5B-Q__360q_.js +0 -1
  169. truthound_dashboard/static/assets/classDiagram-2ON5EDUG-vtixxUyK.js +0 -1
  170. truthound_dashboard/static/assets/classDiagram-v2-WZHVMYZB-vtixxUyK.js +0 -1
  171. truthound_dashboard/static/assets/clone-BOt2LwD0.js +0 -1
  172. truthound_dashboard/static/assets/cose-bilkent-S5V4N54A-CBDw6iac.js +0 -1
  173. truthound_dashboard/static/assets/dagre-6UL2VRFP-XdKqmmY9.js +0 -4
  174. truthound_dashboard/static/assets/diagram-PSM6KHXK-DAZ8nx9V.js +0 -24
  175. truthound_dashboard/static/assets/diagram-QEK2KX5R-BRvDTbGD.js +0 -43
  176. truthound_dashboard/static/assets/diagram-S2PKOQOG-bQcczUkl.js +0 -24
  177. truthound_dashboard/static/assets/erDiagram-Q2GNP2WA-DPje7VMN.js +0 -60
  178. truthound_dashboard/static/assets/flowDiagram-NV44I4VS-B7BVtFVS.js +0 -162
  179. truthound_dashboard/static/assets/ganttDiagram-JELNMOA3-D6WKSS7U.js +0 -267
  180. truthound_dashboard/static/assets/gitGraphDiagram-NY62KEGX-D3vtVd3y.js +0 -65
  181. truthound_dashboard/static/assets/graph-BKgNKZVp.js +0 -1
  182. truthound_dashboard/static/assets/index-C6JSrkHo.css +0 -1
  183. truthound_dashboard/static/assets/index-DkU82VsU.js +0 -1800
  184. truthound_dashboard/static/assets/infoDiagram-WHAUD3N6-DnNCT429.js +0 -2
  185. truthound_dashboard/static/assets/journeyDiagram-XKPGCS4Q-DGiMozqS.js +0 -139
  186. truthound_dashboard/static/assets/kanban-definition-3W4ZIXB7-BV2gUgli.js +0 -89
  187. truthound_dashboard/static/assets/katex-Cu_Erd72.js +0 -261
  188. truthound_dashboard/static/assets/layout-DI2MfQ5G.js +0 -1
  189. truthound_dashboard/static/assets/min-DYdgXVcT.js +0 -1
  190. truthound_dashboard/static/assets/mindmap-definition-VGOIOE7T-C7x4ruxz.js +0 -68
  191. truthound_dashboard/static/assets/pieDiagram-ADFJNKIX-CAJaAB9f.js +0 -30
  192. truthound_dashboard/static/assets/quadrantDiagram-AYHSOK5B-DeqwDI46.js +0 -7
  193. truthound_dashboard/static/assets/requirementDiagram-UZGBJVZJ-e3XDpZIM.js +0 -64
  194. truthound_dashboard/static/assets/sankeyDiagram-TZEHDZUN-CNnAv5Ux.js +0 -10
  195. truthound_dashboard/static/assets/sequenceDiagram-WL72ISMW-Dsne-Of3.js +0 -145
  196. truthound_dashboard/static/assets/stateDiagram-FKZM4ZOC-Ee0sQXyb.js +0 -1
  197. truthound_dashboard/static/assets/stateDiagram-v2-4FDKWEC3-B26KqW_W.js +0 -1
  198. truthound_dashboard/static/assets/timeline-definition-IT6M3QCI-DZYi2yl3.js +0 -61
  199. truthound_dashboard/static/assets/treemap-KMMF4GRG-CY3f8In2.js +0 -128
  200. truthound_dashboard/static/assets/unmerged_dictionaries-Dd7xcPWG.js +0 -1
  201. truthound_dashboard/static/assets/xychartDiagram-PRI3JC2R-CS7fydZZ.js +0 -7
  202. truthound_dashboard-1.4.3.dist-info/METADATA +0 -505
  203. {truthound_dashboard-1.4.3.dist-info → truthound_dashboard-1.5.0.dist-info}/WHEEL +0 -0
  204. {truthound_dashboard-1.4.3.dist-info → truthound_dashboard-1.5.0.dist-info}/entry_points.txt +0 -0
  205. {truthound_dashboard-1.4.3.dist-info → truthound_dashboard-1.5.0.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) -> dict[str, Any]:
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
- ) -> dict[str, Any]:
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
- "success": True,
185
- "message": "Webhook endpoint is accessible",
186
- "received": {
187
- "source": source,
188
- "event_type": event_type,
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 params based on request mode
60
+ # Determine validators and config based on request mode
62
61
  validators: list[str] | None = None
63
- validator_params: dict | None = None
62
+ validator_config: dict | None = None
64
63
 
65
64
  if request.validator_configs:
66
65
  # Advanced mode: use validator_configs (takes precedence)
67
- validators, validator_params = configs_to_truthound_format(
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
- validator_params=validator_params,
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
- limit: Annotated[int, Query(ge=1, le=100, description="Maximum items")] = 20,
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=len(validations),
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
- success=True,
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
- - Adapter: TruthoundAdapter, get_adapter
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, CompareResult
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
+ ]