@@ -52,9 +52,9 @@ def _render(self):
5252 # Format time
5353 def fmt_time (seconds ):
5454 if seconds < 60 :
55- return f"{ seconds :.1f } s"
55+ return f"{ seconds :.3f } s"
5656 else :
57- return f"{ seconds / 60 :.1f } m"
57+ return f"{ seconds / 60 :.3f } m"
5858
5959 # Build output line
6060 line = f"\r { self .desc } : [{ bar } ] { self .current } /{ self .total } ({ pct :.0f} %) | { fmt_time (elapsed )} elapsed"
@@ -316,6 +316,8 @@ def main():
316316 # Generate documentation
317317 generated_modules = []
318318 failed_modules = []
319+ updated_count = 0
320+ created_count = 0
319321
320322 start_time = time .time ()
321323
@@ -373,12 +375,12 @@ def process_module(module_data):
373375 # Skip internal modules
374376 if not should_include_module (module_name , include_internal ):
375377 msg = f"[{ i } /{ len (modules_to_process )} ] Skipping { module_name } (internal module)" if verbose else None
376- return (msg , None , None , "skipped" )
378+ return (msg , None , None , "skipped" , False )
377379
378380 source_file = get_module_source_file (module_name )
379381 if not source_file :
380382 msg = f"[{ i } /{ len (modules_to_process )} ] Skipping { module_name } (no source file)" if verbose else None
381- return (msg , None , None , "skipped" )
383+ return (msg , None , None , "skipped" , False )
382384
383385 try :
384386 module_start = time .time ()
@@ -400,6 +402,7 @@ def process_module(module_data):
400402 else :
401403 output_file = args .output_dir / f"{ module_name .replace ('.' , '-' )} .mdx"
402404
405+ file_existed = output_file .exists ()
403406 generate_mdx (
404407 module_info ,
405408 output_file ,
@@ -410,16 +413,16 @@ def process_module(module_data):
410413
411414 module_time = time .time () - module_start
412415 if verbose :
413- msg = f"[{ i } /{ len (modules_to_process )} ] Processing { module_name } ... done ({ module_time :.2f } s)"
416+ msg = f"[{ i } /{ len (modules_to_process )} ] Processing { module_name } ... done ({ module_time :.3f } s)"
414417 else :
415418 msg = f"Processing { module_name } ... done"
416- return (msg , module_name , None , "success" )
419+ return (msg , module_name , None , "success" , file_existed )
417420 except Exception as e :
418421 if verbose :
419422 msg = f"[{ i } /{ len (modules_to_process )} ] Processing { module_name } ... failed: { e } "
420423 else :
421424 msg = f"✗ { module_name } "
422- return (msg , None , (module_name , str (e )), "failed" )
425+ return (msg , None , (module_name , str (e )), "failed" , False )
423426
424427 # Process modules in parallel
425428 with ThreadPoolExecutor (max_workers = 8 ) as executor :
@@ -429,15 +432,39 @@ def process_module(module_data):
429432 for i , module_name in enumerate (modules_to_process , 1 )
430433 }
431434
435+ # Count existing files to determine the action
436+ existing_files = 0
437+ if args .output_dir .exists ():
438+ for module_name in modules_to_process :
439+ has_submodules = any (
440+ m .startswith (module_name + "." )
441+ and m .count ("." ) == module_name .count ("." ) + 1
442+ for m in modules_to_process
443+ )
444+ if has_submodules :
445+ output_file = args .output_dir / f"{ module_name .replace ('.' , '-' )} -__init__.mdx"
446+ else :
447+ output_file = args .output_dir / f"{ module_name .replace ('.' , '-' )} .mdx"
448+ if output_file .exists ():
449+ existing_files += 1
450+
451+ # Choose description based on whether we're updating or creating
452+ if existing_files == len (modules_to_process ):
453+ desc = "Updating docs"
454+ elif existing_files > 0 :
455+ desc = "Processing docs"
456+ else :
457+ desc = "Generating docs"
458+
432459 # Create progress bar if not in verbose mode
433460 progress_bar = None if args .verbose else SimpleProgressBar (
434461 total = len (modules_to_process ),
435- desc = "Generating docs"
462+ desc = desc
436463 )
437464
438465 # Process results as they complete
439466 for future in as_completed (future_to_module ):
440- message , success_module , failed_module , status = future .result ()
467+ message , success_module , failed_module , status , file_existed = future .result ()
441468
442469 if args .verbose :
443470 if message :
@@ -449,6 +476,10 @@ def process_module(module_data):
449476
450477 if success_module :
451478 generated_modules .append (success_module )
479+ if file_existed :
480+ updated_count += 1
481+ else :
482+ created_count += 1
452483 if failed_module :
453484 failed_modules .append (failed_module )
454485
@@ -482,13 +513,18 @@ def process_module(module_data):
482513 # Summary
483514 if not args .verbose :
484515 # Concise summary
485- print (f"\n ✓ Generated { len (generated_modules )} modules in { total_time :.1f} s" )
516+ if created_count == 0 and updated_count > 0 :
517+ print (f"\n ✓ Updated { updated_count } modules in { total_time :.3f} s" )
518+ elif created_count > 0 and updated_count > 0 :
519+ print (f"\n ✓ Created { created_count } and updated { updated_count } modules in { total_time :.3f} s" )
520+ else :
521+ print (f"\n ✓ Generated { len (generated_modules )} modules in { total_time :.3f} s" )
486522 if failed_modules :
487523 print (f"✗ Failed: { len (failed_modules )} modules" )
488524 else :
489525 # Verbose summary
490526 print ("\n Generation complete!" )
491- print (f" Total time: { total_time :.2f } s" )
527+ print (f" Total time: { total_time :.3f } s" )
492528 print (f" Generated: { len (generated_modules )} modules" )
493529 print (f" Failed: { len (failed_modules )} modules" )
494530 if modules_to_process :
0 commit comments