| """Deterministic repairer for decimal-shift issues.""" |
|
|
| from __future__ import annotations |
|
|
| from dataforge.detectors.base import Issue, Schema |
| from dataforge.repairers.base import ProposedFix, RetryContext |
| from dataforge.table import TableLike, cell_value, column_names, row_count |
| from dataforge.transactions.txn import CellFix |
|
|
|
|
| class DecimalShiftRepairer: |
| """Repair decimal-shift issues using the detector's expected value.""" |
|
|
| def propose( |
| self, |
| issue: Issue, |
| df: TableLike, |
| schema: Schema | None, |
| retry_context: RetryContext | None = None, |
| ) -> ProposedFix | None: |
| """Return a deterministic fix for a decimal-shift issue.""" |
| del schema, retry_context |
| if issue.issue_type != "decimal_shift" or issue.expected is None: |
| return None |
| if issue.row >= row_count(df) or issue.column not in column_names(df): |
| return None |
|
|
| old_value = cell_value(df, issue.row, issue.column) |
| if old_value == issue.expected: |
| return None |
|
|
| return ProposedFix( |
| fix=CellFix( |
| row=issue.row, |
| column=issue.column, |
| old_value=old_value, |
| new_value=issue.expected, |
| detector_id="decimal_shift", |
| ), |
| reason=issue.reason, |
| confidence=issue.confidence, |
| provenance="deterministic", |
| ) |
|
|