]> git.ipfire.org Git - thirdparty/httpx.git/commitdiff
properly support python 3.14
authorKar Petrosyan <kar.petrosyanpy@gmail.com>
Wed, 10 Dec 2025 14:03:20 +0000 (18:03 +0400)
committerKar Petrosyan <kar.petrosyanpy@gmail.com>
Wed, 10 Dec 2025 14:03:20 +0000 (18:03 +0400)
.github/workflows/test-suite.yml
pyproject.toml
tests/conftest.py
tests/test_timeouts.py
uv.lock

index d72286a9440999e11f7d607e14bc9dc344a52e5b..5dd1289b1c5b37b600a44473309ade9942b565ee 100644 (file)
@@ -14,7 +14,7 @@ jobs:
 
     strategy:
       matrix:
-        python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
+        python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
 
     steps:
       - uses: "actions/checkout@v4"
index 98a62b5058d8f3ceb2fb9191c1b764031a8f1c00..a12f78e1a271d86386c38ea6c6956916f150022d 100644 (file)
@@ -25,6 +25,7 @@ classifiers = [
     "Programming Language :: Python :: 3.11",
     "Programming Language :: Python :: 3.12",
     "Programming Language :: Python :: 3.13",
+    "Programming Language :: Python :: 3.14",
     "Topic :: Internet :: WWW/HTTP",
 ]
 dependencies = [
@@ -82,7 +83,7 @@ test = [
     "trio==0.31.0",
     "trio-typing==0.10.0",
     "trustme==1.2.1",
-    "uvicorn==0.35.0",
+    "uvicorn==0.38.0",
 ]
 docs = [
     "mkdocs==1.6.1",
index 858bca13978b88aaf14b80e4f948e7c701ec73fe..912fa3db13ede643e12f14dcec8d26455d5c8237 100644 (file)
@@ -235,10 +235,9 @@ class TestServer(Server):
     async def serve(self, sockets=None):
         self.restart_requested = asyncio.Event()
 
-        loop = asyncio.get_event_loop()
         tasks = {
-            loop.create_task(super().serve(sockets=sockets)),
-            loop.create_task(self.watch_restarts()),
+            asyncio.create_task(super().serve(sockets=sockets)),
+            asyncio.create_task(self.watch_restarts()),
         }
         await asyncio.wait(tasks)
 
@@ -269,7 +268,15 @@ class TestServer(Server):
 
 
 def serve_in_thread(server: TestServer) -> typing.Iterator[TestServer]:
-    thread = threading.Thread(target=server.run)
+    def run_server() -> None:
+        loop = asyncio.new_event_loop()
+        asyncio.set_event_loop(loop)
+        try:
+            loop.run_until_complete(server.serve())  # type: ignore
+        finally:
+            loop.close()
+
+    thread = threading.Thread(target=run_server)
     thread.start()
     try:
         while not server.started:
@@ -282,6 +289,6 @@ def serve_in_thread(server: TestServer) -> typing.Iterator[TestServer]:
 
 @pytest.fixture(scope="session")
 def server() -> typing.Iterator[TestServer]:
-    config = Config(app=app, lifespan="off", loop="asyncio")
+    config = Config(app=app, lifespan="off")
     server = TestServer(config=config)
     yield from serve_in_thread(server)
index 666cc8e376f31d4307137329f741f3c326689edf..ec77040229b2b283d165a60d0fc5856343bfbf27 100644 (file)
@@ -12,6 +12,8 @@ async def test_read_timeout(server):
             await client.get(server.url.copy_with(path="/slow_response"))
 
 
+# TODO: Fix ResourceWarning in this test for Python>=3.14
+@pytest.mark.filterwarnings("ignore::ResourceWarning")
 @pytest.mark.anyio
 async def test_write_timeout(server):
     timeout = httpx.Timeout(None, write=1e-6)
diff --git a/uv.lock b/uv.lock
index 914df0950789de8e3c2fdb0753d9683b6c0c2321..03def4ec91fe869c94557e27f6cc6c426830b6d1 100644 (file)
--- a/uv.lock
+++ b/uv.lock
@@ -742,7 +742,7 @@ dev = [
     { name = "trio-typing", specifier = "==0.10.0" },
     { name = "trustme", specifier = "==1.2.1" },
     { name = "twine", specifier = "==6.1.0" },
-    { name = "uvicorn", specifier = "==0.35.0" },
+    { name = "uvicorn", specifier = "==0.38.0" },
 ]
 docs = [
     { name = "mkautodoc", specifier = "==0.2.0" },
@@ -765,7 +765,7 @@ test = [
     { name = "trio", specifier = "==0.31.0" },
     { name = "trio-typing", specifier = "==0.10.0" },
     { name = "trustme", specifier = "==1.2.1" },
-    { name = "uvicorn", specifier = "==0.35.0" },
+    { name = "uvicorn", specifier = "==0.38.0" },
 ]
 
 [[package]]
@@ -1807,16 +1807,16 @@ wheels = [
 
 [[package]]
 name = "uvicorn"
-version = "0.35.0"
+version = "0.38.0"
 source = { registry = "https://pypi.org/simple" }
 dependencies = [
     { name = "click" },
     { name = "h11" },
     { name = "typing-extensions", marker = "python_full_version < '3.11'" },
 ]
-sdist = { url = "https://files.pythonhosted.org/packages/5e/42/e0e305207bb88c6b8d3061399c6a961ffe5fbb7e2aa63c9234df7259e9cd/uvicorn-0.35.0.tar.gz", hash = "sha256:bc662f087f7cf2ce11a1d7fd70b90c9f98ef2e2831556dd078d131b96cc94a01", size = 78473, upload-time = "2025-06-28T16:15:46.058Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/cb/ce/f06b84e2697fef4688ca63bdb2fdf113ca0a3be33f94488f2cadb690b0cf/uvicorn-0.38.0.tar.gz", hash = "sha256:fd97093bdd120a2609fc0d3afe931d4d4ad688b6e75f0f929fde1bc36fe0e91d", size = 80605, upload-time = "2025-10-18T13:46:44.63Z" }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/d2/e2/dc81b1bd1dcfe91735810265e9d26bc8ec5da45b4c0f6237e286819194c3/uvicorn-0.35.0-py3-none-any.whl", hash = "sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a", size = 66406, upload-time = "2025-06-28T16:15:44.816Z" },
+    { url = "https://files.pythonhosted.org/packages/ee/d9/d88e73ca598f4f6ff671fb5fde8a32925c2e08a637303a1d12883c7305fa/uvicorn-0.38.0-py3-none-any.whl", hash = "sha256:48c0afd214ceb59340075b4a052ea1ee91c16fbc2a9b1469cca0e54566977b02", size = 68109, upload-time = "2025-10-18T13:46:42.958Z" },
 ]
 
 [[package]]