Estructura de archivos para CLI con Click

Clase 39 de 49Curso Práctico de Python: Creación de un CRUD

Resumen

Crear un CLI en Python con Click es más claro y mantenible cuando organizas bien tu proyecto, defines comandos con decoradores y configuras setup.py para instalar un ejecutable. Aquí tienes el esqueleto base: estructura de archivos, comandos create/list/update/delete y un flujo de instalación editable en un virtualenv.

¿Cómo organizar la estructura de archivos en Python para un CLI con Click?

Diseñar con múltiples archivos hace el código más legible y escalable. Un subdirectorio funciona como módulo en Python y agrupa responsabilidades específicas.

  • Un directorio raíz para el proyecto.
  • Un archivo de entrada: PV.py como punto de entrada del CLI.
  • Un módulo clients/ con comandos en commands.py.
  • Un setup.py para instalar el ejecutable del CLI.

Estructura sugerida:

PlatziVentas/
├─ PV.py
├─ setup.py
└─ clients/
   └─ commands.py

Claves prácticas: - Subdirectorios como módulos: agrupan funciones relacionadas. - Responsabilidad única por archivo: hace el mantenimiento más simple.

¿Qué comandos y decoradores definen el CLI de clientes?

Los decoradores de Click convierten funciones en comandos. Se usa @click.group() para declarar un grupo y @clients.command() para registrar subcomandos. Con @click.pass_context se recibe un contexto mutable; aquí se inicializa como diccionario literal vacío.

¿Cómo inicializar el contexto con click pass context?

En tu punto de entrada se importa Click, se define un group y se inicializa el objeto contexto:

# PV.py
import click

@click.group()
@click.pass_context
def CLI(ctx):
    # inicializar el contexto como diccionario literal vacío
    ctx.obj = {}

# registrar el grupo de clientes desde el módulo clients.commands
from clients import commands as clients_commands
CLI.add_command(clients_commands.all)

Puntos clave: - ctx.obj = {}: contexto listo para compartir datos entre comandos. - Legibilidad: se importa clients.commands como alias y se registra con add_command.

¿Cómo convertir funciones en comandos del grupo clients?

Define el grupo clients y sus comandos básicos. Los docstrings alimentan la ayuda de Click, es decir: la interfaz basada en texto del CLI.

# clients/commands.py
import click

@click.group()
def clients():
    """Manages the client's life cycle."""
    pass  # placeholder para evitar error

@clients.command()
@click.pass_context
def create(ctx, name, company, email, position):
    """Create a new client."""
    pass

@clients.command("list")  # evitar colisión con palabra reservada list
@click.pass_context
def list_cmd(ctx):
    """List all clients."""
    pass

@clients.command()
@click.pass_context
def update(ctx, uid):
    """Updates a client."""
    pass

@clients.command()
@click.pass_context
def delete(ctx, uid):
    """Delete a client."""
    pass

# alias para registrar todo el grupo desde PV.py
all = clients

Detalles importantes: - Decoradores: @clients.command() marca cada función como comando. - Docstrings como ayuda: Click los muestra en --help. - Convención de espacios: dos líneas en blanco entre funciones de nivel módulo. - Alias all: simplifica el registro del grupo completo.

¿Cómo instalar y ejecutar el comando con setup.py y un virtualenv?

La instalación convierte tu CLI en un ejecutable del sistema: sin invocar directamente al intérprete de Python. Se declara el nombre del comando, la versión y el entry point hacia CLI dentro de PV.py.

Ejemplo mínimo de setup.py:

# setup.py
from setuptools import setup

setup(
    name='PV',            # nombre del comando instalado
    version='0.1',        # versión semántica
    py_modules=['PV'],    # módulo de entrada
    install_requires=[
        'click',          # dependencia principal
    ],
    entry_points={
        'console_scripts': [
            'PV=PV:CLI',  # comando=modulo:funcion_de_entrada
        ],
    },
)

Instalar en modo editable dentro de un virtualenv permite ver cambios al instante:

# crear y activar el ambiente virtual
virtualenv -p python3 venv
source venv/bin/activate

# instalar en modo editable
pip install --editable .

# verificar e inspeccionar la ayuda
which PV
PV --help
PV clients --help

Qué observarás al usar --help: - Uso y opciones del comando raíz. - El grupo clients con su descripción: "Manages the client's life cycle". - Subcomandos disponibles: create, list, update, delete.

¿Te gustaría extender estos comandos con opciones y validar entradas? Deja tus dudas o ideas para explorar el siguiente paso juntos.