Skip to content

Commit fcad92a

Browse files
committed
#16 Получение аргументов и опций команд родителей
1 parent 86e882e commit fcad92a

File tree

2 files changed

+155
-18
lines changed

2 files changed

+155
-18
lines changed

src/core/Классы/cmd/КомандаПриложения.os

Lines changed: 92 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,11 @@
9696
// Произвольный - Значение - полученное значение в результате чтения строки использования или переменных окружения
9797
Функция ЗначениеОпции(Знач ИмяОпции) Экспорт
9898

99+
ОпцииИндекса = ОпцияИзИндекса(ИмяОпции);
100+
Если ОпцииИндекса = Неопределено Тогда
101+
ВызватьИсключение СтрШаблон("Ошибка получение значения опции <%1>. Опция не найдена в индексе опций команды", ИмяОпции);
102+
КонецЕсли;
103+
99104
Возврат ОпцияИзИндекса(ИмяОпции).Значение;
100105

101106
КонецФункции
@@ -109,10 +114,86 @@
109114
// Произвольный - Значение - полученное значение в результате чтения строки использования или переменных окружения
110115
Функция ЗначениеАргумента(Знач ИмяАргумента) Экспорт
111116

117+
АргументИндекса = АргументИзИндекса(ИмяАргумента);
118+
119+
Если АргументИндекса = Неопределено Тогда
120+
ВызватьИсключение СтрШаблон("Ошибка получение значения аргумента <%1>. Аргумент не найден в индексе аргументов команды", ИмяАргумента);
121+
КонецЕсли;
122+
112123
Возврат АргументИзИндекса(ИмяАргумента).Значение;
113124

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

127+
// Функция возвращает значение опции команды родителя по переданному имени/синониму опции
128+
// Возвращает первое из совпадений или неопределенно в случае отсутствия опции
129+
//
130+
// Параметры:
131+
// ИмяОпции - строка - имя или синоним опции
132+
//
133+
// Возвращаемое значение:
134+
// Произвольный, Неопределенно - полученное значение в результате чтения строки использования или переменных окружения
135+
// или неопределенно в случае отсутствия в индексе указанной опции
136+
Функция ЗначениеОпцииКомандыРодителя(Знач ИмяОпции) Экспорт
137+
138+
Лог.Отладка("Ищю опцию <%1> для родителей", ИмяОпции);
139+
140+
Для каждого РодительКоманды Из КомандыРодители Цикл
141+
142+
Лог.Отладка(" --> Проверяю родителя <%1>", РодительКоманды.ПолучитьИмяКоманды());
143+
144+
ОпцияРодителя = РодительКоманды.ОпцияИзИндекса(ИмяОпции);
145+
146+
Если НЕ ОпцияРодителя = Неопределено Тогда
147+
Возврат ОпцияРодителя.Значение;
148+
КонецЕсли;
149+
150+
ОпцияВышестоящегоРодителя = РодительКоманды.ЗначениеОпцииКомандыРодителя(ИмяОпции);
151+
152+
Если НЕ ОпцияВышестоящегоРодителя = Неопределено Тогда
153+
Возврат ОпцияВышестоящегоРодителя.Значение;
154+
КонецЕсли;
155+
156+
КонецЦикла;
157+
158+
Возврат Неопределено;
159+
160+
КонецФункции
161+
162+
// Функция возвращает значение аргумента команды родителя по переданному имени аргумента
163+
// Возвращает первое из совпадений или неопределенно в случае отсутствия аргумента
164+
//
165+
// Параметры:
166+
// ИмяАргумента - строка - имя аргумента
167+
//
168+
// Возвращаемое значение:
169+
// Произвольный, Неопределенно - полученное значение в результате чтения строки использования или переменных окружения
170+
// или неопределенно в случае отсутствия в индексе указанного аргумента
171+
Функция ЗначениеАргументаКомандыРодителя(Знач ИмяАргумента) Экспорт
172+
173+
Лог.Отладка("Ищю аргумент <%1> для родителей", ИмяАргумента);
174+
175+
Для каждого РодительКоманды Из КомандыРодители Цикл
176+
177+
Лог.Отладка(" --> Проверяю родителя <%1>", РодительКоманды.ПолучитьИмяКоманды());
178+
179+
АргументРодителя = РодительКоманды.АргументИзИндекса(ИмяАргумента);
180+
181+
Если НЕ АргументРодителя = Неопределено Тогда
182+
Возврат АргументРодителя.Значение;
183+
КонецЕсли;
184+
185+
АргументВышестоящегоРодителя = РодительКоманды.ЗначениеАргументаКомандыРодителя(ИмяАргумента);
186+
187+
Если НЕ АргументВышестоящегоРодителя = Неопределено Тогда
188+
Возврат АргументВышестоящегоРодителя.Значение;
189+
КонецЕсли;
190+
191+
КонецЦикла;
192+
193+
Возврат Неопределено;
194+
195+
КонецФункции
196+
116197
// Функция возвращает все параметры команды, для доступа к ним по синонимам
117198
//
118199
// Возвращаемое значение:
@@ -160,7 +241,7 @@
160241
ПолныйПуть = Новый Массив;
161242

162243
Для каждого Родитель Из КомандыРодители Цикл
163-
ПолныйПуть.Добавить(Родитель);
244+
ПолныйПуть.Добавить(Родитель.ПолучитьИмяКоманды());
164245
КонецЦикла;
165246
ПолныйПуть.Добавить(СокрЛП(Имя));
166247

@@ -370,7 +451,7 @@
370451
КомандыРодителиДляПодчиненной.Добавить(КомандаРодитель);
371452
КонецЦикла;
372453

373-
КомандыРодителиДляПодчиненной.Добавить(Имя);
454+
КомандыРодителиДляПодчиненной.Добавить(ЭтотОбъект);
374455

375456
Для каждого Подчиненнаякоманда Из ВложенныеКоманды Цикл
376457
Подчиненнаякоманда.КомандыРодители = КомандыРодителиДляПодчиненной;
@@ -407,7 +488,8 @@
407488
КонецЦикла;
408489

409490
КонецЕсли;
410-
//Лог.Отладка("Читаю аргументы строки");
491+
492+
Лог.Отладка("Разбираю строку использования с помощью лексера");
411493

412494
Лексер = Новый Лексер(Спек).Прочитать();
413495
Если Лексер.ЕстьОшибка() Тогда
@@ -439,15 +521,14 @@
439521
// Описание - объект - описание опции для справки.
440522
//
441523
// Возвращаемое значение:
442-
// Команда - класс ПараметрКоманды
524+
// ПараметрКоманды - Созданный параметр команды
443525
//
444526
// Дополнительно смотри справку по классу ПараметрКоманды
445527
Функция Опция(Имя, Значение = "", Описание = "") Экспорт
446528

447529
НоваяОпция = Новый ПараметрКоманды("опция", Имя, Значение, Описание);
448530
Опции.Вставить(НоваяОпция, НоваяОпция);
449531

450-
451532
Возврат НоваяОпция;
452533

453534
КонецФункции
@@ -460,7 +541,7 @@
460541
// Описание - объект - описание аргумента для справки.
461542
//
462543
// Возвращаемое значение:
463-
// Команда - класс ПараметрКоманды
544+
// ПараметрКоманды - Созданный параметр команды
464545
//
465546
// Дополнительно смотри справку по классу ПараметрКоманды
466547
Функция Аргумент(Имя, Значение = "", Описание = "") Экспорт
@@ -478,8 +559,8 @@
478559
// ИмяОпции - строка - имя или синоним опции
479560
//
480561
// Возвращаемое значение:
481-
// Произвольный - Значение - полученное значение в результате чтения строки использования или переменных окружения
482-
//
562+
// ПараметраКоманды, Неопределенно - класс опции, находящийся в индексе Опций команды
563+
// Неопределенно, в случае отсутствия в индексе опций с запрошенным именем
483564
Функция ОпцияИзИндекса(Знач ИмяОпции) Экспорт
484565

485566
Если СтрНачинаетсяС(ИмяОпции, "-")
@@ -494,28 +575,22 @@
494575
КонецЕсли;
495576

496577
ОпцииИндекса = ОпцииИндекс[ИмяОпции];
497-
Если ОпцииИндекса = Неопределено Тогда
498-
ВызватьИсключение СтрШаблон("Ошибка получение значения опции <%1>. Опция не найдена в индексе опций команды", ИмяОпции);
499-
КонецЕсли;
500578

501579
Возврат ОпцииИндекса;
502580

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

505-
// Функция возвращает значение аргумента по переданному имени аргумента
583+
// Функция возвращает параметры команды для аргумента по переданному имени аргумента
506584
//
507585
// Параметры:
508586
// ИмяАргумента - строка - имя аргумента
509587
//
510588
// Возвращаемое значение:
511-
// Произвольный - Значение - полученное значение в результате чтения строки использования или переменных окружения
512-
//
589+
// ПараметраКоманды, Неопределенно - класс аргумента, находящийся в индексе Аргументов команды
590+
// Неопределенно, в случае отсутствия в индексе аргумента с запрошенным именем
513591
Функция АргументИзИндекса(Знач ИмяАргумента) Экспорт
514592

515593
АргументИндекса = АргументыИндекс[ВРег(ИмяАргумента)];
516-
Если АргументИндекса = Неопределено Тогда
517-
ВызватьИсключение СтрШаблон("Ошибка получение значения аргумента <%1>. Аргумент не найден в индексе аргументов команды", ИмяАргумента);
518-
КонецЕсли;
519594

520595
Возврат АргументИндекса;
521596

tests/КомандаПриложения_test.os

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@
4848
// ИменаТестов.Добавить("ТестДолжен_ПроверитьВыполнениеОбработчикаПередВыполнениемКоманды");
4949
// ИменаТестов.Добавить("ТестДолжен_ПроверитьВыполнениеОбработчикаПослеВыполненияКоманды");
5050

51+
ИменаТестов.Добавить("ТестДолжен_ПроверитьЧтениеОпцийИАргументовРодителяКоманды");
52+
ИменаТестов.Добавить("ТестДолжен_ПроверитьЧтениеОпцийИАргументовРодителяКомандыПервогоУровня");
53+
5154

5255
Возврат ИменаТестов;
5356

@@ -82,6 +85,65 @@
8285

8386

8487

88+
КонецПроцедуры
89+
90+
91+
Процедура ТестДолжен_ПроверитьЧтениеОпцийИАргументовРодителяКоманды() Экспорт
92+
93+
Команда = ПодготовитьТестовуюКоманду();
94+
95+
ОпцияМассив =Команда.Опция("e env", Новый Массив, "Тестовый массив опций").ТМассивСтрок();
96+
АргументСтрока = Команда.Аргумент("ARG", "", "Тестовый простой необязательный аргумент").Обязательный(Ложь);
97+
98+
ВложеннаяКоманда = Команда.ДобавитьПодкоманду("sub s", "", ЭтотОбъект);
99+
100+
Аргументы = Новый Массив;
101+
102+
Аргументы.Добавить("-e=Знач1");
103+
Аргументы.Добавить("-e=Знач2");
104+
Аргументы.Добавить("-e=Знач3");
105+
Аргументы.Добавить("ЗначениеАргумента");
106+
107+
Аргументы.Добавить("sub");
108+
109+
РезультатВыполнения = ВыполнитьКомандуПриложения(Команда, Аргументы);
110+
111+
Утверждения.ПроверитьИстину(РезультатВыполнения, "Команда должна выполниться");
112+
113+
Утверждения.ПроверитьРавенство(ВложеннаяКоманда.ЗначениеОпцииКомандыРодителя("e").Количество(), 3 , "Результат <ОпцияМассив> должны совпадать");
114+
Утверждения.ПроверитьРавенство(ВложеннаяКоманда.ЗначениеАргументаКомандыРодителя("ARG"), "ЗначениеАргумента" , "Результат <АргументСтрока> должны совпадать");
115+
116+
КонецПроцедуры
117+
118+
Процедура ТестДолжен_ПроверитьЧтениеОпцийИАргументовРодителяКомандыПервогоУровня() Экспорт
119+
120+
Команда = ПодготовитьТестовуюКоманду();
121+
122+
ОпцияМассив =Команда.Опция("e env", Новый Массив, "Тестовый массив опций").ТМассивСтрок();
123+
АргументСтрока = Команда.Аргумент("ARG", "", "Тестовый простой необязательный аргумент").Обязательный(Ложь);
124+
125+
ВложеннаяКоманда = Команда.ДобавитьПодкоманду("sub s", "", ЭтотОбъект);
126+
ВложеннаяКоманда2 = ВложеннаяКоманда.ДобавитьПодкоманду("subsub ss", "", ЭтотОбъект);
127+
128+
Аргументы = Новый Массив;
129+
130+
Аргументы.Добавить("-e=Знач1");
131+
Аргументы.Добавить("-e=Знач2");
132+
Аргументы.Добавить("-e=Знач3");
133+
Аргументы.Добавить("ЗначениеАргумента");
134+
135+
Аргументы.Добавить("sub");
136+
137+
Аргументы.Добавить("subsub");
138+
139+
РезультатВыполнения = ВыполнитьКомандуПриложения(Команда, Аргументы);
140+
141+
Утверждения.ПроверитьИстину(РезультатВыполнения, "Команда должна выполниться");
142+
143+
Утверждения.ПроверитьРавенство(ВложеннаяКоманда2.ЗначениеОпцииКомандыРодителя("e").Количество(), 3 , "Результат <ОпцияМассив> должны совпадать");
144+
Утверждения.ПроверитьРавенство(ВложеннаяКоманда2.ЗначениеАргументаКомандыРодителя("ARG"), "ЗначениеАргумента" , "Результат <АргументСтрока> должны совпадать");
145+
146+
85147
КонецПроцедуры
86148

87149
Процедура ТестДолжен_ПроверитьУстановкуЗначенийОпций() Экспорт
@@ -389,4 +451,4 @@
389451

390452

391453
Лог = Логирование.ПолучитьЛог("oscript.lib.cli_command");
392-
//Лог.УстановитьУровень(УровниЛога.Отладка);
454+
Лог.УстановитьУровень(УровниЛога.Отладка);

0 commit comments

Comments
 (0)