Práctica focalizada · Bloque 3 · Unidad 3.1
EX-B3-01
Extraer el primer router sin cambiar el contrato
Una aplicación de expedientes ya tiene tests y tres operaciones públicas, pero main.py mezcla arranque, schemas, estado y rutas.
Cómo abordarla
Separa responsabilidades conservando el contrato
Ejecuta primero el baseline. Después modifica la frontera indicada, escribe una regresión positiva y otra negativa y conserva la salida real.
Evidencia objetivo: El diff mueve código, pero status, body, modelos de salida, operationId y paths públicos permanecen estables.
Abrir laboratorio de código
1. Descarga y arranca
- Starter ejecutable del refactorAplicación monolítica, tests de contrato y script de fingerprint OpenAPI.
- Mapa de refactor y contratoMonolito reducido, tests existentes y lienzo para predecir paths e imports.
2. Escribe y prueba
- Ejecuta los tests y registra las operaciones generadas por app.openapi().
- Completa el mapa de prefijos y el grafo de imports antes de mover código.
- Extrae schemas y un APIRouter de expedientes; conserva main.py como punto de composición.
- Ejecuta la misma regresión y explica cualquier diferencia antes de corregirla.
3. Demuestra el comportamiento
- Árbol final y grafo de imports dirigido.
- Diff acotado del refactor.
- Evidencia de pytest y fingerprint OpenAPI antes y después.
La respuesta principal es tu código y sus pruebas. Usa este espacio solo para anotar la predicción inicial y el resultado observado.
Predicción breve antes de ejecutar
¿Qué paths deben quedar en decoradores y prefijos para que el contrato final no cambie, y qué import debe apuntar hacia el punto de composición?
Frontera que debes preservar
Contrato inicial: GET /health, POST /records y GET /records/{record_id}. El include no aporta prefijo adicional.Comprueba estas tres cosas
- ¿Qué conjunto método/path existe antes de mover código?
- ¿Qué suma de prefijos produce cada URL final?
- ¿Qué import crearía una vuelta hacia main.py?
Anota predicción, comando ejecutado y diferencia observada; el código vive en tu workspace.
Sin respuesta guardada.
Pistas opcionales
Pista 1 · Conserva la suma
- Si el router tiene prefix=/expedientes, el decorador de colección puede usar una cadena vacía.
- El prefijo de include también participa aunque no esté en el archivo del router.
Pista 2 · Corta la vuelta
- El módulo de rutas exporta router; main.py lo importa e incluye.
- Un módulo inferior no necesita importar main.py para registrarse.
Profundización opcional
Extraer las operaciones de expedientes a APIRouter mediante un corte pequeño y demostrar compatibilidad HTTP y OpenAPI.
Contexto adicional
- No añadas endpoints, capas ni modelos durante el refactor.
- Conserva nombres públicos, status, bodies, response_model y operationId.
- Haz pasar la regresión después de extraer un solo router.
Decisiones abiertas
- Puedes usar imports absolutos o relativos, pero debes mantener una convención y explicar la dirección.
- Puedes dejar /health en main.py o justificar un router operacional; no crees ese router solo por simetría.
Cómo revisar tu respuesta
- Los tres pares método/path permanecen iguales.
- Status, body y response_model pasan la regresión existente.
- El router no importa la instancia app ni existe registro por efecto lateral.
- La explicación identifica una decisión que deliberadamente quedó fuera.
Evidencia, revisión y reinicio
- Predicción de rutas finales y grafo de imports antes del cambio.
- Salida de pytest y conjunto método/path de OpenAPI antes y después.
- Diff que mueve un grupo de operaciones sin añadir funcionalidad.
Revisión: con Codex, utilizando la evidencia y los criterios anteriores; no se publica una solución oficial.
Reinicio: Restaurar el módulo monolítico descargado y borrar los paquetes creados; no existe estado externo.