rbcli 0.3.3 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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/{util → components/parser/optimist}/optimist.rb +134 -48
  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 -496
  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 -193
  62. data/CODE_OF_CONDUCT.md +0 -74
  63. data/Gemfile +0 -6
  64. data/Gemfile.lock +0 -92
  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 -75
  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 -11
  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 -1420
  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 -40
  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 -138
  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 -12
  159. data/docs/sitemap.xml +0 -81
  160. data/docs/tags/index.html +0 -1146
  161. data/docs/tags/index.xml +0 -11
  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 -47
  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 -12
  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 -199
  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 -116
  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-tool/generators.rb +0 -105
  471. data/lib/rbcli-tool/mdless_fix.rb +0 -406
  472. data/lib/rbcli-tool/project.rb +0 -120
  473. data/lib/rbcli-tool/util.rb +0 -70
  474. data/lib/rbcli-tool.rb +0 -37
  475. data/rbcli.gemspec +0 -73
  476. data/skeletons/micro/executable +0 -132
  477. data/skeletons/mini/executable +0 -247
  478. data/skeletons/project/.gitignore +0 -11
  479. data/skeletons/project/.rakeTasks +0 -7
  480. data/skeletons/project/.rbcli +0 -0
  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/{docs-src/.hugo_build.lock → 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