diff --git a/pyproject.toml b/pyproject.toml index 7fb63b0..cb22de8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -445,6 +445,7 @@ plugins = [ [tool.pyrefly] search_path = [ "." ] errors.non-exhaustive-match = "error" +preset = "strict" [tool.pyright] typeCheckingMode = "strict" diff --git a/src/coderpad/screen_types.py b/src/coderpad/screen_types.py index 594d9a2..6b02e89 100644 --- a/src/coderpad/screen_types.py +++ b/src/coderpad/screen_types.py @@ -1,6 +1,6 @@ """Types for the CoderPad Screen API.""" -from typing import ClassVar, Self, TypeGuard +from typing import ClassVar, Self, TypeGuard, override from beartype import beartype from pydantic import BaseModel, ConfigDict, Field, model_validator @@ -366,6 +366,7 @@ def from_dict(cls, data: dict[str, object]) -> Self: else None, ) + @override def __repr__(self) -> str: """Return a concise debug representation.""" return ( diff --git a/src/coderpad/types.py b/src/coderpad/types.py index 89a8238..acc9498 100644 --- a/src/coderpad/types.py +++ b/src/coderpad/types.py @@ -422,6 +422,17 @@ def apply(self, *, contents: str) -> str: return "".join(updated) +def _history_sort_key( + item: tuple[str, PadHistoryEntryDict], + /, +) -> tuple[int, str]: + """Return the sort key for a Firebase history entry: timestamp, then + ID. + """ + entry_id, entry = item + return (entry["t"], entry_id) + + @beartype class PadHistory(list[PadHistoryEntry]): """Chronologically ordered editor history for a pad file.""" @@ -442,7 +453,7 @@ def from_dict( """ ordered_entries = sorted( data.items(), - key=lambda item: (item[1]["t"], item[0]), + key=_history_sort_key, ) history = cls() for entry_id, entry in ordered_entries: