Switch from poetry to uv

This commit is contained in:
Antoine Bartuccio 2025-01-06 16:17:54 +01:00
parent 429df81ec9
commit 0c4d72e17a
21 changed files with 1940 additions and 2980 deletions

14
.envrc
View File

@ -1,14 +1,6 @@
if [[ ! -f pyproject.toml ]]; then
log_error 'No pyproject.toml found. Use `poetry new` or `poetry init` to create one first.'
if [[ ! -d .venv ]]; then
log_error 'No .venv folder found found. Use `uv sync` or `uv run` to create one first.'
exit 2
fi
local VENV=$(poetry env list --full-path | cut -d' ' -f1)
if [[ -z $VENV || ! -d $VENV/bin ]]; then
log_error 'No poetry virtual environment found. Use `poetry install` to create one first.'
exit 2
fi
export VIRTUAL_ENV=$VENV
export POETRY_ACTIVE=1
PATH_add "$VENV/bin"
. .venv/bin/activate

View File

@ -1,8 +0,0 @@
name: "Compile messages"
description: "Compile the gettext translation messages"
runs:
using: composite
steps:
- name: Setup project
run: poetry run ./manage.py compilemessages
shell: bash

View File

@ -9,43 +9,22 @@ runs:
packages: gettext
version: 1.0 # increment to reset cache
- name: Set up python
- name: Install uv
uses: astral-sh/setup-uv@v5
with:
version: "0.5.14"
enable-cache: true
cache-dependency-glob: "uv.lock"
- name: "Set up Python"
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Load cached Poetry installation
id: cached-poetry
uses: actions/cache@v3
with:
path: ~/.local
key: poetry-3 # increment to reset cache
- name: Install Poetry
if: steps.cached-poetry.outputs.cache-hit != 'true'
shell: bash
run: curl -sSL https://install.python-poetry.org | python3 - --version 1.8.5
- name: Check pyproject.toml syntax
shell: bash
run: poetry check
- name: Load cached dependencies
uses: actions/cache@v3
with:
path: ~/.cache/pypoetry
key: ${{ runner.os }}-poetry-${{ hashFiles('**/poetry.lock') }}
restore-keys: |
${{ runner.os }}-poetry-
python-version-file: ".python-version"
- name: Install dependencies
run: poetry install --with docs,tests
shell: bash
- name: Install xapian
run: poetry run ./manage.py install_xapian
run: uv run ./manage.py install_xapian
shell: bash
- name: Compile gettext messages
run: poetry run ./manage.py compilemessages
run: uv run ./manage.py compilemessages
shell: bash

View File

@ -1,10 +0,0 @@
name: "Setup xapian"
description: "Setup the xapian indexes"
runs:
using: composite
steps:
- name: Setup xapian index
run: |
mkdir -p /dev/shm/search_indexes
ln -s /dev/shm/search_indexes sith/search_indexes
shell: bash

View File

@ -29,14 +29,12 @@ jobs:
- name: Check out repository
uses: actions/checkout@v4
- uses: ./.github/actions/setup_project
- uses: ./.github/actions/setup_xapian
- uses: ./.github/actions/compile_messages
- name: Run tests
run: poetry run coverage run -m pytest -m "${{ matrix.pytest-mark }}"
run: uv run coverage run -m pytest -m "${{ matrix.pytest-mark }}"
- name: Generate coverage report
run: |
poetry run coverage report
poetry run coverage html
uv run coverage report
uv run coverage html
- name: Archive code coverage results
uses: actions/upload-artifact@v3
with:

View File

@ -18,4 +18,4 @@ jobs:
path: .cache
restore-keys: |
mkdocs-material-
- run: poetry run mkdocs gh-deploy --force
- run: uv run mkdocs gh-deploy --force

2
.gitignore vendored
View File

@ -8,7 +8,7 @@ pyrightconfig.json
dist/
.vscode/
.idea/
env/
.venv/
doc/html
data/
galaxy/test_galaxy_state.json

1
.python-version Normal file
View File

@ -0,0 +1 @@
3.12

View File

@ -127,7 +127,7 @@ class Command(BaseCommand):
# dumps and sales are linked to the same customers
# and or both ordered with the same key, so zipping them is valid
for dump, sale in zip(pending_dumps, sales):
for dump, sale in zip(pending_dumps, sales, strict=False):
dump.dump_operation = sale
AccountDump.objects.bulk_update(pending_dumps, ["dump_operation"])

View File

@ -726,7 +726,7 @@ class TestCounterStats(TestCase):
"nickname": user.nick_name,
"perm_sum": perm_time,
}
for user, perm_time in zip(users, perm_times)
for user, perm_time in zip(users, perm_times, strict=False)
]
def test_top_customer(self):
@ -741,7 +741,7 @@ class TestCounterStats(TestCase):
"nickname": user.nick_name,
"selling_sum": sale_amount,
}
for user, sale_amount in zip(users, sale_amounts)
for user, sale_amount in zip(users, sale_amounts, strict=False)
]

View File

@ -462,6 +462,6 @@ def test_update_balance():
# put everything at zero to be sure the amounts were wrong beforehand
customers_qs.update(amount=0)
customers_qs.update_amount()
for customer, amount in zip(customers, [40, 10, 20, 40, 0]):
for customer, amount in zip(customers, [40, 10, 20, 40, 0], strict=False):
customer.refresh_from_db()
assert customer.amount == amount

View File

@ -311,16 +311,16 @@ pour savoir tout ce qui ne fonctionne pas,
et surtout pour récolter toutes les informations
nécessaires à la réparation des bugs.
### Poetry
### UV
[Utiliser Poetry](https://python-poetry.org/docs/basic-usage/)
[UV](https://docs.astral.sh/uv/)
Poetry est un utilitaire qui permet de créer et gérer
UV est un utilitaire qui permet de créer et gérer
des environnements Python de manière simple et intuitive.
Il permet également de gérer et mettre à jour
le fichier de dépendances.
L'avantage d'utiliser poetry
L'avantage d'utiliser uv
(et les environnements virtuels en général)
est de pouvoir gérer plusieurs projets différents
en parallèle puisqu'il permet d'avoir sur sa
@ -329,7 +329,7 @@ donc plusieurs versions d'une même dépendance
dans plusieurs projets différents sans impacter
le système sur lequel le tout est installé.
Poetry possède également l'avantage par rapport à un simple venv
UV possède également l'avantage par rapport à un simple venv
que les versions exactes de toutes les dépendances,
y compris celles utilisées par d'autres dépendances,
sont consignées dans un fichier `.lock`.
@ -338,10 +338,15 @@ configurés avec le même fichier lock utiliseront
exactement les mêmes versions des mêmes dépendances,
y compris si celles-ci ne sont pas indiquées explicitement.
Les dépendances utilisées par poetry sont déclarées
UV se charge même de télécharger la bonne version de Python
automatiquement !
Les dépendances utilisées par uv sont déclarées
dans le fichier `pyproject.toml`,
situé à la racine du projet.
Aussi, uv est rapide, genre TRÈS TRÈS rapide ⚡️
### Ruff
[Site officiel](https://astral.sh/ruff)

View File

@ -41,6 +41,7 @@ l'éditer et enfin le compiler au format binaire pour qu'il soit lu par le serve
./manage.py makemessages \
--locale=fr \
-e py,jinja \
--ignore=.venv \
--ignore=node_modules \
--add-location=file
@ -49,6 +50,7 @@ l'éditer et enfin le compiler au format binaire pour qu'il soit lu par le serve
--locale=fr \
-d djangojs \
-e js,ts \
--ignore=.venv \
--ignore=node_modules \
--ignore=staticfiles/generated \
--add-location=file

View File

@ -52,11 +52,11 @@ Pour gérer ça plus simplement,
nous utilisons le logiciel python [pre-commit](https://pre-commit.com/)
qui permet de contrôller leur installation via un fichier yaml.
Le logiciel est installé par défaut par poetry.
Le logiciel est installé par défaut par uv.
Il suffit ensuite de lancer :
```bash
pre-commit install
uv run pre-commit install
```
Une fois que vous avez fait cette commande, pre-commit
tournera automatiquement chaque fois que vous ferez
@ -65,7 +65,7 @@ un nouveau commit.
Il est également possible d'appeler soi-même les pre-commits :
```bash
pre-commit run --all-files
uv run pre-commit run --all-files
```
@ -80,8 +80,8 @@ pre-commit run --all-files
Pour utiliser Ruff, placez-vous à la racine du projet et lancez la commande suivante :
```bash
ruff format # pour formatter le code
ruff check # pour linter le code
uv run ruff format # pour formatter le code
uv run ruff check # pour linter le code
```
Ruff va alors faire son travail sur l'ensemble du projet puis vous dire

View File

@ -64,10 +64,10 @@ Commencez par installer les dépendances système :
source ~/.zshrc
```
Puis, installez les dépendances poetry nécessaires en prod :
Puis, installez les dépendances nécessaires en prod :
```bash
poetry install --with prod
uv sync --group prod
```
!!! info
@ -158,7 +158,7 @@ DATABASES = {
Enfin, créez vos données :
```bash
poetry run ./manage.py populate
uv run ./manage.py populate
```
!!! note
@ -253,7 +253,7 @@ Enfin, démarrez le serveur Django :
```bash
cd /repertoire/du/projet
poetry run ./manage.py runserver 8001
uv run ./manage.py runserver 8001
```
Et c'est bon, votre reverse-proxy est prêt à tourner devant votre serveur.

View File

@ -2,11 +2,10 @@
Certaines dépendances sont nécessaires niveau système :
- poetry
- uv
- libssl
- libjpeg
- zlib1g-dev
- python
- gettext
### Installer WSL
@ -62,26 +61,13 @@ cd /mnt/<la_lettre_du_disque>/vos/fichiers/comme/dhab
sudo apt upgrade
```
Puis, si ce n'est pas déjà fait, installez Python :
```bash
sudo apt install python3
# on sait jamais
sudo apt install python-is-python3
```
Si vous utilisez Ubuntu 22.04 ou Ubuntu 24.04,
votre version de Python devrait être compatible
par défaut avec celle du projet.
Si ce n'est pas le cas, nous vous conseillons
d'utiliser [pyenv](https://github.com/pyenv/pyenv)
Puis installez les autres dépendances :
Installez les dépendances :
```bash
sudo apt install build-essential libssl-dev libjpeg-dev zlib1g-dev python-dev npm \
libffi-dev python-dev-is-python3 pkg-config \
gettext git pipx
sudo apt install uv build-essential libssl-dev \
libjpeg-dev zlib1g-dev npm libffi-dev pkg-config \
gettext git
pipx install poetry==1.8.5
```
=== "Arch Linux"
@ -89,9 +75,7 @@ cd /mnt/<la_lettre_du_disque>/vos/fichiers/comme/dhab
```bash
sudo pacman -Syu # on s'assure que les dépôts et le système sont à jour
sudo pacman -S python
sudo pacman -S gcc git gettext pkgconf python-poetry npm
sudo pacman -S uv gcc git gettext pkgconf npm
```
=== "macOS"
@ -100,8 +84,7 @@ cd /mnt/<la_lettre_du_disque>/vos/fichiers/comme/dhab
Il est également nécessaire d'avoir installé xcode
```bash
brew install git python pipx npm
pipx install poetry==1.8.5
brew install git uv npm
# Pour bien configurer gettext
brew link gettext # (suivez bien les instructions supplémentaires affichées)
@ -111,6 +94,10 @@ cd /mnt/<la_lettre_du_disque>/vos/fichiers/comme/dhab
Si vous rencontrez des erreurs lors de votre configuration, n'hésitez pas à vérifier l'état de votre installation homebrew avec :code:`brew doctor`
!!!note
Python ne fait pas parti des dépendances puisqu'il est automatiquement
installé par uv.
## Finaliser l'installation
@ -122,9 +109,8 @@ git clone https://github.com/ae-utbm/sith.git
cd sith
# Création de l'environnement et installation des dépendances
poetry install # Dépendances backend
npm install # Dépendances frontend
poetry run ./manage.py install_xapian
npm install # Dépendances frontend
uv run ./manage.py install_xapian # Dépendances backend
```
!!!note
@ -149,19 +135,16 @@ echo 'SITH_URL = "localhost:8000"' >> sith/settings_custom.py
Enfin, nous pouvons lancer les commandes suivantes :
```bash
# Activation de l'environnement virtuel
poetry shell
# Prépare la base de données
python ./manage.py setup
uv run ./manage.py setup
# Installe les traductions
python ./manage.py compilemessages
uv run ./manage.py compilemessages
```
!!!note
Pour éviter d'avoir à utiliser la commande `poetry shell`
Pour éviter d'avoir à utiliser la commande `uv run`
systématiquement, il est possible de consulter [direnv](../howto/direnv.md).
## Démarrer le serveur de développement
@ -172,7 +155,7 @@ et se placer à la racine du projet.
Il suffit ensuite d'utiliser cette commande :
```bash
python manage.py runserver
uv run ./manage.py runserver
```
!!!note
@ -198,14 +181,8 @@ Cette commande génère la documentation à
chacune de ses modifications,
inutile de relancer le serveur à chaque fois.
!!!note
Les dépendances pour la documentation sont optionnelles.
Avant de commencer à travailler sur la doc, il faut donc les installer
avec la commande `poetry install --with docs`
```bash
mkdocs serve
uv run mkdocs serve
```
## Lancer les tests
@ -215,13 +192,13 @@ la commande suivante :
```bash
# Lancer tous les tests
pytest
uv run pytest
# Lancer les tests de l'application core
pytest core
uv run pytest core
# Lancer les tests de la classe UserRegistrationTest de core
pytest core/tests/tests_core.py::TestUserRegistration
uv run pytest core/tests/tests_core.py::TestUserRegistration
```
!!!note
@ -231,10 +208,10 @@ pytest core/tests/tests_core.py::TestUserRegistration
vous pouvez exécutez pytest ainsi :
```bash
pytest -m "not slow"
uv run pytest -m "not slow"
# vous pouvez toujours faire comme au-dessus
pytest core -m "not slow"
uv run pytest core -m "not slow"
```
A l'inverse, vous pouvez ne faire tourner que les tests

View File

@ -72,19 +72,20 @@ sith/
├── .gitattributes
├── .gitignore
├── .mailmap
├── .env.exemple
├── manage.py (26)
├── mkdocs.yml (27)
├── poetry.lock
├── uv.lock
├── pyproject.toml (28)
├── .venv/ (29)
├── .python-version (30)
└── README.md
```
</div>
1. Dossier contenant certaines actions réutilisables
dans des workflows Github. Par exemple, l'action
`setup-project` installe poetry puis appelle
la commande `poetry install`.
`setup-project` installe uv puis appelle
configure l'environnement de développement
2. Dossier contenant les fichiers de configuration
des workflows Github.
Par exemple, le workflow `docs.yml` compile
@ -127,6 +128,8 @@ sith/
avec ses plugins et sa table des matières.
28. Le fichier où sont déclarés les dépendances et la configuration
de certaines d'entre elles.
29. Dossier d'environnement virtuel généré par uv
30. Fichier qui contrôle quel version de python utiliser pour le projet
## L'application principale

View File

@ -106,7 +106,7 @@ class Basket(models.Model):
products = Product.objects.filter(id__in=ids).order_by("id")
# items and products are sorted in the same order
sales = []
for item, product in zip(items, products):
for item, product in zip(items, products, strict=False):
sales.append(
Selling(
label=product.name,

2758
poetry.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -1,91 +1,86 @@
[tool.poetry]
[project]
name = "Sith"
version = "3"
description = "Le web Sith de l'AE"
readme = "README.md"
authors = [
"Skia <skia@hya.sk>",
"klmp200 <antoine@bartuccio.fr>",
"Krophil <pierre.brunet@krophil.fr>",
"Maréchal <thgirod@hotmail.com>",
"Och <francescowitz68@gmail.com>",
"tleb <tleb@openmailbox.org>",
"Soldat <ryan-68@live.fr>",
"Nabos <gnikwo@hotmail.com>",
"Terre <jbaptiste.lenglet+git@gmail.com>",
"Lo-J <renaudg779@gmail.com>",
"Vial <robin.trioux@utbm.fr>"
{name = "Skia", email = "skia@hya.sk"},
{name = "klmp200", email = "antoine@bartuccio.fr"},
{name = "Krophil", email = "pierre.brunet@krophil.fr"},
{name = "Maréchal", email = "thgirod@hotmail.com"},
{name = "Och", email = "francescowitz68@gmail.com"},
{name = "tleb", email = "tleb@openmailbox.org"},
{name = "Soldat", email = "ryan-68@live.fr"},
{name = "Nabos", email = "gnikwo@hotmail.com"},
{name = "Terre", email = "jbaptiste.lenglet+git@gmail.com"},
{name = "Lo-J", email = "renaudg779@gmail.com"},
{name = "Vial", email = "robin.trioux@utbm.fr"},
]
documentation = "https://sith-ae.readthedocs.io/"
license = {text = "GPL-3.0-only"}
requires-python = "<4.0,>=3.12"
dependencies = [
"Django<5.0.0,>=4.2.17",
"django-ninja<2.0.0,>=1.3.0",
"django-ninja-extra<1.0.0,>=0.21.8",
"Pillow<12.0.0,>=11.0.0",
"mistune<4.0.0,>=3.0.2",
"django-jinja<3.0.0,>=2.11.0",
"cryptography<45.0.0,>=44.0.0",
"django-phonenumber-field<9.0.0,>=8.0.0",
"phonenumbers<9.0.0,>=8.13.52",
"reportlab<5.0.0,>=4.2.5",
"django-haystack<4.0.0,>=3.3.0",
"xapian-haystack<4.0.0,>=3.1.0",
"libsass<1.0.0,>=0.23.0",
"django-ordered-model<4.0.0,>=3.7.4",
"django-simple-captcha<1.0.0,>=0.6.0",
"python-dateutil<3.0.0.0,>=2.9.0.post0",
"sentry-sdk<3.0.0,>=2.19.2",
"Jinja2<4.0.0,>=3.1.4",
"django-countries<8.0.0,>=7.6.1",
"dict2xml<2.0.0,>=1.7.6",
"Sphinx<6,>=5",
"tomli<3.0.0,>=2.2.1",
"django-honeypot<2.0.0,>=1.2.1",
"pydantic-extra-types<3.0.0,>=2.10.1",
"ical<9.0.0,>=8.3.0",
]
[project.urls]
homepage = "https://ae.utbm.fr/"
license = "GPL-3.0-only"
documentation = "https://sith-ae.readthedocs.io/"
[tool.poetry.dependencies]
python = "^3.12"
Django = "^4.2.17"
django-ninja = "^1.3.0"
django-ninja-extra = "^0.21.8"
Pillow = "^11.0.0"
mistune = "^3.0.2"
django-jinja = "^2.11.0"
cryptography = "^44.0.0"
django-phonenumber-field = "^8.0.0"
phonenumbers = "^8.13.52"
reportlab = "^4.2.5"
django-haystack = "^3.3.0"
xapian-haystack = "^3.1.0"
libsass = "^0.23.0"
django-ordered-model = "^3.7.4"
django-simple-captcha = "^0.6.0"
python-dateutil = "^2.9.0.post0"
sentry-sdk = "^2.19.2"
Jinja2 = "^3.1.4"
django-countries = "^7.6.1"
dict2xml = "^1.7.6"
Sphinx = "^5" # Needed for building xapian
tomli = "^2.2.1"
django-honeypot = "^1.2.1"
pydantic-extra-types = "^2.10.1"
ical = "^8.3.0"
[dependency-groups]
prod = [
"psycopg[c]<4.0.0,>=3.2.3",
"redis[hiredis]<6.0.0,>=5.2.0",
]
dev = [
"django-debug-toolbar<5.0.0,>=4.4.6",
"ipython<9.0.0,>=8.30.0",
"pre-commit<5.0.0,>=4.0.1",
"ruff<1.0.0,>=0.8.3",
"djhtml<4.0.0,>=3.0.7",
"faker<34.0.0,>=33.1.0",
"rjsmin<2.0.0,>=1.2.3",
]
tests = [
"freezegun<2.0.0,>=1.5.1",
"pytest<9.0.0,>=8.3.4",
"pytest-cov<7.0.0,>=6.0.0",
"pytest-django<5.0.0,>=4.9.0",
"model-bakery<2.0.0,>=1.20.0",
]
docs = [
"mkdocs<2.0.0,>=1.6.1",
"mkdocs-material<10.0.0,>=9.5.47",
"mkdocstrings<1.0.0,>=0.27.0",
"mkdocstrings-python<2.0.0,>=1.12.2",
"mkdocs-include-markdown-plugin<8.0.0,>=7.1.2",
]
[tool.poetry.group.prod.dependencies]
# deps used in prod, but unnecessary for development
# The C extra triggers compilation against system libs during install.
# Removing it would switch psycopg to a slower full-python implementation
psycopg = {extras = ["c"], version = "^3.2.3"}
redis = {extras = ["hiredis"], version = "^5.2.0"}
[tool.poetry.group.prod]
optional = true
[tool.poetry.group.dev.dependencies]
# deps used for development purposes, but unneeded in prod
django-debug-toolbar = "^4.4.6"
ipython = "^8.30.0"
pre-commit = "^4.0.1"
ruff = "^0.8.3" # Version used in pipeline is controlled by pre-commit hooks in .pre-commit.config.yaml
djhtml = "^3.0.7"
faker = "^33.1.0"
rjsmin = "^1.2.3"
[tool.poetry.group.tests.dependencies]
# deps used for testing purposes
freezegun = "^1.5.1" # used to test time-dependent code
pytest = "^8.3.4"
pytest-cov = "^6.0.0"
pytest-django = "^4.9.0"
model-bakery = "^1.20.0"
[tool.poetry.group.docs.dependencies]
# deps used to work on the documentation
mkdocs = "^1.6.1"
mkdocs-material = "^9.5.47"
mkdocstrings = "^0.27.0"
mkdocstrings-python = "^1.12.2"
mkdocs-include-markdown-plugin = "^7.1.2"
[tool.poetry.group.docs]
optional = true
[tool.uv]
default-groups = ["dev", "tests", "docs"]
[tool.xapian]
version = "1.4.25"
@ -131,7 +126,3 @@ convention = "google"
DJANGO_SETTINGS_MODULE = "sith.settings"
python_files = ["tests.py", "test_*.py", "*_tests.py"]
markers = ["slow"]
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

1788
uv.lock generated Normal file

File diff suppressed because it is too large Load Diff