Skip to main content

Python port of Inquirer.js (A collection of common interactive command-line user interfaces)

Project description

InquirerPy

Test Lint Build Coverage Version PyPi License

Documentation: inquirerpy.readthedocs.io

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 customisation options.

↓↓↓ Simple AWS S3 uploader/downloader prompt.

Note: boto3 package and configured AWS credentials is required for the following example.

Demo

Classic Syntax (PyInquirer)
import boto3

from InquirerPy import prompt
from InquirerPy.exceptions import InvalidArgument
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},
]

try:
    result = prompt(questions, vi_mode=True)
except InvalidArgument:
    print("No available choices")

# Download or Upload the file based on result ...
Alternative Syntax
import os

import boto3

from InquirerPy import inquirer
from InquirerPy.exceptions import InvalidArgument
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


try:
    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()
except InvalidArgument:
    print("No available choices")

# 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 bother me the most:

  • hard limit on prompt_toolkit version 1.0.3
  • various color issues
  • various cursor issues
  • No options for VI/Emacs navigation key bindings
  • Pagination option doesn't work

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

Requirements

OS

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

Python

python >= 3.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:").execute()
confirm = inquirer.confirm(message="Confirm?").execute()

Migrating from PyInquirer

Most APIs from PyInquirer should be compatible with InquirerPy. If you have discovered more incompatible APIs, please create an issue or directly update README via a pull request.

EditorPrompt

InquirerPy does not support editor prompt as of now.

CheckboxPrompt

The following table contains the mapping of 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 ones 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

questionary is a fantastic fork which supports prompt_toolkit 3.0.0+ with performance improvement and more customisation options. It's already a well established and stable library.

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

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 customisation 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 customisation 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.

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.3.0.tar.gz (40.1 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.3.0-py3-none-any.whl (61.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: InquirerPy-0.3.0.tar.gz
  • Upload date:
  • Size: 40.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.11 CPython/3.9.5 Linux/4.14.243-185.433.amzn2.x86_64

File hashes

Hashes for InquirerPy-0.3.0.tar.gz
Algorithm Hash digest
SHA256 3f45515dfb58c590759df91ae9534f9391f241480cc535e7e134fb3c3bd3d269
MD5 2c7d9a24d444b9a3ff5db58782467981
BLAKE2b-256 90b7e07e951ad8449df0c08abff3139fa5c836f2ef20ffb90cb7ad100d9a0c4f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: InquirerPy-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 61.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.11 CPython/3.9.5 Linux/4.14.243-185.433.amzn2.x86_64

File hashes

Hashes for InquirerPy-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8849da1e2dfa4b1d576a9cd9b158ad0755d7fc6883eb0cf839b6a2fc6b1a10fb
MD5 fd9f271ecc76907b0720cfa3d68a005a
BLAKE2b-256 7f7cc985208d049bc73c28115312d0556a2b89afad7dd9a4c7f37a9324106dcc

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