bindings: python: fix __repr__() implementations
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Tue, 30 Jan 2024 15:04:48 +0000 (16:04 +0100)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Mon, 5 Feb 2024 08:49:10 +0000 (09:49 +0100)
The __repr__() function should - if possible - return a valid Python
expression that can be used to instantiate a new object when evaluated.

LineSettings.__repr__() is missing comas between arguments. Both Chip and
LineSettings also don't prefix the returned string with 'gpiod.'. Fix
both functions and add more test cases - including actually using the
strings returned by __repr__() to create new objects and compare their
contents.

Reported-by: Robert Thomas <rob.thomas@raspberrypi.com>
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
bindings/python/gpiod/chip.py
bindings/python/gpiod/line_settings.py
bindings/python/tests/tests_chip.py
bindings/python/tests/tests_line_settings.py

index b3d8e6143bfff68d9568a8c43320afc8837bbe4e..19c62cdae0243725e1ad99757db1cacf598a0aeb 100644 (file)
@@ -333,7 +333,7 @@ class Chip:
         if not self._chip:
             return "<Chip CLOSED>"
 
-        return 'Chip("{}")'.format(self.path)
+        return 'gpiod.Chip("{}")'.format(self.path)
 
     def __str__(self) -> str:
         """
index 458fd8163f04c9a461f8522be284bf404b55bc18..41712cc0b372ad765cd114127b717d35cfed3556 100644 (file)
@@ -27,7 +27,7 @@ class LineSettings:
     # __repr__ generated by @dataclass uses repr for enum members resulting in
     # an unusable representation as those are of the form: <NAME: $value>
     def __repr__(self):
-        return "LineSettings(direction={}, edge_detection={} bias={} drive={} active_low={} debounce_period={} event_clock={} output_value={})".format(
+        return "gpiod.LineSettings(direction={}, edge_detection={}, bias={}, drive={}, active_low={}, debounce_period={}, event_clock={}, output_value={})".format(
             str(self.direction),
             str(self.edge_detection),
             str(self.bias),
index 8db4cdb72fdccfaef5b704b5032715e7b6b21751..bd4ae34cd618a972417e314b36ed527675627fbc 100644 (file)
@@ -202,7 +202,10 @@ class StringRepresentation(TestCase):
         self.sim = None
 
     def test_repr(self):
-        self.assertEqual(repr(self.chip), 'Chip("{}")'.format(self.sim.dev_path))
+        self.assertEqual(repr(self.chip), 'gpiod.Chip("{}")'.format(self.sim.dev_path))
+
+        cmp = eval(repr(self.chip))
+        self.assertEqual(self.chip.path, cmp.path)
 
     def test_str(self):
         info = self.chip.get_info()
index 36dda6dcbef0e195079a7eda1a68a8adade26b55..c6ca7200bc08e90a7ee8bb9bae4550220b99c1e9 100644 (file)
@@ -1,10 +1,10 @@
 # SPDX-License-Identifier: LGPL-2.1-or-later
 # SPDX-FileCopyrightText: 2022 Bartosz Golaszewski <brgl@bgdev.pl>
 
+import datetime
 import gpiod
 
 from . import gpiosim
-from datetime import timedelta
 from gpiod.line import Direction, Edge, Bias, Drive, Value, Clock
 from unittest import TestCase
 
@@ -47,7 +47,7 @@ class LineSettingsAttributes(TestCase):
         settings.direction = Direction.INPUT
         settings.edge_detection = Edge.BOTH
         settings.bias = Bias.DISABLED
-        settings.debounce_period = timedelta(microseconds=3000)
+        settings.debounce_period = datetime.timedelta(microseconds=3000)
         settings.event_clock = Clock.HTE
 
         self.assertEqual(settings.direction, Direction.INPUT)
@@ -69,9 +69,12 @@ class LineSettingsStringRepresentation(TestCase):
     def test_repr(self):
         self.assertEqual(
             repr(self.settings),
-            "LineSettings(direction=Direction.OUTPUT, edge_detection=Edge.NONE bias=Bias.AS_IS drive=Drive.OPEN_SOURCE active_low=True debounce_period=datetime.timedelta(0) event_clock=Clock.MONOTONIC output_value=Value.INACTIVE)",
+            "gpiod.LineSettings(direction=Direction.OUTPUT, edge_detection=Edge.NONE, bias=Bias.AS_IS, drive=Drive.OPEN_SOURCE, active_low=True, debounce_period=datetime.timedelta(0), event_clock=Clock.MONOTONIC, output_value=Value.INACTIVE)",
         )
 
+        cmp = eval(repr(self.settings))
+        self.assertEqual(self.settings, cmp)
+
     def test_str(self):
         self.assertEqual(
             str(self.settings),