From 81f27cb951161898da2a34554f07527986a7c52a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Mac=C3=ADas?= Date: Thu, 12 Feb 2026 16:17:06 +0000 Subject: [PATCH 01/14] Update Django and urllib3 dependencies to latest versions --- cp2/pyproject.toml | 4 ++-- cp2/uv.lock | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/cp2/pyproject.toml b/cp2/pyproject.toml index 629eedaa..ca507837 100644 --- a/cp2/pyproject.toml +++ b/cp2/pyproject.toml @@ -7,11 +7,11 @@ requires-python = "==3.12.*" dependencies = [ "certifi==2025.10.5", "chardet==3.0.4", - "django==4.2.26", + "django==4.2.28", "django-utils-six==2.0", "gunicorn==23.0.0", "idna==3.11", "pytz==2018.4", "requests==2.32.5", - "urllib3>=2.5.0", + "urllib3>=2.6.3", ] diff --git a/cp2/uv.lock b/cp2/uv.lock index 4a52e75b..d2b08395 100644 --- a/cp2/uv.lock +++ b/cp2/uv.lock @@ -74,27 +74,27 @@ dependencies = [ requires-dist = [ { name = "certifi", specifier = "==2025.10.5" }, { name = "chardet", specifier = "==3.0.4" }, - { name = "django", specifier = "==4.2.26" }, + { name = "django", specifier = "==4.2.28" }, { name = "django-utils-six", specifier = "==2.0" }, { name = "gunicorn", specifier = "==23.0.0" }, { name = "idna", specifier = "==3.11" }, { name = "pytz", specifier = "==2018.4" }, { name = "requests", specifier = "==2.32.5" }, - { name = "urllib3", specifier = ">=2.5.0" }, + { name = "urllib3", specifier = ">=2.6.3" }, ] [[package]] name = "django" -version = "4.2.26" +version = "4.2.28" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "asgiref" }, { name = "sqlparse" }, { name = "tzdata", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bc/f2/5cab08b4174b46cd9d5b4d4439d211f5dd15bec256fb43e8287adbb79580/django-4.2.26.tar.gz", hash = "sha256:9398e487bcb55e3f142cb56d19fbd9a83e15bb03a97edc31f408361ee76d9d7a", size = 10433052, upload-time = "2025-11-05T14:08:23.522Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/a9/25b75b11a4c7a6efe1661c181afe504992e0659ca6eedb72a065cdd91a25/django-4.2.28.tar.gz", hash = "sha256:a4b9cd881991add394cafa8bb3b11ad1742d1e1470ba99c3ef53dc540316ccfe", size = 10464933, upload-time = "2026-02-03T13:55:27.686Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/6f/873365d280002de462852c20bcf050564e2354770041bd950bfb4a16d91e/django-4.2.26-py3-none-any.whl", hash = "sha256:c96e64fc3c359d051a6306871bd26243db1bd02317472a62ffdbe6c3cae14280", size = 7994264, upload-time = "2025-11-05T14:08:20.328Z" }, + { url = "https://files.pythonhosted.org/packages/68/20/6d0808bc7500a6c654eae17b53f791a50af2c3f3ac4f328cbec324948c31/django-4.2.28-py3-none-any.whl", hash = "sha256:49a23c1b83ef31525f8d71a57b040f91d34660edb3f086280a8519855655ed3c", size = 7995543, upload-time = "2026-02-03T13:55:09.798Z" }, ] [[package]] @@ -180,9 +180,9 @@ wheels = [ [[package]] name = "urllib3" -version = "2.5.0" +version = "2.6.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, ] From b58b7327730bc77027c84920a27143c158bd6386 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Mac=C3=ADas?= Date: Thu, 12 Feb 2026 16:17:16 +0000 Subject: [PATCH 02/14] Enhance parse_iso filter to support multiple ISO datetime formats --- .../ControlPanel/templatetags/filters.py | 34 ++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/cp2/ControlPanel/ControlPanel/templatetags/filters.py b/cp2/ControlPanel/ControlPanel/templatetags/filters.py index 8f1fe776..ed12b3a1 100644 --- a/cp2/ControlPanel/ControlPanel/templatetags/filters.py +++ b/cp2/ControlPanel/ControlPanel/templatetags/filters.py @@ -7,7 +7,33 @@ @register.filter(expects_localtime=True) def parse_iso(value): - try: - return datetime.strptime(value, "%Y-%m-%d %H:%M:%S.%f") - except Exception: - return datetime.strptime(value, "%Y-%m-%d %H:%M:%S") + """Parse several common ISO datetime string formats into a datetime. + + Accepts inputs like: + - "2026-02-12T09:54:26.879578" + - "2026-02-12 09:54:26.879578" + - "2026-02-12T09:54:26" + - "2026-02-12 09:54:26" + - "2026-02-12" + + If `value` is already a datetime, it is returned unchanged. If parsing + fails, the original value is returned. + """ + if isinstance(value, datetime): + return value + + formats = ( + "%Y-%m-%dT%H:%M:%S.%f", + "%Y-%m-%d %H:%M:%S.%f", + "%Y-%m-%dT%H:%M:%S", + "%Y-%m-%d %H:%M:%S", + "%Y-%m-%d", + ) + + for fmt in formats: + try: + return datetime.strptime(value, fmt) + except Exception: + continue + + return value From 166c3476b63bc7b3f00b9b8c1e254548ef312b36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Mac=C3=ADas?= Date: Thu, 12 Feb 2026 16:17:36 +0000 Subject: [PATCH 03/14] Update cryptography dependency to version 46.0.5 --- ipol_demo/modules/core/pyproject.toml | 2 +- ipol_demo/modules/core/uv.lock | 67 +++++++++++++-------------- 2 files changed, 33 insertions(+), 36 deletions(-) diff --git a/ipol_demo/modules/core/pyproject.toml b/ipol_demo/modules/core/pyproject.toml index 25a0b7b3..1991095a 100644 --- a/ipol_demo/modules/core/pyproject.toml +++ b/ipol_demo/modules/core/pyproject.toml @@ -5,7 +5,7 @@ description = "Ipol Core module" readme = "README.md" requires-python = "==3.13.*" dependencies = [ - "cryptography==46.0.0", + "cryptography==46.0.5", "fastapi==0.123.0", "imagecodecs==2025.11.11", "imageio==2.9.0", diff --git a/ipol_demo/modules/core/uv.lock b/ipol_demo/modules/core/uv.lock index e5e20b9b..5a1df45c 100644 --- a/ipol_demo/modules/core/uv.lock +++ b/ipol_demo/modules/core/uv.lock @@ -125,7 +125,7 @@ dev = [ [package.metadata] requires-dist = [ - { name = "cryptography", specifier = "==46.0.0" }, + { name = "cryptography", specifier = "==46.0.5" }, { name = "fastapi", specifier = "==0.123.0" }, { name = "imagecodecs", specifier = "==2025.11.11" }, { name = "imageio", specifier = "==2.9.0" }, @@ -148,44 +148,41 @@ dev = [{ name = "pytest", specifier = ">=9.0.1" }] [[package]] name = "cryptography" -version = "46.0.0" +version = "46.0.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/80/ee/04cd4314db26ffc951c1ea90bde30dd226880ab9343759d7abbecef377ee/cryptography-46.0.0.tar.gz", hash = "sha256:99f64a6d15f19f3afd78720ad2978f6d8d4c68cd4eb600fab82ab1a7c2071dca", size = 749158, upload-time = "2025-09-16T21:07:49.091Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/04/bd/3e935ca6e87dc4969683f5dd9e49adaf2cb5734253d93317b6b346e0bd33/cryptography-46.0.0-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:c9c4121f9a41cc3d02164541d986f59be31548ad355a5c96ac50703003c50fb7", size = 7285468, upload-time = "2025-09-16T21:05:52.026Z" }, - { url = "https://files.pythonhosted.org/packages/c7/ee/dd17f412ce64b347871d7752657c5084940d42af4d9c25b1b91c7ee53362/cryptography-46.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4f70cbade61a16f5e238c4b0eb4e258d177a2fcb59aa0aae1236594f7b0ae338", size = 4308218, upload-time = "2025-09-16T21:05:55.653Z" }, - { url = "https://files.pythonhosted.org/packages/2f/53/f0b865a971e4e8b3e90e648b6f828950dea4c221bb699421e82ef45f0ef9/cryptography-46.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d1eccae15d5c28c74b2bea228775c63ac5b6c36eedb574e002440c0bc28750d3", size = 4571982, upload-time = "2025-09-16T21:05:57.322Z" }, - { url = "https://files.pythonhosted.org/packages/d4/c8/035be5fd63a98284fd74df9e04156f9fed7aa45cef41feceb0d06cbdadd0/cryptography-46.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:1b4fba84166d906a22027f0d958e42f3a4dbbb19c28ea71f0fb7812380b04e3c", size = 4307996, upload-time = "2025-09-16T21:05:59.043Z" }, - { url = "https://files.pythonhosted.org/packages/aa/4a/dbb6d7d0a48b95984e2d4caf0a4c7d6606cea5d30241d984c0c02b47f1b6/cryptography-46.0.0-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:523153480d7575a169933f083eb47b1edd5fef45d87b026737de74ffeb300f69", size = 4015692, upload-time = "2025-09-16T21:06:01.324Z" }, - { url = "https://files.pythonhosted.org/packages/65/48/aafcffdde716f6061864e56a0a5908f08dcb8523dab436228957c8ebd5df/cryptography-46.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:f09a3a108223e319168b7557810596631a8cb864657b0c16ed7a6017f0be9433", size = 4982192, upload-time = "2025-09-16T21:06:03.367Z" }, - { url = "https://files.pythonhosted.org/packages/4c/ab/1e73cfc181afc3054a09e5e8f7753a8fba254592ff50b735d7456d197353/cryptography-46.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c1f6ccd6f2eef3b2eb52837f0463e853501e45a916b3fc42e5d93cf244a4b97b", size = 4603944, upload-time = "2025-09-16T21:06:05.29Z" }, - { url = "https://files.pythonhosted.org/packages/3a/02/d71dac90b77c606c90c366571edf264dc8bd37cf836e7f902253cbf5aa77/cryptography-46.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:80a548a5862d6912a45557a101092cd6c64ae1475b82cef50ee305d14a75f598", size = 4308149, upload-time = "2025-09-16T21:06:07.006Z" }, - { url = "https://files.pythonhosted.org/packages/29/e6/4dcb67fdc6addf4e319a99c4bed25776cb691f3aa6e0c4646474748816c6/cryptography-46.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:6c39fd5cd9b7526afa69d64b5e5645a06e1b904f342584b3885254400b63f1b3", size = 4947449, upload-time = "2025-09-16T21:06:11.244Z" }, - { url = "https://files.pythonhosted.org/packages/26/04/91e3fad8ee33aa87815c8f25563f176a58da676c2b14757a4d3b19f0253c/cryptography-46.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:d5c0cbb2fb522f7e39b59a5482a1c9c5923b7c506cfe96a1b8e7368c31617ac0", size = 4603549, upload-time = "2025-09-16T21:06:13.268Z" }, - { url = "https://files.pythonhosted.org/packages/9c/6e/caf4efadcc8f593cbaacfbb04778f78b6d0dac287b45cec25e5054de38b7/cryptography-46.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6d8945bc120dcd90ae39aa841afddaeafc5f2e832809dc54fb906e3db829dfdc", size = 4435976, upload-time = "2025-09-16T21:06:16.514Z" }, - { url = "https://files.pythonhosted.org/packages/c1/c0/704710f349db25c5b91965c3662d5a758011b2511408d9451126429b6cd6/cryptography-46.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:88c09da8a94ac27798f6b62de6968ac78bb94805b5d272dbcfd5fdc8c566999f", size = 4709447, upload-time = "2025-09-16T21:06:19.246Z" }, - { url = "https://files.pythonhosted.org/packages/91/5e/ff63bfd27b75adaf75cc2398de28a0b08105f9d7f8193f3b9b071e38e8b9/cryptography-46.0.0-cp311-abi3-win32.whl", hash = "sha256:3738f50215211cee1974193a1809348d33893696ce119968932ea117bcbc9b1d", size = 3058317, upload-time = "2025-09-16T21:06:21.466Z" }, - { url = "https://files.pythonhosted.org/packages/46/47/4caf35014c4551dd0b43aa6c2e250161f7ffcb9c3918c9e075785047d5d2/cryptography-46.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:bbaa5eef3c19c66613317dc61e211b48d5f550db009c45e1c28b59d5a9b7812a", size = 3523891, upload-time = "2025-09-16T21:06:23.856Z" }, - { url = "https://files.pythonhosted.org/packages/98/66/6a0cafb3084a854acf808fccf756cbc9b835d1b99fb82c4a15e2e2ffb404/cryptography-46.0.0-cp311-abi3-win_arm64.whl", hash = "sha256:16b5ac72a965ec9d1e34d9417dbce235d45fa04dac28634384e3ce40dfc66495", size = 2932145, upload-time = "2025-09-16T21:06:25.842Z" }, - { url = "https://files.pythonhosted.org/packages/f2/5f/0cf967a1dc1419d5dde111bd0e22872038199f4e4655539ea6f4da5ad7f1/cryptography-46.0.0-cp314-abi3-macosx_10_9_universal2.whl", hash = "sha256:91585fc9e696abd7b3e48a463a20dda1a5c0eeeca4ba60fa4205a79527694390", size = 7203952, upload-time = "2025-09-16T21:06:28.21Z" }, - { url = "https://files.pythonhosted.org/packages/53/06/80e7256a4677c2e9eb762638e8200a51f6dd56d2e3de3e34d0a83c2f5f80/cryptography-46.0.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:1d2073313324226fd846e6b5fc340ed02d43fd7478f584741bd6b791c33c9fee", size = 7257206, upload-time = "2025-09-16T21:06:59.295Z" }, - { url = "https://files.pythonhosted.org/packages/3d/b8/a5ed987f5c11b242713076121dddfff999d81fb492149c006a579d0e4099/cryptography-46.0.0-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:83af84ebe7b6e9b6de05050c79f8cc0173c864ce747b53abce6a11e940efdc0d", size = 4301182, upload-time = "2025-09-16T21:07:01.624Z" }, - { url = "https://files.pythonhosted.org/packages/da/94/f1c1f30110c05fa5247bf460b17acfd52fa3f5c77e94ba19cff8957dc5e6/cryptography-46.0.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c3cd09b1490c1509bf3892bde9cef729795fae4a2fee0621f19be3321beca7e4", size = 4562561, upload-time = "2025-09-16T21:07:03.386Z" }, - { url = "https://files.pythonhosted.org/packages/5d/54/8decbf2f707350bedcd525833d3a0cc0203d8b080d926ad75d5c4de701ba/cryptography-46.0.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d14eaf1569d6252280516bedaffdd65267428cdbc3a8c2d6de63753cf0863d5e", size = 4301974, upload-time = "2025-09-16T21:07:04.962Z" }, - { url = "https://files.pythonhosted.org/packages/82/63/c34a2f3516c6b05801f129616a5a1c68a8c403b91f23f9db783ee1d4f700/cryptography-46.0.0-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ab3a14cecc741c8c03ad0ad46dfbf18de25218551931a23bca2731d46c706d83", size = 4009462, upload-time = "2025-09-16T21:07:06.569Z" }, - { url = "https://files.pythonhosted.org/packages/cd/c5/92ef920a4cf8ff35fcf9da5a09f008a6977dcb9801c709799ec1bf2873fb/cryptography-46.0.0-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:8e8b222eb54e3e7d3743a7c2b1f7fa7df7a9add790307bb34327c88ec85fe087", size = 4980769, upload-time = "2025-09-16T21:07:08.269Z" }, - { url = "https://files.pythonhosted.org/packages/a9/8f/1705f7ea3b9468c4a4fef6cce631db14feb6748499870a4772993cbeb729/cryptography-46.0.0-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:7f3f88df0c9b248dcc2e76124f9140621aca187ccc396b87bc363f890acf3a30", size = 4591812, upload-time = "2025-09-16T21:07:10.288Z" }, - { url = "https://files.pythonhosted.org/packages/34/b9/2d797ce9d346b8bac9f570b43e6e14226ff0f625f7f6f2f95d9065e316e3/cryptography-46.0.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9aa85222f03fdb30defabc7a9e1e3d4ec76eb74ea9fe1504b2800844f9c98440", size = 4301844, upload-time = "2025-09-16T21:07:12.522Z" }, - { url = "https://files.pythonhosted.org/packages/a8/2d/8efc9712997b46aea2ac8f74adc31f780ac4662e3b107ecad0d5c1a0c7f8/cryptography-46.0.0-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:f9aaf2a91302e1490c068d2f3af7df4137ac2b36600f5bd26e53d9ec320412d3", size = 4943257, upload-time = "2025-09-16T21:07:14.289Z" }, - { url = "https://files.pythonhosted.org/packages/c4/0c/bc365287a97d28aa7feef8810884831b2a38a8dc4cf0f8d6927ad1568d27/cryptography-46.0.0-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:32670ca085150ff36b438c17f2dfc54146fe4a074ebf0a76d72fb1b419a974bc", size = 4591154, upload-time = "2025-09-16T21:07:16.271Z" }, - { url = "https://files.pythonhosted.org/packages/51/3b/0b15107277b0c558c02027da615f4e78c892f22c6a04d29c6ad43fcddca6/cryptography-46.0.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0f58183453032727a65e6605240e7a3824fd1d6a7e75d2b537e280286ab79a52", size = 4428200, upload-time = "2025-09-16T21:07:18.118Z" }, - { url = "https://files.pythonhosted.org/packages/cf/24/814d69418247ea2cfc985eec6678239013500d745bc7a0a35a32c2e2f3be/cryptography-46.0.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4bc257c2d5d865ed37d0bd7c500baa71f939a7952c424f28632298d80ccd5ec1", size = 4699862, upload-time = "2025-09-16T21:07:20.219Z" }, - { url = "https://files.pythonhosted.org/packages/fb/1e/665c718e0c45281a4e22454fa8a9bd8835f1ceb667b9ffe807baa41cd681/cryptography-46.0.0-cp38-abi3-win32.whl", hash = "sha256:df932ac70388be034b2e046e34d636245d5eeb8140db24a6b4c2268cd2073270", size = 3043766, upload-time = "2025-09-16T21:07:21.969Z" }, - { url = "https://files.pythonhosted.org/packages/78/7e/12e1e13abff381c702697845d1cf372939957735f49ef66f2061f38da32f/cryptography-46.0.0-cp38-abi3-win_amd64.whl", hash = "sha256:274f8b2eb3616709f437326185eb563eb4e5813d01ebe2029b61bfe7d9995fbb", size = 3517216, upload-time = "2025-09-16T21:07:24.024Z" }, - { url = "https://files.pythonhosted.org/packages/ad/55/009497b2ae7375db090b41f9fe7a1a7362f804ddfe17ed9e34f748fcb0e5/cryptography-46.0.0-cp38-abi3-win_arm64.whl", hash = "sha256:249c41f2bbfa026615e7bdca47e4a66135baa81b08509ab240a2e666f6af5966", size = 2923145, upload-time = "2025-09-16T21:07:25.74Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/60/04/ee2a9e8542e4fa2773b81771ff8349ff19cdd56b7258a0cc442639052edb/cryptography-46.0.5.tar.gz", hash = "sha256:abace499247268e3757271b2f1e244b36b06f8515cf27c4d49468fc9eb16e93d", size = 750064, upload-time = "2026-02-10T19:18:38.255Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/81/b0bb27f2ba931a65409c6b8a8b358a7f03c0e46eceacddff55f7c84b1f3b/cryptography-46.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:351695ada9ea9618b3500b490ad54c739860883df6c1f555e088eaf25b1bbaad", size = 7176289, upload-time = "2026-02-10T19:17:08.274Z" }, + { url = "https://files.pythonhosted.org/packages/ff/9e/6b4397a3e3d15123de3b1806ef342522393d50736c13b20ec4c9ea6693a6/cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c18ff11e86df2e28854939acde2d003f7984f721eba450b56a200ad90eeb0e6b", size = 4275637, upload-time = "2026-02-10T19:17:10.53Z" }, + { url = "https://files.pythonhosted.org/packages/63/e7/471ab61099a3920b0c77852ea3f0ea611c9702f651600397ac567848b897/cryptography-46.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d7e3d356b8cd4ea5aff04f129d5f66ebdc7b6f8eae802b93739ed520c47c79b", size = 4424742, upload-time = "2026-02-10T19:17:12.388Z" }, + { url = "https://files.pythonhosted.org/packages/37/53/a18500f270342d66bf7e4d9f091114e31e5ee9e7375a5aba2e85a91e0044/cryptography-46.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:50bfb6925eff619c9c023b967d5b77a54e04256c4281b0e21336a130cd7fc263", size = 4277528, upload-time = "2026-02-10T19:17:13.853Z" }, + { url = "https://files.pythonhosted.org/packages/22/29/c2e812ebc38c57b40e7c583895e73c8c5adb4d1e4a0cc4c5a4fdab2b1acc/cryptography-46.0.5-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:803812e111e75d1aa73690d2facc295eaefd4439be1023fefc4995eaea2af90d", size = 4947993, upload-time = "2026-02-10T19:17:15.618Z" }, + { url = "https://files.pythonhosted.org/packages/6b/e7/237155ae19a9023de7e30ec64e5d99a9431a567407ac21170a046d22a5a3/cryptography-46.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ee190460e2fbe447175cda91b88b84ae8322a104fc27766ad09428754a618ed", size = 4456855, upload-time = "2026-02-10T19:17:17.221Z" }, + { url = "https://files.pythonhosted.org/packages/2d/87/fc628a7ad85b81206738abbd213b07702bcbdada1dd43f72236ef3cffbb5/cryptography-46.0.5-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:f145bba11b878005c496e93e257c1e88f154d278d2638e6450d17e0f31e558d2", size = 3984635, upload-time = "2026-02-10T19:17:18.792Z" }, + { url = "https://files.pythonhosted.org/packages/84/29/65b55622bde135aedf4565dc509d99b560ee4095e56989e815f8fd2aa910/cryptography-46.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e9251e3be159d1020c4030bd2e5f84d6a43fe54b6c19c12f51cde9542a2817b2", size = 4277038, upload-time = "2026-02-10T19:17:20.256Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/45e76c68d7311432741faf1fbf7fac8a196a0a735ca21f504c75d37e2558/cryptography-46.0.5-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:47fb8a66058b80e509c47118ef8a75d14c455e81ac369050f20ba0d23e77fee0", size = 4912181, upload-time = "2026-02-10T19:17:21.825Z" }, + { url = "https://files.pythonhosted.org/packages/6d/1a/c1ba8fead184d6e3d5afcf03d569acac5ad063f3ac9fb7258af158f7e378/cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4c3341037c136030cb46e4b1e17b7418ea4cbd9dd207e4a6f3b2b24e0d4ac731", size = 4456482, upload-time = "2026-02-10T19:17:25.133Z" }, + { url = "https://files.pythonhosted.org/packages/f9/e5/3fb22e37f66827ced3b902cf895e6a6bc1d095b5b26be26bd13c441fdf19/cryptography-46.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:890bcb4abd5a2d3f852196437129eb3667d62630333aacc13dfd470fad3aaa82", size = 4405497, upload-time = "2026-02-10T19:17:26.66Z" }, + { url = "https://files.pythonhosted.org/packages/1a/df/9d58bb32b1121a8a2f27383fabae4d63080c7ca60b9b5c88be742be04ee7/cryptography-46.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80a8d7bfdf38f87ca30a5391c0c9ce4ed2926918e017c29ddf643d0ed2778ea1", size = 4667819, upload-time = "2026-02-10T19:17:28.569Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ed/325d2a490c5e94038cdb0117da9397ece1f11201f425c4e9c57fe5b9f08b/cryptography-46.0.5-cp311-abi3-win32.whl", hash = "sha256:60ee7e19e95104d4c03871d7d7dfb3d22ef8a9b9c6778c94e1c8fcc8365afd48", size = 3028230, upload-time = "2026-02-10T19:17:30.518Z" }, + { url = "https://files.pythonhosted.org/packages/e9/5a/ac0f49e48063ab4255d9e3b79f5def51697fce1a95ea1370f03dc9db76f6/cryptography-46.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:38946c54b16c885c72c4f59846be9743d699eee2b69b6988e0a00a01f46a61a4", size = 3480909, upload-time = "2026-02-10T19:17:32.083Z" }, + { url = "https://files.pythonhosted.org/packages/e2/fa/a66aa722105ad6a458bebd64086ca2b72cdd361fed31763d20390f6f1389/cryptography-46.0.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4108d4c09fbbf2789d0c926eb4152ae1760d5a2d97612b92d508d96c861e4d31", size = 7170514, upload-time = "2026-02-10T19:17:56.267Z" }, + { url = "https://files.pythonhosted.org/packages/0f/04/c85bdeab78c8bc77b701bf0d9bdcf514c044e18a46dcff330df5448631b0/cryptography-46.0.5-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1f30a86d2757199cb2d56e48cce14deddf1f9c95f1ef1b64ee91ea43fe2e18", size = 4275349, upload-time = "2026-02-10T19:17:58.419Z" }, + { url = "https://files.pythonhosted.org/packages/5c/32/9b87132a2f91ee7f5223b091dc963055503e9b442c98fc0b8a5ca765fab0/cryptography-46.0.5-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:039917b0dc418bb9f6edce8a906572d69e74bd330b0b3fea4f79dab7f8ddd235", size = 4420667, upload-time = "2026-02-10T19:18:00.619Z" }, + { url = "https://files.pythonhosted.org/packages/a1/a6/a7cb7010bec4b7c5692ca6f024150371b295ee1c108bdc1c400e4c44562b/cryptography-46.0.5-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ba2a27ff02f48193fc4daeadf8ad2590516fa3d0adeeb34336b96f7fa64c1e3a", size = 4276980, upload-time = "2026-02-10T19:18:02.379Z" }, + { url = "https://files.pythonhosted.org/packages/8e/7c/c4f45e0eeff9b91e3f12dbd0e165fcf2a38847288fcfd889deea99fb7b6d/cryptography-46.0.5-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:61aa400dce22cb001a98014f647dc21cda08f7915ceb95df0c9eaf84b4b6af76", size = 4939143, upload-time = "2026-02-10T19:18:03.964Z" }, + { url = "https://files.pythonhosted.org/packages/37/19/e1b8f964a834eddb44fa1b9a9976f4e414cbb7aa62809b6760c8803d22d1/cryptography-46.0.5-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ce58ba46e1bc2aac4f7d9290223cead56743fa6ab94a5d53292ffaac6a91614", size = 4453674, upload-time = "2026-02-10T19:18:05.588Z" }, + { url = "https://files.pythonhosted.org/packages/db/ed/db15d3956f65264ca204625597c410d420e26530c4e2943e05a0d2f24d51/cryptography-46.0.5-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:420d0e909050490d04359e7fdb5ed7e667ca5c3c402b809ae2563d7e66a92229", size = 3978801, upload-time = "2026-02-10T19:18:07.167Z" }, + { url = "https://files.pythonhosted.org/packages/41/e2/df40a31d82df0a70a0daf69791f91dbb70e47644c58581d654879b382d11/cryptography-46.0.5-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:582f5fcd2afa31622f317f80426a027f30dc792e9c80ffee87b993200ea115f1", size = 4276755, upload-time = "2026-02-10T19:18:09.813Z" }, + { url = "https://files.pythonhosted.org/packages/33/45/726809d1176959f4a896b86907b98ff4391a8aa29c0aaaf9450a8a10630e/cryptography-46.0.5-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:bfd56bb4b37ed4f330b82402f6f435845a5f5648edf1ad497da51a8452d5d62d", size = 4901539, upload-time = "2026-02-10T19:18:11.263Z" }, + { url = "https://files.pythonhosted.org/packages/99/0f/a3076874e9c88ecb2ecc31382f6e7c21b428ede6f55aafa1aa272613e3cd/cryptography-46.0.5-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a3d507bb6a513ca96ba84443226af944b0f7f47dcc9a399d110cd6146481d24c", size = 4452794, upload-time = "2026-02-10T19:18:12.914Z" }, + { url = "https://files.pythonhosted.org/packages/02/ef/ffeb542d3683d24194a38f66ca17c0a4b8bf10631feef44a7ef64e631b1a/cryptography-46.0.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9f16fbdf4da055efb21c22d81b89f155f02ba420558db21288b3d0035bafd5f4", size = 4404160, upload-time = "2026-02-10T19:18:14.375Z" }, + { url = "https://files.pythonhosted.org/packages/96/93/682d2b43c1d5f1406ed048f377c0fc9fc8f7b0447a478d5c65ab3d3a66eb/cryptography-46.0.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ced80795227d70549a411a4ab66e8ce307899fad2220ce5ab2f296e687eacde9", size = 4667123, upload-time = "2026-02-10T19:18:15.886Z" }, + { url = "https://files.pythonhosted.org/packages/45/2d/9c5f2926cb5300a8eefc3f4f0b3f3df39db7f7ce40c8365444c49363cbda/cryptography-46.0.5-cp38-abi3-win32.whl", hash = "sha256:02f547fce831f5096c9a567fd41bc12ca8f11df260959ecc7c3202555cc47a72", size = 3010220, upload-time = "2026-02-10T19:18:17.361Z" }, + { url = "https://files.pythonhosted.org/packages/48/ef/0c2f4a8e31018a986949d34a01115dd057bf536905dca38897bacd21fac3/cryptography-46.0.5-cp38-abi3-win_amd64.whl", hash = "sha256:556e106ee01aa13484ce9b0239bca667be5004efb0aabbed28d353df86445595", size = 3467050, upload-time = "2026-02-10T19:18:18.899Z" }, ] [[package]] From 399d2e509419bfd0f05f6b4c15ef792b25de8cdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Mac=C3=ADas?= Date: Thu, 12 Feb 2026 16:18:10 +0000 Subject: [PATCH 04/14] private ssh key removed from endpoint response --- ipol_demo/modules/core/demoinfo/router.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ipol_demo/modules/core/demoinfo/router.py b/ipol_demo/modules/core/demoinfo/router.py index c9ef1fa7..0393e8ae 100644 --- a/ipol_demo/modules/core/demoinfo/router.py +++ b/ipol_demo/modules/core/demoinfo/router.py @@ -305,8 +305,7 @@ def get_ssh_keys(demo_id: int): if isinstance(result, Ok): pubkey, privkey = result.value data = { - "pubkey": pubkey, - "privkey": privkey, + "pubkey": pubkey } else: data = {"error": result.value} From 2b1be68d5f3efdd73b78cb9eb4fd4743abf03e10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Mac=C3=ADas?= Date: Thu, 12 Feb 2026 16:19:11 +0000 Subject: [PATCH 05/14] Refactor error message handling in exec_and_wait function --- ipol_demo/modules/demorunner/demorunner.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/ipol_demo/modules/demorunner/demorunner.py b/ipol_demo/modules/demorunner/demorunner.py index 16495bb1..d8b416bc 100644 --- a/ipol_demo/modules/demorunner/demorunner.py +++ b/ipol_demo/modules/demorunner/demorunner.py @@ -23,7 +23,6 @@ import time import urllib.error import urllib.parse -import urllib.request import zipfile from string import Template from subprocess import PIPE, Popen @@ -630,20 +629,20 @@ async def exec_and_wait( except IPOLTimeoutError: res_data["error"] = "IPOLTimeoutError" - res_data["algo_info"][ - "error_message" - ] = "IPOLTimeoutError, Timeout={} s".format(timeout) + res_data["algo_info"]["error_message"] = ( + "IPOLTimeoutError, Timeout={} s".format(timeout) + ) logger.error(f"exec_and_wait IPOLTimeoutError, demo_id={demo_id}") except RuntimeError as ex: # Read stderr and stdout stderr_content = read_workdir_file(work_dir, "stderr.txt") stdout_content = read_workdir_file(work_dir, "stdout.txt") # Put them in the message for the web interface - res_data["algo_info"][ - "error_message" - ] = "Runtime error\n\ + res_data["algo_info"]["error_message"] = ( + "Runtime error\n\ stderr: {}\nstdout: {}".format( - stderr_content, stdout_content + stderr_content, stdout_content + ) ) res_data["error"] = str(ex) logger.error(res_data) From da82700e538142859210376fae7c4f924b79d0fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Mac=C3=ADas?= Date: Thu, 12 Feb 2026 16:20:29 +0000 Subject: [PATCH 06/14] Update virtualenv dependency to version 20.36.1 in pyproject.toml and uv.lock --- ipol_demo/modules/demorunner/pyproject.toml | 2 +- ipol_demo/modules/demorunner/uv.lock | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/ipol_demo/modules/demorunner/pyproject.toml b/ipol_demo/modules/demorunner/pyproject.toml index 52607e02..822ea123 100644 --- a/ipol_demo/modules/demorunner/pyproject.toml +++ b/ipol_demo/modules/demorunner/pyproject.toml @@ -17,5 +17,5 @@ dependencies = [ "python-multipart==0.0.19", "requests==2.32.5", "uvicorn==0.22.0", - "virtualenv==20.26.6", + "virtualenv==20.36.1", ] diff --git a/ipol_demo/modules/demorunner/uv.lock b/ipol_demo/modules/demorunner/uv.lock index 73255934..18ed7beb 100644 --- a/ipol_demo/modules/demorunner/uv.lock +++ b/ipol_demo/modules/demorunner/uv.lock @@ -336,7 +336,7 @@ requires-dist = [ { name = "python-multipart", specifier = "==0.0.19" }, { name = "requests", specifier = "==2.32.5" }, { name = "uvicorn", specifier = "==0.22.0" }, - { name = "virtualenv", specifier = "==20.26.6" }, + { name = "virtualenv", specifier = "==20.36.1" }, ] [[package]] @@ -436,14 +436,15 @@ wheels = [ [[package]] name = "virtualenv" -version = "20.26.6" +version = "20.36.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, { name = "filelock" }, { name = "platformdirs" }, + { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3f/40/abc5a766da6b0b2457f819feab8e9203cbeae29327bd241359f866a3da9d/virtualenv-20.26.6.tar.gz", hash = "sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48", size = 9372482, upload-time = "2024-09-27T16:28:57.502Z" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/a3/4d310fa5f00863544e1d0f4de93bddec248499ccf97d4791bc3122c9d4f3/virtualenv-20.36.1.tar.gz", hash = "sha256:8befb5c81842c641f8ee658481e42641c68b5eab3521d8e092d18320902466ba", size = 6032239, upload-time = "2026-01-09T18:21:01.296Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/59/90/57b8ac0c8a231545adc7698c64c5a36fa7cd8e376c691b9bde877269f2eb/virtualenv-20.26.6-py3-none-any.whl", hash = "sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2", size = 5999862, upload-time = "2024-09-27T16:28:54.798Z" }, + { url = "https://files.pythonhosted.org/packages/6a/2a/dc2228b2888f51192c7dc766106cd475f1b768c10caaf9727659726f7391/virtualenv-20.36.1-py3-none-any.whl", hash = "sha256:575a8d6b124ef88f6f51d56d656132389f961062a9177016a50e4f507bbcc19f", size = 6008258, upload-time = "2026-01-09T18:20:59.425Z" }, ] From 7b7f3ef6617651a55c535e8e5e3939047ecc77bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Mac=C3=ADas?= Date: Thu, 12 Feb 2026 16:28:58 +0000 Subject: [PATCH 07/14] linted demoinfo router and demorunner --- ipol_demo/modules/core/demoinfo/router.py | 4 +--- ipol_demo/modules/demorunner/demorunner.py | 14 ++++---------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/ipol_demo/modules/core/demoinfo/router.py b/ipol_demo/modules/core/demoinfo/router.py index 0393e8ae..3301c396 100644 --- a/ipol_demo/modules/core/demoinfo/router.py +++ b/ipol_demo/modules/core/demoinfo/router.py @@ -304,9 +304,7 @@ def get_ssh_keys(demo_id: int): result = demoinfo.get_ssh_keys(demo_id) if isinstance(result, Ok): pubkey, privkey = result.value - data = { - "pubkey": pubkey - } + data = {"pubkey": pubkey} else: data = {"error": result.value} return data diff --git a/ipol_demo/modules/demorunner/demorunner.py b/ipol_demo/modules/demorunner/demorunner.py index d8b416bc..2b5c7298 100644 --- a/ipol_demo/modules/demorunner/demorunner.py +++ b/ipol_demo/modules/demorunner/demorunner.py @@ -638,12 +638,8 @@ async def exec_and_wait( stderr_content = read_workdir_file(work_dir, "stderr.txt") stdout_content = read_workdir_file(work_dir, "stdout.txt") # Put them in the message for the web interface - res_data["algo_info"]["error_message"] = ( - "Runtime error\n\ -stderr: {}\nstdout: {}".format( - stderr_content, stdout_content - ) - ) + res_data["algo_info"]["error_message"] = "Runtime error\n\ +stderr: {}\nstdout: {}".format(stderr_content, stdout_content) res_data["error"] = str(ex) logger.error(res_data) @@ -701,10 +697,8 @@ def read_authorized_patterns() -> list: settings.config_common_dir, settings.authorized_patterns ) if not os.path.isfile(authorized_patterns_path): - logger.exception( - f"read_authorized_patterns: \ - File {authorized_patterns_path} doesn't exist" - ) + logger.exception(f"read_authorized_patterns: \ + File {authorized_patterns_path} doesn't exist") return [] # Read config file From c3dfc5dcd19612846ae3ef7523439f50bcfa8ef8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Mac=C3=ADas?= Date: Thu, 12 Feb 2026 16:57:09 +0000 Subject: [PATCH 08/14] linter again.. --- ipol_demo/modules/demorunner/demorunner.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/ipol_demo/modules/demorunner/demorunner.py b/ipol_demo/modules/demorunner/demorunner.py index 2b5c7298..d8b416bc 100644 --- a/ipol_demo/modules/demorunner/demorunner.py +++ b/ipol_demo/modules/demorunner/demorunner.py @@ -638,8 +638,12 @@ async def exec_and_wait( stderr_content = read_workdir_file(work_dir, "stderr.txt") stdout_content = read_workdir_file(work_dir, "stdout.txt") # Put them in the message for the web interface - res_data["algo_info"]["error_message"] = "Runtime error\n\ -stderr: {}\nstdout: {}".format(stderr_content, stdout_content) + res_data["algo_info"]["error_message"] = ( + "Runtime error\n\ +stderr: {}\nstdout: {}".format( + stderr_content, stdout_content + ) + ) res_data["error"] = str(ex) logger.error(res_data) @@ -697,8 +701,10 @@ def read_authorized_patterns() -> list: settings.config_common_dir, settings.authorized_patterns ) if not os.path.isfile(authorized_patterns_path): - logger.exception(f"read_authorized_patterns: \ - File {authorized_patterns_path} doesn't exist") + logger.exception( + f"read_authorized_patterns: \ + File {authorized_patterns_path} doesn't exist" + ) return [] # Read config file From 7b0c9b84f7fb824ccca97dcfd475f290ee4b2193 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Mac=C3=ADas?= Date: Thu, 12 Feb 2026 19:04:46 +0000 Subject: [PATCH 09/14] removal of outdated docker dev env packages --- docker/pkglist | 5 ----- 1 file changed, 5 deletions(-) diff --git a/docker/pkglist b/docker/pkglist index 83fd51b2..ef8fe036 100644 --- a/docker/pkglist +++ b/docker/pkglist @@ -4,7 +4,6 @@ bash-completion mailutils cron-apt git -python2.7 wget cmake ccache @@ -24,12 +23,10 @@ python python3 python-dev python3-dev -python3-cherrypy3 python3-mako python3-jsonschema gnuplot gnuplot-nox -python3-pip python3-yaml libpq-dev libmagic-dev @@ -92,9 +89,7 @@ bash-completion mailutils cron-apt bind9 -ipython3 net-tools -gunicorn screen wget zip From f161300ad1e84157b0e2e4713e5fcde98cb88eba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Mac=C3=ADas?= Date: Thu, 12 Feb 2026 19:07:38 +0000 Subject: [PATCH 10/14] black formatting issue --- ipol_demo/modules/demorunner/demorunner.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/ipol_demo/modules/demorunner/demorunner.py b/ipol_demo/modules/demorunner/demorunner.py index d8b416bc..4635024b 100644 --- a/ipol_demo/modules/demorunner/demorunner.py +++ b/ipol_demo/modules/demorunner/demorunner.py @@ -635,15 +635,11 @@ async def exec_and_wait( logger.error(f"exec_and_wait IPOLTimeoutError, demo_id={demo_id}") except RuntimeError as ex: # Read stderr and stdout - stderr_content = read_workdir_file(work_dir, "stderr.txt") - stdout_content = read_workdir_file(work_dir, "stdout.txt") + stderr_txt = read_workdir_file(work_dir, "stderr.txt") + stdout_txt = read_workdir_file(work_dir, "stdout.txt") # Put them in the message for the web interface - res_data["algo_info"]["error_message"] = ( - "Runtime error\n\ -stderr: {}\nstdout: {}".format( - stderr_content, stdout_content - ) - ) + error_message = f"Runtime error\nstderr: {stderr_txt}\nstdout: {stdout_txt}" + res_data["algo_info"]["error_message"] = error_message res_data["error"] = str(ex) logger.error(res_data) From 98fd30576696be7be0fca683677f7cafc10928bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Mac=C3=ADas?= Date: Fri, 13 Feb 2026 09:00:13 +0000 Subject: [PATCH 11/14] another formatter --- ipol_demo/modules/demorunner/demorunner.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ipol_demo/modules/demorunner/demorunner.py b/ipol_demo/modules/demorunner/demorunner.py index 4635024b..f2448295 100644 --- a/ipol_demo/modules/demorunner/demorunner.py +++ b/ipol_demo/modules/demorunner/demorunner.py @@ -697,10 +697,8 @@ def read_authorized_patterns() -> list: settings.config_common_dir, settings.authorized_patterns ) if not os.path.isfile(authorized_patterns_path): - logger.exception( - f"read_authorized_patterns: \ - File {authorized_patterns_path} doesn't exist" - ) + logger.exception(f"read_authorized_patterns: \ + File {authorized_patterns_path} doesn't exist") return [] # Read config file From f42c7ba0e018f77f273c12a3ace31d6d7b398fe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Mac=C3=ADas?= Date: Fri, 13 Feb 2026 09:14:53 +0000 Subject: [PATCH 12/14] Add black as a development dependency and format exception logging --- ipol_demo/modules/core/pyproject.toml | 1 + ipol_demo/modules/demorunner/demorunner.py | 12 +++++++----- ipol_demo/modules/demorunner/pyproject.toml | 5 +++++ 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/ipol_demo/modules/core/pyproject.toml b/ipol_demo/modules/core/pyproject.toml index 1991095a..ba8a07da 100644 --- a/ipol_demo/modules/core/pyproject.toml +++ b/ipol_demo/modules/core/pyproject.toml @@ -26,4 +26,5 @@ dependencies = [ [dependency-groups] dev = [ "pytest>=9.0.1", + "black>=23.0.0", ] \ No newline at end of file diff --git a/ipol_demo/modules/demorunner/demorunner.py b/ipol_demo/modules/demorunner/demorunner.py index f2448295..f465dd4e 100644 --- a/ipol_demo/modules/demorunner/demorunner.py +++ b/ipol_demo/modules/demorunner/demorunner.py @@ -629,9 +629,9 @@ async def exec_and_wait( except IPOLTimeoutError: res_data["error"] = "IPOLTimeoutError" - res_data["algo_info"]["error_message"] = ( - "IPOLTimeoutError, Timeout={} s".format(timeout) - ) + res_data["algo_info"][ + "error_message" + ] = "IPOLTimeoutError, Timeout={} s".format(timeout) logger.error(f"exec_and_wait IPOLTimeoutError, demo_id={demo_id}") except RuntimeError as ex: # Read stderr and stdout @@ -697,8 +697,10 @@ def read_authorized_patterns() -> list: settings.config_common_dir, settings.authorized_patterns ) if not os.path.isfile(authorized_patterns_path): - logger.exception(f"read_authorized_patterns: \ - File {authorized_patterns_path} doesn't exist") + logger.exception( + f"read_authorized_patterns: \ + File {authorized_patterns_path} doesn't exist" + ) return [] # Read config file diff --git a/ipol_demo/modules/demorunner/pyproject.toml b/ipol_demo/modules/demorunner/pyproject.toml index 822ea123..af549065 100644 --- a/ipol_demo/modules/demorunner/pyproject.toml +++ b/ipol_demo/modules/demorunner/pyproject.toml @@ -19,3 +19,8 @@ dependencies = [ "uvicorn==0.22.0", "virtualenv==20.36.1", ] + +[dependency-groups] +dev = [ + "black>=23.0.0", +] \ No newline at end of file From 55c9a286fb83071b1492b4730bce3c2f55a43bd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Mac=C3=ADas?= Date: Fri, 13 Feb 2026 09:16:14 +0000 Subject: [PATCH 13/14] Fix ExecStart path for venv in demorunner service files --- sysadmin/systemd/core/ipol-demorunner.service | 2 +- sysadmin/systemd/integration/ipol-demorunner.service | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sysadmin/systemd/core/ipol-demorunner.service b/sysadmin/systemd/core/ipol-demorunner.service index a38c6f8e..c39aed9e 100644 --- a/sysadmin/systemd/core/ipol-demorunner.service +++ b/sysadmin/systemd/core/ipol-demorunner.service @@ -4,7 +4,7 @@ After=docker.service [Service] # ~/.local for uv python install, which the venv points to -ExecStart=/usr/bin/docker run --rm --name ipol-demorunner --network=host --log-driver=journald --env HOME=/home/ipol --user 1001:1001 -v /home/ipol/ipolDevel:/home/ipol/ipolDevel -v /home/ipol/.local/:/home/ipol/.local/ --workdir /home/ipol/ipolDevel/ipol_demo/modules/demorunner/ registry.ipol.im/ipol-debian-demorunner ./venv/bin/uvicorn demorunner:app --host 127.0.0.1 --port 9003 --workers 10 +ExecStart=/usr/bin/docker run --rm --name ipol-demorunner --network=host --log-driver=journald --env HOME=/home/ipol --user 1001:1001 -v /home/ipol/ipolDevel:/home/ipol/ipolDevel -v /home/ipol/.local/:/home/ipol/.local/ --workdir /home/ipol/ipolDevel/ipol_demo/modules/demorunner/ registry.ipol.im/ipol-debian-demorunner ./.venv/bin/uvicorn demorunner:app --host 127.0.0.1 --port 9003 --workers 10 TimeoutStartSec=300 ExecStop=/usr/bin/docker stop ipol-demorunner SyslogIdentifier=demorunner diff --git a/sysadmin/systemd/integration/ipol-demorunner.service b/sysadmin/systemd/integration/ipol-demorunner.service index e65b285f..e02ae224 100644 --- a/sysadmin/systemd/integration/ipol-demorunner.service +++ b/sysadmin/systemd/integration/ipol-demorunner.service @@ -5,7 +5,7 @@ After=docker-integration.service [Service] # ~/.local for uv python install, which the venv points to # this one is a bit complex because the demorunner has some dependency on $HOME/$USER -ExecStart=/usr/bin/docker run --rm --name ipol-demorunner --network=host --log-driver=journald --env HOME=/home/integration --user 1005:1005 -v /home/integration/ipolDevel:/home/integration/ipolDevel -v /home/integration/.local/:/home/integration/.local/ -v /home/integration/.cache:/home/integration/.cache --workdir /home/integration/ipolDevel/ipol_demo/modules/demorunner/ registry.ipol.im/ipol-debian-demorunner ./venv/bin/uvicorn demorunner:app --host 127.0.0.1 --port 10004 --workers 10 +ExecStart=/usr/bin/docker run --rm --name ipol-demorunner --network=host --log-driver=journald --env HOME=/home/integration --user 1005:1005 -v /home/integration/ipolDevel:/home/integration/ipolDevel -v /home/integration/.local/:/home/integration/.local/ -v /home/integration/.cache:/home/integration/.cache --workdir /home/integration/ipolDevel/ipol_demo/modules/demorunner/ registry.ipol.im/ipol-debian-demorunner ./.venv/bin/uvicorn demorunner:app --host 127.0.0.1 --port 10004 --workers 10 ExecStop=/usr/bin/docker stop ipol-demorunner WorkingDirectory=/home/integration/ipolDevel/ipol_demo/modules/demorunner/ Environment=DOCKER_HOST=unix:///var/run/docker-integration.sock From 7aa77af9e3b75196ca341e82f7bdf1ccf7089ee2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Mac=C3=ADas?= Date: Fri, 13 Feb 2026 09:16:35 +0000 Subject: [PATCH 14/14] Upgrade black to version 23.12.1 and adjust dependency specifications in pyproject.toml and uv.lock files --- ipol_demo/modules/core/pyproject.toml | 4 +- ipol_demo/modules/core/uv.lock | 49 ++++++++++++++- ipol_demo/modules/demorunner/pyproject.toml | 4 +- ipol_demo/modules/demorunner/uv.lock | 66 +++++++++++++++++++++ 4 files changed, 118 insertions(+), 5 deletions(-) diff --git a/ipol_demo/modules/core/pyproject.toml b/ipol_demo/modules/core/pyproject.toml index ba8a07da..c9b58626 100644 --- a/ipol_demo/modules/core/pyproject.toml +++ b/ipol_demo/modules/core/pyproject.toml @@ -25,6 +25,6 @@ dependencies = [ [dependency-groups] dev = [ + "black~=23.0", "pytest>=9.0.1", - "black>=23.0.0", -] \ No newline at end of file +] diff --git a/ipol_demo/modules/core/uv.lock b/ipol_demo/modules/core/uv.lock index 5a1df45c..b068b28a 100644 --- a/ipol_demo/modules/core/uv.lock +++ b/ipol_demo/modules/core/uv.lock @@ -33,6 +33,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, ] +[[package]] +name = "black" +version = "23.12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "mypy-extensions" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fd/f4/a57cde4b60da0e249073009f4a9087e9e0a955deae78d3c2a493208d0c5c/black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5", size = 620809, upload-time = "2023-12-22T23:06:17.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/14/4da7b12a9abc43a601c215cb5a3d176734578da109f0dbf0a832ed78be09/black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e", size = 194363, upload-time = "2023-12-22T23:06:14.278Z" }, +] + [[package]] name = "certifi" version = "2025.8.3" @@ -120,6 +136,7 @@ dependencies = [ [package.dev-dependencies] dev = [ + { name = "black" }, { name = "pytest" }, ] @@ -144,7 +161,10 @@ requires-dist = [ ] [package.metadata.requires-dev] -dev = [{ name = "pytest", specifier = ">=9.0.1" }] +dev = [ + { name = "black", specifier = "~=23.0" }, + { name = "pytest", specifier = ">=9.0.1" }, +] [[package]] name = "cryptography" @@ -284,6 +304,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/31/ef/dcf1d29c3f530577f61e5fe2f1bd72929acf779953668a8a47a479ae6f26/lxml-6.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:13dcecc9946dca97b11b7c40d29fba63b55ab4170d3c0cf8c0c164343b9bfdcf", size = 3671248, upload-time = "2025-09-22T04:02:27.918Z" }, ] +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + [[package]] name = "numpy" version = "2.2.6" @@ -338,6 +367,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, ] +[[package]] +name = "pathspec" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/36/e27608899f9b8d4dff0617b2d9ab17ca5608956ca44461ac14ac48b44015/pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", size = 131200, upload-time = "2026-01-27T03:59:46.938Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, +] + [[package]] name = "pillow" version = "11.0.0" @@ -365,6 +403,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/51/85/9c33f2517add612e17f3381aee7c4072779130c634921a756c97bc29fb49/pillow-11.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3", size = 2256828, upload-time = "2024-10-15T14:23:39.826Z" }, ] +[[package]] +name = "platformdirs" +version = "4.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/71/25/ccd8e88fcd16a4eb6343a8b4b9635e6f3928a7ebcd82822a14d20e3ca29f/platformdirs-4.7.0.tar.gz", hash = "sha256:fd1a5f8599c85d49b9ac7d6e450bc2f1aaf4a23f1fe86d09952fe20ad365cf36", size = 23118, upload-time = "2026-02-12T22:21:53.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/e3/1eddccb2c39ecfbe09b3add42a04abcc3fa5b468aa4224998ffb8a7e9c8f/platformdirs-4.7.0-py3-none-any.whl", hash = "sha256:1ed8db354e344c5bb6039cd727f096af975194b508e37177719d562b2b540ee6", size = 18983, upload-time = "2026-02-12T22:21:52.237Z" }, +] + [[package]] name = "pluggy" version = "1.6.0" diff --git a/ipol_demo/modules/demorunner/pyproject.toml b/ipol_demo/modules/demorunner/pyproject.toml index af549065..68a19d36 100644 --- a/ipol_demo/modules/demorunner/pyproject.toml +++ b/ipol_demo/modules/demorunner/pyproject.toml @@ -22,5 +22,5 @@ dependencies = [ [dependency-groups] dev = [ - "black>=23.0.0", -] \ No newline at end of file + "black~=23.0", +] diff --git a/ipol_demo/modules/demorunner/uv.lock b/ipol_demo/modules/demorunner/uv.lock index 18ed7beb..5c34f7fe 100644 --- a/ipol_demo/modules/demorunner/uv.lock +++ b/ipol_demo/modules/demorunner/uv.lock @@ -17,6 +17,28 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/15/b3/9b1a8074496371342ec1e796a96f99c82c945a339cd81a8e73de28b4cf9e/anyio-4.11.0-py3-none-any.whl", hash = "sha256:0287e96f4d26d4149305414d4e3bc32f0dcd0862365a4bddea19d7a1ec38c4fc", size = 109097, upload-time = "2025-09-23T09:19:10.601Z" }, ] +[[package]] +name = "black" +version = "23.12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "mypy-extensions" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "platformdirs" }, + { name = "tomli" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fd/f4/a57cde4b60da0e249073009f4a9087e9e0a955deae78d3c2a493208d0c5c/black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5", size = 620809, upload-time = "2023-12-22T23:06:17.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/97/f5c6b46fa6f47263e6e27d6feef967e3e99f4e1aedaaf93fd98f904580e2/black-23.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055", size = 1560093, upload-time = "2023-12-22T23:23:40.554Z" }, + { url = "https://files.pythonhosted.org/packages/ef/54/41aec3623ac8c610ea9eabc2092c7c73aab293ef2858fb3b66904debe78c/black-23.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54", size = 1403728, upload-time = "2023-12-22T23:22:52.826Z" }, + { url = "https://files.pythonhosted.org/packages/e4/24/afa2005a508768228b88ee04e647022be9852e675c8d7237fb1e73e4607d/black-23.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea", size = 1710054, upload-time = "2023-12-22T23:08:47.238Z" }, + { url = "https://files.pythonhosted.org/packages/cb/61/111749529f766170a6cbe4cce5209a94ddba4bad0dda3793a6af641515b3/black-23.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2", size = 1332558, upload-time = "2023-12-22T23:09:08.454Z" }, + { url = "https://files.pythonhosted.org/packages/7b/14/4da7b12a9abc43a601c215cb5a3d176734578da109f0dbf0a832ed78be09/black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e", size = 194363, upload-time = "2023-12-22T23:06:14.278Z" }, +] + [[package]] name = "certifi" version = "2025.8.3" @@ -181,6 +203,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/59/ea/1c00d9278c51d5f03276ac3f08773a13d93cbf2d722386ae8da083866697/matplotlib-3.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:f15edcb0629a0801738925fe27070480f446fcaa15de65946ff946ad99a59a40", size = 7148358, upload-time = "2021-08-13T03:24:41.973Z" }, ] +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + [[package]] name = "numpy" version = "2.0.0" @@ -220,6 +251,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fa/80/eb88edc2e2b11cd2dd2e56f1c80b5784d11d6e6b7f04a1145df64df40065/opencv_python-4.12.0.88-cp37-abi3-win_amd64.whl", hash = "sha256:d98edb20aa932fd8ebd276a72627dad9dc097695b3d435a4257557bbb49a79d2", size = 39000307, upload-time = "2025-07-07T09:14:16.641Z" }, ] +[[package]] +name = "packaging" +version = "26.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, +] + +[[package]] +name = "pathspec" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/36/e27608899f9b8d4dff0617b2d9ab17ca5608956ca44461ac14ac48b44015/pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", size = 131200, upload-time = "2026-01-27T03:59:46.938Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, +] + [[package]] name = "pillow" version = "11.3.0" @@ -322,6 +371,11 @@ dependencies = [ { name = "virtualenv" }, ] +[package.dev-dependencies] +dev = [ + { name = "black" }, +] + [package.metadata] requires-dist = [ { name = "cycler", specifier = "==0.10.0" }, @@ -339,6 +393,9 @@ requires-dist = [ { name = "virtualenv", specifier = "==20.36.1" }, ] +[package.metadata.requires-dev] +dev = [{ name = "black", specifier = "~=23.0" }] + [[package]] name = "python-magic" version = "0.4.27" @@ -403,6 +460,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/58/f8/e2cca22387965584a409795913b774235752be4176d276714e15e1a58884/starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91", size = 66978, upload-time = "2023-05-16T10:59:53.927Z" }, ] +[[package]] +name = "tomli" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/30/31573e9457673ab10aa432461bee537ce6cef177667deca369efb79df071/tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c", size = 17477, upload-time = "2026-01-11T11:22:38.165Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/d1/136eb2cb77520a31e1f64cbae9d33ec6df0d78bdf4160398e86eec8a8754/tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a", size = 14477, upload-time = "2026-01-11T11:22:37.446Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0"