-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Turn State into a Mapping
#3036
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 2 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -3,9 +3,10 @@ | |
| import json | ||
| from collections.abc import AsyncGenerator, Iterator, Mapping | ||
| from http import cookies as http_cookies | ||
| from typing import TYPE_CHECKING, Any, NoReturn, cast | ||
| from typing import TYPE_CHECKING, Any, Generic, NoReturn, cast | ||
|
|
||
| import anyio | ||
| from typing_extensions import TypeVar | ||
|
|
||
| from starlette._utils import AwaitableOrContextManager, AwaitableOrContextManagerWrapper | ||
| from starlette.datastructures import URL, Address, FormData, Headers, QueryParams, State | ||
|
|
@@ -68,7 +69,10 @@ class ClientDisconnect(Exception): | |
| pass | ||
|
|
||
|
|
||
| class HTTPConnection(Mapping[str, Any]): | ||
| StateT = TypeVar("StateT", bound=Mapping[str, Any] | State, default=State) | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm not sure if this will pass the TypedDict check in some static type checkers.
Owner
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Which one you don't think it will not? We test with mypy here, but pyright doesn't seem to be failing (I use it on my environment).
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It's great to be able to pass the inspection. |
||
|
|
||
|
|
||
| class HTTPConnection(Mapping[str, Any], Generic[StateT]): | ||
| """ | ||
| A base class for incoming HTTP connections, that is used to provide | ||
| any functionality that is common to both `Request` and `WebSocket`. | ||
|
|
@@ -172,14 +176,14 @@ def user(self) -> Any: | |
| return self.scope["user"] | ||
|
|
||
| @property | ||
| def state(self) -> State: | ||
| def state(self) -> StateT: | ||
| if not hasattr(self, "_state"): | ||
| # Ensure 'state' has an empty dict if it's not already populated. | ||
| self.scope.setdefault("state", {}) | ||
| # Create a state instance with a reference to the dict in which it should | ||
| # store info | ||
| self._state = State(self.scope["state"]) | ||
| return self._state | ||
| return cast(StateT, self._state) | ||
|
|
||
| def url_for(self, name: str, /, **path_params: Any) -> URL: | ||
| url_path_provider: Router | Starlette | None = self.scope.get("router") or self.scope.get("app") | ||
|
|
@@ -197,7 +201,7 @@ async def empty_send(message: Message) -> NoReturn: | |
| raise RuntimeError("Send channel has not been made available") | ||
|
|
||
|
|
||
| class Request(HTTPConnection): | ||
| class Request(HTTPConnection[StateT]): | ||
|
Owner
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We are missing the same in |
||
| _form: FormData | None | ||
|
|
||
| def __init__(self, scope: Scope, receive: Receive = empty_receive, send: Send = empty_send): | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just so the pipeline can pass, but we shouldn't merge this here.