diff options
author | Christian Tismer <tismer@stackless.com> | 2021-06-15 14:08:01 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-06-18 13:28:34 +0000 |
commit | 3f605b0541644dccb15c14d2be9313449dcd92c7 (patch) | |
tree | 076c8a6af65a6c77f7c371ee21b15936badef821 | |
parent | d5b12f64897ccff4716431a2e351f2c3b8ced63c (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>
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() |