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