PyEnum: make forgiving duplicates work with Python 3.11
authorChristian Tismer <tismer@stackless.com>
Tue, 21 Jun 2022 08:22:04 +0000 (10:22 +0200)
committerGraham Inggs <ginggs@debian.org>
Sat, 25 Jan 2025 16:33:38 +0000 (16:33 +0000)
There was a silent change in PyEnums that turns Enum attributes
into properties. This does not harm the Python interface but
needed some change in the duplication emulation.

Furthermore, new internal enums are created with an underscore name.

The meta class was changed from EnumMeta to EnumType.

[ChangeLog][shiboken6] The new Python Enums are now compatible with Python 3.11

Change-Id: I3b1ab63dc5eed15a75ebd0f42dddf4001f640c00
Pick-to: 6.3
Task-number: PYSIDE-1735
Fixes: PYSIDE-1960
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
(cherry picked from commit da2cf031521815a9559ca784beadb70c7a2852d9)

Gbp-Pq: Name PyEnum-make-forgiving-duplicates-work-with-Python-3.11.patch

sources/pyside2/tests/QtCore/qenum_test.py
sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/lib/enum_sig.py

index f99a893d97ea84154bd8f83884ecfe8e8e52a815..0981c26c8e1d400a028011c8f038e176a328d1d9 100644 (file)
@@ -197,14 +197,16 @@ class SomeClass(QObject):
 
 @unittest.skipUnless(HAVE_ENUM, "requires 'enum' module (use 'pip install enum34' for Python 2)")
 class TestQEnumMacro(unittest.TestCase):
+    meta_name = "EnumType" if sys.version_info[:2] >= (3, 11) else "EnumMeta"
+
     def testTopLevel(self):
         self.assertEqual(type(OuterEnum).__module__, "enum")
-        self.assertEqual(type(OuterEnum).__name__, "EnumMeta")
+        self.assertEqual(type(OuterEnum).__name__, self.meta_name)
         self.assertEqual(len(OuterEnum.__members__), 2)
 
     def testSomeClass(self):
         self.assertEqual(type(SomeClass.SomeEnum).__module__, "enum")
-        self.assertEqual(type(SomeClass.SomeEnum).__name__, "EnumMeta")
+        self.assertEqual(type(SomeClass.SomeEnum).__name__, self.meta_name)
         self.assertEqual(len(SomeClass.SomeEnum.__members__), 3)
         with self.assertRaises(TypeError):
             int(SomeClass.SomeEnum.C) == 6
index 088a93aa42e8ddbbc9d65d5d29ba82ce9fce4faf..2f78718d8ebc9b3fa4404656aa3d7258aca64593 100644 (file)
@@ -139,7 +139,8 @@ class ExactEnumerator(object):
                     functions.append((func_name, thing))
             elif type(type(thing)) is EnumMeta:
                 # take the real enum name, not what is in the dict
-                enums.append((thing_name, type(thing).__qualname__, thing))
+                if not thing_name.startswith("_"):
+                    enums.append((thing_name, type(thing).__qualname__, thing))
         init_signature = getattr(klass, "__signature__", None)
         enums.sort(key=lambda tup: tup[1 : 3])  # sort by class then enum value
         self.fmt.have_body = bool(subclasses or functions or enums or init_signature)