address / src /cli.py
rain1024's picture
Add Vietnamese address converter for post-merger admin units (01/07/2025)
efd7cfc
"""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)
# Summary
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}")