mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			112 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from __future__ import annotations
 | 
						|
import io
 | 
						|
import os
 | 
						|
import sys
 | 
						|
 | 
						|
COLORIZE = True
 | 
						|
 | 
						|
# types
 | 
						|
if False:
 | 
						|
    from typing import IO
 | 
						|
 | 
						|
 | 
						|
class ANSIColors:
 | 
						|
    RESET = "\x1b[0m"
 | 
						|
 | 
						|
    BLACK = "\x1b[30m"
 | 
						|
    BLUE = "\x1b[34m"
 | 
						|
    CYAN = "\x1b[36m"
 | 
						|
    GREEN = "\x1b[32m"
 | 
						|
    MAGENTA = "\x1b[35m"
 | 
						|
    RED = "\x1b[31m"
 | 
						|
    WHITE = "\x1b[37m"  # more like LIGHT GRAY
 | 
						|
    YELLOW = "\x1b[33m"
 | 
						|
 | 
						|
    BOLD_BLACK = "\x1b[1;30m"  # DARK GRAY
 | 
						|
    BOLD_BLUE = "\x1b[1;34m"
 | 
						|
    BOLD_CYAN = "\x1b[1;36m"
 | 
						|
    BOLD_GREEN = "\x1b[1;32m"
 | 
						|
    BOLD_MAGENTA = "\x1b[1;35m"
 | 
						|
    BOLD_RED = "\x1b[1;31m"
 | 
						|
    BOLD_WHITE = "\x1b[1;37m"  # actual WHITE
 | 
						|
    BOLD_YELLOW = "\x1b[1;33m"
 | 
						|
 | 
						|
    # intense = like bold but without being bold
 | 
						|
    INTENSE_BLACK = "\x1b[90m"
 | 
						|
    INTENSE_BLUE = "\x1b[94m"
 | 
						|
    INTENSE_CYAN = "\x1b[96m"
 | 
						|
    INTENSE_GREEN = "\x1b[92m"
 | 
						|
    INTENSE_MAGENTA = "\x1b[95m"
 | 
						|
    INTENSE_RED = "\x1b[91m"
 | 
						|
    INTENSE_WHITE = "\x1b[97m"
 | 
						|
    INTENSE_YELLOW = "\x1b[93m"
 | 
						|
 | 
						|
    BACKGROUND_BLACK = "\x1b[40m"
 | 
						|
    BACKGROUND_BLUE = "\x1b[44m"
 | 
						|
    BACKGROUND_CYAN = "\x1b[46m"
 | 
						|
    BACKGROUND_GREEN = "\x1b[42m"
 | 
						|
    BACKGROUND_MAGENTA = "\x1b[45m"
 | 
						|
    BACKGROUND_RED = "\x1b[41m"
 | 
						|
    BACKGROUND_WHITE = "\x1b[47m"
 | 
						|
    BACKGROUND_YELLOW = "\x1b[43m"
 | 
						|
 | 
						|
    INTENSE_BACKGROUND_BLACK = "\x1b[100m"
 | 
						|
    INTENSE_BACKGROUND_BLUE = "\x1b[104m"
 | 
						|
    INTENSE_BACKGROUND_CYAN = "\x1b[106m"
 | 
						|
    INTENSE_BACKGROUND_GREEN = "\x1b[102m"
 | 
						|
    INTENSE_BACKGROUND_MAGENTA = "\x1b[105m"
 | 
						|
    INTENSE_BACKGROUND_RED = "\x1b[101m"
 | 
						|
    INTENSE_BACKGROUND_WHITE = "\x1b[107m"
 | 
						|
    INTENSE_BACKGROUND_YELLOW = "\x1b[103m"
 | 
						|
 | 
						|
 | 
						|
NoColors = ANSIColors()
 | 
						|
 | 
						|
for attr in dir(NoColors):
 | 
						|
    if not attr.startswith("__"):
 | 
						|
        setattr(NoColors, attr, "")
 | 
						|
 | 
						|
 | 
						|
def get_colors(
 | 
						|
    colorize: bool = False, *, file: IO[str] | IO[bytes] | None = None
 | 
						|
) -> ANSIColors:
 | 
						|
    if colorize or can_colorize(file=file):
 | 
						|
        return ANSIColors()
 | 
						|
    else:
 | 
						|
        return NoColors
 | 
						|
 | 
						|
 | 
						|
def can_colorize(*, file: IO[str] | IO[bytes] | None = None) -> bool:
 | 
						|
    if file is None:
 | 
						|
        file = sys.stdout
 | 
						|
 | 
						|
    if not sys.flags.ignore_environment:
 | 
						|
        if os.environ.get("PYTHON_COLORS") == "0":
 | 
						|
            return False
 | 
						|
        if os.environ.get("PYTHON_COLORS") == "1":
 | 
						|
            return True
 | 
						|
    if os.environ.get("NO_COLOR"):
 | 
						|
        return False
 | 
						|
    if not COLORIZE:
 | 
						|
        return False
 | 
						|
    if os.environ.get("FORCE_COLOR"):
 | 
						|
        return True
 | 
						|
    if os.environ.get("TERM") == "dumb":
 | 
						|
        return False
 | 
						|
 | 
						|
    if not hasattr(file, "fileno"):
 | 
						|
        return False
 | 
						|
 | 
						|
    if sys.platform == "win32":
 | 
						|
        try:
 | 
						|
            import nt
 | 
						|
 | 
						|
            if not nt._supports_virtual_terminal():
 | 
						|
                return False
 | 
						|
        except (ImportError, AttributeError):
 | 
						|
            return False
 | 
						|
 | 
						|
    try:
 | 
						|
        return os.isatty(file.fileno())
 | 
						|
    except io.UnsupportedOperation:
 | 
						|
        return hasattr(file, "isatty") and file.isatty()
 |