truthound-dashboard 1.2.1__py3-none-any.whl → 1.3.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 (53) hide show
  1. truthound_dashboard/api/deps.py +28 -0
  2. truthound_dashboard/api/drift.py +1 -0
  3. truthound_dashboard/api/mask.py +164 -0
  4. truthound_dashboard/api/profile.py +11 -3
  5. truthound_dashboard/api/router.py +22 -0
  6. truthound_dashboard/api/scan.py +168 -0
  7. truthound_dashboard/api/schemas.py +13 -4
  8. truthound_dashboard/api/validations.py +33 -1
  9. truthound_dashboard/api/validators.py +85 -0
  10. truthound_dashboard/core/__init__.py +8 -0
  11. truthound_dashboard/core/phase5/activity.py +1 -1
  12. truthound_dashboard/core/services.py +457 -7
  13. truthound_dashboard/core/truthound_adapter.py +441 -26
  14. truthound_dashboard/db/__init__.py +6 -0
  15. truthound_dashboard/db/models.py +250 -1
  16. truthound_dashboard/schemas/__init__.py +52 -1
  17. truthound_dashboard/schemas/collaboration.py +1 -1
  18. truthound_dashboard/schemas/drift.py +118 -3
  19. truthound_dashboard/schemas/mask.py +209 -0
  20. truthound_dashboard/schemas/profile.py +45 -2
  21. truthound_dashboard/schemas/scan.py +312 -0
  22. truthound_dashboard/schemas/schema.py +30 -2
  23. truthound_dashboard/schemas/validation.py +60 -3
  24. truthound_dashboard/schemas/validators/__init__.py +59 -0
  25. truthound_dashboard/schemas/validators/aggregate_validators.py +238 -0
  26. truthound_dashboard/schemas/validators/anomaly_validators.py +723 -0
  27. truthound_dashboard/schemas/validators/base.py +263 -0
  28. truthound_dashboard/schemas/validators/completeness_validators.py +269 -0
  29. truthound_dashboard/schemas/validators/cross_table_validators.py +375 -0
  30. truthound_dashboard/schemas/validators/datetime_validators.py +253 -0
  31. truthound_dashboard/schemas/validators/distribution_validators.py +422 -0
  32. truthound_dashboard/schemas/validators/drift_validators.py +615 -0
  33. truthound_dashboard/schemas/validators/geospatial_validators.py +486 -0
  34. truthound_dashboard/schemas/validators/multi_column_validators.py +706 -0
  35. truthound_dashboard/schemas/validators/privacy_validators.py +531 -0
  36. truthound_dashboard/schemas/validators/query_validators.py +510 -0
  37. truthound_dashboard/schemas/validators/registry.py +318 -0
  38. truthound_dashboard/schemas/validators/schema_validators.py +408 -0
  39. truthound_dashboard/schemas/validators/string_validators.py +396 -0
  40. truthound_dashboard/schemas/validators/table_validators.py +412 -0
  41. truthound_dashboard/schemas/validators/uniqueness_validators.py +355 -0
  42. truthound_dashboard/schemas/validators.py +59 -0
  43. truthound_dashboard/static/assets/{index-BqXVFyqj.js → index-BCA8H1hO.js} +95 -95
  44. truthound_dashboard/static/assets/index-BNsSQ2fN.css +1 -0
  45. truthound_dashboard/static/assets/unmerged_dictionaries-CsJWCRx9.js +1 -0
  46. truthound_dashboard/static/index.html +2 -2
  47. {truthound_dashboard-1.2.1.dist-info → truthound_dashboard-1.3.0.dist-info}/METADATA +46 -11
  48. {truthound_dashboard-1.2.1.dist-info → truthound_dashboard-1.3.0.dist-info}/RECORD +51 -27
  49. truthound_dashboard/static/assets/index-o8qHVDte.css +0 -1
  50. truthound_dashboard/static/assets/unmerged_dictionaries-n_T3wZTf.js +0 -1
  51. {truthound_dashboard-1.2.1.dist-info → truthound_dashboard-1.3.0.dist-info}/WHEEL +0 -0
  52. {truthound_dashboard-1.2.1.dist-info → truthound_dashboard-1.3.0.dist-info}/entry_points.txt +0 -0
  53. {truthound_dashboard-1.2.1.dist-info → truthound_dashboard-1.3.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,375 @@
1
+ """Cross-table validators.
2
+
3
+ Validators for multi-table relationships, foreign key constraints, and cross-dataset comparisons.
4
+ These validators require reference to another data source.
5
+ """
6
+
7
+ from .base import (
8
+ ParameterDefinition,
9
+ ParameterType,
10
+ ValidatorCategory,
11
+ ValidatorDefinition,
12
+ )
13
+
14
+ CROSS_TABLE_VALIDATORS: list[ValidatorDefinition] = [
15
+ ValidatorDefinition(
16
+ name="ForeignKey",
17
+ display_name="Foreign Key",
18
+ category=ValidatorCategory.CROSS_TABLE,
19
+ description="Validates that all values in a column exist in a reference table's column.",
20
+ parameters=[
21
+ ParameterDefinition(
22
+ name="column",
23
+ label="Foreign Key Column",
24
+ type=ParameterType.COLUMN,
25
+ description="Column containing foreign key values",
26
+ required=True,
27
+ ),
28
+ ParameterDefinition(
29
+ name="reference_source_id",
30
+ label="Reference Source",
31
+ type=ParameterType.SOURCE_REF,
32
+ description="ID of the data source containing the reference table",
33
+ required=True,
34
+ ),
35
+ ParameterDefinition(
36
+ name="reference_column",
37
+ label="Reference Column",
38
+ type=ParameterType.STRING,
39
+ description="Primary/unique key column in the reference table",
40
+ required=True,
41
+ ),
42
+ ParameterDefinition(
43
+ name="allow_null",
44
+ label="Allow Null",
45
+ type=ParameterType.BOOLEAN,
46
+ description="Allow null values in foreign key column",
47
+ default=True,
48
+ ),
49
+ ],
50
+ tags=["cross_table", "foreign_key", "referential", "integrity"],
51
+ severity_default="critical",
52
+ ),
53
+ ValidatorDefinition(
54
+ name="CompositeForeignKey",
55
+ display_name="Composite Foreign Key",
56
+ category=ValidatorCategory.CROSS_TABLE,
57
+ description="Validates composite foreign key relationships across multiple columns.",
58
+ parameters=[
59
+ ParameterDefinition(
60
+ name="columns",
61
+ label="Foreign Key Columns",
62
+ type=ParameterType.COLUMN_LIST,
63
+ description="Columns forming the composite foreign key",
64
+ required=True,
65
+ ),
66
+ ParameterDefinition(
67
+ name="reference_source_id",
68
+ label="Reference Source",
69
+ type=ParameterType.SOURCE_REF,
70
+ description="ID of the data source containing the reference table",
71
+ required=True,
72
+ ),
73
+ ParameterDefinition(
74
+ name="reference_columns",
75
+ label="Reference Columns",
76
+ type=ParameterType.STRING_LIST,
77
+ description="Columns in the reference table (same order as foreign key columns)",
78
+ required=True,
79
+ ),
80
+ ParameterDefinition(
81
+ name="allow_null",
82
+ label="Allow Null",
83
+ type=ParameterType.BOOLEAN,
84
+ description="Allow null values in any foreign key column",
85
+ default=True,
86
+ ),
87
+ ],
88
+ tags=["cross_table", "foreign_key", "composite", "referential"],
89
+ severity_default="critical",
90
+ ),
91
+ ValidatorDefinition(
92
+ name="Orphan",
93
+ display_name="Orphan Records",
94
+ category=ValidatorCategory.CROSS_TABLE,
95
+ description="Detects orphan records that have no matching parent record.",
96
+ parameters=[
97
+ ParameterDefinition(
98
+ name="column",
99
+ label="Child Column",
100
+ type=ParameterType.COLUMN,
101
+ description="Column in child table referencing parent",
102
+ required=True,
103
+ ),
104
+ ParameterDefinition(
105
+ name="reference_source_id",
106
+ label="Parent Source",
107
+ type=ParameterType.SOURCE_REF,
108
+ description="ID of the parent data source",
109
+ required=True,
110
+ ),
111
+ ParameterDefinition(
112
+ name="reference_column",
113
+ label="Parent Column",
114
+ type=ParameterType.STRING,
115
+ description="Primary key column in parent table",
116
+ required=True,
117
+ ),
118
+ ParameterDefinition(
119
+ name="ignore_null",
120
+ label="Ignore Null Values",
121
+ type=ParameterType.BOOLEAN,
122
+ description="Do not flag null values as orphans",
123
+ default=True,
124
+ ),
125
+ ],
126
+ tags=["cross_table", "orphan", "referential", "integrity"],
127
+ severity_default="high",
128
+ ),
129
+ ValidatorDefinition(
130
+ name="CrossTableRowCount",
131
+ display_name="Cross-Table Row Count",
132
+ category=ValidatorCategory.CROSS_TABLE,
133
+ description="Compares row counts between two tables with optional operators.",
134
+ parameters=[
135
+ ParameterDefinition(
136
+ name="reference_source_id",
137
+ label="Reference Source",
138
+ type=ParameterType.SOURCE_REF,
139
+ description="ID of the reference data source",
140
+ required=True,
141
+ ),
142
+ ParameterDefinition(
143
+ name="operator",
144
+ label="Comparison Operator",
145
+ type=ParameterType.SELECT,
146
+ description="How to compare row counts",
147
+ required=True,
148
+ options=[
149
+ {"value": "eq", "label": "Equal (=)"},
150
+ {"value": "ne", "label": "Not Equal (!=)"},
151
+ {"value": "gt", "label": "Greater Than (>)"},
152
+ {"value": "gte", "label": "Greater Than or Equal (>=)"},
153
+ {"value": "lt", "label": "Less Than (<)"},
154
+ {"value": "lte", "label": "Less Than or Equal (<=)"},
155
+ ],
156
+ default="eq",
157
+ ),
158
+ ParameterDefinition(
159
+ name="tolerance",
160
+ label="Tolerance",
161
+ type=ParameterType.FLOAT,
162
+ description="Acceptable tolerance as ratio (e.g., 0.05 for 5%)",
163
+ default=0,
164
+ min_value=0,
165
+ max_value=1,
166
+ ),
167
+ ],
168
+ tags=["cross_table", "row_count", "comparison"],
169
+ severity_default="medium",
170
+ ),
171
+ ValidatorDefinition(
172
+ name="CrossTableAggregate",
173
+ display_name="Cross-Table Aggregate",
174
+ category=ValidatorCategory.CROSS_TABLE,
175
+ description="Compares aggregate statistics between corresponding columns in two tables.",
176
+ parameters=[
177
+ ParameterDefinition(
178
+ name="column",
179
+ label="Column",
180
+ type=ParameterType.COLUMN,
181
+ description="Column in current table to aggregate",
182
+ required=True,
183
+ ),
184
+ ParameterDefinition(
185
+ name="reference_source_id",
186
+ label="Reference Source",
187
+ type=ParameterType.SOURCE_REF,
188
+ description="ID of the reference data source",
189
+ required=True,
190
+ ),
191
+ ParameterDefinition(
192
+ name="reference_column",
193
+ label="Reference Column",
194
+ type=ParameterType.STRING,
195
+ description="Column in reference table (default: same name)",
196
+ ),
197
+ ParameterDefinition(
198
+ name="aggregate",
199
+ label="Aggregate Function",
200
+ type=ParameterType.SELECT,
201
+ description="Aggregate function to compare",
202
+ required=True,
203
+ options=[
204
+ {"value": "sum", "label": "Sum"},
205
+ {"value": "mean", "label": "Mean"},
206
+ {"value": "median", "label": "Median"},
207
+ {"value": "min", "label": "Minimum"},
208
+ {"value": "max", "label": "Maximum"},
209
+ {"value": "count", "label": "Count"},
210
+ {"value": "std", "label": "Standard Deviation"},
211
+ ],
212
+ ),
213
+ ParameterDefinition(
214
+ name="operator",
215
+ label="Comparison Operator",
216
+ type=ParameterType.SELECT,
217
+ description="How to compare aggregates",
218
+ required=True,
219
+ options=[
220
+ {"value": "eq", "label": "Equal (=)"},
221
+ {"value": "ne", "label": "Not Equal (!=)"},
222
+ {"value": "gt", "label": "Greater Than (>)"},
223
+ {"value": "gte", "label": "Greater Than or Equal (>=)"},
224
+ {"value": "lt", "label": "Less Than (<)"},
225
+ {"value": "lte", "label": "Less Than or Equal (<=)"},
226
+ ],
227
+ default="eq",
228
+ ),
229
+ ParameterDefinition(
230
+ name="tolerance",
231
+ label="Tolerance",
232
+ type=ParameterType.FLOAT,
233
+ description="Acceptable tolerance as ratio",
234
+ default=0.01,
235
+ min_value=0,
236
+ ),
237
+ ],
238
+ tags=["cross_table", "aggregate", "comparison", "statistics"],
239
+ severity_default="medium",
240
+ ),
241
+ ValidatorDefinition(
242
+ name="CrossTableDistinct",
243
+ display_name="Cross-Table Distinct Values",
244
+ category=ValidatorCategory.CROSS_TABLE,
245
+ description="Compares distinct value counts between two tables.",
246
+ parameters=[
247
+ ParameterDefinition(
248
+ name="column",
249
+ label="Column",
250
+ type=ParameterType.COLUMN,
251
+ description="Column to check distinct values",
252
+ required=True,
253
+ ),
254
+ ParameterDefinition(
255
+ name="reference_source_id",
256
+ label="Reference Source",
257
+ type=ParameterType.SOURCE_REF,
258
+ description="ID of the reference data source",
259
+ required=True,
260
+ ),
261
+ ParameterDefinition(
262
+ name="reference_column",
263
+ label="Reference Column",
264
+ type=ParameterType.STRING,
265
+ description="Column in reference table (default: same name)",
266
+ ),
267
+ ParameterDefinition(
268
+ name="operator",
269
+ label="Comparison Operator",
270
+ type=ParameterType.SELECT,
271
+ description="How to compare distinct counts",
272
+ required=True,
273
+ options=[
274
+ {"value": "eq", "label": "Equal (=)"},
275
+ {"value": "subset", "label": "Subset Of"},
276
+ {"value": "superset", "label": "Superset Of"},
277
+ {"value": "intersect", "label": "Has Intersection"},
278
+ {"value": "disjoint", "label": "Disjoint (No Overlap)"},
279
+ ],
280
+ default="eq",
281
+ ),
282
+ ],
283
+ tags=["cross_table", "distinct", "comparison"],
284
+ severity_default="medium",
285
+ ),
286
+ ValidatorDefinition(
287
+ name="CrossTableSchema",
288
+ display_name="Cross-Table Schema Match",
289
+ category=ValidatorCategory.CROSS_TABLE,
290
+ description="Validates that two tables have compatible schemas.",
291
+ parameters=[
292
+ ParameterDefinition(
293
+ name="reference_source_id",
294
+ label="Reference Source",
295
+ type=ParameterType.SOURCE_REF,
296
+ description="ID of the reference data source",
297
+ required=True,
298
+ ),
299
+ ParameterDefinition(
300
+ name="check_columns",
301
+ label="Check Column Names",
302
+ type=ParameterType.BOOLEAN,
303
+ description="Verify column names match",
304
+ default=True,
305
+ ),
306
+ ParameterDefinition(
307
+ name="check_types",
308
+ label="Check Column Types",
309
+ type=ParameterType.BOOLEAN,
310
+ description="Verify column types match",
311
+ default=True,
312
+ ),
313
+ ParameterDefinition(
314
+ name="check_order",
315
+ label="Check Column Order",
316
+ type=ParameterType.BOOLEAN,
317
+ description="Verify columns are in same order",
318
+ default=False,
319
+ ),
320
+ ParameterDefinition(
321
+ name="strict",
322
+ label="Strict Mode",
323
+ type=ParameterType.BOOLEAN,
324
+ description="Require exact match (no extra columns)",
325
+ default=False,
326
+ ),
327
+ ],
328
+ tags=["cross_table", "schema", "compatibility"],
329
+ severity_default="high",
330
+ ),
331
+ ValidatorDefinition(
332
+ name="JoinIntegrity",
333
+ display_name="Join Integrity",
334
+ category=ValidatorCategory.CROSS_TABLE,
335
+ description="Validates join integrity (cardinality) between two tables.",
336
+ parameters=[
337
+ ParameterDefinition(
338
+ name="column",
339
+ label="Join Column",
340
+ type=ParameterType.COLUMN,
341
+ description="Column in current table for joining",
342
+ required=True,
343
+ ),
344
+ ParameterDefinition(
345
+ name="reference_source_id",
346
+ label="Reference Source",
347
+ type=ParameterType.SOURCE_REF,
348
+ description="ID of the reference data source",
349
+ required=True,
350
+ ),
351
+ ParameterDefinition(
352
+ name="reference_column",
353
+ label="Reference Join Column",
354
+ type=ParameterType.STRING,
355
+ description="Column in reference table for joining",
356
+ required=True,
357
+ ),
358
+ ParameterDefinition(
359
+ name="expected_cardinality",
360
+ label="Expected Cardinality",
361
+ type=ParameterType.SELECT,
362
+ description="Expected join relationship type",
363
+ required=True,
364
+ options=[
365
+ {"value": "one_to_one", "label": "One-to-One"},
366
+ {"value": "one_to_many", "label": "One-to-Many"},
367
+ {"value": "many_to_one", "label": "Many-to-One"},
368
+ {"value": "many_to_many", "label": "Many-to-Many"},
369
+ ],
370
+ ),
371
+ ],
372
+ tags=["cross_table", "join", "cardinality", "relationship"],
373
+ severity_default="high",
374
+ ),
375
+ ]
@@ -0,0 +1,253 @@
1
+ """Datetime validators.
2
+
3
+ Validators for date/time format, range, ordering, and freshness.
4
+ """
5
+
6
+ from .base import (
7
+ ParameterDefinition,
8
+ ParameterType,
9
+ ValidatorCategory,
10
+ ValidatorDefinition,
11
+ )
12
+
13
+ DATETIME_VALIDATORS: list[ValidatorDefinition] = [
14
+ ValidatorDefinition(
15
+ name="DateFormat",
16
+ display_name="Date Format",
17
+ category=ValidatorCategory.DATETIME,
18
+ description="Validates date/datetime format.",
19
+ parameters=[
20
+ ParameterDefinition(
21
+ name="column",
22
+ label="Column",
23
+ type=ParameterType.COLUMN,
24
+ required=True,
25
+ ),
26
+ ParameterDefinition(
27
+ name="format",
28
+ label="Date Format",
29
+ type=ParameterType.STRING,
30
+ description="Expected strptime format",
31
+ required=True,
32
+ placeholder="%Y-%m-%d",
33
+ ),
34
+ ],
35
+ tags=["datetime", "format"],
36
+ severity_default="medium",
37
+ ),
38
+ ValidatorDefinition(
39
+ name="DateBetween",
40
+ display_name="Date Between",
41
+ category=ValidatorCategory.DATETIME,
42
+ description="Validates dates within a specified range.",
43
+ parameters=[
44
+ ParameterDefinition(
45
+ name="column",
46
+ label="Column",
47
+ type=ParameterType.COLUMN,
48
+ required=True,
49
+ ),
50
+ ParameterDefinition(
51
+ name="min_date",
52
+ label="Minimum Date",
53
+ type=ParameterType.DATE,
54
+ description="Minimum date (YYYY-MM-DD)",
55
+ placeholder="2020-01-01",
56
+ ),
57
+ ParameterDefinition(
58
+ name="max_date",
59
+ label="Maximum Date",
60
+ type=ParameterType.DATE,
61
+ description="Maximum date (YYYY-MM-DD)",
62
+ placeholder="2025-12-31",
63
+ ),
64
+ ],
65
+ tags=["datetime", "range", "bounds"],
66
+ severity_default="medium",
67
+ ),
68
+ ValidatorDefinition(
69
+ name="FutureDate",
70
+ display_name="Future Date",
71
+ category=ValidatorCategory.DATETIME,
72
+ description="Ensures dates are in the future.",
73
+ parameters=[
74
+ ParameterDefinition(
75
+ name="column",
76
+ label="Column",
77
+ type=ParameterType.COLUMN,
78
+ required=True,
79
+ ),
80
+ ],
81
+ tags=["datetime", "future"],
82
+ severity_default="medium",
83
+ ),
84
+ ValidatorDefinition(
85
+ name="PastDate",
86
+ display_name="Past Date",
87
+ category=ValidatorCategory.DATETIME,
88
+ description="Ensures dates are in the past.",
89
+ parameters=[
90
+ ParameterDefinition(
91
+ name="column",
92
+ label="Column",
93
+ type=ParameterType.COLUMN,
94
+ required=True,
95
+ ),
96
+ ],
97
+ tags=["datetime", "past"],
98
+ severity_default="medium",
99
+ ),
100
+ ValidatorDefinition(
101
+ name="DateOrder",
102
+ display_name="Date Order",
103
+ category=ValidatorCategory.DATETIME,
104
+ description="Validates chronological ordering between date columns.",
105
+ parameters=[
106
+ ParameterDefinition(
107
+ name="start_column",
108
+ label="Start Date Column",
109
+ type=ParameterType.COLUMN,
110
+ required=True,
111
+ ),
112
+ ParameterDefinition(
113
+ name="end_column",
114
+ label="End Date Column",
115
+ type=ParameterType.COLUMN,
116
+ required=True,
117
+ ),
118
+ ],
119
+ tags=["datetime", "order", "chronological"],
120
+ severity_default="high",
121
+ ),
122
+ ValidatorDefinition(
123
+ name="Timezone",
124
+ display_name="Timezone",
125
+ category=ValidatorCategory.DATETIME,
126
+ description="Validates timezone-aware datetime values.",
127
+ parameters=[
128
+ ParameterDefinition(
129
+ name="column",
130
+ label="Column",
131
+ type=ParameterType.COLUMN,
132
+ required=True,
133
+ ),
134
+ ParameterDefinition(
135
+ name="expected_timezone",
136
+ label="Expected Timezone",
137
+ type=ParameterType.STRING,
138
+ description="Expected timezone (e.g., 'UTC', 'America/New_York')",
139
+ placeholder="UTC",
140
+ ),
141
+ ],
142
+ tags=["datetime", "timezone"],
143
+ severity_default="low",
144
+ ),
145
+ ValidatorDefinition(
146
+ name="RecentData",
147
+ display_name="Recent Data",
148
+ category=ValidatorCategory.DATETIME,
149
+ description="Ensures data contains recent entries.",
150
+ parameters=[
151
+ ParameterDefinition(
152
+ name="column",
153
+ label="Datetime Column",
154
+ type=ParameterType.COLUMN,
155
+ required=True,
156
+ ),
157
+ ParameterDefinition(
158
+ name="max_age_days",
159
+ label="Maximum Age (Days)",
160
+ type=ParameterType.INTEGER,
161
+ description="Maximum age in days",
162
+ required=True,
163
+ min_value=1,
164
+ ),
165
+ ],
166
+ tags=["datetime", "recent", "freshness"],
167
+ severity_default="high",
168
+ ),
169
+ ValidatorDefinition(
170
+ name="DatePartCoverage",
171
+ display_name="Date Part Coverage",
172
+ category=ValidatorCategory.DATETIME,
173
+ description="Validates coverage across date parts.",
174
+ parameters=[
175
+ ParameterDefinition(
176
+ name="column",
177
+ label="Datetime Column",
178
+ type=ParameterType.COLUMN,
179
+ required=True,
180
+ ),
181
+ ParameterDefinition(
182
+ name="date_part",
183
+ label="Date Part",
184
+ type=ParameterType.SELECT,
185
+ required=True,
186
+ options=[
187
+ {"value": "day", "label": "Day of Month"},
188
+ {"value": "weekday", "label": "Day of Week"},
189
+ {"value": "month", "label": "Month"},
190
+ {"value": "hour", "label": "Hour"},
191
+ {"value": "quarter", "label": "Quarter"},
192
+ ],
193
+ ),
194
+ ParameterDefinition(
195
+ name="min_coverage",
196
+ label="Minimum Coverage",
197
+ type=ParameterType.FLOAT,
198
+ description="Minimum coverage ratio (0.0-1.0)",
199
+ required=True,
200
+ min_value=0,
201
+ max_value=1,
202
+ ),
203
+ ],
204
+ tags=["datetime", "coverage", "completeness"],
205
+ severity_default="medium",
206
+ ),
207
+ ValidatorDefinition(
208
+ name="GroupedRecentData",
209
+ display_name="Grouped Recent Data",
210
+ category=ValidatorCategory.DATETIME,
211
+ description="Validates recency within groups.",
212
+ parameters=[
213
+ ParameterDefinition(
214
+ name="datetime_column",
215
+ label="Datetime Column",
216
+ type=ParameterType.COLUMN,
217
+ required=True,
218
+ ),
219
+ ParameterDefinition(
220
+ name="group_column",
221
+ label="Group Column",
222
+ type=ParameterType.COLUMN,
223
+ required=True,
224
+ ),
225
+ ParameterDefinition(
226
+ name="max_age_days",
227
+ label="Maximum Age (Days)",
228
+ type=ParameterType.INTEGER,
229
+ description="Maximum age per group in days",
230
+ required=True,
231
+ min_value=1,
232
+ ),
233
+ ],
234
+ tags=["datetime", "recent", "group"],
235
+ severity_default="high",
236
+ ),
237
+ ValidatorDefinition(
238
+ name="DatetimeParseable",
239
+ display_name="Datetime Parseable",
240
+ category=ValidatorCategory.DATETIME,
241
+ description="Validates that strings can be parsed as dates using dateutil.",
242
+ parameters=[
243
+ ParameterDefinition(
244
+ name="column",
245
+ label="Column",
246
+ type=ParameterType.COLUMN,
247
+ required=True,
248
+ ),
249
+ ],
250
+ tags=["datetime", "parseable", "format"],
251
+ severity_default="medium",
252
+ ),
253
+ ]