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.
Files changed (329) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +1 -0
  3. data/dev.yml +5 -0
  4. data/exe/fluid +24 -0
  5. data/lib/fluid_cli/api.rb +135 -0
  6. data/lib/fluid_cli/assets/post_auth_page/index.html.erb +34 -0
  7. data/lib/fluid_cli/assets/post_auth_page/style.css +58 -0
  8. data/lib/fluid_cli/command.rb +55 -0
  9. data/lib/fluid_cli/commands/help.rb +21 -0
  10. data/lib/fluid_cli/commands/login.rb +30 -0
  11. data/lib/fluid_cli/commands/logout.rb +38 -0
  12. data/lib/fluid_cli/commands/switch.rb +23 -0
  13. data/lib/fluid_cli/commands/theme/common/company_helper.rb +15 -0
  14. data/lib/fluid_cli/commands/theme/common/root_helper.rb +95 -0
  15. data/lib/fluid_cli/commands/theme/dev.rb +61 -0
  16. data/lib/fluid_cli/commands/theme/help.rb +21 -0
  17. data/lib/fluid_cli/commands/theme/init.rb +46 -0
  18. data/lib/fluid_cli/commands/theme/pull.rb +68 -0
  19. data/lib/fluid_cli/commands/theme/push.rb +132 -0
  20. data/lib/fluid_cli/commands/theme.rb +23 -0
  21. data/lib/fluid_cli/commands/whoami.rb +23 -0
  22. data/lib/fluid_cli/commands.rb +19 -0
  23. data/lib/fluid_cli/company_switcher.rb +69 -0
  24. data/lib/fluid_cli/context.rb +691 -0
  25. data/lib/fluid_cli/db.rb +114 -0
  26. data/lib/fluid_cli/entry_point.rb +10 -0
  27. data/lib/fluid_cli/environment.rb +32 -0
  28. data/lib/fluid_cli/file_system_listener.rb +29 -0
  29. data/lib/fluid_cli/form.rb +42 -0
  30. data/lib/fluid_cli/git.rb +319 -0
  31. data/lib/fluid_cli/http_request.rb +54 -0
  32. data/lib/fluid_cli/identity_auth/servlet.rb +39 -0
  33. data/lib/fluid_cli/identity_auth.rb +126 -0
  34. data/lib/fluid_cli/options.rb +38 -0
  35. data/lib/fluid_cli/theme/dev_server/certificate_manager.rb +79 -0
  36. data/lib/fluid_cli/theme/dev_server/errors.rb +9 -0
  37. data/lib/fluid_cli/theme/dev_server/header_hash.rb +98 -0
  38. data/lib/fluid_cli/theme/dev_server/hooks/file_change_hook.rb +39 -0
  39. data/lib/fluid_cli/theme/dev_server/hot_reload/resources/hot-reload-no-script.html +27 -0
  40. data/lib/fluid_cli/theme/dev_server/hot_reload/resources/hot_reload.js +28 -0
  41. data/lib/fluid_cli/theme/dev_server/hot_reload/resources/sse_client.js +43 -0
  42. data/lib/fluid_cli/theme/dev_server/hot_reload/resources/theme.js +16 -0
  43. data/lib/fluid_cli/theme/dev_server/hot_reload/script_injector.rb +54 -0
  44. data/lib/fluid_cli/theme/dev_server/hot_reload.rb +75 -0
  45. data/lib/fluid_cli/theme/dev_server/local_assets.rb +92 -0
  46. data/lib/fluid_cli/theme/dev_server/proxy.rb +235 -0
  47. data/lib/fluid_cli/theme/dev_server/proxy_param_builder.rb +82 -0
  48. data/lib/fluid_cli/theme/dev_server/reload_mode.rb +34 -0
  49. data/lib/fluid_cli/theme/dev_server/sse.rb +75 -0
  50. data/lib/fluid_cli/theme/dev_server/watcher.rb +57 -0
  51. data/lib/fluid_cli/theme/dev_server/web_server.rb +140 -0
  52. data/lib/fluid_cli/theme/dev_server.rb +289 -0
  53. data/lib/fluid_cli/theme/development_theme.rb +101 -0
  54. data/lib/fluid_cli/theme/file.rb +105 -0
  55. data/lib/fluid_cli/theme/forms/select.rb +33 -0
  56. data/lib/fluid_cli/theme/mime_type.rb +34 -0
  57. data/lib/fluid_cli/theme/presenters/theme_presenter.rb +49 -0
  58. data/lib/fluid_cli/theme/presenters/themes_presenter.rb +31 -0
  59. data/lib/fluid_cli/theme/root.rb +62 -0
  60. data/lib/fluid_cli/theme/syncer/checksums.rb +66 -0
  61. data/lib/fluid_cli/theme/syncer/downloader.rb +54 -0
  62. data/lib/fluid_cli/theme/syncer/error_reporter.rb +45 -0
  63. data/lib/fluid_cli/theme/syncer/merger.rb +53 -0
  64. data/lib/fluid_cli/theme/syncer/operation.rb +58 -0
  65. data/lib/fluid_cli/theme/syncer/standard_reporter.rb +32 -0
  66. data/lib/fluid_cli/theme/syncer/unsupported_script_warning.rb +90 -0
  67. data/lib/fluid_cli/theme/syncer/uploader/forms/apply_to_all.rb +41 -0
  68. data/lib/fluid_cli/theme/syncer/uploader/forms/apply_to_all_form.rb +37 -0
  69. data/lib/fluid_cli/theme/syncer/uploader/forms/base_strategy_form.rb +64 -0
  70. data/lib/fluid_cli/theme/syncer/uploader/forms/select_delete_strategy.rb +29 -0
  71. data/lib/fluid_cli/theme/syncer/uploader/forms/select_update_strategy.rb +30 -0
  72. data/lib/fluid_cli/theme/syncer/uploader/json_delete_handler.rb +49 -0
  73. data/lib/fluid_cli/theme/syncer/uploader/json_update_handler.rb +71 -0
  74. data/lib/fluid_cli/theme/syncer/uploader.rb +105 -0
  75. data/lib/fluid_cli/theme/syncer.rb +412 -0
  76. data/lib/fluid_cli/theme/theme.rb +186 -0
  77. data/lib/fluid_cli/theme/ui/sync_progress_bar.rb +22 -0
  78. data/lib/fluid_cli/thread_pool/job.rb +35 -0
  79. data/lib/fluid_cli/thread_pool.rb +49 -0
  80. data/lib/fluid_cli/version.rb +3 -0
  81. data/lib/fluid_cli.rb +59 -0
  82. data/vendor/deps/base64/.document +5 -0
  83. data/vendor/deps/base64/.gitignore +9 -0
  84. data/vendor/deps/base64/BSDL +22 -0
  85. data/vendor/deps/base64/COPYING +56 -0
  86. data/vendor/deps/base64/Gemfile +9 -0
  87. data/vendor/deps/base64/LEGAL +60 -0
  88. data/vendor/deps/base64/README.md +48 -0
  89. data/vendor/deps/base64/Rakefile +31 -0
  90. data/vendor/deps/base64/base64.gemspec +28 -0
  91. data/vendor/deps/base64/bin/console +14 -0
  92. data/vendor/deps/base64/bin/setup +8 -0
  93. data/vendor/deps/base64/lib/base64.rb +382 -0
  94. data/vendor/deps/base64/sig/base64.rbs +358 -0
  95. data/vendor/deps/base64/test/base64/test_base64.rb +115 -0
  96. data/vendor/deps/base64/test_sig/test_base64.rb +44 -0
  97. data/vendor/deps/cli-kit/REVISION +1 -0
  98. data/vendor/deps/cli-kit/lib/cli/kit/args/definition.rb +286 -0
  99. data/vendor/deps/cli-kit/lib/cli/kit/args/evaluation.rb +215 -0
  100. data/vendor/deps/cli-kit/lib/cli/kit/args/parser/node.rb +128 -0
  101. data/vendor/deps/cli-kit/lib/cli/kit/args/parser.rb +125 -0
  102. data/vendor/deps/cli-kit/lib/cli/kit/args/tokenizer.rb +130 -0
  103. data/vendor/deps/cli-kit/lib/cli/kit/args.rb +16 -0
  104. data/vendor/deps/cli-kit/lib/cli/kit/base_command.rb +30 -0
  105. data/vendor/deps/cli-kit/lib/cli/kit/command_help.rb +268 -0
  106. data/vendor/deps/cli-kit/lib/cli/kit/command_registry.rb +150 -0
  107. data/vendor/deps/cli-kit/lib/cli/kit/config.rb +137 -0
  108. data/vendor/deps/cli-kit/lib/cli/kit/core_ext.rb +28 -0
  109. data/vendor/deps/cli-kit/lib/cli/kit/error_handler.rb +166 -0
  110. data/vendor/deps/cli-kit/lib/cli/kit/executor.rb +92 -0
  111. data/vendor/deps/cli-kit/lib/cli/kit/ini.rb +91 -0
  112. data/vendor/deps/cli-kit/lib/cli/kit/levenshtein.rb +92 -0
  113. data/vendor/deps/cli-kit/lib/cli/kit/logger.rb +94 -0
  114. data/vendor/deps/cli-kit/lib/cli/kit/opts.rb +248 -0
  115. data/vendor/deps/cli-kit/lib/cli/kit/parse_args.rb +55 -0
  116. data/vendor/deps/cli-kit/lib/cli/kit/resolver.rb +66 -0
  117. data/vendor/deps/cli-kit/lib/cli/kit/support/test_helper.rb +260 -0
  118. data/vendor/deps/cli-kit/lib/cli/kit/support.rb +11 -0
  119. data/vendor/deps/cli-kit/lib/cli/kit/system.rb +290 -0
  120. data/vendor/deps/cli-kit/lib/cli/kit/util.rb +118 -0
  121. data/vendor/deps/cli-kit/lib/cli/kit/version.rb +7 -0
  122. data/vendor/deps/cli-kit/lib/cli/kit.rb +139 -0
  123. data/vendor/deps/cli-ui/REVISION +1 -0
  124. data/vendor/deps/cli-ui/lib/cli/ui/ansi.rb +218 -0
  125. data/vendor/deps/cli-ui/lib/cli/ui/color.rb +101 -0
  126. data/vendor/deps/cli-ui/lib/cli/ui/formatter.rb +219 -0
  127. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_stack.rb +67 -0
  128. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/box.rb +179 -0
  129. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/bracket.rb +152 -0
  130. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style.rb +127 -0
  131. data/vendor/deps/cli-ui/lib/cli/ui/frame.rb +286 -0
  132. data/vendor/deps/cli-ui/lib/cli/ui/glyph.rb +92 -0
  133. data/vendor/deps/cli-ui/lib/cli/ui/os.rb +63 -0
  134. data/vendor/deps/cli-ui/lib/cli/ui/printer.rb +64 -0
  135. data/vendor/deps/cli-ui/lib/cli/ui/progress.rb +132 -0
  136. data/vendor/deps/cli-ui/lib/cli/ui/progress_reporter.rb +209 -0
  137. data/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +583 -0
  138. data/vendor/deps/cli-ui/lib/cli/ui/prompt/options_handler.rb +36 -0
  139. data/vendor/deps/cli-ui/lib/cli/ui/prompt.rb +381 -0
  140. data/vendor/deps/cli-ui/lib/cli/ui/spinner/async.rb +48 -0
  141. data/vendor/deps/cli-ui/lib/cli/ui/spinner/spin_group.rb +602 -0
  142. data/vendor/deps/cli-ui/lib/cli/ui/spinner.rb +79 -0
  143. data/vendor/deps/cli-ui/lib/cli/ui/stdout_router.rb +399 -0
  144. data/vendor/deps/cli-ui/lib/cli/ui/table.rb +83 -0
  145. data/vendor/deps/cli-ui/lib/cli/ui/terminal.rb +55 -0
  146. data/vendor/deps/cli-ui/lib/cli/ui/truncater.rb +106 -0
  147. data/vendor/deps/cli-ui/lib/cli/ui/version.rb +8 -0
  148. data/vendor/deps/cli-ui/lib/cli/ui/widgets/base.rb +46 -0
  149. data/vendor/deps/cli-ui/lib/cli/ui/widgets/status.rb +79 -0
  150. data/vendor/deps/cli-ui/lib/cli/ui/widgets.rb +89 -0
  151. data/vendor/deps/cli-ui/lib/cli/ui/work_queue.rb +142 -0
  152. data/vendor/deps/cli-ui/lib/cli/ui/wrap.rb +61 -0
  153. data/vendor/deps/cli-ui/lib/cli/ui.rb +359 -0
  154. data/vendor/deps/cli-ui/vendor/reentrant_mutex.rb +78 -0
  155. data/vendor/deps/debug/CONTRIBUTING.md +573 -0
  156. data/vendor/deps/debug/Gemfile +10 -0
  157. data/vendor/deps/debug/LICENSE.txt +22 -0
  158. data/vendor/deps/debug/README.md +996 -0
  159. data/vendor/deps/debug/Rakefile +57 -0
  160. data/vendor/deps/debug/TODO.md +23 -0
  161. data/vendor/deps/debug/debug.gemspec +33 -0
  162. data/vendor/deps/debug/exe/rdbg +53 -0
  163. data/vendor/deps/debug/ext/debug/Makefile +273 -0
  164. data/vendor/deps/debug/ext/debug/debug.c +228 -0
  165. data/vendor/deps/debug/ext/debug/debug_version.h +1 -0
  166. data/vendor/deps/debug/ext/debug/extconf.rb +27 -0
  167. data/vendor/deps/debug/ext/debug/iseq_collector.c +93 -0
  168. data/vendor/deps/debug/lib/debug/abbrev_command.rb +77 -0
  169. data/vendor/deps/debug/lib/debug/breakpoint.rb +556 -0
  170. data/vendor/deps/debug/lib/debug/client.rb +263 -0
  171. data/vendor/deps/debug/lib/debug/color.rb +123 -0
  172. data/vendor/deps/debug/lib/debug/config.rb +592 -0
  173. data/vendor/deps/debug/lib/debug/console.rb +224 -0
  174. data/vendor/deps/debug/lib/debug/dap_custom/traceInspector.rb +336 -0
  175. data/vendor/deps/debug/lib/debug/debug.bundle +0 -0
  176. data/vendor/deps/debug/lib/debug/frame_info.rb +190 -0
  177. data/vendor/deps/debug/lib/debug/irb_integration.rb +37 -0
  178. data/vendor/deps/debug/lib/debug/local.rb +115 -0
  179. data/vendor/deps/debug/lib/debug/open.rb +13 -0
  180. data/vendor/deps/debug/lib/debug/open_nonstop.rb +15 -0
  181. data/vendor/deps/debug/lib/debug/prelude.rb +50 -0
  182. data/vendor/deps/debug/lib/debug/server.rb +534 -0
  183. data/vendor/deps/debug/lib/debug/server_cdp.rb +1348 -0
  184. data/vendor/deps/debug/lib/debug/server_dap.rb +1108 -0
  185. data/vendor/deps/debug/lib/debug/session.rb +2667 -0
  186. data/vendor/deps/debug/lib/debug/source_repository.rb +150 -0
  187. data/vendor/deps/debug/lib/debug/start.rb +5 -0
  188. data/vendor/deps/debug/lib/debug/thread_client.rb +1457 -0
  189. data/vendor/deps/debug/lib/debug/tracer.rb +241 -0
  190. data/vendor/deps/debug/lib/debug/version.rb +5 -0
  191. data/vendor/deps/debug/lib/debug.rb +9 -0
  192. data/vendor/deps/debug/misc/README.md.erb +660 -0
  193. data/vendor/deps/listen/.github/release-drafter.yml +17 -0
  194. data/vendor/deps/listen/.github/workflows/development.yml +67 -0
  195. data/vendor/deps/listen/.github/workflows/push.yml +12 -0
  196. data/vendor/deps/listen/.gitignore +28 -0
  197. data/vendor/deps/listen/.rspec +3 -0
  198. data/vendor/deps/listen/.rubocop.yml +283 -0
  199. data/vendor/deps/listen/.yardopts +11 -0
  200. data/vendor/deps/listen/CHANGELOG.md +1 -0
  201. data/vendor/deps/listen/CONTRIBUTING.md +45 -0
  202. data/vendor/deps/listen/Gemfile +33 -0
  203. data/vendor/deps/listen/Guardfile +26 -0
  204. data/vendor/deps/listen/LICENSE.txt +22 -0
  205. data/vendor/deps/listen/README.md +490 -0
  206. data/vendor/deps/listen/Rakefile +154 -0
  207. data/vendor/deps/listen/bin/listen +11 -0
  208. data/vendor/deps/listen/lib/listen/adapter/base.rb +129 -0
  209. data/vendor/deps/listen/lib/listen/adapter/bsd.rb +104 -0
  210. data/vendor/deps/listen/lib/listen/adapter/config.rb +31 -0
  211. data/vendor/deps/listen/lib/listen/adapter/darwin.rb +77 -0
  212. data/vendor/deps/listen/lib/listen/adapter/linux.rb +108 -0
  213. data/vendor/deps/listen/lib/listen/adapter/polling.rb +40 -0
  214. data/vendor/deps/listen/lib/listen/adapter/windows.rb +96 -0
  215. data/vendor/deps/listen/lib/listen/adapter.rb +43 -0
  216. data/vendor/deps/listen/lib/listen/backend.rb +40 -0
  217. data/vendor/deps/listen/lib/listen/change.rb +69 -0
  218. data/vendor/deps/listen/lib/listen/cli.rb +65 -0
  219. data/vendor/deps/listen/lib/listen/directory.rb +93 -0
  220. data/vendor/deps/listen/lib/listen/error.rb +11 -0
  221. data/vendor/deps/listen/lib/listen/event/config.rb +39 -0
  222. data/vendor/deps/listen/lib/listen/event/loop.rb +92 -0
  223. data/vendor/deps/listen/lib/listen/event/processor.rb +128 -0
  224. data/vendor/deps/listen/lib/listen/event/queue.rb +52 -0
  225. data/vendor/deps/listen/lib/listen/file.rb +95 -0
  226. data/vendor/deps/listen/lib/listen/fsm.rb +131 -0
  227. data/vendor/deps/listen/lib/listen/listener/config.rb +41 -0
  228. data/vendor/deps/listen/lib/listen/listener.rb +136 -0
  229. data/vendor/deps/listen/lib/listen/logger.rb +65 -0
  230. data/vendor/deps/listen/lib/listen/monotonic_time.rb +27 -0
  231. data/vendor/deps/listen/lib/listen/options.rb +24 -0
  232. data/vendor/deps/listen/lib/listen/queue_optimizer.rb +129 -0
  233. data/vendor/deps/listen/lib/listen/record/entry.rb +66 -0
  234. data/vendor/deps/listen/lib/listen/record/symlink_detector.rb +47 -0
  235. data/vendor/deps/listen/lib/listen/record.rb +122 -0
  236. data/vendor/deps/listen/lib/listen/silencer/controller.rb +50 -0
  237. data/vendor/deps/listen/lib/listen/silencer.rb +106 -0
  238. data/vendor/deps/listen/lib/listen/thread.rb +54 -0
  239. data/vendor/deps/listen/lib/listen/version.rb +5 -0
  240. data/vendor/deps/listen/lib/listen.rb +47 -0
  241. data/vendor/deps/listen/listen.gemspec +40 -0
  242. data/vendor/deps/listen/spec/acceptance/listen_spec.rb +320 -0
  243. data/vendor/deps/listen/spec/lib/listen/adapter/base_spec.rb +101 -0
  244. data/vendor/deps/listen/spec/lib/listen/adapter/bsd_spec.rb +13 -0
  245. data/vendor/deps/listen/spec/lib/listen/adapter/config_spec.rb +122 -0
  246. data/vendor/deps/listen/spec/lib/listen/adapter/darwin_spec.rb +82 -0
  247. data/vendor/deps/listen/spec/lib/listen/adapter/linux_spec.rb +199 -0
  248. data/vendor/deps/listen/spec/lib/listen/adapter/polling_spec.rb +83 -0
  249. data/vendor/deps/listen/spec/lib/listen/adapter/windows_spec.rb +13 -0
  250. data/vendor/deps/listen/spec/lib/listen/adapter_spec.rb +69 -0
  251. data/vendor/deps/listen/spec/lib/listen/backend_spec.rb +82 -0
  252. data/vendor/deps/listen/spec/lib/listen/change_spec.rb +102 -0
  253. data/vendor/deps/listen/spec/lib/listen/cli_spec.rb +116 -0
  254. data/vendor/deps/listen/spec/lib/listen/directory_spec.rb +284 -0
  255. data/vendor/deps/listen/spec/lib/listen/event/config_spec.rb +33 -0
  256. data/vendor/deps/listen/spec/lib/listen/event/loop_spec.rb +118 -0
  257. data/vendor/deps/listen/spec/lib/listen/event/processor_spec.rb +250 -0
  258. data/vendor/deps/listen/spec/lib/listen/event/queue_spec.rb +118 -0
  259. data/vendor/deps/listen/spec/lib/listen/file_spec.rb +254 -0
  260. data/vendor/deps/listen/spec/lib/listen/fsm_spec.rb +147 -0
  261. data/vendor/deps/listen/spec/lib/listen/listener/config_spec.rb +29 -0
  262. data/vendor/deps/listen/spec/lib/listen/listener_spec.rb +321 -0
  263. data/vendor/deps/listen/spec/lib/listen/logger_spec.rb +212 -0
  264. data/vendor/deps/listen/spec/lib/listen/monotonic_time_spec.rb +58 -0
  265. data/vendor/deps/listen/spec/lib/listen/queue_optimizer_spec.rb +111 -0
  266. data/vendor/deps/listen/spec/lib/listen/record_spec.rb +424 -0
  267. data/vendor/deps/listen/spec/lib/listen/silencer/controller_spec.rb +97 -0
  268. data/vendor/deps/listen/spec/lib/listen/silencer_spec.rb +109 -0
  269. data/vendor/deps/listen/spec/lib/listen/thread_spec.rb +133 -0
  270. data/vendor/deps/listen/spec/lib/listen_spec.rb +25 -0
  271. data/vendor/deps/listen/spec/spec_helper.rb +49 -0
  272. data/vendor/deps/listen/spec/support/acceptance_helper.rb +260 -0
  273. data/vendor/deps/listen/spec/support/fixtures_helper.rb +32 -0
  274. data/vendor/deps/listen/spec/support/platform_helper.rb +17 -0
  275. data/vendor/deps/observer/.github/dependabot.yml +6 -0
  276. data/vendor/deps/observer/.github/workflows/test.yml +33 -0
  277. data/vendor/deps/observer/.gitignore +8 -0
  278. data/vendor/deps/observer/BSDL +22 -0
  279. data/vendor/deps/observer/COPYING +56 -0
  280. data/vendor/deps/observer/Gemfile +9 -0
  281. data/vendor/deps/observer/README.md +139 -0
  282. data/vendor/deps/observer/Rakefile +10 -0
  283. data/vendor/deps/observer/bin/console +14 -0
  284. data/vendor/deps/observer/bin/setup +8 -0
  285. data/vendor/deps/observer/lib/observer.rb +229 -0
  286. data/vendor/deps/observer/observer.gemspec +32 -0
  287. data/vendor/deps/observer/test/test_observer.rb +66 -0
  288. data/vendor/deps/webrick/.gitignore +9 -0
  289. data/vendor/deps/webrick/Gemfile +3 -0
  290. data/vendor/deps/webrick/LICENSE.txt +22 -0
  291. data/vendor/deps/webrick/README.md +61 -0
  292. data/vendor/deps/webrick/Rakefile +10 -0
  293. data/vendor/deps/webrick/lib/webrick/accesslog.rb +157 -0
  294. data/vendor/deps/webrick/lib/webrick/cgi.rb +313 -0
  295. data/vendor/deps/webrick/lib/webrick/compat.rb +36 -0
  296. data/vendor/deps/webrick/lib/webrick/config.rb +158 -0
  297. data/vendor/deps/webrick/lib/webrick/cookie.rb +172 -0
  298. data/vendor/deps/webrick/lib/webrick/htmlutils.rb +30 -0
  299. data/vendor/deps/webrick/lib/webrick/httpauth/authenticator.rb +117 -0
  300. data/vendor/deps/webrick/lib/webrick/httpauth/basicauth.rb +116 -0
  301. data/vendor/deps/webrick/lib/webrick/httpauth/digestauth.rb +395 -0
  302. data/vendor/deps/webrick/lib/webrick/httpauth/htdigest.rb +132 -0
  303. data/vendor/deps/webrick/lib/webrick/httpauth/htgroup.rb +97 -0
  304. data/vendor/deps/webrick/lib/webrick/httpauth/htpasswd.rb +158 -0
  305. data/vendor/deps/webrick/lib/webrick/httpauth/userdb.rb +53 -0
  306. data/vendor/deps/webrick/lib/webrick/httpauth.rb +96 -0
  307. data/vendor/deps/webrick/lib/webrick/httpproxy.rb +354 -0
  308. data/vendor/deps/webrick/lib/webrick/httprequest.rb +636 -0
  309. data/vendor/deps/webrick/lib/webrick/httpresponse.rb +564 -0
  310. data/vendor/deps/webrick/lib/webrick/https.rb +152 -0
  311. data/vendor/deps/webrick/lib/webrick/httpserver.rb +294 -0
  312. data/vendor/deps/webrick/lib/webrick/httpservlet/abstract.rb +152 -0
  313. data/vendor/deps/webrick/lib/webrick/httpservlet/cgi_runner.rb +47 -0
  314. data/vendor/deps/webrick/lib/webrick/httpservlet/cgihandler.rb +126 -0
  315. data/vendor/deps/webrick/lib/webrick/httpservlet/erbhandler.rb +88 -0
  316. data/vendor/deps/webrick/lib/webrick/httpservlet/filehandler.rb +552 -0
  317. data/vendor/deps/webrick/lib/webrick/httpservlet/prochandler.rb +47 -0
  318. data/vendor/deps/webrick/lib/webrick/httpservlet.rb +23 -0
  319. data/vendor/deps/webrick/lib/webrick/httpstatus.rb +194 -0
  320. data/vendor/deps/webrick/lib/webrick/httputils.rb +512 -0
  321. data/vendor/deps/webrick/lib/webrick/httpversion.rb +76 -0
  322. data/vendor/deps/webrick/lib/webrick/log.rb +156 -0
  323. data/vendor/deps/webrick/lib/webrick/server.rb +381 -0
  324. data/vendor/deps/webrick/lib/webrick/ssl.rb +215 -0
  325. data/vendor/deps/webrick/lib/webrick/utils.rb +265 -0
  326. data/vendor/deps/webrick/lib/webrick/version.rb +18 -0
  327. data/vendor/deps/webrick/lib/webrick.rb +232 -0
  328. data/vendor/deps/webrick/webrick.gemspec +74 -0
  329. metadata +412 -0
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base_strategy_form"
4
+
5
+ module FluidCLI
6
+ module Theme
7
+ class Syncer
8
+ class Uploader
9
+ module Forms
10
+ class SelectDeleteStrategy < BaseStrategyForm
11
+ flag_arguments :file
12
+
13
+ def strategies
14
+ %i[
15
+ delete
16
+ restore
17
+ exit
18
+ ]
19
+ end
20
+
21
+ def prefix
22
+ "theme.serve.syncer.forms.delete_strategy"
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base_strategy_form"
4
+
5
+ module FluidCLI
6
+ module Theme
7
+ class Syncer
8
+ class Uploader
9
+ module Forms
10
+ class SelectUpdateStrategy < BaseStrategyForm
11
+ flag_arguments :file, :exists_remotely
12
+
13
+ def strategies
14
+ %i[
15
+ keep_remote
16
+ keep_local
17
+ union_merge
18
+ exit
19
+ ]
20
+ end
21
+
22
+ def prefix
23
+ "theme.serve.syncer.forms.#{exists_remotely ? "update_strategy" : "update_remote_deleted_strategy"}"
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "forms/apply_to_all"
4
+ require_relative "forms/select_delete_strategy"
5
+
6
+ module FluidCLI
7
+ module Theme
8
+ class Syncer
9
+ class Uploader
10
+ module JsonDeleteHandler
11
+ def enqueue_json_deletes(files)
12
+ return enqueue_deletes(files) if overwrite_json?
13
+
14
+ # Handle conflicts when JSON files cannot be overwritten
15
+ handle_delete_conflicts(files)
16
+ end
17
+
18
+ private
19
+
20
+ def handle_delete_conflicts(files)
21
+ to_delete = []
22
+ to_get = []
23
+
24
+ apply_to_all = Forms::ApplyToAll.new(ctx, files.size)
25
+
26
+ files.each do |file|
27
+ delete_strategy = apply_to_all.value || ask_delete_strategy(file)
28
+ apply_to_all.apply?(delete_strategy)
29
+
30
+ case delete_strategy
31
+ when :delete
32
+ to_delete << file
33
+ when :restore
34
+ to_get << file
35
+ end
36
+ end
37
+
38
+ enqueue_deletes(to_delete)
39
+ enqueue_get(to_get)
40
+ end
41
+
42
+ def ask_delete_strategy(file)
43
+ Forms::SelectDeleteStrategy.ask(ctx, [], file: file).strategy
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "forms/apply_to_all"
4
+ require_relative "forms/select_update_strategy"
5
+
6
+ module FluidCLI
7
+ module Theme
8
+ class Syncer
9
+ class Uploader
10
+ module JsonUpdateHandler
11
+ def enqueue_json_updates(files)
12
+ return enqueue_updates(files) if overwrite_json?
13
+
14
+ # Handle conflicts when JSON files cannot be overwritten
15
+ handle_update_conflicts(files)
16
+ end
17
+
18
+ private
19
+
20
+ def handle_update_conflicts(files)
21
+ to_get = []
22
+ to_delete = []
23
+ to_update = []
24
+ to_union_merge = []
25
+
26
+ apply_to_all = Forms::ApplyToAll.new(ctx, files.size)
27
+
28
+ files.each do |file|
29
+ update_strategy = apply_to_all.value || ask_update_strategy(file)
30
+ apply_to_all.apply?(update_strategy)
31
+
32
+ case update_strategy
33
+ when :keep_remote
34
+ if file_exist_remotely?(file)
35
+ to_get << file
36
+ else
37
+ delete_locally(file)
38
+ end
39
+ when :keep_local
40
+ to_update << file
41
+ when :union_merge
42
+ if file_exist_remotely?(file)
43
+ to_union_merge << file
44
+ else
45
+ to_update << file
46
+ end
47
+ end
48
+ end
49
+
50
+ enqueue_get(to_get)
51
+ enqueue_deletes(to_delete)
52
+ enqueue_updates(to_update)
53
+ enqueue_union_merges(to_union_merge)
54
+ end
55
+
56
+ def file_exist_remotely?(file)
57
+ !checksums[file.relative_path].nil?
58
+ end
59
+
60
+ def delete_locally(file)
61
+ ::File.delete(file.absolute_path)
62
+ end
63
+
64
+ def ask_update_strategy(file)
65
+ Forms::SelectUpdateStrategy.ask(ctx, [], file: file, exists_remotely: file_exist_remotely?(file)).strategy
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "forwardable"
4
+
5
+ require_relative "uploader/json_delete_handler"
6
+ require_relative "uploader/json_update_handler"
7
+
8
+ module FluidCLI
9
+ module Theme
10
+ class Syncer
11
+ class Uploader
12
+ extend Forwardable
13
+
14
+ include JsonDeleteHandler
15
+ include JsonUpdateHandler
16
+
17
+ attr_reader :syncer
18
+
19
+ def_delegators :syncer,
20
+ # helpers
21
+ :ctx,
22
+ :api_client,
23
+ :theme,
24
+ :overwrite_json?,
25
+ # enqueue
26
+ :enqueue_deletes,
27
+ :enqueue_get,
28
+ :enqueue_union_merges,
29
+ :enqueue_updates,
30
+ # checksums
31
+ :checksums,
32
+ :update_checksums,
33
+ :fetch_checksums!,
34
+ :wait!
35
+
36
+ def initialize(syncer, delete, delay_low_priority_files, &update_progress_bar_block)
37
+ @syncer = syncer
38
+ @delete = delete
39
+ @delay_low_priority_files = delay_low_priority_files
40
+ @update_progress_bar_block = update_progress_bar_block
41
+ @progress_bar_mutex = Mutex.new
42
+ end
43
+
44
+ def upload!
45
+ fetch_checksums!
46
+ delete_files!
47
+ async_upload!
48
+ end
49
+
50
+ def delete_files!
51
+ return unless delete?
52
+
53
+ files_present_remotely = checksums.keys
54
+ files_present_locally = theme.theme_files.map(&:relative_path)
55
+
56
+ files_to_delete = (files_present_remotely - files_present_locally)
57
+ .map { |file| theme[file] }
58
+
59
+ enqueue_deletes(files_to_delete)
60
+ end
61
+
62
+ private
63
+
64
+ def async_upload!
65
+ enqueue_updates(files)
66
+ wait!(&@update_progress_bar_block)
67
+ end
68
+
69
+ def delete?
70
+ @delete
71
+ end
72
+
73
+ def delay_low_priority_files?
74
+ @delay_low_priority_files
75
+ end
76
+
77
+ # Files
78
+
79
+ def files
80
+ @files ||= begin
81
+ theme.theme_files.select { |file| uploadable?(file) }
82
+ end
83
+ end
84
+
85
+ def uploadable?(file)
86
+ return false unless file.exist?
87
+
88
+ checksums.file_has_changed?(file)
89
+ end
90
+
91
+ # Handler errors
92
+
93
+ def report(file, error)
94
+ file_path = file.relative_path
95
+ error_message = syncer
96
+ .parse_api_errors(file, error)
97
+ .map { |msg| "#{file_path}: #{msg}" }
98
+ .join("\n")
99
+
100
+ syncer.report_file_error(file, error_message)
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,412 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "thread"
4
+ require "json"
5
+ require "base64"
6
+ require "forwardable"
7
+
8
+ require_relative "syncer/checksums"
9
+ require_relative "syncer/downloader"
10
+ require_relative "syncer/error_reporter"
11
+ require_relative "syncer/merger"
12
+ require_relative "syncer/operation"
13
+ require_relative "syncer/standard_reporter"
14
+ require_relative "syncer/unsupported_script_warning"
15
+ require "fluid_cli/theme/syncer/uploader"
16
+
17
+ module FluidCLI
18
+ module Theme
19
+ class Syncer
20
+ extend Forwardable
21
+
22
+ QUEUEABLE_METHODS = [
23
+ :get, # - Updates the local file with the remote file content
24
+ :update, # - Updates the remote file with the local file content
25
+ :delete, # - Deletes the remote file
26
+ :union_merge, # - Union merges the local file content with the remote file content,
27
+ :get_asset, # - Downloads a binary asset from a given URL
28
+ ]
29
+
30
+ attr_reader :ctx, :theme, :checksums, :error_checksums, :api_client, :pending, :standard_reporter
31
+
32
+ def_delegators :@error_reporter, :has_any_error?
33
+
34
+ def initialize(ctx, theme:, overwrite_json: true)
35
+ @ctx = ctx
36
+ @theme = theme
37
+ @overwrite_json = overwrite_json
38
+ @error_reporter = ErrorReporter.new(ctx)
39
+ @standard_reporter = StandardReporter.new(ctx)
40
+ @reporters = [@error_reporter, @standard_reporter]
41
+
42
+ # Queue of `Operation`s waiting to be picked up from a thread for processing.
43
+ @queue = Queue.new
44
+
45
+ # `Operation`s will be removed from this Array completed.
46
+ @pending = []
47
+
48
+ # Thread making the API requests.
49
+ @threads = []
50
+
51
+ # Latest theme assets checksums. Updated on each upload.
52
+ @checksums = Checksums.new(theme)
53
+
54
+ # Checksums of assets with errors.
55
+ @error_checksums = []
56
+
57
+ # Initialize `api_client` on main thread
58
+ @api_client = FluidCLI::API.new(ctx)
59
+ end
60
+
61
+ def lock_io!
62
+ @reporters.each(&:disable!)
63
+ end
64
+
65
+ def unlock_io!
66
+ @reporters.each(&:enable!)
67
+ end
68
+
69
+ def enqueue_updates(files)
70
+ files.each { |file| enqueue(:update, file) }
71
+ end
72
+
73
+ def enqueue_get(files)
74
+ files.each { |file| enqueue(:get, file) }
75
+ end
76
+
77
+ def enqueue_deletes(files)
78
+ files.each { |file| enqueue(:delete, file) }
79
+ end
80
+
81
+ def enqueue_union_merges(files)
82
+ files.each { |file| enqueue(:union_merge, file) }
83
+ end
84
+
85
+ def size
86
+ @pending.size
87
+ end
88
+
89
+ def empty?
90
+ @pending.empty?
91
+ end
92
+
93
+ def pending_updates
94
+ @pending.select { |op| op.method == :update }.map(&:file)
95
+ end
96
+
97
+ def remote_file?(file)
98
+ checksums.has?(file)
99
+ end
100
+
101
+ def broken_file?(file)
102
+ error_checksums.include?(checksums[file.relative_path])
103
+ end
104
+
105
+ def wait!
106
+ raise ThreadError, "No syncer threads" if @threads.empty?
107
+
108
+ total = size
109
+ last_size = size
110
+ until empty? || @queue.closed?
111
+ if block_given? && last_size != size
112
+ yield size, total
113
+ last_size = size
114
+ end
115
+ Thread.pass
116
+ end
117
+ end
118
+
119
+ def fetch_checksums!
120
+ _status, response = api_client.get(
121
+ path: "application_themes/#{theme.id}/resources"
122
+ )
123
+ update_checksums(response["application_theme_resources"])
124
+ end
125
+
126
+
127
+ def get_theme_resources!
128
+ _status, response = api_client.get(
129
+ path: "application_themes/#{theme.id}/resources"
130
+ )
131
+ update_checksums(response["application_theme_resources"])
132
+
133
+ response["application_theme_resources"].each do |resource|
134
+ file = theme[resource["key"]]
135
+ next unless file
136
+
137
+ if resource["resource_type"] == "FileResource" && !file.text?
138
+ enqueue(:get_asset, file, { url: resource["url"] })
139
+ else
140
+ file.write(resource["content"])
141
+ end
142
+ end
143
+ end
144
+
145
+ def shutdown
146
+ @queue.close unless @queue.closed?
147
+ ensure
148
+ @threads.each { |thread| thread.join if thread.alive? }
149
+ end
150
+
151
+ def start_threads(count = 2)
152
+ count.times do
153
+ @threads << Thread.new do
154
+ loop do
155
+ operation = @queue.pop
156
+ break if operation.nil? # shutdown was called
157
+
158
+ perform(operation)
159
+ rescue Exception => e # rubocop:disable Lint/RescueException
160
+ error_suffix = ": #{e}"
161
+ error_suffix += + "\n\t#{e.backtrace.join("\n\t")}" if @ctx.debug?
162
+ report_error(operation, error_suffix)
163
+ end
164
+ end
165
+ end
166
+ end
167
+
168
+ def upload_theme!(delay_low_priority_files: false, delete: true, &block)
169
+ uploader = Uploader.new(self, delete, delay_low_priority_files, &block)
170
+ uploader.upload!
171
+ end
172
+
173
+ def download_theme!(delete: true, &block)
174
+ downloader = Downloader.new(self, delete, &block)
175
+ downloader.download!
176
+ end
177
+
178
+ def enqueueable?(operation)
179
+ file = operation.file
180
+ method = operation.method
181
+
182
+ # Already enqueued or ignored
183
+ return false if @pending.include?(operation)
184
+ if [:update, :get].include?(method) && file.exist?
185
+ # File is fixed (and it has been never updated)
186
+ if !!@error_checksums.delete(file.checksum)
187
+ @standard_reporter.report(operation.as_fix_message)
188
+ end
189
+
190
+ return checksums.file_has_changed?(file)
191
+ end
192
+
193
+ true
194
+ end
195
+
196
+ def handle_operation_error(operation, error)
197
+ error_suffix = ":\n " + parse_api_errors(operation.file, error).join("\n ")
198
+ report_error(operation, error_suffix)
199
+ end
200
+
201
+ def overwrite_json?
202
+ theme_created_at_runtime? || @overwrite_json
203
+ end
204
+
205
+ def update_checksums(api_response)
206
+ api_response.each do |asset|
207
+ next unless asset["key"]
208
+
209
+ checksums[asset["key"]] = asset["checksum"]
210
+ end
211
+
212
+ checksums.reject_duplicated_checksums!
213
+ end
214
+
215
+ def report_file_error(file, error_message = "")
216
+ path = file.relative_path
217
+
218
+ @error_checksums << checksums[path]
219
+ @error_reporter.report(error_message)
220
+ end
221
+
222
+ def parse_api_errors(file, exception)
223
+ parsed_body = {}
224
+
225
+ if exception.respond_to?(:response)
226
+ response = exception.response
227
+
228
+ parsed_body = if response&.is_a?(Hash)
229
+ response&.[](:body)
230
+ else
231
+ JSON.parse(response&.body)
232
+ end
233
+ end
234
+
235
+ errors = parsed_body.dig("errors") # either nil or another type
236
+ errors = errors.dig("asset") if errors&.is_a?(Hash)
237
+
238
+ message = errors || parsed_body["message"] || exception.message
239
+ # Truncate to first lines
240
+ [message].flatten.map { |m| m.split("\n", 2).first }
241
+ rescue JSON::ParserError
242
+ [exception.message]
243
+ rescue StandardError => e
244
+ cause = "(cause: #{e.message})"
245
+ backtrace = e.backtrace.join("\n")
246
+ ["The asset #{file} could not be synced #{cause} #{backtrace}"]
247
+ end
248
+
249
+ private
250
+
251
+ def download_and_write_binary(url, file)
252
+ uri = URI.parse(url)
253
+ response = HttpRequest.get(uri, nil, { "Content-Type" => "application/octet-stream" })
254
+
255
+ case response.code.to_i
256
+ when 200..399
257
+ file.write(response.body)
258
+ else
259
+ raise "Failed to download binary asset from #{url}: #{response.code} #{response.body}"
260
+ end
261
+ end
262
+
263
+ def report_error(operation, error_suffix = "")
264
+ file = operation.file
265
+ error_message = "#{operation.as_error_message}#{error_suffix}"
266
+
267
+ report_file_error(file, error_message)
268
+ end
269
+
270
+ def enqueue(method, file, options = {})
271
+ raise ArgumentError, "file required" unless file
272
+ raise ArgumentError, "method '#{method}' cannot be queued" unless QUEUEABLE_METHODS.include?(method)
273
+
274
+ operation = Operation.new(@ctx, method, @theme[file], options)
275
+
276
+ return unless enqueueable?(operation)
277
+
278
+ @pending << operation
279
+ @queue << operation unless @queue.closed?
280
+ end
281
+
282
+ def report_performed_operation(operation)
283
+ file = operation.file
284
+
285
+ if file.warnings.any?
286
+ warning_message =
287
+ operation.as_synced_message(color: :yellow) +
288
+ UnsupportedScriptWarning.new(@ctx, file).to_s
289
+
290
+ return @error_reporter.report(warning_message)
291
+ end
292
+
293
+ @standard_reporter.report(operation.as_synced_message)
294
+ end
295
+
296
+ def perform(operation)
297
+ return if @queue.closed?
298
+
299
+ @ctx.debug(operation.to_s)
300
+
301
+ response = send(operation.method, operation.file, operation.options)
302
+
303
+ report_performed_operation(operation)
304
+ rescue StandardError => error
305
+ handle_operation_error(operation, error)
306
+ ensure
307
+ @pending.delete(operation)
308
+ end
309
+
310
+ def update(file, _options = {})
311
+ application_theme_resource = { key: file.relative_path }
312
+ path = "application_themes/#{@theme.id}/resources"
313
+
314
+ if file.text?
315
+ application_theme_resource[:content] = file.read
316
+ _status, body, response = api_client.put(
317
+ path: path,
318
+ body: JSON.generate(application_theme_resource: application_theme_resource),
319
+ )
320
+ else
321
+ ::File.open(file.path) do |f|
322
+ _status, body, response = api_client.multipart_put(
323
+ path: path,
324
+ body: {
325
+ :'application_theme_resource[key]' => file.relative_path,
326
+ :'application_theme_resource[file]' => UploadIO.new(f, file.mime_type.name, file.name)
327
+ }
328
+ )
329
+ end
330
+ end
331
+
332
+ update_checksums([body["application_theme_resource"]])
333
+
334
+ response
335
+ end
336
+
337
+ def get(file, _options = {})
338
+ _status, body, response = api_client.get(
339
+ path: "themes/#{@theme.id}/assets.json",
340
+ query: URI.encode_www_form("asset[key]" => file.relative_path),
341
+ )
342
+
343
+ update_checksums(body)
344
+
345
+ attachment = body.dig("asset", "attachment")
346
+ if attachment
347
+ file.write(Base64.decode64(attachment))
348
+ else
349
+ file.write(body.dig("asset", "value"))
350
+ end
351
+
352
+ response
353
+ end
354
+
355
+
356
+ def get_asset(file, options = {})
357
+ url = options[:url]
358
+ uri = URI.parse(url)
359
+ response = HttpRequest.get(uri, nil, { "Content-Type" => "application/octet-stream" })
360
+
361
+ case response.code.to_i
362
+ when 200..399
363
+ file.write(response.body)
364
+ else
365
+ raise "Failed to download binary asset from #{url}: #{response.code} #{response.body}"
366
+ end
367
+ end
368
+
369
+ def delete(file, _options = {})
370
+ _status, _body, response = api_client.delete(
371
+ path: "application_themes/#{@theme.id}/resources",
372
+ body: JSON.generate(:application_theme_resource => {
373
+ key: file.relative_path,
374
+ }),
375
+ )
376
+
377
+ checksums.delete(file) if checksums.has?(file)
378
+
379
+ response
380
+ end
381
+
382
+ def union_merge(file, _options = {})
383
+ _status, body, response = api_client.get(
384
+ path: "themes/#{@theme.id}/assets.json",
385
+ query: URI.encode_www_form("asset[key]" => file.relative_path),
386
+ )
387
+
388
+ return response unless file.text?
389
+
390
+ remote_content = body.dig("asset", "value")
391
+
392
+ return response if remote_content.nil?
393
+
394
+ content = Merger.union_merge(file, remote_content)
395
+
396
+ file.write(content)
397
+
398
+ enqueue(:update, file)
399
+
400
+ response
401
+ end
402
+
403
+ def theme_created_at_runtime?
404
+ @theme.created_at_runtime?
405
+ end
406
+
407
+ def wait(duration)
408
+ sleep(duration)
409
+ end
410
+ end
411
+ end
412
+ end