Skip to content

Releases: AzeevAN/bslfmt

v0.27.0

Choose a tag to compare

@github-actions github-actions released this 02 Oct 17:41

Бэклог ревью 0.25.0. Несовместимо (MINOR в 0.x): ElseIf больше не
ключевое слово.

Изменено

  • ElseIf больше не ключевое слово: в BSL только ElsIf (синтакс-помощник,
    грамматика 1c-syntax — ИНАЧЕЕСЛИ | ELSIF). ElseIf теперь
    идентификатор, #ElseIf — неизвестная директива (отказ). В корпусе
    ElseIf в коде не встречается.
  • README: имя метода, совпадающее с ключевым словом, в объявлении получает
    канонический регистр, а в вызове через точку — нет.
  • Тесты регистра: «.» в конце строки перед областью правки и английские
    слова сразу после области правки.

Исправлено

  • Метка с именем ключевого слова (Перейти ~Если; ~Если:, ~Цикл:,
    ~попытка:, ~КонецЕсли:) давала отказ или разрыв ~Цикл⏎:. Слово
    после ~ — имя метки, как слово после . — имя свойства: ключевым оно
    не считается ни для отступов, ни для переноса строк, ни как Тогда/Цикл
    в заголовке.
  • Слово после . и пробела (Объект. если, в том числе NBSP или
    \u2028 между ними) считалось ключевым словом: отказ «незавершённое
    многострочное условие», а регистр менялся. Теперь это имя свойства, как
    и без пробела. Точка после числа (1. Тогда) — часть числа, слово за
    ней остаётся ключевым.

v0.26.0

Choose a tag to compare

@github-actions github-actions released this 02 Oct 15:17

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

v0.25.0

Choose a tag to compare

@github-actions github-actions released this 02 Oct 10:58

Изменено

  • Регистр ключевых слов приводится к написанию синтакс-помощника 1С:
    или → Или, конецЕсЛи → КонецЕсли, НЕ → Не, NULL → Null,
    английские — в своём языке (endif → EndIf). Так же имена директив
    препроцессора и символы условий (#если сервер тогда →
    #Если Сервер Тогда, #область → #Область) и аннотации
    (&наклиенте → &НаКлиенте). Не меняются строки и тексты запросов,
    даты, комментарии, области #Вставка/#Удаление, слова после .
    (свойства и методы) и ~ (метки), имена областей, неизвестные
    аннотации и символы препроцессора. Раскладка и отступы те же.
    Несовместимо: массово меняется вывод — код с ключевыми словами в
    нестандартном регистре (ИЛИ, НЕ, каждого) переписывается.

v0.24.0

Choose a tag to compare

@github-actions github-actions released this 01 Oct 04:58

Изменено

  • Раскладка по ширине 120: инструкция, в том
    числе заголовок и объявление, которая с отступом (таб — 4) помещается в
    120 знаков, — одна строка; иначе режется по порядку Или → И → +
    (оператор в начале строки) → последняя пара скобок (параметры одной
    строкой, иначе по одному, ) отдельной строкой), рекурсивно; некуда
    резать — как было. Комментарий в конце в ширину не входит. Не трогаются
    инструкции с комментарием внутри, многострочным литералом или подряд
    идущими литералами, директивой, областью правки; литералы не режутся.
    Выравнивание табами перед комментарием в конце раскладываемой инструкции
    становится одним пробелом.
    Несовместимо: массово меняется вывод — длинные инструкции переносятся,
    многострочные инструкции автора приводятся к единой форме, выравнивание
    продолжений под скобку не сохраняется.
  • Выпуск (release.yml): публикация на PyPI ждёт полного набора тестов
    (tests.yml на Windows, macOS, Linux), а не только сборки и установки.

Исправлено

  • Строка, начинающаяся с оператора, ., [, ,, ) или литерала после
    строки без ;, — продолжение инструкции (раньше вставала на уровень
    инструкции); Экспорт на своей строке — часть объявления.

v0.23.0

Choose a tag to compare

@github-actions github-actions released this 28 Sep 18:46

Изменено

  • Перенос строк: каждая инструкция — на своей строке; тело однострочных
    Если/ИначеЕсли/Иначе, циклов и Попытка/Исключение — со
    следующей строки, концы блоков и ветви — отдельными строками
    (Если А Тогда Б(); КонецЕсли; → три строки). Несовместимо: меняется
    вывод для кода с несколькими инструкциями или блоком в одной строке.
  • Код после конца многострочного литерала ("; Если …) переносится на
    новую строку, а не вызывает отказ.
  • -sbc удаляет и строки-комментарии BSL между строками многострочного
    литерала (//| Поле, в тексте запроса): в значение строки они не
    входят. Комментарии внутри самого текста (|// …) по-прежнему остаются —
    это маркеры для СтрЗаменить и разделитель пакета запросов. Итоговая
    проверка сверяет значения строк дословно.

v0.21.0

Choose a tag to compare

@github-actions github-actions released this 27 Sep 04:24

Изменено

  • CLI: длинные флаги больше не сокращаются (--in не означает
    --in-place) — несовместимо для тех, кто пользовался сокращениями.
  • -h/--help показывает справку при любых других аргументах.
  • Комментарий перед строкой, начинающейся с ), встаёт на уровень
    параметров (+1 к строке )), как комментарий перед КонецЕсли; над
    ), выровненной с параметрами, — на её уровне.
  • Строка после Возврат без значения — продолжение (+1); текст запроса —
    как после =; КонецЕсли и другие структурные строки не затрагиваются.
  • После ;, за которой в той же строке идёт код, — ровно один пробел
    (А = 1;Б = 2; → А = 1; Б = 2;). Пустой оператор ;; и ; перед
    комментарием не меняются.

Исправлено

  • Ошибки CLI по-русски: префикс argparse «аргумент», «файл не найден»,
    «файл уже существует», «это каталог, а не файл», «нет доступа», «файл не
    в кодировке UTF-8»; путь указывается, если это не сам входной файл
    (например, --output); пустое имя файла — ошибка аргументов.
  • -i: сбой вывода сводки (закрытый stdout, Broken pipe) больше не
    помечает уже записанный файл неудачным.
  • Подсчёт изменённых строк в сводке -i — за один проход и точный
    (изменённые плюс удалённые): на больших модулях сравнение difflib
    занимало больше секунды и завышало число.
  • --version при запуске из исходников показывает версию из
    pyproject.toml, а не установленного пакета.
  • Итоговая проверка значимых токенов не обманывается управляющими
    символами \x00–\x03 в коде (теоретическая коллизия быстрой
    сигнатуры).
  • Текст запроса после = остаётся на уровне инструкции и когда между ними
    директива #Если/#Иначе; строка после литерала (Вызов(А = "а" /
    "б")) — обычное продолжение (+1).

v0.20.1

Choose a tag to compare

@github-actions github-actions released this 26 Sep 21:20

Добавлено

  • Выпуск по тегу (.github/workflows/release.yml): сборка колеса и архива
    исходников, проверка установки через pip, pipx, uv tool и uvx на
    Windows, macOS и Linux со смоуком CLI, публикация на PyPI (доверенная
    публикация, без токенов) и GitHub Release с выдержкой из CHANGELOG.
  • README: раздел «Установка» (uv tool install bslfmt, pipx install bslfmt,
    uvx bslfmt) и команды для агентов и хуков.

Изменено

  • Метаданные пакета: описание, ключевые слова, ссылки на репозиторий,
    версии Python.