Files

104 lines
2.7 KiB
Python
Raw Permalink Normal View History

2026-07-29 09:16:42 +03:00
import sys
import time
from concurrent.futures import ThreadPoolExecutor
SPINNER_FRAMES = ["⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷"]
def draw_progress_bar(percent, width=10):
filled = int(width * (percent / 100))
if filled < width:
bar = "=" * max(0, filled - 1) + ">" + " " * (width - filled)
else:
bar = "=" * width
return f"[{bar}] {percent:3d}%"
def execute_task_with_spinner(label, task_fn, *args, indent=0, **kwargs):
"""
Executes task_fn(*args, **kwargs) in a background thread while displaying an
animated spinner or progress updates next to the label.
"""
2026-08-02 23:52:05 +03:00
prefix = " " * indent + " ╰──> " if indent > 0 else ""
2026-07-29 09:16:42 +03:00
full_prefix = f"{prefix}{label} "
with ThreadPoolExecutor(max_workers=1) as executor:
future = executor.submit(task_fn, *args, **kwargs)
frame_idx = 0
while not future.done():
frame = SPINNER_FRAMES[frame_idx % len(SPINNER_FRAMES)]
sys.stdout.write(f"\r\033[K{full_prefix}{frame}")
sys.stdout.flush()
frame_idx += 1
time.sleep(0.08)
# Retrieve result or raise exception if task failed
result = future.result()
# Clear line and print final status
sys.stdout.write(f"\r\033[K{full_prefix}[DONE]\n")
sys.stdout.flush()
return result
def dummy_bundling():
"""Simulates bundling progress with progress bar updates."""
for i in range(0, 101, 10):
bar = draw_progress_bar(i)
sys.stdout.write(f"\r|-> Part 1 - Bundling {bar}")
sys.stdout.flush()
time.sleep(0.15)
return True
def dummy_file_check(filepath, is_hit=True):
time.sleep(0.5) # Simulate file checking / crawling work
status = "[HIT]" if is_hit else "[MISS]"
return f"{filepath} {status}"
def dummy_compile():
time.sleep(1.2) # Simulate compilation
return True
# --- Tree Visualizer & Main Execution ---
if __name__ == "__main__":
print("TEST OUT")
# 1. Custom Progress Task
dummy_bundling()
print() # newline after bundling finishes
# 2. Directory Tree Crawl & Checks
print("|- Troposphere")
print("| |- Troposphere_Lib")
# Perform file checks
hit_res = execute_task_with_spinner(
"troposphere_lib.c",
dummy_file_check,
"troposphere_lib.c",
True,
indent=10,
)
miss_res = execute_task_with_spinner(
"troposphere.version",
dummy_file_check,
"troposphere.version",
False,
indent=10,
)
# 3. Compile Step
execute_task_with_spinner(
"Part 6 - Compile Troposphere", dummy_compile, indent=10
)