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,131 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Code copied from https://github.com/celluloid/celluloid-fsm
|
|
4
|
+
|
|
5
|
+
module Listen
|
|
6
|
+
module FSM
|
|
7
|
+
# Included hook to extend class methods
|
|
8
|
+
def self.included(klass)
|
|
9
|
+
klass.send :extend, ClassMethods
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
module ClassMethods
|
|
13
|
+
# Obtain or set the start state
|
|
14
|
+
# Passing a state name sets the start state
|
|
15
|
+
def start_state(new_start_state = nil)
|
|
16
|
+
if new_start_state
|
|
17
|
+
new_start_state.is_a?(Symbol) or raise ArgumentError, "state name must be a Symbol (got #{new_start_state.inspect})"
|
|
18
|
+
@start_state = new_start_state
|
|
19
|
+
else
|
|
20
|
+
defined?(@start_state) or raise ArgumentError, "`start_state :<state>` must be declared before `new`"
|
|
21
|
+
@start_state
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# The valid states for this FSM, as a hash with state name symbols as keys and State objects as values.
|
|
26
|
+
def states
|
|
27
|
+
@states ||= {}
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Declare an FSM state and optionally provide a callback block to fire on state entry
|
|
31
|
+
# Options:
|
|
32
|
+
# * to: a state or array of states this state can transition to
|
|
33
|
+
def state(state_name, to: nil, &block)
|
|
34
|
+
state_name.is_a?(Symbol) or raise ArgumentError, "state name must be a Symbol (got #{state_name.inspect})"
|
|
35
|
+
states[state_name] = State.new(state_name, to, &block)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# NOTE: including classes must call initialize_fsm from their initialize method.
|
|
40
|
+
def initialize_fsm
|
|
41
|
+
@fsm_initialized = true
|
|
42
|
+
@state = self.class.start_state
|
|
43
|
+
@mutex = ::Mutex.new
|
|
44
|
+
@state_changed = ::ConditionVariable.new
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Current state of the FSM, stored as a symbol
|
|
48
|
+
attr_reader :state
|
|
49
|
+
|
|
50
|
+
# checks for one of the given states to wait for
|
|
51
|
+
# if not already, waits for a state change (up to timeout seconds--`nil` means infinite)
|
|
52
|
+
# returns truthy iff the transition to one of the desired state has occurred
|
|
53
|
+
def wait_for_state(*wait_for_states, timeout: nil)
|
|
54
|
+
wait_for_states.each do |state|
|
|
55
|
+
state.is_a?(Symbol) or raise ArgumentError, "states must be symbols (got #{state.inspect})"
|
|
56
|
+
end
|
|
57
|
+
@mutex.synchronize do
|
|
58
|
+
if !wait_for_states.include?(@state)
|
|
59
|
+
@state_changed.wait(@mutex, timeout)
|
|
60
|
+
end
|
|
61
|
+
wait_for_states.include?(@state)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
private
|
|
66
|
+
|
|
67
|
+
def transition(new_state_name)
|
|
68
|
+
new_state_name.is_a?(Symbol) or raise ArgumentError, "state name must be a Symbol (got #{new_state_name.inspect})"
|
|
69
|
+
if (new_state = validate_and_sanitize_new_state(new_state_name))
|
|
70
|
+
transition_with_callbacks!(new_state)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Low-level, immediate state transition with no checks or callbacks.
|
|
75
|
+
def transition!(new_state_name)
|
|
76
|
+
new_state_name.is_a?(Symbol) or raise ArgumentError, "state name must be a Symbol (got #{new_state_name.inspect})"
|
|
77
|
+
@fsm_initialized or raise ArgumentError, "FSM not initialized. You must call initialize_fsm from initialize!"
|
|
78
|
+
@mutex.synchronize do
|
|
79
|
+
yield if block_given?
|
|
80
|
+
@state = new_state_name
|
|
81
|
+
@state_changed.broadcast
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def validate_and_sanitize_new_state(new_state_name)
|
|
86
|
+
return nil if @state == new_state_name
|
|
87
|
+
|
|
88
|
+
if current_state && !current_state.valid_transition?(new_state_name)
|
|
89
|
+
valid = current_state.transitions.map(&:to_s).join(', ')
|
|
90
|
+
msg = "#{self.class} can't change state from '#{@state}' to '#{new_state_name}', only to: #{valid}"
|
|
91
|
+
raise ArgumentError, msg
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
unless (new_state = self.class.states[new_state_name])
|
|
95
|
+
new_state_name == self.class.start_state or raise ArgumentError, "invalid state for #{self.class}: #{new_state_name}"
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
new_state
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def transition_with_callbacks!(new_state)
|
|
102
|
+
transition! new_state.name
|
|
103
|
+
new_state.call(self)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def current_state
|
|
107
|
+
self.class.states[@state]
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
class State
|
|
111
|
+
attr_reader :name, :transitions
|
|
112
|
+
|
|
113
|
+
def initialize(name, transitions, &block)
|
|
114
|
+
@name = name
|
|
115
|
+
@block = block
|
|
116
|
+
@transitions = if transitions
|
|
117
|
+
Array(transitions).map(&:to_sym)
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def call(obj)
|
|
122
|
+
obj.instance_eval(&@block) if @block
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def valid_transition?(new_state)
|
|
126
|
+
# All transitions are allowed if none are expressly declared
|
|
127
|
+
!@transitions || @transitions.include?(new_state.to_sym)
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Listen
|
|
4
|
+
class Listener
|
|
5
|
+
class Config
|
|
6
|
+
DEFAULTS = {
|
|
7
|
+
# Listener options
|
|
8
|
+
debug: false, # TODO: is this broken?
|
|
9
|
+
wait_for_delay: nil, # NOTE: should be provided by adapter if possible
|
|
10
|
+
relative: false,
|
|
11
|
+
|
|
12
|
+
# Backend selecting options
|
|
13
|
+
force_polling: false,
|
|
14
|
+
polling_fallback_message: nil
|
|
15
|
+
}.freeze
|
|
16
|
+
|
|
17
|
+
def initialize(opts)
|
|
18
|
+
@options = DEFAULTS.merge(opts)
|
|
19
|
+
@relative = @options[:relative]
|
|
20
|
+
@min_delay_between_events = @options[:wait_for_delay]
|
|
21
|
+
@silencer_rules = @options # silencer will extract what it needs
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def relative?
|
|
25
|
+
@relative
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
attr_reader :min_delay_between_events, :silencer_rules
|
|
29
|
+
|
|
30
|
+
def adapter_instance_options(klass)
|
|
31
|
+
valid_keys = klass.const_get('DEFAULTS').keys
|
|
32
|
+
Hash[@options.select { |key, _| valid_keys.include?(key) }]
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def adapter_select_options
|
|
36
|
+
valid_keys = %w[force_polling polling_fallback_message].map(&:to_sym)
|
|
37
|
+
Hash[@options.select { |key, _| valid_keys.include?(key) }]
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'English'
|
|
4
|
+
|
|
5
|
+
require 'listen/version'
|
|
6
|
+
|
|
7
|
+
require 'listen/backend'
|
|
8
|
+
|
|
9
|
+
require 'listen/silencer'
|
|
10
|
+
require 'listen/silencer/controller'
|
|
11
|
+
|
|
12
|
+
require 'listen/queue_optimizer'
|
|
13
|
+
|
|
14
|
+
require 'listen/fsm'
|
|
15
|
+
|
|
16
|
+
require 'listen/event/loop'
|
|
17
|
+
require 'listen/event/queue'
|
|
18
|
+
require 'listen/event/config'
|
|
19
|
+
|
|
20
|
+
require 'listen/listener/config'
|
|
21
|
+
|
|
22
|
+
module Listen
|
|
23
|
+
class Listener
|
|
24
|
+
include Listen::FSM
|
|
25
|
+
|
|
26
|
+
# Initializes the directories listener.
|
|
27
|
+
#
|
|
28
|
+
# @param [String] directory the directories to listen to
|
|
29
|
+
# @param [Hash] options the listen options (see Listen::Listener::Options)
|
|
30
|
+
#
|
|
31
|
+
# @yield [modified, added, removed] the changed files
|
|
32
|
+
# @yieldparam [Array<String>] modified the list of modified files
|
|
33
|
+
# @yieldparam [Array<String>] added the list of added files
|
|
34
|
+
# @yieldparam [Array<String>] removed the list of removed files
|
|
35
|
+
#
|
|
36
|
+
# rubocop:disable Metrics/MethodLength
|
|
37
|
+
def initialize(*dirs, &block)
|
|
38
|
+
options = dirs.last.is_a?(Hash) ? dirs.pop : {}
|
|
39
|
+
|
|
40
|
+
@config = Config.new(options)
|
|
41
|
+
|
|
42
|
+
eq_config = Event::Queue::Config.new(@config.relative?)
|
|
43
|
+
queue = Event::Queue.new(eq_config)
|
|
44
|
+
|
|
45
|
+
silencer = Silencer.new
|
|
46
|
+
rules = @config.silencer_rules
|
|
47
|
+
@silencer_controller = Silencer::Controller.new(silencer, rules)
|
|
48
|
+
|
|
49
|
+
@backend = Backend.new(dirs, queue, silencer, @config)
|
|
50
|
+
|
|
51
|
+
optimizer_config = QueueOptimizer::Config.new(@backend, silencer)
|
|
52
|
+
|
|
53
|
+
pconfig = Event::Config.new(
|
|
54
|
+
self,
|
|
55
|
+
queue,
|
|
56
|
+
QueueOptimizer.new(optimizer_config),
|
|
57
|
+
@backend.min_delay_between_events,
|
|
58
|
+
&block)
|
|
59
|
+
|
|
60
|
+
@processor = Event::Loop.new(pconfig)
|
|
61
|
+
|
|
62
|
+
initialize_fsm
|
|
63
|
+
end
|
|
64
|
+
# rubocop:enable Metrics/MethodLength
|
|
65
|
+
|
|
66
|
+
start_state :initializing
|
|
67
|
+
|
|
68
|
+
state :initializing, to: [:backend_started, :stopped]
|
|
69
|
+
|
|
70
|
+
state :backend_started, to: [:processing_events, :stopped] do
|
|
71
|
+
@backend.start
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
state :processing_events, to: [:paused, :stopped] do
|
|
75
|
+
@processor.start
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
state :paused, to: [:processing_events, :stopped] do
|
|
79
|
+
@processor.pause
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
state :stopped, to: [:backend_started] do
|
|
83
|
+
@backend.stop # halt events ASAP
|
|
84
|
+
@processor.stop
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Starts processing events and starts adapters
|
|
88
|
+
# or resumes invoking callbacks if paused
|
|
89
|
+
def start
|
|
90
|
+
case state
|
|
91
|
+
when :initializing
|
|
92
|
+
transition :backend_started
|
|
93
|
+
transition :processing_events
|
|
94
|
+
when :paused
|
|
95
|
+
transition :processing_events
|
|
96
|
+
else
|
|
97
|
+
raise ArgumentError, "cannot start from state #{state.inspect}"
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Stops both listening for events and processing them
|
|
102
|
+
def stop
|
|
103
|
+
transition :stopped
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Stops invoking callbacks (messages pile up)
|
|
107
|
+
def pause
|
|
108
|
+
transition :paused
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# processing means callbacks are called
|
|
112
|
+
def processing?
|
|
113
|
+
state == :processing_events
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def paused?
|
|
117
|
+
state == :paused
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def stopped?
|
|
121
|
+
state == :stopped
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def ignore(regexps)
|
|
125
|
+
@silencer_controller.append_ignores(regexps)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def ignore!(regexps)
|
|
129
|
+
@silencer_controller.replace_with_bang_ignores(regexps)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def only(regexps)
|
|
133
|
+
@silencer_controller.replace_with_only(regexps)
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Listen
|
|
4
|
+
@logger = nil
|
|
5
|
+
|
|
6
|
+
# Listen.logger will always be present.
|
|
7
|
+
# If you don't want logging, set Listen.logger = ::Logger.new('/dev/null', level: ::Logger::UNKNOWN)
|
|
8
|
+
|
|
9
|
+
@adapter_warn_behavior = :warn
|
|
10
|
+
|
|
11
|
+
class << self
|
|
12
|
+
attr_writer :logger
|
|
13
|
+
attr_accessor :adapter_warn_behavior
|
|
14
|
+
|
|
15
|
+
def logger
|
|
16
|
+
@logger ||= default_logger
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def adapter_warn(message)
|
|
20
|
+
case ENV['LISTEN_GEM_ADAPTER_WARN_BEHAVIOR']&.to_sym || adapter_warn_behavior_callback(message)
|
|
21
|
+
when :log
|
|
22
|
+
logger.warn(message)
|
|
23
|
+
when :silent, nil, false
|
|
24
|
+
# do nothing
|
|
25
|
+
else # :warn
|
|
26
|
+
warn(message)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
def default_logger
|
|
33
|
+
level =
|
|
34
|
+
case ENV['LISTEN_GEM_DEBUGGING'].to_s
|
|
35
|
+
when /debug|2/i
|
|
36
|
+
::Logger::DEBUG
|
|
37
|
+
when /info|true|yes|1/i
|
|
38
|
+
::Logger::INFO
|
|
39
|
+
when /warn/i
|
|
40
|
+
::Logger::WARN
|
|
41
|
+
when /fatal/i
|
|
42
|
+
::Logger::FATAL
|
|
43
|
+
else
|
|
44
|
+
::Logger::ERROR
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
::Logger.new(STDERR, level: level)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def adapter_warn_behavior_callback(message)
|
|
51
|
+
if adapter_warn_behavior.respond_to?(:call)
|
|
52
|
+
case behavior = adapter_warn_behavior.call(message)
|
|
53
|
+
when Symbol
|
|
54
|
+
behavior
|
|
55
|
+
when false, nil
|
|
56
|
+
:silent
|
|
57
|
+
else
|
|
58
|
+
:warn
|
|
59
|
+
end
|
|
60
|
+
else
|
|
61
|
+
adapter_warn_behavior
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Listen
|
|
4
|
+
module MonotonicTime
|
|
5
|
+
class << self
|
|
6
|
+
if defined?(Process::CLOCK_MONOTONIC)
|
|
7
|
+
|
|
8
|
+
def now
|
|
9
|
+
Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
elsif defined?(Process::CLOCK_MONOTONIC_RAW)
|
|
13
|
+
|
|
14
|
+
def now
|
|
15
|
+
Process.clock_gettime(Process::CLOCK_MONOTONIC_RAW)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
else
|
|
19
|
+
|
|
20
|
+
def now
|
|
21
|
+
Time.now.to_f
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Listen
|
|
4
|
+
class Options
|
|
5
|
+
def initialize(opts, defaults)
|
|
6
|
+
@options = {}
|
|
7
|
+
given_options = opts.dup
|
|
8
|
+
defaults.each_key do |key|
|
|
9
|
+
@options[key] = given_options.delete(key) || defaults[key]
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
given_options.empty? or raise ArgumentError, "Unknown options: #{given_options.inspect}"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def respond_to_missing?(name, *_)
|
|
16
|
+
@options.has_key?(name)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def method_missing(name, *_)
|
|
20
|
+
respond_to_missing?(name) or raise NameError, "Bad option: #{name.inspect} (valid:#{@options.keys.inspect})"
|
|
21
|
+
@options[name]
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Listen
|
|
4
|
+
class QueueOptimizer
|
|
5
|
+
class Config
|
|
6
|
+
def initialize(adapter_class, silencer)
|
|
7
|
+
@adapter_class = adapter_class
|
|
8
|
+
@silencer = silencer
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def exist?(path)
|
|
12
|
+
Pathname(path).exist?
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def silenced?(path, type)
|
|
16
|
+
@silencer.silenced?(path, type)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def debug(*args, &block)
|
|
20
|
+
Listen.logger.debug(*args, &block)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def smoosh_changes(changes)
|
|
25
|
+
# TODO: adapter could be nil at this point (shutdown)
|
|
26
|
+
cookies = changes.group_by do |_, _, _, _, options|
|
|
27
|
+
(options || {})[:cookie]
|
|
28
|
+
end
|
|
29
|
+
_squash_changes(_reinterpret_related_changes(cookies))
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def initialize(config)
|
|
33
|
+
@config = config
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
attr_reader :config
|
|
39
|
+
|
|
40
|
+
# groups changes into the expected structure expected by
|
|
41
|
+
# clients
|
|
42
|
+
def _squash_changes(changes)
|
|
43
|
+
# We combine here for backward compatibility
|
|
44
|
+
# Newer clients should receive dir and path separately
|
|
45
|
+
changes = changes.map { |change, dir, path| [change, dir + path] }
|
|
46
|
+
|
|
47
|
+
actions = changes.group_by(&:last).map do |path, action_list|
|
|
48
|
+
[_logical_action_for(path, action_list.map(&:first)), path.to_s]
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
config.debug("listen: raw changes: #{actions.inspect}")
|
|
52
|
+
|
|
53
|
+
{ modified: [], added: [], removed: [] }.tap do |squashed|
|
|
54
|
+
actions.each do |type, path|
|
|
55
|
+
squashed[type] << path unless type.nil?
|
|
56
|
+
end
|
|
57
|
+
config.debug("listen: final changes: #{squashed.inspect}")
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def _logical_action_for(path, actions)
|
|
62
|
+
actions << :added if actions.delete(:moved_to)
|
|
63
|
+
actions << :removed if actions.delete(:moved_from)
|
|
64
|
+
|
|
65
|
+
modified = actions.find { |x| x == :modified }
|
|
66
|
+
_calculate_add_remove_difference(actions, path, modified)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def _calculate_add_remove_difference(actions, path, default_if_exists)
|
|
70
|
+
added = actions.count { |x| x == :added }
|
|
71
|
+
removed = actions.count { |x| x == :removed }
|
|
72
|
+
diff = added - removed
|
|
73
|
+
|
|
74
|
+
# TODO: avoid checking if path exists and instead assume the events are
|
|
75
|
+
# in order (if last is :removed, it doesn't exist, etc.)
|
|
76
|
+
if config.exist?(path)
|
|
77
|
+
if diff > 0
|
|
78
|
+
:added
|
|
79
|
+
elsif diff.zero? && added > 0
|
|
80
|
+
:modified
|
|
81
|
+
else
|
|
82
|
+
default_if_exists
|
|
83
|
+
end
|
|
84
|
+
else
|
|
85
|
+
diff < 0 ? :removed : nil
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# remove extraneous rb-inotify events, keeping them only if it's a possible
|
|
90
|
+
# editor rename() call (e.g. Kate and Sublime)
|
|
91
|
+
def _reinterpret_related_changes(cookies)
|
|
92
|
+
table = { moved_to: :added, moved_from: :removed }
|
|
93
|
+
cookies.flat_map do |_, changes|
|
|
94
|
+
if (editor_modified = editor_modified?(changes))
|
|
95
|
+
[[:modified, *editor_modified]]
|
|
96
|
+
else
|
|
97
|
+
not_silenced = changes.reject do |type, _, _, path, _|
|
|
98
|
+
config.silenced?(Pathname(path), type)
|
|
99
|
+
end
|
|
100
|
+
not_silenced.map do |_, change, dir, path, _|
|
|
101
|
+
[table.fetch(change, change), dir, path]
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def editor_modified?(changes)
|
|
108
|
+
return unless changes.size == 2
|
|
109
|
+
|
|
110
|
+
from_type = from = nil
|
|
111
|
+
to_type = to_dir = to = nil
|
|
112
|
+
|
|
113
|
+
changes.each do |data|
|
|
114
|
+
case data[1]
|
|
115
|
+
when :moved_from
|
|
116
|
+
from_type, _from_change, _, from, = data
|
|
117
|
+
when :moved_to
|
|
118
|
+
to_type, _to_change, to_dir, to, = data
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Expect an ignored moved_from and non-ignored moved_to
|
|
123
|
+
# to qualify as an "editor modify"
|
|
124
|
+
if from && to && config.silenced?(Pathname(from), from_type) && !config.silenced?(Pathname(to), to_type)
|
|
125
|
+
[to_dir, to]
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Listen
|
|
4
|
+
# @private api
|
|
5
|
+
class Record
|
|
6
|
+
# Represents a directory entry (dir or file)
|
|
7
|
+
class Entry
|
|
8
|
+
# file: "/home/me/watched_dir", "app/models", "foo.rb"
|
|
9
|
+
# dir, "/home/me/watched_dir", "."
|
|
10
|
+
def initialize(root, relative, name = nil)
|
|
11
|
+
@root = root
|
|
12
|
+
@relative = relative
|
|
13
|
+
@name = name
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
attr_reader :root, :relative, :name
|
|
17
|
+
|
|
18
|
+
def children
|
|
19
|
+
child_relative = _join
|
|
20
|
+
(_entries(sys_path) - %w[. ..]).map do |name|
|
|
21
|
+
Entry.new(@root, child_relative, name)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def meta
|
|
26
|
+
lstat = ::File.lstat(sys_path)
|
|
27
|
+
{ mtime: lstat.mtime.to_f, mode: lstat.mode, size: lstat.size }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# record hash is e.g.
|
|
31
|
+
# if @record["/home/me/watched_dir"]["project/app/models"]["foo.rb"]
|
|
32
|
+
# if @record["/home/me/watched_dir"]["project/app"]["models"]
|
|
33
|
+
# record_dir_key is "project/app/models"
|
|
34
|
+
def record_dir_key
|
|
35
|
+
::File.join(*[@relative, @name].compact)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def sys_path
|
|
39
|
+
# Use full path in case someone uses chdir
|
|
40
|
+
::File.join(*[@root, @relative, @name].compact)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def real_path
|
|
44
|
+
@real_path ||= ::File.realpath(sys_path)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
|
|
49
|
+
def _join
|
|
50
|
+
args = [@relative, @name].compact
|
|
51
|
+
args.empty? ? nil : ::File.join(*args)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def _entries(dir)
|
|
55
|
+
return Dir.entries(dir) unless RUBY_ENGINE == 'jruby'
|
|
56
|
+
|
|
57
|
+
# JRuby inconsistency workaround, see:
|
|
58
|
+
# https://github.com/jruby/jruby/issues/3840
|
|
59
|
+
exists = ::File.exist?(dir)
|
|
60
|
+
directory = ::File.directory?(dir)
|
|
61
|
+
return Dir.entries(dir) unless exists && !directory
|
|
62
|
+
raise Errno::ENOTDIR, dir
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'set'
|
|
4
|
+
require 'listen/error'
|
|
5
|
+
|
|
6
|
+
module Listen
|
|
7
|
+
# @private api
|
|
8
|
+
class Record
|
|
9
|
+
class SymlinkDetector
|
|
10
|
+
README_URL = 'https://github.com/guard/listen/blob/master/README.md'
|
|
11
|
+
|
|
12
|
+
SYMLINK_LOOP_ERROR = <<-EOS.freeze
|
|
13
|
+
** ERROR: directory is already being watched! **
|
|
14
|
+
|
|
15
|
+
Directory: %s
|
|
16
|
+
|
|
17
|
+
is already being watched through: %s
|
|
18
|
+
|
|
19
|
+
MORE INFO: #{README_URL}
|
|
20
|
+
EOS
|
|
21
|
+
|
|
22
|
+
Error = ::Listen::Error # for backward compatibility
|
|
23
|
+
|
|
24
|
+
def initialize
|
|
25
|
+
@real_dirs = Set.new
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def verify_unwatched!(entry)
|
|
29
|
+
real_path = entry.real_path
|
|
30
|
+
@real_dirs.add?(real_path) or _fail(entry.sys_path, real_path)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Leaving this stub here since some warning work-arounds were referring to it.
|
|
34
|
+
# Deprecated. Will be removed in Listen v4.0.
|
|
35
|
+
def warn(message)
|
|
36
|
+
Listen.adapter_warn(message)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
private
|
|
40
|
+
|
|
41
|
+
def _fail(symlinked, real_path)
|
|
42
|
+
warn(format(SYMLINK_LOOP_ERROR, symlinked, real_path))
|
|
43
|
+
raise ::Listen::Error::SymlinkLoop, 'Failed due to looped symlinks'
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|