From 4b29e1c543b72ca3db6f84c6f9ea6e21bbe9af40 Mon Sep 17 00:00:00 2001
From: lethliel <mstrigl@suse.com>
Date: Wed, 7 Nov 2018 15:03:43 +0100
Subject: [PATCH] add helper functions for python3 support
This functions are used in the whole code and are
mandatory for the python3 support to work. In python2
case nothing is touched.
* cmp_to_key:
converts a cmp= into a key= function
* decode_list:
decodes each element of a list. This is needed if
we have a mixed list with strings and bytes.
* decode_it:
Takes the input and checks if it is not a string.
Then it uses chardet to get the encoding.
---
osc/util/helper.py | 65 +++++++++++++++++++++++++++++++++++++++++++
tests/suite.py | 2 ++
tests/test_helpers.py | 35 +++++++++++++++++++++++
3 files changed, 102 insertions(+)
create mode 100644 osc/util/helper.py
create mode 100644 tests/test_helpers.py
diff --git a/osc/util/helper.py b/osc/util/helper.py
new file mode 100644
index 00000000..2e25b73c
--- /dev/null
+++ b/osc/util/helper.py
@@ -0,0 +1,65 @@
+# Copyright (C) 2018 SUSE Linux. All rights reserved.
+# This program is free software; it may be used, copied, modified
+# and distributed under the terms of the GNU General Public Licence,
+# either version 2, or (at your option) any later version.
+
+
+def cmp_to_key(mycmp):
+ """ Converts a cmp= function into a key= function.
+ """
+
+ class K(object):
+ def __init__(self, obj, *args):
+ self.obj = obj
+
+ def __lt__(self, other):
+ return mycmp(self.obj, other.obj) < 0
+
+ def __gt__(self, other):
+ return mycmp(self.obj, other.obj) > 0
+
+ def __eq__(self, other):
+ return mycmp(self.obj, other.obj) == 0
+
+ def __le__(self, other):
+ return mycmp(self.obj, other.obj) <= 0
+
+ def __ge__(self, other):
+ return mycmp(self.obj, other.obj) >= 0
+
+ def __ne__(self, other):
+ return mycmp(self.obj, other.obj) != 0
+
+ def __hash__(self):
+ raise TypeError('hash not implemented')
+
+ return K
+
+
+def decode_list(ilist):
+ """ Decodes the elements of a list if needed
+ """
+
+ dlist = []
+ for elem in ilist:
+ if not isinstance(elem, str):
+ dlist.append(decode_it(elem))
+ else:
+ dlist.append(elem)
+ return dlist
+
+
+def decode_it(obj):
+ """ Decodes the given object if obj is not a string
+ based on the chardet module if possible
+ """
+
+ if isinstance(obj, str):
+ return obj
+ else:
+ try:
+ import chardet
+ return obj.decode(chardet.detect(obj)['encoding'])
+ except:
+ import locale
+ return obj.decode(locale.getlocale()[1])
diff --git a/tests/suite.py b/tests/suite.py
index 6d94d446..d8fa512b 100644
--- a/tests/suite.py
+++ b/tests/suite.py
@@ -24,6 +24,7 @@
import test_prdiff
import test_conf
import test_results
+import test_helpers
suite = unittest.TestSuite()
suite.addTests(test_addfiles.suite())
@@ -42,6 +43,7 @@
suite.addTests(test_prdiff.suite())
suite.addTests(test_conf.suite())
suite.addTests(test_results.suite())
+suite.addTests(test_helpers.suite())
if have_xmlrunner:
result = xmlrunner.XMLTestRunner(output=os.path.join(os.getcwd(), 'junit-xml-results')).run(suite)
diff --git a/tests/test_helpers.py b/tests/test_helpers.py
new file mode 100644
index 00000000..571b828e
--- /dev/null
+++ b/tests/test_helpers.py
@@ -0,0 +1,35 @@
+import unittest
+from osc.util.helper import decode_it, decode_list
+
+def suite():
+ return unittest.makeSuite(TestResults)
+
+class TestResults(unittest.TestCase):
+ def testDecodeList(self):
+ strlist = ['Test1', 'Test2', 'Test3']
+ mixlist = ['Test1', b'Test2', 'Test3']
+ byteslist = [b'Test1', b'Test2', b'Test3']
+
+ out = decode_list(strlist)
+ self.assertListEqual(out, strlist)
+
+ out = decode_list(mixlist)
+ self.assertListEqual(out, strlist)
+
+ out = decode_list(byteslist)
+ self.assertListEqual(out, strlist)
+
+
+ def testDecodeIt(self):
+ bytes_obj = b'Test the decoding'
+ string_obj = 'Test the decoding'
+
+ out = decode_it(bytes_obj)
+ self.assertEqual(out, string_obj)
+
+ out = decode_it(string_obj)
+ self.assertEqual(out, string_obj)
+
+if __name__ == '__main__':
+ unittest.main()
+