Skip to content

Подготовка к поддержке V2 и исправление ошибки в 1.6.0 #43

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 20 commits into from
Jun 3, 2025

Conversation

EvilBeaver
Copy link
Member

@EvilBeaver EvilBeaver commented May 25, 2025

Изменения

  • Поиск версий на сайте не использовал настройки прокси
  • Выделены желуди интернет-соединения, определителя дистрибутивов, поставщика данных с сайта
  • ПараметрыOVM сделан дубом для инжекта конкретных опций
  • Добавлены тесты
  • Добавлен москито для мока системной информации, но по итогу не очень пригодился, оставлен для обсуждения

Summary by CodeRabbit

  • Новые возможности
    • Внедрён централизованный провайдер версий с API для получения списка доступных версий и файлов дистрибутивов.
    • Добавлен модуль для создания интернет-соединений с поддержкой прокси.
    • Реализован механизм выбора дистрибутива с учётом платформы, архитектуры, Netcore, FDD и алиасов.
    • Введён новый класс и модуль для определения информации о процессоре и окружении.
    • Добавлен комплексный набор параметризованных тестов для проверки выбора дистрибутивов.
  • Обновления зависимостей
    • Обновлены версии зависимостей, добавлены новые библиотеки и удалена зависимость json.
  • Исправления
    • Упрощена логика подключения к интернету через фабрику, исключена ручная настройка прокси.
    • Перенесена инициализация системной информации в процедуру создания объекта.
    • Удалены внутренние HTTP-запросы и JSON-парсинг из функций получения версий, теперь используется провайдер.
    • Обновлён механизм валидации номеров версий с использованием регулярных выражений.
  • Документация и инфраструктура
    • Добавлен GitHub Actions workflow для автоматического тестирования.
    • Создан конфигурационный файл для тестовой среды.
    • Расширены интеграционные сценарии с учётом платформенных особенностей и изменён синтаксис вызова команд.
  • Стиль и рефакторинг
    • Переработано чтение JSON с использованием встроенного парсера для повышения читаемости.
    • Упрощена структура инициализации приложения, удалены устаревшие компоненты и аннотации.

Copy link

coderabbitai bot commented May 25, 2025

## Walkthrough

В проект добавлены новые модули для определения окружения, выбора подходящего дистрибутива и работы с интернет-соединением, а также полностью переработана логика получения и выбора версий дистрибутивов. Зависимости обновлены и расширены, добавлены тесты для проверки выбора дистрибутива, внедрён workflow тестирования.

## Changes

| Файл/Группа файлов                                             | Краткое описание изменений                                                                                  |
|---------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------|
| packagedef                                                    | Обновлены версии зависимостей, добавлены и удалены зависимости, обновлены dev-зависимости.                  |
| src/core/Классы/ВерсииOneScript.os                            | Переписана логика получения версий: делегирование провайдеру, удалён прямой HTTP/JSON, добавлен regex semver.|
| src/core/Классы/ДетекторОкружения.os                          | Новый модуль: определение типа платформы и архитектуры процессора.                                          |
| src/core/Классы/ОпределительДистрибутива.os                   | Новый модуль: выбор подходящего дистрибутива по окружению и параметрам.                                     |
| src/core/Классы/ПараметрыOVM.os                               | Перенесена инициализация, добавлены типы возвращаемых значений, удалён regex semver.                        |
| src/core/Классы/ПровайдерДистрибутивовВерсии.os               | Новый модуль: получение списка версий и файлов дистрибутивов через API.                                     |
| src/core/Классы/УстановщикOneScript.os                        | Удалена ручная работа с прокси, делегирование фабрике соединения и определителю дистрибутива.               |
| src/core/Классы/ФабрикаИнтернетСоединения.os                  | Новый модуль: создание интернет-соединения с учётом прокси.                                                 |
| src/core/Классы/ДубСПроцессором.os                            | Новый модуль: класс Дуб с информацией о процессоре для детектора окружения.                                 |
| src/cmd/ovm.os                                                | Удалена инициализация компонентов и аннотаций, остался только запуск приложения.                            |
| tests/distrSelectorTests.os                                   | Новый набор тестов: проверка выбора дистрибутива по платформе, архитектуре и флагам.                        |
| tests/oscript.cfg                                             | Новый конфиг: путь к системным библиотекам для тестов.                                                      |
| .github/workflows/testing.yml                                 | Новый workflow: автоматическое тестирование на разных версиях и движках.                                    |
| tasks/coverage.os                                             | Упрощено чтение JSON-отчёта покрытия с помощью ЧтениеJSON.                                                  |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant Installer as Установщик
    participant DistrProvider as ПровайдерДистрибутивов
    participant DistrSelector as ОпределительДистрибутива
    participant EnvDetector as ДетекторОкружения
    participant Factory as ФабрикаИнтернетСоединения

    Installer->>Factory: Создать соединение
    Installer->>DistrProvider: ПолучитьСписокДоступныхКУстановкеВерсий()
    DistrProvider->>Factory: Создать соединение
    DistrProvider->>DistrProvider: HTTP GET api/archive
    DistrProvider-->>Installer: Таблица версий

    Installer->>DistrProvider: ПолучитьДоступныеВидыДистрибутивовВерсии(версия)
    DistrProvider->>Factory: Создать соединение
    DistrProvider->>DistrProvider: HTTP GET api/archive?all=true
    DistrProvider->>DistrProvider: HTTP GET api/archive/<token>
    DistrProvider-->>Installer: Таблица файлов дистрибутивов

    Installer->>EnvDetector: Получить платформу и архитектуру
    Installer->>DistrSelector: Выбрать(таблица файлов)
    DistrSelector->>EnvDetector: Получить платформу/архитектуру
    DistrSelector-->>Installer: Ссылка на подходящий дистрибутив

Possibly related PRs

  • oscript-library/ovm#41: Улучшение выбора файла дистрибутива по платформе и версии.
  • oscript-library/ovm#37: Получение версий через API с fallback на HTML.
  • oscript-library/ovm#36: Поддержка MacOS ARM и изменение определения типа платформы.

Suggested reviewers

  • nixel2007
  • sfaqer

Poem

В лесу модулей кролик бежал,
Дистрибутивы ловко выбирал.
Окружение чутко определял,
Через фабрику сеть подключал.
Семвер-маска теперь на посту,
Всё тестами крыто — порядок в бору!
🐇✨


<!-- walkthrough_end -->


---

<details>
<summary>📜 Recent review details</summary>

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


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between aa4ba950474bbf9a4e7482edae3a15fa20b2060a and a977ffe53c9467304174227940788da64c8286a3.

</details>

<details>
<summary>📒 Files selected for processing (1)</summary>

* `src/core/Классы/ОпределительДистрибутива.os` (1 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* src/core/Классы/ОпределительДистрибутива.os

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (20)</summary>

* GitHub Check: test (stable, 1testrunner) / build (ubuntu-latest, stable, 1testrunner)
* GitHub Check: test (default, 1testrunner) / build (windows-latest, default, 1testrunner)
* GitHub Check: test (dev, 1testrunner) / build (windows-latest, dev, 1testrunner)
* GitHub Check: test (default, 1testrunner) / build (ubuntu-latest, default, 1testrunner)
* GitHub Check: test (dev, 1testrunner) / build (macos-latest, dev, 1testrunner)
* GitHub Check: test (dev, oneunit) / build (ubuntu-latest, dev, oneunit)
* GitHub Check: test (stable, 1testrunner) / build (windows-latest, stable, 1testrunner)
* GitHub Check: test (dev, 1testrunner) / build (ubuntu-latest, dev, 1testrunner)
* GitHub Check: test (dev, oneunit) / build (windows-latest, dev, oneunit)
* GitHub Check: test (dev, 1testrunner) / build (macos-latest, dev, 1testrunner)
* GitHub Check: test (dev, 1testrunner) / build (ubuntu-latest, dev, 1testrunner)
* GitHub Check: test (dev, 1testrunner) / build (windows-latest, dev, 1testrunner)
* GitHub Check: test (dev, oneunit) / build (ubuntu-latest, dev, oneunit)
* GitHub Check: test (dev, oneunit) / build (macos-latest, dev, oneunit)
* GitHub Check: test (stable, 1testrunner) / build (windows-latest, stable, 1testrunner)
* GitHub Check: test (stable, 1testrunner) / build (ubuntu-latest, stable, 1testrunner)
* GitHub Check: test (stable, 1testrunner) / build (macos-latest, stable, 1testrunner)
* GitHub Check: test (default, 1testrunner) / build (macos-latest, default, 1testrunner)
* GitHub Check: test (default, 1testrunner) / build (ubuntu-latest, default, 1testrunner)
* GitHub Check: test (default, 1testrunner) / build (windows-latest, default, 1testrunner)

</details>

</details>
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- tips_start -->

---

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.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=oscript-library/ovm&utm_content=43):

- 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](https://www.coderabbit.ai/contact-us/support) 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](https://docs.coderabbit.ai/finishing-touches/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](https://docs.coderabbit.ai/guides/configure-coderabbit) 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](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

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: 3

🧹 Nitpick comments (3)
src/core/Классы/ПровайдерДистрибутивовВерсии.os (1)

76-89: Предложение по оптимизации поиска токена

Текущий поиск токена использует линейный перебор. Для больших списков версий можно рассмотреть использование соответствия для ускорения поиска.

-	ИскомыйТокенВерсии = Неопределено;
-	Для Каждого ОписаниеВерсии Из МассивВерсий Цикл
-		Если НомерВерсии = ОписаниеВерсии.presentation Тогда
-			ИскомыйТокенВерсии = ОписаниеВерсии.token;
-		КонецЕсли;
-	КонецЦикла;
+	СоответствиеТокенов = Новый Соответствие;
+	Для Каждого ОписаниеВерсии Из МассивВерсий Цикл
+		СоответствиеТокенов.Вставить(ОписаниеВерсии.presentation, ОписаниеВерсии.token);
+	КонецЦикла;
+	ИскомыйТокенВерсии = СоответствиеТокенов.Получить(НомерВерсии);
tests/distrSelectorTests.os (2)

221-225: Вынести бизнес-логику в отдельную функцию

Сложная условная логика для определения типа дистрибутива усложняет понимание кода и должна быть вынесена в отдельную функцию.

+Функция ОпределитьВидДистрибутива(ИспользоватьFDD, ОжидаемыйДистрибутив)
+	Вид = ?(ИспользоватьFDD, "fdd", ОжидаемыйДистрибутив);
+	
+	Если ИспользоватьFDD и ОжидаемыйДистрибутив = "zip" Тогда
+		// Для версии 1 ключ fdd не должен влиять на результат
+		// т.к. все версии 1 являются "fdd" (framework dependent) 
+		Вид = "zip";
+	КонецЕсли;
+	
+	Возврат Вид;
+КонецФункции

-	Вид = ?(ИспользоватьFDD, "fdd", ОжидаемыйДистрибутив);
-	Арх = ?(ИспользоватьХ64, Арх64, Арх32);
-
-	Если ИспользоватьFDD и ОжидаемыйДистрибутив = "zip" Тогда
-		// Для версии 1 ключ fdd не должен влиять на результат
-		// т.к. все версии 1 являются "fdd" (framework dependent) 
-		Вид = "zip";
-	КонецЕсли;
+	Вид = ОпределитьВидДистрибутива(ИспользоватьFDD, ОжидаемыйДистрибутив);
+	Арх = ?(ИспользоватьХ64, Арх64, Арх32);

305-307: Переместить инициализацию глобальных переменных в начало файла

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

// Переместить эти строки после объявления переменных в строках 10-11
-///////////////////////////
-Арх32 = "x86";
-Арх64 = "x64";

И добавить инициализацию после строки 12:

Перем Арх32;
Перем Арх64;

+///////////////////////////
+Арх32 = "x86";
+Арх64 = "x64";
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 587f9ec and 72106e1.

📒 Files selected for processing (9)
  • packagedef (1 hunks)
  • src/core/Классы/ВерсииOneScript.os (4 hunks)
  • src/core/Классы/ДетекторОкружения.os (1 hunks)
  • src/core/Классы/ОпределительДистрибутива.os (1 hunks)
  • src/core/Классы/ПараметрыOVM.os (5 hunks)
  • src/core/Классы/ПровайдерДистрибутивовВерсии.os (1 hunks)
  • src/core/Классы/УстановщикOneScript.os (5 hunks)
  • src/core/Классы/ФабрикаИнтернетСоединения.os (1 hunks)
  • tests/distrSelectorTests.os (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
src/core/Классы/УстановщикOneScript.os (1)
Learnt from: EvilBeaver
PR: oscript-library/ovm#41
File: src/core/Классы/УстановщикOneScript.os:366-377
Timestamp: 2025-05-22T17:19:26.238Z
Learning: В функции ПолучитьПутьКСкачиваниюФайла класса УстановщикOneScript при поиске дистрибутива через алиас сначала выполняется поиск по типу дистрибутива текущей платформы, а затем в случае неудачи - по типу дистрибутива "zip", при этом критерий архитектуры (x86/x64) должен сохраняться неизменным в обоих поисках.
🔇 Additional comments (25)
src/core/Классы/ДетекторОкружения.os (1)

1-27: Отличная реализация детектора окружения с ленивой инициализацией!

Код хорошо структурирован и правильно использует паттерн ленивой инициализации для избежания тяжелых операций при создании объекта. Логика инициализации понятна, а экспортируемые методы корректно обеспечивают инициализацию перед возвратом данных.

src/core/Классы/ФабрикаИнтернетСоединения.os (2)

1-28: Хорошая организация dependency injection параметров прокси.

Использование аннотаций &Деталька для внедрения параметров прокси обеспечивает чистую архитектуру и возможность конфигурации извне.


29-75: Отличная реализация фабрики HTTP-соединений с комплексной поддержкой прокси.

Логика корректно обрабатывает все основные сценарии:

  • Системный прокси при незаполненном сервере
  • Ручная настройка прокси для HTTP и HTTPS протоколов
  • Отключение прокси при необходимости

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

packagedef (1)

19-19: Добавление зависимости для разработки moskito выглядит обоснованно.

Согласно описанию PR, moskito - это инструмент для мокирования системной информации, что полезно для тестирования новых модулей определения окружения.

src/core/Классы/ПараметрыOVM.os (2)

8-8: Изменение аннотации конструктора на &Дуб соответствует паттерну синглтона.

Переход с &Желудь на &Дуб указывает на изменение стратегии создания объекта в IoC-контейнере, что логично для класса параметров системы.


17-17: Отличное добавление аннотаций типов для улучшения типобезопасности.

Аннотации &Завязь с указанием типов возвращаемых значений улучшают качество кода, помогают IDE в автодополнении и системе рефлексии в понимании контрактов методов.

Also applies to: 37-37, 47-47, 56-56

src/core/Классы/УстановщикOneScript.os (5)

17-21: Отличная архитектурная модернизация зависимостей

Введение новых зависимостей ФабрикаИнтернетСоединения и ДетекторОкружения значительно улучшает архитектуру модуля. Это отделяет ответственность за создание интернет-соединений и определение окружения от основной логики установки.


115-115: Упрощение создания HTTP-соединения

Замена ручного создания HTTP-соединения с настройкой прокси на использование фабрики значительно упрощает код и централизует логику управления соединениями.


251-251: Централизация маски версии

Перенос регулярного выражения для проверки версии в модуль ВерсииOneScript улучшает модульность и устраняет дублирование кода.


269-276: Превосходное упрощение логики выбора дистрибутива

Новая логика с использованием ОпределительДистрибутива значительно упрощает и инкапсулирует сложную логику выбора дистрибутива. Использование fluent-интерфейса делает код более читаемым и поддерживаемым.


290-290: Чистая делегация выбора дистрибутива

Делегирование выбора дистрибутива в специализированный класс отличное решение для разделения ответственности.

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

12-13: Хорошее разделение ответственности

Добавление зависимости ПровайдерДистрибутивовВерсии отлично отделяет логику работы с API от основной логики управления версиями.


221-232: Правильная делегация с сохранением дополнительной логики

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


251-251: Простая и эффективная делегация

Полная делегация функции получения дистрибутивов версии в провайдер упрощает код и устраняет дублирование HTTP-логики.


344-352: Отличное добавление семантической валидации версий

Добавление функции МаскаНомераВерсииSemver() с официальным regex для семантического версионирования значительно улучшает валидацию версий. Использование стандартного regex из semver.org обеспечивает корректность.

src/core/Классы/ПровайдерДистрибутивовВерсии.os (3)

1-9: Хорошая структура нового модуля

Новый модуль правильно использует dependency injection через ФабрикаИнтернетСоединения и АдресСайтаОСкрипт. Архитектура соответствует принципам SOLID.


18-45: Качественная реализация получения списка версий

Функция корректно обрабатывает HTTP-запрос, проверяет статус ответа и парсит JSON. Структура возвращаемой таблицы соответствует ожиданиям.


62-122: Комплексная и надёжная логика получения дистрибутивов

Функция правильно реализует двухэтапный процесс:

  1. Получение всех версий для поиска токена
  2. Получение файлов конкретной версии по токену

Обработка ошибок всесторонняя, включает детальные сообщения об ошибках.

src/core/Классы/ОпределительДистрибутива.os (5)

1-24: Отличная реализация fluent-интерфейса

Класс правильно реализует fluent-интерфейс с возвратом ЭтотОбъект, что делает код более читаемым и позволяет цепочечные вызовы. Инкапсуляция состояния в переменных модуля корректна.


26-43: Хорошо продуманная логика выбора дистрибутива

Логика выбора типа дистрибутива учитывает все необходимые сценарии:

  • Явное указание Netcore версии
  • Использование FDD
  • Режим алиаса с определением типа по доступным файлам

Особенно хорошо реализован fallback для режима алиаса.


49-84: Надёжная логика поиска дистрибутива с fallback

Функция правильно реализует поиск по критериям с fallback на "zip" тип для режима алиаса. Обработка ошибок детальная и информативная.


86-112: Полная поддержка платформ и архитектур

Логика определения типа дистрибутива поддерживает все основные платформы (Windows, Linux, macOS) и правильно обрабатывает различные архитектуры, включая ARM64 для macOS.


99-106:

❓ Verification inconclusive

Проверить логику определения ARM архитектуры на macOS

Логика определения ARM архитектуры выглядит корректно, но стоит убедиться, что ДетекторОкружения.АрхитектураПроцессора() правильно определяет ARM архитектуры на всех версиях macOS.


🏁 Script executed:

#!/bin/bash
# Проверим логику определения архитектуры процессора в ДетекторОкружения
ast-grep --pattern 'Функция АрхитектураПроцессора() $_
  $$$
КонецФункции'

Length of output: 76


Давайте попробуем найти реализацию и упоминания метода через ripgrep:


🏁 Script executed:

#!/bin/bash
# Ищем определение функции АрхитектураПроцессора и все её вхождения
rg -n "Функция АрхитектураПроцессора" -g "*.os"
rg -n "ДетекторОкружения" -g "*.os"
rg -n "АрхитектураПроцессора" -g "*.os" -C 2

Length of output: 2460


Чтобы убедиться в корректности логики, выведем тело функции АрхитектураПроцессора в файле src/core/Классы/ДетекторОкружения.os:


🏁 Script executed:

#!/bin/bash
# Выводим тело функции АрхитектураПроцессора в ДетекторОкружения.os
file="src/core/Классы/ДетекторОкружения.os"
line=$(grep -n 'Функция АрхитектураПроцессора' "$file" | cut -d: -f1)
sed -n "$((line-5)),$((line+50))p" "$file"

Length of output: 1130


Чтобы убедиться в корректности отображения архитектуры, выведем код класса ИнформацияОПроцессоре и перечисления АрхитектурыПроцессоров:


🏁 Script executed:

#!/bin/bash
# Найти и отобразить код класса ИнформацияОПроцессоре
file_info=$(rg -l "ИнформацияОПроцессоре" -g "*.os" | head -n1)
echo "=== $file_info ==="
sed -n '1,200p' "$file_info"

# Найти и отобразить перечисление АрхитектурыПроцессоров
file_enum=$(rg -l "АрхитектурыПроцессоров" -g "*.os" | head -n1)
echo "=== $file_enum ==="
sed -n '1,200p' "$file_enum"

Length of output: 7161


Чтобы проверить, что в перечислении АрхитектурыПроцессоров точно есть значения ARM и ARM64, выведем его определение:

#!/bin/bash
# Найти и показать перечисление АрхитектурыПроцессоров с ближайшими строками
rg -n "Перечисление АрхитектурыПроцессоров" -g "src/**/*.os" -A 20

Для проверки наличия значений ARM и ARM64 в перечислении АрхитектурыПроцессоров запустим поиск его определения:

#!/bin/bash
# Показать определение перечисления АрхитектурыПроцессоров с ближайшими строками
rg -n "Перечисление АрхитектурыПроцессоров" -g "*.os" -A 20

Чтобы убедиться, что в перечислении АрхитектурыПроцессоров есть нужные значения, выведем его определение:

#!/bin/bash
# Показать определение перечисления АрхитектурыПроцессоров
rg -n "Перечисление АрхитектурыПроцессоров" -g "src/**/*.os" -A 20

Для подтверждения наличия значений ARM и ARM64 в перечислении АрхитектурыПроцессоров выполним поиск определения этого перечисления:

#!/bin/bash
# Показать определение перечисления АрхитектурыПроцессоров с контекстом
rg -n "Перечисление АрхитектурыПроцессоров" -g "src/**/*.os" -A 10

Проверьте перечисление и возвращаемые значения архитектуры

Перед этим участком кода убедитесь, что:

  • В Перечисление АрхитектурыПроцессоров действительно объявлены константы ARM и ARM64.
  • Метод ИнформацияОПроцессоре.Архитектура возвращает строковые значения точно совпадающие с этими константами ("ARM" и "ARM64").
  • Мок в тестах подставляет такие же строки, чтобы сравнение АрхитектурыПроцессоров.ARM/.ARM64 проходило корректно.

Текущий код:

АрхитектураПроцессора = ДетекторОкружения.АрхитектураПроцессора();

Если АрхитектураПроцессора = АрхитектурыПроцессоров.ARM
    Или АрхитектураПроцессора = АрхитектурыПроцессоров.ARM64 Тогда
    Возврат "osx-arm64";
Иначе
    Возврат "osx-x64";
КонецЕсли;

Проверьте, что перечисление и возвращаемые значения из ИнформацияОПроцессоре синхронизированы и соответствуют используемым в тестах строкам.

tests/distrSelectorTests.os (2)

5-8: Хорошая организация импортов

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


270-281: Качественная реализация мокирования окружения

Функция МокОкружения хорошо инкапсулирует логику создания мок-объектов с правильными значениями по умолчанию для архитектуры.

Comment on lines +200 to +208
Процедура УниверсальныйТестВерсии(
ПереченьФайлов,
ИспользоватьFDD,
ИспользоватьХ64,
ЭтоВерсия2,
Платформа,
ОжидаемыйДистрибутив,
ТекстИсключения = Неопределено,
Архитектура = Неопределено)
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Упростить сигнатуру функции УниверсальныйТестВерсии

Функция принимает 8 параметров, что нарушает принцип чистого кода и усложняет понимание и сопровождение кода.

Рекомендуется использовать структуру параметров:

-Процедура УниверсальныйТестВерсии(
-	ПереченьФайлов,
-	ИспользоватьFDD,
-	ИспользоватьХ64,
-	ЭтоВерсия2,
-	Платформа,
-	ОжидаемыйДистрибутив,
-	ТекстИсключения = Неопределено,
-	Архитектура = Неопределено)
+Процедура УниверсальныйТестВерсии(ПараметрыТеста)
+	
+	// ПараметрыТеста должна содержать:
+	// - ПереченьФайлов
+	// - ИспользоватьFDD
+	// - ИспользоватьХ64
+	// - ЭтоВерсия2
+	// - Платформа
+	// - ОжидаемыйДистрибутив
+	// - ТекстИсключения (необязательно)
+	// - Архитектура (необязательно)

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In tests/distrSelectorTests.os around lines 200 to 208, the function
УниверсальныйТестВерсии has a long signature with 8 parameters, making it hard
to read and maintain. Refactor the function to accept a single parameter object
or structure that contains all these parameters as named fields. Update the
function implementation and all its call sites accordingly to use this parameter
structure for cleaner and more maintainable code.

Comment on lines +24 to +103
Процедура ДляФайловВерсии1СФлагомFDDИАлиасомНеНаходитДистрибутив(Знач ОС, Знач Архитектура) Экспорт

УниверсальныйТестВерсии(
ПереченьФайловВерсии1(),
Истина,
СтрЗаканчиваетсяНа(ОС, "_x86_64"),
Неопределено,
ТипПлатформы[ОС],
"zip",
"Вид=fdd",
Архитектура
);

КонецПроцедуры

&ПараметризованныйТест
&ИсточникЗначение("Windows_x86_64", Неопределено)
&ИсточникЗначение("Windows_x86", Неопределено)
&ИсточникЗначение("Linux_x86", Неопределено)
&ИсточникЗначение("Linux_x86_64", Неопределено)
&ИсточникЗначение("MacOS_x86_64", "X64")
&ИсточникЗначение("MacOS_x86_64", "ARM64")
Процедура ДляФайловВерсии1БезФлагаFDDИАлиасомНаходитДистрибутив(Знач ОС, Знач Архитектура) Экспорт

УниверсальныйТестВерсии(
ПереченьФайловВерсии1(),
Ложь,
СтрЗаканчиваетсяНа(ОС, "_x86_64"),
Неопределено,
ТипПлатформы[ОС],
"zip",
Неопределено,
Архитектура
);

КонецПроцедуры

&ПараметризованныйТест
&ИсточникЗначение("Windows_x86_64", Неопределено)
&ИсточникЗначение("Windows_x86", Неопределено)
&ИсточникЗначение("Linux_x86", Неопределено)
&ИсточникЗначение("Linux_x86_64", Неопределено)
&ИсточникЗначение("MacOS_x86_64", "X64")
&ИсточникЗначение("MacOS_x86_64", "ARM64")
Процедура ДляФайловВерсии2СФлагомFDDИАлиасомНаходитДистрибутив(Знач ОС, Знач Архитектура) Экспорт

УниверсальныйТестВерсии(
ПереченьФайловВерсии2(),
Истина,
СтрЗаканчиваетсяНа(ОС, "_x86_64"),
Неопределено,
ТипПлатформы[ОС],
"fdd",
Неопределено,
Архитектура
);

КонецПроцедуры

&ПараметризованныйТест
&ИсточникЗначение("Windows_x86_64", Неопределено, "scd-win")
&ИсточникЗначение("Windows_x86", Неопределено, "scd-win")
&ИсточникЗначение("Linux_x86", Неопределено, "scd-lin")
&ИсточникЗначение("Linux_x86_64", Неопределено, "scd-lin")
&ИсточникЗначение("MacOS_x86_64", "X64", "osx-x64")
&ИсточникЗначение("MacOS_x86_64", "ARM64", "osx-arm64")
Процедура ДляФайловВерсии2БезФлагаFDDИАлиасомНаходитДистрибутив(Знач ОС, Знач Архитектура, Знач Дистр) Экспорт

УниверсальныйТестВерсии(
ПереченьФайловВерсии2(),
Истина,
СтрЗаканчиваетсяНа(ОС, "_x86_64"),
Неопределено,
ТипПлатформы[ОС],
Дистр,
Неопределено,
Архитектура
);

КонецПроцедуры
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Рефакторинг дублированного кода в тестовых процедурах

Тестовые процедуры в этом разделе содержат значительное дублирование кода. Все процедуры следуют одинаковому шаблону и отличаются только параметрами вызова УниверсальныйТестВерсии.

Рекомендуется создать обобщенную процедуру для уменьшения дублирования:

+Процедура ВыполнитьТестДляВсехПлатформ(ФункцияПолученияФайлов, ИспользоватьFDD, ЭтоВерсия2, ОжидаемыйДистрибутив, ТекстИсключения = Неопределено)
+	
+	МассивПлатформ = Новый Массив;
+	МассивПлатформ.Добавить(Новый Структура("ОС, Архитектура", "Windows_x86_64", Неопределено));
+	МассивПлатформ.Добавить(Новый Структура("ОС, Архитектура", "Windows_x86", Неопределено));
+	// ... добавить остальные платформы
+	
+	Для Каждого Платформа Из МассивПлатформ Цикл
+		УниверсальныйТестВерсии(
+			ФункцияПолученияФайлов(), 
+			ИспользоватьFDD,
+			СтрЗаканчиваетсяНа(Платформа.ОС, "_x86_64"),
+			ЭтоВерсия2,
+			ТипПлатформы[Платформа.ОС],
+			ОжидаемыйДистрибутив,
+			ТекстИсключения,
+			Платформа.Архитектура
+		);
+	КонецЦикла;
+	
+КонецПроцедуры
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Процедура ДляФайловВерсии1СФлагомFDDИАлиасомНеНаходитДистрибутив(Знач ОС, Знач Архитектура) Экспорт
УниверсальныйТестВерсии(
ПереченьФайловВерсии1(),
Истина,
СтрЗаканчиваетсяНа(ОС, "_x86_64"),
Неопределено,
ТипПлатформы[ОС],
"zip",
"Вид=fdd",
Архитектура
);
КонецПроцедуры
&ПараметризованныйТест
&ИсточникЗначение("Windows_x86_64", Неопределено)
&ИсточникЗначение("Windows_x86", Неопределено)
&ИсточникЗначение("Linux_x86", Неопределено)
&ИсточникЗначение("Linux_x86_64", Неопределено)
&ИсточникЗначение("MacOS_x86_64", "X64")
&ИсточникЗначение("MacOS_x86_64", "ARM64")
Процедура ДляФайловВерсии1БезФлагаFDDИАлиасомНаходитДистрибутив(Знач ОС, Знач Архитектура) Экспорт
УниверсальныйТестВерсии(
ПереченьФайловВерсии1(),
Ложь,
СтрЗаканчиваетсяНа(ОС, "_x86_64"),
Неопределено,
ТипПлатформы[ОС],
"zip",
Неопределено,
Архитектура
);
КонецПроцедуры
&ПараметризованныйТест
&ИсточникЗначение("Windows_x86_64", Неопределено)
&ИсточникЗначение("Windows_x86", Неопределено)
&ИсточникЗначение("Linux_x86", Неопределено)
&ИсточникЗначение("Linux_x86_64", Неопределено)
&ИсточникЗначение("MacOS_x86_64", "X64")
&ИсточникЗначение("MacOS_x86_64", "ARM64")
Процедура ДляФайловВерсии2СФлагомFDDИАлиасомНаходитДистрибутив(Знач ОС, Знач Архитектура) Экспорт
УниверсальныйТестВерсии(
ПереченьФайловВерсии2(),
Истина,
СтрЗаканчиваетсяНа(ОС, "_x86_64"),
Неопределено,
ТипПлатформы[ОС],
"fdd",
Неопределено,
Архитектура
);
КонецПроцедуры
&ПараметризованныйТест
&ИсточникЗначение("Windows_x86_64", Неопределено, "scd-win")
&ИсточникЗначение("Windows_x86", Неопределено, "scd-win")
&ИсточникЗначение("Linux_x86", Неопределено, "scd-lin")
&ИсточникЗначение("Linux_x86_64", Неопределено, "scd-lin")
&ИсточникЗначение("MacOS_x86_64", "X64", "osx-x64")
&ИсточникЗначение("MacOS_x86_64", "ARM64", "osx-arm64")
Процедура ДляФайловВерсии2БезФлагаFDDИАлиасомНаходитДистрибутив(Знач ОС, Знач Архитектура, Знач Дистр) Экспорт
УниверсальныйТестВерсии(
ПереченьФайловВерсии2(),
Истина,
СтрЗаканчиваетсяНа(ОС, "_x86_64"),
Неопределено,
ТипПлатформы[ОС],
Дистр,
Неопределено,
Архитектура
);
КонецПроцедуры
Процедура ВыполнитьТестДляВсехПлатформ(ФункцияПолученияФайлов, ИспользоватьFDD, ЭтоВерсия2, ОжидаемыйДистрибутив, ТекстИсключения = Неопределено)
МассивПлатформ = Новый Массив;
МассивПлатформ.Добавить(Новый Структура("ОС, Архитектура", "Windows_x86_64", Неопределено));
МассивПлатформ.Добавить(Новый Структура("ОС, Архитектура", "Windows_x86", Неопределено));
МассивПлатформ.Добавить(Новый Структура("ОС, Архитектура", "Linux_x86", Неопределено));
МассивПлатформ.Добавить(Новый Структура("ОС, Архитектура", "Linux_x86_64", Неопределено));
МассивПлатформ.Добавить(Новый Структура("ОС, Архитектура", "MacOS_x86_64", "X64"));
МассивПлатформ.Добавить(Новый Структура("ОС, Архитектура", "MacOS_x86_64", "ARM64"));
Для Каждого Платформа Из МассивПлатформ Цикл
УниверсальныйТестВерсии(
ФункцияПолученияФайлов(),
ИспользоватьFDD,
СтрЗаканчиваетсяНа(Платформа.ОС, "_x86_64"),
ЭтоВерсия2,
ТипПлатформы[Платформа.ОС],
ОжидаемыйДистрибутив,
ТекстИсключения,
Платформа.Архитектура
);
КонецЦикла;
КонецПроцедуры
🤖 Prompt for AI Agents
In tests/distrSelectorTests.os around lines 24 to 103, the test procedures have
significant code duplication as they all call УниверсальныйТестВерсии with
varying parameters. Refactor by creating a single generalized procedure that
accepts parameters for the values that differ (such as file list, flags,
platform type, format, alias, and architecture) and then call
УниверсальныйТестВерсии inside it. Replace the existing specific test procedures
with calls to this generalized procedure using the appropriate arguments to
reduce duplication and improve maintainability.

@EvilBeaver EvilBeaver requested review from nixel2007 and sfaqer May 25, 2025 11:15

&Желудь
Процедура ПриСозданииОбъекта()
// получение cpuinfo тяжелая операция с запуском процессов
Copy link
Member

Choose a reason for hiding this comment

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

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

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 Author

Choose a reason for hiding this comment

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

табакерка это Lazy? Я могу просто в геттере дергать Табакерка.Достать()? Оно кеширует результат?

Copy link
Member

Choose a reason for hiding this comment

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

Табакерка - это ObjectProvider. Если никто явно не требует внедрения жёлудя-одиночки, то он не инициализируется, да.
И да, Табакерка.Достать() сделегирует вызов в Поделка.НайтиЖелудь и там сработает обычный поиск желудей-одиночек в мапе (и отложенная инициализация, если его никто ещё не запрашивал).

Естественно, все меняется, если ты объявишь жёлудь Компанейским, но тут это не нужно.

Copy link
Member Author

Choose a reason for hiding this comment

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

Все же я не очень понимаю прелесть табакерок. Если я хочу ленивую инициализацию, то я должен по-сути нарушить инкапсуляцию ДетектораОкружения. Каждый клиент этого желудя должен знать, что его нельзя инжектить напрямую, надо определять табакерки. Т.е. клиент класса должен знать его внутреннее устройство...

Или я неверно использую табакерку. Я делаю так:

// Класс ДетекторОкружения
&Желудь
Процедура ПриСозданииОбъекта() // Тяжелый конструктор
	СистемнаяИнформация = Новый СистемнаяИнформация;
	ИнформацияОПроцессоре = Новый ИнформацияОПроцессоре;
КонецПроцедуры

и вот так использую в УстановщикOneScript

// Класс УстановщикOneScript
&Табакерка
&Пластилин("ДетекторОкружения")
Перем ПровайдерДетектораОкружения;

Т.е. я должен знать внутреннее устройство прилепляемого класса, чтобы не прилеплять его напрямую. Мне кажется это как-то неправильно.

Copy link
Member

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.

@sfaqer как тебе идея?

@nixel2007 autumn-library/autumn#120

Copy link
Member

Choose a reason for hiding this comment

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

Но мне кажется это прям оверкилл для класса из двух полей

Так ты это делаешь не для класса из двух полей, ты табакерку вещаешь на поле\параметр конструктора в определителе дистрибутива, он в данном случае будет управлять ленивым получением детектора, тогда когда ему это потребуется, а класс из двух полей останется просто классом из двух полей

А, я чёт не разобрался, вы тут хотите cpuinfo зажелудить, ага.
Можно в заготовку подкинуть типа

Поделка.ДобавитьЗавязь(
    "&Завязь(""ИнформацияОПроцессоре"", Тип = ""ИнформацияОПроцессоре"") () -> 
    |    Возврат Новый ИнформацияОПроцессоре();
    |"
);

И да, табакерить прям в конструктор, в целом можно и системную информацию аналогично подкинуть

Copy link
Member

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.

Можно в заготовку подкинуть типа

Да зачем, обычный дуб с завязью сделать и все.

Или так, да.

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 (3)
tests/distrSelectorTests.os (3)

288-290: Исправить логическую ошибку в условии

В условии проверяется Стр.Ссылка = Неопределено, но должно быть Ссылка = Неопределено, поскольку Стр.Ссылка еще не была инициализирована.

-	Если Стр.Ссылка = Неопределено Тогда
+	Если Ссылка = Неопределено Тогда
		Стр.Ссылка = Вид + "/" + Архитектура;
+	Иначе
+		Стр.Ссылка = Ссылка;
	КонецЕсли;

200-208: Упростить сигнатуру функции УниверсальныйТестВерсии

Функция принимает 8 параметров, что нарушает принцип чистого кода и усложняет понимание и сопровождение кода.

Рекомендуется использовать структуру параметров вместо длинного списка аргументов.


24-103: Рефакторинг дублированного кода в тестовых процедурах

Тестовые процедуры содержат значительное дублирование кода. Все процедуры следуют одинаковому шаблону и отличаются только параметрами вызова УниверсальныйТестВерсии.

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

🧹 Nitpick comments (1)
tests/distrSelectorTests.os (1)

5-8: Проверить необходимость всех импортов

Убедитесь, что все подключенные библиотеки действительно используются в тестах, особенно cpuinfo и moskito.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 72106e1 and 7df8922.

📒 Files selected for processing (5)
  • packagedef (1 hunks)
  • src/cmd/ovm.os (1 hunks)
  • src/core/Классы/ПараметрыOVM.os (4 hunks)
  • src/core/Классы/ФабрикаИнтернетСоединения.os (1 hunks)
  • tests/distrSelectorTests.os (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
  • packagedef
  • src/core/Классы/ФабрикаИнтернетСоединения.os
  • src/core/Классы/ПараметрыOVM.os
🔇 Additional comments (5)
src/cmd/ovm.os (2)

50-50: Одобряю изменение типа регистрации ПараметрыOVM.

Перенос регистрации ПараметрыOVM из ДобавитьЖелудь в ДобавитьДуб логично соответствует описанному в целях PR изменению - параметры OVM сделаны неизменяемыми для возможности внедрения специфических опций.


52-54: Одобряю добавление новых компонентов.

Добавление трех новых компонентов логично соответствует архитектурному рефакторингу:

  • ФабрикаИнтернетСоединения - для создания интернет-соединений
  • ДетекторОкружения - для определения окружения
  • ПровайдерДистрибутивовВерсии - для получения версий и дистрибутивов

Изменения следуют принципу разделения ответственности и улучшают модульность кода.

tests/distrSelectorTests.os (3)

92-95: Проверить корректность использования флага FDD

В процедуре с именем "БезФлагаFDD" (без флага FDD) передается Истина для параметра ИспользоватьFDD. Это противоречит названию процедуры и может указывать на ошибку в логике или неточность в именовании.

Аналогичная проблема присутствует в строках 184-187. Проверьте, соответствует ли поведение названиям процедур.


184-187: Проверить корректность использования флага FDD

Та же проблема, что и в строках 92-95 - процедура называется "БезФлагаFDD", но передает Истина для ИспользоватьFDD.


275-277: Хорошая практика использования моков

Корректное использование мок-объекта для тестирования детектора окружения. Мок настраивается для возврата нужных значений платформы и архитектуры.

sfaqer added 4 commits May 26, 2025 10:33
…исимостей

Удалёно использование неактуальной библиотеки json

- Обновлены зависимости в packagedef:
  - 1commands до версии 1.5.0
  - fs до версии 1.2.0
  - tempfiles до версии 1.1.1
  - strings до версии 0.5.0
  - autumn до версии 4.3.9
  - autumn-logos до версии 1.2.0
  - autumn-cli до версии 1.1.0
  - collectionos до версии 0.8.1
  - cpuinfo до версии 1.2.0
  - annotations до версии 1.3.0
  - 1bdd до версии 1.15.1
  - moskito до версии 0.4.1
- Добавлен workflow тестирования через autumn-library/workflows/.github/workflows/test.yml
- В tasks/coverage.os удалена зависимость от json, чтение JSON осуществляется через встроенный механизм.
- В src/cmd/ovm.os удален код, связанный с добавлением желудей (bean definitions) и заготовками (template definitions) в поделку (Craft).
- В features/integration.feature удалены проверки на установку opm ввиду того что оно падает под win.
- Добавлен файл tests/oscript.cfg для указания пути к oscript_modules для тестирования
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: 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 a88aa7c and e249ab8.

📒 Files selected for processing (1)
  • .github/workflows/testing.yml (1 hunks)
🔇 Additional comments (3)
.github/workflows/testing.yml (3)

1-2: Пропуск: Название workflow
Имя Тестирование корректно задаёт цель workflow и не вызывает замечаний.


3-7: Пропуск: Триггеры
Триггеры push, pull_request и workflow_dispatch настроены стандартно.


19-23:

✅ Verification successful

Проверка корректности пути и ветки reusable workflow
Убедитесь, что в репозитории autumn-library/workflows на ветке oneunit действительно существует файл .github/workflows/test.yml, иначе вызов workflow через uses завершится ошибкой.


🏁 Script executed:

#!/bin/bash
# Проверка наличия reusable workflow в удалённом репозитории
curl -s -H "Accept: application/vnd.github.v3.raw" \
  "https://api.github.com/repos/autumn-library/workflows/contents/.github/workflows/test.yml?ref=oneunit" \
  | head -n 10

Length of output: 414


Для уточнения наличия файла проверим HTTP-статус ответа API:


🏁 Script executed:

#!/bin/bash
# Проверяем код ответа при запросе файла .github/workflows/test.yml на ветке oneunit
curl -s -o /dev/null -w "%{http_code}\n" \
  -H "Accept: application/vnd.github.v3.raw" \
  "https://api.github.com/repos/autumn-library/workflows/contents/.github/workflows/test.yml?ref=oneunit"

Length of output: 193


Путь к reusable workflow корректен
Проверка HTTP-ответа при запросе файла .github/workflows/test.yml на ветке oneunit вернула 200 ОК — указанный workflow существует и доступен.

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: 3

🧹 Nitpick comments (1)
src/core/Классы/ОпределительДистрибутива.os (1)

28-45: Логика выбора дистрибутива корректна, но можно улучшить читаемость.

Функция правильно обрабатывает различные сценарии выбора дистрибутива, включая режим алиаса с отложенным определением типа. Комментарии хорошо объясняют логику.

Для улучшения читаемости рекомендуется вынести определение типа дистрибутива в отдельный метод:

 Функция Выбрать(Знач ПереченьФайлов) Экспорт
 	
-	Если ЭтоДистрибутивНеткор = Истина Тогда
-		ВидДистрибутива = ?(ИспользоватьFDD, "fdd", ТипДистрибутиваТекущейПлатформы());
-	ИначеЕсли ЭтоДистрибутивНеткор = Ложь Тогда
-		ВидДистрибутива = "zip";
-	ИначеЕсли ИспользоватьFDD Тогда
-		ЭтоДистрибутивНеткор = Истина;
-		ВидДистрибутива = "fdd";
-	Иначе
-		// Это установка по алиасу и мы не знаем, версия 2 это или нет.
-		// Определим это с двух попыток ниже.
-		ВидДистрибутива = Неопределено;
-	КонецЕсли;
+	ВидДистрибутива = ОпределитьВидДистрибутива();
 
 	Возврат НайтиПодходящийДистрибутив(ПереченьФайлов, ВидДистрибутива, ИспользоватьХ64);
 
 КонецФункции
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 56da812 and 98fa410.

📒 Files selected for processing (1)
  • src/core/Классы/ОпределительДистрибутива.os (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
src/core/Классы/ОпределительДистрибутива.os (1)
Learnt from: EvilBeaver
PR: oscript-library/ovm#41
File: src/core/Классы/УстановщикOneScript.os:366-377
Timestamp: 2025-05-22T17:19:26.238Z
Learning: В функции ПолучитьПутьКСкачиваниюФайла класса УстановщикOneScript при поиске дистрибутива через алиас сначала выполняется поиск по типу дистрибутива текущей платформы, а затем в случае неудачи - по типу дистрибутива "zip", при этом критерий архитектуры (x86/x64) должен сохраняться неизменным в обоих поисках.
⏰ Context from checks skipped due to timeout of 90000ms (20)
  • GitHub Check: test (dev, 1testrunner) / build (windows-latest, dev, 1testrunner)
  • GitHub Check: test (dev, 1testrunner) / build (ubuntu-latest, dev, 1testrunner)
  • GitHub Check: test (dev, oneunit) / build (ubuntu-latest, dev, oneunit)
  • GitHub Check: test (default, 1testrunner) / build (ubuntu-latest, default, 1testrunner)
  • GitHub Check: test (dev, oneunit) / build (windows-latest, dev, oneunit)
  • GitHub Check: test (default, 1testrunner) / build (windows-latest, default, 1testrunner)
  • GitHub Check: test (dev, oneunit) / build (macos-latest, dev, oneunit)
  • GitHub Check: test (stable, 1testrunner) / build (windows-latest, stable, 1testrunner)
  • GitHub Check: test (stable, 1testrunner) / build (ubuntu-latest, stable, 1testrunner)
  • GitHub Check: test (dev, 1testrunner) / build (macos-latest, dev, 1testrunner)
  • GitHub Check: test (dev, 1testrunner) / build (windows-latest, dev, 1testrunner)
  • GitHub Check: test (dev, 1testrunner) / build (ubuntu-latest, dev, 1testrunner)
  • GitHub Check: test (default, 1testrunner) / build (macos-latest, default, 1testrunner)
  • GitHub Check: test (default, 1testrunner) / build (windows-latest, default, 1testrunner)
  • GitHub Check: test (stable, 1testrunner) / build (windows-latest, stable, 1testrunner)
  • GitHub Check: test (stable, 1testrunner) / build (macos-latest, stable, 1testrunner)
  • GitHub Check: test (stable, 1testrunner) / build (ubuntu-latest, stable, 1testrunner)
  • GitHub Check: test (default, 1testrunner) / build (ubuntu-latest, default, 1testrunner)
  • GitHub Check: test (dev, oneunit) / build (ubuntu-latest, dev, oneunit)
  • GitHub Check: test (dev, oneunit) / build (macos-latest, dev, oneunit)
🔇 Additional comments (2)
src/core/Классы/ОпределительДистрибутива.os (2)

13-26: Отличная реализация fluent interface.

Методы корректно реализуют паттерн цепочки вызовов (fluent interface), что позволяет удобно настраивать объект через последовательные вызовы. Код читаемый и следует принципу единственной ответственности.


51-86: Корректная реализация алгоритма поиска с соблюдением требований.

Функция НайтиПодходящийДистрибутив правильно реализует алгоритм поиска, описанный в retrieved learnings: сначала поиск по типу дистрибутива текущей платформы, затем при неудаче в режиме алиаса - по типу "zip", при этом критерий архитектуры сохраняется неизменным в обоих поисках.

Особенно хорошо:

  • Детальные сообщения об ошибках с указанием критериев поиска
  • Корректная обработка случаев с множественными результатами
  • Логичная структура fallback-логики

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: 1

🧹 Nitpick comments (2)
src/core/Классы/ОпределительДистрибутива.os (2)

33-50: Логика корректна, но можно улучшить читаемость.

Функция правильно обрабатывает различные режимы определения дистрибутива. Хорошие комментарии помогают понять сложную логику алиасов.

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

 Функция Выбрать(Знач ПереченьФайлов) Экспорт
-	
-	Если ЭтоДистрибутивНеткор = Истина Тогда
-		ВидДистрибутива = ?(ИспользоватьFDD, "fdd", ТипДистрибутиваТекущейПлатформы());
-	ИначеЕсли ЭтоДистрибутивНеткор = Ложь Тогда
-		ВидДистрибутива = "zip";
-	ИначеЕсли ИспользоватьFDD Тогда
-		ЭтоДистрибутивНеткор = Истина;
-		ВидДистрибутива = "fdd";
-	Иначе
-		// Это установка по алиасу и мы не знаем, версия 2 это или нет.
-		// Определим это с двух попыток ниже.
-		ВидДистрибутива = Неопределено;
-	КонецЕсли;
+	ВидДистрибутива = ОпределитьВидДистрибутива();
 	Возврат НайтиПодходящийДистрибутив(ПереченьФайлов, ВидДистрибутива, ИспользоватьХ64);
 КонецФункции

84-84: Упростите избыточную проверку свойства.

Свойство "Архитектура" всегда устанавливается в строке 69, поэтому проверка его наличия избыточна.

-				?(КритерийПоиска.Свойство("Архитектура"), КритерийПоиска.Архитектура, "<любая>"),
+				КритерийПоиска.Архитектура,
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between a33fa53 and aa4ba95.

📒 Files selected for processing (1)
  • src/core/Классы/ОпределительДистрибутива.os (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
src/core/Классы/ОпределительДистрибутива.os (1)
Learnt from: EvilBeaver
PR: oscript-library/ovm#43
File: src/core/Классы/ОпределительДистрибутива.os:88-114
Timestamp: 2025-05-27T18:14:36.737Z
Learning: Синтаксис 1С не требует наличия оператора Возврат в конце функции, даже если функция должна возвращать значение.
⏰ Context from checks skipped due to timeout of 90000ms (16)
  • GitHub Check: test (dev, oneunit) / build (ubuntu-latest, dev, oneunit)
  • GitHub Check: test (dev, oneunit) / build (windows-latest, dev, oneunit)
  • GitHub Check: test (dev, 1testrunner) / build (windows-latest, dev, 1testrunner)
  • GitHub Check: test (dev, 1testrunner) / build (ubuntu-latest, dev, 1testrunner)
  • GitHub Check: test (stable, 1testrunner) / build (macos-latest, stable, 1testrunner)
  • GitHub Check: test (stable, 1testrunner) / build (ubuntu-latest, stable, 1testrunner)
  • GitHub Check: test (default, 1testrunner) / build (ubuntu-latest, default, 1testrunner)
  • GitHub Check: test (dev, oneunit) / build (ubuntu-latest, dev, oneunit)
  • GitHub Check: test (dev, 1testrunner) / build (windows-latest, dev, 1testrunner)
  • GitHub Check: test (dev, 1testrunner) / build (macos-latest, dev, 1testrunner)
  • GitHub Check: test (dev, oneunit) / build (macos-latest, dev, oneunit)
  • GitHub Check: test (dev, 1testrunner) / build (ubuntu-latest, dev, 1testrunner)
  • GitHub Check: test (stable, 1testrunner) / build (macos-latest, stable, 1testrunner)
  • GitHub Check: test (default, 1testrunner) / build (ubuntu-latest, default, 1testrunner)
  • GitHub Check: test (stable, 1testrunner) / build (ubuntu-latest, stable, 1testrunner)
  • GitHub Check: test (default, 1testrunner) / build (macos-latest, default, 1testrunner)
🔇 Additional comments (5)
src/core/Классы/ОпределительДистрибутива.os (5)

3-7: Переменные модуля корректно инициализированы в конструкторе.

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


9-16: Конструктор корректно реализован с инициализацией переменных.

Отличная реализация конструктора с использованием dependency injection. Все переменные модуля получают правильные значения по умолчанию.


18-31: Отличная реализация паттерна fluent interface.

Методы настройки позволяют удобно конфигурировать объект через цепочку вызовов. Реализация простая и понятная.


52-54: Простая и корректная вспомогательная функция.

Функция ясно выражает логику выбора архитектуры.


94-120: Отличная реализация определения типа дистрибутива.

Функция корректно обрабатывает все поддерживаемые платформы, включая специальную логику для ARM-архитектуры на macOS. Хорошее использование детектора окружения и понятные сообщения об ошибках.

Copy link
Member

@sfaqer sfaqer left a comment

Choose a reason for hiding this comment

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

LGTM

@sfaqer
Copy link
Member

sfaqer commented Jun 3, 2025

@nixel2007 я думаю надо вливать, а подпись для мака отдельным реквестом катить

@sfaqer sfaqer merged commit 71519b5 into develop Jun 3, 2025
25 checks passed
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.

3 participants