Skip to content

Commit 196fd4e

Browse files
committed
Тесты в первом приближении
1 parent 110b543 commit 196fd4e

8 files changed

+663
-267
lines changed

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

Lines changed: 27 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
&Пластилин
1010
Перем ПараметрыOVM;
1111

12+
&Пластилин
13+
Перем ПровайдерДистрибутивовВерсии;
14+
1215
Перем ЭтоWindows;
1316
Перем ДопустимыеАлиасы; // Кеш коллекции допустимых алиасов
1417

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

218-
Таймаут = 10;
219-
Соединение = Новый HTTPСоединение(
220-
ПараметрыOVM.АдресСайтаОСкрипт(),
221-
,
222-
,
223-
,
224-
,
225-
Таймаут
226-
);
227-
228-
Возврат ПолучитьВерсииПоAPI(Соединение);
221+
// Запрашиваем сайт
222+
ДоступныеВерсии = ПровайдерДистрибутивовВерсии.ПолучитьСписокДоступныхКУстановкеВерсий();
223+
224+
// Дополняем таблицу нашими алиасами
225+
Итератор = ДопустимыеАлиасы().Ключи().Итератор();
226+
227+
Пока Итератор.ЕстьСледующий() Цикл
228+
ОбеспечитьСтрокуВерсииПоАлиасу(ДоступныеВерсии, Итератор.Следующий(), "Путь");
229+
КонецЦикла;
230+
231+
Возврат ДоступныеВерсии;
229232

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

@@ -245,73 +248,7 @@
245248
// https://oscript.io/api/archive/<токен версии> - данная таблица
246249
//
247250
Функция ПолучитьДоступныеВидыДистрибутивовВерсии(Знач НомерВерсии) Экспорт
248-
Таймаут = 10;
249-
Соединение = Новый HTTPСоединение(
250-
ПараметрыOVM.АдресСайтаОСкрипт(),
251-
,
252-
,
253-
,
254-
,
255-
Таймаут
256-
);
257-
258-
Запрос = Новый HTTPЗапрос("api/archive?all=true");
259-
Ответ = Соединение.Получить(Запрос);
260-
HTTP_OK = 200;
261-
Если Ответ.КодСостояния <> HTTP_OK Тогда
262-
ВызватьИсключение СтрШаблон("Не удалось найти версию %1 на сайте: Статус: %2, Ответ: %3",
263-
НомерВерсии,
264-
Ответ.КодСостояния,
265-
Ответ.ПолучитьТелоКакСтроку()
266-
);
267-
КонецЕсли;
268-
269-
ЧтениеJSON = Новый ЧтениеJSON();
270-
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
271-
272-
МассивВерсий = ПрочитатьJSON(ЧтениеJSON, Ложь);
273-
ИскомыйТокенВерсии = Неопределено;
274-
Для Каждого ОписаниеВерсии Из МассивВерсий Цикл
275-
Если НомерВерсии = ОписаниеВерсии.presentation Тогда
276-
ИскомыйТокенВерсии = ОписаниеВерсии.token;
277-
КонецЕсли;
278-
КонецЦикла;
279-
280-
Если ИскомыйТокенВерсии = Неопределено Тогда
281-
ВызватьИсключение СтрШаблон("Не удалось найти версию %1 на сайте.", НомерВерсии);
282-
КонецЕсли;
283-
284-
Запрос = Новый HTTPЗапрос("api/archive/" + ИскомыйТокенВерсии);
285-
Ответ = Соединение.Получить(Запрос);
286-
HTTP_OK = 200;
287-
Если Ответ.КодСостояния <> HTTP_OK Тогда
288-
ВызватьИсключение СтрШаблон("Не удалось найти файлы версии %1 на сайте: Статус: %2, Ответ: %3",
289-
НомерВерсии,
290-
Ответ.КодСостояния,
291-
Ответ.ПолучитьТелоКакСтроку()
292-
);
293-
КонецЕсли;
294-
295-
ТаблицаРезультата = Новый ТаблицаЗначений();
296-
ТаблицаРезультата.Колонки.Добавить("Вид");
297-
ТаблицаРезультата.Колонки.Добавить("ИмяФайла");
298-
ТаблицаРезультата.Колонки.Добавить("Архитектура");
299-
ТаблицаРезультата.Колонки.Добавить("Ссылка");
300-
301-
ЧтениеJSON = Новый ЧтениеJSON();
302-
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
303-
304-
МассивФайлов = ПрочитатьJSON(ЧтениеJSON, Ложь);
305-
Для Каждого ОписаниеФайла Из МассивФайлов Цикл
306-
СтрокаТаблицы = ТаблицаРезультата.Добавить();
307-
СтрокаТаблицы.Вид = ОписаниеФайла.id;
308-
СтрокаТаблицы.ИмяФайла = ОписаниеФайла.filename;
309-
СтрокаТаблицы.Архитектура = ОписаниеФайла.arch;
310-
СтрокаТаблицы.Ссылка = ОписаниеФайла.link;
311-
КонецЦикла;
312-
313-
Возврат ТаблицаРезультата;
314-
251+
Возврат ПровайдерДистрибутивовВерсии.ПолучитьДоступныеВидыДистрибутивовВерсии(НомерВерсии);
315252
КонецФункции
316253

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

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

402-
Функция ПолучитьВерсииПоAPI(Знач Соединение)
403-
Запрос = Новый HTTPЗапрос("api/archive");
404-
Ответ = Соединение.Получить(Запрос);
405-
HTTP_OK = 200;
406-
Если Ответ.КодСостояния <> HTTP_OK Тогда
407-
ВызватьИсключение СтрШаблон("Не удалось получить список версий с сайта. Код ошибки: %1", Ответ.КодСостояния);
408-
КонецЕсли;
409-
410-
ЧтениеJSON = Новый ЧтениеJSON();
411-
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
339+
// Регулярное выражение версии по semver
340+
//
341+
// Возвращаемое значение:
342+
// Строка - Регулярное выражение
343+
//
344+
Функция МаскаНомераВерсииSemver() Экспорт
345+
// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
346+
// https://regex101.com/r/vkijKf/1/
347+
348+
// BSLLS:LineLength-off
349+
Возврат "^(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-]+)*))?$";
350+
// BSLLS:LineLength-on
412351

413-
ДоступныеВерсии = Новый ТаблицаЗначений;
414-
ДоступныеВерсии.Колонки.Добавить("Алиас");
415-
ДоступныеВерсии.Колонки.Добавить("Путь");
416-
417-
АдресСайтаОСкрипт = ПараметрыOVM.АдресСайтаОСкрипт();
418-
МассивВерсий = ПрочитатьJSON(ЧтениеJSON, Ложь);
419-
Для Каждого ОписаниеВерсии Из МассивВерсий Цикл
420-
ДоступнаяВерсия = ДоступныеВерсии.Добавить();
421-
ДоступнаяВерсия.Алиас = ОписаниеВерсии.presentation;
422-
ДоступнаяВерсия.Путь = АдресСайтаОСкрипт + ОписаниеВерсии.link;
423-
КонецЦикла;
424-
425-
Итератор = ДопустимыеАлиасы().Ключи().Итератор();
426-
427-
Пока Итератор.ЕстьСледующий() Цикл
428-
ОбеспечитьСтрокуВерсииПоАлиасу(ДоступныеВерсии, Итератор.Следующий(), "Путь");
429-
КонецЦикла;
430-
431-
Возврат ДоступныеВерсии;
432352
КонецФункции
433353

434354
Процедура ОбеспечитьСтрокуВерсииПоАлиасу(ТаблицаВерсий, Алиас, ИмяРеквизитаПуть = "ПутьСервер")
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#Использовать cpuinfo
2+
3+
Перем СистемнаяИнформация;
4+
Перем ИнформацияОПроцессоре;
5+
6+
&Желудь
7+
Процедура ПриСозданииОбъекта()
8+
// получение cpuinfo тяжелая операция с запуском процессов
9+
// поэтому инициализация ленивая и в конструкторе желудя не выполняется.
10+
КонецПроцедуры
11+
12+
Функция ТипПлатформы() Экспорт
13+
Инициализировать();
14+
Возврат СистемнаяИнформация.ТипПлатформы;
15+
КонецФункции
16+
17+
Функция АрхитектураПроцессора() Экспорт
18+
Инициализировать();
19+
Возврат ИнформацияОПроцессоре.Архитектура;
20+
КонецФункции
21+
22+
Процедура Инициализировать()
23+
Если СистемнаяИнформация = Неопределено Тогда
24+
СистемнаяИнформация = Новый СистемнаяИнформация;
25+
ИнформацияОПроцессоре = Новый ИнформацияОПроцессоре;
26+
КонецЕсли;
27+
КонецПроцедуры
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
Перем ДетекторОкружения;
2+
3+
Перем ИспользоватьFDD;
4+
Перем ИспользоватьХ64;
5+
Перем ЭтоДистрибутивНеткор;
6+
7+
Процедура ПриСозданииОбъекта(Знач Детектор)
8+
ДетекторОкружения = Детектор;
9+
КонецПроцедуры
10+
11+
Функция ИспользоватьFDD(Знач Использовать) Экспорт
12+
ИспользоватьFDD = Использовать;
13+
Возврат ЭтотОбъект;
14+
КонецФункции
15+
16+
Функция ИспользоватьХ64(Знач Использовать) Экспорт
17+
ИспользоватьХ64 = Использовать;
18+
Возврат ЭтотОбъект;
19+
КонецФункции
20+
21+
Функция ЭтоДистрибутивНеткор(Знач Да) Экспорт
22+
ЭтоДистрибутивНеткор = Да;
23+
Возврат ЭтотОбъект;
24+
КонецФункции
25+
26+
Функция Выбрать(Знач ПереченьФайлов) Экспорт
27+
28+
Если ЭтоДистрибутивНеткор = Истина Тогда
29+
ВидДистрибутива = ?(ИспользоватьFDD, "fdd", ТипДистрибутиваТекущейПлатформы());
30+
ИначеЕсли ЭтоДистрибутивНеткор = Ложь Тогда
31+
ВидДистрибутива = "zip";
32+
ИначеЕсли ИспользоватьFDD Тогда
33+
ЭтоДистрибутивНеткор = Истина;
34+
ВидДистрибутива = "fdd";
35+
Иначе
36+
// Это установка по алиасу и мы не знаем, версия 2 это или нет.
37+
// Определим это с двух попыток ниже.
38+
ВидДистрибутива = Неопределено;
39+
КонецЕсли;
40+
41+
Возврат НайтиПодходящийДистрибутив(ПереченьФайлов, ВидДистрибутива, ИспользоватьХ64);
42+
43+
КонецФункции
44+
45+
Функция ПризнакАрхитектуры(Знач ИспользоватьХ64)
46+
Возврат ?(ИспользоватьХ64, "x64", "x86");
47+
КонецФункции
48+
49+
Функция НайтиПодходящийДистрибутив(Знач ПереченьФайлов, Знач ВидДистрибутива, Знач ИспользоватьХ64)
50+
КритерийПоиска = Новый Структура;
51+
КритерийПоиска.Вставить("Вид");
52+
КритерийПоиска.Вставить("Архитектура");
53+
54+
РежимАлиаса = (ВидДистрибутива = Неопределено);
55+
56+
Если РежимАлиаса Тогда
57+
КритерийПоиска.Вид = ТипДистрибутиваТекущейПлатформы();
58+
Иначе
59+
КритерийПоиска.Вид = ВидДистрибутива;
60+
КонецЕсли;
61+
62+
КритерийПоиска.Архитектура = ПризнакАрхитектуры(ИспользоватьХ64);
63+
64+
НайденныеСтроки = ПереченьФайлов.НайтиСтроки(КритерийПоиска);
65+
Если НайденныеСтроки.Количество() <> 1 Тогда
66+
// Это может быть установка по алиасу и тогда есть шанс у дистрибутива zip для версии 1
67+
Если РежимАлиаса Тогда
68+
КритерийПоиска.Вид = "zip";
69+
КонецЕсли;
70+
71+
НайденныеСтроки = ПереченьФайлов.НайтиСтроки(КритерийПоиска);
72+
Если НайденныеСтроки.Количество() <> 1 Тогда
73+
ТекстОшибки = СтрШаблон(
74+
"Не найден дистрибутив для критериев: Вид=%1, Архитектура=%2. Найдено файлов: %3",
75+
КритерийПоиска.Вид,
76+
?(КритерийПоиска.Свойство("Архитектура"), КритерийПоиска.Архитектура, "<любая>"),
77+
НайденныеСтроки.Количество()
78+
);
79+
ВызватьИсключение ТекстОшибки;
80+
КонецЕсли;
81+
КонецЕсли;
82+
83+
Возврат НайденныеСтроки[0].Ссылка;
84+
КонецФункции
85+
86+
Функция ТипДистрибутиваТекущейПлатформы()
87+
88+
ТекущаяПлатформа = ДетекторОкружения.ТипПлатформы();
89+
90+
Если ТекущаяПлатформа = ТипПлатформы.Windows_x86_64
91+
Или ТекущаяПлатформа = ТипПлатформы.Windows_x86 Тогда
92+
Возврат "scd-win";
93+
ИначеЕсли ТекущаяПлатформа = ТипПлатформы.Linux_x86_64
94+
Или ТекущаяПлатформа = ТипПлатформы.Linux_x86 Тогда
95+
Возврат "scd-lin";
96+
ИначеЕсли ТекущаяПлатформа = ТипПлатформы.MacOS_x86_64
97+
Или ТекущаяПлатформа = ТипПлатформы.MacOS_x86 Тогда
98+
99+
АрхитектураПроцессора = ДетекторОкружения.АрхитектураПроцессора();
100+
101+
Если АрхитектураПроцессора = АрхитектурыПроцессоров.ARM
102+
Или АрхитектураПроцессора = АрхитектурыПроцессоров.ARM64 Тогда
103+
Возврат "osx-arm64";
104+
Иначе
105+
Возврат "osx-x64";
106+
КонецЕсли;
107+
108+
Иначе
109+
ВызватьИсключение "Не удалось определить текущую операционную систему";
110+
КонецЕсли;
111+
112+
КонецФункции

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

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
&Деталька(Значение = "oscript.server", ЗначениеПоУмолчанию = "https://oscript.io")
66
Перем АдресСайтаОСкрипт;
77

8-
&Желудь
8+
&Дуб
99
Процедура ПриСозданииОбъекта()
1010
КонецПроцедуры
1111

@@ -14,6 +14,7 @@
1414
// Возвращаемое значение:
1515
// Строка - Путь к каталогу установки по умолчанию
1616
//
17+
&Завязь(Тип = "Строка")
1718
Функция КаталогУстановкиПоУмолчанию() Экспорт
1819

1920
КаталогУстановкиПоУмолчанию = ПолучитьПеременнуюСреды("OVM_INSTALL_PATH");
@@ -33,6 +34,7 @@
3334
// Возвращаемое значение:
3435
// Строка - Адрес сайта OneScript
3536
//
37+
&Завязь(Тип = "Строка")
3638
Функция АдресСайтаОСкрипт() Экспорт
3739
Возврат АдресСайтаОСкрипт;
3840
КонецФункции
@@ -42,6 +44,7 @@
4244
// Возвращаемое значение:
4345
// Строка - Полный адрес к каталогу дистрибутивов OneScript
4446
//
47+
&Завязь(Тип = "Строка")
4548
Функция ПолныйАдресККаталогуДистрибутивов() Экспорт
4649
Возврат АдресСайтаОСкрипт() + "/downloads";
4750
КонецФункции
@@ -50,23 +53,9 @@
5053
//
5154
// Возвращаемое значение:
5255
// Булево - это 64 битная операционна система
56+
&Завязь(Тип = "Булево")
5357
Функция Это64БитнаяОперационнаяСистема() Экспорт
5458
Возврат СистемнаяИнформация.Это64БитнаяОперационнаяСистема;
5559
КонецФункции
5660

57-
// Регулярное выражение версии по semver
58-
//
59-
// Возвращаемое значение:
60-
// Строка - Регулярное выражение
61-
//
62-
Функция МаскаНомераВерсииSemver() Экспорт
63-
// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
64-
// https://regex101.com/r/vkijKf/1/
65-
66-
// BSLLS:LineLength-off
67-
Возврат "^(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-]+)*))?$";
68-
// BSLLS:LineLength-on
69-
70-
КонецФункции
71-
7261
СистемнаяИнформация = Новый СистемнаяИнформация;

0 commit comments

Comments
 (0)