Advanced
В этом разделе будут описаны более тонкие настройки приложения.
В большинстве случаев будет использоваться prompt_toolkit, для работы с ним читайте официальную документацию по этой библиотеке.
Custom parser command arguments
import re
from typing import List
from eggella import Eggella
from eggella.command import CommandHandler, RawCommandHandler
from eggella.command.abc import ABCTokensParser
app = Eggella(__name__)
class DigitParserOnly(ABCTokensParser):
def __call__(self, raw_command: str) -> List[str]:
return re.findall(r"(\d+)", raw_command)
@app.on_command("to-upper", cmd_handler=RawCommandHandler())
def words_to_up(text: str):
"""convert input to upper case"""
return text.upper()
@app.on_command("sum", cmd_handler=CommandHandler(parser=DigitParserOnly()))
def sum_(*args: int):
"""sum all digits. ignore all non digit symbols
eg:
~> sum 192.168.0.1
361
"""
return sum(args)
if __name__ == '__main__':
app.loop()
Custom Application
custom prompt message, PromptSession
import os
from datetime import datetime
from random import choice
from string import hexdigits
from prompt_toolkit import PromptSession
# set custom title in terminal
from prompt_toolkit.shortcuts import set_title
from prompt_toolkit.shortcuts.prompt import CompleteStyle
# add command history feature
from prompt_toolkit.history import FileHistory
from eggella import Eggella
def get_prompt():
"""create dynamic cursor"""
now = datetime.now()
now_time = f"{now.hour:02}:{now.minute:02}:{now.second:02}"
set_title(f"Demo Custom app app [{now_time}]")
rand_color = "#" + "".join([choice(hexdigits) for _ in range(6)])
return [
(rand_color, f"[{os.getlogin()}] "),
("bg:#008800 #ffffff", f" {now.hour:02}:{now.minute:02}:{now.second:02}"),
("", " ~ "),
]
app = Eggella(__name__, get_prompt)
app.session = PromptSession(get_prompt,
history=FileHistory(".history"),
complete_style=CompleteStyle.MULTI_COLUMN)
if __name__ == '__main__':
app.loop()
Remove commands
from eggella import Eggella
app = Eggella(__name__)
app.remove_command("help")
app.remove_command("exit")
if __name__ == '__main__':
app.loop()
Events
"command_complete"- событие возвращения результата при выполнении команды (return). Принимает один аргумент, может быть только одно в контексте приложения и оно перезаписывается.
from typing import Any
from eggella import Eggella
app = Eggella(__name__)
def result_output(result: Any):
print(f"Your result `{result}` meow ^.^")
app.register_event("command_complete", result_output)
@app.on_command("sum")
def sum_(*digits: int):
return sum(digits)
if __name__ == '__main__':
app.loop()
- "command_suggest" - событие при неправильном наборе команды. По умолчанию ищет "похожую". Принимает введенную команду и список доступных команд и может быть только одно в контексте приложения и оно перезаписывается.
-
В примере показано как отключить это событие:
-
"eof" - событие при вызове ошибки
EOFError(ctrl + D) Не принимает аргументов, может быть одно в контексте приложения
from eggella import Eggella
app = Eggella(__name__)
# exit from app immediately, ignore on_close events
app.register_event("eof", lambda: exit(1))
if __name__ == '__main__':
app.loop()
- "kb_interrupt" - событие при вызове ошибке
KeyboardInterruptНе принимает аргументов, может быть одно в контексте приложения
Встроенная команда
exitвызывает ошибкуKeyboardInterrupt