Un lenguaje de programación en español para simulaciones y más.
Project description
Proyecto Cobra
Qué es pCobra
Versión 10.0.13
- La caché incremental de AST y tokens se consolidó en SQLitePlus con script de migración y variables
SQLITE_DB_KEY/COBRA_DB_PATHpara definir la base de datos. corelibs.asincronoincorporagrupo_tareasyreintentar_async, reexportados en la biblioteca estándar para coordinar corrutinas y reintentos con backoff.corelibs.texto,corelibs.numeroystandard_library.datosañaden validadoreses_*, helpers comoprefijo_comun/sufijo_comun, funcionesinterpolar/envolver_modulary lectura/escritura de Parquet y Feather.corelibs.sistema.ejecutarmantiene la ejecución en modo seguro con listas blancas obligatorias tanto en Python como en los bindings nativos.
English version available here
Cobra como interfaz única
Cobra consolida su experiencia de uso en una única interfaz pública: la CLI cobra. Todas las tareas de ejecución, build, pruebas y módulos se coordinan desde este frente común.
Comandos oficiales (visibles y estables)
cobra run archivo.cobra
cobra build archivo.cobra
cobra test archivo.cobra
cobra mod list
cobra repl
Contrato público: el lenguaje visible es Cobra y los comandos oficiales son
run,build,test,modyrepl(flujo interactivo oficial).
Contrato de backends internos oficiales
La superficie oficial mantiene exactamente 3 backends internos:
pythonjavascriptrust
La selección de backend la realiza internamente el pipeline y no es un parámetro de configuración para usuario final.
Qué es interno y no público
No forman parte del contrato público:
- Transpiladores legacy (
go,cpp,java,wasm,asm). - Compat shims y rutas de compatibilidad histórica.
- Comandos y flujos de CLI v1 fuera del set
run/build/test/mod.
Tabla de decisión de backend interno (no configurable por usuario final)
| Contexto técnico detectado por el pipeline | Backend interno preferente | Override permitido |
|---|---|---|
| Ejecución estándar y paridad máxima de librerías | python |
Solo hints internos controlados por Core |
| Integración runtime web/bridge JS | javascript |
Solo hints internos controlados por Core |
| Integración nativa/FFI y ABI contractual | rust |
Solo hints internos controlados por Core |
pCobra es un lenguaje de programación escrito en español y pensado para la creación de herramientas, simulaciones y análisis en disciplinas como biología, computación y astrofísica.
Resumen normativo visible (generado desde la política canónica):
- Backends oficiales de salida: 3 targets canónicos.
- Targets oficiales de transpilación:
python,javascript,rust. - Targets con runtime oficial verificable (full SDK solo en python):
python,javascript,rust. - Targets con verificación ejecutable explícita en CLI:
python,javascript,rust. - Targets con runtime best-effort: .
- Targets con soporte oficial mantenido de
corelibs/standard_library(partial fuera de python):python,javascript,rust. - Targets con adaptador Holobit mantenido por el proyecto (partial fuera de python):
python,javascript,rust. - Compatibilidad SDK completa (solo python):
python. - Targets solo de transpilación: .
- Orígenes de transpilación inversa: python, javascript, java (java se mantiene como entrada histórica, no salida oficial). Este alcance reverse de entrada está separado de los 3 targets oficiales de salida.
Tiers oficiales de soporte de backends:
- Tier 1:
python,javascript,rust. - Tier 2: .
Fuentes normativas: src/pcobra/cobra/config/transpile_targets.py para la lista canónica y los tiers, y src/pcobra/cobra/cli/target_policies.py para la separación entre transpilación, runtime oficial y verificación ejecutable.
Política de targets oficial
La política oficial de targets exige que toda documentación pública, snippets de CLI, tablas y ejemplos utilicen exclusivamente los nombres canónicos python, javascript y rust. Los tiers oficiales se derivan de TIER1_TARGETS, TIER2_TARGETS y OFFICIAL_TARGETS definidos en src/pcobra/cobra/config/transpile_targets.py, con el registro canónico de backends en src/pcobra/cobra/transpilers/registry.py.
La compatibilidad mínima por backend no es uniforme: src/pcobra/cobra/transpilers/compatibility_matrix.py declara python como full para la matriz contractual actual, mientras javascript y rust se mantienen en partial. Eso significa que la paridad SDK total solo puede prometerse para python.
Política de soporte por tiers (SLA y gobernanza)
Definición operativa oficial:
- Tier 1 (
python,javascript,rust): prioridad alta de corrección para regresiones de transpilación y coherencia documental. - Tier 2 (sin targets públicos): reservado para uso interno/legacy fuera del contrato público.
SLA de mantenimiento documental/técnico:
- Tier 1: incidencias de regresión de transpilación o desalineación de política deben tener triage inicial en <= 2 días hábiles y propuesta de remediación en la siguiente ventana activa de mantenimiento.
- Tier 2: incidencias equivalentes deben tener triage inicial en <= 5 días hábiles y corrección según planificación de release o ventana de mantenimiento no crítica.
Criterios de promoción de Tier 2 → Tier 1 (todos requeridos durante al menos dos releases consecutivas):
- Señal estable de uso real.
- Cobertura CI sostenida en PR y/o gates equivalentes de calidad.
- Runtime/documentación sin desviaciones contractuales frente a la matriz pública.
Criterios de degradación de Tier 1 → Tier 2:
- Incumplimiento sostenido de cobertura CI o calidad operativa.
- Dependencias externas no mantenibles en la ventana de releases.
- Brecha contractual repetida entre documentación, CLI y comportamiento real.
Cualquier cambio de tier requiere RFC, plan de migración y comunicación explícita en changelog/notas de release.
Prerrequisitos por backend de ejecución/runtime
Cada backend oficial depende de toolchains o runtimes externos que deben existir en el host:
python(full): entorno Python>=3.10con dependencias del proyecto;holobit_sdkes obligatorio para el contrato Holobit completo.javascript(partial):nodey dependencias del runtime JavaScript del proyecto (vm2/node-fetchcuando aplique en el host).rust(partial): toolchain Rust (rustc/cargo) para compilación/ejecución fuera de transpilación.
Sin estos prerrequisitos, pCobra puede conservar generación de código, pero no promete ejecución equivalente al runtime oficial de Python.
Compatibilidad explícita por target (Holobit SDK + librerías)
| Target | Tier | Holobit SDK | holobit/proyectar/transformar/graficar |
corelibs |
standard_library |
|---|---|---|---|---|---|
python |
Tier 1 | ✅ full (requiere holobit-sdk) |
✅ full |
✅ full |
✅ full |
rust |
Tier 1 | 🟡 partial (sin dependencia de SDK Python) |
🟡 partial |
🟡 partial |
🟡 partial |
javascript |
Tier 1 | 🟡 partial (sin dependencia de SDK Python) |
🟡 partial |
🟡 partial |
🟡 partial |
Fuente normativa de detalle: docs/contrato_runtime_holobit.md y docs/matriz_transpiladores.md.
El objetivo de pCobra es brindar a la comunidad hispanohablante una alternativa cercana para aprender y construir software, reduciendo la barrera del idioma y fomentando la colaboración abierta. A medida que evoluciona, el proyecto busca ampliar su ecosistema, mejorar la transpilación y proveer herramientas que sirvan de puente entre la educación y el desarrollo profesional.
Tabla de Contenidos
- ¿Por dónde empezar?
- Descripción del Proyecto
- Arquitectura del compilador
- Architecture Overview
- Ecosistema unificado Cobra
- Anexos internos (NO PÚBLICO)
- Instalación
- Cómo usar la CLI
- Cómo decide backend internamente
- Librería estándar unificada (stdlib)
- Contrato de imports
- Descargas
- Estructura del Proyecto
- Herramientas y scripts soportados
- Características Principales
- Uso
- Tokens y reglas léxicas
- Ejemplo de Uso
- Conversión desde otros lenguajes
- Pruebas
- Ejemplos de prueba
- Generar documentación
- Análisis con CodeQL
- CobraHub
- Hitos y Roadmap
- Contribuciones
- Guía de Contribución
- Proponer extensiones
- Extensión para VS Code
- Comunidad
- Licencia
- Ruta recomendada de documentación (sin ambigüedad):
- Manual de Cobra en PDF
- Especificación técnica
- Blog del minilenguaje
- Casos de uso reales
- Limitaciones del sandbox de Node
- Anexos legacy/internal
- Notebooks de ejemplo y casos reales
- Probar Cobra en línea
- Historial de cambios
¿Por dónde empezar?
- Libro de Programación Cobra (ruta principal de aprendizaje).
- Manual de Cobra (referencia técnica canónica).
- Guía básica (resumen histórico) y documentación histórica como apoyo secundario.
Ejemplos
Proyectos de demostración disponibles en el repositorio de ejemplos.
Este repositorio incluye ejemplos básicos en la carpeta examples/, por
ejemplo examples/funciones_principales.co que muestra condicionales, bucles y
definición de funciones en Cobra.
Para ejemplos interactivos revisa los cuadernos en notebooks/casos_reales/.
Ejemplos avanzados
En examples/avanzados/ se incluyen programas que profundizan en Cobra con ejercicios de control de flujo, funciones recursivas e interacción de clases. Cada tema cuenta con su propia carpeta:
Notebooks de ejemplo
En la carpeta notebooks/ se incluye el cuaderno ejemplo_basico.ipynb con un ejemplo básico de uso de Cobra. Además, los cuadernos de notebooks/casos_reales/ muestran cómo ejecutar los ejemplos avanzados. Para abrirlo puedes usar Jupyter directamente:
jupyter notebook notebooks/ejemplo_basico.ipynb
También puedes abrir Jupyter sin ruta inicial y elegir el archivo desde la interfaz web.
Probar Cobra en línea
Puedes experimentar con Cobra directamente en tu navegador:
Descripción del Proyecto
Cobra está diseñado para facilitar la programación en español, permitiendo que los desarrolladores utilicen un lenguaje más accesible. A través de su lexer, parser y transpiladores, Cobra puede analizar, ejecutar y convertir código a otros lenguajes, brindando soporte para variables, funciones, estructuras de control y estructuras de datos como listas, diccionarios y clases. Para la referencia técnica consulta el Manual de Cobra canónico. La especificación completa del lenguaje se encuentra en SPEC_COBRA.md.
Arquitectura del compilador
La cadena de herramientas de Cobra separa el front-end de los generadores de código mediante una arquitectura interna de compilación. Esa arquitectura es un detalle de implementación y no forma parte de la interfaz pública.
Architecture Overview
Consulta el resumen corto en docs/architecture/overview.md: describe la ruta oficial de ejecución sin exponer detalles internos en el flujo público run/build/test/mod.
Diagrama corto del flujo principal:
Frontend Cobra
↓
BackendPipeline
↓
Bindings (python/js/rust)
Frontend Cobraanaliza el código fuente y construye el AST.BackendPipelineresuelve backend y normaliza internamente la compilación.Bindingsconecta la salida con los runtimes oficiales de Python, JavaScript y Rust.
Esta organización actúa como contrato técnico entre la interfaz pública y la ejecución interna, permitiendo incorporar mejoras sin modificar la UX de usuario final.
Ecosistema unificado Cobra
Cobra expone una sola interfaz de entrada (cobra) y desacopla internamente la orquestación, los adapters y los runtimes de ejecución. Revisa el diagrama por capas en docs/architecture/unified-ecosystem.md.
Para el plan de transición arquitectónica incremental, consulta docs/architecture/cobra_unified_refactor_plan.md.
Para una guía ejecutable por fases (A–I) con tareas paso a paso, consulta docs/architecture/cobra_unified_architecture_execution_plan.md.
Anexos internos (NO PÚBLICO)
⚠️ NO PÚBLICO / SOLO MANTENEDORES: la documentación de migración, compatibilidad histórica y rutas legacy vive en anexos internos y queda fuera del onboarding principal.
Si necesitas migrar scripts antiguos o revisar compatibilidad histórica, consulta:
Instalación
pip install pcobra
Instalación por perfiles (extras opcionales)
# Excel (.xlsx)
pip install "pcobra[excel]"
# Formatos columnares/binarios (Parquet/Feather)
pip install "pcobra[columnar]"
# alias equivalente
pip install "pcobra[io-binary]"
# Servidor de lenguaje (LSP)
pip install "pcobra[lsp]"
# Generación de documentación
pip install "pcobra[docs]"
Si instalas desde el repositorio local, usa la misma sintaxis con .:
pip install -e .[excel]
Instalación con pipx
pipx install pcobra
Instalación desde repositorio
Consulta docs/instalacion.md para instrucciones avanzadas (gramáticas, plugins, scripts y uso de Docker).
Bootstrap opcional de PATH para desarrollo local
Desde esta versión, import pcobra ya no modifica PATH automáticamente. Si necesitas que la CLI añada scripts/bin al PATH al iniciar (flujos locales del repositorio), actívalo explícitamente:
COBRA_CLI_BOOTSTRAP_PATH=1 cobra --help
Este comportamiento solo aplica al arranque de la CLI (pcobra/cli.py) y mantiene las importaciones de librería libres de efectos secundarios. La CLI acepta COBRA_CLI_BOOTSTRAP_PATH (recomendado) y PCOBRA_CLI_BOOTSTRAP_PATH (compatibilidad).
Cómo usar la CLI
CLI simplificada (interfaz oficial)
La interfaz recomendada se organiza en cuatro comandos base de cara al usuario:
cobra run archivo.cobracobra build archivo.cobracobra test archivo.cobracobra mod ...
Ejemplos rápidos (flujo oficial):
cobra run archivo.cobra
cobra build archivo.cobra
cobra test archivo.cobra
cobra mod list
Nota: la transpilación existe, pero queda oculta dentro de la implementación interna. En onboarding y uso diario, la experiencia pública es únicamente
run/build/test/mod.
Para listar todas las opciones disponibles:
cobra --help
Backends oficiales públicos para cobra build: python, javascript, rust.
Más detalle técnico de capas y contratos internos en docs/architecture/unified-ecosystem.md.
Cómo decide backend internamente
Sin pedir banderas legacy, la CLI aplica esta ruta interna:
- Lee el contexto del proyecto (configuración local y metadatos de módulo).
- Evalúa el tipo de operación (
run,build,test) y requisitos de runtime. - Selecciona un backend oficial compatible.
- Ejecuta la fase de compilación/transpilación como detalle interno de pipeline.
Contrato público: el usuario trabaja con comandos Cobra; la selección final de backend y la transpilación son decisiones internas del sistema.
Librería estándar unificada (stdlib)
Namespaces públicos recomendados:
cobra.corecobra.datoscobra.webcobra.system
Ejemplos de import:
usar cobra.core
usar cobra.datos
usar cobra.web
usar cobra.system
from cobra.core import signo
from cobra.datos import filtrar
from cobra.web import obtener_url
from cobra.system import leer
Para transición, las rutas históricas (corelibs.*, standard_library.*) siguen disponibles como compatibilidad, pero no son la ruta recomendada para nuevo onboarding.
Contrato de imports (orden, conflictos y namespaces)
La documentación pública usa resolución determinista de módulos y evita rutas ambiguas en ejemplos de usuario final.
Orden de resolución (alto nivel): stdlib > project > python_bridge > hybrid.
Política ante conflictos:
- Comportamiento por defecto:
warn(modo compatibilidad). - Recomendación para producción:
namespace_required. - Regla práctica: si hay colisión de nombres, siempre usar namespace explícito (
cobra.datos,app.datos, etc.).
Namespaces recomendados:
- Dominio Cobra:
cobra.* - Dominio app/proyecto:
app.* - Evitar imports “planos” en módulos grandes si existe riesgo de colisión.
Ruta oficial para imports internos del proyecto (código Python de src/):
- Usar siempre
pcobra.cobra.*(ejemplo:pcobra.cobra.bindings.contract). - No usar
bindings.*en código interno nuevo;bindingsqueda solo como shim legacy deprecado. - Si estás dentro del mismo paquete, también se permiten imports relativos explícitos (
from .modulo import ...).
Guía de migración a la CLI unificada
La guía histórica de migración y compatibilidad se mantiene fuera del onboarding público, dentro de los anexos internos:
Anexos legacy/internal (fuera de onboarding)
Para no contaminar el onboarding principal, toda la información histórica o interna se concentra en:
Validar sintaxis (paso a paso)
- Validación base (Python + Cobra + targets oficiales):
cobra validar-sintaxis
- Solo front-end (sin toolchains de transpiladores):
cobra validar-sintaxis --solo-cobra
- Limitar targets específicos (lista CSV):
cobra validar-sintaxis --targets python,javascript,rust
- Modo estricto en CI (si hay
skipped, falla):
cobra validar-sintaxis --targets javascript,rust --strict
- Generar reporte JSON para pipelines:
cobra validar-sintaxis --report-json reporte_sintaxis.json
# o imprimir JSON en stdout
cobra validar-sintaxis --report-json
El comando respeta el --modo global de la CLI y puede combinarse con --modo mixto, --modo cobra o --modo transpilar.
Contrato JSON versionado (--report-json)
El reporte JSON usa schema_version=1.0.0 y mantiene un flujo único entre CLI y scripts smoke (ambos delegan en pcobra.cobra.qa.syntax_validation).
Campos del contrato actual:
schema_versionpython(version,result)cobra(version,result)targetserrors_by_targetprofiletimestamptargets_requestedstrictpython_runtime
Descarga de binarios
Para cada lanzamiento se generan ejecutables para Linux, Windows y macOS mediante GitHub Actions. Puedes encontrarlos en la pestaña Releases del repositorio. Solo descarga el archivo correspondiente a tu sistema operativo desde la versión más reciente y ejecútalo directamente.
Crear un tag vX.Y.Z en GitHub desencadena la publicación automática del
paquete en PyPI y la actualización de la imagen Docker.
Si prefieres generar el ejecutable manualmente ejecuta desde la raíz del repositorio en tu sistema (Windows, macOS o Linux):
pip install pyinstaller
cobra empaquetar --output dist
El nombre del binario puede ajustarse con la opción --name. También puedes
usar un archivo .spec propio o agregar datos adicionales mediante
--spec y --add-data:
cobra empaquetar --spec build/cobra.spec \
--add-data "all-bytes.dat;all-bytes.dat" --output dist
Crear un ejecutable con PyInstaller
Para compilar Cobra de forma independiente primero crea y activa un entorno virtual:
python -m venv .venv
source .venv/bin/activate # En Windows usa .\\.venv\\Scripts\\activate
Instala la distribución publicada y PyInstaller:
pip install pcobra
pip install pyinstaller
Luego genera el binario con:
pyinstaller --onefile src/pcobra/cli/cli.py -n cobra
El ejecutable aparecerá en el directorio dist/.
Para realizar una prueba rápida puedes ejecutar el script
scripts/test_pyinstaller.sh. Este script crea un entorno virtual temporal,
instala pcobra desde el repositorio (o desde PyPI si se ejecuta fuera
de él) y ejecuta PyInstaller sobre src/pcobra/cli/cli.py o el script cobra-init.
El binario resultante se
guardará por defecto en dist/.
scripts/test_pyinstaller.sh
Descargas
Los ejecutables precompilados para Cobra se publican en la sección de Releases.
| Versión | Plataforma | Enlace |
|---|---|---|
| 10.0.12 | Linux x86_64 | cobra-linux |
| 10.0.12 | Windows x86_64 | cobra.exe |
| 10.0.12 | macOS arm64 | cobra-macos |
Para comprobar la integridad del archivo descargado calcula su hash SHA256 y compáralo con el publicado:
sha256sum cobra-linux
En Windows utiliza:
CertUtil -hashfile cobra.exe SHA256
Estructura del Proyecto
El proyecto se organiza en las siguientes carpetas:
src/pcobra/: Código fuente del paquete.docs/: Documentación del proyecto.tests/: Pruebas automáticas.examples/: Ejemplos de uso.extensions/: Extensiones oficiales, como la de VS Code.scripts/: Scripts de utilidad.notebooks/: Cuadernos interactivos.docker/: Archivos de configuración para contenedores.binder/: Archivos para ejecutar el proyecto en Binder.
Los archivos requirements*.txt son locks generados automáticamente a partir de pyproject.toml, que es la única fuente de verdad para dependencias de runtime y extras (dev, docs, notebooks, etc.).
Para regenerarlos de forma reproducible usa:
make deps-sync
# o con actualización de versiones compatibles
bash scripts/sync_requirements.sh --upgrade
Para validar que no hay drift entre pyproject.toml y los locks:
make deps-check
Herramientas y scripts soportados
El proyecto soporta oficialmente:
Makefilepara automatizar tareas comomake install,make testymake clean.scripts/run.shpara ejecutar Cobra con variables definidas en.env.scripts/install.shpara preparar el entorno de desarrollo.- Scripts auxiliares en
scripts/. - Configuraciones Docker en
docker/.
Características Principales
- Lexer y Parser: Implementación de un lexer para la tokenización del código fuente y un parser para la construcción de un árbol de sintaxis abstracta (AST).
- Transpiladores públicos a Python, JavaScript y Rust: Cobra puede convertir código a estos targets oficiales de UX pública.
- Soporte de Estructuras Avanzadas: Permite la declaración de variables, funciones, clases, listas y diccionarios, así como el uso de bucles y condicionales.
- Módulos nativos con funciones de E/S, utilidades matemáticas y estructuras de datos para usar directamente desde Cobra.
- Instalación de paquetes en tiempo de ejecución mediante la instrucción
usar. - Manejo de Errores: El sistema captura y reporta errores de sintaxis, facilitando la depuración.
- Visualización y Depuración: Salida detallada de tokens, AST y errores de sintaxis para un desarrollo más sencillo.
- Decoradores de rendimiento: la biblioteca
smooth-criminalofrece funciones comooptimizaryperfilarpara mejorar y medir la ejecución de código Python desde Cobra. - Benchmarking: ejemplos completos de medición de rendimiento están
disponibles en
docs/frontend/benchmarking.rst. - Ejemplos de Código y Documentación: Ejemplos prácticos que ilustran el uso del lexer, parser y transpiladores.
- Ejemplos Avanzados: Revisa
docs/frontend/ejemplos_avanzados.rstpara conocer casos con clases, hilos y manejo de errores. - Identificadores en Unicode: Puedes nombrar variables y funciones utilizando
caracteres como
á,ñoΩpara una mayor flexibilidad.
Rendimiento
Los benchmarks más recientes se ejecutaron con
scripts/benchmarks/compare_backends.py para comparar varios backends. El
tiempo aproximado fue de 0.68 s para Cobra y Python,
0.07 s para JavaScript y 0.04 s para Rust, sin consumo
significativo de memoria.
Ejecuta el script con:
python scripts/benchmarks/compare_backends.py --output bench_results.json
El archivo bench_results.json se guarda en el directorio actual y puede analizarse con el cuaderno notebooks/benchmarks_resultados.ipynb.
Para ver la evolución entre versiones ejecuta:
python scripts/benchmarks/compare_releases.py --output benchmarks_compare.json
Los resultados históricos se publican como archivos benchmarks.json en la
sección de Releases, donde
puedes consultar las métricas de cada versión.
Para comparar el rendimiento de los hilos ejecuta cobra benchthreads:
cobra benchthreads --output threads.json
El resultado contiene tres entradas (secuencial, cli_hilos y kernel_hilos) con los tiempos y uso de CPU.
Para generar binarios de referencia (backend público Rust) y medir su rendimiento ejecuta:
cobra bench --binary
Los resultados se guardan en binary_bench.json.
Uso
Para ejecutar el proyecto directamente desde el repositorio se incluye el
script scripts/run.sh. Este cargará las variables definidas en .env si dicho archivo
existe y luego llamará a python -m pcobra pasando todos los argumentos
recibidos. Úsalo de la siguiente forma:
./scripts/run.sh [opciones]
También puedes ejecutar la interfaz de línea de comandos directamente desde la raíz del proyecto:
python -m pcobra
Entrypoints oficiales de CLI:
pcobra.cli:main(scriptcobrainstalado por packaging).python -m pcobra(passthrough directo apcobra.cli:main).
Rutas soportadas explícitamente para compatibilidad de arranque/import:
pcobra.cli✅ ruta canónica.cobra.cli.cli✅ shim legacy soportado.python -m pcobra✅ ejecuta la ruta canónica.python -m cobra.cli.cli✅ ejecuta el shim legacy canónico.
El módulo src/pcobra/core/main.py se conserva como ejemplo/demo interno y no
debe usarse como entrypoint productivo.
Para conocer las opciones avanzadas del modo seguro revisa
docs/frontend/modo_seguro.rst. Los ejemplos de medición de rendimiento
están disponibles en docs/frontend/benchmarking.rst.
Para ejecutar pruebas unitarias, utiliza pytest:
PYTHONPATH=$PWD pytest tests --cov=pcobra --cov-report=term-missing \
--cov-fail-under=95
También puedes ejecutar suites específicas ubicadas en tests:
python -m tests.suite_cli # Solo pruebas de la CLI
python -m tests.suite_core # Pruebas de lexer, parser e intérprete
python -m tests.suite_transpiladores # Pruebas de los transpiladores
Uso directo desde el repositorio
El archivo sitecustomize.py se carga automáticamente cuando Python se
ejecuta desde la raíz del proyecto. Este módulo añade la carpeta src a
sys.path, permitiendo importar paquetes como src.modulo sin instalar
el paquete ni modificar PYTHONPATH.
Para probar Cobra de esta forma realiza lo siguiente:
python -m venv .venv
source .venv/bin/activate # En Unix
.\.venv\Scripts\activate # En Windows
make run # o bien: python -m pcobra
Tokens y reglas léxicas
El analizador léxico convierte el código en tokens de acuerdo con las
expresiones regulares definidas en lexer.py. En la siguiente tabla se
describen todos los tokens disponibles:
| Token | Descripción |
|---|---|
| DIVIDIR | Palabra clave o instrucción "dividir" |
| MULTIPLICAR | Palabra clave o instrucción "multiplicar" |
| CLASE | Palabra clave "clase" |
| DICCIONARIO | Palabra clave "diccionario" |
| LISTA | Palabra clave "lista" |
| RBRACE | Símbolo "}" |
| DEF | Palabra clave "def" |
| IN | Palabra clave "in" |
| LBRACE | Símbolo "{" |
| FOR | Palabra clave "for" |
| DOSPUNTOS | Símbolo ":" |
| VAR | Palabra clave "var" |
| FUNC | Palabra clave "func" o "definir" |
| SI | Palabra clave "si" |
| SINO | Palabra clave "sino" |
| MIENTRAS | Palabra clave "mientras" |
| PARA | Palabra clave "para" |
| IMPORT | Palabra clave "import" |
| USAR | Palabra clave "usar" |
| MACRO | Palabra clave "macro" |
| HOLOBIT | Palabra clave "holobit" |
| PROYECTAR | Palabra clave "proyectar" |
| TRANSFORMAR | Palabra clave "transformar" |
| GRAFICAR | Palabra clave "graficar" |
| TRY | Palabra clave "try" o "intentar" |
| CATCH | Palabra clave "catch" o "capturar" |
| THROW | Palabra clave "throw" o "lanzar" |
| ENTERO | Número entero |
| FLOTANTE | Número con punto decimal |
| CADENA | Cadena de caracteres |
| BOOLEANO | Literal booleano |
| IDENTIFICADOR | Nombre de variable o función |
| ASIGNAR | Símbolo "=" |
| SUMA | Operador "+" |
| RESTA | Operador "-" |
| MULT | Operador "*" |
| DIV | Operador "/" |
| MAYORQUE | Operador ">" |
| MENORQUE | Operador "<" |
| MAYORIGUAL | Operador ">=" |
| MENORIGUAL | Operador "<=" |
| IGUAL | Operador "==" |
| DIFERENTE | Operador "!=" |
| AND | Operador lógico "&&" |
| OR | Operador lógico " |
| NOT | Operador "!" |
| MOD | Operador "%" |
| LPAREN | Símbolo "(" |
| RPAREN | Símbolo ")" |
| LBRACKET | Símbolo "[" |
| RBRACKET | Símbolo "]" |
| COMA | Símbolo "," |
| RETORNO | Palabra clave "retorno" |
| FIN | Palabra clave "fin" |
| EOF | Fin de archivo |
| IMPRIMIR | Palabra clave "imprimir" |
| HILO | Palabra clave "hilo" |
| ASINCRONICO | Palabra clave "asincronico" |
| DECORADOR | Símbolo "@" |
| YIELD | Palabra clave "yield" |
| ESPERAR | Palabra clave "esperar" |
| ROMPER | Palabra clave "romper" |
| CONTINUAR | Palabra clave "continuar" |
| PASAR | Palabra clave "pasar" |
| AFIRMAR | Palabra clave "afirmar" |
| ELIMINAR | Palabra clave "eliminar" |
| GLOBAL | Palabra clave "global" |
| NOLOCAL | Palabra clave "nolocal" |
| LAMBDA | Palabra clave "lambda" |
| CON | Palabra clave "con" |
| FINALMENTE | Palabra clave "finalmente" |
| DESDE | Palabra clave "desde" |
| COMO | Palabra clave "como" |
| SWITCH | Palabra clave "switch" o "segun" |
| CASE | Palabra clave "case" o "caso" |
Las expresiones regulares se agrupan en especificacion_tokens y se procesan en orden para encontrar coincidencias. Las palabras clave usan patrones como \bvar\b o \bfunc\b, los números emplean \d+ o \d+\.\d+ y las cadenas se detectan con "[^\"]*" o '[^']*'. Los identificadores permiten caracteres Unicode mediante [^\W\d_][\w]*. Operadores y símbolos utilizan patrones directos como ==, && o \(. Antes del análisis se eliminan los comentarios de línea y de bloque con re.sub.
Ejemplo de Uso
Puedes probar el lexer y parser con un código como el siguiente:
from cobra.core import Lexer, Parser
from cobra.transpilers.transpiler.to_python import TranspiladorPython
codigo = """
var x = 10
si x > 5 :
proyectar(x, "2D")
sino :
graficar(x)
"""
lexer = Lexer(codigo)
tokens = lexer.analizar_token()
parser = Parser(tokens)
arbol = parser.parsear()
print(arbol)
transpiler = TranspiladorPython()
codigo_python = transpiler.generate_code(arbol)
print(codigo_python)
Ejemplo de imprimir, holobits y bucles
A continuación se muestra un fragmento que utiliza imprimir, holobits y bucles:
codigo = '''
var h = holobit([0.8, -0.5, 1.2])
imprimir(h)
var contador = 0
mientras contador < 3 :
imprimir(contador)
contador += 1
para var i en rango(2) :
imprimir(i)
'''
Al generar código para Python, imprimir se convierte en print, mientras en while y para en for. En JavaScript estos elementos se transforman en console.log, while y for...of respectivamente. En Rust se produce código equivalente con println!, while y for. El tipo holobit se traduce a la llamada holobit([...]) en Python, new Holobit([...]) en JavaScript y holobit(vec![...]) en Rust. Los detalles de backends legacy internos quedan en documentación de migración/histórico.
Integración con holobit-sdk
El proyecto declara holobit-sdk==1.0.8 en pyproject.toml como dependencia obligatoria cuando se instala con Python >=3.10. Las funciones graficar, proyectar, transformar, escalar y mover del runtime Python delegan en esa API para ese entorno. Dentro de ese grupo, escalar y mover son helpers solo Python y no forman parte del contrato Holobit multi-backend documentado en docs/contrato_runtime_holobit.md y docs/matriz_transpiladores.md. Si el entorno queda desalineado y holobit_sdk falta igualmente, el runtime prioriza errores explícitos en lugar de prometer emulación completa en todos los entornos.
from core.holobits import Holobit, graficar, proyectar, transformar, escalar, mover
h = Holobit([0.8, -0.5, 1.2, 0.0, 0.0, 0.0])
proyectar(h, "2D")
graficar(h)
transformar(h, "rotar", "z", 90)
escalar(h, 2.0)
mover(h, 1.0, 0.0, -1.0)
Ejemplo de carga de módulos
Puedes dividir el código en varios archivos y cargarlos con import:
# modulo.co
var saludo = 'Hola desde módulo'
# programa.co
import 'modulo.co'
imprimir(saludo)
Al ejecutar programa.co, se procesará primero modulo.co y luego se imprimirá Hola desde módulo.
Instrucción usar: separación REPL vs runtime general
La semántica de usar depende del contexto de ejecución.
Contrato de usar en REPL
En REPL incremental, usar aplica una política estricta y explícita:
- Entrada aceptada por el parser actual:
usar "numero"(compatibilidad sintáctica vigente). - Semántica aplicada: modelo oficial plano del libro (
usar numero), sin acceso por prefijo de módulo (numero.funcion(...)). - Inyección de símbolos: solo se inyectan símbolos públicos callables exportados por
__all__. - Filtrado: se ignoran símbolos privados (
_...) y cualquier símbolo no callable. - Módulos externos en REPL estricto: deben fallar con error claro:
módulo externo no permitido en REPL estricto (solo alias oficiales Cobra). - Solo se aceptan módulos oficiales definidos en
REPL_COBRA_MODULE_MAPy no hay fallback de instalación conpip.
Ejemplos de comportamiento esperado en REPL:
usar "numero"
imprimir(es_finito(10)) # ✅
usar "texto"
imprimir(a_snake("HolaMundo")) # ✅
usar "numpy"
imprimir(sqrt(4)) # ❌ módulo externo no permitido en REPL estricto (solo alias oficiales Cobra)
Nota: en Cobra REPL no hay dot-access para estos símbolos inyectados.
numero.es_finito(10)no está permitido; usaes_finito(10).
Rutas clave de implementación para mantenimiento:
src/pcobra/core/interpreter.py(ejecutar_usar).src/pcobra/cobra/usar_policy.py.src/pcobra/standard_library/numero.py.src/pcobra/standard_library/texto.py.src/pcobra/standard_library/logica.py.
Runtime fuera de REPL
Fuera del REPL se aplica la política general de resolución de dependencias (whitelist y reglas de entorno/configuración del loader).
La sentencia usar "paquete" intenta importar un módulo de Python y, según la
configuración activa, puede habilitar instalación dinámica. Para restringir qué
dependencias pueden instalarse se emplea la variable USAR_WHITELIST definida
en src/pcobra/cobra/usar_loader.py.
Si la política habilita instalación automática (por ejemplo con
COBRA_USAR_INSTALL=1), el runtime podrá invocar pip cuando el paquete no
esté disponible. Si no está habilitada, obtener_modulo() rechazará la
instalación y lanzará error.
Archivo de mapeo de módulos
Los transpiladores consultan cobra.mod para resolver las importaciones.
Este archivo sigue un esquema YAML sencillo donde cada clave es la ruta del
módulo Cobra y sus valores indican las rutas de los archivos generados.
Ejemplo de formato:
modulo.co:
version: "1.0.0"
python: modulo.py
javascript: modulo.js
Si una entrada no se encuentra, el transpilador cargará directamente el archivo
indicado en la instrucción import. Para añadir o modificar rutas basta con
editar cobra.mod y volver a ejecutar las pruebas.
Invocar el transpilador
La carpeta src/pcobra/cobra/transpilers/transpiler
contiene la implementación de los transpiladores públicos a Python, JavaScript y Rust (más rutas internas legacy para migración/regresión). Una vez
instaladas las dependencias, puedes llamar al transpilador desde tu propio
script de la siguiente manera:
from cobra.transpilers.transpiler.to_python import TranspiladorPython
from cobra.core import Parser
codigo = "imprimir('hola')"
parser = Parser(codigo)
arbol = parser.parsear()
transpiler = TranspiladorPython()
resultado = transpiler.generate_code(arbol)
print(resultado)
Para mantenerte en la interfaz pública, enfoca los ejemplos en los transpiladores oficiales:
from cobra.transpilers.transpiler.to_js import TranspiladorJavaScript
from cobra.transpilers.transpiler.to_rust import TranspiladorRust
codigo_js = TranspiladorJavaScript().generate_code(arbol)
codigo_rust = TranspiladorRust().generate_code(arbol)
Tras obtener el código con generate_code puedes guardarlo usando save_file:
transpiler.save_file("salida.py")
Requiere tener instalado el paquete en modo editable y todas las dependencias
de requirements.txt. Si necesitas generar archivos a partir de módulos Cobra,
consulta el mapeo definido en cobra.mod.
Ejemplo de concurrencia
Es posible lanzar funciones en hilos con la palabra clave hilo:
func tarea():
imprimir('trabajo')
fin
hilo tarea()
imprimir('principal')
Al generar código para estas funciones, se crean llamadas asyncio.create_task en Python y Promise.resolve().then en JavaScript.
Uso desde la CLI
Una vez instalado el paquete, la herramienta cobra ofrece varios subcomandos:
Autocompletado
La CLI soporta autocompletado de argumentos mediante argcomplete. Para habilitarlo en tu terminal ejecuta uno de los siguientes comandos según tu shell:
-
bash:
eval "$(register-python-argcomplete cobra)"
-
zsh:
autoload -U bashcompinit bashcompinit eval "$(register-python-argcomplete cobra)"
-
fish:
register-python-argcomplete --shell fish cobra | source
# Compilar un archivo (backend automático dentro del set oficial)
cobra build programa.co
# Transpilar inverso de Python a JavaScript
cobra transpilar-inverso script.py --origen=python --destino=javascript
# Ejemplo de mensaje de error al compilar un archivo inexistente
cobra build noexiste.co
# Salida:
# Error: El archivo 'noexiste.co' no existe
# Gestionar módulos instalados
cobra mod list
cobra mod install ruta/al/modulo.co
cobra mod remove modulo.co
# Crear e instalar paquetes Cobra
cobra paquete crear src demo.cobra
cobra paquete instalar demo.cobra
# Generar documentación HTML y API
cobra docs
# Crear un ejecutable independiente
cobra empaquetar --output dist
# Perfilar un programa y guardar los resultados
cobra profile programa.co --output salida.prof
# O mostrar el perfil directamente en pantalla
cobra profile programa.co
# Compilar en varios backends en una sola llamada
cobra build ejemplo.co --targets python,javascript
# Iniciar el iddle gráfico (requiere Flet)
cobra gui
Si deseas desactivar los colores usa --no-color:
cobra --no-color run programa.co
Para aumentar el nivel de detalle de los mensajes añade -v o --verbose.
Por defecto el nivel de registro es INFO; con -v o más se cambia a DEBUG:
cobra -v run programa.co
Los archivos con extensión .cobra representan paquetes completos, mientras que los scripts individuales se guardan como .co.
El subcomando docs ejecuta sphinx-apidoc para generar la documentación de la API antes de compilar el HTML.
El subcomando gui abre el iddle integrado y requiere tener instalado Flet.
Conversión desde otros lenguajes a Cobra
cobra transpilar-inverso documenta una capacidad distinta de la transpilación de salida normal. Aquí conviene separar dos listas para evitar ambigüedades:
- Targets oficiales de salida: consultar el resumen normativo generado al inicio de este README.
- Orígenes reverse de entrada:
python,javascript,java(java como entrada histórica, no salida oficial).
Los nombres python, javascript y java aparecen en ambas listas, pero con papeles distintos: como --origen describen entradas aceptadas por la ruta reverse; como --destino vuelven a significar targets oficiales de salida ya existentes. La capacidad reverse no añade targets nuevos ni amplía la lista oficial de salida.
cobra transpilar-inverso script.py --origen=python --destino=python
El proceso intenta mapear instrucciones básicas, pero características muy específicas pueden requerir ajustes manuales. Actualmente la cobertura varía según el lenguaje y puede que ciertas construcciones no estén implementadas.
Actualmente la transpilación inversa soportada por política acepta código de entrada solo en la whitelist reverse oficial. Esos nombres son orígenes reverse, no destinos oficiales adicionales. Para el detalle normativo reutilizable consulta el resumen generado al inicio de este README y docs/targets_policy.md.
Diseño extensible de la CLI
La CLI está organizada en clases dentro de src/pcobra/cli/commands. Cada subcomando
hereda de BaseCommand y define su nombre, los argumentos que acepta y la acción
a ejecutar. En src/pcobra/cli/cli.py se instancian automáticamente y se registran en
argparse, por lo que para añadir un nuevo comando solo es necesario crear un
archivo con la nueva clase y llamar a register_subparser y run.
Para un tutorial completo de creación de plugins revisa
docs/frontend/plugins.rst.
Modo seguro
El intérprete y la CLI ejecutan el código en modo seguro de forma predeterminada. Este modo valida el AST y prohíbe primitivas como leer_archivo, escribir_archivo, obtener_url, hilo, leer, escribir, existe, eliminar y enviar_post. El validador ValidadorProhibirReflexion también bloquea llamadas a eval, exec y otras funciones de reflexión, además de impedir el acceso a atributos internos. Asimismo, las instrucciones import solo están permitidas para módulos instalados o incluidos en IMPORT_WHITELIST. Antes de cargar el código las rutas se normalizan con os.path.realpath y se comparan con os.path.commonpath, por lo que un enlace simbólico o un directorio como modules_fake no pueden evadir el filtro. Si el programa intenta utilizar estas funciones o importar otros archivos se lanzará PrimitivaPeligrosaError.
La validación se realiza mediante una cadena de validadores configurada por la
función construir_cadena, lo que facilita añadir nuevas comprobaciones en el
futuro.
Auditoría de eventos de seguridad en runtime
La CLI registra eventos de auditoría cuando se activan rutas críticas de la
política de seguridad (por ejemplo, --no-seguro, --allow-insecure-fallback
o un bloqueo en CI/no interactivo). Cada warning incluye:
event: nombre del evento de seguridad.command: comando afectado.reason: motivo de la decisión.audit_id: identificador estable (SEC-RUNTIME-001..005).
En text (default), los campos van serializados en el propio mensaje para
facilitar parsing por regex. Para pipelines CI/SIEM puedes habilitar salida JSON
con log_formatter = "json" en cobra-cli.toml (o
COBRA_LOG_FORMATTER=json), obteniendo un objeto por línea.
Ejecución en sandbox (--sandbox)
Algunos comandos permiten ejecutar código dentro de una sandbox o de contenedores Docker oficiales gracias
a la biblioteca RestrictedPython. Esto limita las operaciones disponibles y
evita acciones potencialmente peligrosas como leer archivos o importar módulos
externos. Para activar esta opción utiliza --sandbox en los subcomandos
ejecutar e interactive.
El código se compila con compile_restricted y luego se ejecuta mediante
exec. No se recurre a compile() cuando la compilación segura falla,
sino que se propaga la excepción. El uso de exec sigue siendo peligroso,
por lo que se recomienda mantener el entorno de ejecución lo más pequeño
posible para reducir riesgos.
Pruebas
Las pruebas están ubicadas en la carpeta tests/ y utilizan pytest para la
ejecución. Antes de correr cualquier prueba instala el paquete en modo
editable junto con las dependencias de desarrollo:
pip install -e .[dev]
Además, cada cambio en los workflows de GitHub Actions se valida con
actionlint mediante el workflow
Validar workflows. Este proceso se
ejecuta automáticamente en los eventos push y pull_request cuando se
modifican archivos dentro de .github/workflows/, evitando que se integren
definiciones inválidas en la canalización de CI.
Esta instrucción añade el proyecto al PYTHONPATH e instala todas las
dependencias listadas en requirements-dev.txt, generado desde el extra dev
de pyproject.toml. Sin estas bibliotecas las pruebas fallarán debido a
módulos no encontrados.
Si prefieres ejecutar las pruebas directamente desde el repositorio sin
instalar el paquete, utiliza el script scripts/test.sh:
./scripts/test.sh
Este comando exporta PYTHONPATH=$PWD e invoca pytest con los argumentos
definidos en pyproject.toml.
PYTHONPATH=$PWD pytest tests --cov=pcobra --cov-report=term-missing \
--cov-fail-under=95
Algunas pruebas internas de migración/regresión usan toolchains adicionales fuera del contrato público. Para ejecutar ese subconjunto en local debes disponer de toolchains extra. En particular se requiere:
- Node.js
- gcc y g++
- Rust (
rustc) - Java (
default-jdk)
Con estas herramientas disponibles puedes ejecutar todo el conjunto con:
PYTHONPATH=$PWD pytest
En la integración continua se emplea:
pytest --cov=pcobra tests/
El reporte se guarda como coverage.xml y se utiliza en el CI.
Ejemplos de prueba
En tests/data se incluyen programas mínimos utilizados en las
pruebas de entrada y salida de la CLI:
hola.cobra: imprime el saludo «Hola Cobra».suma.cobra: define la funciónsumary muestra la suma de dos números.
El archivo tests/test_ejemplos_io.py ejecuta estos ejemplos y compara
la salida con los archivos .out correspondientes. Para probarlos
manualmente:
cobra run tests/data/hola.cobra
cobra run tests/data/suma.co
También puedes transpilar los ejemplos para ver el código Python generado:
cobra build tests/data/hola.cobra
cobra build tests/data/suma.co
Regenerar snapshots de transpilación (tests/data/expected_examples)
Cuando cambie el transpiler de Python, actualiza los snapshots esperados para los
ejemplos de tests/data (los que tienen archivo .out asociado):
-
Lista los ejemplos con salida esperada:
python - <<'PY' from pathlib import Path base = Path("tests/data") print(sorted(p.stem for p in base.glob("*.out"))) PY
-
Regenera cada snapshot
.pyejecutando la CLI por archivo y copiando el bloque de código generado dentro detests/data/expected_examples/<nombre>.py. Ejemplo manual:SQLITE_DB_KEY=test cobra transpilar tests/data/hola.cobra
-
Ejecuta la suite de ejemplos para validar que los snapshots quedaron alineados:
PYTHONPATH=$PWD SQLITE_DB_KEY=test pytest tests/test_ejemplos_io.py
Pruebas de rendimiento
El archivo cobra.toml incluye una sección [rendimiento] con el parámetro
tiempo_max_transpilacion_seg, que define en segundos el tiempo máximo
permitido para transpilar un archivo.
Para ejecutar únicamente las pruebas de rendimiento utiliza:
pytest -m performance
Si tu entorno es más lento o más rápido, ajusta el valor de
tiempo_max_transpilacion_seg en cobra.toml según tus necesidades.
Se han incluido pruebas que verifican los códigos de salida de la CLI. Los
subcomandos devuelven 0 al finalizar correctamente y un valor distinto en caso
de error.
Comandos válidos por destino
La interfaz pública mantiene únicamente tres destinos oficiales (python,
javascript, rust) para cobra build. En flujo estándar no necesitas fijarlo manualmente; úsalo solo en modo avanzado.
Ejemplos de subcomandos
cobra run programa.co
cobra build programa.co
cobra test
cobra mod list
echo $? # 0 al compilar sin problemas
cobra run inexistente.co
# El archivo 'inexistente.co' no existe
echo $? # 1
Errores comunes
El archivo '<archivo>' no existe: la ruta es incorrecta o el archivo no está disponible.El módulo <nombre> no existe: se intenta eliminar un módulo no instalado.Primitiva peligrosa: <nombre>: se usó una función restringida en modo seguro.Acción de módulos no reconocida: el subcomando indicado es inválido.
Selección de idioma
La CLI utiliza gettext para mostrar los mensajes en distintos idiomas.
Puedes definir el idioma estableciendo la variable de entorno COBRA_LANG
o pasando el argumento --lang al ejecutar cobra.
COBRA_LANG=en cobra --ayuda
cobra --lang en build archivo.co
Si deseas añadir otro idioma, crea una carpeta docs/frontend/locale/<cod>/LC_MESSAGES
con los archivos .po de traducción y envía un pull request.
Para obtener un reporte de cobertura en la terminal ejecuta:
pytest --cov=src --cov-report=term-missing --cov-fail-under=95
Caché del AST y SQLitePlus
A partir de la migración a SQLitePlus, la caché incremental de AST y tokens
se almacena en una base de datos SQLite cifrada en lugar de archivos sueltos.
La ruta por defecto es ~/.cobra/sqliteplus/core.db, que se crea
automáticamente al primer acceso. Para inicializar la conexión es obligatoria la
variable de entorno SQLITE_DB_KEY, cuyo valor actúa como clave de cifrado.
Si necesitas una ubicación distinta configura COBRA_DB_PATH; cuando se
proporciona, el valor de SQLITE_DB_KEY se mantiene como clave incluso si
contiene / u otros separadores.
⚠️ La CLI valida
SQLITE_DB_KEYal arrancar y falla de forma explícita si no está definida. Solo en entorno de desarrollo/pruebas se permite la excepción controladaCOBRA_DEV_MODE=1, que habilita una clave temporal de sesión.
# Ejemplo recomendado: clave aleatoria fuerte para uso local/CI
export SQLITE_DB_KEY="$(openssl rand -hex 32)" # Obligatorio para abrir la base
export COBRA_DB_PATH="$HOME/.cobra/sqliteplus/core.db" # Opcional; usa el
# valor por defecto
# Para despliegues sin cifrado puedes usar un prefijo explícito:
export SQLITE_DB_KEY="path:/var/cache/pcobra/core.db"
# Solo desarrollo/pruebas controladas:
export COBRA_DEV_MODE=1
Si necesitas ubicar la base de datos en otro sitio, ajusta COBRA_DB_PATH a la
ubicación deseada antes de ejecutar cobra. Como compatibilidad adicional, un
valor de SQLITE_DB_KEY que empiece por path: o file: se interpreta como
ruta explícita y desactiva el cifrado; en cualquier otro caso el valor se trata
como clave aunque contenga separadores y se emitirá una advertencia si parece
una ruta. La antigua variable
COBRA_AST_CACHE continúa disponible únicamente como alias de compatibilidad:
si la defines, el sistema derivará automáticamente una ruta cache.db en ese
directorio y mostrará una advertencia de depreciación.
Limpieza y mantenimiento
El comando cobra cache sigue siendo el método soportado para borrar la caché y
ahora opera directamente sobre la base de datos. Incluye la opción --vacuum
para recompac tar la base tras la limpieza:
cobra cache --vacuum
Migración de cachés JSON anteriores
Si conservas el directorio cache/ con los archivos .ast/.tok utilizados en
versiones anteriores, puedes importarlos a SQLitePlus con el siguiente flujo:
-
Define
SQLITE_DB_KEY(yCOBRA_DB_PATHsi deseas una ruta distinta). -
Ejecuta el script auxiliar desde la raíz del proyecto, indicando la carpeta donde se encuentran los archivos heredados:
python scripts/migrar_cache_sqliteplus.py --origen /ruta/al/cache
El script convierte cada hash almacenado en JSON y recrea los fragmentos en la tabla SQLite. Las ejecuciones posteriores reutilizarán esa información sin necesidad de reanalizar tus fuentes.
-
Verifica la migración listando el contenido con cualquier visor SQLite o ejecutando nuevamente
cobra cache --vacuumpara comprobar que la conexión se inicializa correctamente.
Tras la migración, los ficheros JSON pueden eliminarse si ya no son necesarios.
Generar documentación
Para obtener la documentación HTML puedes usar cobra docs o
make html desde la raíz del proyecto. El subcomando docs ejecuta
sphinx-apidoc y luego compila el HTML en la carpeta de salida configurada.
Puedes compilar la documentación de dos maneras:
-
Con la CLI de Cobra. Ejecuta
cobra docs. -
Con Make. Ejecuta
make htmlpara compilar los archivos ubicados endocs/frontend. -
Con pdoc. Para generar documentación de la API con pdoc, ejecuta
python scripts/generar_pdoc.py. El resultado se guardará en la carpeta de salida configurada para la API.
A partir de esta versión, la API se genera de forma automática antes de
cada compilación para mantener la documentación actualizada.
Para aprender a desarrollar plugins revisa
docs/frontend/plugin_dev.rst.
Para conocer en detalle la interfaz disponible consulta
docs/frontend/plugin_sdk.rst.
Análisis con CodeQL
Este proyecto cuenta con un workflow de GitHub Actions definido en
.github/workflows/codeql.yml. Dicho flujo se ejecuta en cada push y
pull request, inicializando CodeQL para el lenguaje Python y aplicando
reglas personalizadas ubicadas en .github/codeql/custom/.
Las reglas proporcionan comprobaciones adicionales sobre el AST y los transpiladores:
- ast-no-type-validation.ql verifica que las clases de nodos cuyo
nombre empieza por
Nodoincluyan validaciones de tipo en__post_init__. - missing-codegen-exception.ql detecta métodos
generate_codesin manejo de excepciones. - unsafe-eval-exec.ql avisa cuando se usa
evaloexecfuera del sandbox.
Para ejecutar el análisis de CodeQL de forma local puedes usar la CLI:
curl -L -o codeql.zip \
https://github.com/github/codeql-cli-binaries/releases/latest/download/codeql-linux64.zip
unzip codeql.zip
./codeql/codeql database create db-python --language=python --source-root=.
./codeql/codeql database analyze db-python \
.github/codeql/custom/codeql-config.yml
Esto te permitirá validar los cambios antes de subirlos al repositorio.
Hitos y Roadmap
El proyecto avanza en versiones incrementales. Puedes consultar las tareas planeadas en ROADMAP.md.
Contribuciones
Las contribuciones son bienvenidas. Si deseas contribuir, sigue estos pasos:
- Haz un fork del proyecto.
- Crea una nueva rama (
git checkout -b feature/nueva-caracteristica). - Las ramas que comiencen con
feature/,bugfix/odoc/recibirán etiquetas automáticas al abrir un pull request. - Sigue las convenciones de estilo indicadas en
CONTRIBUTING.md(formateo conblack, longitud máxima de línea 88 y uso deruff,mypyybandit). - Realiza tus cambios y haz commit (
git commit -m 'Añadir nueva característica'). - Ejecuta
make lintpara verificar el código con ruff, mypy y bandit.banditanalizará el directoriosrc. - Ejecuta
make typecheckpara la verificación estática con mypy (y opcionalmente pyright si está instalado). - Ejecuta primero el smoke de sintaxis con
python scripts/smoke_syntax.py(delegación apcobra.cobra.qa.syntax_validationcon perfilsolo-cobra). - Ejecuta
python scripts/smoke_transpilers_syntax.pypara transpilación + validación sintáctica cruzada de los 8 targets oficiales; este script también delega en la misma API unificada (pcobra.cobra.qa.syntax_validation, perfiltranspiladores). - Ejecuta
make secretspara buscar credenciales expuestas usando gitleaks. - Para lanzar todas las validaciones en un solo paso ejecuta
python scripts/check.py. Este script corre primerosmoke_syntax.py, luegosmoke_transpilers_syntax.py, y después ruff, mypy, bandit, pyright y pytest. Orden recomendado: (1) smoke sintaxis, (2) smoke transpiladores, (3) lint/tipos, (4) pruebas unitarias/integración. El umbral de cobertura que aplicapytestse toma depyproject.toml(tool.coverage.report.fail_under), igual que en CI. - El CI de GitHub Actions ejecuta automáticamente estas herramientas en cada pull request;
para reproducir localmente la validación completa del pipeline usa
python scripts/check.py. - Flujo recomendado para validar local + CI parity:
python scripts/smoke_syntax.pypython scripts/smoke_transpilers_syntax.pypython scripts/check.pyEn CI, este mismo orden se conserva dentro del gate principal (smoke sintaxis, smoke transpiladores, lint/tipos y pruebas), por lo quescripts/check.pyes la referencia para reproducir el pipeline completo en desarrollo local.
- CI además ejecuta
python scripts/ci/validate_syntax_report_contract.pypara bloquear cambios del contrato JSON sin actualización de snapshot/documentación. - Envía un pull request.
- Consulta CONTRIBUTING.md para más detalles sobre cómo abrir issues y preparar pull requests.
- Para proponer nuevas extensiones consulta docs/frontend/rfc_plugins.rst.
Dependabot y seguridad
Este repositorio cuenta con Dependabot para mantener
actualizadas las dependencias de Python y las acciones de GitHub. Cada semana se
crean PR automáticos contra la rama work con las versiones más recientes.
Además, en el flujo de CI se incluye un paso de safety check que revisa la lista de paquetes instalados en busca de vulnerabilidades conocidas. Si se detecta alguna, la acción devolverá un reporte detallado y el trabajo fallará. Consulta el log del paso "Seguridad de dependencias" para ver los paquetes afectados y las recomendaciones de actualización. De igual forma, se ejecuta gitleaks para asegurarse de que no existan credenciales accidentales en el repositorio.
El repositorio también ejecuta CodeQL con reglas personalizadas para detectar
patrones de código riesgosos, como el uso de eval o exec fuera del sandbox.
Comunidad
Únete a nuestro servidor de Discord para recibir anuncios, resolver dudas y colaborar en el desarrollo en https://discord.gg/cobra. También contamos con un canal de Telegram y una cuenta de Twitter donde difundimos eventos y actualizaciones.
Desarrollo
Para verificar el tipado de forma local ejecuta:
mypy src
pyright
Tanto mypy como pyright utilizan la configuración presente en pyproject.toml.
Para ejecutar los linters puedes usar el comando de Make:
make lint
make secrets
El segundo comando ejecuta gitleaks para detectar posibles secretos en el repositorio.
Esto ejecutará ruff y mypy sobre src, y bandit revisará el directorio src. Si prefieres lanzar las herramientas de
manera individual utiliza:
ruff check src
mypy src
Desarrollo de plugins
La CLI puede ampliarse mediante plugins externos. Desde esta versión todo el SDK
de plugins se encuentra en src.cobra.cli.plugin. Para crear uno, define una clase
que herede de PluginCommand y declara el entry point en la sección
[project.entry-points."cobra.plugins"] de tu pyproject.toml. También es
necesario configurar un [build-system] moderno, como el basado en
setuptools:
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
[project.entry-points."cobra.plugins"]
saludo = "mi_paquete.mi_modulo:SaludoCommand"
Tras instalar el paquete con pip install -e ., Cobra detectará automáticamente
el nuevo comando.
Ejemplo de plugin
from cobra.cli.plugin import PluginCommand
class HolaCommand(PluginCommand):
name = "hola"
version = "1.0"
author = "Tu Nombre"
description = "Dice hola desde un plugin"
def register_subparser(self, subparsers):
parser = subparsers.add_parser(self.name, help="Muestra un saludo")
parser.set_defaults(cmd=self)
def run(self, args):
print("¡Hola desde un plugin!")
Extensión para VS Code
La extensión para Visual Studio Code se encuentra en extensions/vscode. Instala las dependencias con npm install. Desde VS Code puedes pulsar F5 para probarla o ejecutar vsce package para generar el paquete .vsix. Consulta extensions/vscode/README.md para más detalles.
Versionado Semántico
Este proyecto sigue el esquema SemVer. Los numeros se interpretan como Mayor.Menor.Parche. Cada incremento de version refleja cambios compatibles o rupturas segun esta norma.
Historial de Cambios
- Versión 10.0.12: migración de la caché incremental a SQLitePlus, nuevos helpers (
grupo_tareas,reintentar_async,prefijo_comun,interpolar,envolver_modular) y soporte Parquet/Feather en la biblioteca estándar.
Publicar una nueva versión
Al crear y subir una etiqueta vX.Y.Z se ejecuta el workflow release.yml, que construye el paquete, los ejecutables y la imagen Docker.
El workflow Deploy Docs generará la documentación cuando haya un push en main o al etiquetar una nueva versión.
Consulta la guía de lanzamiento para más detalles sobre el etiquetado, secretos y el flujo de la pipeline.
git tag v10.0.12
git push origin v10.0.12
Para más información consulta el CHANGELOG y la configuración de GitHub Actions.
Lenguajes soportados
- python
- rust
- javascript
Los targets go/cpp/java/wasm/asm se mantienen únicamente para migración interna y pruebas de regresión. Su detalle vive en docs/migracion_targets_retirados.md y documentos de histórico/compatibilidad.
Esta lista pública debe mantenerse sincronizada con la documentación en inglés. Consulta la traducción al inglés para más detalles.
Separación normativa resumida: consulta el bloque generado al inicio de este README y la fuente canónica en docs/targets_policy.md.
Licencia
Este proyecto está bajo la Licencia MIT.
Notas
- Documentación y Ejemplos Actualizados: El README ha sido actualizado para reflejar las capacidades de transpilación. Consulta la sección Lenguajes soportados para ver la lista de lenguajes compatibles.
- Ejemplos de Código y Nuevas Estructuras: Incluye ejemplos con el uso de estructuras avanzadas como clases y diccionarios en el lenguaje Cobra.
Si deseas agregar o modificar algo, házmelo saber.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pcobra-10.1.1.tar.gz.
File metadata
- Download URL: pcobra-10.1.1.tar.gz
- Upload date:
- Size: 604.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
75ca4fb7cd8f5695fbf615473072f5beff44be2053caecffbe77a364231e53db
|
|
| MD5 |
39500400ef23427bc3e962765afc6aee
|
|
| BLAKE2b-256 |
30880565723ab3301fb15d382dcbc52659d41affca4280fef26b3b915157b27d
|
File details
Details for the file pcobra-10.1.1-py3-none-any.whl.
File metadata
- Download URL: pcobra-10.1.1-py3-none-any.whl
- Upload date:
- Size: 673.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e406f91797b9370282f6a251b4dee31724dd4ad0450bb3d2deba781530e1809a
|
|
| MD5 |
5895686a6d83b507134cb306f7c87d9a
|
|
| BLAKE2b-256 |
457e16e838f51ed8215a096b7bfbf48c612fdfe54bebe10c54841a59d059a52d
|