strategy:
matrix:
- python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
+ python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
steps:
- uses: "actions/checkout@v4"
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
+ "Programming Language :: Python :: 3.13",
"Topic :: Internet :: WWW/HTTP",
]
dependencies = [
import html
import inspect
+import sys
import traceback
import typing
exc_html += self.generate_frame_html(frame, is_collapsed)
is_collapsed = True
+ if sys.version_info >= (3, 13): # pragma: no cover
+ exc_type_str = traceback_obj.exc_type_str
+ else: # pragma: no cover
+ exc_type_str = traceback_obj.exc_type.__name__
+
# escape error class and text
- error = (
- f"{html.escape(traceback_obj.exc_type.__name__)}: "
- f"{html.escape(str(traceback_obj))}"
- )
+ error = f"{html.escape(exc_type_str)}: {html.escape(str(traceback_obj))}"
return TEMPLATE.format(styles=STYLES, js=JS, error=error, exc_html=exc_html)
async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
self.send = send
- await self.app(scope, receive, self.send_with_gzip)
+ with self.gzip_buffer, self.gzip_file:
+ await self.app(scope, receive, self.send_with_gzip)
async def send_with_gzip(self, message: Message) -> None:
message_type = message["type"]