@@ -121,14 +121,7 @@ def GetModule(tlib: _UnionT[Any, typeinfo.ITypeLib]) -> types.ModuleType:
121
121
pathname = None
122
122
tlib = _load_tlib (tlib )
123
123
logger .debug ("GetModule(%s)" , tlib .GetLibAttr ())
124
- # create and import the real typelib wrapper module
125
- mod = _create_wrapper_module (tlib , pathname )
126
- # try to get the friendly-name, if not, returns the real typelib wrapper module
127
- modulename = codegenerator .name_friendly_module (tlib )
128
- if modulename is None :
129
- return mod
130
- # create and import the friendly-named module
131
- return _create_friendly_module (tlib , modulename )
124
+ return ModuleGenerator ().generate (tlib , pathname )
132
125
133
126
134
127
def _load_tlib (obj : Any ) -> typeinfo .ITypeLib :
@@ -193,52 +186,64 @@ def _create_module_in_memory(modulename: str, code: str) -> types.ModuleType:
193
186
return mod
194
187
195
188
196
- def _create_friendly_module (
197
- tlib : typeinfo .ITypeLib , modulename : str
198
- ) -> types .ModuleType :
199
- """helper which creates and imports the friendly-named module."""
200
- try :
201
- mod = _my_import (modulename )
202
- except Exception as details :
203
- logger .info ("Could not import %s: %s" , modulename , details )
204
- else :
205
- return mod
206
- # the module is always regenerated if the import fails
207
- logger .info ("# Generating %s" , modulename )
208
- # determine the Python module name
209
- modname = codegenerator .name_wrapper_module (tlib ).split ("." )[- 1 ]
210
- code = "from comtypes.gen import %s\n " % modname
211
- code += "globals().update(%s.__dict__)\n " % modname
212
- code += "__name__ = '%s'" % modulename
213
- if comtypes .client .gen_dir is None :
214
- return _create_module_in_memory (modulename , code )
215
- return _create_module_in_file (modulename , code )
216
-
217
-
218
- def _create_wrapper_module (
219
- tlib : typeinfo .ITypeLib , pathname : Optional [str ]
220
- ) -> types .ModuleType :
221
- """helper which creates and imports the real typelib wrapper module."""
222
- modulename = codegenerator .name_wrapper_module (tlib )
223
- if modulename in sys .modules :
224
- return sys .modules [modulename ]
225
- try :
226
- return _my_import (modulename )
227
- except Exception as details :
228
- logger .info ("Could not import %s: %s" , modulename , details )
229
- # generate the module since it doesn't exist or is out of date
230
- logger .info ("# Generating %s" , modulename )
231
- p = tlbparser .TypeLibParser (tlib )
232
- if pathname is None :
233
- pathname = tlbparser .get_tlib_filename (tlib )
234
- items = list (p .parse ().values ())
235
- codegen = codegenerator .CodeGenerator (_get_known_symbols ())
236
- code = codegen .generate_code (items , filename = pathname )
237
- for ext_tlib in codegen .externals : # generates dependency COM-lib modules
238
- GetModule (ext_tlib )
239
- if comtypes .client .gen_dir is None :
240
- return _create_module_in_memory (modulename , code )
241
- return _create_module_in_file (modulename , code )
189
+ class ModuleGenerator (object ):
190
+ def __init__ (self ) -> None :
191
+ self .codegen = codegenerator .CodeGenerator (_get_known_symbols ())
192
+
193
+ def generate (
194
+ self , tlib : typeinfo .ITypeLib , pathname : Optional [str ]
195
+ ) -> types .ModuleType :
196
+ # create and import the real typelib wrapper module
197
+ mod = self ._create_wrapper_module (tlib , pathname )
198
+ # try to get the friendly-name, if not, returns the real typelib wrapper module
199
+ modulename = codegenerator .name_friendly_module (tlib )
200
+ if modulename is None :
201
+ return mod
202
+ # create and import the friendly-named module
203
+ return self ._create_friendly_module (tlib , modulename )
204
+
205
+ def _create_friendly_module (
206
+ self , tlib : typeinfo .ITypeLib , modulename : str
207
+ ) -> types .ModuleType :
208
+ """helper which creates and imports the friendly-named module."""
209
+ try :
210
+ mod = _my_import (modulename )
211
+ except Exception as details :
212
+ logger .info ("Could not import %s: %s" , modulename , details )
213
+ else :
214
+ return mod
215
+ # the module is always regenerated if the import fails
216
+ logger .info ("# Generating %s" , modulename )
217
+ # determine the Python module name
218
+ modname = codegenerator .name_wrapper_module (tlib )
219
+ code = self .codegen .generate_friendly_code (modname )
220
+ if comtypes .client .gen_dir is None :
221
+ return _create_module_in_memory (modulename , code )
222
+ return _create_module_in_file (modulename , code )
223
+
224
+ def _create_wrapper_module (
225
+ self , tlib : typeinfo .ITypeLib , pathname : Optional [str ]
226
+ ) -> types .ModuleType :
227
+ """helper which creates and imports the real typelib wrapper module."""
228
+ modulename = codegenerator .name_wrapper_module (tlib )
229
+ if modulename in sys .modules :
230
+ return sys .modules [modulename ]
231
+ try :
232
+ return _my_import (modulename )
233
+ except Exception as details :
234
+ logger .info ("Could not import %s: %s" , modulename , details )
235
+ # generate the module since it doesn't exist or is out of date
236
+ logger .info ("# Generating %s" , modulename )
237
+ p = tlbparser .TypeLibParser (tlib )
238
+ if pathname is None :
239
+ pathname = tlbparser .get_tlib_filename (tlib )
240
+ items = list (p .parse ().values ())
241
+ code = self .codegen .generate_wrapper_code (items , filename = pathname )
242
+ for ext_tlib in self .codegen .externals : # generates dependency COM-lib modules
243
+ GetModule (ext_tlib )
244
+ if comtypes .client .gen_dir is None :
245
+ return _create_module_in_memory (modulename , code )
246
+ return _create_module_in_file (modulename , code )
242
247
243
248
244
249
def _get_known_symbols () -> Dict [str , str ]:
0 commit comments