pretty_print_success/attention/failure/yield, universal unicode fallbacks

This commit is contained in:
MaXFeeD
2025-04-11 14:18:17 +03:00
parent e7681c6e4c
commit 3f11247c3c
+55
View File
@@ -1,3 +1,5 @@
import os
import platform
from datetime import datetime, timedelta from datetime import datetime, timedelta
from io import StringIO from io import StringIO
from typing import (Any, Callable, Dict, List, Literal, NoReturn, Optional, from typing import (Any, Callable, Dict, List, Literal, NoReturn, Optional,
@@ -42,9 +44,13 @@ TOOLCHAIN_STYLE = {
"task.execute": "fg:ansibrightgreen bold", "task.execute": "fg:ansibrightgreen bold",
"print.answer": "fg:ansibrightblack", "print.answer": "fg:ansibrightblack",
"print.debug": "fg:ansibrightblack", "print.debug": "fg:ansibrightblack",
"print.yield": "fg:ansibrightblue",
"print.info": "fg:ansibrightgreen", "print.info": "fg:ansibrightgreen",
"print.success": "fg:ansibrightgreen",
"print.warn": "fg:ansibrightyellow", "print.warn": "fg:ansibrightyellow",
"print.attention": "fg:ansibrightyellow",
"print.error": "fg:ansibrightred", "print.error": "fg:ansibrightred",
"print.failure": "fg:ansibrightred",
"print.abort-message": "fg:ansibrightred bold", "print.abort-message": "fg:ansibrightred bold",
# interactables styling # interactables styling
@@ -65,6 +71,39 @@ TOOLCHAIN_STYLE = {
def get_toolchain_style() -> Style: def get_toolchain_style() -> Style:
return Style.from_dict(TOOLCHAIN_STYLE) return Style.from_dict(TOOLCHAIN_STYLE)
def is_unicode_supported() -> bool:
environ = os.environ
terminal = environ.get("TERM", "")
if platform.system() != "Windows":
return terminal != "linux" # Linux console (kernel)
return (
terminal in {
"xterm-256color",
"alacritty",
"rxvt-unicode",
"rxvt-unicode-256color"
}
or environ.get("TERM_PROGRAM") in {
"Terminus-Sublime",
"vscode"
}
or bool(environ.get("WT_SESSION")) # Windows Terminal
or bool(environ.get("TERMINUS_SUBLIME")) # Terminus (older versions)
or environ.get("ConEmuTask") == "{cmd::Cmder}" # ConEmu/cmder
or environ.get("TERMINAL_EMULATOR") == "JetBrains-JediTerm"
)
if is_unicode_supported():
UNICODE_CHECK_MARK = "✓"
UNICODE_POINTED_STAR = "✦"
UNICODE_BALLOT_X = "✗"
UNICODE_SNOWFLAKE = "❄"
else:
UNICODE_CHECK_MARK = "√"
UNICODE_POINTED_STAR = "i"
UNICODE_BALLOT_X = "×"
UNICODE_SNOWFLAKE = "*"
class InteractableMargin(Margin): class InteractableMargin(Margin):
def __init__( def __init__(
self, self,
@@ -823,6 +862,22 @@ def pretty_print_answer(prompt: AnyFormattedText, *values: object, sep: str=", "
pretty_print(prompt, end=prompt_end, file=file, flush=flush, include_default_pygments_style=include_default_pygments_style) pretty_print(prompt, end=prompt_end, file=file, flush=flush, include_default_pygments_style=include_default_pygments_style)
pretty_print(*values, style="class:print.answer", sep=sep, end=end, file=file, flush=flush, include_default_pygments_style=include_default_pygments_style) pretty_print(*values, style="class:print.answer", sep=sep, end=end, file=file, flush=flush, include_default_pygments_style=include_default_pygments_style)
def pretty_print_success(*values: object, sep: str = " ", end: Optional[str] = "\n", file: Optional[Any] = None, flush: bool = False, include_default_pygments_style: bool = False):
pretty_print(UNICODE_CHECK_MARK, style="class:print.success", end=" ")
pretty_print(*values, style="class:print.success", sep=sep, end=end, file=file, flush=flush, include_default_pygments_style=include_default_pygments_style)
def pretty_print_attention(*values: object, sep: str = " ", end: Optional[str] = "\n", file: Optional[Any] = None, flush: bool = False, include_default_pygments_style: bool = False):
pretty_print(UNICODE_POINTED_STAR, style="class:print.attention", end=" ")
pretty_print(*values, style="class:print.attention", sep=sep, end=end, file=file, flush=flush, include_default_pygments_style=include_default_pygments_style)
def pretty_print_failure(*values: object, sep: str = " ", end: Optional[str] = "\n", file: Optional[Any] = None, flush: bool = False, include_default_pygments_style: bool = False):
pretty_print(UNICODE_BALLOT_X, style="class:print.failure", end=" ")
pretty_print(*values, style="class:print.failure", sep=sep, end=end, file=file, flush=flush, include_default_pygments_style=include_default_pygments_style)
def pretty_print_yield(*values: object, sep: str = " ", end: Optional[str] = "\n", file: Optional[Any] = None, flush: bool = False, include_default_pygments_style: bool = False):
pretty_print(UNICODE_SNOWFLAKE, style="class:print.yield", end=" ")
pretty_print(*values, style="class:print.yield", sep=sep, end=end, file=file, flush=flush, include_default_pygments_style=include_default_pygments_style)
def abort(*values: object, sep: Optional[str] = " ", code: int = 255, cause: Optional[BaseException] = None) -> NoReturn: def abort(*values: object, sep: Optional[str] = " ", code: int = 255, cause: Optional[BaseException] = None) -> NoReturn:
if cause: if cause:
from traceback import print_exception from traceback import print_exception