diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..6df8e27 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,66 @@ +name: Build and Validate + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build-and-validate: + name: Build and Validate Documentation + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + + - name: Run pre-commit checks + uses: pre-commit/action@v3.0.0 + + - name: Build with MkDocs + run: mkdocs build + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Check for broken links + run: | + # Iniciar servidor HTTP en background + cd site && python -m http.server 8000 & + sleep 10 + + # Ejecutar check de links desde el directorio raíz + cd ${{ github.workspace }} + python scripts/check_links.py + + # Verificar resultado + broken_count=$(jq '.summary.broken_links' broken_links.json) + + if [ "$broken_count" -gt 0 ]; then + echo "❌ Found $broken_count broken links - failing!" + pkill -f "python -m http.server" || true + exit 1 + fi + + echo "✅ All links working!" + pkill -f "python -m http.server" || true + + # Solo para main: guardar el sitio construido + - name: Upload build artifact + if: github.ref == 'refs/heads/main' + uses: actions/upload-artifact@v4 + with: + name: site + path: site/ + retention-days: 1 diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml new file mode 100644 index 0000000..f451ac2 --- /dev/null +++ b/.github/workflows/ci-cd.yml @@ -0,0 +1,30 @@ +name: CI/CD Pipeline + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +permissions: + contents: read + pages: write + id-token: write + +jobs: + build-and-validate: + name: Build and Validate + runs-on: ubuntu-latest + steps: + # ... todos los pasos de validación y build ... + + deploy: + name: Deploy to GitHub Pages + if: github.ref == 'refs/heads/main' + needs: build-and-validate + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + # ... pasos de deploy ... diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index d7e0b45..5ae138b 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,9 +1,10 @@ name: Deploy to GitHub Pages on: - push: - branches: [ main ] - pull_request: + workflow_run: + workflows: ["Build and Validate"] + types: + - completed branches: [ main ] permissions: @@ -16,45 +17,30 @@ concurrency: cancel-in-progress: false jobs: - build: + deploy: + name: Deploy to GitHub Pages + if: github.event.workflow_run.conclusion == 'success' runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Set up Python - uses: actions/setup-python@v4 + - name: Download build artifact + uses: actions/download-artifact@v4 with: - python-version: '3.10' - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install -r requirements.txt - - - name: Build with MkDocs - run: mkdocs build - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + name: site + path: site/ + github-token: ${{ secrets.GITHUB_TOKEN }} + run-id: ${{ github.event.workflow_run.id }} - name: Setup Pages uses: actions/configure-pages@v4 - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 + - name: Upload to GitHub Pages + uses: actions/upload-pages-artifact@v4 with: - path: './site' + path: site/ - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - needs: build - if: github.ref == 'refs/heads/main' - steps: - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 diff --git a/.markdownlint.json b/.markdownlint.json index f7067f2..4774585 100644 --- a/.markdownlint.json +++ b/.markdownlint.json @@ -1,7 +1,21 @@ { + "MD001": true, + "MD003": { "style": "atx" }, + "MD004": { "style": "dash" }, + "MD007": { "indent": 2 }, + "MD010": { "spaces_per_tab": 2 }, + "MD012": false, + "MD013": { "line_length": 120 }, + "MD022": false, + "MD025": true, + "MD026": { "punctuation": ".,;:!?" }, + "MD029": { "style": "ordered" }, + "MD030": { "ul_single": 1, "ul_multi": 1, "ol_single": 1, "ol_multi": 1 }, + "MD031": false, + "MD032": false, "MD033": false, + "MD034": false, + "MD036": false, "MD041": false, - "MD013": false, - "MD025": false, - "MD026": false + "MD051": false } diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..fb608ce --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,28 @@ +repos: + # Hooks básicos + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + exclude: ^mkdocs\.yml$ # Excluir mkdocs.yml + - id: check-json + - id: check-added-large-files + - id: check-merge-conflict + # - id: requirements-txt-fixer # Comentado si no lo quieres + + # Validación de Markdown - MENOS ESTRICTO para empezar + - repo: https://github.com/igorshubovych/markdownlint-cli + rev: v0.39.0 + hooks: + - id: markdownlint + args: ['--config', '.markdownlint.json', '--disable', 'MD012', 'MD022', 'MD032'] + files: ^docs/.*\.md$ + + # Formateo de Python (opcional, pero útil para scripts) + - repo: https://github.com/psf/black + rev: 23.12.1 + hooks: + - id: black + files: ^scripts/.*\.py$ diff --git a/broken_links.json b/broken_links.json index 014f3e7..bf87eb7 100644 --- a/broken_links.json +++ b/broken_links.json @@ -719,4 +719,4 @@ "link_type": "html" } ] -} \ No newline at end of file +} diff --git a/docs/comunidad/alianzas.md b/docs/comunidad/alianzas.md index f533469..a8fa4eb 100644 --- a/docs/comunidad/alianzas.md +++ b/docs/comunidad/alianzas.md @@ -203,4 +203,3 @@ Python CDMX trabaja en colaboración con diversas comunidades y empresas para cr --8<-- "components/quick-navigation.md" --- - diff --git a/docs/meetups/2023/202309-septiembre.md b/docs/meetups/2023/202309-septiembre.md index d81a856..c96b13f 100644 --- a/docs/meetups/2023/202309-septiembre.md +++ b/docs/meetups/2023/202309-septiembre.md @@ -53,7 +53,7 @@ title: "Utilizando Servicios AI de AWS y Metaprogramación en Python"
SRE Engineer
SRE Engineer en Wizeline con experiencia en servicios cloud de AWS y desarrollo Python.
Python Developer
Desarrollador Python con experiencia en análisis de datos y desarrollo web.
¿Tienes esa gran idea, pero no sabes cómo organizar tu ambiente virtual, tu código y todas las herramientas de desarrollo?
En esta charla exploraremos las mejores prácticas para configurar un entorno de desarrollo Python profesional:
Python permite transformar análisis de datos locales en servicios web interactivos de manera rápida y eficiente. diff --git a/docs/meetups/2023/202311-noviembre.md b/docs/meetups/2023/202311-noviembre.md index ceb9c89..5cb329d 100644 --- a/docs/meetups/2023/202311-noviembre.md +++ b/docs/meetups/2023/202311-noviembre.md @@ -53,34 +53,34 @@ title: "GitOps 101 / Python: La Forja de un Lenguaje"
DevOps Engineer
Especialista en GitOps y Kubernetes con experiencia en despliegue de aplicaciones cloud native.
En esta charla se mostrará los conceptos de GitOps y Cloud Native que nos permitirán conocer las estrategias de despliegue en Kubernetes.
- +Metodología de despliegue
Orquestación de contenedores
Aplicaciones nativas en la nube
GitOps proporciona una metodología robusta para el despliegue y gestión de aplicaciones en Kubernetes.
Python Developer
Desarrollador Python con experiencia en compiladores y construcción de lenguajes de programación.
Explora la construcción de un lenguaje con Python, desde los pilares teóricos hasta un sorprendente guiño a la sintaxis financiera.
- +Compiladores
Diseño de lenguajes
Análisis sintáctico
Construir un lenguaje de programación es una excelente manera de entender los fundamentos de la computación.
SRE Engineer
SRE Engineer en Wizeline con experiencia en gestión de ambientes y desarrollo Python.
¿Tienes esa gran idea, pero no sabes cómo organizar tu ambiente virtual, tu código y todas las herramientas de desarrollo?
En esta charla exploraremos las mejores prácticas para configurar un entorno de desarrollo Python profesional:
Los ambientes virtuales son fundamentales para el desarrollo Python profesional y la gestión de dependencias. @@ -97,4 +97,3 @@ title: "Ambientes virtuales con venv, pyenv y poetry" --8<-- "components/quick-navigation.md" --- - diff --git a/docs/meetups/2024/202402-febrero.md b/docs/meetups/2024/202402-febrero.md index 510ed9d..c9ef89a 100644 --- a/docs/meetups/2024/202402-febrero.md +++ b/docs/meetups/2024/202402-febrero.md @@ -47,9 +47,9 @@ title: "Del Código al Clic: Transforma Ideas en Interfaces"
Python Developer
Desarrollador Python con experiencia en interfaces gráficas y desarrollo de aplicaciones de escritorio.
¿Tienes esa gran idea, pero no sabes cómo organizar tu ambiente virtual, tu código y todas las herramientas de desarrollo?
En esta charla exploraremos las mejores prácticas para configurar un entorno de desarrollo Python profesional:
Python ofrece múltiples opciones para crear interfaces gráficas modernas y atractivas. diff --git a/docs/meetups/2024/202403-marzo.md b/docs/meetups/2024/202403-marzo.md index 35f162a..06c30dd 100644 --- a/docs/meetups/2024/202403-marzo.md +++ b/docs/meetups/2024/202403-marzo.md @@ -47,9 +47,9 @@ title: "Desarrollo de API REST con Flask"
Python Developer
Desarrollador Python con experiencia en desarrollo de APIs y frameworks web.
¿Tienes esa gran idea, pero no sabes cómo organizar tu ambiente virtual, tu código y todas las herramientas de desarrollo?
En esta charla exploraremos las mejores prácticas para configurar un entorno de desarrollo Python profesional:
Flask proporciona una base sólida y elegante para desarrollar APIs REST eficientes. diff --git a/docs/meetups/2024/202404-abril.md b/docs/meetups/2024/202404-abril.md index ce73e54..919f5a7 100644 --- a/docs/meetups/2024/202404-abril.md +++ b/docs/meetups/2024/202404-abril.md @@ -47,9 +47,9 @@ title: "Desarrollo en Python usando Contenedores"
SRE Engineer
SRE Engineer en Wizeline con experiencia en contenedores y desarrollo Python.
¿Tienes esa gran idea, pero no sabes cómo organizar tu ambiente virtual, tu código y todas las herramientas de desarrollo?
En esta charla exploraremos las mejores prácticas para configurar un entorno de desarrollo Python profesional:
Los contenedores ofrecen una alternativa moderna y eficiente a los ambientes virtuales tradicionales. diff --git a/docs/meetups/2024/202405-mayo.md b/docs/meetups/2024/202405-mayo.md index 5ad8f11..b638d7c 100644 --- a/docs/meetups/2024/202405-mayo.md +++ b/docs/meetups/2024/202405-mayo.md @@ -47,9 +47,9 @@ title: "Pydantic: Validaciones de datos con Type Hints"
Python Developer
Desarrollador Python con experiencia en validación de datos y mejores prácticas de desarrollo.
¿Tienes esa gran idea, pero no sabes cómo organizar tu ambiente virtual, tu código y todas las herramientas de desarrollo?
En esta charla exploraremos las mejores prácticas para configurar un entorno de desarrollo Python profesional:
Pydantic es una herramienta esencial para la validación de datos en aplicaciones Python modernas. diff --git a/docs/meetups/2024/202406-junio.md b/docs/meetups/2024/202406-junio.md index a314dd3..8043bcd 100644 --- a/docs/meetups/2024/202406-junio.md +++ b/docs/meetups/2024/202406-junio.md @@ -47,9 +47,9 @@ title: "Matemáticas y Python: Ciencia Detrás de la Regresión Lineal"
Data Scientist
Especialista en análisis de datos y machine learning con experiencia en implementación de algoritmos estadísticos.
¿Tienes esa gran idea, pero no sabes cómo organizar tu ambiente virtual, tu código y todas las herramientas de desarrollo?
En esta charla exploraremos las mejores prácticas para configurar un entorno de desarrollo Python profesional:
La regresión lineal es la base fundamental para entender algoritmos de machine learning más complejos. diff --git a/docs/meetups/2024/202407-julio.md b/docs/meetups/2024/202407-julio.md index 5026138..e775d8a 100644 --- a/docs/meetups/2024/202407-julio.md +++ b/docs/meetups/2024/202407-julio.md @@ -53,34 +53,34 @@ title: "¡Doble Charla! Python sin GIL / Esquemas ETL"
Python Core Developer
Desarrollador del core de Python con experiencia en optimización y concurrencia.
La charla se enfocará en explorar el Global Interpreter Lock (GIL) en Python impide la ejecución simultánea de múltiples hilos, limitando el rendimiento en sistemas multicore. Exploraremos su funcionamiento actual, los problemas que causa y las soluciones futuras propuestas por Python. ¡Nuestra primer charla en Inglés!
- +Global Interpreter Lock
Concurrencia
Rendimiento
La eliminación del GIL representa un cambio fundamental en el futuro de Python para aplicaciones concurrentes.
Data Engineer
Especialista en ingeniería de datos y procesamiento ETL con Python.
Ideal para profesionales y aficionados que buscan profundizar en técnicas avanzadas, herramientas y mejores prácticas en el manejo y análisis de datos con Python. Esta charla posee un repositorio abierto con un ejemplo base que va dirigido a todo público.
- +Extract, Transform, Load
Procesamiento de datos
Datos masivos
Los esquemas ETL son fundamentales para el procesamiento y análisis de datos a gran escala.
Python Developer
Desarrollador Python con experiencia en tipado estático y mejores prácticas de desarrollo.
Descubre cómo los Protocolos en Python pueden transformar tu código, haciéndolo más flexible y robusto. Explora desde conceptos básicos hasta aplicaciones avanzadas en esta plática única.
- +Tipado estático
Anotaciones de tipo
Tipado estático
Los Protocolos en Python ofrecen una forma poderosa de implementar tipado estático avanzado.
Open Source Contributor
Contribuidor activo al ecosistema de Ruby con más de 10 años de experiencia en open source.
En una era donde todo mundo buscamos la satisfacción y los resultados inmediatos, compartiré mi camino de 10 años en el ecosistema de Ruby en el que me he convertido de usuario del lenguaje a contribuidor frecuente en una empresa con más de 1,000 millones de descargas de bibliotecas de Ruby. Los días son largos, pero los años son cortos y, si 10 años no son suficientes para convertirte en contribuidor de Open Source, siempre puedes tomar un año más y repetir el proceso.
- +Software libre
Lenguaje de programación
Comunidad
Contribuir al open source es un viaje de largo plazo que requiere paciencia y dedicación.
MLOps Engineer
Diego Barriga, Ingeniero en computación por la UNAM, trabajo con NLP y lenguas indígenas mexicanas. Es parte de Laboratorio de Investigación y Desarrollo de Software Libre, Comunidad Elotl y actualmente desempeña un puesto como MLOps en Mercado Libre. Promotor de la cultura libre, la privacidad, neovim y de andar en bicicleta sin frenos :)
¿Te has preguntado que estudia la fonética? ¿Que significan los simbolitos del International Phonetic Alphabet (IPA)? Y más importante; ¿Cómo manipular estos tipos de datos para crear aplicaciones con python? En esta charla desarrollaremos aplicaciones simples usando datasets con texto en representación fonética y aplicando conceptos sobre fonética en un nivel introductorio. Ahora si que, pasa la voz 🗣️. Objetivo: Los asistentes entenderán los principios básicos de fonología y que es un alfabeto fonético, Obtención y manipulación de datasets disponibles en GitHub https://github.com/open-dict-data/ipa-dict, Aplicar estos datos para resolver tareas específicas.
- +Procesamiento de lenguaje
Alfabeto fonético
Fonética
La fonética y el procesamiento de lenguaje natural abren nuevas posibilidades para aplicaciones Python.
SRE Engineer
David Sol también estudió en la UNAM, así como sus padres, tíos, hermano, primos, hijos e incluso su conejo (historia real). Le gustan los juegos de Rol de tablero, las películas, los comics y los libros. Actualmente labora como SRE en Wizeline, y cree que el cómputo de nube es genial, así como Python.
Python nos ayuda a hacer excelentes aplicaciones que se ejecutan en la consola. Y además estas pueden ser atractivas visualmente, y tener interfaces de usuario de primer nivel. Vamos a hablar de dos librerías que te ayudan a ello, Rich y Textual. https://github.com/Textualize/rich https://textual.textualize.io
- +Librería de consola
Framework TUI
Aplicaciones de consola
Rich y Textual permiten crear aplicaciones de consola modernas y atractivas con Python.
Services Content Architect
Alex Callejas es Services Content Architect de Red Hat, con base en la Ciudad de México y colaborador de diferentes comunidades OpenSource en Latinoamérica (como SysArmyMx o Fedora México). Con más de 20 años de experiencia como Sysadmin, tiene gran experiencia en hardening de infraestructura y automatización. Entusiasta del código abierto, apoya a la comunidad compartiendo sus conocimientos en diferentes eventos de acceso público y universidades. Autor del libro Fedora Linux Administration de la editorial Packt.
¿Tienes esa gran idea, pero no sabes cómo organizar tu ambiente virtual, tu código y todas las herramientas de desarrollo?
En esta charla exploraremos las mejores prácticas para configurar un entorno de desarrollo Python profesional:
Contribuir al open source es una excelente manera de crecer profesionalmente y dar de vuelta a la comunidad. @@ -97,4 +97,3 @@ title: "Una ida y una vuelta: Cómo iniciar en el opensource" --8<-- "components/quick-navigation.md" --- - diff --git a/docs/meetups/2024/202411-noviembre.md b/docs/meetups/2024/202411-noviembre.md index b4aa74a..384306b 100644 --- a/docs/meetups/2024/202411-noviembre.md +++ b/docs/meetups/2024/202411-noviembre.md @@ -53,34 +53,34 @@ title: "Evita Anti-patrones en Python / ¿Qué y por qué ChatGPT?"
Python Developer
Desarrollador Python con experiencia en buenas prácticas y código limpio.
Descubre cómo escribir código Python más limpio y eficiente evitando los anti-patrones más comunes. Mejora tus habilidades y aprende a hacerlo de forma 'pythonic'.
- +Lenguaje principal
Buenas prácticas
Calidad de código
Evitar anti-patrones es fundamental para escribir código Python mantenible y eficiente.
AI Researcher
Investigador en inteligencia artificial con experiencia en modelos de lenguaje y aplicaciones de IA.
ChatGPT es una herramienta poderosa diseñada para mejorar la interacción humano-máquina en tareas cotidianas, creativas y técnicas, gracias a su capacidad para comprender y generar lenguaje natural. La combinación de la arquitectura Transformer, el preentrenamiento masivo y el ajuste fino lo convierte en una opción versátil y accesible para múltiples usos. Además, su continua evolución a través del feedback y la investigación lo posiciona como una de las IA más avanzadas en la actualidad. La pregunta más importante es por qué, en esta charla gracias a Python entenderemos más sobre ChatGPT.
- +Modelo de lenguaje
Arquitectura neural
Procesamiento de lenguaje
Comprender el funcionamiento interno de ChatGPT es clave para aprovechar su potencial en aplicaciones Python.
AI Engineer
Especialista en desarrollo de agentes de IA y machine learning con experiencia en LangGraph y LLMs.
Introducción práctica al desarrollo de agentes de IA usando Python, enfocada en implementaciones con LangGraph y herramientas open source. Los participantes aprenderán conceptos fundamentales de LLMs y cómo crear agentes inteligentes que puedan realizar tareas autónomas.
- +Framework para agentes
Large Language Models
API de IA
Los agentes de IA representan el futuro del desarrollo de aplicaciones inteligentes y autónomas.
SRE Engineer
David Sol creció en el siglo XX, y en su infancia sus padres le dejaban salir a la calle, sin supervisión, a jugar con quién encontrara y a lo que pudiera, con la única condición de que regresara para dormir. Una bicicleta bastaba para recorrer toda su colonia, sin importar carros, perros o baches. Tomaba agua de mangueras de vecinos, y comía lo que encontrara en sus aventuras. Sufrió cortadas, quemaduras, moretones y un hueso roto, los cuales trató a base de tierra fresca, agua y un par de curitas. Tuvo una infancia feliz. Actualmente labora como SRE en Wizeline.
¿Ya te cansaste de la consola? ¿Quieres hacer una aplicación con interfaz gráfica fuera del navegador, cómo en los buenos tiempos? Sí, lo puedes hacer con Python, con facilidad, elegancia y desempeño. PySide6 es la librería oficial para utilizar QT desde Python. Sí, utiliza Python. Sí, es fácil de aprender y utilizar. Sí, corre en Linux, MacOS e incluso en Windows. ¡Ven a conocerla!
- +Qt para Python
Framework GUI
Aplicaciones de escritorio
PySide6 permite crear aplicaciones de escritorio profesionales con Python de manera sencilla y eficiente.
DevOps Engineer
Especialista en Kubernetes y MLOps con experiencia en despliegue de aplicaciones de IA.
¿Tienes esa gran idea, pero no sabes cómo organizar tu ambiente virtual, tu código y todas las herramientas de desarrollo?
En esta charla exploraremos las mejores prácticas para configurar un entorno de desarrollo Python profesional:
Kubernetes proporciona una plataforma robusta para desplegar y gestionar aplicaciones de IA a escala. diff --git a/docs/meetups/2025/202504-unam.md b/docs/meetups/2025/202504-unam.md index 8f57745..75e418d 100644 --- a/docs/meetups/2025/202504-unam.md +++ b/docs/meetups/2025/202504-unam.md @@ -53,34 +53,34 @@ title: "¡Extra! Sudo Ciencias en la UNAM"
Desarrollador Web
Especialista en desarrollo web y creación de portafolios profesionales.
Si no presentamos nuestro trabajo, ¿Cómo van a saber lo buenos que somos? Ven a aprender como hacer tu portafolio en línea.
- +Lenguaje principal
Desarrollo web
Portafolio personal
Aprende a crear un portafolio web profesional usando Python sin necesidad de conocimientos avanzados de diseño.
Desarrollador y Educador
Experto en nuevas tecnologías y tendencias de programación.
¿Es verdad que con la AI todo va a cambiar? ¿Qué es eso del vibe coding? Esta charla será muy importante para tu futuro.
- +Inteligencia Artificial
Nuevas tendencias
Tecnologías futuras
Explora las nuevas tendencias en programación y cómo la IA está transformando el desarrollo de software.
Ingeniero en Sistemas Computacionales
Ingeniero en Sistemas Computacionales con Maestría en Ciencias de la Computación. A lo largo de su carrera ha ido desde el desarrollo de software como consultor al liderazgo de equipos de tecnología. Lleva 15 años desarrollando en Python. Actualmente es líder de Performance y DevOps en el sector microfinanciero. Le encanta compartir conocimiento y todo lo que involucre conocer, hacer y compartir Software libre.
¿Tienes esa gran idea, pero no sabes cómo organizar tu ambiente virtual, tu código y todas las herramientas de desarrollo?
En esta charla exploraremos las mejores prácticas para configurar un entorno de desarrollo Python profesional:
Aprende las mejores prácticas para compartir tu código Python con la comunidad a través de PyPI. @@ -96,4 +96,4 @@ title: "Publicando un paquete en PyPI" --8<-- "components/quick-navigation.md" ---- \ No newline at end of file +--- diff --git a/docs/meetups/2025/202506-junio.md b/docs/meetups/2025/202506-junio.md index 4d36621..26d76e8 100644 --- a/docs/meetups/2025/202506-junio.md +++ b/docs/meetups/2025/202506-junio.md @@ -47,11 +47,11 @@ title: "Usando Python y software libre"
Ingeniero en Ciencias Informáticas
Ingeniero de Software en Aurora Solar. Entusiasta del desarrollo de tecnología, con particular interés en la Inteligencia Artificial y las tecnologías de código abierto. Disfruta de la exploración de temas técnicos y la participación activa en comunidades.
@@ -65,7 +65,7 @@ title: "Usando Python y software libre"¿Tienes esa gran idea, pero no sabes cómo organizar tu ambiente virtual, tu código y todas las herramientas de desarrollo?
En esta charla exploraremos las mejores prácticas para configurar un entorno de desarrollo Python profesional:
Se destaca cómo Python permite orquestar estas herramientas de forma sencilla y potente, ejemplificando el potencial del ecosistema FLOSS para impulsar la innovación. diff --git a/docs/meetups/2025/202507-julio.md b/docs/meetups/2025/202507-julio.md index 97d0284..32c001c 100644 --- a/docs/meetups/2025/202507-julio.md +++ b/docs/meetups/2025/202507-julio.md @@ -47,9 +47,9 @@ title: "Cómo preparar una ambiente de desarrollo con Python desde zero"
SRE Engineer
SRE Engineer en Wizeline con experiencia en contenedores y desarrollo Python.
¿Tienes esa gran idea, pero no sabes cómo organizar tu ambiente virtual, tu código y todas las herramientas de desarrollo?
En esta charla exploraremos las mejores prácticas para configurar un entorno de desarrollo Python profesional:
Nota: Basado en la página "Modern Good Practices for Python Development" de Stuart Ellis. Igual hay que preguntarle si se anima a darla él. diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000..3bb3d24 --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,12 @@ + +# Herramientas de desarrollo (opcional) +black>=23.0.0 + +# Herramientas opcionales de desarrollo +flake8>=6.0.0 +# Pre-commit para validaciones locales +pre-commit>=3.6.0 +pytest>=7.0.0 + +# Dependencias para validación de links +requests>=2.25.0 diff --git a/scripts/check_links.py b/scripts/check_links.py index 288c04d..e74ae22 100644 --- a/scripts/check_links.py +++ b/scripts/check_links.py @@ -5,6 +5,7 @@ import json import re +import sys from pathlib import Path from urllib.parse import urljoin @@ -191,6 +192,17 @@ def main(): print(f" Status: {link['status']}") print() + # Return number of broken links + return len(broken_links) + if __name__ == "__main__": - main() + broken_count = main() + + # Exit with error if there are broken links + if broken_count > 0: + print(f"\n💥 Script failing due to {broken_count} broken links!") + sys.exit(1) + else: + print("\n✅ Script completed successfully - all links working!") + sys.exit(0) diff --git a/scripts/generate_meetups.py b/scripts/generate_meetups.py index 62787f7..0503555 100644 --- a/scripts/generate_meetups.py +++ b/scripts/generate_meetups.py @@ -40,14 +40,11 @@ def create_meetup_file(json_file): "event_location": data["event_location"], "event_rsvp_link": data.get("event_rsvp_link", "#"), "event_banner_image": data.get( - "event_banner_image", - "/assets/images/default-banner.jpg" + "event_banner_image", "/assets/images/default-banner.jpg" ), "event_month_year": data.get("event_month_year", ""), "tags": data["tags"], - "last_update": data.get( - "last_update", "Generado automáticamente" - ), + "last_update": data.get("last_update", "Generado automáticamente"), } # Agregar datos específicos según el tipo de template