refactor: fix review issues — reuse entity_to_row, public parse_row, validate dates

- scan.py: use entity_to_row from csv_utils instead of duplicated _fmt
- csv_utils: rename _parse_row to parse_row (public API)
- backup.py: use public parse_row
- cli.py: validate --start < --end in backup command

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-04-21 16:06:51 +08:00
parent 57c985ee3e
commit a36bfcc0f0
4 changed files with 11 additions and 15 deletions

View File

@@ -3,7 +3,7 @@ from collections import defaultdict
from datetime import datetime
from pathlib import Path
from order_bak.csv_utils import CSV_COLUMNS, _parse_row
from order_bak.csv_utils import CSV_COLUMNS, parse_row
def backup_orders(
@@ -19,7 +19,7 @@ def backup_orders(
with open(scan_path, newline="") as f:
reader = csv.DictReader(f)
for raw_row in reader:
entity = _parse_row(raw_row)
entity = parse_row(raw_row)
if entity["state"] != 1:
continue
order_time = entity["OrderTime"]

View File

@@ -49,6 +49,10 @@ def backup(ctx, start, end, scan_path):
start_utc = start.replace(tzinfo=timezone.utc)
end_utc = end.replace(tzinfo=timezone.utc)
if start_utc >= end_utc:
click.echo("Error: --start must be before --end")
raise SystemExit(1)
backup_orders(
scan_path=scan_file,
backup_dir=Path("./backups"),

View File

@@ -32,7 +32,7 @@ def entity_to_row(entity: dict[str, Any]) -> dict[str, str]:
return {col: _format_value(entity.get(col)) for col in CSV_COLUMNS}
def _parse_row(raw: dict[str, str]) -> dict[str, Any]:
def parse_row(raw: dict[str, str]) -> dict[str, Any]:
result: dict[str, Any] = {}
for col in CSV_COLUMNS:
val = raw.get(col, "")
@@ -51,7 +51,7 @@ def _parse_row(raw: dict[str, str]) -> dict[str, Any]:
def row_to_entity(raw: dict[str, str]) -> dict[str, Any]:
return _parse_row(raw)
return parse_row(raw)
def write_csv(path: Path, entities: list[dict[str, Any]]) -> None:
@@ -67,4 +67,4 @@ def read_csv(path: Path):
with open(path, newline="") as f:
reader = csv.DictReader(f)
for row in reader:
yield _parse_row(row)
yield parse_row(row)

View File

@@ -5,7 +5,7 @@ from pathlib import Path
from azure.data.tables import TableClient
from order_bak.csv_utils import CSV_COLUMNS
from order_bak.csv_utils import CSV_COLUMNS, entity_to_row
def scan_orders(
@@ -30,7 +30,7 @@ def scan_orders(
for page in paged.by_page():
for entity in page:
writer.writerow({col: _fmt(entity.get(col)) for col in CSV_COLUMNS})
writer.writerow(entity_to_row(entity))
total_scanned += 1
if delay_ms > 0:
@@ -38,11 +38,3 @@ def scan_orders(
print(f"Scan complete: {total_scanned} orders saved to {csv_path}")
return csv_path
def _fmt(val):
if val is None:
return ""
if isinstance(val, datetime):
return val.isoformat()
return str(val)