diff --git a/packagedef b/packagedef index af241dd..943d160 100644 --- a/packagedef +++ b/packagedef @@ -4,7 +4,7 @@ // Описание.Имя("cli") - .Версия("0.9.5") + .Версия("0.9.6") .Автор("Khorev Aleksey") .АдресАвтора("khorevaa@gmail.com") .Описание("Данный пакет облегчает создание консольных приложений на Oscript") diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/cmd/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/cmd/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" index 6dc1ac5..897d94a 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/cmd/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/cmd/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" @@ -96,7 +96,23 @@ // Произвольный - Значение - полученное значение в результате чтения строки использования или переменных окружения Функция ЗначениеОпции(Знач ИмяОпции) Экспорт - Возврат ОпцииИндекс[ИмяОпции].Значение; + Если СтрНачинаетсяС(ИмяОпции, "-") + Или СтрНачинаетсяС(ИмяОпции, "--") Тогда + // Ничего не делаем переданы уже нормализированные опции + Иначе + Префикс = "-"; + Если СтрДлина(ИмяОпции) > 1 Тогда + Префикс = "--"; + КонецЕсли; + ИмяОпции = СтрШаблон("%1%2",Префикс,ИмяОпции); + КонецЕсли; + + ОпцииИндекса = ОпцииИндекс[ИмяОпции]; + Если ОпцииИндекса = Неопределено Тогда + ВызватьИсключение СтрШаблон("Ошибка получение значения опции <%1>. Опция не найдена в индексе опций команды", ИмяОпции); + КонецЕсли; + + Возврат ОпцииИндекса.Значение; КонецФункции @@ -109,7 +125,12 @@ // Произвольный - Значение - полученное значение в результате чтения строки использования или переменных окружения Функция ЗначениеАргумента(Знач ИмяАргумента) Экспорт - Возврат АргументыИндекс[ИмяАргумента].Значение; + АргументИндекса = АргументыИндекс[ВРег(ИмяАргумента)]; + Если АргументИндекса = Неопределено Тогда + ВызватьИсключение СтрШаблон("Ошибка получение значения аргумента <%1>. Аргумент не найден в индексе аргументов команды", ИмяАргумента); + КонецЕсли; + + Возврат АргументИндекса.Значение; КонецФункции @@ -196,7 +217,17 @@ ТаблицаОпций = ТаблицаАргументовДляСправки(); Для каждого СтрокаТаблицы Из ТаблицаОпций Цикл - КонсольВывода.ВывестиСтроку(СтрШаблон(" %3%1%4%2", Символы.Таб, Символы.ВК,СтрокаТаблицы.Наименование, СтрокаТаблицы.Описание)); + КонсольВывода.ВывестиСтроку(СтрШаблон(" %3%1%4%2", Символы.Таб, Символы.ВК, СтрокаТаблицы.Наименование, СтрокаТаблицы.Описание)); + + Если Не ПустаяСтрока(СтрокаТаблицы.ДополнительноеОписание) Тогда + ДлинаДополнения = СтрДлина(СтрШаблон(" %2%1%", Символы.Таб, СтрокаТаблицы.Наименование))+3; + МассивСтрок = СтрРазделить(СтрокаТаблицы.ДополнительноеОписание, Символы.ПС, Ложь); + + Для каждого СтрокаОписания Из МассивСтрок Цикл + КонсольВывода.ВывестиСтроку(СтрШаблон("%1%2", ДополнитьСтрокуПробеламиДо(СтрокаОписания, ДлинаДополнения), Символы.ВК)); + КонецЦикла; + + КонецЕсли; КонецЦикла; @@ -211,7 +242,17 @@ ТаблицаОпций = ТаблицаОпцийДляСправки(); Для каждого СтрокаТаблицы Из ТаблицаОпций Цикл - КонсольВывода.ВывестиСтроку(СтрШаблон(" %3%1%4%2", Символы.Таб, Символы.ВК,СтрокаТаблицы.Наименование, СтрокаТаблицы.Описание)); + КонсольВывода.ВывестиСтроку(СтрШаблон(" %3%1%4%2", Символы.Таб, Символы.ВК, СтрокаТаблицы.Наименование, СтрокаТаблицы.Описание)); + + Если Не ПустаяСтрока(СтрокаТаблицы.ДополнительноеОписание) Тогда + ДлинаДополнения = СтрДлина(СтрШаблон(" %2%1%", Символы.Таб, СтрокаТаблицы.Наименование))+3; + + МассивСтрок = СтрРазделить(СтрокаТаблицы.ДополнительноеОписание, Символы.ПС, Ложь); + Для каждого СтрокаОписания Из МассивСтрок Цикл + КонсольВывода.ВывестиСтроку(СтрШаблон("%1%2", ДополнитьСтрокуПробеламиДо(СтрокаОписания, ДлинаДополнения), Символы.ВК)); + КонецЦикла; + + КонецЕсли; КонецЦикла; КонсольВывода.ВывестиСтроку(""); @@ -707,6 +748,7 @@ Таблица.Колонки.Добавить("Наименование"); Таблица.Колонки.Добавить("Описание"); Таблица.Колонки.Добавить("ДлинаНаименования"); + Таблица.Колонки.Добавить("ДополнительноеОписание"); Для каждого КлючЗначение Из Аргументы Цикл @@ -721,6 +763,7 @@ НоваяЗапись.Наименование = ИмяОпции; НоваяЗапись.Описание = ОписаниеОпции; + НоваяЗапись.ДополнительноеОписание = АргументСправки.ПолучитьПодробноеОписание(); НоваяЗапись.ДлинаНаименования = СтрДлина(ИмяОпции)+1; КонецЦикла; @@ -753,6 +796,7 @@ Таблица = новый ТаблицаЗначений; Таблица.Колонки.Добавить("Наименование"); Таблица.Колонки.Добавить("Описание"); + Таблица.Колонки.Добавить("ДополнительноеОписание"); Таблица.Колонки.Добавить("ДлинаНаименования"); Если Опции.Количество() = 0 Тогда @@ -769,9 +813,10 @@ ПеременныеОкружения = ФорматироватьПеременнуюОкруженияОпцииДляСправки(ОпцияСправки); ЗначениеОпции = ФорматироватьЗначениеОпцииДляСправки(ОпцияСправки); ОписаниеОпции = ОпцияСправки.Описание + " " + ПеременныеОкружения + " " + ЗначениеОпции; - + НоваяЗапись.Наименование = ИмяОпции; НоваяЗапись.Описание = ОписаниеОпции; + НоваяЗапись.ДополнительноеОписание = ОпцияСправки.ПолучитьПодробноеОписание(); НоваяЗапись.ДлинаНаименования = СтрДлина(ИмяОпции)+1; КонецЦикла; @@ -809,6 +854,18 @@ КонецФункции +Функция ДополнитьСтрокуПробеламиДо(Знач НачальнаяСтрока, Знач КоличествоПробелов) + + СтрокаПробелов = ""; + + Для Счетчик = 1 По КоличествоПробелов Цикл + СтрокаПробелов = СтрокаПробелов + " "; + КонецЦикла; + + Возврат СтрокаПробелов + НачальнаяСтрока; + +КонецФункции + Функция ФорматироватьИмяОпцииДляСправки(Знач КлассОпции) КороткоеНаименование = ""; diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/cmd/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/cmd/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" index d8b2b6f..79339e6 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/cmd/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/cmd/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" @@ -8,7 +8,7 @@ // Подробное описание параметра команды // Используется при выводе справки (запланировано) -Перем ПодробноеОписание Экспорт; // Строка +Перем ПодробноеОписаниеПараметра Экспорт; // Строка // Содержит имя переменной окружения, откуда получать значение // допустимо использование нескольких переменных окружения через пробел @@ -87,6 +87,7 @@ ТипПараметра = ВходящийТипПараметра; РазделительМассива = Неопределено; + ПодробноеОписаниеПараметра = ""; ПодготовитьНаименованияПараметров(); КонецПроцедуры @@ -123,6 +124,23 @@ КонецФункции +// Возвращает подробное описание для справки +// +// Возвращаемое значение: +// строка +Функция ПолучитьПодробноеОписание() Экспорт + + ВстроенныеТипы = ВстроенныеТипЗначенийПараметров(); + ОпределенныйТип = ВстроенныеТипы[Строка(ТипЗнч(ТипЗначенияПараметра))]; + Если ОпределенныйТип = Неопределено + Или Тип("ТипПеречисление") = ОпределенныйТип Тогда + ПодробноеОписаниеПараметра = ТипЗначенияПараметра.ПодробноеОписание(); + КонецЕсли; + + Возврат ПодробноеОписаниеПараметра; + +КонецФункции + // Возвращает истина, если данный параметр обязателен для указания // // Возвращаемое значение: @@ -475,21 +493,87 @@ КонецФункции +// Функция устанавливает тип параметра "Перечисление" +// возвращает текущий параметр команды +// +// Параметры: +// ДоступныеПеречисления - Соответсвие +// Ключ - Строка +// Значение - Структура ("Наименование, Значение, ДополнительнаяСправка") +// Возвращаемое значение: +// ЭтотОбъект - класс ПараметрКоманды +// Вызов необязателен, автоматически определяется при создании параметра, +// если передано значение по умолчанию +Функция ТПеречисление(Знач ДоступныеПеречисления = Неопределено) Экспорт + + ТипОпции = ТипЗнч(Неопределено); + ТипЭлементаОпции = ТипОпции; + ТипЗначенияПараметра = Новый ТипПеречисление(); + + Если Не ДоступныеПеречисления = Неопределено Тогда + ТипЗначенияПараметра.УстановитьПеречисления(ДоступныеПеречисления); + КонецЕсли; + + Возврат ЭтотОбъект; + +КонецФункции + +// Функция устанавливает произвольный тип параметра +// возвращает текущий параметр команды +// +// Параметры: +// НаименованиеПеречисления - строка - пользовательное значение перечисления +// ЗначениеПеречисления - произвольный - системное значение перечисления +// ДополнительнаяСправкаПеречисления - строка - дополнительная строка для справки +// +Функция Перечисление(Знач НаименованиеПеречисления, Знач ЗначениеПеречисления = Неопределено, Знач ДополнительнаяСправкаПеречисления = "") Экспорт + + Если Не ТипЗнч(ТипЗначенияПараметра) = Тип("ТипПеречисление") Тогда + ВызватьИсключение "Указание перечисления допустимо только для типа параметра перечисление"; + КонецЕсли; + + Если ЗначениеПеречисления = Неопределено Тогда + ЗначениеПеречисления = НаименованиеПеречисления; + КонецЕсли; + + ТипЗначенияПараметра.ДобавитьПеречисление(НаименованиеПеречисления, ЗначениеПеречисления, ДополнительнаяСправкаПеречисления); + + Возврат ЭтотОбъект; + +КонецФункции + +// Функция устанавливает признак обязательности указания данного параметра +// возвращает текущий параметр команды +// +// Параметры: +// Признак - булево - признак обязательности указания данного параметра (по умолчанию Истина) +// +// Возвращаемое значение: +// ЭтотОбъект - класс ПараметрКоманды +Функция ПодробноеОписание(Знач ВходящееПодробноеОписание) Экспорт + + ПодробноеОписаниеПараметра = ВходящееПодробноеОписание; + + Возврат ЭтотОбъект; + +КонецФункции + #КонецОбласти Функция ВстроенныеТипЗначенийПараметров() ВстроенныеТипы = Новый Соответствие; - ВстроенныеТипы.Вставить("Булево", Новый ТипБулево); - ВстроенныеТипы.Вставить("Число", Новый ТипЧисло); - ВстроенныеТипы.Вставить("Дата", Новый ТипДатаВремя); + ВстроенныеТипы.Вставить("ТипБулево", Тип("ТипБулево")); + ВстроенныеТипы.Вставить("ТипЧисло", Тип("ТипЧисло")); + ВстроенныеТипы.Вставить("ТипДатаВремя", Тип("ТипДатаВремя")); //ВстроенныеТипы.Вставить("Длительность", Новый ТипДлительность); - ВстроенныеТипы.Вставить("Строка", Новый ТипСтрока); + ВстроенныеТипы.Вставить("ТипСтрока", Тип("ТипСтрока")); //ВстроенныеТипы.Вставить("МассивДлительностей", Новый ТипМассивДлительностей); - ВстроенныеТипы.Вставить("МассивЧисел", Новый ТипМассивЧисел); - ВстроенныеТипы.Вставить("МассивСтрок", Новый ТипМассивСтрок); - ВстроенныеТипы.Вставить("МассивДат", Новый ТипМассивДат); + ВстроенныеТипы.Вставить("ТипМассивЧисел", Тип("ТипМассивЧисел")); + ВстроенныеТипы.Вставить("ТипМассивСтрок", Тип("ТипМассивСтрок")); + ВстроенныеТипы.Вставить("ТипМассивДат", Тип("ТипМассивДат")); + ВстроенныеТипы.Вставить("ТипПеречисление", Тип("ТипПеречисление")); Возврат ВстроенныеТипы; diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/types/\320\242\320\270\320\277\320\237\320\265\321\200\320\265\321\207\320\270\321\201\320\273\320\265\320\275\320\270\320\265.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/types/\320\242\320\270\320\277\320\237\320\265\321\200\320\265\321\207\320\270\321\201\320\273\320\265\320\275\320\270\320\265.os" new file mode 100644 index 0000000..b90c32f --- /dev/null +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/types/\320\242\320\270\320\277\320\237\320\265\321\200\320\265\321\207\320\270\321\201\320\273\320\265\320\275\320\270\320\265.os" @@ -0,0 +1,76 @@ + +Перем ПеречисленияКласса Экспорт; // Соответствие + +Перем ОписаниеОшибкиКласса; + +Функция ВСтроку(Значение) Экспорт + + Если ТипЗнч(Значение) = Тип("Сценарий") Тогда + Возврат Значение.ВСтроку(); + КонецЕсли; + + Возврат Строка(Значение); + +КонецФункции + +Функция ПодробноеОписание() Экспорт + + СтрокаОписания = ""; + + Для каждого КлючЗначение Из ПеречисленияКласса Цикл + + СтрокаОписания = СтрокаОписания + СтрШаблон("%1: %2", КлючЗначение.Значение.Наименование, КлючЗначение.Значение.ДополнительнаяСправка) + Символы.ПС; + + КонецЦикла; + + Возврат СтрокаОписания; + +КонецФункции + +Функция УстановитьЗначение(Знач ВходящееЗначение, Значение) Экспорт + + ЗначениеПеречисления = ПеречисленияКласса[ВходящееЗначение]; + + Если НЕ ЗначениеПеречисления = Неопределено Тогда + Значение = ЗначениеПеречисления.Значение; + Иначе + ОписаниеОшибкиКласса = "Выбранное значение перечисления не соответствует доступным"; + КонецЕсли; + + Возврат Значение; + +КонецФункции + +Функция Ошибка(ЕстьОшибка = Ложь) Экспорт + + Если НЕ ПустаяСтрока(ОписаниеОшибкиКласса) Тогда + ЕстьОшибка = Истина; + КонецЕсли; + + Возврат ОписаниеОшибкиКласса; + +КонецФункции + +Процедура УстановитьПеречисления(Знач СоответствиеПеречислений) Экспорт + + Если Тип("Соответствие") = ТипЗнч(СоответствиеПеречислений) Тогда + ПеречисленияКласса = СоответствиеПеречислений; + КонецЕсли; + +КонецПроцедуры + +Процедура ДобавитьПеречисление(Знач ПользовательскоеЗначение, Знач Значение, Знач ДополнительнаяСправка = "") Экспорт + + ПеречисленияКласса.Вставить(ПользовательскоеЗначение, НовоеПеречисление(ПользовательскоеЗначение, Значение, ДополнительнаяСправка)); + +КонецПроцедуры + +Функция НовоеПеречисление(Знач Наименование, Знач Значение, Знач ДополнительнаяСправка = "") + + Возврат Новый Структура("Наименование, Значение, ДополнительнаяСправка", Наименование, Значение, ДополнительнаяСправка); + +КонецФункции + +ПеречисленияКласса = Новый Соответствие; + +ОписаниеОшибкиКласса = ""; \ No newline at end of file diff --git "a/tests/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\275\320\276\320\265\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265_test.os" "b/tests/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\275\320\276\320\265\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265_test.os" index 7428860..73b975a 100644 --- "a/tests/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\275\320\276\320\265\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265_test.os" +++ "b/tests/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\275\320\276\320\265\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265_test.os" @@ -12,6 +12,8 @@ ИменаТестов.Добавить("ТестДолжен_ТолькоАргументы"); //ИменаТестов.Добавить("ТестДолжен_ТолькоОпции"); //ИменаТестов.Добавить("ТестДолжен_ПроверитьПриложения"); + ИменаТестов.Добавить("ТестДолжен_ПараметрыПеречисленияОпции"); + ИменаТестов.Добавить("ТестДолжен_ПараметрыПеречисленияОпцииВыводHelp"); Возврат ИменаТестов; @@ -44,6 +46,55 @@ КонецПроцедуры + +Процедура ТестДолжен_ПараметрыПеречисленияОпции() Экспорт + + Приложение = Новый КонсольноеПриложение("cp", ""); + + enum = Приложение.Опция("enum e", "yellow", "Опция перечисление").ТПеречисление() + .Перечисление("yellow", "yellow", "Это желтый цвет") + .Перечисление("red", "red" , "Это красный цвет") + .Перечисление("blue", "blue", "Это синий цвет") + ; + + Приложение.УстановитьОсновноеДействие(ЭтотОбъект); + + ВходящиеАргументы = Новый Массив; + ВходящиеАргументы.Добавить("-e"); + ВходящиеАргументы.Добавить("yellow"); + + Приложение.Запустить(ВходящиеАргументы); + + Утверждения.ПроверитьРавенство(enum.Значение, "yellow", "Аргумент enum не равен ожидаемому"); + +КонецПроцедуры + +Процедура ТестДолжен_ПараметрыПеречисленияОпцииВыводHelp() Экспорт + + Приложение = Новый КонсольноеПриложение("cp", ""); + + enum = Приложение.Опция("enum e", "yellow", "Опция перечисление").ТПеречисление() + .Перечисление("yellow", "yellow", "Это желтый цвет") + .Перечисление("red", "rediiii" , "Это красный цвет") + .Перечисление("blue", "blue", "Это синий цвет") + ; + + Приложение.УстановитьОсновноеДействие(ЭтотОбъект); + + ВходящиеАргументы = Новый Массив; + // ВходящиеАргументы.Добавить("--help"); + + ВходящиеАргументы.Добавить("--enum"); + ВходящиеАргументы.Добавить("red"); + + Приложение.Запустить(ВходящиеАргументы); + + Утверждения.ПроверитьРавенство(enum.Значение, "rediiii", "Аргумент enum не равен ожидаемому"); + +КонецПроцедуры + + + Процедура ВыполнитьКоманду(Знач Команда) Экспорт КонецПроцедуры