| """CLI interface for address conversion.""" |
|
|
| import csv |
| import sys |
|
|
| import click |
|
|
| from .converter import convert_address, batch_convert |
|
|
|
|
| @click.group() |
| def main(): |
| """Vietnamese address converter (post-merger 01/07/2025).""" |
| pass |
|
|
|
|
| @main.command() |
| @click.argument("address") |
| def convert(address): |
| """Convert a single address. |
| |
| Example: address-convert convert "Phường Phúc Xá, Quận Ba Đình, Thành phố Hà Nội" |
| """ |
| result = convert_address(address) |
| click.echo(f"Input: {result.original}") |
| click.echo(f"Output: {result.converted}") |
| click.echo(f"Status: {result.status.value}") |
| if result.mapping_type: |
| click.echo(f"Type: {result.mapping_type.value}") |
| if result.note: |
| click.echo(f"Note: {result.note}") |
|
|
|
|
| @main.command() |
| @click.argument("input_file", type=click.Path(exists=True)) |
| @click.argument("output_file", type=click.Path()) |
| @click.option("--column", "-c", default="address", help="Column name containing addresses") |
| def batch(input_file, output_file, column): |
| """Convert addresses from a CSV file. |
| |
| Reads INPUT_FILE CSV, converts the address column, writes to OUTPUT_FILE. |
| """ |
| with open(input_file, newline="", encoding="utf-8") as f: |
| reader = csv.DictReader(f) |
| if column not in reader.fieldnames: |
| click.echo(f"Error: Column '{column}' not found. Available: {reader.fieldnames}", err=True) |
| sys.exit(1) |
|
|
| addresses = [] |
| rows = [] |
| for row in reader: |
| rows.append(row) |
| addresses.append(row[column]) |
|
|
| results = batch_convert(addresses) |
|
|
| fieldnames = list(rows[0].keys()) + ["converted_address", "conversion_status", "mapping_type"] |
| with open(output_file, "w", newline="", encoding="utf-8") as f: |
| writer = csv.DictWriter(f, fieldnames=fieldnames) |
| writer.writeheader() |
| for row, result in zip(rows, results): |
| row["converted_address"] = result.converted |
| row["conversion_status"] = result.status.value |
| row["mapping_type"] = result.mapping_type.value if result.mapping_type else "" |
| writer.writerow(row) |
|
|
| |
| total = len(results) |
| success = sum(1 for r in results if r.status.value == "success") |
| partial = sum(1 for r in results if r.status.value == "partial") |
| not_found = sum(1 for r in results if r.status.value == "not_found") |
| click.echo(f"Converted {total} addresses: {success} success, {partial} partial, {not_found} not found") |
| click.echo(f"Output: {output_file}") |
|
|