Skip to content

v0.26.0

Choose a tag to compare

@github-actions github-actions released this 02 Oct 15:17
· 6 commits to main since this release

Исправления бэклога ревью 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 больше не подменяет исходную ошибку.