52 lines
1.7 KiB
Python
52 lines
1.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
`input` type question
|
|
"""
|
|
from __future__ import print_function, unicode_literals
|
|
import inspect
|
|
from libs.prompt_toolkit.token import Token
|
|
from libs.prompt_toolkit.shortcuts import create_prompt_application
|
|
from libs.prompt_toolkit.validation import Validator, ValidationError
|
|
from libs.prompt_toolkit.layout.lexers import SimpleLexer
|
|
|
|
from .common import default_style
|
|
|
|
# use std prompt-toolkit control
|
|
|
|
|
|
def question(message, **kwargs):
|
|
default = kwargs.pop('default', '')
|
|
validate_prompt = kwargs.pop('validate', None)
|
|
if validate_prompt:
|
|
if inspect.isclass(validate_prompt) and issubclass(validate_prompt, Validator):
|
|
kwargs['validator'] = validate_prompt()
|
|
elif callable(validate_prompt):
|
|
class _InputValidator(Validator):
|
|
def validate(self, document):
|
|
verdict = validate_prompt(document.text)
|
|
if not verdict == True:
|
|
if verdict == False:
|
|
verdict = 'invalid input'
|
|
raise ValidationError(
|
|
message=verdict,
|
|
cursor_position=len(document.text))
|
|
kwargs['validator'] = _InputValidator()
|
|
|
|
# TODO style defaults on detail level
|
|
kwargs['style'] = kwargs.pop('style', default_style)
|
|
qmark = kwargs.pop('qmark', '?')
|
|
|
|
|
|
def _get_prompt_tokens(cli):
|
|
return [
|
|
(Token.QuestionMark, qmark),
|
|
(Token.Question, ' %s ' % message)
|
|
]
|
|
|
|
return create_prompt_application(
|
|
get_prompt_tokens=_get_prompt_tokens,
|
|
lexer=SimpleLexer(Token.Answer),
|
|
default=default,
|
|
**kwargs
|
|
)
|