Задача курса

Python: Классификатор строк диагностики по инструменту

Курс «Python для продвинутых: ООП, типизация и тестирование» · урок «Formatter, linter и mypy в связке: роли и исправление дефектов»

Условие

Классификатор строк диагностики по инструменту

Ты пишешь утилиту для CI-пайплайна, которая читает смешанный вывод трёх инструментов — black, ruff и mypy — и формирует сводку: сколько строк диагностики относится к каждому инструменту, а для ruff — ещё и разбивку по категории кода правила.

Что уже дано

Проверяющая система ничего не создаёт заранее. Программа получает данные через stdin и должна напечатать результат в stdout.

В редакторе есть каркас с TODO-метками.

Что нужно сделать

Напиши программу, которая:

  1. Читает строки из stdin до конца потока.
  2. Классифицирует каждую строку по инструменту:
  • mypy: строка содержит подстроку [ и заканчивается ] — это признак кода ошибки mypy, например [arg-type] или [return-value]; при этом строка не является строкой ruff (см. ниже).
  • ruff: строка содержит подстроку : и после последнего : следует токен, который начинается с заглавной латинской буквы и содержит только буквы и цифры (код правила ruff, например F401, E501, N802).
  • black: строка начинается с reformatted или содержит подстроку would reformat.
  • unknown: не подошла ни под одну категорию.
  1. Выводит итоговую сводку в формате (порядок строк фиксирован):
mypy: <N>
ruff: <N>
black: <N>
unknown: <N>

ruff categories:
<LETTER>: <N>
...

Где в секции ruff categories: перечислены только те буквы-префиксы кодов правил ruff, которые встретились, в алфавитном порядке. Буква-префикс — первая буква кода правила (например, для F401 это F).

Если строк ruff не было, секция ruff categories: выводится с пустым телом (только заголовок).

Ввод и вывод

Программа читает данные из stdin и пишет результат в stdout.

Формат ввода

Каждая строка — одна запись диагностики из вывода одного из трёх инструментов или произвольный текст. Строки могут идти в любом порядке и любом количестве. Ввод заканчивается по EOF.

Примеры строк разных инструментов:

  • src/app.py:1:8: F401 \'os\' imported but unused — ruff, категория F
  • src/app.py:3:5: E501 Line too long (92 > 88) — ruff, категория E
  • src/app.py:7: error: Incompatible return value type [return-value] — mypy
  • reformatted src/app.py — black
  • would reformat src/utils.py — black
  • All done! — unknown

Формат вывода

Четыре строки счётчиков, затем пустая строка, затем заголовок ruff categories: и строки категорий в алфавитном порядке.

Примеры

Пример 1

Ввод
src/app.py:1:8: F401 'os' imported but unused
src/app.py:3:5: E501 Line too long (92 > 88)
src/app.py:5:1: N802 Function name should be lowercase
src/app.py:7: error: Incompatible return value type [return-value]
src/app.py:12: error: Argument 1 has incompatible type [arg-type]
reformatted src/utils.py
All done!
src/models.py:2:1: F811 Redefinition of unused name
Ожидаемый результат
mypy: 2
ruff: 4
black: 1
unknown: 1

ruff categories:
E: 1
F: 2
N: 1

Попробуйте решить

РешениеPython
Без регистрации · результат не сохраняется