coredis 5.1.0__py3-none-any.whl → 5.2.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.

Potentially problematic release.


This version of coredis might be problematic. Click here for more details.

coredis/_version.py CHANGED
@@ -1,21 +1,34 @@
1
+ # file generated by setuptools-scm
2
+ # don't change, don't track in version control
1
3
 
2
- # This file was generated by 'versioneer.py' (0.29) from
3
- # revision-control system data, or from the parent directory name of an
4
- # unpacked source archive. Distribution tarballs contain a pre-generated copy
5
- # of this file.
4
+ __all__ = [
5
+ "__version__",
6
+ "__version_tuple__",
7
+ "version",
8
+ "version_tuple",
9
+ "__commit_id__",
10
+ "commit_id",
11
+ ]
6
12
 
7
- import json
13
+ TYPE_CHECKING = False
14
+ if TYPE_CHECKING:
15
+ from typing import Tuple
16
+ from typing import Union
8
17
 
9
- version_json = '''
10
- {
11
- "date": "2025-09-10T09:08:52-0700",
12
- "dirty": false,
13
- "error": null,
14
- "full-revisionid": "e958acd66930fab10e9517ba712e0b914f284a0b",
15
- "version": "5.1.0"
16
- }
17
- ''' # END VERSION_JSON
18
+ VERSION_TUPLE = Tuple[Union[int, str], ...]
19
+ COMMIT_ID = Union[str, None]
20
+ else:
21
+ VERSION_TUPLE = object
22
+ COMMIT_ID = object
18
23
 
24
+ version: str
25
+ __version__: str
26
+ __version_tuple__: VERSION_TUPLE
27
+ version_tuple: VERSION_TUPLE
28
+ commit_id: COMMIT_ID
29
+ __commit_id__: COMMIT_ID
19
30
 
20
- def get_versions():
21
- return json.loads(version_json)
31
+ __version__ = version = '5.2.0'
32
+ __version_tuple__ = version_tuple = (5, 2, 0)
33
+
34
+ __commit_id__ = commit_id = None
coredis/_version.pyi ADDED
@@ -0,0 +1 @@
1
+ __version__: str
coredis/client/basic.py CHANGED
@@ -10,7 +10,7 @@ from collections import defaultdict
10
10
  from ssl import SSLContext
11
11
  from typing import TYPE_CHECKING, Any, cast, overload
12
12
 
13
- from deprecated.sphinx import versionadded
13
+ from deprecated.sphinx import deprecated, versionadded
14
14
  from packaging import version
15
15
  from packaging.version import InvalidVersion, Version
16
16
 
@@ -34,10 +34,12 @@ from coredis.connection import (
34
34
  from coredis.credentials import AbstractCredentialProvider
35
35
  from coredis.exceptions import (
36
36
  AuthenticationError,
37
+ AuthorizationError,
37
38
  ConnectionError,
38
39
  PersistenceError,
39
40
  RedisError,
40
41
  ReplicationError,
42
+ ResponseError,
41
43
  TimeoutError,
42
44
  UnknownCommandError,
43
45
  WatchError,
@@ -339,7 +341,13 @@ class Client(
339
341
  ver, minor = divmod(ver, 100)
340
342
  ver, major = divmod(ver, 100)
341
343
  self._module_info[name] = version.Version(f"{major}.{minor}.{patch}")
342
- except (UnknownCommandError, AuthenticationError):
344
+ except (UnknownCommandError, AuthenticationError, AuthorizationError):
345
+ self._module_info = {}
346
+ except ResponseError as err:
347
+ warnings.warn(
348
+ "Unable to determine module support due to response error from "
349
+ f"`MODULE LIST`: {err}."
350
+ )
343
351
  self._module_info = {}
344
352
 
345
353
  async def initialize(self: ClientT) -> ClientT:
@@ -1117,6 +1125,7 @@ class Redis(Client[AnyStr]):
1117
1125
  self._decodecontext.set(prev_decode)
1118
1126
  self._encodingcontext.set(prev_encoding)
1119
1127
 
1128
+ @deprecated("The implementation of a monitor will be removed in 6.0", version="5.2.0")
1120
1129
  def monitor(
1121
1130
  self,
1122
1131
  response_handler: Callable[[MonitorResult], None] | None = None,
@@ -207,10 +207,12 @@ class KeySpec:
207
207
  b"SPOP": lambda args: ((args[1],)),
208
208
  b"SREM": lambda args: ((args[1],)),
209
209
  b"XACK": lambda args: ((args[1],)),
210
+ b"XACKDEL": lambda args: ((args[1],)),
210
211
  b"XADD": lambda args: ((args[1],)),
211
212
  b"XAUTOCLAIM": lambda args: ((args[1],)),
212
213
  b"XCLAIM": lambda args: ((args[1],)),
213
214
  b"XDEL": lambda args: ((args[1],)),
215
+ b"XDELEX": lambda args: ((args[1],)),
214
216
  b"XGROUP CREATE": lambda args: ((args[1],)),
215
217
  b"XGROUP CREATECONSUMER": lambda args: ((args[1],)),
216
218
  b"XGROUP DELCONSUMER": lambda args: ((args[1],)),
@@ -8,7 +8,7 @@ from __future__ import annotations
8
8
 
9
9
  import enum
10
10
 
11
- from coredis._utils import CaseAndEncodingInsensitiveEnum
11
+ from coredis._enum import CaseAndEncodingInsensitiveEnum
12
12
 
13
13
 
14
14
  class CommandName(CaseAndEncodingInsensitiveEnum):
@@ -145,6 +145,7 @@ class CommandName(CaseAndEncodingInsensitiveEnum):
145
145
  CLUSTER_LINKS = b"CLUSTER LINKS" # Since redis: 7.0.0
146
146
  CLUSTER_SHARDS = b"CLUSTER SHARDS" # Since redis: 7.0.0
147
147
  CLUSTER_MYSHARDID = b"CLUSTER MYSHARDID" # Since redis: 7.2.0
148
+ CLUSTER_SLOT_STATS = b"CLUSTER SLOT-STATS" # Since redis: 8.2.0
148
149
  CLUSTER_SLAVES = b"CLUSTER SLAVES" # Deprecated in redis: 5.0.0
149
150
  CLUSTER_SLOTS = b"CLUSTER SLOTS" # Deprecated in redis: 7.0.0
150
151
 
@@ -422,6 +423,8 @@ class CommandName(CaseAndEncodingInsensitiveEnum):
422
423
  XTRIM = b"XTRIM" # Since redis: 5.0.0
423
424
  XAUTOCLAIM = b"XAUTOCLAIM" # Since redis: 6.2.0
424
425
  XGROUP_CREATECONSUMER = b"XGROUP CREATECONSUMER" # Since redis: 6.2.0
426
+ XACKDEL = b"XACKDEL" # Since redis: 8.2.0
427
+ XDELEX = b"XDELEX" # Since redis: 8.2.0
425
428
 
426
429
  #: Commands for vector_set
427
430
  VADD = b"VADD" # Since redis: 8.0.0
@@ -435,6 +438,7 @@ class CommandName(CaseAndEncodingInsensitiveEnum):
435
438
  VSETATTR = b"VSETATTR" # Since redis: 8.0.0
436
439
  VGETATTR = b"VGETATTR" # Since redis: 8.0.0
437
440
  VRANDMEMBER = b"VRANDMEMBER" # Since redis: 8.0.0
441
+ VISMEMBER = b"VISMEMBER" # Since redis: 8.2.0
438
442
 
439
443
  #: Commands for json
440
444
  JSON_DEL = b"JSON.DEL" # Since RedisJSON: 1.0.0
coredis/commands/core.py CHANGED
@@ -5182,6 +5182,35 @@ class CoreCommands(CommandMixin[AnyStr]):
5182
5182
  CommandName.XACK, key, group, *identifiers, callback=IntCallback()
5183
5183
  )
5184
5184
 
5185
+ @versionadded(version="5.2.0")
5186
+ @ensure_iterable_valid("identifiers")
5187
+ @redis_command(
5188
+ CommandName.XACKDEL,
5189
+ version_introduced="8.2.0",
5190
+ group=CommandGroup.STREAM,
5191
+ flags={CommandFlag.FAST},
5192
+ )
5193
+ def xackdel(
5194
+ self,
5195
+ key: KeyT,
5196
+ group: StringT,
5197
+ identifiers: Parameters[ValueT],
5198
+ condition: Literal[PureToken.KEEPREF, PureToken.DELREF, PureToken.ACKED] | None = None,
5199
+ ) -> CommandRequest[tuple[int, ...]]:
5200
+ """
5201
+ Acknowledges and conditionally deletes one or multiple entries (messages) for a stream
5202
+ consumer group at the specified key.
5203
+
5204
+ """
5205
+ command_arguments: CommandArgList = [key, group]
5206
+ if condition is not None:
5207
+ command_arguments.append(condition)
5208
+
5209
+ command_arguments.extend([PrefixToken.IDS, len(list(identifiers)), *identifiers])
5210
+ return self.create_request(
5211
+ CommandName.XACKDEL, *command_arguments, callback=TupleCallback[int]()
5212
+ )
5213
+
5185
5214
  @mutually_inclusive_parameters("trim_strategy", "threshold")
5186
5215
  @redis_command(
5187
5216
  CommandName.XADD,
@@ -5189,6 +5218,7 @@ class CoreCommands(CommandMixin[AnyStr]):
5189
5218
  arguments={
5190
5219
  "nomkstream": {"version_introduced": "6.2.0"},
5191
5220
  "limit": {"version_introduced": "6.2.0"},
5221
+ "condition": {"version_introduced": "8.2.0"},
5192
5222
  },
5193
5223
  flags={CommandFlag.FAST},
5194
5224
  )
@@ -5202,6 +5232,7 @@ class CoreCommands(CommandMixin[AnyStr]):
5202
5232
  threshold: int | None = None,
5203
5233
  trim_operator: Literal[PureToken.EQUAL, PureToken.APPROXIMATELY] | None = None,
5204
5234
  limit: int | None = None,
5235
+ condition: Literal[PureToken.KEEPREF, PureToken.DELREF, PureToken.ACKED] | None = None,
5205
5236
  ) -> CommandRequest[AnyStr | None]:
5206
5237
  """
5207
5238
  Appends a new entry to a stream
@@ -5217,7 +5248,8 @@ class CoreCommands(CommandMixin[AnyStr]):
5217
5248
 
5218
5249
  if nomkstream is not None:
5219
5250
  command_arguments.append(PureToken.NOMKSTREAM)
5220
-
5251
+ if condition is not None:
5252
+ command_arguments.append(condition)
5221
5253
  if trim_strategy == PureToken.MAXLEN:
5222
5254
  command_arguments.append(trim_strategy)
5223
5255
 
@@ -5436,7 +5468,10 @@ class CoreCommands(CommandMixin[AnyStr]):
5436
5468
  @redis_command(
5437
5469
  CommandName.XTRIM,
5438
5470
  group=CommandGroup.STREAM,
5439
- arguments={"limit": {"version_introduced": "6.2.0"}},
5471
+ arguments={
5472
+ "limit": {"version_introduced": "6.2.0"},
5473
+ "condition": {"version_introduced": "8.2.0"},
5474
+ },
5440
5475
  )
5441
5476
  def xtrim(
5442
5477
  self,
@@ -5445,6 +5480,7 @@ class CoreCommands(CommandMixin[AnyStr]):
5445
5480
  threshold: int,
5446
5481
  trim_operator: Literal[PureToken.EQUAL, PureToken.APPROXIMATELY] | None = None,
5447
5482
  limit: int | None = None,
5483
+ condition: Literal[PureToken.KEEPREF, PureToken.DELREF, PureToken.ACKED] | None = None,
5448
5484
  ) -> CommandRequest[int]:
5449
5485
  """ """
5450
5486
  command_arguments: CommandArgList = [trim_strategy]
@@ -5456,6 +5492,8 @@ class CoreCommands(CommandMixin[AnyStr]):
5456
5492
 
5457
5493
  if limit is not None:
5458
5494
  command_arguments.extend(["LIMIT", limit])
5495
+ if condition is not None:
5496
+ command_arguments.append(condition)
5459
5497
 
5460
5498
  return self.create_request(
5461
5499
  CommandName.XTRIM, key, *command_arguments, callback=IntCallback()
@@ -5468,10 +5506,38 @@ class CoreCommands(CommandMixin[AnyStr]):
5468
5506
  flags={CommandFlag.FAST},
5469
5507
  )
5470
5508
  def xdel(self, key: KeyT, identifiers: Parameters[ValueT]) -> CommandRequest[int]:
5471
- """ """
5509
+ """
5510
+ Removes the specified entries from a stream, and returns the number of entries deleted
5511
+ """
5472
5512
 
5473
5513
  return self.create_request(CommandName.XDEL, key, *identifiers, callback=IntCallback())
5474
5514
 
5515
+ @versionadded(version="5.2.0")
5516
+ @ensure_iterable_valid("identifiers")
5517
+ @redis_command(
5518
+ CommandName.XDELEX,
5519
+ version_introduced="8.2",
5520
+ group=CommandGroup.STREAM,
5521
+ flags={CommandFlag.FAST},
5522
+ )
5523
+ def xdelex(
5524
+ self,
5525
+ key: KeyT,
5526
+ identifiers: Parameters[ValueT],
5527
+ condition: Literal[PureToken.KEEPREF, PureToken.DELREF, PureToken.ACKED] | None = None,
5528
+ ) -> CommandRequest[tuple[int, ...]]:
5529
+ """
5530
+ Deletes one or multiple entries from the stream at the specified key.
5531
+ """
5532
+ command_arguments: CommandArgList = [key]
5533
+ if condition is not None:
5534
+ command_arguments.append(condition)
5535
+ command_arguments.extend([PrefixToken.IDS, len(list(identifiers)), *identifiers])
5536
+
5537
+ return self.create_request(
5538
+ CommandName.XDELEX, *command_arguments, callback=TupleCallback[int]()
5539
+ )
5540
+
5475
5541
  @redis_command(
5476
5542
  CommandName.XINFO_CONSUMERS,
5477
5543
  group=CommandGroup.STREAM,
@@ -8398,3 +8464,21 @@ class CoreCommands(CommandMixin[AnyStr]):
8398
8464
  *command_arguments,
8399
8465
  callback=ItemOrTupleCallback[AnyStr | None](),
8400
8466
  )
8467
+
8468
+ @versionadded(version="5.2.0")
8469
+ @redis_command(CommandName.VISMEMBER, version_introduced="8.2.0", group=CommandGroup.VECTOR_SET)
8470
+ def vismember(self, key: KeyT, element: StringT) -> CommandRequest[bool]:
8471
+ """
8472
+ Check if an element exists in a vector set
8473
+
8474
+ :param key: The key containing the vector set
8475
+ :param element: The element to check for membership
8476
+
8477
+
8478
+ """
8479
+ return self.create_request(
8480
+ CommandName.VISMEMBER,
8481
+ key,
8482
+ element,
8483
+ callback=BoolCallback(),
8484
+ )
@@ -18,6 +18,7 @@ if TYPE_CHECKING:
18
18
  MonitorT = TypeVar("MonitorT", bound="Monitor[Any]")
19
19
 
20
20
 
21
+ @deprecated("The implementation of a monitor will be removed in 6.0", version="5.2.0")
21
22
  class Monitor(Generic[AnyStr]):
22
23
  """
23
24
  Monitor is useful for handling the ``MONITOR`` command to the redis server.
@@ -11,7 +11,8 @@ from typing import TYPE_CHECKING, Any, cast
11
11
  import async_timeout
12
12
  from deprecated.sphinx import versionadded
13
13
 
14
- from coredis._utils import CaseAndEncodingInsensitiveEnum, b, hash_slot, nativestr
14
+ from coredis._enum import CaseAndEncodingInsensitiveEnum
15
+ from coredis._utils import b, hash_slot, nativestr
15
16
  from coredis.commands.constants import CommandName
16
17
  from coredis.connection import BaseConnection, Connection
17
18
  from coredis.exceptions import ConnectionError, PubSubError, TimeoutError
coredis/tokens.py CHANGED
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from coredis._utils import CaseAndEncodingInsensitiveEnum
3
+ from coredis._enum import CaseAndEncodingInsensitiveEnum
4
4
 
5
5
 
6
6
  class PureToken(CaseAndEncodingInsensitiveEnum):
@@ -62,11 +62,33 @@ class PureToken(CaseAndEncodingInsensitiveEnum):
62
62
  #: - ``BITOP``
63
63
  AND = b"AND"
64
64
 
65
+ #: Used by:
66
+ #:
67
+ #: - ``BITOP``
68
+ ANDOR = b"ANDOR"
69
+
70
+ #: Used by:
71
+ #:
72
+ #: - ``BITOP``
73
+ DIFF = b"DIFF"
74
+
75
+ #: Used by:
76
+ #:
77
+ #: - ``BITOP``
78
+ DIFF1 = b"DIFF1"
79
+
65
80
  #: Used by:
66
81
  #:
67
82
  #: - ``BITOP``
68
83
  NOT = b"NOT"
69
84
 
85
+ #: Used by:
86
+ #:
87
+ #: - ``BITOP``
88
+ #: - ``REPLICAOF``
89
+ #: - ``SLAVEOF``
90
+ ONE = b"ONE"
91
+
70
92
  #: Used by:
71
93
  #:
72
94
  #: - ``BITOP``
@@ -265,6 +287,36 @@ class PureToken(CaseAndEncodingInsensitiveEnum):
265
287
  #: - ``CLUSTER SETSLOT``
266
288
  STABLE = b"STABLE"
267
289
 
290
+ #: Used by:
291
+ #:
292
+ #: - ``CLUSTER SLOT-STATS``
293
+ #: - ``FT.AGGREGATE``
294
+ #: - ``FT.SEARCH``
295
+ #: - ``GEORADIUS``
296
+ #: - ``GEORADIUSBYMEMBER``
297
+ #: - ``GEORADIUSBYMEMBER_RO``
298
+ #: - ``GEORADIUS_RO``
299
+ #: - ``GEOSEARCH``
300
+ #: - ``GEOSEARCHSTORE``
301
+ #: - ``SORT``
302
+ #: - ``SORT_RO``
303
+ ASC = b"ASC"
304
+
305
+ #: Used by:
306
+ #:
307
+ #: - ``CLUSTER SLOT-STATS``
308
+ #: - ``FT.AGGREGATE``
309
+ #: - ``FT.SEARCH``
310
+ #: - ``GEORADIUS``
311
+ #: - ``GEORADIUSBYMEMBER``
312
+ #: - ``GEORADIUSBYMEMBER_RO``
313
+ #: - ``GEORADIUS_RO``
314
+ #: - ``GEOSEARCH``
315
+ #: - ``GEOSEARCHSTORE``
316
+ #: - ``SORT``
317
+ #: - ``SORT_RO``
318
+ DESC = b"DESC"
319
+
268
320
  #: Used by:
269
321
  #:
270
322
  #: - ``COPY``
@@ -435,34 +487,6 @@ class PureToken(CaseAndEncodingInsensitiveEnum):
435
487
  #: - ``GEOSEARCHSTORE``
436
488
  ANY = b"ANY"
437
489
 
438
- #: Used by:
439
- #:
440
- #: - ``FT.AGGREGATE``
441
- #: - ``FT.SEARCH``
442
- #: - ``GEORADIUS``
443
- #: - ``GEORADIUSBYMEMBER``
444
- #: - ``GEORADIUSBYMEMBER_RO``
445
- #: - ``GEORADIUS_RO``
446
- #: - ``GEOSEARCH``
447
- #: - ``GEOSEARCHSTORE``
448
- #: - ``SORT``
449
- #: - ``SORT_RO``
450
- ASC = b"ASC"
451
-
452
- #: Used by:
453
- #:
454
- #: - ``FT.AGGREGATE``
455
- #: - ``FT.SEARCH``
456
- #: - ``GEORADIUS``
457
- #: - ``GEORADIUSBYMEMBER``
458
- #: - ``GEORADIUSBYMEMBER_RO``
459
- #: - ``GEORADIUS_RO``
460
- #: - ``GEOSEARCH``
461
- #: - ``GEOSEARCHSTORE``
462
- #: - ``SORT``
463
- #: - ``SORT_RO``
464
- DESC = b"DESC"
465
-
466
490
  #: Used by:
467
491
  #:
468
492
  #: - ``GEORADIUS``
@@ -562,12 +586,6 @@ class PureToken(CaseAndEncodingInsensitiveEnum):
562
586
  #: - ``MIGRATE``
563
587
  EMPTY_STRING = b""
564
588
 
565
- #: Used by:
566
- #:
567
- #: - ``REPLICAOF``
568
- #: - ``SLAVEOF``
569
- ONE = b"ONE"
570
-
571
589
  #: Used by:
572
590
  #:
573
591
  #: - ``RESTORE``
@@ -600,6 +618,30 @@ class PureToken(CaseAndEncodingInsensitiveEnum):
600
618
  #: - ``SORT_RO``
601
619
  SORTING = b"ALPHA"
602
620
 
621
+ #: Used by:
622
+ #:
623
+ #: - ``XACKDEL``
624
+ #: - ``XADD``
625
+ #: - ``XDELEX``
626
+ #: - ``XTRIM``
627
+ ACKED = b"ACKED"
628
+
629
+ #: Used by:
630
+ #:
631
+ #: - ``XACKDEL``
632
+ #: - ``XADD``
633
+ #: - ``XDELEX``
634
+ #: - ``XTRIM``
635
+ DELREF = b"DELREF"
636
+
637
+ #: Used by:
638
+ #:
639
+ #: - ``XACKDEL``
640
+ #: - ``XADD``
641
+ #: - ``XDELEX``
642
+ #: - ``XTRIM``
643
+ KEEPREF = b"KEEPREF"
644
+
603
645
  #: Used by:
604
646
  #:
605
647
  #: - ``XADD``
@@ -751,20 +793,19 @@ class PureToken(CaseAndEncodingInsensitiveEnum):
751
793
 
752
794
  #: Used by:
753
795
  #:
754
- #: - ``FT.AGGREGATE``
755
796
  #: - ``VADD``
756
- REDUCE = b"REDUCE"
797
+ #: - ``VSIM``
798
+ VALUES = b"VALUES"
757
799
 
758
800
  #: Used by:
759
801
  #:
760
- #: - ``VADD``
761
802
  #: - ``VSIM``
762
- VALUES = b"VALUES"
803
+ ELE = b"ELE"
763
804
 
764
805
  #: Used by:
765
806
  #:
766
807
  #: - ``VSIM``
767
- ELE = b"ELE"
808
+ NOTHREAD = b"NOTHREAD"
768
809
 
769
810
  #: Used by:
770
811
  #:
@@ -1222,6 +1263,11 @@ class PureToken(CaseAndEncodingInsensitiveEnum):
1222
1263
  #: - ``FT.AGGREGATE``
1223
1264
  RANDOM_SAMPLE = b"RANDOM_SAMPLE"
1224
1265
 
1266
+ #: Used by:
1267
+ #:
1268
+ #: - ``FT.AGGREGATE``
1269
+ REDUCE = b"REDUCE"
1270
+
1225
1271
  #: Used by:
1226
1272
  #:
1227
1273
  #: - ``FT.AGGREGATE``
@@ -1416,6 +1462,33 @@ class PrefixToken(CaseAndEncodingInsensitiveEnum):
1416
1462
  #: - ``CLUSTER SETSLOT``
1417
1463
  MIGRATING = b"MIGRATING"
1418
1464
 
1465
+ #: Used by:
1466
+ #:
1467
+ #: - ``CLUSTER SLOT-STATS``
1468
+ #: - ``SINTERCARD``
1469
+ #: - ``SORT``
1470
+ #: - ``SORT_RO``
1471
+ #: - ``XADD``
1472
+ #: - ``XTRIM``
1473
+ #: - ``ZINTERCARD``
1474
+ #: - ``ZRANGE``
1475
+ #: - ``ZRANGEBYLEX``
1476
+ #: - ``ZRANGEBYSCORE``
1477
+ #: - ``ZRANGESTORE``
1478
+ #: - ``ZREVRANGEBYLEX``
1479
+ #: - ``ZREVRANGEBYSCORE``
1480
+ LIMIT = b"LIMIT"
1481
+
1482
+ #: Used by:
1483
+ #:
1484
+ #: - ``CLUSTER SLOT-STATS``
1485
+ ORDERBY = b"ORDERBY"
1486
+
1487
+ #: Used by:
1488
+ #:
1489
+ #: - ``CLUSTER SLOT-STATS``
1490
+ SLOTSRANGE = b"SLOTSRANGE"
1491
+
1419
1492
  #: Used by:
1420
1493
  #:
1421
1494
  #: - ``COMMAND LIST``
@@ -1625,25 +1698,15 @@ class PrefixToken(CaseAndEncodingInsensitiveEnum):
1625
1698
 
1626
1699
  #: Used by:
1627
1700
  #:
1628
- #: - ``SINTERCARD``
1629
1701
  #: - ``SORT``
1630
1702
  #: - ``SORT_RO``
1631
- #: - ``XADD``
1632
- #: - ``XTRIM``
1633
- #: - ``ZINTERCARD``
1634
- #: - ``ZRANGE``
1635
- #: - ``ZRANGEBYLEX``
1636
- #: - ``ZRANGEBYSCORE``
1637
- #: - ``ZRANGESTORE``
1638
- #: - ``ZREVRANGEBYLEX``
1639
- #: - ``ZREVRANGEBYSCORE``
1640
- LIMIT = b"LIMIT"
1703
+ BY = b"BY"
1641
1704
 
1642
1705
  #: Used by:
1643
1706
  #:
1644
- #: - ``SORT``
1645
- #: - ``SORT_RO``
1646
- BY = b"BY"
1707
+ #: - ``XACKDEL``
1708
+ #: - ``XDELEX``
1709
+ IDS = b"IDS"
1647
1710
 
1648
1711
  #: Used by:
1649
1712
  #:
@@ -1726,6 +1789,11 @@ class PrefixToken(CaseAndEncodingInsensitiveEnum):
1726
1789
  #: - ``VADD``
1727
1790
  M = b"M"
1728
1791
 
1792
+ #: Used by:
1793
+ #:
1794
+ #: - ``VADD``
1795
+ REDUCE = b"REDUCE"
1796
+
1729
1797
  #: Used by:
1730
1798
  #:
1731
1799
  #: - ``VADD``
@@ -1,17 +1,16 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coredis
3
- Version: 5.1.0
3
+ Version: 5.2.0
4
4
  Summary: Python async client for Redis key-value store
5
- Home-page: https://github.com/alisaifee/coredis
6
- Author: Ali-Akber Saifee
7
- Author-email: ali@indydevs.org
8
- Maintainer: Ali-Akber Saifee
9
- Maintainer-email: ali@indydevs.org
10
- License: MIT
5
+ Project-URL: Homepage, https://github.com/alisaifee/coredis
11
6
  Project-URL: Source, https://github.com/alisaifee/coredis
12
- Project-URL: Changes, https://github.com/alisaifee/coredis/releases
7
+ Project-URL: Changelog, https://github.com/alisaifee/coredis/releases
13
8
  Project-URL: Documentation, https://coredis.readthedocs.org
14
- Keywords: Redis,key-value store,asyncio
9
+ Author-email: Ali-Akber Saifee <ali@indydevs.org>
10
+ Maintainer-email: Ali-Akber Saifee <ali@indydevs.org>
11
+ License-Expression: MIT
12
+ License-File: LICENSE
13
+ Keywords: Redis,asyncio,key-value store
15
14
  Classifier: Development Status :: 5 - Production/Stable
16
15
  Classifier: Intended Audience :: Developers
17
16
  Classifier: Operating System :: OS Independent
@@ -22,33 +21,16 @@ Classifier: Programming Language :: Python :: 3.12
22
21
  Classifier: Programming Language :: Python :: 3.13
23
22
  Classifier: Programming Language :: Python :: Implementation :: PyPy
24
23
  Requires-Python: >=3.10
25
- Description-Content-Type: text/markdown
26
- License-File: LICENSE
27
- Requires-Dist: async_timeout<6,>4
24
+ Requires-Dist: async-timeout<6,>4
28
25
  Requires-Dist: beartype>=0.20
29
26
  Requires-Dist: deprecated>=1.2
30
- Requires-Dist: typing_extensions>=4.13
31
27
  Requires-Dist: packaging<26,>=21
32
28
  Requires-Dist: pympler<2,>1
29
+ Requires-Dist: typing-extensions>=4.13
33
30
  Provides-Extra: recipes
34
- Requires-Dist: aiobotocore>=2.15.2; extra == "recipes"
35
- Requires-Dist: asyncache>=0.3.1; extra == "recipes"
36
- Dynamic: author
37
- Dynamic: author-email
38
- Dynamic: classifier
39
- Dynamic: description
40
- Dynamic: description-content-type
41
- Dynamic: home-page
42
- Dynamic: keywords
43
- Dynamic: license
44
- Dynamic: license-file
45
- Dynamic: maintainer
46
- Dynamic: maintainer-email
47
- Dynamic: project-url
48
- Dynamic: provides-extra
49
- Dynamic: requires-dist
50
- Dynamic: requires-python
51
- Dynamic: summary
31
+ Requires-Dist: aiobotocore>=2.15.2; extra == 'recipes'
32
+ Requires-Dist: asyncache>=0.3.1; extra == 'recipes'
33
+ Description-Content-Type: text/markdown
52
34
 
53
35
  # coredis
54
36