final work on autocomplete

This commit is contained in:
2025-04-09 23:32:21 +03:00
parent 592d128ef6
commit 8b496aa782
10 changed files with 100 additions and 124 deletions
+11
View File
@@ -0,0 +1,11 @@
test
q
P
q
S
S --host 125
q
S --host 125.0123
0
U
q
+24 -50
View File
@@ -1,58 +1,32 @@
import readline
import os
HISTORY_FILENAME = 'completer.hist'
def completer(text, state):
matches = sorted(cmd for cmd in get_history_items() if cmd.startswith(text))
if len(matches) > 1:
common_prefix = matches[0]
for match in matches[1:]:
i = 0
while i < len(common_prefix) and i < len(match) and common_prefix[i] == match[i]:
i += 1
common_prefix = common_prefix[:i]
if state == 0:
readline.insert_text(common_prefix[len(text):])
readline.redisplay()
return None
elif len(matches) == 1:
return matches[0] if state == 0 else None
else:
return None
readline.set_completer(completer)
readline.parse_and_bind("tab: complete")
def get_history_items():
return [readline.get_history_item(i) for i in range(1, readline.get_current_history_length() + 1)]
class HistoryCompleter:
def __init__(self):
self.matches = []
return
def complete(self, text, state):
response = None
if state == 0:
history_values = get_history_items()
if text:
self.matches = sorted(h
for h in history_values
if h and h.startswith(text))
else:
self.matches = []
try:
response = self.matches[state]
except IndexError:
response = None
return response
def inputing():
if os.path.exists(HISTORY_FILENAME):
readline.read_history_file(HISTORY_FILENAME)
print(f'Максимальная длина файла истории: {readline.get_history_length()}')
print(f'История запуска:{get_history_items()}')
while True:
try:
while True:
line = input('!("stop" to quit) Ввод текста: => ')
if line == 'stop':
break
if line:
print(f'Добавление "{line}" в файл истории.')
finally:
print(f'Конец записи истории: {get_history_items()}')
readline.write_history_file(HISTORY_FILENAME)
# Регистрация класса 'HistoryCompleter'
readline.set_completer(HistoryCompleter().complete)
# Регистрация клавиши `tab` для автодополнения
readline.parse_and_bind('tab: complete')
# Запрос текста
inputing()
line = input('> ')
except EOFError:
break
+3 -7
View File
@@ -1,36 +1,32 @@
from rich.console import Console
from argenta.command import Command
from argenta.command.flag import Flags, InputFlags, Flag
from argenta.command.flag import Flags, InputFlags
from argenta.command.flag.defaults import PredeterminedFlags
from argenta.router import Router
from .handlers_implementation.help_command import help_command
work_router: Router = Router(title='Work points:')
work_router.set_invalid_input_flag_handler(lambda flag: print(f'Invalid input flag: {flag.get_string_entity()} {flag.get_value() if flag.get_value() else ''}'))
settings_router: Router = Router(title='Settings points:')
console = Console()
flag = Flag('test')
@work_router.command(Command('0', 'Get Help'))
def command_help():
help_command()
@work_router.command(Command('S', 'Start Solving', Flags(PredeterminedFlags.HOST, PredeterminedFlags.PORT, flag)))
@work_router.command(Command('S', 'Start Solving', Flags(PredeterminedFlags.HOST, PredeterminedFlags.PORT)))
def command_start_solving(args: InputFlags):
print(args.get_flag('test'))
@settings_router.command(Command('U', 'Update WordMath'))
def command_update():
pass
print('eeeeeee')
+5 -1
View File
@@ -3,15 +3,19 @@ from mock.mock_app.handlers.routers import work_router, settings_router
from argenta.app import App
from argenta.app.defaults import PredeterminedMessages
from argenta.app.dividing_line import DynamicDividingLine
from argenta.app.autocompleter import AutoCompleter
app: App = App(dividing_line=DynamicDividingLine())
autocompleter = AutoCompleter('./mock/.history')
app: App = App(dividing_line=DynamicDividingLine(),
autocompleter=autocompleter)
def main():
app.include_routers(work_router, settings_router)
app.add_message_on_startup(PredeterminedMessages.USAGE)
app.add_message_on_startup(PredeterminedMessages.AUTOCOMPLETE)
app.add_message_on_startup(PredeterminedMessages.HELP + '\n\n')
app.start_polling()