Feature-rich Python project template for config-cli-gui.
Project description
Welcome to config-cli-gui
Unified Configuration and Interface Management
Provides a generic configuration framework that automatically generates both command-line interfaces and GUI settings dialogs from configuration parameters.
config-cli-gui is a Python library designed to streamline the management of application configurations,
generating command-line interfaces (CLIs), and dynamically creating graphical user interface (GUI) settings dialogs
from a single source of truth. It leverages Pydantic for robust parameter definition and offers
powerful features for consistent configuration across different application entry points.
🚀 Installation
You can install config-cli-gui using pip:
pip install config-cli-gui
✨ Features
- Single Source of Truth: Define all your application parameters in one place using simple, dataclass-like structures based on Pydantic's
BaseModel. This ensures consistency and reduces errors across your application. - Categorized Configuration: Organize your parameters into logical categories (e.g.,
cli,app,gui) for better structure and maintainability. - Dynamic CLI Generation: Automatically generate
argparse-compatible command-line arguments directly from your defined configuration parameters, including help texts, types, and choices. - Config File Management: Easily load and save configurations from/to YAML or JSON files, allowing users to customize default settings.
- GUI Settings Dialogs: Dynamically create Tkinter-based settings dialogs for your application, allowing users to intuitively modify configuration parameters via a graphical interface.
- Documentation Generation: Generate detailed Markdown documentation for both your CLI options and all configuration parameters, keeping your user guides always up-to-date with your codebase.
- Override System: Supports robust overriding of configuration values via configuration files and command-line arguments, with clear precedence.
📚 Usage
1. Define Your Configuration
Start by defining your application's configuration parameters in a central config.py file within your project. You will inherit from config-cli-gui's GenericConfigManager and BaseConfigCategory.
# my_project/config_example.py
from config_cli_gui.config import (
ConfigCategory,
ConfigManager,
ConfigParameter,
)
class CliConfig(ConfigCategory):
"""CLI-specific configuration parameters."""
def get_category_name(self) -> str:
return "cli"
# Positional argument
input: ConfigParameter = ConfigParameter(
name="input",
default="",
help="Path to input (file or folder)",
required=True,
is_cli=True,
)
min_dist: ConfigParameter = ConfigParameter(
name="min_dist",
default=20,
help="Maximum distance between two waypoints",
is_cli=True,
)
extract_waypoints: ConfigParameter = ConfigParameter(
name="extract_waypoints",
default=True,
help="Extract starting points of each track as waypoint",
is_cli=True,
)
class AppConfig(ConfigCategory):
"""Application-specific configuration parameters."""
def get_category_name(self) -> str:
return "app"
log_level: ConfigParameter = ConfigParameter(
name="log_level",
default="INFO",
choices=["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"],
help="Logging level for the application",
)
log_file_max_size: ConfigParameter = ConfigParameter(
name="log_file_max_size",
default=10,
help="Maximum log file size in MB before rotation",
)
class ProjectConfigManager(ConfigManager): # Inherit from ConfigManager
"""Main configuration manager that handles all parameter categories."""
categories = (CliConfig(), AppConfig())
def __init__(self, config_file: str | None = None, **kwargs):
"""Initialize the configuration manager with all parameter categories."""
super().__init__(self.categories, config_file, **kwargs)
2. Generate CLI
Use the generic CLI functions to parse command-line arguments based on your defined CliConfig.
# my_project/cli_example.py
from config_cli_gui.cli import CliGenerator
from config_cli_gui.config import ConfigManager
from tests.example_project.config.config_example import ProjectConfigManager
from tests.example_project.core.base import BaseGPXProcessor
from tests.example_project.core.logging import initialize_logging
def run_main_processing(_config: ConfigManager) -> int:
"""Main processing function that gets called by the CLI generator.
Args:
_config: Configuration manager with all settings
Returns:
Exit code (0 for success, non-zero for error)
"""
# Initialize logging system
logger_manager = initialize_logging(_config)
logger = logger_manager.get_logger("config_cli_gui.cli")
try:
# Log startup information
logger.info("Starting config_cli_gui CLI")
logger_manager.log_config_summary()
logger.info(f"Processing input")
# Create and run BaseGPXProcessor
processor = BaseGPXProcessor(
_config.get_category("cli").input.default,
_config.get_category("cli").output.default,
_config.get_category("cli").min_dist.default,
_config.get_category("app").date_format.default,
_config.get_category("cli").elevation.default,
logger=logger,
)
logger.info("Starting conversion process")
# Run the processing (adjust method name based on your actual implementation)
result_files = processor.compress_files()
logger.info(f"Successfully processed {result_files}")
return 0
except Exception as e:
logger.error(f"Processing failed: {e}")
logger.debug("Full traceback:", exc_info=True)
return 1
def main():
"""Main entry point for the CLI application."""
# Create the base configuration manager
config_manager = ProjectConfigManager()
# Create CLI generator
cli_generator = CliGenerator(config_manager=config_manager, app_name="config_cli_gui")
# Run the CLI with our main processing function
return cli_generator.run_cli(
main_function=run_main_processing,
description="Example CLI for config-cli-gui using the generic config framework.",
)
if __name__ == "__main__":
import sys
sys.exit(main())
3. Integrate GUI Settings Dialog
The SettingsDialog from config-cli-gui (or your project's adapted version) can be used to easily create a settings window.
# my_project/gui_example.py (Simplified example)
import tkinter as tk
from tests.example_project.config.config_example import ProjectConfigManager
from config_cli_gui.gui import GenericSettingsDialog # Assuming gui_settings is part of the generic lib or adapted
def open_settings_window(parent_root, config_manager: ProjectConfigManager):
dialog = GenericSettingsDialog(parent_root, config_manager)
parent_root.wait_window(dialog.dialog)
# After dialog closes, config_manager will have updated values if 'OK' was clicked
print("Settings updated or cancelled.")
print(f"New GUI Theme: {config_manager.get_category('gui').theme.default}")
if __name__ == "__main__":
root = tk.Tk()
root.withdraw() # Hide main window for this example
# Initialize your project's config manager
project_config = ProjectConfigManager()
open_settings_window(root, project_config)
root.destroy()
4. Generate Documentation and Default Config
Use the static methods on your ProjectConfigManager to generate config.yaml, cli.md, and config.md files.
# scripts/generate_docs.py (or similar script in your project)
from tests.example_project.config.config_example import ProjectConfigManager
from config_cli_gui.docs import DocumentationGenerator
import os
# Define output paths
output_dir = "docs/generated"
os.makedirs(output_dir, exist_ok=True)
default_config = "config.yaml" # At the project root or similar
default_cli_doc = os.path.join(output_dir, "cli.md")
default_config_doc = os.path.join(output_dir, "config.md")
_config = ProjectConfigManager()
doc_gen = DocumentationGenerator(_config)
doc_gen.generate_default_config_file(output_file=default_config)
print(f"Generated: {default_config}")
doc_gen.generate_config_markdown_doc(output_file=default_config_doc)
print(f"Generated: {default_config_doc}")
doc_gen.generate_cli_markdown_doc(output_file=default_cli_doc)
print(f"Generated: {default_cli_doc}")
print("Documentation and default config generation complete.")
By following this structure, config-cli-gui provides a robust and maintainable foundation for your application's configuration needs.
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 config_cli_gui-0.1.7.tar.gz.
File metadata
- Download URL: config_cli_gui-0.1.7.tar.gz
- Upload date:
- Size: 109.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
04f1bbc95a896d491728e5b40a84c13ea593cbd610725aad8aa2ac766c748812
|
|
| MD5 |
e7341d26b2e15aa48c44992363e33109
|
|
| BLAKE2b-256 |
7e95eb2f4c6afbce7444ea40b3527b70c157fc778916fa77443dad201426c59b
|
File details
Details for the file config_cli_gui-0.1.7-py3-none-any.whl.
File metadata
- Download URL: config_cli_gui-0.1.7-py3-none-any.whl
- Upload date:
- Size: 17.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9c6614fe3313e508a3e388711dbe71809f897846bbf0ea746a87f0dbee230684
|
|
| MD5 |
631a71d5bd2e6512909f8720e4c9e246
|
|
| BLAKE2b-256 |
f82e7b8fb0c62c0745983612e0a09c3e5440ca538253dbb9669be5d9d526c61f
|