rbcli 0.3.3 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.md +9 -0
- data/LICENSE.txt +5 -670
- data/README.md +64 -160
- data/VERSION +1 -0
- data/exe/rbcli +181 -242
- data/lib/rbcli/components/commands/command.rb +120 -0
- data/lib/rbcli/components/commands/command.rb.erb +55 -0
- data/lib/rbcli/components/commands/command_old.rb +105 -0
- data/lib/rbcli/components/commands/script.rb.erb +43 -0
- data/{lib-sh → lib/rbcli/components/commands/scriptwrapper}/lib-rbcli.sh +29 -34
- data/lib/rbcli/components/commands/scriptwrapper/scriptwrapper.rb +64 -0
- data/lib/rbcli/components/config/backend.rb +102 -0
- data/lib/rbcli/components/config/backends/env.rb +67 -0
- data/lib/rbcli/components/config/backends/helpers/deep_assign.rb +47 -0
- data/lib/rbcli/components/config/backends/ini.rb +53 -0
- data/lib/rbcli/components/config/backends/json.rb +32 -0
- data/lib/rbcli/components/config/backends/null.rb +32 -0
- data/lib/rbcli/components/config/backends/toml.rb +38 -0
- data/lib/rbcli/components/config/backends/yaml.rb +31 -0
- data/lib/rbcli/components/config/component.rb +33 -0
- data/lib/rbcli/components/config/config.rb +165 -0
- data/lib/rbcli/components/config/config_of_death.rb +12 -0
- data/lib/rbcli/components/config/template.rb.erb +36 -0
- data/lib/rbcli/components/core/configurate.rb +63 -0
- data/lib/rbcli/components/core/engine.rb +30 -0
- data/lib/rbcli/components/core/warehouse.rb +18 -0
- data/lib/rbcli/components/envvars/component.rb +20 -0
- data/lib/rbcli/components/envvars/template.rb.erb +24 -0
- data/lib/rbcli/components/hooks/component.rb +36 -0
- data/lib/rbcli/components/hooks/template.rb.erb +20 -0
- data/lib/rbcli/components/logger/component.rb +32 -0
- data/lib/rbcli/components/logger/logger.rb +155 -0
- data/lib/rbcli/components/logger/lolcat/lol.rb +71 -0
- data/lib/rbcli/components/logger/template.rb.erb +40 -0
- data/lib/rbcli/components/parser/component.rb +33 -0
- data/lib/rbcli/{util → components/parser/optimist}/optimist.rb +134 -48
- data/lib/rbcli/components/parser/parser.rb +178 -0
- data/lib/rbcli/components/parser/template.rb.erb +35 -0
- data/lib/rbcli/components/updatechecker/common/common.rb +52 -0
- data/lib/rbcli/components/updatechecker/component.rb +42 -0
- data/lib/rbcli/components/updatechecker/gem_checker.rb +40 -0
- data/lib/rbcli/components/updatechecker/github_checker.rb +46 -0
- data/lib/rbcli/components/updatechecker/template.rb.erb +14 -0
- data/lib/rbcli/util/deprecation_warning.rb +41 -55
- data/lib/rbcli/util/errors.rb +12 -0
- data/lib/rbcli/util/exit.rb +12 -0
- data/lib/rbcli/util/hash_deep_symbolize.rb +26 -41
- data/lib/rbcli/util/string_compression.rb +10 -0
- data/lib/rbcli/version.rb +5 -20
- data/lib/rbcli-tool/helpers.rb +58 -0
- data/lib/rbcli-tool/skeletons/gem.rb.erb +17 -0
- data/lib/rbcli-tool/skeletons/portable.rb.erb +48 -0
- data/lib/rbcli.rb +19 -50
- data/sig/rbcli.rbs +9 -0
- metadata +125 -496
- data/.gitignore +0 -60
- data/.rakeTasks +0 -7
- data/.rbenv-gemsets +0 -1
- data/.travis.yml +0 -5
- data/CHANGELOG.md +0 -193
- data/CODE_OF_CONDUCT.md +0 -74
- data/Gemfile +0 -6
- data/Gemfile.lock +0 -92
- data/Rakefile +0 -10
- data/bin/console +0 -33
- data/bin/setup +0 -28
- data/docs/404.html +0 -59
- data/docs/advanced/automatic_updates/index.html +0 -1174
- data/docs/advanced/command_types/index.html +0 -1262
- data/docs/advanced/distributed_state_locking/index.html +0 -1176
- data/docs/advanced/hooks/index.html +0 -1192
- data/docs/advanced/index.html +0 -1140
- data/docs/advanced/index.xml +0 -75
- data/docs/advanced/interactive_commands/index.html +0 -1177
- data/docs/advanced/logging/index.html +0 -1184
- data/docs/advanced/remote_execution/index.html +0 -1190
- data/docs/advanced/state_storage/index.html +0 -1281
- data/docs/advanced/user_config_files/index.html +0 -1209
- data/docs/categories/index.html +0 -1146
- data/docs/categories/index.xml +0 -11
- data/docs/css/atom-one-dark-reasonable.css +0 -77
- data/docs/css/auto-complete.css +0 -47
- data/docs/css/featherlight.min.css +0 -8
- data/docs/css/fontawesome-all.min.css +0 -1
- data/docs/css/hugo-theme.css +0 -254
- data/docs/css/hybrid.css +0 -102
- data/docs/css/nucleus.css +0 -615
- data/docs/css/perfect-scrollbar.min.css +0 -2
- data/docs/css/tags.css +0 -49
- data/docs/css/theme-blue.css +0 -111
- data/docs/css/theme-green.css +0 -111
- data/docs/css/theme-red.css +0 -111
- data/docs/css/theme.css +0 -1136
- data/docs/development/changelog/index.html +0 -1420
- data/docs/development/code_of_conduct/index.html +0 -1222
- data/docs/development/contributing/index.html +0 -1201
- data/docs/development/index.html +0 -1140
- data/docs/development/index.xml +0 -40
- data/docs/development/license/index.html +0 -1165
- data/docs/fonts/Inconsolata.eot +0 -0
- data/docs/fonts/Inconsolata.svg +0 -1
- data/docs/fonts/Inconsolata.ttf +0 -0
- data/docs/fonts/Inconsolata.woff +0 -0
- data/docs/fonts/Novecentosanswide-Normal-webfont.eot +0 -0
- data/docs/fonts/Novecentosanswide-Normal-webfont.svg +0 -1
- data/docs/fonts/Novecentosanswide-Normal-webfont.ttf +0 -0
- data/docs/fonts/Novecentosanswide-Normal-webfont.woff +0 -0
- data/docs/fonts/Novecentosanswide-Normal-webfont.woff2 +0 -0
- data/docs/fonts/Novecentosanswide-UltraLight-webfont.eot +0 -0
- data/docs/fonts/Novecentosanswide-UltraLight-webfont.svg +0 -1
- data/docs/fonts/Novecentosanswide-UltraLight-webfont.ttf +0 -0
- data/docs/fonts/Novecentosanswide-UltraLight-webfont.woff +0 -0
- data/docs/fonts/Novecentosanswide-UltraLight-webfont.woff2 +0 -0
- data/docs/fonts/Work_Sans_200.eot +0 -0
- data/docs/fonts/Work_Sans_200.svg +0 -1
- data/docs/fonts/Work_Sans_200.ttf +0 -0
- data/docs/fonts/Work_Sans_200.woff +0 -0
- data/docs/fonts/Work_Sans_200.woff2 +0 -0
- data/docs/fonts/Work_Sans_300.eot +0 -0
- data/docs/fonts/Work_Sans_300.svg +0 -1
- data/docs/fonts/Work_Sans_300.ttf +0 -0
- data/docs/fonts/Work_Sans_300.woff +0 -0
- data/docs/fonts/Work_Sans_300.woff2 +0 -0
- data/docs/fonts/Work_Sans_500.eot +0 -0
- data/docs/fonts/Work_Sans_500.svg +0 -1
- data/docs/fonts/Work_Sans_500.ttf +0 -0
- data/docs/fonts/Work_Sans_500.woff +0 -0
- data/docs/fonts/Work_Sans_500.woff2 +0 -0
- data/docs/images/clippy.svg +0 -1
- data/docs/images/favicon.png +0 -0
- data/docs/images/gopher-404.jpg +0 -0
- data/docs/imported/changelog/index.html +0 -1449
- data/docs/imported/index.html +0 -1191
- data/docs/imported/index.xml +0 -23
- data/docs/index.html +0 -1138
- data/docs/index.json +0 -183
- data/docs/index.xml +0 -138
- data/docs/js/auto-complete.js +0 -3
- data/docs/js/clipboard.min.js +0 -7
- data/docs/js/featherlight.min.js +0 -9
- data/docs/js/highlight.pack.js +0 -6
- data/docs/js/html5shiv-printshiv.min.js +0 -4
- data/docs/js/hugo-learn.js +0 -94
- data/docs/js/jquery-3.3.1.min.js +0 -2
- data/docs/js/jquery.sticky.js +0 -288
- data/docs/js/learn.js +0 -459
- data/docs/js/lunr.min.js +0 -6
- data/docs/js/modernizr.custom-3.6.0.js +0 -3
- data/docs/js/perfect-scrollbar.jquery.min.js +0 -2
- data/docs/js/perfect-scrollbar.min.js +0 -2
- data/docs/js/search.js +0 -93
- data/docs/mermaid/mermaid.css +0 -277
- data/docs/mermaid/mermaid.dark.css +0 -278
- data/docs/mermaid/mermaid.forest.css +0 -356
- data/docs/mermaid/mermaid.js +0 -8
- data/docs/quick_reference/index.html +0 -1246
- data/docs/quick_reference/index.xml +0 -12
- data/docs/sitemap.xml +0 -81
- data/docs/tags/index.html +0 -1146
- data/docs/tags/index.xml +0 -11
- data/docs/tutorial/10-getting_started/index.html +0 -1174
- data/docs/tutorial/20-project_layout/index.html +0 -1299
- data/docs/tutorial/30-your_first_command/index.html +0 -1263
- data/docs/tutorial/40-options_parameters_and_arguments/index.html +0 -1384
- data/docs/tutorial/50-publishing/index.html +0 -1187
- data/docs/tutorial/index.html +0 -1140
- data/docs/tutorial/index.xml +0 -47
- data/docs/webfonts/fa-brands-400.eot +0 -0
- data/docs/webfonts/fa-brands-400.svg +0 -1
- data/docs/webfonts/fa-brands-400.ttf +0 -0
- data/docs/webfonts/fa-brands-400.woff +0 -0
- data/docs/webfonts/fa-brands-400.woff2 +0 -0
- data/docs/webfonts/fa-regular-400.eot +0 -0
- data/docs/webfonts/fa-regular-400.svg +0 -1
- data/docs/webfonts/fa-regular-400.ttf +0 -0
- data/docs/webfonts/fa-regular-400.woff +0 -0
- data/docs/webfonts/fa-regular-400.woff2 +0 -0
- data/docs/webfonts/fa-solid-900.eot +0 -0
- data/docs/webfonts/fa-solid-900.svg +0 -1
- data/docs/webfonts/fa-solid-900.ttf +0 -0
- data/docs/webfonts/fa-solid-900.woff +0 -0
- data/docs/webfonts/fa-solid-900.woff2 +0 -0
- data/docs/whoami/index.html +0 -1155
- data/docs/whoami/index.xml +0 -12
- data/docs-src/archetypes/default.md +0 -6
- data/docs-src/config.toml +0 -37
- data/docs-src/content/_index.md +0 -40
- data/docs-src/content/advanced/_index.md +0 -11
- data/docs-src/content/advanced/automatic_updates.md +0 -46
- data/docs-src/content/advanced/command_types.md +0 -148
- data/docs-src/content/advanced/distributed_state_locking.md +0 -37
- data/docs-src/content/advanced/hooks.md +0 -69
- data/docs-src/content/advanced/interactive_commands.md +0 -41
- data/docs-src/content/advanced/logging.md +0 -39
- data/docs-src/content/advanced/remote_execution.md +0 -60
- data/docs-src/content/advanced/state_storage.md +0 -120
- data/docs-src/content/advanced/user_config_files.md +0 -51
- data/docs-src/content/development/_index.md +0 -11
- data/docs-src/content/development/changelog.md +0 -199
- data/docs-src/content/development/code_of_conduct.md +0 -81
- data/docs-src/content/development/contributing.md +0 -88
- data/docs-src/content/development/license.md +0 -17
- data/docs-src/content/quick_reference/_index.md +0 -180
- data/docs-src/content/tutorial/10-getting_started.md +0 -47
- data/docs-src/content/tutorial/20-project_layout.md +0 -123
- data/docs-src/content/tutorial/30-your_first_command.md +0 -132
- data/docs-src/content/tutorial/40-options_parameters_and_arguments.md +0 -282
- data/docs-src/content/tutorial/50-publishing.md +0 -53
- data/docs-src/content/tutorial/_index.md +0 -11
- data/docs-src/content/whoami/_index.md +0 -34
- data/docs-src/layouts/partials/logo.html +0 -3
- data/docs-src/makesite.sh +0 -40
- data/docs-src/mkdocs-archived.tar.gz +0 -0
- data/docs-src/runsite.sh +0 -8
- data/docs-src/themes/hugo-theme-learn/.editorconfig +0 -16
- data/docs-src/themes/hugo-theme-learn/.gitignore +0 -3
- data/docs-src/themes/hugo-theme-learn/.grenrc.yml +0 -25
- data/docs-src/themes/hugo-theme-learn/CHANGELOG.md +0 -226
- data/docs-src/themes/hugo-theme-learn/LICENSE.md +0 -22
- data/docs-src/themes/hugo-theme-learn/README.md +0 -97
- data/docs-src/themes/hugo-theme-learn/archetypes/chapter.md +0 -13
- data/docs-src/themes/hugo-theme-learn/archetypes/default.md +0 -7
- data/docs-src/themes/hugo-theme-learn/exampleSite/LICENSE.md +0 -20
- data/docs-src/themes/hugo-theme-learn/exampleSite/config.toml +0 -102
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/_index.en.md +0 -41
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/_index.fr.md +0 -43
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/_index.en.md +0 -12
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/_index.fr.md +0 -12
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/_index.zh.md +0 -12
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/configuration/_index.en.md +0 -60
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/configuration/_index.fr.md +0 -56
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/installation/_index.en.md +0 -102
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/installation/_index.fr.md +0 -100
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/installation/images/chapter.png +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/requirements/_index.en.md +0 -11
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/requirements/_index.fr.md +0 -11
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/requirements/images/magic.gif +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/_index.en.md +0 -194
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/_index.fr.md +0 -194
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/images/blue-variant.png +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/images/green-variant.png +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/images/red-variant.png +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/_index.en.md +0 -12
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/_index.fr.md +0 -12
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/archetypes.en.md +0 -57
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/archetypes.fr.md +0 -57
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/i18n/_index.en.md +0 -78
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/i18n/_index.fr.md +0 -78
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/i18n/images/i18n-menu.gif +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/icons.en.md +0 -41
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/markdown.en.md +0 -692
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/markdown.fr.md +0 -666
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/menushortcuts.en.md +0 -109
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/menushortcuts.fr.md +0 -109
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/pages/_index.en.md +0 -166
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/pages/_index.fr.md +0 -146
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/pages/images/frontmatter-icon.png +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/pages/images/pages-chapter.png +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/pages/images/pages-default.png +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/syntaxhighlight.en.md +0 -89
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/tags.en.md +0 -39
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/cont/tags.fr.md +0 -40
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/credits.en.md +0 -28
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/credits.fr.md +0 -28
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/_index.en.md +0 -16
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/_index.fr.md +0 -16
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/BachGavotteShort.mp3 +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/Carroll_AliceAuPaysDesMerveilles.pdf +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/adivorciarsetoca00cape.pdf +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/hugo.png +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/movieselectricsheep-flock-244-32500-2.mp4 +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.md +0 -85
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/BachGavotteShort.mp3 +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/Carroll_AliceAuPaysDesMerveilles.pdf +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/adivorciarsetoca00cape.pdf +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/hugo.png +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/movieselectricsheep-flock-244-32500-2.mp4 +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.md +0 -85
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/button.en.md +0 -16
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/button.fr.md +0 -16
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/_index.en.md +0 -45
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/_index.fr.md +0 -45
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/_index.en.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/_index.fr.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.en.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.fr.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.en.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.fr.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.en.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.fr.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.en.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.fr.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/_index.en.md +0 -11
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/_index.fr.md +0 -11
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/test3.en.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/test3.fr.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-3/_index.en.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-3/_index.fr.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-4/_index.en.md +0 -7
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-4/_index.fr.md +0 -7
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/test.en.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/test.fr.md +0 -6
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/expand.en.md +0 -45
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/expand.fr.md +0 -45
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/mermaid.en.md +0 -283
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/mermaid.fr.md +0 -283
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/notice.en.md +0 -62
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/notice.fr.md +0 -62
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/siteparam.en.md +0 -23
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/shortcodes/siteparam.fr.md +0 -23
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/showcase.en.md +0 -13
- data/docs-src/themes/hugo-theme-learn/exampleSite/content/showcase.fr.md +0 -14
- data/docs-src/themes/hugo-theme-learn/exampleSite/layouts/partials/custom-footer.html +0 -10
- data/docs-src/themes/hugo-theme-learn/exampleSite/layouts/partials/logo.html +0 -39
- data/docs-src/themes/hugo-theme-learn/exampleSite/layouts/partials/menu-footer.html +0 -14
- data/docs-src/themes/hugo-theme-learn/exampleSite/layouts/shortcodes/ghcontributors.html +0 -31
- data/docs-src/themes/hugo-theme-learn/exampleSite/static/css/theme-mine.css +0 -104
- data/docs-src/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.eot +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.svg +0 -1
- data/docs-src/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.ttf +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.woff +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.woff2 +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/static/images/showcase/inteliver_docs.png +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/static/images/showcase/tat.png +0 -0
- data/docs-src/themes/hugo-theme-learn/exampleSite/static/images/showcase/tshark_dev.png +0 -0
- data/docs-src/themes/hugo-theme-learn/i18n/ar.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/de.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/en.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/es.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/fr.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/hi.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/id.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/ja.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/nl.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/pt.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/ru.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/tr.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/i18n/zh-cn.toml +0 -26
- data/docs-src/themes/hugo-theme-learn/images/screenshot.png +0 -0
- data/docs-src/themes/hugo-theme-learn/images/tn.png +0 -0
- data/docs-src/themes/hugo-theme-learn/layouts/404.html +0 -56
- data/docs-src/themes/hugo-theme-learn/layouts/_default/list.html +0 -22
- data/docs-src/themes/hugo-theme-learn/layouts/_default/single.html +0 -12
- data/docs-src/themes/hugo-theme-learn/layouts/index.html +0 -31
- data/docs-src/themes/hugo-theme-learn/layouts/index.json +0 -12
- data/docs-src/themes/hugo-theme-learn/layouts/partials/custom-comments.html +0 -3
- data/docs-src/themes/hugo-theme-learn/layouts/partials/custom-footer.html +0 -5
- data/docs-src/themes/hugo-theme-learn/layouts/partials/custom-header.html +0 -5
- data/docs-src/themes/hugo-theme-learn/layouts/partials/favicon.html +0 -1
- data/docs-src/themes/hugo-theme-learn/layouts/partials/footer.html +0 -77
- data/docs-src/themes/hugo-theme-learn/layouts/partials/header.html +0 -111
- data/docs-src/themes/hugo-theme-learn/layouts/partials/logo.html +0 -19
- data/docs-src/themes/hugo-theme-learn/layouts/partials/menu-footer.html +0 -1
- data/docs-src/themes/hugo-theme-learn/layouts/partials/menu.html +0 -151
- data/docs-src/themes/hugo-theme-learn/layouts/partials/meta.html +0 -2
- data/docs-src/themes/hugo-theme-learn/layouts/partials/search.html +0 -16
- data/docs-src/themes/hugo-theme-learn/layouts/partials/tags.html +0 -7
- data/docs-src/themes/hugo-theme-learn/layouts/partials/toc.html +0 -5
- data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/attachments.html +0 -36
- data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/button.html +0 -14
- data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/children.html +0 -101
- data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/expand.html +0 -17
- data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/mermaid.html +0 -2
- data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/notice.html +0 -2
- data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/ref.html +0 -14
- data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/relref.html +0 -14
- data/docs-src/themes/hugo-theme-learn/layouts/shortcodes/siteparam.html +0 -7
- data/docs-src/themes/hugo-theme-learn/netlify.toml +0 -23
- data/docs-src/themes/hugo-theme-learn/static/css/atom-one-dark-reasonable.css +0 -77
- data/docs-src/themes/hugo-theme-learn/static/css/auto-complete.css +0 -47
- data/docs-src/themes/hugo-theme-learn/static/css/featherlight.min.css +0 -8
- data/docs-src/themes/hugo-theme-learn/static/css/fontawesome-all.min.css +0 -1
- data/docs-src/themes/hugo-theme-learn/static/css/hugo-theme.css +0 -254
- data/docs-src/themes/hugo-theme-learn/static/css/hybrid.css +0 -102
- data/docs-src/themes/hugo-theme-learn/static/css/nucleus.css +0 -615
- data/docs-src/themes/hugo-theme-learn/static/css/perfect-scrollbar.min.css +0 -2
- data/docs-src/themes/hugo-theme-learn/static/css/tags.css +0 -49
- data/docs-src/themes/hugo-theme-learn/static/css/theme-blue.css +0 -111
- data/docs-src/themes/hugo-theme-learn/static/css/theme-green.css +0 -111
- data/docs-src/themes/hugo-theme-learn/static/css/theme-red.css +0 -111
- data/docs-src/themes/hugo-theme-learn/static/css/theme.css +0 -1136
- data/docs-src/themes/hugo-theme-learn/static/fonts/Inconsolata.eot +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Inconsolata.svg +0 -1
- data/docs-src/themes/hugo-theme-learn/static/fonts/Inconsolata.ttf +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Inconsolata.woff +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.eot +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.svg +0 -1
- data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.ttf +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.woff +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.woff2 +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.eot +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.svg +0 -1
- data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.ttf +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.woff +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.woff2 +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_200.eot +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_200.svg +0 -1
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_200.ttf +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_200.woff +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_200.woff2 +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_300.eot +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_300.svg +0 -1
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_300.ttf +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_300.woff +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_300.woff2 +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_500.eot +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_500.svg +0 -1
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_500.ttf +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_500.woff +0 -0
- data/docs-src/themes/hugo-theme-learn/static/fonts/Work_Sans_500.woff2 +0 -0
- data/docs-src/themes/hugo-theme-learn/static/images/clippy.svg +0 -1
- data/docs-src/themes/hugo-theme-learn/static/images/favicon.png +0 -0
- data/docs-src/themes/hugo-theme-learn/static/images/gopher-404.jpg +0 -0
- data/docs-src/themes/hugo-theme-learn/static/js/auto-complete.js +0 -3
- data/docs-src/themes/hugo-theme-learn/static/js/clipboard.min.js +0 -7
- data/docs-src/themes/hugo-theme-learn/static/js/featherlight.min.js +0 -9
- data/docs-src/themes/hugo-theme-learn/static/js/highlight.pack.js +0 -6
- data/docs-src/themes/hugo-theme-learn/static/js/hugo-learn.js +0 -94
- data/docs-src/themes/hugo-theme-learn/static/js/jquery-3.3.1.min.js +0 -2
- data/docs-src/themes/hugo-theme-learn/static/js/jquery.sticky.js +0 -288
- data/docs-src/themes/hugo-theme-learn/static/js/learn.js +0 -459
- data/docs-src/themes/hugo-theme-learn/static/js/lunr.min.js +0 -6
- data/docs-src/themes/hugo-theme-learn/static/js/modernizr.custom-3.6.0.js +0 -3
- data/docs-src/themes/hugo-theme-learn/static/js/perfect-scrollbar.jquery.min.js +0 -2
- data/docs-src/themes/hugo-theme-learn/static/js/perfect-scrollbar.min.js +0 -2
- data/docs-src/themes/hugo-theme-learn/static/js/search.js +0 -93
- data/docs-src/themes/hugo-theme-learn/static/mermaid/mermaid.css +0 -277
- data/docs-src/themes/hugo-theme-learn/static/mermaid/mermaid.dark.css +0 -278
- data/docs-src/themes/hugo-theme-learn/static/mermaid/mermaid.forest.css +0 -356
- data/docs-src/themes/hugo-theme-learn/static/mermaid/mermaid.js +0 -8
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-brands-400.eot +0 -0
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-brands-400.svg +0 -1
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-brands-400.ttf +0 -0
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-brands-400.woff +0 -0
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-brands-400.woff2 +0 -0
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-regular-400.eot +0 -0
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-regular-400.svg +0 -1
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-regular-400.ttf +0 -0
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-regular-400.woff +0 -0
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-regular-400.woff2 +0 -0
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-solid-900.eot +0 -0
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-solid-900.svg +0 -1
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-solid-900.ttf +0 -0
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-solid-900.woff +0 -0
- data/docs-src/themes/hugo-theme-learn/static/webfonts/fa-solid-900.woff2 +0 -0
- data/docs-src/themes/hugo-theme-learn/theme.toml +0 -21
- data/docs-src/themes/hugo-theme-learn/wercker.yml +0 -16
- data/lib/rbcli/configuration/configurate.rb +0 -85
- data/lib/rbcli/configuration/configurate_blocks/hooks.rb +0 -52
- data/lib/rbcli/configuration/configurate_blocks/me.rb +0 -122
- data/lib/rbcli/configuration/configurate_blocks/storage.rb +0 -50
- data/lib/rbcli/engine/command.rb +0 -251
- data/lib/rbcli/engine/load_project.rb +0 -45
- data/lib/rbcli/engine/parser.rb +0 -116
- data/lib/rbcli/features/autoupdate/common/autoupdate.rb +0 -50
- data/lib/rbcli/features/autoupdate/gem_updater.rb +0 -62
- data/lib/rbcli/features/autoupdate/github_updater.rb +0 -76
- data/lib/rbcli/features/logging.rb +0 -98
- data/lib/rbcli/features/remote_exec.rb +0 -187
- data/lib/rbcli/features/scriptwrapper.rb +0 -75
- data/lib/rbcli/features/userconfig.rb +0 -163
- data/lib/rbcli/state_storage/common/state_storage.rb +0 -138
- data/lib/rbcli/state_storage/localstate.rb +0 -77
- data/lib/rbcli/state_storage/placeholders.rb +0 -29
- data/lib/rbcli/state_storage/remote_state_connectors/dynamodb.rb +0 -272
- data/lib/rbcli/state_storage/remotestate_dynamodb.rb +0 -115
- data/lib/rbcli/util/msg.rb +0 -55
- data/lib/rbcli/util/string_colorize.rb +0 -45
- data/lib/rbcli-tool/generators.rb +0 -105
- data/lib/rbcli-tool/mdless_fix.rb +0 -406
- data/lib/rbcli-tool/project.rb +0 -120
- data/lib/rbcli-tool/util.rb +0 -70
- data/lib/rbcli-tool.rb +0 -37
- data/rbcli.gemspec +0 -73
- data/skeletons/micro/executable +0 -132
- data/skeletons/mini/executable +0 -247
- data/skeletons/project/.gitignore +0 -11
- data/skeletons/project/.rakeTasks +0 -7
- data/skeletons/project/.rbcli +0 -0
- data/skeletons/project/.rspec +0 -3
- data/skeletons/project/CODE_OF_CONDUCT.md +0 -74
- data/skeletons/project/Gemfile +0 -6
- data/skeletons/project/README.md +0 -46
- data/skeletons/project/Rakefile +0 -6
- data/skeletons/project/application/commands/command.erb +0 -28
- data/skeletons/project/application/commands/script.erb +0 -30
- data/skeletons/project/application/commands/scripts/script.sh +0 -60
- data/skeletons/project/application/options.rb +0 -34
- data/skeletons/project/config/autoupdate.rb +0 -35
- data/skeletons/project/config/general.rb +0 -17
- data/skeletons/project/config/logging.rb +0 -19
- data/skeletons/project/config/storage.rb +0 -35
- data/skeletons/project/config/userspace.rb +0 -33
- data/skeletons/project/config/version.rb +0 -3
- data/skeletons/project/exe/executable +0 -53
- data/skeletons/project/hooks/default_action.rb +0 -16
- data/skeletons/project/hooks/first_run.rb +0 -16
- data/skeletons/project/hooks/post_execution.rb +0 -14
- data/skeletons/project/hooks/pre_execution.rb +0 -14
- data/skeletons/project/lib/lib.erb +0 -9
- data/skeletons/project/spec/spec_helper.rb +0 -14
- data/skeletons/project/spec/untitled_spec.rb +0 -9
- data/skeletons/project/untitled.gemspec +0 -40
- data/skeletons/project/userconf/user_defaults.yml +0 -6
- /data/{docs-src/.hugo_build.lock → lib/rbcli/plugins/.keep} +0 -0
@@ -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
|