Consolida una línea de comandos profesional en Python: implementa un método de lectura en el service, usa csv.DictReader para convertir registros en objetos tipo diccionario y muestra la salida con click.echo para un comportamiento consistente en cualquier sistema operativo. Aquí verás cómo pasar de imprimir cadenas sueltas a una interfaz limpia y estable.
¿Cómo implementar el método list_clients en el service?
Para obtener los clientes desde la “tabla” (archivo), se abre el recurso en modo lectura, se crea un DictReader con los nombres de campo del esquema del cliente y se convierte el reader (iterable) a una lista. Así, el service devuelve una colección lista para iterar en la consola. La idea clave: el reader es iterable y la función global list() lo materializa en memoria.
import csv
CLIENT_SCHEMA = ["uid", "name", "company", "email", "position"] # del client schema
class ClientService:
def __init__(self, table_path):
self._table_path = table_path # referencia a la "tabla"
def list_clients(self): # no recibe argumentos externos
with open(self._table_path, mode="r") as f: # abrir en lectura
reader = csv.DictReader(f, fieldnames=CLIENT_SCHEMA)
return list(reader) # convertir iterable a lista
¿Qué modos de apertura usar y por qué?
- r: lectura. Abre el archivo existente para leer datos.
- a: append. Agrega al final sin borrar contenido.
- w: write. Escribe desde cero, sobreescribe el archivo.
¿Cómo mostrar la lista en la consola con Click?
El comando list no requiere argumentos ni opciones adicionales. Se inicializa el service con el contexto y el nombre de la tabla, se obtiene la lista de clientes y se imprimen headers y filas. Se reemplaza print por click.echo porque print varía entre sistemas y click.echo garantiza salida consistente.
import click
@click.command(name="list")
@click.pass_context
def list_command(ctx):
# inicializar el service con contexto y nombre de la tabla
service = ClientService(table_path=ctx.obj["table_name"])
clients_list = service.list_clients()
# headers y separador
click.echo("ID name company email position")
click.echo("-" * 60)
# formateo de salida por fila
for client in clients_list:
line = "{uid} {name} {company} {email} {position}".format(
uid=client["uid"],
name=client["name"],
company=client["company"],
email=client["email"],
position=client["position"],
)
click.echo(line)
¿Cómo formatear la salida de cada registro?
- Construye un string con
{} y .format(...) para cada campo.
- Usa claves del diccionario:
uid, name, company, email, position.
- Controla espacios para columnas legibles.
¿Cómo validar el flujo completo desde la CLI?
La verificación es directa: invoca el grupo de comandos, llama list, crea otro cliente y vuelve a listar para confirmar que se agregan registros.
- Ejecutar el grupo:
pvi clients. Muestra los comandos disponibles.
- Listar existentes:
pvi clients list. Debe aparecer el primer cliente.
- Crear otro con create: nombre “Tom”, compañía “Tom Inc.”, correo “tom arroba tom”, posición “CEO”.
- Limpiar pantalla y listar de nuevo:
pvi clients list. Ahora aparecen dos clientes.
Este avance muestra cómo separar lógica de negocio (clases y services) de la interfaz de consola con Click. Es un hito: se pasa de concatenar cadenas a una estructura robusta, cercana a estándares de producción.
¿Te gustaría añadir filtros, paginación o un ancho fijo por columna? Comparte tus ideas y retos en los comentarios.