A simple, powerful, and cross-platform Python library for adding colors, styles, and rich markup support to your terminal output. Optimized for **Windows 10+**, Linux, and macOS.
Project description
๐จ make_colors
A simple, powerful, and cross-platform Python library for adding colors, styles, rich markup support, and beautiful tables to your terminal output. Optimized for Windows 10+, Linux, and macOS.
๐ Table of Contents
- โจ Features
- ๐ฆ Installation
- ๐ Quick Start
- ๐จ Color Reference
- ๐ก Usage Examples
- ๐ Table Module
- ๐ Environment Variables
- ๐ API Reference
- ๐ Rich Markup Support
- ๐ฅ๏ธ Platform Support
- ๐ ๏ธ Development & Testing
- ๐ฏ Best Practices
- โ ๏ธ Error Handling
- ๐ Performance
- ๐ Quick Reference
- ๐ค Contributing
- ๐ License
- ๐จโ๐ป Author
โจ Features
- ๐ฅ๏ธ Cross-platform support โ Works on Windows, Linux, and macOS
- ๐ฏ Windows 10+ optimized โ Uses native ANSI processing on Windows Console
- ๐ Rich color palette โ 16 standard colors with light variants
- ๐ Simple syntax โ Full names, abbreviations, and combined formats
- ๐ง Flexible formatting โ Foreground, background, and text attributes
- ๐ Rich markup โ Parse and render
[red]Error[/]or[bold white on red]CRITICAL[/] - ๐ Table support โ Create beautiful colored tables with Rich-style API
- ๐ Lightweight โ Zero external dependencies
- ๐๏ธ Environment control โ Enable/disable colors globally with env vars
- ๐ก Error handling โ Graceful fallbacks when unsupported colors are used
๐ฆ Installation
pip install make_colors
๐ Quick Start
from make_colors import make_colors
# Simple colored text
print(make_colors("Hello World!", "red"))
# Text with background
print(make_colors("Important Message", "white", "red"))
# Using shortcuts
print(make_colors("Quick and easy", "r", "bl")) # red text, blue background
# Using underscore notation
print(make_colors("One-liner style", "green_yellow")) # green text on yellow background
# Rich markup
print(make_colors("[bold white on red] CRITICAL [/]"))
# Import all
from make_colors import *
print(bl("Im Blue"))
color = Colors('red', 'white')
print(color("White on Red"))
color = Color('white', 'red')
print(color("TEST"))
# Create beautiful tables
from make_colors.table import Table
table = Table(title="Server Status", title_style="bold cyan")
table.add_column("Service", style="bold")
table.add_column("Status", style="green")
table.add_column("Uptime", style="yellow")
table.add_row("Web Server", "โ Running", "15d 6h")
table.add_row("Database", "โ Running", "15d 6h")
table.add_row("Cache", "โ Warning", "2d 3h", style="yellow")
print(table.draw())
๐จ Color Reference
Available Colors
| Color Name | Shortcuts | Light Variant | Light Shortcut |
|---|---|---|---|
| black | b, bk | lightblack | lb |
| red | r, rd, re | lightred | lr |
| green | g, gr, ge | lightgreen | lg |
| yellow | y, ye, yl | lightyellow | ly |
| blue | bl | lightblue | lb |
| magenta | m, mg, ma | lightmagenta | lm |
| cyan | c, cy, cn | lightcyan | lc |
| white | w, wh, wi, wt | lightwhite | lw |
Color Preview
# Standard colors
print(make_colors("โ Black text", "black"))
print(make_colors("โ Red text", "red"))
print(make_colors("โ Green text", "green"))
print(make_colors("โ Yellow text", "yellow"))
print(make_colors("โ Blue text", "blue"))
print(make_colors("โ Magenta text", "magenta"))
print(make_colors("โ Cyan text", "cyan"))
print(make_colors("โ White text", "white"))
# Light variants
print(make_colors("โ Light Red", "lightred"))
print(make_colors("โ Light Green", "lightgreen"))
print(make_colors("โ Light Blue", "lightblue"))
print(make_colors("โ Light Yellow", "lightyellow"))
๐ก Usage Examples
Basic Usage
print(make_colors("Full color names", "red", "white"))
print(make_colors("Using shortcuts", "r", "w"))
print(make_colors("Mixed notation", "red", "w"))
Separator Notation
# Using underscore separator
print(make_colors("Error occurred!", "red_white"))
print(make_colors("Success!", "green_black"))
print(make_colors("Warning!", "yellow_red"))
# Using dash separator
print(make_colors("Info message", "blue-white"))
print(make_colors("Debug info", "cyan-black"))
# Using comma separator
print(make_colors("Critical message", "white,blue"))
print(make_colors("Alert info", "w,r"))
Advanced Examples
# System status display
def show_status(service, status):
if status == "running":
return make_colors(f"[โ] {service}", "lightgreen", "black")
elif status == "stopped":
return make_colors(f"[โ] {service}", "lightred", "black")
else:
return make_colors(f"[?] {service}", "lightyellow", "black")
print(show_status("Web Server", "running"))
print(show_status("Database", "stopped"))
print(show_status("Cache", "unknown"))
# Log level formatting
def log_message(level, message):
colors = {
"ERROR": ("lightwhite", "red"),
"WARNING": ("black", "yellow"),
"INFO": ("lightblue", "black"),
"DEBUG": ("lightgrey", "black")
}
fg, bg = colors.get(level, ("white", "black"))
return f"{make_colors(f' {level} ', fg, bg)} {message}"
print(log_message("ERROR", "Connection failed"))
print(log_message("WARNING", "Deprecated method used"))
print(log_message("INFO", "Server started successfully"))
print(log_message("DEBUG", "Variable value: 42"))
Attributes
print(make_colors("Bold text", "red", attrs=["bold"]))
print(make_colors("Underlined", "blue", attrs=["underline"]))
print(make_colors("Italic + Bold", "green", attrs=["italic", "bold"]))
Progress Bar Indicators
import time
for i in range(0, 101, 20):
bar = "โ" * (i // 5) + "โ" * (20 - i // 5)
print(f"\r{make_colors(f'[{bar}] {i}%', 'yellow')}", end="")
time.sleep(0.2)
print()
def progress_bar(current, total, width=50):
percentage = current / total
filled = int(width * percentage)
bar = "โ" * filled + "โ" * (width - filled)
if percentage < 0.5:
color = "red"
elif percentage < 0.8:
color = "yellow"
else:
color = "green"
return make_colors(f"[{bar}] {current}/{total} ({percentage:.1%})", color)
# Simulate progress
for i in range(0, 101, 10):
print(f"\r{progress_bar(i, 100)}", end="", flush=True)
time.sleep(0.1)
print() # New line after completion
Menu Systems
def create_menu():
options = [
("1", "Start Application", "green"),
("2", "Settings", "yellow"),
("3", "Help", "blue"),
("4", "Exit", "red")
]
print(make_colors(" ๐ฏ Main Menu ", "white", "blue"))
print()
for key, option, color in options:
print(f" {make_colors(key, 'white', color)} {option}")
print()
return input("Select option: ")
# Usage
choice = create_menu()
๐ Table Module
Create beautiful, colored tables with a Rich-style API!
Quick Start
from make_colors.table import Table
# Rich-style API
table = Table(title="[bold cyan]Package Info[/]", header_style="bold white")
table.add_column("Package", style="bold")
table.add_column("Version", style="green")
table.add_column("Status", style="yellow")
table.add_row("numpy", "1.21.0", "โ OK")
table.add_row("pandas", "1.3.0", "โ Update", style="bold yellow")
table.add_row("requests", "2.26.0", "โ OK")
print(table.draw())
Table Features
- โ
Rich-style API -
add_column()andadd_row() - โ Traditional API - Compatible with classic table libraries
- โ
Rich markup support - Use
[color]text[/]in headers and cells - โ Column styling - Set colors per column
- โ Row styling - Set colors per row
- โ Flexible alignment - Left, center, right alignment
- โ Data type formatting - Auto-format numbers, floats, text
- โ All make_colors formats - Abbreviations, full names, attributes
Table API Reference
Creating a Table
from make_colors.table import Table
# With title and styles
table = Table(
title="My Report",
title_style="bold cyan", # or "bold-cyan"
header_style="bold white", # or "bold-white"
max_width=80 # 0 for unlimited
)
Rich-style API
# Add columns with styling
table.add_column("Name", style="bold", align="l")
table.add_column("Price", style="green", align="r", dtype="f")
table.add_column("Stock", style="cyan", align="r", dtype="i")
table.add_column("Status", style="yellow", align="c")
# Add rows with optional styling
table.add_row("Product A", 99.99, 150, "Available")
table.add_row("Product B", 149.99, 0, "Out of Stock", style="bold red")
table.add_row("Product C", 199.99, 75, "Low Stock", style="yellow")
Traditional API
# Set column properties
table.set_cols_align(["l", "r", "r", "c"])
table.set_cols_valign(["t", "m", "b", "t"])
table.set_cols_dtype(["t", "f", "i", "t"])
table.set_cols_width([20, 10, 10, 15])
# Set column colors (NEW!)
table.set_cols_color(["bold", "green", "cyan", "yellow"])
table.set_cols_color(["y", "r", "c", "g"]) # Using abbreviations
# Set row colors (NEW!)
table.set_rows_color(["green", "yellow", "bold-red", None])
# Set header
table.header(["Name", "Price", "Stock", "Status"])
# Add rows
table.add_row("Product A", 99.99, 150, "Available")
table.add_row("Product B", 149.99, 0, "Out of Stock")
Rich Markup in Tables
Tables support Rich markup in headers, cells, and titles:
# Rich markup in title
table = Table(title="[bold cyan]Server Status[/]")
# Rich markup in column headers
table.add_column("[bold white]Service[/]")
table.add_column("[white on blue]Status[/]")
table.add_column("[white on green]Uptime[/]")
# Rich markup in cells
table.add_row("[bold]Web Server[/]", "โ Running", "15d 6h")
Table Examples
Example 1: Package Version Checker
from make_colors.table import Table
table = Table(title="Package Version Checker", title_style="bold cyan")
table.add_column("Package", style="bold")
table.add_column("Installed", style="cyan")
table.add_column("Required", style="magenta")
table.add_column("Status", style="yellow")
table.add_row("numpy", "1.21.0", "1.20.0", "โ OK")
table.add_row("pandas", "1.3.0", "1.4.0", "โ Update", style="bold yellow")
table.add_row("requests", "2.26.0", "2.26.0", "โ OK")
table.add_row("flask", "1.1.0", "2.0.0", "โ Old", style="bold red")
print(table.draw())
Example 2: System Monitor with Column Colors
table = Table()
table.set_cols_align(["l", "c", "r", "r"])
table.set_cols_color(["bold-white", "cyan", "yellow", "magenta"])
table.header(["Service", "Status", "CPU %", "Memory %"])
table.add_row("Web Server", "โ Running", "45.2", "62.8")
table.add_row("Database", "โ Running", "78.5", "85.3")
table.add_row("Cache", "โ Warning", "92.1", "95.7")
print(table.draw())
Example 3: Status-based Row Coloring
table = Table(title="Task Status", title_style="bold-cyan")
table.header(["Task", "Status", "Progress", "Priority"])
table.add_row("Deploy to Production", "โ Complete", "100%", "High")
table.add_row("Code Review", "โ In Progress", "75%", "Medium")
table.add_row("Write Tests", "โ Pending", "0%", "High")
table.add_row("Fix Bug #123", "โ Blocked", "30%", "Critical")
# Color rows based on status
table.set_rows_color([
"bold-green", # Complete
"bold-yellow", # In Progress
"dim", # Pending
"bold-red" # Blocked
])
print(table.draw())
Example 4: Rich Markup Headers
table = Table(title="[bold magenta]Sales Dashboard[/]")
table.add_column("[bold white]Product[/]", align="l")
table.add_column("[bold green]Revenue[/]", align="r", dtype="f")
table.add_column("[white on blue]Units Sold[/]", align="r", dtype="i")
table.add_column("[bold yellow on black]Trend[/]", align="c")
table.add_row("Widget A", 125000.50, 1234, "๐ Up")
table.add_row("Widget B", 89000.25, 890, "๐ Down", style="dim")
table.add_row("Widget C", 250000.00, 2500, "๐ฅ Hot", style="bold-green")
print(table.draw())
Example 5: Alternating Row Colors (Zebra Striping)
table = Table(title="User List", title_style="bold-cyan")
table.header(["ID", "Username", "Email", "Status"])
users = [
["001", "john_doe", "john@example.com", "Active"],
["002", "jane_smith", "jane@example.com", "Active"],
["003", "bob_wilson", "bob@example.com", "Inactive"],
["004", "alice_brown", "alice@example.com", "Active"],
["005", "charlie_davis", "charlie@example.com", "Active"],
]
for user in users:
table.add_row(*user)
# Alternate between dim and normal
table.set_rows_color(["dim", None, "dim", None, "dim"])
print(table.draw())
Table Styling Options
Alignment
# Horizontal: "l" (left), "c" (center), "r" (right)
table.set_cols_align(["l", "c", "r"])
# Vertical: "t" (top), "m" (middle), "b" (bottom)
table.set_cols_valign(["t", "m", "b"])
Data Types
# "a" (auto), "t" (text), "f" (float), "e" (exponential), "i" (integer)
table.set_cols_dtype(["t", "f", "i", "a"])
Border Styles
# Customize border characters
table.set_chars(['-', '|', '+', '=']) # [horiz, vert, corner, header]
# Control decorations
table.set_deco(Table.BORDER | Table.HEADER) # Border + header line only
table.set_deco(Table.VLINES | Table.HLINES) # Only lines, no border
Color Format Support in Tables
All make_colors formats are supported:
# Full names
table.set_cols_color(["red", "green", "blue"])
# Abbreviations
table.set_cols_color(["r", "g", "bl"])
# With attributes
table.set_cols_color(["bold-red", "italic-cyan", "dim-yellow"])
# With background
table.set_cols_color(["white-red", "black-yellow", "green-black"])
# Mixed formats
table.set_cols_color(["bold-white", "r", "italic-cyan", "lb-b"])
๐ Environment Variables
| Variable | Values | Description |
|---|---|---|
MAKE_COLORS |
0 or 1 |
Disable/enable colors globally |
MAKE_COLORS_FORCE |
0, 1, True |
Force colors even when unsupported |
MAKE_COLORS_DEBUG |
1, true, True |
Enable debug parsing logs |
Example:
import os
# Disable colors
os.environ['MAKE_COLORS'] = '0'
print(make_colors("No colors", "red")) # Output: "No colors" (no coloring)
# Force colors (useful for CI/CD or redirected output)
os.environ['MAKE_COLORS_FORCE'] = '1'
print(make_colors("Forced colors", "green")) # Always colored
๐ API Reference
make_colors(string, foreground='white', background=None, attrs=[], force=False)
Main function to colorize strings with ANSI or Rich markup.
string(str) โ Input text, supports Rich markup like[red]Error[/]foreground(str) โ Foreground colorbackground(str|None) โ Background colorattrs(list) โ List of attributes:bold,underline,italic, etc.force(bool) โ Force enable colors
Returns:
str(Colorized string with ANSI escape codes)
make_color(...)
Alias for make_colors.
print(string, ...)
Convenience print wrapper that applies make_colors before printing.
parse_rich_markup(text)
Parses strings like [bold red on black]Hello[/] into (content, fg, bg, style) tuples. Supports multiple tags.
getSort(data, foreground, background)
Parses combined formats like red-yellow, g_b, expanding into (fg, bg).
color_map(code)
Maps abbreviations like r, bl, lg to full names.
Examples:
# Basic usage
make_colors("Hello", "red")
# With background
make_colors("Hello", "white", "red")
# Using shortcuts
make_colors("Hello", "w", "r")
# Separator notation
make_colors("Hello", "white_red")
# Force colors
make_colors("Hello", "red", force=True)
MakeColors class
colored(string, fg, bg, attrs)โ low-level ANSI outputrich_colored(string, color, bg, style)โ Rich style supportsupports_color()โ Detect terminal support, return:bool: True if colors are supported, False otherwise
from make_colors import MakeColors
if MakeColors.supports_color():
print("Colors are supported!")
else:
print("Colors not supported on this terminal")
Exceptions
MakeColorsErrorโ Raised when invalid colors are usedMakeColorsWarningโ Non-critical fallback warnings
๐ Rich Markup Support
The library supports Rich-style markup similar to the rich package:
print(make_colors("[red]Error[/] [bold white on blue]CRITICAL[/] [green]OK[/]"))
Supported styles:
- bold, italic, underline, dim, blink, reverse, strikethrough
# Using console
from make_colors import Console
console = Console()
console.print("[white on red]This is Example ERROR ![/]")
๐ฅ๏ธ Platform Support
Windows
- Windows 10+ โ (full ANSI support)
- Older Windows โ ๏ธ requires ANSICON
- Windows Terminal: ๐ Excellent support with all features
Linux/Unix
- Most terminals: โ Full support (xterm, gnome-terminal, konsole, etc.), almost all terminals supported
- Tmux/Screen: โ Supported
- SSH sessions: โ Supported when terminal supports colors
macOS
- Terminal.app: โ Full support
- iTerm2: โ Excellent support
- Other terminals: โ Generally well supported
๐ ๏ธ Development & Testing
Testing Colors
def test_all_colors():
"""Test all available colors"""
colors = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white']
light_colors = [f'light{color}' for color in colors if color != 'black'] + ['lightgrey']
print("=== Standard Colors ===")
for color in colors:
print(make_colors(f" {color.ljust(10)}", color, "black"))
print("\n=== Light Colors ===")
for color in light_colors:
print(make_colors(f" {color.ljust(15)}", color, "black"))
# Run the test
test_all_colors()
Check Support
from make_colors import MakeColors
print("Supports colors:", MakeColors.supports_color())
def test_all_colors():
"""Test all available colors"""
colors = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white']
light_colors = [f'light{color}' for color in colors if color != 'black'] + ['lightgrey']
print("=== Standard Colors ===")
for color in colors:
print(make_colors(f" {color.ljust(10)}", color, "black"))
print("\n=== Light Colors ===")
for color in light_colors:
print(make_colors(f" {color.ljust(15)}", color, "black"))
# Run the test
test_all_colors()
### Testing Tables
```python
from make_colors.table import Table
# Test basic table
table = Table()
table.header(["Column 1", "Column 2", "Column 3"])
table.add_row("Data 1", "Data 2", "Data 3")
print(table.draw())
# Test colored table
table = Table(title="Test Table", title_style="bold cyan")
table.add_column("Name", style="bold")
table.add_column("Value", style="green")
table.add_row("Test", "Success", style="green")
print(table.draw())
๐ฏ Best Practices
- Always check color support
MakeColors.supports_color()before production use - Provide fallbacks for environments without color support (e.g. plain text when disabled)
- Use env vars for CI/CD or logging
- Choose contrasting colors for better readability
- Test on multiple OSes/terminals/platforms to ensure compatibility
- Use tables for structured data - Tables make data more readable and professional
from make_colors import make_colors, MakeColors
def safe_print(text, fg="white", bg=None):
"""Safely print colored text with fallback"""
if MakeColors.supports_color():
print(make_colors(text, fg, bg))
else:
print(f"[{fg.upper()}] {text}")
# Usage
safe_print("This works everywhere!", "green")
๐ง Magick
from make_colors import *
print(red("Error!"))
print(bl("Im Blue"))
print(green_on_black("Success"))
# Abbreviation
print(w_bl("White on Blue")) # white on blue
print(r_w("Red on White")) # red on white
print(g_b("Green on Black")) # green on black
print(lb_b("Light Blue on Black"))
color = Colors('red', 'white')
print(color("White on Red"))
color = Color('white', 'red')
print(color("TEST"))
# Try and see what happened ๐ ๐
โ ๏ธ Error Handling
- Invalid color โ falls back to white on black
- Unknown attribute โ ignored silently
- Raise
MakeColorsErrorfor invalid color names (if strict) - Raise
MakeColorsWarningfor warnings
try:
print(make_colors("Oops", "notacolor"))
except Exception as e:
print("Handled:", e)
๐ Performance
- Traditional call: ~0.00001s per render
- Rich markup parsing: slightly slower (~+10โ15%)
- Table rendering: Optimized for large datasets
- Suitable for high-frequency logging and data visualization
๐ Quick Reference
Colors
- โ
Single color:
[red]text[/] - โ
With background:
[white on red]text[/] - โ
With style:
[bold green]text[/] - โ
Combined:
[bold white on red]ALERT[/] - โ
Multiple tags:
[cyan]Info[/] [red]Error[/]
Tables
- โ
Rich-style:
table.add_column("Name", style="bold") - โ
Rich markup:
table.add_column("[white on blue]Status[/]") - โ
Column colors:
table.set_cols_color(["r", "g", "b"]) - โ
Row colors:
table.set_rows_color(["green", "yellow", "red"]) - โ
Styling rows:
table.add_row(..., style="bold red")
๐ค Contributing
PRs welcome! Open issues for feature requests or bugs. Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
๐ License
Licensed under the MIT License. See LICENSE.
๐จโ๐ป Author
Hadi Cahyadi ๐ง cumulus13@gmail.com
โจ Made with โค๏ธ by Hadi Cahyadi for colorful terminal experiences!
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 make_colors-3.48.7.tar.gz.
File metadata
- Download URL: make_colors-3.48.7.tar.gz
- Upload date:
- Size: 52.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
337ae53abc5ddced8c41c0fb74bd45b2a7bda0c66cbbcd35bb9afe49a3c8f51d
|
|
| MD5 |
c112b440fd0fd26ec8d025cb661b13a3
|
|
| BLAKE2b-256 |
b178ef094c4022137ba903a33a0c5c86e1241774b5d51b33b9c87c9233c38cd7
|
File details
Details for the file make_colors-3.48.7-py2.py3-none-any.whl.
File metadata
- Download URL: make_colors-3.48.7-py2.py3-none-any.whl
- Upload date:
- Size: 65.1 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
44b399fb2216f70c47cb059088dc361c33673add5a648c1024fb75fe840f9dd8
|
|
| MD5 |
0d0abae28d8b02986e9872d6ad3cba0d
|
|
| BLAKE2b-256 |
65f97761bcd4494e86798a38ae89c0a1ad06490a33f028ce1caf0c8e18e340ce
|