diff mbox series

[libgpiod,6/9] bindings: python: line_request: ignore invalid line names in reconfigure_lines

Message ID 20251009130516.3729433-7-vfazio@gmail.com
State New
Headers show
Series bindings: python: improve line requests and reconfiguration | expand

Commit Message

Vincent Fazio Oct. 9, 2025, 1:05 p.m. UTC
Previously, calling `reconfigure_lines` with line identifiers that were
not included in the original request produced different behaviors
depending on the identifier type.

If the identifier was an integer, it would be silently ignored.

If the identifier was a string, it would raise a `ValueError`.

To be consistent, invalid line names are now silently ignored.

Signed-off-by: Vincent Fazio <vfazio@gmail.com>
---
 bindings/python/gpiod/line_request.py       | 19 +++++++++++--------
 bindings/python/tests/tests_line_request.py | 13 +++++++++++++
 2 files changed, 24 insertions(+), 8 deletions(-)
diff mbox series

Patch

diff --git a/bindings/python/gpiod/line_request.py b/bindings/python/gpiod/line_request.py
index c0798b5..629df3c 100644
--- a/bindings/python/gpiod/line_request.py
+++ b/bindings/python/gpiod/line_request.py
@@ -94,12 +94,9 @@  class LineRequest:
     def _line_to_offset(self, line: Union[int, str]) -> int:
         if isinstance(line, int):
             return line
-        else:
-            _line: Union[int, None]
-            if (_line := self._name_map.get(line)) is None:
-                raise ValueError(f"unknown line name: {line}")
-            else:
-                return _line
+        if (_line := self._name_map.get(line)) is None:
+            raise ValueError(f"unknown line name: {line}")
+        return _line
 
     def get_values(
         self, lines: Optional[Iterable[Union[int, str]]] = None
@@ -174,8 +171,14 @@  class LineRequest:
         line_settings = {}
 
         for line, settings in config_iter(config):
-            offset = self._line_to_offset(line)
-            line_settings[offset] = settings
+            try:
+                offset = self._line_to_offset(line)
+                line_settings[offset] = settings
+            except ValueError:
+                # _line_to_offset will raise a ValueError when it encounters
+                # an unrecognized line name. Ignore these like we do offsets
+                # that were not in the original request.
+                pass
 
         for offset in self.offsets:
             settings = line_settings.get(offset) or LineSettings()
diff --git a/bindings/python/tests/tests_line_request.py b/bindings/python/tests/tests_line_request.py
index 217c299..66e9e8d 100644
--- a/bindings/python/tests/tests_line_request.py
+++ b/bindings/python/tests/tests_line_request.py
@@ -596,6 +596,19 @@  class ReconfigureRequestedLines(TestCase):
         info = self.chip.get_line_info(2)
         self.assertEqual(info.direction, Direction.INPUT)
 
+    def test_reconfigure_extra_names(self) -> None:
+        info = self.chip.get_line_info(2)
+        self.assertEqual(info.direction, Direction.OUTPUT)
+        self.req.reconfigure_lines(
+            {
+                (0, 2, "foo", "baz", "buzz"): gpiod.LineSettings(
+                    direction=Direction.INPUT
+                )
+            }
+        )
+        info = self.chip.get_line_info(2)
+        self.assertEqual(info.direction, Direction.INPUT)
+
 
 class ReleasedLineRequestCannotBeUsed(TestCase):
     def test_using_released_line_request(self) -> None: