diff options
author | Hugo Parente Lima <hugo.pl@gmail.com> | 2011-07-28 16:37:12 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-08 16:54:41 -0300 |
commit | 8d8c4cf308c6e066a4e625ff2a05c11e7b9fba0b (patch) | |
tree | 7267e71f96b4b4ddd915e732e5ad23867a28c571 | |
parent | d912655b5a00f44dc26be4ec6821c5e0aed1ab3c (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.xml | 23 | ||||
-rw-r--r-- | tests/QtScript/qscriptvalue_test.py | 16 |
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() |