From 1d7a4da9e1a563e800dc6475bc95e1fa58a07473 Mon Sep 17 00:00:00 2001 From: Aarni Koskela Date: Mon, 27 May 2019 11:19:08 +0300 Subject: Add comparison operators to _NormalizedString Based on @hoangduytranuk's original implementation. Fixes #612 --- babel/messages/pofile.py | 33 ++++++++++++++++++++++++++++++-- tests/messages/test_normalized_string.py | 17 ++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 tests/messages/test_normalized_string.py diff --git a/babel/messages/pofile.py b/babel/messages/pofile.py index fe37631..2943fa2 100644 --- a/babel/messages/pofile.py +++ b/babel/messages/pofile.py @@ -16,8 +16,7 @@ import re from babel.messages.catalog import Catalog, Message from babel.util import wraptext -from babel._compat import text_type - +from babel._compat import text_type, cmp def unescape(string): @@ -99,6 +98,36 @@ class _NormalizedString(object): def __nonzero__(self): return bool(self._strs) + __bool__ = __nonzero__ + + def __repr__(self): + return os.linesep.join(self._strs) + + def __cmp__(self, other): + if not other: + return 1 + + return cmp(text_type(self), text_type(other)) + + def __gt__(self, other): + return self.__cmp__(other) > 0 + + def __lt__(self, other): + return self.__cmp__(other) < 0 + + def __ge__(self, other): + return self.__cmp__(other) >= 0 + + def __le__(self, other): + return self.__cmp__(other) <= 0 + + def __eq__(self, other): + return self.__cmp__(other) == 0 + + def __ne__(self, other): + return self.__cmp__(other) != 0 + + class PoFileParser(object): """Support class to read messages from a ``gettext`` PO (portable object) file diff --git a/tests/messages/test_normalized_string.py b/tests/messages/test_normalized_string.py new file mode 100644 index 0000000..9c95672 --- /dev/null +++ b/tests/messages/test_normalized_string.py @@ -0,0 +1,17 @@ +from babel.messages.pofile import _NormalizedString + + +def test_normalized_string(): + ab1 = _NormalizedString('a', 'b ') + ab2 = _NormalizedString('a', ' b') + ac1 = _NormalizedString('a', 'c') + ac2 = _NormalizedString(' a', 'c ') + z = _NormalizedString() + assert ab1 == ab2 and ac1 == ac2 # __eq__ + assert ab1 < ac1 # __lt__ + assert ac1 > ab2 # __gt__ + assert ac1 >= ac2 # __ge__ + assert ab1 <= ab2 # __le__ + assert ab1 != ac1 # __ne__ + assert not z # __nonzero__ / __bool__ + assert sorted([ab1, ab2, ac1]) # the sort order is not stable so we can't really check it, just that we can sort -- cgit v1.2.1