Make 'FormattableColumn' comparable

Implement the '__lt__' magic method, thus providing the minimal set of
rich comparison methods necessary to support sorting. This will allows
users using these formatters for the more basic types (i.e. not dicts)
to sort their output using the standard '--sort-column' option.

Change-Id: I08e1f1bc75fa6452f19dfb9d221c1daec194d58d
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
This commit is contained in:
Stephen Finucane 2021-01-28 11:34:44 +00:00
parent 4f45f9a30e
commit c1c991045c
3 changed files with 27 additions and 0 deletions

View File

@ -26,6 +26,11 @@ class FormattableColumn(object, metaclass=abc.ABCMeta):
self.__class__ == other.__class__ and self._value == other._value
)
def __lt__(self, other):
return (
self.__class__ == other.__class__ and self._value < other._value
)
@abc.abstractmethod
def human_readable(self):
"""Return a basic human readable version of the data."""

View File

@ -33,3 +33,16 @@ class TestColumns(unittest.TestCase):
u"I made this string myself: ['list', 'of', 'values']",
c.human_readable(),
)
def test_sorting(self):
cols = [
FauxColumn('foo'),
FauxColumn('bar'),
FauxColumn('baz'),
FauxColumn('foo'),
]
cols.sort()
self.assertEqual(
['bar', 'baz', 'foo', 'foo'],
[c.machine_readable() for c in cols],
)

View File

@ -0,0 +1,9 @@
---
features:
- |
Instances of ``cliff.columns.FormattableColumn`` are now comparable. This
allows implementations of ``FormattableColumn`` storing primitive data
types or containers with primitive data types to be sorted using the
``--sort-column`` option. Implementations of ``FormattableColumn`` that
store other types of data will still need to implement their own rich
comparison magic methods.