rbcli 0.3.2 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (506) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.md +9 -0
  3. data/LICENSE.txt +5 -670
  4. data/README.md +64 -160
  5. data/VERSION +1 -0
  6. data/exe/rbcli +181 -242
  7. data/lib/rbcli/components/commands/command.rb +120 -0
  8. data/lib/rbcli/components/commands/command.rb.erb +55 -0
  9. data/lib/rbcli/components/commands/command_old.rb +105 -0
  10. data/lib/rbcli/components/commands/script.rb.erb +43 -0
  11. data/{lib-sh → lib/rbcli/components/commands/scriptwrapper}/lib-rbcli.sh +29 -34
  12. data/lib/rbcli/components/commands/scriptwrapper/scriptwrapper.rb +64 -0
  13. data/lib/rbcli/components/config/backend.rb +102 -0
  14. data/lib/rbcli/components/config/backends/env.rb +67 -0
  15. data/lib/rbcli/components/config/backends/helpers/deep_assign.rb +47 -0
  16. data/lib/rbcli/components/config/backends/ini.rb +53 -0
  17. data/lib/rbcli/components/config/backends/json.rb +32 -0
  18. data/lib/rbcli/components/config/backends/null.rb +32 -0
  19. data/lib/rbcli/components/config/backends/toml.rb +38 -0
  20. data/lib/rbcli/components/config/backends/yaml.rb +31 -0
  21. data/lib/rbcli/components/config/component.rb +33 -0
  22. data/lib/rbcli/components/config/config.rb +165 -0
  23. data/lib/rbcli/components/config/config_of_death.rb +12 -0
  24. data/lib/rbcli/components/config/template.rb.erb +36 -0
  25. data/lib/rbcli/components/core/configurate.rb +63 -0
  26. data/lib/rbcli/components/core/engine.rb +30 -0
  27. data/lib/rbcli/components/core/warehouse.rb +18 -0
  28. data/lib/rbcli/components/envvars/component.rb +20 -0
  29. data/lib/rbcli/components/envvars/template.rb.erb +24 -0
  30. data/lib/rbcli/components/hooks/component.rb +36 -0
  31. data/lib/rbcli/components/hooks/template.rb.erb +20 -0
  32. data/lib/rbcli/components/logger/component.rb +32 -0
  33. data/lib/rbcli/components/logger/logger.rb +155 -0
  34. data/lib/rbcli/components/logger/lolcat/lol.rb +71 -0
  35. data/lib/rbcli/components/logger/template.rb.erb +40 -0
  36. data/lib/rbcli/components/parser/component.rb +33 -0
  37. data/lib/rbcli/components/parser/optimist/optimist.rb +1149 -0
  38. data/lib/rbcli/components/parser/parser.rb +178 -0
  39. data/lib/rbcli/components/parser/template.rb.erb +35 -0
  40. data/lib/rbcli/components/updatechecker/common/common.rb +52 -0
  41. data/lib/rbcli/components/updatechecker/component.rb +42 -0
  42. data/lib/rbcli/components/updatechecker/gem_checker.rb +40 -0
  43. data/lib/rbcli/components/updatechecker/github_checker.rb +46 -0
  44. data/lib/rbcli/components/updatechecker/template.rb.erb +14 -0
  45. data/lib/rbcli/util/deprecation_warning.rb +41 -55
  46. data/lib/rbcli/util/errors.rb +12 -0
  47. data/lib/rbcli/util/exit.rb +12 -0
  48. data/lib/rbcli/util/hash_deep_symbolize.rb +26 -41
  49. data/lib/rbcli/util/string_compression.rb +10 -0
  50. data/lib/rbcli/version.rb +5 -20
  51. data/lib/rbcli-tool/helpers.rb +58 -0
  52. data/lib/rbcli-tool/skeletons/gem.rb.erb +17 -0
  53. data/lib/rbcli-tool/skeletons/portable.rb.erb +48 -0
  54. data/lib/rbcli.rb +19 -50
  55. data/sig/rbcli.rbs +9 -0
  56. metadata +125 -495
  57. data/.gitignore +0 -60
  58. data/.rakeTasks +0 -7
  59. data/.rbenv-gemsets +0 -1
  60. data/.travis.yml +0 -5
  61. data/CHANGELOG.md +0 -181
  62. data/CODE_OF_CONDUCT.md +0 -74
  63. data/Gemfile +0 -6
  64. data/Gemfile.lock +0 -78
  65. data/Rakefile +0 -10
  66. data/bin/console +0 -33
  67. data/bin/setup +0 -28
  68. data/docs/404.html +0 -59
  69. data/docs/advanced/automatic_updates/index.html +0 -1174
  70. data/docs/advanced/command_types/index.html +0 -1262
  71. data/docs/advanced/distributed_state_locking/index.html +0 -1176
  72. data/docs/advanced/hooks/index.html +0 -1192
  73. data/docs/advanced/index.html +0 -1140
  74. data/docs/advanced/index.xml +0 -113
  75. data/docs/advanced/interactive_commands/index.html +0 -1177
  76. data/docs/advanced/logging/index.html +0 -1184
  77. data/docs/advanced/remote_execution/index.html +0 -1190
  78. data/docs/advanced/state_storage/index.html +0 -1281
  79. data/docs/advanced/user_config_files/index.html +0 -1209
  80. data/docs/categories/index.html +0 -1146
  81. data/docs/categories/index.xml +0 -10
  82. data/docs/css/atom-one-dark-reasonable.css +0 -77
  83. data/docs/css/auto-complete.css +0 -47
  84. data/docs/css/featherlight.min.css +0 -8
  85. data/docs/css/fontawesome-all.min.css +0 -1
  86. data/docs/css/hugo-theme.css +0 -254
  87. data/docs/css/hybrid.css +0 -102
  88. data/docs/css/nucleus.css +0 -615
  89. data/docs/css/perfect-scrollbar.min.css +0 -2
  90. data/docs/css/tags.css +0 -49
  91. data/docs/css/theme-blue.css +0 -111
  92. data/docs/css/theme-green.css +0 -111
  93. data/docs/css/theme-red.css +0 -111
  94. data/docs/css/theme.css +0 -1136
  95. data/docs/development/changelog/index.html +0 -1389
  96. data/docs/development/code_of_conduct/index.html +0 -1222
  97. data/docs/development/contributing/index.html +0 -1201
  98. data/docs/development/index.html +0 -1140
  99. data/docs/development/index.xml +0 -50
  100. data/docs/development/license/index.html +0 -1165
  101. data/docs/fonts/Inconsolata.eot +0 -0
  102. data/docs/fonts/Inconsolata.svg +0 -1
  103. data/docs/fonts/Inconsolata.ttf +0 -0
  104. data/docs/fonts/Inconsolata.woff +0 -0
  105. data/docs/fonts/Novecentosanswide-Normal-webfont.eot +0 -0
  106. data/docs/fonts/Novecentosanswide-Normal-webfont.svg +0 -1
  107. data/docs/fonts/Novecentosanswide-Normal-webfont.ttf +0 -0
  108. data/docs/fonts/Novecentosanswide-Normal-webfont.woff +0 -0
  109. data/docs/fonts/Novecentosanswide-Normal-webfont.woff2 +0 -0
  110. data/docs/fonts/Novecentosanswide-UltraLight-webfont.eot +0 -0
  111. data/docs/fonts/Novecentosanswide-UltraLight-webfont.svg +0 -1
  112. data/docs/fonts/Novecentosanswide-UltraLight-webfont.ttf +0 -0
  113. data/docs/fonts/Novecentosanswide-UltraLight-webfont.woff +0 -0
  114. data/docs/fonts/Novecentosanswide-UltraLight-webfont.woff2 +0 -0
  115. data/docs/fonts/Work_Sans_200.eot +0 -0
  116. data/docs/fonts/Work_Sans_200.svg +0 -1
  117. data/docs/fonts/Work_Sans_200.ttf +0 -0
  118. data/docs/fonts/Work_Sans_200.woff +0 -0
  119. data/docs/fonts/Work_Sans_200.woff2 +0 -0
  120. data/docs/fonts/Work_Sans_300.eot +0 -0
  121. data/docs/fonts/Work_Sans_300.svg +0 -1
  122. data/docs/fonts/Work_Sans_300.ttf +0 -0
  123. data/docs/fonts/Work_Sans_300.woff +0 -0
  124. data/docs/fonts/Work_Sans_300.woff2 +0 -0
  125. data/docs/fonts/Work_Sans_500.eot +0 -0
  126. data/docs/fonts/Work_Sans_500.svg +0 -1
  127. data/docs/fonts/Work_Sans_500.ttf +0 -0
  128. data/docs/fonts/Work_Sans_500.woff +0 -0
  129. data/docs/fonts/Work_Sans_500.woff2 +0 -0
  130. data/docs/images/clippy.svg +0 -1
  131. data/docs/images/favicon.png +0 -0
  132. data/docs/images/gopher-404.jpg +0 -0
  133. data/docs/imported/changelog/index.html +0 -1449
  134. data/docs/imported/index.html +0 -1191
  135. data/docs/imported/index.xml +0 -23
  136. data/docs/index.html +0 -1138
  137. data/docs/index.json +0 -183
  138. data/docs/index.xml +0 -208
  139. data/docs/js/auto-complete.js +0 -3
  140. data/docs/js/clipboard.min.js +0 -7
  141. data/docs/js/featherlight.min.js +0 -9
  142. data/docs/js/highlight.pack.js +0 -6
  143. data/docs/js/html5shiv-printshiv.min.js +0 -4
  144. data/docs/js/hugo-learn.js +0 -94
  145. data/docs/js/jquery-3.3.1.min.js +0 -2
  146. data/docs/js/jquery.sticky.js +0 -288
  147. data/docs/js/learn.js +0 -459
  148. data/docs/js/lunr.min.js +0 -6
  149. data/docs/js/modernizr.custom-3.6.0.js +0 -3
  150. data/docs/js/perfect-scrollbar.jquery.min.js +0 -2
  151. data/docs/js/perfect-scrollbar.min.js +0 -2
  152. data/docs/js/search.js +0 -93
  153. data/docs/mermaid/mermaid.css +0 -277
  154. data/docs/mermaid/mermaid.dark.css +0 -278
  155. data/docs/mermaid/mermaid.forest.css +0 -356
  156. data/docs/mermaid/mermaid.js +0 -8
  157. data/docs/quick_reference/index.html +0 -1246
  158. data/docs/quick_reference/index.xml +0 -11
  159. data/docs/sitemap.xml +0 -82
  160. data/docs/tags/index.html +0 -1146
  161. data/docs/tags/index.xml +0 -10
  162. data/docs/tutorial/10-getting_started/index.html +0 -1174
  163. data/docs/tutorial/20-project_layout/index.html +0 -1299
  164. data/docs/tutorial/30-your_first_command/index.html +0 -1263
  165. data/docs/tutorial/40-options_parameters_and_arguments/index.html +0 -1384
  166. data/docs/tutorial/50-publishing/index.html +0 -1187
  167. data/docs/tutorial/index.html +0 -1140
  168. data/docs/tutorial/index.xml +0 -67
  169. data/docs/webfonts/fa-brands-400.eot +0 -0
  170. data/docs/webfonts/fa-brands-400.svg +0 -1
  171. data/docs/webfonts/fa-brands-400.ttf +0 -0
  172. data/docs/webfonts/fa-brands-400.woff +0 -0
  173. data/docs/webfonts/fa-brands-400.woff2 +0 -0
  174. data/docs/webfonts/fa-regular-400.eot +0 -0
  175. data/docs/webfonts/fa-regular-400.svg +0 -1
  176. data/docs/webfonts/fa-regular-400.ttf +0 -0
  177. data/docs/webfonts/fa-regular-400.woff +0 -0
  178. data/docs/webfonts/fa-regular-400.woff2 +0 -0
  179. data/docs/webfonts/fa-solid-900.eot +0 -0
  180. data/docs/webfonts/fa-solid-900.svg +0 -1
  181. data/docs/webfonts/fa-solid-900.ttf +0 -0
  182. data/docs/webfonts/fa-solid-900.woff +0 -0
  183. data/docs/webfonts/fa-solid-900.woff2 +0 -0
  184. data/docs/whoami/index.html +0 -1155
  185. data/docs/whoami/index.xml +0 -11
  186. data/docs-src/archetypes/default.md +0 -6
  187. data/docs-src/config.toml +0 -37
  188. data/docs-src/content/_index.md +0 -40
  189. data/docs-src/content/advanced/_index.md +0 -11
  190. data/docs-src/content/advanced/automatic_updates.md +0 -46
  191. data/docs-src/content/advanced/command_types.md +0 -148
  192. data/docs-src/content/advanced/distributed_state_locking.md +0 -37
  193. data/docs-src/content/advanced/hooks.md +0 -69
  194. data/docs-src/content/advanced/interactive_commands.md +0 -41
  195. data/docs-src/content/advanced/logging.md +0 -39
  196. data/docs-src/content/advanced/remote_execution.md +0 -60
  197. data/docs-src/content/advanced/state_storage.md +0 -120
  198. data/docs-src/content/advanced/user_config_files.md +0 -51
  199. data/docs-src/content/development/_index.md +0 -11
  200. data/docs-src/content/development/changelog.md +0 -179
  201. data/docs-src/content/development/code_of_conduct.md +0 -81
  202. data/docs-src/content/development/contributing.md +0 -88
  203. data/docs-src/content/development/license.md +0 -17
  204. data/docs-src/content/quick_reference/_index.md +0 -180
  205. data/docs-src/content/tutorial/10-getting_started.md +0 -47
  206. data/docs-src/content/tutorial/20-project_layout.md +0 -123
  207. data/docs-src/content/tutorial/30-your_first_command.md +0 -132
  208. data/docs-src/content/tutorial/40-options_parameters_and_arguments.md +0 -282
  209. data/docs-src/content/tutorial/50-publishing.md +0 -53
  210. data/docs-src/content/tutorial/_index.md +0 -11
  211. data/docs-src/content/whoami/_index.md +0 -34
  212. data/docs-src/layouts/partials/logo.html +0 -3
  213. data/docs-src/makesite.sh +0 -40
  214. data/docs-src/mkdocs-archived.tar.gz +0 -0
  215. data/docs-src/runsite.sh +0 -8
  216. data/docs-src/themes/hugo-theme-learn/.editorconfig +0 -16
  217. data/docs-src/themes/hugo-theme-learn/.gitignore +0 -3
  218. data/docs-src/themes/hugo-theme-learn/.grenrc.yml +0 -25
  219. data/docs-src/themes/hugo-theme-learn/CHANGELOG.md +0 -226
  220. data/docs-src/themes/hugo-theme-learn/LICENSE.md +0 -22
  221. data/docs-src/themes/hugo-theme-learn/README.md +0 -97
  222. data/docs-src/themes/hugo-theme-learn/archetypes/chapter.md +0 -13
  223. data/docs-src/themes/hugo-theme-learn/archetypes/default.md +0 -7
  224. data/docs-src/themes/hugo-theme-learn/exampleSite/LICENSE.md +0 -20
  225. data/docs-src/themes/hugo-theme-learn/exampleSite/config.toml +0 -102
  226. data/docs-src/themes/hugo-theme-learn/exampleSite/content/_index.en.md +0 -41
  227. data/docs-src/themes/hugo-theme-learn/exampleSite/content/_index.fr.md +0 -43
  228. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/_index.en.md +0 -12
  229. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/_index.fr.md +0 -12
  230. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/_index.zh.md +0 -12
  231. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/configuration/_index.en.md +0 -60
  232. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/configuration/_index.fr.md +0 -56
  233. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/installation/_index.en.md +0 -102
  234. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/installation/_index.fr.md +0 -100
  235. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/installation/images/chapter.png +0 -0
  236. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/requirements/_index.en.md +0 -11
  237. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/requirements/_index.fr.md +0 -11
  238. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/requirements/images/magic.gif +0 -0
  239. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/_index.en.md +0 -194
  240. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/_index.fr.md +0 -194
  241. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/images/blue-variant.png +0 -0
  242. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/images/green-variant.png +0 -0
  243. data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/images/red-variant.png +0 -0
  244. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/_index.en.md +0 -12
  245. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/_index.fr.md +0 -12
  246. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/archetypes.en.md +0 -57
  247. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/archetypes.fr.md +0 -57
  248. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/i18n/_index.en.md +0 -78
  249. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/i18n/_index.fr.md +0 -78
  250. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/i18n/images/i18n-menu.gif +0 -0
  251. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/icons.en.md +0 -41
  252. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/markdown.en.md +0 -692
  253. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/markdown.fr.md +0 -666
  254. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/menushortcuts.en.md +0 -109
  255. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/menushortcuts.fr.md +0 -109
  256. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/pages/_index.en.md +0 -166
  257. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/pages/_index.fr.md +0 -146
  258. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/pages/images/frontmatter-icon.png +0 -0
  259. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/pages/images/pages-chapter.png +0 -0
  260. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/pages/images/pages-default.png +0 -0
  261. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/syntaxhighlight.en.md +0 -89
  262. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/tags.en.md +0 -39
  263. data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/tags.fr.md +0 -40
  264. data/docs-src/themes/hugo-theme-learn/exampleSite/content/credits.en.md +0 -28
  265. data/docs-src/themes/hugo-theme-learn/exampleSite/content/credits.fr.md +0 -28
  266. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/_index.en.md +0 -16
  267. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/_index.fr.md +0 -16
  268. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/BachGavotteShort.mp3 +0 -0
  269. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/Carroll_AliceAuPaysDesMerveilles.pdf +0 -0
  270. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/adivorciarsetoca00cape.pdf +0 -0
  271. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/hugo.png +0 -0
  272. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/movieselectricsheep-flock-244-32500-2.mp4 +0 -0
  273. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.md +0 -85
  274. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/BachGavotteShort.mp3 +0 -0
  275. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/Carroll_AliceAuPaysDesMerveilles.pdf +0 -0
  276. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/adivorciarsetoca00cape.pdf +0 -0
  277. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/hugo.png +0 -0
  278. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/movieselectricsheep-flock-244-32500-2.mp4 +0 -0
  279. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.md +0 -85
  280. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/button.en.md +0 -16
  281. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/button.fr.md +0 -16
  282. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/_index.en.md +0 -45
  283. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/_index.fr.md +0 -45
  284. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/_index.en.md +0 -6
  285. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/_index.fr.md +0 -6
  286. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.en.md +0 -6
  287. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.fr.md +0 -6
  288. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.en.md +0 -6
  289. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.fr.md +0 -6
  290. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.en.md +0 -6
  291. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.fr.md +0 -6
  292. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.en.md +0 -6
  293. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.fr.md +0 -6
  294. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/_index.en.md +0 -11
  295. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/_index.fr.md +0 -11
  296. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/test3.en.md +0 -6
  297. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/test3.fr.md +0 -6
  298. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-3/_index.en.md +0 -6
  299. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-3/_index.fr.md +0 -6
  300. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-4/_index.en.md +0 -7
  301. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-4/_index.fr.md +0 -7
  302. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/test.en.md +0 -6
  303. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/test.fr.md +0 -6
  304. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/expand.en.md +0 -45
  305. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/expand.fr.md +0 -45
  306. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/mermaid.en.md +0 -283
  307. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/mermaid.fr.md +0 -283
  308. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/notice.en.md +0 -62
  309. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/notice.fr.md +0 -62
  310. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/siteparam.en.md +0 -23
  311. data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/siteparam.fr.md +0 -23
  312. data/docs-src/themes/hugo-theme-learn/exampleSite/content/showcase.en.md +0 -13
  313. data/docs-src/themes/hugo-theme-learn/exampleSite/content/showcase.fr.md +0 -14
  314. data/docs-src/themes/hugo-theme-learn/exampleSite/layouts/partials/custom-footer.html +0 -10
  315. data/docs-src/themes/hugo-theme-learn/exampleSite/layouts/partials/logo.html +0 -39
  316. data/docs-src/themes/hugo-theme-learn/exampleSite/layouts/partials/menu-footer.html +0 -14
  317. data/docs-src/themes/hugo-theme-learn/exampleSite/layouts/shortcodes/ghcontributors.html +0 -31
  318. data/docs-src/themes/hugo-theme-learn/exampleSite/static/css/theme-mine.css +0 -104
  319. data/docs-src/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.eot +0 -0
  320. data/docs-src/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.svg +0 -1
  321. data/docs-src/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.ttf +0 -0
  322. data/docs-src/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.woff +0 -0
  323. data/docs-src/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.woff2 +0 -0
  324. data/docs-src/themes/hugo-theme-learn/exampleSite/static/images/showcase/inteliver_docs.png +0 -0
  325. data/docs-src/themes/hugo-theme-learn/exampleSite/static/images/showcase/tat.png +0 -0
  326. data/docs-src/themes/hugo-theme-learn/exampleSite/static/images/showcase/tshark_dev.png +0 -0
  327. data/docs-src/themes/hugo-theme-learn/i18n/ar.toml +0 -26
  328. data/docs-src/themes/hugo-theme-learn/i18n/de.toml +0 -26
  329. data/docs-src/themes/hugo-theme-learn/i18n/en.toml +0 -26
  330. data/docs-src/themes/hugo-theme-learn/i18n/es.toml +0 -26
  331. data/docs-src/themes/hugo-theme-learn/i18n/fr.toml +0 -26
  332. data/docs-src/themes/hugo-theme-learn/i18n/hi.toml +0 -26
  333. data/docs-src/themes/hugo-theme-learn/i18n/id.toml +0 -26
  334. data/docs-src/themes/hugo-theme-learn/i18n/ja.toml +0 -26
  335. data/docs-src/themes/hugo-theme-learn/i18n/nl.toml +0 -26
  336. data/docs-src/themes/hugo-theme-learn/i18n/pt.toml +0 -26
  337. data/docs-src/themes/hugo-theme-learn/i18n/ru.toml +0 -26
  338. data/docs-src/themes/hugo-theme-learn/i18n/tr.toml +0 -26
  339. data/docs-src/themes/hugo-theme-learn/i18n/zh-cn.toml +0 -26
  340. data/docs-src/themes/hugo-theme-learn/images/screenshot.png +0 -0
  341. data/docs-src/themes/hugo-theme-learn/images/tn.png +0 -0
  342. data/docs-src/themes/hugo-theme-learn/layouts/404.html +0 -56
  343. data/docs-src/themes/hugo-theme-learn/layouts/_default/list.html +0 -22
  344. data/docs-src/themes/hugo-theme-learn/layouts/_default/single.html +0 -12
  345. data/docs-src/themes/hugo-theme-learn/layouts/index.html +0 -31
  346. data/docs-src/themes/hugo-theme-learn/layouts/index.json +0 -12
  347. data/docs-src/themes/hugo-theme-learn/layouts/partials/custom-comments.html +0 -3
  348. data/docs-src/themes/hugo-theme-learn/layouts/partials/custom-footer.html +0 -5
  349. data/docs-src/themes/hugo-theme-learn/layouts/partials/custom-header.html +0 -5
  350. data/docs-src/themes/hugo-theme-learn/layouts/partials/favicon.html +0 -1
  351. data/docs-src/themes/hugo-theme-learn/layouts/partials/footer.html +0 -77
  352. data/docs-src/themes/hugo-theme-learn/layouts/partials/header.html +0 -111
  353. data/docs-src/themes/hugo-theme-learn/layouts/partials/logo.html +0 -19
  354. data/docs-src/themes/hugo-theme-learn/layouts/partials/menu-footer.html +0 -1
  355. data/docs-src/themes/hugo-theme-learn/layouts/partials/menu.html +0 -151
  356. data/docs-src/themes/hugo-theme-learn/layouts/partials/meta.html +0 -2
  357. data/docs-src/themes/hugo-theme-learn/layouts/partials/search.html +0 -16
  358. data/docs-src/themes/hugo-theme-learn/layouts/partials/tags.html +0 -7
  359. data/docs-src/themes/hugo-theme-learn/layouts/partials/toc.html +0 -5
  360. data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/attachments.html +0 -36
  361. data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/button.html +0 -14
  362. data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/children.html +0 -101
  363. data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/expand.html +0 -17
  364. data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/mermaid.html +0 -2
  365. data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/notice.html +0 -2
  366. data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/ref.html +0 -14
  367. data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/relref.html +0 -14
  368. data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/siteparam.html +0 -7
  369. data/docs-src/themes/hugo-theme-learn/netlify.toml +0 -23
  370. data/docs-src/themes/hugo-theme-learn/static/css/atom-one-dark-reasonable.css +0 -77
  371. data/docs-src/themes/hugo-theme-learn/static/css/auto-complete.css +0 -47
  372. data/docs-src/themes/hugo-theme-learn/static/css/featherlight.min.css +0 -8
  373. data/docs-src/themes/hugo-theme-learn/static/css/fontawesome-all.min.css +0 -1
  374. data/docs-src/themes/hugo-theme-learn/static/css/hugo-theme.css +0 -254
  375. data/docs-src/themes/hugo-theme-learn/static/css/hybrid.css +0 -102
  376. data/docs-src/themes/hugo-theme-learn/static/css/nucleus.css +0 -615
  377. data/docs-src/themes/hugo-theme-learn/static/css/perfect-scrollbar.min.css +0 -2
  378. data/docs-src/themes/hugo-theme-learn/static/css/tags.css +0 -49
  379. data/docs-src/themes/hugo-theme-learn/static/css/theme-blue.css +0 -111
  380. data/docs-src/themes/hugo-theme-learn/static/css/theme-green.css +0 -111
  381. data/docs-src/themes/hugo-theme-learn/static/css/theme-red.css +0 -111
  382. data/docs-src/themes/hugo-theme-learn/static/css/theme.css +0 -1136
  383. data/docs-src/themes/hugo-theme-learn/static/fonts/Inconsolata.eot +0 -0
  384. data/docs-src/themes/hugo-theme-learn/static/fonts/Inconsolata.svg +0 -1
  385. data/docs-src/themes/hugo-theme-learn/static/fonts/Inconsolata.ttf +0 -0
  386. data/docs-src/themes/hugo-theme-learn/static/fonts/Inconsolata.woff +0 -0
  387. data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.eot +0 -0
  388. data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.svg +0 -1
  389. data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.ttf +0 -0
  390. data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.woff +0 -0
  391. data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.woff2 +0 -0
  392. data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.eot +0 -0
  393. data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.svg +0 -1
  394. data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.ttf +0 -0
  395. data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.woff +0 -0
  396. data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.woff2 +0 -0
  397. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_200.eot +0 -0
  398. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_200.svg +0 -1
  399. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_200.ttf +0 -0
  400. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_200.woff +0 -0
  401. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_200.woff2 +0 -0
  402. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_300.eot +0 -0
  403. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_300.svg +0 -1
  404. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_300.ttf +0 -0
  405. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_300.woff +0 -0
  406. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_300.woff2 +0 -0
  407. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_500.eot +0 -0
  408. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_500.svg +0 -1
  409. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_500.ttf +0 -0
  410. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_500.woff +0 -0
  411. data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_500.woff2 +0 -0
  412. data/docs-src/themes/hugo-theme-learn/static/images/clippy.svg +0 -1
  413. data/docs-src/themes/hugo-theme-learn/static/images/favicon.png +0 -0
  414. data/docs-src/themes/hugo-theme-learn/static/images/gopher-404.jpg +0 -0
  415. data/docs-src/themes/hugo-theme-learn/static/js/auto-complete.js +0 -3
  416. data/docs-src/themes/hugo-theme-learn/static/js/clipboard.min.js +0 -7
  417. data/docs-src/themes/hugo-theme-learn/static/js/featherlight.min.js +0 -9
  418. data/docs-src/themes/hugo-theme-learn/static/js/highlight.pack.js +0 -6
  419. data/docs-src/themes/hugo-theme-learn/static/js/hugo-learn.js +0 -94
  420. data/docs-src/themes/hugo-theme-learn/static/js/jquery-3.3.1.min.js +0 -2
  421. data/docs-src/themes/hugo-theme-learn/static/js/jquery.sticky.js +0 -288
  422. data/docs-src/themes/hugo-theme-learn/static/js/learn.js +0 -459
  423. data/docs-src/themes/hugo-theme-learn/static/js/lunr.min.js +0 -6
  424. data/docs-src/themes/hugo-theme-learn/static/js/modernizr.custom-3.6.0.js +0 -3
  425. data/docs-src/themes/hugo-theme-learn/static/js/perfect-scrollbar.jquery.min.js +0 -2
  426. data/docs-src/themes/hugo-theme-learn/static/js/perfect-scrollbar.min.js +0 -2
  427. data/docs-src/themes/hugo-theme-learn/static/js/search.js +0 -93
  428. data/docs-src/themes/hugo-theme-learn/static/mermaid/mermaid.css +0 -277
  429. data/docs-src/themes/hugo-theme-learn/static/mermaid/mermaid.dark.css +0 -278
  430. data/docs-src/themes/hugo-theme-learn/static/mermaid/mermaid.forest.css +0 -356
  431. data/docs-src/themes/hugo-theme-learn/static/mermaid/mermaid.js +0 -8
  432. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-brands-400.eot +0 -0
  433. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-brands-400.svg +0 -1
  434. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-brands-400.ttf +0 -0
  435. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-brands-400.woff +0 -0
  436. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-brands-400.woff2 +0 -0
  437. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-regular-400.eot +0 -0
  438. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-regular-400.svg +0 -1
  439. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-regular-400.ttf +0 -0
  440. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-regular-400.woff +0 -0
  441. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-regular-400.woff2 +0 -0
  442. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-solid-900.eot +0 -0
  443. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-solid-900.svg +0 -1
  444. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-solid-900.ttf +0 -0
  445. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-solid-900.woff +0 -0
  446. data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-solid-900.woff2 +0 -0
  447. data/docs-src/themes/hugo-theme-learn/theme.toml +0 -21
  448. data/docs-src/themes/hugo-theme-learn/wercker.yml +0 -16
  449. data/lib/rbcli/configuration/configurate.rb +0 -85
  450. data/lib/rbcli/configuration/configurate_blocks/hooks.rb +0 -52
  451. data/lib/rbcli/configuration/configurate_blocks/me.rb +0 -122
  452. data/lib/rbcli/configuration/configurate_blocks/storage.rb +0 -50
  453. data/lib/rbcli/engine/command.rb +0 -251
  454. data/lib/rbcli/engine/load_project.rb +0 -45
  455. data/lib/rbcli/engine/parser.rb +0 -114
  456. data/lib/rbcli/features/autoupdate/common/autoupdate.rb +0 -50
  457. data/lib/rbcli/features/autoupdate/gem_updater.rb +0 -62
  458. data/lib/rbcli/features/autoupdate/github_updater.rb +0 -76
  459. data/lib/rbcli/features/logging.rb +0 -98
  460. data/lib/rbcli/features/remote_exec.rb +0 -187
  461. data/lib/rbcli/features/scriptwrapper.rb +0 -75
  462. data/lib/rbcli/features/userconfig.rb +0 -163
  463. data/lib/rbcli/state_storage/common/state_storage.rb +0 -138
  464. data/lib/rbcli/state_storage/localstate.rb +0 -77
  465. data/lib/rbcli/state_storage/placeholders.rb +0 -29
  466. data/lib/rbcli/state_storage/remote_state_connectors/dynamodb.rb +0 -272
  467. data/lib/rbcli/state_storage/remotestate_dynamodb.rb +0 -115
  468. data/lib/rbcli/util/msg.rb +0 -55
  469. data/lib/rbcli/util/string_colorize.rb +0 -45
  470. data/lib/rbcli/util/trollop.rb +0 -1050
  471. data/lib/rbcli-tool/generators.rb +0 -105
  472. data/lib/rbcli-tool/mdless_fix.rb +0 -406
  473. data/lib/rbcli-tool/project.rb +0 -120
  474. data/lib/rbcli-tool/util.rb +0 -70
  475. data/lib/rbcli-tool.rb +0 -37
  476. data/rbcli.gemspec +0 -69
  477. data/skeletons/micro/executable +0 -127
  478. data/skeletons/mini/executable +0 -242
  479. data/skeletons/project/.gitignore +0 -11
  480. data/skeletons/project/.rakeTasks +0 -7
  481. data/skeletons/project/.rspec +0 -3
  482. data/skeletons/project/CODE_OF_CONDUCT.md +0 -74
  483. data/skeletons/project/Gemfile +0 -6
  484. data/skeletons/project/README.md +0 -46
  485. data/skeletons/project/Rakefile +0 -6
  486. data/skeletons/project/application/commands/command.erb +0 -28
  487. data/skeletons/project/application/commands/script.erb +0 -30
  488. data/skeletons/project/application/commands/scripts/script.sh +0 -60
  489. data/skeletons/project/application/options.rb +0 -34
  490. data/skeletons/project/config/autoupdate.rb +0 -35
  491. data/skeletons/project/config/general.rb +0 -17
  492. data/skeletons/project/config/logging.rb +0 -19
  493. data/skeletons/project/config/storage.rb +0 -35
  494. data/skeletons/project/config/userspace.rb +0 -33
  495. data/skeletons/project/config/version.rb +0 -3
  496. data/skeletons/project/exe/executable +0 -53
  497. data/skeletons/project/hooks/default_action.rb +0 -16
  498. data/skeletons/project/hooks/first_run.rb +0 -16
  499. data/skeletons/project/hooks/post_execution.rb +0 -14
  500. data/skeletons/project/hooks/pre_execution.rb +0 -14
  501. data/skeletons/project/lib/lib.erb +0 -9
  502. data/skeletons/project/spec/spec_helper.rb +0 -14
  503. data/skeletons/project/spec/untitled_spec.rb +0 -9
  504. data/skeletons/project/untitled.gemspec +0 -40
  505. data/skeletons/project/userconf/user_defaults.yml +0 -6
  506. /data/{skeletons/project/.rbcli → lib/rbcli/plugins/.keep} +0 -0
@@ -0,0 +1,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)) } }