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,178 @@
1
+ ##################################################################################
2
+ # Rbcli -- A framework for developing command line applications in Ruby #
3
+ # Copyright (C) 2024 Andrew Khoury <akhoury@live.com> #
4
+ ##################################################################################
5
+ require_relative 'optimist/optimist'
6
+ require 'stringio'
7
+ module Rbcli::Parser
8
+ @parser = Optimist::Parser.new
9
+
10
+ def self.add_opt * args
11
+ Rbcli.log.debug "Set top-level opt argument: #{args}", "OPTS"
12
+ Rbcli::Warehouse.set(:opts, [], :unparsedopts) if Rbcli::Warehouse.get(:opts, :unparsedopts).nil?
13
+ Rbcli::Warehouse.get(:opts, :unparsedopts) << args
14
+ end
15
+
16
+ def self.parse
17
+ appinfo = Rbcli::Warehouse.get(nil, :appinfo) || {}
18
+ bannerstr = "#{appinfo[:appname] || EXECUTABLE}" + (appinfo[:version].nil? ? "\n" : " version: #{appinfo[:version]}\n")
19
+ unless appinfo[:copyright_year].nil? && appinfo[:author].nil?
20
+ bannerstr += "Copyright (C) #{appinfo[:copyright_year]} " unless appinfo[:copyright_year].nil?
21
+ bannerstr += "by #{appinfo[:author]}" if appinfo[:author].is_a? String
22
+ bannerstr += "by #{appinfo[:author].join(', ')}" if appinfo[:author].is_a? Array
23
+ bannerstr += " <#{appinfo[:email]}>" unless appinfo[:author].nil? || appinfo[:email].nil?
24
+ bannerstr += "\n"
25
+ end
26
+ bannerstr += "License: #{appinfo[:license]}\n" unless appinfo[:license].nil?
27
+ bannerstr += "\n"
28
+ bannerstr += appinfo[:helptext].chomp + "\n\n" unless appinfo[:helptext].nil?
29
+ bannerstr += "Usage:\n #{EXECUTABLE} [options] command [parameters]\n\n"
30
+
31
+ non_default_commands = Rbcli::Warehouse.get(:commands).select { |_name, cmd| !cmd.default? }
32
+ if non_default_commands.count > 0
33
+ bannerstr += "For more information on individual commands, run `#{EXECUTABLE} <command> -h`\n\n"
34
+ bannerstr += "Commands:\n"
35
+ leftcol_width = non_default_commands.keys.map(&:length).max + 6
36
+ bannerstr += non_default_commands.map { |name, cmd| " " + name + (" " * (leftcol_width - name.length)) + (cmd.description || '') }.join("\n")
37
+ end
38
+
39
+ @parser.synopsis bannerstr
40
+ (Rbcli::Warehouse.get(:opts, :unparsedopts) || []).each { |args| @parser.opt *args }
41
+ @parser.stop_on(non_default_commands.select { |_name, cmd| !cmd.default? }.keys)
42
+
43
+ begin
44
+ opts = @parser.parse
45
+ Rbcli::Warehouse.set(:opts, opts, :parsedopts)
46
+ Rbcli.log.debug "Found options: #{opts}", "OPTS"
47
+ rescue Optimist::CommandlineError => e
48
+ Rbcli.log.fatal e.message
49
+ Rbcli.log.fatal "Run `#{EXECUTABLE} -h` for more information"
50
+ Rbcli::exit 1
51
+ rescue Optimist::HelpNeeded
52
+ stream = StringIO.new
53
+ @parser.educate(stream)
54
+ Rbcli.log.info stream.string, "OPTS"
55
+ Rbcli::exit 0
56
+ rescue Optimist::VersionNeeded
57
+ Rbcli.log.info bannerstr.lines.first.chomp, "OPTS"
58
+ Rbcli::exit 0
59
+ end
60
+ end
61
+
62
+ def self.parse_command
63
+ cmd = { name: nil, command: nil, params: {}, args: [] }
64
+ cmd[:name] = !ARGV.first.nil? && !ARGV.first.start_with?('-') ? ARGV.shift.downcase : nil
65
+ default_command = Rbcli::Warehouse.get(:commands).values.select { |c| c.default? }.first
66
+ if cmd[:name].nil? && default_command.nil?
67
+ # CLI: Not given, Default: Not Set -- Educate
68
+ Rbcli.log.debug "Command not given, and no default command set. Displaying help.", "OPTS"
69
+ stream = StringIO.new
70
+ @parser.educate(stream)
71
+ Rbcli.log.info stream.string, "OPTS"
72
+ Rbcli::exit 0
73
+ elsif cmd[:name].nil?
74
+ # CLI: Not given, Default: Set -- Use Default
75
+ cmd[:command] = default_command
76
+ Rbcli.log.debug "Using default command: '#{cmd[:command].name}'", "OPTS"
77
+ elsif Rbcli::Warehouse.get(:commands).key?(cmd[:name])
78
+ # CLI: Given, Default: Not Set, Command: Found -- Use Command
79
+ cmd[:command] = Rbcli::Warehouse.get(:commands)[cmd[:name]]
80
+ Rbcli.log.debug "Using command: '#{cmd[:command].name}'", "OPTS"
81
+ elsif !default_command.nil?
82
+ # CLI: Given, Default: Set, Command: Not Found -- Pass it as an argument
83
+ cmd[:args] << cmd[:name]
84
+ while !ARGV.first.nil? && !ARGV.first.start_with?('-')
85
+ cmd[:args] << ARGV.shift
86
+ end
87
+ cmd[:command] = default_command
88
+ Rbcli.log.debug "Using default command: '#{cmd[:command].name}' with args: #{cmd[:args]}", "OPTS"
89
+ else
90
+ # CLI: Given, Default: Not Set, Command: Not Found -- Fail
91
+ Rbcli.log.fatal "Unknown command: '#{cmd[:name]}'", "OPTS"
92
+ Rbcli.log.fatal "Run `#{EXECUTABLE} -h` for more information", "OPTS"
93
+ Rbcli::exit 1
94
+ end
95
+ Rbcli::Warehouse.set(:command, cmd[:command], :parsedopts)
96
+
97
+ parser = Optimist::Parser.new
98
+
99
+ # We set the educate text
100
+ appinfo = Rbcli::Warehouse.get(nil, :appinfo) || {}
101
+ bannerstr = "#{appinfo[:appname] || EXECUTABLE}" + (appinfo[:version].nil? ? "\n" : " version: #{appinfo[:version]}\n")
102
+ bannerstr += "\n"
103
+ bannerstr += "Command: #{cmd[:command].name}\n\n"
104
+ bannerstr += cmd[:command].helptext.chomp + "\n\n" unless cmd[:command].helptext.nil?
105
+ bannerstr += "Usage:\n #{EXECUTABLE} #{cmd[:command].name} #{cmd[:command].usage.chomp}" unless cmd[:command].usage.nil?
106
+ parser.synopsis(bannerstr)
107
+
108
+ # Then we add the options from the command
109
+ cmd[:command].params.each { |param| parser.opt *param }
110
+
111
+ begin
112
+ cmd[:params] = parser.parse
113
+ Rbcli::Warehouse.set(:params, cmd[:params], :parsedopts)
114
+ Rbcli.log.debug "Found parameters for command '#{cmd[:command].name}': #{cmd[:params]}", "OPTS"
115
+ rescue Optimist::CommandlineError => e
116
+ Rbcli.log.fatal e.message
117
+ Rbcli.log.fatal "Run `#{EXECUTABLE} #{cmd[:command].name} -h` for more information", "OPTS"
118
+ Rbcli::exit 1
119
+ rescue Optimist::HelpNeeded
120
+ stream = StringIO.new
121
+ parser.educate(stream)
122
+ Rbcli.log.info stream.string, "OPTS"
123
+ Rbcli::exit 0
124
+ end
125
+
126
+ cmd[:args].concat(ARGV)
127
+ Rbcli::Warehouse.set(:args, cmd[:args], :parsedopts)
128
+ ARGV.clear
129
+ end
130
+
131
+ def self.prompt_for_missing
132
+ Rbcli::Warehouse.get(:command, :parsedopts).params
133
+ .select { |args| !args[2].nil? && !args[2].empty? && args[2][:prompt].is_a?(String) }
134
+ .reject { |args| Rbcli::Warehouse.get(:params, :parsedopts).key?((args[0].to_s + '_given').to_sym) }
135
+ .map { |args| { name: args[0].to_sym, prompt: args[2][:prompt], default: args[2][:default], type: args[2][:type].nil? ? nil : args[2][:type].to_s.chomp('s').to_sym } }
136
+ .each do |opt|
137
+ prompt_string = opt[:prompt].strip
138
+ param_value = Rbcli::Warehouse.get(:params, :parsedopts)[opt[:name]]
139
+ if param_value.is_a?(TrueClass) || param_value.is_a?(FalseClass)
140
+ prompt_string += ' (' + (param_value ? 'Y' : 'y') + '/' + (param_value ? 'n' : 'N') + ')'
141
+ opt[:default] = param_value if opt[:default].nil?
142
+ elsif !opt[:default].nil?
143
+ prompt_string != " (default: #{opt[:default]})"
144
+ end
145
+ prompt_string += ':' unless %w(. ? ! :).include?(opt[:prompt][-1])
146
+ prompt_string += ' '
147
+
148
+ answer = nil
149
+ while answer.nil?
150
+ Rbcli.log.info prompt_string, "OPTS"
151
+ answer = gets.chomp
152
+ if [nil, :flag, :bool, :boolean, :trueclass, :falseclass].include?(opt[:type])
153
+ answer = { 'y' => true, 'n' => false, '' => opt[:default] }[(answer[0] || '').downcase]
154
+ next
155
+ end
156
+ if answer == ''
157
+ Rbcli.log.debug "Using default value of #{opt[:default]} for --#{opt[:name].to_s}", "OPTS"
158
+ answer = opt[:default]
159
+ end
160
+ begin
161
+ parser = Optimist::Parser.new
162
+ parser.opt(opt[:name], '', type: opt[:type])
163
+ newopts = parser.parse ["--#{opt[:name].to_s}", answer]
164
+ rescue Optimist::CommandlineError, Optimist::HelpNeeded, Optimist::VersionNeeded
165
+ Rbcli.log.debug "Invalid answer for type #{opt[:type]}", "OPTS"
166
+ answer = nil
167
+ else
168
+ answer = newopts[opt[:name]]
169
+ end
170
+ end
171
+ Rbcli::Warehouse.get(:params, :parsedopts)[opt[:name]] = answer
172
+ end
173
+ end
174
+
175
+ Rbcli::Engine.register_operation self.method(:parse), name: :cliopts_top_parse, priority: 10
176
+ Rbcli::Engine.register_operation self.method(:parse_command), name: :cliopts_command_parse, priority: 20
177
+ Rbcli::Engine.register_operation self.method(:prompt_for_missing), name: :cliopts_prompts, priority: 30
178
+ end
@@ -0,0 +1,35 @@
1
+ Rbcli::Configurate.cli do
2
+ <%- if @showdocs -%>
3
+ ##### Core Configuration (Required) #####
4
+ # appname (Optional) - Defaults to the name of the executable
5
+ # author (Optional) - A name or array of names
6
+ # email (Optional) - An email for users to contact
7
+ # version (Optional) - major.minor.patch notation, required if using update checks
8
+ # copyright_year (Optional) - Self explanatory
9
+ # license (Optional) - Convention is to use an identifier from here: https://spdx.org/licenses/
10
+ # helptext (Optional) - Text that gets shown with --help or -h
11
+ <%- end -%>
12
+ appname nil
13
+ author nil
14
+ email nil
15
+ version <%= @appname.capitalize %>::VERSION
16
+ copyright_year <%= Time.now.year %>
17
+ license nil
18
+ helptext "This text shows up in `<%= @appname.downcase %> --help`"
19
+ <%- if @showdocs -%>
20
+ ##### CLI Options (Optional) #####
21
+ # These appear to commands as `opts`.
22
+ # Format:
23
+ # opt :name, "Description"[, optional arguments ]
24
+ # Optional Arguments:
25
+ # long: Specify the long form (--long) version of an argument. (Default: same as the name)
26
+ # short: Specify the short form (-s) version of an argument. (Default: first letter of the name)
27
+ # type: Specify the type. Valid options are :boolean, :float, :integer, :string, :io, :date. (Default: :boolean)
28
+ # If the plural form of any of the above are used (i.e. ':strings') then the user can provide a comma-delimited list on the command line (--param=foo,bar)
29
+ # required: If set to true, requires that this option is provided by the user. (Default: false)
30
+ # multi: If set to true, allows the option to be provided multiple times (--param --param, or in short form, -pp). (Default: false)
31
+ # When using this with a :boolean type, rather than returning `true` or `false`, it will return a count of the number of times the parameter was passed.
32
+ # permitted: If set to an array, restricts input to the values within that array. (Default: nil (no restrictions))
33
+ <%- end -%>
34
+ opt :verbose, "Twice or more enables very-verbose output", multi: true
35
+ end
@@ -0,0 +1,52 @@
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
+ # TODO: Detect invalid network connections and skip
7
+ # TODO: Add a timeout
8
+ require 'rubygems'
9
+ module Rbcli::UpdateChecker
10
+ module Common
11
+ def check_for_updates
12
+ show_message if update_available?
13
+ end
14
+
15
+ private
16
+
17
+ def update_available?
18
+ Rbcli.log.debug "Checking for updates", "UPDT"
19
+ @latest_version = get_latest_version
20
+ unless @latest_version.nil?
21
+ begin
22
+ update_needed = Gem::Version.new(@latest_version) > Gem::Version.new(Rbcli::Warehouse.get(:version, :appinfo))
23
+ rescue ArgumentError => e
24
+ Rbcli.log.warn "Update check failed: #{e.message}"
25
+ false
26
+ else
27
+ Rbcli.log.debug "Latest version: #{@latest_version}", "UPDT"
28
+ Rbcli.log.debug "Current version: #{Rbcli::Warehouse.get(:version, :appinfo)}", "UPDT"
29
+ Rbcli.log.debug "Update not required", "UPDT" unless update_needed
30
+ update_needed
31
+ end
32
+ end
33
+ end
34
+
35
+ def show_message
36
+ Rbcli.log.warn "An update is available to #{Rbcli::Warehouse.get(:appname, :appinfo)} (#{Rbcli::Warehouse.get(:version, :appinfo)} -> #{@latest_version || get_latest_version})"
37
+ Rbcli.log.warn @message || update_message
38
+ if @force_update
39
+ Rbcli.log.error "This application requires that you update to the latest version to continue using it. It will now exit."
40
+ Rbcli::exit 25
41
+ end
42
+ end
43
+
44
+ def get_latest_version
45
+ raise Rbcli::Error.new "Update Checker type #{self.class.name} must define a 'check_for_updates' method."
46
+ end
47
+
48
+ def update_message
49
+ raise Rbcli::Error.new "Update Checker type #{self.class.name} must define an 'update_message' method."
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,42 @@
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 'rubygems'
7
+
8
+ module Rbcli::Configurate::UpdateChecker
9
+ include Rbcli::Configurable
10
+
11
+ def self.gem gem, force_update: false, message: nil
12
+ raise Rbcli::ConfigurateError.new "Only one update checker can be specified" if Rbcli::Warehouse.get(:updatecheck)
13
+ raise Rbcli::ConfigurateError.new "Gem name provided for update checker is not valid" if gem.nil? || !gem.is_a?(String) || gem.empty?
14
+ raise Rbcli::ConfigurateError.new "Force_update must be a boolean value" unless force_update.is_a?(TrueClass) || force_update.is_a?(FalseClass)
15
+ raise Rbcli::ConfigurateError.new "Version string must be set in Rbcli::Configurate.cli to configure update checks" if Rbcli::Warehouse.get(:version, :appinfo).nil?
16
+ begin
17
+ Gem::Version.new(Rbcli::Warehouse.get(:version, :appinfo))
18
+ rescue ArgumentError => e
19
+ raise Rbcli::ConfigurateError.new e.message
20
+ end
21
+ require File.join(RBCLI_LIBDIR, 'components', 'updatechecker', 'gem_checker')
22
+ Rbcli::Warehouse.set(:updatecheck, Rbcli::UpdateChecker::GemChecker.new(gem, force_update, message))
23
+ Rbcli::Engine.register_operation Rbcli::Warehouse.get(:updatecheck).method(:check_for_updates), name: :updatechecke_by_gem, priority: 60
24
+ Rbcli.log.debug "Registered update checker by gem for gem: #{gem}", "UPDT"
25
+ end
26
+
27
+ def self.github github_repo, access_token: nil, enterprise_hostname: nil, force_update: false, message: nil
28
+ raise Rbcli::ConfigurateError.new "Only one update checker can be specified" if Rbcli::Warehouse.get(:updatecheck)
29
+ raise Rbcli::ConfigurateError.new "Repo name provided for update checker is not valid" if github_repo.nil? || !github_repo.is_a?(String) || github_repo.empty?
30
+ raise Rbcli::ConfigurateError.new "Force_update must be a boolean value" unless force_update.is_a?(TrueClass) || force_update.is_a?(FalseClass)
31
+ raise Rbcli::ConfigurateError.new "Version string must be set in Rbcli::Configurate.cli to configure update checks" if Rbcli::Warehouse.get(:version, :appinfo).nil?
32
+ begin
33
+ Gem::Version.new(Rbcli::Warehouse.get(:version, :appinfo))
34
+ rescue ArgumentError => e
35
+ raise Rbcli::ConfigurateError.new e.message
36
+ end
37
+ require File.join(RBCLI_LIBDIR, 'components', 'updatechecker', 'github_checker')
38
+ Rbcli::Warehouse.set(:updatecheck, Rbcli::UpdateChecker::GithubChecker.new(github_repo, access_token, enterprise_hostname, force_update, message))
39
+ Rbcli::Engine.register_operation Rbcli::Warehouse.get(:updatecheck).method(:check_for_updates), name: :updatechecke_by_github, priority: 60
40
+ Rbcli.log.debug "Registered update checker by github repo for github_repo: #{github_repo}", "UPDT"
41
+ end
42
+ end
@@ -0,0 +1,40 @@
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 'common/common'
7
+ require 'rest-client'
8
+ require 'json'
9
+
10
+ module Rbcli::UpdateChecker
11
+ class GemChecker
12
+ include Common
13
+
14
+ def initialize gemname, force_update, message
15
+ @gemname = gemname
16
+ @url = "https://rubygems.org/api/v1/versions/#{gemname}/latest.json"
17
+ @force_update = force_update
18
+ @message = message
19
+ end
20
+
21
+ private
22
+
23
+ def get_latest_version
24
+ begin
25
+ response = RestClient::Request.execute(method: :get, url: @url, timeout: 1)
26
+ JSON.parse(response.body)['version']
27
+ rescue SocketError => e
28
+ Rbcli.log.debug ["Connection error when getting latest gem version", "#{e.message}", "Failing update check silently."].join("\n"), "UPDT"
29
+ nil
30
+ rescue Net::OpenTimeout => _e
31
+ Rbcli.log.debug "Autoupdate check failed - timeout while connecting to RubyGems API. Failing silently."
32
+ nil
33
+ end
34
+ end
35
+
36
+ def update_message
37
+ "Please run `gem update #{@gemname}` to upgrade to the latest version. You can preview it at: https://rubygems.org/gems/#{@gemname}/versions/#{@latest_version}"
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,46 @@
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 'common/common'
7
+ require 'octokit'
8
+
9
+ module Rbcli::UpdateChecker
10
+ class GithubChecker
11
+ include Common
12
+
13
+ def initialize reponame, access_token, enterprise_hostname, force_update, message
14
+ @reponame = reponame
15
+ @force_update = force_update
16
+ @message = message
17
+ @hostname = enterprise_hostname || "github.com"
18
+
19
+ Octokit.configure { |c| c.api_endpoint = "https://#{enterprise_hostname}/api/v3/" } if enterprise_hostname
20
+
21
+ #@client = Octokit::Client.new :client_id => client_id, :client_secret => client_secret
22
+ @client = Octokit::Client.new(access_token: access_token)
23
+ end
24
+
25
+ private
26
+
27
+ def get_latest_version
28
+ begin
29
+ @client.repo(@reponame).rels[:tags].get.data.map { |t| t[:name] }[0].sub(/^[v]*/, "")
30
+ rescue Faraday::ConnectionFailed => e
31
+ Rbcli.log.debug ["Connection error when getting latest version from github", "#{e.message}", "Failing update check silently"].join("\n"), "UPDT"
32
+ nil
33
+ rescue Octokit::TooManyRequests => e
34
+ Rbcli.log.debug ["Reached GitHub rate limit; too many requests", "#{e.message}", "Failing update check silently"].join("\n"), "UPDT"
35
+ nil
36
+ rescue NoMethodError => e
37
+ Rbcli.log.debug ["Repo was found but could not find the version tag", "#{e.message}", "Failing update check silently"].join("\n"), "UPDT"
38
+ nil
39
+ end
40
+ end
41
+
42
+ def update_message
43
+ "Please check the github repo https://#{@hostname}/#{@reponame} for instructions on how to update to the latest version"
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,14 @@
1
+ Rbcli::Configurate.updatechecker do
2
+ <%- if @showdocs -%>
3
+ ##### Update Check (Optional) #####
4
+ # The application can warn users when a new version is released
5
+ # Checks can be done either by rubygems or by a Github repo
6
+ # Private servers for Github (enterprise) are supported
7
+ #
8
+ # Setting force_update to true will halt execution until it is updated
9
+ #
10
+ # For Github, an access_token is required for private repos. See: https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens
11
+ <%- end -%>
12
+ # gem '<%= @appname.downcase %>', force_update: false, message: 'Please run `gem update <%= @appname.downcase %>` to upgrade to the latest version.'
13
+ # github 'repo/name', access_token: nil, enterprise_hostname: nil, force_update: false, message: 'Please download the latest version from Github'
14
+ end
@@ -1,60 +1,46 @@
1
+ # frozen_string_literal: true
1
2
  ##################################################################################
2
- # RBCli -- A framework for developing command line applications in Ruby #
3
- # Copyright (C) 2018 Andrew Khoury #
4
- # #
5
- # This program is free software: you can redistribute it and/or modify #
6
- # it under the terms of the GNU General Public License as published by #
7
- # the Free Software Foundation, either version 3 of the License, or #
8
- # (at your option) any later version. #
9
- # #
10
- # This program is distributed in the hope that it will be useful, #
11
- # but WITHOUT ANY WARRANTY; without even the implied warranty of #
12
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
13
- # GNU General Public License for more details. #
14
- # #
15
- # You should have received a copy of the GNU General Public License #
16
- # along with this program. If not, see <https://www.gnu.org/licenses/>. #
17
- # #
18
- # 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> #
19
5
  ##################################################################################
20
-
6
+ require 'rubygems'
21
7
 
22
8
  class Rbcli::DeprecationWarning
23
-
24
- @@warnings = []
25
- @@errors_exist = false
26
-
27
- def initialize original_feature_name, message_text, change_by_version, caller
28
- #@caller = caller_locations(2,1)[0].label
29
- @original_feature_name = original_feature_name
30
- @message_text = message_text
31
- @change_by_version = change_by_version
32
- @caller = caller
33
- @@warnings.append self
34
- end
35
-
36
- def display
37
- deprecated_version_parts = @change_by_version.split('.').map { |i| i.to_i }
38
- current_version_parts = Rbcli::VERSION.split('.').map { |i| i.to_i }
39
-
40
- if deprecated_version_parts[0] > current_version_parts[0] or
41
- deprecated_version_parts[1] > current_version_parts[1] or
42
- deprecated_version_parts[2] >= current_version_parts[2]
43
-
44
- message = "DEPRECATION ERROR: The feature `#{@original_feature_name}` has been deprecated as of Rbcli version #{@change_by_version}. #{@message_text} Please update the relevant code to continue using Rbcli."
45
- Rbcli::log.error { message }
46
- puts message.red
47
- @@errors_exist = true
48
- else
49
- message = "DEPRECATION WARNING: The feature `#{@original_feature_name}` has been deprecated. #{@message_text} This feature will be removed in version #{@change_by_version}."
50
- Rbcli::log.warn { message }
51
- puts message.yellow
52
- end
53
- puts @caller[0], ""
54
- end
55
-
56
- def self.display_warnings
57
- @@warnings.each { |w| w.display }
58
- exit(1) if @@errors_exist
59
- end
9
+ def initialize offending_object, warn_at: nil, deprecate_at: nil, message: nil
10
+ if offending_object.is_a?(String)
11
+ @offender = offending_object
12
+ @in_rbcli = offending_object.include?('Rbcli')
13
+ else
14
+ @offender = (offending_object.respond_to?(:name) && offending_object.name.include?('::')) ? @offender = offending_object.name : @offender = offending_object.class.name
15
+ @in_rbcli = offending_object.name.include?('Rbcli')
16
+ end
17
+ # @method = self.caller_locations[1].label
18
+ @message = message
19
+
20
+ raise Rbcli::ConfigurateError.new "The `warn_at` and `deprecate_at` values must both be set" if warn_at.nil? || deprecate_at.nil?
21
+ raise Rbcli::ConfigurateError.new "Version string must be set in Rbcli::Configurate.cli to use deprecation warnings" if !@in_rbcli && Rbcli::Warehouse.get(:version, :appinfo).nil?
22
+ @current_version = @in_rbcli ? Rbcli::VERSION : Gem::Version.new(Rbcli::Warehouse.get(:version, :appinfo))
23
+ @warning_version = Gem::Version.new(warn_at)
24
+ @error_version = Gem::Version.new(deprecate_at)
25
+ raise Rbcli::ConfigurateError.new "Warning version must come earlier than the deprecation version" if @warning_version >= @error_version
26
+
27
+ @callerstack = self.caller_locations
28
+ self.parse
29
+ end
30
+
31
+ private
32
+
33
+ def parse
34
+ if @current_version >= @error_version
35
+ Rbcli.log.error [
36
+ "DEPRECATION ERROR -- #{@offender.to_s}".red.bold + " -- The removal of this method is imminent. Please update your application accordingly.".red,
37
+ @message.nil? ? nil : @message.red
38
+ ].reject(&:nil?).map { |str| "DEPR".red + ' || ' + str }.join("\n"), "DEPR"
39
+ elsif @current_version >= @warning_version
40
+ Rbcli.log.warn [
41
+ "DEPRECATION WARNING -- #{@offender.to_s.yellow.bold}" + " -- This method is scheduled to be removed on version #{@error_version}. You are on version #{@current_version}.".yellow,
42
+ @message.nil? ? nil : @message.yellow
43
+ ].reject(&:nil?).map { |str| "DEPR".yellow + ' || ' + str }.join("\n"), "DEPR"
44
+ end
45
+ end
60
46
  end
@@ -0,0 +1,12 @@
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
7
+ class Error < StandardError; end
8
+
9
+ class ConfigurateError < Rbcli::Error; end
10
+
11
+ class CommandError < Rbcli::Error; end
12
+ end
@@ -0,0 +1,12 @@
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
7
+ @real_exit = method(:exit)
8
+
9
+ def self.exit code
10
+ @real_exit.call(code)
11
+ end
12
+ end
@@ -1,49 +1,34 @@
1
+ # frozen_string_literal: true
1
2
  ##################################################################################
2
- # RBCli -- A framework for developing command line applications in Ruby #
3
- # Copyright (C) 2018 Andrew Khoury #
4
- # #
5
- # This program is free software: you can redistribute it and/or modify #
6
- # it under the terms of the GNU General Public License as published by #
7
- # the Free Software Foundation, either version 3 of the License, or #
8
- # (at your option) any later version. #
9
- # #
10
- # This program is distributed in the hope that it will be useful, #
11
- # but WITHOUT ANY WARRANTY; without even the implied warranty of #
12
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
13
- # GNU General Public License for more details. #
14
- # #
15
- # You should have received a copy of the GNU General Public License #
16
- # along with this program. If not, see <https://www.gnu.org/licenses/>. #
17
- # #
18
- # 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> #
19
5
  ##################################################################################
20
6
 
21
-
22
7
  ##
23
8
  # Functions to convert hash keys to all symbols or all strings
24
9
  ##
25
10
  class Hash
26
- def deep_symbolize! hsh = nil
27
- hsh ||= self
28
- hsh.keys.each do |k|
29
- if k.is_a? String
30
- hsh[k.to_sym] = hsh[k]
31
- hsh.delete k
32
- end
33
- deep_symbolize! hsh[k.to_sym] if hsh[k.to_sym].is_a? Hash
34
- end
35
- hsh
36
- end
11
+ def deep_symbolize! hsh = nil
12
+ hsh ||= self
13
+ hsh.keys.each do |k|
14
+ if k.is_a? String
15
+ hsh[k.to_sym] = hsh[k]
16
+ hsh.delete k
17
+ end
18
+ deep_symbolize! hsh[k.to_sym] if hsh[k.to_sym].is_a? Hash
19
+ end
20
+ hsh
21
+ end
37
22
 
38
- def deep_stringify! hsh = nil
39
- hsh ||= self
40
- hsh.keys.each do |k|
41
- if k.is_a? Symbol
42
- hsh[k.to_s] = hsh[k]
43
- hsh.delete k
44
- end
45
- deep_stringify! hsh[k.to_s] if hsh[k.to_s].is_a? Hash
46
- end
47
- hsh
48
- end
49
- end
23
+ def deep_stringify! hsh = nil
24
+ hsh ||= self
25
+ hsh.keys.each do |k|
26
+ if k.is_a? Symbol
27
+ hsh[k.to_s] = hsh[k]
28
+ hsh.delete k
29
+ end
30
+ deep_stringify! hsh[k.to_s] if hsh[k.to_s].is_a? Hash
31
+ end
32
+ hsh
33
+ end
34
+ end
@@ -0,0 +1,10 @@
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 'base64'
7
+ require 'zlib'
8
+
9
+ String.instance_eval { define_method(:compress) { Base64.encode64(Zlib::Deflate.deflate(self)).chomp } }
10
+ String.instance_eval { define_method(:decompress) { Zlib::Inflate.inflate(Base64.decode64(self)) } }