{"id":17372885,"url":"https://github.com/scalabli/quo","last_synced_at":"2025-12-14T17:57:44.574Z","repository":{"id":38445021,"uuid":"327378689","full_name":"scalabli/quo","owner":"scalabli","description":"🚦🛠️⚙️Quo, a toolkit for writing Command-Line Interface applications and a Text User Interface framework for Python.","archived":false,"fork":false,"pushed_at":"2024-12-02T08:45:43.000Z","size":12504,"stargazers_count":36,"open_issues_count":20,"forks_count":5,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-10-26T06:52:24.624Z","etag":null,"topics":["ansi-colors","autocomplete","autosuggest","cli","command-line","console","hex-colors","interface","keybindings","progress-bar","python-library","python3","quo","shell","syntax-highlighting","terminal","tui","typehints","widgets"],"latest_commit_sha":null,"homepage":"https://quo.rtfd.io","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/scalabli.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":"docs/supported_colors.rst","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":null,"patreon":null,"open_collective":null,"ko_fi":"scalabli","tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null}},"created_at":"2021-01-06T17:09:32.000Z","updated_at":"2025-06-10T02:18:48.000Z","dependencies_parsed_at":"2023-12-31T16:22:02.008Z","dependency_job_id":"bab01370-6f12-4074-afa8-32f70ce16dc4","html_url":"https://github.com/scalabli/quo","commit_stats":{"total_commits":2279,"total_committers":9,"mean_commits":"253.22222222222223","dds":"0.10530934620447563","last_synced_commit":"6dbeb5b471517392d5ebf59e208d0f355dddff5f"},"previous_names":["secretum-inc/quo"],"tags_count":35,"template":false,"template_full_name":null,"purl":"pkg:github/scalabli/quo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scalabli%2Fquo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scalabli%2Fquo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scalabli%2Fquo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scalabli%2Fquo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/scalabli","download_url":"https://codeload.github.com/scalabli/quo/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scalabli%2Fquo/sbom","scorecard":{"id":803197,"data":{"date":"2025-08-11","repo":{"name":"github.com/scalabli/quo","commit":"6dbeb5b471517392d5ebf59e208d0f355dddff5f"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.1,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/28 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/label.yml:16","Warn: no topLevel permission defined: .github/workflows/codeql-analysis.yml:1","Warn: no topLevel permission defined: .github/workflows/comment.yml:1","Warn: no topLevel permission defined: .github/workflows/github-actions-demo.yml:1","Warn: no topLevel permission defined: .github/workflows/greetings.yml:1","Warn: no topLevel permission defined: .github/workflows/label.yml:1","Warn: no topLevel permission defined: .github/workflows/ossar-analysis.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/python-publish.yml:16","Warn: no topLevel permission defined: .github/workflows/shiftleft.yml:1","Warn: no topLevel permission defined: .github/workflows/stale.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Security-Policy","score":4,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Warn: no linked content found","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Dangerous-Workflow","score":0,"reason":"dangerous workflow patterns detected","details":["Warn: script injection with untrusted input ' github.head_ref || steps.extract_branch.outputs.branch ': .github/workflows/shiftleft.yml:23","Warn: script injection with untrusted input ' github.head_ref || steps.extract_branch.outputs.branch ': .github/workflows/shiftleft.yml:33"],"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: steroids/a.out:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Pinned-Dependencies","score":1,"reason":"dependency not pinned by hash detected -- score normalized to 1","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/scalabli/quo/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/scalabli/quo/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:43: update your workflow using https://app.stepsecurity.io/secureworkflow/scalabli/quo/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:57: update your workflow using https://app.stepsecurity.io/secureworkflow/scalabli/quo/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/github-actions-demo.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/scalabli/quo/github-actions-demo.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/greetings.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/scalabli/quo/greetings.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/label.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/scalabli/quo/label.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ossar-analysis.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/scalabli/quo/ossar-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ossar-analysis.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/scalabli/quo/ossar-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ossar-analysis.yml:47: update your workflow using https://app.stepsecurity.io/secureworkflow/scalabli/quo/ossar-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-publish.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/scalabli/quo/python-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-publish.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/scalabli/quo/python-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/shiftleft.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/scalabli/quo/shiftleft.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/stale.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/scalabli/quo/stale.yml/master?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/python-publish.yml:31","Warn: pipCommand not pinned by hash: .github/workflows/python-publish.yml:32","Warn: pipCommand not pinned by hash: .github/workflows/shiftleft.yml:24","Warn: pipCommand not pinned by hash: .github/workflows/shiftleft.yml:25","Info:   0 out of  14 GitHub-owned GitHubAction dependencies pinned","Info:   2 out of   2 third-party GitHubAction dependencies pinned","Info:   0 out of   4 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":7,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 0 commits out of 4 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-23T11:04:20.398Z","repository_id":38445021,"created_at":"2025-08-23T11:04:20.399Z","updated_at":"2025-08-23T11:04:20.399Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":27733111,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-14T02:00:11.348Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ansi-colors","autocomplete","autosuggest","cli","command-line","console","hex-colors","interface","keybindings","progress-bar","python-library","python3","quo","shell","syntax-highlighting","terminal","tui","typehints","widgets"],"created_at":"2024-10-16T02:04:36.034Z","updated_at":"2025-12-14T17:57:44.550Z","avatar_url":"https://github.com/scalabli.png","language":"Python","funding_links":["https://ko-fi.com/scalabli"],"categories":[],"sub_categories":[],"readme":"[![Downloads](https://pepy.tech/badge/quo)](https://pepy.tech/project/quo)\n[![PyPI version](https://badge.fury.io/py/quo.svg)](https://badge.fury.io/py/quo)\n[![Wheel](https://img.shields.io/pypi/wheel/quo.svg)](https://pypi.com/project/quo)\n[![Windows Build Status](https://img.shields.io/appveyor/build/gerrishons/quo/master?logo=appveyor\u0026cacheSeconds=600)](https://ci.appveyor.com/project/gerrishons/quo)\n[![pyimp](https://img.shields.io/pypi/implementation/quo.svg)](https://pypi.com/project/quo)\n[![RTD](https://readthedocs.org/projects/quo/badge/)](https://quo.readthedocs.io)\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.5848515.svg)](https://doi.org/10.5281/zenodo.5848515)\n[![licence](https://img.shields.io/pypi/l/quo.svg)](https://opensource.org/licenses/MIT)\n[![Twitter Follow](https://img.shields.io/twitter/follow/gerrishon_s.svg?style=social)](https://twitter.com/gerrishon_s)\n\n\n[![Logo](https://raw.githubusercontent.com/scalabli/quo/master/pics/quo.png)](https://github.com/scalabli/quo)\n\n\n`Forever Scalable`\n\n**Quo** is a toolkit for writing Command-Line Interface(CLI) applications and a TUI (Text User Interface) framework for Python.\n\nQuo is making headway towards composing speedy and orderly CLI and TUI applications while forestalling any disappointments brought about by the failure to execute a python application.\nSimple to code, easy to learn, and does not come with needless baggage. \n\n## Compatibility\nQuo works flawlessly  with Linux, OSX, and Windows.\nQuo requires Python `3.8` or later. \n\n\n## Features\n- [x] Support for Ansi, RGB and Hex color models\n- [x] Support for tabular presentation of data\n- [x] Intuitive progressbars\n- [x] Code completions\n- [x] Nesting of commands\n- [x] Customizable Text User Interface _(TUI)_ dialogs.\n- [x] Automatic help page generation\n- [x] Syntax highlighting\n- [x] Autosuggestions\n- [x] Key Binders\n\n## Getting Started\n### Installation\nYou can install quo via the Python Package Index (PyPI)\n\n```\npip install -U quo\n\n```\n\nIn order to check your installation you can use\n```\npython -m pip show quo\n```\nRun the following to test Quo output on your terminal:\n```\npython -m quo\n\n```\n![test](https://github.com/scalabli/quo/raw/master/docs/images/test.png)\n\n:bulb: press ``Ctrl-c`` to exit\n# Quo Library\nQuo contains a number of builtin features you c\nan use to create elegant output in your CLI.\n\n## Quo echo\nTo output formatted text to your terminal you can import the [echo](https://quo.readthedocs.io/en/latest/introduction.html#quick-start) method.\nTry this:\n\n**Example 1**\n```python\n from quo import echo\n\n echo(\"Hello, World!\", fg=\"red\", italic=True, bold=True)\n```\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/scalabli/quo/raw/master/docs/images/print/hello-world.png\" /\u003e\n\u003c/p\u003e\n\n\n**Example 2**\n```python\n from quo import echo\n\n echo(\"Blue on white\", fg=\"blue\", bg=\"white\")\n \n```\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/scalabli/quo/raw/master/docs/images/print/blue-on-white.png\" /\u003e\n\u003c/p\u003e\n\n\nAlternatively, you can import [print](https://quo.readthedocs.io/en/latest/printing_text.html#print)\n\n**Example 1**\n```python\n from quo import print\n\n print('\u003cb\u003eThis is bold\u003c/b\u003e')\n print('\u003ci\u003eThis is italic\u003c/i\u003e')\n```\n**Example 2**\n\n```python\n from quo import print\n\n print('\u003cu\u003eThis is underlined\u003c/u\u003e')\n \n```\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/scalabli/quo/raw/master/docs/images/print/underlined1.png\" /\u003e\n\u003c/p\u003e\n\n**Example 3**\n```python\n from quo import print\n\n print(\"Quo is \u003cstyle bg='red'\u003eScalable\u003c/style\u003e\") \n```\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/scalabli/quo/raw/master/docs/images/print/scalable.png\" /\u003e\n\u003c/p\u003e\n\n**Example 4**\n```python                   \n # Colors from the ANSI palette.\n print('\u003cred\u003eThis is red\u003c/red\u003e')\n print('\u003cstyle fg=\"white\" bg=\"green\"\u003eWhite on green\u003c/stlye\u003e')\n\n```\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/scalabli/quo/raw/master/docs/images/print/white-on-green.png\" /\u003e\n\u003c/p\u003e\n\n## Quo prompt\n - Using ``quo.prompt`` method.\n```python\n from quo.prompt import prompt\n\n prompt(\"What is your name?\")\n```\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/scalabli/quo/raw/master/docs/images/prompt/prompt1.png\" /\u003e\n\u003c/p\u003e\n\n\n- Using ``quo.prompt.Prompt`` object\n\n**Example 1**\n\n```python\n\n from quo.prompt import Prompt\n   \n session = Prompt()\n session.prompt(\"Type something:\") \n```\n\n**Example 2**\nColored Prompt\n\n```python\n\n from quo.prompt import Prompt\n   \n session = Prompt()\n session.prompt(\"\u003cred\u003eType something: \u003c/red\u003e\") \n```\n**Example 3**\nExample upgrade\n\n```python\n\n  from quo.prompt import Prompt\n\n  session = Prompt(fg=\"blue\") #The input will be colored blue\n\n  session.prompt(\"\u003cred\u003ejohn\u003c/red\u003e\u003cwhite\u003e@\u003c/white\u003e\u003cgreen\u003elocalhost\u003c/green\u003e\u003cred\u003e:\u003c/red\u003e\u003ccyan\u003e\u003cu\u003e/user/john\u003c/u\u003e\u003c/cyan\u003e\u003cpurple\u003e$ \u003c/purple\u003e\")\n\n```\n\n![styled](https://raw.githubusercontent.com/scalabli/quo/master/docs/images/prompt/blue-input.png)\n\n**Example 4**\nBottom toolbar\n\n```python\n\nfrom quo.prompt import Prompt\n\nsession = Prompt()\n\nsession.prompt('\u003e ', bottom_toolbar=\"\u003ci\u003eThis is a\u003c/i\u003e\u003cb\u003e\u003cstyle bg='red'\u003e Toolbar\u003c/style\u003e\u003c/b\u003e\")\n\n```\n\n![Bottom toolbar](https://raw.githubusercontent.com/scalabli/quo/master/docs/images/prompt/bottom-toolbar.png)\n\n**Example 5**\n\nHere's an example of a multiline bottom toolbar.\n\n```python\n\nfrom quo.prompt import Prompt\n\nsession = Prompt()\n\nsession.prompt(\"Say something: \", bottom_toolbar=\"This is\\na multiline toolbar\")\n\n```\n\n![Bottom toolbar](https://raw.githubusercontent.com/scalabli/quo/master/docs/images/prompt/multiline-bottom-toolbar.png)\n\n\n\n**Example 6**\n\n``Placeholder text``\n\nA placeholder  text that's displayed as long as no input s given.\n\n:bulb: This won't be returned as part of the output.\n\n```python\n\n  from quo.prompt import Prompt\n\n  session = Prompt() \n  session.prompt(\"What is your name?: \", placeholder='\u003cgray\u003e(please type something)\u003c/gray\u003e')\n```\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/scalabli/quo/raw/master/docs/images/prompt/gray-placeholder.png\" /\u003e\n\u003c/p\u003e\n\n**Example 7**\n\n``Coloring the prompt.``\n\n\n```python\n\nfrom quo.prompt import Prompt\n\nsession = Prompt(fg=\"red\")\nsession.prompt(\"Type something: \")\n\n```\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/scalabli/quo/raw/master/docs/images/prompt/red-prompt.png\" /\u003e\n\u003c/p\u003e\n\n**Example 8**\n\n``Autocomplete text``\n\nPress [Tab] to autocomplete\n```python\n\n from quo.prompt import Prompt\n from quo.completion import WordCompleter\n example = WordCompleter(['USA', 'UK', 'Canada', 'Kenya'])\n session = Prompt(completer=example)\n session.prompt('Which country are you from?: ')\n```\n![Autocompletion](https://github.com/scalabli/quo/raw/master/docs/images/prompt/wordcompleter.png)\n\n**Example 9**\n\n``Autosuggest text``\n\nAuto suggestion is a way to propose some input completions to the user. Usually, the input is compared to the history and when there is another entry starting with the given text, the completion will be shown as gray text behind the current input.\nPressing the right arrow → or ctrl-e will insert this suggestion, alt-f will insert the first word of the suggestion.\n```python\n\n from quo.history import MemoryHistory\n from quo.prompt import Prompt\n\n MemoryHistory.append(\"import os\")\n MemoryHistory.append('print(\"hello\")') \n MemoryHistory.append('print(\"world\")')  \n MemoryHistory.append(\"import path\")\n\n session = Prompt(history=MemoryHistory, suggest=\"history\")\n\n while True:\n    session.prompt('\u003e ')\n```\n\n\nRead more on [Prompt](https://quo.readthedocs.io/latest/prompt.html)\n\n\n\n## Quo Bar\n\nDraw a horizontal bar with an optional title, which is a good way of dividing your terminal output in to sections.\n\n```python\n\n from quo.bar import Bar\n\n bar = Bar(\"I am a bar\")\n bar.draw()\n\n\n```\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/scalabli/quo/raw/master/docs/images/bar/default.png\" /\u003e\n\u003c/p\u003e\n\n\n- Styled bar\n\n```python\n\n from quo.bar import Bar\n\n bar = Bar(\"I am a styled bar\")\n bar.draw(fg=\"blue\", bg=\"yellow\")\n\n```\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/scalabli/quo/raw/master/docs/images/bar/styled.png\" /\u003e\n\u003c/p\u003e\n\n\n- Right aligned\n\n```python\n\n from quo.bar import Bar\n   \n bar = Bar(\"I am right aligned\")\n bar.draw(align=\"right\")\n\n```\n\n\u003cp align=\"right\"\u003e\n  \u003cimg src=\"https://github.com/scalabli/quo/raw/master/docs/images/bar/right.png\" /\u003e\n\u003c/p\u003e\n\n\n \n## Quo Console\n\nFor more control over quo terminal content, import and construct a `Console` object.\n\n\n\n``Launching Applications``\n\nQuo supports launching applications through `Console.launch`\n\n**Example 1**\n\n```python\n\n from quo.console import Console\n\n console = Console()\n console.launch(\"https://quo.rtfd.io/\")\n\n```\n\n**Example 2**\n\n```python\n\n from quo.console import Console\n\n console = Console()\n console.launch(\"/home/path/README.md\", locate=True)\n\n```\n\n\n\n\n``Spin``🔁\n\nQuo can create a context manager that is used to display a spinner on stdout as long as the context has not exited\n\n```python\n\n import time\n from quo.console import Console\n\n console = Console()\n\n with console.spin():\n           time.sleep(3)\n           print(\"Hello, World\")\n\n```\nRead more on [Console](https://quo.readthedocs.io/en/latest/console.html)\n\n## Quo Dialogs\n\nHigh level API for displaying dialog boxes to the user for informational purposes, or to get input from the user.\n\n**Example 1**\n\nMessage Box dialog\n```python\n\n from quo.dialog import MessageBox\n\n MessageBox(\n    title='Message window',\n    text='Do you want to continue?\\nPress ENTER to quit.')\n\n```\n![Message Box](https://github.com/scalabli/quo/raw/master/docs/images/dialog/message.png)\n\n**Example 2**\n\n- Input dialog\n\n```python\n\n from quo.dialog import InputBox\n\n InputBox(\n     title='PromptBox Shenanigans',\n     text='What Country are you from?:')\n\n```\n![Input Box](https://github.com/scalabli/quo/raw/master/docs/images/dialog/input.png)\n\n\n- Multiline Input dialog\n\n```python\n\n from quo.dialog import InputBox\n\n InputBox(\n     title='PromptBox Shenanigans',\n     text='What Country are you from?:',\n     multiline=True)\n\n```\n![Input Box](https://github.com/scalabli/quo/raw/master/docs/images/dialog/multiline.png)\n\n- Password Input dialog\n\n```python\n\n from quo.dialog import InputBox\n\n InputBox(\n     title='PromptBox Shenanigans',\n     text='What Country are you from?:',\n     hide=True)\n\n```\n![Input Box](https://github.com/scalabli/quo/raw/master/docs/images/dialog/password.png)\n\n- Radiolist\n\n```python\n\n from quo.dialog import RadiolistBox\n\n RadiolistBox(\n     title=\"RadioList dialog example\",\n     text=\"Which breakfast would you like ?\",\n     values=[\n         (\"breakfast1\", \"Eggs and beacon\"),\n         (\"breakfast2\", \"French breakfast\"),\n         (\"breakfast3\", \"Equestrian breakfast\")\n     ])\n\n```\n![Radiolist](https://github.com/scalabli/quo/raw/master/docs/images/dialog/radiolist1.png)\n\nRead more on [Dialogs](https://quo.readthedocs.io/en/latest/dialogs.html)\n\n\n## Quo Key Binding🔐\n\nA key binding is an association between a physical key on akeyboard and a parameter.\n\n```python\n\n from quo import echo\n from quo.keys import bind\n from quo.prompt import Prompt\n\n session = Prompt()\n\n # Print \"Hello world\" when ctrl-h is pressed\n @bind.add(\"ctrl-h\")\n def _(event):\n      echo(\"Hello, World!\")\n\n session.prompt(\"\")\n\n```\n\nRead more on [Key bindings](https://quo.readthedocs.io/en/latest/kb.html)\n\n\n## Quo Parser \n\nYou can parse optional and positional arguments with Quo and generate help pages for your command-line tools.\n\n```python\n from quo.parse import Parser\n \n parser = Parser(description= \"This script prints hello NAME COUNT times.\")\n\n parser.argument('--count', default=3, type=int, help='number of greetings')\n parser.argument('name', help=\"The person to greet\")\n \n arg = parser.parse()\n \n for x in range(arg.count):\n     print(f\"Hello {arg.name}!\")\n\n```\n\n```shell\n   $ python prog.py John --count 4\n   \n```\n\nAnd what it looks like:\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/scalabli/quo/raw/master/docs/images/parse/document-scripts.png\" /\u003e\n\u003c/p\u003e\n\nHere's what the help page looks like:\n\n```shell\n $ python prog.py --help\n```\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/scalabli/quo/raw/master/docs/images/parse/document-scripts-help.png\" /\u003e\n\u003c/p\u003e\n\nRead more on [Parser](https://quo.readthedocs.io/en/latest/parse.html)\n\n## Quo ProgressBar\nCreating a new progress bar can be done by calling the class **ProgressBar**\nThe progress can be displayed for any iterable. This works by wrapping the iterable (like ``range``) with the class **ProgressBar**\n\n```python\n\n import time\n from quo.progress import ProgressBar\n  \n with ProgressBar() as pb:\n               for i in pb(range(800)):\n                             time.sleep(.01)\n```\n![ProgressBar](https://raw.githubusercontent.com/scalabli/quo/master/docs/images/progress/dots3.png)\n\nRead more on [Progress](https://quo.readthedocs.io/en/latest/progress.html)\n\n## Quo Rule\n\nUsed for drawing a horizontal line.\n\n**Example 1**\n\n```python\n\n from quo.rule import Rule\n\n rule = Rule()\n rule.draw()\n\n\n```\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/scalabli/quo/raw/master/docs/images/rule/default.png\" /\u003e\n\u003c/p\u003e\n\n**Example 2**\n- A styled line.\n\n```python\n\n from quo.rule import Rule\n\n rule = Rule()\n rule.draw(color=\"purple\")\n\n```\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/scalabli/quo/raw/master/docs/images/rule/styled.png\" /\u003e\n\u003c/p\u003e\n\n\n**Example 3**\n\n- A multicolored line.\n\n```python\n\n from quo.rule import Rule\n\n rule = Rule()\n rule.draw(multicolored=True)\n\n\n```\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/scalabli/quo/raw/master/docs/images/rule/multicolored.png\" /\u003e\n\u003c/p\u003e\n\n\n## Quo Tables\n\nThis offers a number of configuration options to set the look and feel of the table, including how borders are rendered and the style and alignment of the columns.\n\n**Example 1**\n\n```python\n\n from quo.table import Table\n \n data = [\n    [\"Name\", \"Gender\", \"Age\"],\n    [\"Alice\", \"F\", 24],\n    [\"Bob\", \"M\", 19],\n    [\"Dave\", \"M\", 24]\n    ]\n\n table = Table(data)\n table.print()\n\n```\n![tabulate](https://raw.githubusercontent.com/scalabli/quo/master/docs/images/tables/default.png)\n\n**Example 2**\n\nRight aligned table\n\n```python\n\n from quo.table import Table\n\n data = [\n    [\"Name\", \"Gender\", \"Age\"],\n    [\"Alice\", \"F\", 24],\n    [\"Bob\", \"M\", 19],\n    [\"Dave\", \"M\", 24]\n    ]\n\n table = Table(data)\n table.print(align=\"right\")\n\n\n```\n\n![tabulate](https://raw.githubusercontent.com/scalabli/quo/master/docs/images/tables/right.png)\n\n**Example 3**\n\nColored table\n\n```python\n\n from quo.table import Table\n\n data = [\n    [\"Name\", \"Gender\", \"Age\"],\n    [\"Alice\", \"F\", 24],\n    [\"Bob\", \"M\", 19],\n    [\"Dave\", \"M\", 24]\n    ]\n    \n table = Table(data)\n table.print(fg=\"green\")\n\n\n\n```\n\n\n![tabulate](https://raw.githubusercontent.com/scalabli/quo/master/docs/images/tables/green.png)\n\n**Example 4**\n\nColumn width\n\nIn situations where fields are expected to reasonably be too long to look good as a single line, parameter `column_width` can help automate word wrapping long fields.\n```python\n\n from quo.table import Table\n\n data = [\n       [1, 'John Smith', 'This is a rather long description that might look better if it is wrapped a bit']\n       ]\n\n table = Table(data)\n table.print(headers=(\"Issue Id\", \"Author\", \"Description\"), column_width=[None, None, 30])\n\n```\n\n![tabulate](https://raw.githubusercontent.com/scalabli/quo/master/docs/images/tables/width.png)\n\n\n**Example 5**\n\nGrid table\n\n```python\n\nfrom quo.table import Table\n\ndata = [\n    [\"Name\", \"Gender\", \"Age\"],\n    [\"Alice\", \"F\", 24],\n    [\"Bob\", \"M\", 19],\n    [\"Dave\", \"M\", 24]\n   ]\n\ntable = Table(data)\ntable.print(theme=\"grid\")\n\n```\n\n\n![tabulate](https://raw.githubusercontent.com/scalabli/quo/master/docs/images/tables/grid.png)\n\n\n\n\nRead more on [Table](https://quo.readthedocs.io/en/latest/table.html)\n\n## Quo Widgets\nA collection of reusable components for building full screen applications.\n\n\n### ``Frame``\n\nUsed draw a border around any container, optionally with a title.\n\nRead more on [Frame](https://quo.readthedocs.io/en/latest/widgets.html#frame)\n\n### ``Label``\n\nWidget that displays text.\n\nRead more on [Label](https://quo.readthedocs.io/en/latest/widgets.html#label)\n\n\n\n### Box + Label\n\n```python\n\n from quo import container\n from quo.box import Box\n from quo.label import Label\n\n content = Label(\"Hello, World!\", fg='red', bg='yellow')\n\n container(content)\n\n```\n![Box](https://raw.githubusercontent.com/scalabli/quo/master/docs/images/fullscreen/box-and-label-redyellow.png)\n\n\n\nRead more on [Widgets](https://quo.readthedocs.io/en/latest/widgets.html)\n\n\nFor more intricate  examples, have a look in the [examples](https://github.com/scalabli/quo/tree/master/examples) directory and the documentation.\n\n## Donate🎁\n\nIn order to for us to maintain this project and grow our community of contributors.\n[Donate](https://ko-fi.com/scalabli)\n\n\n\n## Quo is...\n\n**Simple**\n     If you know Python you can  easily use quo and it can integrate with just about anything.\n\n\n\n\n## Getting Help\n\n### Community\n\nFor discussions about the usage, development, and the future of quo, please join our Google community\n\n* [Community👨‍👩‍👦‍👦](https://groups.google.com/g/scalabli)\n\n## Resources\n\n### Bug tracker\n\nIf you have any suggestions, bug reports, or annoyances please report them\nto our issue tracker at \n[Bug tracker](https://github.com/scalabli/quo/issues/) or send an email to:\n\n 📥 scalabli@googlegroups.com | scalabli@proton.me\n\n\n\n\n## Blogs💻\n\n→ How to build CLIs using [quo](https://www.python-engineer.com/posts/cli-with-quo/)\n\n## License📑\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)  \nThis software is licensed under the `MIT License`. See the [License](https://github.com/scalabli/quo/blob/master/LICENSE) file in the top distribution directory for the full license text.\n\n\n## Code of Conduct\nCode of Conduct is adapted from the Contributor Covenant,\nversion 1.2.0 available at\n[Code of Conduct](http://contributor-covenant.org/version/1/2/0/)\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscalabli%2Fquo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fscalabli%2Fquo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscalabli%2Fquo/lists"}