Skip to content

More Examples

select/select_multiple

Functionality

Return index

Selective elements default to return the selected item (in case of select) or list of items (in case of select_multiple). This behavior can be modified by return_index parameter (or return_indices in case of the latter), see example,

result_index = select(options=['I\'ll be returned as 0', 'I\'ll be returned as 1'],
                      return_index=True)

Starting cursor index

By default cursor is placed on the first element, this can be configured by cursor_index parameter as follows,

results = select(['Not here either', 'Not here', 'Start from here'],
                 cursor_index=1)

Preticked indices for select_multiple

You can have preticked options using ticked_indices in select_multiple:

loved_children = select_multiple(['Oldest child', 'Middle child', 'Youngest Child'],
                                 ticked_indices=[0,2])

Maximal and minimal count for select_multiple

With select_multiple you can restrict maximum and minimum count of elements using maximal_count and minimal_count respectively,

pizza_toppings = select_multiple(['pineapple', 'olives', 'anchovies', 'mozzarella', 'parma ham']
                                 maximal_count=3,
                                 minimal_count=1)

Styling

Tip

For styling you can leverage numerous styling options provided by rich

Style as text

stylish = select(options = ["red", "on", "white"],
                 cursor = "x",
                 cursor_style= "red on white")

Style as hex

selections = select_multiple(options = ["s", "h", "e", "", "b", "e", "l", "i", "e", "v", "e", "d"],
                             tick_style="#af00ff",
                             ticked_indices=[1,2,6,7,8,11])

Cursor characters

Emoji as a cursor

Bug

Some emojis can appear as one character instead of two!

result = select(options = ["here", "comes", "the", "sun"],
                cursor = "🌞")

Non-ascii as a cursor

result = select(options = ["hardcore", "unicode"],
                cursor = "⇉")

Multi-character cursors/ticks

Tip

You can use multiple characters as a cursor

correct_abba_lyric = select_multiple(options = ["queen", "bean"],
                                     tick_character = "dancing")

prompt

Functionality

You can have a default prompt, which will collect the user typed response to the mood variable as string

mood = prompt("How are you today?")

Validation

Additionally, you can validate the input using some sort of Callable validator, for example a lambda expression to make sure input is not numeric,

answer = prompt(prompt="What is the answer to life the universe and everything?"
                validator=lambda val: not val.isnumeric())

Type Conversion

You might want to convert types for some sort of downstream functionality using target_type,

Note

Validation is always second to type conversion

number_between_1_and_10 = prompt("Give me a number between 1 and 10",
                                 target_type=int
                                 validator=lambda n: 0 < n <= 10)

Hidden/secure input

For sensitive input, secure flag can be utilized, replacing user entered input with *

very_secret_info = prompt("Type you API key, hehe",
                          secure=True)

Completion

You can provide a python callable such as Callable[[str], List[str]] to provide completion options. String passed to the callable is the current user input.

favorite_color = prompt("What is your favorite color?",
                        completion=lambda _: ["pink", "PINK", "P1NK"])

A more complex example with path completion:

from os import listdir
from pathlib import Path

# ugly hacky path completion callable:
def path_completion(str_path: str = ""):
    if not str_path:
        return []
    try:
        path = Path(str_path)
        rest = ''
        if not path.exists():
            str_path, rest = str_path.rsplit('/', 1)
            path = Path(str_path or '/')

        filtered_list_dir = [i for i in listdir(path) if i.startswith(rest)]

        if not path.is_absolute():
            return ['./'+str(Path(path)/i) for i in filtered_list_dir]
        else:
            return [str(Path(path)/i) for i in filtered_list_dir]
    except Exception as e:
        return []

prompt(">", completion=path_completion)

Spinners

Styling

Spinner Animation

There are few built in spinner animations, namely: ARC, ARROWS, BARS, CLOCK, DIAMOND, DOT, DOTS, LINE, LOADING and MOON

Each of these can be used in a spinner:

from beaupy.spinners import Spinner, ARC
spinner = Spinner(ARC, "Doing some heavy work")
spinner.start()

All that "animations" are, is but a list of string, so making your own is as trivial as this:

from beaupy.spinners import Spinner
spinner = Spinner(['whee', 'whe ', 'wh  ', 'w   ', 'wh  ', 'whe ', 'whee'], "Whee!")
spinner.start()

Rich styling

Every text in spinner does accept and respect rich styles, so the following works:

from beaupy.spinners import Spinner
spinner = Spinner(['[red]⬤[/red] ', '[green]⬤[/green] ', '[blue]⬤[/blue] '], '[pink1]Setting[/pink1] colors!')
spinner.start()

Animation speed

Animation speed can be set using refresh_per_second parameter:

from beaupy.spinners import Spinner, LOADING
spinner = Spinner(LOADING, "something", refresh_per_second=4)
spinner.start()