Skip to content

Commit 4e5af79

Browse files
committed
stubgen: Refactor to reuse more code from pypdb
1 parent 76ad17f commit 4e5af79

File tree

2 files changed

+31
-50
lines changed

2 files changed

+31
-50
lines changed

generate-pdb-stubs/stubgen.py

+19-42
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,10 @@ def generate_pdb_stubs(output_dirpath):
6666

6767
pypdb_class_node = _get_pypdb_class_node(root_node)
6868

69-
for proc_name, proc in sorted(_get_gimp_pdb_procedures().items()):
70-
_insert_gimp_pdb_procedure_node(pypdb_class_node, proc_name, proc)
69+
for proc_name in sorted(pypdb.pdb.list_all_gimp_pdb_procedures()):
70+
_insert_gimp_pdb_procedure_node(pypdb_class_node, proc_name)
7171

72-
for proc_name in sorted(_get_gegl_procedures()):
72+
for proc_name in sorted(pypdb.pdb.list_all_gegl_operations()):
7373
_insert_gegl_procedure_node(pypdb_class_node, proc_name)
7474

7575
write_stub_file(output_dirpath, root_node)
@@ -149,17 +149,19 @@ def _get_pypdb_class_node(root_node):
149149
return pypdb_class_node
150150

151151

152-
def _insert_gimp_pdb_procedure_node(pypdb_class_node, procedure_name, procedure):
152+
def _insert_gimp_pdb_procedure_node(pypdb_class_node, procedure_name):
153153
procedure_node = _create_pdb_procedure_node(procedure_name)
154154

155+
procedure = pypdb.GimpPDBProcedure(pypdb.pdb, procedure_name)
156+
155157
_insert_gimp_pdb_procedure_arguments(procedure_node, procedure)
156158
_insert_gimp_pdb_procedure_docstring(procedure_node, procedure)
157159

158160
pypdb_class_node.body.append(procedure_node)
159161

160162

161163
def _create_pdb_procedure_node(procedure_name):
162-
func_name = _pythonize(procedure_name)
164+
func_name = pypdb.pdb.canonical_name_to_python_name(procedure_name)
163165

164166
# Constructing a `FunctionDef` node this way is more readable and less error-prone.
165167
func_base_arguments_str = 'self'
@@ -173,11 +175,11 @@ def _create_pdb_procedure_node(procedure_name):
173175

174176

175177
def _insert_gimp_pdb_procedure_arguments(procedure_node, procedure):
176-
proc_args = procedure.get_arguments()
178+
proc_args = procedure.arguments
177179

178180
for proc_arg in reversed(proc_args):
179181
arg_node = ast.arg(
180-
arg=_pythonize(proc_arg.name),
182+
arg=pypdb.pdb.canonical_name_to_python_name(proc_arg.name),
181183
annotation=_get_proc_argument_type_hint(proc_arg),
182184
col_offset=None,
183185
end_col_offset=None,
@@ -204,7 +206,7 @@ def _insert_gimp_pdb_procedure_arguments(procedure_node, procedure):
204206

205207
procedure_node.args.defaults.insert(0, arg_default_value)
206208

207-
procedure_node.returns = _get_pdb_return_values_type_hint(procedure.get_return_values())
209+
procedure_node.returns = _get_pdb_return_values_type_hint(procedure.return_values)
208210

209211

210212
def _get_pdb_return_values_type_hint(proc_return_values):
@@ -241,15 +243,15 @@ def _get_full_type_name(type_):
241243
def _insert_gimp_pdb_procedure_docstring(procedure_node, procedure):
242244
proc_docstring = ''
243245

244-
proc_docstring = _add_proc_blurb_to_docstring(procedure.get_blurb(), proc_docstring)
246+
proc_docstring = _add_proc_blurb_to_docstring(procedure.blurb, proc_docstring)
245247

246248
add_extra_newline = True
247249
proc_docstring, is_specified = _add_field_to_docstring(
248-
procedure.get_image_types(), proc_docstring, 'Image types', True)
250+
procedure.proc.get_image_types(), proc_docstring, 'Image types', True)
249251

250252
add_extra_newline = add_extra_newline and not is_specified
251253
proc_docstring, is_specified = _add_field_to_docstring(
252-
procedure.get_menu_label(), proc_docstring, 'Menu label', add_extra_newline)
254+
procedure.menu_label, proc_docstring, 'Menu label', add_extra_newline)
253255

254256
add_extra_newline = add_extra_newline and not is_specified
255257
proc_docstring = _add_menu_paths_to_docstring(procedure, proc_docstring, add_extra_newline)
@@ -292,7 +294,7 @@ def _add_field_to_docstring(field, proc_docstring, prefix, add_extra_newline):
292294

293295

294296
def _add_menu_paths_to_docstring(procedure, proc_docstring, add_extra_newline):
295-
proc_menu_paths = procedure.get_menu_paths()
297+
proc_menu_paths = procedure.menu_paths
296298
if proc_menu_paths:
297299
if proc_docstring:
298300
proc_docstring += f'\n{_BODY_INDENT}' * (2 if add_extra_newline else 1)
@@ -306,7 +308,7 @@ def _add_menu_paths_to_docstring(procedure, proc_docstring, add_extra_newline):
306308

307309

308310
def _add_proc_help_to_docstring(procedure, proc_docstring):
309-
proc_help = procedure.get_help()
311+
proc_help = procedure.help
310312
if proc_help:
311313
proc_help = proc_help.strip()
312314
if not proc_help.endswith('.'):
@@ -354,7 +356,7 @@ def _add_proc_params_to_docstring(procedure, proc_docstring):
354356
procedure,
355357
proc_docstring,
356358
'parameter',
357-
lambda proc: proc.get_arguments(),
359+
lambda proc: proc.arguments,
358360
'Parameters:',
359361
)
360362

@@ -364,7 +366,7 @@ def _add_proc_return_values_to_docstring(procedure, proc_docstring):
364366
procedure,
365367
proc_docstring,
366368
'return_value',
367-
lambda proc: proc.get_return_values(),
369+
lambda proc: proc.return_values,
368370
'Returns:',
369371
)
370372

@@ -380,7 +382,7 @@ def _add_proc_params_or_retvals_to_docstring(
380382
param_prefix = '* '
381383

382384
for param in params:
383-
name = _pythonize(param.name)
385+
name = pypdb.pdb.canonical_name_to_python_name(param.name)
384386

385387
description = param.blurb
386388
if description:
@@ -683,7 +685,7 @@ def _insert_gegl_procedure_arguments(procedure, procedure_node):
683685

684686
for proc_arg in reversed(proc_args):
685687
arg_node = ast.arg(
686-
arg=_pythonize(proc_arg.name),
688+
arg=pypdb.pdb.canonical_name_to_python_name(proc_arg.name),
687689
annotation=_get_proc_argument_type_hint(proc_arg),
688690
col_offset=None,
689691
end_col_offset=None,
@@ -733,10 +735,6 @@ def _insert_gegl_procedure_docstring(procedure, procedure_node):
733735
procedure_node.body[0].value.value = proc_docstring
734736

735737

736-
def _pythonize(str_):
737-
return str_.replace('-', '_').replace(':', '__')
738-
739-
740738
def _get_proc_argument_type_hint(proc_arg):
741739
arg_type_name = _get_type_hint_name(proc_arg, default_type='GObject.Value')
742740

@@ -797,27 +795,6 @@ def _get_type_hint_name_from_gtype(value_type, default_type):
797795
return default_type
798796

799797

800-
def _get_gimp_pdb_procedures():
801-
"""Retrieves a list of GIMP PDB procedures."""
802-
query_procedure = Gimp.get_pdb().lookup_procedure('gimp-pdb-query')
803-
config = query_procedure.create_config()
804-
for prop in config.list_properties():
805-
if prop.value_type == Gimp.Procedure.__gtype__:
806-
continue
807-
808-
config.set_property(prop.name, '')
809-
810-
return {
811-
proc_name: Gimp.get_pdb().lookup_procedure(proc_name)
812-
for proc_name in query_procedure.run(config).index(1)
813-
}
814-
815-
816-
def _get_gegl_procedures():
817-
"""Retrieves a list of GEGL operations."""
818-
return Gegl.list_operations()
819-
820-
821798
def write_stub_file(dirpath, root_node):
822799
os.makedirs(dirpath, exist_ok=True)
823800

wrappers/pypdb.py

+12-8
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,15 @@ def last_error(self):
3939
return self._last_error
4040

4141
def __getattr__(self, name: str) -> 'PDBProcedure':
42-
proc_name = self._process_procedure_name(name)
42+
proc_name = self.python_name_to_canonical_name(name)
4343

4444
if proc_name not in self._proc_cache:
4545
self._proc_cache[proc_name] = self._create_proc(proc_name)
4646

4747
return self._proc_cache[proc_name]
4848

4949
def __getitem__(self, name: str) -> 'PDBProcedure':
50-
proc_name = self._process_procedure_name(name)
50+
proc_name = self.python_name_to_canonical_name(name)
5151

5252
if proc_name not in self._proc_cache:
5353
self._proc_cache[proc_name] = self._create_proc(proc_name)
@@ -58,7 +58,7 @@ def __contains__(self, name: Optional[str]) -> bool:
5858
if name is None:
5959
return False
6060

61-
proc_name = self._process_procedure_name(name)
61+
proc_name = self.python_name_to_canonical_name(name)
6262

6363
if proc_name not in self._proc_cache:
6464
try:
@@ -87,7 +87,7 @@ def remove_from_cache(self, name: str):
8787
8888
No action is taken if there is no procedure matching ``name`` in the cache.
8989
"""
90-
proc_name = self._process_procedure_name(name)
90+
proc_name = self.python_name_to_canonical_name(name)
9191

9292
try:
9393
del self._proc_cache[proc_name]
@@ -102,6 +102,14 @@ def _create_proc(self, proc_name):
102102
else:
103103
raise AttributeError(f'procedure "{proc_name}" does not exist')
104104

105+
@staticmethod
106+
def python_name_to_canonical_name(name):
107+
return name.replace('__', ':').replace('_', '-')
108+
109+
@staticmethod
110+
def canonical_name_to_python_name(name):
111+
return name.replace('-', '_').replace(':', '__')
112+
105113
@staticmethod
106114
def _gimp_pdb_procedure_exists(proc_name):
107115
return Gimp.is_canonical_identifier(proc_name) and Gimp.get_pdb().procedure_exists(proc_name)
@@ -110,10 +118,6 @@ def _gimp_pdb_procedure_exists(proc_name):
110118
def _gegl_operation_exists(proc_name):
111119
return Gegl.has_operation(proc_name)
112120

113-
@staticmethod
114-
def _process_procedure_name(name):
115-
return name.replace('__', ':').replace('_', '-')
116-
117121

118122
class PDBProcedure(metaclass=abc.ABCMeta):
119123

0 commit comments

Comments
 (0)