[Bf-blender-cvs] [2b8d778a68b] blender-v3.1-release: Fix T94121: PyAPI: ID property group returns wrong type with iter()

Campbell Barton noreply at git.blender.org
Mon Mar 21 14:06:49 CET 2022


Commit: 2b8d778a68b53d63d8c897d5150951ecaecc6dc8
Author: Campbell Barton
Date:   Fri Mar 11 10:08:25 2022 +1100
Branches: blender-v3.1-release
https://developer.blender.org/rB2b8d778a68b53d63d8c897d5150951ecaecc6dc8

Fix T94121: PyAPI: ID property group returns wrong type with iter()

Regression in 265d97556aa0f0f2a0e4dd7584e3b8573bbddd54.
Where iterating directly on a property group failed, e.g.:
`iter(group)`, tests missed this since only `group.keys()`
was checked.

===================================================================

M	source/blender/python/generic/idprop_py_api.c
M	tests/python/bl_pyapi_idprop.py

===================================================================

diff --git a/source/blender/python/generic/idprop_py_api.c b/source/blender/python/generic/idprop_py_api.c
index 0a870102b6f..a839786cce8 100644
--- a/source/blender/python/generic/idprop_py_api.c
+++ b/source/blender/python/generic/idprop_py_api.c
@@ -770,7 +770,16 @@ static int BPy_IDGroup_Map_SetItem(BPy_IDProperty *self, PyObject *key, PyObject
 
 static PyObject *BPy_IDGroup_iter(BPy_IDProperty *self)
 {
-  return BPy_IDGroup_ViewKeys_CreatePyObject(self);
+  PyObject *iterable = BPy_IDGroup_ViewKeys_CreatePyObject(self);
+  PyObject *ret;
+  if (iterable) {
+    ret = PyObject_GetIter(iterable);
+    Py_DECREF(iterable);
+  }
+  else {
+    ret = NULL;
+  }
+  return ret;
 }
 
 PyObject *BPy_IDGroup_MapDataToPy(IDProperty *prop)
diff --git a/tests/python/bl_pyapi_idprop.py b/tests/python/bl_pyapi_idprop.py
index 4cee39fafb0..e9056137bcf 100644
--- a/tests/python/bl_pyapi_idprop.py
+++ b/tests/python/bl_pyapi_idprop.py
@@ -172,6 +172,14 @@ class TestIdPropertyGroupView(TestHelper, unittest.TestCase):
         self.assertEqual(list(self.id.items()), [(k, v) for v, k in enumerate(text)])
         self.assertEqual(list(reversed(self.id.items())), list(reversed([(k, v) for v, k in enumerate(text)])))
 
+        # Check direct iteration is working as expected.
+        self.id["group"] = {ch: i for i, ch in enumerate(text)}
+        group = self.id["group"]
+
+        self.assertEqual(len(group), len(text))
+        self.assertEqual(list(iter(group)), text)
+
+
     def test_contains(self):
         # Check `idprop.types.IDPropertyGroupView{Keys/Values/Items}.__contains__`
         text = ["A", "B", "C"]



More information about the Bf-blender-cvs mailing list