From 2e5ca2328e257f3ebe56943f2c08cbb2c512cd31 Mon Sep 17 00:00:00 2001 From: Kai Morich Date: Fri, 24 Apr 2026 17:47:39 +0200 Subject: [PATCH 1/5] implement Color.__eq__, fix Color.__mul__ this allows testing of color block sorting algorithms with CPython --- src/pybricks/parameters.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pybricks/parameters.py b/src/pybricks/parameters.py index 5b8521d5..191a7432 100644 --- a/src/pybricks/parameters.py +++ b/src/pybricks/parameters.py @@ -119,11 +119,12 @@ def __iter__(self): def __repr__(self): return "Color(h={}, s={}, v={})".format(self.h, self.s, self.v) - def __eq__(self, other: Color) -> bool: ... + def __eq__(self, other: Color) -> bool: + return self.h == other.h and self.s == other.s and self.v == other.v def __mul__(self, scale: float) -> Color: v = max(0, min(self.v * scale, 100)) - return Color(self.h, self.s, int(v), self.name) + return Color(self.h, self.s, int(v)) def __rmul__(self, scale: float) -> Color: return self.__mul__(scale) From 79b11d170a16e29a15a1fd50b31f362c5b530fbe Mon Sep 17 00:00:00 2001 From: Kai Morich Date: Fri, 24 Apr 2026 18:04:31 +0200 Subject: [PATCH 2/5] remove leftover whitespace --- src/pybricks/parameters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pybricks/parameters.py b/src/pybricks/parameters.py index 191a7432..31d65c65 100644 --- a/src/pybricks/parameters.py +++ b/src/pybricks/parameters.py @@ -119,7 +119,7 @@ def __iter__(self): def __repr__(self): return "Color(h={}, s={}, v={})".format(self.h, self.s, self.v) - def __eq__(self, other: Color) -> bool: + def __eq__(self, other: Color) -> bool: return self.h == other.h and self.s == other.s and self.v == other.v def __mul__(self, scale: float) -> Color: From ba5acda8939bc9a8e0c55db70c4820c9f99b6ca7 Mon Sep 17 00:00:00 2001 From: Kai Morich Date: Fri, 24 Apr 2026 21:26:41 +0200 Subject: [PATCH 3/5] implement Color.__lshift__ and immutability --- src/pybricks/parameters.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/pybricks/parameters.py b/src/pybricks/parameters.py index 31d65c65..f513cbef 100644 --- a/src/pybricks/parameters.py +++ b/src/pybricks/parameters.py @@ -112,6 +112,12 @@ def __init__(self, h: Number, s: Number = 100, v: Number = 100): The brightness value. """ + def __setattr__(self, key, value): + if not hasattr(self, key): + super().__setattr__(key, value) + else: # immutable after __init__ + raise AttributeError("Can't modify immutable object attribute: " + key) + def __iter__(self): """Allows unpacking of the Color instance into h, s, and v.""" return iter((self.h, self.s, self.v)) @@ -135,6 +141,11 @@ def __truediv__(self, scale: float) -> Color: def __floordiv__(self, scale: int) -> Color: return self.__mul__(1 / scale) + def __lshift__(self, shift: int) -> Color: + return self.__rshift__(-shift) + + def __rshift__(self, shift: int) -> Color: + return Color((self.h + shift) % 360, self.s, self.v) Color.NONE = Color(0, 0, 0) Color.BLACK = Color(0, 0, 10) From 27bd1d1ff154d7d90dc6575cc66e518fdf1984b4 Mon Sep 17 00:00:00 2001 From: Kai Morich Date: Fri, 24 Apr 2026 21:33:27 +0200 Subject: [PATCH 4/5] lint --- src/pybricks/parameters.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/pybricks/parameters.py b/src/pybricks/parameters.py index f513cbef..3ef23233 100644 --- a/src/pybricks/parameters.py +++ b/src/pybricks/parameters.py @@ -113,10 +113,10 @@ def __init__(self, h: Number, s: Number = 100, v: Number = 100): """ def __setattr__(self, key, value): - if not hasattr(self, key): - super().__setattr__(key, value) - else: # immutable after __init__ - raise AttributeError("Can't modify immutable object attribute: " + key) + if not hasattr(self, key): + super().__setattr__(key, value) + else: # immutable after __init__ + raise AttributeError("Can't modify immutable object attribute: " + key) def __iter__(self): """Allows unpacking of the Color instance into h, s, and v.""" @@ -147,6 +147,7 @@ def __lshift__(self, shift: int) -> Color: def __rshift__(self, shift: int) -> Color: return Color((self.h + shift) % 360, self.s, self.v) + Color.NONE = Color(0, 0, 0) Color.BLACK = Color(0, 0, 10) Color.GRAY = Color(0, 0, 50) From 48eef6f95c26fc9807a1a0820019e014e4b8fab4 Mon Sep 17 00:00:00 2001 From: Kai Morich Date: Sat, 25 Apr 2026 07:55:03 +0200 Subject: [PATCH 5/5] fixed immutability --- src/pybricks/parameters.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/pybricks/parameters.py b/src/pybricks/parameters.py index 3ef23233..ee9ca6da 100644 --- a/src/pybricks/parameters.py +++ b/src/pybricks/parameters.py @@ -113,10 +113,11 @@ def __init__(self, h: Number, s: Number = 100, v: Number = 100): """ def __setattr__(self, key, value): - if not hasattr(self, key): - super().__setattr__(key, value) - else: # immutable after __init__ - raise AttributeError("Can't modify immutable object attribute: " + key) + if key not in ("h", "s", "v"): + raise AttributeError("Can't modify unknown attribute: " + key) + if hasattr(self, key): # immutable after __init__ + raise AttributeError("Can't modify immutable attribute: " + key) + super().__setattr__(key, value) def __iter__(self): """Allows unpacking of the Color instance into h, s, and v."""