From ab02f7b977e65e7a4d98ea83999b300d682abe70 Mon Sep 17 00:00:00 2001 From: tekktrik <89490472+tekktrik@users.noreply.github.com> Date: Sat, 30 Oct 2021 15:11:50 -0400 Subject: [PATCH 1/7] Updated to use slice notation for __setitem__ --- adafruit_fram.py | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/adafruit_fram.py b/adafruit_fram.py index 41735bd..c0cbd63 100755 --- a/adafruit_fram.py +++ b/adafruit_fram.py @@ -169,9 +169,9 @@ def __setitem__(self, address, value): raise RuntimeError("FRAM currently write protected.") if isinstance(address, int): - if not isinstance(value, (int, bytes, bytearray, list, tuple)): + if not isinstance(value, int): raise ValueError( - "Data must be a single integer, bytes, bytearray, list, or tuple." + "Data must be a single integer for single addresses" ) if not 0 <= address < self._max_size: raise ValueError( @@ -183,7 +183,33 @@ def __setitem__(self, address, value): self._write(address, value, self._wraparound) elif isinstance(address, slice): - raise ValueError("Slicing not available during write operations.") + if not isinstance(value, (bytes, bytearray, list, tuple)): + raise ValueError( + "Data must be a single integer, bytes, bytearray, list, or tuple for multiple addresses" + ) + if (address.start is None) or (address.stop is None): + raise ValueError( + "Boundless slices are not supported" + ) + if (address.start < 0) or (address.stop > self._max_size): + raise ValueError( + "Slice '{0}:{1}' out of range. All addresses must be 0 <= address < {2}.".format( + address.start, address.stop, self._max_size + ) + ) + if len(value) < (len(range(address.start, address.stop, address.step))): + raise ValueError( + "Cannot set values with a list smaller than the number of indexes" + ) + + address_range = range(address.start, address.stop, address.step) + value = [value] * len(address_range) if isinstance(value, int) else value + if (address.step == 1) or address.step is None: + self._write(address.start, value, self._wraparound) + else: + slice_iterable = zip(value, list(address_range)) + for index in slice_iterable: + self._write(index, value, self._wraparound) def _read_address(self, address, read_buffer): # Implemented by subclass From 7bcf182e6edeccc422c20ffe85087fb3c6d7537c Mon Sep 17 00:00:00 2001 From: tekktrik <89490472+tekktrik@users.noreply.github.com> Date: Sat, 30 Oct 2021 15:17:56 -0400 Subject: [PATCH 2/7] Remove the ability to use slice stepping --- adafruit_fram.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/adafruit_fram.py b/adafruit_fram.py index c0cbd63..52b8dd3 100755 --- a/adafruit_fram.py +++ b/adafruit_fram.py @@ -191,25 +191,24 @@ def __setitem__(self, address, value): raise ValueError( "Boundless slices are not supported" ) + if (address.step is not None) and (address.step != 1): + raise ValueError("Slice stepping is not currently available.") if (address.start < 0) or (address.stop > self._max_size): raise ValueError( "Slice '{0}:{1}' out of range. All addresses must be 0 <= address < {2}.".format( address.start, address.stop, self._max_size ) ) - if len(value) < (len(range(address.start, address.stop, address.step))): + if len(value) < (len(range(address.start, address.stop))): raise ValueError( "Cannot set values with a list smaller than the number of indexes" ) - address_range = range(address.start, address.stop, address.step) + address_range = range(address.start, address.stop) value = [value] * len(address_range) if isinstance(value, int) else value - if (address.step == 1) or address.step is None: - self._write(address.start, value, self._wraparound) - else: - slice_iterable = zip(value, list(address_range)) - for index in slice_iterable: - self._write(index, value, self._wraparound) + slice_iterable = zip(value, list(address_range)) + for index in slice_iterable: + self._write(index, value, self._wraparound) def _read_address(self, address, read_buffer): # Implemented by subclass From 0c791550e487c4a5de812bbe45f5efd0e186cfa2 Mon Sep 17 00:00:00 2001 From: tekktrik <89490472+tekktrik@users.noreply.github.com> Date: Sat, 30 Oct 2021 15:19:01 -0400 Subject: [PATCH 3/7] Update code example in docstring --- adafruit_fram.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adafruit_fram.py b/adafruit_fram.py index 52b8dd3..b316b87 100755 --- a/adafruit_fram.py +++ b/adafruit_fram.py @@ -163,7 +163,7 @@ def __setitem__(self, address, value): fram[0] = 1 # write values 0 thru 4 with a list - fram[0] = [0,1,2,3] + fram[0:4] = [0,1,2,3] """ if self.write_protected: raise RuntimeError("FRAM currently write protected.") From 27f9df3d468ec5e8d6263b88b55ca2059856dd2d Mon Sep 17 00:00:00 2001 From: tekktrik <89490472+tekktrik@users.noreply.github.com> Date: Sat, 30 Oct 2021 15:22:25 -0400 Subject: [PATCH 4/7] Reformatting per pre-commit --- adafruit_fram.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/adafruit_fram.py b/adafruit_fram.py index b316b87..cde949a 100755 --- a/adafruit_fram.py +++ b/adafruit_fram.py @@ -170,9 +170,7 @@ def __setitem__(self, address, value): if isinstance(address, int): if not isinstance(value, int): - raise ValueError( - "Data must be a single integer for single addresses" - ) + raise ValueError("Data must be a single integer for single addresses") if not 0 <= address < self._max_size: raise ValueError( "Address '{0}' out of range. It must be 0 <= address < {1}.".format( @@ -185,17 +183,16 @@ def __setitem__(self, address, value): elif isinstance(address, slice): if not isinstance(value, (bytes, bytearray, list, tuple)): raise ValueError( - "Data must be a single integer, bytes, bytearray, list, or tuple for multiple addresses" + "Data must be a single integer, bytes, bytearray, list, \ + or tuple for multiple addresses" ) if (address.start is None) or (address.stop is None): - raise ValueError( - "Boundless slices are not supported" - ) + raise ValueError("Boundless slices are not supported") if (address.step is not None) and (address.step != 1): raise ValueError("Slice stepping is not currently available.") if (address.start < 0) or (address.stop > self._max_size): raise ValueError( - "Slice '{0}:{1}' out of range. All addresses must be 0 <= address < {2}.".format( + "Slice '{0}:{1}' out of range. All addresses must be 0 <= address < {2}.".format( # pylint: disable=line-too-long address.start, address.stop, self._max_size ) ) From 2656d7ae1fdd4451ba3c6caa6bd018242d329881 Mon Sep 17 00:00:00 2001 From: tekktrik <89490472+tekktrik@users.noreply.github.com> Date: Tue, 30 Nov 2021 15:42:12 -0500 Subject: [PATCH 5/7] Corrected ValueError text formatting --- adafruit_fram.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/adafruit_fram.py b/adafruit_fram.py index cde949a..4b50e55 100755 --- a/adafruit_fram.py +++ b/adafruit_fram.py @@ -183,8 +183,8 @@ def __setitem__(self, address, value): elif isinstance(address, slice): if not isinstance(value, (bytes, bytearray, list, tuple)): raise ValueError( - "Data must be a single integer, bytes, bytearray, list, \ - or tuple for multiple addresses" + "Data must be bytes, bytearray, list, " \ + "or tuple for multiple addresses" ) if (address.start is None) or (address.stop is None): raise ValueError("Boundless slices are not supported") From dc146721a98a59fbd4a30a9b818779e05f580ef0 Mon Sep 17 00:00:00 2001 From: tekktrik <89490472+tekktrik@users.noreply.github.com> Date: Tue, 30 Nov 2021 15:42:24 -0500 Subject: [PATCH 6/7] Fix writing of slice to FRAM --- adafruit_fram.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/adafruit_fram.py b/adafruit_fram.py index 4b50e55..7cc20cd 100755 --- a/adafruit_fram.py +++ b/adafruit_fram.py @@ -201,11 +201,8 @@ def __setitem__(self, address, value): "Cannot set values with a list smaller than the number of indexes" ) - address_range = range(address.start, address.stop) - value = [value] * len(address_range) if isinstance(value, int) else value - slice_iterable = zip(value, list(address_range)) - for index in slice_iterable: - self._write(index, value, self._wraparound) + self._write(address.start, value, self._wraparound) + def _read_address(self, address, read_buffer): # Implemented by subclass From ae0264ff7438a86225344156a9933007b2398809 Mon Sep 17 00:00:00 2001 From: tekktrik <89490472+tekktrik@users.noreply.github.com> Date: Tue, 30 Nov 2021 15:43:51 -0500 Subject: [PATCH 7/7] Reformatted per pre-commit --- adafruit_fram.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/adafruit_fram.py b/adafruit_fram.py index 7cc20cd..da89763 100755 --- a/adafruit_fram.py +++ b/adafruit_fram.py @@ -183,8 +183,8 @@ def __setitem__(self, address, value): elif isinstance(address, slice): if not isinstance(value, (bytes, bytearray, list, tuple)): raise ValueError( - "Data must be bytes, bytearray, list, " \ - "or tuple for multiple addresses" + "Data must be bytes, bytearray, list, " + "or tuple for multiple addresses" ) if (address.start is None) or (address.stop is None): raise ValueError("Boundless slices are not supported") @@ -203,7 +203,6 @@ def __setitem__(self, address, value): self._write(address.start, value, self._wraparound) - def _read_address(self, address, read_buffer): # Implemented by subclass raise NotImplementedError