Repository navigation
v0.26.0
Исправления бэклога ревью 0.24.0 и аудита 0.25.0. Несовместимо (MINOR в
0.x): меняется вывод для конструкций ниже (английские And/Or/Not и
Новый/Процедура в конце строки, идентификаторы с буквами вне кириллицы
и латиницы, пробелы после До/От/Шаг); CLI принимает короткие флаги
только целиком.
Изменено
- Инструкции с идентификаторами из букв вне кириллицы и латиницы
(украинскиеі,ї,є, казахскиеҚ,Ү…) раскладываются по ширине
120, как остальные; раньше оставались как есть. - CLI: короткие флаги (
-i,-h,-sbc) принимаются только целиком:-s
и-sbмолча работали как-sbcи удаляли комментарии (argparse
принимает префикс однодефисного флага). Остальное — ошибка с кодом 2. - CLI: файл или стандартный ввод больше 80 000 000 байт не читается
целиком (отказ сразу за пределом); устройства и сокеты не читаются, канал
(bslfmt <(команда)) — можно. - Скорость: после переноса строк модуль больше не разбирается и не
маскируется заново — маска нового текста строится теми же срезами;
раскладка нормализует инструкцию без поиска директив и областей правки;
хвостовой оператор ищется по концу строки. Самый большой модуль корпуса
(3,9 млн знаков): 2,67 с → 2,40 с. - Выпуск: GitHub Actions закреплены по полному SHA (версия — в
комментарии, обновлять вручную); версииbuildиpipxточные. Хеши собранных файлов передаются из сборки в
публикацию и сверяются перед загрузкой на PyPI.actions/checkout— без
сохранения токена, уtests.yml— права только на чтение. Ручной запуск
release.ymlне публикует, даже на теге, и не гоняет полный набор тестов
(уtests.ymlсвой ручной запуск). - Код:
formatter.pyразрезан по проходам —spacing.py(пробелы),
breaks.py(маска и перенос строк),verify.py(итоговая сверка),
patches.py(области правки, вынесены изlexer.py),_text.py(общие
помощники),errors.py; раскладка инструкции — отдельный класс; таблицы
ключевых слов — только вkeywords.py. Публичный API (format_code,
lex,restore,Token,FormatError,LexerError) не менялся. - Тесты разделены по темам (
test_layout,test_spacing,
test_strip_comments,test_performance), CLI — вtest_cli; общая
проверка «форматирование + идемпотентность»; тесты скорости сравнивают
рост времени, а не абсолютный порог. - README:
format_codeбросает иLexerError(незакрытая строка или
дата), не толькоFormatError;-iсоздаёт новый файл (владелец, ACL,
жёсткие ссылки не сохраняются) и переписывает цель символической ссылки.
Исправлено
- Английские
And/Or/Notв конце строки, как и русскиеИ/Или/Не,
продолжают выражение на следующей строке:А = Б Or⏎C;→А = Б Or C;,
длинная инструкция режется поOrс отступом продолжения. Слово после
.(Объект.Или) оператором не считается. Новый/NewиПроцедура/Функцияв конце строки не заканчивают
инструкцию: имя типа или метода на следующей строке — её продолжение
(А = Новый⏎Структура;→А = Новый Структура;,Процедура⏎П()→
Процедура П()). Раньше следующая строка считалась отдельной
инструкцией, а тело метода сдвигалось.- Объявление
Асинх Процедура/Асинх Функция, разнесённое на несколько
строк, раскладывается, как обычное объявление. - Ложный отказ на идентификаторе с буквой вне русского алфавита, внутри
которого есть структурное слово:Х = ЦиклІнтервал; У = 1;→
«форматирование изменило значимые токены»,Х = КонецЕслиІ;—
«структурное слово внутри продолжения выражения». Граница слова теперь
одна во всех проходах: буква любого алфавита, цифра или_; ключевым
словом считается только слово из кириллицы и латиницы (Elſe— не
Else). - Пробелы вокруг
-/+после идентификаторовДо,От,Шаг(в BSL это
не ключевые слова) и после идентификатора видаХ1E(не число с
порядком):Х = До-От;→Х = До - От;,Х1E-2→Х1E - 2. - Раскладка параметров по одному давала строку в 121 знак: параметр ровно в
120 без запятой считался влезшим. Теперь запятая учитывается, и такой
параметр режется поИли/И/+. - Раскладка: запасной путь (когда части нельзя взять срезами одной
нормализованной строки) ставил пробел после ведущегоИ/Илии там, где
у автора его нет (И(→И (); теперь части совпадают с основным путём. - Квадратичное время на одной длинной строке со словами конца блока
(КонецЕсли,Иначе…): строка в 40 000 слов обрабатывалась 5 с. - CLI:
--diffдля файла без перевода строки в конце склеивал строки и
заголовок следующего файла; теперь, как уdiffиgit, — маркер
\ No newline at end of file. - CLI:
bslfmt файл | head— без сообщенияBroken pipe; код выхода — по
уже известному результату. На Windows (закрытый канал даётEINVAL) —
так же. - CLI: ошибки ОС — по-русски и без повтора пути (
./нет.bsl: файл не найден), в том числе нет места на диске, файловая система только для
чтения и другие; вместо имени временного файла-i— имя исходного. - CLI:
--output -создавал файл с именем-; теперь — ошибка аргументов. - CLI: имя файла с байтами не из UTF-8 давало traceback и код 1; теперь
выводится как\udcff. - CLI:
-iсбрасывает новый текст на диск до замены файла; сбой уборки
после ошибки--outputбольше не подменяет исходную ошибку.