From b639e5fdb429611a4b001188e61621b225fb9abb Mon Sep 17 00:00:00 2001 From: Fletcher Porter Date: Thu, 3 Sep 2020 17:38:56 -0700 Subject: [PATCH 1/2] raises an IndexError when indexing empty buffer. Closes #13 --- numpy_ringbuffer/__init__.py | 2 ++ tests.py | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/numpy_ringbuffer/__init__.py b/numpy_ringbuffer/__init__.py index 719a29b..1c71ff7 100644 --- a/numpy_ringbuffer/__init__.py +++ b/numpy_ringbuffer/__init__.py @@ -162,6 +162,8 @@ def __len__(self): return self._right_index - self._left_index def __getitem__(self, item): + if len(self) == 0: + raise IndexError("Buffer is empty") # handle simple (b[1]) and basic (b[np.array([1, 2, 3])]) fancy indexing specially if not isinstance(item, tuple): item_arr = np.asarray(item) diff --git a/tests.py b/tests.py index feeb9ae..31fefb4 100644 --- a/tests.py +++ b/tests.py @@ -185,6 +185,13 @@ def test_degenerate(self): except IndexError: self.fail() + def test_raises_error_indexing_empty_buffer(self): + r = RingBuffer(10) + with self.assertRaises(IndexError, + msg="Fails to raise an IndexError when " + "trying to index an empty buffer."): + r[0] + if not hasattr(TestAll, 'assertRaisesRegex'): TestAll.assertRaisesRegex = TestAll.assertRaisesRegexp From 641964015d5e5c432071fc454b6a2788bafa392b Mon Sep 17 00:00:00 2001 From: Fletcher Porter Date: Thu, 3 Sep 2020 17:40:48 -0700 Subject: [PATCH 2/2] Makes it so negative indices go from data end. Closes #14 --- numpy_ringbuffer/__init__.py | 6 +++++- tests.py | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/numpy_ringbuffer/__init__.py b/numpy_ringbuffer/__init__.py index 1c71ff7..d99d80a 100644 --- a/numpy_ringbuffer/__init__.py +++ b/numpy_ringbuffer/__init__.py @@ -168,7 +168,11 @@ def __getitem__(self, item): if not isinstance(item, tuple): item_arr = np.asarray(item) if issubclass(item_arr.dtype.type, np.integer): - item_arr = (item_arr + self._left_index) % self._capacity + if self.is_full: + item_arr = (item_arr + self._left_index) % self._capacity + else: + item_arr = ((item_arr + self._left_index) + % self._right_index) return self._arr[item_arr] # for everything else, get it right at the expense of efficiency diff --git a/tests.py b/tests.py index 31fefb4..a5b5547 100644 --- a/tests.py +++ b/tests.py @@ -192,6 +192,16 @@ def test_raises_error_indexing_empty_buffer(self): "trying to index an empty buffer."): r[0] + def test_negative_indices_give_recent_data_with_unfull_buffer(self): + r = RingBuffer(10) + for i in range(5): + r.append(i) + for i in reversed(range(-len(r), 0)): + self.assertAlmostEqual(r[i], r[i+5], + msg="Fails to index from the back of " + "the filled portion of the buffer " + "given a negative index.") + if not hasattr(TestAll, 'assertRaisesRegex'): TestAll.assertRaisesRegex = TestAll.assertRaisesRegexp