Skip to main content

Semantic upgrade assistant and compatibility codemods for Python dependencies.

Project description

PyCompatRepair (pycomprepair)

CI License: Apache 2.0 Python versions Code style: ruff Checked with mypy

Asistente de upgrades semánticos y codemods de compatibilidad para dependencias Python.

pycomprepair analiza el código de tu proyecto frente a una versión actual y una versión objetivo de una librería, detecta call-sites incompatibles y aplica codemods verificables con --dry-run, diff legible y posibilidad de rollback.

A diferencia de herramientas como pyupgrade (solo sintaxis del lenguaje) o bump-pydantic (solo Pydantic v1→v2), pycomprepair está pensado como un núcleo extensible con un sistema de plugins por ecosistema. El MVP incluye:

  • Núcleo: extracción de firmas con griffe, detección de incompatibilidades, motor de codemods sobre libcst.
  • Plugin Pydantic v2: BaseSettings, Configmodel_config, @validator@field_validator, .dict().model_dump(), .parse_obj().model_validate(), etc.
  • Plugin FastAPI: deprecated on_eventlifespan, Depends con use_cache deprecated, etc.
  • Plugin SQLAlchemy 2.0: from sqlalchemy.ext.declarative import declarative_basesqlalchemy.orm, session.query(M).get(pk)session.get(M, pk), avisos sobre declarative_base() y Query.update/delete.
  • Plugin Django 5.0: smart_text/force_textsmart_str/force_str, ugettext*gettext*, aviso sobre django.utils.timezone.utc y Meta.index_together.
  • CLI (pycomprepair) con scan, repair, report.

Estado

Pre-alpha. Estamos construyendo el MVP.

Instalación (desde fuente, mientras no esté en PyPI)

uv venv
uv pip install -e ".[dev]"

Uso rápido

# Escanear el proyecto y detectar incompatibilidades
pycomprepair scan ./src --target "pydantic>=2.0,<3.0"

# Aplicar codemods en modo dry-run (muestra diff, no escribe)
pycomprepair repair ./src --target "pydantic>=2.0,<3.0" --dry-run

# Aplicar de verdad
pycomprepair repair ./src --target "pydantic>=2.0,<3.0"

# Generar reporte HTML/Markdown
pycomprepair report ./src --target "pydantic>=2.0,<3.0" --format markdown

Configuración por proyecto

Para evitar repetir --target y demás flags en cada llamada, PyCompatRepair lee configuración de un fichero pycomprepair.toml (o de una sección [tool.pycomprepair] en tu pyproject.toml). La búsqueda sube por los directorios padre desde la ruta que pases en la CLI, así que puedes ponerlo en la raíz del repo:

# pycomprepair.toml
target = "pydantic>=2.0,<3.0"
min_confidence = 0.8
unsafe_fixes = false
ignore = ["PYD002", "DJA004"]  # códigos de regla que no quieres ver

Equivalente dentro de pyproject.toml:

[tool.pycomprepair]
target = "pydantic>=2.0,<3.0"
ignore = ["PYD002"]

Los flags de la CLI tienen prioridad sobre la configuración, y la configuración sobre los valores por defecto. Con esto, pycomprepair scan ./src ya basta una vez configurado el proyecto.

Descubrimiento dinámico (discover)

Más allá de los plugins manuales, pycomprepair puede consultar la API real de un paquete instalado mediante griffe y avisarte de imports que ya no existen en esa versión. Es la forma más rápida de auditar tu código frente al venv objetivo:

# Crea un venv con la versión a la que quieres migrar
uv pip install "django==5.0.*"

# Encuentra imports rotos respecto a la Django instalada
pycomprepair discover ./src --package django

Cada importación cuyo símbolo no figura en la API cargada genera un issue DSC001. Esto cubre renombrados y eliminaciones que aún no están reflejados en los plugins escritos a mano y sirve como red de seguridad genérica.

Úsalo como GitHub Action

PyCompatRepair se distribuye también como composite action, así que puedes añadir un job de compatibilidad a cualquier repositorio Python en cinco líneas:

# .github/workflows/pycomprepair.yml
name: Compatibility check
on: [pull_request]
permissions:
  contents: read
  pull-requests: write  # solo si activas comment-on-pr

jobs:
  pycomprepair:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: alvaroo-fdez/pycomprepair@main
        with:
          path: src
          target: "pydantic>=2.0,<3.0"
          mode: scan            # "scan" (default) o "repair"
          fail-on-issues: "true"
          comment-on-pr: "true" # publica/actualiza un comentario idempotente

Inputs principales:

Input Default Descripción
path . Ruta a escanear/reparar.
target Requisito objetivo, p.ej. "pydantic>=2.0,<3.0".
mode scan scan solo detecta; repair además incluye diffs en el reporte.
fail-on-issues true Falla el job si se detectan incompatibilidades.
comment-on-pr false Publica/actualiza un comentario en el PR con el reporte (idempotente).
version Especificador opcional, p.ej. ==0.1.0 para fijar versión.
git-ref Instala desde un ref del repo (útil para probar cambios sin publicar).
skip-install false Salta la instalación si ya tienes pycomprepair en el PATH.

El reporte siempre se publica en el step summary del job; los outputs issues-count y report-path quedan disponibles para pasos posteriores.

Arquitectura

src/pycomprepair/
├── core/           # Diff de firmas, registro de plugins, modelos de issue
├── codemods/       # Helpers libcst reutilizables
├── plugins/        # Plugins por ecosistema (pydantic, fastapi, ...)
├── report/         # Renderers Markdown/HTML
└── cli.py          # CLI Typer

Licencia

Apache-2.0. Ver LICENSE.

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

pycomprepair-0.1.0.tar.gz (43.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pycomprepair-0.1.0-py3-none-any.whl (44.6 kB view details)

Uploaded Python 3

File details

Details for the file pycomprepair-0.1.0.tar.gz.

File metadata

  • Download URL: pycomprepair-0.1.0.tar.gz
  • Upload date:
  • Size: 43.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pycomprepair-0.1.0.tar.gz
Algorithm Hash digest
SHA256 6ebea08a8971884e368870f32c8df00d9e95c305bc2a6acf4093cb000b150b64
MD5 069bf044dc1091ea24b72f9fd1391882
BLAKE2b-256 f87345202aae8de3ead3a44e6ca3719314e4780ccc87387d854af6da008ed184

See more details on using hashes here.

Provenance

The following attestation bundles were made for pycomprepair-0.1.0.tar.gz:

Publisher: release.yml on alvaroo-fdez/pycomprepair

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pycomprepair-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: pycomprepair-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 44.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pycomprepair-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d5ce337306e23b52b99ed7ee101c56830d64817181f896e63db52dc3d8462d6a
MD5 be340e7190b6f563a3a191a792121189
BLAKE2b-256 b0ef37578c7888d4f187847b456048ae970678c89c492811d168760997d1c993

See more details on using hashes here.

Provenance

The following attestation bundles were made for pycomprepair-0.1.0-py3-none-any.whl:

Publisher: release.yml on alvaroo-fdez/pycomprepair

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page