diff --git a/stubs/redis/@tests/test_cases/check_xadd.py b/stubs/redis/@tests/test_cases/check_xadd.py new file mode 100644 index 000000000..e4ce964b8 --- /dev/null +++ b/stubs/redis/@tests/test_cases/check_xadd.py @@ -0,0 +1,16 @@ +from typing import TypedDict + +import redis + + +class RedisStreamData(TypedDict): + foo: str + bar: bytes + + +def check_xadd(r: redis.Redis[str]) -> None: + # check that TypedDicts are accepted for the `fields` parameter of `xadd()` + # + # N.B. the `pyright: ignore` is not part of the test, + # it's just because the return type is currently unannotated + r.xadd("stream", fields=RedisStreamData({"foo": "bar", "bar": b"foo"})) # pyright: ignore[reportUnknownMemberType] diff --git a/stubs/redis/redis/commands/core.pyi b/stubs/redis/redis/commands/core.pyi index d4c8e2508..e921f1a64 100644 --- a/stubs/redis/redis/commands/core.pyi +++ b/stubs/redis/redis/commands/core.pyi @@ -1,5 +1,5 @@ import builtins -from _typeshed import Incomplete +from _typeshed import Incomplete, SupportsItems from collections.abc import AsyncIterator, Awaitable, Callable, Iterable, Iterator, Mapping, Sequence from datetime import datetime, timedelta from typing import Any, Generic, Literal, TypeVar, overload @@ -862,7 +862,8 @@ class StreamCommands: def xadd( self, name: KeyT, - fields: Mapping[bytes | memoryview | str | float, bytes | memoryview | str | float], + # Only accepts dict objects, but for variance reasons we use a looser annotation + fields: SupportsItems[bytes | memoryview | str | float, Any], id: str | int | bytes | memoryview = "*", maxlen=None, approximate: bool = True, @@ -928,7 +929,8 @@ class AsyncStreamCommands: async def xadd( self, name: KeyT, - fields: Mapping[bytes | memoryview | str | float, bytes | memoryview | str | float], + # Only accepts dict objects, but for variance reasons we use a looser annotation + fields: SupportsItems[bytes | memoryview | str | float, Any], id: str | int | bytes | memoryview = "*", maxlen=None, approximate: bool = True,