aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Tismer <tismer@stackless.com>2021-06-15 14:08:01 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-06-18 13:28:34 +0000
commit3f605b0541644dccb15c14d2be9313449dcd92c7 (patch)
tree076c8a6af65a6c77f7c371ee21b15936badef821
parentd5b12f64897ccff4716431a2e351f2c3b8ced63c (diff)
testing: enforce that .pyi files are always tested
Being able to run .pyi files in Python 3 is always assumed possible. Since this test is disabled in local builds, we were relying on correct configuration of COIN, but that failed. To be safe, we now add a test to wheel_tester as well that unconditionally tests all .pyi with all features enabled. A special problem was a name clash in Qt3DAnimation.pyi which uses the name "property" :-) An import of QtMultimedia seems not to work, always. This happened in wheel_tester.py in CI, only. Task-number: PYSIDE-1599 Change-Id: Ib158e710cec72287fe4a71c01254727ea9b6dc54 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> (cherry picked from commit 4269e3535b7b97c188a6d8377e685586da89592f) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/lib/enum_sig.py22
-rw-r--r--sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/lib/pyi_generator.py7
-rw-r--r--sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/lib/tool.py1
-rw-r--r--sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/mapping.py19
-rw-r--r--testing/wheel_tester.py17
5 files changed, 58 insertions, 8 deletions
diff --git a/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/lib/enum_sig.py b/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/lib/enum_sig.py
index 743e1c9e2..149881e01 100644
--- a/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/lib/enum_sig.py
+++ b/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/lib/enum_sig.py
@@ -55,6 +55,19 @@ from shibokensupport.signature import get_signature as get_sig
from shibokensupport.signature.layout import create_signature
+"""
+PYSIDE-1599: Making sure that pyi files always are tested.
+
+A new problem popped up when supporting true properties:
+When there exists an item named "property", then we cannot use
+the builtin `property` as decorator, but need to prefix it with "builtins".
+
+We scan for such a name in a class, and if there should a property be
+declared in the same class, we use `builtins.property` in the class and
+all sub-classes. The same consideration holds for "overload".
+"""
+
+
class ExactEnumerator(object):
"""
ExactEnumerator enumerates all signatures in a module as they are.
@@ -77,6 +90,7 @@ class ExactEnumerator(object):
self.result_type = result_type
self.fmt.level = 0
self.fmt.is_method = self.is_method
+ self.collision_candidates = {"property", "overload"}
def is_method(self):
"""
@@ -100,6 +114,7 @@ class ExactEnumerator(object):
ret = self.result_type()
self.fmt.class_name = None
for class_name, klass in members:
+ self.collision_track = set()
ret.update(self.klass(class_name, klass))
if len(members):
self.section()
@@ -145,6 +160,9 @@ class ExactEnumerator(object):
elif isinstance(thing, property):
properties.append((thing_name, thing))
+ if thing_name in self.collision_candidates:
+ self.collision_track.add(thing_name)
+
init_signature = getattr(klass, "__signature__", None)
enums.sort(key=lambda tup: tup[1 : 3]) # sort by class then enum value
@@ -168,7 +186,9 @@ class ExactEnumerator(object):
if len(subclasses):
self.section()
for subclass_name, subclass in subclasses:
+ save = self.collision_track.copy()
ret.update(self.klass(subclass_name, subclass))
+ self.collision_track = save
self.fmt.class_name = class_name
if len(subclasses):
self.section()
@@ -191,6 +211,8 @@ class ExactEnumerator(object):
def function(self, func_name, func, decorator=None):
self.func = func # for is_method()
ret = self.result_type()
+ if decorator in self.collision_track:
+ decorator = f"builtins.{decorator}"
signature = self.get_signature(func, decorator)
if signature is not None:
with self.fmt.function(func_name, signature, decorator) as key:
diff --git a/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/lib/pyi_generator.py b/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/lib/pyi_generator.py
index bffecc2b1..6e35727b3 100644
--- a/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/lib/pyi_generator.py
+++ b/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/lib/pyi_generator.py
@@ -212,6 +212,7 @@ def find_imports(text):
FROM_IMPORTS = [
("typing", "Any Callable Dict List Optional overload Tuple Union".split()),
("PySide6.QtCore", ["PyClassProperty"]),
+ (None, ["builtins"]),
]
def filter_from_imports(from_struct, text):
@@ -297,7 +298,11 @@ def generate_pyi(import_name, outpath, options):
text = outfile.getvalue()
for mod, imports in filter_from_imports(FROM_IMPORTS, text):
import_args = ', '.join(imports)
- wr.print(f"from {mod} import {import_args}")
+ if mod is None:
+ # special case, a normal import
+ wr.print(f"import {import_args}")
+ else:
+ wr.print(f"from {mod} import {import_args}")
wr.print()
if need_imports:
for mod_name in find_imports(text):
diff --git a/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/lib/tool.py b/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/lib/tool.py
index c5ff7b93f..f057ec6d3 100644
--- a/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/lib/tool.py
+++ b/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/lib/tool.py
@@ -46,7 +46,6 @@ https://stackoverflow.com/questions/18513821/python-metaclass-understanding-the-
"""
from textwrap import dedent
-from types import SimpleNamespace
def build_brace_pattern(level, separators):
diff --git a/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/mapping.py b/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/mapping.py
index fd3641131..6dca9ba8c 100644
--- a/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/mapping.py
+++ b/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/mapping.py
@@ -598,9 +598,13 @@ def init_PySide6_QtXmlPatterns():
def init_PySide6_QtMultimedia():
- import PySide6.QtMultimediaWidgets
- # Check if foreign import is valid. See mapping.py in shiboken6.
- check_module(PySide6.QtMultimediaWidgets)
+ # PYSIDE-1599: We force pyi testing in wheel_tester. This seems to fail, sometimes.
+ try:
+ import PySide6.QtMultimediaWidgets
+ check_module(PySide6.QtMultimediaWidgets)
+ except SystemError:
+ print("Failure importing QtMultimediaWidgets")
+ return locals()
type_map.update({
"QGraphicsVideoItem": PySide6.QtMultimediaWidgets.QGraphicsVideoItem,
"qint64": int,
@@ -644,7 +648,9 @@ def init_PySide6_QtScript():
def init_PySide6_QtTest():
+ from PySide6.QtCore import SignalInstance
type_map.update({
+ "PySideSignalInstance": SignalInstance,
"PySide6.QtTest.QTest.PySideQTouchEventSequence": PySide6.QtTest.QTest.QTouchEventSequence,
"PySide6.QtTest.QTouchEventSequence": PySide6.QtTest.QTest.QTouchEventSequence,
})
@@ -674,6 +680,13 @@ def init_PySide6_QtDataVisualization():
return locals()
+def init_PySide6_QtBluetooth():
+ type_map.update({
+ "QVariant*": object,
+ })
+ return locals()
+
+
def init_testbinding():
type_map.update({
"testbinding.PySideCPP2.TestObjectWithoutNamespace": testbinding.TestObjectWithoutNamespace,
diff --git a/testing/wheel_tester.py b/testing/wheel_tester.py
index c5c0fdc00..c09e2d8a7 100644
--- a/testing/wheel_tester.py
+++ b/testing/wheel_tester.py
@@ -291,8 +291,8 @@ def run_compiled_script(binary_path):
log.info("")
-def execute_script(script_path):
- args = [sys.executable, script_path]
+def execute_script(script_path, *extra):
+ args = list(map(str, (sys.executable, script_path) + extra))
exit_code = run_process(args)
if exit_code:
raise RuntimeError("Failure while executing script: {}".format(script_path))
@@ -329,8 +329,8 @@ def try_build_examples():
run_compiled_script(os.path.join(src_path,
"pyinstaller", "dist", "hello_app", "hello_app"))
- src_path = Path(examples_dir) / "installer_test"
log.info("Attempting to build hello.py using Nuitka.")
+ src_path = Path(examples_dir) / "installer_test"
# Nuitka is loaded by coin_build_instructions.py, but not when
# testing directly this script.
run_nuitka_test(os.fspath(src_path / "hello.py"))
@@ -356,6 +356,17 @@ def try_build_examples():
generate_build_qmake()
run_make()
+ if sys.version_info[:2] >= (3, 7):
+ log.info("Checking Python Interface Files in Python 3 with all features selected")
+ with tempfile.TemporaryDirectory() as tmpdirname:
+ src_path = Path(tmpdirname) / "pyi_test"
+ pyi_script_dir = Path(setup_script_dir) / "sources" / "pyside6" / "PySide6" / "support"
+ execute_script(pyi_script_dir / "generate_pyi.py", "all", "--outpath", src_path,
+ "--feature", "snake_case", "true_property")
+ from PySide6 import __all__ as modules
+ for modname in modules:
+ execute_script(src_path / f"{modname}.pyi")
+
def run_wheel_tests(install_wheels):
wheels_dir = get_wheels_dir()