@@ -98,10 +98,18 @@ def skip_generate_keyword_class(keyword: str) -> bool:
9898 return False
9999
100100
101- def get_undefined_alias_keywords (keywords_list : typing .List [typing .Dict ]) -> typing .List [typing .Dict ]:
101+ def get_undefined_alias_keywords (keywords_list : typing .List [typing .Dict ], subset_domains : typing .Optional [typing .List [str ]] = None ) -> typing .List [typing .Dict ]:
102+ from keyword_generation .utils .domain_mapper import get_keyword_domain
103+
102104 undefined_aliases : typing .List [typing .Dict ] = []
103105 for alias , kwd in data_model .ALIAS_TO_KWD .items ():
104106 if alias not in [kwd ["name" ] for kwd in keywords_list ]:
107+ # Filter by subset domains if specified
108+ if subset_domains :
109+ domain = get_keyword_domain (alias )
110+ if domain not in subset_domains :
111+ continue
112+
105113 fixed_keyword = fix_keyword (alias ).lower ()
106114 classname = get_classname (fixed_keyword )
107115 fixed_base_keyword = fix_keyword (kwd ).lower ()
@@ -251,20 +259,31 @@ def generate_autodoc_file(autodoc_output_path, all_keywords, env):
251259 logger .info (f"Generated index.rst with { len (categories )} category links" )
252260
253261
254- def get_keywords_to_generate (kwd_name : typing .Optional [str ] = None ) -> typing .List [typing .Dict ]:
262+ def get_keywords_to_generate (kwd_name : typing .Optional [str ] = None , subset_domains : typing . Optional [ typing . List [ str ]] = None ) -> typing .List [typing .Dict ]:
255263 """Get keywords to generate. If a kwd name is not none, only generate
256- it and its generations."""
264+ it and its generations. If subset_domains is provided, only generate keywords
265+ from those domains (e.g., ['boundary', 'contact', 'control'])."""
257266 assert data_model .KWDM_INSTANCE is not None , "KWDM_INSTANCE not initialized"
258267 keywords = []
259268 kwd_list = data_model .KWDM_INSTANCE .get_keywords_list ()
260269
261270 # first get all aliases
262271 add_aliases (kwd_list )
263272
273+ # Import domain mapper to properly determine keyword domain
274+ from keyword_generation .utils .domain_mapper import get_keyword_domain
275+
264276 # then get keywords to generate
265277 for keyword in kwd_list :
266278 if kwd_name != None and keyword != kwd_name :
267279 continue
280+
281+ # Filter by subset domains if specified
282+ if subset_domains :
283+ domain = get_keyword_domain (keyword )
284+ if domain not in subset_domains :
285+ continue
286+
268287 for keyword , keyword_options in get_generations (keyword ):
269288 item = get_keyword_item (keyword )
270289 item ["options" ] = keyword_options
@@ -273,16 +292,19 @@ def get_keywords_to_generate(kwd_name: typing.Optional[str] = None) -> typing.Li
273292 return keywords
274293
275294
276- def generate_classes (lib_path : str , kwd_name : typing .Optional [str ] = None , autodoc_output_path : str = "" ) -> None :
295+ def generate_classes (lib_path : str , kwd_name : typing .Optional [str ] = None , autodoc_output_path : str = "" , subset_domains : typing . Optional [ typing . List [ str ]] = None ) -> None :
277296 """Generates the keyword classes, importer, and type-mapper
278297 if kwd_name is not None, this only generates that particular keyword class
298+ if subset_domains is not None, only generates keywords from those domains
279299 """
280- logger .debug (f"Starting class generation with lib_path={ lib_path } , kwd_name={ kwd_name } " )
300+ logger .debug (f"Starting class generation with lib_path={ lib_path } , kwd_name={ kwd_name } , subset_domains={ subset_domains } " )
301+ if subset_domains :
302+ logger .info (f"Subset mode: generating only domains { subset_domains } " )
281303 autodoc_entries = []
282304 env = Environment (loader = get_loader (), trim_blocks = True , lstrip_blocks = True )
283305 output_manager = OutputManager (lib_path )
284306 # Generate only requested keyword(s)
285- keywords_list = get_keywords_to_generate (kwd_name )
307+ keywords_list = get_keywords_to_generate (kwd_name , subset_domains )
286308 logger .info (f"Generating { len (keywords_list )} keyword classes" )
287309 generated_count = 0
288310 skipped_count = 0
@@ -304,9 +326,9 @@ def generate_classes(lib_path: str, kwd_name: typing.Optional[str] = None, autod
304326
305327 # Always rewrite autodoc for all keywords
306328 if autodoc_output_path and not kwd_name :
307- all_keywords = get_keywords_to_generate ()
329+ all_keywords = get_keywords_to_generate (subset_domains = subset_domains )
308330 generate_autodoc_file (autodoc_output_path , all_keywords , env )
309- keywords_list .extend (get_undefined_alias_keywords (keywords_list ))
331+ keywords_list .extend (get_undefined_alias_keywords (keywords_list , subset_domains ))
310332 if kwd_name == None :
311333 generate_entrypoints (env , output_manager , keywords_list )
312334
@@ -349,23 +371,35 @@ def run_codegen(args):
349371 return
350372 load_inputs (this_folder , args )
351373
374+ # Handle subset domains
375+ subset_domains = None
376+ if args .subset :
377+ subset_domains = [d .strip () for d in args .subset .split ("," )]
378+ logger .info (f"Subset mode enabled: generating only { subset_domains } domains" )
379+
352380 # Handle autodoc-only mode
353381 if args .autodoc_only :
354382 logger .info ("Generating autodoc files only" )
355383 env = Environment (loader = get_loader (), trim_blocks = True , lstrip_blocks = True )
356- all_keywords = get_keywords_to_generate ()
384+ all_keywords = get_keywords_to_generate (subset_domains = subset_domains )
357385 generate_autodoc_file (autodoc_path , all_keywords , env )
358386 logger .info ("Autodoc generation complete" )
359387 return
360388
389+ # Handle subset domains
390+ subset_domains = None
391+ if args .subset :
392+ subset_domains = [d .strip () for d in args .subset .split ("," )]
393+ logger .info (f"Subset mode enabled: generating only { subset_domains } domains" )
394+
361395 if args .keyword == "" :
362396 kwd = None
363- logger .info ("Generating code for all keywords" )
364- generate_classes (output , autodoc_output_path = autodoc_path )
397+ logger .info ("Generating code for all keywords" if not subset_domains else f"Generating subset: { subset_domains } " )
398+ generate_classes (output , autodoc_output_path = autodoc_path , subset_domains = subset_domains )
365399 else :
366400 kwd = args .keyword
367401 logger .info (f"Generating code for { kwd } " )
368- generate_classes (output , kwd , autodoc_output_path = autodoc_path )
402+ generate_classes (output , kwd , autodoc_output_path = autodoc_path , subset_domains = subset_domains )
369403
370404
371405def parse_args ():
@@ -419,6 +453,12 @@ def parse_args():
419453 choices = ["DEBUG" , "INFO" , "WARNING" , "ERROR" , "CRITICAL" ],
420454 help = "Set the logging level. Defaults to INFO." ,
421455 )
456+ parser .add_argument (
457+ "--subset" ,
458+ "-s" ,
459+ default = "" ,
460+ help = "Generate only a subset of keyword domains (comma-delimited list, e.g., 'boundary,contact,control'). Useful for fast iteration during optimization work." ,
461+ )
422462 return parser .parse_args ()
423463
424464
0 commit comments