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