redis 6.0.0b1__py3-none-any.whl → 6.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- redis/__init__.py +9 -1
- redis/_parsers/resp3.py +2 -2
- redis/asyncio/client.py +83 -71
- redis/asyncio/cluster.py +74 -50
- redis/asyncio/connection.py +43 -17
- redis/asyncio/retry.py +12 -0
- redis/asyncio/sentinel.py +2 -0
- redis/backoff.py +54 -0
- redis/client.py +99 -89
- redis/cluster.py +1085 -359
- redis/commands/core.py +105 -105
- redis/commands/helpers.py +19 -6
- redis/commands/json/__init__.py +1 -1
- redis/commands/json/commands.py +8 -8
- redis/commands/redismodules.py +27 -9
- redis/commands/search/commands.py +2 -2
- redis/commands/timeseries/__init__.py +1 -1
- redis/commands/vectorset/__init__.py +46 -0
- redis/commands/vectorset/commands.py +367 -0
- redis/commands/vectorset/utils.py +94 -0
- redis/connection.py +46 -13
- redis/exceptions.py +18 -0
- redis/retry.py +25 -0
- redis/sentinel.py +2 -0
- redis/utils.py +7 -0
- {redis-6.0.0b1.dist-info → redis-6.1.0.dist-info}/METADATA +14 -8
- {redis-6.0.0b1.dist-info → redis-6.1.0.dist-info}/RECORD +29 -26
- {redis-6.0.0b1.dist-info → redis-6.1.0.dist-info}/WHEEL +0 -0
- {redis-6.0.0b1.dist-info → redis-6.1.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
from redis._parsers.helpers import pairs_to_dict
|
|
2
|
+
from redis.commands.vectorset.commands import CallbacksOptions
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def parse_vemb_result(response, **options):
|
|
6
|
+
"""
|
|
7
|
+
Handle VEMB result since the command can returning different result
|
|
8
|
+
structures depending on input options and on quantization type of the vector set.
|
|
9
|
+
|
|
10
|
+
Parsing VEMB result into:
|
|
11
|
+
- List[Union[bytes, Union[int, float]]]
|
|
12
|
+
- Dict[str, Union[bytes, str, float]]
|
|
13
|
+
"""
|
|
14
|
+
if response is None:
|
|
15
|
+
return response
|
|
16
|
+
|
|
17
|
+
if options.get(CallbacksOptions.RAW.value):
|
|
18
|
+
result = {}
|
|
19
|
+
result["quantization"] = (
|
|
20
|
+
response[0].decode("utf-8")
|
|
21
|
+
if options.get(CallbacksOptions.ALLOW_DECODING.value)
|
|
22
|
+
else response[0]
|
|
23
|
+
)
|
|
24
|
+
result["raw"] = response[1]
|
|
25
|
+
result["l2"] = float(response[2])
|
|
26
|
+
if len(response) > 3:
|
|
27
|
+
result["range"] = float(response[3])
|
|
28
|
+
return result
|
|
29
|
+
else:
|
|
30
|
+
if options.get(CallbacksOptions.RESP3.value):
|
|
31
|
+
return response
|
|
32
|
+
|
|
33
|
+
result = []
|
|
34
|
+
for i in range(len(response)):
|
|
35
|
+
try:
|
|
36
|
+
result.append(int(response[i]))
|
|
37
|
+
except ValueError:
|
|
38
|
+
# if the value is not an integer, it should be a float
|
|
39
|
+
result.append(float(response[i]))
|
|
40
|
+
|
|
41
|
+
return result
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def parse_vlinks_result(response, **options):
|
|
45
|
+
"""
|
|
46
|
+
Handle VLINKS result since the command can be returning different result
|
|
47
|
+
structures depending on input options.
|
|
48
|
+
Parsing VLINKS result into:
|
|
49
|
+
- List[List[str]]
|
|
50
|
+
- List[Dict[str, Number]]
|
|
51
|
+
"""
|
|
52
|
+
if response is None:
|
|
53
|
+
return response
|
|
54
|
+
|
|
55
|
+
if options.get(CallbacksOptions.WITHSCORES.value):
|
|
56
|
+
result = []
|
|
57
|
+
# Redis will return a list of list of strings.
|
|
58
|
+
# This list have to be transformed to list of dicts
|
|
59
|
+
for level_item in response:
|
|
60
|
+
level_data_dict = {}
|
|
61
|
+
for key, value in pairs_to_dict(level_item).items():
|
|
62
|
+
value = float(value)
|
|
63
|
+
level_data_dict[key] = value
|
|
64
|
+
result.append(level_data_dict)
|
|
65
|
+
return result
|
|
66
|
+
else:
|
|
67
|
+
# return the list of elements for each level
|
|
68
|
+
# list of lists
|
|
69
|
+
return response
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def parse_vsim_result(response, **options):
|
|
73
|
+
"""
|
|
74
|
+
Handle VSIM result since the command can be returning different result
|
|
75
|
+
structures depending on input options.
|
|
76
|
+
Parsing VSIM result into:
|
|
77
|
+
- List[List[str]]
|
|
78
|
+
- List[Dict[str, Number]]
|
|
79
|
+
"""
|
|
80
|
+
if response is None:
|
|
81
|
+
return response
|
|
82
|
+
|
|
83
|
+
if options.get(CallbacksOptions.WITHSCORES.value):
|
|
84
|
+
# Redis will return a list of list of pairs.
|
|
85
|
+
# This list have to be transformed to dict
|
|
86
|
+
result_dict = {}
|
|
87
|
+
for key, value in pairs_to_dict(response).items():
|
|
88
|
+
value = float(value)
|
|
89
|
+
result_dict[key] = value
|
|
90
|
+
return result_dict
|
|
91
|
+
else:
|
|
92
|
+
# return the list of elements for each level
|
|
93
|
+
# list of lists
|
|
94
|
+
return response
|
redis/connection.py
CHANGED
|
@@ -376,6 +376,9 @@ class AbstractConnection(ConnectionInterface):
|
|
|
376
376
|
|
|
377
377
|
def connect(self):
|
|
378
378
|
"Connects to the Redis server if not already connected"
|
|
379
|
+
self.connect_check_health(check_health=True)
|
|
380
|
+
|
|
381
|
+
def connect_check_health(self, check_health: bool = True):
|
|
379
382
|
if self._sock:
|
|
380
383
|
return
|
|
381
384
|
try:
|
|
@@ -391,7 +394,7 @@ class AbstractConnection(ConnectionInterface):
|
|
|
391
394
|
try:
|
|
392
395
|
if self.redis_connect_func is None:
|
|
393
396
|
# Use the default on_connect function
|
|
394
|
-
self.
|
|
397
|
+
self.on_connect_check_health(check_health=check_health)
|
|
395
398
|
else:
|
|
396
399
|
# Use the passed function redis_connect_func
|
|
397
400
|
self.redis_connect_func(self)
|
|
@@ -421,6 +424,9 @@ class AbstractConnection(ConnectionInterface):
|
|
|
421
424
|
return format_error_message(self._host_error(), exception)
|
|
422
425
|
|
|
423
426
|
def on_connect(self):
|
|
427
|
+
self.on_connect_check_health(check_health=True)
|
|
428
|
+
|
|
429
|
+
def on_connect_check_health(self, check_health: bool = True):
|
|
424
430
|
"Initialize the connection, authenticate and select a database"
|
|
425
431
|
self._parser.on_connect(self)
|
|
426
432
|
parser = self._parser
|
|
@@ -479,7 +485,7 @@ class AbstractConnection(ConnectionInterface):
|
|
|
479
485
|
# update cluster exception classes
|
|
480
486
|
self._parser.EXCEPTION_CLASSES = parser.EXCEPTION_CLASSES
|
|
481
487
|
self._parser.on_connect(self)
|
|
482
|
-
self.send_command("HELLO", self.protocol)
|
|
488
|
+
self.send_command("HELLO", self.protocol, check_health=check_health)
|
|
483
489
|
self.handshake_metadata = self.read_response()
|
|
484
490
|
if (
|
|
485
491
|
self.handshake_metadata.get(b"proto") != self.protocol
|
|
@@ -489,28 +495,45 @@ class AbstractConnection(ConnectionInterface):
|
|
|
489
495
|
|
|
490
496
|
# if a client_name is given, set it
|
|
491
497
|
if self.client_name:
|
|
492
|
-
self.send_command(
|
|
498
|
+
self.send_command(
|
|
499
|
+
"CLIENT",
|
|
500
|
+
"SETNAME",
|
|
501
|
+
self.client_name,
|
|
502
|
+
check_health=check_health,
|
|
503
|
+
)
|
|
493
504
|
if str_if_bytes(self.read_response()) != "OK":
|
|
494
505
|
raise ConnectionError("Error setting client name")
|
|
495
506
|
|
|
496
507
|
try:
|
|
497
508
|
# set the library name and version
|
|
498
509
|
if self.lib_name:
|
|
499
|
-
self.send_command(
|
|
510
|
+
self.send_command(
|
|
511
|
+
"CLIENT",
|
|
512
|
+
"SETINFO",
|
|
513
|
+
"LIB-NAME",
|
|
514
|
+
self.lib_name,
|
|
515
|
+
check_health=check_health,
|
|
516
|
+
)
|
|
500
517
|
self.read_response()
|
|
501
518
|
except ResponseError:
|
|
502
519
|
pass
|
|
503
520
|
|
|
504
521
|
try:
|
|
505
522
|
if self.lib_version:
|
|
506
|
-
self.send_command(
|
|
523
|
+
self.send_command(
|
|
524
|
+
"CLIENT",
|
|
525
|
+
"SETINFO",
|
|
526
|
+
"LIB-VER",
|
|
527
|
+
self.lib_version,
|
|
528
|
+
check_health=check_health,
|
|
529
|
+
)
|
|
507
530
|
self.read_response()
|
|
508
531
|
except ResponseError:
|
|
509
532
|
pass
|
|
510
533
|
|
|
511
534
|
# if a database is specified, switch to it
|
|
512
535
|
if self.db:
|
|
513
|
-
self.send_command("SELECT", self.db)
|
|
536
|
+
self.send_command("SELECT", self.db, check_health=check_health)
|
|
514
537
|
if str_if_bytes(self.read_response()) != "OK":
|
|
515
538
|
raise ConnectionError("Invalid Database")
|
|
516
539
|
|
|
@@ -552,7 +575,7 @@ class AbstractConnection(ConnectionInterface):
|
|
|
552
575
|
def send_packed_command(self, command, check_health=True):
|
|
553
576
|
"""Send an already packed command to the Redis server"""
|
|
554
577
|
if not self._sock:
|
|
555
|
-
self.
|
|
578
|
+
self.connect_check_health(check_health=False)
|
|
556
579
|
# guard against health check recursion
|
|
557
580
|
if check_health:
|
|
558
581
|
self.check_health()
|
|
@@ -764,6 +787,10 @@ class Connection(AbstractConnection):
|
|
|
764
787
|
except OSError as _:
|
|
765
788
|
err = _
|
|
766
789
|
if sock is not None:
|
|
790
|
+
try:
|
|
791
|
+
sock.shutdown(socket.SHUT_RDWR) # ensure a clean close
|
|
792
|
+
except OSError:
|
|
793
|
+
pass
|
|
767
794
|
sock.close()
|
|
768
795
|
|
|
769
796
|
if err is not None:
|
|
@@ -1001,7 +1028,7 @@ class SSLConnection(Connection):
|
|
|
1001
1028
|
ssl_cert_reqs="required",
|
|
1002
1029
|
ssl_ca_certs=None,
|
|
1003
1030
|
ssl_ca_data=None,
|
|
1004
|
-
ssl_check_hostname=
|
|
1031
|
+
ssl_check_hostname=True,
|
|
1005
1032
|
ssl_ca_path=None,
|
|
1006
1033
|
ssl_password=None,
|
|
1007
1034
|
ssl_validate_ocsp=False,
|
|
@@ -1017,7 +1044,7 @@ class SSLConnection(Connection):
|
|
|
1017
1044
|
Args:
|
|
1018
1045
|
ssl_keyfile: Path to an ssl private key. Defaults to None.
|
|
1019
1046
|
ssl_certfile: Path to an ssl certificate. Defaults to None.
|
|
1020
|
-
ssl_cert_reqs: The string value for the SSLContext.verify_mode (none, optional, required). Defaults to "required".
|
|
1047
|
+
ssl_cert_reqs: The string value for the SSLContext.verify_mode (none, optional, required), or an ssl.VerifyMode. Defaults to "required".
|
|
1021
1048
|
ssl_ca_certs: The path to a file of concatenated CA certificates in PEM format. Defaults to None.
|
|
1022
1049
|
ssl_ca_data: Either an ASCII string of one or more PEM-encoded certificates or a bytes-like object of DER-encoded certificates.
|
|
1023
1050
|
ssl_check_hostname: If set, match the hostname during the SSL handshake. Defaults to False.
|
|
@@ -1056,7 +1083,9 @@ class SSLConnection(Connection):
|
|
|
1056
1083
|
self.ca_certs = ssl_ca_certs
|
|
1057
1084
|
self.ca_data = ssl_ca_data
|
|
1058
1085
|
self.ca_path = ssl_ca_path
|
|
1059
|
-
self.check_hostname =
|
|
1086
|
+
self.check_hostname = (
|
|
1087
|
+
ssl_check_hostname if self.cert_reqs != ssl.CERT_NONE else False
|
|
1088
|
+
)
|
|
1060
1089
|
self.certificate_password = ssl_password
|
|
1061
1090
|
self.ssl_validate_ocsp = ssl_validate_ocsp
|
|
1062
1091
|
self.ssl_validate_ocsp_stapled = ssl_validate_ocsp_stapled
|
|
@@ -1179,6 +1208,10 @@ class UnixDomainSocketConnection(AbstractConnection):
|
|
|
1179
1208
|
sock.connect(self.path)
|
|
1180
1209
|
except OSError:
|
|
1181
1210
|
# Prevent ResourceWarnings for unclosed sockets.
|
|
1211
|
+
try:
|
|
1212
|
+
sock.shutdown(socket.SHUT_RDWR) # ensure a clean close
|
|
1213
|
+
except OSError:
|
|
1214
|
+
pass
|
|
1182
1215
|
sock.close()
|
|
1183
1216
|
raise
|
|
1184
1217
|
sock.settimeout(self.socket_timeout)
|
|
@@ -1471,7 +1504,7 @@ class ConnectionPool:
|
|
|
1471
1504
|
@deprecated_args(
|
|
1472
1505
|
args_to_warn=["*"],
|
|
1473
1506
|
reason="Use get_connection() without args instead",
|
|
1474
|
-
version="5.0
|
|
1507
|
+
version="5.3.0",
|
|
1475
1508
|
)
|
|
1476
1509
|
def get_connection(self, command_name=None, *keys, **options) -> "Connection":
|
|
1477
1510
|
"Get a connection from the pool"
|
|
@@ -1580,7 +1613,7 @@ class ConnectionPool:
|
|
|
1580
1613
|
"""Close the pool, disconnecting all connections"""
|
|
1581
1614
|
self.disconnect()
|
|
1582
1615
|
|
|
1583
|
-
def set_retry(self, retry:
|
|
1616
|
+
def set_retry(self, retry: Retry) -> None:
|
|
1584
1617
|
self.connection_kwargs.update({"retry": retry})
|
|
1585
1618
|
for conn in self._available_connections:
|
|
1586
1619
|
conn.retry = retry
|
|
@@ -1699,7 +1732,7 @@ class BlockingConnectionPool(ConnectionPool):
|
|
|
1699
1732
|
@deprecated_args(
|
|
1700
1733
|
args_to_warn=["*"],
|
|
1701
1734
|
reason="Use get_connection() without args instead",
|
|
1702
|
-
version="5.0
|
|
1735
|
+
version="5.3.0",
|
|
1703
1736
|
)
|
|
1704
1737
|
def get_connection(self, command_name=None, *keys, **options):
|
|
1705
1738
|
"""
|
redis/exceptions.py
CHANGED
|
@@ -221,3 +221,21 @@ class SlotNotCoveredError(RedisClusterException):
|
|
|
221
221
|
|
|
222
222
|
|
|
223
223
|
class MaxConnectionsError(ConnectionError): ...
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
class CrossSlotTransactionError(RedisClusterException):
|
|
227
|
+
"""
|
|
228
|
+
Raised when a transaction or watch is triggered in a pipeline
|
|
229
|
+
and not all keys or all commands belong to the same slot.
|
|
230
|
+
"""
|
|
231
|
+
|
|
232
|
+
pass
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
class InvalidPipelineStack(RedisClusterException):
|
|
236
|
+
"""
|
|
237
|
+
Raised on unexpected response length on pipelines. This is
|
|
238
|
+
most likely a handling error on the stack.
|
|
239
|
+
"""
|
|
240
|
+
|
|
241
|
+
pass
|
redis/retry.py
CHANGED
|
@@ -34,6 +34,19 @@ class Retry:
|
|
|
34
34
|
self._retries = retries
|
|
35
35
|
self._supported_errors = supported_errors
|
|
36
36
|
|
|
37
|
+
def __eq__(self, other: Any) -> bool:
|
|
38
|
+
if not isinstance(other, Retry):
|
|
39
|
+
return NotImplemented
|
|
40
|
+
|
|
41
|
+
return (
|
|
42
|
+
self._backoff == other._backoff
|
|
43
|
+
and self._retries == other._retries
|
|
44
|
+
and set(self._supported_errors) == set(other._supported_errors)
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
def __hash__(self) -> int:
|
|
48
|
+
return hash((self._backoff, self._retries, frozenset(self._supported_errors)))
|
|
49
|
+
|
|
37
50
|
def update_supported_errors(
|
|
38
51
|
self, specified_errors: Iterable[Type[Exception]]
|
|
39
52
|
) -> None:
|
|
@@ -44,6 +57,18 @@ class Retry:
|
|
|
44
57
|
set(self._supported_errors + tuple(specified_errors))
|
|
45
58
|
)
|
|
46
59
|
|
|
60
|
+
def get_retries(self) -> int:
|
|
61
|
+
"""
|
|
62
|
+
Get the number of retries.
|
|
63
|
+
"""
|
|
64
|
+
return self._retries
|
|
65
|
+
|
|
66
|
+
def update_retries(self, value: int) -> None:
|
|
67
|
+
"""
|
|
68
|
+
Set the number of retries.
|
|
69
|
+
"""
|
|
70
|
+
self._retries = value
|
|
71
|
+
|
|
47
72
|
def call_with_retry(
|
|
48
73
|
self,
|
|
49
74
|
do: Callable[[], T],
|
redis/sentinel.py
CHANGED
|
@@ -349,6 +349,8 @@ class Sentinel(SentinelCommands):
|
|
|
349
349
|
):
|
|
350
350
|
"""
|
|
351
351
|
Returns a redis client instance for the ``service_name`` master.
|
|
352
|
+
Sentinel client will detect failover and reconnect Redis clients
|
|
353
|
+
automatically.
|
|
352
354
|
|
|
353
355
|
A :py:class:`~redis.sentinel.SentinelConnectionPool` class is
|
|
354
356
|
used to retrieve the master's address before establishing a new
|
redis/utils.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import datetime
|
|
2
2
|
import logging
|
|
3
|
+
import textwrap
|
|
3
4
|
from contextlib import contextmanager
|
|
4
5
|
from functools import wraps
|
|
5
6
|
from typing import Any, Dict, List, Mapping, Optional, Union
|
|
@@ -298,3 +299,9 @@ def extract_expire_flags(
|
|
|
298
299
|
exp_options.extend(["PXAT", pxat])
|
|
299
300
|
|
|
300
301
|
return exp_options
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
def truncate_text(txt, max_length=100):
|
|
305
|
+
return textwrap.shorten(
|
|
306
|
+
text=txt, width=max_length, placeholder="...", break_long_words=True
|
|
307
|
+
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: redis
|
|
3
|
-
Version: 6.0
|
|
3
|
+
Version: 6.1.0
|
|
4
4
|
Summary: Python client for Redis database and key-value store
|
|
5
5
|
Project-URL: Changes, https://github.com/redis/redis-py/releases
|
|
6
6
|
Project-URL: Code, https://github.com/redis/redis-py
|
|
@@ -32,7 +32,7 @@ Requires-Dist: async-timeout>=4.0.3; python_full_version < '3.11.3'
|
|
|
32
32
|
Provides-Extra: hiredis
|
|
33
33
|
Requires-Dist: hiredis>=3.0.0; extra == 'hiredis'
|
|
34
34
|
Provides-Extra: jwt
|
|
35
|
-
Requires-Dist: pyjwt
|
|
35
|
+
Requires-Dist: pyjwt>=2.9.0; extra == 'jwt'
|
|
36
36
|
Provides-Extra: ocsp
|
|
37
37
|
Requires-Dist: cryptography>=36.0.1; extra == 'ocsp'
|
|
38
38
|
Requires-Dist: pyopenssl>=20.0.1; extra == 'ocsp'
|
|
@@ -72,10 +72,16 @@ The Python interface to the Redis key-value store.
|
|
|
72
72
|
|
|
73
73
|
## Installation
|
|
74
74
|
|
|
75
|
-
Start a redis via docker:
|
|
75
|
+
Start a redis via docker (for Redis versions >= 8.0):
|
|
76
76
|
|
|
77
77
|
``` bash
|
|
78
|
-
docker run -p 6379:6379 -it redis
|
|
78
|
+
$ docker run -p 6379:6379 -it redis:latest
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Start a redis via docker (for Redis versions < 8.0):
|
|
82
|
+
|
|
83
|
+
``` bash
|
|
84
|
+
$ docker run -p 6379:6379 -it redis/redis-stack:latest
|
|
79
85
|
```
|
|
80
86
|
|
|
81
87
|
To install redis-py, simply:
|
|
@@ -95,7 +101,7 @@ Looking for a high-level library to handle object mapping? See [redis-om-python]
|
|
|
95
101
|
|
|
96
102
|
## Supported Redis Versions
|
|
97
103
|
|
|
98
|
-
The most recent version of this library supports
|
|
104
|
+
The most recent version of this library supports Redis version [7.2](https://github.com/redis/redis/blob/7.2/00-RELEASENOTES), [7.4](https://github.com/redis/redis/blob/7.4/00-RELEASENOTES) and [8.0](https://github.com/redis/redis/blob/8.0/00-RELEASENOTES).
|
|
99
105
|
|
|
100
106
|
The table below highlights version compatibility of the most-recent library versions and redis versions.
|
|
101
107
|
|
|
@@ -196,8 +202,8 @@ The following example shows how to utilize [Redis Pub/Sub](https://redis.io/docs
|
|
|
196
202
|
|
|
197
203
|
### Redis’ search and query capabilities default dialect
|
|
198
204
|
|
|
199
|
-
Release 6.0.0 introduces a client-side default dialect for Redis’ search and query capabilities.
|
|
200
|
-
By default, the client now overrides the server-side dialect with version 2, automatically appending *DIALECT 2* to commands like *FT.AGGREGATE* and *FT.SEARCH*.
|
|
205
|
+
Release 6.0.0 introduces a client-side default dialect for Redis’ search and query capabilities.
|
|
206
|
+
By default, the client now overrides the server-side dialect with version 2, automatically appending *DIALECT 2* to commands like *FT.AGGREGATE* and *FT.SEARCH*.
|
|
201
207
|
|
|
202
208
|
**Important**: Be aware that the query dialect may impact the results returned. If needed, you can revert to a different dialect version by configuring the client accordingly.
|
|
203
209
|
|
|
@@ -245,4 +251,4 @@ Special thanks to:
|
|
|
245
251
|
system.
|
|
246
252
|
- Paul Hubbard for initial packaging support.
|
|
247
253
|
|
|
248
|
-
[](https://redis.io)
|
|
254
|
+
[](https://redis.io)
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
redis/__init__.py,sha256
|
|
2
|
-
redis/backoff.py,sha256=
|
|
1
|
+
redis/__init__.py,sha256=-M8cA3QGivn45l9qd2LkwAid1y9uT_dj_qFBByBDkBI,2088
|
|
2
|
+
redis/backoff.py,sha256=2zR-ik5enJDsC2n2AWmE3ALSONgDLtyO4k096ZT6Txo,5275
|
|
3
3
|
redis/cache.py,sha256=68rJDNogvNwgdgBel6zSX9QziL11qsKIMhmvQvHvznM,9549
|
|
4
|
-
redis/client.py,sha256=
|
|
5
|
-
redis/cluster.py,sha256=
|
|
6
|
-
redis/connection.py,sha256=
|
|
4
|
+
redis/client.py,sha256=ZGKGLJdRwwgY4w01Ag4MOh6bI8g7pP9NYZn7-OamzOU,62486
|
|
5
|
+
redis/cluster.py,sha256=DvB9HMqXWziH99SJhxyCxBrrGNUWKebkVl-Jyp5avuM,123808
|
|
6
|
+
redis/connection.py,sha256=4ibOCqygzOSn77d-vpLORDg9TZEKV_ME13Kt4kE2ySM,66666
|
|
7
7
|
redis/crc.py,sha256=Z3kXFtkY2LdgefnQMud1xr4vG5UYvA9LCMqNMX1ywu4,729
|
|
8
8
|
redis/credentials.py,sha256=GOnO3-LSW34efHaIrUbS742Mw8l70mRzF6UrKiKZsMY,1828
|
|
9
9
|
redis/event.py,sha256=urOK241IdgmCQ3fq7GqXRstZ2vcXRV14bBBMdN3latk,12129
|
|
10
|
-
redis/exceptions.py,sha256=
|
|
10
|
+
redis/exceptions.py,sha256=46H-asqIaZ65Gc-voGzP7S39JtxdICGdHzdsT6LSMJE,5617
|
|
11
11
|
redis/lock.py,sha256=GrvPSxaOqKo7iAL2oi5ZUEPsOkxAXHVE_Tp1ejgO2fY,12760
|
|
12
12
|
redis/ocsp.py,sha256=teYSmKnCtk6B3jJLdNYbZN4OE0mxgspt2zUPbkIQzio,11452
|
|
13
13
|
redis/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
|
-
redis/retry.py,sha256=
|
|
15
|
-
redis/sentinel.py,sha256=
|
|
14
|
+
redis/retry.py,sha256=qJPRTARm3TYQPRNnzyjUUjGohbwtMz5KoDphCtHJ44Y,2902
|
|
15
|
+
redis/sentinel.py,sha256=DBphu6uNp6ZCSaVDSVC8nFhSxG93a12DnzgGWpyeh64,14757
|
|
16
16
|
redis/typing.py,sha256=k7F_3Vtsexeb7mUl6txlwrY1veGDLEhtcHe9FwIJOOo,2149
|
|
17
|
-
redis/utils.py,sha256=
|
|
17
|
+
redis/utils.py,sha256=XD4ySRo9JzLIMMpQY_q9MsxUIdEPee1d7rAq7xhmSwM,8268
|
|
18
18
|
redis/_parsers/__init__.py,sha256=qkfgV2X9iyvQAvbLdSelwgz0dCk9SGAosCvuZC9-qDc,550
|
|
19
19
|
redis/_parsers/base.py,sha256=WtCbM2CaOgHk7uxwWXA2KXDlZqfYA1EJrVX_NvdOZNk,7801
|
|
20
20
|
redis/_parsers/commands.py,sha256=pmR4hl4u93UvCmeDgePHFc6pWDr4slrKEvCsdMmtj_M,11052
|
|
@@ -22,15 +22,15 @@ redis/_parsers/encoders.py,sha256=X0jvTp-E4TZUlZxV5LJJ88TuVrF1vly5tuC0xjxGaSc,17
|
|
|
22
22
|
redis/_parsers/helpers.py,sha256=X5wkGDtuzseeCz23_t3FJpzy1ltIvh7zO1uD3cypiOs,29184
|
|
23
23
|
redis/_parsers/hiredis.py,sha256=qL1iCkWlxI63PiP99u_MY5-V6zKaesW2fD-IMNtc0QI,8189
|
|
24
24
|
redis/_parsers/resp2.py,sha256=f22kH-_ZP2iNtOn6xOe65MSy_fJpu8OEn1u_hgeeojI,4813
|
|
25
|
-
redis/_parsers/resp3.py,sha256=
|
|
25
|
+
redis/_parsers/resp3.py,sha256=JgLDeryCAqx75ghM78mAvxumzWBMEWupmFpaRoL6Xqo,11129
|
|
26
26
|
redis/_parsers/socket.py,sha256=CKD8QW_wFSNlIZzxlbNduaGpiv0I8wBcsGuAIojDfJg,5403
|
|
27
27
|
redis/asyncio/__init__.py,sha256=uoDD8XYVi0Kj6mcufYwLDUTQXmBRx7a0bhKF9stZr7I,1489
|
|
28
|
-
redis/asyncio/client.py,sha256
|
|
29
|
-
redis/asyncio/cluster.py,sha256=
|
|
30
|
-
redis/asyncio/connection.py,sha256=
|
|
28
|
+
redis/asyncio/client.py,sha256=xZNHB8SEWe_CrDOrNoKUEZMW4Aw_zKF0iygD7MOsujI,61954
|
|
29
|
+
redis/asyncio/cluster.py,sha256=190gM2GMnvrOhOI1I6t2ogS9UkMeokqe-uiFOtHk_1M,67891
|
|
30
|
+
redis/asyncio/connection.py,sha256=TpqWKA-MSiK1P0xCMivp438YCZY1CeOKfec6vH9txU4,48943
|
|
31
31
|
redis/asyncio/lock.py,sha256=GxgV6EsyKpMjh74KtaOPxh4fNPuwApz6Th46qhvrAws,12801
|
|
32
|
-
redis/asyncio/retry.py,sha256=
|
|
33
|
-
redis/asyncio/sentinel.py,sha256=
|
|
32
|
+
redis/asyncio/retry.py,sha256=8carxJLme2f0frB9Z0wU3mHqKzwqzGAGb2TMEtaaMvo,2482
|
|
33
|
+
redis/asyncio/sentinel.py,sha256=H7N_hvdATojwY06aH1AawFV-05AImqtOSAq0xKElbbk,14636
|
|
34
34
|
redis/asyncio/utils.py,sha256=31xFzXczDgSRyf6hSjiwue1eDQ_XlP_OJdp5dKxW_aE,718
|
|
35
35
|
redis/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
36
36
|
redis/auth/err.py,sha256=WYkbuDIzwp1S-eAvsya6QMlO6g9QIXbzMITOsTWX0xk,694
|
|
@@ -39,22 +39,22 @@ redis/auth/token.py,sha256=qYwAgxFW3S93QDUqp1BTsj7Pj9ZohnixGeOX0s7AsjY,3317
|
|
|
39
39
|
redis/auth/token_manager.py,sha256=ShBsYXiBZBJBOMB_Y-pXfLwEOAmc9s1okaCECinNZ7g,12018
|
|
40
40
|
redis/commands/__init__.py,sha256=cTUH-MGvaLYS0WuoytyqtN1wniw2A1KbkUXcpvOSY3I,576
|
|
41
41
|
redis/commands/cluster.py,sha256=vdWdpl4mP51oqfYBZHg5CUXt6jPaNp7aCLHyTieDrt8,31248
|
|
42
|
-
redis/commands/core.py,sha256=
|
|
43
|
-
redis/commands/helpers.py,sha256=
|
|
44
|
-
redis/commands/redismodules.py,sha256
|
|
42
|
+
redis/commands/core.py,sha256=lIi3DUP2kPdBC_RXrSTcUpjI_ORL9nKck9YayWIF_Pc,238242
|
|
43
|
+
redis/commands/helpers.py,sha256=VCoPdBMCr4wxdWBw1EB9R7ZBbQM0exAG1kws4XwsCII,3318
|
|
44
|
+
redis/commands/redismodules.py,sha256=-kLM4RBklDhNh-MXCra81ZTSstIQ-ulRab6v0dYUTdA,2573
|
|
45
45
|
redis/commands/sentinel.py,sha256=hRcIQ9x9nEkdcCsJzo6Ves6vk-3tsfQqfJTT_v3oLY0,4110
|
|
46
46
|
redis/commands/bf/__init__.py,sha256=qk4DA9KsMiP4WYqYeP1T5ScBwctsVtlLyMhrYIyq1Zc,8019
|
|
47
47
|
redis/commands/bf/commands.py,sha256=xeKt8E7G8HB-l922J0DLg07CEIZTVNGx_2Lfyw1gIck,21283
|
|
48
48
|
redis/commands/bf/info.py,sha256=_OB2v_hAPI9mdVNiBx8jUtH2MhMoct9ZRm-e8In6wQo,3355
|
|
49
|
-
redis/commands/json/__init__.py,sha256=
|
|
49
|
+
redis/commands/json/__init__.py,sha256=bznXhLYR652rfLfLp8cz0ZN0Yr8IRx4FgON_tq9_2Io,4845
|
|
50
50
|
redis/commands/json/_util.py,sha256=b_VQTh10FyLl8BtREfJfDagOJCyd6wTQQs8g63pi5GI,116
|
|
51
|
-
redis/commands/json/commands.py,sha256=
|
|
51
|
+
redis/commands/json/commands.py,sha256=ih8upnxeOpjPZXNfqeFBYxiCN2Cmyv8UGu3AlQnT6JQ,15723
|
|
52
52
|
redis/commands/json/decoders.py,sha256=a_IoMV_wgeJyUifD4P6HTcM9s6FhricwmzQcZRmc-Gw,1411
|
|
53
53
|
redis/commands/json/path.py,sha256=0zaO6_q_FVMk1Bkhkb7Wcr8AF2Tfr69VhkKy1IBVhpA,393
|
|
54
54
|
redis/commands/search/__init__.py,sha256=happQFVF0j7P87p7LQsUK5AK0kuem9cA-xvVRdQWpos,5744
|
|
55
55
|
redis/commands/search/_util.py,sha256=9Mp72OO5Ib5UbfN7uXb-iB7hQCm1jQLV90ms2P9XSGU,219
|
|
56
56
|
redis/commands/search/aggregation.py,sha256=CcZSZyquLWLrcSblwgt-bSyMvm-TQS9B7N8QI_ahCBU,11582
|
|
57
|
-
redis/commands/search/commands.py,sha256=
|
|
57
|
+
redis/commands/search/commands.py,sha256=ozyF6YgCiMArhb6ScXLPy49hnJwm4CGK4vrJRwSeB-I,38413
|
|
58
58
|
redis/commands/search/dialect.py,sha256=-7M6kkr33x0FkMtKmUsbeRAE6qxLUbqdJCqIo0UKIXo,105
|
|
59
59
|
redis/commands/search/document.py,sha256=g2R-PRgq-jN33_GLXzavvse4cpIHBMfjPfPK7tnE9Gc,413
|
|
60
60
|
redis/commands/search/field.py,sha256=ZWHYTtrLi-zZojohqXoidfllxP0SiadBW6hnGkBw7mM,5891
|
|
@@ -65,11 +65,14 @@ redis/commands/search/querystring.py,sha256=dE577kOqkCErNgO-IXI4xFVHI8kQE-JiH5ZR
|
|
|
65
65
|
redis/commands/search/reducers.py,sha256=Scceylx8BjyqS-TJOdhNW63n6tecL9ojt4U5Sqho5UY,4220
|
|
66
66
|
redis/commands/search/result.py,sha256=iuqmwOeCNo_7N4a_YxxDzVdOTpbwfF1T2uuq5sTqzMo,2624
|
|
67
67
|
redis/commands/search/suggestion.py,sha256=V_re6suDCoNc0ETn_P1t51FeK4pCamPwxZRxCY8jscE,1612
|
|
68
|
-
redis/commands/timeseries/__init__.py,sha256=
|
|
68
|
+
redis/commands/timeseries/__init__.py,sha256=k492_xE_lBD0cVSX82TWBiNxOWuDDrrVZUjINi3LZSc,3450
|
|
69
69
|
redis/commands/timeseries/commands.py,sha256=8Z2BEyP23qTYCJR_e9zdG11yWmIDwGBMO2PJNLtK2BA,47147
|
|
70
70
|
redis/commands/timeseries/info.py,sha256=meZYdu7IV9KaUWMKZs9qW4vo3Q9MwhdY-EBtKQzls5o,3223
|
|
71
71
|
redis/commands/timeseries/utils.py,sha256=NLwSOS5Dz9N8dYQSzEyBIvrItOWwfQ0xgDj8un6x3dU,1319
|
|
72
|
-
redis
|
|
73
|
-
redis
|
|
74
|
-
redis
|
|
75
|
-
redis-6.0.
|
|
72
|
+
redis/commands/vectorset/__init__.py,sha256=_fM0UdYjuzs8YWIUjQGH9QX5FwI0So8_D-5ALWWrWFc,1322
|
|
73
|
+
redis/commands/vectorset/commands.py,sha256=7CvQNFvkXuG3XPhHJ82y_oBYJwewRFz84aEi3OCH4Rw,12495
|
|
74
|
+
redis/commands/vectorset/utils.py,sha256=N-x0URyg76XC39CNfBym6FkFCVgm5NthzWKBnc2H0Xc,2981
|
|
75
|
+
redis-6.1.0.dist-info/METADATA,sha256=RJYbOKZYAVABc_B3-eouMHIHk7v-6gL8c01wl_N7Mkc,10644
|
|
76
|
+
redis-6.1.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
77
|
+
redis-6.1.0.dist-info/licenses/LICENSE,sha256=pXslClvwPXr-VbdAYzE_Ktt7ANVGwKsUmok5gzP-PMg,1074
|
|
78
|
+
redis-6.1.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|