rbcli 0.3.2 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (506) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.md +9 -0
  3. data/LICENSE.txt +5 -670
  4. data/README.md +64 -160
  5. data/VERSION +1 -0
  6. data/exe/rbcli +181 -242
  7. data/lib/rbcli/components/commands/command.rb +120 -0
  8. data/lib/rbcli/components/commands/command.rb.erb +55 -0
  9. data/lib/rbcli/components/commands/command_old.rb +105 -0
  10. data/lib/rbcli/components/commands/script.rb.erb +43 -0
  11. data/{lib-sh → lib/rbcli/components/commands/scriptwrapper}/lib-rbcli.sh +29 -34
  12. data/lib/rbcli/components/commands/scriptwrapper/scriptwrapper.rb +64 -0
  13. data/lib/rbcli/components/config/backend.rb +102 -0
  14. data/lib/rbcli/components/config/backends/env.rb +67 -0
  15. data/lib/rbcli/components/config/backends/helpers/deep_assign.rb +47 -0
  16. data/lib/rbcli/components/config/backends/ini.rb +53 -0
  17. data/lib/rbcli/components/config/backends/json.rb +32 -0
  18. data/lib/rbcli/components/config/backends/null.rb +32 -0
  19. data/lib/rbcli/components/config/backends/toml.rb +38 -0
  20. data/lib/rbcli/components/config/backends/yaml.rb +31 -0
  21. data/lib/rbcli/components/config/component.rb +33 -0
  22. data/lib/rbcli/components/config/config.rb +165 -0
  23. data/lib/rbcli/components/config/config_of_death.rb +12 -0
  24. data/lib/rbcli/components/config/template.rb.erb +36 -0
  25. data/lib/rbcli/components/core/configurate.rb +63 -0
  26. data/lib/rbcli/components/core/engine.rb +30 -0
  27. data/lib/rbcli/components/core/warehouse.rb +18 -0
  28. data/lib/rbcli/components/envvars/component.rb +20 -0
  29. data/lib/rbcli/components/envvars/template.rb.erb +24 -0
  30. data/lib/rbcli/components/hooks/component.rb +36 -0
  31. data/lib/rbcli/components/hooks/template.rb.erb +20 -0
  32. data/lib/rbcli/components/logger/component.rb +32 -0
  33. data/lib/rbcli/components/logger/logger.rb +155 -0
  34. data/lib/rbcli/components/logger/lolcat/lol.rb +71 -0
  35. data/lib/rbcli/components/logger/template.rb.erb +40 -0
  36. data/lib/rbcli/components/parser/component.rb +33 -0
  37. data/lib/rbcli/components/parser/optimist/optimist.rb +1149 -0
  38. data/lib/rbcli/components/parser/parser.rb +178 -0
  39. data/lib/rbcli/components/parser/template.rb.erb +35 -0
  40. data/lib/rbcli/components/updatechecker/common/common.rb +52 -0
  41. data/lib/rbcli/components/updatechecker/component.rb +42 -0
  42. data/lib/rbcli/components/updatechecker/gem_checker.rb +40 -0
  43. data/lib/rbcli/components/updatechecker/github_checker.rb +46 -0
  44. data/lib/rbcli/components/updatechecker/template.rb.erb +14 -0
  45. data/lib/rbcli/util/deprecation_warning.rb +41 -55
  46. data/lib/rbcli/util/errors.rb +12 -0
  47. data/lib/rbcli/util/exit.rb +12 -0
  48. data/lib/rbcli/util/hash_deep_symbolize.rb +26 -41
  49. data/lib/rbcli/util/string_compression.rb +10 -0
  50. data/lib/rbcli/version.rb +5 -20
  51. data/lib/rbcli-tool/helpers.rb +58 -0
  52. data/lib/rbcli-tool/skeletons/gem.rb.erb +17 -0
  53. data/lib/rbcli-tool/skeletons/portable.rb.erb +48 -0
  54. data/lib/rbcli.rb +19 -50
  55. data/sig/rbcli.rbs +9 -0
  56. metadata +125 -495
  57. data/.gitignore +0 -60
  58. data/.rakeTasks +0 -7
  59. data/.rbenv-gemsets +0 -1
  60. data/.travis.yml +0 -5
  61. data/CHANGELOG.md +0 -181
  62. data/CODE_OF_CONDUCT.md +0 -74
  63. data/Gemfile +0 -6
  64. data/Gemfile.lock +0 -78
  65. data/Rakefile +0 -10
  66. data/bin/console +0 -33
  67. data/bin/setup +0 -28
  68. data/docs/404.html +0 -59
  69. data/docs/advanced/automatic_updates/index.html +0 -1174
  70. data/docs/advanced/command_types/index.html +0 -1262
  71. data/docs/advanced/distributed_state_locking/index.html +0 -1176
  72. data/docs/advanced/hooks/index.html +0 -1192
  73. data/docs/advanced/index.html +0 -1140
  74. data/docs/advanced/index.xml +0 -113
  75. data/docs/advanced/interactive_commands/index.html +0 -1177
  76. data/docs/advanced/logging/index.html +0 -1184
  77. data/docs/advanced/remote_execution/index.html +0 -1190
  78. data/docs/advanced/state_storage/index.html +0 -1281
  79. data/docs/advanced/user_config_files/index.html +0 -1209
  80. data/docs/categories/index.html +0 -1146
  81. data/docs/categories/index.xml +0 -10
  82. data/docs/css/atom-one-dark-reasonable.css +0 -77
  83. data/docs/css/auto-complete.css +0 -47
  84. data/docs/css/featherlight.min.css +0 -8
  85. data/docs/css/fontawesome-all.min.css +0 -1
  86. data/docs/css/hugo-theme.css +0 -254
  87. data/docs/css/hybrid.css +0 -102
  88. data/docs/css/nucleus.css +0 -615
  89. data/docs/css/perfect-scrollbar.min.css +0 -2
  90. data/docs/css/tags.css +0 -49
  91. data/docs/css/theme-blue.css +0 -111
  92. data/docs/css/theme-green.css +0 -111
  93. data/docs/css/theme-red.css +0 -111
  94. data/docs/css/theme.css +0 -1136
  95. data/docs/development/changelog/index.html +0 -1389
  96. data/docs/development/code_of_conduct/index.html +0 -1222
  97. data/docs/development/contributing/index.html +0 -1201
  98. data/docs/development/index.html +0 -1140
  99. data/docs/development/index.xml +0 -50
  100. data/docs/development/license/index.html +0 -1165
  101. data/docs/fonts/Inconsolata.eot +0 -0
  102. data/docs/fonts/Inconsolata.svg +0 -1
  103. data/docs/fonts/Inconsolata.ttf +0 -0
  104. data/docs/fonts/Inconsolata.woff +0 -0
  105. data/docs/fonts/Novecentosanswide-Normal-webfont.eot +0 -0
  106. data/docs/fonts/Novecentosanswide-Normal-webfont.svg +0 -1
  107. data/docs/fonts/Novecentosanswide-Normal-webfont.ttf +0 -0
  108. data/docs/fonts/Novecentosanswide-Normal-webfont.woff +0 -0
  109. data/docs/fonts/Novecentosanswide-Normal-webfont.woff2 +0 -0
  110. data/docs/fonts/Novecentosanswide-UltraLight-webfont.eot +0 -0
  111. data/docs/fonts/Novecentosanswide-UltraLight-webfont.svg +0 -1
  112. data/docs/fonts/Novecentosanswide-UltraLight-webfont.ttf +0 -0
  113. data/docs/fonts/Novecentosanswide-UltraLight-webfont.woff +0 -0
  114. data/docs/fonts/Novecentosanswide-UltraLight-webfont.woff2 +0 -0
  115. data/docs/fonts/Work_Sans_200.eot +0 -0
  116. data/docs/fonts/Work_Sans_200.svg +0 -1
  117. data/docs/fonts/Work_Sans_200.ttf +0 -0
  118. data/docs/fonts/Work_Sans_200.woff +0 -0
  119. data/docs/fonts/Work_Sans_200.woff2 +0 -0
  120. data/docs/fonts/Work_Sans_300.eot +0 -0
  121. data/docs/fonts/Work_Sans_300.svg +0 -1
  122. data/docs/fonts/Work_Sans_300.ttf +0 -0
  123. data/docs/fonts/Work_Sans_300.woff +0 -0
  124. data/docs/fonts/Work_Sans_300.woff2 +0 -0
  125. data/docs/fonts/Work_Sans_500.eot +0 -0
  126. data/docs/fonts/Work_Sans_500.svg +0 -1
  127. data/docs/fonts/Work_Sans_500.ttf +0 -0
  128. data/docs/fonts/Work_Sans_500.woff +0 -0
  129. data/docs/fonts/Work_Sans_500.woff2 +0 -0
  130. data/docs/images/clippy.svg +0 -1
  131. data/docs/images/favicon.png +0 -0
  132. data/docs/images/gopher-404.jpg +0 -0
  133. data/docs/imported/changelog/index.html +0 -1449
  134. data/docs/imported/index.html +0 -1191
  135. data/docs/imported/index.xml +0 -23
  136. data/docs/index.html +0 -1138
  137. data/docs/index.json +0 -183
  138. data/docs/index.xml +0 -208
  139. data/docs/js/auto-complete.js +0 -3
  140. data/docs/js/clipboard.min.js +0 -7
  141. data/docs/js/featherlight.min.js +0 -9
  142. data/docs/js/highlight.pack.js +0 -6
  143. data/docs/js/html5shiv-printshiv.min.js +0 -4
  144. data/docs/js/hugo-learn.js +0 -94
  145. data/docs/js/jquery-3.3.1.min.js +0 -2
  146. data/docs/js/jquery.sticky.js +0 -288
  147. data/docs/js/learn.js +0 -459
  148. data/docs/js/lunr.min.js +0 -6
  149. data/docs/js/modernizr.custom-3.6.0.js +0 -3
  150. data/docs/js/perfect-scrollbar.jquery.min.js +0 -2
  151. data/docs/js/perfect-scrollbar.min.js +0 -2
  152. data/docs/js/search.js +0 -93
  153. data/docs/mermaid/mermaid.css +0 -277
  154. data/docs/mermaid/mermaid.dark.css +0 -278
  155. data/docs/mermaid/mermaid.forest.css +0 -356
  156. data/docs/mermaid/mermaid.js +0 -8
  157. data/docs/quick_reference/index.html +0 -1246
  158. data/docs/quick_reference/index.xml +0 -11
  159. data/docs/sitemap.xml +0 -82
  160. data/docs/tags/index.html +0 -1146
  161. data/docs/tags/index.xml +0 -10
  162. data/docs/tutorial/10-getting_started/index.html +0 -1174
  163. data/docs/tutorial/20-project_layout/index.html +0 -1299
  164. data/docs/tutorial/30-your_first_command/index.html +0 -1263
  165. data/docs/tutorial/40-options_parameters_and_arguments/index.html +0 -1384
  166. data/docs/tutorial/50-publishing/index.html +0 -1187
  167. data/docs/tutorial/index.html +0 -1140
  168. data/docs/tutorial/index.xml +0 -67
  169. data/docs/webfonts/fa-brands-400.eot +0 -0
  170. data/docs/webfonts/fa-brands-400.svg +0 -1
  171. data/docs/webfonts/fa-brands-400.ttf +0 -0
  172. data/docs/webfonts/fa-brands-400.woff +0 -0
  173. data/docs/webfonts/fa-brands-400.woff2 +0 -0
  174. data/docs/webfonts/fa-regular-400.eot +0 -0
  175. data/docs/webfonts/fa-regular-400.svg +0 -1
  176. data/docs/webfonts/fa-regular-400.ttf +0 -0
  177. data/docs/webfonts/fa-regular-400.woff +0 -0
  178. data/docs/webfonts/fa-regular-400.woff2 +0 -0
  179. data/docs/webfonts/fa-solid-900.eot +0 -0
  180. data/docs/webfonts/fa-solid-900.svg +0 -1
  181. data/docs/webfonts/fa-solid-900.ttf +0 -0
  182. data/docs/webfonts/fa-solid-900.woff +0 -0
  183. data/docs/webfonts/fa-solid-900.woff2 +0 -0
  184. data/docs/whoami/index.html +0 -1155
  185. data/docs/whoami/index.xml +0 -11
  186. data/docs-src/archetypes/default.md +0 -6
  187. data/docs-src/config.toml +0 -37
  188. data/docs-src/content/_index.md +0 -40
  189. data/docs-src/content/advanced/_index.md +0 -11
  190. data/docs-src/content/advanced/automatic_updates.md +0 -46
  191. data/docs-src/content/advanced/command_types.md +0 -148
  192. data/docs-src/content/advanced/distributed_state_locking.md +0 -37
  193. data/docs-src/content/advanced/hooks.md +0 -69
  194. data/docs-src/content/advanced/interactive_commands.md +0 -41
  195. data/docs-src/content/advanced/logging.md +0 -39
  196. data/docs-src/content/advanced/remote_execution.md +0 -60
  197. data/docs-src/content/advanced/state_storage.md +0 -120
  198. data/docs-src/content/advanced/user_config_files.md +0 -51
  199. data/docs-src/content/development/_index.md +0 -11
  200. data/docs-src/content/development/changelog.md +0 -179
  201. data/docs-src/content/development/code_of_conduct.md +0 -81
  202. data/docs-src/content/development/contributing.md +0 -88
  203. data/docs-src/content/development/license.md +0 -17
  204. data/docs-src/content/quick_reference/_index.md +0 -180
  205. data/docs-src/content/tutorial/10-getting_started.md +0 -47
  206. data/docs-src/content/tutorial/20-project_layout.md +0 -123
  207. data/docs-src/content/tutorial/30-your_first_command.md +0 -132
  208. data/docs-src/content/tutorial/40-options_parameters_and_arguments.md +0 -282
  209. data/docs-src/content/tutorial/50-publishing.md +0 -53
  210. data/docs-src/content/tutorial/_index.md +0 -11
  211. data/docs-src/content/whoami/_index.md +0 -34
  212. data/docs-src/layouts/partials/logo.html +0 -3
  213. data/docs-src/makesite.sh +0 -40
  214. data/docs-src/mkdocs-archived.tar.gz +0 -0
  215. data/docs-src/runsite.sh +0 -8
  216. data/docs-src/themes/hugo-theme-learn/.editorconfig +0 -16
  217. data/docs-src/themes/hugo-theme-learn/.gitignore +0 -3
  218. data/docs-src/themes/hugo-theme-learn/.grenrc.yml +0 -25
  219. data/docs-src/themes/hugo-theme-learn/CHANGELOG.md +0 -226
  220. data/docs-src/themes/hugo-theme-learn/LICENSE.md +0 -22
  221. data/docs-src/themes/hugo-theme-learn/README.md +0 -97
  222. data/docs-src/themes/hugo-theme-learn/archetypes/chapter.md +0 -13
  223. data/docs-src/themes/hugo-theme-learn/archetypes/default.md +0 -7
  224. data/docs-src/themes/hugo-theme-learn/exampleSite/LICENSE.md +0 -20
  225. data/docs-src/themes/hugo-theme-learn/exampleSite/config.toml +0 -102
  226. data/docs-src/themes/hugo-theme-learn/exampleSite/content/_index.en.md +0 -41
  227. data/docs-src/themes/hugo-theme-learn/exampleSite/content/_index.fr.md +0 -43
  228. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/_index.en.md +0 -12
  229. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/_index.fr.md +0 -12
  230. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/_index.zh.md +0 -12
  231. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/configuration/_index.en.md +0 -60
  232. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/configuration/_index.fr.md +0 -56
  233. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/installation/_index.en.md +0 -102
  234. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/installation/_index.fr.md +0 -100
  235. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/installation/images/chapter.png +0 -0
  236. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/requirements/_index.en.md +0 -11
  237. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/requirements/_index.fr.md +0 -11
  238. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/requirements/images/magic.gif +0 -0
  239. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/_index.en.md +0 -194
  240. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/_index.fr.md +0 -194
  241. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/images/blue-variant.png +0 -0
  242. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/images/green-variant.png +0 -0
  243. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/images/red-variant.png +0 -0
  244. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/_index.en.md +0 -12
  245. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/_index.fr.md +0 -12
  246. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/archetypes.en.md +0 -57
  247. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/archetypes.fr.md +0 -57
  248. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/i18n/_index.en.md +0 -78
  249. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/i18n/_index.fr.md +0 -78
  250. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/i18n/images/i18n-menu.gif +0 -0
  251. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/icons.en.md +0 -41
  252. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/markdown.en.md +0 -692
  253. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/markdown.fr.md +0 -666
  254. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/menushortcuts.en.md +0 -109
  255. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/menushortcuts.fr.md +0 -109
  256. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/pages/_index.en.md +0 -166
  257. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/pages/_index.fr.md +0 -146
  258. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/pages/images/frontmatter-icon.png +0 -0
  259. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/pages/images/pages-chapter.png +0 -0
  260. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/pages/images/pages-default.png +0 -0
  261. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/syntaxhighlight.en.md +0 -89
  262. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/tags.en.md +0 -39
  263. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/tags.fr.md +0 -40
  264. data/docs-src/themes/hugo-theme-learn/exampleSite/content/credits.en.md +0 -28
  265. data/docs-src/themes/hugo-theme-learn/exampleSite/content/credits.fr.md +0 -28
  266. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/_index.en.md +0 -16
  267. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/_index.fr.md +0 -16
  268. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/BachGavotteShort.mp3 +0 -0
  269. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/Carroll_AliceAuPaysDesMerveilles.pdf +0 -0
  270. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/adivorciarsetoca00cape.pdf +0 -0
  271. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/hugo.png +0 -0
  272. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/movieselectricsheep-flock-244-32500-2.mp4 +0 -0
  273. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.md +0 -85
  274. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/BachGavotteShort.mp3 +0 -0
  275. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/Carroll_AliceAuPaysDesMerveilles.pdf +0 -0
  276. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/adivorciarsetoca00cape.pdf +0 -0
  277. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/hugo.png +0 -0
  278. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/movieselectricsheep-flock-244-32500-2.mp4 +0 -0
  279. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.md +0 -85
  280. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/button.en.md +0 -16
  281. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/button.fr.md +0 -16
  282. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/_index.en.md +0 -45
  283. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/_index.fr.md +0 -45
  284. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/_index.en.md +0 -6
  285. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/_index.fr.md +0 -6
  286. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.en.md +0 -6
  287. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.fr.md +0 -6
  288. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.en.md +0 -6
  289. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.fr.md +0 -6
  290. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.en.md +0 -6
  291. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.fr.md +0 -6
  292. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.en.md +0 -6
  293. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.fr.md +0 -6
  294. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/_index.en.md +0 -11
  295. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/_index.fr.md +0 -11
  296. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/test3.en.md +0 -6
  297. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/test3.fr.md +0 -6
  298. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-3/_index.en.md +0 -6
  299. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-3/_index.fr.md +0 -6
  300. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-4/_index.en.md +0 -7
  301. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-4/_index.fr.md +0 -7
  302. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/test.en.md +0 -6
  303. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/test.fr.md +0 -6
  304. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/expand.en.md +0 -45
  305. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/expand.fr.md +0 -45
  306. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/mermaid.en.md +0 -283
  307. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/mermaid.fr.md +0 -283
  308. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/notice.en.md +0 -62
  309. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/notice.fr.md +0 -62
  310. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/siteparam.en.md +0 -23
  311. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/siteparam.fr.md +0 -23
  312. data/docs-src/themes/hugo-theme-learn/exampleSite/content/showcase.en.md +0 -13
  313. data/docs-src/themes/hugo-theme-learn/exampleSite/content/showcase.fr.md +0 -14
  314. data/docs-src/themes/hugo-theme-learn/exampleSite/layouts/partials/custom-footer.html +0 -10
  315. data/docs-src/themes/hugo-theme-learn/exampleSite/layouts/partials/logo.html +0 -39
  316. data/docs-src/themes/hugo-theme-learn/exampleSite/layouts/partials/menu-footer.html +0 -14
  317. data/docs-src/themes/hugo-theme-learn/exampleSite/layouts/shortcodes/ghcontributors.html +0 -31
  318. data/docs-src/themes/hugo-theme-learn/exampleSite/static/css/theme-mine.css +0 -104
  319. data/docs-src/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.eot +0 -0
  320. data/docs-src/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.svg +0 -1
  321. data/docs-src/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.ttf +0 -0
  322. data/docs-src/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.woff +0 -0
  323. data/docs-src/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.woff2 +0 -0
  324. data/docs-src/themes/hugo-theme-learn/exampleSite/static/images/showcase/inteliver_docs.png +0 -0
  325. data/docs-src/themes/hugo-theme-learn/exampleSite/static/images/showcase/tat.png +0 -0
  326. data/docs-src/themes/hugo-theme-learn/exampleSite/static/images/showcase/tshark_dev.png +0 -0
  327. data/docs-src/themes/hugo-theme-learn/i18n/ar.toml +0 -26
  328. data/docs-src/themes/hugo-theme-learn/i18n/de.toml +0 -26
  329. data/docs-src/themes/hugo-theme-learn/i18n/en.toml +0 -26
  330. data/docs-src/themes/hugo-theme-learn/i18n/es.toml +0 -26
  331. data/docs-src/themes/hugo-theme-learn/i18n/fr.toml +0 -26
  332. data/docs-src/themes/hugo-theme-learn/i18n/hi.toml +0 -26
  333. data/docs-src/themes/hugo-theme-learn/i18n/id.toml +0 -26
  334. data/docs-src/themes/hugo-theme-learn/i18n/ja.toml +0 -26
  335. data/docs-src/themes/hugo-theme-learn/i18n/nl.toml +0 -26
  336. data/docs-src/themes/hugo-theme-learn/i18n/pt.toml +0 -26
  337. data/docs-src/themes/hugo-theme-learn/i18n/ru.toml +0 -26
  338. data/docs-src/themes/hugo-theme-learn/i18n/tr.toml +0 -26
  339. data/docs-src/themes/hugo-theme-learn/i18n/zh-cn.toml +0 -26
  340. data/docs-src/themes/hugo-theme-learn/images/screenshot.png +0 -0
  341. data/docs-src/themes/hugo-theme-learn/images/tn.png +0 -0
  342. data/docs-src/themes/hugo-theme-learn/layouts/404.html +0 -56
  343. data/docs-src/themes/hugo-theme-learn/layouts/_default/list.html +0 -22
  344. data/docs-src/themes/hugo-theme-learn/layouts/_default/single.html +0 -12
  345. data/docs-src/themes/hugo-theme-learn/layouts/index.html +0 -31
  346. data/docs-src/themes/hugo-theme-learn/layouts/index.json +0 -12
  347. data/docs-src/themes/hugo-theme-learn/layouts/partials/custom-comments.html +0 -3
  348. data/docs-src/themes/hugo-theme-learn/layouts/partials/custom-footer.html +0 -5
  349. data/docs-src/themes/hugo-theme-learn/layouts/partials/custom-header.html +0 -5
  350. data/docs-src/themes/hugo-theme-learn/layouts/partials/favicon.html +0 -1
  351. data/docs-src/themes/hugo-theme-learn/layouts/partials/footer.html +0 -77
  352. data/docs-src/themes/hugo-theme-learn/layouts/partials/header.html +0 -111
  353. data/docs-src/themes/hugo-theme-learn/layouts/partials/logo.html +0 -19
  354. data/docs-src/themes/hugo-theme-learn/layouts/partials/menu-footer.html +0 -1
  355. data/docs-src/themes/hugo-theme-learn/layouts/partials/menu.html +0 -151
  356. data/docs-src/themes/hugo-theme-learn/layouts/partials/meta.html +0 -2
  357. data/docs-src/themes/hugo-theme-learn/layouts/partials/search.html +0 -16
  358. data/docs-src/themes/hugo-theme-learn/layouts/partials/tags.html +0 -7
  359. data/docs-src/themes/hugo-theme-learn/layouts/partials/toc.html +0 -5
  360. data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/attachments.html +0 -36
  361. data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/button.html +0 -14
  362. data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/children.html +0 -101
  363. data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/expand.html +0 -17
  364. data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/mermaid.html +0 -2
  365. data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/notice.html +0 -2
  366. data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/ref.html +0 -14
  367. data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/relref.html +0 -14
  368. data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/siteparam.html +0 -7
  369. data/docs-src/themes/hugo-theme-learn/netlify.toml +0 -23
  370. data/docs-src/themes/hugo-theme-learn/static/css/atom-one-dark-reasonable.css +0 -77
  371. data/docs-src/themes/hugo-theme-learn/static/css/auto-complete.css +0 -47
  372. data/docs-src/themes/hugo-theme-learn/static/css/featherlight.min.css +0 -8
  373. data/docs-src/themes/hugo-theme-learn/static/css/fontawesome-all.min.css +0 -1
  374. data/docs-src/themes/hugo-theme-learn/static/css/hugo-theme.css +0 -254
  375. data/docs-src/themes/hugo-theme-learn/static/css/hybrid.css +0 -102
  376. data/docs-src/themes/hugo-theme-learn/static/css/nucleus.css +0 -615
  377. data/docs-src/themes/hugo-theme-learn/static/css/perfect-scrollbar.min.css +0 -2
  378. data/docs-src/themes/hugo-theme-learn/static/css/tags.css +0 -49
  379. data/docs-src/themes/hugo-theme-learn/static/css/theme-blue.css +0 -111
  380. data/docs-src/themes/hugo-theme-learn/static/css/theme-green.css +0 -111
  381. data/docs-src/themes/hugo-theme-learn/static/css/theme-red.css +0 -111
  382. data/docs-src/themes/hugo-theme-learn/static/css/theme.css +0 -1136
  383. data/docs-src/themes/hugo-theme-learn/static/fonts/Inconsolata.eot +0 -0
  384. data/docs-src/themes/hugo-theme-learn/static/fonts/Inconsolata.svg +0 -1
  385. data/docs-src/themes/hugo-theme-learn/static/fonts/Inconsolata.ttf +0 -0
  386. data/docs-src/themes/hugo-theme-learn/static/fonts/Inconsolata.woff +0 -0
  387. data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.eot +0 -0
  388. data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.svg +0 -1
  389. data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.ttf +0 -0
  390. data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.woff +0 -0
  391. data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.woff2 +0 -0
  392. data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.eot +0 -0
  393. data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.svg +0 -1
  394. data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.ttf +0 -0
  395. data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.woff +0 -0
  396. data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.woff2 +0 -0
  397. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_200.eot +0 -0
  398. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_200.svg +0 -1
  399. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_200.ttf +0 -0
  400. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_200.woff +0 -0
  401. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_200.woff2 +0 -0
  402. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_300.eot +0 -0
  403. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_300.svg +0 -1
  404. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_300.ttf +0 -0
  405. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_300.woff +0 -0
  406. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_300.woff2 +0 -0
  407. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_500.eot +0 -0
  408. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_500.svg +0 -1
  409. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_500.ttf +0 -0
  410. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_500.woff +0 -0
  411. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_500.woff2 +0 -0
  412. data/docs-src/themes/hugo-theme-learn/static/images/clippy.svg +0 -1
  413. data/docs-src/themes/hugo-theme-learn/static/images/favicon.png +0 -0
  414. data/docs-src/themes/hugo-theme-learn/static/images/gopher-404.jpg +0 -0
  415. data/docs-src/themes/hugo-theme-learn/static/js/auto-complete.js +0 -3
  416. data/docs-src/themes/hugo-theme-learn/static/js/clipboard.min.js +0 -7
  417. data/docs-src/themes/hugo-theme-learn/static/js/featherlight.min.js +0 -9
  418. data/docs-src/themes/hugo-theme-learn/static/js/highlight.pack.js +0 -6
  419. data/docs-src/themes/hugo-theme-learn/static/js/hugo-learn.js +0 -94
  420. data/docs-src/themes/hugo-theme-learn/static/js/jquery-3.3.1.min.js +0 -2
  421. data/docs-src/themes/hugo-theme-learn/static/js/jquery.sticky.js +0 -288
  422. data/docs-src/themes/hugo-theme-learn/static/js/learn.js +0 -459
  423. data/docs-src/themes/hugo-theme-learn/static/js/lunr.min.js +0 -6
  424. data/docs-src/themes/hugo-theme-learn/static/js/modernizr.custom-3.6.0.js +0 -3
  425. data/docs-src/themes/hugo-theme-learn/static/js/perfect-scrollbar.jquery.min.js +0 -2
  426. data/docs-src/themes/hugo-theme-learn/static/js/perfect-scrollbar.min.js +0 -2
  427. data/docs-src/themes/hugo-theme-learn/static/js/search.js +0 -93
  428. data/docs-src/themes/hugo-theme-learn/static/mermaid/mermaid.css +0 -277
  429. data/docs-src/themes/hugo-theme-learn/static/mermaid/mermaid.dark.css +0 -278
  430. data/docs-src/themes/hugo-theme-learn/static/mermaid/mermaid.forest.css +0 -356
  431. data/docs-src/themes/hugo-theme-learn/static/mermaid/mermaid.js +0 -8
  432. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-brands-400.eot +0 -0
  433. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-brands-400.svg +0 -1
  434. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-brands-400.ttf +0 -0
  435. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-brands-400.woff +0 -0
  436. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-brands-400.woff2 +0 -0
  437. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-regular-400.eot +0 -0
  438. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-regular-400.svg +0 -1
  439. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-regular-400.ttf +0 -0
  440. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-regular-400.woff +0 -0
  441. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-regular-400.woff2 +0 -0
  442. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-solid-900.eot +0 -0
  443. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-solid-900.svg +0 -1
  444. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-solid-900.ttf +0 -0
  445. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-solid-900.woff +0 -0
  446. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-solid-900.woff2 +0 -0
  447. data/docs-src/themes/hugo-theme-learn/theme.toml +0 -21
  448. data/docs-src/themes/hugo-theme-learn/wercker.yml +0 -16
  449. data/lib/rbcli/configuration/configurate.rb +0 -85
  450. data/lib/rbcli/configuration/configurate_blocks/hooks.rb +0 -52
  451. data/lib/rbcli/configuration/configurate_blocks/me.rb +0 -122
  452. data/lib/rbcli/configuration/configurate_blocks/storage.rb +0 -50
  453. data/lib/rbcli/engine/command.rb +0 -251
  454. data/lib/rbcli/engine/load_project.rb +0 -45
  455. data/lib/rbcli/engine/parser.rb +0 -114
  456. data/lib/rbcli/features/autoupdate/common/autoupdate.rb +0 -50
  457. data/lib/rbcli/features/autoupdate/gem_updater.rb +0 -62
  458. data/lib/rbcli/features/autoupdate/github_updater.rb +0 -76
  459. data/lib/rbcli/features/logging.rb +0 -98
  460. data/lib/rbcli/features/remote_exec.rb +0 -187
  461. data/lib/rbcli/features/scriptwrapper.rb +0 -75
  462. data/lib/rbcli/features/userconfig.rb +0 -163
  463. data/lib/rbcli/state_storage/common/state_storage.rb +0 -138
  464. data/lib/rbcli/state_storage/localstate.rb +0 -77
  465. data/lib/rbcli/state_storage/placeholders.rb +0 -29
  466. data/lib/rbcli/state_storage/remote_state_connectors/dynamodb.rb +0 -272
  467. data/lib/rbcli/state_storage/remotestate_dynamodb.rb +0 -115
  468. data/lib/rbcli/util/msg.rb +0 -55
  469. data/lib/rbcli/util/string_colorize.rb +0 -45
  470. data/lib/rbcli/util/trollop.rb +0 -1050
  471. data/lib/rbcli-tool/generators.rb +0 -105
  472. data/lib/rbcli-tool/mdless_fix.rb +0 -406
  473. data/lib/rbcli-tool/project.rb +0 -120
  474. data/lib/rbcli-tool/util.rb +0 -70
  475. data/lib/rbcli-tool.rb +0 -37
  476. data/rbcli.gemspec +0 -69
  477. data/skeletons/micro/executable +0 -127
  478. data/skeletons/mini/executable +0 -242
  479. data/skeletons/project/.gitignore +0 -11
  480. data/skeletons/project/.rakeTasks +0 -7
  481. data/skeletons/project/.rspec +0 -3
  482. data/skeletons/project/CODE_OF_CONDUCT.md +0 -74
  483. data/skeletons/project/Gemfile +0 -6
  484. data/skeletons/project/README.md +0 -46
  485. data/skeletons/project/Rakefile +0 -6
  486. data/skeletons/project/application/commands/command.erb +0 -28
  487. data/skeletons/project/application/commands/script.erb +0 -30
  488. data/skeletons/project/application/commands/scripts/script.sh +0 -60
  489. data/skeletons/project/application/options.rb +0 -34
  490. data/skeletons/project/config/autoupdate.rb +0 -35
  491. data/skeletons/project/config/general.rb +0 -17
  492. data/skeletons/project/config/logging.rb +0 -19
  493. data/skeletons/project/config/storage.rb +0 -35
  494. data/skeletons/project/config/userspace.rb +0 -33
  495. data/skeletons/project/config/version.rb +0 -3
  496. data/skeletons/project/exe/executable +0 -53
  497. data/skeletons/project/hooks/default_action.rb +0 -16
  498. data/skeletons/project/hooks/first_run.rb +0 -16
  499. data/skeletons/project/hooks/post_execution.rb +0 -14
  500. data/skeletons/project/hooks/pre_execution.rb +0 -14
  501. data/skeletons/project/lib/lib.erb +0 -9
  502. data/skeletons/project/spec/spec_helper.rb +0 -14
  503. data/skeletons/project/spec/untitled_spec.rb +0 -9
  504. data/skeletons/project/untitled.gemspec +0 -40
  505. data/skeletons/project/userconf/user_defaults.yml +0 -6
  506. /data/{skeletons/project/.rbcli → lib/rbcli/plugins/.keep} +0 -0
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+ ##################################################################################
3
+ # Rbcli -- A framework for developing command line applications in Ruby #
4
+ # Copyright (C) 2024 Andrew Khoury <akhoury@live.com> #
5
+ ##################################################################################
6
+ module Rbcli::Core::CmdLibrary
7
+ def self.extended klass
8
+ klass.instance_variable_set :@commands, {}
9
+ end
10
+
11
+ def inherited subklass
12
+ raise Rbcli::CommandError.new "The command #{subklass.name.downcase} cannot be defined twice." unless @commands[subklass.name.downcase].nil?
13
+ subklass.instance_variable_set :@data, {
14
+ description: nil,
15
+ helptext: nil,
16
+ default: nil,
17
+ action: nil,
18
+ script: nil,
19
+ usage: nil,
20
+ parameter_prompts: {},
21
+ parser: Optimist::Parser.new
22
+ }
23
+ @commands[subklass.name.downcase] = subklass.new
24
+ Rbcli::Cliopts.register_command subklass.name.downcase
25
+ Rbcli.log.debug "Registered command '#{subklass.name.downcase}'", "CORE"
26
+
27
+ Rbcli::Engine.register_operation Proc.new {
28
+ Rbcli.log.debug "Running command '#{Rbcli::Cliopts.cmd[:name]}'", "CORE"
29
+ Rbcli::Cliopts.cmd[:command].data[:action].call(Rbcli::Cliopts.opts,
30
+ Rbcli::Cliopts.cmd[:params],
31
+ Rbcli::Cliopts.cmd[:args],
32
+ (Rbcli::Configurate.constants.include?(:Config) ? Rbcli.configuration(:config)[:config] : Rbcli::Config.new(suppress_errors: true)),
33
+ (Rbcli::Configurate.constants.include?(:Envvars) ? Rbcli.configuration(:envvars)[:envvars] : Rbcli::Config.new(suppress_errors: true))
34
+ ) unless Rbcli::Cliopts.cmd[:command].data[:action].nil?
35
+ Rbcli::Cliopts.cmd[:command].data[:script].execute(Rbcli::Cliopts.opts,
36
+ Rbcli::Cliopts.cmd[:params],
37
+ Rbcli::Cliopts.cmd[:args],
38
+ (Rbcli::Configurate.constants.include?(:Config) ? Rbcli.configuration(:config)[:config] : Rbcli::Config.new(suppress_errors: true)),
39
+ (Rbcli::Configurate.constants.include?(:Envvars) ? Rbcli.configuration(:envvars)[:envvars] : Rbcli::Config.new(suppress_errors: true))
40
+ ) unless Rbcli::Cliopts.cmd[:command].data[:script].nil?
41
+ }, name: :run_command, priority: 100 if @commands.count == 1
42
+ end
43
+
44
+ def data
45
+ self.instance_variable_get :@data;
46
+ end
47
+
48
+ def commands
49
+ @commands.select { |name, cmd| !cmd.data[:default] }
50
+ end
51
+
52
+ def default_command
53
+ default_commands = @commands.select { |_name, cmd| cmd.data[:default] }
54
+ raise Rbcli::CommandError.new "Can't execute - more than one command has been specified as default: #{default_commands.keys}" if default_commands.count > 1
55
+ default_commands.count == 1 ? default_commands.first : nil
56
+ end
57
+ end
58
+
59
+ class Rbcli::Command
60
+ extend Rbcli::Core::CmdLibrary
61
+
62
+ def data
63
+ self.class.data
64
+ end
65
+
66
+ def self.description desc = nil
67
+ desc.nil? ? @data[:description] : @data[:description] = desc
68
+ end
69
+
70
+ def self.helptext text = nil
71
+ text.nil? ? @data[:helptext] : @data[:helptext] = text
72
+ end
73
+
74
+ def self.usage text = nil
75
+ text.nil? ? @data[:usage] : @data[:usage] = text
76
+ end
77
+
78
+ def self.default
79
+ @data[:default] = true
80
+ end
81
+
82
+ def self.parameter * args
83
+ if !args[2].nil? && !args[2].empty? && args[2][:prompt].is_a?(String)
84
+ @data[:parameter_prompts][args[0]] = { prompt: args[2][:prompt], default: args[2][:default], type: args[2][:type].nil? ? nil : args[2][:type].to_s.chomp('s').to_sym }
85
+ args[2][:required] = false
86
+ end
87
+ @data[:parser].opt *args
88
+ end
89
+
90
+ def self.action & block
91
+ @data[:action] = block
92
+ end
93
+
94
+ def self.script inline: nil, path: nil, vars: nil
95
+ if !inline.nil? && !path.nil?
96
+ raise Rbcli::CommandError.new "Can't assign both an inline script and an external path to command '#{self.name}'"
97
+ end
98
+ if path == :builtin or path.nil?
99
+ callerscript = caller_locations.first.absolute_path
100
+ path = "#{File.dirname(callerscript)}/scripts/#{File.basename(callerscript, ".*")}.sh"
101
+ end
102
+ require File.join(RBCLI_LIBDIR, 'components', 'scriptwrapper', 'scriptwrapper.rb')
103
+ @data[:script] = Rbcli::ScriptWrapper.new inline: inline, path: path, vars: vars
104
+ end
105
+ end
@@ -0,0 +1,43 @@
1
+ <%- if @showdocs -%>
2
+ # Script Command
3
+ # Supports all of the same features as a regular command, but passes everything to a bash script
4
+ # The script can be defined inline, or a path to an external script can be provided
5
+ #
6
+ # Code is injected into the script to integrate with Rbcli.
7
+ # The `log` commands are integrated with the ruby logger
8
+ # The `rbcli` command provides a wrapper around jq that can retrieve
9
+ # the values of opts/params/args/config/env
10
+ # For more information on JQ syntax, see: https://jqlang.github.io/jq/
11
+ <%- end -%>
12
+ Rbcli.command "<%= @command_name || 'script' %>" do
13
+ description "example script command"
14
+ # external_script vars: {}, path: "./test.sh"
15
+ inline_script vars: { foo: 'bar!!!' }, inline: <<~INLINE
16
+ #!/usr/bin/env bash
17
+ log "Rbcli shell integration demo!"
18
+ <%- if @showdocs -%>
19
+ log "A custom JQ wrapper is used to parse data passed through from Rbcli"
20
+ log "For more information on how to use it, see: https://jqlang.github.io/jq/"
21
+ log ""
22
+
23
+ log "Top-level CLI Options: $(rbcli opts .)"
24
+ log "Parameters: $(rbcli params .)"
25
+ log "Arguments on the CLI: $(rbcli args .)"
26
+ log "Config: $(rbcli config .)"
27
+ log "Environment Variables: $(rbcli env .)"
28
+ log "Custom Var from command: $(rbcli vars .foo)"
29
+ log "Same variable, in environment: ${FOO}"
30
+
31
+ log "Logs are integrated too"
32
+ log "Example Debug (you need to change your log level to see this)" "debug"
33
+ log "Example Info" "info"
34
+ log "Example Warning" "warn"
35
+ log "Example Error" "error"
36
+ log "Example Fatal" "fatal"
37
+ log "Example Unknown" "unknown"
38
+ <%- else -%>
39
+ rbcli opts .
40
+ log "Example Warning" "warn"
41
+ <%- end -%>
42
+ INLINE
43
+ end
@@ -1,38 +1,33 @@
1
1
  #!/usr/bin/env bash
2
2
  ##################################################################################
3
- # RBCli -- A framework for developing command line applications in Ruby #
4
- # Copyright (C) 2018 Andrew Khoury #
5
- # #
6
- # This program is free software: you can redistribute it and/or modify #
7
- # it under the terms of the GNU General Public License as published by #
8
- # the Free Software Foundation, either version 3 of the License, or #
9
- # (at your option) any later version. #
10
- # #
11
- # This program is distributed in the hope that it will be useful, #
12
- # but WITHOUT ANY WARRANTY; without even the implied warranty of #
13
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
14
- # GNU General Public License for more details. #
15
- # #
16
- # You should have received a copy of the GNU General Public License #
17
- # along with this program. If not, see <https://www.gnu.org/licenses/>. #
18
- # #
19
- # For questions regarding licensing, please contact andrew@blacknex.us #
3
+ # Rbcli -- A framework for developing command line applications in Ruby #
4
+ # Copyright (C) 2024 Andrew Khoury <akhoury@live.com> #
20
5
  ##################################################################################
21
-
22
- ## Log message
6
+ ## Basic message
23
7
  function message {
24
8
  if [ "$2" == "err" ]; then
25
9
  COLOR='\033[00;31m'
26
10
  else
27
-
28
11
  COLOR='\033[00;32m'
29
12
  fi
30
13
 
31
14
  if [ "$2" == "no_newline" ]; then
32
- printf "${COLOR}[RBCLI-Setup] ${1}\033[0m"
15
+ printf "${COLOR}${1}\033[0m"
33
16
  else
34
- echo -e "${COLOR}[RBCLI-Setup] ${1}\033[0m"
17
+ echo "${COLOR}${1}\033[0m"
18
+ fi
19
+ }
20
+
21
+ ## Log function integrates with Rbcli Logger
22
+ function log {
23
+ prefix='INFO || '
24
+ if [ ! -z ${2+x} ]; then
25
+ _pfx="$(echo "${2}" | tr '[:lower:]' '[:upper:]')"
26
+ if [[ "${_pfx}" =~ ^(DEBUG|INFO|WARN|ERROR|FATAL|UNKNOWN)$ ]]; then
27
+ prefix="${_pfx} || "
28
+ fi
35
29
  fi
30
+ echo "${prefix}${1}"
36
31
  }
37
32
 
38
33
  ## Detect OS
@@ -87,7 +82,6 @@ function install_jq {
87
82
  esac
88
83
  }
89
84
 
90
-
91
85
  # We need to make sure JQ is installed so that we can parse variables
92
86
  which jq &> /dev/null
93
87
  _RESULT=$?
@@ -97,36 +91,37 @@ if [[ "${_RESULT}" -ne 0 ]]; then
97
91
  install_jq
98
92
  fi
99
93
 
100
-
101
94
  ######
102
95
  ## RBCLI
103
96
  ######
104
- # This function provides an interface to the variables exposed by RBCli
97
+ # This function provides an interface to the variables exposed by Rbcli
105
98
  function rbcli {
106
99
  _vargroup=$1
107
100
  _var=$2
108
101
 
109
102
  case "${_vargroup}" in
103
+ opts)
104
+ _groupname='__RBCLI_OPTS'
105
+ ;;
110
106
  params)
111
107
  _groupname='__RBCLI_PARAMS'
112
108
  ;;
113
109
  args)
114
110
  _groupname='__RBCLI_ARGS'
115
111
  ;;
116
- global_opts)
117
- _groupname='__RBCLI_GLOBAL'
118
- ;;
119
112
  config)
120
113
  _groupname='__RBCLI_CONFIG'
121
114
  ;;
122
- myvars)
123
- _groupname='__RBCLI_MYVARS'
115
+ env)
116
+ _groupname='__RBCLI_ENV'
117
+ ;;
118
+ vars)
119
+ _groupname='__RBCLI_VARS'
124
120
  ;;
125
121
  *)
126
- message "Invalid RBCLI variable reference. Please reference variables from one of the following groups: params, args, global_opts, config, commandvars." "err"
122
+ message "Invalid RBCLI variable reference. Please reference variables from one of the following groups: opts, params, args, config, env, vars." "err"
127
123
  exit 1
128
124
  esac
129
- echo $(echo ${!_groupname} | jq -r "${2}")
125
+ echo "$(echo ${!_groupname} | jq -r "${_var}")"
130
126
  }
131
- export -f rbcli
132
-
127
+ export -f rbcli
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+ ##################################################################################
3
+ # Rbcli -- A framework for developing command line applications in Ruby #
4
+ # Copyright (C) 2024 Andrew Khoury <akhoury@live.com> #
5
+ ##################################################################################
6
+ require 'json'
7
+ require 'open3'
8
+
9
+ class Rbcli::ScriptWrapper
10
+ def initialize inline: nil, path: nil, vars: nil
11
+ @inline = inline
12
+ @path = path.nil? ? nil : File.expand_path(path)
13
+ @vars = vars || []
14
+ end
15
+
16
+ def execute opts = nil, params = nil, args = nil, config = nil, env = nil
17
+ sh_libpath = File.expand_path(File.join(File.dirname(__FILE__), 'lib-rbcli.sh'))
18
+ if @inline.nil? && !@path.nil?
19
+ cmd = File.read(@path).include?('lib-rbcli.sh') ? '' : "source '#{sh_libpath}'; "
20
+ cmd += "source '#{@path}'"
21
+ inject_rbcli = false
22
+ else
23
+ cmd = @inline
24
+ inject_rbcli = true
25
+ end
26
+ self.class.run_script cmd, opts: opts, params: params, args: args, config: config, env: env, vars: @vars, inject_rbcli: inject_rbcli
27
+ end
28
+
29
+ def self.run_script cmd, opts: nil, params: nil, args: nil, config: nil, env: nil, vars: nil, inject_rbcli: true,
30
+ capture_output: false, silent: false, prefix: nil, color: nil, bgcolor: nil
31
+ envs = {}
32
+ %w(opts params args config env vars).each do |k|
33
+ envs["__RBCLI_#{k.upcase}"] = eval("#{k}.nil?") ? [].to_json : eval("#{k}.to_json")
34
+ end
35
+ vars.each do |k, v|
36
+ envs[k.to_s.upcase] = v
37
+ end unless vars.nil?
38
+
39
+ if inject_rbcli && !cmd.include?('lib-rbcli.sh')
40
+ sh_libpath = File.expand_path(File.join(File.dirname(__FILE__), 'lib-rbcli.sh'))
41
+ cmd = cmd.lines.insert((cmd.start_with?('#!') ? 1 : 0), "source '#{sh_libpath}'\n").join
42
+ end
43
+
44
+ output = +''
45
+ retval = nil
46
+ prefix ||= ''
47
+ Open3.popen2e(envs, cmd) do |_stdin, stdout_and_stderr, wait_threads|
48
+ until (line = stdout_and_stderr.gets).nil? do
49
+ if line.include?(' || ')
50
+ severity, text = line.split(' || ', 2)
51
+ else
52
+ severity = 'INFO'
53
+ text = line
54
+ end
55
+ output << text
56
+ Rbcli.log.add(Logger.const_get(severity.upcase.to_sym), prefix + text.chomp.colorize(color: color, background: bgcolor), 'SCRP') unless silent
57
+ Rbcli.log.add(-1, prefix + text.chomp.colorize(color: color, background: bgcolor), 'SCRP') if silent
58
+ end
59
+ retval = wait_threads.value
60
+ end
61
+ Rbcli.log.debug "Return value of script was: #{retval}", "SCRP"
62
+ capture_output ? output : retval.success?
63
+ end
64
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+ ##################################################################################
3
+ # Rbcli -- A framework for developing command line applications in Ruby #
4
+ # Copyright (C) 2024 Andrew Khoury <akhoury@live.com> #
5
+ ##################################################################################
6
+ require 'fileutils'
7
+
8
+ module Rbcli::UserConf
9
+ end
10
+
11
+ class Rbcli::UserConf::Backend
12
+ @registered_types = {}
13
+
14
+ def self.types
15
+ {
16
+ yaml: Proc.new { |filename| filename.is_a?(String) && (filename.downcase.end_with?('.yaml') || filename.downcase.end_with?('.yml')) },
17
+ json: Proc.new { |filename| filename.is_a?(String) && filename.downcase.end_with?('.json') },
18
+ ini: Proc.new { |filename| filename.is_a?(String) && filename.downcase.end_with?('.ini') },
19
+ toml: Proc.new { |filename| filename.is_a?(String) && filename.downcase.end_with?('.toml') },
20
+ env: Proc.new { |filename| false },
21
+ null: Proc.new { |filename| true }
22
+ }
23
+ end
24
+
25
+ def self.inherited(subklass)
26
+ @registered_types[subklass.name.split('::').last.sub(/Store$/, '').downcase.to_sym] = subklass
27
+ end
28
+
29
+ def self.create filename, type: nil
30
+ type ||= self.types.map { |slug, check| [slug, check.call(filename)] }.to_h.select { |slug, match| match }.first.first
31
+ type = type.to_s.downcase.to_sym
32
+ require_relative "backends/#{type.to_s}"
33
+ @registered_types[type].new(filename, type)
34
+ end
35
+
36
+ def initialize filename, type
37
+ @path = File.expand_path(filename)
38
+ @path = File.realpath(@path) if File.symlink?(@path)
39
+ @type = type.to_s.capitalize
40
+ @loaded = false
41
+ end
42
+
43
+ attr_reader :type, :loaded
44
+ alias_method :loaded?, :loaded
45
+
46
+ # The defaults: parameter is used on some backends to know which fields to expect and parse
47
+ def load defaults: nil
48
+ begin
49
+ text = File.read(@path)
50
+ rescue Errno::ENOENT => _
51
+ Rbcli.log.debug "Attempted to load #{@type} config file but did not find it at '#{@path}'", "CONF"
52
+ else
53
+ Rbcli.log.debug "Loaded #{@type} config file at '#{@path}'", "CONF"
54
+ self.parse(text)
55
+ end
56
+ end
57
+
58
+ def save hash
59
+ Rbcli.log.debug "Saving #{@type} config file at '#{@path}'", "CONF"
60
+ begin
61
+ File.write(@path, self.unparse(hash))
62
+ rescue Errno => err
63
+ Rbcli.log.error "Could not save config to file at '#{@path}'", "CONF"
64
+ Rbcli.log.error "Error: #{err.message}", "CONF"
65
+ false
66
+ else
67
+ hash
68
+ end
69
+ end
70
+
71
+ def savable?
72
+ File.writable?(File.exist?(@path) ? @path : File.dirname(@path))
73
+ end
74
+
75
+ def exist?
76
+ File.exist?(@path)
77
+ end
78
+
79
+ def annotate! defaults
80
+ begin
81
+ text = File.read(@path)
82
+ rescue Errno::ENOENT => _
83
+ Rbcli.log.debug "Attempted to annotate #{@type} config file but did not find it at '#{@path}'", "CONF"
84
+ return nil
85
+ end
86
+ Rbcli.log.debug "Annotating #{@type} config file at '#{@path}'", "CONF"
87
+
88
+ text = self.inject_banner(text, defaults[:helptext])
89
+ File.write(@path, text)
90
+
91
+ begin
92
+ File.write(@path, text)
93
+ Rbcli.log.debug "Saved #{@type} annotations at '#{@path}'", "CONF"
94
+ rescue Errno => err
95
+ Rbcli.log.error "Could not save annotations to '#{@path}'", "CONF"
96
+ Rbcli.log.error "Error: #{err.message}", "CONF"
97
+ return nil
98
+ else
99
+ return true
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+ ##################################################################################
3
+ # Rbcli -- A framework for developing command line applications in Ruby #
4
+ # Copyright (C) 2024 Andrew Khoury <akhoury@live.com> #
5
+ ##################################################################################
6
+ require_relative 'helpers/deep_assign'
7
+
8
+ class Rbcli::UserConf::Env < Rbcli::UserConf::Backend
9
+ include Rbcli::UserConf::Helpers::DeepAssign
10
+
11
+ def initialize prefix, type
12
+ @prefix = prefix
13
+ @type = type.to_s.capitalize
14
+ @loaded = false
15
+ end
16
+
17
+ def load defaults: nil
18
+ vars = ENV.select { |k, v| k.match(/^#{@prefix}_.+/i) && !k.match(/^_/) }
19
+ if @prefix.nil? && !defaults.nil? && !defaults.empty?
20
+ lowercase_default_keys = defaults.keys.map { |k| k.downcase.to_sym }
21
+ vars = vars.merge ENV.select { |k, v| lowercase_default_keys.include?(k.downcase.to_sym) }
22
+ end
23
+ vars = vars.map { |k, v| [k.split('_', 2).last.downcase, v] }.to_h
24
+ final_vars = Hash.new
25
+ vars.each do |key, value|
26
+ deep_assign(final_vars, key.split('_').map { |k| k.to_sym }, translate_value(value))
27
+ end
28
+ if @prefix.nil? && !defaults.nil? && !defaults.empty?
29
+ lowercase_default_keys = defaults.keys.map { |k| k.downcase.to_sym }
30
+ vars = ENV.select { |k, v| lowercase_default_keys.include?(k.downcase.to_sym) }.map { |k, v| [k.downcase.to_sym, v] }.to_h
31
+ end
32
+ @loaded = true
33
+ final_vars
34
+ end
35
+
36
+ def save hash, path = []
37
+ hash.each do |key, value|
38
+ if !value.is_a? Hash
39
+ ENV[([@prefix] + path + [key.upcase]).reject(&:nil?).join('_')] = (value.is_a?(Symbol) ? ':' : '') + value.to_s
40
+ else
41
+ save value, path + [key.upcase]
42
+ end
43
+ end
44
+ end
45
+
46
+ def parse_defaults defaults
47
+ final_vars = Hash.new
48
+ defaults.each do |key, value|
49
+ key_parts = key.to_s.split('_').map { |k| k.downcase.to_sym }
50
+ key_parts.delete_at(0) if key_parts.first == @prefix.to_s.downcase.to_sym
51
+ deep_assign(final_vars, key_parts, value.is_a?(String) ? translate_value(value) : value)
52
+ end
53
+ final_vars
54
+ end
55
+
56
+ def savable?
57
+ true
58
+ end
59
+
60
+ def exist?
61
+ true
62
+ end
63
+
64
+ def annotate! _defaults = nil
65
+ true
66
+ end
67
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+ ##################################################################################
3
+ # Rbcli -- A framework for developing command line applications in Ruby #
4
+ # Copyright (C) 2024 Andrew Khoury <akhoury@live.com> #
5
+ ##################################################################################
6
+ require 'json'
7
+ module Rbcli::UserConf::Helpers
8
+ module DeepAssign
9
+
10
+ private
11
+
12
+ def deep_assign hash, sections_arr, value
13
+ if sections_arr.length == 1
14
+ hash[sections_arr.first] = value
15
+ else
16
+ hash[sections_arr.first] ||= Hash.new
17
+ deep_assign(hash[sections_arr.first], sections_arr[1..-1], value)
18
+ end
19
+ end
20
+
21
+ def translate_value value
22
+ if value.nil?
23
+ nil
24
+ elsif value.start_with?(':')
25
+ value[1..-1].to_sym
26
+ elsif value.downcase == 'true'
27
+ true
28
+ elsif value.downcase == 'false'
29
+ false
30
+ elsif value.to_i.to_s == value
31
+ value.to_i
32
+ elsif value.start_with?('[') && value.end_with?(']') # array
33
+ begin
34
+ JSON.parse(value)
35
+ rescue JSON::ParserError => _err
36
+ value
37
+ end
38
+ else
39
+ begin
40
+ Float value
41
+ rescue => _err
42
+ value
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+ ##################################################################################
3
+ # Rbcli -- A framework for developing command line applications in Ruby #
4
+ # Copyright (C) 2024 Andrew Khoury <akhoury@live.com> #
5
+ ##################################################################################
6
+ require_relative 'helpers/deep_assign'
7
+
8
+ class Rbcli::UserConf::Ini < Rbcli::UserConf::Backend
9
+ include Rbcli::UserConf::Helpers::DeepAssign
10
+
11
+ private
12
+
13
+ def parse str
14
+ ini = Hash.new
15
+ nest = []
16
+ str.lines.each_with_index do |line, i|
17
+ line = line.split(';').first.strip
18
+ next if line.nil? || line.empty?
19
+ if line =~ /^\[(.*)\]$/
20
+ nest = $1.split('.')
21
+ elsif line.include?('=')
22
+ key, value = line.split('=').map { |part| part.strip }
23
+ deep_assign(ini, nest + [key], translate_value(value))
24
+ else
25
+ Rbcli.log.warn "Invalid #{@type} syntax found on line #{i} at '#{@path}'. Offending syntax: #{line}", "CONF"
26
+ return Hash.new
27
+ end
28
+ end
29
+ @loaded = true
30
+ ini
31
+ end
32
+
33
+ def unparse hash
34
+ ini = []
35
+ parse_hash = Proc.new do |hsh, keys = []|
36
+ hsh.each do |key, val|
37
+ if !val.is_a?(Hash)
38
+ val = ":#{val.to_s}" if val.is_a?(Symbol)
39
+ ini << "#{key.to_s.strip} = #{val.to_s.strip}"
40
+ else
41
+ ini << '[' + (keys + [key]).join('.') + ']'
42
+ parse_hash.call(val, keys + [key])
43
+ end
44
+ end
45
+ end
46
+ parse_hash.call(hash)
47
+ ini.join("\n")
48
+ end
49
+
50
+ def inject_banner text, banner
51
+ banner.lines.map { |line| "; #{line.chomp}" }.join("\n") + "\n" + text
52
+ end
53
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+ ##################################################################################
3
+ # Rbcli -- A framework for developing command line applications in Ruby #
4
+ # Copyright (C) 2024 Andrew Khoury <akhoury@live.com> #
5
+ ##################################################################################
6
+ require 'json'
7
+
8
+ class Rbcli::UserConf::Json < Rbcli::UserConf::Backend
9
+ private
10
+
11
+ def parse str
12
+ begin
13
+ parsed_str = JSON.parse(str)
14
+ rescue JSON::JSONError => e
15
+ Rbcli.log.warn "Invalid #{@type} syntax found at '#{@path}'", "CONF"
16
+ Rbcli.log.warn e.message, "CONF"
17
+ Hash.new
18
+ else
19
+ @loaded = true
20
+ parsed_str
21
+ end
22
+ end
23
+
24
+ def unparse hash
25
+ JSON.pretty_generate(hash)
26
+ end
27
+
28
+ def inject_banner text, _banner
29
+ text
30
+ end
31
+
32
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+ ##################################################################################
3
+ # Rbcli -- A framework for developing command line applications in Ruby #
4
+ # Copyright (C) 2024 Andrew Khoury <akhoury@live.com> #
5
+ ##################################################################################
6
+ class Rbcli::UserConf::Null < Rbcli::UserConf::Backend
7
+ def initialize filename, type
8
+ @type = type.to_s.upcase
9
+ @loaded = false
10
+ end
11
+
12
+ def load defaults: nil
13
+ @loaded = true
14
+ {}
15
+ end
16
+
17
+ def save hash
18
+ hash
19
+ end
20
+
21
+ def savable?
22
+ true
23
+ end
24
+
25
+ def exist?
26
+ true
27
+ end
28
+
29
+ def annotate! _defaults = nil
30
+ true
31
+ end
32
+ end