Desarrollo¶
Prepara el proyecto como se describe en Desarrollo local y después:
Flujo de trabajo¶
- Crea una rama a partir de
main. - Haz el cambio, con pruebas.
make check: lint, tipos y pruebas, exactamente lo que la CI ejecuta primero.- Si cambiaste a propósito lo que devuelve un endpoint, ejecuta
make snapshotsy revisagit diff tests/snapshots(consulta Pruebas). - Añade una entrada en Unreleased de
CHANGELOG.mdpara los cambios visibles para los usuarios. - Abre una pull request. La CI ejecuta lint, mypy, las pruebas en Python 3.13 y 3.14, construye la imagen y la somete a una prueba de humo contra t.me real.
Estilo de código¶
- Formato y lint: ruff (longitud de línea 100, un conjunto amplio de reglas
que incluye bugbear, pyupgrade, bandit y pydocstyle con la convención de
Google).
make formatcorrige la mayoría de los hallazgos. - Tipos: mypy --strict sobre
srcytests, con el plugin de Pydantic. Las funciones públicas están completamente anotadas;Anyse reserva para JSON sin procesar. - Docstrings: en cada módulo, clase y función públicos, con el estilo de Google.
- Capas:
api→services→cache→telegram; nada por debajo deapiimporta FastAPI. import-linter comprueba ambas cosas ([tool.importlinter]enpyproject.toml). Conecta los nuevos objetos de larga duración encontainer.py. - Rust: nada de
unwrap()en código de producción (unexpect("...")enuncia el invariante), y ensrc/parse/nada de indexación ni cortes que puedan entrar en pánico: usaget,split_once,strip_prefix. La extensión aborta ante un pánico, lo que tumba el worker. Consulta Comprobaciones estáticas para cada herramienta. - Errores: lanza los errores de dominio de
telegram/errors.py; la API los traduce a códigos de estado en un único lugar (api/errors.py). - Mantén estable el contrato de
/v1. Los campos nuevos están bien; eliminar o renombrar campos, o cambiar sus tipos, requiere una nueva versión de la API.
Dependencias¶
Las dependencias se declaran en pyproject.toml y se fijan en uv.lock:
uv add <package> # runtime dependency
uv add --dev <package> # development tool
uv lock --upgrade # refresh everything to the newest versions
Dependabot abre actualizaciones semanales agrupadas para los paquetes de Python, las GitHub Actions y las imágenes base de Docker, para versiones con al menos una semana (las actualizaciones de seguridad llegan enseguida).
Pre-commit¶
make install instala hooks de git que se ejecutan en cada commit: ruff (con
corrección automática), ruff format, mypy, import-linter, vulture, typos,
zizmor, gitleaks sobre los cambios preparados, cargo fmt y clippy y, cuando
cambian sus archivos, hadolint, cargo-deny y cargo-machete. Las herramientas
de Python vienen de uv.lock; make tools instala las demás. Ejecútalos
cuando quieras con uv run pre-commit run --all-files.
Documentación¶
El sitio se escribe en inglés en docs/, con traducciones al español y al
ruso en docs/es/ y docs/ru/ que replican su estructura de archivos. Cada
idioma es una compilación independiente: zensical.toml compila el inglés en
site/, y zensical.es.toml / zensical.ru.toml compilan las traducciones
en site/es/ y site/ru/. El selector de idioma de la cabecera mantiene al
lector en la misma página y sección (overrides/main.html).
make docs-serve # live preview of English on :8001
make docs-serve DOCS_LANG=ru # live preview of the Russian pages
make docs-preview # build all languages and serve site/ with the switcher
Cuando cambies una página, actualiza sus traducciones en la misma pull request
o abre un issue para ellas. Los encabezados traducidos conservan el ancla en
inglés con un id explícito (## Ejemplo { #example }), de modo que los enlaces
y el selector llegan a la misma sección en todos los idiomas. El código, los
comandos, los nombres de los ajustes y las claves JSON no se traducen.
tests/unit/test_docs_config.py comprueba que cada página tenga su traducción
y que los tres archivos de configuración sigan sincronizados.