What's Changed
- Revert 338 fix/request affine django middleware by @FarhanAliRaza in #340
- Fix Django middleware request affinity and dead database connections … by @FarhanAliRaza in #341
- Fix release artifact smoke tests for free-threaded wheels by @FarhanAliRaza in #342
- Drop EOL Django 4.2/5.0/5.1, derive CI matrix from classifiers by @jameswinegar in #344
- test: cover recovery from dead database connections by @jameswinegar in #345
- fix!: run async-only middleware on the loop, keep request.user on the request's thread by @jameswinegar in #343
- test: drain the output pipes of runbolt servers while they run by @jameswinegar in #347
- docs: note PGGSSENCMODE=disable for forked workers on macOS by @jameswinegar in #348
- ci: skip build and test jobs on doc-only pull requests by @jameswinegar in #349
- test: fix three races in the worker-loop dispatch probe test by @jameswinegar in #351
- fix: valid JSON in 422 bodies; test clients send the encoded path by @jameswinegar in #353
- test: make the TCP_NODELAY check robust to slow runners by @jameswinegar in #354
- fix: convert and validate typed parameters by their wire name by @jameswinegar in #355
- fix(auth): re-land #346 (JWT refresh-token hardening, dependency params) on master by @jameswinegar in #358
- perf: bind each dependency at registration, not per request by @jameswinegar in #363
- fix: decode + as a space in query strings by @jameswinegar in #362
- test: make the explicit LOGGING test set explicit LOGGING by @jameswinegar in #360
- chore(deps): bump pyjwt to 2.15.1 in uv.lock by @FarhanAliRaza in #367
- fix: reject a bad typed WebSocket path or query value at the upgrade by @jameswinegar in #361
- fix: convert and document rich parameter types; complete the OpenAPI type coverage by @jameswinegar in #359
- chore: remove dead code found by vulture by @FarhanAliRaza in #356
- Lower maturin version to 1.8.0 by @dmach in #366
- feat(websocket): serve WebSocket connections from ASGI mounts by @huynguyengl99 in #335
- Fix WebSocket routes showing twice in OpenAPI renderers by @FarhanAliRaza in #372
- WebSocket subprotocol negotiation and handshake refactoring by @FarhanAliRaza in #371
- fix: run thread-sensitive calls of plain async routes on the ORM pool by @FarhanAliRaza in #376
- Remove DeepWiki badge from README by @FarhanAliRaza in #377
- fix: drop the body of a 204 and validate the default status code only by @FarhanAliRaza in #393
- fix(serializers): read cache_name so nested serializers work on Django 5.2 by @FarhanAliRaza in #395
- fix(dev): runbolt --dev stops its worker on SIGTERM by @FarhanAliRaza in #403
- fix(lane): give the lane of an async request back before the response leaves by @FarhanAliRaza in #401
- fix(dev): reload for a file in a new or moved-in directory by @FarhanAliRaza in #399
- ci: run Rust tests and clippy, run the brotli tests, make pytest strict by @jameswinegar in #379
- feat(auth): add SessionAuthentication and remove OpenAPIConfig(django_auth) by @FarhanAliRaza in #394
- fix(middleware): run process_view in the single DjangoMiddleware wrapper by @FarhanAliRaza in #406
- ci: test the release wheel instead of building the extension in each job by @jameswinegar in #380
- fix: reject wrongly typed or missing route metadata flags at registration by @jameswinegar in #388
- fix(asgi): resolve a mount's client address with BOLT_TRUSTED_PROXIES by @bufke in #408
- feat!: remove BasePermission; a guard is exactly AllowAny, IsAuthenticated or Requires by @FarhanAliRaza in #411
- test: land the testing stack (#381–#391) on master by @FarhanAliRaza in #410
- fix(dev): reload for a file written in a new directory before its watch by @FarhanAliRaza in #413
- ci: measure the production request path with CodSpeed by @FarhanAliRaza in #412
- perf: reduce production request and cookie overhead by @FarhanAliRaza in #414
New Contributors
- @dmach made their first contribution in #366
- @huynguyengl99 made their first contribution in #335
- @bufke made their first contribution in #408
Full Changelog: v0.11.1...v0.12.0