From e7ed948238ad73e280587237775a4a1c8b48d93e Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Sun, 26 Oct 2025 10:39:15 -0700 Subject: [PATCH] Use ruff to upgrade Optional[x] to x | None Refs #2545 --- datasette/app.py | 38 +++++++++++++++++++------------------- datasette/events.py | 4 ++-- datasette/permissions.py | 8 ++++---- ruff.toml | 3 ++- 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/datasette/app.py b/datasette/app.py index 4c1c2bd2..6a6a60b2 100644 --- a/datasette/app.py +++ b/datasette/app.py @@ -1,6 +1,8 @@ +from __future__ import annotations + from asgi_csrf import Errors import asyncio -from typing import Any, Dict, Iterable, List, Optional, Sequence, Tuple, Union +from typing import Any, Dict, Iterable, List import asgi_csrf import collections import dataclasses @@ -126,10 +128,10 @@ class PermissionCheck: """Represents a logged permission check for debugging purposes.""" when: str - actor: Optional[Dict[str, Any]] + actor: Dict[str, Any] | None action: str - parent: Optional[str] - child: Optional[str] + parent: str | None + child: str | None result: bool @@ -656,10 +658,10 @@ class Datasette: self, actor_id: str, *, - expires_after: Optional[int] = None, - restrict_all: Optional[Iterable[str]] = None, - restrict_database: Optional[Dict[str, Iterable[str]]] = None, - restrict_resource: Optional[Dict[str, Dict[str, Iterable[str]]]] = None, + expires_after: int | None = None, + restrict_all: Iterable[str] | None = None, + restrict_database: Dict[str, Iterable[str]] | None = None, + restrict_resource: Dict[str, Dict[str, Iterable[str]]] | None = None, ): token = {"a": actor_id, "t": int(time.time())} if expires_after: @@ -1021,8 +1023,8 @@ class Datasette: return crumbs async def actors_from_ids( - self, actor_ids: Iterable[Union[str, int]] - ) -> Dict[Union[id, str], Dict]: + self, actor_ids: Iterable[str | int] + ) -> Dict[int | str, Dict]: result = pm.hook.actors_from_ids(datasette=self, actor_ids=actor_ids) if result is None: # Do the default thing @@ -1037,9 +1039,7 @@ class Datasette: for hook in pm.hook.track_event(datasette=self, event=event): await await_me_maybe(hook) - def resource_for_action( - self, action: str, parent: Optional[str], child: Optional[str] - ): + def resource_for_action(self, action: str, parent: str | None, child: str | None): """ Create a Resource instance for the given action with parent/child values. @@ -1072,7 +1072,7 @@ class Datasette: self, actor: dict, action: str, - resource: Optional["Resource"] = None, + resource: "Resource" | None = None, ): """ Check if actor can see a resource and if it's private. @@ -1587,10 +1587,10 @@ class Datasette: async def render_template( self, - templates: Union[List[str], str, Template], - context: Optional[Union[Dict[str, Any], Context]] = None, - request: Optional[Request] = None, - view_name: Optional[str] = None, + templates: List[str] | str | Template, + context: Dict[str, Any] | Context | None = None, + request: Request | None = None, + view_name: str | None = None, ): if not self._startup_invoked: raise Exception("render_template() called before await ds.invoke_startup()") @@ -1689,7 +1689,7 @@ class Datasette: return await template.render_async(template_context) def set_actor_cookie( - self, response: Response, actor: dict, expire_after: Optional[int] = None + self, response: Response, actor: dict, expire_after: int | None = None ): data = {"a": actor} if expire_after: diff --git a/datasette/events.py b/datasette/events.py index ae90972d..88f90129 100644 --- a/datasette/events.py +++ b/datasette/events.py @@ -14,7 +14,7 @@ class Event(ABC): created: datetime = field( init=False, default_factory=lambda: datetime.now(timezone.utc) ) - actor: Optional[dict] + actor: dict | None def properties(self): properties = asdict(self) @@ -63,7 +63,7 @@ class CreateTokenEvent(Event): """ name = "create-token" - expires_after: Optional[int] + expires_after: int | None restrict_all: list restrict_database: dict restrict_resource: dict diff --git a/datasette/permissions.py b/datasette/permissions.py index 11db2f3a..0f691405 100644 --- a/datasette/permissions.py +++ b/datasette/permissions.py @@ -14,9 +14,9 @@ class Resource(ABC): # Class-level metadata (subclasses must define these) name: str = None # e.g., "table", "database", "model" - parent_name: Optional[str] = None # e.g., "database" for tables + parent_name: str | None = None # e.g., "database" for tables - def __init__(self, parent: Optional[str] = None, child: Optional[str] = None): + def __init__(self, parent: str | None = None, child: str | None = None): """ Create a resource instance. @@ -98,8 +98,8 @@ class PermissionSQL: @dataclass class Permission: name: str - abbr: Optional[str] - description: Optional[str] + abbr: str | None + description: str | None takes_database: bool takes_resource: bool default: bool diff --git a/ruff.toml b/ruff.toml index 0deb884c..74447a8c 100644 --- a/ruff.toml +++ b/ruff.toml @@ -1 +1,2 @@ -line-length = 160 \ No newline at end of file +line-length = 160 +target-version = "py310" \ No newline at end of file