-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathps6_term_list.py
70 lines (58 loc) · 2.77 KB
/
ps6_term_list.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
""" Classes to create a list of PySide6 classes and Enums """
from dataclasses import dataclass
import inspect
from enum import Enum
from PySide6 import QtCore, QtGui, QtWidgets
@dataclass
class TermEntry:
""" PySide6 class|enum info """
display: str # display name
search: str # search name
suffix: str # URL suffix
class PS6TermList:
""" Build a list of PySide6 classes and enums """
BASE_URL = 'https://doc.qt.io/qtforpython-6/PySide6/'
SKIPS = ['ClassInfo', 'MetaFunction', 'MetaSignal', 'PyClassProperty']
MODS = (QtCore, QtGui, QtWidgets)
def __init__(self):
self.terms: list[TermEntry] = []
self.kls_count = 0
self.enum_count = 0
for mod in self.MODS:
mod_name = mod.__name__.split('.', 1)[1]
# Get the names of all the classes in this module
for kls_name, kls in inspect.getmembers(mod, inspect.isclass):
if not kls_name in self.SKIPS:
kls_url = f'{mod_name}/{kls_name}.html'
self.terms.append(TermEntry(f'{mod_name}.{kls_name}',
kls_name.lower(),
kls_url))
self.kls_count += 1
# Get the names of all the Enums in this class
for _, en in inspect.getmembers(kls, self.is_enum):
qname = en.__qualname__
# Ensure this Enum belongs to this class (not inherited)
if qname.startswith(kls_name):
# enums are #fragments on superclass page
e_url = f'{kls_url}#{mod.__name__}.{qname}'
self.terms.append(TermEntry(qname,
qname.lower(),
e_url))
self.enum_count += 1
self.terms.sort(key=lambda t: t.display)
@staticmethod
def is_enum(member):
# inspect.getmembers() helper
return inspect.isclass(member) and issubclass(member, Enum)
def search(self, search_term: str) -> list[TermEntry]:
""" Return list of terms that include <search_term> """
terms: list[TermEntry] = []
if len(search_term) >= 3: # too many results for 1- and 2-char searches
term = search_term.lower()
terms = [entry for entry in self.terms if term in entry.search]
return terms
def make_url(self, entry: TermEntry) -> str:
""" Return doc URL for the specified term """
return self.BASE_URL + entry.suffix
def stats(self) -> str:
return f'{self.kls_count} classes and {self.enum_count} enums available'