changeset f1867aedd143 in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset&node=f1867aedd143
description:
        Remove same types restriction on PYSON If

        issue11644
        review419661003
diffstat:

 CHANGELOG                   |   1 +
 trytond/pyson.py            |  19 +++++++------------
 trytond/tests/test_pyson.py |   5 ++---
 3 files changed, 10 insertions(+), 15 deletions(-)

diffs (63 lines):

diff -r 6ef3220ac4e0 -r f1867aedd143 CHANGELOG
--- a/CHANGELOG Thu Sep 08 13:15:54 2022 +0200
+++ b/CHANGELOG Thu Sep 08 13:17:54 2022 +0200
@@ -1,3 +1,4 @@
+* Remove same types restriction on PYSON If
 * Allow PYSON size of fields to be None
 * Add command line completion with argcomplete
 * Include record name and value in validation error message
diff -r 6ef3220ac4e0 -r f1867aedd143 trytond/pyson.py
--- a/trytond/pyson.py  Thu Sep 08 13:15:54 2022 +0200
+++ b/trytond/pyson.py  Thu Sep 08 13:17:54 2022 +0200
@@ -400,16 +400,6 @@
                 condition = Bool(condition)
         elif not isinstance(condition, bool):
             condition = bool(condition)
-        if isinstance(then_statement, PYSON):
-            then_types = then_statement.types()
-        else:
-            then_types = {type(then_statement)}
-        if isinstance(else_statement, PYSON):
-            else_types = else_statement.types()
-        else:
-            else_types = {type(else_statement)}
-        assert then_types == else_types, \
-            'then and else statements must be the same type'
         self._condition = condition
         self._then_statement = then_statement
         self._else_statement = else_statement
@@ -428,9 +418,14 @@
 
     def types(self):
         if isinstance(self._then_statement, PYSON):
-            return self._then_statement.types()
+            types = self._then_statement.types()
         else:
-            return {type(self._then_statement)}
+            types = {type(self._then_statement)}
+        if isinstance(self._else_statement, PYSON):
+            types |= self._else_statement.types()
+        else:
+            types |= {type(self._else_statement)}
+        return types
 
     @staticmethod
     def eval(dct, context):
diff -r 6ef3220ac4e0 -r f1867aedd143 trytond/tests/test_pyson.py
--- a/trytond/tests/test_pyson.py       Thu Sep 08 13:15:54 2022 +0200
+++ b/trytond/tests/test_pyson.py       Thu Sep 08 13:17:54 2022 +0200
@@ -395,12 +395,11 @@
             'e': 'bar',
             })
 
-        if not sys.flags.optimize:
-            self.assertRaises(AssertionError, pyson.If, True, 'foo', False)
-
         self.assertEqual(pyson.If(True, 'foo', 'bar').types(),
             set([str]))
         self.assertEqual(pyson.If(True, False, True).types(), set([bool]))
+        self.assertEqual(
+            pyson.If(True, 'foo', False).types(), set([bool, str]))
 
         eval = pyson.PYSONEncoder().encode(pyson.If(True, 'foo', 'bar'))
         self.assertEqual(pyson.PYSONDecoder().decode(eval), 'foo')

Reply via email to