A Python CLI framework built on Click, with self-spacing components and Rich theming
Project description
Clicycle
Component-based CLI rendering with automatic spacing and Rich styling
Clicycle makes beautiful CLIs easy by treating terminal output as composable components.
Installation
pip install clicycle
Quick Start
import clicycle as cc
import time
# Display header
cc.header("My App", "v2.0.0")
# Show messages
cc.info("Starting process...")
# Use a spinner
with cc.spinner("Processing..."):
time.sleep(2)
cc.success("Complete!")
API Reference
Display Functions
# Text messages
cc.info("Information message")
cc.success("Operation successful")
cc.error("Something went wrong")
cc.warning("Be careful")
cc.list_item("Bullet point")
# Structure
cc.header("Title", "Subtitle", "App Name")
cc.section("Section Name")
# Data display
cc.table([{"Name": "Alice", "Age": 30}], title="Users")
cc.code("print('hello')", language="python", title="Example")
cc.json({"key": "value"}, title="Config")
# Progress indicators (context managers)
with cc.spinner("Loading..."):
# Your code here
pass
with cc.progress("Processing") as prog:
for i in range(100):
prog.update(i, f"Item {i}")
# Multi-task progress tracking
with cc.multi_progress("Processing tasks") as progress:
task1 = progress.add_task("Download", total=100)
task2 = progress.add_task("Process", total=100)
for i in range(100):
progress.update(task1, advance=1)
progress.update(task2, advance=1)
# Interactive components (with automatic fallback)
selected = cc.select("Choose an option", ["Option 1", "Option 2", "Option 3"])
selected_many = cc.multi_select("Select features", ["Auth", "API", "Cache", "Queue"])
# Group components without spacing
with cc.group():
cc.info("These lines")
cc.success("appear together")
cc.warning("without spacing")
Configuration
# Configure the default instance
cc.configure(
width=100,
theme=cc.Theme(
disappearing_spinners=True, # Spinners vanish when done
spinner_type="dots2" # Rich spinner style
),
app_name="MyApp"
)
# Direct access
cc.console.print("Rich console access")
cc.theme.icons.success = "✅"
cc.clear() # Clear screen
Debug Messages and Logging
For debug messages, use Python's standard logging module:
import logging
# Configure logging level based on command line flag
if '--debug' in sys.argv:
logging.basicConfig(level=logging.DEBUG)
else:
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Use standard logging for debug messages
logger.debug("This only appears when logging level is DEBUG")
cc.info("This always appears")
Themes
Create custom themes to control appearance:
from clicycle import Theme, Icons, Typography
theme = Theme(
# Custom icons
icons=Icons(
success="✅",
error="❌",
warning="⚠️",
info="ℹ️",
),
# Custom styles (Rich format)
typography=Typography(
header_style="bold cyan",
success_style="bold green",
error_style="bold red",
),
# Spinner configuration
disappearing_spinners=True,
spinner_type="dots2" # dots, line, star, etc.
)
cc.configure(theme=theme)
Component Architecture
For advanced use cases, work directly with components:
from clicycle import Clicycle
from clicycle.components.header import Header
from clicycle.components.spinner import Spinner
# Create instance
cli = Clicycle()
# Render components
cli.stream.render(Header(cli.theme, "Title"))
# Components manage their own spacing
spinner = Spinner(cli.theme, "Loading...", cli.console)
cli.stream.render(spinner)
with spinner:
# Your code
pass
Key Features
- Automatic Spacing: Components intelligently manage spacing based on context
- Disappearing Spinners: Spinners that completely vanish after completion
- Interactive Components: Arrow-key navigation with automatic fallback
- Rich Integration: Full support for Rich styling and formatting
- Component Discovery: Convenience API automatically discovers all components
- Type Safe: Full type hints for IDE support
Interactive Components
Clicycle provides smooth, responsive interactive components with vertical arrow-key navigation:
Select Menu
# Simple selection
choice = cc.select("Choose a framework:", ["React", "Vue", "Angular"])
# With descriptions and values
options = [
{"label": "React", "value": "react", "description": "A JavaScript library"},
{"label": "Vue", "value": "vue", "description": "The Progressive JavaScript Framework"},
{"label": "Angular", "value": "angular", "description": "Platform for building mobile and desktop apps"}
]
choice = cc.select("Choose a framework:", options)
Multi-Select Menu
# Multiple selections with constraints
choices = cc.multi_select(
"Select features to enable:",
["Authentication", "Database", "Caching", "Queue", "Monitoring"],
min_selection=1,
max_selection=3
)
Navigation:
- ↑/↓: Navigate options
- Enter: Select/Submit
- Space: Toggle (multi-select only)
- q/Ctrl+C: Cancel
Features:
- Clean vertical navigation without screen clearing
- Automatic fallback to numbered input on non-interactive terminals
- Real-time visual feedback
- Proper cleanup - no leftover display artifacts
Examples
Run the interactive example menu:
python examples/menu.py
Or explore individual examples:
Basics
basics/hello_world.py- Simple introductionbasics/all_components.py- Tour of all components
Feature
features/interactive.py- Arrow-key selection and checkboxesfeatures/spinners.py- Disappearing spinner functionalityfeatures/themes.py- Custom themes (emoji, minimal, matrix)
Advanced
advanced/full_app.py- Complete application showcase
Hello World
import clicycle as cc
import time
# Build a simple CLI
cc.header("My App", "v1.0.0")
cc.info("Processing data...")
with cc.spinner("Loading..."):
time.sleep(2)
cc.success("Complete!")
cc.table([{"Name": "Alice", "Score": 95}, {"Name": "Bob", "Score": 87}])
License
MIT License - see LICENSE file for details.
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 clicycle-3.0.0.tar.gz.
File metadata
- Download URL: clicycle-3.0.0.tar.gz
- Upload date:
- Size: 42.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4abcdbc7bd1785e68706301c2eede25df3414cec0427760ce03a011f7d9950e7
|
|
| MD5 |
4e706e41865e854979e2dd2f99fd5f09
|
|
| BLAKE2b-256 |
ea5d0a14c6162d2209f9c9bfaf048ef5868412d0c7d58e54d62fa770468edd30
|
Provenance
The following attestation bundles were made for clicycle-3.0.0.tar.gz:
Publisher:
publish.yml on Living-Content/clicycle
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
clicycle-3.0.0.tar.gz -
Subject digest:
4abcdbc7bd1785e68706301c2eede25df3414cec0427760ce03a011f7d9950e7 - Sigstore transparency entry: 357481867
- Sigstore integration time:
-
Permalink:
Living-Content/clicycle@0f73c2ecbef8c2777f778ccc1b04fbb7b80d796b -
Branch / Tag:
refs/tags/v3.0.0 - Owner: https://github.com/Living-Content
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0f73c2ecbef8c2777f778ccc1b04fbb7b80d796b -
Trigger Event:
release
-
Statement type:
File details
Details for the file clicycle-3.0.0-py3-none-any.whl.
File metadata
- Download URL: clicycle-3.0.0-py3-none-any.whl
- Upload date:
- Size: 25.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d5ecf701c2ca65b8769051082ebc733a56d840d773c23ddb30a26c519c886f47
|
|
| MD5 |
c8a1532ce53c44a5046f60a172dc6513
|
|
| BLAKE2b-256 |
be67d4121c7164f3aaf8e8d93d6e35e43aca863a3ff86a05128b4a2cf207c526
|
Provenance
The following attestation bundles were made for clicycle-3.0.0-py3-none-any.whl:
Publisher:
publish.yml on Living-Content/clicycle
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
clicycle-3.0.0-py3-none-any.whl -
Subject digest:
d5ecf701c2ca65b8769051082ebc733a56d840d773c23ddb30a26c519c886f47 - Sigstore transparency entry: 357481877
- Sigstore integration time:
-
Permalink:
Living-Content/clicycle@0f73c2ecbef8c2777f778ccc1b04fbb7b80d796b -
Branch / Tag:
refs/tags/v3.0.0 - Owner: https://github.com/Living-Content
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0f73c2ecbef8c2777f778ccc1b04fbb7b80d796b -
Trigger Event:
release
-
Statement type: