Skip to main content

Enhaced Python port of Inquirer.js

Project description

InquirerPy

Test Lint Build Version PyPi License

Documentation: https://github.com/kazhala/InquirerPy/wiki

Introduction

InquirerPy is a Python port of the famous Inquirer.js (A collection of common interactive command line user interfaces). This project is a re-implementation of the PyInquirer project, with bug fixes of known issues, new prompts, backward compatible APIs as well as more customization options.

↓↓↓ Simple AWS S3 uploader/downloader prompt.

Demo

Classic Syntax (PyInquirer)
import boto3
from InquirerPy import prompt
from InquirerPy.validator import PathValidator

client = boto3.client("s3")

def get_bucket(_):
    return [bucket["Name"] for bucket in client.list_buckets()["Buckets"]]

def walk_s3_bucket(result):
    response = []
    paginator = client.get_paginator("list_objects")
    for result in paginator.paginate(Bucket=result["bucket"]):
        for file in result["Contents"]:
            response.append(file["Key"])
    return response

def is_upload(result):
    return result[0] == "Upload"

questions = [
    {
        "message": "Select an S3 action:",
        "type": "list",
        "choices": ["Upload", "Download"],
    },
    {
        "message": "Enter the filepath to upload:",
        "type": "filepath",
        "when": is_upload,
        "validate": PathValidator(),
        "only_files": True,
    },
    {
        "message": "Select a bucket:",
        "type": "fuzzy",
        "choices": get_bucket,
        "name": "bucket",
    },
    {
        "message": "Select files to download:",
        "type": "fuzzy",
        "when": lambda _: not is_upload(_),
        "choices": walk_s3_bucket,
        "multiselect": True,
    },
    {
        "message": "Enter destination folder:",
        "type": "filepath",
        "when": lambda _: not is_upload(_),
        "only_directories": True,
        "validate": PathValidator(),
    },
    {"message": "Confirm?", "type": "confirm", "default": False},
]

result = prompt(questions, vi_mode=True)

# Download or Upload the file based on result ...
Alternative Syntax
import os
import boto3
from InquirerPy import inquirer
from InquirerPy.validator import PathValidator

client = boto3.client("s3")
os.environ["INQUIRERPY_VI_MODE"] = 'true'

def get_bucket(_):
    return [bucket["Name"] for bucket in client.list_buckets()["Buckets"]]

def walk_s3_bucket(bucket):
    response = []
    paginator = client.get_paginator("list_objects")
    for result in paginator.paginate(Bucket=bucket):
        for file in result["Contents"]:
            response.append(file["Key"])
    return response

action = inquirer.select(
    message="Select an S3 action:", choices=["Upload", "Download"]
).execute()

if action == "Upload":
    file_to_upload = inquirer.filepath(
        message="Enter the filepath to upload:",
        validate=PathValidator(),
        only_files=True,
    ).execute()
    bucket = inquirer.fuzzy(message="Select a bucket:", choices=get_bucket).execute()
else:
    bucket = inquirer.fuzzy(message="Select a bucket:", choices=get_bucket).execute()
    file_to_download = inquirer.fuzzy(
        message="Select files to download:",
        choices=lambda _: walk_s3_bucket(bucket),
        multiselect=True,
    ).execute()
    destination = inquirer.filepath(
        message="Enter destination folder:",
        only_directories=True,
        validate=PathValidator(),
    ).execute()

confirm = inquirer.confirm(message="Confirm?").execute()

# Download or Upload the file based on result ...

Motivation

PyInquirer is a great Python port of Inquirer.js, however the project is slowly reaching to an unmaintained state with various issues left behind and no intention to implement more feature requests. I was heavily relying on this library for other projects but could not proceed due to the limitations.

Some noticeable ones that bothers me the most:

  • hard limit on prompt_toolkit version 1.0.3 (current release)
  • color issues (unreleased)
  • cursor issues (unreleased)
  • No options for VI/Emacs navigation key bindings
  • Pagination options doesn't work

This project uses python3.7+ type hinting with focus on resolving above issues while providing greater customization options.

Requirements

OS

Leveraging prompt_toolkit, InquirerPy works cross platform for all OS. Although Unix platform may have a better experience than Windows.

Python

InquirerPy requires Python3.7+.

Getting Started

Checkout full documentation here.

Install

pip3 install InquirerPy

Quick Start

Classic Syntax (PyInquirer)

from InquirerPy import prompt

questions = [
    {"type": "input", "message": "What's your name:", "name": "name"},
    {"type": "confirm", "message": "Confirm?", "name": "confirm"},
]
result = prompt(questions)
name = result["name"]
confirm = result["confirm"]

Alternate Syntax

from InquirerPy import inquirer

name = inquirer.text(message="What's your name:")
confirm = inquirer.confirm(message="Confirm?")

Migrating from PyInquirer

Most APIs from PyInquirer should be compatible with InquirerPy. If you discovered any more incompatible APIs, please let me know via issues or directly update README via pull request.

CheckboxPrompt

The following table containing the mapping of the incompatible parameters.

PyInquirer InquirerPy
pointer_sign pointer
selected_sign enabled_symbol
unselected_sign disabled_symbol

Style

Every style keys from PyInquirer is present in InquirerPy except the once in the following table.

PyInquirer InquirerPy
selected pointer

Although InquirerPy support all the keys from PyInquirer, the styling works slightly different. Please refer to the Style documentation for detailed information.

Similar projects

questionary

While developing this project, I've discovered there's already another re-implementation of PyInquirer called questionary. It's a fantastic fork which supports prompt_toolkit 3.0.0+ with performance improvement and more customization options. It's already a well established and stable library.

Unfortunately, the discovery of this project is a little too late since I really believe this is a great project and brings just what I needed to solve my issues with PyInquirer and I may not proceed to develop InquirerPy.

Comparing with questionary, InquirerPy offers even more customization options in styles, UI as well as key bindings. InquirerPy also provides a new and powerful fuzzy prompt.

If you are already using questionary, I do not suggest using InquirerPy unless you require more customization or wanna try out the fuzzy prompt as both library is not API compatible.

python-inquirer

python-inquirer is another great Python port of Inquirer.js. Instead of using prompt_toolkit, it leverages the library blessed to implement the UI.

Before implementing InquirerPy, this library came up as an alternative. It's a more stable library comparing to the original PyInquirer, however it has a rather limited customization options and an older UI which did not solve the issues I was facing described in the Motivation section.

Comparing with python-inquirer, InquirerPy offers a slightly better UI, more customization options in key bindings and styles, providing pagination as well as more prompts.

Credit

This project is based on the great work done by the following projects & their authors.

License

This project is licensed under MIT. Copyright (c) 2020 Kevin Zhuang

The fzy code is licensed under MIT. Copyright (c) 2018 Pavel Aslanov

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

InquirerPy-0.1.0.tar.gz (31.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

InquirerPy-0.1.0-py3-none-any.whl (44.2 kB view details)

Uploaded Python 3

File details

Details for the file InquirerPy-0.1.0.tar.gz.

File metadata

  • Download URL: InquirerPy-0.1.0.tar.gz
  • Upload date:
  • Size: 31.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.23.0 setuptools/51.3.1 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.8.3

File hashes

Hashes for InquirerPy-0.1.0.tar.gz
Algorithm Hash digest
SHA256 a5b9781651b6444256ad2c20375c692f5879d1077f9dc029540e96e56c273da2
MD5 8a1ef5e2b17dab1d7fe4ca0970a5c41f
BLAKE2b-256 81ba11cd8bc0e18aa09a437543dd61d74883cfc21fa885b98e243fd0d530fdce

See more details on using hashes here.

File details

Details for the file InquirerPy-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: InquirerPy-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 44.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.23.0 setuptools/51.3.1 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.8.3

File hashes

Hashes for InquirerPy-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c1df1402dcea6ae14b3f006cd66d9925e41d2f8b852f505a7124c36605ba7cac
MD5 7803dfef5b2ef86cb1bd41ca5b6d449c
BLAKE2b-256 8ad33ed649ac276b3b7ddec061fc8c11a642e89c2bb615286e0833a602630e01

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page