Skip to content

Commit eb77ed2

Browse files
authored
Update Python version to 3.12 (#62)
* Update Python version to 3.12 * Update code for 3.12
1 parent 8b8140f commit eb77ed2

12 files changed

Lines changed: 26 additions & 97 deletions

File tree

.taskcluster.yml

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,12 @@ tasks:
3131
- tox
3232
jobs:
3333
include:
34-
- name: tests python 3.10 django 4.x
35-
version: "3.10"
36-
env:
37-
TOXENV: py310
38-
- name: tests python 3.11 django 4.x
39-
version: "3.11"
40-
env:
41-
TOXENV: py311
42-
- name: tests python 3.12 (no django)
34+
- name: tests python 3.12
4335
version: "3.12"
4436
env:
4537
TOXENV: py312
4638
- name: linting
47-
version: "3.9"
39+
version: "3.12"
4840
script:
4941
- bash
5042
- '-xec'

Dockerfile

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM node:18-alpine as frontend
1+
FROM node:18-alpine AS frontend
22

33
COPY server/frontend /src
44
RUN chown -R node:node /src
@@ -8,7 +8,7 @@ WORKDIR /src
88
RUN npm install
99
RUN npm run production
1010

11-
FROM python:3.10-alpine as backend
11+
FROM python:3.12-alpine AS backend
1212

1313
RUN apk add --no-cache build-base git mariadb-dev && pip install tomli
1414

@@ -20,7 +20,7 @@ RUN cd /src && \
2020
python -c "import tomli; from itertools import chain; pyp=tomli.load(open('pyproject.toml','rb')); deps=pyp['project']['dependencies']; extras=pyp['project']['optional-dependencies']; print('\0'.join(chain(deps, extras['docker'], extras['server'])))" | xargs -0 pip wheel -q -c requirements.txt --wheel-dir /var/cache/wheels && \
2121
pip wheel -q --wheel-dir /var/cache/wheels wheel setuptools_scm[toml]
2222

23-
FROM python:3.10-alpine
23+
FROM python:3.12-alpine
2424

2525
RUN adduser -D worker && \
2626
apk add --no-cache bash git mariadb-client mariadb-connector-c openssh-client-default && \
@@ -46,18 +46,18 @@ RUN mkdir -p /data/fuzzing-tc-config && chown -R worker:worker /src /data/fuzzin
4646
# Note: the extras must be duplicated above in the Python
4747
# script to pre-install dependencies.
4848
USER worker
49-
ENV PATH "${PATH}:/home/worker/.local/bin"
49+
ENV PATH="${PATH}:/home/worker/.local/bin"
5050
RUN pip install --no-cache-dir --no-index --find-links /var/cache/wheels --no-deps -q /src[docker,server]
5151

5252
# Use a custom settings file that can be overwritten
53-
ENV DJANGO_SETTINGS_MODULE "server.settings_docker"
53+
ENV DJANGO_SETTINGS_MODULE="server.settings_docker"
5454

5555
WORKDIR /src/server
5656

5757
# Collect staticfiles, including Vue.js build
5858
RUN python manage.py collectstatic --no-input
5959

6060
# Run with gunicorn, using container's port 80
61-
ENV PORT 80
61+
ENV PORT=80
6262
EXPOSE 80
6363
CMD ["gunicorn", "--bind", "0.0.0.0:80", "--error-logfile", "-", "--access-logfile", "-", "--capture-output", "server.wsgi"]

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,12 @@ The server is expected to be run using [`uv`](https://docs.astral.sh/uv/)
3737
To setup the server, run the following commands:
3838

3939
```
40-
$ uv run -p 3.10 --extra=server server/manage.py migrate
40+
$ uv run -p 3.12 --extra=server server/manage.py migrate
4141
```
4242

4343
Create the webcompatmanager user.
4444
```
45-
$ uv run -p 3.10 --extra=server server/manage.py createsuperuser
45+
$ uv run -p 3.12 --extra=server server/manage.py createsuperuser
4646
Username (leave blank to use 'user'): webcompatmanager
4747
Email address: webcompatmanager@internal.com
4848
Password:
@@ -52,7 +52,7 @@ Superuser created successfully.
5252

5353
It is now possible to run the development server locally:
5454
```
55-
$ uv run -p 3.10 --extra=server server/manage.py runserver
55+
$ uv run -p 3.12 --extra=server server/manage.py runserver
5656
```
5757

5858
Log in using the credentials created above.
@@ -69,7 +69,7 @@ with:
6969

7070
This requires first authenticating with gcloud.
7171

72-
```uv run -p 3.10 --extra=server server/manage.py import_reports_from_bigquery --since <date>```
72+
```uv run -p 3.12 --extra=server server/manage.py import_reports_from_bigquery --since <date>```
7373

7474

7575
### Important changes in settings.py

conftest.py

Lines changed: 0 additions & 21 deletions
This file was deleted.

pyproject.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "WebCompatManager"
7-
requires-python = ">=3.10"
7+
requires-python = "~=3.12.0"
88
authors = [
99
{name = "Christian Holler", email = "choller@mozilla.com"},
1010
{name = "Jesse Schwartzentruber", email = "jschwartzentruber@mozilla.com"},
@@ -28,6 +28,7 @@ dependencies = [
2828
"jsonpath-ng",
2929
"jsonschema>=4.18.0",
3030
"python-dateutil",
31+
"setuptools==80.9.0"
3132
]
3233

3334
[project.optional-dependencies]
@@ -92,7 +93,7 @@ norecursedirs = [
9293

9394
[tool.ruff]
9495
fix = true
95-
target-version = "py310"
96+
target-version = "py312"
9697
extend-exclude = ["**/migrations/*.py"]
9798

9899
[tool.ruff.lint]

server/reportmanager/management/commands/cleanup_old_reports.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import sys
21
from datetime import timedelta
2+
from itertools import batched
33
from logging import getLogger
44

55
from django.conf import settings
@@ -9,11 +9,6 @@
99

1010
from reportmanager.models import Bucket, Bug, ReportEntry
1111

12-
if sys.version_info[:2] < (3, 12):
13-
from server.utils import batched
14-
else:
15-
from itertools import batched
16-
1712
LOG = getLogger("reportmanager.cleanup_old_reports")
1813

1914

server/reportmanager/models.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
44
import json
55
import re
6-
import sys
76
from datetime import timedelta
7+
from itertools import batched
88
from logging import getLogger
99
from urllib.parse import urlsplit
1010

@@ -27,10 +27,6 @@
2727
if getattr(settings, "USE_CELERY", None):
2828
from .tasks import triage_new_report
2929

30-
if sys.version_info[:2] < (3, 12):
31-
from server.utils import batched
32-
else:
33-
from itertools import batched
3430

3531
LOG = getLogger("reportmanager")
3632

server/reportmanager/views.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
44
import html
55
import json
6-
import sys
76
from collections import OrderedDict, defaultdict
87
from datetime import datetime, timedelta
8+
from itertools import batched
99
from logging import getLogger
1010

1111
from dateutil.relativedelta import relativedelta
@@ -60,11 +60,6 @@
6060
ReportEntryVueSerializer,
6161
)
6262

63-
if sys.version_info[:2] < (3, 12):
64-
from server.utils import batched
65-
else:
66-
from itertools import batched
67-
6863
LOG = getLogger("reportmanager.views")
6964

7065

server/server/utils.py

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,10 @@
1-
import sys
21
from contextlib import suppress
32
from logging import getLogger
43
from time import sleep, time
54
from uuid import uuid4
65

76
from redis.exceptions import WatchError
87

9-
if sys.version_info[:2] < (3, 12):
10-
from collections.abc import Iterable, Iterator
11-
from itertools import islice
12-
from typing import TypeVar
13-
148
LOG = getLogger("webcompatmanager.utils")
159

1610

@@ -68,17 +62,3 @@ def release(self):
6862
"Failed to release lock: %s(%s) != %s", self.name, self.unique_id, existing
6963
)
7064
return False
71-
72-
73-
if sys.version_info[:2] < (3, 12):
74-
# generic type for `batched` below
75-
_T = TypeVar("_T")
76-
77-
# added to itertools in 3.12
78-
def batched(iterable: Iterable[_T], n: int) -> Iterator[tuple[_T, ...]]:
79-
# batched('ABCDEFG', 3) → ABC DEF G
80-
if n < 1:
81-
raise ValueError("n must be at least one")
82-
iterator = iter(iterable)
83-
while batch := tuple(islice(iterator, n)):
84-
yield batch

src/webcompat/models.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import difflib
77
import json
88
from dataclasses import dataclass, field
9-
from datetime import datetime, timezone
9+
from datetime import UTC, datetime
1010
from logging import getLogger
1111
from pathlib import Path
1212
from typing import TYPE_CHECKING, Any
@@ -59,9 +59,7 @@ class Report:
5959
def load(cls, data: str) -> Report:
6060
result = json.loads(data)
6161
result["details"] = json.loads(result["details"])
62-
result["reported_at"] = isoparse(result["reported_at"]).replace(
63-
tzinfo=timezone.utc
64-
)
62+
result["reported_at"] = isoparse(result["reported_at"]).replace(tzinfo=UTC)
6563
result["url"] = urlsplit(result["url"])
6664
return cls(**result)
6765

0 commit comments

Comments
 (0)