Welcome to mirror list, hosted at ThFree Co, Russian Federation.

dev.gajim.org/gajim/gajim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlovetox <philipp@hoerist.com>2021-12-18 16:20:08 +0300
committerlovetox <philipp@hoerist.com>2021-12-18 16:54:55 +0300
commit8eef14071d55cef3dd353ca7c749ed72d66465b3 (patch)
treed42f297bc487337f5005399ce5773dc5a81f5513 /scripts
parent17b370035ffa64aa78d210f3e58209b83d4a7c00 (diff)
Add helper script for ui file type generation
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/dev/generate_ui_types.py103
1 files changed, 103 insertions, 0 deletions
diff --git a/scripts/dev/generate_ui_types.py b/scripts/dev/generate_ui_types.py
new file mode 100755
index 000000000..7c0d817dd
--- /dev/null
+++ b/scripts/dev/generate_ui_types.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python3
+
+import sys
+from pathlib import Path
+
+from xml.etree import ElementTree as ET
+
+try:
+ path = sys.argv[1]
+except Exception:
+ print('path to file/folder missing')
+ exit()
+
+path = Path(path)
+
+if path.is_dir():
+ paths = list(path.iterdir())
+
+elif path.is_file():
+ paths = [path]
+
+else:
+ print('Path must be folder or file:', path)
+ exit()
+
+
+IMPORTS = '''
+from typing import Literal
+from typing import overload
+
+from gi.repository import Atk
+from gi.repository import Gtk
+from gi.repository import GtkSource
+from gi.repository import GObject
+
+
+class Builder: ...
+'''
+
+CLASS_DEF = '''
+class %s(Builder):
+'''
+
+OVERLOAD = '''
+ @overload
+ def get(self, name: Literal['%s']) -> %s: ...'''
+
+METHOD = '''
+ def get(self, name: str) -> GObject.Object: ...'''
+
+
+GET_BUILDER_OVERLOAD = '''
+@overload
+def get_builder(file_name: Literal['%s'], widgets: list[str] = ...) -> %s: ...'''
+
+GET_BUILDER = '''
+def get_builder(file_name: str, widgets: list[str] = ...) -> Builder: ...'''
+
+
+def make_class_name(path):
+ name = path.name.removesuffix('.ui')
+ names = name.split('_')
+ names = map(lambda x: x.capitalize(), names)
+ return ''.join(names) + 'Builder'
+
+
+def parse(path, file):
+ print('read', path)
+ klass_name = make_class_name(path)
+ file.write(CLASS_DEF % klass_name)
+ tree = ET.parse(path)
+ for node in tree.iter(tag='object'):
+ id_ = node.attrib.get('id')
+ if id_ is None:
+ continue
+ klass = node.attrib.get('class')
+ if klass.startswith('GtkSource'):
+ klass = f'GtkSource.{klass.removeprefix("GtkSource")}'
+ elif klass.startswith('Atk'):
+ klass = f'Atk.{klass.removeprefix("Atk")}'
+ else:
+ klass = f'Gtk.{klass.removeprefix("Gtk")}'
+ file.write(OVERLOAD % (id_, klass))
+ file.write(METHOD)
+ file.write('\n\n')
+ return klass_name
+
+
+builder_names = []
+
+current_dir = Path('./builder.pyi')
+with current_dir.open(mode='w') as file:
+ file.write(IMPORTS)
+ for path in paths:
+ if path.name.endswith('~'):
+ continue
+ name = parse(path, file)
+ builder_names.append((name, path.name))
+
+ for name, file_name in builder_names:
+ file.write(GET_BUILDER_OVERLOAD % (file_name, name))
+ file.write(GET_BUILDER)
+ file.write('\n')