From 8bbddacfe90923880e0c24420d3a481ecdcfce91 Mon Sep 17 00:00:00 2001 From: Jules Dejaeghere Date: Sun, 16 Jun 2024 14:34:12 +0200 Subject: [PATCH] Create SizedDict --- src/open_irceline/utils.py | 22 ++++++++++++++++++++++ tests/test_sized_dict.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 src/open_irceline/utils.py create mode 100644 tests/test_sized_dict.py diff --git a/src/open_irceline/utils.py b/src/open_irceline/utils.py new file mode 100644 index 0000000..c851840 --- /dev/null +++ b/src/open_irceline/utils.py @@ -0,0 +1,22 @@ +from collections import OrderedDict + + +class SizedDict(OrderedDict): + """Dictionary with a maximum size. When more items are added, the least recently accessed element is evicted""" + + def __init__(self, size: int): + super().__init__() + self._size = size + + def __setitem__(self, key, value): + super().__setitem__(key, value) + self.move_to_end(key) + if len(self) > self._size: + self.popitem(False) + + def __getitem__(self, key): + super().__getitem__(key) + self.move_to_end(key) + + def update(self, __m, **kwargs): + raise NotImplementedError() diff --git a/tests/test_sized_dict.py b/tests/test_sized_dict.py new file mode 100644 index 0000000..803e84e --- /dev/null +++ b/tests/test_sized_dict.py @@ -0,0 +1,30 @@ +from src.open_irceline.utils import SizedDict + + +def test_size_dict(): + s_dict = SizedDict(5) + assert len(s_dict) == 0 + + s_dict['a'] = 1 + s_dict['b'] = 2 + s_dict['c'] = 3 + s_dict['d'] = 4 + s_dict['e'] = 5 + assert len(s_dict) == 5 + + s_dict['f'] = 6 + assert 'a' not in s_dict + assert 'f' in s_dict + assert len(s_dict) == 5 + + s_dict['b'] = 42 + s_dict['g'] = 7 + assert 'f' in s_dict + assert 'g' in s_dict + assert 'b' in s_dict + assert 'c' not in s_dict + assert len(s_dict) == 5 + + del s_dict['b'] + assert len(s_dict) == 4 + assert 'b' not in s_dict