From 110faf3018cca311db66079f1ca63b821b027a49 Mon Sep 17 00:00:00 2001 From: Charles Leifer Date: Fri, 1 Dec 2023 07:36:38 -0600 Subject: [PATCH] Ensure we iterate over the longest in bitwise on bigbitdata. Replaces #2810 --- peewee.py | 3 ++- tests/fields.py | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/peewee.py b/peewee.py index dff33aac4..d25a1d315 100644 --- a/peewee.py +++ b/peewee.py @@ -5118,7 +5118,8 @@ def _bitwise_op(self, other, op): else: raise ValueError('Incompatible data-type') buf = bytearray(b'\x00' * max(len(self), len(other))) - for i, (a, b) in enumerate(zip(self._buffer, data)): + it = itertools.zip_longest(self._buffer, data, fillvalue=0) + for i, (a, b) in enumerate(it): buf[i] = op(a, b) return buf diff --git a/tests/fields.py b/tests/fields.py index c4d1fa1d1..c65381cd8 100644 --- a/tests/fields.py +++ b/tests/fields.py @@ -741,6 +741,16 @@ def test_bigbit_field_bitwise(self): b1.data ^= b3.data self.assertEqual(b1.data._buffer, b'\x8b') + b1.data = b'\x11' + self.assertEqual(b1.data & b'\xff\xff', b'\x11\x00') + self.assertEqual(b1.data | b'\xff\xff', b'\xff\xff') + self.assertEqual(b1.data ^ b'\xff\xff', b'\xee\xff') + + b1.data = b'\x11\x11' + self.assertEqual(b1.data & b'\xff', b'\x11\x00') + self.assertEqual(b1.data | b'\xff', b'\xff\x11') + self.assertEqual(b1.data ^ b'\xff', b'\xee\x11') + def test_bigbit_field_bulk_create(self): b1, b2, b3 = Bits(), Bits(), Bits() b1.data.set_bit(1)