diff options
author | dogukanteber <47397379+dogukanteber@users.noreply.github.com> | 2022-03-14 16:03:28 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-14 15:03:28 +0200 |
commit | f43c3e08ab0facf5a2d70bcd91365faf74d7e220 (patch) | |
tree | ea847459c7852a67111e232a819be788a95ecfb0 | |
parent | eac3a34d162aa83c3094cbab80d535ca92fdf972 (diff) | |
download | redis-py-f43c3e08ab0facf5a2d70bcd91365faf74d7e220.tar.gz |
Add support for PEXPIRE command's option (#2026)
* Add support for PEXPIRE command's option
* Alter method arguments
* add variables to the function header
Co-authored-by: dvora-h <dvora.heller@redis.com>
-rw-r--r-- | redis/commands/core.py | 34 | ||||
-rw-r--r-- | tests/test_commands.py | 27 |
2 files changed, 56 insertions, 5 deletions
diff --git a/redis/commands/core.py b/redis/commands/core.py index 5b6d42b..7e3514e 100644 --- a/redis/commands/core.py +++ b/redis/commands/core.py @@ -1827,17 +1827,41 @@ class BasicKeyCommands(CommandsProtocol): """ return self.execute_command("PERSIST", name) - def pexpire(self, name: KeyT, time: ExpiryT) -> ResponseT: + def pexpire( + self, + name: KeyT, + time: ExpiryT, + nx: bool = False, + xx: bool = False, + gt: bool = False, + lt: bool = False, + ) -> ResponseT: """ - Set an expire flag on key ``name`` for ``time`` milliseconds. - ``time`` can be represented by an integer or a Python timedelta - object. + Set an expire flag on key ``name`` for ``time`` milliseconds + with given ``option``. ``time`` can be represented by an + integer or a Python timedelta object. + + Valid options are: + NX -> Set expiry only when the key has no expiry + XX -> Set expiry only when the key has an existing expiry + GT -> Set expiry only when the new expiry is greater than current one + LT -> Set expiry only when the new expiry is less than current one For more information check https://redis.io/commands/pexpire """ if isinstance(time, datetime.timedelta): time = int(time.total_seconds() * 1000) - return self.execute_command("PEXPIRE", name, time) + + exp_option = list() + if nx: + exp_option.append("NX") + if xx: + exp_option.append("XX") + if gt: + exp_option.append("GT") + if lt: + exp_option.append("LT") + return self.execute_command("PEXPIRE", name, time, *exp_option) def pexpireat(self, name: KeyT, when: AbsExpiryT) -> ResponseT: """ diff --git a/tests/test_commands.py b/tests/test_commands.py index ae1adb1..2aa5a96 100644 --- a/tests/test_commands.py +++ b/tests/test_commands.py @@ -1296,6 +1296,33 @@ class TestRedisCommands: assert r.persist("a") assert r.pttl("a") == -1 + @skip_if_server_version_lt("7.0.0") + def test_pexpire_option_nx(self, r): + assert r.set("key", "val") is True + assert r.pexpire("key", 60000, nx=True) is True + assert r.pexpire("key", 60000, nx=True) is False + + @skip_if_server_version_lt("7.0.0") + def test_pexpire_option_xx(self, r): + assert r.set("key", "val") is True + assert r.pexpire("key", 60000, xx=True) is False + assert r.pexpire("key", 60000) is True + assert r.pexpire("key", 70000, xx=True) is True + + @skip_if_server_version_lt("7.0.0") + def test_pexpire_option_gt(self, r): + assert r.set("key", "val") is True + assert r.pexpire("key", 60000) is True + assert r.pexpire("key", 70000, gt=True) is True + assert r.pexpire("key", 50000, gt=True) is False + + @skip_if_server_version_lt("7.0.0") + def test_pexpire_option_lt(self, r): + assert r.set("key", "val") is True + assert r.pexpire("key", 60000) is True + assert r.pexpire("key", 50000, lt=True) is True + assert r.pexpire("key", 70000, lt=True) is False + @skip_if_server_version_lt("2.6.0") def test_pexpireat_datetime(self, r): expire_at = redis_server_time(r) + datetime.timedelta(minutes=1) |