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.

diff --git a/docs/meetups/2023/202310-octubre.md b/docs/meetups/2023/202310-octubre.md index 0fccf60..249ebf0 100644 --- a/docs/meetups/2023/202310-octubre.md +++ b/docs/meetups/2023/202310-octubre.md @@ -47,9 +47,9 @@ title: "¡De Jupyter a Web en Minutos!"

Python Developer

Desarrollador Python con experiencia en análisis de datos y desarrollo web.

@@ -63,7 +63,7 @@ title: "¡De Jupyter a Web en Minutos!"

¿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.

- +
- +
🔄 GitOps

Metodología de despliegue

- +
☸️ Kubernetes

Orquestación de contenedores

- +
☁️ Cloud Native

Aplicaciones nativas en la nube

- +
- +

GitOps proporciona una metodología robusta para el despliegue y gestión de aplicaciones en Kubernetes.

@@ -99,34 +99,34 @@ title: "GitOps 101 / Python: La Forja de un Lenguaje"

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.

- +
- +
⚙️ Compilers

Compiladores

- +
🔧 Language Design

Diseño de lenguajes

- +
📝 Parsing

Análisis sintáctico

- +
- +

Construir un lenguaje de programación es una excelente manera de entender los fundamentos de la computación.

diff --git a/docs/meetups/2024/202401-enero.md b/docs/meetups/2024/202401-enero.md index 65056d1..a98bf6e 100644 --- a/docs/meetups/2024/202401-enero.md +++ b/docs/meetups/2024/202401-enero.md @@ -47,9 +47,9 @@ title: "Ambientes virtuales con venv, pyenv y poetry"

SRE Engineer

SRE Engineer en Wizeline con experiencia en gestión de ambientes y desarrollo Python.

@@ -63,7 +63,7 @@ title: "Ambientes virtuales con venv, pyenv y poetry"

¿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.

@@ -63,7 +63,7 @@ title: "Del Código al Clic: Transforma Ideas en Interfaces"

¿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.

@@ -63,7 +63,7 @@ title: "Desarrollo de API REST con Flask"

¿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.

@@ -63,7 +63,7 @@ title: "Desarrollo en Python usando Contenedores"

¿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.

@@ -63,7 +63,7 @@ title: "Pydantic: Validaciones de datos con Type Hints"

¿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.

@@ -63,7 +63,7 @@ title: "Matemáticas y Python: Ciencia Detrás de la Regresión Lineal"

¿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!

- +
- +
GIL

Global Interpreter Lock

- +
Concurrency

Concurrencia

- +
Performance

Rendimiento

- +
- +

La eliminación del GIL representa un cambio fundamental en el futuro de Python para aplicaciones concurrentes.

@@ -99,34 +99,34 @@ title: "¡Doble Charla! Python sin GIL / Esquemas ETL"

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.

- +
- +
ETL

Extract, Transform, Load

- +
Data Processing

Procesamiento de datos

- +
Big Data

Datos masivos

- +
- +

Los esquemas ETL son fundamentales para el procesamiento y análisis de datos a gran escala.

diff --git a/docs/meetups/2024/202408-agosto.md b/docs/meetups/2024/202408-agosto.md index c4311a9..e2b7224 100644 --- a/docs/meetups/2024/202408-agosto.md +++ b/docs/meetups/2024/202408-agosto.md @@ -53,34 +53,34 @@ title: "Protocolos en Python / Convertirse en Contribuidor Open Source"

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.

- +
- +
Protocols

Tipado estático

- +
Type Hints

Anotaciones de tipo

- +
Static Typing

Tipado estático

- +
- +

Los Protocolos en Python ofrecen una forma poderosa de implementar tipado estático avanzado.

@@ -99,34 +99,34 @@ title: "Protocolos en Python / Convertirse en Contribuidor Open Source"

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.

- +
- +
Open Source

Software libre

- +
Ruby

Lenguaje de programación

- +
Community

Comunidad

- +
- +

Contribuir al open source es un viaje de largo plazo que requiere paciencia y dedicación.

@@ -159,4 +159,3 @@ title: "Protocolos en Python / Convertirse en Contribuidor Open Source" --8<-- "components/quick-navigation.md" --- - diff --git a/docs/meetups/2024/202409-septiembre.md b/docs/meetups/2024/202409-septiembre.md index df17ebf..8c284b5 100644 --- a/docs/meetups/2024/202409-septiembre.md +++ b/docs/meetups/2024/202409-septiembre.md @@ -53,34 +53,34 @@ title: "Representaciones Fonéticas / Rich & Textual"

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.

- +
- +
NLP

Procesamiento de lenguaje

- +
IPA

Alfabeto fonético

- +
Phonetics

Fonética

- +
- +

La fonética y el procesamiento de lenguaje natural abren nuevas posibilidades para aplicaciones Python.

@@ -99,34 +99,34 @@ title: "Representaciones Fonéticas / Rich & Textual"

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

- +
- +
Rich

Librería de consola

- +
Textual

Framework TUI

- +
Console Apps

Aplicaciones de consola

- +
- +

Rich y Textual permiten crear aplicaciones de consola modernas y atractivas con Python.

@@ -159,4 +159,3 @@ title: "Representaciones Fonéticas / Rich & Textual" --8<-- "components/quick-navigation.md" --- - diff --git a/docs/meetups/2024/202410-octubre.md b/docs/meetups/2024/202410-octubre.md index 6be920c..54c526d 100644 --- a/docs/meetups/2024/202410-octubre.md +++ b/docs/meetups/2024/202410-octubre.md @@ -47,9 +47,9 @@ title: "Una ida y una vuelta: Cómo iniciar en el opensource"

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.

@@ -63,7 +63,7 @@ title: "Una ida y una vuelta: Cómo iniciar en el opensource"

¿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'.

- +
- +
Python

Lenguaje principal

- +
Best Practices

Buenas prácticas

- +
Code Quality

Calidad de código

- +
- +

Evitar anti-patrones es fundamental para escribir código Python mantenible y eficiente.

@@ -99,34 +99,34 @@ title: "Evita Anti-patrones en Python / ¿Qué y por qué ChatGPT?"

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.

- +
- +
ChatGPT

Modelo de lenguaje

- +
Transformer

Arquitectura neural

- +
NLP

Procesamiento de lenguaje

- +
- +

Comprender el funcionamiento interno de ChatGPT es clave para aprovechar su potencial en aplicaciones Python.

@@ -159,4 +159,3 @@ title: "Evita Anti-patrones en Python / ¿Qué y por qué ChatGPT?" --8<-- "components/quick-navigation.md" --- - diff --git a/docs/meetups/2025/202501-enero.md b/docs/meetups/2025/202501-enero.md index f61f65d..451eca6 100644 --- a/docs/meetups/2025/202501-enero.md +++ b/docs/meetups/2025/202501-enero.md @@ -158,4 +158,3 @@ title: "Crea extensiones para LibreOffice / PCI DSS en Python" --8<-- "components/quick-navigation.md" --- - diff --git a/docs/meetups/2025/202503-marzo.md b/docs/meetups/2025/202503-marzo.md index 54757de..1a8386c 100644 --- a/docs/meetups/2025/202503-marzo.md +++ b/docs/meetups/2025/202503-marzo.md @@ -53,34 +53,34 @@ title: "Agentes de IA / PySide6"

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.

- +
- +
LangGraph

Framework para agentes

- +
LLMs

Large Language Models

- +
OpenAI

API de IA

- +
- +

Los agentes de IA representan el futuro del desarrollo de aplicaciones inteligentes y autónomas.

@@ -99,34 +99,34 @@ title: "Agentes de IA / PySide6"

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!

- +
- +
PySide6

Qt para Python

- +
Qt

Framework GUI

- +
Desktop Apps

Aplicaciones de escritorio

- +
- +

PySide6 permite crear aplicaciones de escritorio profesionales con Python de manera sencilla y eficiente.

diff --git a/docs/meetups/2025/202504-abril.md b/docs/meetups/2025/202504-abril.md index 8d98ce0..609b77f 100644 --- a/docs/meetups/2025/202504-abril.md +++ b/docs/meetups/2025/202504-abril.md @@ -47,9 +47,9 @@ title: "Kubernetes y IA"

DevOps Engineer

Especialista en Kubernetes y MLOps con experiencia en despliegue de aplicaciones de IA.

@@ -63,7 +63,7 @@ title: "Kubernetes y 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.

- +
- +
🐍 Python

Lenguaje principal

- +
🌐 Web Development

Desarrollo web

- +
📄 Portfolio

Portafolio personal

- +
- +

Aprende a crear un portafolio web profesional usando Python sin necesidad de conocimientos avanzados de diseño.

@@ -99,34 +99,34 @@ title: "¡Extra! Sudo Ciencias en la UNAM"

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.

- +
- +
🤖 AI

Inteligencia Artificial

- +
⚡ Vibe-Coding

Nuevas tendencias

- +
🚀 Future Tech

Tecnologías futuras

- +
- +

Explora las nuevas tendencias en programación y cómo la IA está transformando el desarrollo de software.

diff --git a/docs/meetups/2025/202505-mayo.md b/docs/meetups/2025/202505-mayo.md index 1b1317a..6bd07d1 100644 --- a/docs/meetups/2025/202505-mayo.md +++ b/docs/meetups/2025/202505-mayo.md @@ -47,9 +47,9 @@ title: "Publicando un paquete en PyPI"

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.

@@ -63,7 +63,7 @@ title: "Publicando un paquete en PyPI"

¿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.

@@ -63,21 +63,21 @@ title: "Cómo preparar una ambiente de desarrollo con Python desde zero"

¿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