You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

316 lines
22 KiB

4 years ago
  1. # Command-Option-Argument
  2. [![build status](https://secure.travis-ci.org/veged/coa.png)](http://travis-ci.org/veged/coa)
  3. ## Что это?
  4. COA — парсер параметров командной строки, позволяющий извлечь максимум пользы от формального API вашей программы.
  5. Как только вы опишете определение в терминах команд, параметров и аргументов, вы автоматически получите:
  6. * Справку для командной строки
  7. * API для использования программы как модуля в COA-совместимых программах
  8. * Автодополнение для командной строки
  9. ### Прочие возможности
  10. * Широкий выбор настроек для параметров и аргументов, включая множественные значения, логические значения и обязательность параметров
  11. * Возможность асинхронного исполнения команд, используя промисы (используется библиотека [Q](https://github.com/kriskowal/q))
  12. * Простота использования существующих команд как подмодулей для новых команд
  13. * Комбинированная валидация и анализ сложных значений
  14. ## Примеры
  15. ````javascript
  16. require('coa').Cmd() // декларация команды верхнего уровня
  17. .name(process.argv[1]) // имя команды верхнего уровня, берем из имени программы
  18. .title('Жутко полезная утилита для командной строки') // название для использования в справке и сообщениях
  19. .helpful() // добавляем поддержку справки командной строки (-h, --help)
  20. .opt() // добавляем параметр
  21. .name('version') // имя параметра для использования в API
  22. .title('Version') // текст для вывода в сообщениях
  23. .short('v') // короткое имя параметра: -v
  24. .long('version') // длинное имя параметра: --version
  25. .flag() // параметр не требует ввода значения
  26. .act(function(opts) { // действия при вызове аргумента
  27. // результатом является вывод текстового сообщения
  28. return JSON.parse(require('fs').readFileSync(__dirname + '/package.json'))
  29. .version;
  30. })
  31. .end() // завершаем определение параметра и возвращаемся к определению верхнего уровня
  32. .cmd().name('subcommand').apply(require('./subcommand').COA).end() // загрузка подкоманды из модуля
  33. .cmd() // добавляем еще одну подкоманду
  34. .name('othercommand').title('Еще одна полезная подпрограмма').helpful()
  35. .opt()
  36. .name('input').title('input file, required')
  37. .short('i').long('input')
  38. .val(function(v) { // функция-валидатор, также может использоваться для трансформации значений параметров
  39. return require('fs').createReadStream(v) })
  40. .req() // параметр является обязательным
  41. .end() // завершаем определение параметра и возвращаемся к определению команды
  42. .end() // завершаем определение подкоманды и возвращаемся к определению команды верхнего уровня
  43. .run(process.argv.slice(2)); // разбираем process.argv и запускаем
  44. ````
  45. ````javascript
  46. // subcommand.js
  47. exports.COA = function() {
  48. this
  49. .title('Полезная подпрограмма').helpful()
  50. .opt()
  51. .name('output').title('output file')
  52. .short('o').long('output')
  53. .output() // использовать стандартную настройку для параметра вывода
  54. .end()
  55. };
  56. ````
  57. ## API
  58. ### Cmd
  59. Команда — сущность верхнего уровня. У команды могут быть определены параметры и аргументы.
  60. #### Cmd.api
  61. Возвращает объект, который можно использовать в других программах. Подкоманды являются методами этого объекта.<br>
  62. **@returns** *{Object}*
  63. #### Cmd.name
  64. Определяет канонический идентификатор команды, используемый в вызовах API.<br>
  65. **@param** *String* `_name` имя команды<br>
  66. **@returns** *COA.Cmd* `this` экземпляр команды (для поддержки цепочки методов)
  67. #### Cmd.title
  68. Определяет название команды, используемый в текстовых сообщениях.<br>
  69. **@param** *String* `_title` название команды<br>
  70. **@returns** *COA.Cmd* `this` экземпляр команды (для поддержки цепочки методов)
  71. #### Cmd.cmd
  72. Создает новую подкоманду или добавляет ранее определенную подкоманду к текущей команде.<br>
  73. **@param** *COA.Cmd* `[cmd]` экземпляр ранее определенной подкоманды<br>
  74. **@returns** *COA.Cmd* экземпляр новой или ранее определенной подкоманды
  75. #### Cmd.opt
  76. Создает параметр для текущей команды.<br>
  77. **@returns** *COA.Opt* `new` экземпляр параметра
  78. #### Cmd.arg
  79. Создает аргумент для текущей команды.<br>
  80. **@returns** *COA.Opt* `new` экземпляр аргумента
  81. #### Cmd.act
  82. Добавляет (или создает) действие для текущей команды.<br>
  83. **@param** *Function* `act` функция,
  84. выполняемая в контексте экземпляра текущей команды
  85. и принимающая следующие параметры:<br>
  86. - *Object* `opts` параметры команды<br>
  87. - *Array* `args` аргументы команды<br>
  88. - *Object* `res` объект-аккумулятор результатов<br>
  89. Функция может вернуть проваленный промис из Cmd.reject (в случае ошибки)
  90. или любое другое значение, рассматриваемое как результат.<br>
  91. **@param** *{Boolean}* [force=false] флаг, назначающий немедленное исполнение вместо добавления к списку существующих действий<br>
  92. **@returns** *COA.Cmd* `this` экземпляр команды (для поддержки цепочки методов)
  93. #### Cmd.apply
  94. Исполняет функцию с переданными аргументами в контексте экземпляра текущей команды.<br>
  95. **@param** *Function* `fn`<br>
  96. **@param** *Array* `args`<br>
  97. **@returns** *COA.Cmd* `this` экземпляр команды (для поддержки цепочки методов)
  98. #### Cmd.comp
  99. Назначает кастомную функцию автодополнения для текущей команды.<br>
  100. **@param** *Function* `fn` функция-генератор автодополнения,
  101. исполняемая в контексте текущей команды.
  102. Принимает параметры:<br>
  103. - *Object* `opts` параметры<br>
  104. Может возвращать промис или любое другое значение, рассматриваемое как результат исполнения команды.<br>
  105. **@returns** *COA.Cmd* `this` экземпляр команды (для поддержки цепочки методов)
  106. #### Cmd.helpful
  107. Ставит флаг поддержки справки командной строки, т.е. вызов команды с параметрами -h --help выводит справку по работе с командой.<br>
  108. **@returns** *COA.Cmd* `this` экземпляр команды (для поддержки цепочки методов)
  109. #### Cmd.completable
  110. Добавляет поддержку автодополнения командной строки. Добавляется подкоманда "completion", которая выполняет все необходимые действия.<br>
  111. Может быть добавлен только для главной команды.<br>
  112. **@returns** *COA.Cmd* `this` экземпляр команды (для поддержки цепочки методов)
  113. #### Cmd.usage
  114. Возвращает текст справки по использованию команды для текущего экземпляра.<br>
  115. **@returns** *String* `usage` Текст справки по использованию
  116. #### Cmd.run
  117. Разбирает аргументы из значения, возвращаемого NodeJS process.argv,
  118. и запускает текущую программу, т.е. вызывает process.exit после завершения
  119. всех действий.<br>
  120. **@param** *Array* `argv`<br>
  121. **@returns** *COA.Cmd* `this` экземпляр команды (для поддержки цепочки методов)
  122. #### Cmd.invoke
  123. Исполняет переданную (или текущую) команду с указанными параметрами и аргументами.<br>
  124. **@param** *String|Array* `cmds` подкоманда для исполнения (необязательно)<br>
  125. **@param** *Object* `opts` параметры, передаваемые команде (необязательно)<br>
  126. **@param** *Object* `args` аргументы, передаваемые команде (необязательно)<br>
  127. **@returns** *Q.Promise*
  128. #### Cmd.reject
  129. Проваливает промисы, возращенные в действиях.<br>
  130. Используется в .act() для возврата с ошибкой.<br>
  131. **@param** *Object* `reason` причина провала<br>
  132. Вы можете определить метод toString() и свойство toString()
  133. объекта причины провала.<br>
  134. **@returns** *Q.promise* проваленный промис
  135. #### Cmd.end
  136. Завершает цепочку методов текущей подкоманды и возвращает экземпляр родительской команды.<br>
  137. **@returns** *COA.Cmd* `parent` родительская команда
  138. ### Opt
  139. Параметр — именованная сущность. У параметра может быть определено короткое или длинное имя для использования из командной строки.<br>
  140. **@namespace**<br>
  141. **@class** Переданный параметр
  142. #### Opt.name
  143. Определяет канонический идентификатор параметра, используемый в вызовах API.<br>
  144. **@param** *String* `_name` имя параметра<br>
  145. **@returns** *COA.Opt* `this` экземпляр параметра (для поддержки цепочки методов)
  146. #### Opt.title
  147. Определяет описание для параметра, используемое в текстовых сообщениях.<br>
  148. **@param** *String* `_title` название параметра<br>
  149. **@returns** *COA.Opt* `this` экземпляр параметра (для поддержки цепочки методов)
  150. #### Opt.short
  151. Назначает ключ для короткого имени параметра, передаваемого из командной строки с одинарным дефисом (например, `-v`).<br>
  152. **@param** *String* `_short`<br>
  153. **@returns** *COA.Opt* `this` экземпляр параметра (для поддержки цепочки методов)
  154. #### Opt.long
  155. Назначает ключ для длинного имени параметра, передаваемого из командной строки с двойным дефисом (например, `--version`).<br>
  156. **@param** *String* `_long`<br>
  157. **@returns** *COA.Opt* `this` экземпляр параметра (для поддержки цепочки методов)
  158. #### Opt.flag
  159. Помечает параметр как логический, т.е. параметр не имеющий значения.<br>
  160. **@returns** *COA.Opt* `this` экземпляр параметра (для поддержки цепочки методов)
  161. #### Opt.arr
  162. Помечает параметр как принимающий множественные значения.<br>
  163. Иначе будет использовано последнее переданное значение параметра.<br>
  164. **@returns** *COA.Opt* `this` экземпляр параметра (для поддержки цепочки методов)
  165. #### Opt.req
  166. Помечает параметр как обязательный.<br>
  167. **@returns** *COA.Opt* `this` экземпляр параметра (для поддержки цепочки методов)
  168. #### Opt.only
  169. Интерпретирует параметр как команду,
  170. т.е. программа будет завершена сразу после выполнения параметра.<br>
  171. **@returns** *COA.Opt* `this` экземпляр параметра (для поддержки цепочки методов)
  172. #### Opt.val
  173. Назначает функцию валидации (или трансформации значения) для значения параметра.<br>
  174. Значение, полученное из командной строки, передается в функцию-валидатор прежде чем оно станет доступно из API.<br>
  175. Используется для валидации и трансформации введенных данных.<br>
  176. **@param** *Function* `_val` функция валидации,
  177. исполняемая в контексте экземпляра параметра
  178. и принимающая в качестве единственного параметра значение, полученное
  179. из командной строки<br>
  180. **@returns** *COA.Opt* `this` экземпляр параметра (для поддержки цепочки методов)
  181. #### Opt.def
  182. Назначает значение параметра по умолчанию. Это значение также передается
  183. в функцию валидации как обычное значение.<br>
  184. **@param** *Object* `_def`<br>
  185. **@returns** *COA.Opt* `this` экземпляр параметра (для поддержки цепочки методов)
  186. #### Opt.input
  187. Помечает параметр как принимающий ввод пользователя. <br>
  188. Позволяет использовать валидацию для STDIN.<br>
  189. **@returns** *{COA.Opt}* `this` экземпляр параметра (для поддержки цепочки методов)
  190. #### Opt.output
  191. Помечает параметр как вывод.<br>
  192. Позволяет использовать валидацию для STDOUT.<br>
  193. **@returns** *COA.Opt* `this` экземпляр параметра (для поддержки цепочки методов)
  194. #### Opt.act
  195. Добавляет (или создает) действие для текущего параметра команды.
  196. Это действие будет выполнено, если текущий параметр есть
  197. в списке полученных параметров (с любым значением).<br>
  198. **@param** *Function* `act` функция, выполняемая в контексте
  199. экземпляра текущей команды и принимающая следующие параметры:<br>
  200. - *Object* `opts` параметры команды<br>
  201. - *Array* `args` аргументы команды<br>
  202. - *Object* `res` объект-аккумулятор результатов<br>
  203. Функция может вернуть проваленный промис из Cmd.reject (в случае ошибки)
  204. или любое другое значение, рассматриваемое как результат.<br>
  205. **@returns** *COA.Opt* `this` экземпляр параметра (для поддержки цепочки методов)
  206. #### Opt.comp
  207. Назначает кастомную функцию автодополнения для текущей команды.<br>
  208. **@param** *Function* `fn` функция-генератор автодоплнения, исполняемая в
  209. контексте экземпляра команды.
  210. Принимает параметры:<br>
  211. - *Object* `opts` параметры автодополнения<br>
  212. Может возвращать промис или любое другое значение, рассматриваемое как результат исполнения команды.<br>
  213. **@returns** *COA.Opt* `this` экземпляр параметра (для поддержки цепочки методов)
  214. #### Opt.end
  215. Завершает цепочку методов текущего параметра и возвращает экземпляр родительской команды.<br>
  216. **@returns** *COA.Cmd* `parent` родительская команда
  217. ### Arg
  218. Аргумент — неименованная сущность.<br>
  219. Аргументы передаются из командной строки как список неименованных значений.
  220. #### Arg.name
  221. Определяет канонический идентификатор аргумента, используемый в вызовах API.<br>
  222. **@param** *String* `_name` имя аргумента<br>
  223. **@returns** *COA.Arg* `this` экземпляр аргумента (для поддержки цепочки методов)
  224. #### Arg.title
  225. Определяет описание для аргумента, используемое в текстовых сообщениях.<br>
  226. **@param** *String* `_title` описание аргумента<br>
  227. **@returns** *COA.Arg* `this` экземпляр аргумента (для поддержки цепочки методов)
  228. #### Arg.arr
  229. Помечает аргумент как принимающий множественные значения.<br>
  230. Иначе будет использовано последнее переданное значение аргумента.<br>
  231. **@returns** *COA.Arg* `this` экземпляр аргумента (для поддержки цепочки методов)
  232. #### Arg.req
  233. Помечает аргумент как обязательный.<br>
  234. **@returns** *COA.Arg* `this` экземпляр аргумента (для поддержки цепочки методов)
  235. #### Arg.val
  236. Назначает функцию валидации (или трансформации значения) для аргумента.<br>
  237. Значение, полученное из командной строки, передается в функцию-валидатор прежде чем оно станет доступно из API.<br>
  238. Используется для валидации и трансформации введенных данных.<br>
  239. **@param** *Function* `_val` функция валидации,
  240. исполняемая в контексте экземпляра аргумента
  241. и принимающая в качестве единственного параметра значение, полученное
  242. из командной строки<br>
  243. **@returns** *COA.Opt* `this` экземпляр аргумента (для поддержки цепочки методов)
  244. #### Arg.def
  245. Назначает дефолтное значение для аргумента. Дефолтное значение передается
  246. в функцию валидации как обычное значение.<br>
  247. **@param** *Object* `_def`<br>
  248. **@returns** *COA.Arg* `this` экземпляр аргумента (для поддержки цепочки методов)
  249. #### Arg.output
  250. Помечает параметр как вывод.<br>
  251. Позволяет назначить валидацию для STDOUT.<br>
  252. **@returns** *COA.Arg* `this` экземпляр аргумента (для поддержки цепочки методов)
  253. #### Arg.comp
  254. Назначает кастомную функцию автодополнения для текущего аргумента.<br>
  255. **@param** *Function* `fn` функция-генератор автодоплнения,
  256. исполняемая в контексте текущей команды.
  257. Принимает параметры:<br>
  258. - *Object* `opts` параметры
  259. Может возвращать промис или любое другое значение, рассматриваемое как результат исполнения команды.<br>
  260. **@returns** *COA.Arg* `this` экземпляр аргумента (для поддержки цепочки методов)
  261. #### Arg.end
  262. Завершает цепочку методов текущего аргумента и возвращает экземпляр родительской команды.<br>
  263. **@returns** *COA.Cmd* `parent` родительская команда