Diseña un flujo sólido para crear clientes desde la línea de comando con Click en Python: define opciones con prompt, valida entradas, inicializa el modelo, persiste en CSV y corrige errores comunes sin perder tiempo. Aquí verás el patrón de interfaz con short name y long name, el uso de contexto y un cierre funcional con escritura en archivo.
¿Cómo definir opciones en Click para un comando create?
Configurar opciones en Click permite pedir datos al usuario de forma guiada. Se usa un short name y un long name para la opción principal, se define el tipo string, se activa prompt true para solicitar la entrada en consola y se añade una línea de ayuda clara.
- Opción principal con alias: -n/--name.
- Tipo de dato: string.
- Solicitud interactiva: prompt True.
- Ayuda contextual: "the client's name".
- Repetición del patrón para: company, email, position.
Ejemplo mínimo en código con el patrón descrito:
import click
@click.command()
@click.option('-n', '--name', type=str, prompt=True, help="The client's name.")
@click.option('--company', type=str, prompt=True, help="The client's company.")
@click.option('--email', type=str, prompt=True, help="The client's email.")
@click.option('--position', type=str, prompt=True, help="The client's position.")
@click.pass_context
def create(ctx, name, company, email, position):
pass
¿Qué patrón de interfaz se aplica con short name y long name?
- Alias breve para velocidad: -n.
- Nombre largo legible: --name.
- Consistencia al replicar el patrón en cada campo.
- Ayuda clara para cada opción.
¿Cómo inicializar el cliente y usar el servicio?
Tras recolectar parámetros, se importan solo las clases necesarias mediante importación selectiva: ClientService desde clients.services y Client desde clients.models. Luego se inicializa el modelo con nombre, compañía, email y posición. El ID se deja vacío para que el sistema lo genere automáticamente. Finalmente, el servicio persiste la entidad con create_client.
- Importaciones específicas:
from clients.services import ClientService y from clients.models import Client.
- Inicialización del modelo: name, company, email, position.
- ID autogenerado: no se pasa manualmente.
- Uso del servicio: create_client con la referencia del cliente.
Snippet representativo:
from clients.services import ClientService
from clients.models import Client
@click.pass_context
def create(ctx, name, company, email, position):
client = Client(name=name, company=company, email=email, position=position)
service = ClientService(ctx.obj['clients_table'])
service.create_client(client)
¿Cómo configurar el contexto con clients_table en pv.py?
Para persistir datos se define una variable global con el nombre del archivo y se agrega al contexto de la app, de modo que los comandos la consuman sin acoplamiento.
- Archivo de almacenamiento: .clients.csv.
- Variable global: clients_table.
- Integración al contexto: uso de
ctx.obj.
Ejemplo esquemático:
# pv.py
CLIENTS_TABLE = '.clients.csv'
# En la inicialización del CLI
def cli(ctx):
ctx.ensure_object(dict)
ctx.obj['clients_table'] = CLIENTS_TABLE
¿Cómo depurar errores comunes al ejecutar el comando?
Al probar con pv clients create se detectaron fallos típicos: import mal escrito y typo en atributos. La solución fue ajustar el nombre correcto del modelo y corregir el campo de posición para que coincida en todo el código.
- Importación incorrecta: usar
from clients.models import Client en lugar de un nombre inexistente.
- Archivo involucrado: clients/commands.py.
- Atributo mal escrito:
positon corregido a position en clients/models.
- Verificación rápida: limpiar consola, ejecutar de nuevo y revisar salida.
¿Cómo validar el archivo clients.csv generado?
Tras la ejecución, se inspecciona .clients.csv y se confirma que los datos están separados por comas. Esto permitirá manipularlos con DictReader más adelante.
- Apertura del archivo y lectura manual.
- Confirmación de formato: valores separados por comas.
- Preparación para lectura con dict reader en próximos pasos.
¿Te gustaría comentar qué otros campos u opciones agregarías al comando y cómo validarías entradas como el email desde la línea de comando?