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
@@ -1,163 +0,0 @@
1
- ##################################################################################
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 #
19
- ##################################################################################
20
-
21
- ####
22
- # Config Module
23
- ####
24
- # The config module manages two distinct sets of config: one is the user's, and one is the application's default.
25
- # This allows you to set default values for your configuration files, and can use the default values to generate a
26
- # new user config file at any time by writing them to a file.
27
- #
28
- # Usage
29
- #
30
- # Rbcli::config[:key]
31
- # Provides access to config file hash values under :key.
32
- # Note the lowercase 'c' in config, which is different from the rest of the functions below.
33
- #
34
- # Rbcli::Config::set_file(filename, autoload:true, merge_defaults: false)
35
- # This function allows you to set the path for the user's config file (eg: /etc/myscript/config.yml).
36
- # autoload will load the file at the same time
37
- # merge_defaults will fill in missing values in the user's config with default ones
38
- #
39
- # Rbcli::Config::add_defaults(filename)
40
- # This function loads the contents of a YAML or JSON file into the default config. Used for custom configuration.
41
- #
42
- # Rbcli::Config::load
43
- # This forces a reload of the config file.
44
- #
45
- # Rbcli::Config::generate_userconf
46
- # This writes the config defaults to the filename set using the set_file command.
47
- ####
48
-
49
- require 'yaml'
50
- require 'fileutils'
51
- require 'deep_merge'
52
-
53
- module Rbcli
54
- def self.config
55
- Rbcli::Config::config
56
- end
57
- end
58
-
59
- module Rbcli::Config
60
-
61
- @config = nil
62
- @config_file = nil
63
- @config_defaults = nil
64
- @merge_defaults = false
65
- @categorized_defaults = nil
66
- @loaded = false
67
-
68
- def self.set_userfile filename, merge_defaults: true, required: false
69
- return if filename.nil?
70
- @config_file = File.expand_path filename
71
- @merge_defaults = merge_defaults
72
- @userfile_required = required
73
- @loaded = false
74
- end
75
-
76
- def self.add_categorized_defaults name, description, config
77
- @categorized_defaults ||= {}
78
- @categorized_defaults[name.to_sym] = {
79
- description: description,
80
- config: config
81
- }
82
-
83
- @config_defaults ||= {}
84
- @config_defaults[name.to_sym] = {}
85
- config.each do |k, v|
86
- @config_defaults[name.to_sym][k.to_sym] = v[:value]
87
- end
88
- @loaded = false
89
- end
90
-
91
- def self.add_default name, description: nil, default: nil
92
- @config_individual_lines ||= []
93
- text = "#{name.to_s}: #{default}".ljust(30) + " # #{description}"
94
- @config_individual_lines.push text unless @config_individual_lines.include? text
95
- @config_defaults[name.to_sym] = default
96
- @loaded = false
97
- end
98
-
99
- def self.add_defaults filename=nil, text: nil
100
- filename = File.expand_path filename
101
- return unless filename and File.exist? filename
102
- @config_text ||= ''
103
- @config_text += "\n" unless @config_text.empty?
104
- File.readlines(filename).each do |line|
105
- if line.start_with? '---' or line.start_with? '...'
106
- @config_text << "\n" unless @config_text.empty?
107
- else
108
- @config_text << line unless @config_text.include? line
109
- end
110
- end if filename and File.exist? filename
111
- @config_text << "\n\n" << text if text
112
-
113
- @config_defaults ||= {}
114
- @config_defaults.deep_merge! YAML.safe_load(@config_text, [], [], true).deep_symbolize!
115
- @loaded = false
116
- end
117
-
118
- def self.load
119
- if (! @config_file.nil?) and File.exist? @config_file
120
- @config = YAML.safe_load(File.read(@config_file), [], [], true).deep_symbolize!
121
- @config.deep_merge! @config_defaults if @merge_defaults
122
- elsif @userfile_required
123
- puts "User's config file not found at #{@config_file}. Please run this tool with the `--generate-config` option to generate it."
124
- exit 1
125
- else
126
- @config = @config_defaults
127
- end
128
- @loaded = true
129
- @config
130
- end
131
-
132
- def self.config
133
- self.load unless @loaded
134
- (@config.nil?) ? @config_defaults : @config
135
- end
136
-
137
- def self.generate_userconf filename
138
- filepath = File.expand_path "#{(filename) ? filename : "#{Dir.pwd}/config.yml"}"
139
- FileUtils.touch filepath
140
- File.write filepath, @config_text
141
- File.open(filepath, 'a') do |f|
142
- f.puts "# Individual Settings"
143
- @config_individual_lines.each { |l| f.puts l }
144
- end if @config_individual_lines
145
-
146
-
147
- if @categorized_defaults
148
- text = ''
149
- @categorized_defaults.each do |name, opts|
150
- text += "\n# #{opts[:description]}\n"
151
- text += "#{name.to_s}:\n"
152
- opts[:config].each do |opt, v|
153
- text += " #{opt.to_s}: #{(v[:value].nil?) ? '~' : v[:value]}".ljust(30) + " # #{v[:description]}\n"
154
- end
155
- end
156
- File.open(filepath, 'a') do |f|
157
- f.puts text
158
- end
159
- end
160
- end
161
-
162
- end
163
-
@@ -1,138 +0,0 @@
1
- ##################################################################################
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 #
19
- ##################################################################################
20
-
21
- require 'fileutils'
22
- require 'json'
23
-
24
-
25
- module Rbcli::State
26
-
27
- ## Main State Class
28
- class StateStorage
29
-
30
- def initialize path, force_creation: false, halt_on_error: true, lazy_load: true
31
- @path = path
32
- @force_creation = force_creation
33
- @halt_on_error = halt_on_error
34
-
35
- state_subsystem_init
36
-
37
- # Lazy load option
38
- @loaded = false
39
- state_create unless lazy_load
40
- end
41
-
42
- def []= key, value
43
- state_create unless @loaded
44
- @data[:data][key.to_sym] = value
45
- save_state
46
- @data[:data][key.to_sym]
47
- end
48
-
49
- def [] key
50
- state_create unless @loaded
51
- @data[:data][key.to_sym]
52
- end
53
-
54
- def delete key, &block
55
- state_create unless @loaded
56
- result = @data[:data].delete key.to_sym, &block
57
- save_state
58
- result
59
- end
60
-
61
- def refresh
62
- if @loaded
63
- load_state
64
- else
65
- state_create
66
- end
67
- end
68
-
69
- def commit
70
- save_state if @loaded
71
- end
72
-
73
- def clear
74
- state_create unless @loaded
75
- @data[:data] = {}
76
- save_state
77
- end
78
-
79
- def disconnect
80
- unlock if self.class.method_defined? :unlock
81
- @loaded = false
82
- @data[:data] = nil
83
- end
84
-
85
- def each &block
86
- state_create unless @loaded
87
- @data[:data].each &block
88
- save_state
89
- end
90
-
91
- def key? key
92
- state_create unless @loaded
93
- @data[:data].key? key.to_sym
94
- end
95
-
96
- def to_h
97
- state_create unless @loaded
98
- @data[:data]
99
- end
100
-
101
- def to_s
102
- state_create unless @loaded
103
- to_h.to_s
104
- end
105
-
106
- # For framework's internal use
107
-
108
- def rbclidata key = nil
109
- state_create unless @loaded
110
- return @data[:rbcli][key.to_sym] unless key.nil?
111
- @data[:rbcli]
112
- end
113
-
114
- def set_rbclidata key, value
115
- state_create unless @loaded
116
- @data[:rbcli][key.to_sym] = value
117
- save_state
118
- end
119
-
120
- private
121
-
122
- def state_create
123
- base_data = {data: {}, rbcli: {}}
124
- if state_exists?
125
- load_state
126
- elsif @force_creation
127
- create_state
128
- @data = base_data
129
- save_state
130
- else
131
- raise StandardError "State location #{@path} does not exist or can not be accessed." if @halt_on_error
132
- @data = base_data
133
- end
134
- @loaded = true
135
- end
136
-
137
- end
138
- end
@@ -1,77 +0,0 @@
1
- ##################################################################################
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 #
19
- ##################################################################################
20
-
21
- require 'rbcli/state_storage/common/state_storage'
22
- require 'fileutils'
23
- require 'json'
24
-
25
- ## User Interface
26
- module Rbcli
27
- def self.local_state
28
- Rbcli.configuration(:storage, :localstate)
29
- end
30
- end
31
-
32
- ## Local State Module
33
- module Rbcli::State
34
-
35
- class LocalStorage < StateStorage
36
-
37
- def state_subsystem_init
38
- @path = File.expand_path @path
39
- end
40
-
41
- def state_exists?
42
- File.exist? @path
43
- end
44
-
45
- def create_state
46
- begin
47
- FileUtils.mkdir_p File.dirname(@path)
48
- FileUtils.touch @path
49
- rescue Errno::EACCES => e
50
- error "Can not create file #{@path}. Please make sure the directory is writeable." if @halt_on_error
51
- end
52
- end
53
-
54
- def load_state
55
- begin
56
- @data = JSON.parse(File.read(@path)).deep_symbolize!
57
- rescue Errno::ENOENT, Errno::EACCES => e
58
- error "Can not read from file #{@path}. Please make sure the file exists and is readable." if @halt_on_error
59
- end
60
- end
61
-
62
- def save_state
63
- begin
64
- File.write @path, JSON.dump(@data)
65
- rescue Errno::ENOENT, Errno::EACCES => e
66
- error "Can not write to file #{@path}. Please make sure the file exists and is writeable." if @halt_on_error
67
- end
68
- end
69
-
70
- def error text
71
- raise LocalStateError.new "Error accessing local state: #{text}"
72
- end
73
-
74
- class LocalStateError < StandardError; end
75
- end
76
-
77
- end
@@ -1,29 +0,0 @@
1
- ##################################################################################
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 #
19
- ##################################################################################
20
-
21
- module Rbcli
22
- def self.local_state
23
- raise Exception.new "Warning: Usage of Local State requires Local State Storage to be enabled in your application's configuration."
24
- end
25
-
26
- def self.remote_state
27
- raise Exception.new "Warning: Usage of Remote State requires Remote State Storage to be enabled in your application's configuration."
28
- end
29
- end
@@ -1,272 +0,0 @@
1
- ##################################################################################
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 #
19
- ##################################################################################
20
-
21
- require 'aws-sdk-dynamodb'
22
- require 'macaddr'
23
- require 'digest/sha2'
24
- require 'rufus-scheduler'
25
-
26
- module Rbcli::State::RemoteConnectors
27
- class DynamoDB
28
-
29
- def self.save_defaults aws_access_key_id: nil, aws_secret_access_key: nil
30
- Rbcli::Config::add_categorized_defaults :dynamodb_remote_state, 'Remote State Settings - requires DynamoDB', {
31
- access_key_id: {
32
- description: 'AWS Access Key ID -- leave as null to look for AWS credentials on system. See: https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/setup-config.html',
33
- value: aws_access_key_id
34
- },
35
- secret_access_key: {
36
- description: 'AWS Secret Access Key -- leave as null to look for AWS credentials on system.',
37
- value: aws_secret_access_key
38
- }
39
- }
40
- end
41
-
42
- def initialize dynamodb_table, region, aws_access_key_id, aws_secret_access_key, locking: false, lock_timeout: 60
43
- @region = region
44
- @dynamo_table_name = dynamodb_table
45
- @item_name = Rbcli::configuration(:me, :scriptname)
46
- @locking = locking
47
- @scheduler = nil
48
- @lock_timeout = lock_timeout
49
- @exit_code_set = false
50
- @should_unlock_at_exit = false
51
-
52
- @dynamo_client = Aws::DynamoDB::Client.new(
53
- region: @region,
54
- access_key_id: aws_access_key_id,
55
- secret_access_key: aws_secret_access_key
56
- )
57
- end
58
-
59
- def create_table
60
- # We only need to create the table
61
- unless table_exists?
62
- print "Creating DynmoDB Table. Please wait..."
63
- @dynamo_client.create_table(
64
- {
65
- attribute_definitions: [
66
- {
67
- attribute_name: "Script Name",
68
- attribute_type: "S"
69
- }
70
- ],
71
- key_schema: [
72
- {
73
- attribute_name: "Script Name",
74
- key_type: "HASH"
75
- }
76
- ],
77
- provisioned_throughput: {
78
- read_capacity_units: 5,
79
- write_capacity_units: 5,
80
- },
81
- table_name: @dynamo_table_name,
82
- }
83
- )
84
- wait_for_table_creation
85
- end
86
- end
87
-
88
- def table_exists?
89
- @dynamo_client.list_tables.table_names.to_a.include? @dynamo_table_name
90
- end
91
-
92
- def object_exists?
93
- begin
94
- item = @dynamo_client.get_item(
95
- {
96
- key: {'Script Name' => @item_name},
97
- table_name: @dynamo_table_name,
98
- }
99
- )
100
- return (!item.item.nil?)
101
- rescue Aws::DynamoDB::Errors::ResourceNotFoundException
102
- return false
103
- end
104
- end
105
-
106
- def get_object
107
- lock_or_wait
108
- item = @dynamo_client.get_item(
109
- {
110
- key: {'Script Name' => @item_name},
111
- table_name: @dynamo_table_name,
112
- }
113
- ).item
114
- item.delete 'Script Name'
115
- item
116
- end
117
-
118
- def save_object datahash
119
- raise StandardError "DynamoDB has been locked by another user since the last change. Please try again later." if locked?
120
- lock_or_wait
121
- @dynamo_client.put_item(
122
- {
123
- table_name: @dynamo_table_name,
124
- item: datahash.merge({'Script Name' => @item_name})
125
- }
126
- )
127
- end
128
-
129
- def lock
130
- @dynamo_client.put_item(
131
- {
132
- table_name: @dynamo_table_name,
133
- item: {
134
- 'Script Name' => "#{@item_name}_lock",
135
- 'locked' => true,
136
- 'locked_until' => (Time.now + @lock_timeout).getutc.strftime('%s'),
137
- 'locked_by' => Digest::SHA2.hexdigest(Mac.addr)
138
- }
139
- }
140
- )
141
- end
142
-
143
- def unlock
144
- @dynamo_client.put_item(
145
- {
146
- table_name: @dynamo_table_name,
147
- item: {
148
- 'Script Name' => "#{@item_name}_lock",
149
- 'locked' => false,
150
- 'locked_until' => Time.now.getutc.strftime('%s'),
151
- 'locked_by' => false
152
- }
153
- }
154
- )
155
- @scheduler.shutdown :kill if @scheduler
156
- @should_unlock_at_exit = false
157
- @scheduler = nil
158
- end
159
-
160
- def locked?
161
- lockdata = get_lockdata
162
- (lockdata['locked']) and (lockdata['locked_until'].to_i > Time.now.getutc.to_i) and (lockdata['locked_by'] != Digest::SHA2.hexdigest(Mac.addr))
163
- end
164
-
165
- def lock_or_wait recursed = false
166
- return true unless @locking
167
- delay_in_seconds = 2
168
- lockdata = get_lockdata
169
-
170
- should_claim = false
171
-
172
- # First, we identify if the lock is active
173
- if lockdata['locked']
174
- # If the lock is not ours, we have to check the expiration
175
- if lockdata['locked_by'] != Digest::SHA2.hexdigest(Mac.addr)
176
- # If the lock is not ours, and it has expired, we claim it
177
- if lockdata['locked_until'].to_i < Time.now.getutc.to_i
178
- should_claim = true
179
- # If the lock data is not ours and has not expired, we wait and try again
180
- else
181
- print 'Acquiring lock on DynamoDB. Please wait..' unless recursed
182
- print '.'
183
- sleep delay_in_seconds
184
- lock_or_wait true
185
- end
186
-
187
- # If the lock is ours, we check the expiry
188
- else
189
- # If the lock is ours and is close to expiry or has expired, we refresh it
190
- if lockdata['locked_until'].to_i < (Time.now - (@lock_timeout / 10)).getutc.to_i
191
- should_claim = true
192
- # If the lock is ours and is not near expiry, do nothing
193
- else
194
- # Do nothing! But do finish the string that's shown to the user
195
- puts 'done!' if recursed
196
- end
197
- end
198
- else # If clearly unlocked, we claim it
199
- should_claim = true
200
- end
201
-
202
-
203
- if should_claim
204
- # We attempt to get a lock then validate our success
205
- lock
206
- # If we succeeded then we set up a scheduler to ensure we keep it
207
- lockdata = get_lockdata
208
- if (lockdata['locked_by'] == Digest::SHA2.hexdigest(Mac.addr)) and (lockdata['locked_until'].to_i > Time.now.getutc.to_i)
209
- # Of course, if the scheduler already exists, we don't bother
210
- unless @scheduler
211
- @scheduler ||= Rufus::Scheduler.new
212
- @scheduler.every "#{@lock_timeout - 2}s" do
213
- lock
214
- end
215
- # We also make sure we release the lock at exit. In case this doesn't happen, the lock will expire on its own
216
- @should_unlock_at_exit = true
217
- unless @exit_code_set
218
- at_exit {unlock if @should_unlock_at_exit}
219
- @exit_code_set = true
220
- end
221
- end
222
- puts 'done!' if recursed
223
- # If we failed locking then we need to try the process all over again
224
- else
225
- print 'Error: Failed to lock DynamoDB. Retrying...'
226
- sleep delay_in_seconds
227
- lock_or_wait true
228
- end
229
-
230
- end
231
-
232
- end
233
-
234
- # END lock_or_wait
235
-
236
- private
237
-
238
- def wait_for_table_creation
239
- delay_in_seconds = 2
240
- active = false
241
- while not active
242
- sleep delay_in_seconds
243
- print '.'
244
- #@dynamo_table = @dynamo_db.table @dynamo_table_name
245
- begin
246
- result = @dynamo_client.describe_table({table_name: @dynamo_table_name})
247
- active = (result.table.table_status == "ACTIVE")
248
- #active = (@dynamo_table.table_status == "ACTIVE")
249
- rescue Aws::DynamoDB::Errors::ResourceNotFoundException
250
- # We want to ignore this exception since we expect the table to be created at some point.
251
- # In real usage this error likely won't occur, and instead we will see table_status == "CREATING"
252
- end
253
- end
254
- puts "done!"
255
- end
256
-
257
- def get_lockdata
258
- item = @dynamo_client.get_item(
259
- {
260
- key: {'Script Name' => "#{@item_name}_lock"},
261
- table_name: @dynamo_table_name
262
- }
263
- ).item
264
- if item.nil?
265
- lock
266
- return get_lockdata
267
- end
268
- item
269
- end
270
-
271
- end
272
- end