# 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.
[](https://github.com/ReiDoBrega/pyckify/actions/workflows/ci.yml)
[](https://badge.fury.io/py/pyckify)
[](https://pypi.org/project/pyckify/)
[](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[](https://github.com/ReiDoBrega/pyckify/actions/workflows/ci.yml)\r\n[](https://badge.fury.io/py/pyckify)\r\n[](https://pypi.org/project/pyckify/)\r\n[](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"
}