Migrate poetry to uv (#337)

This commit is contained in:
Stan Triepels
2026-08-01 05:11:49 +02:00
committed by GitHub
parent 0e4c163d79
commit ea839ab664
8 changed files with 1426 additions and 1644 deletions

View File

@@ -23,9 +23,11 @@ jobs:
run: | run: |
sudo apt-get update sudo apt-get update
sudo apt-get -y install gettext sudo apt-get -y install gettext
python -m pip install pip setuptools django poetry pip install uv==0.12.1 django==5.2
# compile messages to get .mo files # compile messages to get .mo files
django-admin compilemessages uv run django-admin compilemessages
- name: Build and publish package - name: Build and publish package
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags')
run: poetry --build --username=__token__ --password=${{ secrets.PYPI_TOKEN }} publish run: |
uv build
uv publish --token ${{ secrets.PYPI_TOKEN }}

View File

@@ -86,13 +86,12 @@ jobs:
python-version: ${{ matrix.python-version }} python-version: ${{ matrix.python-version }}
- name: Install dependencies with Django ${{ matrix.django }} - name: Install dependencies with Django ${{ matrix.django }}
run: | run: |
python -m pip install --upgrade pip python -m pip install uv==0.12.1
pip install poetry==1.8.5 uv sync --extra testing --python ${{ matrix.python-version }}
poetry add "django~=${{ matrix.django }}a1" --python=${{ matrix.python-version }} uv pip install "django~=${{ matrix.django }}a1"
poetry install -E testing
- name: Run Tests - name: Run Tests
run: | run: |
poetry run pytest --cov=./django_q --cov-report=xml uv run pytest --cov=./django_q --cov-report=xml
env: env:
MONGO_HOST: "127.0.0.1" MONGO_HOST: "127.0.0.1"
REDIS_HOST: "127.0.0.1" REDIS_HOST: "127.0.0.1"

View File

@@ -1,5 +1,5 @@
# Sets the python version # Sets the python version
FROM python:3.9-slim-bookworm FROM python:3.13-slim-bookworm
# Allows the logs generated by python apps to be rendered in the terminal # Allows the logs generated by python apps to be rendered in the terminal
ENV PYTHONUNBUFFERED 1 ENV PYTHONUNBUFFERED 1
@@ -9,20 +9,13 @@ ENV SHELL /bin/bash
RUN set -ex \ RUN set -ex \
&& apt update \ && apt update \
&& apt-get install gcc python3-dev --yes && apt-get install gcc gettext python3-dev --yes
# Upgrades pip # Install UV
RUN pip install -U pip setuptools RUN pip install uv==0.12.1
# Install poetry
RUN pip install poetry==1.8.2
WORKDIR /app WORKDIR /app
COPY . . COPY . .
RUN poetry lock --no-update RUN uv sync --extra testing
RUN poetry config virtualenvs.create false
RUN poetry install -E testing

View File

@@ -1,21 +1,31 @@
dev: dev:
docker compose -f web-docker-compose.yaml up docker compose -f web-docker-compose.yaml up
build-test:
docker compose -f test-services-docker-compose.yaml build --no-cache
lock:
docker compose -f test-services-docker-compose.yaml run --rm django-q2 uv lock
test: test:
docker compose -f test-services-docker-compose.yaml run --rm django-q2 poetry run pytest docker compose -f test-services-docker-compose.yaml run --rm django-q2 uv run pytest
shell: shell:
docker compose -f test-services-docker-compose.yaml run --rm django-q2 poetry run python manage.py shell docker compose -f test-services-docker-compose.yaml run --rm django-q2 uv run python manage.py shell
makemigrations: makemigrations:
docker compose -f test-services-docker-compose.yaml run --rm django-q2 poetry run python manage.py makemigrations docker compose -f test-services-docker-compose.yaml run --rm django-q2 uv run python manage.py makemigrations
migrate: migrate:
docker compose -f test-services-docker-compose.yaml run --rm django-q2 poetry run python manage.py migrate docker compose -f test-services-docker-compose.yaml run --rm django-q2 uv run python manage.py migrate
build-package:
docker compose -f test-services-docker-compose.yaml run --rm django-q2 uv run django-admin compilemessages
docker compose -f test-services-docker-compose.yaml run --rm django-q2 uv build
createsuperuser: createsuperuser:
docker compose -f web-docker-compose.yaml run --rm web python manage.py createsuperuser docker compose -f web-docker-compose.yaml run --rm web python manage.py createsuperuser
format: format:
docker compose -f test-services-docker-compose.yaml run --rm django-q2 poetry run ruff format . docker compose -f test-services-docker-compose.yaml run --rm django-q2 uv run ruff format .
docker compose -f test-services-docker-compose.yaml run --rm django-q2 poetry run ruff check . --fix docker compose -f test-services-docker-compose.yaml run --rm django-q2 uv run ruff check . --fix

View File

@@ -97,7 +97,9 @@ def monitor(run_once=False, broker=None):
for stat in stats: for stat in stats:
status = stat.status status = stat.status
# color status # color status
if stat.status == Conf.WORKING: if stat.status == Conf.STARTING:
status = term.yellow(str(Conf.STARTING))
elif stat.status == Conf.WORKING:
status = term.green(str(Conf.WORKING)) status = term.green(str(Conf.WORKING))
elif stat.status == Conf.STOPPING: elif stat.status == Conf.STOPPING:
status = term.yellow(str(Conf.STOPPING)) status = term.yellow(str(Conf.STOPPING))
@@ -105,6 +107,8 @@ def monitor(run_once=False, broker=None):
status = term.red(str(Conf.STOPPED)) status = term.red(str(Conf.STOPPED))
elif stat.status == Conf.IDLE: elif stat.status == Conf.IDLE:
status = str(Conf.IDLE) status = str(Conf.IDLE)
else:
status = _("Unknown")
# color q's # color q's
tasks = str(stat.task_q_size) tasks = str(stat.task_q_size)
if stat.task_q_size > 0: if stat.task_q_size > 0:
@@ -114,10 +118,14 @@ def monitor(run_once=False, broker=None):
results = stat.done_q_size results = stat.done_q_size
if results > 0: if results > 0:
results = term.cyan(str(results)) results = term.cyan(str(results))
else:
results = str(results)
# color workers # color workers
workers = len(stat.workers) workers = len(stat.workers)
if workers < Conf.WORKERS: if workers < Conf.WORKERS:
workers = term.yellow(str(workers)) workers = term.yellow(str(workers))
else:
workers = str(workers)
# format uptime # format uptime
uptime = (timezone.now() - stat.tob).total_seconds() uptime = (timezone.now() - stat.tob).total_seconds()
hours, remainder = divmod(uptime, 3600) hours, remainder = divmod(uptime, 3600)
@@ -150,7 +158,7 @@ def monitor(run_once=False, broker=None):
) )
print( print(
term.move(i, 6 * col_width) term.move(i, 6 * col_width)
+ term.center(stat.reincarnations, width=col_width - 1) + term.center(str(stat.reincarnations), width=col_width - 1)
) )
print( print(
term.move(i, 7 * col_width) term.move(i, 7 * col_width)
@@ -411,27 +419,29 @@ def memory(run_once=False, workers=False, broker=None):
) )
print( print(
term.move(row, 2 * col_width) term.move(row, 2 * col_width)
+ term.center(memory_available_percentage, width=col_width - 1) + term.center(str(memory_available_percentage), width=col_width - 1)
) )
print( print(
term.move(row, 3 * col_width) term.move(row, 3 * col_width)
+ term.center(memory_available, width=col_width - 1) + term.center(str(memory_available), width=col_width - 1)
) )
print( print(
term.move(row, 4 * col_width) term.move(row, 4 * col_width)
+ term.center( + term.center(
round(psutil.virtual_memory().total / 1024**2, 2), str(round(psutil.virtual_memory().total / 1024**2, 2)),
width=col_width - 1, width=col_width - 1,
) )
) )
print( print(
term.move(row, 5 * col_width) term.move(row, 5 * col_width)
+ term.center(get_process_mb(stat.sentinel), width=col_width - 1) + term.center(
str(get_process_mb(stat.sentinel)), width=col_width - 1
)
) )
print( print(
term.move(row, 6 * col_width) term.move(row, 6 * col_width)
+ term.center( + term.center(
get_process_mb(getattr(stat, "monitor", None)), str(get_process_mb(getattr(stat, "monitor", None))),
width=col_width - 1, width=col_width - 1,
) )
) )
@@ -444,7 +454,7 @@ def memory(run_once=False, workers=False, broker=None):
print( print(
term.move(row, 7 * col_width) term.move(row, 7 * col_width)
+ term.center( + term.center(
workers_mb or "NO_PROCESSES_FOUND", width=col_width - 1 str(workers_mb or "NO_PROCESSES_FOUND"), width=col_width - 1
) )
) )
row += 1 row += 1
@@ -476,7 +486,7 @@ def memory(run_once=False, workers=False, broker=None):
mb_used = get_process_mb(worker_pid) mb_used = get_process_mb(worker_pid)
print( print(
term.move(row, (idx + 1) * col_width) term.move(row, (idx + 1) * col_width)
+ term.center(mb_used, width=col_width - 1) + term.center(str(mb_used), width=col_width - 1)
) )
row += 1 row += 1
row += 1 row += 1

1536
poetry.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,91 +1,87 @@
[build-system] [build-system]
requires = ["poetry-core>=1.0.0"] requires = ["uv_build>=0.10.7,<=0.12.1"]
build-backend = "poetry.core.masonry.api" build-backend = "uv_build"
[tool.poetry] [project]
name = "django-q2" name = "django-q2"
version = "1.10.0" version = "1.10.0"
packages = [ packages = [
{ include = "django_q" }, { include = "django_q" },
] ]
description = "A multiprocessing distributed task queue for Django" description = "A multiprocessing distributed task queue for Django"
authors = ["Stan Triepels <django-q2@stantriepels.com>", "Ilan Steemers <koed00@gmail.com>"] authors = [
maintainers = ["Stan Triepels <django-q2@stantriepels.com>"] { name = "Stan Triepels", email = "django-q2@stantriepels.com" },
{ name = "Ilan Steemers", email = "koed00@gmail.com" },
]
requires-python = ">=3.9,<4"
readme = "README.rst"
license = "MIT" license = "MIT"
readme = 'README.rst' maintainers = [{ name = "Stan Triepels", email = "django-q2@stantriepels.com" }]
keywords = [
repository = "https://github.com/GDay/django-q2" "django",
homepage = "https://django-q2.readthedocs.org" "distributed",
documentation = "https://django-q2.readthedocs.org" "multiprocessing",
"queue",
keywords = ["django", "distributed", "multiprocessing", "queue", "scheduler"] "scheduler",
]
classifiers = [ classifiers = [
'Development Status :: 5 - Production/Stable', "Development Status :: 5 - Production/Stable",
'Environment :: Web Environment', "Environment :: Web Environment",
'Framework :: Django', "Framework :: Django",
'Intended Audience :: Developers', "Intended Audience :: Developers",
'License :: OSI Approved :: MIT License', "Operating System :: POSIX",
'Operating System :: POSIX', "Operating System :: MacOS",
'Operating System :: MacOS', "Programming Language :: Python",
'Programming Language :: Python', "Programming Language :: Python :: 3",
'Programming Language :: Python :: 3', "Programming Language :: Python :: 3.9",
'Programming Language :: Python :: 3.9', "Programming Language :: Python :: 3.10",
'Programming Language :: Python :: 3.10', "Programming Language :: Python :: 3.11",
'Programming Language :: Python :: 3.11', "Programming Language :: Python :: 3.12",
'Programming Language :: Python :: 3.12', "Programming Language :: Python :: 3.13",
'Programming Language :: Python :: 3.13', "Topic :: Internet :: WWW/HTTP",
'Topic :: Internet :: WWW/HTTP', "Topic :: System :: Distributed Computing",
'Topic :: System :: Distributed Computing', "Topic :: Software Development :: Libraries :: Python Modules",
'Topic :: Software Development :: Libraries :: Python Modules', "Programming Language :: Python :: 3.14",
]
dependencies = [
"django>=4.2",
"django-picklefield>=3.1,<4",
"importlib-metadata>=3.6 ; python_full_version < '3.10'",
] ]
include = [ [project.optional-dependencies]
{ path = "CHANGELOG.md", format = "sdist" }, testing = [
"django-redis",
"croniter",
"hiredis",
"psutil",
"iron-mq",
"boto3",
"pymongo",
"blessed",
"redis",
"setproctitle",
"pytest",
"pytest-django",
"pytest-cov",
"ruff",
] ]
[tool.poetry.plugins] # Optional super table
[tool.poetry.plugins."djangoq.errorreporters"]
"rollbar" = "django_q_rollbar:Rollbar"
"sentry" = "django_q_sentry:Sentry"
[tool.poetry.dependencies]
python = ">=3.9,<4"
django = ">=4.2"
django-picklefield = "^3.1"
blessed = { version = "^1.19.1", optional = true }
hiredis = { version = "^2.0.0", optional = true }
psutil = { version = "^5.9.2", optional = true }
django-redis = { version = "^5.2.0", optional = true }
iron-mq = { version = "^0.9", optional = true }
boto3 = { version = "^1.24.92", optional = true }
pymongo = { version = "^4.2.0", optional = true }
croniter = { version = "^2.0.1", optional = true }
django-q-rollbar = {version = ">=0.1", optional = true}
django-q-sentry = {version = ">=0.1", optional = true}
redis = {version = "^4.3.4", optional = true}
setproctitle = {version = "^1.3.2", optional = true}
importlib-metadata = {version = ">=3.6", python = "<3.10"}
[tool.poetry.dev-dependencies]
pytest = "^7.1.3"
pytest-django = "^4.5.2"
Sphinx = "^4.0.2"
pytest-cov = "^4.0.0"
ruff = "^0.4.4"
[tool.poetry.extras]
requires = ["poetry_core"]
build-backend = ["poetry.core.masonry.api"]
testing = ["django-redis", "croniter", "hiredis", "psutil", "iron-mq", "boto3", "pymongo", "blessed", "redis", "setproctitle"]
rollbar = ["django-q-rollbar"]
sentry = ["django-q-sentry"]
croniter = ["croniter"] croniter = ["croniter"]
[project.urls]
Homepage = "https://django-q2.readthedocs.org"
Repository = "https://github.com/GDay/django-q2"
Documentation = "https://django-q2.readthedocs.org"
[project.entry-points."djangoq.errorreporters"]
rollbar = "django_q_rollbar:Rollbar"
sentry = "django_q_sentry:Sentry"
[tool.uv.build-backend]
module-name = ["django_q"]
module-root = ""
source-include = ["CHANGELOG.md"]
[tool.isort] [tool.isort]
profile = "black" profile = "black"
multi_line_output = 3 multi_line_output = 3

1308
uv.lock generated Normal file

File diff suppressed because it is too large Load Diff