pyckify


Namepyckify JSON
Version 0.1.0 PyPI version JSON
download
home_pagehttps://github.com/ReiDoBrega/pyckify
SummaryA modern interactive terminal picker for creating interactive command-line selection interfaces
upload_time2025-02-10 04:50:26
maintainerNone
docs_urlNone
authorReiDoBrega
requires_python>=3.7
licenseMIT
keywords terminal gui pick pyckify selection ui rich curses
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Pyckify 🎯

A modern, feature-rich Python library for creating interactive command-line selection interfaces. Pyckify (pick-it-for-you) offers an enhanced selection experience with support for multiselect, grouping, filtering, search, and rich styling.

[![image](https://github.com/ReiDoBrega/pyckify/actions/workflows/ci.yml/badge.svg)](https://github.com/ReiDoBrega/pyckify/actions/workflows/ci.yml)
[![PyPI version](https://badge.fury.io/py/pyckify.svg)](https://badge.fury.io/py/pyckify)
[![Python Versions](https://img.shields.io/pypi/pyversions/pyckify.svg)](https://pypi.org/project/pyckify/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

## Features 🚀

- 🎨 Rich terminal UI with customizable themes
- ✨ Single and multi-selection modes
- 🔍 Built-in search functionality
- 🏷️ Option grouping and tagging
- ⌨️ Keyboard shortcuts
- 🎯 Custom filtering
- 📝 Option descriptions and icons
- ⚡ Smooth scrolling for large lists
- 🎭 Disabled options support
- 🎪 Windows/Unix compatible

## Installation 📦

```bash
pip install pyckify
```

## Quick Start 🎮

### Basic Usage

```python
from pyckify import Pyck, Option

# Simple string options
options = ["Red", "Blue", "Green", "Yellow"]
selected, index = Pyck(options, title="Choose a color")
print(f"Selected color: {selected}")

# Using Option objects
options = [
    Option("🍎 Apple", description="Fresh from the garden"),
    Option("🍌 Banana", description="Rich in potassium"),
    Option("🍊 Orange", description="Vitamin C boost")
]
selected, index = Pyck(options, title="Choose a fruit")
print(f"Selected fruit: {selected.label}")
```

## Advanced Usage 🔧

### Multi-select with Constraints

```python
from pyckify import Pyck, Option

options = [
    Option("Python", description="General-purpose language"),
    Option("JavaScript", description="Web development"),
    Option("Rust", description="Systems programming"),
    Option("Go", description="Cloud infrastructure")
]

result = Pyck(
    options=options,
    title="Select Programming Languages",
    subtitle="Choose 2-3 languages for your project",
    multiselect=True,
    minSelectionCount=2,
    maxSelectionCount=3,
    separateValues=True  # Returns a PickResult object
)

if result:
    print("\nSelected languages:")
    for lang in result.values:
        print(f"- {lang.label}: {lang.description}")
```

### Grouped Options with Icons and Shortcuts

```python
options = [
    # Development Tools
    Option("📝 VS Code", 
           description="Popular code editor", 
           group="Development Tools",
           shortcut="v",
           tags=["editor", "free"]),
    Option("⚡ PyCharm", 
           description="Python IDE", 
           group="Development Tools",
           shortcut="p",
           tags=["ide", "paid"]),
    
    # Version Control
    Option("😺 GitHub", 
           description="Code hosting platform", 
           group="Version Control",
           shortcut="g",
           tags=["git", "cloud"]),
    Option("🦊 GitLab", 
           description="DevOps platform", 
           group="Version Control",
           shortcut="l",
           tags=["git", "cloud"])
]

result = Pyck(
    options=options,
    title="Development Stack",
    subtitle="Select your tools",
    multiselect=True,
    group_by="group",
    show_shortcuts=True
)
```

### Advanced Grouped Options with Objects

```python

options = (
    [Option(f" 🎞️ {video}", group="🎞️ Video Tracks", value=video) for video in videos] +
    [Option(f" 🔊 {audio}", group="🔊 Audio Tracks", value=audio) for audio in audios] +
    [Option(f" 💬 {subtitle}", group="💬 Subtitle Tracks", value=subtitle) for subtitle in subtitles]
)
result = Pyck(
    options=options,
    group_by="group",
    multiselect=True,
    minSelectionCount=1,
    separateValues=True,
)
results = [value.value for option in result for value in option if isinstance(value, Option)]

if any(isinstance(value, VideoTrack) for value in results):
    videos = [value for value in results if isinstance(value, VideoTrack)]
elif any(isinstance(value, AudioTrack) for value in results):
    audios = [value for value in results if isinstance(value, AudioTrack)]
elif any(isinstance(value, SubtitleTrack) for value in results):
    subtitles = [value for value in results if isinstance(value, SubtitleTrack)]

```
Output:
```
↑↓ navigate • space select • a select all • enter confirm • / search • esc clear filters/quit

↑ More options above

🎞️ Video Tracks
    🎞️ VIDEO: BnGFobSd | avc1.4d401f | SDR | 480x360 | 901 kbps | 29.970 FPS
    🎞️ VIDEO: 6EFRMq5M | avc1.4d401f | SDR | 480x360 | 494 kbps | 29.970 FPS

🔊 Audio Tracks
    🔊 AUDIO: KuHayhsL | AAC | 2.0 | 128 kbps | yue
    🔊 AUDIO: 4r83sM8H | AAC | 2.0 | 128 kbps | da
    🔊 AUDIO: BpZJpQs8 | AAC | 2.0 | 128 kbps | de
    🔊 AUDIO: eXSUTLgz | AAC | 2.0 | 128 kbps | en
    🔊 AUDIO: kZ9xNLh5 | AAC | 2.0 | 128 kbps | es-ES
    🔊 AUDIO: RRZLJ5Lj | AAC | 2.0 | 128 kbps | es-419
    🔊 AUDIO: 9ciYXZEy | AAC | 2.0 | 128 kbps | fr-FR
→  🔊 AUDIO: QyEd8Mp6 | AAC | 2.0 | 128 kbps | el
↓ More options below

Selected: 0 (minimum: 1)

```

### Custom Filtering

```python
from dataclasses import dataclass
from pyckify import Pyck, Option

@dataclass
class Language:
    name: str
    type: str
    year: int
    popularity: int

options = [
    Option(f"🌟 {lang.name}", 
           description=f"Created in {lang.year}",
           value=lang,
           tags=[lang.type],
           group=f"Popularity: {lang.popularity}/10")
    for lang in [
        Language("Python", "interpreted", 1991, 10),
        Language("JavaScript", "interpreted", 1995, 9),
        Language("Rust", "compiled", 2010, 7),
        Language("Go", "compiled", 2009, 7)
    ]
]

# Custom filter for modern languages
def modern_languages(option: Option) -> bool:
    return option.value.year >= 2010

result = Pyck(
    options=options,
    title="Programming Language Selection",
    subtitle="Modern languages only (2010+)",
    multiselect=True,
    filter_fn=modern_languages,
    group_by="group"
)
```

### Disabled Options

```python
options = [
    Option("✨ Premium Plan", 
           description="All features included", 
           enabled=True),
    Option("💎 Enterprise Plan", 
           description="Custom solutions", 
           enabled=True),
    Option("🔒 Legacy Plan", 
           description="No longer available", 
           enabled=False)
]

result = Pyck(
    options=options,
    title="Subscription Plans",
    subtitle="Select an available plan"
)
```

## API Reference 📚

### Pyck() Function

The main function for creating selection interfaces.

```python
def Pyck(
    options: Sequence[OPTION_T],
    title: Optional[str] = None,
    subtitle: Optional[str] = None,
    indicator: str = "→",
    defaultIndex: int = 0,
    multiselect: bool = False,
    minSelectionCount: int = 0,
    maxSelectionCount: Optional[int] = None,
    filter_fn: Optional[Callable[[OPTION_T], bool]] = None,
    show_shortcuts: bool = True,
    group_by: Optional[str] = None,
    separateValues: bool = False,
) -> Union[PickResult, Union[List[PICK_RETURN_T], PICK_RETURN_T]]
```

#### Parameters:

- `options`: List of options to choose from (strings or Option objects)
- `title`: Title displayed at the top
- `subtitle`: Subtitle displayed below the title
- `indicator`: Cursor indicator symbol
- `defaultIndex`: Starting selection index
- `multiselect`: Enable multiple selections
- `minSelectionCount`: Minimum required selections (multiselect mode)
- `maxSelectionCount`: Maximum allowed selections (multiselect mode)
- `filter_fn`: Custom filtering function
- `show_shortcuts`: Show keyboard shortcuts
- `group_by`: Group options by attribute
- `separateValues`: Return separated values and indices

### Option Class

Class for creating rich options with metadata.

```python
@dataclass
class Option:
    label: str
    value: Union[object, str, Any] = None
    description: Optional[str] = None
    enabled: bool = True
    shortcut: Optional[str] = None
    icon: Optional[str] = None
    group: Optional[str] = None
    tags: List[str] = field(default_factory=list)
```

#### Attributes:

- `label`: Display text
- `value`: Associated value (optional)
- `description`: Additional description
- `enabled`: Whether the option can be selected
- `shortcut`: Keyboard shortcut key
- `icon`: Display icon
- `group`: Group name for grouping
- `tags`: List of tags for categorization

### Separator Class

Class for creating visual separators in the option list.

```python
@dataclass
class Separator(Option):
    def __init__(self, label: str, description: Optional[str] = None):
        super().__init__(label, description=description, enabled=False)
```

## Keyboard Controls ⌨️

- `↑/↓`: Navigate options
- `Enter`: Confirm selection
- `Space`: Toggle selection (multiselect mode)
- `a`: Select/deselect all (multiselect mode)
- `/`: Enable search
- `Esc`: Clear filters/exit

## Theming 🎨

Pyckify uses a custom theme system for consistent styling:

```python
custom_theme = {
    "title": Style(bold=True, color="dark_orange"),
    "subtitle": Style(italic=True, color="cyan"),
    "indicator": Style(bold=True, color="bright_yellow"),
    "selected": Style(bold=True, color="green"),
    "active": Style(bold=True, color="white", bgcolor="blue"),
    "disabled": Style(dim=True, color="grey70"),
    "description": Style(italic=True, color="bright_blue"),
    "shortcut": Style(bold=True, color="red"),
}
```

## Examples 📝

Check out the [examples](examples/) directory for more usage scenarios:

- Basic selection
- Multi-select with constraints
- Grouped options
- Custom filtering
- Disabled options
- Rich formatting
- Search functionality
- Keyboard shortcuts

## Contributing 🤝

Contributions are welcome! Please feel free to submit a Pull Request.

## License 📄

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

## Acknowledgments 🙏

- Inspired by [pick](https://github.com/aisk/pick)
- Built with [rich](https://github.com/Textualize/rich) for terminal formatting

## Author ✍️

ReiDoBrega ([@ReiDoBrega](https://github.com/ReiDoBrega))

---

Made with ❤️ using Python

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/ReiDoBrega/pyckify",
    "name": "pyckify",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": null,
    "keywords": "terminal, gui, pick, pyckify, selection, ui, rich, curses",
    "author": "ReiDoBrega",
    "author_email": "pedro94782079@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/61/3c/b84f1446e6362f892f473da6fb32a33802cb604e70ffe96f10f996486baa/pyckify-0.1.0.tar.gz",
    "platform": null,
    "description": "# Pyckify \ud83c\udfaf\r\n\r\nA modern, feature-rich Python library for creating interactive command-line selection interfaces. Pyckify (pick-it-for-you) offers an enhanced selection experience with support for multiselect, grouping, filtering, search, and rich styling.\r\n\r\n[![image](https://github.com/ReiDoBrega/pyckify/actions/workflows/ci.yml/badge.svg)](https://github.com/ReiDoBrega/pyckify/actions/workflows/ci.yml)\r\n[![PyPI version](https://badge.fury.io/py/pyckify.svg)](https://badge.fury.io/py/pyckify)\r\n[![Python Versions](https://img.shields.io/pypi/pyversions/pyckify.svg)](https://pypi.org/project/pyckify/)\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\r\n\r\n## Features \ud83d\ude80\r\n\r\n- \ud83c\udfa8 Rich terminal UI with customizable themes\r\n- \u2728 Single and multi-selection modes\r\n- \ud83d\udd0d Built-in search functionality\r\n- \ud83c\udff7\ufe0f Option grouping and tagging\r\n- \u2328\ufe0f Keyboard shortcuts\r\n- \ud83c\udfaf Custom filtering\r\n- \ud83d\udcdd Option descriptions and icons\r\n- \u26a1 Smooth scrolling for large lists\r\n- \ud83c\udfad Disabled options support\r\n- \ud83c\udfaa Windows/Unix compatible\r\n\r\n## Installation \ud83d\udce6\r\n\r\n```bash\r\npip install pyckify\r\n```\r\n\r\n## Quick Start \ud83c\udfae\r\n\r\n### Basic Usage\r\n\r\n```python\r\nfrom pyckify import Pyck, Option\r\n\r\n# Simple string options\r\noptions = [\"Red\", \"Blue\", \"Green\", \"Yellow\"]\r\nselected, index = Pyck(options, title=\"Choose a color\")\r\nprint(f\"Selected color: {selected}\")\r\n\r\n# Using Option objects\r\noptions = [\r\n    Option(\"\ud83c\udf4e Apple\", description=\"Fresh from the garden\"),\r\n    Option(\"\ud83c\udf4c Banana\", description=\"Rich in potassium\"),\r\n    Option(\"\ud83c\udf4a Orange\", description=\"Vitamin C boost\")\r\n]\r\nselected, index = Pyck(options, title=\"Choose a fruit\")\r\nprint(f\"Selected fruit: {selected.label}\")\r\n```\r\n\r\n## Advanced Usage \ud83d\udd27\r\n\r\n### Multi-select with Constraints\r\n\r\n```python\r\nfrom pyckify import Pyck, Option\r\n\r\noptions = [\r\n    Option(\"Python\", description=\"General-purpose language\"),\r\n    Option(\"JavaScript\", description=\"Web development\"),\r\n    Option(\"Rust\", description=\"Systems programming\"),\r\n    Option(\"Go\", description=\"Cloud infrastructure\")\r\n]\r\n\r\nresult = Pyck(\r\n    options=options,\r\n    title=\"Select Programming Languages\",\r\n    subtitle=\"Choose 2-3 languages for your project\",\r\n    multiselect=True,\r\n    minSelectionCount=2,\r\n    maxSelectionCount=3,\r\n    separateValues=True  # Returns a PickResult object\r\n)\r\n\r\nif result:\r\n    print(\"\\nSelected languages:\")\r\n    for lang in result.values:\r\n        print(f\"- {lang.label}: {lang.description}\")\r\n```\r\n\r\n### Grouped Options with Icons and Shortcuts\r\n\r\n```python\r\noptions = [\r\n    # Development Tools\r\n    Option(\"\ud83d\udcdd VS Code\", \r\n           description=\"Popular code editor\", \r\n           group=\"Development Tools\",\r\n           shortcut=\"v\",\r\n           tags=[\"editor\", \"free\"]),\r\n    Option(\"\u26a1 PyCharm\", \r\n           description=\"Python IDE\", \r\n           group=\"Development Tools\",\r\n           shortcut=\"p\",\r\n           tags=[\"ide\", \"paid\"]),\r\n    \r\n    # Version Control\r\n    Option(\"\ud83d\ude3a GitHub\", \r\n           description=\"Code hosting platform\", \r\n           group=\"Version Control\",\r\n           shortcut=\"g\",\r\n           tags=[\"git\", \"cloud\"]),\r\n    Option(\"\ud83e\udd8a GitLab\", \r\n           description=\"DevOps platform\", \r\n           group=\"Version Control\",\r\n           shortcut=\"l\",\r\n           tags=[\"git\", \"cloud\"])\r\n]\r\n\r\nresult = Pyck(\r\n    options=options,\r\n    title=\"Development Stack\",\r\n    subtitle=\"Select your tools\",\r\n    multiselect=True,\r\n    group_by=\"group\",\r\n    show_shortcuts=True\r\n)\r\n```\r\n\r\n### Advanced Grouped Options with Objects\r\n\r\n```python\r\n\r\noptions = (\r\n    [Option(f\" \ud83c\udf9e\ufe0f {video}\", group=\"\ud83c\udf9e\ufe0f Video Tracks\", value=video) for video in videos] +\r\n    [Option(f\" \ud83d\udd0a {audio}\", group=\"\ud83d\udd0a Audio Tracks\", value=audio) for audio in audios] +\r\n    [Option(f\" \ud83d\udcac {subtitle}\", group=\"\ud83d\udcac Subtitle Tracks\", value=subtitle) for subtitle in subtitles]\r\n)\r\nresult = Pyck(\r\n    options=options,\r\n    group_by=\"group\",\r\n    multiselect=True,\r\n    minSelectionCount=1,\r\n    separateValues=True,\r\n)\r\nresults = [value.value for option in result for value in option if isinstance(value, Option)]\r\n\r\nif any(isinstance(value, VideoTrack) for value in results):\r\n    videos = [value for value in results if isinstance(value, VideoTrack)]\r\nelif any(isinstance(value, AudioTrack) for value in results):\r\n    audios = [value for value in results if isinstance(value, AudioTrack)]\r\nelif any(isinstance(value, SubtitleTrack) for value in results):\r\n    subtitles = [value for value in results if isinstance(value, SubtitleTrack)]\r\n\r\n```\r\nOutput:\r\n```\r\n\u2191\u2193 navigate \u2022 space select \u2022 a select all \u2022 enter confirm \u2022 / search \u2022 esc clear filters/quit\r\n\r\n\u2191 More options above\r\n\r\n\ud83c\udf9e\ufe0f Video Tracks\r\n    \ud83c\udf9e\ufe0f VIDEO: BnGFobSd | avc1.4d401f | SDR | 480x360 | 901 kbps | 29.970 FPS\r\n    \ud83c\udf9e\ufe0f VIDEO: 6EFRMq5M | avc1.4d401f | SDR | 480x360 | 494 kbps | 29.970 FPS\r\n\r\n\ud83d\udd0a Audio Tracks\r\n    \ud83d\udd0a AUDIO: KuHayhsL | AAC | 2.0 | 128 kbps | yue\r\n    \ud83d\udd0a AUDIO: 4r83sM8H | AAC | 2.0 | 128 kbps | da\r\n    \ud83d\udd0a AUDIO: BpZJpQs8 | AAC | 2.0 | 128 kbps | de\r\n    \ud83d\udd0a AUDIO: eXSUTLgz | AAC | 2.0 | 128 kbps | en\r\n    \ud83d\udd0a AUDIO: kZ9xNLh5 | AAC | 2.0 | 128 kbps | es-ES\r\n    \ud83d\udd0a AUDIO: RRZLJ5Lj | AAC | 2.0 | 128 kbps | es-419\r\n    \ud83d\udd0a AUDIO: 9ciYXZEy | AAC | 2.0 | 128 kbps | fr-FR\r\n\u2192  \ud83d\udd0a AUDIO: QyEd8Mp6 | AAC | 2.0 | 128 kbps | el\r\n\u2193 More options below\r\n\r\nSelected: 0 (minimum: 1)\r\n\r\n```\r\n\r\n### Custom Filtering\r\n\r\n```python\r\nfrom dataclasses import dataclass\r\nfrom pyckify import Pyck, Option\r\n\r\n@dataclass\r\nclass Language:\r\n    name: str\r\n    type: str\r\n    year: int\r\n    popularity: int\r\n\r\noptions = [\r\n    Option(f\"\ud83c\udf1f {lang.name}\", \r\n           description=f\"Created in {lang.year}\",\r\n           value=lang,\r\n           tags=[lang.type],\r\n           group=f\"Popularity: {lang.popularity}/10\")\r\n    for lang in [\r\n        Language(\"Python\", \"interpreted\", 1991, 10),\r\n        Language(\"JavaScript\", \"interpreted\", 1995, 9),\r\n        Language(\"Rust\", \"compiled\", 2010, 7),\r\n        Language(\"Go\", \"compiled\", 2009, 7)\r\n    ]\r\n]\r\n\r\n# Custom filter for modern languages\r\ndef modern_languages(option: Option) -> bool:\r\n    return option.value.year >= 2010\r\n\r\nresult = Pyck(\r\n    options=options,\r\n    title=\"Programming Language Selection\",\r\n    subtitle=\"Modern languages only (2010+)\",\r\n    multiselect=True,\r\n    filter_fn=modern_languages,\r\n    group_by=\"group\"\r\n)\r\n```\r\n\r\n### Disabled Options\r\n\r\n```python\r\noptions = [\r\n    Option(\"\u2728 Premium Plan\", \r\n           description=\"All features included\", \r\n           enabled=True),\r\n    Option(\"\ud83d\udc8e Enterprise Plan\", \r\n           description=\"Custom solutions\", \r\n           enabled=True),\r\n    Option(\"\ud83d\udd12 Legacy Plan\", \r\n           description=\"No longer available\", \r\n           enabled=False)\r\n]\r\n\r\nresult = Pyck(\r\n    options=options,\r\n    title=\"Subscription Plans\",\r\n    subtitle=\"Select an available plan\"\r\n)\r\n```\r\n\r\n## API Reference \ud83d\udcda\r\n\r\n### Pyck() Function\r\n\r\nThe main function for creating selection interfaces.\r\n\r\n```python\r\ndef Pyck(\r\n    options: Sequence[OPTION_T],\r\n    title: Optional[str] = None,\r\n    subtitle: Optional[str] = None,\r\n    indicator: str = \"\u2192\",\r\n    defaultIndex: int = 0,\r\n    multiselect: bool = False,\r\n    minSelectionCount: int = 0,\r\n    maxSelectionCount: Optional[int] = None,\r\n    filter_fn: Optional[Callable[[OPTION_T], bool]] = None,\r\n    show_shortcuts: bool = True,\r\n    group_by: Optional[str] = None,\r\n    separateValues: bool = False,\r\n) -> Union[PickResult, Union[List[PICK_RETURN_T], PICK_RETURN_T]]\r\n```\r\n\r\n#### Parameters:\r\n\r\n- `options`: List of options to choose from (strings or Option objects)\r\n- `title`: Title displayed at the top\r\n- `subtitle`: Subtitle displayed below the title\r\n- `indicator`: Cursor indicator symbol\r\n- `defaultIndex`: Starting selection index\r\n- `multiselect`: Enable multiple selections\r\n- `minSelectionCount`: Minimum required selections (multiselect mode)\r\n- `maxSelectionCount`: Maximum allowed selections (multiselect mode)\r\n- `filter_fn`: Custom filtering function\r\n- `show_shortcuts`: Show keyboard shortcuts\r\n- `group_by`: Group options by attribute\r\n- `separateValues`: Return separated values and indices\r\n\r\n### Option Class\r\n\r\nClass for creating rich options with metadata.\r\n\r\n```python\r\n@dataclass\r\nclass Option:\r\n    label: str\r\n    value: Union[object, str, Any] = None\r\n    description: Optional[str] = None\r\n    enabled: bool = True\r\n    shortcut: Optional[str] = None\r\n    icon: Optional[str] = None\r\n    group: Optional[str] = None\r\n    tags: List[str] = field(default_factory=list)\r\n```\r\n\r\n#### Attributes:\r\n\r\n- `label`: Display text\r\n- `value`: Associated value (optional)\r\n- `description`: Additional description\r\n- `enabled`: Whether the option can be selected\r\n- `shortcut`: Keyboard shortcut key\r\n- `icon`: Display icon\r\n- `group`: Group name for grouping\r\n- `tags`: List of tags for categorization\r\n\r\n### Separator Class\r\n\r\nClass for creating visual separators in the option list.\r\n\r\n```python\r\n@dataclass\r\nclass Separator(Option):\r\n    def __init__(self, label: str, description: Optional[str] = None):\r\n        super().__init__(label, description=description, enabled=False)\r\n```\r\n\r\n## Keyboard Controls \u2328\ufe0f\r\n\r\n- `\u2191/\u2193`: Navigate options\r\n- `Enter`: Confirm selection\r\n- `Space`: Toggle selection (multiselect mode)\r\n- `a`: Select/deselect all (multiselect mode)\r\n- `/`: Enable search\r\n- `Esc`: Clear filters/exit\r\n\r\n## Theming \ud83c\udfa8\r\n\r\nPyckify uses a custom theme system for consistent styling:\r\n\r\n```python\r\ncustom_theme = {\r\n    \"title\": Style(bold=True, color=\"dark_orange\"),\r\n    \"subtitle\": Style(italic=True, color=\"cyan\"),\r\n    \"indicator\": Style(bold=True, color=\"bright_yellow\"),\r\n    \"selected\": Style(bold=True, color=\"green\"),\r\n    \"active\": Style(bold=True, color=\"white\", bgcolor=\"blue\"),\r\n    \"disabled\": Style(dim=True, color=\"grey70\"),\r\n    \"description\": Style(italic=True, color=\"bright_blue\"),\r\n    \"shortcut\": Style(bold=True, color=\"red\"),\r\n}\r\n```\r\n\r\n## Examples \ud83d\udcdd\r\n\r\nCheck out the [examples](examples/) directory for more usage scenarios:\r\n\r\n- Basic selection\r\n- Multi-select with constraints\r\n- Grouped options\r\n- Custom filtering\r\n- Disabled options\r\n- Rich formatting\r\n- Search functionality\r\n- Keyboard shortcuts\r\n\r\n## Contributing \ud83e\udd1d\r\n\r\nContributions are welcome! Please feel free to submit a Pull Request.\r\n\r\n## License \ud83d\udcc4\r\n\r\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\r\n\r\n## Acknowledgments \ud83d\ude4f\r\n\r\n- Inspired by [pick](https://github.com/aisk/pick)\r\n- Built with [rich](https://github.com/Textualize/rich) for terminal formatting\r\n\r\n## Author \u270d\ufe0f\r\n\r\nReiDoBrega ([@ReiDoBrega](https://github.com/ReiDoBrega))\r\n\r\n---\r\n\r\nMade with \u2764\ufe0f using Python\r\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A modern interactive terminal picker for creating interactive command-line selection interfaces",
    "version": "0.1.0",
    "project_urls": {
        "Homepage": "https://github.com/ReiDoBrega/pyckify",
        "Repository": "https://github.com/ReiDoBrega/pyckify"
    },
    "split_keywords": [
        "terminal",
        " gui",
        " pick",
        " pyckify",
        " selection",
        " ui",
        " rich",
        " curses"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d33b1cb9241c5dcaf386e76ad628819d66edfd1e8be90fe52bb470afd1c5e9c6",
                "md5": "41b8db5af14b517045186df8b3cc92b8",
                "sha256": "b5e84eca34b3b6df389e27bc8c2359beeb26c738031c90400da3ce6e5169449b"
            },
            "downloads": -1,
            "filename": "pyckify-0.1.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "41b8db5af14b517045186df8b3cc92b8",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7",
            "size": 11432,
            "upload_time": "2025-02-10T04:50:23",
            "upload_time_iso_8601": "2025-02-10T04:50:23.939945Z",
            "url": "https://files.pythonhosted.org/packages/d3/3b/1cb9241c5dcaf386e76ad628819d66edfd1e8be90fe52bb470afd1c5e9c6/pyckify-0.1.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "613cb84f1446e6362f892f473da6fb32a33802cb604e70ffe96f10f996486baa",
                "md5": "ca6eaa61c3ac87ac9e0b30abccd3c141",
                "sha256": "0e0e2b4f74fe515edf907c5199247b780759cdc2faab56baa86c75f3d557408c"
            },
            "downloads": -1,
            "filename": "pyckify-0.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "ca6eaa61c3ac87ac9e0b30abccd3c141",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 13996,
            "upload_time": "2025-02-10T04:50:26",
            "upload_time_iso_8601": "2025-02-10T04:50:26.007070Z",
            "url": "https://files.pythonhosted.org/packages/61/3c/b84f1446e6362f892f473da6fb32a33802cb604e70ffe96f10f996486baa/pyckify-0.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-02-10 04:50:26",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "ReiDoBrega",
    "github_project": "pyckify",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "pyckify"
}
        
Elapsed time: 0.41079s