vanessa-behavior 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTORS.md +4 -0
  3. data/LICENSE +202 -0
  4. data/README.md +101 -0
  5. data/ROADMAP.md +18 -0
  6. data/bin/keep.me +0 -0
  7. data/bin/vanessa-behavior.exe +0 -0
  8. data/config/cucumber.yml +7 -0
  9. data/features/EpfBehavePleer.feature +5 -0
  10. data/features/step_definitions/ones_remote_tests.wire +2 -0
  11. data/features/step_definitions/wire_protocol.epf +0 -0
  12. data/features/support/env.rb +1 -0
  13. data/features/wire_protocol.feature +337 -0
  14. data/lib/TemplateEpf/Temp/ObjectModule_ExampleAccounting.txt +0 -0
  15. data/lib/TemplateEpf/Temp/ObjectModule_example-accounting.txt +0 -0
  16. data/lib/TemplateEpf/Temp/ObjectModule_wire_protocol.txt +0 -0
  17. data/lib/TemplateEpf/Temp/keep.me +0 -0
  18. data/lib/TemplateEpf/renames.txt +7 -0
  19. data/lib/TemplateEpf/und/79a499cc-1782-4a2f-abe7-61ea4d49fd5a +37 -0
  20. data/lib/TemplateEpf/und/7a39ab7a-5023-41fd-ae4c-8d0e903c5cba.0/info +1 -0
  21. data/lib/TemplateEpf/und/8aa13ab8-188a-4f59-be4f-031aa5450c90.0/info +1 -0
  22. data/lib/TemplateEpf/und/copyinfo +7 -0
  23. data/lib/TemplateEpf/und/d4666efc-32c5-4cbe-a642-505988996654 +17 -0
  24. data/lib/TemplateEpf/und/root +1 -0
  25. data/lib/TemplateEpf/und/version +3 -0
  26. data/lib/TemplateEpf/und/versions +1 -0
  27. data/lib/UnpackV8.exe +0 -0
  28. data/tasks/developers.start.cmd +13 -0
  29. data/vanessa-behavior.os +1278 -0
  30. data/vendor/precommit1c/README.md +89 -0
  31. data/vendor/precommit1c/copy-to-hook.cmd +11 -0
  32. data/vendor/precommit1c/ibService/1Cv8.1CD +0 -0
  33. data/vendor/precommit1c/pre-commit +4 -0
  34. data/vendor/precommit1c/precommit1c.ini.example +3 -0
  35. data/vendor/precommit1c/pyv8unpack.py +370 -0
  36. data/vendor/precommit1c/tests/Fixture.epf +0 -0
  37. data/vendor/precommit1c/tests/TestFixture.cmd +13 -0
  38. data/vendor/precommit1c/tests/test_compile.py +113 -0
  39. data/vendor/precommit1c/v8Reader/LICENSE +202 -0
  40. data/vendor/precommit1c/v8Reader/README.md +35 -0
  41. data/vendor/precommit1c/v8Reader/V8Reader.epf +0 -0
  42. metadata +114 -0
@@ -0,0 +1,1278 @@
1
+ Перем Сервер;
2
+ Перем Соединение;
3
+ Перем КаталогПроекта;
4
+ Перем СтрокаПодключенияКБазе;
5
+ Перем GenerateEpf;
6
+ Перем TestRun;
7
+ Перем DebugLog;
8
+ Перем ИмяТекущейФичи;
9
+ Перем МассивДляСозданияEpf;
10
+ Перем МассивНайденыхФич;
11
+ Перем ШагСтрокДляМодуля;
12
+ Перем ОшибкаВнутриОбработкиВызоваBDD;
13
+ Перем ОЛЕ;
14
+ Перем ОбъектКонтекст;
15
+ Перем ТаблицаИзвестныхStepDefinition;
16
+ Перем ТабицаКонтекстовОбработок;
17
+
18
+ Перем RegExp;
19
+
20
+ Функция _ВКЧ(_строка)
21
+ Возврат Символ(34) + _строка + Символ(34);
22
+ КонецФункции
23
+
24
+ Процедура ЗаписатьВЖурнал(ТипСобытия, ТекстСобытия)
25
+ Сообщить("" + ТекущаяДата() + " " + ТипСобытия +": " + ТекстСобытия);
26
+ КонецПроцедуры
27
+
28
+
29
+ Функция Это_step_matches_name_to_match(Знач Стр,Рез)
30
+ //СтрПоиска = "[""step_matches"",{";
31
+ СтрПоиска = "[""step_matches"",{""name_to_match"":""";
32
+ Если Лев(Стр,СтрДлина(СтрПоиска)) = СтрПоиска Тогда
33
+ Рез1 = СокрЛП(Сред(Стр,СтрДлина(СтрПоиска)+1));
34
+ //Сообщить("Рез1="+Рез1);
35
+ Рез = Лев(Рез1,СтрДлина(Рез1)-3);
36
+ //Сообщить("Рез="+Рез);
37
+ Возврат Истина;
38
+ КонецЕсли;
39
+
40
+ Возврат Ложь;
41
+ КонецФункции
42
+
43
+ Функция СделатьПервуюБуквуЗаглавной(Стр)
44
+ Если СтрДлина(Стр) = 0 Тогда
45
+ Возврат Стр;
46
+ КонецЕсли;
47
+
48
+ ПерваяБуква = ВРег(Лев(Стр,1));
49
+
50
+ Возврат ПерваяБуква + Сред(Стр,2);
51
+ КонецФункции
52
+
53
+ Функция ДобавитьПараметрStepDefinition(Знач Стр,КолПараметров)
54
+ КолПараметровСтр = СокрЛП(КолПараметров);
55
+ Если СтрДлина(КолПараметровСтр) = 1 Тогда
56
+ КолПараметровСтр = "0" + КолПараметровСтр;
57
+ КонецЕсли;
58
+
59
+ Стр = СтрЗаменить(Стр,"<Параметр","<Парам" + КолПараметровСтр) + ",";
60
+ Стр = СтрЗаменить(Стр,"<","");
61
+ Стр = СтрЗаменить(Стр,">","");
62
+
63
+ Возврат Стр;
64
+ КонецФункции
65
+
66
+
67
+
68
+
69
+ Функция ПолучитьStepDefinition(Знач Стр,args)
70
+
71
+ StepDefinition = "";
72
+ args = "";
73
+ ПараметрыЧисла = Новый Массив;
74
+ ПараметрыСтроки = Новый Массив;
75
+ ПараметрыДаты = Новый Массив;
76
+
77
+ //найдём параметры строки
78
+ RegExp.Pattern = "\'[^\']+\'";
79
+ ПараметрыRegExp=RegExp.Execute(стр);
80
+ Для i=0 По ПараметрыRegExp.Count-1 Цикл
81
+ Item = ПараметрыRegExp.Item(i);
82
+ ПромСтр = Item.Value;
83
+ Если Лев(ПромСтр,1) = "'" Тогда
84
+ ПромСтр = Сред(ПромСтр,2);
85
+ КонецЕсли;
86
+ Если Прав(ПромСтр,1) = "'" Тогда
87
+ ПромСтр = Лев(ПромСтр,СтрДлина(ПромСтр)-1);
88
+ КонецЕсли;
89
+
90
+ //ПромСтр = СтрЗаменить(ПромСтр,"\\","\");
91
+
92
+ ПараметрыСтроки.Добавить(ПромСтр);
93
+ //Сообщить("Item.Value строка = " + Item.Value);
94
+ КонецЦикла;
95
+
96
+ стр=RegExp.Replace(стр, "<ПараметрСтрока>");
97
+
98
+ //Сообщить("стр="+стр);
99
+
100
+
101
+
102
+ //найдём параметры даты
103
+ RegExp.Pattern = "\d\d\.\d\d\.(\d\d\d\d|\d\d)";
104
+ ПараметрыRegExp=RegExp.Execute(стр);
105
+ Для i=0 По ПараметрыRegExp.Count-1 Цикл
106
+ Item = ПараметрыRegExp.Item(i);
107
+ ПараметрыДаты.Добавить(Item.Value);
108
+ //Сообщить("Item.Value дата = " + Item.Value);
109
+ КонецЦикла;
110
+ стр=RegExp.Replace(стр, "<ПараметрДата>");
111
+
112
+ //Сообщить("стр="+стр);
113
+
114
+
115
+
116
+ //найдём параметры числа
117
+ //RegExp.Pattern = "\d+";
118
+ RegExp.Pattern = "[-+]?\b[0-9]*\.?[0-9]+\b";
119
+ //RegExp.Pattern = "/^-{0,1}\d+\.{0,1}\d*$/";
120
+ ПараметрыRegExp=RegExp.Execute(стр);
121
+ Для i=0 По ПараметрыRegExp.Count-1 Цикл
122
+ Item = ПараметрыRegExp.Item(i);
123
+ ПараметрыЧисла.Добавить(Item.Value);
124
+ //Сообщить("Item.Value число = " + Item.Value);
125
+ КонецЦикла;
126
+ стр=RegExp.Replace(стр, "<ПараметрЧисло>");
127
+
128
+ //Сообщить("стр="+стр);
129
+
130
+
131
+ стр = СтрЗаменить(Стр,":","");//надо убрать некоторые спец символы
132
+
133
+
134
+
135
+ //разделим на слова
136
+ //в VBScript нет метода Split, поэтому сделаем иначе
137
+ RegExp.Pattern = "\s+";
138
+ ПромСтр=RegExp.Replace(стр,"+|||+");
139
+ //Сообщить("ПромСтр="+ПромСтр);
140
+
141
+ МассивПодстрок = РазложитьСтрокуВМассивПодстрок(ПромСтр,"+|||+",Истина);
142
+ КолПараметров = 0;
143
+ КолПараметровЧисло = 0;
144
+ КолПараметровСтрока = 0;
145
+ КолПараметровДата = 0;
146
+ СтрокаПараметров = "";
147
+ Для Каждого Элем Из МассивПодстрок Цикл
148
+ //Сообщить("Элем="+Элем);
149
+ Если Элем = "<ПараметрСтрока>" Тогда
150
+ КолПараметров = КолПараметров + 1;
151
+ КолПараметровСтрока = КолПараметровСтрока + 1;
152
+
153
+ СтрокаПараметров = СтрокаПараметров + ДобавитьПараметрStepDefinition(Элем,КолПараметров);
154
+ //Сообщить("ПараметрыСтроки[КолПараметровСтрока-1]=" + ПараметрыСтроки[КолПараметровСтрока-1]);
155
+ args = args + "{""val"":""{" + ПараметрыСтроки[КолПараметровСтрока-1] + "}""}" + ",";
156
+ Продолжить;
157
+ КонецЕсли;
158
+ Если Элем = "<ПараметрЧисло>" Тогда
159
+ КолПараметров = КолПараметров + 1;
160
+ КолПараметровЧисло = КолПараметровЧисло + 1;
161
+
162
+ СтрокаПараметров = СтрокаПараметров + ДобавитьПараметрStepDefinition(Элем,КолПараметров);
163
+ args = args + "{""val"":""{" + ПараметрыЧисла[КолПараметровЧисло-1] + "}""}" + ",";
164
+ Продолжить;
165
+ КонецЕсли;
166
+ Если Элем = "<ПараметрДата>" Тогда
167
+ КолПараметров = КолПараметров + 1;
168
+ КолПараметровДата = КолПараметровДата + 1;
169
+
170
+ СтрокаПараметров = СтрокаПараметров + ДобавитьПараметрStepDefinition(Элем,КолПараметров);
171
+ args = args + "{""val"":""{" + ПараметрыДаты[КолПараметровДата-1] + "}""}" + ",";
172
+ Продолжить;
173
+ КонецЕсли;
174
+
175
+ StepDefinition = StepDefinition + СделатьПервуюБуквуЗаглавной(Элем);
176
+ КонецЦикла;
177
+ Если СтрокаПараметров <> "" Тогда
178
+ СтрокаПараметров = Лев(СтрокаПараметров,СтрДлина(СтрокаПараметров)-1);//там лишняя запятая
179
+ КонецЕсли;
180
+
181
+ StepDefinition = StepDefinition + "(" + СтрокаПараметров + ")";
182
+
183
+ Если СтрДлина(args) > 0 Тогда
184
+ args = Лев(args,СтрДлина(args)-1);//убрали запятую
185
+ КонецЕсли;
186
+ //Сообщить("args="+args);
187
+
188
+
189
+ Возврат StepDefinition;
190
+ //Сообщить(стр);
191
+ КонецФункции
192
+
193
+ Функция СоздатьПустуюСтруктуруEpf()
194
+ Стр = Новый Структура;
195
+ Стр.Вставить("ИмяФичи","");
196
+ Стр.Вставить("ИмяФайлаEpf","");
197
+ Стр.Вставить("ВременноеИмяМодуля","");
198
+ Стр.Вставить("ТелоМодуля","");//таблица значений
199
+ Стр.Вставить("ИмяМодуляEpf","");
200
+
201
+
202
+ Возврат Стр;
203
+ КонецФункции
204
+
205
+ Функция НайтиФичуВМассиве(Стр)
206
+ Для Каждого Элем Из МассивДляСозданияEpf Цикл
207
+ Если Элем.ИмяФичи = Стр Тогда
208
+ Возврат Элем;
209
+ КонецЕсли;
210
+ КонецЦикла;
211
+
212
+ Возврат Неопределено;
213
+ КонецФункции
214
+
215
+ Функция ЗагрузитьТелоМодуляВТаблицуЗначений(ПутьКФайлу)
216
+ Тзн = Новый ТаблицаЗначений;
217
+ Тзн.Колонки.Добавить("НомСтр");
218
+ Тзн.Колонки.Добавить("Стр");
219
+
220
+ НомСтр = 0;
221
+
222
+ Текст = Новый ЧтениеТекста;
223
+ Текст.Открыть(ПутьКФайлу,"UTF-8");
224
+
225
+ Пока Истина Цикл
226
+ Стр = Текст.ПрочитатьСтроку();
227
+ Если Стр = Неопределено Тогда
228
+ Прервать;
229
+ КонецЕсли;
230
+
231
+ НомСтр = НомСтр + ШагСтрокДляМодуля;
232
+
233
+ СтрТзн = Тзн.Добавить();
234
+ СтрТзн.НомСтр = НомСтр;
235
+ СтрТзн.Стр = Стр;
236
+ КонецЦикла;
237
+
238
+ Текст.Закрыть();
239
+
240
+ Возврат Тзн;
241
+ КонецФункции
242
+
243
+ Функция ПолучитьМаксНомерИзТелаМодуля(ТелоМодуля)
244
+ Если ТелоМодуля.Количество() = 0 Тогда
245
+ Возврат 0;
246
+ КонецЕсли;
247
+
248
+ Возврат ТелоМодуля[ТелоМодуля.Количество()-1].НомСтр;
249
+ КонецФункции
250
+
251
+ Процедура ДобавитьСтрокуВМодуль(ТелоМодуля,Стр)
252
+ НомСтр = ПолучитьМаксНомерИзТелаМодуля(ТелоМодуля);
253
+
254
+
255
+ СтрТелоМодуля = ТелоМодуля.Добавить();
256
+ СтрТелоМодуля.НомСтр = НомСтр + ШагСтрокДляМодуля;
257
+ СтрТелоМодуля.Стр = Стр;
258
+
259
+
260
+ //Сообщить("ТелоМодуля.Количество()=" + ТелоМодуля.Количество());
261
+ КонецПроцедуры
262
+
263
+ Процедура СоздатьКаталогЕслиЕгоНет(Путь)
264
+ Файл = Новый Файл(Путь);
265
+ Если Не Файл.Существует() Тогда
266
+ СоздатьКаталог(Путь);
267
+ Сообщить("Создан каталог: " + Путь);
268
+ КонецЕсли;
269
+ КонецПроцедуры
270
+
271
+
272
+ Процедура СоздатьФайлыОбработок()
273
+
274
+ Для Каждого СтруктураОписанияEpf Из МассивДляСозданияEpf Цикл
275
+ ТелоМодуля = СтруктураОписанияEpf.ТелоМодуля;
276
+ ТелоМодуля.Сортировать("НомСтр");
277
+
278
+ СделатьСообщение("Буду записывать " + СтруктураОписанияEpf.ВременноеИмяМодуля);
279
+
280
+ //Продолжить;
281
+
282
+ УдалитьФайлы(СтруктураОписанияEpf.ВременноеИмяМодуля);
283
+ ЗТ = Новый ЗаписьТекста(СтруктураОписанияEpf.ВременноеИмяМодуля,"UTF-8",,Истина);
284
+ Для Каждого СтрТелоМодуля Из ТелоМодуля Цикл
285
+ //СделатьСообщение("СтрТелоМодуля.Стр = " + СтрТелоМодуля.Стр);
286
+ ЗТ.ЗаписатьСтроку(СтрТелоМодуля.Стр);
287
+ //ЗТ.Записать(Символы.ПС);
288
+ КонецЦикла;
289
+ ЗТ.Закрыть();
290
+ СделатьСообщение("Записал " + СтруктураОписанияEpf.ВременноеИмяМодуля);
291
+
292
+ ИмяФайлаМодуляДляСборки = КаталогПроекта + "\lib\TemplateEpf\ObjectModule.txt";
293
+ УдалитьФайлы(ИмяФайлаМодуляДляСборки);
294
+ ПереместитьФайл(СтруктураОписанияEpf.ВременноеИмяМодуля,ИмяФайлаМодуляДляСборки);
295
+ СделатьСообщение("Переименовал в " + ИмяФайлаМодуляДляСборки);
296
+
297
+ Файл = Новый Файл(СтруктураОписанияEpf.ИмяФайлаEpf);
298
+ СоздатьКаталогЕслиЕгоНет(Файл.Путь);
299
+
300
+ СтрокаСборкиEpf = КаталогПроекта + "\vendor\precommit1c\pyv8unpack.py --compile " + КаталогПроекта + "\lib\TemplateEpf " + СтруктураОписанияEpf.ИмяФайлаEpf;
301
+ Сообщить("СтрокаСборкиEpf="+СтрокаСборкиEpf);
302
+
303
+ retCode = "";
304
+ ЗапуститьПриложение(СтрокаСборкиEpf,,Истина,retCode);
305
+ Сообщить("retCode=" + retCode);
306
+ УдалитьФайлы(ИмяФайлаМодуляДляСборки);
307
+
308
+ КонецЦикла;
309
+
310
+ КонецПроцедуры
311
+
312
+ Процедура ДобавитьStepDefinitionВТекстМодуля(СтруктураОписанияEpf,StepDefinition,ПримерИспользованияПроцедуры)
313
+ ТелоМодуля = СтруктураОписанияEpf.ТелоМодуля;
314
+ ТелоМодуля.Сортировать("НомСтр");
315
+
316
+ УжеЕсть = Ложь;
317
+ Для Каждого СтрТелоМодуля Из ТелоМодуля Цикл
318
+ Стр = СокрЛП(СтрТелоМодуля.Стр);
319
+ Если Лев(Стр,3) = "//@" Тогда //так определяется StepDefinition
320
+ Если Найти(Стр,StepDefinition) > 0 Тогда
321
+ УжеЕсть = Истина;
322
+ Прервать;
323
+ КонецЕсли;
324
+ КонецЕсли;
325
+ КонецЦикла;
326
+
327
+ Если УжеЕсть Тогда
328
+ Возврат;
329
+ КонецЕсли;
330
+
331
+ //НомСтр = ПолучитьМаксНомерИзТелаМодуля(ТелоМодуля);
332
+
333
+ //Возврат;
334
+
335
+ ДобавитьСтрокуВМодуль(ТелоМодуля,"//" + ПримерИспользованияПроцедуры);
336
+ ДобавитьСтрокуВМодуль(ТелоМодуля,"//@" + StepDefinition);
337
+ ДобавитьСтрокуВМодуль(ТелоМодуля,"Процедура " + StepDefinition + " Экспорт");
338
+ ДобавитьСтрокуВМодуль(ТелоМодуля," ВызватьИсключение ""Не реализовано."";");
339
+ ДобавитьСтрокуВМодуль(ТелоМодуля,"КонецПроцедуры");
340
+ ДобавитьСтрокуВМодуль(ТелоМодуля,"");
341
+
342
+ КонецПроцедуры
343
+
344
+ Процедура ДобавитьНачальноеЗаполнениеВМодуль(ТелоМодуля)
345
+ //ДобавитьСтрокуВМодуль(ТелоМодуля,"Перем Контекст Экспорт;");
346
+ ДобавитьСтрокуВМодуль(ТелоМодуля,"");
347
+ ДобавитьСтрокуВМодуль(ТелоМодуля,"Процедура ПередНачаломСценария() Экспорт");
348
+ ДобавитьСтрокуВМодуль(ТелоМодуля," ");
349
+ ДобавитьСтрокуВМодуль(ТелоМодуля,"КонецПроцедуры");
350
+ ДобавитьСтрокуВМодуль(ТелоМодуля,"");
351
+ ДобавитьСтрокуВМодуль(ТелоМодуля,"Процедура ПередОкончаниемСценария() Экспорт");
352
+ ДобавитьСтрокуВМодуль(ТелоМодуля," ");
353
+ ДобавитьСтрокуВМодуль(ТелоМодуля,"КонецПроцедуры");
354
+ ДобавитьСтрокуВМодуль(ТелоМодуля,"");
355
+ КонецПроцедуры
356
+
357
+ Процедура СоздатьИлиДополнитьСтруктурыДляEpfФайлов(ОтносительныйКаталогФичи)
358
+ Файл = Новый Файл(КаталогПроекта + "\lib\TemplateEpf");
359
+ Если Не Файл.Существует() Тогда
360
+ Сообщить("Не найден служебный каталог \lib\TemplateEpf !!!");
361
+ Возврат;
362
+ КонецЕсли;
363
+
364
+ Если ИмяТекущейФичи = "" Тогда
365
+ Сообщить("Не определилась текущая фича из тегов feature файла.");
366
+ Возврат;
367
+ КонецЕсли;
368
+
369
+ СтруктураОписанияEpf = НайтиФичуВМассиве(ИмяТекущейФичи);
370
+ Если СтруктураОписанияEpf = Неопределено Тогда
371
+ СтруктураОписанияEpf = СоздатьПустуюСтруктуруEpf();
372
+ СтруктураОписанияEpf.ИмяФичи = ИмяТекущейФичи;
373
+ СтруктураОписанияEpf.ИмяФайлаEpf = КаталогПроекта + ОтносительныйКаталогФичи + "\step_definitions\" + ИмяТекущейФичи + ".epf";
374
+ СтруктураОписанияEpf.ИмяМодуляEpf = КаталогПроекта + "\src" + ОтносительныйКаталогФичи + "\step_definitions\" + ИмяТекущейФичи + "\ObjectModule.txt";
375
+ СтруктураОписанияEpf.ВременноеИмяМодуля = КаталогПроекта + "\lib\TemplateEpf\Temp\ObjectModule_" + ИмяТекущейФичи + ".txt";
376
+
377
+ //Сообщить("СтруктураОписанияEpf.ИмяМодуляEpf="+СтруктураОписанияEpf.ИмяМодуляEpf);
378
+
379
+
380
+ УдалитьФайлы(СтруктураОписанияEpf.ВременноеИмяМодуля);
381
+
382
+
383
+ Файл = Новый Файл(СтруктураОписанияEpf.ВременноеИмяМодуля);
384
+ Если Не Файл.Существует() Тогда
385
+ //Сообщить(СтруктураОписанияEpf.ВременноеИмяМодуля);
386
+ ЗТ = Новый ЗаписьТекста(СтруктураОписанияEpf.ВременноеИмяМодуля,"UTF-8",,Истина);
387
+ ЗТ.Закрыть();
388
+ КонецЕсли;
389
+
390
+
391
+ Файл = Новый Файл(СтруктураОписанияEpf.ИмяМодуляEpf); //значит надо загрузить модуль из исходников
392
+ Если Файл.Существует() Тогда
393
+ СтруктураОписанияEpf.ТелоМодуля = ЗагрузитьТелоМодуляВТаблицуЗначений(СтруктураОписанияEpf.ИмяМодуляEpf);
394
+ Иначе
395
+ СтруктураОписанияEpf.ТелоМодуля = ЗагрузитьТелоМодуляВТаблицуЗначений(СтруктураОписанияEpf.ВременноеИмяМодуля);
396
+ //значит создаём файл первый разделим
397
+ ДобавитьНачальноеЗаполнениеВМодуль(СтруктураОписанияEpf.ТелоМодуля);
398
+ КонецЕсли;
399
+
400
+
401
+
402
+
403
+ МассивДляСозданияEpf.Добавить(СтруктураОписанияEpf);
404
+ СделатьСообщение("Добавляю фичу " + СтруктураОписанияEpf.ИмяФичи + " в МассивДляСозданияEpf.");
405
+ КонецЕсли;
406
+
407
+
408
+
409
+ КонецПроцедуры
410
+
411
+ Функция Это_begin_scenario_tags(Знач Стр,ИмяФ,ПутьКФ)
412
+ СтрПоиска = "[""begin_scenario"",{""tags"":[""";
413
+ Если Лев(Стр,СтрДлина(СтрПоиска)) = СтрПоиска Тогда
414
+ Стр = СокрЛП(Сред(Стр,СтрДлина(СтрПоиска)+1));
415
+ //Сообщить("ПолезноеЗначение1="+ПолезноеЗначение);
416
+ Стр = Лев(Стр,СтрДлина(Стр)-4);
417
+ Поз = Найти(Стр,";");
418
+ Стр1 = Лев(Стр,Поз-1);
419
+ ИмяФ = СтрЗаменить(Стр1,"[ИмяФичи]=","");
420
+ ПутьКФ = Сред(Стр,Поз+1);
421
+ ПутьКФ = СтрЗаменить(ПутьКФ,"\\","\");
422
+ Возврат Истина;
423
+ КонецЕсли;
424
+
425
+ Возврат Ложь;
426
+ КонецФункции
427
+
428
+ Функция Это_end_scenario_tags(Знач Стр)
429
+ СтрПоиска = "[""end_scenario"",{""tags"":[""";
430
+ Если Лев(Стр,СтрДлина(СтрПоиска)) = СтрПоиска Тогда
431
+ Возврат Истина;
432
+ КонецЕсли;
433
+
434
+ Возврат Ложь;
435
+ КонецФункции
436
+
437
+
438
+ Функция Это_invoke(Знач Стр,ИмяМетода,ЗначенияПараметров)
439
+ СтрПоиска = "[""invoke"",{""id"":""";
440
+ Если Лев(Стр,СтрДлина(СтрПоиска)) = СтрПоиска Тогда
441
+ Стр = СокрЛП(Сред(Стр,СтрДлина(СтрПоиска)+1));
442
+ //Сообщить("Стр="+Стр);
443
+
444
+ СтрПоиска2 = """args"":[";
445
+ Поз = Найти(Стр,СтрПоиска2);
446
+ ИмяМетода = Лев(Стр,Поз-3);
447
+ ЗначенияПараметров = Сред(Стр,Поз+СтрДлина(СтрПоиска2)-1);
448
+ ЗначенияПараметров = Лев(ЗначенияПараметров,СтрДлина(ЗначенияПараметров)-2);
449
+ Сообщить("ИмяМетода="+ИмяМетода);
450
+ Сообщить("ЗначенияПараметров="+ЗначенияПараметров);
451
+
452
+ Возврат Истина;
453
+ КонецЕсли;
454
+
455
+ Возврат Ложь;
456
+ КонецФункции
457
+
458
+
459
+ Функция НайтиФайлОбработкиПоИмениФичи(Стр)
460
+ Для Каждого Элем Из МассивНайденыхФич Цикл
461
+ Если Элем.ИмяФичи = Стр Тогда
462
+ Возврат Элем.ПолныйПуть;
463
+ КонецЕсли;
464
+ КонецЦикла;
465
+
466
+ Возврат Неопределено;
467
+ КонецФункции
468
+
469
+ Функция СформироватьОписаниеОшибки(Знач Стр,ИмяФайла,ИмяПроцедуры)
470
+ Стр = СтрЗаменить(Стр,Символы.ПС,"");
471
+ Стр = СтрЗаменить(Стр,Символы.ВК,"");
472
+
473
+ СтрПоиска = "Рефлектор.ВызватьМетод(СтрТабицаКонтекстовОбработок.Обработка, ИмяПроцедуры, МассивАргументов);";
474
+ Поз = Найти(Стр,СтрПоиска);
475
+ Если Поз > 0 Тогда
476
+ ПромСтр = Сред(Стр,Поз + СтрДлина(СтрПоиска));
477
+ Если ПромСтр <> "" Тогда
478
+ Стр = ПромСтр;
479
+ КонецЕсли;
480
+ КонецЕсли;
481
+
482
+ Поз1 = Найти(Стр,"Метод объекта не обнаружен");
483
+ Если Поз1 > 0 Тогда
484
+ Стр = Сред(Стр,Поз1);
485
+ Поз2 = Найти(Стр,")");
486
+ Стр = Лев(Стр,Поз2);
487
+ КонецЕсли;
488
+ //Стр = СтрЗаменить(Стр,СтрПоиска,"");
489
+
490
+ Стр = Стр + "; ИмяФайла="+СтрЗаменить(ИмяФайла,"\","\\") + ", ИмяПроцедуры="+ИмяПроцедуры;
491
+ Возврат Стр;
492
+ КонецФункции
493
+
494
+
495
+ Функция ВыполнитьПроцедуруОбработки(ИмяФайла,ИмяПроцедуры,Параметры = Неопределено)
496
+ //Если DebugLog Тогда
497
+ // Сообщить("ВыполнитьПроцедуруОбработки");
498
+ // Сообщить("ИмяФайла="+ИмяФайла);
499
+ // Сообщить("ИмяПроцедуры="+ИмяПроцедуры);
500
+ //КонецЕсли;
501
+ //Если Параметры = Неопределено Тогда
502
+ // Сообщить("Параметры=Неопределено");
503
+ //Иначе
504
+ // Сообщить("Параметры.Количество()="+Параметры.Количество());
505
+ // Для Каждого Элем Из Параметры Цикл
506
+ // Сообщить("Элем+1 = " + (Элем+1));
507
+ // КонецЦикла;
508
+ //КонецЕсли;
509
+
510
+ СтрокаВозврата = "[""success""]";
511
+
512
+ Рефлектор = Новый Рефлектор();
513
+ МассивАргументов = Новый Массив;
514
+ Если Параметры <> Неопределено Тогда
515
+ МассивАргументов = Параметры;
516
+ КонецЕсли;
517
+
518
+ СтрТабицаКонтекстовОбработок = ТабицаКонтекстовОбработок.Найти(ИмяФайла,"ИмяФайла");
519
+ Если СтрТабицаКонтекстовОбработок = Неопределено Тогда
520
+ ПрерватьВыполнениеСкрипта("В таблице ТабицаКонтекстовОбработок не найден файл " + ИмяФайла);
521
+ КонецЕсли;
522
+
523
+ Попытка
524
+ СтрТабицаКонтекстовОбработок.Обработка.Контекст = ОбъектКонтекст;
525
+ Рефлектор.ВызватьМетод(СтрТабицаКонтекстовОбработок.Обработка, ИмяПроцедуры, МассивАргументов);
526
+ Исключение
527
+ Если DebugLog Тогда
528
+ Сообщить("ОписаниеОшибки()="+ОписаниеОшибки());
529
+ КонецЕсли;
530
+ СтрокаВозврата = "[""fail"",{""message"":""" + СформироватьОписаниеОшибки(ОписаниеОшибки(),ИмяФайла,ИмяПроцедуры) + """}]";
531
+ КонецПопытки;
532
+
533
+ //СтрокаВозврата = СтрЗаменить(СтрокаВозврата,Символы.ПС,"");
534
+ //СтрокаВозврата = СтрЗаменить(СтрокаВозврата,Символы.ВК,"");
535
+
536
+ //Поз = Найти(СтрокаВозврата,Символы.ПС);
537
+ //Если Поз > 0 Тогда
538
+ // Сообщить("Обнаружен перевод строки.");
539
+ //КонецЕсли;
540
+
541
+ Возврат СтрокаВозврата;
542
+ КонецФункции
543
+
544
+ Функция ПреобразоватьКДатеСтроку(Знач Стр)
545
+ //Зн = Дата(Стр);
546
+ Год = 0;
547
+ Месяц = 0;
548
+ День = 0;
549
+
550
+ Поз = Найти(Стр,".");
551
+ День = Число(Лев(Стр,Поз-1));
552
+ Стр = Сред(Стр,Поз+1);
553
+
554
+ Поз = Найти(Стр,".");
555
+ Месяц = Число(Лев(Стр,Поз-1));
556
+ Стр = Сред(Стр,Поз+1);
557
+
558
+ Год = Число(Стр);
559
+ Если Год < 100 Тогда
560
+ Год = Год + 2000;
561
+ КонецЕсли;
562
+
563
+ Зн = Дата(Год,Месяц,День);
564
+
565
+ Сообщить("" + Стр + " было преобразовано к " + Зн);
566
+ Возврат Зн;
567
+ КонецФункции
568
+
569
+
570
+ Функция РазобратьСтрокуЗначенийПараметров(Знач Стр,ПараметрыСвойства)
571
+
572
+
573
+
574
+ Массив = Новый Массив;
575
+
576
+ Если Лев(Стр,1) = "[" Тогда
577
+ Стр = Сред(Стр,2);
578
+ КонецЕсли;
579
+ Если Прав(Стр,1) = "]" Тогда
580
+ Стр = Лев(Стр,СтрДлина(Стр)-1);
581
+ КонецЕсли;
582
+ //Сообщить("Стр="+Стр);
583
+
584
+
585
+ ИдПараметра = 0;
586
+
587
+ Пока Истина Цикл
588
+ Поз1 = Найти(Стр, """{");
589
+ Если Поз1 = 0 Тогда
590
+ Прервать;
591
+ КонецЕсли;
592
+
593
+ Поз2 = Найти(Стр, "}""");
594
+ Если Поз2 = 0 Тогда
595
+ Прервать;
596
+ КонецЕсли;
597
+
598
+ Зн = Сред(Стр,Поз1+2,Поз2-Поз1-2);
599
+ //Сообщить("Зн="+Зн);
600
+ Тип = ПараметрыСвойства[ИдПараметра].Тип;
601
+ //Сообщить("Тип="+Тип + ", ИдПараметра=" + ИдПараметра);
602
+
603
+ Стр = Сред(Стр,Поз2+1+2);
604
+ //Сообщить("Новая Стр="+Стр);
605
+ //Прервать;
606
+
607
+
608
+ Если Тип = "Число" Тогда
609
+ Попытка
610
+ Зн = Число(Зн);
611
+ Исключение
612
+ ПрерватьВыполнениеСкрипта("Не смог преобразовать к числу. Значение="+Зн + ", СтрокаПараметров="+Стр);
613
+ КонецПопытки;
614
+ КонецЕсли;
615
+
616
+ Если Тип = "Дата" Тогда
617
+ Попытка
618
+ Зн = ПреобразоватьКДатеСтроку(Зн);
619
+ Исключение
620
+ ПрерватьВыполнениеСкрипта("Не смог преобразовать к дате. Значение="+Зн + ", СтрокаПараметров="+Стр);
621
+ КонецПопытки;
622
+ КонецЕсли;
623
+
624
+ Массив.Добавить(Зн);
625
+ ИдПараметра = ИдПараметра + 1;
626
+ КонецЦикла;
627
+
628
+ Возврат Массив;
629
+ КонецФункции
630
+
631
+
632
+ Функция СделатьInvoke(ИмяМетода,ЗначенияПараметров)
633
+ СтрокаВозврата = "";
634
+
635
+
636
+ //Сообщить("Invoke: ИмяМетода=" + ИмяМетода);
637
+ //Сообщить("Invoke: ЗначенияПараметров=" + ЗначенияПараметров);
638
+
639
+ СтрТаблицаИзвестныхStepDefinition = ТаблицаИзвестныхStepDefinition.Найти(ИмяМетода,"ID");
640
+ Если СтрТаблицаИзвестныхStepDefinition = Неопределено Тогда
641
+ СтрокаВозврата = СтрокаВозврата = "[""fail"",{""message"":""" + "В epf файлах фич не обнаружен снипет:" + ИмяМетода + """}]";
642
+ Возврат СтрокаВозврата;
643
+ КонецЕсли;
644
+
645
+ МассивПараметров = РазобратьСтрокуЗначенийПараметров(ЗначенияПараметров,СтрТаблицаИзвестныхStepDefinition.Параметры);
646
+ //Сообщить(СтрТаблицаИзвестныхStepDefinition.ИмяФайла);
647
+ //в этом файле мы будем запускать данный шаг
648
+
649
+ СтрокаРеальнойПроцедуры = СтрТаблицаИзвестныхStepDefinition.СтрокаРеальнойПроцедуры;
650
+ Поз = Найти(СтрокаРеальнойПроцедуры,"(");
651
+ Если Поз > 0 Тогда
652
+ СтрокаРеальнойПроцедуры = Лев(СтрокаРеальнойПроцедуры,Поз-1);
653
+ КонецЕсли;
654
+
655
+ СтрокаВозврата = ВыполнитьПроцедуруОбработки(СтрТаблицаИзвестныхStepDefinition.ИмяФайла,СтрокаРеальнойПроцедуры,МассивПараметров);
656
+
657
+ Возврат СтрокаВозврата;
658
+ КонецФункции
659
+
660
+ Функция ОбработатьПараметрыВызоваBDD(СтрокаВызова)
661
+ Если DebugLog Тогда
662
+ ЗаписатьВЖурнал("INFO", "Получен вызов BDD:" + СтрокаВызова);
663
+ КонецЕсли;
664
+
665
+ СтрокаВозврата = "[""success""]";
666
+ //СтрокаВозврата = "[""success"",[{""id"":""1"", ""args"":[]}]]";
667
+
668
+ StepDefinition = "";
669
+ ПолезноеЗначение = "";
670
+ ПримерИспользованияПроцедуры = "";
671
+ ПромСтр = СтрокаВызова;
672
+ Если Это_step_matches_name_to_match(ПромСтр,ПолезноеЗначение) Тогда
673
+ //Сообщить("ПолезноеЗначение="+ПолезноеЗначение);
674
+ args = "";
675
+ //Сообщить("ПолезноеЗначение=" + ПолезноеЗначение);
676
+ Если Найти(ПолезноеЗначение,"[") > 0 Тогда
677
+ ПрерватьВыполнениеСкрипта("Не верное определение имени фичи: " + ПолезноеЗначение);
678
+ КонецЕсли;
679
+ StepDefinition = ПолучитьStepDefinition(ПолезноеЗначение,args);
680
+ ПримерИспользованияПроцедуры = ПолезноеЗначение;
681
+ Сообщить("StepDefinition="+StepDefinition);
682
+
683
+ СтрокаВозврата = "[""success"",[{""id"":""" + StepDefinition + """, ""args"":[" + args +"]}]]";
684
+ КонецЕсли;
685
+
686
+ ИмяФ = "";
687
+ ОтносительныйКаталогФичи = "";
688
+ ПромСтр = СтрокаВызова;
689
+ Если Это_begin_scenario_tags(ПромСтр,ИмяФ,ОтносительныйКаталогФичи) Тогда
690
+ Если ИмяТекущейФичи <> ИмяФ Тогда
691
+ ИмяТекущейФичи = ИмяФ;
692
+ Если TestRun Тогда
693
+ ОбъектКонтекст = ОЛЕ.NewObject("Структура");//контекст один на всю фичу, а не на весь сценарий (в фиче может быть много сценариев)
694
+ КонецЕсли;
695
+ СоздатьИлиДополнитьСтруктурыДляEpfФайлов(ОтносительныйКаталогФичи);
696
+ КонецЕсли;
697
+
698
+
699
+ //СтрокаВозврата = "[""success""]";
700
+ Если TestRun Тогда
701
+ СтруктураОписанияEpf = НайтиФичуВМассиве(ИмяТекущейФичи);
702
+ СтрокаВозврата = ВыполнитьПроцедуруОбработки(СтруктураОписанияEpf.ИмяФайлаEpf,"ПередНачаломСценария");
703
+ КонецЕсли;
704
+ Если DebugLog Тогда
705
+ Сообщить("ИмяТекущейФичи="+ИмяТекущейФичи + ", ОтносительныйКаталогФичи="+ОтносительныйКаталогФичи);
706
+ КонецЕсли;
707
+ КонецЕсли;
708
+
709
+ ПромСтр = СтрокаВызова;
710
+ Если Это_end_scenario_tags(ПромСтр) Тогда
711
+ Если TestRun Тогда
712
+ СтруктураОписанияEpf = НайтиФичуВМассиве(ИмяТекущейФичи);
713
+ СтрокаВозврата = ВыполнитьПроцедуруОбработки(СтруктураОписанияEpf.ИмяФайлаEpf,"ПередОкончаниемСценария");
714
+ КонецЕсли;
715
+ //СтрокаВозврата = "[""success""]";
716
+ КонецЕсли;
717
+
718
+ ПромСтр = СтрокаВызова;
719
+ ИмяМетода = "";
720
+ ЗначенияПараметров = "";
721
+ Если Это_invoke(ПромСтр,ИмяМетода,ЗначенияПараметров) Тогда
722
+ Если TestRun Тогда
723
+ СтрокаВозврата = СделатьInvoke(ИмяМетода,ЗначенияПараметров);
724
+ Иначе
725
+ СтрокаВозврата = "[""pending"", ""I'll do it later""]";
726
+ КонецЕсли;
727
+ КонецЕсли;
728
+
729
+ //Возврат "[""error1"",[]]";
730
+ //СтрокаВозврата = "qqq";
731
+ Сообщить("СтрокаВозврата="+СтрокаВозврата);
732
+ //sleep(1500);
733
+
734
+ Если GenerateEpf Тогда
735
+ //СоздатьИлиДополнитьСтруктурыДляEpfФайлов(StepDefinition,ПримерИспользованияПроцедуры,ОтносительныйКаталогФичи);
736
+ Если StepDefinition <> "" Тогда
737
+ СтруктураОписанияEpf = НайтиФичуВМассиве(ИмяТекущейФичи);
738
+ ДобавитьStepDefinitionВТекстМодуля(СтруктураОписанияEpf,StepDefinition,ПримерИспользованияПроцедуры);
739
+ КонецЕсли;
740
+ КонецЕсли;
741
+
742
+ Возврат СтрокаВозврата;
743
+ КонецФункции
744
+
745
+ Процедура СделатьСообщение(Знач Сообщение)
746
+
747
+ Сообщить(Строка(ТекущаяДата()) + " " + Сообщение);
748
+
749
+ КонецПроцедуры
750
+
751
+ Функция ЕстьПараметр(МассивПараметрыЗапуска,ИмяПараметра)
752
+ Для каждого Элем Из МассивПараметрыЗапуска Цикл
753
+ Если НРег(Элем) = НРег(ИмяПараметра) Тогда
754
+ Возврат Истина;
755
+ КонецЕсли;
756
+ КонецЦикла;
757
+
758
+ Возврат Ложь;
759
+ КонецФункции
760
+
761
+ Функция ПолучитьЗначениеПараметраЗапуска(МассивПараметрыЗапуска,ИмяПараметра)
762
+ Сч = 0;
763
+ Для каждого Элем Из МассивПараметрыЗапуска Цикл
764
+ Сч = Сч + 1;
765
+ Если Лев(Элем,СтрДлина(ИмяПараметра)) = ИмяПараметра Тогда
766
+ Возврат Сред(Элем,СтрДлина(ИмяПараметра)+1);
767
+ //Если МассивПараметрыЗапуска.Количество() > Сч Тогда
768
+ // Возврат МассивПараметрыЗапуска[Сч];//здесь -1 писать не надо
769
+ //КонецЕсли;
770
+ КонецЕсли;
771
+ КонецЦикла;
772
+
773
+ Возврат Неопределено;
774
+ КонецФункции
775
+
776
+
777
+ Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено) Экспорт
778
+
779
+ Результат = Новый Массив;
780
+
781
+ // для обеспечения обратной совместимости
782
+ Если ПропускатьПустыеСтроки = Неопределено Тогда
783
+ ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь);
784
+ Если ПустаяСтрока(Строка) Тогда
785
+ Если Разделитель = " " Тогда
786
+ Результат.Добавить("");
787
+ КонецЕсли;
788
+ Возврат Результат;
789
+ КонецЕсли;
790
+ КонецЕсли;
791
+ //
792
+
793
+ Позиция = Найти(Строка, Разделитель);
794
+ Пока Позиция > 0 Цикл
795
+ Подстрока = Лев(Строка, Позиция - 1);
796
+ Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
797
+ Результат.Добавить(Подстрока);
798
+ КонецЕсли;
799
+ Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
800
+ Позиция = Найти(Строка, Разделитель);
801
+ КонецЦикла;
802
+
803
+ Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда
804
+ Результат.Добавить(Строка);
805
+ КонецЕсли;
806
+
807
+ Возврат Результат;
808
+
809
+ КонецФункции
810
+
811
+ Процедура ПрерватьВыполнениеСкрипта(ТекстИсключения)
812
+ ВызватьИсключение(ТекстИсключения);
813
+ КонецПроцедуры
814
+
815
+ Функция УбратьКаталогПроекта(Знач Стр)
816
+ Поз = Найти(Стр,КаталогПроекта);
817
+ Если Поз = 0 Тогда
818
+ ПрерватьВыполнениеСкрипта("Не нашел каталог проекта (" + КаталогПроекта + ") в пути к файлу фичи " + Стр);
819
+ Возврат "";
820
+ КонецЕсли;
821
+
822
+ Рез = СокрЛП(СтрЗаменить(Стр,КаталогПроекта,""));
823
+ Если Прав(Рез,1) = "\" Тогда
824
+ Рез = Лев(Рез,СтрДлина(Рез)-1);
825
+ КонецЕсли;
826
+ //Рез = СтрЗаменить(Рез,"\\","\");
827
+ //Сообщить("Рез=" + Рез);
828
+ Возврат Рез;
829
+ КонецФункции
830
+
831
+
832
+ Процедура ПроставитьТегВФичу(ПутьКФайлу)
833
+ Текст = Новый ЧтениеТекста;
834
+ Текст.Открыть(ПутьКФайлу,"UTF-8");
835
+
836
+
837
+ НадоПерезаписатьТег = Ложь;
838
+ Пока Истина Цикл
839
+ Стр = Текст.ПрочитатьСтроку();
840
+ Если Стр = Неопределено Тогда
841
+ Прервать;
842
+ КонецЕсли;
843
+
844
+ Если Лев(СокрЛП(Стр),1) = "@" Тогда
845
+ Если Найти(Стр,"[ИмяФичи]") > 0 Тогда
846
+ НадоПерезаписатьТег = Истина;
847
+ КонецЕсли;
848
+ КонецЕсли;
849
+
850
+ КонецЦикла;
851
+ Текст.Закрыть();
852
+
853
+
854
+ Файл = Новый Файл(ПутьКФайлу);
855
+ ИмяФичи = "@[ИмяФичи]=" + Файл.ИмяБезРасширения + ";" + УбратьКаталогПроекта(Файл.Путь);
856
+
857
+
858
+ Текст = Новый ЧтениеТекста;
859
+ Текст.Открыть(ПутьКФайлу,"UTF-8");
860
+
861
+ ИмяТемпФайла = ПутьКФайлу + "Temp";
862
+ УдалитьФайлы(ИмяТемпФайла);
863
+
864
+ ЗТ = Новый ЗаписьТекста(ИмяТемпФайла,"UTF-8",,Истина);
865
+
866
+ ДобавитьТегСледующейСтрокой = Ложь;
867
+ УжеЗаписывалТег = Ложь;
868
+ Пока Истина Цикл
869
+ Стр = Текст.ПрочитатьСтроку();
870
+ Если Стр = Неопределено Тогда
871
+ Прервать;
872
+ КонецЕсли;
873
+
874
+ Если НадоПерезаписатьТег Тогда
875
+ Если Лев(СокрЛП(Стр),1) = "@" Тогда
876
+ Если Найти(Стр,"[ИмяФичи]") > 0 Тогда
877
+ //Файл = Новый Файл(ПутьКФайлу);
878
+ Стр = ИмяФичи;
879
+ КонецЕсли;
880
+ КонецЕсли;
881
+ Иначе
882
+ Если (Лев(СокрЛП(Стр),1) <> "#") и (СтрДлина(СокрЛП(Стр)) > 0) Тогда
883
+ ДобавитьТегСледующейСтрокой = Истина;
884
+ КонецЕсли;
885
+ КонецЕсли;
886
+
887
+
888
+ Если ДобавитьТегСледующейСтрокой и (Не УжеЗаписывалТег) Тогда
889
+ //Файл = Новый Файл(ПутьКФайлу);
890
+ СтрФича = ИмяФичи;
891
+ ЗТ.Записать(СтрФича);
892
+ ЗТ.Записать(Символы.ПС);
893
+ ЗТ.Записать(Символы.ПС);
894
+
895
+ ДобавитьТегСледующейСтрокой = Ложь;
896
+ УжеЗаписывалТег = Истина;
897
+ КонецЕсли;
898
+
899
+ ЗТ.Записать(Стр);
900
+ ЗТ.Записать(Символы.ПС);
901
+ КонецЦикла;
902
+
903
+ ЗТ.Закрыть();
904
+ Текст.Закрыть();
905
+ УдалитьФайлы(ПутьКФайлу);
906
+ ПереместитьФайл(ИмяТемпФайла,ПутьКФайлу);
907
+
908
+ КонецПроцедуры
909
+
910
+ Процедура ОбработатьFeatureФайлыЧтобыПроставитьТегиСИменемФичиИЗаполнитьМассивНайденыхФич(НачальныйКаталог)
911
+ //Сообщить("НачальныйКаталог= " + НачальныйКаталог);
912
+ МассивФайлов = НайтиФайлы(НачальныйКаталог,"*.feature",Истина);
913
+ Для Каждого Элем Из МассивФайлов Цикл
914
+ //Сообщить("Найден файл " + Элем.Имя);
915
+ ПроставитьТегВФичу(Элем.ПолноеИмя);
916
+
917
+ СтруктураФичи = Новый Структура;
918
+ СтруктураФичи.Вставить("ИмяФичи",Элем.ИмяБезРасширения);
919
+ СтруктураФичи.Вставить("ПолныйПуть",Элем.Путь);
920
+
921
+ //Стр = СтрЗаменить(СтруктураФичи.ПолныйПуть,КаталогПроекта);
922
+
923
+
924
+ МассивНайденыхФич.Добавить(СтруктураФичи);
925
+ КонецЦикла;
926
+ КонецПроцедуры
927
+
928
+ Функция ПолучитьСледующуюСтрокуМодуля(СтрТзн,Тзн)
929
+ Индекс = Тзн.Индекс(СтрТзн);
930
+ Если Индекс = Тзн.Количество()-1 Тогда
931
+ Возврат Неопределено;
932
+ КонецЕсли;
933
+
934
+ Возврат Тзн.Получить(Индекс+1);
935
+ КонецФункции
936
+
937
+ Процедура ДобавитьСнипет(Знач ID,Знач СтрокаРеальнойПроцедуры,Знач ИмяФайла,БылиОшибки)
938
+
939
+ СтрокаРеальнойПроцедуры = СокрЛП(СтрокаРеальнойПроцедуры);
940
+ ID = СокрЛП(ID);
941
+
942
+ //уберем слово "Экспорт"
943
+ Если Прав(НРег(СтрокаРеальнойПроцедуры),7) = "экспорт" Тогда
944
+ СтрокаРеальнойПроцедуры = Лев(СтрокаРеальнойПроцедуры,СтрДлина(СтрокаРеальнойПроцедуры)-7);
945
+ СтрокаРеальнойПроцедуры = СокрЛП(СтрокаРеальнойПроцедуры);
946
+ КонецЕсли;
947
+
948
+ Если Лев(НРег(СтрокаРеальнойПроцедуры),9) = "процедура" Тогда
949
+ СтрокаРеальнойПроцедуры = СокрЛП(Сред(СтрокаРеальнойПроцедуры,10));
950
+ КонецЕсли;
951
+
952
+ //Сообщить("ID="+ID);
953
+ //Сообщить("СтрокаРеальнойПроцедуры="+СтрокаРеальнойПроцедуры);
954
+ //Сообщить("ИмяФайла="+ИмяФайла);
955
+
956
+ Поз = Найти(ID,"(");
957
+ СтрПараметры = Сред(ID,Поз+1);
958
+ СтрПараметры = Лев(СтрПараметры,СтрДлина(СтрПараметры)-1);
959
+
960
+ //Сообщить("СтрПараметры="+СтрПараметры);
961
+
962
+ МассивПром = РазложитьСтрокуВМассивПодстрок(СтрПараметры, ",");
963
+ МассивПараметров = Новый Массив;
964
+ Для Каждого Элем Из МассивПром Цикл
965
+ СтруктураПарам = Новый Структура;
966
+ Тип = "Строка";
967
+ Если Найти(НРег(Элем),"число") > 0 Тогда
968
+ Тип = "Число";
969
+ КонецЕсли;
970
+ Если Найти(НРег(Элем),"дата") > 0 Тогда
971
+ Тип = "Дата";
972
+ КонецЕсли;
973
+ СтруктураПарам.Вставить("Тип",Тип);
974
+ МассивПараметров.Добавить(СтруктураПарам);
975
+
976
+ //Сообщить("Тип="+Тип + ", Элем=" + Элем);
977
+ КонецЦикла;
978
+
979
+ ПромСтр = ТаблицаИзвестныхStepDefinition.Найти(ID,"ID");
980
+ Если ПромСтр <> Неопределено Тогда
981
+ БылиОшибки = Истина;
982
+ Сообщить("Ошибка в файле " + ИмяФайла + ", снипет " + ID + " уже был в " + ПромСтр.ИмяФайла);
983
+ Возврат;
984
+ КонецЕсли;
985
+
986
+ СтрТаблицаИзвестныхStepDefinition = ТаблицаИзвестныхStepDefinition.Добавить();
987
+ СтрТаблицаИзвестныхStepDefinition.ID = ID;
988
+ СтрТаблицаИзвестныхStepDefinition.СтрокаРеальнойПроцедуры = СтрокаРеальнойПроцедуры;
989
+ СтрТаблицаИзвестныхStepDefinition.ИмяФайла = ИмяФайла;
990
+ СтрТаблицаИзвестныхStepDefinition.Параметры = МассивПараметров;
991
+ КонецПроцедуры
992
+
993
+ Функция СоздатьПустуюТаблицуПроцедур()
994
+ Тзн = Новый ТаблицаЗначений;
995
+ Тзн.Колонки.Добавить("ID");
996
+ Тзн.Колонки.Добавить("СтрокаРеальнойПроцедуры");
997
+ Тзн.Колонки.Добавить("Параметры");
998
+ Возврат Тзн;
999
+ КонецФункции
1000
+
1001
+
1002
+ Процедура ПросканироватьИсходникиИНайтиВсеStepDefinition()
1003
+ БылиОшибки = Ложь;
1004
+ НачальныйКаталог = КаталогПроекта+"\features";
1005
+ //Сообщить("НачальныйКаталог="+НачальныйКаталог);
1006
+ МассивФайлов = НайтиФайлы(НачальныйКаталог,"*.epf",Истина);
1007
+ Для Каждого Файл Из МассивФайлов Цикл
1008
+ СтрТабицаКонтекстовОбработок = ТабицаКонтекстовОбработок.Добавить();
1009
+ СтрТабицаКонтекстовОбработок.ИмяФайла = Файл.ПолноеИмя;
1010
+ СтрТабицаКонтекстовОбработок.Обработка = ОЛЕ.ВнешниеОбработки.Создать(СтрТабицаКонтекстовОбработок.ИмяФайла);
1011
+
1012
+ //Рефлектор = Новый Рефлектор();
1013
+ //МассивАргументов = Новый Массив;
1014
+ //МассивАргументов.Добавить(1);
1015
+ //МассивАргументов.Добавить("фывфывфывфы");
1016
+ //Рефлектор.ВызватьМетод(СтрТабицаКонтекстовОбработок.Обработка, "ПередНачаломСценария", МассивАргументов);
1017
+
1018
+ //СтрТаблицаИзвестныхStepDefinition = ТаблицаИзвестныхStepDefinition.Добавить();
1019
+ //СтрТаблицаИзвестныхStepDefinition.ИмяФайла = Файл.ПолноеИмя;
1020
+ //СтрТаблицаИзвестныхStepDefinition.ТаблицаПроцедур = СоздатьПустуюТаблицуПроцедур();
1021
+
1022
+ Сообщить("Путь="+Файл.ПолноеИмя);
1023
+ Стр = Файл.Путь;
1024
+ Стр = СтрЗаменить(Стр,КаталогПроекта,КаталогПроекта + "\Src");
1025
+ Стр = Стр + "" + Файл.ИмяБезРасширения + "\ObjectModule.txt";
1026
+ //Сообщить("Стр="+Стр);
1027
+
1028
+ ФайлМодуль = Новый Файл(Стр);
1029
+ Если Не ФайлМодуль.Существует() Тогда
1030
+ ПрерватьВыполнениеСкрипта("Файл " + Стр + " не найден! Не могу найти StepDefinition.");
1031
+ КонецЕсли;
1032
+
1033
+ ТелоМодуля = ЗагрузитьТелоМодуляВТаблицуЗначений(Стр);
1034
+
1035
+ Для Каждого СтрТелоМодуля Из ТелоМодуля Цикл
1036
+ Если Лев(СтрТелоМодуля.Стр,3) = "//@" Тогда
1037
+ СледСтрока = ПолучитьСледующуюСтрокуМодуля(СтрТелоМодуля,ТелоМодуля);
1038
+ Если СледСтрока = Неопределено Тогда
1039
+ Продолжить;
1040
+ КонецЕсли;
1041
+ ДобавитьСнипет(Сред(СтрТелоМодуля.Стр,4),СледСтрока.Стр,Файл.ПолноеИмя,БылиОшибки);
1042
+ //Сообщить("" + СтрТелоМодуля.Стр);
1043
+ КонецЕсли;
1044
+ КонецЦикла;
1045
+
1046
+ КонецЦикла;
1047
+
1048
+ Если БылиОшибки Тогда
1049
+ ПрерватьВыполнениеСкрипта("Были ошибки в ПросканироватьИсходникиИНайтиВсеStepDefinition.");
1050
+ КонецЕсли;
1051
+ КонецПроцедуры
1052
+
1053
+ Процедура ЗапуститьСерверДляКукумбера()
1054
+ Сервер = Новый TCPСервер(54321);
1055
+ Сервер.Запустить();
1056
+
1057
+
1058
+
1059
+
1060
+
1061
+
1062
+
1063
+ //Путь = "E:\commons\Rep\cuke4onec\cuke4onec.epf";
1064
+ //Путь = КаталогПроекта + "\cuke4onec.epf";
1065
+ //cuke4onec = ОЛЕ.ExternalDataProcessors.Create(Путь);
1066
+
1067
+ //StepsDir = "E:\commons\Rep\cuke4onec\features\step_definitions";
1068
+ //StepsDir = КаталогПроекта + "\features\step_definitions";
1069
+ //cuke4onec._Create(StepsDir);
1070
+ //cuke4onec._Purge();
1071
+
1072
+ //СтрокаЗапускаКукумбер = "Cucumber --dry-run --no-snippets """ + КаталогПроекта + "\features"" > " + КаталогПроекта + "\CucumberConsoleLog.txt";
1073
+ //СтрокаЗапускаКукумбер = "Cucumber --no-snippets """ + КаталогПроекта + "\features"" > " + КаталогПроекта + "\CucumberConsoleLog.txt";
1074
+ //СтрокаЗапускаКукумбер = "Cucumber --no-snippets """ + КаталогПроекта + "\features""";
1075
+
1076
+
1077
+ //todo посмотреть в файл CucumberConsolErr, и если там есть ошибка - сделать exit code 1
1078
+ //СтрокаЗапускаКукумбер = "Cucumber --no-snippets --no-color """ + КаталогПроекта + "\features"" > " + КаталогПроекта + //"\CucumberConsoleLog.txt" + " 2>" + КаталогПроекта + "\CucumberConsolErr.txt";
1079
+ СтрокаЗапускаКукумбер = "cucumber """ + КаталогПроекта + "\features"" > " + КаталогПроекта + "\CucumberConsoleLog.txt" + " 2>" + КаталогПроекта + "\CucumberConsolErr.txt";
1080
+
1081
+
1082
+ Сообщить("Строка для запуска Cucumber: " + СтрокаЗапускаКукумбер);
1083
+ ЗапуститьПриложение(СтрокаЗапускаКукумбер);
1084
+
1085
+
1086
+ ЗаписатьВЖурнал("INFO", "Жду соединения");
1087
+
1088
+ Соединение = Сервер.ОжидатьСоединения();
1089
+
1090
+ ЗаписатьВЖурнал("INFO", "Есть соединение");
1091
+ ЗаписатьВЖурнал("INFO", "-------------------------------------");
1092
+
1093
+ //Соединение.ТаймаутЧтения = 1000;
1094
+ //Соединение.ТаймаутОтправки = 1000;
1095
+
1096
+ Пока Истина Цикл
1097
+
1098
+ Попытка
1099
+
1100
+ Стр = НакопитьСтроку(Соединение);
1101
+ Если DebugLog Тогда
1102
+ Сообщить("Получили " + СтрДлина(Стр) + " символов.");
1103
+ Если СтрДлина(Стр) = 1 Тогда //значит произошла ошибка при обмене
1104
+ ОшибкаВнутриОбработкиВызоваBDD = Истина;
1105
+ ПрерватьВыполнениеСкрипта("Пришла строка длины 1.");
1106
+ КонецЕсли;
1107
+ КонецЕсли;
1108
+ Данные = СокрЛП(Стр);
1109
+
1110
+ Если СтрДлина(Данные) = 0 и Не Соединение.Активно Тогда
1111
+ Сообщить("Завершен сеанс работы с Cucumber");
1112
+ Прервать;
1113
+ КонецЕсли;
1114
+
1115
+ ОшибкаВнутриОбработкиВызоваBDD = Истина;
1116
+ Результат = ОбработатьПараметрыВызоваBDD(Данные);
1117
+ ОшибкаВнутриОбработкиВызоваBDD = Ложь;
1118
+
1119
+ //ЗаписатьВЖурнал("INFO", "Отправляю данные в ответ");
1120
+ //ЧтоВернем = Результат + Символы.ПС;
1121
+ ЧтоВернем = Результат + "
1122
+ |";
1123
+ //Сообщить(ЧтоВернем);
1124
+ Попытка
1125
+ //sleep(400);
1126
+ Соединение.ОтправитьСтроку(ЧтоВернем, "utf-8");
1127
+ Исключение
1128
+ Сообщить("Не удалось отправить данные. Соединение с Cucumber разорвано");
1129
+ Прервать;
1130
+ КонецПопытки;
1131
+ //Соединение.ОтправитьСтроку(Символы.ПС, "utf-8");
1132
+ Исключение
1133
+ Сообщить("##" + ОписаниеОшибки());
1134
+ Прервать;
1135
+ КонецПопытки;
1136
+
1137
+ ЗаписатьВЖурнал("INFO", "-------------------------------------");
1138
+ КонецЦикла;
1139
+
1140
+ Соединение.Закрыть();
1141
+ Сервер.Остановить();
1142
+ //ОЛЕ.ЗавершитьРаботуСистемы();
1143
+
1144
+ КонецПроцедуры
1145
+
1146
+ Функция НакопитьСтроку(Знач Соединение)
1147
+
1148
+ Стр = "";
1149
+ СчетчикПопыток = 0;
1150
+ Интервал = 100;
1151
+ Пока Истина Цикл
1152
+ Порция = Соединение.ПрочитатьСтроку("utf-8");
1153
+
1154
+ Если DebugLog Тогда
1155
+ Сообщить("Получили порцию:" + Порция);
1156
+ КонецЕсли;
1157
+ Стр = Стр + Порция;
1158
+ Если Прав(Порция, 1) = Символы.ПС Тогда
1159
+ Прервать;
1160
+ КонецЕсли;
1161
+
1162
+ Если СчетчикПопыток > 3 Тогда
1163
+ Прервать;
1164
+ КонецЕсли;
1165
+
1166
+ СчетчикПопыток = СчетчикПопыток + 1;
1167
+ Приостановить(Интервал);
1168
+ Интервал = Интервал * 2;
1169
+
1170
+ Если DebugLog Тогда
1171
+ Сообщить("Нет признака окончания. Ждем:" + Интервал);
1172
+ КонецЕсли;
1173
+ КонецЦикла;
1174
+
1175
+ Возврат Стр;
1176
+
1177
+ КонецФункции
1178
+
1179
+ ИмяТекущейФичи = "";
1180
+ МассивДляСозданияEpf = Новый Массив;
1181
+ МассивНайденыхФич = Новый Массив;
1182
+ ШагСтрокДляМодуля = 1000;
1183
+
1184
+ ТаблицаИзвестныхStepDefinition = Новый ТаблицаЗначений;
1185
+ ТаблицаИзвестныхStepDefinition.Колонки.Добавить("ИмяФайла");
1186
+ //ТаблицаИзвестныхStepDefinition.Колонки.Добавить("ТаблицаПроцедур");
1187
+ ТаблицаИзвестныхStepDefinition.Колонки.Добавить("Id");
1188
+ ТаблицаИзвестныхStepDefinition.Колонки.Добавить("СтрокаРеальнойПроцедуры");
1189
+ ТаблицаИзвестныхStepDefinition.Колонки.Добавить("Параметры");
1190
+
1191
+ ТабицаКонтекстовОбработок = Новый ТаблицаЗначений;
1192
+ ТабицаКонтекстовОбработок.Колонки.Добавить("ИмяФайла");
1193
+ ТабицаКонтекстовОбработок.Колонки.Добавить("Обработка");
1194
+
1195
+ ОшибкаВнутриОбработкиВызоваBDD = Ложь;
1196
+
1197
+ RegExp = Новый COMОбъект("VBScript.RegExp");
1198
+ RegExp.IgnoreCase = Ложь; //Игнорировать регистр
1199
+ RegExp.Global = Истина; //Поиск всех вхождений шаблона
1200
+ RegExp.MultiLine = Ложь; //Многострочный режим
1201
+
1202
+
1203
+ Если АргументыКоманднойСтроки.Количество() = 0 Тогда
1204
+ СделатьСообщение("Не переданы параметры для запуска!");
1205
+ ЗавершитьРаботу(1);
1206
+ ИначеЕсли АргументыКоманднойСтроки.Количество() >= 1 Тогда
1207
+ //МассивПараметрыЗапуска = РазложитьСтрокуВМассивПодстрок(АргументыКоманднойСтроки[0], ";");
1208
+ //Для Каждого Элем Из АргументыКоманднойСтроки Цикл
1209
+ // Сообщить(Элем);
1210
+ //КонецЦикла;
1211
+
1212
+ КаталогПроекта = ПолучитьЗначениеПараметраЗапуска(АргументыКоманднойСтроки,"--ProjectPath=");
1213
+ СтрокаПодключенияКБазе = ПолучитьЗначениеПараметраЗапуска(АргументыКоманднойСтроки,"--1cConnectString=");
1214
+ GenerateEpf = ЕстьПараметр(АргументыКоманднойСтроки,"--GenerateEpf");
1215
+ TestRun = ЕстьПараметр(АргументыКоманднойСтроки,"--TestRun");
1216
+ DebugLog = ЕстьПараметр(АргументыКоманднойСтроки,"--DebugLog");
1217
+
1218
+ Если СокрЛП(КаталогПроекта) = "" Тогда
1219
+ Сообщить("Используется текущий каталог в качестве каталога проекта");
1220
+ КаталогПроекта = ТекущийКаталог();
1221
+ //ПрерватьВыполнениеСкрипта("Не указан каталог проекта: ProjectPath");
1222
+ КонецЕсли;
1223
+
1224
+ Если СокрЛП(СтрокаПодключенияКБазе) = "" Тогда
1225
+ Сообщить("Используется адрес подключения к сервисной базе ibService");
1226
+ СтрокаПодключенияКБазе = "File=" + _ВКЧ(ТекущийКаталог()+ "\.git\hooks\ibService\");
1227
+ //ПрерватьВыполнениеСкрипта("Не указана строка подключения к 1С: 1cConnectString");
1228
+ КонецЕсли;
1229
+
1230
+ Сообщить("КаталогПроекта = " + КаталогПроекта);
1231
+ Сообщить("СтрокаПодключенияКБазе = " + СтрокаПодключенияКБазе);
1232
+ Сообщить("GenerateEpf = " + GenerateEpf);
1233
+ Сообщить("TestRun = " + TestRun);
1234
+ Сообщить("DebugLog = " + DebugLog);
1235
+
1236
+ //ПрерватьВыполнениеСкрипта("Тест");
1237
+
1238
+ Если GenerateEpf И TestRun Тогда
1239
+ ПрерватьВыполнениеСкрипта("Нельзя указывать одновременно GenerateEpf и TestRun.");
1240
+ КонецЕсли;
1241
+ Иначе
1242
+ ПрерватьВыполнениеСкрипта("Неверное число параметров. (" + АргументыКоманднойСтроки.Количество() + ") Должен быть 1.");
1243
+ КонецЕсли;
1244
+
1245
+ Если TestRun Тогда
1246
+ ОЛЕ = Новый COMObject("V83.Application");
1247
+ Получилось = ОЛЕ.Connect(СтрокаПодключенияКБазе);
1248
+ ОЛЕ.Visible = Истина;
1249
+ Сообщить("Получилось подключиться = " + Получилось);
1250
+ Если Не Получилось Тогда
1251
+ ПрерватьВыполнениеСкрипта("Не смогли подключиться к базе 1С.");
1252
+ КонецЕсли;
1253
+
1254
+ ПросканироватьИсходникиИНайтиВсеStepDefinition();
1255
+ //ОЛЕ.ЗавершитьРаботуСистемы();
1256
+ //ПрерватьВыполнениеСкрипта("Тест");
1257
+ КонецЕсли;
1258
+
1259
+
1260
+ ОбработатьFeatureФайлыЧтобыПроставитьТегиСИменемФичиИЗаполнитьМассивНайденыхФич(КаталогПроекта + "\features");
1261
+
1262
+ ЗапуститьСерверДляКукумбера();
1263
+
1264
+ Если ОшибкаВнутриОбработкиВызоваBDD Тогда
1265
+ ПрерватьВыполнениеСкрипта("ОшибкаВнутриОбработкиВызоваBDD");
1266
+ КонецЕсли;
1267
+
1268
+ Если GenerateEpf Тогда
1269
+ СоздатьФайлыОбработок();
1270
+ КонецЕсли;
1271
+
1272
+
1273
+ Если TestRun Тогда
1274
+ ОЛЕ.ЗавершитьРаботуСистемы();
1275
+ КонецЕсли;
1276
+
1277
+
1278
+ //todo Когда обработка скомпилированна, надо её создать и проверить, что нет ошибок компиляции