Skip to content

Commit 79a10d8

Browse files
authored
[5.0] Update core.cache.backends, add RedisCache and related classes (#1948)
1 parent 45d982e commit 79a10d8

File tree

6 files changed

+61
-3
lines changed

6 files changed

+61
-3
lines changed

django-stubs/core/cache/backends/base.pyi

+3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from collections.abc import Callable, Iterable, Iterator
2+
from re import Pattern
23
from typing import Any
34

45
from django.core.exceptions import ImproperlyConfigured
@@ -66,4 +67,6 @@ class BaseCache:
6667
def close(self, **kwargs: Any) -> None: ...
6768
async def aclose(self, **kwargs: Any) -> None: ...
6869

70+
memcached_error_chars_re: Pattern[str]
71+
6972
def memcache_key_warnings(key: str) -> Iterator[str]: ...
+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
from collections.abc import Mapping
2+
from datetime import timedelta
3+
from typing import Any, Callable, Iterable, Protocol, SupportsInt, overload, type_check_only
4+
5+
from _typeshed import ReadableBuffer
6+
from django.core.cache.backends.base import BaseCache
7+
from redis._parsers import BaseParser
8+
from redis.client import Redis
9+
from redis.connection import ConnectionPool
10+
from typing_extensions import TypeAlias
11+
12+
@type_check_only
13+
class _RedisCacheClientSerializer(Protocol):
14+
def dumps(self, obj: Any) -> bytes: ...
15+
@overload
16+
def loads(self, data: SupportsInt) -> int: ...
17+
@overload
18+
def loads(self, data: ReadableBuffer) -> Any: ...
19+
20+
class RedisSerializer:
21+
def __init__(self, protocol: int | None = None) -> None: ...
22+
def dumps(self, obj: Any) -> bytes: ...
23+
@overload
24+
def loads(self, data: SupportsInt) -> int: ...
25+
@overload
26+
def loads(self, data: ReadableBuffer) -> Any: ...
27+
28+
# Taken from https://github.com/redis/redis-py/blob/6b8978/redis/typing.py
29+
_Key: TypeAlias = str | bytes | memoryview
30+
_Expiry: TypeAlias = int | timedelta
31+
32+
class RedisCacheClient:
33+
def __init__(
34+
self,
35+
servers: list[str],
36+
serializer: str | Callable[[], _RedisCacheClientSerializer] | _RedisCacheClientSerializer | None = None,
37+
pool_class: str | type[ConnectionPool] | None = None,
38+
parser_class: str | type[BaseParser] | None = None,
39+
**options: Any,
40+
) -> None: ...
41+
def get_client(self, key: _Key | None = None, *, write: bool = False) -> Redis: ...
42+
def add(self, key: _Key, value: Any, timeout: _Expiry | None) -> bool: ...
43+
def get(self, key: _Key, default: Any) -> Any: ...
44+
def set(self, key: _Key, value: Any, timeout: _Expiry | None) -> None: ...
45+
def touch(self, key: _Key, timeout: _Expiry) -> bool: ...
46+
def delete(self, key: _Key) -> bool: ...
47+
def get_many(self, keys: Iterable[_Key]) -> dict[_Key, Any]: ...
48+
def has_key(self, key: _Key) -> bool: ...
49+
def incr(self, key: _Key, delta: int) -> Any: ...
50+
def set_many(self, data: Mapping[_Key, Any], timeout: _Expiry) -> None: ...
51+
def delete_many(self, keys: Iterable[_Key]) -> None: ...
52+
def clear(self) -> bool: ...
53+
54+
class RedisCache(BaseCache):
55+
def __init__(self, server: str | list[str], params: dict[str, Any]) -> None: ...

requirements.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ psycopg2-binary
1111
Django==4.2.7; python_version < '3.10'
1212
Django==5.0.3; python_version >= '3.10'
1313
-e ./ext
14-
-e .[compatible-mypy]
14+
-e .[redis,compatible-mypy]
1515

1616
# Overrides:
1717
mypy==1.9.0

scripts/stubtest/allowlist.txt

+1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ django.contrib.gis.geometry.json_regex
5757
django.contrib.gis.geometry.wkt_regex
5858
django.contrib.gis.geos.hex_regex
5959
django.contrib.gis.geos.wkt_regex
60+
django.core.cache.backends.base.memcached_error_chars_re
6061
django.core.validators.EmailValidator.domain_regex
6162
django.core.validators.EmailValidator.literal_regex
6263
django.core.validators.EmailValidator.user_regex

scripts/stubtest/allowlist_todo_django50.txt

-2
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,6 @@ django.contrib.sites.migrations.0001_initial
6161
django.contrib.sites.migrations.0002_alter_domain_unique
6262
django.contrib.staticfiles.checks.E005
6363
django.contrib.staticfiles.checks.check_storages
64-
django.core.cache.backends.base.memcached_error_chars_re
65-
django.core.cache.backends.redis
6664
django.core.handlers.asgi.ASGIHandler.get_script_prefix
6765
django.core.handlers.asgi.ASGIHandler.listen_for_disconnect
6866
django.core.handlers.asgi.ASGIHandler.run_get_response

setup.py

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ def find_stub_files(name: str) -> List[str]:
3232
# Keep compatible-mypy major.minor version pinned to what we use in CI (requirements.txt)
3333
extras_require = {
3434
"compatible-mypy": ["mypy~=1.9.0"],
35+
"redis": ["redis"],
3536
}
3637

3738
setup(

0 commit comments

Comments
 (0)