aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside2/PySide2
Commit message (Collapse)AuthorAgeFilesLines
* Adapt Licenses to Python 3.7.0Christian Tismer2018-07-097-5619/+44
| | | | | | | | | | | Certain Python files were no longer used when moved to Python 3.7.0 . To finish that, these files are now also removed from the source. As a consequence, qt-attribution files needed to be changed. I took the chance to also update the license files to the new version. Change-Id: If058d1013f1d8cb937ee0305a5eb21ae2ebdd4e0 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
* Fix Limited API and Signature Glitches in Python 3.7Christian Tismer2018-07-093-6/+5
| | | | | | | | | | | | | | | | | When the homebrew version of Python 3.7 appeared so unforeseen early, I felt inclined to fix these glitches, immediately: In Python 3.7, the typing module was more changed than expected. Since we don't support versions below 3.5, it was easy to fix by avoiding to copy typing.py for version 3.x, altogether. It stays there for Python 2.7 . Furthermore, the Python issue 33738 will later be solved than the code expected, so I fixed that one for all by a macro definition. Task-number: PYSIDE-741 Change-Id: Ia56ccd1ef20cb9536b1d39f190e011e5dccf1f22 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
* Add missing ownership handling for QtChartsCristian Maureira-Fredes2018-07-061-5/+136
| | | | | | | | | | | | | Many classes have special methods that need to properly handle ownership of different charts, series, etc, but they were not properly handled. Now all the cases are covered, so one can easily port any QtCharts/C++ example to PySide. Task-number: PYSIDE-738 Change-Id: I5db94c4362ac1f5bf2e563ff99aa62662a30c176 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
* Implement proper slice assignment for QByteArrayBoxiang Sun2018-07-022-0/+164
| | | | | | | | | | | | | | | | | | | Index assignment now only accept str/bytes, bytearray, QByteArray with size 1; Slice assignment only accept str/bytes, bytearray, QByteArray with limitation, that is if the step is not 1, then the number slots and the size of the target value must be equal. Range delete: a[2:5] = None Shrink: value length smaller than the slot length of the slice Expanse: value length bigger than the slot length of the slice Range assignment with step: a[2:5:1] = ... Range assignment with step which bigger than 1: a[2:9:2] = ... Range assignment with native step: a[5:2:-1] Change-Id: Ib9b929d09a691ed18c91e0c1c6b5dde827bf8d42 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Christian Tismer <tismer@stackless.com>
* Change deprecated header qtest_global.hCristian Maureira-Fredes2018-07-021-1/+1
| | | | | | | | The proper header is QtTest/qttestglobal.h Change-Id: Ifaa57bbca39552fbaa87e317989f0e49a4442dd1 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
* Implement proper convert from QString to PyUnicodeObjectBoxiang Sun2018-06-291-5/+2
| | | | | | Task-number: PYSIDE-336 Change-Id: Ie7d955b3b4d35e24a9eac5e7958ce2077370a34b Reviewed-by: Christian Tismer <tismer@stackless.com>
* Fix QVariant conversions when using PySequencesCristian Maureira-Fredes2018-06-211-10/+34
| | | | | | | | | | | | | | | | | | | | | | | | | | | Currently we transform QVariant arguments to internal types, starting from the Python ones, to others related to shiboken. After checking if the current object is a PyDict we proceed to check if it's a PySequence. PySequence is the complementary 'sequence-like' type of PyDict, and allows finite and infinite sequences, like lists or generators. The problem is that when one implements a class which includes the __getitem__ method, Python already thinks that it correspond to a PySequence, then we try to get the elements to transform into a QList<QVariant> but it fails at the first attempt. The solution was to not assume that all PySequences have finite length (or a length), and also to have a fallback case similarly to the PyDict treatment, wrapping the PyObject as a QVariant. Task-number: PYSIDE-641 Change-Id: I3b755f47ed076147024de38e5e0a86932d981f88 Reviewed-by: Christian Tismer <tismer@stackless.com>
* Fix failing versioninfo_test when the version is not a pre-release oneAlexandru Croitor2018-06-082-2/+2
| | | | | | | | | | | | The test used to fail when pre-release version parts are empty (aka there is no "beta1" or "alpha2"). Make sure to always include at least an empty string when those version parts are not set, and adjust the test accordintly to check for a string. Change-Id: Ia30bb99de7f122456e132516346df4e3c0a1fa94 Reviewed-by: Christian Tismer <tismer@stackless.com>
* Merge branch '5.9' into 5.11Alexandru Croitor2018-06-083-2/+79
|\ | | | | | | Change-Id: I7e55b4f27f77e2333b9e0f4cddc8de4b89b6043b
| * Add bindings for QtWebEngine (aka Quick)Alexandru Croitor2018-06-072-0/+77
| | | | | | | | | | | | | | | | | | | | | | There is only one method we really need, QtWebEngine::initialize() which is used for all Qt Quick based WebEngine applications. Otherwise you get a warning upon startup of a Qt Quick WebEngine application, and this might lead to undefined behavior. Task-number: PYSIDE-688 Change-Id: I7de2bbb58c49cb2a41b0e13ffc9de6a3161f3960 Reviewed-by: Christian Tismer <tismer@stackless.com>
| * Fix openssl lib path not being properly set on WindowsAlexandru Croitor2018-06-071-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | This lead to failure of importing PySide2, because on Windows __init__.py tried to load QtNetwork and that failed because it could't find the ssl libraries. This is a regression and amend of 87e85c460 . Task-number: PYSIDE-687 Change-Id: I298153b054baf5fa85b1831d88a99480c5c0a249 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io> Reviewed-by: Christian Tismer <tismer@stackless.com>
* | Merge branch '5.9' into 5.11Alexandru Croitor2018-06-073-33/+120
|\| | | | | | | Change-Id: I2de0fe8456fca242c56ea28520126f9ebbf540d8
| * Fix addImageProvider ownership transferCristian Maureira-Fredes2018-06-071-0/+5
| | | | | | | | | | | | | | The QQmlEngine takes ownership of the QQmlImageProviderBase. Change-Id: Ia01e4151054623c96c24a2d07009d876eaacaa55 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
| * Improve the QByteArray implementationBoxiang Sun2018-06-012-33/+115
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The available constructors for QByteArray are now: bytes, bytearray, and QByteArray, unicode is not accepted anymore. Also the concatenation is now possible between QByteArrays. Even though is not possible to initialize a QByteArray with an unicode, we include the possibility to compare it with one (Compatibility with PyQt). The __repr__ and __str__ are now properly working. There seemed to be a confusion regarding data types between Shiboken, Python2 and Python3 related to bytes, so now the structure is based on the flag SBK_BYTES_NAME, which is define as "bytes" for Python3 and "str" for Python2. Many tests were modified to properly handle string, using the `py3kcompat` module. Task-number: PYSIDE-232 Change-Id: I8b671f367c60a0870c72dcbe5662106b3225037d Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
* | Merge remote-tracking branch 'origin/5.9' into 5.11Friedemann Kleint2018-06-0119-179/+168
|\| | | | | | | Change-Id: I31a0ff26bc02e6cc2ec2a816c16d170fc334f800
| * Add missing API of QtWebEngineWidgetsDavid Rosca2018-06-012-10/+21
| | | | | | | | | | | | Change-Id: Ifafae9a5eac1844bf9057bc5e1f912e287499aa7 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
| * PEP 384-squash: Implement PEP 384Christian Tismer2018-05-3017-169/+147
| | | | | | | | | | | | | | | | | | | | This is the condensed checkin of 18 commits which created the implementation of PEP 384. Task-number: PYSIDE-560 Change-Id: I834c659af4c2b55b268f8e8dc4cfa53f02502409 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
* | Merge remote-tracking branch 'origin/5.9' into 5.11Friedemann Kleint2018-05-264-2/+177
|\| | | | | | | Change-Id: I0c5b60263ed642a9b6f6b5d6a1492a11f278bfd5
| * Add QtScxmlFriedemann Kleint2018-05-242-0/+131
| | | | | | | | | | | | | | Task-number: PYSIDE-487 Change-Id: Ib8eb4a77f04ddbbe2c4b164b95f49e2f53bf44d9 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io> Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
| * Use SPDX name / ID for python licenseKai Koehne2018-05-222-2/+46
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is the standard name of the license. See also https://spdx.org/licenses/Python-2.0.html Note that there's some deviation in the actual license text: The text refers to the exact Python version. Also, the SPDX standardized license contains additional text for some modules. Still, it's better to use the standardized name than inventing our own one. Change-Id: I64b20bc558928ca28edaf81925a049fcaeb124b6 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
* | Merge remote-tracking branch 'origin/5.9' into 5.11Friedemann Kleint2018-05-189-37/+188
|\| | | | | | | Change-Id: I20cf741f5b07426ad5113eb8c52f144102c331ce
| * Add more QtMultimedia classesFriedemann Kleint2018-05-162-0/+38
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Add QCameraFeedbackControl, QMediaService, QMediaServiceCameraInfoInterface, QMediaServiceDefaultDeviceInterface, QMediaServiceFeaturesInterface, QMediaServiceProviderHint, QMediaServiceSupportedDevicesInterface, QMediaServiceSupportedFormatsInterface, QMediaTimeInterval, QMediaVideoProbeControl, QMetaDataReaderControl and QMetaDataWriterControl. Add commented out classes QCameraFlashControl and QCameraFocusControl with explanatory comment. Task-number: PYSIDE-487 Change-Id: I4125ee2088bde487c36c3c13dd7b05d6667b0711 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
| * Fix building PySide2 with ninjaAlexandru Croitor2018-05-161-1/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When building PySide2 with the ninja generator, ninja prints an error: "ninja: error: build.ninja:18549: multiple rules generate ./sources/pyside2/pyside_version.py [-w dupbuild=err]" This seems like an interaction error between CMake and ninja, where file dependency paths are not canonicalized. In our case this happens due to usage of pyside_version.py's relative path. Fix is to use an absolute path. Task-number: PYSIDE-663 Change-Id: Iee2ae5ea483e59ee67e53e3a2059108bf8a34fbe Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
| * QtGui: Remove duplicate entry for QAccessible, take 2Friedemann Kleint2018-05-151-12/+3
| | | | | | | | | | | | | | | | | | Join the remaining entries. Amends e8291778cd1bab2679033cecf3f756bb2d2935ab. Change-Id: I5bb0b129fc92158a16470fcab1826f7a6ea02203 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io> Reviewed-by: Christian Tismer <tismer@stackless.com>
| * Add default parameter to Q*ApplicationsCristian Maureira-Fredes2018-05-153-0/+24
| | | | | | | | | | | | | | | | | | | | | | When no arguments are passed, build an empty list and to start a QCoreApplication, QApplication and QGuiApplication. This is a small effort to include the idea of a default parameter from Python. Change-Id: Ieedc1e7ee17de996778aa2d0bddfb88c5ef208cf Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
| * Add QProxyStyleFriedemann Kleint2018-05-142-0/+8
| | | | | | | | | | | | Task-number: PYSIDE-487 Change-Id: Ib862be9c0c62be09a34c3a79740d147b9788cb34 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
| * QtGui: Remove duplicate entry for QAccessibleFriedemann Kleint2018-05-141-1/+0
| | | | | | | | | | | | | | Amends e8291778cd1bab2679033cecf3f756bb2d2935ab. Change-Id: I6aa0b153575cb1eac1912e5e1970d71a0a388501 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
| * Add more QtWidget classesFriedemann Kleint2018-05-142-0/+15
| | | | | | | | | | | | | | | | Add QScroller, QScrollerProperties, QAccessibleWidget Task-number: PYSIDE-487 Change-Id: Ia0322715bd494c5f4102ed1180eb92eb49b441f7 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
| * Add more QtGui classesFriedemann Kleint2018-05-112-3/+61
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Add QAccessible, acccessibility events and interfaces. Fix the polymorphic-id-expression of the acccessibility events; they no longer inherit QEvent in Qt 5. Add QInputMethod, QInputMethodQueryEvent, QNativeGestureEvent, QScrollEvent, QScrollPrepareEvent, QOpenGLTextureBlitter and QPointingDeviceUniqueId. Task-number: PYSIDE-487 Change-Id: I609ece08cbab78d2fe75eaf6cb0b10531aac9b25 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io> Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
| * Add more QtCore classesFriedemann Kleint2018-05-112-0/+14
| | | | | | | | | | | | | | | | | | Add QIdentityProxyModel, QLockFile, QMessageAuthenticationCode, OperatingSystemVersion and QSignalBlocker. Task-number: PYSIDE-487 Change-Id: I680c3d175394e9d560152a38195d015fc6abb7fa Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
| * Fix QSocketNotifier constructorCristian Maureira-Fredes2018-05-091-21/+21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | The first argument was modified to be a socket type, but it needs to be an int (file descriptor). Adding a new signature solves the compatibility problem between Python2 and 3. A test case was added. Task-number: PYSIDE-629 Change-Id: Id9dea37459350dfc90d0f0ab9e2e1993d03fe6e4 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: Christian Tismer <tismer@stackless.com>
* | Merge remote-tracking branch 'origin/5.9' into 5.11Friedemann Kleint2018-05-093-2/+54
|\| | | | | | | Change-Id: Ic7aa7796dffda87ef492a99af7859c909ec607a2
| * Add more bindings for QtNetworkFriedemann Kleint2018-05-092-0/+51
| | | | | | | | | | | | | | Task-number: PYSIDE-487 Change-Id: Id9a06b83173b9a8880a256fb45e8d85fb1978d65 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
| * Use PyLong instead of PyInt for QVariantCristian Maureira-Fredes2018-05-041-2/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Python 3 uses PyLong for integer manipulation, and since it is a valid type in Python 2 we can use it instead to have better compatibility, and avoid integer overflows. We keep the PyInt entry to avoid breaking other sections of the code when this type is required. Added a couple of PyInt_* alias to use PyLong_* ones instead. Task-number: PYSIDE-648 Change-Id: Id6af66050c5ab81fc51c1c07b1c9422a954b81c0 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: Christian Tismer <tismer@stackless.com>
* | Merge remote-tracking branch 'origin/5.9' into 5.11Friedemann Kleint2018-05-0393-110/+192
|\| | | | | | | Change-Id: I15e8a6120c249bfc5a0e2b3fa262989fafccbf57
| * Change license from all the filesCristian Maureira-Fredes2018-05-0393-93/+93
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Removing the word 'project' from all the headers, and changing the PySide reference from the examples to Qt for Python: The following line was used inside the source/ and build_scripts/ directory: for i in $(grep -r "the Qt for Python project" * |grep -v "pyside2-tools" | awk '{print $1}' | sed 's/:.*//g');do sed -i 's/the\ Qt\ for\ Python\ project/Qt\ for\ Python/g' $i;done and the following line was used inside the examples/ directory: for i in $(grep -r "of the PySide" * |grep -v "pyside2-tools" | awk '{print $1}' | sed 's/:.*//g');do sed -i 's/of\ the\ PySide/of\ the\ Qt\ for\ Python/g' $i;done Change-Id: Ic480714686ad62ac4d81c670f87f1c2033d4ffa1 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
| * Re-add QShortcutEvent removed methodsAlexandru Croitor2018-05-021-5/+0
| | | | | | | | | | | | | | | | They seem to work, no need to reject them. Task-number: PYSIDE-655 Change-Id: I20e5a0ddd03392bacac8875158159d84bf16cdb9 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
| * Avoid set parent for QLabel.pixmap()Cristian Maureira-Fredes2018-05-011-1/+8
| | | | | | | | | | | | | | | | | | | | | | | | Setting owner as default to not allow Python to create a copy of the QPixmap associated with the QLabel. The C++ object pointer is acquired through the pixmap() method. A test case was included. Task-number: PYSIDE-150 Change-Id: Ie6975c39cbf49a59ebd478db0e1a0c30fc14864a Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
| * Implement Python slicing support for QByteArrayBoxiang Sun2018-04-302-11/+90
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | PySide2 for Python 3 didn't support get item by slice, e.g. ``` >>> from PySide2.QtCore import QByteArray >>> ba = QByteArray('1234567890') >>> ba[2:4] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: sequence index must be integer, not 'slice' ``` This is because get item by slice is supported by mp_subscript. But current PySide2 doesn't implemented it. So I added __mgetitem__ in QByteArray. And we also need to keep __getitem__ to support iterate over QByteArray. Also removed the __getslice__ from QByteArray. Task-number: PYSIDE-567 Change-Id: I01f79cc2ab8700da92155cfad96be2e98bb8b331 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
| * Rename PySide references to Qt for PythonCristian Maureira-Fredes2018-04-2792-92/+92
| | | | | | | | | | | | | | | | | | When referring to the project one should use "Qt for Python" and for the module "PySide2" Change-Id: I36497df245c9f6dd60d6e160e2fc805e48cefcae Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
| * Remove currentThreadId bindingCristian Maureira-Fredes2018-04-271-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | Since this method should not be used in any application code, we should remove it from PySide2. Removing also the test registry. https://doc.qt.io/qt-5/qthread.html#currentThreadId Task-number: PYSIDE-275 Change-Id: I152b36ccfa4342d4d6b916d8b2fe228e4fe4a1c4 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
| * Add missing flag for QChartViewCristian Maureira-Fredes2018-04-261-1/+1
| | | | | | | | | | | | Task-number: PYSIDE-645 Change-Id: I4f18e1ede50a68767772eb02e55ff4e1fd718636 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
* | Merge remote-tracking branch 'origin/5.9' into 5.11Friedemann Kleint2018-04-2632-478/+1196
|\| | | | | | | Change-Id: Id40dab17b02800199f70072115d7473041f683d8
| * Add QtPositioning and QtLocationFriedemann Kleint2018-04-244-0/+327
| | | | | | | | | | | | Task-number: PYSIDE-487 Change-Id: Ie44d8472beb3f1a5ab75caafd1f58b512b53ccb1 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
| * QWebEngineDownloadItem: Add enum SavePageFormatFriedemann Kleint2018-04-201-0/+1
| | | | | | | | | | | | Task-number: PYSIDE-487 Change-Id: Ia4b57f4cdc48741ed7659018a742bbda3824c188 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
| * Add QtSensorsFriedemann Kleint2018-04-202-0/+233
| | | | | | | | | | | | Task-number: PYSIDE-487 Change-Id: Id60f3f6e70b4fbb8e4316b994cdd557ff9be7b3b Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
| * Add QtWebEngineCore moduleDavid Rosca2018-04-204-0/+108
| | | | | | | | | | Change-Id: I8e1127e082abe5978a94aa8a080dfb1d8bbd5952 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
| * Add installed package directory to PATH on WindowsAlexandru Croitor2018-04-201-3/+9
| | | | | | | | | | | | | | | | | | This makes sure that all shared libraries like plugins and qml plugins are able to find the Qt libraries they depend on. Task-number: PYSIDE-642 Change-Id: I0f54481c089dfdbc69a9098f2768f98b1e7a9a22 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
| * Fix QtWebEngineProcess related issues on the supported platformsAlexandru Croitor2018-04-202-0/+21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | There were 2 issues: 1) QtWebEngineProcess could not be found on Windows because we have a non-standard directory layout for the Qt files we copy over (there is no bin directory), so we need to adjust the internal qt.conf which is set in pyside.cpp 2) QtWebEngineProcess itself does not use the qt.conf from pyside.cpp, because it is a separate executable, and thus we need to supply a qt.conf specifically for it which is placed in the libexec folder. Task-number: PYSIDE-626 Task-number: PYSIDE-631 Task-number: PYSIDE-642 Change-Id: I75d1b083fb5afe5dc31ba90174f42c7f559c5cd5 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
| * Remove white spaces from signature label in XMLsCristian Maureira-Fredes2018-04-1918-473/+473
| | | | | | | | | | | | Change-Id: I2d41bb92335bcbd2300da29b793ce0529e57960a Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: Christian Tismer <tismer@stackless.com>