Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
110b543
Добавлена dev-зависимость moskito
EvilBeaver May 25, 2025
196fd4e
Тесты в первом приближении
EvilBeaver May 25, 2025
72106e1
Переписал разрез тестов поудобнее
EvilBeaver May 25, 2025
82ba57d
Прописаны новые желуди вручную
EvilBeaver May 25, 2025
1c03d9d
Версия moskito
EvilBeaver May 25, 2025
5f0bbce
Инициализация СисИнфо в ПараметрыOVM перенесена в конструктор
EvilBeaver May 25, 2025
7df8922
Финальный перевод строки
EvilBeaver May 25, 2025
a88aa7c
Переход на autumn-library/workflows для тестирования и обновление зав…
sfaqer May 26, 2025
15fd2a2
Добавлен прогон 1bdd на dev
sfaqer May 26, 2025
1f2949b
Ещё одна попытка запустить 1bdd на dev
sfaqer May 26, 2025
e249ab8
И ещё разок
sfaqer May 26, 2025
aa7b66a
Исправлена опечатка
sfaqer May 26, 2025
778e9f7
Вернул проверку наличия opm
sfaqer May 26, 2025
56da812
Разделил проверку наличия oscript и opm отдельная для Lin и Win
sfaqer May 26, 2025
98fa410
Восстановлен утерянный импорт
sfaqer May 26, 2025
f3abe36
Получение архитектуры процессора через табакерку
EvilBeaver May 27, 2025
4313d78
В фича файлах теперь проверяется текущий проект а не ovm установленны…
sfaqer May 30, 2025
a33fa53
Переделал зависимости
EvilBeaver Jun 2, 2025
aa4ba95
Неправильный дефолт
EvilBeaver Jun 2, 2025
a977ffe
Строка с логом ошибочно добавлена в коммит
EvilBeaver Jun 2, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packagedef
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,6 @@
.ЗависитОт("collectionos", "0.3.0")
.ЗависитОт("cpuinfo", "1.1.0")
.РазработкаЗависитОт("1bdd", "1.13.0")
.РазработкаЗависитОт("moskito", "0.4.1")
.ИсполняемыйФайл("src/cmd/ovm.os", "ovm")
;
5 changes: 4 additions & 1 deletion src/cmd/ovm.os
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,13 @@

Поделка
.ДобавитьАннотацию(Тип("АннотацияЛогOVM"))
.ДобавитьДуб(Тип("ПараметрыOVM"))
.ДобавитьЖелудь(Тип("ФайлНастроек"))
.ДобавитьЖелудь(Тип("ФабрикаИнтернетСоединения"))
.ДобавитьЖелудь(Тип("ДетекторОкружения"))
.ДобавитьЖелудь(Тип("ПровайдерДистрибутивовВерсии"))
.ДобавитьЖелудь(Тип("УстановщикOneScript"))
.ДобавитьЖелудь(Тип("РаскладкаЛогOVM"))
.ДобавитьЖелудь(Тип("ПараметрыOVM"))
.ДобавитьЖелудь(Тип("ПараметрыПриложения"))
.ДобавитьЖелудь(Тип("ДеинсталляторOneScript"))
.ДобавитьЖелудь(Тип("ВерсииOneScript"))
Expand Down
134 changes: 27 additions & 107 deletions src/core/Классы/ВерсииOneScript.os
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
&Пластилин
Перем ПараметрыOVM;

&Пластилин
Перем ПровайдерДистрибутивовВерсии;

Перем ЭтоWindows;
Перем ДопустимыеАлиасы; // Кеш коллекции допустимых алиасов

Expand Down Expand Up @@ -215,17 +218,17 @@
//
Функция ПолучитьСписокДоступныхКУстановкеВерсий() Экспорт

Таймаут = 10;
Соединение = Новый HTTPСоединение(
ПараметрыOVM.АдресСайтаОСкрипт(),
,
,
,
,
Таймаут
);

Возврат ПолучитьВерсииПоAPI(Соединение);
// Запрашиваем сайт
ДоступныеВерсии = ПровайдерДистрибутивовВерсии.ПолучитьСписокДоступныхКУстановкеВерсий();

// Дополняем таблицу нашими алиасами
Итератор = ДопустимыеАлиасы().Ключи().Итератор();

Пока Итератор.ЕстьСледующий() Цикл
ОбеспечитьСтрокуВерсииПоАлиасу(ДоступныеВерсии, Итератор.Следующий(), "Путь");
КонецЦикла;

Возврат ДоступныеВерсии;

КонецФункции

Expand All @@ -245,73 +248,7 @@
// https://oscript.io/api/archive/<токен версии> - данная таблица
//
Функция ПолучитьДоступныеВидыДистрибутивовВерсии(Знач НомерВерсии) Экспорт
Таймаут = 10;
Соединение = Новый HTTPСоединение(
ПараметрыOVM.АдресСайтаОСкрипт(),
,
,
,
,
Таймаут
);

Запрос = Новый HTTPЗапрос("api/archive?all=true");
Ответ = Соединение.Получить(Запрос);
HTTP_OK = 200;
Если Ответ.КодСостояния <> HTTP_OK Тогда
ВызватьИсключение СтрШаблон("Не удалось найти версию %1 на сайте: Статус: %2, Ответ: %3",
НомерВерсии,
Ответ.КодСостояния,
Ответ.ПолучитьТелоКакСтроку()
);
КонецЕсли;

ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());

МассивВерсий = ПрочитатьJSON(ЧтениеJSON, Ложь);
ИскомыйТокенВерсии = Неопределено;
Для Каждого ОписаниеВерсии Из МассивВерсий Цикл
Если НомерВерсии = ОписаниеВерсии.presentation Тогда
ИскомыйТокенВерсии = ОписаниеВерсии.token;
КонецЕсли;
КонецЦикла;

Если ИскомыйТокенВерсии = Неопределено Тогда
ВызватьИсключение СтрШаблон("Не удалось найти версию %1 на сайте.", НомерВерсии);
КонецЕсли;

Запрос = Новый HTTPЗапрос("api/archive/" + ИскомыйТокенВерсии);
Ответ = Соединение.Получить(Запрос);
HTTP_OK = 200;
Если Ответ.КодСостояния <> HTTP_OK Тогда
ВызватьИсключение СтрШаблон("Не удалось найти файлы версии %1 на сайте: Статус: %2, Ответ: %3",
НомерВерсии,
Ответ.КодСостояния,
Ответ.ПолучитьТелоКакСтроку()
);
КонецЕсли;

ТаблицаРезультата = Новый ТаблицаЗначений();
ТаблицаРезультата.Колонки.Добавить("Вид");
ТаблицаРезультата.Колонки.Добавить("ИмяФайла");
ТаблицаРезультата.Колонки.Добавить("Архитектура");
ТаблицаРезультата.Колонки.Добавить("Ссылка");

ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());

МассивФайлов = ПрочитатьJSON(ЧтениеJSON, Ложь);
Для Каждого ОписаниеФайла Из МассивФайлов Цикл
СтрокаТаблицы = ТаблицаРезультата.Добавить();
СтрокаТаблицы.Вид = ОписаниеФайла.id;
СтрокаТаблицы.ИмяФайла = ОписаниеФайла.filename;
СтрокаТаблицы.Архитектура = ОписаниеФайла.arch;
СтрокаТаблицы.Ссылка = ОписаниеФайла.link;
КонецЦикла;

Возврат ТаблицаРезультата;

Возврат ПровайдерДистрибутивовВерсии.ПолучитьДоступныеВидыДистрибутивовВерсии(НомерВерсии);
КонецФункции

// <Описание функции>
Expand Down Expand Up @@ -399,36 +336,19 @@

КонецФункции

Функция ПолучитьВерсииПоAPI(Знач Соединение)
Запрос = Новый HTTPЗапрос("api/archive");
Ответ = Соединение.Получить(Запрос);
HTTP_OK = 200;
Если Ответ.КодСостояния <> HTTP_OK Тогда
ВызватьИсключение СтрШаблон("Не удалось получить список версий с сайта. Код ошибки: %1", Ответ.КодСостояния);
КонецЕсли;

ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
// Регулярное выражение версии по semver
//
// Возвращаемое значение:
// Строка - Регулярное выражение
//
Функция МаскаНомераВерсииSemver() Экспорт
// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
// https://regex101.com/r/vkijKf/1/

// BSLLS:LineLength-off
Возврат "^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$";
// BSLLS:LineLength-on

ДоступныеВерсии = Новый ТаблицаЗначений;
ДоступныеВерсии.Колонки.Добавить("Алиас");
ДоступныеВерсии.Колонки.Добавить("Путь");

АдресСайтаОСкрипт = ПараметрыOVM.АдресСайтаОСкрипт();
МассивВерсий = ПрочитатьJSON(ЧтениеJSON, Ложь);
Для Каждого ОписаниеВерсии Из МассивВерсий Цикл
ДоступнаяВерсия = ДоступныеВерсии.Добавить();
ДоступнаяВерсия.Алиас = ОписаниеВерсии.presentation;
ДоступнаяВерсия.Путь = АдресСайтаОСкрипт + ОписаниеВерсии.link;
КонецЦикла;

Итератор = ДопустимыеАлиасы().Ключи().Итератор();

Пока Итератор.ЕстьСледующий() Цикл
ОбеспечитьСтрокуВерсииПоАлиасу(ДоступныеВерсии, Итератор.Следующий(), "Путь");
КонецЦикла;

Возврат ДоступныеВерсии;
КонецФункции

Процедура ОбеспечитьСтрокуВерсииПоАлиасу(ТаблицаВерсий, Алиас, ИмяРеквизитаПуть = "ПутьСервер")
Expand Down
27 changes: 27 additions & 0 deletions src/core/Классы/ДетекторОкружения.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#Использовать cpuinfo

Перем СистемнаяИнформация;
Перем ИнформацияОПроцессоре;

&Желудь
Процедура ПриСозданииОбъекта()
// получение 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.

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

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

Или так, да.

// поэтому инициализация ленивая и в конструкторе желудя не выполняется.
КонецПроцедуры

Функция ТипПлатформы() Экспорт
Инициализировать();
Возврат СистемнаяИнформация.ТипПлатформы;
КонецФункции

Функция АрхитектураПроцессора() Экспорт
Инициализировать();
Возврат ИнформацияОПроцессоре.Архитектура;
КонецФункции

Процедура Инициализировать()
Если СистемнаяИнформация = Неопределено Тогда
СистемнаяИнформация = Новый СистемнаяИнформация;
ИнформацияОПроцессоре = Новый ИнформацияОПроцессоре;
КонецЕсли;
КонецПроцедуры
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
Перем ДетекторОкружения;

Перем ИспользоватьFDD;
Перем ИспользоватьХ64;
Перем ЭтоДистрибутивНеткор;

Процедура ПриСозданииОбъекта(Знач Детектор)
ДетекторОкружения = Детектор;
КонецПроцедуры

Функция ИспользоватьFDD(Знач Использовать) Экспорт
ИспользоватьFDD = Использовать;
Возврат ЭтотОбъект;
КонецФункции

Функция ИспользоватьХ64(Знач Использовать) Экспорт
ИспользоватьХ64 = Использовать;
Возврат ЭтотОбъект;
КонецФункции

Функция ЭтоДистрибутивНеткор(Знач Да) Экспорт
ЭтоДистрибутивНеткор = Да;
Возврат ЭтотОбъект;
КонецФункции

Функция Выбрать(Знач ПереченьФайлов) Экспорт

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

Возврат НайтиПодходящийДистрибутив(ПереченьФайлов, ВидДистрибутива, ИспользоватьХ64);

КонецФункции

Функция ПризнакАрхитектуры(Знач ИспользоватьХ64)
Возврат ?(ИспользоватьХ64, "x64", "x86");
КонецФункции

Функция НайтиПодходящийДистрибутив(Знач ПереченьФайлов, Знач ВидДистрибутива, Знач ИспользоватьХ64)
КритерийПоиска = Новый Структура;
КритерийПоиска.Вставить("Вид");
КритерийПоиска.Вставить("Архитектура");

РежимАлиаса = (ВидДистрибутива = Неопределено);

Если РежимАлиаса Тогда
КритерийПоиска.Вид = ТипДистрибутиваТекущейПлатформы();
Иначе
КритерийПоиска.Вид = ВидДистрибутива;
КонецЕсли;

КритерийПоиска.Архитектура = ПризнакАрхитектуры(ИспользоватьХ64);

НайденныеСтроки = ПереченьФайлов.НайтиСтроки(КритерийПоиска);
Если НайденныеСтроки.Количество() <> 1 Тогда
// Это может быть установка по алиасу и тогда есть шанс у дистрибутива zip для версии 1
Если РежимАлиаса Тогда
КритерийПоиска.Вид = "zip";
КонецЕсли;

НайденныеСтроки = ПереченьФайлов.НайтиСтроки(КритерийПоиска);
Если НайденныеСтроки.Количество() <> 1 Тогда
ТекстОшибки = СтрШаблон(
"Не найден дистрибутив для критериев: Вид=%1, Архитектура=%2. Найдено файлов: %3",
КритерийПоиска.Вид,
?(КритерийПоиска.Свойство("Архитектура"), КритерийПоиска.Архитектура, "<любая>"),
НайденныеСтроки.Количество()
);
ВызватьИсключение ТекстОшибки;
КонецЕсли;
КонецЕсли;

Возврат НайденныеСтроки[0].Ссылка;
КонецФункции

Функция ТипДистрибутиваТекущейПлатформы()

ТекущаяПлатформа = ДетекторОкружения.ТипПлатформы();

Если ТекущаяПлатформа = ТипПлатформы.Windows_x86_64
Или ТекущаяПлатформа = ТипПлатформы.Windows_x86 Тогда
Возврат "scd-win";
ИначеЕсли ТекущаяПлатформа = ТипПлатформы.Linux_x86_64
Или ТекущаяПлатформа = ТипПлатформы.Linux_x86 Тогда
Возврат "scd-lin";
ИначеЕсли ТекущаяПлатформа = ТипПлатформы.MacOS_x86_64
Или ТекущаяПлатформа = ТипПлатформы.MacOS_x86 Тогда

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

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

Иначе
ВызватьИсключение "Не удалось определить текущую операционную систему";
КонецЕсли;

КонецФункции
24 changes: 6 additions & 18 deletions src/core/Классы/ПараметрыOVM.os
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,17 @@
&Деталька(Значение = "oscript.server", ЗначениеПоУмолчанию = "https://oscript.io")
Перем АдресСайтаОСкрипт;

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

// Путь к каталогу установки версий OneScript по умолчанию
//
// Возвращаемое значение:
// Строка - Путь к каталогу установки по умолчанию
//
&Завязь(Тип = "Строка")
Функция КаталогУстановкиПоУмолчанию() Экспорт

КаталогУстановкиПоУмолчанию = ПолучитьПеременнуюСреды("OVM_INSTALL_PATH");
Expand All @@ -33,6 +35,7 @@
// Возвращаемое значение:
// Строка - Адрес сайта OneScript
//
&Завязь(Тип = "Строка")
Функция АдресСайтаОСкрипт() Экспорт
Возврат АдресСайтаОСкрипт;
КонецФункции
Expand All @@ -42,6 +45,7 @@
// Возвращаемое значение:
// Строка - Полный адрес к каталогу дистрибутивов OneScript
//
&Завязь(Тип = "Строка")
Функция ПолныйАдресККаталогуДистрибутивов() Экспорт
Возврат АдресСайтаОСкрипт() + "/downloads";
КонецФункции
Expand All @@ -50,23 +54,7 @@
//
// Возвращаемое значение:
// Булево - это 64 битная операционна система
&Завязь(Тип = "Булево")
Функция Это64БитнаяОперационнаяСистема() Экспорт
Возврат СистемнаяИнформация.Это64БитнаяОперационнаяСистема;
КонецФункции

// Регулярное выражение версии по semver
//
// Возвращаемое значение:
// Строка - Регулярное выражение
//
Функция МаскаНомераВерсииSemver() Экспорт
// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
// https://regex101.com/r/vkijKf/1/

// BSLLS:LineLength-off
Возврат "^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$";
// BSLLS:LineLength-on

КонецФункции

СистемнаяИнформация = Новый СистемнаяИнформация;
Loading