Universal ANSI colorizer for Python (8/16 colors, 256-color, RGB, styles)
Project description
wrapcolor
Універсальний ANSI-«кольоризатор» для Python: простий спосіб стилізувати текст у консолі. Підтримує 8/16 базових кольорів, 256‑кольорову палітру (xterm) та TrueColor (RGB), а також стилі шрифту.
- Легкий і без залежностей (опційно: colorama для Windows)
- Зручний екземпляр color із готовими кодами та утилітами
- Працює з будь‑якою бібліотекою, що виводить у термінал (logging, click, argparse тощо)
Встановлення
pip install wrapcolor
# (опційно для Windows консоль/PowerShell)
pip install colorama
Якщо ви на Windows, рекомендовано ініціалізувати colorama на старті:
try:
from colorama import justFixWindowsConsole
justFixWindowsConsole()
except Exception:
pass
Швидкий старт
from wrapcolor import color
print(color.paint("Привіт!", fg="red", styles=["bold"]))
print(color.rgb(255, 100, 0) + "TrueColor текст" + color.reset)
print(color.bg_idx(24) + "Фон 256‑кольорів" + color.reset)
Приклади використання
1) Базові кольори тексту
from wrapcolor import color
print(color.red + "Червоний" + color.reset)
print(color.green + "Зелений" + color.reset)
print(color.bright_blue + "Яскраво‑синій" + color.reset)
2) Кольори фону
from wrapcolor import color
print(color.bg_yellow + color.black + "Чорний на жовтому" + color.reset)
print(color.bg_bright_red + color.white + "Білий на яскраво‑червоному" + color.reset)
3) Стилі шрифту
from wrapcolor import color
print(color.bold + "Жирний" + color.reset)
print(color.italic + "Курсив" + color.reset)
print(color.underline + "Підкреслений" + color.reset)
print(color.inverse + "Інверсія" + color.reset)
print(color.strike + "Закреслений" + color.reset)
4) Комбінування стилів і кольорів
from wrapcolor import color
print(color.red + color.bold + "Червоний жирний" + color.reset)
print(color.bright_green + color.underline + "Зелений підкреслений" + color.reset)
5) Зручний paint()
from wrapcolor import color
print(color.paint("OK", fg="green", styles=["bold"]))
print(color.paint("УВАГА", fg="bright_yellow", bg="bg_black", styles=["underline"]))
print(color.paint("ПОМИЛКА", fg="bright_white", bg="bg_red", styles=["bold"]))
Перевага paint() — воно автоматично додає reset наприкінці.
6) Шаблон wrap() для багаторазового використання
from wrapcolor import color
warn = color.wrap(color.bright_yellow + color.bold)
err = color.wrap(color.bg_red + color.white + color.bold)
print(warn.format("Попередження"))
print(err.format("Помилка"))
7) 256‑кольорів (xterm)
from wrapcolor import color
for i in range(16, 32):
print(color.idx(i) + f" idx({i}) " + color.reset, end=" ")
print()
for i in [196, 202, 208, 214, 220, 226]:
print(color.idx(i) + "●" + color.reset, end=" ")
print()
print(color.bg_idx(24) + color.bright_white + "Текст на фоні idx(24)" + color.reset)
8) TrueColor (RGB)
from wrapcolor import color
print(color.rgb(12, 200, 155) + "RGB передній план" + color.reset)
print(color.bg_rgb(20, 20, 20) + color.bright_cyan + "Яскравий на темному" + color.reset)
9) Допоміжні функції для статусів
from wrapcolor import color
def ok(msg):
return color.paint(msg, fg="green", styles=["bold"])
def warn(msg):
return color.paint(msg, fg="bright_yellow")
def err(msg):
return color.paint(msg, fg="bright_white", bg="bg_red", styles=["bold"])
print(ok("Готово"))
print(warn("Увага"))
print(err("Збій"))
10) Інтеграція з logging
import logging
from wrapcolor import color
class ColorFormatter(logging.Formatter):
LEVEL_COLOR = {
logging.DEBUG: color.dim,
logging.INFO: color.bright_green,
logging.WARNING: color.bright_yellow,
logging.ERROR: color.bright_red,
logging.CRITICAL: color.bg_red + color.white + color.bold,
}
def format(self, record):
base = super().format(record)
code = self.LEVEL_COLOR.get(record.levelno, "")
return f"{code}{base}{color.reset}" if code else base
h = logging.StreamHandler()
fmt = ColorFormatter("%(levelname)s: %(message)s")
h.setFormatter(fmt)
log = logging.getLogger("demo")
log.addHandler(h)
log.setLevel(logging.DEBUG)
log.debug("debug")
log.info("info")
log.warning("warning")
log.error("error")
log.critical("critical")
11) Поважайте NO_COLOR і TTY
import os, sys
from wrapcolor import color as _color
USE_COLOR = sys.stdout.isatty() and os.getenv("NO_COLOR") is None
class _NoColor:
reset = ""
bold = dim = italic = underline = inverse = strike = ""
black = red = green = yellow = blue = magenta = cyan = white = ""
bright_black = bright_red = bright_green = bright_yellow = ""
bright_blue = bright_magenta = bright_cyan = bright_white = ""
bg_black = bg_red = bg_green = bg_yellow = bg_blue = bg_magenta = bg_cyan = bg_white = ""
bg_bright_black = bg_bright_red = bg_bright_green = bg_bright_yellow = ""
bg_bright_blue = bg_bright_magenta = bg_bright_cyan = bg_bright_white = ""
@staticmethod
def idx(n): return ""
@staticmethod
def bg_idx(n): return ""
@staticmethod
def rgb(r,g,b): return ""
@staticmethod
def bg_rgb(r,g,b): return ""
@classmethod
def paint(cls, text, *, fg=None, bg=None, styles=None): return str(text)
@classmethod
def wrap(cls, code): return "{}"
color = _color if USE_COLOR else _NoColor()
print(color.paint("Це працює навіть без кольорів", fg="green"))
12) Підказки та нюанси
- Якщо поєднуєте коди вручну, не забудьте в кінці додати color.reset.
- paint() та wrap() самі додають reset, що зручно для безпечного форматування.
- Не всі термінали підтримують 256/TrueColor — на старих системах кольори можуть знижуватись.
Довідка API (скорочено)
Об’єкти й методи доступні з:
from wrapcolor import color, _Color
- Атрибути стилів: bold, dim, italic, underline, inverse, strike
- 8 кольорів переднього плану: black, red, green, yellow, blue, magenta, cyan, white
- Яскраві варіанти: bright_black .. bright_white
- Фон: bg_black .. bg_white, bg_bright_black .. bg_bright_white
- Методи:
- idx(n: int) -> str — 256‑кольорів (0..255), передній план
- bg_idx(n: int) -> str — 256‑кольорів (0..255), фон
- rgb(r,g,b) -> str — TrueColor (0..255) передній план
- bg_rgb(r,g,b) -> str — TrueColor (0..255) фон
- paint(text, *, fg=None, bg=None, styles=None) -> str — безпечно обгортає текст і додає reset
- wrap(code: str) -> str — повертає шаблон "{code}{}\x1b[0m" для багаторазового format()
Сумісність
- Python 3.10+
- Linux/macOS/Windows (для Windows бажано colorama)
Чому wrapcolor?
- Мінімалістичний інтерфейс: використовуй властивості або утиліти
- Не нав’язує залежностей
- Добре працює з існуючими бібліотеками
Ліцензія
MIT
Внесок
Issue/PR вітаються.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file wrapcolor-0.1.0.tar.gz.
File metadata
- Download URL: wrapcolor-0.1.0.tar.gz
- Upload date:
- Size: 7.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2ffd921663aca6c2cb38af61d6dde73080cc20454b54601bd5a7bae972f2b311
|
|
| MD5 |
2818b8b8818754db0e898ffd330d0e8f
|
|
| BLAKE2b-256 |
be055eddbddc4bcd29b71795d80fa2519a6c214c5747430f66913bba2c6c2fc5
|
Provenance
The following attestation bundles were made for wrapcolor-0.1.0.tar.gz:
Publisher:
publish.yml on datsiuk7/wrapcolor
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
wrapcolor-0.1.0.tar.gz -
Subject digest:
2ffd921663aca6c2cb38af61d6dde73080cc20454b54601bd5a7bae972f2b311 - Sigstore transparency entry: 622055897
- Sigstore integration time:
-
Permalink:
datsiuk7/wrapcolor@ebaab0f8298bb63d30ecdefbc6a7b23f061c7c06 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/datsiuk7
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ebaab0f8298bb63d30ecdefbc6a7b23f061c7c06 -
Trigger Event:
push
-
Statement type:
File details
Details for the file wrapcolor-0.1.0-py3-none-any.whl.
File metadata
- Download URL: wrapcolor-0.1.0-py3-none-any.whl
- Upload date:
- Size: 6.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2281ab4eb45c239f7c0afd7febc6f89ff1325104f0a00f0ffe5ccef1274d71f3
|
|
| MD5 |
f213c4e68ad5fcf65a70c3a970350403
|
|
| BLAKE2b-256 |
673ef53c497fa412b21979b2e8e58c9511f911ba0dc89d1dbf2d359eabab34ea
|
Provenance
The following attestation bundles were made for wrapcolor-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on datsiuk7/wrapcolor
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
wrapcolor-0.1.0-py3-none-any.whl -
Subject digest:
2281ab4eb45c239f7c0afd7febc6f89ff1325104f0a00f0ffe5ccef1274d71f3 - Sigstore transparency entry: 622055902
- Sigstore integration time:
-
Permalink:
datsiuk7/wrapcolor@ebaab0f8298bb63d30ecdefbc6a7b23f061c7c06 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/datsiuk7
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ebaab0f8298bb63d30ecdefbc6a7b23f061c7c06 -
Trigger Event:
push
-
Statement type: