├── .github └── workflows │ ├── deploy-docs.yml │ ├── qa.yaml │ ├── release.yml │ └── test.yml ├── .gitignore ├── README.md ├── autumn-properties.json ├── docs └── product │ └── index.md ├── example ├── main.os └── Классы │ ├── ДемоОписаниеПриложения.os │ ├── КомандаДата.os │ ├── КомандаПлюс.os │ ├── КомандаПривет.os │ ├── ПодкомандаДень.os │ └── ПодкомандаМесяц.os ├── packagedef ├── src ├── Заготовки │ └── ИнициализацияИнтефейсаКоманднойСтроки.os └── Классы │ ├── ИКС_АннотацияКоманда.os │ ├── ИКС_АннотацияПеречисление.os │ ├── ИКС_АннотацияПодкомнада.os │ ├── ИКС_АннотацияТПеречисление.os │ ├── ИКС_ДекораторКоманд.os │ ├── ИКС_Дуб.os │ ├── ИКС_КомандаПриложенияПоУмолчанию.os │ ├── ИКС_ОписаниеПриложения.os │ └── ИКС_Рогатка.os ├── tasks ├── coverage.os ├── oscript.cfg └── test.os └── tests ├── alltests.os ├── entrypoint.os ├── Классы ├── ДубЛегасиКоманды.os ├── КомандаСАргументами.os ├── КомандаСАргументом.os ├── КомандаСАргументомИФлагом.os ├── КомандаСДатами.os ├── КомандаСИдентификатором.os ├── КомандаСМассивами.os ├── КомандаСМногострочнымиОписаниями.os ├── КомандаСОпцией.os ├── КомандаСОпциейИДекоратором.os ├── КомандаСПеременнойОкружения.os ├── КомандаСПеречислением.os ├── КомандаСПодкомандами.os ├── КомандаСФлагами.os ├── КомандаСЧислами.os ├── КомандаСоСтрокой.os ├── МояЛегасиКоманда.os ├── ПодкомандаВторая.os └── ПодкомандаПервая.os └── Моки └── Классы └── МокРогатки.os /.github/workflows/deploy-docs.yml: -------------------------------------------------------------------------------- 1 | name: Публикация документации 2 | 3 | on: 4 | push: 5 | paths: 6 | - 'docs/**' 7 | branches: 8 | - 'master' 9 | workflow_dispatch: 10 | 11 | jobs: 12 | deploy-docs: 13 | uses: autumn-library/workflows/.github/workflows/deploy-docs.yml@main 14 | with: 15 | github_repository: autumn-library/winow 16 | secrets: inherit 17 | -------------------------------------------------------------------------------- /.github/workflows/qa.yaml: -------------------------------------------------------------------------------- 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@main 11 | with: 12 | github_repository: autumn-library/autumn-cli 13 | coveralls: true 14 | sonarqube: false 15 | 16 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Публикация релиза 2 | 3 | on: 4 | release: 5 | types: 6 | - published 7 | workflow_dispatch: 8 | 9 | jobs: 10 | release: 11 | uses: autumn-library/workflows/.github/workflows/release.yml@main 12 | with: 13 | package_mask: "autumn-cli-*.ospx" 14 | secrets: 15 | PUSH_TOKEN: ${{ secrets.PUSH_TOKEN }} 16 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Тестирование 2 | 3 | on: 4 | push: 5 | pull_request: 6 | workflow_dispatch: 7 | 8 | jobs: 9 | test: 10 | strategy: 11 | fail-fast: false 12 | matrix: 13 | oscript_version: ['dev', 'lts-dev', 'default'] 14 | uses: autumn-library/workflows/.github/workflows/test.yml@main 15 | with: 16 | oscript_version: ${{ matrix.oscript_version }} 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | .DS_Store 3 | *.ospx 4 | out/ 5 | oscript_modules/ 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # autumn-cli 2 | 3 | Обертка над библиотекой [cli](https://github.com/khorevaa/cli), которая предоставляет возможности создания консольных приложений на фреймворке [ОСень](https://github.com/autumn-library/autumn). 4 | 5 | Подробная документация по библиотеке доступна на сайте: https://autumn-library.github.io/autumn-cli 6 | 7 | Исходный код документации располагается в каталоге /docs 8 | 9 | Приятного пользования! 🍂 10 | -------------------------------------------------------------------------------- /autumn-properties.json: -------------------------------------------------------------------------------- 1 | { 2 | "cli": { 3 | "ИмяПриложения": "cli_test", 4 | "ПолноеИмяПриложения": "cli_test v%{cli.ВерсияПриложения}", 5 | "ВерсияПриложения": "1.0.1" 6 | } 7 | } -------------------------------------------------------------------------------- /docs/product/index.md: -------------------------------------------------------------------------------- 1 | # autumn-cli 2 | 3 | Обертка над [cli](https://github.com/khorevaa/cli) библиотекой, которая предоставляет возможности создания консольных приложений на фреймворке [ОСень](https://autumn-library.github.io). 4 | 5 | ## Подключение и пример использования 6 | 7 | Точка входа в приложение 8 | 9 | ```main.os``` 10 | ```bsl 11 | #Использовать autumn 12 | #Использовать autumn-cli 13 | #Использовать "Каталог/С/Классами/Команд" 14 | 15 | Поделка = Новый Поделка(); 16 | Поделка.ЗапуститьПриложение(); 17 | ``` 18 | 19 | Допустим, мы хотим сделать приложение, которое имеет следующие команды: 20 | 21 | ```plus``` - Принимает один числовой аргумент и прибавляет к нему 10. Выводит результат в консоль. 22 | 23 | ```hello``` - Имеет опцию ```name``` и выводит в консоль приветствующее сообщение. 24 | 25 | ```date``` - Имеет две подкоманды, ```day``` выводит в консоль начало дня, и ```month``` выводит в консоль начало месяца. 26 | 27 | ## Аргументы 28 | 29 | Подготовим первую команду: 30 | 31 | ```Каталог/С/Классами/Команд/КомандаПлюс.os``` 32 | ```bsl 33 | &Аргумент(Имя = "ARG", Описание = "Значение числа") // Определим аргумент и дадим ему описание 34 | &ТЧисло // Укажем тип аргумента 35 | Перем ПереданноеЧисло; 36 | 37 | &КомандаПриложения(Имя = "p plus", Описание = "Прибавляет 10 к заданному числу") // Аннотация, обозначающая, что этот класс - консольная команда 38 | Процедура ПриСозданииОбъекта() 39 | 40 | КонецПроцедуры 41 | 42 | &ВыполнениеКоманды // Метод, помеченный этой аннотацией, будет выполнен при вызове команды. 43 | Процедура ВывестиРезультатСложения() Экспорт 44 | 45 | Результат = ПереданноеЧисло + 10; 46 | 47 | Сообщить("Результат сложения: " + Результат); 48 | 49 | КонецПроцедуры 50 | ``` 51 | 52 | В этом примере мы определили класс как команду консольного приложения с помощью аннотации 53 | 54 | ```&КомандаПриложения(Имя = "p plus", Описание = "Прибавляет 10 к заданному числу")``` 55 | 56 | В которой указали имя команды и ее описание. А для определения аргумента команды была создана переменная с аннотацией 57 | 58 | ```&Аргумент(Имя = "ARG", Описание = "Значение числа")``` 59 | 60 | Чтобы дать понять библиотеке, какой метод нужно выполнить при вызове команды, нужно сделать экспортный метод с аннотацией 61 | 62 | ```&ВыполнениеКоманды``` 63 | 64 | ## Опции 65 | 66 | Команда с опцией 67 | 68 | ```Каталог/С/Классами/Команд/КомандаПривет.os``` 69 | ```bsl 70 | &Опция(Имя = "n name", Описание = "Имя пользователя") 71 | Перем ИмяПользователя; 72 | 73 | &КомандаПриложения(Имя = "H hello", Описание = "Поздоровается с пользователем") 74 | Процедура ПриСозданииОбъекта() 75 | 76 | КонецПроцедуры 77 | 78 | &ВыполнениеКоманды 79 | Процедура ПоприветствоватьПользователя() Экспорт 80 | 81 | ТекстСообщения = "Привет " + ИмяПользователя + "!"; 82 | 83 | Сообщить(ТекстСообщения); 84 | 85 | КонецПроцедуры 86 | ``` 87 | 88 | В этом примере, для определения опции команды была создана переменная с аннотацией 89 | 90 | ```&Опция(Имя = "n name", Описание = "Имя пользователя")``` 91 | 92 | ## Подкоманды 93 | 94 | Теперь определим последнюю команду, которая имеет две подкоманды 95 | 96 | ```Каталог/С/Классами/Команд/КомандаДата.os``` 97 | ```bsl 98 | &КомандаПриложения(Имя = "d date", 99 | Описание = "Выводит дату", 100 | Подкоманда = "ПодкомандаДень", 101 | Подкоманда = "ПодкомандаМесяц" 102 | ) 103 | Процедура ПриСозданииОбъекта() 104 | 105 | КонецПроцедуры 106 | ``` 107 | 108 | И с помощью аннотации ```&ПодкомандаПриложения``` определим эти две подкоманды 109 | 110 | ```Каталог/С/Классами/Команд/ПодкомандаДень.os``` 111 | ```bsl 112 | &ПодкомандаПриложения(Имя = "day", Описание = "Выводит дату - начало дня") 113 | Процедура ПриСозданииОбъекта() 114 | 115 | КонецПроцедуры 116 | 117 | &ВыполнениеКоманды 118 | Процедура СообщитьДень() Экспорт 119 | 120 | Сообщить(НачалоДня(ТекущаяДата())); 121 | 122 | КонецПроцедуры 123 | ``` 124 | 125 | ```Каталог/С/Классами/Команд/ПодкомандаМесяц.os``` 126 | ```bsl 127 | &ПодкомандаПриложения(Имя = "month", Описание = "Выводит дату - начало месяца") 128 | Процедура ПриСозданииОбъекта() 129 | 130 | КонецПроцедуры 131 | 132 | &ВыполнениеКоманды 133 | Процедура СообщитьМесяц() Экспорт 134 | 135 | Сообщить(НачалоМесяца(ТекущаяДата())); 136 | 137 | КонецПроцедуры 138 | ``` 139 | 140 | ## Описание параметров аннотаций 141 | 142 | ```&КомандаПриложения``` и ```&ПодкомандаПриложения``` имеют одинаковый набор параметров: 143 | 144 | - ```Идентификатор``` - Идентификатор или имя, под которым будет зарегистрирован желудь в контексте приложения. По умолчания имя класса. 145 | 146 | - ```Имя``` - Имя команды, которое будет в интерфейсе cli. 147 | 148 | - ```Описание``` - Текстовое описание, которое будет отображено в cli 149 | 150 | - ```Подкоманда``` - Имя желудя подкоманды (Идентификатор или имя класса). параметр повторяемый, т.е. может быть несколько подкоманд. 151 | 152 | - ```ДобавлятьАннотациюЖелудь``` - Управляет добавлением корневой аннотации "Желудь". По умолчанию - истина. Трогать стоит только в случае, если вы знаете, что делаете, при работе с мета-аннотациями над командами приложения. 153 | 154 | ## Типы аргументов и опций 155 | 156 | Имеется набор аннотаций, которые можно добавить к полям команд, и которые обозначат, к какому типу нужно приводить эти поля 157 | 158 | ```bsl 159 | &ТБулево 160 | &ТДата 161 | &ТЧисло 162 | &ТСтрока 163 | &ТМассивДат 164 | &ТМассивЧисел 165 | &ТМассивСтрок 166 | &ТПеречисление 167 | ``` 168 | 169 | ## Дополнительные аннотации аргументов и опций 170 | 171 | 172 | ```&ВОкружении("ИМЯ_ПЕРЕМЕННОЙ_ОКРУЖЕНИЯ")``` - Получать значение из переменной окружения. 173 | 174 | ```&Флаговый``` - Определяет тип значения - булево, аналогично ```&ТБулево``` 175 | 176 | ```&Флаг``` - Определяет тип значения - булево, аналогично ```&ТБулево``` 177 | 178 | ```&СкрытьВСправке``` - Отключает отображение в справке. 179 | 180 | ```&ПоУмолчанию("Некое_дефолтное_значение")``` - Значение по умолчанию, которое будет присвоено. 181 | 182 | ```&Псевдоним``` - Дополнительное имя параметра. 183 | 184 | ```&Описание``` - Описание параметра. 185 | 186 | ```&Обязательный``` - Вызывает ошибку, если параметр не передан. 187 | 188 | ```&ПодробноеОписание``` - Подробное описание. 189 | 190 | ```&Перечисление``` - Элемент перечисления с параметрами: 191 | - ```Имя```- Имя элемента 192 | - ```Значение```- Значение элемента 193 | - ```Описание```- Описание для справки 194 | 195 | ## Настройка версии и имени приложения. 196 | 197 | Настройку вывода версии и имени приложения можно осуществить двумя способами. 198 | 199 | 1) Создать рядом с точкой входа или в каталоге проекта файл 200 | 201 | ```autumn-properties.json``` 202 | ```json 203 | { 204 | "cli": { 205 | "ИмяПриложения": "cli_test", 206 | "ПолноеИмяПриложения": "cli_test v%{cli.ВерсияПриложения}", 207 | "ВерсияПриложения": "1.0.1" 208 | } 209 | } 210 | ``` 211 | - более подробная информация о файле настройки в [документации ОСени](https://github.com/autumn-library/autumn#внедрение-настроек-приложения) 212 | 213 | 2) В каталог с командами, которые будут загружены в контекст осени, добавить желудь с определенным интерфейсом 214 | 215 | ```Каталог/С/Классами/Команд/ДемоОписаниеПриложения.os``` 216 | ```bsl 217 | &Желудь("ОписаниеКонсольногоПриложения") 218 | &Верховный 219 | Процедура ПриСозданииОбъекта() 220 | КонецПроцедуры 221 | 222 | Функция ИмяПриложения() Экспорт 223 | Возврат "demo-cli"; 224 | КонецФункции 225 | 226 | Функция ПолноеИмяПриложения() Экспорт 227 | Возврат "Демонстрационное консольное приложение"; 228 | КонецФункции 229 | 230 | Функция ВерсияПриложения() Экспорт 231 | Возврат "1.0"; 232 | КонецФункции 233 | ``` 234 | 235 | ## Миграция с [cli](https://github.com/khorevaa/cli) 236 | 237 | Инфраструктурный, условный ```main.os``` от вашего приложения не нужен. он должен быть запущен при помощи [ОСени](https://github.com/autumn-library/autumn). Дальше перед вами три пути: 238 | 239 | Первый - команды модифицировать аннотациями конструктора ```&КомандаПриложения``` или ```&ПодкомандаПриложения```, оставить методы ```ОписаниеКоманды``` и ```ВыполнитьКоманду```, тогда фреймворк поймёт, что они уже реализованы, и не будет генерировать для них код. 240 | 241 | Второй - команды модифицировать аннотациями конструктора ```&КомандаПриложения``` или ```&ПодкомандаПриложения```, убрать методы ```ОписаниеКоманды``` и ```ВыполнитьКоманду```, и создать поля класса, с необходимыми аннотациями, и метод с аннотацией ```&ВыполнениеКоманды```. В таком случае фреймворк сгенерит все остальное за вас. 242 | 243 | Третий - Команды оставить без изменений, но создать класс - дуб, который превратит ваши команды в желуди. Для понимания, приведу пример, как можно "ожелудить" небольшую команду: 244 | 245 | ```Каталог/С/Классами/Команд/МояЛегасиКоманда.os``` 246 | ```bsl 247 | Перем ИмяПользователя; 248 | 249 | Процедура ПриСозданииОбъекта() 250 | КонецПроцедуры 251 | 252 | Процедура ОписаниеКоманды(Знач КомандаПриложения) Экспорт 253 | 254 | КомандаПриложения.Опция("n name", "", "Имя пользователя"); 255 | 256 | КонецПроцедуры 257 | 258 | Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт 259 | 260 | ИмяПользователя = КомандаПриложения.ЗначениеОпции("name"); 261 | 262 | Сообщить("Привет " + ИмяПользователя); 263 | 264 | КонецПроцедуры 265 | ``` 266 | 267 | Теперь создадим дуб, в котором можно ожелудить все необходимые классы: 268 | 269 | ```Каталог/С/Классами/Команд/ДубЛегасиКоманды.os``` 270 | ```bsl 271 | &Дуб 272 | Процедура ПриСозданииОбъекета() 273 | КонецПроцедуры 274 | 275 | &Завязь 276 | &КомандаПриложения(Имя = "legacy", Описание = "Легаси команда, которая работает через дуб") 277 | Функция МояЛегасиКоманда() Экспорт 278 | Возврат Новый МояЛегасиКоманда(); 279 | КонецФункции 280 | ``` 281 | 282 | Таким не самым хитрым способом, мы можем, не изменяя кода уже существующих команд, превратить их в желуди и добавить нужных аннотаций. 283 | 284 | ## Больше примеров 285 | 286 | Описанные классы можно посмотреть в каталоге [example](https://github.com/autumn-library/autumn-cli/tree/master/example) и еще больше примеров команд в каталоге [tests](https://github.com/autumn-library/autumn-cli/tree/master/tests/%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B) 287 | -------------------------------------------------------------------------------- /example/main.os: -------------------------------------------------------------------------------- 1 | #Использовать autumn 2 | #Использовать ".." 3 | #Использовать "." 4 | 5 | Поделка = Новый Поделка(); 6 | Поделка 7 | .ПросканироватьКаталог(ОбъединитьПути(ТекущийСценарий().Каталог, "Классы")) 8 | .ЗапуститьПриложение(); -------------------------------------------------------------------------------- /example/Классы/ДемоОписаниеПриложения.os: -------------------------------------------------------------------------------- 1 | 2 | &Желудь("ОписаниеКонсольногоПриложения") 3 | &Верховный 4 | Процедура ПриСозданииОбъекта() 5 | КонецПроцедуры 6 | 7 | Функция ИмяПриложения() Экспорт 8 | Возврат "demo-cli"; 9 | КонецФункции 10 | 11 | Функция ПолноеИмяПриложения() Экспорт 12 | Возврат "Демонстрационное консольное приложение"; 13 | КонецФункции 14 | 15 | Функция ВерсияПриложения() Экспорт 16 | Возврат "1.0"; 17 | КонецФункции -------------------------------------------------------------------------------- /example/Классы/КомандаДата.os: -------------------------------------------------------------------------------- 1 | 2 | &КомандаПриложения(Имя = "date", 3 | Описание = "Выводит дату", 4 | Подкоманда = "ПодкомандаДень", 5 | Подкоманда = "ПодкомандаМесяц" 6 | ) 7 | Процедура ПриСозданииОбъекта() 8 | 9 | КонецПроцедуры 10 | -------------------------------------------------------------------------------- /example/Классы/КомандаПлюс.os: -------------------------------------------------------------------------------- 1 | 2 | &Аргумент(Имя = "ARG", Описание = "Значение числа") 3 | &ТЧисло 4 | Перем ПереданноеЧисло; 5 | 6 | &КомандаПриложения(Имя = "p plus", Описание = "Прибавляет 10 к заданному числу") 7 | Процедура ПриСозданииОбъекта() 8 | 9 | КонецПроцедуры 10 | 11 | &ВыполнениеКоманды 12 | Процедура ВывестиРезультатСложения() Экспорт 13 | 14 | Результат = ПереданноеЧисло + 10; 15 | 16 | Сообщить("Результат сложения: " + Результат); 17 | 18 | КонецПроцедуры -------------------------------------------------------------------------------- /example/Классы/КомандаПривет.os: -------------------------------------------------------------------------------- 1 | 2 | &Опция(Имя = "n name", Описание = "Имя пользователя") 3 | &ПоУмолчанию("username") 4 | Перем ИмяПользователя; 5 | 6 | &КомандаПриложения(Имя = "H hello", Описание = "Поздоровается с пользователем") 7 | Процедура ПриСозданииОбъекта() 8 | 9 | КонецПроцедуры 10 | 11 | &ВыполнениеКоманды 12 | Процедура ПоприветствоватьПользователя() Экспорт 13 | 14 | ТекстСообщения = "Привет " + ИмяПользователя + "!"; 15 | 16 | Сообщить(ТекстСообщения); 17 | 18 | КонецПроцедуры -------------------------------------------------------------------------------- /example/Классы/ПодкомандаДень.os: -------------------------------------------------------------------------------- 1 | 2 | &ПодкомандаПриложения(Имя = "day", Описание = "Выводит дату - начало дня") 3 | Процедура ПриСозданииОбъекта() 4 | 5 | КонецПроцедуры 6 | 7 | &ВыполнениеКоманды 8 | Процедура СообщитьДень() Экспорт 9 | 10 | Сообщить(НачалоДня(ТекущаяДата())); 11 | 12 | КонецПроцедуры 13 | -------------------------------------------------------------------------------- /example/Классы/ПодкомандаМесяц.os: -------------------------------------------------------------------------------- 1 | 2 | &ПодкомандаПриложения(Имя = "month", Описание = "Выводит дату - начало месяца") 3 | Процедура ПриСозданииОбъекта() 4 | 5 | КонецПроцедуры 6 | 7 | &ВыполнениеКоманды 8 | Процедура СообщитьМесяц() Экспорт 9 | 10 | Сообщить(НачалоМесяца(ТекущаяДата())); 11 | 12 | КонецПроцедуры 13 | -------------------------------------------------------------------------------- /packagedef: -------------------------------------------------------------------------------- 1 | //////////////////////////////////////////////////////////// 2 | // Описание пакета для сборки и установки 3 | // Полную документацию см. на hub.oscript.io/packaging 4 | // 5 | 6 | 7 | Описание.Имя("autumn-cli") 8 | .Версия("1.2.0") 9 | .Автор("nikita ivanchenko") 10 | .АдресАвтора("https://github.com/Nivanchenko") 11 | .Описание("Библиотека для разработки cli приложений на осеннем фреймворке") 12 | .ВерсияСреды("1.9.2") 13 | .ВключитьФайл("src") 14 | .ЗависитОт("autumn", "4.3.7") 15 | .ЗависитОт("decorator", "2.0.2") 16 | .ЗависитОт("cli", "0.10.2") 17 | .РазработкаЗависитОт("1bdd") 18 | .РазработкаЗависитОт("1testrunner") 19 | ; 20 | -------------------------------------------------------------------------------- /src/Заготовки/ИнициализацияИнтефейсаКоманднойСтроки.os: -------------------------------------------------------------------------------- 1 | 2 | Процедура ПриИнициализацииПоделки(Поделка) Экспорт 3 | 4 | Поделка.ДобавитьАннотацию(Тип("ИКС_АннотацияКоманда")) 5 | .ДобавитьАннотацию(Тип("ИКС_АннотацияПодкомнада")) 6 | .ДобавитьЖелудь(Тип("ИКС_ДекораторКоманд")) 7 | .ДобавитьДуб(Тип("ИКС_Дуб")) 8 | .ДобавитьЖелудь(Тип("ИКС_КомандаПриложенияПоУмолчанию")) 9 | .ДобавитьЖелудь(Тип("ИКС_ОписаниеПриложения")) 10 | .ДобавитьРогатку(Тип("ИКС_Рогатка")); 11 | 12 | КонецПроцедуры 13 | 14 | &Заготовка 15 | Процедура ПриСозданииОбъекта() 16 | КонецПроцедуры 17 | -------------------------------------------------------------------------------- /src/Классы/ИКС_АннотацияКоманда.os: -------------------------------------------------------------------------------- 1 | 2 | Перем _Значение; 3 | Перем _ДобавлятьАннотациюЖелудь; 4 | 5 | Процедура ПриРазворачиванииАннотации(ОпределениеАннотации, ПодчиненныеАннотации, ТипВладельцаСвойств, Свойство) Экспорт 6 | 7 | Аннотация = РаботаСАннотациями.НайтиАннотацию(ПодчиненныеАннотации, "Желудь"); 8 | ЭтоЗавязь = НЕ РаботаСАннотациями.НайтиАннотацию(Свойство.Аннотации, "Завязь") = Неопределено; 9 | Если _ДобавлятьАннотациюЖелудь = Истина 10 | И Аннотация = Неопределено 11 | И ЭтоЗавязь = Ложь Тогда 12 | Аннотация = ПодчиненныеАннотации.Вставить(1); 13 | Аннотация.Имя = "желудь"; 14 | Аннотация.Параметры = Новый ТаблицаЗначений(); 15 | Аннотация.Параметры.Колонки.Добавить("Имя"); 16 | Аннотация.Параметры.Колонки.Добавить("Значение"); 17 | КонецЕсли; 18 | Если _Значение <> "" Тогда 19 | РаботаСАннотациями.УстановитьЗначениеПараметраАннотации(Аннотация, "Значение", _Значение); 20 | КонецЕсли; 21 | 22 | КонецПроцедуры 23 | 24 | &Аннотация("КомандаПриложения") 25 | &Прозвище("КомандаПриложения") 26 | Процедура ПриСозданииОбъекта(Идентификатор = "", 27 | Имя = "", 28 | Описание = "", 29 | &Повторяемый Подкоманда = Неопределено, 30 | ДобавлятьАннотациюЖелудь = Истина) 31 | 32 | _Значение = Идентификатор; 33 | _ДобавлятьАннотациюЖелудь = ДобавлятьАннотациюЖелудь; 34 | 35 | КонецПроцедуры -------------------------------------------------------------------------------- /src/Классы/ИКС_АннотацияПеречисление.os: -------------------------------------------------------------------------------- 1 | // Аннотация определяет элемент перечисления для параметра команды. 2 | // Должна использоваться совместно с аннотацией &ТПеречисление. 3 | // 4 | // Параметры: 5 | // Имя - Строка - Имя элемента 6 | // Значение - Строка, Число, Булево, Неопределено - Значение элемента 7 | // Описание - Строка - Описание для справки 8 | // 9 | // Примеры: 10 | // 11 | // &ТПеречисление() 12 | // &Перечисление(Имя = "green", Значение = "Зеленый", Описание = "Цвет зеленый") 13 | // &Перечисление(Имя = "red", Значение = "Красный", Описание = "Цвет красный") 14 | // Перем МойПараметр; 15 | // 16 | &Аннотация("Перечисление") 17 | Процедура ПриСозданииОбъекта(Имя, Значение = Неопределено, Описание = "") 18 | КонецПроцедуры -------------------------------------------------------------------------------- /src/Классы/ИКС_АннотацияПодкомнада.os: -------------------------------------------------------------------------------- 1 | Перем _Идентификатор; 2 | Перем _Имя; 3 | Перем _Описание; 4 | Перем _Подкоманда; 5 | Перем _ДобавлятьАннотациюЖелудь; 6 | 7 | Процедура ПриРазворачиванииАннотации(ОпределениеАннотации, ПодчиненныеАннотации, ТипВладельцаСвойств, Свойство) Экспорт 8 | 9 | Аннотация = РаботаСАннотациями.НайтиАннотацию(ПодчиненныеАннотации, "КомандаПриложения"); 10 | 11 | РаботаСАннотациями.УстановитьЗначениеПараметраАннотации(Аннотация, "Идентификатор", _Идентификатор); 12 | РаботаСАннотациями.УстановитьЗначениеПараметраАннотации(Аннотация, "Имя", _Имя); 13 | РаботаСАннотациями.УстановитьЗначениеПараметраАннотации(Аннотация, "Описание", _Описание); 14 | РаботаСАннотациями.УстановитьЗначениеПараметраАннотации(Аннотация, "Подкоманда", _Подкоманда); 15 | РаботаСАннотациями.УстановитьЗначениеПараметраАннотации(Аннотация, "ДобавлятьАннотациюЖелудь", _ДобавлятьАннотациюЖелудь); 16 | 17 | КонецПроцедуры 18 | 19 | &Аннотация("ПодкомандаПриложения") 20 | &КомандаПриложения() 21 | Процедура ПриСозданииОбъекта(Идентификатор = "", 22 | Имя = "", 23 | Описание = "", 24 | &Повторяемый Подкоманда = Неопределено, 25 | ДобавлятьАннотациюЖелудь = Истина) 26 | 27 | _Идентификатор = Идентификатор; 28 | _Имя = Имя; 29 | _Описание = Описание; 30 | _Подкоманда = Подкоманда; 31 | _ДобавлятьАннотациюЖелудь = ДобавлятьАннотациюЖелудь; 32 | 33 | КонецПроцедуры -------------------------------------------------------------------------------- /src/Классы/ИКС_АннотацияТПеречисление.os: -------------------------------------------------------------------------------- 1 | // Аннотация объявляет тип "Перечисление" для параметра команды. 2 | // Используется совместно с аннотацией &Перечисление() для добавления элементов. 3 | // 4 | // Примеры: 5 | // 6 | // &ТПеречисление() 7 | // &Перечисление(Имя = "green", Значение = "Зеленый", Описание = "Цвет зеленый") 8 | // &Перечисление(Имя = "red", Значение = "Красный", Описание = "Цвет красный") 9 | // Перем МойПараметр; 10 | // 11 | &Аннотация("ТПеречисление") 12 | Процедура ПриСозданииОбъекта() 13 | КонецПроцедуры -------------------------------------------------------------------------------- /src/Классы/ИКС_ДекораторКоманд.os: -------------------------------------------------------------------------------- 1 | #Использовать decorator 2 | #Использовать autumn 3 | 4 | Перем Рефлектор; 5 | 6 | Перем ОписаниеАргументов; 7 | 8 | &Пластилин 9 | Перем Поделка; 10 | 11 | &Желудь 12 | Процедура ПриСозданииОбъекта() 13 | Рефлектор = Новый Рефлектор(); 14 | ЗаполнитьОписаниеАргументов(); 15 | КонецПроцедуры 16 | 17 | Функция СоздатьКомандуПоАннотациямОбъекта(ДанныеЖелудя) Экспорт 18 | Декоратор = Новый ПостроительДекоратора(ДанныеЖелудя.Желудь); 19 | 20 | ПолеПодкоманд = Новый Поле("ИКС_Подкоманды").Публичное(); 21 | Декоратор.Поле(ПолеПодкоманд); 22 | 23 | ПодготовитьОписаниеКоманды(Декоратор, ДанныеЖелудя); 24 | ПодготовитьВыполнитьКоманду(Декоратор, ДанныеЖелудя); 25 | 26 | ГотоваяКоманда = Декоратор.Построить(); 27 | ГотоваяКоманда.ИКС_Подкоманды = ПолучитьПодкоманды(ДанныеЖелудя.ОпределениеЖелудя); 28 | Возврат ГотоваяКоманда; 29 | КонецФункции 30 | 31 | Функция ПолучитьПодкоманды(ОпределениеЖелудя) 32 | Конструктор = ОпределениеЖелудя.Завязь().ДанныеМетода(); 33 | Аннотация = РаботаСАннотациями.НайтиАннотацию(Конструктор.Аннотации, "КомандаПриложения"); 34 | 35 | Результат = Новый Массив(); 36 | 37 | ИменаПодкоманд = РаботаСАннотациями.ПолучитьЗначенияПараметровАннотации(Аннотация, "Подкоманда"); 38 | 39 | Для Каждого ИмяПодкоманды Из ИменаПодкоманд Цикл 40 | ТаблицаЖелудей = Поделка.НайтиЖелуди(ИмяПодкоманды, Неопределено, "ТаблицаЗначений"); 41 | Для Каждого ДанныеПодкоманды Из ТаблицаЖелудей Цикл 42 | Результат.Добавить(ПолучитьОписаниеПодкоманды(ДанныеПодкоманды)); 43 | КонецЦикла; 44 | КонецЦикла; 45 | 46 | Возврат Результат; 47 | 48 | КонецФункции 49 | 50 | Функция ПолучитьОписаниеПодкоманды(ДанныеЖелудя) 51 | 52 | ОписаниеПодкоманды = Новый Структура("Имя, Описание, Объект"); 53 | 54 | ОпределениеЖелудя = ДанныеЖелудя.ОпределениеЖелудя; 55 | Конструктор = ОпределениеЖелудя.Завязь().ДанныеМетода(); 56 | Аннотация = РаботаСАннотациями.НайтиАннотацию(Конструктор.Аннотации, "КомандаПриложения"); 57 | 58 | ОписаниеПодкоманды.Имя = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(Аннотация, "Имя"); 59 | ОписаниеПодкоманды.Описание = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(Аннотация, "Описание", ""); 60 | ОписаниеПодкоманды.Объект = СоздатьКомандуПоАннотациямОбъекта(ДанныеЖелудя); 61 | 62 | Возврат ОписаниеПодкоманды; 63 | КонецФункции 64 | 65 | Процедура ПодготовитьОписаниеКоманды(ПостроительДекоратора, ДанныеЖелудя) 66 | Если ЕстьМетод(ДанныеЖелудя.Желудь, "ОписаниеКоманды") Тогда 67 | Возврат; 68 | КонецЕсли; 69 | 70 | ТелоМетода = Новый Массив; 71 | Свойства = ДанныеЖелудя.ОпределениеЖелудя.Свойства(); 72 | 73 | Для Каждого Свойство из Свойства Цикл 74 | РазвернутьОписаниеАннотацииПолей(ТелоМетода, Свойство, "Опция", "ТекКоманда = КомандаПриложения.Опция(""%1"", """", ""%2"");"); 75 | РазвернутьОписаниеАннотацииПолей(ТелоМетода, Свойство, "Аргумент", "ТекКоманда = КомандаПриложения.Аргумент(""%1"", """", ""%2"");"); 76 | КонецЦикла; 77 | 78 | ТелоМетода.Добавить(ТекстПодготовкиПодкоманд()); 79 | 80 | Метод = Новый Метод("ОписаниеКоманды").Публичный(); 81 | Метод.Параметр(Новый ПараметрМетода("КомандаПриложения").ПоЗначению()); 82 | Метод.ТелоМетода(СтрСоединить(ТелоМетода, Символы.ПС)); 83 | 84 | ПостроительДекоратора.Метод(Метод); 85 | КонецПроцедуры 86 | 87 | Функция ТекстПодготовкиПодкоманд() 88 | Возврат 89 | "Для Каждого Подкоманда из ИКС_Подкоманды Цикл 90 | | КомандаПриложения.ДобавитьКоманду(Подкоманда.Имя, Подкоманда.Описание, Подкоманда.Объект); 91 | |КонецЦикла"; 92 | КонецФункции 93 | 94 | Процедура ПодготовитьВыполнитьКоманду(ПостроительДекоратора, ДанныеЖелудя) 95 | Если ЕстьМетод(ДанныеЖелудя.Желудь, "ВыполнитьКоманду") Тогда 96 | Возврат; 97 | КонецЕсли; 98 | 99 | ТелоМетода = Новый Массив; 100 | Свойства = ДанныеЖелудя.ОпределениеЖелудя.Свойства(); 101 | 102 | Для Каждого Свойство из Свойства Цикл 103 | РазвернутьЗначениеАннотацийПолей(ТелоМетода, Свойство, "Опция", "%1 = КомандаПриложения.ЗначениеОпции(""%2"");"); 104 | РазвернутьЗначениеАннотацийПолей(ТелоМетода, Свойство, "Аргумент", "%1 = КомандаПриложения.ЗначениеАргумента(""%2"");"); 105 | КонецЦикла; 106 | 107 | МетодыВыполненияКоманды = РаботаСАннотациями.НайтиМетодыСАннотацией( 108 | ДанныеЖелудя.ОпределениеЖелудя.Методы(), 109 | "ВыполнениеКоманды"); 110 | 111 | Для каждого МетодВыполненияКоманды Из МетодыВыполненияКоманды Цикл 112 | ТелоМетода.Добавить(МетодВыполненияКоманды.Имя + "();"); 113 | КонецЦикла; 114 | 115 | Метод = Новый Метод("ВыполнитьКоманду").Публичный(); 116 | Метод.Параметр(Новый ПараметрМетода("КомандаПриложения").ПоЗначению()); 117 | Метод.ТелоМетода(СтрСоединить(ТелоМетода, Символы.ПС)); 118 | 119 | ПостроительДекоратора.Метод(Метод); 120 | 121 | КонецПроцедуры 122 | 123 | Процедура РазвернутьОписаниеАннотацииПолей(ТелоМетода, Свойство, ИмяАннотации, Шаблон) 124 | Аннотация = РаботаСАннотациями.ПолучитьАннотацию(Свойство, ИмяАннотации); 125 | Если Аннотация = Неопределено Тогда 126 | Возврат; 127 | КонецЕсли; 128 | 129 | Имя = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(Аннотация, "Имя"); 130 | Описание = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(Аннотация, "Описание"); 131 | 132 | Если СтрЧислоСтрок(Описание) > 1 Тогда 133 | Описание = СтрЗаменить(Описание, Символы.ПС, Символы.ПС + "|"); 134 | КонецЕсли; 135 | 136 | ТелоМетода.Добавить( 137 | СтрШаблон( 138 | Шаблон, 139 | Имя, 140 | Описание 141 | ) 142 | ); 143 | 144 | ДополнитьОписаниеОпции(ТелоМетода, Свойство); 145 | КонецПроцедуры 146 | 147 | Процедура РазвернутьЗначениеАннотацийПолей(ТелоМетода, Свойство, ИмяАннотации, Шаблон) 148 | Аннотация = РаботаСАннотациями.ПолучитьАннотацию(Свойство, ИмяАннотации); 149 | Если Аннотация = Неопределено Тогда 150 | Возврат; 151 | КонецЕсли; 152 | 153 | ИмяОпции = СтрРазделить(РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(Аннотация, "Имя"), " ")[0]; 154 | 155 | ТелоМетода.Добавить(СтрШаблон(Шаблон, 156 | Свойство.Имя, 157 | ИмяОпции)); 158 | КонецПроцедуры 159 | 160 | Процедура ДополнитьОписаниеОпции(ТелоМетода, Свойство) 161 | 162 | Для каждого ТекущийАргумент Из ОписаниеАргументов Цикл 163 | 164 | Аннотации = РаботаСАннотациями.ПолучитьАннотации(Свойство, ТекущийАргумент.Имя); 165 | 166 | Для Каждого Аннотация Из Аннотации Цикл 167 | 168 | СтрокаОписанияАргумента = ПолучитьСтрокуОписаниеАргумента("ТекКоманда.%1(%2);", Аннотация, ТекущийАргумент); 169 | ТелоМетода.Добавить(СтрокаОписанияАргумента); 170 | 171 | КонецЦикла; 172 | 173 | КонецЦикла; 174 | 175 | КонецПроцедуры 176 | 177 | Функция ПолучитьСтрокуОписаниеАргумента(Шаблон, Аннотация, ОписаниеАргумента) 178 | 179 | Возврат СтрШаблон(Шаблон, ОписаниеАргумента.Имя, СформироватьПараметрыМетодаАргумента(Аннотация, ОписаниеАргумента)); 180 | 181 | КонецФункции 182 | 183 | Функция СформироватьПараметрыМетодаАргумента(Аннотация, ОписаниеАргумента) 184 | 185 | Если ОписаниеАргумента.ЕстьПараметры = Ложь Тогда 186 | Возврат ""; 187 | КонецЕсли; 188 | 189 | Если ОписаниеАргумента.Параметры = Неопределено 190 | ИЛИ ОписаниеАргумента.Параметры.Количество() = 1 Тогда 191 | 192 | Возврат ЗначениеЕдинственногоПараметраАннотации(Аннотация); 193 | 194 | КонецЕсли; 195 | 196 | Если ОписаниеАргумента.Параметры.Количество() > 1 Тогда 197 | Параметры = Новый Массив(); 198 | Для Каждого ТекПараметр из ОписаниеАргумента.Параметры Цикл 199 | ЗначениеПараметра = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(Аннотация, ТекПараметр, , Истина); 200 | Если ЗначениеПараметра = Неопределено Тогда 201 | Параметры.Добавить(""); 202 | Иначе 203 | Параметры.Добавить(ПолучитьПредставлениеПараметраКоманды(ЗначениеПараметра)); 204 | КонецЕсли; 205 | КонецЦикла; 206 | Возврат СтрСоединить(Параметры, ","); 207 | КонецЕсли; 208 | 209 | КонецФункции 210 | 211 | Функция ЗначениеЕдинственногоПараметраАннотации(Аннотация) 212 | 213 | Если Аннотация.Параметры.Количество() = 0 Тогда 214 | Возврат ""; 215 | Иначе 216 | Возврат ПолучитьПредставлениеПараметраКоманды(Аннотация.Параметры[0].Значение); 217 | КонецЕсли; 218 | 219 | КонецФункции 220 | 221 | Функция ПолучитьПредставлениеПараметраКоманды(ПараметрКоманды) 222 | 223 | Если ПараметрКоманды = Неопределено Тогда 224 | Возврат "Неопределено"; 225 | 226 | ИначеЕсли ТипЗнч(ПараметрКоманды) = Тип("Строка") Тогда 227 | Возврат """" + ПараметрКоманды + """"; 228 | 229 | ИначеЕсли ТипЗнч(ПараметрКоманды) = Тип("Булево") Тогда 230 | Возврат ?(ПараметрКоманды = Истина, "Истина", "Ложь"); 231 | 232 | Иначе 233 | Возврат Строка(ПараметрКоманды); 234 | КонецЕсли; 235 | 236 | КонецФункции 237 | 238 | Функция ЕстьМетод(Команда, ИмяМетода) 239 | Возврат Рефлектор.МетодСуществует(Команда, ИмяМетода); 240 | КонецФункции 241 | 242 | Процедура ЗаполнитьОписаниеАргументов() 243 | 244 | ОписаниеАргументов = Новый ТаблицаЗначений(); 245 | ОписаниеАргументов.Колонки.Добавить("Имя"); 246 | ОписаниеАргументов.Колонки.Добавить("ЕстьПараметры"); 247 | ОписаниеАргументов.Колонки.Добавить("Параметры"); 248 | 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 | ТЧисло.Имя = "ТЧисло"; 275 | 276 | ТСтрока = ОписаниеАргументов.Добавить(); 277 | ТСтрока.Имя = "ТСтрока"; 278 | 279 | ТМассивДат = ОписаниеАргументов.Добавить(); 280 | ТМассивДат.Имя = "ТМассивДат"; 281 | ТМассивДат.ЕстьПараметры = Истина; 282 | ТМассивДат.Параметры = СтрРазделить("ФорматДаты;ВходящийРазделительМассива", ";"); 283 | 284 | ТМассивЧисел = ОписаниеАргументов.Добавить(); 285 | ТМассивЧисел.Имя = "ТМассивЧисел"; 286 | ТМассивЧисел.ЕстьПараметры = Истина; 287 | 288 | ТМассивСтрок = ОписаниеАргументов.Добавить(); 289 | ТМассивСтрок.Имя = "ТМассивСтрок"; 290 | ТМассивСтрок.ЕстьПараметры = Истина; 291 | 292 | ТПеречисление = ОписаниеАргументов.Добавить(); 293 | ТПеречисление.Имя = "ТПеречисление"; 294 | 295 | Перечисление = ОписаниеАргументов.Добавить(); 296 | Перечисление.Имя = "Перечисление"; 297 | Перечисление.ЕстьПараметры = Истина; 298 | Перечисление.Параметры = СтрРазделить("Имя;Значение;Описание", ";"); 299 | 300 | Псевдоним = ОписаниеАргументов.Добавить(); 301 | Псевдоним.Имя = "Псевдоним"; 302 | Псевдоним.ЕстьПараметры = Истина; 303 | 304 | Описание = ОписаниеАргументов.Добавить(); 305 | Описание.Имя = "Описание"; 306 | Описание.ЕстьПараметры = Истина; 307 | 308 | Обязательный = ОписаниеАргументов.Добавить(); 309 | Обязательный.Имя = "Обязательный"; 310 | Обязательный.ЕстьПараметры = Истина; 311 | 312 | ПодробноеОписание = ОписаниеАргументов.Добавить(); 313 | ПодробноеОписание.Имя = "ПодробноеОписание"; 314 | ПодробноеОписание.ЕстьПараметры = Истина; 315 | 316 | // TODO: Дотащить остальные текучие методы. 317 | 318 | // ПроизвольныйТип 319 | 320 | 321 | КонецПроцедуры 322 | -------------------------------------------------------------------------------- /src/Классы/ИКС_Дуб.os: -------------------------------------------------------------------------------- 1 | #Использовать autumn 2 | #Использовать cli 3 | 4 | &Пластилин 5 | Перем ИКС_ДекораторКоманд; 6 | 7 | &Завязь 8 | Функция КонсольноеПриложение( 9 | &Пластилин(Значение = "КомандаПриложения", Тип = "ТаблицаЗначений") КомандыПриложения, 10 | &Пластилин КомандаПриложенияПоУмолчанию, 11 | &Пластилин ОписаниеКонсольногоПриложения 12 | ) Экспорт 13 | 14 | ИмяПриложения = ОписаниеКонсольногоПриложения.ИмяПриложения(); 15 | ПолноеИмяПриложения = ОписаниеКонсольногоПриложения.ПолноеИмяПриложения(); 16 | ВерсияПриложения = ОписаниеКонсольногоПриложения.ВерсияПриложения(); 17 | 18 | // TODO: Перенести в ядро ОСени. 19 | ПолноеИмяПриложения = СтрЗаменить(ПолноеИмяПриложения, "%{cli.ВерсияПриложения}", ВерсияПриложения); 20 | 21 | КонсольноеПриложение = Новый КонсольноеПриложение( 22 | ИмяПриложения, 23 | ПолноеИмяПриложения 24 | ); 25 | 26 | КонсольноеПриложение.Версия("v version", ВерсияПриложения); 27 | 28 | Для Каждого ДанныеЖелудя Из КомандыПриложения Цикл 29 | 30 | ОпределениеЖелудя = ДанныеЖелудя.ОпределениеЖелудя; 31 | 32 | Конструктор = ОпределениеЖелудя.Завязь().ДанныеМетода(); 33 | 34 | Аннотация = РаботаСАннотациями.НайтиАннотацию(Конструктор.Аннотации, "КомандаПриложения"); 35 | Если Аннотация = Неопределено Тогда 36 | ВызватьИсключение "Не найдена аннотация КомандаПриложения у желудя " + ДанныеЖелудя.Имя; 37 | КонецЕсли; 38 | 39 | Если НЕ РаботаСАннотациями.НайтиАннотацию(Конструктор.Аннотации, "ПодкомандаПриложения") = Неопределено Тогда 40 | Продолжить; 41 | КонецЕсли; 42 | 43 | КонсольноеПриложение.ДобавитьКоманду( 44 | РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(Аннотация, "Имя"), 45 | РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(Аннотация, "Описание", ""), 46 | ИКС_ДекораторКоманд.СоздатьКомандуПоАннотациямОбъекта(ДанныеЖелудя) 47 | ); 48 | 49 | КонецЦикла; 50 | 51 | КонсольноеПриложение.УстановитьОсновноеДействие(КомандаПриложенияПоУмолчанию); 52 | 53 | Возврат КонсольноеПриложение; 54 | 55 | КонецФункции 56 | 57 | &Дуб 58 | Процедура ПриСозданииОбъекта() 59 | КонецПроцедуры -------------------------------------------------------------------------------- /src/Классы/ИКС_КомандаПриложенияПоУмолчанию.os: -------------------------------------------------------------------------------- 1 | // Обработчик выполнения команды 2 | // 3 | // Параметры: 4 | // КомандаПриложения - КомандаПриложения - Выполняемая команда 5 | // 6 | Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт 7 | 8 | КомандаПриложения.ВывестиСправку(); 9 | 10 | КонецПроцедуры 11 | 12 | &КомандаПриложения( 13 | Имя = "help h", 14 | Описание = "Вывести справку по командам" 15 | ) 16 | &Прозвище("КомандаПриложенияПоУмолчанию") 17 | Процедура ПриСозданииОбъекта() 18 | 19 | КонецПроцедуры -------------------------------------------------------------------------------- /src/Классы/ИКС_ОписаниеПриложения.os: -------------------------------------------------------------------------------- 1 | 2 | Перем _ИмяПриложения; 3 | Перем _ПолноеИмяПриложения; 4 | Перем _ВерсияПриложения; 5 | 6 | &Желудь("ОписаниеКонсольногоПриложения") 7 | Процедура ПриСозданииОбъекта(&Деталька(Значение = "cli.ИмяПриложения") ИмяПриложения, 8 | &Деталька(Значение = "cli.ПолноеИмяПриложения") ПолноеИмяПриложения, 9 | &Деталька(Значение = "cli.ВерсияПриложения") ВерсияПриложения) 10 | 11 | _ИмяПриложения = ИмяПриложения; 12 | _ПолноеИмяПриложения = ПолноеИмяПриложения; 13 | _ВерсияПриложения = ВерсияПриложения; 14 | КонецПроцедуры 15 | 16 | Функция ИмяПриложения() Экспорт 17 | Возврат _ИмяПриложения; 18 | КонецФункции 19 | 20 | Функция ПолноеИмяПриложения() Экспорт 21 | Возврат _ПолноеИмяПриложения; 22 | КонецФункции 23 | 24 | Функция ВерсияПриложения() Экспорт 25 | Возврат _ВерсияПриложения; 26 | КонецФункции -------------------------------------------------------------------------------- /src/Классы/ИКС_Рогатка.os: -------------------------------------------------------------------------------- 1 | // TODO: отдельная рогатка ovm по управлчению временными файлами? Перехватчик "ПриЗавершенииПриложения" в ОСени? 2 | #Использовать tempfiles 3 | 4 | &Пластилин 5 | Перем КонсольноеПриложение; 6 | 7 | Перем Лог; 8 | 9 | Процедура ПриЗапускеПриложения() Экспорт 10 | 11 | КодСостояния = 0; 12 | Попытка 13 | КонсольноеПриложение.Запустить(АргументыКоманднойСтроки); 14 | Исключение 15 | Лог.Ошибка(ОписаниеОшибки()); 16 | 17 | ВременныеФайлы.Удалить(); // todo: перехватчик "ПриЗавершенииПриложения" в ОСени? 18 | 19 | КодСостояния = 1; // todo: возврат кода состояния рогатки как ExitCodeGenerator? 20 | КонецПопытки; 21 | 22 | ЗавершитьРаботу(КодСостояния); // todo: прям не хорошо 23 | 24 | КонецПроцедуры 25 | 26 | &Рогатка(ЗапускатьВФоне = Ложь) 27 | Процедура ПриСозданииОбъекта() 28 | Лог = Логирование.ПолучитьЛог("oscript.lib.autumn-cli"); 29 | КонецПроцедуры -------------------------------------------------------------------------------- /tasks/coverage.os: -------------------------------------------------------------------------------- 1 | #Использовать 1commands 2 | #Использовать fs 3 | #Использовать coverage 4 | 5 | СистемнаяИнформация = Новый СистемнаяИнформация; 6 | ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; 7 | 8 | ФС.ОбеспечитьПустойКаталог("out"); 9 | ПутьКСтат = "out/stat.json"; 10 | 11 | Команда = Новый Команда; 12 | Команда.УстановитьКоманду("oscript"); 13 | Если НЕ ЭтоWindows Тогда 14 | Команда.ДобавитьПараметр("-encoding=utf-8"); 15 | КонецЕсли; 16 | Команда.ДобавитьПараметр(СтрШаблон("-codestat=%1", ПутьКСтат)); 17 | Команда.ДобавитьПараметр("tasks/test.os"); // Файла запуска тестов 18 | Команда.ПоказыватьВыводНемедленно(Истина); 19 | 20 | КодВозврата = Команда.Исполнить(); 21 | 22 | ПроцессорГенерации = Новый ГенераторОтчетаПокрытия(); 23 | 24 | ПроцессорГенерации.ОтносительныеПути() 25 | .РабочийКаталог("out") 26 | .ИмяФайлаСтатистики() 27 | .GenericCoverage() 28 | .Cobertura() 29 | .Сформировать(); 30 | 31 | ЗавершитьРаботу(КодВозврата); 32 | -------------------------------------------------------------------------------- /tasks/oscript.cfg: -------------------------------------------------------------------------------- 1 | lib.system=../oscript_modules 2 | -------------------------------------------------------------------------------- /tasks/test.os: -------------------------------------------------------------------------------- 1 | #Использовать 1testrunner 2 | #Использовать fs 3 | 4 | Функция ПрогнатьТесты() 5 | 6 | Тестер = Новый Тестер; 7 | Тестер.УстановитьФорматЛогФайла(Тестер.ФорматыЛогФайла().GenericExec); 8 | 9 | ПутьКТестам = "tests"; 10 | ПутьКОтчетуJUnit = "out"; 11 | 12 | ФС.ОбеспечитьПустойКаталог(ПутьКОтчетуJUnit); 13 | 14 | РезультатТестирования = Тестер.ТестироватьКаталог( 15 | Новый Файл(ПутьКТестам), 16 | Новый Файл(ПутьКОтчетуJUnit) 17 | ); 18 | 19 | Успешно = РезультатТестирования = 0; 20 | 21 | Возврат Успешно; 22 | 23 | КонецФункции // ПрогнатьТесты() 24 | 25 | // основной код 26 | 27 | ТекКаталог = ТекущийКаталог(); 28 | 29 | Попытка 30 | ТестыПрошли = ПрогнатьТесты(); 31 | Исключение 32 | ТестыПрошли = Ложь; 33 | Сообщить(СтрШаблон("Тесты через 1testrunner выполнены неудачно 34 | |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); 35 | КонецПопытки; 36 | 37 | УстановитьТекущийКаталог(ТекКаталог); 38 | 39 | Если Не ТестыПрошли Тогда 40 | ВызватьИсключение "Тестирование завершилось неудачно!"; 41 | Иначе 42 | Сообщить(СтрШаблон("Результат прогона тестов <%1> 43 | |", ТестыПрошли)); 44 | КонецЕсли; 45 | -------------------------------------------------------------------------------- /tests/alltests.os: -------------------------------------------------------------------------------- 1 | #Использовать autumn 2 | #Использовать asserts 3 | #Использовать ".." 4 | #Использовать "." 5 | #Использовать "./Моки" 6 | 7 | Функция ПолучитьПоделку() 8 | Поделка = Новый Поделка(); 9 | Поделка.ПросканироватьКаталог("tests/Классы"); 10 | Поделка.ДобавитьРогатку(Тип("МокРогатки")); 11 | Возврат Поделка; 12 | КонецФункции 13 | 14 | &Тест 15 | Процедура ПолучениеКомандыПоИмени() Экспорт 16 | 17 | // Дано 18 | 19 | Поделка = ПолучитьПоделку(); 20 | Поделка.ЗапуститьПриложение(); 21 | 22 | // Когда 23 | Команда = Поделка.НайтиЖелудь("КомандаСОпцией"); 24 | 25 | // Тогда 26 | Ожидаем.Что(Команда.Тест(), "Вызов метода команды").Равно(1); 27 | 28 | КонецПроцедуры 29 | 30 | &Тест 31 | Процедура ПолучениеМассиваКоманд() Экспорт 32 | 33 | // Дано 34 | 35 | Поделка = ПолучитьПоделку(); 36 | Поделка.ЗапуститьПриложение(); 37 | 38 | 39 | 40 | // Когда 41 | Команды = Поделка.НайтиЖелуди("КомандаПриложения"); 42 | 43 | // Тогда 44 | Ожидаем.Что(Команды, "Массив команда").ИмеетТип("ФиксированныйМассив"); 45 | Ожидаем.Что(Команды.Количество(), "Массив команд не пустой").Больше(0); 46 | 47 | КонецПроцедуры 48 | 49 | &Тест 50 | Процедура Опции_ВызовКомандыПривет() Экспорт 51 | // Дано 52 | 53 | Поделка = ПолучитьПоделку(); 54 | Поделка.ЗапуститьПриложение(); 55 | 56 | // Когда 57 | 58 | Команда = Поделка.НайтиЖелудь("КомандаСОпцией"); 59 | КонсольноеПриложение = Поделка.НайтиЖелудь("КонсольноеПриложение"); 60 | 61 | ПараметрыКоманды = Новый Массив(); 62 | ПараметрыКоманды.Добавить("hello"); 63 | ПараметрыКоманды.Добавить("-n"); 64 | ПараметрыКоманды.Добавить("Никита"); 65 | 66 | КонсольноеПриложение.Запустить(ПараметрыКоманды); 67 | 68 | // Тогда 69 | 70 | Ожидаем.Что(Команда.ИмяПользователя(), "Параметр передан в команду").Равно("Никита"); 71 | Ожидаем.Что(Команда.ТекстПриветствия, "Параметр передан в команду, и она выполнена").Равно("Привет Никита"); 72 | 73 | КонецПроцедуры 74 | 75 | &Тест 76 | Процедура Опции_ВызовКомандыПриветСДекоратором() Экспорт 77 | // Дано 78 | 79 | Поделка = ПолучитьПоделку(); 80 | Поделка.ЗапуститьПриложение(); 81 | 82 | // Когда 83 | 84 | Команда = Поделка.НайтиЖелудь("КомандаСОпциейИДекоратором"); 85 | КонсольноеПриложение = Поделка.НайтиЖелудь("КонсольноеПриложение"); 86 | 87 | ПараметрыКоманды = Новый Массив(); 88 | ПараметрыКоманды.Добавить("bye"); 89 | ПараметрыКоманды.Добавить("--name"); 90 | ПараметрыКоманды.Добавить("Никита"); 91 | 92 | КонсольноеПриложение.Запустить(ПараметрыКоманды); 93 | 94 | // Тогда 95 | 96 | Ожидаем.Что(Команда.ИмяПользователя(), "Параметр передан в команду").Равно("Никита"); 97 | Ожидаем.Что(Команда.ТекстПрощания, "Параметр передан в команду, и она выполнена").Равно("Пока Никита"); 98 | 99 | КонецПроцедуры 100 | 101 | &Тест 102 | Процедура Опции_ВызовКомандыИПроверкаПолученияПеременнойОкружения() Экспорт 103 | // Дано 104 | 105 | Поделка = ПолучитьПоделку(); 106 | Поделка.ЗапуститьПриложение(); 107 | УстановитьПеременнуюСреды("ENV_VAR_VALUE", "1"); 108 | 109 | // Когда 110 | 111 | Команда = Поделка.НайтиЖелудь("КомандаСПеременнойОкружения"); 112 | КонсольноеПриложение = Поделка.НайтиЖелудь("КонсольноеПриложение"); 113 | 114 | ПараметрыКоманды = Новый Массив(); 115 | ПараметрыКоманды.Добавить("testingenv"); 116 | 117 | КонсольноеПриложение.Запустить(ПараметрыКоманды); 118 | 119 | // Тогда 120 | 121 | Ожидаем.Что(Команда.Результат[0], "Параметр передан в команду").Равно("1"); 122 | 123 | КонецПроцедуры 124 | 125 | &Тест 126 | Процедура Опции_ВызовКомандыИПроверкаФлаговИЗначенияПоУмолчанию() Экспорт 127 | // Дано 128 | 129 | Поделка = ПолучитьПоделку(); 130 | Поделка.ЗапуститьПриложение(); 131 | 132 | // Когда 133 | 134 | Команда = Поделка.НайтиЖелудь("КомандаСФлагами"); 135 | КонсольноеПриложение = Поделка.НайтиЖелудь("КонсольноеПриложение"); 136 | 137 | ПараметрыКоманды = Новый Массив(); 138 | ПараметрыКоманды.Добавить("testingflag"); 139 | ПараметрыКоманды.Добавить("-t"); 140 | 141 | КонсольноеПриложение.Запустить(ПараметрыКоманды); 142 | 143 | // Тогда 144 | 145 | Ожидаем.Что(Команда.Результат[0], "Параметр истина передан в команду").Равно(Истина); 146 | Ожидаем.Что(Команда.Результат[1], "Параметр ложь передан в команду").Равно(Ложь); 147 | 148 | КонецПроцедуры 149 | 150 | &Тест 151 | Процедура Опции_ВызовКомандыИПроверкаТЧисло() Экспорт 152 | // Дано 153 | 154 | Поделка = ПолучитьПоделку(); 155 | Поделка.ЗапуститьПриложение(); 156 | 157 | // Когда 158 | 159 | Команда = Поделка.НайтиЖелудь("КомандаСЧислами"); 160 | КонсольноеПриложение = Поделка.НайтиЖелудь("КонсольноеПриложение"); 161 | 162 | ПараметрыКоманды = Новый Массив(); 163 | ПараметрыКоманды.Добавить("testingdigs"); 164 | ПараметрыКоманды.Добавить("-a"); 165 | ПараметрыКоманды.Добавить("1"); 166 | ПараметрыКоманды.Добавить("-b"); 167 | ПараметрыКоманды.Добавить("[-1]"); 168 | ПараметрыКоманды.Добавить("-c"); 169 | ПараметрыКоманды.Добавить("1.5"); 170 | ПараметрыКоманды.Добавить("-d"); 171 | ПараметрыКоманды.Добавить("10000"); 172 | 173 | КонсольноеПриложение.Запустить(ПараметрыКоманды); 174 | 175 | // Тогда 176 | 177 | Ожидаем.Что(Команда.Результат[0], "1").Равно(1); 178 | // TODO: Возможность ТЧисло в отрицательные числа 179 | // Ожидаем.Что(Команда.Результат[1], "-1").Равно(-1); 180 | Ожидаем.Что(Команда.Результат[2], "1.5").Равно(1.5); 181 | Ожидаем.Что(Команда.Результат[3], "10000").Равно(10000); 182 | 183 | КонецПроцедуры 184 | 185 | &Тест 186 | Процедура Опции_ВызовКомандыИПроверкаТДата() Экспорт 187 | // Дано 188 | 189 | Поделка = ПолучитьПоделку(); 190 | Поделка.ЗапуститьПриложение(); 191 | 192 | // Когда 193 | 194 | Команда = Поделка.НайтиЖелудь("КомандаСДатами"); 195 | КонсольноеПриложение = Поделка.НайтиЖелудь("КонсольноеПриложение"); 196 | 197 | ПараметрыКоманды = Новый Массив(); 198 | ПараметрыКоманды.Добавить("testingdate"); 199 | ПараметрыКоманды.Добавить("-a"); 200 | ПараметрыКоманды.Добавить("2023-04-13_05:30:01"); 201 | ПараметрыКоманды.Добавить("-b"); 202 | ПараметрыКоманды.Добавить("2023-04-13"); 203 | 204 | КонсольноеПриложение.Запустить(ПараметрыКоманды); 205 | 206 | // Тогда 207 | 208 | Ожидаем.Что(Команда.Результат[0], "дата1").Равно(Дата("20230413053001")); 209 | Ожидаем.Что(Команда.Результат[1], "дата2").Равно(Дата("20230413000000")); 210 | 211 | КонецПроцедуры 212 | 213 | &Тест 214 | Процедура Опции_ВызовКомандыИПроверкаТСтрока() Экспорт 215 | // Дано 216 | 217 | Поделка = ПолучитьПоделку(); 218 | Поделка.ЗапуститьПриложение(); 219 | 220 | // Когда 221 | 222 | Команда = Поделка.НайтиЖелудь("КомандаСоСтрокой"); 223 | КонсольноеПриложение = Поделка.НайтиЖелудь("КонсольноеПриложение"); 224 | 225 | ПараметрыКоманды = Новый Массив(); 226 | ПараметрыКоманды.Добавить("testingstring"); 227 | ПараметрыКоманды.Добавить("-a"); 228 | ПараметрыКоманды.Добавить("1"); 229 | 230 | КонсольноеПриложение.Запустить(ПараметрыКоманды); 231 | 232 | // Тогда 233 | 234 | Ожидаем.Что(Команда.Результат[0], "Строка").Равно("1"); 235 | 236 | КонецПроцедуры 237 | 238 | &Тест 239 | Процедура Опции_ВызовКомандыИПроверкаТМассивДат() Экспорт 240 | // Дано 241 | 242 | Поделка = ПолучитьПоделку(); 243 | Поделка.ЗапуститьПриложение(); 244 | 245 | // Когда 246 | 247 | Команда = Поделка.НайтиЖелудь("КомандаСМассивами"); 248 | КонсольноеПриложение = Поделка.НайтиЖелудь("КонсольноеПриложение"); 249 | 250 | ПараметрыКоманды = Новый Массив(); 251 | ПараметрыКоманды.Добавить("testingarray"); 252 | ПараметрыКоманды.Добавить("-a"); 253 | ПараметрыКоманды.Добавить("2023-04-13;2023-04-14"); 254 | 255 | КонсольноеПриложение.Запустить(ПараметрыКоманды); 256 | 257 | // Тогда 258 | 259 | Ожидаем.Что(Команда.МассивДат[0], "дата1").Равно(Дата("20230413000000")); 260 | Ожидаем.Что(Команда.МассивДат[1], "дата2").Равно(Дата("20230414000000")); 261 | 262 | КонецПроцедуры 263 | 264 | &Тест 265 | Процедура Опции_ВызовКомандыИПроверкаТМассивСтрок() Экспорт 266 | // Дано 267 | 268 | Поделка = ПолучитьПоделку(); 269 | Поделка.ЗапуститьПриложение(); 270 | 271 | // Когда 272 | 273 | Команда = Поделка.НайтиЖелудь("КомандаСМассивами"); 274 | КонсольноеПриложение = Поделка.НайтиЖелудь("КонсольноеПриложение"); 275 | 276 | ПараметрыКоманды = Новый Массив(); 277 | ПараметрыКоманды.Добавить("testingarray"); 278 | ПараметрыКоманды.Добавить("-b"); 279 | ПараметрыКоманды.Добавить("а;б"); 280 | 281 | КонсольноеПриложение.Запустить(ПараметрыКоманды); 282 | 283 | // Тогда 284 | 285 | Ожидаем.Что(Команда.МассивСтрок[0], "Строка1").Равно("а"); 286 | Ожидаем.Что(Команда.МассивСтрок[1], "Строка2").Равно("б"); 287 | 288 | КонецПроцедуры 289 | 290 | &Тест 291 | Процедура Опции_ВызовКомандыИПроверкаТМассивЧисел() Экспорт 292 | // Дано 293 | 294 | Поделка = ПолучитьПоделку(); 295 | Поделка.ЗапуститьПриложение(); 296 | 297 | // Когда 298 | 299 | Команда = Поделка.НайтиЖелудь("КомандаСМассивами"); 300 | КонсольноеПриложение = Поделка.НайтиЖелудь("КонсольноеПриложение"); 301 | 302 | ПараметрыКоманды = Новый Массив(); 303 | ПараметрыКоманды.Добавить("testingarray"); 304 | ПараметрыКоманды.Добавить("-c"); 305 | ПараметрыКоманды.Добавить("1;2"); 306 | 307 | КонсольноеПриложение.Запустить(ПараметрыКоманды); 308 | 309 | // Тогда 310 | 311 | Ожидаем.Что(Команда.МассивЧисел[0], "Число1").Равно(1); 312 | Ожидаем.Что(Команда.МассивЧисел[1], "Число2").Равно(2); 313 | 314 | КонецПроцедуры 315 | 316 | &Тест 317 | Процедура Опции_ВызовКомандыИПроверкаТПеречисление() Экспорт 318 | // Дано 319 | 320 | Поделка = ПолучитьПоделку(); 321 | Поделка.ЗапуститьПриложение(); 322 | 323 | // Когда 324 | 325 | Команда = Поделка.НайтиЖелудь("КомандаСПеречислением"); 326 | КонсольноеПриложение = Поделка.НайтиЖелудь("КонсольноеПриложение"); 327 | 328 | ПараметрыКоманды = Новый Массив(); 329 | ПараметрыКоманды.Добавить("testingenum"); 330 | ПараметрыКоманды.Добавить("-a"); 331 | ПараметрыКоманды.Добавить("green"); 332 | ПараметрыКоманды.Добавить("-b"); 333 | ПараметрыКоманды.Добавить("warning"); 334 | ПараметрыКоманды.Добавить("usrdir"); 335 | 336 | КонсольноеПриложение.Запустить(ПараметрыКоманды); 337 | 338 | // Тогда 339 | 340 | Ожидаем.Что(Команда.Результат[0]).Равно("Зеленый"); 341 | Ожидаем.Что(Команда.Результат[1]).Равно(1); 342 | Ожидаем.Что(Команда.Результат[2]).Равно("path/to/user/dir"); 343 | 344 | КонецПроцедуры 345 | 346 | &Тест 347 | Процедура Аргументы_ОдинАргументСтрокой() Экспорт 348 | // Дано 349 | 350 | Поделка = ПолучитьПоделку(); 351 | Поделка.ЗапуститьПриложение(); 352 | 353 | // Когда 354 | 355 | Команда = Поделка.НайтиЖелудь("КомандаСАргументом"); 356 | КонсольноеПриложение = Поделка.НайтиЖелудь("КонсольноеПриложение"); 357 | 358 | ПараметрыКоманды = Новый Массив(); 359 | ПараметрыКоманды.Добавить("agrfile"); 360 | ПараметрыКоманды.Добавить("/some/file.f"); 361 | 362 | КонсольноеПриложение.Запустить(ПараметрыКоманды); 363 | 364 | // Тогда 365 | 366 | Ожидаем.Что(Команда.Результат[0], "Аргумент передан в команду").Равно("/some/file.f"); 367 | 368 | КонецПроцедуры 369 | 370 | &Тест 371 | Процедура Аргументы_ДваАргумента() Экспорт 372 | // Дано 373 | 374 | Поделка = ПолучитьПоделку(); 375 | Поделка.ЗапуститьПриложение(); 376 | 377 | // Когда 378 | 379 | Команда = Поделка.НайтиЖелудь("КомандаСАргументами"); 380 | КонсольноеПриложение = Поделка.НайтиЖелудь("КонсольноеПриложение"); 381 | 382 | ПараметрыКоманды = Новый Массив(); 383 | ПараметрыКоманды.Добавить("argtwo"); 384 | ПараметрыКоманды.Добавить("/some/file.f"); 385 | ПараметрыКоманды.Добавить("read"); 386 | 387 | КонсольноеПриложение.Запустить(ПараметрыКоманды); 388 | 389 | // Тогда 390 | 391 | Ожидаем.Что(Команда.Результат[0], "Аргумент передан в команду").Равно("/some/file.f"); 392 | Ожидаем.Что(Команда.Результат[1], "Аргумент передан в команду").Равно("read"); 393 | 394 | КонецПроцедуры 395 | 396 | &Тест 397 | Процедура Подкоманды_ПерваяПодкоманда() Экспорт 398 | // Дано 399 | 400 | Поделка = ПолучитьПоделку(); 401 | Поделка.ЗапуститьПриложение(); 402 | 403 | // Когда 404 | 405 | Команда = Поделка.НайтиЖелудь("ПодкомандаПервая"); 406 | КонсольноеПриложение = Поделка.НайтиЖелудь("КонсольноеПриложение"); 407 | 408 | ПараметрыКоманды = Новый Массив(); 409 | ПараметрыКоманды.Добавить("subs"); 410 | ПараметрыКоманды.Добавить("subplus"); 411 | ПараметрыКоманды.Добавить("1"); 412 | 413 | КонсольноеПриложение.Запустить(ПараметрыКоманды); 414 | 415 | // Тогда 416 | 417 | Ожидаем.Что(Команда.Результат, "Аргумент передан в команду").Равно(2); 418 | 419 | КонецПроцедуры 420 | 421 | &Тест 422 | Процедура Подкоманды_ВтораяПодкоманда() Экспорт 423 | // Дано 424 | 425 | Поделка = ПолучитьПоделку(); 426 | Поделка.ЗапуститьПриложение(); 427 | 428 | // Когда 429 | 430 | Команда = Поделка.НайтиЖелудь("КастомнаяПодкоманда"); 431 | КонсольноеПриложение = Поделка.НайтиЖелудь("КонсольноеПриложение"); 432 | 433 | ПараметрыКоманды = Новый Массив(); 434 | ПараметрыКоманды.Добавить("subs"); 435 | ПараметрыКоманды.Добавить("subminus"); 436 | ПараметрыКоманды.Добавить("2"); 437 | 438 | КонсольноеПриложение.Запустить(ПараметрыКоманды); 439 | 440 | // Тогда 441 | 442 | Ожидаем.Что(Команда.Результат, "Аргумент передан в команду").Равно(1); 443 | 444 | КонецПроцедуры 445 | 446 | &Тест 447 | Процедура Опции_ВызовКомандыСИдентификатором() Экспорт 448 | // Дано 449 | 450 | Поделка = ПолучитьПоделку(); 451 | Поделка.ЗапуститьПриложение(); 452 | 453 | // Когда 454 | 455 | Команда = Поделка.НайтиЖелудь("КастомноеИмяКоманды"); 456 | КонсольноеПриложение = Поделка.НайтиЖелудь("КонсольноеПриложение"); 457 | 458 | ПараметрыКоманды = Новый Массив(); 459 | ПараметрыКоманды.Добавить("ident"); 460 | ПараметрыКоманды.Добавить("--name"); 461 | ПараметрыКоманды.Добавить("Никита"); 462 | 463 | КонсольноеПриложение.Запустить(ПараметрыКоманды); 464 | 465 | // Тогда 466 | 467 | Ожидаем.Что(Команда.ИмяПользователя(), "Параметр передан в команду").Равно("Никита"); 468 | Ожидаем.Что(Команда.ТекстПрощания, "Параметр передан в команду, и она выполнена").Равно("Пока Никита"); 469 | 470 | КонецПроцедуры 471 | 472 | &Тест 473 | Процедура ОбработкаЛегасиКоманд() Экспорт 474 | // Дано 475 | 476 | Поделка = ПолучитьПоделку(); 477 | Поделка.ЗапуститьПриложение(); 478 | 479 | // Когда 480 | 481 | КонсольноеПриложение = Поделка.НайтиЖелудь("КонсольноеПриложение"); 482 | Команда = Поделка.НайтиЖелудь("МояЛегасиКоманда"); 483 | 484 | ПараметрыКоманды = Новый Массив(); 485 | ПараметрыКоманды.Добавить("legacy"); 486 | ПараметрыКоманды.Добавить("-n"); 487 | ПараметрыКоманды.Добавить("Никита"); 488 | 489 | КонсольноеПриложение.Запустить(ПараметрыКоманды); 490 | 491 | // Тогда 492 | 493 | Ожидаем.Что(Команда.ИмяПользователя(), "Параметр передан в команду").Равно("Никита"); 494 | 495 | КонецПроцедуры 496 | 497 | &Тест 498 | Процедура Опции_ВызовКомандыСФлагомИАгрументом() Экспорт 499 | // Дано 500 | 501 | Поделка = ПолучитьПоделку(); 502 | Поделка.ЗапуститьПриложение(); 503 | 504 | // Когда 505 | 506 | Команда = Поделка.НайтиЖелудь("КомандаСАргументомИФлагом"); 507 | КонсольноеПриложение = Поделка.НайтиЖелудь("КонсольноеПриложение"); 508 | 509 | ПараметрыКоманды = Новый Массив(); 510 | ПараметрыКоманды.Добавить("argandflag"); 511 | ПараметрыКоманды.Добавить("-i"); 512 | ПараметрыКоманды.Добавить("dev"); 513 | 514 | КонсольноеПриложение.Запустить(ПараметрыКоманды); 515 | 516 | // Тогда 517 | 518 | Ожидаем.Что(Команда.Результат[0], "проверка аргумента").Равно("dev"); 519 | Ожидаем.Что(Команда.Результат[1], "проверка флага").Равно(Истина); 520 | 521 | КонецПроцедуры 522 | 523 | &Тест 524 | Процедура КомандаСМногострочнымиОписаниями() Экспорт 525 | 526 | // Дано 527 | 528 | Поделка = ПолучитьПоделку(); 529 | Поделка.ЗапуститьПриложение(); 530 | 531 | // Когда 532 | 533 | Команда = Поделка.НайтиЖелудь("КомандаСМногострочнымиОписаниями"); 534 | КонсольноеПриложение = Поделка.НайтиЖелудь("КонсольноеПриложение"); 535 | 536 | ПараметрыКоманды = Новый Массив(); 537 | ПараметрыКоманды.Добавить("multiline"); 538 | ПараметрыКоманды.Добавить("-o"); 539 | ПараметрыКоманды.Добавить("arg"); 540 | 541 | КонсольноеПриложение.Запустить(ПараметрыКоманды); 542 | 543 | // Тогда 544 | 545 | Ожидаем.Что(Команда.Результат[0], "проверка аргумента").Равно("arg"); 546 | Ожидаем.Что(Команда.Результат[1], "проверка флага").Равно(Истина); 547 | 548 | КонецПроцедуры -------------------------------------------------------------------------------- /tests/entrypoint.os: -------------------------------------------------------------------------------- 1 | #Использовать autumn 2 | #Использовать ".." 3 | #Использовать "." 4 | 5 | Поделка = Новый Поделка(); 6 | Поделка 7 | .ПросканироватьКаталог(ОбъединитьПути(ТекущийСценарий().Каталог, "Классы")) 8 | .ЗапуститьПриложение(); -------------------------------------------------------------------------------- /tests/Классы/ДубЛегасиКоманды.os: -------------------------------------------------------------------------------- 1 | 2 | &Дуб 3 | Процедура ПриСозданииОбъекта() 4 | 5 | КонецПроцедуры 6 | 7 | &Завязь 8 | &КомандаПриложения(Имя = "legacy", Описание = "Легаси команда, которая работает через дуб") 9 | Функция МояЛегасиКоманда() Экспорт 10 | Возврат Новый МояЛегасиКоманда(); 11 | КонецФункции -------------------------------------------------------------------------------- /tests/Классы/КомандаСАргументами.os: -------------------------------------------------------------------------------- 1 | &Аргумент(Имя = "FILE", Описание = "Значение файл") 2 | &ТСтрока 3 | Перем Файл; 4 | 5 | &Аргумент(Имя = "OPERATION", Описание = "Значение вид операции") 6 | &ТСтрока 7 | Перем ВидОперации; 8 | 9 | Перем Результат Экспорт; 10 | 11 | &КомандаПриложения(Имя = "argtwo") 12 | Процедура ПриСозданииОбъекта() 13 | Результат = Новый Массив(); 14 | КонецПроцедуры 15 | 16 | &ВыполнениеКоманды 17 | Процедура СформироватьРезультат() Экспорт 18 | 19 | Результат.Добавить(Файл); 20 | Результат.Добавить(ВидОперации); 21 | 22 | КонецПроцедуры 23 | -------------------------------------------------------------------------------- /tests/Классы/КомандаСАргументом.os: -------------------------------------------------------------------------------- 1 | &Аргумент(Имя = "FILE", Описание = "Значение файл") 2 | &ТСтрока 3 | Перем Файл; 4 | 5 | Перем Результат Экспорт; 6 | 7 | &КомандаПриложения(Имя = "agrfile") 8 | Процедура ПриСозданииОбъекта() 9 | Результат = Новый Массив(); 10 | КонецПроцедуры 11 | 12 | &ВыполнениеКоманды 13 | Процедура СформироватьРезультат() Экспорт 14 | 15 | Результат.Добавить(Файл); 16 | 17 | КонецПроцедуры 18 | -------------------------------------------------------------------------------- /tests/Классы/КомандаСАргументомИФлагом.os: -------------------------------------------------------------------------------- 1 | &Аргумент(Имя = "VERSION", Описание = "Используемая версия OneScript. Допустимо использовать трехномерные версии (1.0.17, 1.0.18), stable, dev") 2 | &ВОкружении("OVM_USE_VERSION") 3 | &ТСтрока 4 | Перем ИспользуемаяВерсия; 5 | 6 | &Опция(Имя = "install i", Описание = "Выполнять установку требуемой версии в случае ее отсутствия") 7 | &Флаг 8 | &ПоУмолчанию(Ложь) 9 | &ВОкружении("OVM_USE_INSTALL") 10 | Перем ВыполнятьУстановкуПриНеобходимости; 11 | 12 | Перем Результат Экспорт; 13 | 14 | &КомандаПриложения(Имя = "argandflag") 15 | Процедура ПриСозданииОбъекта() 16 | Результат = Новый Массив(); 17 | КонецПроцедуры 18 | 19 | &ВыполнениеКоманды 20 | Процедура СформироватьРезультат() Экспорт 21 | 22 | Результат.Добавить(ИспользуемаяВерсия); 23 | Результат.Добавить(ВыполнятьУстановкуПриНеобходимости); 24 | 25 | КонецПроцедуры 26 | -------------------------------------------------------------------------------- /tests/Классы/КомандаСДатами.os: -------------------------------------------------------------------------------- 1 | &Опция(Имя = "a", Описание = "Дата без формата") 2 | &ТДата 3 | Перем Дата1; 4 | 5 | &Опция(Имя = "b", Описание = "Дата с форматом") 6 | &ТДата("yyyy-MM-dd") 7 | Перем Дата2; 8 | 9 | Перем Результат Экспорт; 10 | 11 | &КомандаПриложения(Имя = "testingdate") 12 | Процедура ПриСозданииОбъекта() 13 | Результат = Новый Массив(); 14 | КонецПроцедуры 15 | 16 | &ВыполнениеКоманды 17 | Процедура СформироватьРезультат() Экспорт 18 | 19 | Результат.Добавить(Дата1); 20 | Результат.Добавить(Дата2); 21 | 22 | КонецПроцедуры 23 | -------------------------------------------------------------------------------- /tests/Классы/КомандаСИдентификатором.os: -------------------------------------------------------------------------------- 1 | &Опция(Имя = "n name", ЗначениеПоУмолчанию = "noname", Описание = "Имя пользователя") 2 | Перем ИмяПользователя; 3 | 4 | Перем ТекстПрощания Экспорт; 5 | 6 | &КомандаПриложения(Имя = "ident", Идентификатор = "КастомноеИмяКоманды") 7 | Процедура ПриСозданииОбъекта() 8 | 9 | КонецПроцедуры 10 | 11 | &ВыполнениеКоманды 12 | Процедура СформироватьТекстПрощания() Экспорт 13 | 14 | ТекстПрощания = "Пока " + ИмяПользователя; 15 | 16 | КонецПроцедуры 17 | 18 | Функция ИмяПользователя() Экспорт 19 | Возврат ИмяПользователя; 20 | КонецФункции 21 | -------------------------------------------------------------------------------- /tests/Классы/КомандаСМассивами.os: -------------------------------------------------------------------------------- 1 | &Опция(Имя = "a", Описание = "Массив дат") 2 | &ТМассивДат(ФорматДаты = "yyyy-MM-dd", ВходящийРазделительМассива = ";") 3 | Перем МассивДат Экспорт; 4 | 5 | &Опция(Имя = "b", Описание = "Массив строк") 6 | &ТМассивСтрок(";") 7 | Перем МассивСтрок Экспорт; 8 | 9 | &Опция(Имя = "c", Описание = "Массив чисел") 10 | &ТМассивЧисел(";") 11 | Перем МассивЧисел Экспорт; 12 | 13 | &КомандаПриложения(Имя = "testingarray") 14 | Процедура ПриСозданииОбъекта() 15 | 16 | КонецПроцедуры 17 | 18 | &ВыполнениеКоманды 19 | Процедура СформироватьРезультат() Экспорт 20 | 21 | КонецПроцедуры 22 | -------------------------------------------------------------------------------- /tests/Классы/КомандаСМногострочнымиОписаниями.os: -------------------------------------------------------------------------------- 1 | &Аргумент( 2 | Имя = "ARG", 3 | Описание = 4 | "Я 5 | | аргумент с многострочным 6 | | описанием" 7 | ) 8 | &ТСтрока 9 | Перем Аргумент; 10 | 11 | &Опция( 12 | Имя = "option o", 13 | Описание = 14 | "Я 15 | | опция с многострочным 16 | | описанием" 17 | ) 18 | &Флаг 19 | Перем Опция; 20 | 21 | Перем Результат Экспорт; 22 | 23 | &КомандаПриложения( 24 | Имя = "multiline", 25 | Описание = 26 | "Я 27 | | команда с многострочным 28 | | описанием" 29 | ) 30 | Процедура ПриСозданииОбъекта() 31 | Результат = Новый Массив(); 32 | КонецПроцедуры 33 | 34 | &ВыполнениеКоманды 35 | Процедура СформироватьРезультат() Экспорт 36 | 37 | Результат.Добавить(Аргумент); 38 | Результат.Добавить(Опция); 39 | 40 | КонецПроцедуры 41 | -------------------------------------------------------------------------------- /tests/Классы/КомандаСОпцией.os: -------------------------------------------------------------------------------- 1 | 2 | &Опция(Имя = "n name", ЗначениеПоУмолчанию = "noname", Описание = "Имя пользователя") 3 | Перем ИмяПользователя; 4 | 5 | Перем ТекстПриветствия Экспорт; 6 | 7 | &КомандаПриложения(Имя = "hello") 8 | Процедура ПриСозданииОбъекта() 9 | 10 | КонецПроцедуры 11 | 12 | Функция Тест() Экспорт 13 | Возврат 1; 14 | КонецФункции 15 | 16 | Процедура СформироватьТекстПриветствия() 17 | 18 | ТекстПриветствия = "Привет " + ИмяПользователя; 19 | 20 | КонецПроцедуры 21 | 22 | Функция ИмяПользователя() Экспорт 23 | Возврат ИмяПользователя; 24 | КонецФункции 25 | 26 | Процедура ОписаниеКоманды(КомандаПриложения) Экспорт 27 | 28 | КомандаПриложения.Опция("n name", "", "Имя пользователя"); 29 | 30 | КонецПроцедуры 31 | 32 | Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт 33 | 34 | ИмяПользователя = КомандаПриложения.ЗначениеОпции("name"); 35 | 36 | СформироватьТекстПриветствия(); 37 | 38 | КонецПроцедуры 39 | 40 | 41 | -------------------------------------------------------------------------------- /tests/Классы/КомандаСОпциейИДекоратором.os: -------------------------------------------------------------------------------- 1 | &Опция(Имя = "n name", ЗначениеПоУмолчанию = "noname", Описание = "Имя пользователя") 2 | Перем ИмяПользователя; 3 | 4 | Перем ТекстПрощания Экспорт; 5 | 6 | &КомандаПриложения(Имя = "bye") 7 | Процедура ПриСозданииОбъекта() 8 | 9 | КонецПроцедуры 10 | 11 | &ВыполнениеКоманды 12 | Процедура СформироватьТекстПрощания() Экспорт 13 | 14 | ТекстПрощания = "Пока " + ИмяПользователя; 15 | 16 | КонецПроцедуры 17 | 18 | Функция ИмяПользователя() Экспорт 19 | Возврат ИмяПользователя; 20 | КонецФункции 21 | -------------------------------------------------------------------------------- /tests/Классы/КомандаСПеременнойОкружения.os: -------------------------------------------------------------------------------- 1 | &Опция(Имя = "e env", Описание = "Значение переменной окружения") 2 | &ВОкружении("ENV_VAR_VALUE") 3 | Перем ВОкружении; 4 | 5 | Перем Результат Экспорт; 6 | 7 | &КомандаПриложения(Имя = "testingenv") 8 | Процедура ПриСозданииОбъекта() 9 | Результат = Новый Массив(); 10 | КонецПроцедуры 11 | 12 | &ВыполнениеКоманды 13 | Процедура СформироватьРезультат() Экспорт 14 | 15 | Результат.Добавить(ВОкружении); 16 | 17 | КонецПроцедуры 18 | -------------------------------------------------------------------------------- /tests/Классы/КомандаСПеречислением.os: -------------------------------------------------------------------------------- 1 | &Опция(Имя = "a", Описание = "Цвет") 2 | &ТПеречисление 3 | &Перечисление( 4 | Имя = "green", 5 | Значение = "Зеленый", 6 | Описание = "Консоль будет зеленого цвета" 7 | ) 8 | &Перечисление( 9 | Имя = "red", 10 | Значение = "Красный" 11 | ) 12 | &Перечисление(Имя = "default") 13 | Перем Цвет; 14 | 15 | &Опция(Имя = "b", Описание = "Статус") 16 | &ТПеречисление 17 | &Перечисление( 18 | Имя = "success", 19 | Значение = 0, 20 | Описание = "Успех" 21 | ) 22 | &Перечисление( 23 | Имя = "warning", 24 | Значение = 1, 25 | Описание = "Предупреждение" 26 | ) 27 | &Перечисление( 28 | Имя = "error", 29 | Значение = 2, 30 | Описание = "Ошибка" 31 | ) 32 | Перем Статус; 33 | 34 | &Аргумент(Имя = "ARG", Описание = "Аргумент") 35 | &ТПеречисление 36 | &Перечисление(Имя = "sysdir", Значение = "path/to/system/dir", Описание = "Системный каталог") 37 | &Перечисление(Имя = "usrdir", Значение = "path/to/user/dir", Описание = "Пользовательский каталог") 38 | Перем Каталог; 39 | 40 | Перем Результат Экспорт; 41 | 42 | &КомандаПриложения(Имя = "testingenum") 43 | Процедура ПриСозданииОбъекта() 44 | Результат = Новый Массив(); 45 | КонецПроцедуры 46 | 47 | &ВыполнениеКоманды 48 | Процедура СформироватьРезультат() Экспорт 49 | 50 | Результат.Добавить(Цвет); 51 | Результат.Добавить(Статус); 52 | Результат.Добавить(Каталог); 53 | 54 | КонецПроцедуры 55 | -------------------------------------------------------------------------------- /tests/Классы/КомандаСПодкомандами.os: -------------------------------------------------------------------------------- 1 | 2 | &КомандаПриложения(Имя = "subs", 3 | Подкоманда = "ПодкомандаПервая", 4 | Подкоманда = "КастомнаяПодкоманда", 5 | ) 6 | Процедура ПриСозданииОбъекта() 7 | 8 | КонецПроцедуры 9 | 10 | &ВыполнениеКоманды 11 | Процедура СформироватьТекстПрощания() Экспорт 12 | 13 | КонецПроцедуры 14 | -------------------------------------------------------------------------------- /tests/Классы/КомандаСФлагами.os: -------------------------------------------------------------------------------- 1 | &Опция(Имя = "t flagtrue", Описание = "Значение - флаг - истина") 2 | &Флаг 3 | Перем ФлагИстина; 4 | 5 | &Опция(Имя = "f flagfalse", Описание = "Значение - флаг - ложь") 6 | &Флаг 7 | &ПоУмолчанию(Ложь) 8 | Перем ФлагЛожь; 9 | 10 | Перем Результат Экспорт; 11 | 12 | &КомандаПриложения(Имя = "testingflag") 13 | Процедура ПриСозданииОбъекта() 14 | Результат = Новый Массив(); 15 | КонецПроцедуры 16 | 17 | &ВыполнениеКоманды 18 | Процедура СформироватьРезультат() Экспорт 19 | 20 | Результат.Добавить(ФлагИстина); 21 | Результат.Добавить(ФлагЛожь); 22 | 23 | КонецПроцедуры 24 | -------------------------------------------------------------------------------- /tests/Классы/КомандаСЧислами.os: -------------------------------------------------------------------------------- 1 | &Опция(Имя = "a", Описание = "Число 1") 2 | &ТЧисло 3 | Перем Число1; 4 | 5 | &Опция(Имя = "b", Описание = "Число -1") 6 | &ТЧисло 7 | Перем Число2; 8 | 9 | &Опция(Имя = "c", Описание = "Число 1.5") 10 | &ТЧисло 11 | Перем Число3; 12 | 13 | &Опция(Имя = "d", Описание = "Число 10000") 14 | &ТЧисло 15 | Перем Число4; 16 | 17 | Перем Результат Экспорт; 18 | 19 | &КомандаПриложения(Имя = "testingdigs") 20 | Процедура ПриСозданииОбъекта() 21 | Результат = Новый Массив(); 22 | КонецПроцедуры 23 | 24 | &ВыполнениеКоманды 25 | Процедура СформироватьРезультат() Экспорт 26 | 27 | Результат.Добавить(Число1); 28 | Результат.Добавить(Число2); 29 | Результат.Добавить(Число3); 30 | Результат.Добавить(Число4); 31 | 32 | КонецПроцедуры 33 | -------------------------------------------------------------------------------- /tests/Классы/КомандаСоСтрокой.os: -------------------------------------------------------------------------------- 1 | &Опция(Имя = "a", Описание = "Дата без формата") 2 | &ТСтрока 3 | Перем Строка; 4 | 5 | Перем Результат Экспорт; 6 | 7 | &КомандаПриложения(Имя = "testingstring") 8 | Процедура ПриСозданииОбъекта() 9 | Результат = Новый Массив(); 10 | КонецПроцедуры 11 | 12 | &ВыполнениеКоманды 13 | Процедура СформироватьРезультат() Экспорт 14 | 15 | Результат.Добавить(Строка); 16 | 17 | КонецПроцедуры 18 | -------------------------------------------------------------------------------- /tests/Классы/МояЛегасиКоманда.os: -------------------------------------------------------------------------------- 1 | Перем ИмяПользователя; 2 | 3 | Процедура ПриСозданииОбъекта() 4 | 5 | КонецПроцедуры 6 | 7 | Функция ИмяПользователя() Экспорт 8 | Возврат ИмяПользователя; 9 | КонецФункции 10 | 11 | Процедура ОписаниеКоманды(Знач КомандаПриложения) Экспорт 12 | 13 | КомандаПриложения.Опция("n name", "", "Имя пользователя"); 14 | 15 | КонецПроцедуры 16 | 17 | Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт 18 | 19 | ИмяПользователя = КомандаПриложения.ЗначениеОпции("name"); 20 | 21 | КонецПроцедуры -------------------------------------------------------------------------------- /tests/Классы/ПодкомандаВторая.os: -------------------------------------------------------------------------------- 1 | &Аргумент(Имя = "ARG", Описание = "Значение числа") 2 | &ТЧисло 3 | Перем ПереданноеЧисло; 4 | 5 | Перем Результат Экспорт; 6 | 7 | &ПодкомандаПриложения(Имя = "subminus", Идентификатор = "КастомнаяПодкоманда") 8 | Процедура ПриСозданииОбъекта() 9 | 10 | КонецПроцедуры 11 | 12 | &ВыполнениеКоманды 13 | Процедура СформироватьРезультат() Экспорт 14 | 15 | Результат = ПереданноеЧисло - 1; 16 | 17 | КонецПроцедуры 18 | -------------------------------------------------------------------------------- /tests/Классы/ПодкомандаПервая.os: -------------------------------------------------------------------------------- 1 | &Аргумент(Имя = "ARG", Описание = "Значение числа") 2 | &ТЧисло 3 | Перем ПереданноеЧисло; 4 | 5 | Перем Результат Экспорт; 6 | 7 | &ПодкомандаПриложения(Имя = "subplus") 8 | Процедура ПриСозданииОбъекта() 9 | 10 | КонецПроцедуры 11 | 12 | &ВыполнениеКоманды 13 | Процедура СформироватьРезультат() Экспорт 14 | 15 | Результат = ПереданноеЧисло + 1; 16 | 17 | КонецПроцедуры 18 | -------------------------------------------------------------------------------- /tests/Моки/Классы/МокРогатки.os: -------------------------------------------------------------------------------- 1 | &Рогатка("ИКС_Рогатка") 2 | &Верховный 3 | Процедура ПриСозданииОбъекта() 4 | 5 | КонецПроцедуры 6 | 7 | Процедура ПриЗапускеПриложения() Экспорт 8 | 9 | КонецПроцедуры --------------------------------------------------------------------------------