CliFrame - Python CLI Development Framework
A simple and powerful framework for building interactive command-line applications with dynamic command discovery and hierarchical command organization.
🚀 Features
- Hierarchical Command Structure - Organize commands in folders and files
- Dynamic Command Discovery - Automatically discovers commands based on file structure
- Interactive Shell - Rich interactive CLI with tab completion
- Built-in Help System - Use
?to get help on any command or subcommand - Configuration Mode - Special configuration mode with
_configurefolder support - Rich Text Support - Color formatting and styled output
- Customizable Prompts - Set custom prompt text and mode indicators
- Method Chaining - Fluent API for easy CLI setup
📦 Installation
pip install cliframe
🏗️ Quick Start
1. Basic Setup
from cliframe import CliService
# Create and run CLI service
cli = CliService()
cli.motd("Welcome to My CLI App!", rich=True)
cli.prompt("myapp")
cli.run()
2. Command Structure
Organize your commands in a cli/ directory structure:
cli/
├── show/
│ ├── __init__.py # 'show' command handler
│ ├── users.py # 'show users' command
│ └── logs/
│ └── __init__.py # 'show logs' command
├── start.py # 'start' command
├── stop.py # 'stop' command
└── _configure/ # Configuration commands
├── network.py
└── system.py
3. Command Handlers
Create command handlers as Python classes:
# cli/start.py
class StartCommand:
"""Start the application service."""
def __init__(self, core):
self.core = core
def run(self, args=None):
"""Start the service with optional arguments."""
print("Service started successfully!")
return "Service is now running"
# Alternative: Use Command or StartCommand class names
class Command: # Will be auto-discovered
def run(self, args=None):
print("Command executed!")
4. Advanced Configuration
from cliframe import CliService
cli = (CliService()
.folder("/path/to/custom/cli/commands") # Custom command folder
.prompt("myapp") # Custom prompt
.prompt_mode_sign("#") # Custom prompt sign
.motd("🎉 Welcome to MyApp CLI!", rich=True))
cli.run()
🎯 Command Organization
File-based Commands
command.py→commandCLI command- Each file should contain a command handler class
Directory-based Commands
command/→commandCLI command groupcommand/__init__.py→ Handler for basecommandcommand/subcommand.py→ Handler forcommand subcommand
Handler Class Discovery
CliFrame looks for handler classes in this order:
StartCommandclassCommandclass- Any class ending with
Command - First class found in the module
🛠️ Interactive Features
Help System
- Type
?at the end of any command to get help command ?- Shows help for the commandcommand sub ?- Shows help for subcommands
Tab Completion
- Smart tab completion for all available commands
- Context-aware completion based on current command path
Configuration Mode
- Create
_configure/folder for configuration commands - Type
configureto enter configuration mode - Prompt changes to
(config)# - Type
exitto leave configuration mode
📝 Example Usage
# Interactive CLI session
myapp> start ? # Get help for start command
myapp> show users # Execute show users command
myapp> configure # Enter configuration mode
myapp(config)# network setup # Run configuration command
myapp(config)# exit # Exit configuration mode
myapp> exit # Exit CLI
🎨 Styling and Output
Color Markers
Use color markers in your command output:
def run(self, args=None):
return "[green]Success![/green] Operation completed [yellow]successfully[/yellow]"
Available Styles
[red]text[/red]- Red text[green]text[/green]- Green text[yellow]text[/yellow]- Yellow text[blue]text[/blue]- Blue text[magenta]text[/magenta]- Magenta text[cyan]text[/cyan]- Cyan text
🔧 API Reference
CliService Class
Methods
__init__(core=None, cli_root=None)- Initialize CLI servicefolder(path)- Set custom CLI commands directoryprompt(text)- Set prompt text (default: "cli")prompt_mode_sign(sign)- Set prompt mode sign (default: ">")motd(message, rich=True)- Set message of the dayrun()- Start the interactive CLI
Method Chaining
All configuration methods return self for easy chaining:
cli = (CliService()
.folder("./my-commands")
.prompt("myapp")
.motd("Welcome!"))
📁 Project Structure
your-project/
├── cli/ # Default CLI commands directory
│ ├── show/
│ ├── start.py
│ ├── stop.py
│ └── _configure/ # Configuration commands
├── main.py # Your CLI application entry point
└── requirements.txt
🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
📄 License
This project is licensed under the MIT License.
Metadata
Release files for cliframe 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cliframe-0.1.1.tar.gz | 7.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cliframe-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 16.0 kB
Release files / cliframe-0.1.1.tar.gz
| Download URL | cliframe-0.1.1.tar.gz |
|---|---|
| Size | 7.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8e20205149ba1b0e4002c81689d2c5d35db6e85a6cb3d4542071c03ebe6144e4
|
|
BLAKE2b-256 checksum How to use checksums |
9d37ed843d13954a6dd9e69277814c39a73c845c56e1e63b99cf80c86f488619
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / cliframe-0.1.1-py3-none-any.whl
| Download URL | cliframe-0.1.1-py3-none-any.whl |
|---|---|
| Size | 8.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
572c8cade1da4943b7384befced6b97abb05c1751782500b8e3383c5bbeff603
|
|
BLAKE2b-256 checksum How to use checksums |
8e94227733aa72fa7ea77b32cc452b32218e0207670d8764854c3b6541bda770
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|