summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordogukanteber <47397379+dogukanteber@users.noreply.github.com>2022-03-14 16:02:46 +0300
committerGitHub <noreply@github.com>2022-03-14 15:02:46 +0200
commit2c405855021ccc8d4a45fa1aae352ddb303baae0 (patch)
treed54d448d753df08301a90a2b67e9b696ef31b9c3
parenta12b5fd5e9af55e4668c78b50388c4ffb73fdda0 (diff)
downloadredis-py-2c405855021ccc8d4a45fa1aae352ddb303baae0.tar.gz
Add support for EXPIRE command's options (#2002)
* Add support for EXPIRE command's options * Add requested changes * Change method arguments * add variables to the function header Co-authored-by: dvora-h <67596500+dvora-h@users.noreply.github.com> Co-authored-by: Chayim <chayim@users.noreply.github.com> Co-authored-by: dvora-h <dvora.heller@redis.com>
-rw-r--r--redis/commands/core.py34
-rw-r--r--tests/test_commands.py25
2 files changed, 55 insertions, 4 deletions
diff --git a/redis/commands/core.py b/redis/commands/core.py
index 3595677..108da1b 100644
--- a/redis/commands/core.py
+++ b/redis/commands/core.py
@@ -1501,16 +1501,42 @@ class BasicKeyCommands(CommandsProtocol):
__contains__ = exists
- def expire(self, name: KeyT, time: ExpiryT) -> ResponseT:
+ def expire(
+ 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`` seconds. ``time``
- can be represented by an integer or a Python timedelta object.
+ Set an expire flag on key ``name`` for ``time`` seconds 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/expire
"""
if isinstance(time, datetime.timedelta):
time = int(time.total_seconds())
- return self.execute_command("EXPIRE", 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("EXPIRE", name, time, *exp_option)
def expireat(self, name: KeyT, when: AbsExpiryT) -> ResponseT:
"""
diff --git a/tests/test_commands.py b/tests/test_commands.py
index a73541e..c8bcc9c 100644
--- a/tests/test_commands.py
+++ b/tests/test_commands.py
@@ -1058,6 +1058,31 @@ class TestRedisCommands:
assert r.persist("a")
assert r.ttl("a") == -1
+ @skip_if_server_version_lt("7.0.0")
+ def test_expire_option_nx(self, r):
+ r.set("key", "val")
+ assert r.expire("key", 100, nx=True) == 1
+ assert r.expire("key", 500, nx=True) == 0
+
+ @skip_if_server_version_lt("7.0.0")
+ def test_expire_option_xx(self, r):
+ r.set("key", "val")
+ assert r.expire("key", 100, xx=True) == 0
+ assert r.expire("key", 100)
+ assert r.expire("key", 500, nx=True) == 1
+
+ @skip_if_server_version_lt("7.0.0")
+ def test_expire_option_gt(self, r):
+ r.set("key", "val", 100)
+ assert r.expire("key", 50, gt=True) == 0
+ assert r.expire("key", 500, gt=True) == 1
+
+ @skip_if_server_version_lt("7.0.0")
+ def test_expire_option_lt(self, r):
+ r.set("key", "val", 100)
+ assert r.expire("key", 50, lt=True) == 1
+ assert r.expire("key", 150, lt=True) == 0
+
def test_expireat_datetime(self, r):
expire_at = redis_server_time(r) + datetime.timedelta(minutes=1)
r["a"] = "foo"