Skip to content

Commit 81e8663

Browse files
committed
Add support for PEXPIREAT's options
1 parent afc83e1 commit 81e8663

File tree

2 files changed

+55
-6
lines changed

2 files changed

+55
-6
lines changed

redis/commands/core.py

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1767,18 +1767,32 @@ def pexpire(self, name: KeyT, time: ExpiryT) -> ResponseT:
17671767
time = int(time.total_seconds() * 1000)
17681768
return self.execute_command("PEXPIRE", name, time)
17691769

1770-
def pexpireat(self, name: KeyT, when: AbsExpiryT) -> ResponseT:
1771-
"""
1772-
Set an expire flag on key ``name``. ``when`` can be represented
1773-
as an integer representing unix time in milliseconds (unix time * 1000)
1774-
or a Python datetime object.
1770+
def pexpireat(
1771+
self,
1772+
name: KeyT,
1773+
when: AbsExpiryT,
1774+
option: str = None
1775+
) -> ResponseT:
1776+
"""
1777+
Set an expire flag on key ``name`` with given ``option``. ``when``
1778+
can be represented as an integer representing unix time in
1779+
milliseconds (unix time * 1000) or a Python datetime object.
1780+
1781+
Valid options are:
1782+
NX -> Set expiry only when the key has no expiry
1783+
XX -> Set expiry only when the key has an existing expiry
1784+
GT -> Set expiry only when the new expiry is greater than current one
1785+
LT -> Set expiry only when the new expiry is less than current one
17751786
17761787
For more information check https://redis.io/commands/pexpireat
17771788
"""
17781789
if isinstance(when, datetime.datetime):
17791790
ms = int(when.microsecond / 1000)
17801791
when = int(time.mktime(when.timetuple())) * 1000 + ms
1781-
return self.execute_command("PEXPIREAT", name, when)
1792+
exp_option = list()
1793+
if option is not None:
1794+
exp_option.append(option)
1795+
return self.execute_command("PEXPIREAT", name, when, *exp_option)
17821796

17831797
def psetex(
17841798
self,

tests/test_commands.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1232,6 +1232,41 @@ def test_pexpireat_unixtime(self, r):
12321232
assert r.pexpireat("a", expire_at_seconds) is True
12331233
assert 0 < r.pttl("a") <= 61000
12341234

1235+
@skip_if_server_version_lt("7.0.0")
1236+
def test_pexpireat_option_nx(self, r):
1237+
assert r.set("key", "val") is True
1238+
expire_at = redis_server_time(r) + datetime.timedelta(minutes=1)
1239+
assert r.pexpireat("key", expire_at, "NX") is True
1240+
assert r.pexpireat("key", expire_at, "NX") is False
1241+
1242+
@skip_if_server_version_lt("7.0.0")
1243+
def test_pexpireat_option_xx(self, r):
1244+
assert r.set("key", "val") is True
1245+
expire_at = redis_server_time(r) + datetime.timedelta(minutes=1)
1246+
assert r.pexpireat("key", expire_at, "XX") is False
1247+
assert r.pexpireat("key", expire_at) is True
1248+
assert r.pexpireat("key", expire_at, "XX") is True
1249+
1250+
@skip_if_server_version_lt("7.0.0")
1251+
def test_pexpireat_option_gt(self, r):
1252+
assert r.set("key", "val") is True
1253+
expire_at = redis_server_time(r) + datetime.timedelta(minutes=2)
1254+
assert r.pexpireat("key", expire_at) is True
1255+
expire_at = redis_server_time(r) + datetime.timedelta(minutes=1)
1256+
assert r.pexpireat("key", expire_at, "GT") is False
1257+
expire_at = redis_server_time(r) + datetime.timedelta(minutes=3)
1258+
assert r.pexpireat("key", expire_at, "GT") is True
1259+
1260+
@skip_if_server_version_lt("7.0.0")
1261+
def test_pexpireat_option_lt(self, r):
1262+
assert r.set("key", "val") is True
1263+
expire_at = redis_server_time(r) + datetime.timedelta(minutes=2)
1264+
assert r.pexpireat("key", expire_at) is True
1265+
expire_at = redis_server_time(r) + datetime.timedelta(minutes=3)
1266+
assert r.pexpireat("key", expire_at, "LT") is False
1267+
expire_at = redis_server_time(r) + datetime.timedelta(minutes=1)
1268+
assert r.pexpireat("key", expire_at, "LT") is True
1269+
12351270
@skip_if_server_version_lt("2.6.0")
12361271
def test_psetex(self, r):
12371272
assert r.psetex("a", 1000, "value")

0 commit comments

Comments
 (0)