44from fakeredis import _msgs as msgs
55from fakeredis ._commands import command , Key , Int , CommandItem
66from fakeredis ._helpers import OK , SimpleError , casematch , Database , SimpleString
7+ from fakeredis .model import ExpiringMembersSet
78
89
910def _calc_setop (op : Callable [..., Any ], stop_if_missing : bool , key : CommandItem , * keys : CommandItem ) -> Any :
1011 if stop_if_missing and not key .value :
1112 return set ()
1213 value = key .value
13- if not isinstance (value , set ):
14+ if not isinstance (value , ExpiringMembersSet ):
1415 raise SimpleError (msgs .WRONGTYPE_MSG )
1516 ans = value .copy ()
1617 for other in keys :
17- value = other .value if other .value is not None else set ()
18- if not isinstance (value , set ):
18+ value = other .value if other .value is not None else ExpiringMembersSet ()
19+ if not isinstance (value , ExpiringMembersSet ):
1920 raise SimpleError (msgs .WRONGTYPE_MSG )
2021 if stop_if_missing and not value :
2122 return set ()
@@ -48,26 +49,26 @@ def __init__(self, *args: Any, **kwargs: Any) -> None:
4849 self .version : Tuple [int ]
4950 self ._db : Database
5051
51- @command ((Key (set ), bytes ), (bytes ,))
52+ @command ((Key (ExpiringMembersSet ), bytes ), (bytes ,))
5253 def sadd (self , key : CommandItem , * members : bytes ) -> int :
5354 old_size = len (key .value )
5455 key .value .update (members )
5556 key .updated ()
5657 return len (key .value ) - old_size
5758
58- @command ((Key (set ),))
59+ @command ((Key (ExpiringMembersSet ),))
5960 def scard (self , key : CommandItem ) -> int :
6061 return len (key .value )
6162
62- @command ((Key (set ),), (Key (set ),))
63+ @command ((Key (ExpiringMembersSet ),), (Key (ExpiringMembersSet ),))
6364 def sdiff (self , * keys : CommandItem ) -> Any :
6465 return _setop (lambda a , b : a - b , False , None , * keys )
6566
66- @command ((Key (), Key (set )), (Key (set ),))
67+ @command ((Key (), Key (ExpiringMembersSet )), (Key (ExpiringMembersSet ),))
6768 def sdiffstore (self , dst : CommandItem , * keys : CommandItem ) -> Any :
6869 return _setop (lambda a , b : a - b , False , dst , * keys )
6970
70- @command ((Key (set ),), (Key (set ),))
71+ @command ((Key (ExpiringMembersSet ),), (Key (ExpiringMembersSet ),))
7172 def sinter (self , * keys : CommandItem ) -> Any :
7273 res = _setop (lambda a , b : a & b , True , None , * keys )
7374 return res
@@ -89,23 +90,23 @@ def sintercard(self, numkeys: int, *args: bytes) -> int:
8990 res = _setop (lambda a , b : a & b , False , None , * keys )
9091 return len (res ) if limit == 0 else min (limit , len (res ))
9192
92- @command ((Key (), Key (set )), (Key (set ),))
93+ @command ((Key (), Key (ExpiringMembersSet )), (Key (ExpiringMembersSet ),))
9394 def sinterstore (self , dst : CommandItem , * keys : CommandItem ) -> Any :
9495 return _setop (lambda a , b : a & b , True , dst , * keys )
9596
96- @command ((Key (set ), bytes ))
97+ @command ((Key (ExpiringMembersSet ), bytes ))
9798 def sismember (self , key : CommandItem , member : bytes ) -> int :
9899 return int (member in key .value )
99100
100- @command ((Key (set ), bytes ), (bytes ,))
101+ @command ((Key (ExpiringMembersSet ), bytes ), (bytes ,))
101102 def smismember (self , key : CommandItem , * members : bytes ) -> List [int ]:
102103 return [self .sismember (key , member ) for member in members ]
103104
104- @command ((Key (set ),))
105+ @command ((Key (ExpiringMembersSet ),))
105106 def smembers (self , key : CommandItem ) -> List [bytes ]:
106107 return list (key .value )
107108
108- @command ((Key (set , 0 ), Key (set ), bytes ))
109+ @command ((Key (ExpiringMembersSet , 0 ), Key (ExpiringMembersSet ), bytes ))
109110 def smove (self , src : CommandItem , dst : CommandItem , member : bytes ) -> int :
110111 try :
111112 src .value .remove (member )
@@ -117,7 +118,7 @@ def smove(self, src: CommandItem, dst: CommandItem, member: bytes) -> int:
117118 dst .updated () # TODO: is it updated if member was already present?
118119 return 1
119120
120- @command ((Key (set ),), (Int ,))
121+ @command ((Key (ExpiringMembersSet ),), (Int ,))
121122 def spop (self , key : CommandItem , count : Optional [int ] = None ) -> Union [bytes , List [bytes ], None ]:
122123 if count is None :
123124 if not key .value :
@@ -135,7 +136,7 @@ def spop(self, key: CommandItem, count: Optional[int] = None) -> Union[bytes, Li
135136 key .updated () # Inside the loop because redis special-cases count=0
136137 return items
137138
138- @command ((Key (set ),), (Int ,))
139+ @command ((Key (ExpiringMembersSet ),), (Int ,))
139140 def srandmember (self , key : CommandItem , count : Optional [int ] = None ) -> Union [bytes , List [bytes ], None ]:
140141 if count is None :
141142 if not key .value :
@@ -149,7 +150,7 @@ def srandmember(self, key: CommandItem, count: Optional[int] = None) -> Union[by
149150 items = list (key .value )
150151 return [random .choice (items ) for _ in range (- count )]
151152
152- @command ((Key (set ), bytes ), (bytes ,))
153+ @command ((Key (ExpiringMembersSet ), bytes ), (bytes ,))
153154 def srem (self , key : CommandItem , * members : bytes ) -> int :
154155 old_size = len (key .value )
155156 for member in members :
@@ -159,15 +160,15 @@ def srem(self, key: CommandItem, *members: bytes) -> int:
159160 key .updated ()
160161 return deleted
161162
162- @command ((Key (set ), Int ), (bytes , bytes ))
163+ @command ((Key (ExpiringMembersSet ), Int ), (bytes , bytes ))
163164 def sscan (self , key : CommandItem , cursor : int , * args : bytes ) -> Any :
164165 return self ._scan (key .value , cursor , * args )
165166
166- @command ((Key (set ),), (Key (set ),))
167+ @command ((Key (ExpiringMembersSet ),), (Key (ExpiringMembersSet ),))
167168 def sunion (self , * keys : CommandItem ) -> Any :
168169 return _setop (lambda a , b : a | b , False , None , * keys )
169170
170- @command ((Key (), Key (set )), (Key (set ),))
171+ @command ((Key (), Key (ExpiringMembersSet )), (Key (ExpiringMembersSet ),))
171172 def sunionstore (self , dst : CommandItem , * keys : CommandItem ) -> Any :
172173 return _setop (lambda a , b : a | b , False , dst , * keys )
173174
@@ -176,19 +177,19 @@ def sunionstore(self, dst: CommandItem, *keys: CommandItem) -> Any:
176177 # approximate and store the results in a string. Instead, it is implemented
177178 # on top of sets.
178179
179- @command ((Key (set ),), (bytes ,))
180+ @command ((Key (ExpiringMembersSet ),), (bytes ,))
180181 def pfadd (self , key : CommandItem , * elements : bytes ) -> int :
181182 result = self .sadd (key , * elements )
182183 # Per the documentation:
183184 # - 1 if at least 1 HyperLogLog internal register was altered. 0 otherwise.
184185 return 1 if result > 0 else 0
185186
186- @command ((Key (set ),), (Key (set ),))
187+ @command ((Key (ExpiringMembersSet ),), (Key (ExpiringMembersSet ),))
187188 def pfcount (self , * keys : CommandItem ) -> int :
188189 """Return the approximated cardinality of the set observed by the HyperLogLog at key(s)."""
189190 return len (self .sunion (* keys ))
190191
191- @command ((Key (set ), Key (set )), (Key (set ),))
192+ @command ((Key (ExpiringMembersSet ), Key (ExpiringMembersSet )), (Key (ExpiringMembersSet ),))
192193 def pfmerge (self , dest : CommandItem , * sources : CommandItem ) -> SimpleString :
193194 """Merge N different HyperLogLogs into a single one."""
194195 self .sunionstore (dest , * sources )
0 commit comments