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
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d274a741ad9269d0d48c3ab12241f61b2ded2fcc2cbca333ddb99cb5d0cd106a
4
+ data.tar.gz: 3c8d4d513e15143633e3d12b9223a6697d5172a8aa9362d9a82462fa5cf98534
5
+ SHA512:
6
+ metadata.gz: 02151415ea46eebd33d6acbb23adea014e5f262002a7d6d9664e48f8322f6e3ce988f6acf907037ced608ffc0a83905f66c38980570621563f6533d90981bdc6
7
+ data.tar.gz: 5ab472aed0268946d4dab19b7997dd80c5f4c88deb87a7916977f4d642499a398ef5b12a1ca8a7131ab71a578edaff410ba3f0cd06485d6072eafa25fcefd4b7
data/README.md ADDED
@@ -0,0 +1 @@
1
+ # fluid_cli
data/dev.yml ADDED
@@ -0,0 +1,5 @@
1
+ up:
2
+ - ruby: 3.2.2
3
+ - bundler
4
+
5
+ build: bin/update-deps
data/exe/fluid ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby --disable-gems
2
+
3
+ Encoding.default_external = Encoding::UTF_8
4
+ Encoding.default_internal = Encoding::UTF_8
5
+
6
+ unshift_path = ->(path) {
7
+ p = File.expand_path("../../#{path}", __FILE__)
8
+ $LOAD_PATH.unshift(p) unless $LOAD_PATH.include?(p)
9
+ }
10
+ unshift_path.call('vendor/deps/cli-ui/lib')
11
+ unshift_path.call('vendor/deps/cli-kit/lib')
12
+ unshift_path.call('vendor/deps/debug/lib')
13
+ unshift_path.call('vendor/deps/webrick/lib')
14
+ unshift_path.call('vendor/deps/base64/lib')
15
+ # unshift_path.call('vendor/deps/listen/lib')
16
+ # unshift_path.call('vendor/deps/observer/lib')
17
+ unshift_path.call('lib')
18
+
19
+ require 'bundler/setup'
20
+ require 'fluid_cli'
21
+
22
+ exit(FluidCLI::ErrorHandler.call do
23
+ FluidCLI::EntryPoint.call(ARGV.dup)
24
+ end)
@@ -0,0 +1,135 @@
1
+ require "fluid_cli"
2
+ require "securerandom"
3
+
4
+ module FluidCLI
5
+ class API
6
+
7
+ class APIRequestError < StandardError
8
+ attr_reader :response
9
+
10
+ def initialize(message = nil, response: nil)
11
+ super(message)
12
+ @response = response
13
+ end
14
+ end
15
+
16
+ class APIRequestNotFoundError < APIRequestError; end
17
+ class APIRequestClientError < APIRequestError; end
18
+ class APIRequestUnauthorizedError < APIRequestClientError; end
19
+ class APIRequestForbiddenError < APIRequestClientError; end
20
+ class APIRequestUnexpectedError < APIRequestError; end
21
+ class APIRequestRetriableError < APIRequestError; end
22
+ class APIRequestTimeoutError < APIRequestRetriableError; end
23
+ class APIRequestServerError < APIRequestRetriableError; end
24
+ class APIRequestThrottledError < APIRequestRetriableError; end
25
+
26
+ def initialize(ctx)
27
+ @ctx = ctx
28
+ end
29
+
30
+ def get(path:, **args, &block)
31
+ rest_request(method: "GET", path: path, **args, &block)
32
+ end
33
+
34
+ def put(path:, **args, &block)
35
+ rest_request(method: "PUT", path: path, **args, &block)
36
+ end
37
+
38
+ def post(path:, **args, &block)
39
+ rest_request(method: "POST", path: path, **args, &block)
40
+ end
41
+
42
+ def delete(path:, **args, &block)
43
+ rest_request(method: "DELETE", path: path, **args, &block)
44
+ end
45
+
46
+ def multipart_put(path:, **args, &block)
47
+ rest_request(method: "MULTIPART_PUT", path: path, **args, &block)
48
+ end
49
+
50
+ def rest_request(path:, query: nil, body: nil, method: "GET", token: nil)
51
+ CLI::Kit::Util.begin do
52
+ url = URI::HTTPS.build(
53
+ host: FluidCLI::API_HOST,
54
+ path: "/api/#{path}",
55
+ query: query,
56
+ )
57
+ resp = request(url: url.to_s, body: body, headers: auth_headers, method: method)
58
+ resp
59
+
60
+ end.retry_after(API::APIRequestUnauthorizedError) do
61
+ FluidCLI::IdentityAuth.new(ctx: @ctx).reauthenticate unless path == "/me"
62
+ end
63
+ end
64
+
65
+ def get_company_or_abort
66
+ env_store = FluidCLI::Environment.company
67
+ return env_store unless env_store.nil?
68
+
69
+ if FluidCLI::DB.exists?(:company)
70
+ FluidCLI::DB.get(:company)
71
+ else
72
+ resp = FluidCLI::IdentityAuth.new(ctx: @ctx).attempt_reauthenticate
73
+ @ctx.abort(
74
+ "No company found. Please login again"
75
+ ) unless resp
76
+ end
77
+ end
78
+
79
+ private
80
+
81
+ def request(url:, body: nil, headers: {}, method: "POST")
82
+ CLI::Kit::Util.begin do
83
+ uri = URI.parse(url)
84
+ unless uri.is_a?(URI::HTTP)
85
+ @ctx.abort("Invalid URL: #{url}")
86
+ end
87
+
88
+
89
+ # we delay this require so as to avoid a performance hit on starting the CLI
90
+ require "fluid_cli/http_request"
91
+ @ctx.debug("#{method} #{uri} with X-Request-Id: #{headers["X-Request-Id"]}")
92
+ response = if method == "POST"
93
+ HttpRequest.post(uri, body, headers)
94
+ elsif method == "PUT"
95
+ HttpRequest.put(uri, body, headers)
96
+ elsif method == "GET"
97
+ HttpRequest.get(uri, body, headers)
98
+ elsif method == "DELETE"
99
+ HttpRequest.delete(uri, body, headers)
100
+ elsif method == "MULTIPART_PUT"
101
+ HttpRequest.multipart_put(uri, body, headers)
102
+ end
103
+
104
+
105
+ case response.code.to_i
106
+ when 200..399
107
+ [response.code.to_i, JSON.parse(response.body), response]
108
+ when 401
109
+ raise APIRequestUnauthorizedError.new("#{response.code}\n#{response.body}", response: response)
110
+ when 403
111
+ raise APIRequestForbiddenError.new("#{response.code}\n#{response.body}", response: response)
112
+ when 404
113
+ raise APIRequestNotFoundError.new("#{response.code}\n#{response.body}", response: response)
114
+ when 429
115
+ raise APIRequestThrottledError.new("#{response.code}\n#{response.body}", response: response)
116
+ when 400..499
117
+ raise APIRequestClientError.new("#{response.code}\n#{response.body}", response: response)
118
+ when 500..599
119
+ raise APIRequestServerError.new("#{response.code}\n#{response.body}", response: response)
120
+ else
121
+ raise APIRequestUnexpectedError.new("#{response.code}\n#{response.body}", response: response)
122
+ end
123
+ rescue Errno::ETIMEDOUT, Timeout::Error
124
+ @ctx.debug("timeout in #{method} #{uri} with X-Request-Id: #{headers["X-Request-Id"]}")
125
+ raise APIRequestTimeoutError, "Timeout"
126
+ end.retry_after(APIRequestRetriableError, retries: 3) do |e|
127
+ sleep(1) if e.is_a?(APIRequestThrottledError)
128
+ end
129
+ end
130
+
131
+ def auth_headers
132
+ { "Authorization" => "Bearer #{FluidCLI::Environment.auth_token || FluidCLI::DB.get(:jwt)}" }
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,34 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>Fluid CLI</title>
8
+ <style><%= locals[:css] %></style>
9
+ <link rel="icon" href="https://cdn.fluid.app/favicon-32x32.png" type="image/png">
10
+ </head>
11
+
12
+ <% if successful %>
13
+ <body class="body-success">
14
+ <div class="app-success">
15
+ <div class="container">
16
+ <h1><%= locals[:message] %></h1>
17
+ <p>You can close this tab and return to your terminal.</p>
18
+ </div>
19
+ </div>
20
+ </body>
21
+ <% else %>
22
+ <body class="body-error">
23
+ <div class="app-error">
24
+ <div class="container">
25
+ <h1>Something went wrong!</h1>
26
+ <p><%= locals[:message] %></p>
27
+ <br>
28
+ <br>
29
+ <p>Return to your terminal and try running the previous command again.</p>
30
+ </div>
31
+ </div>
32
+ </body>
33
+ <% end %>
34
+ </html>
@@ -0,0 +1,58 @@
1
+ html {
2
+ font-family: -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI, Roboto, Helvetica Neue, sans-serif;
3
+ text-size-adjust: 100%;
4
+ text-rendering: optimizeLegibility;
5
+ -webkit-font-smoothing: antialiased;
6
+ -moz-osx-font-smoothing: grayscale;
7
+ }
8
+
9
+ body {
10
+ font-size: 26px;
11
+ line-height: normal;
12
+ margin: 0;
13
+ padding: 0;
14
+ }
15
+
16
+ button, input, optgroup, select, textarea {
17
+ font-family: inherit;
18
+ }
19
+
20
+ h1 {
21
+ font-weight: 600;
22
+ font-size: 1em;
23
+ }
24
+
25
+ p {
26
+ font-weight: 400;
27
+ }
28
+
29
+ .body-success {
30
+ color: #F6F6F7;
31
+ }
32
+
33
+ .body-error {
34
+ color: #202223;
35
+ }
36
+
37
+ .app-success {
38
+ width: 100vw;
39
+ height: 100vh;
40
+ background-color: #054A49;
41
+ display: flex;
42
+ }
43
+
44
+ .app-error {
45
+ width: 100vw;
46
+ height: 100vh;
47
+ background-color: #F6F6F7;
48
+ display: flex;
49
+ }
50
+
51
+ .container {
52
+ display: flex;
53
+ flex-direction: column;
54
+ justify-content: center;
55
+ width: 100%;
56
+ height: 100%;
57
+ padding-left: 7.5em;
58
+ }
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+ require "fluid_cli"
3
+
4
+ module FluidCLI
5
+ class Command < CLI::Kit::BaseCommand
6
+ attr_writer :ctx
7
+ attr_accessor :options
8
+
9
+ class << self
10
+ attr_writer :ctx
11
+
12
+ def call(args, command_name, *)
13
+ subcommand, resolved_name = subcommand_registry.lookup_command(args.first)
14
+ if subcommand
15
+ subcommand.ctx = @ctx
16
+ subcommand.call(args.drop(1), resolved_name, command_name)
17
+ else
18
+ cmd = new(@ctx)
19
+ cmd.options.parse(@_options, args)
20
+ cmd.call(args, command_name)
21
+ end
22
+ end
23
+
24
+ def options(&block)
25
+ existing_options = @_options
26
+ # We prevent new options calls to override existing blocks by nesting them.
27
+ @_options = ->(parser, flags) {
28
+ existing_options&.call(parser, flags)
29
+ block.call(parser, flags)
30
+ }
31
+ end
32
+
33
+ def subcommand(const, cmd, path = nil)
34
+ autoload(const, path) if path
35
+ subcommand_registry.add(->() { const_get(const) }, cmd.to_s)
36
+ end
37
+
38
+ def subcommand_registry
39
+ @subcommand_registry ||= CLI::Kit::CommandRegistry.new(
40
+ default: nil)
41
+ end
42
+
43
+ def call_help(*cmds)
44
+ help = Commands::Help.new(@ctx)
45
+ help.call(cmds, nil)
46
+ end
47
+ end
48
+
49
+ def initialize(ctx = nil)
50
+ super()
51
+ @ctx = ctx || FluidCLI::Context.new
52
+ self.options = Options.new
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,21 @@
1
+ require 'fluid_cli'
2
+
3
+ module FluidCLI
4
+ module Commands
5
+ class Help < FluidCLI::Command
6
+ def call(args, _name)
7
+ puts CLI::UI.fmt("{{bold:Available commands}}")
8
+ puts ""
9
+
10
+ FluidCLI::Commands::Registry.resolved_commands.each do |name, klass|
11
+ next if name == 'help'
12
+ puts CLI::UI.fmt("{{command:#{FluidCLI::TOOL_NAME} #{name}}}")
13
+ if help = klass.help
14
+ puts CLI::UI.fmt(help)
15
+ end
16
+ puts ""
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,30 @@
1
+ require "fluid_cli"
2
+
3
+ module FluidCLI
4
+ module Commands
5
+ class Login < FluidCLI::Command
6
+ PROTOCOL_REGEX = /^https?\:\/\//
7
+ PERMANENT_DOMAIN_SUFFIX = /\.myshopify\.(com|io)$/
8
+
9
+ options do |parser, flags|
10
+ parser.on("-c", "--company=COMPANY") { |url| flags[:company] = url }
11
+ end
12
+
13
+ def call(*)
14
+ company_identifier = (options.flags[:company] || @ctx.getenv("FLUID_COMPANY" || nil))
15
+ IdentityAuth.new(ctx: @ctx).authenticate(spinner: true)
16
+ company = FluidCLI::CompanySwitcher.new(
17
+ ctx: @ctx,
18
+ company: company_identifier,
19
+ switched_after_login: true
20
+ ).switch
21
+ Whoami.call([], "whoami")
22
+ end
23
+
24
+ def self.help
25
+ "Log in to your Fluid account"
26
+ end
27
+ end
28
+ end
29
+ end
30
+
@@ -0,0 +1,38 @@
1
+ require "fluid_cli"
2
+ require "fluid_cli/theme/development_theme"
3
+
4
+ module FluidCLI
5
+ module Commands
6
+ class Logout < FluidCLI::Command
7
+ def call(*)
8
+ try_delete_development_theme
9
+
10
+ FluidCLI::IdentityAuth.delete_tokens_and_keys
11
+ FluidCLI::DB.del(:company) if has_company?
12
+ @ctx.puts("Logged out successfully.")
13
+ end
14
+
15
+ def self.help
16
+ "Logs out the current user."
17
+ end
18
+
19
+ private
20
+
21
+ def has_company?
22
+ FluidCLI::DB.exists?(:company)
23
+ end
24
+
25
+ def try_delete_development_theme
26
+ return unless has_company?
27
+
28
+ FluidCLI::Theme::DevelopmentTheme.delete(@ctx)
29
+ rescue FluidCLI::API::APIRequestError, CLI::Kit::Abort, CLI::Kit::AbortSilent => e
30
+ @ctx.debug("[Logout Error]: #{e.message}")
31
+ end
32
+
33
+ def has_company?
34
+ FluidCLI::DB.exists?(:company)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,23 @@
1
+ require "fluid_cli"
2
+
3
+ module FluidCLI
4
+ module Commands
5
+ class Switch < FluidCLI::Command
6
+ options do |parser, flags|
7
+ parser.on("-c", "--company=COMPANY") { |url| flags[:company] = url }
8
+ end
9
+
10
+ def call(*)
11
+ company = FluidCLI::CompanySwitcher.new(
12
+ ctx: @ctx,
13
+ company: options.flags[:company]
14
+ ).switch
15
+ @ctx.puts("Switched to company '#{company['name']}' successfully.")
16
+ end
17
+
18
+ def self.help
19
+ "Switches the current company context."
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,15 @@
1
+ require 'fluid_cli'
2
+
3
+ module FluidCLI
4
+ module Commands
5
+ class Theme
6
+ module Common
7
+ module CompanyHelper
8
+ def company
9
+ FluidCLI::API.new(@ctx).get_company_or_abort
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,95 @@
1
+ require 'fluid_cli'
2
+
3
+ module FluidCLI
4
+ module Commands
5
+ class Theme
6
+ module Common
7
+ module RootHelper
8
+ REQUIRED_FOLDERS = %w(config layouts sections product shop_page).freeze
9
+
10
+ def root_value(options, name)
11
+ argv = default_argv(options)
12
+ command_index = argv.index(name.to_s)
13
+
14
+ return "." if command_index.nil?
15
+
16
+ next_index = command_index + 1
17
+ option_by_key = options_map(options)
18
+
19
+ while next_index < argv.size
20
+ element = argv[next_index]
21
+ key, value = key_value_tuple(element)
22
+ option = option_by_key[key]
23
+
24
+ return element if option.nil?
25
+
26
+ # Skip the option argument
27
+ next_index += 1 if !option.arg.nil? && !value
28
+
29
+ # PATTERN arguments take precedence over the `root`
30
+ if option.arg =~ /PATTERN/ && !value
31
+ next_index += 1 while option_argument?(argv, next_index, option_by_key)
32
+ next
33
+ end
34
+
35
+ next_index += 1
36
+ end
37
+
38
+ "."
39
+ end
40
+
41
+ def valid_theme_directory?(root)
42
+ REQUIRED_FOLDERS.all? { |required_folder| Dir.exist?(File.join(root, required_folder)) } ||
43
+ current_directory_confirmed?
44
+ end
45
+
46
+ def exist_and_not_empty?(root)
47
+ Dir.exist?(root) && !Dir[File.join(root, "*")].empty?
48
+ end
49
+
50
+ private
51
+
52
+ def current_directory_confirmed?
53
+ return true if options.flags[:force]
54
+
55
+ @ctx.warn("Warning: The specified directory does not appear to be a valid theme directory.")
56
+
57
+
58
+ return true if !FluidCLI::Environment.interactive?
59
+
60
+ CLI::UI::Prompt.confirm("Do you want to continue?", default: false)
61
+ end
62
+
63
+ def default_argv(options)
64
+ options.parser.default_argv.compact
65
+ end
66
+
67
+ def options_map(options)
68
+ map = {}
69
+ options_list(options).each do |option|
70
+ map[option.short.first] = option
71
+ map[option.long.first] = option
72
+ end
73
+ map
74
+ end
75
+
76
+ def options_list(options)
77
+ options.parser.top.list
78
+ end
79
+
80
+ def option_argument?(argv, next_index, option_by_key)
81
+ return false unless next_index < argv.size
82
+
83
+ element = argv[next_index]
84
+ key, _value = key_value_tuple(element)
85
+ option_by_key[key].nil?
86
+ end
87
+
88
+ def key_value_tuple(element)
89
+ element.split("=")
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+ require "fluid_cli/theme/dev_server"
3
+ require "fluid_cli/commands/theme/common/root_helper"
4
+ # require "fluid_cli/theme/conversions/include_glob"
5
+ # require "fluid_cli/theme/conversions/ignore_glob"
6
+ module FluidCLI
7
+ module Commands
8
+ class Theme
9
+ class Dev < FluidCLI::Command
10
+ include Common::RootHelper
11
+
12
+ # recommend_default_ruby_range
13
+
14
+ DEFAULT_HTTP_HOST = "127.0.0.1"
15
+
16
+ options do |parser, flags|
17
+ # Conversions::IncludeGlob.register(parser)
18
+ # Conversions::IgnoreGlob.register(parser)
19
+
20
+ parser.on("--host=HOST") { |host| flags[:host] = host.to_s }
21
+ parser.on("--port=PORT") { |port| flags[:port] = port.to_i }
22
+ parser.on("--poll") { flags[:poll] = true }
23
+ parser.on("--live-reload=MODE") { |mode| flags[:mode] = as_reload_mode(mode) }
24
+ parser.on("-t", "--theme=NAME_OR_ID") { |theme| flags[:theme] = theme }
25
+ parser.on("-f", "--force") { flags[:force] = true }
26
+ parser.on("--overwrite-json") { flags[:overwrite_json] = true }
27
+ end
28
+
29
+ def call(_args, name)
30
+ valid_authentication_method!
31
+
32
+ root = root_value(options, name)
33
+ return unless valid_theme_directory?(root)
34
+
35
+ flags = options.flags.dup
36
+ host = flags[:host] || DEFAULT_HTTP_HOST
37
+
38
+ FluidCLI::Theme::DevServer.start(@ctx, root, host: host, **flags) do |syncer|
39
+ FluidCLI::Theme::UI::SyncProgressBar.new(syncer).progress(:upload_theme!, delay_low_priority_files: true)
40
+ end
41
+ end
42
+
43
+ def self.as_reload_mode(mode)
44
+ FluidCLI::Theme::DevServer::ReloadMode.get!(mode)
45
+ end
46
+
47
+ def self.help
48
+ FluidCLI::Context.message("theme.serve.help", FluidCLI::TOOL_NAME)
49
+ end
50
+
51
+ private
52
+
53
+ def valid_authentication_method!
54
+ if FluidCLI::Environment.auth_token.nil? && FluidCLI::DB.get(:jwt).nil?
55
+ FluidCLI::Context.abort("Auth token is missing", "Please login using 'fluid_cli login' command.")
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,21 @@
1
+ require 'fluid_cli'
2
+
3
+ module FluidCLI
4
+ module Commands
5
+ class Theme
6
+ class Help
7
+ def call(_args, _name)
8
+ puts 'neato'
9
+
10
+ if rand < 0.05
11
+ raise(CLI::Kit::Abort, "you got unlucky!")
12
+ end
13
+ end
14
+
15
+ def self.help
16
+ "A dummy command.\nUsage: {{command:#{FluidCLI::TOOL_NAME} example}}"
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,46 @@
1
+ require 'fluid_cli'
2
+
3
+ module FluidCLI
4
+ module Commands
5
+ class Theme
6
+ class Init < FluidCLI::Command
7
+ options do |parser, flags|
8
+ parser.on("-u", "--clone-url URL") { |url| flags[:clone_url] = url }
9
+ end
10
+
11
+ DEFAULT_CLONE_URL = "git@github.com:fluid-commerce/base-theme.git"
12
+
13
+ def call(args, _name)
14
+ name = args.first || ask_name
15
+ clone_url = options.flags[:clone_url] || DEFAULT_CLONE_URL
16
+ puts "Cloning theme from #{clone_url} into #{name}..."
17
+
18
+ clone(clone_url, name)
19
+ end
20
+
21
+ def self.help
22
+ "Initialize a new theme by cloning the base theme."
23
+ end
24
+
25
+ private
26
+
27
+ def ask_name
28
+ CLI::UI::Prompt.ask("Theme name")
29
+ end
30
+
31
+ def clone(url, name)
32
+ FluidCLI::Git.clone(url, name)
33
+
34
+ @ctx.root = File.join(@ctx.root, name)
35
+
36
+ begin
37
+ @ctx.rm_r(".git")
38
+ @ctx.rm_r(".github")
39
+ rescue Errno::ENOENT => e
40
+ @ctx.debug(e)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end