Задача курса
Python: Классификатор строк диагностики по инструменту
Курс «Python для продвинутых: ООП, типизация и тестирование» · урок «Formatter, linter и mypy в связке: роли и исправление дефектов»
Условие
Классификатор строк диагностики по инструменту
Ты пишешь утилиту для CI-пайплайна, которая читает смешанный вывод трёх инструментов — black, ruff и mypy — и формирует сводку: сколько строк диагностики относится к каждому инструменту, а для ruff — ещё и разбивку по категории кода правила.
Что уже дано
Проверяющая система ничего не создаёт заранее. Программа получает данные через stdin и должна напечатать результат в stdout.
В редакторе есть каркас с TODO-метками.
Что нужно сделать
Напиши программу, которая:
- Читает строки из
stdinдо конца потока. - Классифицирует каждую строку по инструменту:
- mypy: строка содержит подстроку
[и заканчивается]— это признак кода ошибки mypy, например[arg-type]или[return-value]; при этом строка не является строкой ruff (см. ниже). - ruff: строка содержит подстроку
:и после последнего:следует токен, который начинается с заглавной латинской буквы и содержит только буквы и цифры (код правила ruff, напримерF401,E501,N802). - black: строка начинается с
reformattedили содержит подстрокуwould reformat. - unknown: не подошла ни под одну категорию.
- Выводит итоговую сводку в формате (порядок строк фиксирован):
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, категорияFsrc/app.py:3:5: E501 Line too long (92 > 88)— ruff, категорияEsrc/app.py:7: error: Incompatible return value type [return-value]— mypyreformatted src/app.py— blackwould reformat src/utils.py— blackAll 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
