coding style: Extract the paging code into its own context manager

This commit is contained in:
Andrew Hamilton 2025-06-10 16:57:44 +10:00
parent 4c68e226bf
commit ce224275e9

View file

@ -1109,20 +1109,26 @@ def manage_cache(root_path):
gitignore_file.write("*") gitignore_file.write("*")
@contextlib.contextmanager
def print_to_pager(pager_command=["less", "-RFEX"]):
try:
pager_process = subprocess.Popen(pager_command, stdin=subprocess.PIPE, text=True)
except FileNotFoundError:
yield
else:
with contextlib.redirect_stdout(pager_process.stdin):
yield
pager_process.stdin.close()
pager_process.wait()
def print_tool_info(): def print_tool_info():
extensions_for_tool = {} extensions_for_tool = {}
for extensions, tools_ in tools.TOOLS_FOR_EXTENSIONS: for extensions, tools_ in tools.TOOLS_FOR_EXTENSIONS:
for extension in extensions: for extension in extensions:
for tool in tools_: for tool in tools_:
extensions_for_tool.setdefault(tool, {extension}).add(extension) extensions_for_tool.setdefault(tool, {extension}).add(extension)
pager_process = None with print_to_pager():
if shutil.which("less"):
pager_process = subprocess.Popen(["less", "-RFEX"],
stdin=subprocess.PIPE, text=True)
output_file = pager_process.stdin
else:
output_file = sys.stdout
with contextlib.redirect_stdout(output_file):
for tool in sorted(tools.tools_all(), key=lambda t: t.__name__): for tool in sorted(tools.tools_all(), key=lambda t: t.__name__):
print(termstr.TermStr(tool.__name__, is_bold=True) if tools.is_tool_available(tool) print(termstr.TermStr(tool.__name__, is_bold=True) if tools.is_tool_available(tool)
else termstr.TermStr(tool.__name__, fg_color=termstr.Color.red) + " (not available)") else termstr.TermStr(tool.__name__, fg_color=termstr.Color.red) + " (not available)")
@ -1134,9 +1140,6 @@ def print_tool_info():
extensions = list(extensions_for_tool.get(tool, {"*"})) extensions = list(extensions_for_tool.get(tool, {"*"}))
print("extensions:", ", ".join(extensions)) print("extensions:", ", ".join(extensions))
print("") print("")
if pager_process is not None:
output_file.close()
pager_process.wait()
def install_all_tools(): def install_all_tools():