aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHugo Parente Lima <hugo.pl@gmail.com>2011-07-28 16:37:12 -0300
committerHugo Parente Lima <hugo.pl@gmail.com>2012-03-08 16:54:41 -0300
commit8d8c4cf308c6e066a4e625ff2a05c11e7b9fba0b (patch)
tree7267e71f96b4b4ddd915e732e5ad23867a28c571
parentd912655b5a00f44dc26be4ec6821c5e0aed1ab3c (diff)
Fix bug 923 - "Make QScriptValue (or QScriptValueIterator) implement the Python iterator protocol"
Reviewer: Marcelo Lira <marcelo.lira@openbossa.org> Luciano Wolf <luciano.wolf@openbossa.org>
-rw-r--r--PySide/QtScript/typesystem_script.xml23
-rw-r--r--tests/QtScript/qscriptvalue_test.py16
2 files changed, 37 insertions, 2 deletions
diff --git a/PySide/QtScript/typesystem_script.xml b/PySide/QtScript/typesystem_script.xml
index 738c44bda..05afba262 100644
--- a/PySide/QtScript/typesystem_script.xml
+++ b/PySide/QtScript/typesystem_script.xml
@@ -72,7 +72,28 @@
}
</inject-code>
</add-function>
+ <add-function signature="__iter__()" return-type="PyObject*">
+ <inject-code>
+ %PYARG_0 = Shiboken::createWrapper(new QScriptValueIterator(*%CPPSELF), true, true);
+ </inject-code>
+ </add-function>
</value-type>
- <object-type name="QScriptValueIterator"/>
+ <object-type name="QScriptValueIterator">
+ <add-function signature="__iter__()" return-type="PyObject*">
+ <inject-code>
+ <insert-template name="__iter__" />
+ </inject-code>
+ </add-function>
+ <add-function signature="__next__()" return-type="PyObject*">
+ <inject-code>
+ if (%CPPSELF.hasNext()) {
+ %CPPSELF.next();
+ %PYARG_0 = Shiboken::makeTuple(%CPPSELF.name(), %CPPSELF.value().toVariant());
+ } else {
+ PyErr_SetNone(PyExc_StopIteration);
+ }
+ </inject-code>
+ </add-function>
+ </object-type>
</typesystem>
diff --git a/tests/QtScript/qscriptvalue_test.py b/tests/QtScript/qscriptvalue_test.py
index d029bf9fc..e5b6a637f 100644
--- a/tests/QtScript/qscriptvalue_test.py
+++ b/tests/QtScript/qscriptvalue_test.py
@@ -1,6 +1,6 @@
import unittest
import PySide
-from PySide.QtScript import QScriptEngine, QScriptValue
+from PySide.QtScript import *
from helper import UsesQApplication
@@ -19,6 +19,20 @@ class TestQScriptValue (UsesQApplication):
value = QScriptValue("somePerson = { firstName: 'John', lastName: 'Doe' }")
value2 = eval(repr(value))
self.assertEqual(value.toString(), value2.toString())
+ self.assertEqual(value.toVariant(), value2.toVariant())
+
+ def testIteratorProtocol(self):
+ engine = QScriptEngine()
+ value = engine.evaluate('x = {"a": 1, "b":2}')
+ d = {}
+ for k, v in QScriptValueIterator(value):
+ d[k] = v
+ self.assertEqual(d, {'a': 1, 'b': 2})
+
+ d = {}
+ for k, v in value:
+ d[k] = v
+ self.assertEqual(d, {'a': 1, 'b': 2})
if __name__ == '__main__':
unittest.main()