From 34cf11bcc64f2cd0df71d465a0ed719f5bafe42d Mon Sep 17 00:00:00 2001
From: Stein Magnus Jodal
Date: Sat, 28 Dec 2024 17:56:23 +0100
Subject: [PATCH 01/15] Bump django to 4.2.17
---
pyproject.toml | 4 ++--
uv.lock | 19 ++++++++++++++-----
2 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index 869437d5..3590bf28 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -17,7 +17,7 @@ dependencies = [
"django-compressor==3.1",
"django-invitations==1.9.3",
"django-tastypie==0.14.7",
- "django==3.2.25",
+ "django==4.2.17",
"feedparser>=6.0.11",
"httpx>=0.28.1",
"jsmin==3.0.1",
@@ -25,7 +25,7 @@ dependencies = [
"pillow>=11.0.0",
"pytz>=2024.2",
"sentry-sdk>=2.19.2",
- "setuptools>=75.6.0", # Needed by django-bootstrap-form
+ "setuptools>=75.6.0", # Needed by django-bootstrap-form
"typenv>=0.2.0",
]
diff --git a/uv.lock b/uv.lock
index 23d6c01a..130501b6 100644
--- a/uv.lock
+++ b/uv.lock
@@ -181,7 +181,7 @@ requires-dist = [
{ name = "cssselect", specifier = "==1.2.0" },
{ name = "defusedxml", specifier = ">=0.7.1" },
{ name = "dj-database-url", specifier = ">=2.2.0" },
- { name = "django", specifier = "==3.2.25" },
+ { name = "django", specifier = "==4.2.17" },
{ name = "django-allauth", specifier = "==0.51" },
{ name = "django-bootstrap-form", specifier = "==3.4" },
{ name = "django-compressor", specifier = "==3.1" },
@@ -320,16 +320,16 @@ wheels = [
[[package]]
name = "django"
-version = "3.2.25"
+version = "4.2.17"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "asgiref" },
- { name = "pytz" },
{ name = "sqlparse" },
+ { name = "tzdata", marker = "sys_platform == 'win32'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/ec/68/0e744f07b57bfdf99abbb6b3eb14fcba188867021c05f4a104e04f6d56b8/Django-3.2.25.tar.gz", hash = "sha256:7ca38a78654aee72378594d63e51636c04b8e28574f5505dff630895b5472777", size = 9836336 }
+sdist = { url = "https://files.pythonhosted.org/packages/63/58/709978ddf7e9393c0a89b57a5edbd764ee76eeea68697af3f77f3820980b/Django-4.2.17.tar.gz", hash = "sha256:6b56d834cc94c8b21a8f4e775064896be3b4a4ca387f2612d4406a5927cd2fdc", size = 10437674 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/30/8e/cc23c762c5dcd1d367d73cf006a326e0df2bd0e785cba18b658b39904c1e/Django-3.2.25-py3-none-any.whl", hash = "sha256:a52ea7fcf280b16f7b739cec38fa6d3f8953a5456986944c3ca97e79882b4e38", size = 7890550 },
+ { url = "https://files.pythonhosted.org/packages/5e/85/457360cb3de496382e35db4c2af054066df5c40e26df31400d0109a0500c/Django-4.2.17-py3-none-any.whl", hash = "sha256:3a93350214ba25f178d4045c0786c61573e7dbfa3c509b3551374f1e11ba8de0", size = 7993390 },
]
[[package]]
@@ -1058,6 +1058,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 },
]
+[[package]]
+name = "tzdata"
+version = "2024.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e1/34/943888654477a574a86a98e9896bae89c7aa15078ec29f490fef2f1e5384/tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc", size = 193282 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a6/ab/7e5f53c3b9d14972843a647d8d7a853969a58aecc7559cb3267302c94774/tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd", size = 346586 },
+]
+
[[package]]
name = "urllib3"
version = "2.3.0"
From 3eafd260759d9d3b673fe21b21f41cddee561ddb Mon Sep 17 00:00:00 2001
From: Stein Magnus Jodal
Date: Sat, 28 Dec 2024 17:59:04 +0100
Subject: [PATCH 02/15] Bump django-invitations to 2.1.0
---
pyproject.toml | 2 +-
uv.lock | 12 +++++++++---
2 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index 3590bf28..6f8addd3 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -15,7 +15,7 @@ dependencies = [
"django-allauth==0.51",
"django-bootstrap-form==3.4",
"django-compressor==3.1",
- "django-invitations==1.9.3",
+ "django-invitations==2.1.0",
"django-tastypie==0.14.7",
"django==4.2.17",
"feedparser>=6.0.11",
diff --git a/uv.lock b/uv.lock
index 130501b6..56f6fe84 100644
--- a/uv.lock
+++ b/uv.lock
@@ -185,7 +185,7 @@ requires-dist = [
{ name = "django-allauth", specifier = "==0.51" },
{ name = "django-bootstrap-form", specifier = "==3.4" },
{ name = "django-compressor", specifier = "==3.1" },
- { name = "django-invitations", specifier = "==1.9.3" },
+ { name = "django-invitations", specifier = "==2.1.0" },
{ name = "django-tastypie", specifier = "==0.14.7" },
{ name = "feedparser", specifier = ">=6.0.11" },
{ name = "gunicorn", marker = "extra == 'server'", specifier = ">=22.0,<23" },
@@ -407,9 +407,15 @@ wheels = [
[[package]]
name = "django-invitations"
-version = "1.9.3"
+version = "2.1.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/9a/75/58a239b145525029aa504354b1b26eac101fef331aca7d0912ccf3f58ce0/django-invitations-1.9.3.tar.gz", hash = "sha256:6077807aa641c7abae9ca418e757c8e3940fb0ce60499dba24c100ad57c61442", size = 15751 }
+dependencies = [
+ { name = "django" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/bd/fe/b4d8a441d2cf9ea6c8e6babae3fe0726567b9696ec521f6753b39ad47587/django_invitations-2.1.0.tar.gz", hash = "sha256:88df42bfc20aa846116c5216d81ce916c303303c0249a74f1b1867e260e6814c", size = 27976 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a9/4b/df5573059df97434a413a756757e0a1baeaa0562590f21575a8f83c843af/django_invitations-2.1.0-py3-none-any.whl", hash = "sha256:321d4430f06927be146f82c15ba153872d75185e7accd387bfe1773c1130d30f", size = 42789 },
+]
[[package]]
name = "django-stubs"
From 1291992563072444b4cfeb61190e71ca0c4bd61a Mon Sep 17 00:00:00 2001
From: Stein Magnus Jodal
Date: Sat, 28 Dec 2024 18:00:55 +0100
Subject: [PATCH 03/15] Remove ignores for fixed warnings
---
pyproject.toml | 7 +------
src/comics/__init__.py | 16 ----------------
2 files changed, 1 insertion(+), 22 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index 6f8addd3..dca67751 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -25,7 +25,7 @@ dependencies = [
"pillow>=11.0.0",
"pytz>=2024.2",
"sentry-sdk>=2.19.2",
- "setuptools>=75.6.0", # Needed by django-bootstrap-form
+ "setuptools>=75.6.0", # Needed by django-bootstrap-form
"typenv>=0.2.0",
]
@@ -68,11 +68,6 @@ django_settings_module = "comics.settings"
[tool.pytest.ini_options]
-filterwarnings = [
- "ignore::django.utils.deprecation.RemovedInDjango40Warning:invitations",
- "ignore::django.utils.deprecation.RemovedInDjango40Warning:tastypie",
- "ignore::django.utils.deprecation.RemovedInDjango41Warning",
-]
DJANGO_SETTINGS_MODULE = "comics.settings"
diff --git a/src/comics/__init__.py b/src/comics/__init__.py
index ad0d1349..e6300c4d 100644
--- a/src/comics/__init__.py
+++ b/src/comics/__init__.py
@@ -1,21 +1,5 @@
import logging
-import warnings
-
-from django.utils.deprecation import RemovedInDjango40Warning
# Install a default log handler so that we don't get errors about missing log
# handlers when running tests.
logging.getLogger("comics").addHandler(logging.NullHandler())
-
-# Filter warnings from dependencies with known deprecation warnings to that we
-# can spot any warnings from our own code.
-warnings.filterwarnings(
- action="ignore",
- category=RemovedInDjango40Warning,
- module="invitations",
-)
-warnings.filterwarnings(
- action="ignore",
- category=RemovedInDjango40Warning,
- module="tastypie",
-)
From ae0617acdb7a5c81acb50e3794246252abc76810 Mon Sep 17 00:00:00 2001
From: Stein Magnus Jodal
Date: Sat, 28 Dec 2024 18:06:48 +0100
Subject: [PATCH 04/15] Tweak old migration to ignore irrelevant change to
ImageField
---
src/comics/core/migrations/0001_initial.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/comics/core/migrations/0001_initial.py b/src/comics/core/migrations/0001_initial.py
index 489bd0de..289cde22 100644
--- a/src/comics/core/migrations/0001_initial.py
+++ b/src/comics/core/migrations/0001_initial.py
@@ -110,7 +110,7 @@ class Migration(migrations.Migration):
height_field="height",
storage=django.core.files.storage.FileSystemStorage(
base_url="/media/",
- location="/home/jodal/dev/comics/media",
+ location="/home/jodal/dev/comics/run/media",
),
width_field="width",
upload_to=comics.core.models.image_file_path,
From 121c178f7a773990f4f033eb98b32a9dbb5b7e61 Mon Sep 17 00:00:00 2001
From: Stein Magnus Jodal
Date: Sat, 28 Dec 2024 18:15:59 +0100
Subject: [PATCH 05/15] Fix indentation in base template
---
src/comics/core/templates/base.html | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/comics/core/templates/base.html b/src/comics/core/templates/base.html
index 813f6f83..32c97d8b 100644
--- a/src/comics/core/templates/base.html
+++ b/src/comics/core/templates/base.html
@@ -19,10 +19,10 @@
{% endif %}
@@ -141,9 +141,9 @@
From 8747fd616e5d6437de5c616dc87d37291d8ac1cc Mon Sep 17 00:00:00 2001
From: Stein Magnus Jodal
Date: Sat, 28 Dec 2024 18:22:04 +0100
Subject: [PATCH 06/15] Bump django-compressor to 4.5.1
And switch to use the new default compressors rcssmin and rjsmin instead
of cssmin and jsmin.
---
pyproject.toml | 6 ++----
src/comics/settings.py | 4 ++--
uv.lock | 49 +++++++++++++++++++++---------------------
3 files changed, 29 insertions(+), 30 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index dca67751..693c9893 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -8,24 +8,22 @@ license = { text = "AGPL-3.0-only" }
classifiers = ["Private :: Do Not Upload"]
requires-python = ">=3.12,<3.13"
dependencies = [
- "cssmin==0.2.0",
"cssselect==1.2.0",
"defusedxml>=0.7.1",
"dj-database-url>=2.2.0",
"django-allauth==0.51",
"django-bootstrap-form==3.4",
- "django-compressor==3.1",
+ "django-compressor==4.5.1",
"django-invitations==2.1.0",
"django-tastypie==0.14.7",
"django==4.2.17",
"feedparser>=6.0.11",
"httpx>=0.28.1",
- "jsmin==3.0.1",
"lxml>=5.3.0",
"pillow>=11.0.0",
"pytz>=2024.2",
"sentry-sdk>=2.19.2",
- "setuptools>=75.6.0", # Needed by django-bootstrap-form
+ "setuptools>=75.6.0", # Needed by django-bootstrap-form
"typenv>=0.2.0",
]
diff --git a/src/comics/settings.py b/src/comics/settings.py
index 9b01dd84..868390af 100644
--- a/src/comics/settings.py
+++ b/src/comics/settings.py
@@ -243,10 +243,10 @@
COMPRESS_FILTERS = {
"css": [
"compressor.filters.css_default.CssAbsoluteFilter",
- "compressor.filters.cssmin.CSSMinFilter",
+ "compressor.filters.cssmin.rCSSMinFilter",
],
"js": [
- "compressor.filters.jsmin.JSMinFilter",
+ "compressor.filters.jsmin.rJSMinFilter",
],
}
diff --git a/uv.lock b/uv.lock
index 56f6fe84..9bd59307 100644
--- a/uv.lock
+++ b/uv.lock
@@ -115,7 +115,6 @@ name = "comics"
version = "4.2.0"
source = { editable = "." }
dependencies = [
- { name = "cssmin" },
{ name = "cssselect" },
{ name = "defusedxml" },
{ name = "dj-database-url" },
@@ -127,7 +126,6 @@ dependencies = [
{ name = "django-tastypie" },
{ name = "feedparser" },
{ name = "httpx" },
- { name = "jsmin" },
{ name = "lxml" },
{ name = "pillow" },
{ name = "pytz" },
@@ -177,20 +175,18 @@ typing = [
[package.metadata]
requires-dist = [
{ name = "biplist", marker = "extra == 'api'", specifier = ">=1.0.3,<2" },
- { name = "cssmin", specifier = "==0.2.0" },
{ name = "cssselect", specifier = "==1.2.0" },
{ name = "defusedxml", specifier = ">=0.7.1" },
{ name = "dj-database-url", specifier = ">=2.2.0" },
{ name = "django", specifier = "==4.2.17" },
{ name = "django-allauth", specifier = "==0.51" },
{ name = "django-bootstrap-form", specifier = "==3.4" },
- { name = "django-compressor", specifier = "==3.1" },
+ { name = "django-compressor", specifier = "==4.5.1" },
{ name = "django-invitations", specifier = "==2.1.0" },
{ name = "django-tastypie", specifier = "==0.14.7" },
{ name = "feedparser", specifier = ">=6.0.11" },
{ name = "gunicorn", marker = "extra == 'server'", specifier = ">=22.0,<23" },
{ name = "httpx", specifier = ">=0.28.1" },
- { name = "jsmin", specifier = "==3.0.1" },
{ name = "lxml", specifier = ">=5.3.0" },
{ name = "pillow", specifier = ">=11.0.0" },
{ name = "psycopg2-binary", marker = "extra == 'pgsql'", specifier = ">=2.9.9,<3" },
@@ -272,12 +268,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/97/9b/443270b9210f13f6ef240eff73fd32e02d381e7103969dc66ce8e89ee901/cryptography-44.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede", size = 3202071 },
]
-[[package]]
-name = "cssmin"
-version = "0.2.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/8e/d8/dc9da69bb186303f7ab41adef0a5b6d34da2fdba006827620877760241c3/cssmin-0.2.0.tar.gz", hash = "sha256:e012f0cc8401efcf2620332339011564738ae32be8c84b2e43ce8beaec1067b6", size = 3228 }
-
[[package]]
name = "cssselect"
version = "1.2.0"
@@ -368,16 +358,17 @@ sdist = { url = "https://files.pythonhosted.org/packages/c7/3d/4ec51e3816d3bd595
[[package]]
name = "django-compressor"
-version = "3.1"
+version = "4.5.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
+ { name = "django" },
{ name = "django-appconf" },
{ name = "rcssmin" },
{ name = "rjsmin" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/ef/3d/6580ac89d2677e77893b9a977938d833d3894ca8cc3161b5422d0d00386b/django_compressor-3.1.tar.gz", hash = "sha256:c4a87bf65f9a534cfaf1c321a000a229c24e50c6d62ba6ab089482db42e819d9", size = 123383 }
+sdist = { url = "https://files.pythonhosted.org/packages/15/30/a9994277ae05082ba5df22c5678a87082253a034927c8d9915c3bf3b8c36/django_compressor-4.5.1.tar.gz", hash = "sha256:c1d8a48a2ee4d8b7f23c411eb9c97e2d88db18a18ba1c9e8178d5f5b8366a822", size = 124734 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/42/9a/360a28b4f59efa2d3e750240147cc755027eff7e174bd3888d0746acd577/django_compressor-3.1-py2.py3-none-any.whl", hash = "sha256:89f7ba86777b30672c2f9c7557bf2aff87c5890903c73b1fa3ae38acd143e855", size = 149183 },
+ { url = "https://files.pythonhosted.org/packages/00/d9/ac374a1f7a432230cdf4d2ffbe957fd0d4d5d6426bf4d5c17f382b0801c4/django_compressor-4.5.1-py2.py3-none-any.whl", hash = "sha256:87741edee4e7f24f3e0b8072d94a990cfb010cb2ca7cc443944da8e193cdea65", size = 145465 },
]
[[package]]
@@ -546,12 +537,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 },
]
-[[package]]
-name = "jsmin"
-version = "3.0.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/5e/73/e01e4c5e11ad0494f4407a3f623ad4d87714909f50b17a06ed121034ff6e/jsmin-3.0.1.tar.gz", hash = "sha256:c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc", size = 13925 }
-
[[package]]
name = "lxml"
version = "5.3.0"
@@ -845,9 +830,17 @@ wheels = [
[[package]]
name = "rcssmin"
-version = "1.1.0"
+version = "1.1.2"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/1e/e1/1386510c336541857aa28f8a0bb1514f15f557eb6037ddd61d1dd09c14ec/rcssmin-1.1.0.tar.gz", hash = "sha256:27fc400627fd3d328b7fe95af2a01f5d0af6b5af39731af5d071826a1f08e362", size = 580779 }
+sdist = { url = "https://files.pythonhosted.org/packages/ef/26/f38d49c21d933e3e4320ed31c6025c381dbd973e9936edd0af52ce521534/rcssmin-1.1.2.tar.gz", hash = "sha256:bc75eb75bd6d345c0c51fd80fc487ddd6f9fd409dd7861b3fe98dee85018e1e9", size = 582213 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/60/c1/1a3d908b0dad85a4be0445b25f47d4cd8e570b7f45bdc4885b58374d1b08/rcssmin-1.1.2-cp312-cp312-manylinux1_i686.whl", hash = "sha256:e58a54e63f79c996284240ec2dfb2992e8b90ad8941b1c70997e256b65940de7", size = 48760 },
+ { url = "https://files.pythonhosted.org/packages/57/86/e7b0c5f295a6f031fa852380f70d5c6c1108a2d32d26a3f34a2d459a5dd4/rcssmin-1.1.2-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:657324bfb76fa9e97badabe26af97a1622446f33c9073dd0510c7c7e8c7b96da", size = 48245 },
+ { url = "https://files.pythonhosted.org/packages/b1/1c/01b43a05c2fe9c35e0a5651d034983039e0b7c26fb28c2acb8ce61c1122b/rcssmin-1.1.2-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:fdffd58868a752cac0400249ce21bddf55e00d3206f8885d4a3aca1dab487070", size = 49482 },
+ { url = "https://files.pythonhosted.org/packages/f8/4e/2b91a9feb217bb46fcde96c3b343c3f5fbb43e185f753cb72d9440c01a66/rcssmin-1.1.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:82aad2c3526055956fba537ab067ad937b3f57a1bd13c89bf691fced9c24c89d", size = 52759 },
+ { url = "https://files.pythonhosted.org/packages/07/da/aa85eabdb00e8378cdcf10932514b70b36dcedc1e8f3e32c666de71f7e3c/rcssmin-1.1.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3a860a1f4304e9813900f70fe6b1d429aff73a6fa30ef07f345f68d0a4e33abc", size = 52331 },
+ { url = "https://files.pythonhosted.org/packages/a2/52/688322874b2836ac6bf5bd194b8b951655a33470cf9572462acdabefee60/rcssmin-1.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0451a2c7e7c1ff893ecb7820de862f2ea6336cc69d473ecb0206212e49c817fc", size = 52035 },
+]
[[package]]
name = "requests"
@@ -879,9 +872,17 @@ wheels = [
[[package]]
name = "rjsmin"
-version = "1.2.0"
+version = "1.2.2"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/ad/09/b05a0ed0aedb13c7b7a887b4638c5b3c6eb6a16df944deb2593997d8753c/rjsmin-1.2.0.tar.gz", hash = "sha256:6c529feb6c400984452494c52dd9fdf59185afeacca2afc5174a28ab37751a1b", size = 419866 }
+sdist = { url = "https://files.pythonhosted.org/packages/f0/1c/c0355e8b8b8aca9c0d43519d2a7c473940deae0297ff8544eff359d7f715/rjsmin-1.2.2.tar.gz", hash = "sha256:8c1bcd821143fecf23242012b55e13610840a839cd467b358f16359010d62dae", size = 420634 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9d/6e/98a40b90ef47aa92e7a3a2e204213699574f7b2f4f11d9f817037f80d065/rjsmin-1.2.2-cp312-cp312-manylinux1_i686.whl", hash = "sha256:8982c3ef27fac26dd6b7d0c55ae98fa550fee72da2db010b87211e4b5dd78a67", size = 31760 },
+ { url = "https://files.pythonhosted.org/packages/d3/61/c71a1843d22378c10cb2bb528efadbf0bc3f3f99c6bd8cadcfa7b03a439b/rjsmin-1.2.2-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:3fc27ae4ece99e2c994cd79df2f0d3f7ac650249f632d19aa8ce85118e33bf0f", size = 31712 },
+ { url = "https://files.pythonhosted.org/packages/50/26/f429489f02f6e2521eb74d0fd629745794cb494b9c248e7f6a38896714e8/rjsmin-1.2.2-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:41113d8d6cae7f7406b30143cc49cc045bbb3fadc2f28df398cea30e1daa60b1", size = 32007 },
+ { url = "https://files.pythonhosted.org/packages/0e/72/b0d62ca915282e9631f8b68aca91880ba07e6f9afb7522d6d48c52b03f12/rjsmin-1.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3aa09a89b2b7aa2b9251329fe0c3e36c2dc2f10f78b8811e5be92a072596348b", size = 35953 },
+ { url = "https://files.pythonhosted.org/packages/cd/18/e5683f7e135dd70511c96a0645528970a882926db36d125cba5ce1fb92d9/rjsmin-1.2.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5abb8d1241f4ea97950b872fa97a422ba8413fe02358f64128ff0cf745017f07", size = 36117 },
+ { url = "https://files.pythonhosted.org/packages/38/c8/ba3d7388ab12d4927bc00c0854548d2ef02e5490d3594786634922b9ff58/rjsmin-1.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5abc686a9ef7eaf208f9ad1fb5fb949556ecb7cc1fee27290eb7f194e01d97bd", size = 36047 },
+]
[[package]]
name = "ruff"
From ba4589fab5f3ee48bbec817f53f70762405886e8 Mon Sep 17 00:00:00 2001
From: Stein Magnus Jodal
Date: Sat, 28 Dec 2024 18:37:29 +0100
Subject: [PATCH 07/15] Bump django-stubs to 4.2.7
---
pyproject.toml | 6 +++---
uv.lock | 47 +++++++++++++----------------------------------
2 files changed, 16 insertions(+), 37 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index 693c9893..fe536377 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -23,7 +23,7 @@ dependencies = [
"pillow>=11.0.0",
"pytz>=2024.2",
"sentry-sdk>=2.19.2",
- "setuptools>=75.6.0", # Needed by django-bootstrap-form
+ "setuptools>=75.6.0", # Needed by django-bootstrap-form
"typenv>=0.2.0",
]
@@ -54,8 +54,8 @@ tests = [
"pytest-mock>=3.14.0,<4",
]
typing = [
- "django-stubs>=1.16.0,<2",
- "mypy>=1.10.0,<2",
+ "django-stubs==4.2.7",
+ "mypy>=1.7,<1.8",
"types-pytz>=2024.1.0.20240417,<2025",
"types-toml>=0.10.8.20240310,<0.11",
]
diff --git a/uv.lock b/uv.lock
index 9bd59307..69a40bf9 100644
--- a/uv.lock
+++ b/uv.lock
@@ -213,8 +213,8 @@ tests = [
{ name = "pytest-mock", specifier = ">=3.14.0,<4" },
]
typing = [
- { name = "django-stubs", specifier = ">=1.16.0,<2" },
- { name = "mypy", specifier = ">=1.10.0,<2" },
+ { name = "django-stubs", specifier = "==4.2.7" },
+ { name = "mypy", specifier = ">=1.7,<1.8" },
{ name = "types-pytz", specifier = ">=2024.1.0.20240417,<2025" },
{ name = "types-toml", specifier = ">=0.10.8.20240310,<0.11" },
]
@@ -410,20 +410,18 @@ wheels = [
[[package]]
name = "django-stubs"
-version = "1.16.0"
+version = "4.2.7"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "django" },
{ name = "django-stubs-ext" },
- { name = "mypy" },
- { name = "tomli" },
{ name = "types-pytz" },
{ name = "types-pyyaml" },
{ name = "typing-extensions" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/8c/a8/0e2323bf6fd080623976006860421d47ca4a6d5d21e27980010c187a05ad/django-stubs-1.16.0.tar.gz", hash = "sha256:1bd96207576cd220221a0e615f0259f13d453d515a80f576c1246e0fb547f561", size = 236630 }
+sdist = { url = "https://files.pythonhosted.org/packages/1c/1f/1b1da357d37cbbf21496c17aad5a55416c7c37944a909c4a19ddd61994df/django-stubs-4.2.7.tar.gz", hash = "sha256:8ccd2ff4ee5adf22b9e3b7b1a516d2e1c2191e9d94e672c35cc2bc3dd61e0f6b", size = 258590 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/9b/3e/9c1a097b80002e340d5b3f4b6777a79501a1a5cba29a18f137b9fb91aa91/django_stubs-1.16.0-py3-none-any.whl", hash = "sha256:c95f948e2bfc565f3147e969ff361ef033841a0b8a51cac974a6cc6d0486732c", size = 432684 },
+ { url = "https://files.pythonhosted.org/packages/31/33/a4024662b31999841bc18ef845a790f6b6a9ad50f5b2aceb029896612d17/django_stubs-4.2.7-py3-none-any.whl", hash = "sha256:4cf4de258fa71adc6f2799e983091b9d46cfc67c6eebc68fe111218c9a62b3b8", size = 456669 },
]
[[package]]
@@ -564,20 +562,20 @@ wheels = [
[[package]]
name = "mypy"
-version = "1.14.0"
+version = "1.7.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "mypy-extensions" },
{ name = "typing-extensions" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/8c/7b/08046ef9330735f536a09a2e31b00f42bccdb2795dcd979636ba43bb2d63/mypy-1.14.0.tar.gz", hash = "sha256:822dbd184d4a9804df5a7d5335a68cf7662930e70b8c1bc976645d1509f9a9d6", size = 3215684 }
+sdist = { url = "https://files.pythonhosted.org/packages/ae/30/05a7c016431b3fdbaf0bcf663aee7c5e4b3d2293cd4e0568140cecae4967/mypy-1.7.1.tar.gz", hash = "sha256:fcb6d9afb1b6208b4c712af0dafdc650f518836065df0d4fb1d800f5d6773db2", size = 2979742 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/fe/d8/0e72175ee0253217f5c44524f5e95251c02e95ba9749fb87b0e2074d203a/mypy-1.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d5326ab70a6db8e856d59ad4cb72741124950cbbf32e7b70e30166ba7bbf61dd", size = 11269011 },
- { url = "https://files.pythonhosted.org/packages/e9/6d/4ea13839dabe5db588dc6a1b766da16f420d33cf118a7b7172cdf6c7fcb2/mypy-1.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bf4ec4980bec1e0e24e5075f449d014011527ae0055884c7e3abc6a99cd2c7f1", size = 10253076 },
- { url = "https://files.pythonhosted.org/packages/3e/38/7db2c5d0f4d290e998f7a52b2e2616c7bbad96b8e04278ab09d11978a29e/mypy-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:390dfb898239c25289495500f12fa73aa7f24a4c6d90ccdc165762462b998d63", size = 12862786 },
- { url = "https://files.pythonhosted.org/packages/bf/4b/62d59c801b34141040989949c2b5c157d0408b45357335d3ec5b2845b0f6/mypy-1.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7e026d55ddcd76e29e87865c08cbe2d0104e2b3153a523c529de584759379d3d", size = 12971568 },
- { url = "https://files.pythonhosted.org/packages/f1/9c/e0f281b32d70c87b9e4d2939e302b1ff77ada4d7b0f2fb32890c144bc1d6/mypy-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:585ed36031d0b3ee362e5107ef449a8b5dfd4e9c90ccbe36414ee405ee6b32ba", size = 9879477 },
- { url = "https://files.pythonhosted.org/packages/39/32/0214608af400cdf8f5102144bb8af10d880675c65ed0b58f7e0e77175d50/mypy-1.14.0-py3-none-any.whl", hash = "sha256:2238d7f93fc4027ed1efc944507683df3ba406445a2b6c96e79666a045aadfab", size = 2752803 },
+ { url = "https://files.pythonhosted.org/packages/88/43/2a04b1cc1a27b1fe623cae9c6840f333e47422598a3556d3824a07d8c2c4/mypy-1.7.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6dbdec441c60699288adf051f51a5d512b0d818526d1dcfff5a41f8cd8b4aaf1", size = 10817552 },
+ { url = "https://files.pythonhosted.org/packages/cc/b7/5ae852edccf9eba4d71b3df212928f15759142894a4bb84c1d3cb0ade729/mypy-1.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4fc3d14ee80cd22367caaaf6e014494415bf440980a3045bf5045b525680ac33", size = 9786567 },
+ { url = "https://files.pythonhosted.org/packages/b6/ab/39f476f18a45b2a74b38722107ac5c8e50a5ee41f39f7ac46ac50caa630e/mypy-1.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c6e4464ed5f01dc44dc9821caf67b60a4e5c3b04278286a85c067010653a0eb", size = 12389281 },
+ { url = "https://files.pythonhosted.org/packages/83/9c/51effe3396740868649364ebea5001c694af29ec891bc90aae6944886c45/mypy-1.7.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:d9b338c19fa2412f76e17525c1b4f2c687a55b156320acb588df79f2e6fa9fea", size = 12472382 },
+ { url = "https://files.pythonhosted.org/packages/bd/7a/34e1ec6e515048ad7976c2afaa59c056fe1f942a1a2ae3704c754e3c0248/mypy-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:204e0d6de5fd2317394a4eff62065614c4892d5a4d1a7ee55b765d7a3d9e3f82", size = 9281023 },
+ { url = "https://files.pythonhosted.org/packages/10/df/92bb67911c6c1d3faa46e4c9a5d0a93dd343dcf56022d1fb97a0c0ee65eb/mypy-1.7.1-py3-none-any.whl", hash = "sha256:f7c5d642db47376a0cc130f0de6d055056e010debdaf0707cd2b0fc7e7ef30ea", size = 2542516 },
]
[[package]]
@@ -964,25 +962,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/a9/5c/bfd6bd0bf979426d405cc6e71eceb8701b148b16c21d2dc3c261efc61c7b/sqlparse-0.5.3-py3-none-any.whl", hash = "sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca", size = 44415 },
]
-[[package]]
-name = "tomli"
-version = "2.2.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762 },
- { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453 },
- { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486 },
- { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349 },
- { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159 },
- { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243 },
- { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645 },
- { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584 },
- { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875 },
- { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418 },
- { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 },
-]
-
[[package]]
name = "tox"
version = "4.23.2"
From 1169a9a2639874e0a4751586e4f2082d04e72362 Mon Sep 17 00:00:00 2001
From: Stein Magnus Jodal
Date: Sat, 28 Dec 2024 19:48:43 +0100
Subject: [PATCH 08/15] Fix new mypy errors
---
src/comics/accounts/models.py | 4 +++-
src/comics/browser/views.py | 2 +-
src/comics/core/models.py | 4 +++-
3 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/src/comics/accounts/models.py b/src/comics/accounts/models.py
index d6a33fb0..c0b7242f 100644
--- a/src/comics/accounts/models.py
+++ b/src/comics/accounts/models.py
@@ -1,3 +1,5 @@
+from __future__ import annotations
+
import uuid
from django.contrib.auth.models import User
@@ -29,7 +31,7 @@ class UserProfile(models.Model):
default=make_secret_key,
help_text="Secret key for feed and API access",
)
- comics = models.ManyToManyField(
+ comics: models.ManyToManyField[Comic, UserProfile] = models.ManyToManyField(
Comic,
through="Subscription",
)
diff --git a/src/comics/browser/views.py b/src/comics/browser/views.py
index a3f54d4c..fb076d3c 100644
--- a/src/comics/browser/views.py
+++ b/src/comics/browser/views.py
@@ -53,7 +53,7 @@ class ReleaseMixin(LoginRequiredMixin, ComicMixin):
"""Things common for *all* views of comic releases"""
allow_future = True
- template_name = "browser/release_list.html"
+ template_name: str | None = "browser/release_list.html"
def render_to_response(self, context, **kwargs):
# We hook into render_to_response() instead of get_context_data()
diff --git a/src/comics/core/models.py b/src/comics/core/models.py
index 7da5c446..ee4e20f7 100644
--- a/src/comics/core/models.py
+++ b/src/comics/core/models.py
@@ -1,3 +1,5 @@
+from __future__ import annotations
+
import datetime
import os
@@ -93,7 +95,7 @@ class Release(models.Model):
verbose_name="publication date",
db_index=True,
)
- images = models.ManyToManyField(
+ images: models.ManyToManyField[Image, Release] = models.ManyToManyField(
"Image",
related_name="releases",
)
From 50d068ba1d7bace8c0fe6abe68e6e8950edb71ac Mon Sep 17 00:00:00 2001
From: Stein Magnus Jodal
Date: Sat, 28 Dec 2024 18:39:30 +0100
Subject: [PATCH 09/15] Use tomllib from stdlib instead of toml
---
docs/conf.py | 6 ++++--
docs/requirements.txt | 1 -
pyproject.toml | 1 -
uv.lock | 11 -----------
4 files changed, 4 insertions(+), 15 deletions(-)
diff --git a/docs/conf.py b/docs/conf.py
index 9d665718..c834d979 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -1,12 +1,14 @@
# noqa: INP001
-import toml
+import pathlib
+import tomllib
project = "Comics"
author = "Stein Magnus Jodal and contributors"
copyright = f"2009-2024, {author}" # noqa: A001
-release = toml.load("../pyproject.toml")["project"]["version"]
+with pathlib.Path("../pyproject.toml").open("rb") as fh:
+ release = tomllib.load(fh)["project"]["version"]
version = ".".join(release.split(".")[:2])
extensions = [
diff --git a/docs/requirements.txt b/docs/requirements.txt
index 33054bc6..f88b1391 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -1,4 +1,3 @@
Sphinx >= 3.5.2
sphinx-rtd-theme >= 0.5.1
sphinxcontrib-httpdomain >= 1.7.0
-toml >= 0.10.2
diff --git a/pyproject.toml b/pyproject.toml
index fe536377..4e779220 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -57,7 +57,6 @@ typing = [
"django-stubs==4.2.7",
"mypy>=1.7,<1.8",
"types-pytz>=2024.1.0.20240417,<2025",
- "types-toml>=0.10.8.20240310,<0.11",
]
diff --git a/uv.lock b/uv.lock
index 69a40bf9..69b7dea8 100644
--- a/uv.lock
+++ b/uv.lock
@@ -169,7 +169,6 @@ typing = [
{ name = "django-stubs" },
{ name = "mypy" },
{ name = "types-pytz" },
- { name = "types-toml" },
]
[package.metadata]
@@ -216,7 +215,6 @@ typing = [
{ name = "django-stubs", specifier = "==4.2.7" },
{ name = "mypy", specifier = ">=1.7,<1.8" },
{ name = "types-pytz", specifier = ">=2024.1.0.20240417,<2025" },
- { name = "types-toml", specifier = ">=0.10.8.20240310,<0.11" },
]
[[package]]
@@ -1026,15 +1024,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/4b/04/1cc4fffeb4ace85c205e84cd48eb12cb37ec6ffb68245b7eef8f2086d490/types_PyYAML-6.0.12.20241221-py3-none-any.whl", hash = "sha256:0657a4ff8411a030a2116a196e8e008ea679696b5b1a8e1a6aa8ebb737b34688", size = 20023 },
]
-[[package]]
-name = "types-toml"
-version = "0.10.8.20240310"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/86/47/3e4c75042792bff8e90d7991aa5c51812cc668828cc6cce711e97f63a607/types-toml-0.10.8.20240310.tar.gz", hash = "sha256:3d41501302972436a6b8b239c850b26689657e25281b48ff0ec06345b8830331", size = 4392 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/da/a2/d32ab58c0b216912638b140ab2170ee4b8644067c293b170e19fba340ccc/types_toml-0.10.8.20240310-py3-none-any.whl", hash = "sha256:627b47775d25fa29977d9c70dc0cbab3f314f32c8d8d0c012f2ef5de7aaec05d", size = 4777 },
-]
-
[[package]]
name = "typing-extensions"
version = "4.12.2"
From 96eeec531f6b912b6aecc01cbb32e3bee86d85b2 Mon Sep 17 00:00:00 2001
From: Stein Magnus Jodal
Date: Sat, 28 Dec 2024 18:41:18 +0100
Subject: [PATCH 10/15] Bump all pytest deps
---
pyproject.toml | 8 ++++----
uv.lock | 14 +++++++-------
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index 4e779220..7fd158d3 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -48,10 +48,10 @@ dev = [
# docs = []
lint = ["ruff>=0.8.4"]
tests = [
- "pytest>=8.2.2,<9",
- "pytest-cov>=5.0.0,<6",
- "pytest-django>=4.8.0,<5",
- "pytest-mock>=3.14.0,<4",
+ "pytest>=8.3.4",
+ "pytest-cov>=6.0.0",
+ "pytest-django>=4.8.0",
+ "pytest-mock>=3.14.0",
]
typing = [
"django-stubs==4.2.7",
diff --git a/uv.lock b/uv.lock
index 69b7dea8..2fd58643 100644
--- a/uv.lock
+++ b/uv.lock
@@ -206,10 +206,10 @@ dev = [
]
lint = [{ name = "ruff", specifier = ">=0.8.4" }]
tests = [
- { name = "pytest", specifier = ">=8.2.2,<9" },
- { name = "pytest-cov", specifier = ">=5.0.0,<6" },
- { name = "pytest-django", specifier = ">=4.8.0,<5" },
- { name = "pytest-mock", specifier = ">=3.14.0,<4" },
+ { name = "pytest", specifier = ">=8.3.4" },
+ { name = "pytest-cov", specifier = ">=6.0.0" },
+ { name = "pytest-django", specifier = ">=4.8.0" },
+ { name = "pytest-mock", specifier = ">=3.14.0" },
]
typing = [
{ name = "django-stubs", specifier = "==4.2.7" },
@@ -721,15 +721,15 @@ wheels = [
[[package]]
name = "pytest-cov"
-version = "5.0.0"
+version = "6.0.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "coverage" },
{ name = "pytest" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/74/67/00efc8d11b630c56f15f4ad9c7f9223f1e5ec275aaae3fa9118c6a223ad2/pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857", size = 63042 }
+sdist = { url = "https://files.pythonhosted.org/packages/be/45/9b538de8cef30e17c7b45ef42f538a94889ed6a16f2387a6c89e73220651/pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0", size = 66945 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/78/3a/af5b4fa5961d9a1e6237b530eb87dd04aea6eb83da09d2a4073d81b54ccf/pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652", size = 21990 },
+ { url = "https://files.pythonhosted.org/packages/36/3b/48e79f2cd6a61dbbd4807b4ed46cb564b4fd50a76166b1c4ea5c1d9e2371/pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35", size = 22949 },
]
[[package]]
From 9b01dd628160b025629c7954c6097fe053da0307 Mon Sep 17 00:00:00 2001
From: Stein Magnus Jodal
Date: Sat, 28 Dec 2024 19:00:13 +0100
Subject: [PATCH 11/15] Use zoneinfo from stdlib instead of pytz
---
pyproject.toml | 4 +---
src/comics/aggregator/crawler.py | 13 +++++++------
src/comics/aggregator/tests/test_crawler.py | 10 +++++-----
uv.lock | 13 -------------
4 files changed, 13 insertions(+), 27 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index 7fd158d3..872001a5 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -21,9 +21,8 @@ dependencies = [
"httpx>=0.28.1",
"lxml>=5.3.0",
"pillow>=11.0.0",
- "pytz>=2024.2",
"sentry-sdk>=2.19.2",
- "setuptools>=75.6.0", # Needed by django-bootstrap-form
+ "setuptools>=75.6.0", # Needed by django-bootstrap-form
"typenv>=0.2.0",
]
@@ -56,7 +55,6 @@ tests = [
typing = [
"django-stubs==4.2.7",
"mypy>=1.7,<1.8",
- "types-pytz>=2024.1.0.20240417,<2025",
]
diff --git a/src/comics/aggregator/crawler.py b/src/comics/aggregator/crawler.py
index 9e51765c..e03e7ad8 100644
--- a/src/comics/aggregator/crawler.py
+++ b/src/comics/aggregator/crawler.py
@@ -4,11 +4,11 @@
import re
import time
import xml.sax
+import zoneinfo
from dataclasses import dataclass, field
from typing import TYPE_CHECKING
import httpx
-import pytz
from django.utils import timezone
from comics.aggregator.exceptions import (
@@ -153,8 +153,8 @@ def _get_date_to_crawl(self, pub_date: datetime.date | None) -> datetime.date:
@property
def current_date(self) -> datetime.date:
- tz = pytz.timezone(self.time_zone)
- now_in_tz = tz.normalize(now().astimezone(tz))
+ time_zone = zoneinfo.ZoneInfo(self.time_zone)
+ now_in_tz = now().astimezone(time_zone)
return now_in_tz.date()
@property
@@ -201,9 +201,10 @@ def string_to_date(self, string: str, fmt: str) -> datetime.date:
def date_to_epoch(self, date: datetime.date) -> int:
"""The UNIX time of midnight at ``date`` in the comic's time zone"""
- naive_midnight = datetime.datetime(date.year, date.month, date.day)
- local_midnight = pytz.timezone(self.time_zone).localize(naive_midnight)
- return int(time.mktime(local_midnight.utctimetuple()))
+ midnight = datetime.datetime(
+ date.year, date.month, date.day, tzinfo=zoneinfo.ZoneInfo(self.time_zone)
+ )
+ return int(time.mktime(midnight.utctimetuple()))
class ComicsKingdomCrawlerBase(CrawlerBase):
diff --git a/src/comics/aggregator/tests/test_crawler.py b/src/comics/aggregator/tests/test_crawler.py
index 22416d5b..e0c65261 100644
--- a/src/comics/aggregator/tests/test_crawler.py
+++ b/src/comics/aggregator/tests/test_crawler.py
@@ -1,6 +1,6 @@
import datetime
+import zoneinfo
-import pytz
from django.test import TestCase
from comics.aggregator import crawler
@@ -13,27 +13,27 @@ class CurrentDateWhenLocalTZIsUTCTest(TestCase):
now: datetime.datetime
def setUp(self):
- self.tz = pytz.timezone(self.time_zone_local)
+ self.tz = zoneinfo.ZoneInfo(self.time_zone_local)
self.crawler = crawler.CrawlerBase(None)
crawler.now = lambda: self.now
crawler.today = lambda: self.now.today()
def test_current_date_when_crawler_is_in_local_today(self):
- self.now = self.tz.localize(datetime.datetime(2001, 2, 5, 23, 1, 0))
+ self.now = datetime.datetime(2001, 2, 5, 23, 1, 0, tzinfo=self.tz)
self.crawler.time_zone = self.time_zone_local
today = datetime.date(2001, 2, 5)
self.assertEqual(self.crawler.current_date, today)
def test_current_date_when_crawler_is_in_local_tomorrow(self):
- self.now = self.tz.localize(datetime.datetime(2001, 2, 5, 23, 1, 0))
+ self.now = datetime.datetime(2001, 2, 5, 23, 1, 0, tzinfo=self.tz)
self.crawler.time_zone = self.time_zone_ahead
tomorrow = datetime.date(2001, 2, 6)
self.assertEqual(self.crawler.current_date, tomorrow)
def test_current_date_when_crawler_is_in_local_yesterday(self):
- self.now = self.tz.localize(datetime.datetime(2001, 2, 5, 0, 59, 0))
+ self.now = datetime.datetime(2001, 2, 5, 0, 59, 0, tzinfo=self.tz)
self.crawler.time_zone = self.time_zone_behind
yesterday = datetime.date(2001, 2, 4)
diff --git a/uv.lock b/uv.lock
index 2fd58643..23d95625 100644
--- a/uv.lock
+++ b/uv.lock
@@ -128,7 +128,6 @@ dependencies = [
{ name = "httpx" },
{ name = "lxml" },
{ name = "pillow" },
- { name = "pytz" },
{ name = "sentry-sdk" },
{ name = "setuptools" },
{ name = "typenv" },
@@ -168,7 +167,6 @@ tests = [
typing = [
{ name = "django-stubs" },
{ name = "mypy" },
- { name = "types-pytz" },
]
[package.metadata]
@@ -190,7 +188,6 @@ requires-dist = [
{ name = "pillow", specifier = ">=11.0.0" },
{ name = "psycopg2-binary", marker = "extra == 'pgsql'", specifier = ">=2.9.9,<3" },
{ name = "pymemcache", marker = "extra == 'cache'", specifier = ">=4.0.0,<5" },
- { name = "pytz", specifier = ">=2024.2" },
{ name = "pyyaml", marker = "extra == 'api'", specifier = ">=6.0.1,<7" },
{ name = "sentry-sdk", specifier = ">=2.19.2" },
{ name = "setuptools", specifier = ">=75.6.0" },
@@ -214,7 +211,6 @@ tests = [
typing = [
{ name = "django-stubs", specifier = "==4.2.7" },
{ name = "mypy", specifier = ">=1.7,<1.8" },
- { name = "types-pytz", specifier = ">=2024.1.0.20240417,<2025" },
]
[[package]]
@@ -798,15 +794,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/e0/a5/c6ba13860bdf5525f1ab01e01cc667578d6f1efc8a1dba355700fb04c29b/python3_openid-3.2.0-py3-none-any.whl", hash = "sha256:6626f771e0417486701e0b4daff762e7212e820ca5b29fcc0d05f6f8736dfa6b", size = 133681 },
]
-[[package]]
-name = "pytz"
-version = "2024.2"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/3a/31/3c70bf7603cc2dca0f19bdc53b4537a797747a58875b552c8c413d963a3f/pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a", size = 319692 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/11/c3/005fcca25ce078d2cc29fd559379817424e94885510568bc1bc53d7d5846/pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725", size = 508002 },
-]
-
[[package]]
name = "pyyaml"
version = "6.0.2"
From a1d1b97c6ddbd4f1df72f53cfef7132dcaa07ff0 Mon Sep 17 00:00:00 2001
From: Stein Magnus Jodal
Date: Sat, 28 Dec 2024 19:51:38 +0100
Subject: [PATCH 12/15] Allow newer releases of most deps
---
pyproject.toml | 21 +++++++++------------
uv.lock | 12 ++++++------
2 files changed, 15 insertions(+), 18 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index 872001a5..2946ef90 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -8,21 +8,21 @@ license = { text = "AGPL-3.0-only" }
classifiers = ["Private :: Do Not Upload"]
requires-python = ">=3.12,<3.13"
dependencies = [
- "cssselect==1.2.0",
+ "cssselect>=1.2.0",
"defusedxml>=0.7.1",
"dj-database-url>=2.2.0",
- "django-allauth==0.51",
- "django-bootstrap-form==3.4",
- "django-compressor==4.5.1",
- "django-invitations==2.1.0",
- "django-tastypie==0.14.7",
- "django==4.2.17",
+ "django-allauth==0.51", # TODO: Review changelog and update
+ "django-bootstrap-form>=3.4",
+ "django-compressor>=4.5.1",
+ "django-invitations>=2.1.0",
+ "django-tastypie>=0.14.7",
+ "django>=4.2.17,<5",
"feedparser>=6.0.11",
"httpx>=0.28.1",
"lxml>=5.3.0",
"pillow>=11.0.0",
"sentry-sdk>=2.19.2",
- "setuptools>=75.6.0", # Needed by django-bootstrap-form
+ "setuptools>=75.6.0", # Needed by django-bootstrap-form
"typenv>=0.2.0",
]
@@ -52,10 +52,7 @@ tests = [
"pytest-django>=4.8.0",
"pytest-mock>=3.14.0",
]
-typing = [
- "django-stubs==4.2.7",
- "mypy>=1.7,<1.8",
-]
+typing = ["django-stubs==4.2.7", "mypy>=1.7,<1.8"]
[tool.django-stubs]
diff --git a/uv.lock b/uv.lock
index 23d95625..a42a48ef 100644
--- a/uv.lock
+++ b/uv.lock
@@ -172,15 +172,15 @@ typing = [
[package.metadata]
requires-dist = [
{ name = "biplist", marker = "extra == 'api'", specifier = ">=1.0.3,<2" },
- { name = "cssselect", specifier = "==1.2.0" },
+ { name = "cssselect", specifier = ">=1.2.0" },
{ name = "defusedxml", specifier = ">=0.7.1" },
{ name = "dj-database-url", specifier = ">=2.2.0" },
- { name = "django", specifier = "==4.2.17" },
+ { name = "django", specifier = ">=4.2.17,<5" },
{ name = "django-allauth", specifier = "==0.51" },
- { name = "django-bootstrap-form", specifier = "==3.4" },
- { name = "django-compressor", specifier = "==4.5.1" },
- { name = "django-invitations", specifier = "==2.1.0" },
- { name = "django-tastypie", specifier = "==0.14.7" },
+ { name = "django-bootstrap-form", specifier = ">=3.4" },
+ { name = "django-compressor", specifier = ">=4.5.1" },
+ { name = "django-invitations", specifier = ">=2.1.0" },
+ { name = "django-tastypie", specifier = ">=0.14.7" },
{ name = "feedparser", specifier = ">=6.0.11" },
{ name = "gunicorn", marker = "extra == 'server'", specifier = ">=22.0,<23" },
{ name = "httpx", specifier = ">=0.28.1" },
From 5ab45396b9219ba2e0600e1089be8e6cc6ed1e75 Mon Sep 17 00:00:00 2001
From: Stein Magnus Jodal
Date: Sat, 28 Dec 2024 19:54:10 +0100
Subject: [PATCH 13/15] Bump django-debug-toolbar to 4.4.6
---
pyproject.toml | 2 +-
src/comics/settings.py | 3 +++
src/comics/urls.py | 11 +++++++++++
uv.lock | 8 ++++----
4 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index 2946ef90..d3a716b3 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -37,7 +37,7 @@ comics = "comics.__main__:main"
[dependency-groups]
dev = [
- "django-debug-toolbar>=3.8.1,<4",
+ "django-debug-toolbar>=4.4.6",
"django-extensions>=3.2.3,<4",
"tox-uv>=1.16.2",
"tox>=4.21",
diff --git a/src/comics/settings.py b/src/comics/settings.py
index 868390af..6f6f5c28 100644
--- a/src/comics/settings.py
+++ b/src/comics/settings.py
@@ -26,6 +26,9 @@
"DJANGO_DEBUG",
default=False,
)
+INTERNAL_IPS = [
+ "127.0.0.1" # Required by django-debug-toolbar
+]
#: Site admins
ADMINS = []
diff --git a/src/comics/urls.py b/src/comics/urls.py
index 8e7f36f3..3a58e317 100644
--- a/src/comics/urls.py
+++ b/src/comics/urls.py
@@ -29,9 +29,20 @@
path("", include("comics.browser.urls")),
]
+
# Let Django host media if doing local development on runserver
if not settings.MEDIA_URL.startswith("http"):
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
+# Include debug_toolbar during development
+if settings.DEBUG:
+ try:
+ from debug_toolbar.toolbar import debug_toolbar_urls
+ except ImportError:
+ pass
+ else:
+ urlpatterns += debug_toolbar_urls()
+
+
urlpatterns += static(settings.STATIC_URL)
diff --git a/uv.lock b/uv.lock
index a42a48ef..78d3820d 100644
--- a/uv.lock
+++ b/uv.lock
@@ -196,7 +196,7 @@ requires-dist = [
[package.metadata.requires-dev]
dev = [
- { name = "django-debug-toolbar", specifier = ">=3.8.1,<4" },
+ { name = "django-debug-toolbar", specifier = ">=4.4.6" },
{ name = "django-extensions", specifier = ">=3.2.3,<4" },
{ name = "tox", specifier = ">=4.21" },
{ name = "tox-uv", specifier = ">=1.16.2" },
@@ -367,15 +367,15 @@ wheels = [
[[package]]
name = "django-debug-toolbar"
-version = "3.8.1"
+version = "4.4.6"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "django" },
{ name = "sqlparse" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/80/53/1d1e3bbef3c6f5820f838a6a6a8e795a3c86323f9dbf2f8a89de78477972/django_debug_toolbar-3.8.1.tar.gz", hash = "sha256:24ef1a7d44d25e60d7951e378454c6509bf536dce7e7d9d36e7c387db499bc27", size = 120252 }
+sdist = { url = "https://files.pythonhosted.org/packages/d4/9c/0a3238eda0a46df20f2e3fe2a30313d34f5042a1a737d08230b77c29a3e9/django_debug_toolbar-4.4.6.tar.gz", hash = "sha256:36e421cb908c2f0675e07f9f41e3d1d8618dc386392ec82d23bcfcd5d29c7044", size = 272610 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/c7/c3/fd81e84ce86904019112428c690a06ab19c66742c917a898dcf9da6ae166/django_debug_toolbar-3.8.1-py3-none-any.whl", hash = "sha256:879f8a4672d41621c06a4d322dcffa630fc4df056cada6e417ed01db0e5e0478", size = 221071 },
+ { url = "https://files.pythonhosted.org/packages/2f/33/2036a472eedfbe49240dffea965242b3f444de4ea4fbeceb82ccea33a2ce/django_debug_toolbar-4.4.6-py3-none-any.whl", hash = "sha256:3beb671c9ec44ffb817fad2780667f172bd1c067dbcabad6268ce39a81335f45", size = 229621 },
]
[[package]]
From 13ca55a922943e8375ddaab77f38e272567e91c9 Mon Sep 17 00:00:00 2001
From: Stein Magnus Jodal
Date: Sat, 28 Dec 2024 20:07:15 +0100
Subject: [PATCH 14/15] Allow newer releases of django-extensions
---
pyproject.toml | 2 +-
uv.lock | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index d3a716b3..35a3b825 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -38,7 +38,7 @@ comics = "comics.__main__:main"
[dependency-groups]
dev = [
"django-debug-toolbar>=4.4.6",
- "django-extensions>=3.2.3,<4",
+ "django-extensions>=3.2.3",
"tox-uv>=1.16.2",
"tox>=4.21",
]
diff --git a/uv.lock b/uv.lock
index 78d3820d..a8f73cbe 100644
--- a/uv.lock
+++ b/uv.lock
@@ -197,7 +197,7 @@ requires-dist = [
[package.metadata.requires-dev]
dev = [
{ name = "django-debug-toolbar", specifier = ">=4.4.6" },
- { name = "django-extensions", specifier = ">=3.2.3,<4" },
+ { name = "django-extensions", specifier = ">=3.2.3" },
{ name = "tox", specifier = ">=4.21" },
{ name = "tox-uv", specifier = ">=1.16.2" },
]
From 9d072f888ef5d34800f954197166c8e362749328 Mon Sep 17 00:00:00 2001
From: Stein Magnus Jodal
Date: Sat, 28 Dec 2024 20:10:17 +0100
Subject: [PATCH 15/15] Bump deps
---
pyproject.toml | 4 +--
uv.lock | 78 +++++++++++++++++++++++++-------------------------
2 files changed, 41 insertions(+), 41 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index 35a3b825..896cb503 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -10,12 +10,12 @@ requires-python = ">=3.12,<3.13"
dependencies = [
"cssselect>=1.2.0",
"defusedxml>=0.7.1",
- "dj-database-url>=2.2.0",
+ "dj-database-url>=2.3.0",
"django-allauth==0.51", # TODO: Review changelog and update
"django-bootstrap-form>=3.4",
"django-compressor>=4.5.1",
"django-invitations>=2.1.0",
- "django-tastypie>=0.14.7",
+ "django-tastypie>=0.15.0",
"django>=4.2.17,<5",
"feedparser>=6.0.11",
"httpx>=0.28.1",
diff --git a/uv.lock b/uv.lock
index a8f73cbe..b806ad4b 100644
--- a/uv.lock
+++ b/uv.lock
@@ -174,13 +174,13 @@ requires-dist = [
{ name = "biplist", marker = "extra == 'api'", specifier = ">=1.0.3,<2" },
{ name = "cssselect", specifier = ">=1.2.0" },
{ name = "defusedxml", specifier = ">=0.7.1" },
- { name = "dj-database-url", specifier = ">=2.2.0" },
+ { name = "dj-database-url", specifier = ">=2.3.0" },
{ name = "django", specifier = ">=4.2.17,<5" },
{ name = "django-allauth", specifier = "==0.51" },
{ name = "django-bootstrap-form", specifier = ">=3.4" },
{ name = "django-compressor", specifier = ">=4.5.1" },
{ name = "django-invitations", specifier = ">=2.1.0" },
- { name = "django-tastypie", specifier = ">=0.14.7" },
+ { name = "django-tastypie", specifier = ">=0.15.0" },
{ name = "feedparser", specifier = ">=6.0.11" },
{ name = "gunicorn", marker = "extra == 'server'", specifier = ">=22.0,<23" },
{ name = "httpx", specifier = ">=0.28.1" },
@@ -215,20 +215,20 @@ typing = [
[[package]]
name = "coverage"
-version = "7.6.9"
+version = "7.6.10"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/5b/d2/c25011f4d036cf7e8acbbee07a8e09e9018390aee25ba085596c4b83d510/coverage-7.6.9.tar.gz", hash = "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d", size = 801710 }
+sdist = { url = "https://files.pythonhosted.org/packages/84/ba/ac14d281f80aab516275012e8875991bb06203957aa1e19950139238d658/coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23", size = 803868 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/60/52/b16af8989a2daf0f80a88522bd8e8eed90b5fcbdecf02a6888f3e80f6ba7/coverage-7.6.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8", size = 207325 },
- { url = "https://files.pythonhosted.org/packages/0f/79/6b7826fca8846c1216a113227b9f114ac3e6eacf168b4adcad0cb974aaca/coverage-7.6.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a", size = 207563 },
- { url = "https://files.pythonhosted.org/packages/a7/07/0bc73da0ccaf45d0d64ef86d33b7d7fdeef84b4c44bf6b85fb12c215c5a6/coverage-7.6.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015", size = 240580 },
- { url = "https://files.pythonhosted.org/packages/71/8a/9761f409910961647d892454687cedbaccb99aae828f49486734a82ede6e/coverage-7.6.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3", size = 237613 },
- { url = "https://files.pythonhosted.org/packages/8b/10/ee7d696a17ac94f32f2dbda1e17e730bf798ae9931aec1fc01c1944cd4de/coverage-7.6.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae", size = 239684 },
- { url = "https://files.pythonhosted.org/packages/16/60/aa1066040d3c52fff051243c2d6ccda264da72dc6d199d047624d395b2b2/coverage-7.6.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4", size = 239112 },
- { url = "https://files.pythonhosted.org/packages/4e/e5/69f35344c6f932ba9028bf168d14a79fedb0dd4849b796d43c81ce75a3c9/coverage-7.6.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6", size = 237428 },
- { url = "https://files.pythonhosted.org/packages/32/20/adc895523c4a28f63441b8ac645abd74f9bdd499d2d175bef5b41fc7f92d/coverage-7.6.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f", size = 239098 },
- { url = "https://files.pythonhosted.org/packages/a9/a6/e0e74230c9bb3549ec8ffc137cfd16ea5d56e993d6bffed2218bff6187e3/coverage-7.6.9-cp312-cp312-win32.whl", hash = "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692", size = 209940 },
- { url = "https://files.pythonhosted.org/packages/3e/18/cb5b88349d4aa2f41ec78d65f92ea32572b30b3f55bc2b70e87578b8f434/coverage-7.6.9-cp312-cp312-win_amd64.whl", hash = "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97", size = 210726 },
+ { url = "https://files.pythonhosted.org/packages/86/77/19d09ea06f92fdf0487499283b1b7af06bc422ea94534c8fe3a4cd023641/coverage-7.6.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853", size = 208281 },
+ { url = "https://files.pythonhosted.org/packages/b6/67/5479b9f2f99fcfb49c0d5cf61912a5255ef80b6e80a3cddba39c38146cf4/coverage-7.6.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078", size = 208514 },
+ { url = "https://files.pythonhosted.org/packages/15/d1/febf59030ce1c83b7331c3546d7317e5120c5966471727aa7ac157729c4b/coverage-7.6.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0", size = 241537 },
+ { url = "https://files.pythonhosted.org/packages/4b/7e/5ac4c90192130e7cf8b63153fe620c8bfd9068f89a6d9b5f26f1550f7a26/coverage-7.6.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50", size = 238572 },
+ { url = "https://files.pythonhosted.org/packages/dc/03/0334a79b26ecf59958f2fe9dd1f5ab3e2f88db876f5071933de39af09647/coverage-7.6.10-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022", size = 240639 },
+ { url = "https://files.pythonhosted.org/packages/d7/45/8a707f23c202208d7b286d78ad6233f50dcf929319b664b6cc18a03c1aae/coverage-7.6.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b", size = 240072 },
+ { url = "https://files.pythonhosted.org/packages/66/02/603ce0ac2d02bc7b393279ef618940b4a0535b0868ee791140bda9ecfa40/coverage-7.6.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0", size = 238386 },
+ { url = "https://files.pythonhosted.org/packages/04/62/4e6887e9be060f5d18f1dd58c2838b2d9646faf353232dec4e2d4b1c8644/coverage-7.6.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852", size = 240054 },
+ { url = "https://files.pythonhosted.org/packages/5c/74/83ae4151c170d8bd071924f212add22a0e62a7fe2b149edf016aeecad17c/coverage-7.6.10-cp312-cp312-win32.whl", hash = "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359", size = 210904 },
+ { url = "https://files.pythonhosted.org/packages/c3/54/de0893186a221478f5880283119fc40483bc460b27c4c71d1b8bba3474b9/coverage-7.6.10-cp312-cp312-win_amd64.whl", hash = "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247", size = 211692 },
]
[[package]]
@@ -291,15 +291,15 @@ wheels = [
[[package]]
name = "dj-database-url"
-version = "2.2.0"
+version = "2.3.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "django" },
{ name = "typing-extensions" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/1a/48/51f398a47c197f584b3445de886986ddc40de18bdb6e168f325a8d2c7bca/dj_database_url-2.2.0.tar.gz", hash = "sha256:9f9b05058ddf888f1e6f840048b8d705ff9395e3b52a07165daa3d8b9360551b", size = 10874 }
+sdist = { url = "https://files.pythonhosted.org/packages/98/9f/fc9905758256af4f68a55da94ab78a13e7775074edfdcaddd757d4921686/dj_database_url-2.3.0.tar.gz", hash = "sha256:ae52e8e634186b57e5a45e445da5dc407a819c2ceed8a53d1fac004cc5288787", size = 10980 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/6f/9a/13f173c716d07283661e821f7e1624d0904835151b4f099687455dbef81e/dj_database_url-2.2.0-py3-none-any.whl", hash = "sha256:3e792567b0aa9a4884860af05fe2aa4968071ad351e033b6db632f97ac6db9de", size = 7764 },
+ { url = "https://files.pythonhosted.org/packages/e5/91/641a4e5c8903ed59f6cbcce571003bba9c5d2f731759c31db0ba83bb0bdb/dj_database_url-2.3.0-py3-none-any.whl", hash = "sha256:bb0d414ba0ac5cd62773ec7f86f8cc378a9dbb00a80884c2fc08cc570452521e", size = 7793 },
]
[[package]]
@@ -433,13 +433,13 @@ wheels = [
[[package]]
name = "django-tastypie"
-version = "0.14.7"
+version = "0.15.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "python-dateutil" },
{ name = "python-mimeparse" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/d4/4c/773a6c48a9ff4d243823a076d0df6e94f09d25897759fb6e8f9a3a71a3ca/django-tastypie-0.14.7.tar.gz", hash = "sha256:5769e997d66726babb0cbb7643ff278b994b8ca775c5a4c510dfa0f386567d50", size = 155126 }
+sdist = { url = "https://files.pythonhosted.org/packages/c7/e1/dc8ab4a7f2304ee677175dd8f6b6edc328fb06cf5bab724657d94bbee2ab/django_tastypie-0.15.0.tar.gz", hash = "sha256:baddce528e53646ee400e7c2dbee9a7c61b98a9fb67c8be2c3cf0f70eb10aa3c", size = 156296 }
[[package]]
name = "feedparser"
@@ -1040,26 +1040,26 @@ wheels = [
[[package]]
name = "uv"
-version = "0.5.11"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/c8/28/3000f4e3331a7ad3e9c842268110d6cd1686c12a4e3f44df12fffbc39931/uv-0.5.11.tar.gz", hash = "sha256:6094ca4c5f917d58f884011416bb15066e222ef8d0494f26b0156ac97ad6810b", size = 2527307 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/27/a0/be21638a31d0fde51ebf027a040893962f5d69615c10bbcb2808baa8d58f/uv-0.5.11-py3-none-linux_armv6l.whl", hash = "sha256:736c9b8c86b18eb4dded22cd0f61cc0302bf387de860806c6700b561a4bb95f9", size = 14509010 },
- { url = "https://files.pythonhosted.org/packages/f0/2f/becf81ef79a2a38d5c30ac5554062081731765069ae2164858b252f03cbc/uv-0.5.11-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:164e068ebdf1177c8863c870bb68e411105b44d53cd91e3b9d8f5fd9202420d8", size = 14440761 },
- { url = "https://files.pythonhosted.org/packages/33/8e/287acf621210c1c2d81c3dc5616ef56471e589d3879f9b26fbc135df85d8/uv-0.5.11-py3-none-macosx_11_0_arm64.whl", hash = "sha256:bac233c1e3ae343d0904f78e4a18ca0b479d304aa8de2175df9d72b76dd7764e", size = 13382438 },
- { url = "https://files.pythonhosted.org/packages/55/41/8a2fb89de0341586d2988e0874b6610278200e48b52f10f29f0ec144d507/uv-0.5.11-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:1fe74893f77f343a43bcfaee2600b63f99a26a82568cfe16d0d1b5a77d9b033f", size = 13681092 },
- { url = "https://files.pythonhosted.org/packages/7a/85/553f32ea6640a534081d8f46a1575a107d9b3e79d0b8758e94406f3c7400/uv-0.5.11-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7d1e78c010cf112ddd02d704579e6501c3104a34c944c01f618fc417d6fd55a8", size = 14285797 },
- { url = "https://files.pythonhosted.org/packages/65/dc/2b018f459628c43bd34b72feba515d18ba576a87819e5914d48c05a1e07f/uv-0.5.11-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c2d455db44cc5de70e359e88da9659397f52e78190a9a8922defdee7ed26787", size = 14962196 },
- { url = "https://files.pythonhosted.org/packages/d7/34/8d740eaa1768ab196b1b03854a51df963b1207cb266a83f4f505edc7c36d/uv-0.5.11-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:cefa3ec37f83acdcb4b067ef09622a78e56a22fc6376f5705cd64435bc9bc280", size = 15478207 },
- { url = "https://files.pythonhosted.org/packages/8e/02/d20701859a3c82a20120942b87cf3bc54af162b62a2660d3ca942268c64e/uv-0.5.11-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:914dd829808e5d65bf261cbfbb8a01ee80f7d90bc8c9e54f2fc5aa2501f5eec1", size = 15229713 },
- { url = "https://files.pythonhosted.org/packages/98/51/10834427c3f7d3600e8a955ab69d8c85acba9ad3d5c77f05cd63dc212140/uv-0.5.11-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1f6a7d727e86deb67d0a4df669de8c03033cd19ed23d27c7113abd7cb0b9bd7", size = 19847854 },
- { url = "https://files.pythonhosted.org/packages/9b/97/13a5a464529148f79f2aa2877bc0033357c5f9fb42c72b3cb4a2a66641f3/uv-0.5.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08c660c69e7dd874b52ad96b597b57e9f999659f3d9827cdbad884a68e48f7e9", size = 14974091 },
- { url = "https://files.pythonhosted.org/packages/88/65/b18bcff24029615075bf9987b3249befdfbc858ef9711b56844239117992/uv-0.5.11-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:d24d4e816010b692d1180b69eb8aef1d16657a43b5e2edab8be71a2e700ccf9f", size = 13911399 },
- { url = "https://files.pythonhosted.org/packages/e9/dc/ac5da28965b6cc6ef9eb34f8617f94577bfe7345b14c90fb54efae0905e7/uv-0.5.11-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:a2461a563e28b75cc3b396ed910feecac9518a90c49ac312b1a9da77bae10911", size = 14247167 },
- { url = "https://files.pythonhosted.org/packages/ec/5d/fd9b447f1f3e40d3b4c5ad404e0bf29ab8126ddf8ded128c440fff6cb295/uv-0.5.11-py3-none-musllinux_1_1_i686.whl", hash = "sha256:7d2571f175ded2631220c4586e3e14e93952db4a681d0ca094e6cc4124001a83", size = 14629087 },
- { url = "https://files.pythonhosted.org/packages/06/1b/dbf2473888d41f553d37ccb811a2645fe85386e19799eb2b35e4ba8519c6/uv-0.5.11-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:398eb87ef23b0cd25a8bfcc0dddf0d360d92aba03f660962f447a6585ced440b", size = 15126094 },
- { url = "https://files.pythonhosted.org/packages/81/4f/d533c3975ae295a3a4528ec5022cf49162200e1721a9d0ed110369099560/uv-0.5.11-py3-none-win32.whl", hash = "sha256:4bd0c2868dde8ddef89b9e33a85913e450bb71b834f6d73b525e450e840639c8", size = 14383230 },
- { url = "https://files.pythonhosted.org/packages/45/83/a1f73ef111979d6e16b717a9333af2962434a9ea47122836840cdc80d31e/uv-0.5.11-py3-none-win_amd64.whl", hash = "sha256:48a3bcbc480d5f922145cd2c68182dcb11effa3ca9f5a9ae9b2f6ce21f9ade32", size = 16204754 },
+version = "0.5.13"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a4/09/dc3b7beb8abc663c962320eff9862e5c718383bd6e03e9490da5621f77c5/uv-0.5.13.tar.gz", hash = "sha256:58a66786f2e95c89539bafd819cf2959f56199457301eac8faa920c1872c4f36", size = 2555484 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/52/bf/142c1aefdb0cdb1200d8fd2193073d3b4b28028a7cacbce3fcaafe5fd9bf/uv-0.5.13-py3-none-linux_armv6l.whl", hash = "sha256:45301cb355fc0525e692d220ea7cb196e8378a53162b27d6eea6e65c7635ed3d", size = 14408033 },
+ { url = "https://files.pythonhosted.org/packages/a0/3e/dc408e34fbb6e7bb5d1462dfeb765074c7951d400e31ba31c9b21ac46250/uv-0.5.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ff96602b7d391f35dc25122c2661e680a9e94864e96801611ef05c853826c82c", size = 14406050 },
+ { url = "https://files.pythonhosted.org/packages/04/da/2e8cd58fb76c213a03c2fb556ad0858a6e585cd6e4b5f0e531ac81f113a8/uv-0.5.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:941c13f15a8726a2f5ad3fffa0bbe98e221c98fbe73adbca62cf327bd3fb029c", size = 13370750 },
+ { url = "https://files.pythonhosted.org/packages/92/f1/4a0c9c1dbf6a237bd48fca67b9732e2d33e05536e2f54e8290c90e552ebc/uv-0.5.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:642d7e62c376487a63a03fb830749fb24dd7653f715864df2fb8788f29dfb85e", size = 13646567 },
+ { url = "https://files.pythonhosted.org/packages/83/41/c39977fdc5eb6c2060a7705963460a0214452ee8d3f79bb8b96b3bbdaca2/uv-0.5.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b5aab53db952f7f4505cfc2f62ecedb4a7977d746622f67cbadf052bef0d916e", size = 14172837 },
+ { url = "https://files.pythonhosted.org/packages/d2/21/0823f2ac33febb103dfc51e0aa43c4540375b29689dfc846a897b1d704cb/uv-0.5.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f57250f46914affab4e4ca50822f1fbc7910df01818a22b7d91d4f5ccc5eb80c", size = 14907424 },
+ { url = "https://files.pythonhosted.org/packages/82/51/04ed1d8e5cac1f3f26f20c9cb0202b1fad0bb3fb1c8c0ba320f82eb0b205/uv-0.5.13-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:6fb26d2b6d4b6467b98acc22b67bbdd16360a1b843842d7cd77ff4df70884567", size = 15497699 },
+ { url = "https://files.pythonhosted.org/packages/f7/b9/dd859a72bfde9c2daa7f64ebad699e4e75fda1e45dcf6ac8026f88296b55/uv-0.5.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:414dd7083bd7e06ab2db0ee6cfe81b0810c416e79ff1643701e15e2df5e1db2b", size = 15225898 },
+ { url = "https://files.pythonhosted.org/packages/c0/bd/faed9861a27b9a24c0e93b5c18fbf0f4cc7a88e46bf15ad0fa03ffc7fb98/uv-0.5.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:01fc5e928efba822ff28007f827c3c274b644508253fe358ec79085bae1da0c9", size = 19963452 },
+ { url = "https://files.pythonhosted.org/packages/a7/64/00896d517e95621aa10e7a19dc6de636edab73f80b5e6ff4df73188731be/uv-0.5.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82479440765e507af1f2732bd496ec6ed849488f5ce310b8556cfe8c12da1c5f", size = 14970047 },
+ { url = "https://files.pythonhosted.org/packages/d0/8f/f62f7fe20b7ead1e2afbe050932e698eb5ce6c2649fe49c2d2f96dc5fcba/uv-0.5.13-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:18f2141e71f6cb4c0ab44f1a100838d336f14c1d7a1c62444c79c2c2554331be", size = 13854500 },
+ { url = "https://files.pythonhosted.org/packages/52/2b/efef56357acb6a63aab425f03c8d819eef7cd261a34bf8b6f64bc86a82d2/uv-0.5.13-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:4c2e75845c9c5adae3e8274967f70023b740488d732f88100baeef70090b60a0", size = 14178985 },
+ { url = "https://files.pythonhosted.org/packages/e3/83/394d65c16d058eda1179c05418c68289f983aab2c278d06ea273e3e6299a/uv-0.5.13-py3-none-musllinux_1_1_i686.whl", hash = "sha256:6de38097d5efa86ae62a71ff268e16f7eab86f4afa63c32b546cb7f5a182874f", size = 14552142 },
+ { url = "https://files.pythonhosted.org/packages/4b/6e/712477a76954f64bb6f0391c9dd1081e41c97d1f653c92688b1618e7fcdc/uv-0.5.13-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:30440409a28f1d5d34af8839a48ba9c26da06fc295f363ba9b12689b796453d4", size = 15088698 },
+ { url = "https://files.pythonhosted.org/packages/7d/b6/a06fa33db44426275ab0ba87dc4a4e770acfab0897ee212a6ff4d3423e1d/uv-0.5.13-py3-none-win32.whl", hash = "sha256:df2a751e8319e11ef2d8bec30d549ee13949027aaa936ab2a0ab126602f4232b", size = 14459272 },
+ { url = "https://files.pythonhosted.org/packages/a5/c8/b3bdc883e4ca0612ddd9f956d116308742f12d9140361dba6b2fcf66294d/uv-0.5.13-py3-none-win_amd64.whl", hash = "sha256:4219f1ed370bb2cec5f10dcc93fa9ecf5615fa67e0b71eef4817d571291f0bfc", size = 16315884 },
]
[[package]]