Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: actualiza a la nueva versión de uv #47

Merged
merged 18 commits into from
Sep 3, 2024
Merged

chore: actualiza a la nueva versión de uv #47

merged 18 commits into from
Sep 3, 2024

Conversation

albertotb
Copy link
Member

@albertotb albertotb commented Aug 22, 2024

uv ha añadido soporte para gestionar proyectos. Se prueba en esta PR

Relacionado: https://astral.sh/blog/uv-unified-python-packaging

EDIT:

De esos últimos hilos, probablemente queremos añadir el --frozen y el --no-locals cuando lo implementen.

Closes #43
Closes #48
Closes #49

@albertotb albertotb self-assigned this Aug 22, 2024
@albertotb albertotb changed the title Uv chore: actualiza a la nueva versión de uv Aug 22, 2024
Copy link

codecov bot commented Aug 22, 2024

Codecov Report

Attention: Patch coverage is 0% with 1 line in your changes missing coverage. Please review.

Project coverage is 56.52%. Comparing base (8349e19) to head (0208bb6).

Files with missing lines Patch % Lines
template/api.py 0.00% 1 Missing ⚠️
Additional details and impacted files
@@           Coverage Diff           @@
##             main      #47   +/-   ##
=======================================
  Coverage   56.52%   56.52%           
=======================================
  Files           4        4           
  Lines          46       46           
=======================================
  Hits           26       26           
  Misses         20       20           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Copy link
Member

@davidggphy davidggphy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

es el uv.lock dependiente del SO?

REspondido: SI
Critically, the lockfile is cross-platform, in that it can be used to install a given project on any platform, regardless of where it was generated. uv defines a unique solution for every platform, producing a readable and auditable lockfile that defines exactly which packages will be installed.

pyproject.toml Outdated Show resolved Hide resolved
uv.lock Outdated
@@ -0,0 +1,1585 @@
version = 1
requires-python = ">=3.9, <3.12"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

asumo que este archivo se crea automaticamente. De dónde sale lo de >=3.9, <3.12? es decir, se fija la versión a 3.11 en el .python-version, de dónde saca que es un rango?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Si. Sale de pyproject.toml. El .python-version es la versión recomendada de desarrollo. Se pueden poner varias en ese fichero también, pero a mi me gusta poner una. Hay dos casos de uso diferenciados:

  • librería/paquete: como doraemon. Queremos soportar varias versiones de Python, actualmente 3.9 - 3.12. En .python-version escribes una versión, actualmente la 3.11, que es la que se usa para desarrollar y ejecutar algunas herramientas. No importa mucho porque hay que escribir código Python compatible con todas y testear con todas.
  • aplicación. Aquí solo soportamos una versión de Python, que se escribe en el .python-version. En estos casos en pyproject.toml también hay que poner algo como >=3.11, <3.12, que solo es una versión. uv haría lo propio en uv.lock.

El resumen es que la versión de Python de .python-version es importante para aplicaciones, y pyproject.toml para librerías. Pero como ambos repos tienen ambos ficheros, hay que hacer los ajustes de arriba.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Muchas gracias, clarisimo. Entonces para un proyecto en particular hay que retocar el pyproject.toml. Viendo que el uso más común es proyecto más que librería, conviene cambiar el valor en pyproject.toml a >=3.11, <3.12?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Podríamos cambiarlo, pero si por ejemplo empezamos a usar Python 3.12 en los proyectos habría que editarlo después igualmente, con lo que tampoco veo mucha ganancia.

Copy link
Member

@davidggphy davidggphy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Una de las cosas que es útil cuando se está desarrollando, es que la propia librería se ejecuta en modo editable utilizando el pip install -e .

No consigo ver si eso está implementado en los cambios actuales.

Pero viene explicado el cómo hacerlo con fuentes externas aquí, pero en este caso me refiere a la propia librería. No sé si al ejecutar todo con uv run al vuelo coge lo existente.

@albertotb
Copy link
Member Author

Esto está todavía en fase experimental. Sobre el -e, si ejecutas las cosas con uv run no es problema porque regenera el fichero uv.lock e instala todo automáticamente, con lo que siempre tienes la última versión. No tengo claro que pasa si ejecutas sin uv run, activando el entorno manualmente.

@albertotb
Copy link
Member Author

albertotb commented Aug 23, 2024

@davidggphy Parece que uv sync instala la la librería de root, a la que hace referencia pyproject.toml en formato editable por defecto. Se puede comprobar con el siguiente experimento:

  • Instalar librería y dependencias con uv sync
  • Activar el venv
  • Comprobar que la librería es importable
  • Editar un fichero
  • Comprobar que la librería se ha actualizado

En la siguiente sesión entre el primer y segundo import se editó el fichero main.py añadiendo la string TEST y no se ejecutá ningún comando de uv (ni sync, ni run ni lock):

image

mypy usar por defecto la version de python desde donde se ejecuta
@davidggphy
Copy link
Member

@davidggphy Parece que uv sync instala la la librería de root, a la que hace referencia pyproject.toml en formato editable por defecto.

Perfecto, estaba pensando en el modo de desarrollo con notebooks y autoreload en el que vas editando algún módulo a la vez. Que para que funcione cuando tienes el proyecto como librería, debe estar en modo editable

@albertotb
Copy link
Member Author

@davidggphy Parece que uv sync instala la la librería de root, a la que hace referencia pyproject.toml en formato editable por defecto.

Perfecto, estaba pensando en el modo de desarrollo con notebooks y autoreload en el que vas editando algún módulo a la vez. Que para que funcione cuando tienes el proyecto como librería, debe estar en modo editable

Para notebooks solo hace falta añadir ipykernel, normalmente a las dependencias de desarrollo y VSCode detecta el kernel del venv automáticamente. Lo único que no funciona es intalar ipykernel con el prompt de VSCode, hay que hacerlo con la terminal.

@albertotb
Copy link
Member Author

Para solucionar #48 se usa la flag "system" en el hook de mypy en pre-commit. Eso quiere decir que hay que intalarlo explicitamente en la Action. Sin embargo, tiene pinta que ahora mismo en la Action uv está instalando las dependencias en un entorno virtual en lugar de en el Python del sistema, por lo que pre-commit no encuentra mypy.

Posible parche mientras aqui: astral-sh/uv#5964

@albertotb albertotb marked this pull request as ready for review September 3, 2024 15:44
@albertotb albertotb merged commit cba70ab into main Sep 3, 2024
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Reemplazar typer por typer-slim Ejecutar mypy en pre-commit Crear fichero .python-version
2 participants