From 883fca7199a7ab7adc583b9ee324a9e44d0909eb Mon Sep 17 00:00:00 2001 From: dvora-h <67596500+dvora-h@users.noreply.github.com> Date: Sun, 8 May 2022 15:23:09 +0300 Subject: Get command keys for subcommands (#2170) * parse subcommands * fix tests --- redis/client.py | 4 ++++ redis/cluster.py | 1 + redis/commands/parser.py | 26 +++++++++++++++++++++++++- 3 files changed, 30 insertions(+), 1 deletion(-) (limited to 'redis') diff --git a/redis/client.py b/redis/client.py index 7c83b61..58668ee 100755 --- a/redis/client.py +++ b/redis/client.py @@ -553,6 +553,10 @@ def parse_command(response, **options): cmd_dict["first_key_pos"] = command[3] cmd_dict["last_key_pos"] = command[4] cmd_dict["step_count"] = command[5] + if len(command) > 7: + cmd_dict["tips"] = command[7] + cmd_dict["key_specifications"] = command[8] + cmd_dict["subcommands"] = command[9] commands[cmd_name] = cmd_dict return commands diff --git a/redis/cluster.py b/redis/cluster.py index e5baee2..fa1322f 100644 --- a/redis/cluster.py +++ b/redis/cluster.py @@ -240,6 +240,7 @@ class AbstractRedisCluster: [ "ACL CAT", "ACL DELUSER", + "ACL DRYRUN", "ACL GENPASS", "ACL GETUSER", "ACL HELP", diff --git a/redis/commands/parser.py b/redis/commands/parser.py index 936f2ec..7560603 100644 --- a/redis/commands/parser.py +++ b/redis/commands/parser.py @@ -25,6 +25,21 @@ class CommandsParser: commands[cmd.lower()] = commands.pop(cmd) self.commands = commands + def parse_subcommand(self, command, **options): + cmd_dict = {} + cmd_name = str_if_bytes(command[0]) + cmd_dict["name"] = cmd_name + cmd_dict["arity"] = int(command[1]) + cmd_dict["flags"] = [str_if_bytes(flag) for flag in command[2]] + cmd_dict["first_key_pos"] = command[3] + cmd_dict["last_key_pos"] = command[4] + cmd_dict["step_count"] = command[5] + if len(command) > 7: + cmd_dict["tips"] = command[7] + cmd_dict["key_specifications"] = command[8] + cmd_dict["subcommands"] = command[9] + return cmd_dict + # As soon as this PR is merged into Redis, we should reimplement # our logic to use COMMAND INFO changes to determine the key positions # https://github.com/redis/redis/pull/8324 @@ -72,8 +87,17 @@ class CommandsParser: and command["first_key_pos"] == 0 and command["last_key_pos"] == 0 ): + is_subcmd = False + if "subcommands" in command: + subcmd_name = f"{cmd_name}|{args[1].lower()}" + for subcmd in command["subcommands"]: + if str_if_bytes(subcmd[0]) == subcmd_name: + command = self.parse_subcommand(subcmd) + is_subcmd = True + # The command doesn't have keys in it - return None + if not is_subcmd: + return None last_key_pos = command["last_key_pos"] if last_key_pos < 0: last_key_pos = len(args) - abs(last_key_pos) -- cgit v1.2.1