Pull Requests
Las Pull Requests (PR) son fundamentales en nuestro flujo de trabajo colaborativo, ya que permiten revisar, discutir y mejorar los cambios antes de integrarlos en el proyecto principal. Esta guía explica en detalle cómo crear, gestionar y revisar Pull Requests de manera efectiva.
Proceso de envío
Cuándo crear una Pull Request
Debes crear una Pull Request en los siguientes casos:
- Implementación de nueva funcionalidad: Cuando has completado una nueva característica.
- Corrección de errores: Tras solucionar un bug reportado.
- Mejoras de documentación: Para cambios significativos en la documentación.
- Refactorización de código: Al realizar mejoras estructurales que no modifican la funcionalidad.
- Actualizaciones de dependencias: Para actualizaciones importantes de dependencias.
Para cambios muy pequeños como correcciones tipográficas o ajustes menores, puedes considerar enviar estos directamente a la rama principal si tienes los permisos adecuados.
Preparación antes del envío
Antes de enviar tu PR, asegúrate de:
Sincronizar con la rama principal:
bashgit fetch upstream git rebase upstream/main
Ejecutar todas las verificaciones locales:
bashnpm run lint # Verificación de lint npm run test # Ejecución de pruebas npm run build # Compilación del proyecto
Revisar tus cambios:
bashgit diff main
Comprobar la estructura de los commits: Asegúrate de que tus commits son limpios, siguen las convenciones y pueden aplicarse de forma limpia.
Creación de la Pull Request
Para crear tu Pull Request:
Haz push de tu rama a tu fork:
bashgit push origin nombre-de-tu-rama
Navega a tu fork en GitHub y verás un mensaje sugiriendo crear una PR desde tu rama recién enviada.
Haz clic en "Compare & pull request".
Completa la plantilla provista con todos los detalles necesarios.
Asigna revisores si conoces a quienes deberían revisar tu código.
Añade etiquetas apropiadas para categorizar tu PR.
Haz clic en "Create pull request".
Plantillas de PR
Las plantillas de PR ayudan a estandarizar la información que proporcionan los contribuyentes. Nuestra plantilla por defecto incluye:
# Pull Request
## Descripción
<!-- Descripción breve de los cambios realizados. -->
---
## Lista de verificación
### Código y funcionalidad
- [ ] ✔️ He probado la nueva funcionalidad y funciona como se esperaba.
- [ ] 🧹 He limpiado el código y eliminado comentarios o logs innecesarios.
- [ ] 🧪 He añadido pruebas para cubrir mis cambios.
### Documentación
- [ ] 📘 He actualizado el README.
- [ ] ✍️ He actualizado la documentación correspondiente.
- [ ] 📚 He actualizado los ejemplos en la documentación.
- [ ] 🌐 He actualizado el sitio web del proyecto.
Personalización de la plantilla
Si necesitas personalizar la plantilla para diferentes tipos de contribuciones, puedes crear múltiples plantillas:
Crea un directorio
.github/PULL_REQUEST_TEMPLATE/
en tu repositorio.Añade archivos markdown para cada tipo de plantilla:
bugfix.md
feature.md
documentation.md
Al crear una PR, especifica la plantilla en la URL:
https://github.com/usuario/repo/compare/main...rama?template=feature.md
Elementos de una buena descripción de PR
Una descripción de PR efectiva debe incluir:
- Resumen conciso: Una explicación clara de qué cambia y por qué.
- Contexto: Referencia a issues relacionados (#123) o discusiones previas.
- Cambios principales: Lista de los cambios más importantes.
- Capturas de pantalla/GIFs: Para cambios visuales o de UI (si aplica).
- Notas de implementación: Decisiones técnicas importantes o enfoques considerados.
- Áreas de preocupación: Partes donde aprecias especialmente la revisión.
Ejemplo de una buena descripción:
## Validación mejorada de entradas de formulario
Esta PR implementa una validación más robusta para las entradas de formulario,
resolviendo el issue #45 sobre validación insuficiente de emails.
### Cambios principales
- Agrega validadores de expresiones regulares configurables
- Implementa validación en tiempo real con feedback visual
- Añade soporte para mensajes de error personalizados
- Mejora la accesibilidad de los mensajes de error
### Implementación
Opté por un enfoque basado en composición en lugar de herencia para permitir
mayor flexibilidad en la combinación de validadores. La validación se realiza
mediante una cadena de responsabilidad para mantener el código limpio y extensible.
### Capturas de pantalla

### Áreas para revisar
La implementación de expresiones regulares en `src/validators/regex.ts` podría
beneficiarse de optimización adicional.
Revisión de código
El proceso de revisión de código es una parte crítica del desarrollo colaborativo que mejora la calidad del código y facilita el aprendizaje entre colaboradores.
Proceso de revisión
Después de enviar tu PR, el proceso típicamente sigue estos pasos:
Verificaciones automáticas: Se ejecutan CI/CD pipelines para verificar que tu código pasa pruebas, linting y otras verificaciones.
Revisión inicial: Un mantenedor o colaborador hará una primera revisión.
Solicitud de cambios: Es normal que se soliciten ajustes en tu primera presentación.
Iteración: Implementa los cambios solicitados, haz commit y push a la misma rama.
Re-revisión: Los revisores verificarán tus cambios actualizados.
Aprobación: Cuando los revisores estén satisfechos, aprobarán la PR.
Fusión: Un mantenedor fusionará la PR en la rama principal.
Cómo responder al feedback
Al recibir comentarios en tu PR:
Responde a todos los comentarios: Incluso con un simple "Hecho" o "Gracias".
Explica tus decisiones: Si no estás de acuerdo con un cambio sugerido, explica tu razonamiento respetuosamente.
Marca como resueltos los comentarios que hayas abordado.
Notifica cuando estés listo para otra revisión: Comenta en la PR cuando hayas abordado todos los comentarios.
Sé paciente: Los revisores tienen sus propias responsabilidades y pueden tardar en responder.
Para revisores: Cómo proporcionar feedback efectivo
Si estás revisando PRs, sigue estas pautas:
Sé específico: Señala exactamente qué cambiar y por qué.
Sé constructivo: Ofrece soluciones, no solo críticas.
Explica el razonamiento: No solo digas qué cambiar, sino también por qué.
Prioriza los problemas: Distingue entre bloqueantes (must-fix) y mejoras opcionales (nice-to-have).
Reconoce lo positivo: Destaca también aspectos bien implementados.
Usa un tono respetuoso: Céntrate en el código, no en la persona.
Ofrece ejemplos: Proporciona snippets de código cuando sea útil.
Haz preguntas: Si algo no está claro, pregunta en lugar de asumir.
Ejemplo de feedback efectivo:
### Rendimiento en `src/validator.ts`
El uso de `Array.forEach` dentro de un bucle anidado podría causar problemas de rendimiento con conjuntos de datos grandes. Considera usar `for...of` que tiene mejor rendimiento:
```typescript
// En lugar de
items.forEach(item => {
item.properties.forEach(prop => {
// procesamiento
});
});
// Considera
for (const item of items) {
for (const prop of item.properties) {
// procesamiento
}
}
Esto reduciría la sobrecarga de las funciones de callback y mejoraría el rendimiento con grandes conjuntos de datos.
## Gestión de conflictos
Los conflictos ocurren cuando diferentes ramas modifican la misma parte de un archivo. Aquí explicamos cómo manejarlos:
### Prevención de conflictos
Para minimizar los conflictos:
1. **Mantén tus PRs enfocadas y pequeñas**: Menos código = menos posibilidades de conflicto.
2. **Actualiza tu rama regularmente**: Sincroniza con la rama principal para incorporar otros cambios:
```bash
git fetch upstream
git rebase upstream/main
- Comunícate con otros colaboradores: Si sabes que alguien está trabajando en un área similar, coordínate.
Resolución de conflictos
Si encuentras conflictos:
Identifica los conflictos:
bashgit fetch upstream git rebase upstream/main
Git mostrará los archivos con conflictos.
Resuelve cada archivo conflictivo:
- Abre los archivos marcados como conflictivos.
- Busca secciones marcadas con
<<<<<<<
,=======
, y>>>>>>>
. - Edita el archivo para resolver el conflicto, eliminando los marcadores.
Marca como resuelto:
bashgit add archivo-con-conflicto.ts
Continúa el rebase:
bashgit rebase --continue
Fuerza el push si es necesario:
bashgit push --force-with-lease origin tu-rama
Nota:
--force-with-lease
es más seguro que--force
ya que fallará si hay cambios remotos que no has incorporado.
Ejemplo de resolución de conflicto
Supongamos que tienes este conflicto:
<<<<<<< HEAD (Rama actual, main)
export function validateEmail(email: string): boolean {
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
}
=======
export function validateEmail(email: string): boolean {
if (!email) return false;
return /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/.test(email);
}
>>>>>>> feature/better-validation (Tu rama)
Para resolverlo, decides combinar ambos enfoques:
export function validateEmail(email: string): boolean {
if (!email) return false;
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
}
Guarda el archivo, añádelo con git add
y continúa el rebase.
Ciclo de vida de un PR
Estados de un PR
Una Pull Request puede pasar por varios estados:
- Draft (Borrador): Indica que el trabajo está en progreso y no listo para revisión.
- Open (Abierto): Listo para revisión y fusión.
- Needs Work (Necesita trabajo): Cuando los revisores solicitan cambios.
- Approved (Aprobado): Cuando los revisores han aprobado los cambios.
- Merged (Fusionado): Cuando la PR ha sido integrada en la rama principal.
- Closed (Cerrado): Cuando la PR ha sido cerrada sin fusionar.
Convertir un PR a Draft
Si necesitas más tiempo para trabajar:
- En la página de la PR, haz clic en el menú desplegable junto a "Ready for review".
- Selecciona "Convert to draft" para indicar que aún no está listo.
Preparar un Draft PR para revisión
Cuando tu PR borrador está listo:
- En la página de la PR, haz clic en "Ready for review".
- Esto notificará a los mantenedores que tu PR está listo para ser revisado.
Cierre de PRs
Hay varias razones para cerrar una PR sin fusionarla:
- Duplicada: Otro PR ya implementa la misma funcionalidad.
- Obsoleta: La funcionalidad ya no es relevante o ha sido superada.
- Abandonada: El autor no ha respondido a los comentarios durante un tiempo prolongado.
- No alineada: La PR no se alinea con la dirección del proyecto.
Si tu PR es cerrada, no lo tomes como algo personal. Pregunta por los motivos específicos si no están claros y considera si puedes abordarlos en una nueva PR.
Buenas prácticas para PRs efectivas
Tamaño y alcance
- Mantén las PRs pequeñas: Idealmente menos de 500 líneas de cambios.
- Un propósito, una PR: Cada PR debe abordar un solo problema o mejora.
- Divide cambios grandes: Si tu cambio es extenso, divídelo en PRs más pequeñas y secuenciales.
Commits
- Historia de commits limpia: Utiliza
git rebase -i
para organizar, combinar o editar commits. - Mensajes de commit significativos: Cada mensaje debe explicar claramente qué hace el cambio.
- Referencia a issues: Incluye referencias a issues (ej:
Fix #123
) cuando sea relevante.
Título y descripción
- Título descriptivo: Debe resumir claramente el propósito de la PR.
- Descripción completa: Proporciona todos los detalles necesarios para entender tu cambio.
- Documentación de decisiones: Explica por qué elegiste una implementación particular.
Revisiones y comentarios
- Respuesta rápida: Responde a los comentarios de forma oportuna.
- Apertura al feedback: Mantente abierto a sugerencias y críticas constructivas.
- Agradece a los revisores: Reconoce el tiempo y esfuerzo dedicado a revisar tu código.
Automatización y CI/CD
Nuestro proyecto utiliza varios sistemas automatizados para mejorar el proceso de PR:
Verificaciones automáticas
Cada PR desencadena estas verificaciones automáticas:
- Linting: Verifica que el código siga las reglas de estilo.
- Tests: Ejecuta la suite de pruebas para asegurar que nada se rompe.
- Typecheck: Verifica los tipos de TypeScript.
- Build: Asegura que el proyecto compila correctamente.
Herramientas de colaboración
Aprovecha estas herramientas para facilitar la colaboración:
- Codespaces o Gitpod: Para entornos de desarrollo consistentes.
- Pull Request Preview: Para visualizar cambios en documentación o componentes visuales.
- Code Climate o SonarCloud: Para análisis de calidad de código.
Resolución de problemas con CI
Si las verificaciones de CI fallan:
- Lee los logs: Examina los logs de error para identificar el problema.
- Reproduce localmente: Intenta reproducir el error en tu máquina.
- Busca problemas conocidos: Verifica si es un problema conocido en las issues del proyecto.
- Pide ayuda: Si no puedes resolver el problema, pide ayuda en la PR.
Conclusión
Las Pull Requests son una herramienta poderosa para la colaboración en el desarrollo de software. Siguiendo estas guías, puedes crear PRs efectivas que sean fáciles de revisar y contribuyan positivamente al proyecto.
Recuerda que el proceso de revisión de código no solo es para encontrar problemas, sino también para compartir conocimiento, aprender nuevas técnicas y mejorar como equipo.
Si tienes sugerencias para mejorar este proceso, no dudes en contribuir a esta documentación con tus propias PRs.