aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside6/doc/json_inheritance.py
diff options
context:
space:
mode:
Diffstat (limited to 'sources/pyside6/doc/json_inheritance.py')
-rw-r--r--sources/pyside6/doc/json_inheritance.py74
1 files changed, 74 insertions, 0 deletions
diff --git a/sources/pyside6/doc/json_inheritance.py b/sources/pyside6/doc/json_inheritance.py
new file mode 100644
index 000000000..06be33ea4
--- /dev/null
+++ b/sources/pyside6/doc/json_inheritance.py
@@ -0,0 +1,74 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import json
+import os
+import sys
+from pathlib import Path
+
+
+"""Helpers for determining base classes by reading a JSON
+ file written by shiboken's doc generator."""
+
+
+TEST_DRIVER_USAGE = """Usage: json_inheritance.py class_name json_file
+
+Example:
+python json_inheritance.py PySide6.QtWidgets.QWizard ~/inheritance.json
+"""
+
+
+ENV_VAR = "INHERITANCE_FILE"
+
+
+def strip_module(class_name):
+ return class_name[8:] if class_name.startswith("PySide") else class_name
+
+
+def get_inheritance_entries_recursion(json_dict, class_name):
+ """Get all edges of the inheritance graph of class_name."""
+ result = []
+ bases_entry = json_dict.get(class_name)
+ bases = bases_entry if bases_entry else []
+ node_name = strip_module(class_name)
+ base_list = [strip_module(b) for b in bases]
+ result.append((node_name, class_name, base_list))
+ for b in bases:
+ nested_bases = get_inheritance_entries_recursion(json_dict, b)
+ if nested_bases:
+ result.extend(nested_bases)
+ return result
+
+
+def _get_inheritance_entries_from_json(json_file, class_names):
+ """Get all edges of the inheritance graph of class_name
+ from the JSON file generated by shiboken."""
+ result = []
+ try:
+ with Path(json_file).open("r") as f:
+ json_dict = json.load(f)
+ for c in class_names:
+ result.extend(get_inheritance_entries_recursion(json_dict, c))
+ except (json.JSONDecodeError, KeyError) as e:
+ print(f"Error reading {json_file}: {e}")
+ raise
+ return result
+
+
+def is_inheritance_from_json_enabled():
+ return os.environ.get(ENV_VAR)
+
+
+def get_inheritance_entries_from_json(class_names):
+ json_file = os.environ[ENV_VAR]
+ return _get_inheritance_entries_from_json(json_file, class_names)
+
+
+if __name__ == "__main__":
+ if len(sys.argv) < 2:
+ print(TEST_DRIVER_USAGE)
+ sys.exit(-1)
+ class_name = sys.argv[1]
+ json_file = sys.argv[2]
+ for e in _get_inheritance_entries_from_json(json_file, [class_name]):
+ print(e)