Skip to content

Commit a07003f

Browse files
authored
Merge pull request #8 from oscript-library/develop
1.0.0
2 parents 073ede0 + bc80ad2 commit a07003f

File tree

11 files changed

+492
-86
lines changed

11 files changed

+492
-86
lines changed

.github/workflows/qa.yaml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
name: Контроль качества
2+
3+
on:
4+
push:
5+
pull_request:
6+
workflow_dispatch:
7+
8+
jobs:
9+
sonar:
10+
uses: autumn-library/workflows/.github/workflows/sonar.yml@v1
11+
with:
12+
github_repository: oscript-library/semver
13+
coveralls: true
14+
secrets:
15+
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}

.github/workflows/testing.yml

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,14 @@ jobs:
1010
strategy:
1111
fail-fast: false
1212
matrix:
13-
oscript_version: ['dev', 'lts-dev', 'default']
14-
uses: autumn-library/workflows/.github/workflows/test.yml@main
13+
include:
14+
- oscript_version: 'default'
15+
test_engine: '1testrunner'
16+
- oscript_version: 'stable'
17+
test_engine: '1testrunner'
18+
- oscript_version: 'dev'
19+
test_engine: 'oneunit'
20+
uses: autumn-library/workflows/.github/workflows/test.yml@oneunit
1521
with:
16-
oscript_version: ${{ matrix.oscript_version }}
22+
oscript_version: ${{ matrix.oscript_version }}
23+
test_engine: ${{ matrix.test_engine }}

packagedef

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
//
55

66
Описание.Имя("semver")
7-
.Версия("0.6.0")
7+
.Версия("1.0.0")
88
.Автор("Khorev Aleksey")
99
.АдресАвтора("[email protected]")
1010
.Описание("Эта библиотека облегчает работу с семантическими версиями")
@@ -14,8 +14,8 @@
1414
.ВключитьФайл("tests")
1515
.ЗависитОт("logos")
1616
.ЗависитОт("strings")
17-
.ЗависитОт("fluent", "0.6.1")
1817
.РазработкаЗависитОт("1testrunner", "1.9.2")
18+
.РазработкаЗависитОт("coverage", "0.7.0")
1919
.ОпределяетМодуль("Версии", "src/core/Модули/Версии.os")
2020
.ОпределяетКласс("Версия", "src/core/Классы/Версия.os")
2121
.ОпределяетКласс("ДиапазонВерсий", "src/core/Классы/ДиапазонВерсий.os")

sonar-project.properties

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
sonar.projectKey=semver
2+
sonar.projectName=semver
3+
sonar.sources=./src
4+
sonar.tests=./tests
5+
sonar.sourceEncoding=UTF-8
6+
sonar.coverageReportPaths=out/genericCoverage.xml

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

Lines changed: 145 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
Перем Патч Экспорт; // число
99

1010
Перем ПреРелиз Экспорт; // Массив
11-
Перем НомерБилда Экспорт; // Массив;
11+
Перем МетаданныеСборки Экспорт; // Массив;
1212
Перем ОшибкаЧтенияВерсии Экспорт;
1313

1414
Процедура ПриСозданииОбъекта(Знач ВерсияСтрокой)
@@ -17,6 +17,7 @@
1717
Второстепенная = 0;
1818
Патч = 0;
1919
ПреРелиз = Новый Массив;
20+
МетаданныеСборки = Новый Массив;
2021

2122
Прочитать(ВерсияСтрокой);
2223

@@ -47,6 +48,14 @@
4748
Функция ВСтроку() Экспорт
4849

4950
СтрокаВерсии = СтрШаблон("%1.%2.%3", Строка(Основная), Строка(Второстепенная), Строка(Патч));
51+
52+
Если ПреРелиз.Количество() Тогда
53+
СтрокаВерсии = СтрокаВерсии + "-" + СтрСоединить(ПреРелиз, ".");
54+
КонецЕсли;
55+
56+
Если МетаданныеСборки.Количество() Тогда
57+
СтрокаВерсии = СтрокаВерсии + "+" + СтрСоединить(МетаданныеСборки, ".");
58+
КонецЕсли;
5059

5160
Возврат СтрокаВерсии;
5261

@@ -64,7 +73,7 @@
6473

6574
Если НЕ Основная = ВходящаяВерсия.Основная Тогда
6675

67-
Возврат ?(Основная > ВходящаяВерсия.Основная,1,-1);
76+
Возврат ?(Основная > ВходящаяВерсия.Основная, 1,-1);
6877

6978
КонецЕсли;
7079

@@ -86,12 +95,7 @@
8695
КонецЕсли;
8796

8897
Если ПреРелиз.Количество() = 0
89-
И ВходящаяВерсия.ПреРелиз.Количество() = 0 Тогда
90-
Возврат 0;
91-
КонецЕсли;
92-
93-
Если ПреРелиз.Количество() = 0
94-
И ВходящаяВерсия.ПреРелиз.Количество() > 1 Тогда
98+
И ВходящаяВерсия.ПреРелиз.Количество() > 0 Тогда
9599
Возврат 1;
96100
КонецЕсли;
97101

@@ -100,7 +104,7 @@
100104
Возврат -1;
101105
КонецЕсли;
102106

103-
Возврат 0;
107+
Возврат СравнитьПререлизы(ВходящаяВерсия.ПреРелиз);
104108

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

@@ -164,6 +168,38 @@
164168
Возврат Сравнить(ВходящаяВерсия) >= 0;
165169
КонецФункции
166170

171+
Функция СравнитьПреРелизы(Знач Сравниваемое)
172+
// Поэлементное сравнение
173+
Для Сч = 0 По Макс(ПреРелиз.ВГраница(), Сравниваемое.ВГраница()) Цикл
174+
// Больший набор предрелизных символов имеет больший приоритет,
175+
// чем меньший набор, если сравниваемые идентификаторы равны =>
176+
// если компоненты будут равны, побеждает тот, у кого компонентов больше
177+
178+
Если Сч > ПреРелиз.ВГраница() Тогда
179+
Возврат -1;
180+
ИначеЕсли Сч > Сравниваемое.ВГраница() Тогда
181+
Возврат 1;
182+
КонецЕсли;
183+
184+
Текущий = ПреРелиз[Сч];
185+
Входящий = Сравниваемое[Сч];
186+
187+
Если Текущий = Входящий Тогда
188+
Продолжить;
189+
КонецЕсли;
190+
191+
// Численные идентификаторы имеют низший приоритет
192+
Если ТипЗнч(Текущий) <> ТипЗнч(Входящий) Тогда
193+
Возврат ?(ТипЗнч(Текущий) = Тип("Строка"), 1, -1);
194+
КонецЕсли;
195+
196+
Возврат ?(Текущий > Входящий, 1, -1);
197+
198+
КонецЦикла;
199+
200+
Возврат 0;
201+
КонецФункции
202+
167203
Процедура Прочитать(Знач ВерсияСтрокой)
168204

169205
Если СтрДлина(ВерсияСтрокой) = 0 Тогда
@@ -173,64 +209,128 @@
173209

174210
ВерсияСтрокой = ПодготовитьКЧтению(ВерсияСтрокой);
175211

176-
МассивСтрокВерсии = СтрРазделить(ВерсияСтрокой, ".");
177-
178-
Если МассивСтрокВерсии.Количество() < 3 Тогда
179-
ОшибкаЧтенияВерсии = "Не найдены все составляющие версии";
180-
Возврат;
181-
КонецЕсли;
212+
Парсер = Новый ПарсерВерсии(ВерсияСтрокой);
213+
Парсер.Следующий();
182214

183-
СтрокаОсновнаяВерсия = МассивСтрокВерсии[0];
215+
Попытка
216+
ПрочитатьЧислоДоРазделителя(Парсер, Основная, "Основная версия");
217+
ПрочитатьРазделитель(Парсер, ".");
218+
ПрочитатьЧислоДоРазделителя(Парсер, Второстепенная, "Второстепенная версия");
219+
ПрочитатьРазделитель(Парсер, ".");
220+
ПрочитатьЧислоДоРазделителя(Парсер, Патч, "Версия патча");
221+
ПрочитатьХвостовыеМассивы(Парсер);
222+
Исключение
223+
ОшибкаЧтенияВерсии = ИнформацияОбОшибке().Описание;
224+
КонецПопытки;
184225

185-
Если Не СтроковыеФункции.ТолькоЦифрыВСтроке(СтрокаОсновнаяВерсия) Тогда
186-
187-
ОшибкаЧтенияВерсии = СтрШаблон("Основная версия <%1> должна содержать только цифры",СтрокаОсновнаяВерсия);
188-
Возврат;
226+
КонецПроцедуры
227+
228+
Процедура ПрочитатьРазделитель(Знач Парсер, Знач Разделитель)
229+
230+
ТекущийТокен = Парсер.Текущий();
231+
Если ТекущийТокен.Тип = Парсер.ТипКонецТекста Тогда
232+
Возврат;
233+
КонецЕсли;
189234

235+
Если ТекущийТокен.Тип = Парсер.ТипРазделитель Тогда
236+
Если Разделитель = ТекущийТокен.Значение Тогда
237+
СледующийТокен = Парсер.Следующий();
238+
Если СледующийТокен.Тип = Парсер.ТипКонецТекста Тогда
239+
ВызватьИсключение СтрШаблон("Неожиданный конец строки версии, нет данных после разделителя <%1>", Разделитель);
240+
КонецЕсли;
241+
Возврат;
242+
КонецЕсли;
190243
КонецЕсли;
191244

192-
Основная = Число(СтрокаОсновнаяВерсия);
193-
194-
СтрокаВторостепеннаяВерсия = МассивСтрокВерсии[1];
245+
ВызватьИсключение СтрШаблон("Ожидается разделитель <%1>, но получен <%2>", Разделитель, ТекущийТокен.Значение);
195246

247+
КонецПроцедуры
196248

197-
Если Не СтроковыеФункции.ТолькоЦифрыВСтроке(СтрокаВторостепеннаяВерсия) Тогда
198-
199-
ОшибкаЧтенияВерсии = СтрШаблон("Второстепенная версия <%1> должна содержать только цифры",СтрокаОсновнаяВерсия);
200-
Возврат;
201-
249+
Процедура ПрочитатьЧислоДоРазделителя(Знач Парсер, Результат, Знач УточнениеИсключения)
250+
Токен = Парсер.Текущий();
251+
Если Токен.Тип = Парсер.ТипКонецТекста Тогда
252+
Возврат;
202253
КонецЕсли;
203254

204-
Второстепенная = Число(СтрокаВторостепеннаяВерсия);
255+
Если Токен.Тип = Парсер.ТипЧисло Тогда
256+
Результат = Число(Токен.Значение);
257+
ИначеЕсли Токен.Тип = Парсер.ТипОшибка Тогда
258+
ВызватьИсключение Токен.Значение;
259+
Иначе
260+
ВызватьИсключение СтрШаблон("%1 <%2> должна содержать только цифры", УточнениеИсключения, Токен.Значение);
261+
КонецЕсли;
205262

206-
СтрокаПатчаВерсии = МассивСтрокВерсии[2];
263+
Парсер.Следующий();
264+
КонецПроцедуры
207265

208-
Если Не СтроковыеФункции.ТолькоЦифрыВСтроке(СтрокаПатчаВерсии) Тогда
209-
210-
ОшибкаЧтенияВерсии = СтрШаблон("Версия патча <%1> должна содержать только цифры",СтрокаОсновнаяВерсия);
211-
Возврат;
212-
266+
Процедура ПрочитатьХвостовыеМассивы(Знач Парсер)
267+
Токен = Парсер.Текущий();
268+
Если Токен.Тип = Парсер.ТипКонецТекста Тогда
269+
Возврат;
270+
КонецЕсли;
271+
272+
Если Токен.Тип <> Парсер.ТипРазделитель или Токен.Значение = "." Тогда
273+
ВызватьИсключение "Ожидается разделитель пререлизной версии <-> или метаданных сборки <+>, получен <" + Токен.Значение + ">";
213274
КонецЕсли;
214275

215-
Патч = Число(СтрокаПатчаВерсии);
276+
ПрочитатьПреРелиз(Парсер);
277+
ПрочитатьМетаданныеСборки(Парсер);
216278

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

219-
Функция ПодготовитьКЧтению(Знач СтрокаВерсии)
220-
221-
Если СтрНачинаетсяС(СтрокаВерсии, "v") Тогда
222-
СтрокаВерсии = СтрЗаменить(СтрокаВерсии, "v", "");
281+
Процедура ПрочитатьПреРелиз(Знач Парсер)
282+
Если Парсер.Текущий().Значение = "-" Тогда
283+
Парсер.Следующий();
284+
СобратьМассивИзКомпонентов(Парсер, ПреРелиз, "+");
285+
КонецЕсли;
286+
КонецПроцедуры
287+
288+
Процедура ПрочитатьМетаданныеСборки(Знач Парсер)
289+
Если Парсер.Текущий().Значение = "+" Тогда
290+
Парсер.Следующий();
291+
СобратьМассивИзКомпонентов(Парсер, МетаданныеСборки, "");
223292
КонецЕсли;
293+
КонецПроцедуры
224294

225-
МассивСтрокВерсии = СтрРазделить(СтрокаВерсии, ".");
295+
Процедура СобратьМассивИзКомпонентов(Знач Парсер, Знач МассивКомпонентов, Знач ПрерватьПо)
296+
297+
Пока Истина Цикл
298+
МассивКомпонентов.Добавить(ПрочитатьКомпонент(Парсер));
299+
Если Парсер.Текущий().Значение = ПрерватьПо или Парсер.Текущий().Тип = Парсер.ТипКонецТекста Тогда
300+
Прервать;
301+
КонецЕсли;
226302

227-
КоличествоДобавления = 3 - МассивСтрокВерсии.Количество();
303+
ПрочитатьРазделитель(Парсер, ".");
228304

229-
Для ИИ = 1 ПО КоличествоДобавления Цикл
230-
МассивСтрокВерсии.Добавить(0);
231305
КонецЦикла;
232306

233-
Возврат СтрСоединить(МассивСтрокВерсии, ".");
307+
КонецПроцедуры
308+
309+
Функция ПрочитатьКомпонент(Знач Парсер)
310+
Токен = Парсер.Текущий();
311+
Если Токен.Тип = Парсер.ТипЧисло Тогда
312+
Парсер.Следующий();
313+
Возврат Число(Токен.Значение);
314+
ИначеЕсли Токен.Тип = Парсер.ТипТекст Тогда
315+
Текст = "";
316+
ТекТокен = Парсер.Текущий();
317+
Пока ТекТокен.Тип = Парсер.ТипТекст или ТекТокен.Значение = "-" Цикл
318+
Текст = Текст + ТекТокен.Значение;
319+
ТекТокен = Парсер.Следующий();
320+
КонецЦикла;
321+
Возврат Текст;
322+
Иначе
323+
ВызватьИсключение СтрШаблон("Ожидается компонент версии, но получен <%1>", ?(Токен.Значение = "", "EOF", Токен.Значение));
324+
КонецЕсли;
325+
КонецФункции
326+
327+
Функция ПодготовитьКЧтению(Знач СтрокаВерсии)
328+
329+
Если СтрНачинаетсяС(СтрокаВерсии, "v") Тогда
330+
СтрокаВерсии = Сред(СтрокаВерсии, 2);
331+
КонецЕсли;
332+
333+
Возврат СтрокаВерсии;
234334

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

0 commit comments

Comments
 (0)