Releases: AzeevAN/bslfmt
Releases · AzeevAN/bslfmt
Release list
v0.27.0
Бэклог ревью 0.25.0. Несовместимо (MINOR в 0.x): ElseIf больше не
ключевое слово.
Изменено
ElseIfбольше не ключевое слово: в BSL толькоElsIf(синтакс-помощник,
грамматика 1c-syntax —ИНАЧЕЕСЛИ|ELSIF).ElseIfтеперь
идентификатор,#ElseIf— неизвестная директива (отказ). В корпусе
ElseIfв коде не встречается.- README: имя метода, совпадающее с ключевым словом, в объявлении получает
канонический регистр, а в вызове через точку — нет. - Тесты регистра: «.» в конце строки перед областью правки и английские
слова сразу после области правки.
Исправлено
- Метка с именем ключевого слова (
Перейти ~Если; ~Если:,~Цикл:,
~попытка:,~КонецЕсли:) давала отказ или разрыв~Цикл⏎:. Слово
после~— имя метки, как слово после.— имя свойства: ключевым оно
не считается ни для отступов, ни для переноса строк, ни какТогда/Цикл
в заголовке. - Слово после
.и пробела (Объект. если, в том числе NBSP или
\u2028между ними) считалось ключевым словом: отказ «незавершённое
многострочное условие», а регистр менялся. Теперь это имя свойства, как
и без пробела. Точка после числа (1. Тогда) — часть числа, слово за
ней остаётся ключевым.
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больше не подменяет исходную ошибку.
v0.25.0
Изменено
- Регистр ключевых слов приводится к написанию синтакс-помощника 1С:
или→Или,конецЕсЛи→КонецЕсли,НЕ→Не,NULL→Null,
английские — в своём языке (endif→EndIf). Так же имена директив
препроцессора и символы условий (#если сервер тогда→
#Если Сервер Тогда,#область→#Область) и аннотации
(&наклиенте→&НаКлиенте). Не меняются строки и тексты запросов,
даты, комментарии, области#Вставка/#Удаление, слова после.
(свойства и методы) и~(метки), имена областей, неизвестные
аннотации и символы препроцессора. Раскладка и отступы те же.
Несовместимо: массово меняется вывод — код с ключевыми словами в
нестандартном регистре (ИЛИ,НЕ,каждого) переписывается.
v0.24.0
Изменено
- Раскладка по ширине 120: инструкция, в том
числе заголовок и объявление, которая с отступом (таб — 4) помещается в
120 знаков, — одна строка; иначе режется по порядкуИли→И→+
(оператор в начале строки) → последняя пара скобок (параметры одной
строкой, иначе по одному,)отдельной строкой), рекурсивно; некуда
резать — как было. Комментарий в конце в ширину не входит. Не трогаются
инструкции с комментарием внутри, многострочным литералом или подряд
идущими литералами, директивой, областью правки; литералы не режутся.
Выравнивание табами перед комментарием в конце раскладываемой инструкции
становится одним пробелом.
Несовместимо: массово меняется вывод — длинные инструкции переносятся,
многострочные инструкции автора приводятся к единой форме, выравнивание
продолжений под скобку не сохраняется. - Выпуск (
release.yml): публикация на PyPI ждёт полного набора тестов
(tests.ymlна Windows, macOS, Linux), а не только сборки и установки.
Исправлено
- Строка, начинающаяся с оператора,
.,[,,,)или литерала после
строки без;, — продолжение инструкции (раньше вставала на уровень
инструкции);Экспортна своей строке — часть объявления.
v0.23.0
Изменено
- Перенос строк: каждая инструкция — на своей строке; тело однострочных
Если/ИначеЕсли/Иначе, циклов иПопытка/Исключение— со
следующей строки, концы блоков и ветви — отдельными строками
(Если А Тогда Б(); КонецЕсли;→ три строки). Несовместимо: меняется
вывод для кода с несколькими инструкциями или блоком в одной строке. - Код после конца многострочного литерала (
"; Если …) переносится на
новую строку, а не вызывает отказ. -sbcудаляет и строки-комментарии BSL между строками многострочного
литерала (//| Поле,в тексте запроса): в значение строки они не
входят. Комментарии внутри самого текста (|// …) по-прежнему остаются —
это маркеры дляСтрЗаменитьи разделитель пакета запросов. Итоговая
проверка сверяет значения строк дословно.
v0.21.0
Изменено
- 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
Добавлено
- Выпуск по тегу (
.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.