Skip to content

Поддержка semver в части пререлизов и метаданных билда #7

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 31 commits into from
May 19, 2025

Conversation

EvilBeaver
Copy link
Member

@EvilBeaver EvilBeaver commented May 2, 2025

Реализована поддержка пререлизов и метаданных сборок по semver

closes #2

Нарушена обратная совместимость при которой все версии с пререлизами, но ошибками - считались валидными, но без пререлизов.

Версия нужна для бэкенда сайта oscript.io для корректной сортировки версий

Summary by CodeRabbit

  • Новые возможности
    • Добавлена поддержка метаданных сборки (build metadata) в версиях, улучшено сравнение и парсинг предварительных релизов согласно семантическому версионированию.
    • Введён новый парсер версий с токенизацией для более надёжного разбора строк версий.
  • Исправления ошибок
    • Улучшено сообщение об ошибках при разборе некорректных строк версий.
  • Документация
    • Добавлены и обновлены тесты для проверки парсинга, сравнения и строкового представления версий.
  • Инфраструктура
    • Добавлен новый workflow "Контроль качества" и обновлены существующие workflows для тестирования с расширенной матрицей.
    • Обновлены зависимости и версия пакета.
    • Скорректированы пути и настройки генерации отчётов покрытия кода.
  • Рефакторинг
    • Оптимизирована функция поиска максимальной версии без использования внешних коллекций.

@EvilBeaver EvilBeaver requested review from nixel2007, otymko and sfaqer May 2, 2025 12:47
@EvilBeaver EvilBeaver marked this pull request as ready for review May 13, 2025 08:23
@EvilBeaver EvilBeaver requested review from nixel2007 and sfaqer May 13, 2025 08:23
@EvilBeaver EvilBeaver changed the title WIP: Поддержка semver в части пререлизов и метаданных билда Поддержка semver в части пререлизов и метаданных билда May 13, 2025
@nixel2007 nixel2007 self-requested a review May 19, 2025 06:48
@nixel2007
Copy link
Member

@coderabbitai review

Copy link

coderabbitai bot commented May 19, 2025

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link

coderabbitai bot commented May 19, 2025

"""

Walkthrough

В проект добавлены и обновлены файлы для поддержки чтения и сравнения версий с pre-release и build metadata. Внесены изменения в классы парсинга и сравнения версий, добавлены новые тесты, обновлены workflow-файлы CI/CD, а также изменены зависимости и структура тестовых сценариев.

Changes

Файл(ы) Краткое описание изменений
.github/workflows/qa.yaml, .github/workflows/testing.yml Добавлен новый workflow контроля качества, обновлён workflow тестирования: расширена матрица, исправлены параметры, изменена ссылка на внешний workflow.
packagedef Обновлена версия пакета до 1.0.0, удалена зависимость от fluent, добавлена dev-зависимость coverage.
sonar-project.properties Добавлен новый конфигурационный файл SonarQube с настройками проекта, путями исходников, тестов и отчёта покрытия.
src/core/Классы/Версия.os Существенно переработан парсер версии: реализована поддержка build metadata и prerelease, введён токенизированный разбор, улучшена обработка ошибок, изменён вывод в строку, добавлены новые процедуры и функции сравнения и разбора.
src/core/Классы/ПарсерВерсии.os Добавлен новый модуль токенизированного парсера версий: реализовано разбиение строки версии на токены (число, текст, разделитель, ошибка, конец текста), экспортированы основные функции работы с токенами.
src/core/Модули/Версии.os Удалено использование CollectionProcessor, реализован ручной поиск максимальной версии в массиве. Удалён импорт fluent.
tasks/coverage.os Изменён путь вывода отчёта покрытия с build/coverage на out, обновлены пути к файлам отчёта, удалён параметр исходников, раскомментирован импорт coverage.
tests/preReleasesTests.os, tests/versionParserTest.os Добавлены новые тесты для проверки парсинга версий с prerelease и build metadata, проверки ошибок, сравнения версий, а также отдельные тесты токенизации парсера.
tests/Версии_test.os Удалена функция получения списка тестов, добавлены аннотации &Тест к процедурам, обновлён порядок аргументов в assert, изменён формат логирования.

Sequence Diagram(s)

sequenceDiagram
    participant Тест as Тест
    participant Версия as Класс Версия
    participant Парсер as ПарсерВерсии

    Тест->>Версия: Создать("1.2.3-alpha+build.5")
    Версия->>Парсер: Инициализация парсера с версией
    Парсер->>Версия: Возвращает токены (число, точка, число, точка, число, дефис, текст, плюс, текст, точка, число)
    Версия->>Версия: Разбирает prerelease и build metadata
    Тест->>Версия: ВСтроку()
    Версия-->>Тест: "1.2.3-alpha+build.5"
Loading

Assessment against linked issues

Objective Addressed Explanation
Чтение строк pre release, чтение данных сборки (#2)

Poem

Вышел релиз, и версия стройна,
Теперь парсер ловит и build, и pre-на!
Токены бегут, как зайцы по лугу,
Ошибки ловим быстро — ну просто заслуга!
Покрытие, тесты, workflows — всё в строю,
🐇 Код-кролик доволен, прыгаю, пою!
"""

Note

⚡️ AI Code Reviews for VS Code, Cursor, Windsurf

CodeRabbit now has a plugin for VS Code, Cursor and Windsurf. This brings AI code reviews directly in the code editor. Each commit is reviewed immediately, finding bugs before the PR is raised. Seamless context handoff to your AI code agent ensures that you can easily incorporate review feedback.
Learn more here.


Note

⚡️ Faster reviews with caching

CodeRabbit now supports caching for code and dependencies, helping speed up reviews. This means quicker feedback, reduced wait times, and a smoother review experience overall. Cached data is encrypted and stored securely. This feature will be automatically enabled for all accounts on May 16th. To opt out, configure Review - Disable Cache at either the organization or repository level. If you prefer to disable all data retention across your organization, simply turn off the Data Retention setting under your Organization Settings.
Enjoy the performance boost—your workflow just got faster.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🔭 Outside diff range comments (1)
src/core/Классы/Версия.os (1)

97-105: ⚠️ Potential issue

Некорректное сравнение релизной и предрелизной версий

Согласно спецификации SemVer, стабильная версия без пререлиза (1.0.0) всегда считается старше любой версии с пререлизом (1.0.0-alpha, 1.0.0-rc.1, …).
Условие на строках 97–101 проверяет эту ситуацию только для случаев, когда у входящей версии больше одного компонента пререлиза (> 1). Если же пререлиз состоит из одного компонента (самый распространённый случай — alpha, beta, rc), управление переходит в СравнитьПререлизы, где пустой массив текущей версии приводит к возврату -1. В результате релизная версия ошибочно считается меньше.

Предлагаемый фикс:

-    Если ПреРелиз.Количество() = 0 
-        И ВходящаяВерсия.ПреРелиз.Количество() > 1 Тогда
+    Если ПреРелиз.Количество() = 0 
+        И ВходящаяВерсия.ПреРелиз.Количество() > 0 Тогда
         Возврат 1;

Также стоит добавить модульный тест, который явно сравнивает 1.0.0-alpha и 1.0.0.

🧹 Nitpick comments (3)
tasks/coverage.os (1)

25-29: Проверьте, что метод ИмяФайлаСтатистики() корректно берёт файл по умолчанию

Вы убрали явный аргумент (раньше передавался путь), теперь генератор должен сам искать stat.json в рабочем каталоге out. У большинства версий coverage-плагина это действительно дефолт, но если в проекте используется более старая версия, отчёт может не собраться.

-               .ИмяФайлаСтатистики()
+               .ИмяФайлаСтатистики("stat.json")  // во избежание сюрпризов
src/core/Классы/ПарсерВерсии.os (1)

54-106: Обработчик разделителей не потребляет символ → потенциальный бесконечный цикл

После попадания на разделитель цикл прерывается, но переменная Индекс не изменяется, если ЧислоСимволов = 0.
Ниже, в ветке «это разделитель», символ читается через Сред(...), а затем Индекс инкрементируется – всё хорошо.
Тем не менее убедитесь, что ни один другой путь выхода из цикла не оставляет разделитель непрочитанным, иначе при следующем вызове ПолучитьСледующий() вы получите тот же токен и зациклитесь.

src/core/Классы/Версия.os (1)

127-129: Семантически понятнее использовать <> вместо НЕ … =

Запись НЕ Сравнить(...) = 0 читается сложнее, чем эквивалентная Сравнить(...) <> 0. Предлагаю заменить для лучшей читаемости:

-    Возврат НЕ Сравнить(ВходящаяВерсия) = 0;
+    Возврат Сравнить(ВходящаяВерсия) <> 0;
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between af9bd41 and d08cb2e.

📒 Files selected for processing (11)
  • .github/workflows/qa.yaml (1 hunks)
  • .github/workflows/testing.yml (1 hunks)
  • packagedef (2 hunks)
  • sonar-project.properties (1 hunks)
  • src/core/Классы/Версия.os (7 hunks)
  • src/core/Классы/ПарсерВерсии.os (1 hunks)
  • src/core/Модули/Версии.os (1 hunks)
  • tasks/coverage.os (1 hunks)
  • tests/preReleasesTests.os (1 hunks)
  • tests/versionParserTest.os (1 hunks)
  • tests/Версии_test.os (4 hunks)
🔇 Additional comments (10)
sonar-project.properties (1)

1-6: Конфигурация SonarQube настроена правильно

Файл конфигурации содержит все необходимые параметры для анализа кода: идентификатор и название проекта, пути к исходному коду и тестам, кодировка и путь к отчету о покрытии. Структура соответствует стандартам SonarQube.

packagedef (2)

7-7: Обоснованное повышение основной версии

Изменение версии с 0.6.0 на 1.0.0 корректно отражает значимость внесенных изменений в соответствии с семантическим версионированием. Поддержка пререлизов и метаданных билда - это существенное функциональное дополнение, которое заслуживает увеличения мажорной версии.


18-18: Добавлена зависимость для анализа покрытия кода

Добавление зависимости от пакета "coverage" версии 0.7.0 соответствует внедрению интеграции с сервисами анализа качества кода и согласуется с новыми workflow-файлами.

src/core/Модули/Версии.os (1)

47-54: Оптимизировано определение максимальной версии

Функция МаксимальнаяИзМассива была переработана на более прямолинейную реализацию без использования внешних зависимостей. Новая реализация корректно находит максимальную версию путем последовательного сравнения элементов массива.

Это изменение:

  1. Устраняет зависимость от библиотеки fluent
  2. Делает код более явным и понятным
  3. Сохраняет функциональную эквивалентность предыдущей реализации
.github/workflows/qa.yaml (1)

1-15: Настроен процесс контроля качества кода

Добавлен GitHub Actions workflow для анализа кода с помощью SonarQube и интеграции с Coveralls. Конфигурация корректна и использует переиспользуемый workflow из репозитория autumn-library/workflows.

Этот workflow дополняет существующую конфигурацию CI/CD и обеспечивает автоматизированный контроль качества кода при каждом изменении.

tasks/coverage.os (1)

8-10: Переезд выводов покрытия в каталог out выглядит корректно

Каталог создаётся заранее, путь к статистике прописан единообразно – проблем не вижу.

tests/Версии_test.os (3)

8-10: Аннотация &Тест улучшает авто-поиск тестов

Добавление директивы делает тесты совместимыми с oneunit и избавляет от ручного реестра. 👍


40-42: Мелкий стиль: логирование без лишних разделителей

СтрСоединить(..., " ") уже вставляет пробелы, поэтому "%1" будет выглядеть читаемо. Всё ок.


54-55: Проверьте порядок аргументов в ПроверитьРавенство

Вы поменяли местами ожидаемое и фактическое значение. В большинстве реализаций asserts именно такой порядок и используется (Ожидаемое, Фактическое), но в старых версиях библиотеки было наоборот. Если CI ранее проходил, убедитесь, что после изменения тесты всё ещё зелёные.

tests/versionParserTest.os (1)

38-41: Проверьте, не нужен ли дополнительный возврат EOF

Три последовательных вызова Парсер.Следующий() после достижения конца строки проверяют идемпотентность метода, что полезно. Однако при изменении парсера этот контракт может стать излишне строгим и привести к ложным срабатываниям. Подумайте, достаточно ли двух вызовов (первый выдаёт ТипКонецТекста, второй — удостоверяемся, что повторный вызов не падает).
[ suggest_nitpick ]

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (1)
src/core/Классы/Версия.os (1)

228-228: Дублирование функциональности в методах чтения

Как было отмечено в предыдущих комментариях, методы ПрочитатьПреРелиз и ПрочитатьМетаданныеСборки имеют очень похожую логику. Также в коде есть упоминания метода ПрочитатьОчереднойРазделитель, который не представлен в коде, но может быть связан с ПрочитатьРазделитель.

Рекомендуется рассмотреть возможность объединения дублирующейся логики в параметризованные методы для уменьшения объема кода и упрощения поддержки.

Also applies to: 281-286, 288-293

🧹 Nitpick comments (1)
src/core/Классы/Версия.os (1)

228-247: Метод для обработки разделителей

Метод ПрочитатьРазделитель корректно обрабатывает ожидаемые разделители в строке версии и выбрасывает исключение с подробным описанием ошибки при несоответствии.

Однако, логика проверки на наличие разделителя может быть упрощена.

-	Если ТекущийТокен.Тип = Парсер.ТипРазделитель Тогда
-		Если Разделитель = ТекущийТокен.Значение Тогда
-			СледующийТокен = Парсер.Следующий();
-			Если СледующийТокен.Тип = Парсер.ТипКонецТекста Тогда
-				ВызватьИсключение СтрШаблон("Неожиданный конец строки версии, нет данных после разделителя <%1>", Разделитель);
-			КонецЕсли;
-			Возврат;
-		КонецЕсли;
-	КонецЕсли;
+	Если ТекущийТокен.Тип = Парсер.ТипРазделитель
+		И Разделитель = ТекущийТокен.Значение Тогда
+			СледующийТокен = Парсер.Следующий();
+			Если СледующийТокен.Тип = Парсер.ТипКонецТекста Тогда
+				ВызватьИсключение СтрШаблон("Неожиданный конец строки версии, нет данных после разделителя <%1>", Разделитель);
+			КонецЕсли;
+			Возврат;
+	КонецЕсли;
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d08cb2e and e9683ab.

📒 Files selected for processing (3)
  • .github/workflows/testing.yml (1 hunks)
  • src/core/Классы/Версия.os (8 hunks)
  • tests/preReleasesTests.os (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • .github/workflows/testing.yml
  • tests/preReleasesTests.os
🔇 Additional comments (13)
src/core/Классы/Версия.os (13)

11-11: Корректное переименование поля и инициализация массива

Переименование поля НомерБилда на МетаданныеСборки улучшает соответствие терминологии semver. Корректная инициализация массива в конструкторе обеспечивает стабильность работы класса.

Also applies to: 20-20


51-58: Корректная реализация строкового представления согласно спецификации semver

Добавленная логика формирования строки соответствует спецификации семантического версионирования: пререлизные версии добавляются после дефиса, метаданные сборки после знака плюс. Корректно используется разделитель "." между идентификаторами.


76-76: Улучшен синтаксис тернарного оператора

Использование более краткой записи тернарного оператора делает код более читаемым.


98-98: Исправлена проверка на количество элементов в массиве

Уточнение условия для правильной проверки наличия элементов в массиве пререлизных версий.


107-107: Выделение логики сравнения пререлизов в отдельную функцию

Вынесение сложной логики сравнения пререлизных версий в отдельную функцию повышает читаемость и поддерживаемость кода. Это следует принципу единственной ответственности.


171-201: Корректная реализация сравнения пререлизных версий

Реализация соответствует спецификации semver:

  1. Больший набор пререлизных идентификаторов имеет больший приоритет при равенстве сравниваемых идентификаторов
  2. Числовые идентификаторы имеют меньший приоритет, чем текстовые
  3. Сравнение выполняется последовательно по элементам массива

Функция корректно обрабатывает все случаи сравнения, включая массивы разной длины.


212-226: Улучшена логика парсинга с использованием токенизации

Новый подход с использованием токенизатора значительно улучшает обработку строк версий. Использование объекта ПарсерВерсии для разбора строки на токены позволяет более точно обрабатывать различные части версии и корректно обрабатывать ошибки.

Обработка ошибок через блок Попытка/Исключение повышает надежность кода.


249-264: Корректное чтение числовых компонентов версии

Метод ПрочитатьЧислоДоРазделителя корректно обрабатывает числовые токены и ошибки парсинга. В случае получения токена неожидаемого типа, выбрасывается исключение с понятным описанием.


266-279: Метод обработки хвостовых массивов

Реализация метода ПрочитатьХвостовыеМассивы корректно проверяет наличие хвостовых частей версии (пререлиза и метаданных сборки) и делегирует их обработку соответствующим методам.


281-286: Методы чтения пререлиза и метаданных сборки

Методы ПрочитатьПреРелиз и ПрочитатьМетаданныеСборки корректно обрабатывают соответствующие разделы строки версии. Логика чтения у них очень похожа.

Можно рассмотреть возможность объединения этих методов в один с параметризацией, но это не критично.

Also applies to: 288-293


295-307: Метод сборки массива из компонентов

Метод СобратьМассивИзКомпонентов корректно собирает массив компонентов до встречи указанного разделителя или конца текста. Реализация универсальна для обоих типов хвостовых массивов, что является хорошей практикой.


309-325: Метод чтения компонента

Метод ПрочитатьКомпонент корректно обрабатывает числовые и текстовые компоненты. Для текстовых компонентов правильно реализована поддержка дефисов внутри компонента, что соответствует спецификации semver.


327-334: Метод подготовки строки версии

Метод ПодготовитьКЧтению корректно удаляет префикс "v" из строки версии, что делает обработку более гибкой.

@nixel2007 nixel2007 merged commit bc80ad2 into develop May 19, 2025
25 checks passed
@@ -95,7 +95,7 @@
КонецЕсли;

Если ПреРелиз.Количество() = 0
И ВходящаяВерсия.ПреРелиз.Количество() > 1 Тогда
И ВходящаяВерсия.ПреРелиз.Количество() > 0 Тогда
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А тест?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Предыдущим коммитом

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Доделать функциональность чтения версий с pre релизом и номерами сборки
4 participants