rbcli 0.3.3 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.md +9 -0
- data/LICENSE.txt +5 -670
- data/README.md +64 -160
- data/VERSION +1 -0
- data/exe/rbcli +181 -242
- data/lib/rbcli/components/commands/command.rb +120 -0
- data/lib/rbcli/components/commands/command.rb.erb +55 -0
- data/lib/rbcli/components/commands/command_old.rb +105 -0
- data/lib/rbcli/components/commands/script.rb.erb +43 -0
- data/{lib-sh → lib/rbcli/components/commands/scriptwrapper}/lib-rbcli.sh +29 -34
- data/lib/rbcli/components/commands/scriptwrapper/scriptwrapper.rb +64 -0
- data/lib/rbcli/components/config/backend.rb +102 -0
- data/lib/rbcli/components/config/backends/env.rb +67 -0
- data/lib/rbcli/components/config/backends/helpers/deep_assign.rb +47 -0
- data/lib/rbcli/components/config/backends/ini.rb +53 -0
- data/lib/rbcli/components/config/backends/json.rb +32 -0
- data/lib/rbcli/components/config/backends/null.rb +32 -0
- data/lib/rbcli/components/config/backends/toml.rb +38 -0
- data/lib/rbcli/components/config/backends/yaml.rb +31 -0
- data/lib/rbcli/components/config/component.rb +33 -0
- data/lib/rbcli/components/config/config.rb +165 -0
- data/lib/rbcli/components/config/config_of_death.rb +12 -0
- data/lib/rbcli/components/config/template.rb.erb +36 -0
- data/lib/rbcli/components/core/configurate.rb +63 -0
- data/lib/rbcli/components/core/engine.rb +30 -0
- data/lib/rbcli/components/core/warehouse.rb +18 -0
- data/lib/rbcli/components/envvars/component.rb +20 -0
- data/lib/rbcli/components/envvars/template.rb.erb +24 -0
- data/lib/rbcli/components/hooks/component.rb +36 -0
- data/lib/rbcli/components/hooks/template.rb.erb +20 -0
- data/lib/rbcli/components/logger/component.rb +32 -0
- data/lib/rbcli/components/logger/logger.rb +155 -0
- data/lib/rbcli/components/logger/lolcat/lol.rb +71 -0
- data/lib/rbcli/components/logger/template.rb.erb +40 -0
- data/lib/rbcli/components/parser/component.rb +33 -0
- data/lib/rbcli/{util → components/parser/optimist}/optimist.rb +134 -48
- data/lib/rbcli/components/parser/parser.rb +178 -0
- data/lib/rbcli/components/parser/template.rb.erb +35 -0
- data/lib/rbcli/components/updatechecker/common/common.rb +52 -0
- data/lib/rbcli/components/updatechecker/component.rb +42 -0
- data/lib/rbcli/components/updatechecker/gem_checker.rb +40 -0
- data/lib/rbcli/components/updatechecker/github_checker.rb +46 -0
- data/lib/rbcli/components/updatechecker/template.rb.erb +14 -0
- data/lib/rbcli/util/deprecation_warning.rb +41 -55
- data/lib/rbcli/util/errors.rb +12 -0
- data/lib/rbcli/util/exit.rb +12 -0
- data/lib/rbcli/util/hash_deep_symbolize.rb +26 -41
- data/lib/rbcli/util/string_compression.rb +10 -0
- data/lib/rbcli/version.rb +5 -20
- data/lib/rbcli-tool/helpers.rb +58 -0
- data/lib/rbcli-tool/skeletons/gem.rb.erb +17 -0
- data/lib/rbcli-tool/skeletons/portable.rb.erb +48 -0
- data/lib/rbcli.rb +19 -50
- data/sig/rbcli.rbs +9 -0
- metadata +125 -496
- data/.gitignore +0 -60
- data/.rakeTasks +0 -7
- data/.rbenv-gemsets +0 -1
- data/.travis.yml +0 -5
- data/CHANGELOG.md +0 -193
- data/CODE_OF_CONDUCT.md +0 -74
- data/Gemfile +0 -6
- data/Gemfile.lock +0 -92
- data/Rakefile +0 -10
- data/bin/console +0 -33
- data/bin/setup +0 -28
- data/docs/404.html +0 -59
- data/docs/advanced/automatic_updates/index.html +0 -1174
- data/docs/advanced/command_types/index.html +0 -1262
- data/docs/advanced/distributed_state_locking/index.html +0 -1176
- data/docs/advanced/hooks/index.html +0 -1192
- data/docs/advanced/index.html +0 -1140
- data/docs/advanced/index.xml +0 -75
- data/docs/advanced/interactive_commands/index.html +0 -1177
- data/docs/advanced/logging/index.html +0 -1184
- data/docs/advanced/remote_execution/index.html +0 -1190
- data/docs/advanced/state_storage/index.html +0 -1281
- data/docs/advanced/user_config_files/index.html +0 -1209
- data/docs/categories/index.html +0 -1146
- data/docs/categories/index.xml +0 -11
- data/docs/css/atom-one-dark-reasonable.css +0 -77
- data/docs/css/auto-complete.css +0 -47
- data/docs/css/featherlight.min.css +0 -8
- data/docs/css/fontawesome-all.min.css +0 -1
- data/docs/css/hugo-theme.css +0 -254
- data/docs/css/hybrid.css +0 -102
- data/docs/css/nucleus.css +0 -615
- data/docs/css/perfect-scrollbar.min.css +0 -2
- data/docs/css/tags.css +0 -49
- data/docs/css/theme-blue.css +0 -111
- data/docs/css/theme-green.css +0 -111
- data/docs/css/theme-red.css +0 -111
- data/docs/css/theme.css +0 -1136
- data/docs/development/changelog/index.html +0 -1420
- data/docs/development/code_of_conduct/index.html +0 -1222
- data/docs/development/contributing/index.html +0 -1201
- data/docs/development/index.html +0 -1140
- data/docs/development/index.xml +0 -40
- data/docs/development/license/index.html +0 -1165
- data/docs/fonts/Inconsolata.eot +0 -0
- data/docs/fonts/Inconsolata.svg +0 -1
- data/docs/fonts/Inconsolata.ttf +0 -0
- data/docs/fonts/Inconsolata.woff +0 -0
- data/docs/fonts/Novecentosanswide-Normal-webfont.eot +0 -0
- data/docs/fonts/Novecentosanswide-Normal-webfont.svg +0 -1
- data/docs/fonts/Novecentosanswide-Normal-webfont.ttf +0 -0
- data/docs/fonts/Novecentosanswide-Normal-webfont.woff +0 -0
- data/docs/fonts/Novecentosanswide-Normal-webfont.woff2 +0 -0
- data/docs/fonts/Novecentosanswide-UltraLight-webfont.eot +0 -0
- data/docs/fonts/Novecentosanswide-UltraLight-webfont.svg +0 -1
- data/docs/fonts/Novecentosanswide-UltraLight-webfont.ttf +0 -0
- data/docs/fonts/Novecentosanswide-UltraLight-webfont.woff +0 -0
- data/docs/fonts/Novecentosanswide-UltraLight-webfont.woff2 +0 -0
- data/docs/fonts/Work_Sans_200.eot +0 -0
- data/docs/fonts/Work_Sans_200.svg +0 -1
- data/docs/fonts/Work_Sans_200.ttf +0 -0
- data/docs/fonts/Work_Sans_200.woff +0 -0
- data/docs/fonts/Work_Sans_200.woff2 +0 -0
- data/docs/fonts/Work_Sans_300.eot +0 -0
- data/docs/fonts/Work_Sans_300.svg +0 -1
- data/docs/fonts/Work_Sans_300.ttf +0 -0
- data/docs/fonts/Work_Sans_300.woff +0 -0
- data/docs/fonts/Work_Sans_300.woff2 +0 -0
- data/docs/fonts/Work_Sans_500.eot +0 -0
- data/docs/fonts/Work_Sans_500.svg +0 -1
- data/docs/fonts/Work_Sans_500.ttf +0 -0
- data/docs/fonts/Work_Sans_500.woff +0 -0
- data/docs/fonts/Work_Sans_500.woff2 +0 -0
- data/docs/images/clippy.svg +0 -1
- data/docs/images/favicon.png +0 -0
- data/docs/images/gopher-404.jpg +0 -0
- data/docs/imported/changelog/index.html +0 -1449
- data/docs/imported/index.html +0 -1191
- data/docs/imported/index.xml +0 -23
- data/docs/index.html +0 -1138
- data/docs/index.json +0 -183
- data/docs/index.xml +0 -138
- data/docs/js/auto-complete.js +0 -3
- data/docs/js/clipboard.min.js +0 -7
- data/docs/js/featherlight.min.js +0 -9
- data/docs/js/highlight.pack.js +0 -6
- data/docs/js/html5shiv-printshiv.min.js +0 -4
- data/docs/js/hugo-learn.js +0 -94
- data/docs/js/jquery-3.3.1.min.js +0 -2
- data/docs/js/jquery.sticky.js +0 -288
- data/docs/js/learn.js +0 -459
- data/docs/js/lunr.min.js +0 -6
- data/docs/js/modernizr.custom-3.6.0.js +0 -3
- data/docs/js/perfect-scrollbar.jquery.min.js +0 -2
- data/docs/js/perfect-scrollbar.min.js +0 -2
- data/docs/js/search.js +0 -93
- data/docs/mermaid/mermaid.css +0 -277
- data/docs/mermaid/mermaid.dark.css +0 -278
- data/docs/mermaid/mermaid.forest.css +0 -356
- data/docs/mermaid/mermaid.js +0 -8
- data/docs/quick_reference/index.html +0 -1246
- data/docs/quick_reference/index.xml +0 -12
- data/docs/sitemap.xml +0 -81
- data/docs/tags/index.html +0 -1146
- data/docs/tags/index.xml +0 -11
- data/docs/tutorial/10-getting_started/index.html +0 -1174
- data/docs/tutorial/20-project_layout/index.html +0 -1299
- data/docs/tutorial/30-your_first_command/index.html +0 -1263
- data/docs/tutorial/40-options_parameters_and_arguments/index.html +0 -1384
- data/docs/tutorial/50-publishing/index.html +0 -1187
- data/docs/tutorial/index.html +0 -1140
- data/docs/tutorial/index.xml +0 -47
- data/docs/webfonts/fa-brands-400.eot +0 -0
- data/docs/webfonts/fa-brands-400.svg +0 -1
- data/docs/webfonts/fa-brands-400.ttf +0 -0
- data/docs/webfonts/fa-brands-400.woff +0 -0
- data/docs/webfonts/fa-brands-400.woff2 +0 -0
- data/docs/webfonts/fa-regular-400.eot +0 -0
- data/docs/webfonts/fa-regular-400.svg +0 -1
- data/docs/webfonts/fa-regular-400.ttf +0 -0
- data/docs/webfonts/fa-regular-400.woff +0 -0
- data/docs/webfonts/fa-regular-400.woff2 +0 -0
- data/docs/webfonts/fa-solid-900.eot +0 -0
- data/docs/webfonts/fa-solid-900.svg +0 -1
- data/docs/webfonts/fa-solid-900.ttf +0 -0
- data/docs/webfonts/fa-solid-900.woff +0 -0
- data/docs/webfonts/fa-solid-900.woff2 +0 -0
- data/docs/whoami/index.html +0 -1155
- data/docs/whoami/index.xml +0 -12
- data/docs-src/archetypes/default.md +0 -6
- data/docs-src/config.toml +0 -37
- data/docs-src/content/_index.md +0 -40
- data/docs-src/content/advanced/_index.md +0 -11
- data/docs-src/content/advanced/automatic_updates.md +0 -46
- data/docs-src/content/advanced/command_types.md +0 -148
- data/docs-src/content/advanced/distributed_state_locking.md +0 -37
- data/docs-src/content/advanced/hooks.md +0 -69
- data/docs-src/content/advanced/interactive_commands.md +0 -41
- data/docs-src/content/advanced/logging.md +0 -39
- data/docs-src/content/advanced/remote_execution.md +0 -60
- data/docs-src/content/advanced/state_storage.md +0 -120
- data/docs-src/content/advanced/user_config_files.md +0 -51
- data/docs-src/content/development/_index.md +0 -11
- data/docs-src/content/development/changelog.md +0 -199
- data/docs-src/content/development/code_of_conduct.md +0 -81
- data/docs-src/content/development/contributing.md +0 -88
- data/docs-src/content/development/license.md +0 -17
- data/docs-src/content/quick_reference/_index.md +0 -180
- data/docs-src/content/tutorial/10-getting_started.md +0 -47
- data/docs-src/content/tutorial/20-project_layout.md +0 -123
- data/docs-src/content/tutorial/30-your_first_command.md +0 -132
- data/docs-src/content/tutorial/40-options_parameters_and_arguments.md +0 -282
- data/docs-src/content/tutorial/50-publishing.md +0 -53
- data/docs-src/content/tutorial/_index.md +0 -11
- data/docs-src/content/whoami/_index.md +0 -34
- data/docs-src/layouts/partials/logo.html +0 -3
- data/docs-src/makesite.sh +0 -40
- data/docs-src/mkdocs-archived.tar.gz +0 -0
- data/docs-src/runsite.sh +0 -8
- data/docs-src/themes/hugo-theme-learn/.editorconfig +0 -16
- data/docs-src/themes/hugo-theme-learn/.gitignore +0 -3
- data/docs-src/themes/hugo-theme-learn/.grenrc.yml +0 -25
- data/docs-src/themes/hugo-theme-learn/CHANGELOG.md +0 -226
- data/docs-src/themes/hugo-theme-learn/LICENSE.md +0 -22
- data/docs-src/themes/hugo-theme-learn/README.md +0 -97
- data/docs-src/themes/hugo-theme-learn/archetypes/chapter.md +0 -13
- data/docs-src/themes/hugo-theme-learn/archetypes/default.md +0 -7
- data/docs-src/themes/hugo-theme-learn/exampleSite/LICENSE.md +0 -20
- data/docs-src/themes/hugo-theme-learn/exampleSite/config.toml +0 -102
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/_index.en.md +0 -41
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/_index.fr.md +0 -43
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/_index.en.md +0 -12
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/_index.fr.md +0 -12
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/_index.zh.md +0 -12
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/configuration/_index.en.md +0 -60
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/configuration/_index.fr.md +0 -56
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/installation/_index.en.md +0 -102
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/installation/_index.fr.md +0 -100
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/installation/images/chapter.png +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/requirements/_index.en.md +0 -11
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/requirements/_index.fr.md +0 -11
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/requirements/images/magic.gif +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/_index.en.md +0 -194
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/_index.fr.md +0 -194
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/images/blue-variant.png +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/images/green-variant.png +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/images/red-variant.png +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/_index.en.md +0 -12
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/_index.fr.md +0 -12
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/archetypes.en.md +0 -57
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/archetypes.fr.md +0 -57
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/i18n/_index.en.md +0 -78
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/i18n/_index.fr.md +0 -78
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/i18n/images/i18n-menu.gif +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/icons.en.md +0 -41
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/markdown.en.md +0 -692
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/markdown.fr.md +0 -666
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/menushortcuts.en.md +0 -109
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/menushortcuts.fr.md +0 -109
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/pages/_index.en.md +0 -166
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/pages/_index.fr.md +0 -146
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/pages/images/frontmatter-icon.png +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/pages/images/pages-chapter.png +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/pages/images/pages-default.png +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/syntaxhighlight.en.md +0 -89
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/tags.en.md +0 -39
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/tags.fr.md +0 -40
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/credits.en.md +0 -28
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/credits.fr.md +0 -28
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/_index.en.md +0 -16
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/_index.fr.md +0 -16
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/BachGavotteShort.mp3 +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/Carroll_AliceAuPaysDesMerveilles.pdf +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/adivorciarsetoca00cape.pdf +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/hugo.png +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/movieselectricsheep-flock-244-32500-2.mp4 +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.md +0 -85
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/BachGavotteShort.mp3 +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/Carroll_AliceAuPaysDesMerveilles.pdf +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/adivorciarsetoca00cape.pdf +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/hugo.png +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/movieselectricsheep-flock-244-32500-2.mp4 +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.md +0 -85
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/button.en.md +0 -16
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/button.fr.md +0 -16
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/_index.en.md +0 -45
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/_index.fr.md +0 -45
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/_index.en.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/_index.fr.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.en.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.fr.md +0 -6
- 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
- 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
- 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
- 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
- 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
- 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
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/_index.en.md +0 -11
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/_index.fr.md +0 -11
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/test3.en.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/test3.fr.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-3/_index.en.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-3/_index.fr.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-4/_index.en.md +0 -7
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-4/_index.fr.md +0 -7
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/test.en.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/test.fr.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/expand.en.md +0 -45
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/expand.fr.md +0 -45
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/mermaid.en.md +0 -283
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/mermaid.fr.md +0 -283
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/notice.en.md +0 -62
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/notice.fr.md +0 -62
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/siteparam.en.md +0 -23
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/siteparam.fr.md +0 -23
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/showcase.en.md +0 -13
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/showcase.fr.md +0 -14
- data/docs-src/themes/hugo-theme-learn/exampleSite/layouts/partials/custom-footer.html +0 -10
- data/docs-src/themes/hugo-theme-learn/exampleSite/layouts/partials/logo.html +0 -39
- data/docs-src/themes/hugo-theme-learn/exampleSite/layouts/partials/menu-footer.html +0 -14
- data/docs-src/themes/hugo-theme-learn/exampleSite/layouts/shortcodes/ghcontributors.html +0 -31
- data/docs-src/themes/hugo-theme-learn/exampleSite/static/css/theme-mine.css +0 -104
- data/docs-src/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.eot +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.svg +0 -1
- data/docs-src/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.ttf +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.woff +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.woff2 +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/static/images/showcase/inteliver_docs.png +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/static/images/showcase/tat.png +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/static/images/showcase/tshark_dev.png +0 -0
- data/docs-src/themes/hugo-theme-learn/i18n/ar.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/de.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/en.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/es.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/fr.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/hi.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/id.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/ja.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/nl.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/pt.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/ru.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/tr.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/zh-cn.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/images/screenshot.png +0 -0
- data/docs-src/themes/hugo-theme-learn/images/tn.png +0 -0
- data/docs-src/themes/hugo-theme-learn/layouts/404.html +0 -56
- data/docs-src/themes/hugo-theme-learn/layouts/_default/list.html +0 -22
- data/docs-src/themes/hugo-theme-learn/layouts/_default/single.html +0 -12
- data/docs-src/themes/hugo-theme-learn/layouts/index.html +0 -31
- data/docs-src/themes/hugo-theme-learn/layouts/index.json +0 -12
- data/docs-src/themes/hugo-theme-learn/layouts/partials/custom-comments.html +0 -3
- data/docs-src/themes/hugo-theme-learn/layouts/partials/custom-footer.html +0 -5
- data/docs-src/themes/hugo-theme-learn/layouts/partials/custom-header.html +0 -5
- data/docs-src/themes/hugo-theme-learn/layouts/partials/favicon.html +0 -1
- data/docs-src/themes/hugo-theme-learn/layouts/partials/footer.html +0 -77
- data/docs-src/themes/hugo-theme-learn/layouts/partials/header.html +0 -111
- data/docs-src/themes/hugo-theme-learn/layouts/partials/logo.html +0 -19
- data/docs-src/themes/hugo-theme-learn/layouts/partials/menu-footer.html +0 -1
- data/docs-src/themes/hugo-theme-learn/layouts/partials/menu.html +0 -151
- data/docs-src/themes/hugo-theme-learn/layouts/partials/meta.html +0 -2
- data/docs-src/themes/hugo-theme-learn/layouts/partials/search.html +0 -16
- data/docs-src/themes/hugo-theme-learn/layouts/partials/tags.html +0 -7
- data/docs-src/themes/hugo-theme-learn/layouts/partials/toc.html +0 -5
- data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/attachments.html +0 -36
- data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/button.html +0 -14
- data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/children.html +0 -101
- data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/expand.html +0 -17
- data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/mermaid.html +0 -2
- data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/notice.html +0 -2
- data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/ref.html +0 -14
- data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/relref.html +0 -14
- data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/siteparam.html +0 -7
- data/docs-src/themes/hugo-theme-learn/netlify.toml +0 -23
- data/docs-src/themes/hugo-theme-learn/static/css/atom-one-dark-reasonable.css +0 -77
- data/docs-src/themes/hugo-theme-learn/static/css/auto-complete.css +0 -47
- data/docs-src/themes/hugo-theme-learn/static/css/featherlight.min.css +0 -8
- data/docs-src/themes/hugo-theme-learn/static/css/fontawesome-all.min.css +0 -1
- data/docs-src/themes/hugo-theme-learn/static/css/hugo-theme.css +0 -254
- data/docs-src/themes/hugo-theme-learn/static/css/hybrid.css +0 -102
- data/docs-src/themes/hugo-theme-learn/static/css/nucleus.css +0 -615
- data/docs-src/themes/hugo-theme-learn/static/css/perfect-scrollbar.min.css +0 -2
- data/docs-src/themes/hugo-theme-learn/static/css/tags.css +0 -49
- data/docs-src/themes/hugo-theme-learn/static/css/theme-blue.css +0 -111
- data/docs-src/themes/hugo-theme-learn/static/css/theme-green.css +0 -111
- data/docs-src/themes/hugo-theme-learn/static/css/theme-red.css +0 -111
- data/docs-src/themes/hugo-theme-learn/static/css/theme.css +0 -1136
- data/docs-src/themes/hugo-theme-learn/static/fonts/Inconsolata.eot +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Inconsolata.svg +0 -1
- data/docs-src/themes/hugo-theme-learn/static/fonts/Inconsolata.ttf +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Inconsolata.woff +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.eot +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.svg +0 -1
- data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.ttf +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.woff +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.woff2 +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.eot +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.svg +0 -1
- data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.ttf +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.woff +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.woff2 +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_200.eot +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_200.svg +0 -1
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_200.ttf +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_200.woff +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_200.woff2 +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_300.eot +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_300.svg +0 -1
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_300.ttf +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_300.woff +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_300.woff2 +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_500.eot +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_500.svg +0 -1
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_500.ttf +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_500.woff +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_500.woff2 +0 -0
- data/docs-src/themes/hugo-theme-learn/static/images/clippy.svg +0 -1
- data/docs-src/themes/hugo-theme-learn/static/images/favicon.png +0 -0
- data/docs-src/themes/hugo-theme-learn/static/images/gopher-404.jpg +0 -0
- data/docs-src/themes/hugo-theme-learn/static/js/auto-complete.js +0 -3
- data/docs-src/themes/hugo-theme-learn/static/js/clipboard.min.js +0 -7
- data/docs-src/themes/hugo-theme-learn/static/js/featherlight.min.js +0 -9
- data/docs-src/themes/hugo-theme-learn/static/js/highlight.pack.js +0 -6
- data/docs-src/themes/hugo-theme-learn/static/js/hugo-learn.js +0 -94
- data/docs-src/themes/hugo-theme-learn/static/js/jquery-3.3.1.min.js +0 -2
- data/docs-src/themes/hugo-theme-learn/static/js/jquery.sticky.js +0 -288
- data/docs-src/themes/hugo-theme-learn/static/js/learn.js +0 -459
- data/docs-src/themes/hugo-theme-learn/static/js/lunr.min.js +0 -6
- data/docs-src/themes/hugo-theme-learn/static/js/modernizr.custom-3.6.0.js +0 -3
- data/docs-src/themes/hugo-theme-learn/static/js/perfect-scrollbar.jquery.min.js +0 -2
- data/docs-src/themes/hugo-theme-learn/static/js/perfect-scrollbar.min.js +0 -2
- data/docs-src/themes/hugo-theme-learn/static/js/search.js +0 -93
- data/docs-src/themes/hugo-theme-learn/static/mermaid/mermaid.css +0 -277
- data/docs-src/themes/hugo-theme-learn/static/mermaid/mermaid.dark.css +0 -278
- data/docs-src/themes/hugo-theme-learn/static/mermaid/mermaid.forest.css +0 -356
- data/docs-src/themes/hugo-theme-learn/static/mermaid/mermaid.js +0 -8
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-brands-400.eot +0 -0
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-brands-400.svg +0 -1
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-brands-400.ttf +0 -0
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-brands-400.woff +0 -0
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-brands-400.woff2 +0 -0
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-regular-400.eot +0 -0
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-regular-400.svg +0 -1
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-regular-400.ttf +0 -0
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-regular-400.woff +0 -0
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-regular-400.woff2 +0 -0
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-solid-900.eot +0 -0
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-solid-900.svg +0 -1
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-solid-900.ttf +0 -0
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-solid-900.woff +0 -0
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-solid-900.woff2 +0 -0
- data/docs-src/themes/hugo-theme-learn/theme.toml +0 -21
- data/docs-src/themes/hugo-theme-learn/wercker.yml +0 -16
- data/lib/rbcli/configuration/configurate.rb +0 -85
- data/lib/rbcli/configuration/configurate_blocks/hooks.rb +0 -52
- data/lib/rbcli/configuration/configurate_blocks/me.rb +0 -122
- data/lib/rbcli/configuration/configurate_blocks/storage.rb +0 -50
- data/lib/rbcli/engine/command.rb +0 -251
- data/lib/rbcli/engine/load_project.rb +0 -45
- data/lib/rbcli/engine/parser.rb +0 -116
- data/lib/rbcli/features/autoupdate/common/autoupdate.rb +0 -50
- data/lib/rbcli/features/autoupdate/gem_updater.rb +0 -62
- data/lib/rbcli/features/autoupdate/github_updater.rb +0 -76
- data/lib/rbcli/features/logging.rb +0 -98
- data/lib/rbcli/features/remote_exec.rb +0 -187
- data/lib/rbcli/features/scriptwrapper.rb +0 -75
- data/lib/rbcli/features/userconfig.rb +0 -163
- data/lib/rbcli/state_storage/common/state_storage.rb +0 -138
- data/lib/rbcli/state_storage/localstate.rb +0 -77
- data/lib/rbcli/state_storage/placeholders.rb +0 -29
- data/lib/rbcli/state_storage/remote_state_connectors/dynamodb.rb +0 -272
- data/lib/rbcli/state_storage/remotestate_dynamodb.rb +0 -115
- data/lib/rbcli/util/msg.rb +0 -55
- data/lib/rbcli/util/string_colorize.rb +0 -45
- data/lib/rbcli-tool/generators.rb +0 -105
- data/lib/rbcli-tool/mdless_fix.rb +0 -406
- data/lib/rbcli-tool/project.rb +0 -120
- data/lib/rbcli-tool/util.rb +0 -70
- data/lib/rbcli-tool.rb +0 -37
- data/rbcli.gemspec +0 -73
- data/skeletons/micro/executable +0 -132
- data/skeletons/mini/executable +0 -247
- data/skeletons/project/.gitignore +0 -11
- data/skeletons/project/.rakeTasks +0 -7
- data/skeletons/project/.rbcli +0 -0
- data/skeletons/project/.rspec +0 -3
- data/skeletons/project/CODE_OF_CONDUCT.md +0 -74
- data/skeletons/project/Gemfile +0 -6
- data/skeletons/project/README.md +0 -46
- data/skeletons/project/Rakefile +0 -6
- data/skeletons/project/application/commands/command.erb +0 -28
- data/skeletons/project/application/commands/script.erb +0 -30
- data/skeletons/project/application/commands/scripts/script.sh +0 -60
- data/skeletons/project/application/options.rb +0 -34
- data/skeletons/project/config/autoupdate.rb +0 -35
- data/skeletons/project/config/general.rb +0 -17
- data/skeletons/project/config/logging.rb +0 -19
- data/skeletons/project/config/storage.rb +0 -35
- data/skeletons/project/config/userspace.rb +0 -33
- data/skeletons/project/config/version.rb +0 -3
- data/skeletons/project/exe/executable +0 -53
- data/skeletons/project/hooks/default_action.rb +0 -16
- data/skeletons/project/hooks/first_run.rb +0 -16
- data/skeletons/project/hooks/post_execution.rb +0 -14
- data/skeletons/project/hooks/pre_execution.rb +0 -14
- data/skeletons/project/lib/lib.erb +0 -9
- data/skeletons/project/spec/spec_helper.rb +0 -14
- data/skeletons/project/spec/untitled_spec.rb +0 -9
- data/skeletons/project/untitled.gemspec +0 -40
- data/skeletons/project/userconf/user_defaults.yml +0 -6
- /data/{docs-src/.hugo_build.lock → lib/rbcli/plugins/.keep} +0 -0
@@ -0,0 +1,105 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
##################################################################################
|
3
|
+
# Rbcli -- A framework for developing command line applications in Ruby #
|
4
|
+
# Copyright (C) 2024 Andrew Khoury <akhoury@live.com> #
|
5
|
+
##################################################################################
|
6
|
+
module Rbcli::Core::CmdLibrary
|
7
|
+
def self.extended klass
|
8
|
+
klass.instance_variable_set :@commands, {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def inherited subklass
|
12
|
+
raise Rbcli::CommandError.new "The command #{subklass.name.downcase} cannot be defined twice." unless @commands[subklass.name.downcase].nil?
|
13
|
+
subklass.instance_variable_set :@data, {
|
14
|
+
description: nil,
|
15
|
+
helptext: nil,
|
16
|
+
default: nil,
|
17
|
+
action: nil,
|
18
|
+
script: nil,
|
19
|
+
usage: nil,
|
20
|
+
parameter_prompts: {},
|
21
|
+
parser: Optimist::Parser.new
|
22
|
+
}
|
23
|
+
@commands[subklass.name.downcase] = subklass.new
|
24
|
+
Rbcli::Cliopts.register_command subklass.name.downcase
|
25
|
+
Rbcli.log.debug "Registered command '#{subklass.name.downcase}'", "CORE"
|
26
|
+
|
27
|
+
Rbcli::Engine.register_operation Proc.new {
|
28
|
+
Rbcli.log.debug "Running command '#{Rbcli::Cliopts.cmd[:name]}'", "CORE"
|
29
|
+
Rbcli::Cliopts.cmd[:command].data[:action].call(Rbcli::Cliopts.opts,
|
30
|
+
Rbcli::Cliopts.cmd[:params],
|
31
|
+
Rbcli::Cliopts.cmd[:args],
|
32
|
+
(Rbcli::Configurate.constants.include?(:Config) ? Rbcli.configuration(:config)[:config] : Rbcli::Config.new(suppress_errors: true)),
|
33
|
+
(Rbcli::Configurate.constants.include?(:Envvars) ? Rbcli.configuration(:envvars)[:envvars] : Rbcli::Config.new(suppress_errors: true))
|
34
|
+
) unless Rbcli::Cliopts.cmd[:command].data[:action].nil?
|
35
|
+
Rbcli::Cliopts.cmd[:command].data[:script].execute(Rbcli::Cliopts.opts,
|
36
|
+
Rbcli::Cliopts.cmd[:params],
|
37
|
+
Rbcli::Cliopts.cmd[:args],
|
38
|
+
(Rbcli::Configurate.constants.include?(:Config) ? Rbcli.configuration(:config)[:config] : Rbcli::Config.new(suppress_errors: true)),
|
39
|
+
(Rbcli::Configurate.constants.include?(:Envvars) ? Rbcli.configuration(:envvars)[:envvars] : Rbcli::Config.new(suppress_errors: true))
|
40
|
+
) unless Rbcli::Cliopts.cmd[:command].data[:script].nil?
|
41
|
+
}, name: :run_command, priority: 100 if @commands.count == 1
|
42
|
+
end
|
43
|
+
|
44
|
+
def data
|
45
|
+
self.instance_variable_get :@data;
|
46
|
+
end
|
47
|
+
|
48
|
+
def commands
|
49
|
+
@commands.select { |name, cmd| !cmd.data[:default] }
|
50
|
+
end
|
51
|
+
|
52
|
+
def default_command
|
53
|
+
default_commands = @commands.select { |_name, cmd| cmd.data[:default] }
|
54
|
+
raise Rbcli::CommandError.new "Can't execute - more than one command has been specified as default: #{default_commands.keys}" if default_commands.count > 1
|
55
|
+
default_commands.count == 1 ? default_commands.first : nil
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class Rbcli::Command
|
60
|
+
extend Rbcli::Core::CmdLibrary
|
61
|
+
|
62
|
+
def data
|
63
|
+
self.class.data
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.description desc = nil
|
67
|
+
desc.nil? ? @data[:description] : @data[:description] = desc
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.helptext text = nil
|
71
|
+
text.nil? ? @data[:helptext] : @data[:helptext] = text
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.usage text = nil
|
75
|
+
text.nil? ? @data[:usage] : @data[:usage] = text
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.default
|
79
|
+
@data[:default] = true
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.parameter * args
|
83
|
+
if !args[2].nil? && !args[2].empty? && args[2][:prompt].is_a?(String)
|
84
|
+
@data[:parameter_prompts][args[0]] = { prompt: args[2][:prompt], default: args[2][:default], type: args[2][:type].nil? ? nil : args[2][:type].to_s.chomp('s').to_sym }
|
85
|
+
args[2][:required] = false
|
86
|
+
end
|
87
|
+
@data[:parser].opt *args
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.action & block
|
91
|
+
@data[:action] = block
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.script inline: nil, path: nil, vars: nil
|
95
|
+
if !inline.nil? && !path.nil?
|
96
|
+
raise Rbcli::CommandError.new "Can't assign both an inline script and an external path to command '#{self.name}'"
|
97
|
+
end
|
98
|
+
if path == :builtin or path.nil?
|
99
|
+
callerscript = caller_locations.first.absolute_path
|
100
|
+
path = "#{File.dirname(callerscript)}/scripts/#{File.basename(callerscript, ".*")}.sh"
|
101
|
+
end
|
102
|
+
require File.join(RBCLI_LIBDIR, 'components', 'scriptwrapper', 'scriptwrapper.rb')
|
103
|
+
@data[:script] = Rbcli::ScriptWrapper.new inline: inline, path: path, vars: vars
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
<%- if @showdocs -%>
|
2
|
+
# Script Command
|
3
|
+
# Supports all of the same features as a regular command, but passes everything to a bash script
|
4
|
+
# The script can be defined inline, or a path to an external script can be provided
|
5
|
+
#
|
6
|
+
# Code is injected into the script to integrate with Rbcli.
|
7
|
+
# The `log` commands are integrated with the ruby logger
|
8
|
+
# The `rbcli` command provides a wrapper around jq that can retrieve
|
9
|
+
# the values of opts/params/args/config/env
|
10
|
+
# For more information on JQ syntax, see: https://jqlang.github.io/jq/
|
11
|
+
<%- end -%>
|
12
|
+
Rbcli.command "<%= @command_name || 'script' %>" do
|
13
|
+
description "example script command"
|
14
|
+
# external_script vars: {}, path: "./test.sh"
|
15
|
+
inline_script vars: { foo: 'bar!!!' }, inline: <<~INLINE
|
16
|
+
#!/usr/bin/env bash
|
17
|
+
log "Rbcli shell integration demo!"
|
18
|
+
<%- if @showdocs -%>
|
19
|
+
log "A custom JQ wrapper is used to parse data passed through from Rbcli"
|
20
|
+
log "For more information on how to use it, see: https://jqlang.github.io/jq/"
|
21
|
+
log ""
|
22
|
+
|
23
|
+
log "Top-level CLI Options: $(rbcli opts .)"
|
24
|
+
log "Parameters: $(rbcli params .)"
|
25
|
+
log "Arguments on the CLI: $(rbcli args .)"
|
26
|
+
log "Config: $(rbcli config .)"
|
27
|
+
log "Environment Variables: $(rbcli env .)"
|
28
|
+
log "Custom Var from command: $(rbcli vars .foo)"
|
29
|
+
log "Same variable, in environment: ${FOO}"
|
30
|
+
|
31
|
+
log "Logs are integrated too"
|
32
|
+
log "Example Debug (you need to change your log level to see this)" "debug"
|
33
|
+
log "Example Info" "info"
|
34
|
+
log "Example Warning" "warn"
|
35
|
+
log "Example Error" "error"
|
36
|
+
log "Example Fatal" "fatal"
|
37
|
+
log "Example Unknown" "unknown"
|
38
|
+
<%- else -%>
|
39
|
+
rbcli opts .
|
40
|
+
log "Example Warning" "warn"
|
41
|
+
<%- end -%>
|
42
|
+
INLINE
|
43
|
+
end
|
@@ -1,38 +1,33 @@
|
|
1
1
|
#!/usr/bin/env bash
|
2
2
|
##################################################################################
|
3
|
-
#
|
4
|
-
# Copyright (C)
|
5
|
-
# #
|
6
|
-
# This program is free software: you can redistribute it and/or modify #
|
7
|
-
# it under the terms of the GNU General Public License as published by #
|
8
|
-
# the Free Software Foundation, either version 3 of the License, or #
|
9
|
-
# (at your option) any later version. #
|
10
|
-
# #
|
11
|
-
# This program is distributed in the hope that it will be useful, #
|
12
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
13
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
14
|
-
# GNU General Public License for more details. #
|
15
|
-
# #
|
16
|
-
# You should have received a copy of the GNU General Public License #
|
17
|
-
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
|
18
|
-
# #
|
19
|
-
# For questions regarding licensing, please contact andrew@blacknex.us #
|
3
|
+
# Rbcli -- A framework for developing command line applications in Ruby #
|
4
|
+
# Copyright (C) 2024 Andrew Khoury <akhoury@live.com> #
|
20
5
|
##################################################################################
|
21
|
-
|
22
|
-
## Log message
|
6
|
+
## Basic message
|
23
7
|
function message {
|
24
8
|
if [ "$2" == "err" ]; then
|
25
9
|
COLOR='\033[00;31m'
|
26
10
|
else
|
27
|
-
|
28
11
|
COLOR='\033[00;32m'
|
29
12
|
fi
|
30
13
|
|
31
14
|
if [ "$2" == "no_newline" ]; then
|
32
|
-
printf "${COLOR}
|
15
|
+
printf "${COLOR}${1}\033[0m"
|
33
16
|
else
|
34
|
-
echo
|
17
|
+
echo "${COLOR}${1}\033[0m"
|
18
|
+
fi
|
19
|
+
}
|
20
|
+
|
21
|
+
## Log function integrates with Rbcli Logger
|
22
|
+
function log {
|
23
|
+
prefix='INFO || '
|
24
|
+
if [ ! -z ${2+x} ]; then
|
25
|
+
_pfx="$(echo "${2}" | tr '[:lower:]' '[:upper:]')"
|
26
|
+
if [[ "${_pfx}" =~ ^(DEBUG|INFO|WARN|ERROR|FATAL|UNKNOWN)$ ]]; then
|
27
|
+
prefix="${_pfx} || "
|
28
|
+
fi
|
35
29
|
fi
|
30
|
+
echo "${prefix}${1}"
|
36
31
|
}
|
37
32
|
|
38
33
|
## Detect OS
|
@@ -87,7 +82,6 @@ function install_jq {
|
|
87
82
|
esac
|
88
83
|
}
|
89
84
|
|
90
|
-
|
91
85
|
# We need to make sure JQ is installed so that we can parse variables
|
92
86
|
which jq &> /dev/null
|
93
87
|
_RESULT=$?
|
@@ -97,36 +91,37 @@ if [[ "${_RESULT}" -ne 0 ]]; then
|
|
97
91
|
install_jq
|
98
92
|
fi
|
99
93
|
|
100
|
-
|
101
94
|
######
|
102
95
|
## RBCLI
|
103
96
|
######
|
104
|
-
# This function provides an interface to the variables exposed by
|
97
|
+
# This function provides an interface to the variables exposed by Rbcli
|
105
98
|
function rbcli {
|
106
99
|
_vargroup=$1
|
107
100
|
_var=$2
|
108
101
|
|
109
102
|
case "${_vargroup}" in
|
103
|
+
opts)
|
104
|
+
_groupname='__RBCLI_OPTS'
|
105
|
+
;;
|
110
106
|
params)
|
111
107
|
_groupname='__RBCLI_PARAMS'
|
112
108
|
;;
|
113
109
|
args)
|
114
110
|
_groupname='__RBCLI_ARGS'
|
115
111
|
;;
|
116
|
-
global_opts)
|
117
|
-
_groupname='__RBCLI_GLOBAL'
|
118
|
-
;;
|
119
112
|
config)
|
120
113
|
_groupname='__RBCLI_CONFIG'
|
121
114
|
;;
|
122
|
-
|
123
|
-
_groupname='
|
115
|
+
env)
|
116
|
+
_groupname='__RBCLI_ENV'
|
117
|
+
;;
|
118
|
+
vars)
|
119
|
+
_groupname='__RBCLI_VARS'
|
124
120
|
;;
|
125
121
|
*)
|
126
|
-
message "Invalid RBCLI variable reference. Please reference variables from one of the following groups: params, args,
|
122
|
+
message "Invalid RBCLI variable reference. Please reference variables from one of the following groups: opts, params, args, config, env, vars." "err"
|
127
123
|
exit 1
|
128
124
|
esac
|
129
|
-
echo $(echo ${!_groupname} | jq -r "${
|
125
|
+
echo "$(echo ${!_groupname} | jq -r "${_var}")"
|
130
126
|
}
|
131
|
-
export -f rbcli
|
132
|
-
|
127
|
+
export -f rbcli
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
##################################################################################
|
3
|
+
# Rbcli -- A framework for developing command line applications in Ruby #
|
4
|
+
# Copyright (C) 2024 Andrew Khoury <akhoury@live.com> #
|
5
|
+
##################################################################################
|
6
|
+
require 'json'
|
7
|
+
require 'open3'
|
8
|
+
|
9
|
+
class Rbcli::ScriptWrapper
|
10
|
+
def initialize inline: nil, path: nil, vars: nil
|
11
|
+
@inline = inline
|
12
|
+
@path = path.nil? ? nil : File.expand_path(path)
|
13
|
+
@vars = vars || []
|
14
|
+
end
|
15
|
+
|
16
|
+
def execute opts = nil, params = nil, args = nil, config = nil, env = nil
|
17
|
+
sh_libpath = File.expand_path(File.join(File.dirname(__FILE__), 'lib-rbcli.sh'))
|
18
|
+
if @inline.nil? && !@path.nil?
|
19
|
+
cmd = File.read(@path).include?('lib-rbcli.sh') ? '' : "source '#{sh_libpath}'; "
|
20
|
+
cmd += "source '#{@path}'"
|
21
|
+
inject_rbcli = false
|
22
|
+
else
|
23
|
+
cmd = @inline
|
24
|
+
inject_rbcli = true
|
25
|
+
end
|
26
|
+
self.class.run_script cmd, opts: opts, params: params, args: args, config: config, env: env, vars: @vars, inject_rbcli: inject_rbcli
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.run_script cmd, opts: nil, params: nil, args: nil, config: nil, env: nil, vars: nil, inject_rbcli: true,
|
30
|
+
capture_output: false, silent: false, prefix: nil, color: nil, bgcolor: nil
|
31
|
+
envs = {}
|
32
|
+
%w(opts params args config env vars).each do |k|
|
33
|
+
envs["__RBCLI_#{k.upcase}"] = eval("#{k}.nil?") ? [].to_json : eval("#{k}.to_json")
|
34
|
+
end
|
35
|
+
vars.each do |k, v|
|
36
|
+
envs[k.to_s.upcase] = v
|
37
|
+
end unless vars.nil?
|
38
|
+
|
39
|
+
if inject_rbcli && !cmd.include?('lib-rbcli.sh')
|
40
|
+
sh_libpath = File.expand_path(File.join(File.dirname(__FILE__), 'lib-rbcli.sh'))
|
41
|
+
cmd = cmd.lines.insert((cmd.start_with?('#!') ? 1 : 0), "source '#{sh_libpath}'\n").join
|
42
|
+
end
|
43
|
+
|
44
|
+
output = +''
|
45
|
+
retval = nil
|
46
|
+
prefix ||= ''
|
47
|
+
Open3.popen2e(envs, cmd) do |_stdin, stdout_and_stderr, wait_threads|
|
48
|
+
until (line = stdout_and_stderr.gets).nil? do
|
49
|
+
if line.include?(' || ')
|
50
|
+
severity, text = line.split(' || ', 2)
|
51
|
+
else
|
52
|
+
severity = 'INFO'
|
53
|
+
text = line
|
54
|
+
end
|
55
|
+
output << text
|
56
|
+
Rbcli.log.add(Logger.const_get(severity.upcase.to_sym), prefix + text.chomp.colorize(color: color, background: bgcolor), 'SCRP') unless silent
|
57
|
+
Rbcli.log.add(-1, prefix + text.chomp.colorize(color: color, background: bgcolor), 'SCRP') if silent
|
58
|
+
end
|
59
|
+
retval = wait_threads.value
|
60
|
+
end
|
61
|
+
Rbcli.log.debug "Return value of script was: #{retval}", "SCRP"
|
62
|
+
capture_output ? output : retval.success?
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
##################################################################################
|
3
|
+
# Rbcli -- A framework for developing command line applications in Ruby #
|
4
|
+
# Copyright (C) 2024 Andrew Khoury <akhoury@live.com> #
|
5
|
+
##################################################################################
|
6
|
+
require 'fileutils'
|
7
|
+
|
8
|
+
module Rbcli::UserConf
|
9
|
+
end
|
10
|
+
|
11
|
+
class Rbcli::UserConf::Backend
|
12
|
+
@registered_types = {}
|
13
|
+
|
14
|
+
def self.types
|
15
|
+
{
|
16
|
+
yaml: Proc.new { |filename| filename.is_a?(String) && (filename.downcase.end_with?('.yaml') || filename.downcase.end_with?('.yml')) },
|
17
|
+
json: Proc.new { |filename| filename.is_a?(String) && filename.downcase.end_with?('.json') },
|
18
|
+
ini: Proc.new { |filename| filename.is_a?(String) && filename.downcase.end_with?('.ini') },
|
19
|
+
toml: Proc.new { |filename| filename.is_a?(String) && filename.downcase.end_with?('.toml') },
|
20
|
+
env: Proc.new { |filename| false },
|
21
|
+
null: Proc.new { |filename| true }
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.inherited(subklass)
|
26
|
+
@registered_types[subklass.name.split('::').last.sub(/Store$/, '').downcase.to_sym] = subklass
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.create filename, type: nil
|
30
|
+
type ||= self.types.map { |slug, check| [slug, check.call(filename)] }.to_h.select { |slug, match| match }.first.first
|
31
|
+
type = type.to_s.downcase.to_sym
|
32
|
+
require_relative "backends/#{type.to_s}"
|
33
|
+
@registered_types[type].new(filename, type)
|
34
|
+
end
|
35
|
+
|
36
|
+
def initialize filename, type
|
37
|
+
@path = File.expand_path(filename)
|
38
|
+
@path = File.realpath(@path) if File.symlink?(@path)
|
39
|
+
@type = type.to_s.capitalize
|
40
|
+
@loaded = false
|
41
|
+
end
|
42
|
+
|
43
|
+
attr_reader :type, :loaded
|
44
|
+
alias_method :loaded?, :loaded
|
45
|
+
|
46
|
+
# The defaults: parameter is used on some backends to know which fields to expect and parse
|
47
|
+
def load defaults: nil
|
48
|
+
begin
|
49
|
+
text = File.read(@path)
|
50
|
+
rescue Errno::ENOENT => _
|
51
|
+
Rbcli.log.debug "Attempted to load #{@type} config file but did not find it at '#{@path}'", "CONF"
|
52
|
+
else
|
53
|
+
Rbcli.log.debug "Loaded #{@type} config file at '#{@path}'", "CONF"
|
54
|
+
self.parse(text)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def save hash
|
59
|
+
Rbcli.log.debug "Saving #{@type} config file at '#{@path}'", "CONF"
|
60
|
+
begin
|
61
|
+
File.write(@path, self.unparse(hash))
|
62
|
+
rescue Errno => err
|
63
|
+
Rbcli.log.error "Could not save config to file at '#{@path}'", "CONF"
|
64
|
+
Rbcli.log.error "Error: #{err.message}", "CONF"
|
65
|
+
false
|
66
|
+
else
|
67
|
+
hash
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def savable?
|
72
|
+
File.writable?(File.exist?(@path) ? @path : File.dirname(@path))
|
73
|
+
end
|
74
|
+
|
75
|
+
def exist?
|
76
|
+
File.exist?(@path)
|
77
|
+
end
|
78
|
+
|
79
|
+
def annotate! defaults
|
80
|
+
begin
|
81
|
+
text = File.read(@path)
|
82
|
+
rescue Errno::ENOENT => _
|
83
|
+
Rbcli.log.debug "Attempted to annotate #{@type} config file but did not find it at '#{@path}'", "CONF"
|
84
|
+
return nil
|
85
|
+
end
|
86
|
+
Rbcli.log.debug "Annotating #{@type} config file at '#{@path}'", "CONF"
|
87
|
+
|
88
|
+
text = self.inject_banner(text, defaults[:helptext])
|
89
|
+
File.write(@path, text)
|
90
|
+
|
91
|
+
begin
|
92
|
+
File.write(@path, text)
|
93
|
+
Rbcli.log.debug "Saved #{@type} annotations at '#{@path}'", "CONF"
|
94
|
+
rescue Errno => err
|
95
|
+
Rbcli.log.error "Could not save annotations to '#{@path}'", "CONF"
|
96
|
+
Rbcli.log.error "Error: #{err.message}", "CONF"
|
97
|
+
return nil
|
98
|
+
else
|
99
|
+
return true
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
##################################################################################
|
3
|
+
# Rbcli -- A framework for developing command line applications in Ruby #
|
4
|
+
# Copyright (C) 2024 Andrew Khoury <akhoury@live.com> #
|
5
|
+
##################################################################################
|
6
|
+
require_relative 'helpers/deep_assign'
|
7
|
+
|
8
|
+
class Rbcli::UserConf::Env < Rbcli::UserConf::Backend
|
9
|
+
include Rbcli::UserConf::Helpers::DeepAssign
|
10
|
+
|
11
|
+
def initialize prefix, type
|
12
|
+
@prefix = prefix
|
13
|
+
@type = type.to_s.capitalize
|
14
|
+
@loaded = false
|
15
|
+
end
|
16
|
+
|
17
|
+
def load defaults: nil
|
18
|
+
vars = ENV.select { |k, v| k.match(/^#{@prefix}_.+/i) && !k.match(/^_/) }
|
19
|
+
if @prefix.nil? && !defaults.nil? && !defaults.empty?
|
20
|
+
lowercase_default_keys = defaults.keys.map { |k| k.downcase.to_sym }
|
21
|
+
vars = vars.merge ENV.select { |k, v| lowercase_default_keys.include?(k.downcase.to_sym) }
|
22
|
+
end
|
23
|
+
vars = vars.map { |k, v| [k.split('_', 2).last.downcase, v] }.to_h
|
24
|
+
final_vars = Hash.new
|
25
|
+
vars.each do |key, value|
|
26
|
+
deep_assign(final_vars, key.split('_').map { |k| k.to_sym }, translate_value(value))
|
27
|
+
end
|
28
|
+
if @prefix.nil? && !defaults.nil? && !defaults.empty?
|
29
|
+
lowercase_default_keys = defaults.keys.map { |k| k.downcase.to_sym }
|
30
|
+
vars = ENV.select { |k, v| lowercase_default_keys.include?(k.downcase.to_sym) }.map { |k, v| [k.downcase.to_sym, v] }.to_h
|
31
|
+
end
|
32
|
+
@loaded = true
|
33
|
+
final_vars
|
34
|
+
end
|
35
|
+
|
36
|
+
def save hash, path = []
|
37
|
+
hash.each do |key, value|
|
38
|
+
if !value.is_a? Hash
|
39
|
+
ENV[([@prefix] + path + [key.upcase]).reject(&:nil?).join('_')] = (value.is_a?(Symbol) ? ':' : '') + value.to_s
|
40
|
+
else
|
41
|
+
save value, path + [key.upcase]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def parse_defaults defaults
|
47
|
+
final_vars = Hash.new
|
48
|
+
defaults.each do |key, value|
|
49
|
+
key_parts = key.to_s.split('_').map { |k| k.downcase.to_sym }
|
50
|
+
key_parts.delete_at(0) if key_parts.first == @prefix.to_s.downcase.to_sym
|
51
|
+
deep_assign(final_vars, key_parts, value.is_a?(String) ? translate_value(value) : value)
|
52
|
+
end
|
53
|
+
final_vars
|
54
|
+
end
|
55
|
+
|
56
|
+
def savable?
|
57
|
+
true
|
58
|
+
end
|
59
|
+
|
60
|
+
def exist?
|
61
|
+
true
|
62
|
+
end
|
63
|
+
|
64
|
+
def annotate! _defaults = nil
|
65
|
+
true
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
##################################################################################
|
3
|
+
# Rbcli -- A framework for developing command line applications in Ruby #
|
4
|
+
# Copyright (C) 2024 Andrew Khoury <akhoury@live.com> #
|
5
|
+
##################################################################################
|
6
|
+
require 'json'
|
7
|
+
module Rbcli::UserConf::Helpers
|
8
|
+
module DeepAssign
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def deep_assign hash, sections_arr, value
|
13
|
+
if sections_arr.length == 1
|
14
|
+
hash[sections_arr.first] = value
|
15
|
+
else
|
16
|
+
hash[sections_arr.first] ||= Hash.new
|
17
|
+
deep_assign(hash[sections_arr.first], sections_arr[1..-1], value)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def translate_value value
|
22
|
+
if value.nil?
|
23
|
+
nil
|
24
|
+
elsif value.start_with?(':')
|
25
|
+
value[1..-1].to_sym
|
26
|
+
elsif value.downcase == 'true'
|
27
|
+
true
|
28
|
+
elsif value.downcase == 'false'
|
29
|
+
false
|
30
|
+
elsif value.to_i.to_s == value
|
31
|
+
value.to_i
|
32
|
+
elsif value.start_with?('[') && value.end_with?(']') # array
|
33
|
+
begin
|
34
|
+
JSON.parse(value)
|
35
|
+
rescue JSON::ParserError => _err
|
36
|
+
value
|
37
|
+
end
|
38
|
+
else
|
39
|
+
begin
|
40
|
+
Float value
|
41
|
+
rescue => _err
|
42
|
+
value
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
##################################################################################
|
3
|
+
# Rbcli -- A framework for developing command line applications in Ruby #
|
4
|
+
# Copyright (C) 2024 Andrew Khoury <akhoury@live.com> #
|
5
|
+
##################################################################################
|
6
|
+
require_relative 'helpers/deep_assign'
|
7
|
+
|
8
|
+
class Rbcli::UserConf::Ini < Rbcli::UserConf::Backend
|
9
|
+
include Rbcli::UserConf::Helpers::DeepAssign
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def parse str
|
14
|
+
ini = Hash.new
|
15
|
+
nest = []
|
16
|
+
str.lines.each_with_index do |line, i|
|
17
|
+
line = line.split(';').first.strip
|
18
|
+
next if line.nil? || line.empty?
|
19
|
+
if line =~ /^\[(.*)\]$/
|
20
|
+
nest = $1.split('.')
|
21
|
+
elsif line.include?('=')
|
22
|
+
key, value = line.split('=').map { |part| part.strip }
|
23
|
+
deep_assign(ini, nest + [key], translate_value(value))
|
24
|
+
else
|
25
|
+
Rbcli.log.warn "Invalid #{@type} syntax found on line #{i} at '#{@path}'. Offending syntax: #{line}", "CONF"
|
26
|
+
return Hash.new
|
27
|
+
end
|
28
|
+
end
|
29
|
+
@loaded = true
|
30
|
+
ini
|
31
|
+
end
|
32
|
+
|
33
|
+
def unparse hash
|
34
|
+
ini = []
|
35
|
+
parse_hash = Proc.new do |hsh, keys = []|
|
36
|
+
hsh.each do |key, val|
|
37
|
+
if !val.is_a?(Hash)
|
38
|
+
val = ":#{val.to_s}" if val.is_a?(Symbol)
|
39
|
+
ini << "#{key.to_s.strip} = #{val.to_s.strip}"
|
40
|
+
else
|
41
|
+
ini << '[' + (keys + [key]).join('.') + ']'
|
42
|
+
parse_hash.call(val, keys + [key])
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
parse_hash.call(hash)
|
47
|
+
ini.join("\n")
|
48
|
+
end
|
49
|
+
|
50
|
+
def inject_banner text, banner
|
51
|
+
banner.lines.map { |line| "; #{line.chomp}" }.join("\n") + "\n" + text
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
##################################################################################
|
3
|
+
# Rbcli -- A framework for developing command line applications in Ruby #
|
4
|
+
# Copyright (C) 2024 Andrew Khoury <akhoury@live.com> #
|
5
|
+
##################################################################################
|
6
|
+
require 'json'
|
7
|
+
|
8
|
+
class Rbcli::UserConf::Json < Rbcli::UserConf::Backend
|
9
|
+
private
|
10
|
+
|
11
|
+
def parse str
|
12
|
+
begin
|
13
|
+
parsed_str = JSON.parse(str)
|
14
|
+
rescue JSON::JSONError => e
|
15
|
+
Rbcli.log.warn "Invalid #{@type} syntax found at '#{@path}'", "CONF"
|
16
|
+
Rbcli.log.warn e.message, "CONF"
|
17
|
+
Hash.new
|
18
|
+
else
|
19
|
+
@loaded = true
|
20
|
+
parsed_str
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def unparse hash
|
25
|
+
JSON.pretty_generate(hash)
|
26
|
+
end
|
27
|
+
|
28
|
+
def inject_banner text, _banner
|
29
|
+
text
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
##################################################################################
|
3
|
+
# Rbcli -- A framework for developing command line applications in Ruby #
|
4
|
+
# Copyright (C) 2024 Andrew Khoury <akhoury@live.com> #
|
5
|
+
##################################################################################
|
6
|
+
class Rbcli::UserConf::Null < Rbcli::UserConf::Backend
|
7
|
+
def initialize filename, type
|
8
|
+
@type = type.to_s.upcase
|
9
|
+
@loaded = false
|
10
|
+
end
|
11
|
+
|
12
|
+
def load defaults: nil
|
13
|
+
@loaded = true
|
14
|
+
{}
|
15
|
+
end
|
16
|
+
|
17
|
+
def save hash
|
18
|
+
hash
|
19
|
+
end
|
20
|
+
|
21
|
+
def savable?
|
22
|
+
true
|
23
|
+
end
|
24
|
+
|
25
|
+
def exist?
|
26
|
+
true
|
27
|
+
end
|
28
|
+
|
29
|
+
def annotate! _defaults = nil
|
30
|
+
true
|
31
|
+
end
|
32
|
+
end
|