def test_or(self): self.assertEquals(1 | Bit(2), 5) self.assertEquals(1 | Bit(5), 33) self.assertEquals(1 | ~Bit(2), -5) self.assertEquals(Bit(0) | Bit(2), 5) self.assertEquals(Bit(0) | Bit(5), 33) self.assertEquals(Bit(0) | ~Bit(2), -5)
def test_and(self): self.assertEquals(1 & Bit(2), 0) self.assertEquals(1 & Bit(0), 1) self.assertEquals(1 & ~Bit(0), 0) self.assertEquals(Bit(0) & Bit(2), 0) self.assertEquals(Bit(0) & Bit(0), 1) self.assertEquals(Bit(0) & ~Bit(0), 0)
def __init__(self, flags, default=None, *args, **kwargs): if isinstance(flags, dict): # Get only integer keys in correct range valid_keys = (k for k in flags.keys() if isinstance(k, int) and (0 <= k < MAX_FLAG_COUNT)) if not valid_keys: raise ValueError('Wrong keys or empty dictionary') # Fill list with values from dict or with empty values flags = [flags.get(i, '') for i in range(max(valid_keys) + 1)] if len(flags) > MAX_FLAG_COUNT: raise ValueError('Too many flags') flags = list(flags) labels = [] for num, flag in enumerate(flags): if isinstance(flag, (tuple, list)): flags[num] = flag[0] labels.append(flag[1]) else: labels.append(flag) if isinstance(default, (list, tuple, set, frozenset)): new_value = 0 for flag in default: new_value |= Bit(flags.index(flag)) default = new_value BigIntegerField.__init__(self, default=default, *args, **kwargs) self.flags = flags self.labels = labels
def set_bit(self, bit_number, true_or_false): mask = 2**int(bit_number) if true_or_false: self._value |= mask else: self._value &= (~mask) return Bit(bit_number, self._value & mask != 0)
def choices(self, cl): yield { 'selected': self.lookup_val == 0, 'query_string': cl.get_query_string({}, [self.lookup_kwarg]), 'display': _('All'), } for number, flag in enumerate(self.flags): bit_mask = Bit(number).mask yield { 'selected': self.lookup_val == bit_mask, 'query_string': cl.get_query_string({self.lookup_kwarg: bit_mask}), 'display': self.labels[number], }
def choices(self, cl): yield { "selected": self.lookup_val == 0, "query_string": cl.get_query_string({}, [self.lookup_kwarg]), "display": _("All"), } for number, flag in enumerate(self.flags): bit_mask = Bit(number).mask yield { "selected": self.lookup_val == bit_mask, "query_string": cl.get_query_string({self.lookup_kwarg: bit_mask}), "display": self.labels[number], }
def test_xor(self): self.assertEquals(1 ^ Bit(2), 5) self.assertEquals(1 ^ Bit(0), 0) self.assertEquals(1 ^ Bit(1), 3) self.assertEquals(1 ^ Bit(5), 33) self.assertEquals(1 ^ ~Bit(2), -6) self.assertEquals(Bit(0) ^ Bit(2), 5) self.assertEquals(Bit(0) ^ Bit(0), 0) self.assertEquals(Bit(0) ^ Bit(1), 3) self.assertEquals(Bit(0) ^ Bit(5), 33) self.assertEquals(Bit(0) ^ ~Bit(2), -6)
def test_comparison(self): self.assertEquals(Bit(0), Bit(0)) self.assertNotEquals(Bit(1), Bit(0)) self.assertNotEquals(Bit(0, 0), Bit(0, 1)) self.assertEquals(Bit(0, 1), Bit(0, 1)) self.assertEquals(Bit(0), 1)
def test_int(self): bit = Bit(0) self.assertEquals(int(bit), 1) self.assertEquals(bool(bit), True) self.assertFalse(not bit)
def itervalues(self): for flag in self._flags: yield Bit(self._flags.index(flag))
def iteritems(self): for flag in self._flags: yield flag, Bit(self._flags.index(flag))
def __getattr__(self, key): if key not in self._flags: raise AttributeError return Bit(self._flags.index(key))
def get_bit(self, bit_number): mask = 2**int(bit_number) return Bit(bit_number, self._value & mask != 0)