feat(logs): раздел «Логи» — хвост и свой grep (#16)
CI / ruff · mypy · pytest (pull_request) Successful in 9m40s
CI / ruff · mypy · pytest (pull_request) Successful in 9m40s
- app/logs/grep.py: подмножество grep (шаблон, -i -v -E -c -C N), разбор shlex без исполнения, BRE → regex, таймаут на строку и бюджет на поиск, лимиты 200 символов / 500 строк вывода - app/logs/journal.py: каждый поиск в log_queries (L-6) - бот: выбор контейнера, хвост 50/200 строк или 5 мин/1 ч/24 ч, свой grep по 24 ч, длинный результат — файлом .log (L-5) - логи Docker: не больше 50 000 строк и 5 МБ, сохраняются новейшие - fix: кнопки меню и /menu, /help больше не проглатываются шагами ввода (имя файла, содержимое, сообщение коммита, grep) — фильтр free_input Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -160,3 +160,15 @@ async def test_protected_file_cannot_be_replaced(tg: TgClient, texts: Texts, rep
|
||||
|
||||
answer = tg.session.sent(AnswerCallbackQuery)[-1]
|
||||
assert answer.text == texts.commit.protected and answer.show_alert
|
||||
|
||||
|
||||
@pytest.mark.parametrize("escape", ["menu_status", "/menu", "/help"])
|
||||
async def test_menu_and_commands_escape_input_states(tg: TgClient, texts: Texts, escape: str) -> None:
|
||||
text = texts.menu.status if escape == "menu_status" else escape
|
||||
await to_hello(tg, texts)
|
||||
await tg.press(ADMIN, cb(Act.NEW_FILE))
|
||||
await tg.send(ADMIN, text)
|
||||
|
||||
reply = last_text(tg)
|
||||
assert reply.text != texts.commit.bad_name
|
||||
assert not reply.text.startswith(texts.commit.ask_content.split("{")[0])
|
||||
|
||||
Reference in New Issue
Block a user