fluid_cli 0.1.2
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 +7 -0
- data/README.md +1 -0
- data/dev.yml +5 -0
- data/exe/fluid +24 -0
- data/lib/fluid_cli/api.rb +135 -0
- data/lib/fluid_cli/assets/post_auth_page/index.html.erb +34 -0
- data/lib/fluid_cli/assets/post_auth_page/style.css +58 -0
- data/lib/fluid_cli/command.rb +55 -0
- data/lib/fluid_cli/commands/help.rb +21 -0
- data/lib/fluid_cli/commands/login.rb +30 -0
- data/lib/fluid_cli/commands/logout.rb +38 -0
- data/lib/fluid_cli/commands/switch.rb +23 -0
- data/lib/fluid_cli/commands/theme/common/company_helper.rb +15 -0
- data/lib/fluid_cli/commands/theme/common/root_helper.rb +95 -0
- data/lib/fluid_cli/commands/theme/dev.rb +61 -0
- data/lib/fluid_cli/commands/theme/help.rb +21 -0
- data/lib/fluid_cli/commands/theme/init.rb +46 -0
- data/lib/fluid_cli/commands/theme/pull.rb +68 -0
- data/lib/fluid_cli/commands/theme/push.rb +132 -0
- data/lib/fluid_cli/commands/theme.rb +23 -0
- data/lib/fluid_cli/commands/whoami.rb +23 -0
- data/lib/fluid_cli/commands.rb +19 -0
- data/lib/fluid_cli/company_switcher.rb +69 -0
- data/lib/fluid_cli/context.rb +691 -0
- data/lib/fluid_cli/db.rb +114 -0
- data/lib/fluid_cli/entry_point.rb +10 -0
- data/lib/fluid_cli/environment.rb +32 -0
- data/lib/fluid_cli/file_system_listener.rb +29 -0
- data/lib/fluid_cli/form.rb +42 -0
- data/lib/fluid_cli/git.rb +319 -0
- data/lib/fluid_cli/http_request.rb +54 -0
- data/lib/fluid_cli/identity_auth/servlet.rb +39 -0
- data/lib/fluid_cli/identity_auth.rb +126 -0
- data/lib/fluid_cli/options.rb +38 -0
- data/lib/fluid_cli/theme/dev_server/certificate_manager.rb +79 -0
- data/lib/fluid_cli/theme/dev_server/errors.rb +9 -0
- data/lib/fluid_cli/theme/dev_server/header_hash.rb +98 -0
- data/lib/fluid_cli/theme/dev_server/hooks/file_change_hook.rb +39 -0
- data/lib/fluid_cli/theme/dev_server/hot_reload/resources/hot-reload-no-script.html +27 -0
- data/lib/fluid_cli/theme/dev_server/hot_reload/resources/hot_reload.js +28 -0
- data/lib/fluid_cli/theme/dev_server/hot_reload/resources/sse_client.js +43 -0
- data/lib/fluid_cli/theme/dev_server/hot_reload/resources/theme.js +16 -0
- data/lib/fluid_cli/theme/dev_server/hot_reload/script_injector.rb +54 -0
- data/lib/fluid_cli/theme/dev_server/hot_reload.rb +75 -0
- data/lib/fluid_cli/theme/dev_server/local_assets.rb +92 -0
- data/lib/fluid_cli/theme/dev_server/proxy.rb +235 -0
- data/lib/fluid_cli/theme/dev_server/proxy_param_builder.rb +82 -0
- data/lib/fluid_cli/theme/dev_server/reload_mode.rb +34 -0
- data/lib/fluid_cli/theme/dev_server/sse.rb +75 -0
- data/lib/fluid_cli/theme/dev_server/watcher.rb +57 -0
- data/lib/fluid_cli/theme/dev_server/web_server.rb +140 -0
- data/lib/fluid_cli/theme/dev_server.rb +289 -0
- data/lib/fluid_cli/theme/development_theme.rb +101 -0
- data/lib/fluid_cli/theme/file.rb +105 -0
- data/lib/fluid_cli/theme/forms/select.rb +33 -0
- data/lib/fluid_cli/theme/mime_type.rb +34 -0
- data/lib/fluid_cli/theme/presenters/theme_presenter.rb +49 -0
- data/lib/fluid_cli/theme/presenters/themes_presenter.rb +31 -0
- data/lib/fluid_cli/theme/root.rb +62 -0
- data/lib/fluid_cli/theme/syncer/checksums.rb +66 -0
- data/lib/fluid_cli/theme/syncer/downloader.rb +54 -0
- data/lib/fluid_cli/theme/syncer/error_reporter.rb +45 -0
- data/lib/fluid_cli/theme/syncer/merger.rb +53 -0
- data/lib/fluid_cli/theme/syncer/operation.rb +58 -0
- data/lib/fluid_cli/theme/syncer/standard_reporter.rb +32 -0
- data/lib/fluid_cli/theme/syncer/unsupported_script_warning.rb +90 -0
- data/lib/fluid_cli/theme/syncer/uploader/forms/apply_to_all.rb +41 -0
- data/lib/fluid_cli/theme/syncer/uploader/forms/apply_to_all_form.rb +37 -0
- data/lib/fluid_cli/theme/syncer/uploader/forms/base_strategy_form.rb +64 -0
- data/lib/fluid_cli/theme/syncer/uploader/forms/select_delete_strategy.rb +29 -0
- data/lib/fluid_cli/theme/syncer/uploader/forms/select_update_strategy.rb +30 -0
- data/lib/fluid_cli/theme/syncer/uploader/json_delete_handler.rb +49 -0
- data/lib/fluid_cli/theme/syncer/uploader/json_update_handler.rb +71 -0
- data/lib/fluid_cli/theme/syncer/uploader.rb +105 -0
- data/lib/fluid_cli/theme/syncer.rb +412 -0
- data/lib/fluid_cli/theme/theme.rb +186 -0
- data/lib/fluid_cli/theme/ui/sync_progress_bar.rb +22 -0
- data/lib/fluid_cli/thread_pool/job.rb +35 -0
- data/lib/fluid_cli/thread_pool.rb +49 -0
- data/lib/fluid_cli/version.rb +3 -0
- data/lib/fluid_cli.rb +59 -0
- data/vendor/deps/base64/.document +5 -0
- data/vendor/deps/base64/.gitignore +9 -0
- data/vendor/deps/base64/BSDL +22 -0
- data/vendor/deps/base64/COPYING +56 -0
- data/vendor/deps/base64/Gemfile +9 -0
- data/vendor/deps/base64/LEGAL +60 -0
- data/vendor/deps/base64/README.md +48 -0
- data/vendor/deps/base64/Rakefile +31 -0
- data/vendor/deps/base64/base64.gemspec +28 -0
- data/vendor/deps/base64/bin/console +14 -0
- data/vendor/deps/base64/bin/setup +8 -0
- data/vendor/deps/base64/lib/base64.rb +382 -0
- data/vendor/deps/base64/sig/base64.rbs +358 -0
- data/vendor/deps/base64/test/base64/test_base64.rb +115 -0
- data/vendor/deps/base64/test_sig/test_base64.rb +44 -0
- data/vendor/deps/cli-kit/REVISION +1 -0
- data/vendor/deps/cli-kit/lib/cli/kit/args/definition.rb +286 -0
- data/vendor/deps/cli-kit/lib/cli/kit/args/evaluation.rb +215 -0
- data/vendor/deps/cli-kit/lib/cli/kit/args/parser/node.rb +128 -0
- data/vendor/deps/cli-kit/lib/cli/kit/args/parser.rb +125 -0
- data/vendor/deps/cli-kit/lib/cli/kit/args/tokenizer.rb +130 -0
- data/vendor/deps/cli-kit/lib/cli/kit/args.rb +16 -0
- data/vendor/deps/cli-kit/lib/cli/kit/base_command.rb +30 -0
- data/vendor/deps/cli-kit/lib/cli/kit/command_help.rb +268 -0
- data/vendor/deps/cli-kit/lib/cli/kit/command_registry.rb +150 -0
- data/vendor/deps/cli-kit/lib/cli/kit/config.rb +137 -0
- data/vendor/deps/cli-kit/lib/cli/kit/core_ext.rb +28 -0
- data/vendor/deps/cli-kit/lib/cli/kit/error_handler.rb +166 -0
- data/vendor/deps/cli-kit/lib/cli/kit/executor.rb +92 -0
- data/vendor/deps/cli-kit/lib/cli/kit/ini.rb +91 -0
- data/vendor/deps/cli-kit/lib/cli/kit/levenshtein.rb +92 -0
- data/vendor/deps/cli-kit/lib/cli/kit/logger.rb +94 -0
- data/vendor/deps/cli-kit/lib/cli/kit/opts.rb +248 -0
- data/vendor/deps/cli-kit/lib/cli/kit/parse_args.rb +55 -0
- data/vendor/deps/cli-kit/lib/cli/kit/resolver.rb +66 -0
- data/vendor/deps/cli-kit/lib/cli/kit/support/test_helper.rb +260 -0
- data/vendor/deps/cli-kit/lib/cli/kit/support.rb +11 -0
- data/vendor/deps/cli-kit/lib/cli/kit/system.rb +290 -0
- data/vendor/deps/cli-kit/lib/cli/kit/util.rb +118 -0
- data/vendor/deps/cli-kit/lib/cli/kit/version.rb +7 -0
- data/vendor/deps/cli-kit/lib/cli/kit.rb +139 -0
- data/vendor/deps/cli-ui/REVISION +1 -0
- data/vendor/deps/cli-ui/lib/cli/ui/ansi.rb +218 -0
- data/vendor/deps/cli-ui/lib/cli/ui/color.rb +101 -0
- data/vendor/deps/cli-ui/lib/cli/ui/formatter.rb +219 -0
- data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_stack.rb +67 -0
- data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/box.rb +179 -0
- data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/bracket.rb +152 -0
- data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style.rb +127 -0
- data/vendor/deps/cli-ui/lib/cli/ui/frame.rb +286 -0
- data/vendor/deps/cli-ui/lib/cli/ui/glyph.rb +92 -0
- data/vendor/deps/cli-ui/lib/cli/ui/os.rb +63 -0
- data/vendor/deps/cli-ui/lib/cli/ui/printer.rb +64 -0
- data/vendor/deps/cli-ui/lib/cli/ui/progress.rb +132 -0
- data/vendor/deps/cli-ui/lib/cli/ui/progress_reporter.rb +209 -0
- data/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +583 -0
- data/vendor/deps/cli-ui/lib/cli/ui/prompt/options_handler.rb +36 -0
- data/vendor/deps/cli-ui/lib/cli/ui/prompt.rb +381 -0
- data/vendor/deps/cli-ui/lib/cli/ui/spinner/async.rb +48 -0
- data/vendor/deps/cli-ui/lib/cli/ui/spinner/spin_group.rb +602 -0
- data/vendor/deps/cli-ui/lib/cli/ui/spinner.rb +79 -0
- data/vendor/deps/cli-ui/lib/cli/ui/stdout_router.rb +399 -0
- data/vendor/deps/cli-ui/lib/cli/ui/table.rb +83 -0
- data/vendor/deps/cli-ui/lib/cli/ui/terminal.rb +55 -0
- data/vendor/deps/cli-ui/lib/cli/ui/truncater.rb +106 -0
- data/vendor/deps/cli-ui/lib/cli/ui/version.rb +8 -0
- data/vendor/deps/cli-ui/lib/cli/ui/widgets/base.rb +46 -0
- data/vendor/deps/cli-ui/lib/cli/ui/widgets/status.rb +79 -0
- data/vendor/deps/cli-ui/lib/cli/ui/widgets.rb +89 -0
- data/vendor/deps/cli-ui/lib/cli/ui/work_queue.rb +142 -0
- data/vendor/deps/cli-ui/lib/cli/ui/wrap.rb +61 -0
- data/vendor/deps/cli-ui/lib/cli/ui.rb +359 -0
- data/vendor/deps/cli-ui/vendor/reentrant_mutex.rb +78 -0
- data/vendor/deps/debug/CONTRIBUTING.md +573 -0
- data/vendor/deps/debug/Gemfile +10 -0
- data/vendor/deps/debug/LICENSE.txt +22 -0
- data/vendor/deps/debug/README.md +996 -0
- data/vendor/deps/debug/Rakefile +57 -0
- data/vendor/deps/debug/TODO.md +23 -0
- data/vendor/deps/debug/debug.gemspec +33 -0
- data/vendor/deps/debug/exe/rdbg +53 -0
- data/vendor/deps/debug/ext/debug/Makefile +273 -0
- data/vendor/deps/debug/ext/debug/debug.c +228 -0
- data/vendor/deps/debug/ext/debug/debug_version.h +1 -0
- data/vendor/deps/debug/ext/debug/extconf.rb +27 -0
- data/vendor/deps/debug/ext/debug/iseq_collector.c +93 -0
- data/vendor/deps/debug/lib/debug/abbrev_command.rb +77 -0
- data/vendor/deps/debug/lib/debug/breakpoint.rb +556 -0
- data/vendor/deps/debug/lib/debug/client.rb +263 -0
- data/vendor/deps/debug/lib/debug/color.rb +123 -0
- data/vendor/deps/debug/lib/debug/config.rb +592 -0
- data/vendor/deps/debug/lib/debug/console.rb +224 -0
- data/vendor/deps/debug/lib/debug/dap_custom/traceInspector.rb +336 -0
- data/vendor/deps/debug/lib/debug/debug.bundle +0 -0
- data/vendor/deps/debug/lib/debug/frame_info.rb +190 -0
- data/vendor/deps/debug/lib/debug/irb_integration.rb +37 -0
- data/vendor/deps/debug/lib/debug/local.rb +115 -0
- data/vendor/deps/debug/lib/debug/open.rb +13 -0
- data/vendor/deps/debug/lib/debug/open_nonstop.rb +15 -0
- data/vendor/deps/debug/lib/debug/prelude.rb +50 -0
- data/vendor/deps/debug/lib/debug/server.rb +534 -0
- data/vendor/deps/debug/lib/debug/server_cdp.rb +1348 -0
- data/vendor/deps/debug/lib/debug/server_dap.rb +1108 -0
- data/vendor/deps/debug/lib/debug/session.rb +2667 -0
- data/vendor/deps/debug/lib/debug/source_repository.rb +150 -0
- data/vendor/deps/debug/lib/debug/start.rb +5 -0
- data/vendor/deps/debug/lib/debug/thread_client.rb +1457 -0
- data/vendor/deps/debug/lib/debug/tracer.rb +241 -0
- data/vendor/deps/debug/lib/debug/version.rb +5 -0
- data/vendor/deps/debug/lib/debug.rb +9 -0
- data/vendor/deps/debug/misc/README.md.erb +660 -0
- data/vendor/deps/listen/.github/release-drafter.yml +17 -0
- data/vendor/deps/listen/.github/workflows/development.yml +67 -0
- data/vendor/deps/listen/.github/workflows/push.yml +12 -0
- data/vendor/deps/listen/.gitignore +28 -0
- data/vendor/deps/listen/.rspec +3 -0
- data/vendor/deps/listen/.rubocop.yml +283 -0
- data/vendor/deps/listen/.yardopts +11 -0
- data/vendor/deps/listen/CHANGELOG.md +1 -0
- data/vendor/deps/listen/CONTRIBUTING.md +45 -0
- data/vendor/deps/listen/Gemfile +33 -0
- data/vendor/deps/listen/Guardfile +26 -0
- data/vendor/deps/listen/LICENSE.txt +22 -0
- data/vendor/deps/listen/README.md +490 -0
- data/vendor/deps/listen/Rakefile +154 -0
- data/vendor/deps/listen/bin/listen +11 -0
- data/vendor/deps/listen/lib/listen/adapter/base.rb +129 -0
- data/vendor/deps/listen/lib/listen/adapter/bsd.rb +104 -0
- data/vendor/deps/listen/lib/listen/adapter/config.rb +31 -0
- data/vendor/deps/listen/lib/listen/adapter/darwin.rb +77 -0
- data/vendor/deps/listen/lib/listen/adapter/linux.rb +108 -0
- data/vendor/deps/listen/lib/listen/adapter/polling.rb +40 -0
- data/vendor/deps/listen/lib/listen/adapter/windows.rb +96 -0
- data/vendor/deps/listen/lib/listen/adapter.rb +43 -0
- data/vendor/deps/listen/lib/listen/backend.rb +40 -0
- data/vendor/deps/listen/lib/listen/change.rb +69 -0
- data/vendor/deps/listen/lib/listen/cli.rb +65 -0
- data/vendor/deps/listen/lib/listen/directory.rb +93 -0
- data/vendor/deps/listen/lib/listen/error.rb +11 -0
- data/vendor/deps/listen/lib/listen/event/config.rb +39 -0
- data/vendor/deps/listen/lib/listen/event/loop.rb +92 -0
- data/vendor/deps/listen/lib/listen/event/processor.rb +128 -0
- data/vendor/deps/listen/lib/listen/event/queue.rb +52 -0
- data/vendor/deps/listen/lib/listen/file.rb +95 -0
- data/vendor/deps/listen/lib/listen/fsm.rb +131 -0
- data/vendor/deps/listen/lib/listen/listener/config.rb +41 -0
- data/vendor/deps/listen/lib/listen/listener.rb +136 -0
- data/vendor/deps/listen/lib/listen/logger.rb +65 -0
- data/vendor/deps/listen/lib/listen/monotonic_time.rb +27 -0
- data/vendor/deps/listen/lib/listen/options.rb +24 -0
- data/vendor/deps/listen/lib/listen/queue_optimizer.rb +129 -0
- data/vendor/deps/listen/lib/listen/record/entry.rb +66 -0
- data/vendor/deps/listen/lib/listen/record/symlink_detector.rb +47 -0
- data/vendor/deps/listen/lib/listen/record.rb +122 -0
- data/vendor/deps/listen/lib/listen/silencer/controller.rb +50 -0
- data/vendor/deps/listen/lib/listen/silencer.rb +106 -0
- data/vendor/deps/listen/lib/listen/thread.rb +54 -0
- data/vendor/deps/listen/lib/listen/version.rb +5 -0
- data/vendor/deps/listen/lib/listen.rb +47 -0
- data/vendor/deps/listen/listen.gemspec +40 -0
- data/vendor/deps/listen/spec/acceptance/listen_spec.rb +320 -0
- data/vendor/deps/listen/spec/lib/listen/adapter/base_spec.rb +101 -0
- data/vendor/deps/listen/spec/lib/listen/adapter/bsd_spec.rb +13 -0
- data/vendor/deps/listen/spec/lib/listen/adapter/config_spec.rb +122 -0
- data/vendor/deps/listen/spec/lib/listen/adapter/darwin_spec.rb +82 -0
- data/vendor/deps/listen/spec/lib/listen/adapter/linux_spec.rb +199 -0
- data/vendor/deps/listen/spec/lib/listen/adapter/polling_spec.rb +83 -0
- data/vendor/deps/listen/spec/lib/listen/adapter/windows_spec.rb +13 -0
- data/vendor/deps/listen/spec/lib/listen/adapter_spec.rb +69 -0
- data/vendor/deps/listen/spec/lib/listen/backend_spec.rb +82 -0
- data/vendor/deps/listen/spec/lib/listen/change_spec.rb +102 -0
- data/vendor/deps/listen/spec/lib/listen/cli_spec.rb +116 -0
- data/vendor/deps/listen/spec/lib/listen/directory_spec.rb +284 -0
- data/vendor/deps/listen/spec/lib/listen/event/config_spec.rb +33 -0
- data/vendor/deps/listen/spec/lib/listen/event/loop_spec.rb +118 -0
- data/vendor/deps/listen/spec/lib/listen/event/processor_spec.rb +250 -0
- data/vendor/deps/listen/spec/lib/listen/event/queue_spec.rb +118 -0
- data/vendor/deps/listen/spec/lib/listen/file_spec.rb +254 -0
- data/vendor/deps/listen/spec/lib/listen/fsm_spec.rb +147 -0
- data/vendor/deps/listen/spec/lib/listen/listener/config_spec.rb +29 -0
- data/vendor/deps/listen/spec/lib/listen/listener_spec.rb +321 -0
- data/vendor/deps/listen/spec/lib/listen/logger_spec.rb +212 -0
- data/vendor/deps/listen/spec/lib/listen/monotonic_time_spec.rb +58 -0
- data/vendor/deps/listen/spec/lib/listen/queue_optimizer_spec.rb +111 -0
- data/vendor/deps/listen/spec/lib/listen/record_spec.rb +424 -0
- data/vendor/deps/listen/spec/lib/listen/silencer/controller_spec.rb +97 -0
- data/vendor/deps/listen/spec/lib/listen/silencer_spec.rb +109 -0
- data/vendor/deps/listen/spec/lib/listen/thread_spec.rb +133 -0
- data/vendor/deps/listen/spec/lib/listen_spec.rb +25 -0
- data/vendor/deps/listen/spec/spec_helper.rb +49 -0
- data/vendor/deps/listen/spec/support/acceptance_helper.rb +260 -0
- data/vendor/deps/listen/spec/support/fixtures_helper.rb +32 -0
- data/vendor/deps/listen/spec/support/platform_helper.rb +17 -0
- data/vendor/deps/observer/.github/dependabot.yml +6 -0
- data/vendor/deps/observer/.github/workflows/test.yml +33 -0
- data/vendor/deps/observer/.gitignore +8 -0
- data/vendor/deps/observer/BSDL +22 -0
- data/vendor/deps/observer/COPYING +56 -0
- data/vendor/deps/observer/Gemfile +9 -0
- data/vendor/deps/observer/README.md +139 -0
- data/vendor/deps/observer/Rakefile +10 -0
- data/vendor/deps/observer/bin/console +14 -0
- data/vendor/deps/observer/bin/setup +8 -0
- data/vendor/deps/observer/lib/observer.rb +229 -0
- data/vendor/deps/observer/observer.gemspec +32 -0
- data/vendor/deps/observer/test/test_observer.rb +66 -0
- data/vendor/deps/webrick/.gitignore +9 -0
- data/vendor/deps/webrick/Gemfile +3 -0
- data/vendor/deps/webrick/LICENSE.txt +22 -0
- data/vendor/deps/webrick/README.md +61 -0
- data/vendor/deps/webrick/Rakefile +10 -0
- data/vendor/deps/webrick/lib/webrick/accesslog.rb +157 -0
- data/vendor/deps/webrick/lib/webrick/cgi.rb +313 -0
- data/vendor/deps/webrick/lib/webrick/compat.rb +36 -0
- data/vendor/deps/webrick/lib/webrick/config.rb +158 -0
- data/vendor/deps/webrick/lib/webrick/cookie.rb +172 -0
- data/vendor/deps/webrick/lib/webrick/htmlutils.rb +30 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/authenticator.rb +117 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/basicauth.rb +116 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/digestauth.rb +395 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/htdigest.rb +132 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/htgroup.rb +97 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/htpasswd.rb +158 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/userdb.rb +53 -0
- data/vendor/deps/webrick/lib/webrick/httpauth.rb +96 -0
- data/vendor/deps/webrick/lib/webrick/httpproxy.rb +354 -0
- data/vendor/deps/webrick/lib/webrick/httprequest.rb +636 -0
- data/vendor/deps/webrick/lib/webrick/httpresponse.rb +564 -0
- data/vendor/deps/webrick/lib/webrick/https.rb +152 -0
- data/vendor/deps/webrick/lib/webrick/httpserver.rb +294 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/abstract.rb +152 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/cgi_runner.rb +47 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/cgihandler.rb +126 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/erbhandler.rb +88 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/filehandler.rb +552 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/prochandler.rb +47 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet.rb +23 -0
- data/vendor/deps/webrick/lib/webrick/httpstatus.rb +194 -0
- data/vendor/deps/webrick/lib/webrick/httputils.rb +512 -0
- data/vendor/deps/webrick/lib/webrick/httpversion.rb +76 -0
- data/vendor/deps/webrick/lib/webrick/log.rb +156 -0
- data/vendor/deps/webrick/lib/webrick/server.rb +381 -0
- data/vendor/deps/webrick/lib/webrick/ssl.rb +215 -0
- data/vendor/deps/webrick/lib/webrick/utils.rb +265 -0
- data/vendor/deps/webrick/lib/webrick/version.rb +18 -0
- data/vendor/deps/webrick/lib/webrick.rb +232 -0
- data/vendor/deps/webrick/webrick.gemspec +74 -0
- metadata +412 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
|
|
3
|
+
# Copyright (c) 2014-2016 Yuki Nishijima
|
|
4
|
+
|
|
5
|
+
# MIT License
|
|
6
|
+
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
|
8
|
+
# a copy of this software and associated documentation files (the
|
|
9
|
+
# "Software"), to deal in the Software without restriction, including
|
|
10
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
|
11
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
12
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
|
13
|
+
# the following conditions:
|
|
14
|
+
|
|
15
|
+
# The above copyright notice and this permission notice shall be
|
|
16
|
+
# included in all copies or substantial portions of the Software.
|
|
17
|
+
|
|
18
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
19
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
20
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
21
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
22
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
23
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
24
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
25
|
+
|
|
26
|
+
require 'cli/kit'
|
|
27
|
+
|
|
28
|
+
module CLI
|
|
29
|
+
module Kit
|
|
30
|
+
module Levenshtein
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# This code is based directly on the Text gem implementation
|
|
34
|
+
# Copyright (c) 2006-2013 Paul Battley, Michael Neumann, Tim Fletcher.
|
|
35
|
+
#
|
|
36
|
+
# Returns a value representing the "cost" of transforming str1 into str2
|
|
37
|
+
#: (String str1, String str2) -> Integer
|
|
38
|
+
def distance(str1, str2)
|
|
39
|
+
n = str1.length
|
|
40
|
+
m = str2.length
|
|
41
|
+
return m if n.zero?
|
|
42
|
+
return n if m.zero?
|
|
43
|
+
|
|
44
|
+
d = (0..m).to_a
|
|
45
|
+
x = 0
|
|
46
|
+
|
|
47
|
+
# to avoid duplicating an enumerable object, create it outside of the loop
|
|
48
|
+
str2_codepoints = str2.codepoints
|
|
49
|
+
|
|
50
|
+
str1.each_codepoint.with_index(1) do |char1, i|
|
|
51
|
+
j = 0
|
|
52
|
+
while j < m
|
|
53
|
+
cost = char1 == str2_codepoints[j] ? 0 : 1
|
|
54
|
+
a = d[j] #: as !nil
|
|
55
|
+
b = d[j + 1] #: as !nil
|
|
56
|
+
x = min3(
|
|
57
|
+
b + 1,
|
|
58
|
+
i + 1, # deletion
|
|
59
|
+
a + cost, # substitution
|
|
60
|
+
)
|
|
61
|
+
d[j] = i
|
|
62
|
+
i = x
|
|
63
|
+
|
|
64
|
+
j += 1
|
|
65
|
+
end
|
|
66
|
+
d[m] = x
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
x
|
|
70
|
+
end
|
|
71
|
+
module_function :distance
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
|
|
75
|
+
# detects the minimum value out of three arguments. This method is
|
|
76
|
+
# faster than `[a, b, c].min` and puts less GC pressure.
|
|
77
|
+
# See https://github.com/yuki24/did_you_mean/pull/1 for a performance
|
|
78
|
+
# benchmark.
|
|
79
|
+
#: (Integer a, Integer b, Integer c) -> Integer
|
|
80
|
+
def min3(a, b, c)
|
|
81
|
+
if a < b && a < c
|
|
82
|
+
a
|
|
83
|
+
elsif b < c
|
|
84
|
+
b
|
|
85
|
+
else
|
|
86
|
+
c
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
module_function :min3
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
|
|
3
|
+
require 'cli/kit'
|
|
4
|
+
require 'logger'
|
|
5
|
+
require 'fileutils'
|
|
6
|
+
|
|
7
|
+
module CLI
|
|
8
|
+
module Kit
|
|
9
|
+
class Logger
|
|
10
|
+
MAX_LOG_SIZE = 5 * 1024 * 1000 # 5MB
|
|
11
|
+
MAX_NUM_LOGS = 10
|
|
12
|
+
|
|
13
|
+
# Constructor for CLI::Kit::Logger
|
|
14
|
+
#
|
|
15
|
+
# @param debug_log_file [String] path to the file where debug logs should be stored
|
|
16
|
+
#: (debug_log_file: String, ?env_debug_name: String) -> void
|
|
17
|
+
def initialize(debug_log_file:, env_debug_name: 'DEBUG')
|
|
18
|
+
FileUtils.mkpath(File.dirname(debug_log_file))
|
|
19
|
+
@debug_logger = ::Logger.new(debug_log_file, MAX_NUM_LOGS, MAX_LOG_SIZE)
|
|
20
|
+
@env_debug_name = env_debug_name
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Functionally equivalent to Logger#info
|
|
24
|
+
# Also logs to the debug file, taking into account CLI::UI::StdoutRouter.current_id
|
|
25
|
+
#
|
|
26
|
+
# @param msg [String] the message to log
|
|
27
|
+
# @param debug [Boolean] determines if the debug logger will receive the log (default true)
|
|
28
|
+
#: (String msg, ?debug: bool) -> void
|
|
29
|
+
def info(msg, debug: true)
|
|
30
|
+
$stdout.puts CLI::UI.fmt(msg)
|
|
31
|
+
@debug_logger.info(format_debug(msg)) if debug
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Functionally equivalent to Logger#warn
|
|
35
|
+
# Also logs to the debug file, taking into account CLI::UI::StdoutRouter.current_id
|
|
36
|
+
#
|
|
37
|
+
# @param msg [String] the message to log
|
|
38
|
+
# @param debug [Boolean] determines if the debug logger will receive the log (default true)
|
|
39
|
+
#: (String msg, ?debug: bool) -> void
|
|
40
|
+
def warn(msg, debug: true)
|
|
41
|
+
$stdout.puts CLI::UI.fmt("{{yellow:#{msg}}}")
|
|
42
|
+
@debug_logger.warn(format_debug(msg)) if debug
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Functionally equivalent to Logger#error
|
|
46
|
+
# Also logs to the debug file, taking into account CLI::UI::StdoutRouter.current_id
|
|
47
|
+
#
|
|
48
|
+
# @param msg [String] the message to log
|
|
49
|
+
# @param debug [Boolean] determines if the debug logger will receive the log (default true)
|
|
50
|
+
#: (String msg, ?debug: bool) -> void
|
|
51
|
+
def error(msg, debug: true)
|
|
52
|
+
$stderr.puts CLI::UI.fmt("{{red:#{msg}}}")
|
|
53
|
+
@debug_logger.error(format_debug(msg)) if debug
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Functionally equivalent to Logger#fatal
|
|
57
|
+
# Also logs to the debug file, taking into account CLI::UI::StdoutRouter.current_id
|
|
58
|
+
#
|
|
59
|
+
# @param msg [String] the message to log
|
|
60
|
+
# @param debug [Boolean] determines if the debug logger will receive the log (default true)
|
|
61
|
+
#: (String msg, ?debug: bool) -> void
|
|
62
|
+
def fatal(msg, debug: true)
|
|
63
|
+
$stderr.puts CLI::UI.fmt("{{red:{{bold:Fatal:}} #{msg}}}")
|
|
64
|
+
@debug_logger.fatal(format_debug(msg)) if debug
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Similar to Logger#debug, however will not output to STDOUT unless DEBUG env var is set
|
|
68
|
+
# Logs to the debug file, taking into account CLI::UI::StdoutRouter.current_id
|
|
69
|
+
#
|
|
70
|
+
# @param msg [String] the message to log
|
|
71
|
+
#: (String msg) -> void
|
|
72
|
+
def debug(msg)
|
|
73
|
+
$stdout.puts CLI::UI.fmt(msg) if debug?
|
|
74
|
+
@debug_logger.debug(format_debug(msg))
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
private
|
|
78
|
+
|
|
79
|
+
#: (String msg) -> String
|
|
80
|
+
def format_debug(msg)
|
|
81
|
+
msg = CLI::UI.fmt(msg)
|
|
82
|
+
return msg unless CLI::UI::StdoutRouter.current_id
|
|
83
|
+
|
|
84
|
+
"[#{CLI::UI::StdoutRouter.current_id&.fetch(:id, nil)}] #{msg}"
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
#: -> bool
|
|
88
|
+
def debug?
|
|
89
|
+
val = ENV[@env_debug_name]
|
|
90
|
+
!!val && val != '0' && val != ''
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
|
|
3
|
+
require 'cli/kit'
|
|
4
|
+
|
|
5
|
+
module CLI
|
|
6
|
+
module Kit
|
|
7
|
+
class Opts
|
|
8
|
+
module Mixin
|
|
9
|
+
include Kernel
|
|
10
|
+
|
|
11
|
+
module MixinClassMethods
|
|
12
|
+
#: (Module included_module) -> void
|
|
13
|
+
def include(included_module)
|
|
14
|
+
super
|
|
15
|
+
return unless included_module.is_a?(MixinClassMethods)
|
|
16
|
+
|
|
17
|
+
included_module.tracked_methods.each { |m| track_method(m) }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# No signature - Sorbet uses method_added internally, so can't verify it
|
|
21
|
+
def method_added(method_name) # rubocop:disable Sorbet/EnforceSignatures
|
|
22
|
+
super
|
|
23
|
+
track_method(method_name)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
#: (Symbol method_name) -> void
|
|
27
|
+
def track_method(method_name)
|
|
28
|
+
@tracked_methods ||= []
|
|
29
|
+
@tracked_methods << method_name unless @tracked_methods.include?(method_name)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
#: -> Array[Symbol]
|
|
33
|
+
def tracked_methods
|
|
34
|
+
@tracked_methods || []
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
class << self
|
|
39
|
+
#: (Module klass) -> void
|
|
40
|
+
def included(klass)
|
|
41
|
+
klass.extend(MixinClassMethods)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
#: (?name: Symbol, ?short: String?, ?long: String?, ?desc: String?, ?default: (String | ^-> String)?) -> String?
|
|
46
|
+
def option(name: infer_name, short: nil, long: nil, desc: nil, default: nil)
|
|
47
|
+
unless default.nil?
|
|
48
|
+
raise(ArgumentError, 'declare options with non-nil defaults using `option!` instead of `option`')
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
case @obj
|
|
52
|
+
when Args::Definition
|
|
53
|
+
@obj.add_option(
|
|
54
|
+
name, short: short, long: long, desc: desc, default: default
|
|
55
|
+
)
|
|
56
|
+
'(result unavailable)'
|
|
57
|
+
when Args::Evaluation
|
|
58
|
+
@obj.opt.send(name)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
#: (?name: Symbol, ?short: String?, ?long: String?, ?desc: String?, ?default: (String | ^-> String)?) -> String
|
|
63
|
+
def option!(name: infer_name, short: nil, long: nil, desc: nil, default: nil)
|
|
64
|
+
case @obj
|
|
65
|
+
when Args::Definition
|
|
66
|
+
@obj.add_option(
|
|
67
|
+
name, short: short, long: long, desc: desc, default: default
|
|
68
|
+
)
|
|
69
|
+
'(result unavailable)'
|
|
70
|
+
when Args::Evaluation
|
|
71
|
+
@obj.opt.send(name)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
#: (?name: Symbol, ?short: String?, ?long: String?, ?desc: String?, ?default: (Array[String] | ^-> Array[String])) -> Array[String]
|
|
76
|
+
def multi_option(name: infer_name, short: nil, long: nil, desc: nil, default: [])
|
|
77
|
+
case @obj
|
|
78
|
+
when Args::Definition
|
|
79
|
+
@obj.add_option(
|
|
80
|
+
name, short: short, long: long, desc: desc, default: default, multi: true
|
|
81
|
+
)
|
|
82
|
+
['(result unavailable)']
|
|
83
|
+
when Args::Evaluation
|
|
84
|
+
@obj.opt.send(name)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
#: (?name: Symbol, ?short: String?, ?long: String?, ?desc: String?) -> bool
|
|
89
|
+
def flag(name: infer_name, short: nil, long: nil, desc: nil)
|
|
90
|
+
case @obj
|
|
91
|
+
when Args::Definition
|
|
92
|
+
@obj.add_flag(name, short: short, long: long, desc: desc)
|
|
93
|
+
false
|
|
94
|
+
when Args::Evaluation
|
|
95
|
+
@obj.flag.send(name)
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
#: (?name: Symbol, ?desc: String?) -> String
|
|
100
|
+
def position!(name: infer_name, desc: nil)
|
|
101
|
+
case @obj
|
|
102
|
+
when Args::Definition
|
|
103
|
+
@obj.add_position(name, desc: desc, required: true, multi: false)
|
|
104
|
+
'(result unavailable)'
|
|
105
|
+
when Args::Evaluation
|
|
106
|
+
@obj.position.send(name)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
#: (?name: Symbol, ?desc: String?, ?default: (String | ^-> String)?, ?skip: (^-> bool | ^(String arg0) -> bool)?) -> String?
|
|
111
|
+
def position(name: infer_name, desc: nil, default: nil, skip: nil)
|
|
112
|
+
case @obj
|
|
113
|
+
when Args::Definition
|
|
114
|
+
@obj.add_position(name, desc: desc, required: false, multi: false, default: default, skip: skip)
|
|
115
|
+
'(result unavailable)'
|
|
116
|
+
when Args::Evaluation
|
|
117
|
+
@obj.position.send(name)
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
#: (?name: Symbol, ?desc: String?) -> Array[String]
|
|
122
|
+
def rest(name: infer_name, desc: nil)
|
|
123
|
+
case @obj
|
|
124
|
+
when Args::Definition
|
|
125
|
+
@obj.add_position(name, desc: desc, required: false, multi: true)
|
|
126
|
+
['(result unavailable)']
|
|
127
|
+
when Args::Evaluation
|
|
128
|
+
@obj.position.send(name)
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
private
|
|
133
|
+
|
|
134
|
+
#: (String? label) -> Symbol?
|
|
135
|
+
def symbolize(label)
|
|
136
|
+
return if label.nil?
|
|
137
|
+
|
|
138
|
+
label.split('#').last&.to_sym
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
#: -> Symbol
|
|
142
|
+
def infer_name
|
|
143
|
+
to_skip = 1
|
|
144
|
+
Kernel.caller_locations.each do |loc|
|
|
145
|
+
next if loc.path =~ /sorbet-runtime/
|
|
146
|
+
|
|
147
|
+
if to_skip > 0
|
|
148
|
+
to_skip -= 1
|
|
149
|
+
next
|
|
150
|
+
end
|
|
151
|
+
return symbolize(loc.label) #: as !nil
|
|
152
|
+
end
|
|
153
|
+
raise(ArgumentError, 'could not infer name')
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
include(Mixin)
|
|
157
|
+
|
|
158
|
+
DEFAULT_OPTIONS = [:helpflag]
|
|
159
|
+
|
|
160
|
+
#: -> bool
|
|
161
|
+
def helpflag
|
|
162
|
+
flag(name: :help, short: '-h', long: '--help', desc: 'Show this help message')
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
#: -> Array[String]
|
|
166
|
+
def unparsed
|
|
167
|
+
obj = assert_result!
|
|
168
|
+
obj.unparsed
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
#: ?{ (Symbol arg0, String? arg1) -> void } -> untyped
|
|
172
|
+
def each_option(&block)
|
|
173
|
+
return enum_for(:each_option) unless block_given?
|
|
174
|
+
|
|
175
|
+
obj = assert_result!
|
|
176
|
+
obj.defn.options.each do |opt|
|
|
177
|
+
name = opt.name
|
|
178
|
+
value = obj.opt.send(name)
|
|
179
|
+
yield(name, value)
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
#: ?{ (Symbol arg0, bool arg1) -> void } -> untyped
|
|
184
|
+
def each_flag(&block)
|
|
185
|
+
return enum_for(:each_flag) unless block_given?
|
|
186
|
+
|
|
187
|
+
obj = assert_result!
|
|
188
|
+
obj.defn.flags.each do |flag|
|
|
189
|
+
name = flag.name
|
|
190
|
+
value = obj.flag.send(name)
|
|
191
|
+
yield(name, value)
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
#: (String name) -> (String | bool)?
|
|
196
|
+
def [](name)
|
|
197
|
+
obj = assert_result!
|
|
198
|
+
if obj.opt.respond_to?(name)
|
|
199
|
+
obj.opt.send(name)
|
|
200
|
+
elsif obj.flag.respond_to?(name)
|
|
201
|
+
obj.flag.send(name)
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
#: (String name) -> String?
|
|
206
|
+
def lookup_option(name)
|
|
207
|
+
obj = assert_result!
|
|
208
|
+
obj.opt.send(name)
|
|
209
|
+
rescue NoMethodError
|
|
210
|
+
# TODO: should we raise a KeyError?
|
|
211
|
+
nil
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
#: (String name) -> bool
|
|
215
|
+
def lookup_flag(name)
|
|
216
|
+
obj = assert_result!
|
|
217
|
+
obj.flag.send(name)
|
|
218
|
+
rescue NoMethodError
|
|
219
|
+
false
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
#: -> Args::Evaluation
|
|
223
|
+
def assert_result!
|
|
224
|
+
raise(NotImplementedError, 'not implemented') if @obj.is_a?(Args::Definition)
|
|
225
|
+
|
|
226
|
+
@obj
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
#: (Args::Definition defn) -> void
|
|
230
|
+
def define!(defn)
|
|
231
|
+
@obj = defn
|
|
232
|
+
klass = self.class #: as Mixin::MixinClassMethods
|
|
233
|
+
klass.tracked_methods.each do |m|
|
|
234
|
+
send(m)
|
|
235
|
+
end
|
|
236
|
+
DEFAULT_OPTIONS.each do |m|
|
|
237
|
+
send(m)
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
#: (Args::Evaluation ev) -> void
|
|
242
|
+
def evaluate!(ev)
|
|
243
|
+
@obj = ev
|
|
244
|
+
ev.resolve_positions!
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
|
|
3
|
+
module CLI
|
|
4
|
+
module Kit
|
|
5
|
+
module ParseArgs
|
|
6
|
+
# because sorbet type-checking takes the pedantic route that module doesn't include Kernel, therefore
|
|
7
|
+
# this is necessary (even tho it's ~probably fine~)
|
|
8
|
+
include Kernel
|
|
9
|
+
|
|
10
|
+
# untyped is used in two places. The interpretation of dynamic values from the provided `opts`
|
|
11
|
+
# and the resulting args[:opts] is pretty broad. There seems to be minimal value in expressing a
|
|
12
|
+
# tighter subset of untyped.
|
|
13
|
+
|
|
14
|
+
#: ((Array | String) args, Hash[Symbol, Array[untyped]] opts_defn) -> Hash[Symbol, untyped]
|
|
15
|
+
def parse_args(args, opts_defn)
|
|
16
|
+
start_opts, parser_config = opts_defn.reduce([{}, []]) do |(ini, pcfg), (n, cfg)|
|
|
17
|
+
(vals, desc, short, klass) = cfg
|
|
18
|
+
(init_val, def_val) = Array(vals)
|
|
19
|
+
|
|
20
|
+
[
|
|
21
|
+
init_val.nil? ? ini : ini.merge(n => init_val),
|
|
22
|
+
pcfg + [[n, short, desc, def_val, klass]],
|
|
23
|
+
]
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
require('optparse')
|
|
27
|
+
|
|
28
|
+
acc_opts = {}
|
|
29
|
+
prsr = OptionParser.new do |opt_p|
|
|
30
|
+
parser_config.each do |(n, short, desc, def_val, klass)|
|
|
31
|
+
(_, mark) = short.split(' ')
|
|
32
|
+
long = "--#{n.to_s.tr("_", "-")}" + (mark.nil? ? '' : " #{mark}")
|
|
33
|
+
opt_args = klass.nil? ? [short, long, desc] : [short, long, klass, desc]
|
|
34
|
+
|
|
35
|
+
unsafe_opt_p = opt_p #: as untyped
|
|
36
|
+
unsafe_opt_p.on(*opt_args) do |v|
|
|
37
|
+
acc_opts[n] = if acc_opts.key?(n)
|
|
38
|
+
Array(acc_opts[n]) + Array(v || def_val)
|
|
39
|
+
else
|
|
40
|
+
v || def_val
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
arg_v = (args.is_a?(Array) ? args : args.strip.split(/\s+/)).map(&:strip)
|
|
47
|
+
sub = prsr.parse(arg_v)
|
|
48
|
+
|
|
49
|
+
{ opts: start_opts.merge(acc_opts) }.tap do |a|
|
|
50
|
+
a[:sub] = sub if sub
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
|
|
3
|
+
require 'cli/kit'
|
|
4
|
+
|
|
5
|
+
module CLI
|
|
6
|
+
module Kit
|
|
7
|
+
class Resolver
|
|
8
|
+
#: (tool_name: String, command_registry: CLI::Kit::CommandRegistry) -> void
|
|
9
|
+
def initialize(tool_name:, command_registry:)
|
|
10
|
+
@tool_name = tool_name
|
|
11
|
+
@command_registry = command_registry
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
#: (Array[String] args) -> [singleton(CLI::Kit::BaseCommand), String, Array[String]]
|
|
15
|
+
def call(args)
|
|
16
|
+
args = args.dup
|
|
17
|
+
command_name = args.shift
|
|
18
|
+
|
|
19
|
+
command, resolved_name = @command_registry.lookup_command(command_name)
|
|
20
|
+
|
|
21
|
+
if command.nil?
|
|
22
|
+
command_not_found(command_name)
|
|
23
|
+
raise CLI::Kit::AbortSilent # Already output message
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
[command, resolved_name, args]
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
#: (String? name) -> void
|
|
32
|
+
def command_not_found(name)
|
|
33
|
+
CLI::UI::Frame.open('Command not found', color: :red, timing: false) do
|
|
34
|
+
$stderr.puts(CLI::UI.fmt("{{command:#{@tool_name} #{name}}} was not found"))
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
cmds = commands_and_aliases
|
|
38
|
+
if cmds.all? { |cmd| cmd.is_a?(String) }
|
|
39
|
+
possible_matches = cmds.min_by(2) do |cmd|
|
|
40
|
+
CLI::Kit::Levenshtein.distance(cmd, name)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# We don't want to match against any possible command
|
|
44
|
+
# so reject anything that is too far away
|
|
45
|
+
possible_matches.reject! do |possible_match|
|
|
46
|
+
CLI::Kit::Levenshtein.distance(possible_match, name) > 3
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# If we have any matches left, tell the user
|
|
50
|
+
if possible_matches.any?
|
|
51
|
+
CLI::UI::Frame.open('{{bold:Did you mean?}}', timing: false, color: :blue) do
|
|
52
|
+
possible_matches.each do |possible_match|
|
|
53
|
+
$stderr.puts CLI::UI.fmt("{{command:#{@tool_name} #{possible_match}}}")
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
#: -> Array[String]
|
|
61
|
+
def commands_and_aliases
|
|
62
|
+
@command_registry.command_names + @command_registry.aliases.keys
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|