Skip to content

Commit fdf4f1a

Browse files
Add support for PEXPIREAT's options (#2027)
* Add support for PEXPIREAT's options * add variables to the function header. Co-authored-by: dvora-h <[email protected]> Co-authored-by: dvora-h <[email protected]>
1 parent f43c3e0 commit fdf4f1a

File tree

2 files changed

+63
-5
lines changed

2 files changed

+63
-5
lines changed

redis/commands/core.py

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1863,18 +1863,41 @@ def pexpire(
18631863
exp_option.append("LT")
18641864
return self.execute_command("PEXPIRE", name, time, *exp_option)
18651865

1866-
def pexpireat(self, name: KeyT, when: AbsExpiryT) -> ResponseT:
1866+
def pexpireat(
1867+
self,
1868+
name: KeyT,
1869+
when: AbsExpiryT,
1870+
nx: bool = False,
1871+
xx: bool = False,
1872+
gt: bool = False,
1873+
lt: bool = False,
1874+
) -> ResponseT:
18671875
"""
1868-
Set an expire flag on key ``name``. ``when`` can be represented
1869-
as an integer representing unix time in milliseconds (unix time * 1000)
1870-
or a Python datetime object.
1876+
Set an expire flag on key ``name`` with given ``option``. ``when``
1877+
can be represented as an integer representing unix time in
1878+
milliseconds (unix time * 1000) or a Python datetime object.
1879+
1880+
Valid options are:
1881+
NX -> Set expiry only when the key has no expiry
1882+
XX -> Set expiry only when the key has an existing expiry
1883+
GT -> Set expiry only when the new expiry is greater than current one
1884+
LT -> Set expiry only when the new expiry is less than current one
18711885
18721886
For more information check https://redis.io/commands/pexpireat
18731887
"""
18741888
if isinstance(when, datetime.datetime):
18751889
ms = int(when.microsecond / 1000)
18761890
when = int(time.mktime(when.timetuple())) * 1000 + ms
1877-
return self.execute_command("PEXPIREAT", name, when)
1891+
exp_option = list()
1892+
if nx:
1893+
exp_option.append("NX")
1894+
if xx:
1895+
exp_option.append("XX")
1896+
if gt:
1897+
exp_option.append("GT")
1898+
if lt:
1899+
exp_option.append("LT")
1900+
return self.execute_command("PEXPIREAT", name, when, *exp_option)
18781901

18791902
def pexpiretime(self, key: str) -> int:
18801903
"""

tests/test_commands.py

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

1346+
@skip_if_server_version_lt("7.0.0")
1347+
def test_pexpireat_option_nx(self, r):
1348+
assert r.set("key", "val") is True
1349+
expire_at = redis_server_time(r) + datetime.timedelta(minutes=1)
1350+
assert r.pexpireat("key", expire_at, nx=True) is True
1351+
assert r.pexpireat("key", expire_at, nx=True) is False
1352+
1353+
@skip_if_server_version_lt("7.0.0")
1354+
def test_pexpireat_option_xx(self, r):
1355+
assert r.set("key", "val") is True
1356+
expire_at = redis_server_time(r) + datetime.timedelta(minutes=1)
1357+
assert r.pexpireat("key", expire_at, xx=True) is False
1358+
assert r.pexpireat("key", expire_at) is True
1359+
assert r.pexpireat("key", expire_at, xx=True) is True
1360+
1361+
@skip_if_server_version_lt("7.0.0")
1362+
def test_pexpireat_option_gt(self, r):
1363+
assert r.set("key", "val") is True
1364+
expire_at = redis_server_time(r) + datetime.timedelta(minutes=2)
1365+
assert r.pexpireat("key", expire_at) is True
1366+
expire_at = redis_server_time(r) + datetime.timedelta(minutes=1)
1367+
assert r.pexpireat("key", expire_at, gt=True) is False
1368+
expire_at = redis_server_time(r) + datetime.timedelta(minutes=3)
1369+
assert r.pexpireat("key", expire_at, gt=True) is True
1370+
1371+
@skip_if_server_version_lt("7.0.0")
1372+
def test_pexpireat_option_lt(self, r):
1373+
assert r.set("key", "val") is True
1374+
expire_at = redis_server_time(r) + datetime.timedelta(minutes=2)
1375+
assert r.pexpireat("key", expire_at) is True
1376+
expire_at = redis_server_time(r) + datetime.timedelta(minutes=3)
1377+
assert r.pexpireat("key", expire_at, lt=True) is False
1378+
expire_at = redis_server_time(r) + datetime.timedelta(minutes=1)
1379+
assert r.pexpireat("key", expire_at, lt=True) is True
1380+
13461381
@skip_if_server_version_lt("7.0.0")
13471382
def test_pexpiretime(self, r):
13481383
r.set("a", "foo")

0 commit comments

Comments
 (0)