Skip to content

Commit d4fcd99

Browse files
authored
Add support for BIT|BYTE option (#2068)
* Add support for BIT|BYTE option * linters
1 parent 7b7c6c8 commit d4fcd99

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

redis/commands/core.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1363,6 +1363,7 @@ def bitcount(
13631363
key: KeyT,
13641364
start: Union[int, None] = None,
13651365
end: Union[int, None] = None,
1366+
mode: Optional[str] = None,
13661367
) -> ResponseT:
13671368
"""
13681369
Returns the count of set bits in the value of ``key``. Optional
@@ -1376,6 +1377,8 @@ def bitcount(
13761377
params.append(end)
13771378
elif (start is not None and end is None) or (end is not None and start is None):
13781379
raise DataError("Both start and end must be specified")
1380+
if mode is not None:
1381+
params.append(mode)
13791382
return self.execute_command("BITCOUNT", *params)
13801383

13811384
def bitfield(
@@ -1411,6 +1414,7 @@ def bitpos(
14111414
bit: int,
14121415
start: Union[int, None] = None,
14131416
end: Union[int, None] = None,
1417+
mode: Optional[str] = None,
14141418
) -> ResponseT:
14151419
"""
14161420
Return the position of the first bit set to 1 or 0 in a string.
@@ -1430,6 +1434,9 @@ def bitpos(
14301434
params.append(end)
14311435
elif start is None and end is not None:
14321436
raise DataError("start argument is not set, " "when end is specified")
1437+
1438+
if mode is not None:
1439+
params.append(mode)
14331440
return self.execute_command("BITPOS", *params)
14341441

14351442
def copy(

tests/test_commands.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -863,6 +863,15 @@ def test_bitcount(self, r):
863863
assert r.bitcount("a", -2, -1) == 2
864864
assert r.bitcount("a", 1, 1) == 1
865865

866+
@skip_if_server_version_lt("7.0.0")
867+
def test_bitcount_mode(self, r):
868+
r.set("mykey", "foobar")
869+
assert r.bitcount("mykey") == 26
870+
assert r.bitcount("mykey", 1, 1, "byte") == 6
871+
assert r.bitcount("mykey", 5, 30, "bit") == 17
872+
with pytest.raises(redis.ResponseError):
873+
assert r.bitcount("mykey", 5, 30, "but")
874+
866875
@pytest.mark.onlynoncluster
867876
@skip_if_server_version_lt("2.6.0")
868877
def test_bitop_not_empty_string(self, r):
@@ -935,6 +944,15 @@ def test_bitpos_wrong_arguments(self, r):
935944
with pytest.raises(exceptions.RedisError):
936945
r.bitpos(key, 7) == 12
937946

947+
@skip_if_server_version_lt("7.0.0")
948+
def test_bitpos_mode(self, r):
949+
r.set("mykey", b"\x00\xff\xf0")
950+
assert r.bitpos("mykey", 1, 0) == 8
951+
assert r.bitpos("mykey", 1, 2, -1, "byte") == 16
952+
assert r.bitpos("mykey", 0, 7, 15, "bit") == 7
953+
with pytest.raises(redis.ResponseError):
954+
r.bitpos("mykey", 1, 7, 15, "bite")
955+
938956
@pytest.mark.onlynoncluster
939957
@skip_if_server_version_lt("6.2.0")
940958
def test_copy(self, r):

0 commit comments

Comments
 (0)