jets.benforeva 3.0.17.pre.mount.pre.fix

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 (459) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +92 -0
  3. data/.cody/README.md +13 -0
  4. data/.cody/docs/bin/build.sh +7 -0
  5. data/.cody/docs/bin/bundler_setup.sh +8 -0
  6. data/.cody/docs/bin/cli_docs.sh +6 -0
  7. data/.cody/docs/bin/git_commit.sh +27 -0
  8. data/.cody/docs/bin/git_setup.sh +12 -0
  9. data/.cody/docs/bin/subnav.sh +14 -0
  10. data/.cody/docs/buildspec.yml +10 -0
  11. data/.cody/docs/project.rb +10 -0
  12. data/.github/ISSUE_TEMPLATE/bug_report.md +84 -0
  13. data/.github/ISSUE_TEMPLATE/documentation.md +27 -0
  14. data/.github/ISSUE_TEMPLATE/feature_request.md +64 -0
  15. data/.github/ISSUE_TEMPLATE/question.md +14 -0
  16. data/.github/ISSUE_TEMPLATE.md +7 -0
  17. data/.github/PULL_REQUEST_TEMPLATE.md +50 -0
  18. data/.gitignore +24 -0
  19. data/.gitmodules +0 -0
  20. data/.python-version +1 -0
  21. data/.rspec +4 -0
  22. data/.ruby-gemset +1 -0
  23. data/.ruby-version +1 -0
  24. data/CHANGELOG.md +1035 -0
  25. data/CONDUCT.md +1 -0
  26. data/CONTRIBUTING.md +1 -0
  27. data/Dockerfile +16 -0
  28. data/Dockerfile.base +53 -0
  29. data/Gemfile +14 -0
  30. data/Guardfile +22 -0
  31. data/LICENSE.txt +22 -0
  32. data/Procfile +2 -0
  33. data/README.md +212 -0
  34. data/Rakefile +24 -0
  35. data/backers.md +20 -0
  36. data/bin/release +9 -0
  37. data/exe/jets.benforeva +14 -0
  38. data/jets.benforeva.gemspec +71 -0
  39. data/lib/jets/application/defaults.rb +200 -0
  40. data/lib/jets/application.rb +240 -0
  41. data/lib/jets/authorizer/base.rb +36 -0
  42. data/lib/jets/authorizer/dsl.rb +69 -0
  43. data/lib/jets/authorizer/helpers/iam_helper.rb +47 -0
  44. data/lib/jets/autoloaders.rb +112 -0
  45. data/lib/jets/aws_info.rb +111 -0
  46. data/lib/jets/aws_services/global_memoist.rb +57 -0
  47. data/lib/jets/aws_services/s3_bucket.rb +34 -0
  48. data/lib/jets/aws_services/stack_status.rb +64 -0
  49. data/lib/jets/aws_services.rb +95 -0
  50. data/lib/jets/booter.rb +167 -0
  51. data/lib/jets/builders/code_builder.rb +410 -0
  52. data/lib/jets/builders/code_size.rb +57 -0
  53. data/lib/jets/builders/gem_replacer.rb +89 -0
  54. data/lib/jets/builders/handler_generator.rb +186 -0
  55. data/lib/jets/builders/lambda_layer.rb +68 -0
  56. data/lib/jets/builders/md5.rb +60 -0
  57. data/lib/jets/builders/md5_zip.rb +61 -0
  58. data/lib/jets/builders/purger.rb +35 -0
  59. data/lib/jets/builders/rack_packager.rb +51 -0
  60. data/lib/jets/builders/rackup_wrappers/rackup +19 -0
  61. data/lib/jets/builders/rackup_wrappers/rackup.rb +7 -0
  62. data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +16 -0
  63. data/lib/jets/builders/reconfigure_rails.rb +114 -0
  64. data/lib/jets/builders/ruby_packager.rb +235 -0
  65. data/lib/jets/builders/shim_vars/app.rb +78 -0
  66. data/lib/jets/builders/shim_vars/base.rb +25 -0
  67. data/lib/jets/builders/shim_vars/shared.rb +37 -0
  68. data/lib/jets/builders/templates/handler.rb +12 -0
  69. data/lib/jets/builders/tidy.rb +107 -0
  70. data/lib/jets/builders/util.rb +31 -0
  71. data/lib/jets/bundle.rb +88 -0
  72. data/lib/jets/camelizer.rb +4 -0
  73. data/lib/jets/cfn/builders/api_deployment_builder.rb +56 -0
  74. data/lib/jets/cfn/builders/api_gateway_builder.rb +123 -0
  75. data/lib/jets/cfn/builders/api_resources_builder.rb +44 -0
  76. data/lib/jets/cfn/builders/authorizer_builder.rb +67 -0
  77. data/lib/jets/cfn/builders/base_child_builder.rb +69 -0
  78. data/lib/jets/cfn/builders/controller_builder.rb +50 -0
  79. data/lib/jets/cfn/builders/function_builder.rb +14 -0
  80. data/lib/jets/cfn/builders/interface.rb +133 -0
  81. data/lib/jets/cfn/builders/job_builder.rb +14 -0
  82. data/lib/jets/cfn/builders/parent_builder/stagger.rb +34 -0
  83. data/lib/jets/cfn/builders/parent_builder.rb +130 -0
  84. data/lib/jets/cfn/builders/rule_builder.rb +24 -0
  85. data/lib/jets/cfn/builders/shared_builder.rb +14 -0
  86. data/lib/jets/cfn/builders/util/source.rb +21 -0
  87. data/lib/jets/cfn/built_template.rb +15 -0
  88. data/lib/jets/cfn/ship.rb +188 -0
  89. data/lib/jets/cfn/status.rb +10 -0
  90. data/lib/jets/cfn/template_source.rb +61 -0
  91. data/lib/jets/cfn/upload.rb +157 -0
  92. data/lib/jets/cli.rb +208 -0
  93. data/lib/jets/commands/base.rb +145 -0
  94. data/lib/jets/commands/build.rb +252 -0
  95. data/lib/jets/commands/call/anonymous_guesser.rb +96 -0
  96. data/lib/jets/commands/call/autoload_guesser.rb +136 -0
  97. data/lib/jets/commands/call/base_guesser.rb +62 -0
  98. data/lib/jets/commands/call/guesser.rb +48 -0
  99. data/lib/jets/commands/call.rb +182 -0
  100. data/lib/jets/commands/clean/base.rb +24 -0
  101. data/lib/jets/commands/clean/build.rb +13 -0
  102. data/lib/jets/commands/clean/log.rb +111 -0
  103. data/lib/jets/commands/clean.rb +19 -0
  104. data/lib/jets/commands/configure.rb +51 -0
  105. data/lib/jets/commands/console.rb +12 -0
  106. data/lib/jets/commands/db/environment-task.rake +3 -0
  107. data/lib/jets/commands/db/tasks/dummy/app.rb +25 -0
  108. data/lib/jets/commands/db/tasks/dummy/config.rb +14 -0
  109. data/lib/jets/commands/db/tasks.rb +34 -0
  110. data/lib/jets/commands/db.rb +13 -0
  111. data/lib/jets/commands/dbconsole.rb +134 -0
  112. data/lib/jets/commands/delete.rb +136 -0
  113. data/lib/jets/commands/deploy.rb +137 -0
  114. data/lib/jets/commands/dotenv.rb +9 -0
  115. data/lib/jets/commands/dynamodb/migrate.rb +9 -0
  116. data/lib/jets/commands/dynamodb/migrator.rb +36 -0
  117. data/lib/jets/commands/dynamodb.rb +19 -0
  118. data/lib/jets/commands/gems.rb +13 -0
  119. data/lib/jets/commands/help/build.md +6 -0
  120. data/lib/jets/commands/help/call.md +69 -0
  121. data/lib/jets/commands/help/clean/build.md +5 -0
  122. data/lib/jets/commands/help/clean/log.md +5 -0
  123. data/lib/jets/commands/help/console.md +18 -0
  124. data/lib/jets/commands/help/db/generate.md +8 -0
  125. data/lib/jets/commands/help/dbconsole.md +9 -0
  126. data/lib/jets/commands/help/degenerate.md +16 -0
  127. data/lib/jets/commands/help/delete.md +22 -0
  128. data/lib/jets/commands/help/deploy.md +32 -0
  129. data/lib/jets/commands/help/dynamodb/generate.md +52 -0
  130. data/lib/jets/commands/help/dynamodb/migrate.md +4 -0
  131. data/lib/jets/commands/help/gems/check.md +6 -0
  132. data/lib/jets/commands/help/generate.md +28 -0
  133. data/lib/jets/commands/help/import/rack.md +13 -0
  134. data/lib/jets/commands/help/import/rails.md +11 -0
  135. data/lib/jets/commands/help/new.md +42 -0
  136. data/lib/jets/commands/help/routes.md +16 -0
  137. data/lib/jets/commands/help/runner.md +17 -0
  138. data/lib/jets/commands/help/server.md +15 -0
  139. data/lib/jets/commands/help/status.md +14 -0
  140. data/lib/jets/commands/help/upgrade.md +7 -0
  141. data/lib/jets/commands/help/url.md +6 -0
  142. data/lib/jets/commands/help.rb +9 -0
  143. data/lib/jets/commands/import/base.rb +49 -0
  144. data/lib/jets/commands/import/cheatsheet.rb +35 -0
  145. data/lib/jets/commands/import/rack.rb +16 -0
  146. data/lib/jets/commands/import/rails.rb +74 -0
  147. data/lib/jets/commands/import/sequence.rb +90 -0
  148. data/lib/jets/commands/import/templates/config/database.yml +30 -0
  149. data/lib/jets/commands/import/templates/submodules-cheatsheet.md +89 -0
  150. data/lib/jets/commands/import.rb +12 -0
  151. data/lib/jets/commands/main.rb +166 -0
  152. data/lib/jets/commands/markdown/creator.rb +58 -0
  153. data/lib/jets/commands/markdown/index.rb +27 -0
  154. data/lib/jets/commands/markdown/page.rb +125 -0
  155. data/lib/jets/commands/markdown/shell.rb +11 -0
  156. data/lib/jets/commands/new.rb +173 -0
  157. data/lib/jets/commands/rake_command.rb +61 -0
  158. data/lib/jets/commands/rake_tasks.rb +50 -0
  159. data/lib/jets/commands/runner.rb +16 -0
  160. data/lib/jets/commands/sequence.rb +105 -0
  161. data/lib/jets/commands/stack_info.rb +30 -0
  162. data/lib/jets/commands/templates/skeleton/.env.development.tt +3 -0
  163. data/lib/jets/commands/templates/skeleton/.env.test +3 -0
  164. data/lib/jets/commands/templates/skeleton/.env.tt +3 -0
  165. data/lib/jets/commands/templates/skeleton/.gitignore +12 -0
  166. data/lib/jets/commands/templates/skeleton/.jetskeep +1 -0
  167. data/lib/jets/commands/templates/skeleton/.rspec +3 -0
  168. data/lib/jets/commands/templates/skeleton/Gemfile.tt +39 -0
  169. data/lib/jets/commands/templates/skeleton/Procfile +7 -0
  170. data/lib/jets/commands/templates/skeleton/README.md +11 -0
  171. data/lib/jets/commands/templates/skeleton/Rakefile +2 -0
  172. data/lib/jets/commands/templates/skeleton/app/controllers/application_controller.rb +2 -0
  173. data/lib/jets/commands/templates/skeleton/app/helpers/application_helper.rb +2 -0
  174. data/lib/jets/commands/templates/skeleton/app/jobs/application_job.rb +4 -0
  175. data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +2 -0
  176. data/lib/jets/commands/templates/skeleton/app/models/application_record.rb +3 -0
  177. data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +26 -0
  178. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +71 -0
  179. data/lib/jets/commands/templates/skeleton/config/database.yml.tt +27 -0
  180. data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +22 -0
  181. data/lib/jets/commands/templates/skeleton/config/environments/development.rb +7 -0
  182. data/lib/jets/commands/templates/skeleton/config/environments/production.rb +9 -0
  183. data/lib/jets/commands/templates/skeleton/config/environments/test.rb +7 -0
  184. data/lib/jets/commands/templates/skeleton/config/routes.rb +9 -0
  185. data/lib/jets/commands/templates/skeleton/config.ru +5 -0
  186. data/lib/jets/commands/templates/skeleton/db/.gitkeep +0 -0
  187. data/lib/jets/commands/templates/skeleton/public/404.html +67 -0
  188. data/lib/jets/commands/templates/skeleton/public/422.html +67 -0
  189. data/lib/jets/commands/templates/skeleton/public/500.html +66 -0
  190. data/lib/jets/commands/templates/skeleton/public/favicon.ico +0 -0
  191. data/lib/jets/commands/templates/skeleton/public/index.html.tt +91 -0
  192. data/lib/jets/commands/templates/skeleton/spec/controllers/posts_controller_spec.rb +15 -0
  193. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-index.json +51 -0
  194. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-show.json +53 -0
  195. data/lib/jets/commands/templates/skeleton/spec/spec_helper.rb.tt +30 -0
  196. data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +23 -0
  197. data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -0
  198. data/lib/jets/commands/upgrade/templates/bin/webpack +19 -0
  199. data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +19 -0
  200. data/lib/jets/commands/upgrade/version1.rb +136 -0
  201. data/lib/jets/commands/upgrade.rb +105 -0
  202. data/lib/jets/commands/url.rb +69 -0
  203. data/lib/jets/commands/webpacker_template.rb +18 -0
  204. data/lib/jets/controller/authorization.rb +91 -0
  205. data/lib/jets/controller/base.rb +175 -0
  206. data/lib/jets/controller/callbacks.rb +73 -0
  207. data/lib/jets/controller/cookies/jar.rb +269 -0
  208. data/lib/jets/controller/cookies.rb +38 -0
  209. data/lib/jets/controller/error/invalid_authenticity_token.rb +6 -0
  210. data/lib/jets/controller/error.rb +4 -0
  211. data/lib/jets/controller/forgery_protection.rb +43 -0
  212. data/lib/jets/controller/layout.rb +17 -0
  213. data/lib/jets/controller/middleware/cors.rb +60 -0
  214. data/lib/jets/controller/middleware/local/api_gateway.rb +93 -0
  215. data/lib/jets/controller/middleware/local/mimic_aws_call.rb +38 -0
  216. data/lib/jets/controller/middleware/local/route_matcher.rb +22 -0
  217. data/lib/jets/controller/middleware/local.rb +120 -0
  218. data/lib/jets/controller/middleware/main.rb +53 -0
  219. data/lib/jets/controller/middleware/reloader.rb +15 -0
  220. data/lib/jets/controller/middleware/webpacker_setup.rb +6 -0
  221. data/lib/jets/controller/parameters_filter.rb +29 -0
  222. data/lib/jets/controller/params.rb +117 -0
  223. data/lib/jets/controller/rack/adapter.rb +94 -0
  224. data/lib/jets/controller/rack/env.rb +122 -0
  225. data/lib/jets/controller/redirection.rb +51 -0
  226. data/lib/jets/controller/rendering/rack_renderer.rb +267 -0
  227. data/lib/jets/controller/rendering.rb +96 -0
  228. data/lib/jets/controller/request.rb +29 -0
  229. data/lib/jets/controller/response.rb +61 -0
  230. data/lib/jets/controller/stage.rb +34 -0
  231. data/lib/jets/controller.rb +3 -0
  232. data/lib/jets/core.rb +157 -0
  233. data/lib/jets/core_ext/bundler.rb +7 -0
  234. data/lib/jets/core_ext/kernel.rb +13 -0
  235. data/lib/jets/db.rb +15 -0
  236. data/lib/jets/dotenv/show.rb +11 -0
  237. data/lib/jets/dotenv/ssm.rb +64 -0
  238. data/lib/jets/dotenv.rb +48 -0
  239. data/lib/jets/erb.rb +51 -0
  240. data/lib/jets/generator/templates/active_job/job/templates/application_job.rb.tt +6 -0
  241. data/lib/jets/generator/templates/active_job/job/templates/job.rb.tt +8 -0
  242. data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
  243. data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +34 -0
  244. data/lib/jets/generator/templates/erb/scaffold/edit.html.erb +6 -0
  245. data/lib/jets/generator/templates/erb/scaffold/index.html.erb +29 -0
  246. data/lib/jets/generator/templates/erb/scaffold/new.html.erb +5 -0
  247. data/lib/jets/generator/templates/erb/scaffold/show.html.erb +9 -0
  248. data/lib/jets/generator/templates/rails/assets/javascript.js +2 -0
  249. data/lib/jets/generator/templates/rails/assets/stylesheet.css +4 -0
  250. data/lib/jets/generator/templates/rails/controller/controller.rb +13 -0
  251. data/lib/jets/generator/templates/rails/helper/helper.rb +4 -0
  252. data/lib/jets/generator/templates/rails/scaffold/scaffold.css +80 -0
  253. data/lib/jets/generator/templates/rails/scaffold_controller/api_controller.rb +62 -0
  254. data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +79 -0
  255. data/lib/jets/generator.rb +112 -0
  256. data/lib/jets/inflections.rb +32 -0
  257. data/lib/jets/internal/app/controllers/jets/bare_controller.rb +16 -0
  258. data/lib/jets/internal/app/controllers/jets/mailers_controller.rb +97 -0
  259. data/lib/jets/internal/app/controllers/jets/mount_controller.rb +63 -0
  260. data/lib/jets/internal/app/controllers/jets/public_controller.rb +31 -0
  261. data/lib/jets/internal/app/controllers/jets/rack_controller.rb +12 -0
  262. data/lib/jets/internal/app/functions/jets/base_path.rb +18 -0
  263. data/lib/jets/internal/app/functions/jets/base_path_mapping.rb +100 -0
  264. data/lib/jets/internal/app/helpers/jets/mailers_helper.rb +9 -0
  265. data/lib/jets/internal/app/jobs/jets/preheat_job.rb +70 -0
  266. data/lib/jets/internal/app/shared/functions/jets/s3_bucket_config.rb +33 -0
  267. data/lib/jets/internal/app/views/jets/mailers/email.html.erb +145 -0
  268. data/lib/jets/internal/app/views/jets/mailers/index.html.erb +8 -0
  269. data/lib/jets/internal/app/views/jets/mailers/mailer.html.erb +6 -0
  270. data/lib/jets/internal/turbines/jets/mailer.rb +52 -0
  271. data/lib/jets/job/base.rb +49 -0
  272. data/lib/jets/job/dsl/dynamodb_event.rb +67 -0
  273. data/lib/jets/job/dsl/event_source_mapping.rb +11 -0
  274. data/lib/jets/job/dsl/iot_event.rb +24 -0
  275. data/lib/jets/job/dsl/kinesis_event.rb +46 -0
  276. data/lib/jets/job/dsl/log_event.rb +15 -0
  277. data/lib/jets/job/dsl/rule_event.rb +75 -0
  278. data/lib/jets/job/dsl/s3_event.rb +36 -0
  279. data/lib/jets/job/dsl/sns_event.rb +54 -0
  280. data/lib/jets/job/dsl/sqs_event.rb +96 -0
  281. data/lib/jets/job/dsl.rb +40 -0
  282. data/lib/jets/job/helpers/kinesis_event_helper.rb +13 -0
  283. data/lib/jets/job/helpers/log_event_helper.rb +17 -0
  284. data/lib/jets/job/helpers/s3_event_helper.rb +13 -0
  285. data/lib/jets/klass.rb +109 -0
  286. data/lib/jets/lambda/dsl.rb +404 -0
  287. data/lib/jets/lambda/function.rb +29 -0
  288. data/lib/jets/lambda/function_constructor.rb +55 -0
  289. data/lib/jets/lambda/functions.rb +39 -0
  290. data/lib/jets/lambda/task.rb +111 -0
  291. data/lib/jets/logger.rb +21 -0
  292. data/lib/jets/mega/hash_converter.rb +25 -0
  293. data/lib/jets/mega/request/source.rb +21 -0
  294. data/lib/jets/mega/request.rb +163 -0
  295. data/lib/jets/middleware/configurator.rb +84 -0
  296. data/lib/jets/middleware/default_stack.rb +53 -0
  297. data/lib/jets/middleware/layer.rb +34 -0
  298. data/lib/jets/middleware/stack.rb +77 -0
  299. data/lib/jets/middleware.rb +33 -0
  300. data/lib/jets/naming.rb +63 -0
  301. data/lib/jets/overrides/lambda/marshaller.rb +31 -0
  302. data/lib/jets/overrides/lambda.rb +1 -0
  303. data/lib/jets/overrides/rails/action_controller.rb +13 -0
  304. data/lib/jets/overrides/rails/asset_tag_helper.rb +114 -0
  305. data/lib/jets/overrides/rails/common_methods.rb +13 -0
  306. data/lib/jets/overrides/rails/migration_checker.rb +34 -0
  307. data/lib/jets/overrides/rails/rendering_helper.rb +27 -0
  308. data/lib/jets/overrides/rails/url_helper.rb +88 -0
  309. data/lib/jets/overrides/rails.rb +6 -0
  310. data/lib/jets/poly_fun/base_executor.rb +125 -0
  311. data/lib/jets/poly_fun/lambda_executor.rb +16 -0
  312. data/lib/jets/poly_fun/node_error.rb +8 -0
  313. data/lib/jets/poly_fun/node_executor.rb +54 -0
  314. data/lib/jets/poly_fun/python_error.rb +8 -0
  315. data/lib/jets/poly_fun/python_executor.rb +23 -0
  316. data/lib/jets/poly_fun.rb +73 -0
  317. data/lib/jets/preheat.rb +117 -0
  318. data/lib/jets/processors/deducer.rb +65 -0
  319. data/lib/jets/processors/main_processor.rb +61 -0
  320. data/lib/jets/rack_server.rb +86 -0
  321. data/lib/jets/rdoc.rb +30 -0
  322. data/lib/jets/resource/api_gateway/authorizer.rb +82 -0
  323. data/lib/jets/resource/api_gateway/base_path/function.rb +49 -0
  324. data/lib/jets/resource/api_gateway/base_path/mapping.rb +44 -0
  325. data/lib/jets/resource/api_gateway/base_path/role.rb +76 -0
  326. data/lib/jets/resource/api_gateway/cors.rb +61 -0
  327. data/lib/jets/resource/api_gateway/deployment.rb +80 -0
  328. data/lib/jets/resource/api_gateway/domain_name.rb +65 -0
  329. data/lib/jets/resource/api_gateway/method/authorization.rb +41 -0
  330. data/lib/jets/resource/api_gateway/method.rb +102 -0
  331. data/lib/jets/resource/api_gateway/resource.rb +82 -0
  332. data/lib/jets/resource/api_gateway/rest_api/change_detection.rb +10 -0
  333. data/lib/jets/resource/api_gateway/rest_api/logical_id/message.rb +49 -0
  334. data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +98 -0
  335. data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +136 -0
  336. data/lib/jets/resource/api_gateway/rest_api/routes/change/media_types.rb +36 -0
  337. data/lib/jets/resource/api_gateway/rest_api/routes/change/page.rb +93 -0
  338. data/lib/jets/resource/api_gateway/rest_api/routes/change/to.rb +25 -0
  339. data/lib/jets/resource/api_gateway/rest_api/routes/change/variable.rb +35 -0
  340. data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +16 -0
  341. data/lib/jets/resource/api_gateway/rest_api/routes/collision/variable_exception.rb +7 -0
  342. data/lib/jets/resource/api_gateway/rest_api/routes/collision.rb +121 -0
  343. data/lib/jets/resource/api_gateway/rest_api/routes.rb +7 -0
  344. data/lib/jets/resource/api_gateway/rest_api.rb +64 -0
  345. data/lib/jets/resource/associated.rb +37 -0
  346. data/lib/jets/resource/base.rb +28 -0
  347. data/lib/jets/resource/child_stack/api_deployment.rb +58 -0
  348. data/lib/jets/resource/child_stack/api_gateway.rb +23 -0
  349. data/lib/jets/resource/child_stack/api_resource/page.rb +20 -0
  350. data/lib/jets/resource/child_stack/api_resource.rb +54 -0
  351. data/lib/jets/resource/child_stack/app_class.rb +149 -0
  352. data/lib/jets/resource/child_stack/authorizer.rb +40 -0
  353. data/lib/jets/resource/child_stack/base.rb +24 -0
  354. data/lib/jets/resource/child_stack/common_parameters.rb +14 -0
  355. data/lib/jets/resource/child_stack/shared.rb +85 -0
  356. data/lib/jets/resource/config/config_rule.rb +74 -0
  357. data/lib/jets/resource/config/managed_rule.rb +15 -0
  358. data/lib/jets/resource/events/rule.rb +31 -0
  359. data/lib/jets/resource/iam/application_role.rb +27 -0
  360. data/lib/jets/resource/iam/base_role_definition.rb +47 -0
  361. data/lib/jets/resource/iam/class_role.rb +74 -0
  362. data/lib/jets/resource/iam/function_role.rb +54 -0
  363. data/lib/jets/resource/iam/managed_policy.rb +22 -0
  364. data/lib/jets/resource/iam/policy_document.rb +41 -0
  365. data/lib/jets/resource/iot/topic_rule.rb +34 -0
  366. data/lib/jets/resource/lambda/event_source_mapping.rb +31 -0
  367. data/lib/jets/resource/lambda/function/environment.rb +62 -0
  368. data/lib/jets/resource/lambda/function.rb +221 -0
  369. data/lib/jets/resource/lambda/gem_layer.rb +17 -0
  370. data/lib/jets/resource/lambda/layer_version.rb +44 -0
  371. data/lib/jets/resource/logs/subscription_filter.rb +31 -0
  372. data/lib/jets/resource/permission.rb +45 -0
  373. data/lib/jets/resource/replacer.rb +85 -0
  374. data/lib/jets/resource/route53/record_set.rb +98 -0
  375. data/lib/jets/resource/s3/bucket.rb +24 -0
  376. data/lib/jets/resource/sns/subscription.rb +29 -0
  377. data/lib/jets/resource/sns/topic.rb +35 -0
  378. data/lib/jets/resource/sns/topic_policy.rb +40 -0
  379. data/lib/jets/resource/sqs/queue.rb +21 -0
  380. data/lib/jets/resource/standardizer.rb +42 -0
  381. data/lib/jets/resource.rb +71 -0
  382. data/lib/jets/router/dsl/mount.rb +13 -0
  383. data/lib/jets/router/dsl.rb +144 -0
  384. data/lib/jets/router/error.rb +4 -0
  385. data/lib/jets/router/finder.rb +47 -0
  386. data/lib/jets/router/helpers/core_helper.rb +27 -0
  387. data/lib/jets/router/helpers/named_routes_helper.rb +8 -0
  388. data/lib/jets/router/helpers.rb +4 -0
  389. data/lib/jets/router/matcher.rb +81 -0
  390. data/lib/jets/router/method_creator/code.rb +99 -0
  391. data/lib/jets/router/method_creator/edit.rb +12 -0
  392. data/lib/jets/router/method_creator/generic.rb +11 -0
  393. data/lib/jets/router/method_creator/index.rb +48 -0
  394. data/lib/jets/router/method_creator/new.rb +12 -0
  395. data/lib/jets/router/method_creator/root.rb +15 -0
  396. data/lib/jets/router/method_creator/show.rb +12 -0
  397. data/lib/jets/router/method_creator.rb +50 -0
  398. data/lib/jets/router/resources/base.rb +7 -0
  399. data/lib/jets/router/resources/filter.rb +15 -0
  400. data/lib/jets/router/resources/options.rb +13 -0
  401. data/lib/jets/router/route/authorizer.rb +57 -0
  402. data/lib/jets/router/route.rb +230 -0
  403. data/lib/jets/router/scope.rb +95 -0
  404. data/lib/jets/router/util.rb +38 -0
  405. data/lib/jets/router.rb +180 -0
  406. data/lib/jets/rule/base.rb +19 -0
  407. data/lib/jets/rule/dsl.rb +109 -0
  408. data/lib/jets/spec_helpers/controllers/params.rb +8 -0
  409. data/lib/jets/spec_helpers/controllers/request.rb +101 -0
  410. data/lib/jets/spec_helpers/controllers/response.rb +10 -0
  411. data/lib/jets/spec_helpers/controllers.rb +47 -0
  412. data/lib/jets/spec_helpers/fixtures.rb +11 -0
  413. data/lib/jets/spec_helpers.rb +21 -0
  414. data/lib/jets/stack/builder.rb +43 -0
  415. data/lib/jets/stack/definition.rb +50 -0
  416. data/lib/jets/stack/depends/item.rb +26 -0
  417. data/lib/jets/stack/depends.rb +34 -0
  418. data/lib/jets/stack/function.rb +69 -0
  419. data/lib/jets/stack/main/dsl/base.rb +63 -0
  420. data/lib/jets/stack/main/dsl/cloudwatch.rb +19 -0
  421. data/lib/jets/stack/main/dsl/iam.rb +8 -0
  422. data/lib/jets/stack/main/dsl/kinesis.rb +15 -0
  423. data/lib/jets/stack/main/dsl/lambda.rb +83 -0
  424. data/lib/jets/stack/main/dsl/s3.rb +12 -0
  425. data/lib/jets/stack/main/dsl/sns.rb +16 -0
  426. data/lib/jets/stack/main/dsl/sqs.rb +10 -0
  427. data/lib/jets/stack/main/dsl.rb +17 -0
  428. data/lib/jets/stack/main.rb +4 -0
  429. data/lib/jets/stack/output/dsl.rb +19 -0
  430. data/lib/jets/stack/output/lookup.rb +36 -0
  431. data/lib/jets/stack/output.rb +35 -0
  432. data/lib/jets/stack/parameter/dsl.rb +42 -0
  433. data/lib/jets/stack/parameter.rb +37 -0
  434. data/lib/jets/stack/resource/dsl.rb +19 -0
  435. data/lib/jets/stack/resource.rb +31 -0
  436. data/lib/jets/stack/s3_event.rb +87 -0
  437. data/lib/jets/stack.rb +88 -0
  438. data/lib/jets/tmp_loader.rb +53 -0
  439. data/lib/jets/turbine.rb +41 -0
  440. data/lib/jets/turbo/database_yaml.rb +41 -0
  441. data/lib/jets/turbo/project/.gitignore +12 -0
  442. data/lib/jets/turbo/project/.jetskeep +1 -0
  443. data/lib/jets/turbo/project/Gemfile +16 -0
  444. data/lib/jets/turbo/project/Rakefile +2 -0
  445. data/lib/jets/turbo/project/app/controllers/application_controller.rb +2 -0
  446. data/lib/jets/turbo/project/app/helpers/application_helper.rb +2 -0
  447. data/lib/jets/turbo/project/app/jobs/application_job.rb +4 -0
  448. data/lib/jets/turbo/project/config/application.rb +5 -0
  449. data/lib/jets/turbo/project/config/routes.rb +4 -0
  450. data/lib/jets/turbo/project/config.ru +5 -0
  451. data/lib/jets/turbo/rails.rb +127 -0
  452. data/lib/jets/turbo/templates/config/database.yml +30 -0
  453. data/lib/jets/turbo.rb +56 -0
  454. data/lib/jets/util.rb +40 -0
  455. data/lib/jets/version.rb +3 -0
  456. data/lib/jets.rb +31 -0
  457. data/readme/prerelease.md +6 -0
  458. data/readme/testing.md +60 -0
  459. metadata +1105 -0
@@ -0,0 +1,24 @@
1
+ # Implements:
2
+ #
3
+ # compose
4
+ # template_path
5
+ #
6
+ module Jets::Cfn::Builders
7
+ class RuleBuilder < BaseChildBuilder
8
+ def compose
9
+ add_common_parameters
10
+ add_functions
11
+ add_resources
12
+ add_managed_rules
13
+ end
14
+
15
+ # Handle config_rules associated with aws managed rules.
16
+ # List of AWS Config Managed Rules: https://amzn.to/2BOt9KN
17
+ def add_managed_rules
18
+ @app_class.managed_rules.each do |rule|
19
+ resource = Jets::Resource.new(rule[:definition], rule[:replacements])
20
+ add_resource(resource)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ module Jets::Cfn::Builders
2
+ class SharedBuilder < BaseChildBuilder
3
+ def compose
4
+ stack = @app_class.new # @app_class is subclass. IE: Alarm < Jets::Stack
5
+ builder = Jets::Stack::Builder.new(stack)
6
+ @template = builder.template # overwrite entire @template
7
+ end
8
+
9
+ # template_path is an interface method for Interface module
10
+ def template_path
11
+ Jets::Naming.shared_template_path(@app_class)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ module Jets::Cfn::Builders::Util
2
+ class Source
3
+ class << self
4
+ def version
5
+ return '' unless git_installed?
6
+ sha = sh "git rev-parse HEAD 2>/dev/null"
7
+ return '' if sha == '' # if its not a git repo, it'll be an empty string
8
+ sha[0..7]
9
+ end
10
+
11
+ private
12
+ def git_installed?
13
+ system("type git > /dev/null 2>&1")
14
+ end
15
+
16
+ def sh(command)
17
+ `#{command}`.strip
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,15 @@
1
+ module Jets::Cfn
2
+ # Caches the built template to reduce filesystem IO calls.
3
+ class BuiltTemplate
4
+ class << self
5
+ @@cache = {}
6
+ def get(path)
7
+ if @@cache[path]
8
+ @@cache[path] # using cache
9
+ else
10
+ @@cache[path] = YAML.load_file(path) # setting and using cache
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,188 @@
1
+ module Jets::Cfn
2
+ class Ship
3
+ extend Memoist
4
+ include Jets::AwsServices
5
+
6
+ def initialize(options)
7
+ @options = options
8
+ @parent_stack_name = Jets::Naming.parent_stack_name
9
+ end
10
+
11
+ def run
12
+ # s3 bucket is available only when stack_type is full
13
+ upload_to_s3 if @options[:stack_type] == :full
14
+
15
+ stack_in_progress?(@parent_stack_name)
16
+
17
+ puts "Deploying CloudFormation stack with jets app!"
18
+ begin
19
+ save_stack
20
+ rescue Aws::CloudFormation::Errors::InsufficientCapabilitiesException => e
21
+ capabilities = e.message.match(/\[(.*)\]/)[1]
22
+ confirm = prompt_for_iam(capabilities)
23
+ if confirm =~ /^y/
24
+ @options.merge!(capabilities: [capabilities])
25
+ puts "Re-running: #{command_with_iam(capabilities).color(:green)}"
26
+ retry
27
+ else
28
+ puts "Exited"
29
+ exit 1
30
+ end
31
+ end
32
+
33
+ success = wait_for_stack
34
+ unless success
35
+ puts <<~EOL
36
+ The Jets application failed to deploy. Jets creates a few CloudFormation stacks to deploy your application.
37
+ The logs above show the CloudFormation parent stack events and points to the stack with the error.
38
+ Please go to the CloudFormation console and look for the specific stack with the error.
39
+ The specific child stack usually shows more detailed information and can be used to resolve the issue.
40
+ Example of checking the CloudFormation console: https://rubyonjets.com/docs/debugging/cloudformation/
41
+ EOL
42
+ exit 1
43
+ end
44
+
45
+ prewarm
46
+ clean_deploy_logs
47
+ show_api_endpoint
48
+ show_custom_domain
49
+ end
50
+
51
+ def save_stack
52
+ if stack_exists?(@parent_stack_name)
53
+ update_stack
54
+ else
55
+ create_stack
56
+ end
57
+ end
58
+
59
+ def create_stack
60
+ # parent stack template is on filesystem and child stacks templates is on s3
61
+ cfn.create_stack(stack_options)
62
+ end
63
+
64
+ def update_stack
65
+ begin
66
+ cfn.update_stack(stack_options)
67
+ rescue Aws::CloudFormation::Errors::ValidationError => e
68
+ puts "ERROR: #{e.message}".color(:red)
69
+ true # error
70
+ end
71
+ end
72
+
73
+ # options common to both create_stack and update_stack
74
+ def stack_options
75
+ {
76
+ stack_name: @parent_stack_name,
77
+ capabilities: capabilities, # ["CAPABILITY_IAM", "CAPABILITY_NAMED_IAM"]
78
+ # disable_rollback: !@options[:rollback],
79
+ }.merge!(template.to_h)
80
+ end
81
+
82
+ def template
83
+ @template ||= TemplateSource.new(Jets::Naming.parent_template_path, @options)
84
+ end
85
+
86
+ # check for /(_COMPLETE|_FAILED)$/ status
87
+ def wait_for_stack
88
+ Jets::Cfn::Status.new(@options).wait
89
+ end
90
+
91
+ def prewarm
92
+ if ENV['SKIP_PREWARMING']
93
+ puts "Skipping prewarming" # useful for testing
94
+ return
95
+ end
96
+ return unless @options[:stack_type] == :full # s3 bucket is available
97
+ return unless Jets.config.prewarm.enable
98
+ return if Jets.poly_only?
99
+
100
+ puts "Prewarming application."
101
+ Jets::PreheatJob.prewarm!
102
+ end
103
+
104
+ def clean_deploy_logs
105
+ Jets::Commands::Clean::Log.new(@options).clean_deploys
106
+ end
107
+
108
+ def endpoint_unavailable?
109
+ return true unless @options[:stack_type] == :full # s3 bucket is available
110
+ return true if Jets::Router.routes.empty?
111
+ _, status = stack_status
112
+ return true if status.include?("ROLLBACK")
113
+ return true unless api_gateway
114
+ end
115
+
116
+ # Do not memoize this because on first stack run it will be nil
117
+ # It only gets called one more time so just let it get called.
118
+ def api_gateway
119
+ resp = cfn.describe_stack_resources(stack_name: @parent_stack_name)
120
+ resources = resp.stack_resources
121
+ resources.find { |resource| resource.logical_resource_id == "ApiGateway" }
122
+ end
123
+ memoize :api_gateway
124
+
125
+ def endpoint_available?
126
+ !endpoint_unavailable?
127
+ end
128
+
129
+ def show_api_endpoint
130
+ return unless endpoint_available?
131
+
132
+ stack_id = api_gateway["physical_resource_id"]
133
+
134
+ resp = cfn.describe_stacks(stack_name: stack_id)
135
+ stack = resp["stacks"].first
136
+ output = stack["outputs"].find { |o| o["output_key"] == "RestApiUrl" }
137
+ endpoint = output["output_value"]
138
+ puts "API Gateway Endpoint: #{endpoint}"
139
+ end
140
+
141
+ def show_custom_domain
142
+ return unless endpoint_available? && Jets.custom_domain? && Jets.config.domain.route53
143
+
144
+ domain_name = Jets::Resource::ApiGateway::DomainName.new
145
+ # Looks funny but its right.
146
+ # domain_name is a method on the Jets::Resource::ApiGateway::Domain instance
147
+ url = "https://#{domain_name.domain_name}"
148
+ puts "Custom Domain: #{url}"
149
+ puts "App Domain: #{Jets.config.app.domain}" if Jets.config.app.domain
150
+ end
151
+
152
+ # All CloudFormation states listed here:
153
+ # http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html
154
+ def stack_status
155
+ resp = cfn.describe_stacks(stack_name: @parent_stack_name)
156
+ status = resp.stacks[0].stack_status
157
+ [resp, status]
158
+ end
159
+
160
+ def prompt_for_iam(capabilities)
161
+ puts "This stack will create IAM resources. Please approve to run the command again with #{capabilities} capabilities."
162
+ puts " #{command_with_iam(capabilities)}"
163
+
164
+ puts "Please confirm (y/n)"
165
+ $stdin.gets # confirm
166
+ end
167
+
168
+ def command_with_iam(capabilities)
169
+ "#{File.basename($0)} #{ARGV.join(' ')} --capabilities #{capabilities}"
170
+ end
171
+
172
+ def capabilities
173
+ ["CAPABILITY_IAM", "CAPABILITY_NAMED_IAM"] # TODO: remove capabilities hardcode
174
+ # return @options[:capabilities] if @options[:capabilities]
175
+ # if @options[:iam]
176
+ # ["CAPABILITY_IAM", "CAPABILITY_NAMED_IAM"]
177
+ # end
178
+ end
179
+
180
+ # Upload both code and child templates to s3
181
+ def upload_to_s3
182
+ raise "Did not specify @options[:s3_bucket] #{@options[:s3_bucket].inspect}" unless @options[:s3_bucket]
183
+
184
+ uploader = Upload.new(@options[:s3_bucket])
185
+ uploader.upload
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,10 @@
1
+ require 'cfn_status'
2
+
3
+ module Jets::Cfn
4
+ class Status < CfnStatus
5
+ def initialize(options={})
6
+ @stack_name = Jets::Naming.parent_stack_name
7
+ super(@stack_name, options)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,61 @@
1
+ module Jets::Cfn
2
+ class TemplateSource
3
+ include Jets::AwsServices
4
+
5
+ attr_reader :path
6
+
7
+ def initialize(path, options)
8
+ @path = path
9
+ @options = options
10
+ end
11
+
12
+ def body
13
+ @body ||= IO.read(path)
14
+ end
15
+
16
+ def url
17
+ @url ||= upload_file_to_s3
18
+ end
19
+
20
+ def to_h
21
+ if upload_to_s3?
22
+ from_s3
23
+ else
24
+ from_path
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def upload_to_s3?
31
+ bucket_name.present?
32
+ end
33
+
34
+ def from_s3
35
+ {
36
+ template_url: url
37
+ }
38
+ end
39
+
40
+ def from_path
41
+ {
42
+ template_body: body
43
+ }
44
+ end
45
+
46
+ def upload_file_to_s3
47
+ obj = s3_resource.bucket(bucket_name).object(s3_key)
48
+ obj.upload_file(path)
49
+
50
+ "https://s3.amazonaws.com/#{bucket_name}/#{s3_key}"
51
+ end
52
+
53
+ def bucket_name
54
+ @options[:s3_bucket]
55
+ end
56
+
57
+ def s3_key
58
+ @s3_key ||= "jets/cfn-templates/#{File.basename(path)}"
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,157 @@
1
+ require 'action_view'
2
+ require 'digest'
3
+ require 'rack/mime'
4
+
5
+ module Jets::Cfn
6
+ class Upload
7
+ include Jets::AwsServices
8
+ include ActionView::Helpers::NumberHelper # number_to_human_size
9
+
10
+ attr_reader :bucket_name
11
+
12
+ def initialize(bucket_name)
13
+ @bucket_name = bucket_name
14
+ end
15
+
16
+ def upload
17
+ upload_cfn_templates
18
+ upload_zip_files
19
+ upload_assets
20
+ end
21
+
22
+ def upload_cfn_templates
23
+ puts "Uploading CloudFormation templates to S3."
24
+ expression = "#{Jets::Naming.template_path_prefix}-*"
25
+ Dir.glob(expression).each do |path|
26
+ next unless File.file?(path)
27
+
28
+ key = "jets/cfn-templates/#{File.basename(path)}"
29
+ obj = s3_resource.bucket(bucket_name).object(key)
30
+ obj.upload_file(path)
31
+ end
32
+ end
33
+
34
+ def upload_zip_files
35
+ puts "Uploading code zip files to S3."
36
+ zip_area = "#{Jets.build_root}/stage/zips"
37
+ Dir.glob("#{zip_area}/*").each do |file|
38
+ upload_zip_file(file)
39
+ end
40
+ end
41
+
42
+ def upload_zip_file(path)
43
+ file_size = number_to_human_size(File.size(path))
44
+
45
+ puts "Uploading #{path} (#{file_size}) to S3"
46
+ start_time = Time.now
47
+ s3_key = "jets/code/#{File.basename(path)}"
48
+ obj = s3_resource.bucket(bucket_name).object(s3_key)
49
+ obj.upload_file(path)
50
+ puts "Uploaded to s3://#{bucket_name}/#{s3_key}".color(:green)
51
+ puts "Time to upload code to s3: #{pretty_time(Time.now-start_time).color(:green)}"
52
+ end
53
+
54
+ def upload_assets
55
+ puts "Checking for modified public assets and uploading to S3."
56
+ start_time = Time.now
57
+ upload_public_assets
58
+ puts "Time for public assets to s3: #{pretty_time(Time.now-start_time).color(:green)}"
59
+ end
60
+
61
+ def upload_public_assets
62
+ public_folders = %w[public]
63
+ public_folders = add_rack_assets(public_folders)
64
+ public_folders.each do |folder|
65
+ upload_asset_folder(folder)
66
+ end
67
+ end
68
+
69
+ def add_rack_assets(public_folders)
70
+ return public_folders unless Jets.rack?
71
+ public_folders + %w[rack/public]
72
+ end
73
+
74
+ def upload_asset_folder(folder)
75
+ expression = "#{Jets.root}/#{folder}/**/*"
76
+ group_size = 10
77
+ Dir.glob(expression).each_slice(group_size) do |paths|
78
+ threads = []
79
+ paths.each do |full_path|
80
+ next unless File.file?(full_path)
81
+
82
+ threads << Thread.new do
83
+ upload_to_s3(full_path)
84
+ end
85
+ end
86
+ threads.each(&:join)
87
+ end
88
+ end
89
+
90
+ def upload_to_s3(full_path)
91
+ return if identical_on_s3?(full_path) && !ENV['JETS_ASSET_UPLOAD_FORCE']
92
+
93
+ key = s3_key(full_path)
94
+ obj = s3_resource.bucket(bucket_name).object(key)
95
+ content_type = content_type_headers(full_path)
96
+ puts "Uploading and setting content type for s3://#{bucket_name}/#{key} content_type #{content_type[:content_type].inspect}"
97
+ obj.upload_file(full_path, { acl: "public-read", cache_control: cache_control }.merge(content_type))
98
+ end
99
+
100
+ CONTENT_TYPES_BY_EXTENSION = {
101
+ '.css' => 'text/css',
102
+ '.html' => 'text/html',
103
+ '.js' => 'application/javascript',
104
+ }
105
+ def content_type_headers(full_path)
106
+ ext = File.extname(full_path)
107
+ content_type = CONTENT_TYPES_BY_EXTENSION[ext] || Rack::Mime.mime_type(ext)
108
+ if content_type
109
+ { content_type: content_type }
110
+ else
111
+ {}
112
+ end
113
+ end
114
+
115
+ def s3_key(full_path)
116
+ relative_path = full_path.sub("#{Jets.root}/", '')
117
+ "jets/#{relative_path}"
118
+ end
119
+
120
+ def identical_on_s3?(full_path)
121
+ local_md5 = ::Digest::MD5.file(full_path)
122
+ key = s3_key(full_path)
123
+ begin
124
+ resp = s3.head_object(bucket: bucket_name, key: key)
125
+ rescue Aws::S3::Errors::NotFound
126
+ return false
127
+ end
128
+
129
+ remote_md5 = resp.etag.delete_prefix('"').delete_suffix('"')
130
+ local_md5 == remote_md5
131
+ end
132
+
133
+ # If cache_control is provided, then it will set the entire cache-control header.
134
+ # If only max_age is provided, then we'll generate a cache_control header.
135
+ # Using max_age is the shorter and simply way of setting the cache_control header.
136
+ def cache_control
137
+ cache_control = Jets.config.assets.cache_control
138
+ unless cache_control
139
+ max_age = Jets.config.assets.max_age # defaults to 3600 in jets/application.rb
140
+ cache_control = "public, max-age=#{max_age}"
141
+ end
142
+ cache_control
143
+ end
144
+
145
+ # http://stackoverflow.com/questions/4175733/convert-duration-to-hoursminutesseconds-or-similar-in-rails-3-or-ruby
146
+ def pretty_time(total_seconds)
147
+ minutes = (total_seconds / 60) % 60
148
+ seconds = total_seconds % 60
149
+ if total_seconds < 60
150
+ "#{seconds.to_i}s"
151
+ else
152
+ "#{minutes.to_i}m #{seconds.to_i}s"
153
+ end
154
+ end
155
+
156
+ end
157
+ end
data/lib/jets/cli.rb ADDED
@@ -0,0 +1,208 @@
1
+ require "thor"
2
+
3
+ class Jets::CLI
4
+ def self.start(given_args=ARGV)
5
+ new(given_args).start
6
+ end
7
+
8
+ def self.thor_tasks
9
+ Jets::Commands::Base.namespaced_commands
10
+ end
11
+
12
+ def initialize(given_args=ARGV, **config)
13
+ @given_args = given_args.dup
14
+ @config = config
15
+ end
16
+
17
+ def start
18
+ # Needs to be at the beginning to avoid boot_jets which causes some load errors
19
+ if version_requested?
20
+ puts Jets.version
21
+ return
22
+ end
23
+
24
+ # Need to boot jets at this point for commands like: jets routes, deploy, console, etc to work
25
+ boot_jets
26
+ command_class = lookup(full_command)
27
+ if command_class
28
+ command_class.perform(full_command, thor_args)
29
+ else
30
+ main_help
31
+ end
32
+ end
33
+
34
+ # The commands new and help do not call Jets.boot. Main reason is that Jets.boot should be run in a Jets project.
35
+ #
36
+ # * jets new - need to generate a project outside a project folder.
37
+ # * jets help - don't need to be in a project folder general help.
38
+ #
39
+ # When you are inside a project folder though, more help commands are available and displayed.
40
+ #
41
+ def boot_jets
42
+ set_jets_env_from_cli_arg!
43
+ command = thor_args.first
44
+ unless %w[new help].include?(command)
45
+ Jets::Turbo.new.charge # handles Afterburner mode
46
+ Jets.boot
47
+ end
48
+ end
49
+
50
+ def version_requested?
51
+ # jets --version
52
+ # jets -v
53
+ version_flags = ["--version", "-v"]
54
+ @given_args.length == 1 && !(@given_args & version_flags).empty?
55
+ end
56
+
57
+ # Adjust JETS_ENV before boot_jets is called for the `jets deploy` command. Must do this early in the process
58
+ # before Jets.boot because because `bundler_require` is called as part of the bootup process. It sets the Jets.env
59
+ # to whatever the JETS_ENV is at the time to require the right bundler group.
60
+ #
61
+ # Defaults to development when not set.
62
+ def set_jets_env_from_cli_arg!
63
+ # Pretty tricky, we need to use the raw @given_args as thor_args eventually calls Commands::Base#eager_load!
64
+ # which uses Jets.env before we get a chance to override ENV['JETS_ENV']
65
+ command, env = @given_args[0..1]
66
+ return unless %w[deploy delete].include?(command)
67
+ env = nil if env&.starts_with?('-')
68
+ return unless env
69
+ ENV['JETS_ENV'] = env ? env : 'development'
70
+ end
71
+
72
+ # thor_args normalized the args Array to work with our Thor command
73
+ # subclasses.
74
+ # 1. The namespace is stripe
75
+ # 2. Help is shifted in front if a help flag is detected
76
+ def thor_args
77
+ args = @given_args.clone
78
+
79
+ # jets generate is a special command requires doesn't puts out the help menu automatically when
80
+ # `jets generate` is called without additional args. We'll take it over early and fix it here.
81
+ generate = full_command == "generate"
82
+
83
+ if generate && ((args.size == 1 || help_flags.include?(args.last)) || args.size == 2)
84
+ puts Jets::Generator.help
85
+ exit
86
+ end
87
+
88
+ help_args = args & help_flags
89
+ unless help_args.empty?
90
+ # Allow using help flags at the end of the command to trigger help menu
91
+ args -= help_flags # remove "help" and help flags from args
92
+ args[0] = meth # first command will always be the meth now since
93
+ # we removed the help flags
94
+ args.unshift("help")
95
+ args.compact!
96
+ return args
97
+ end
98
+
99
+ # reassigns the command without the namespace if reached here
100
+ args[0] = meth
101
+ args.compact
102
+ end
103
+
104
+ def meth
105
+ return nil unless full_command
106
+
107
+ if full_command.include?(':')
108
+ full_command.split(':').pop
109
+ else
110
+ full_command
111
+ end
112
+ end
113
+
114
+ ALIASES = {
115
+ "g" => "generate",
116
+ "c" => "console",
117
+ "s" => "server",
118
+ "db" => "dbconsole",
119
+ }
120
+ def full_command
121
+ # Removes any args that starts with -, those are option args.
122
+ # Also remove "help" flag.
123
+ args = @given_args.reject {|o| o =~ /^-/ } - help_flags
124
+ command = args[0] # first argument should always be the command
125
+ command = ALIASES[command] || command
126
+ Jets::Commands::Base.autocomplete(command)
127
+ end
128
+
129
+ # 1. look up Thor tasks
130
+ # 2. look up Rake tasks
131
+ # 3. help menu with all commands when both Thor and Rake tasks are not found
132
+ def lookup(full_command)
133
+ thor_task_found = Jets::Commands::Base.namespaced_commands.include?(full_command)
134
+ if thor_task_found
135
+ return Jets::Commands::Base.klass_from_namespace(namespace)
136
+ end
137
+
138
+ return unless jets_project?
139
+ rake_task_found = Jets::Commands::RakeCommand.namespaced_commands.include?(full_command)
140
+ if rake_task_found
141
+ return Jets::Commands::RakeCommand
142
+ end
143
+ end
144
+
145
+ def jets_project?
146
+ File.exist?("config/application.rb")
147
+ end
148
+
149
+ # ["-h", "-?", "--help", "-D", "help"]
150
+ def help_flags
151
+ Thor::HELP_MAPPINGS + ["help"]
152
+ end
153
+
154
+ def namespace
155
+ return nil unless full_command
156
+
157
+ if full_command.include?(':')
158
+ words = full_command.split(':')
159
+ words.pop
160
+ words.join(':')
161
+ end
162
+ end
163
+
164
+ def main_help
165
+ shell = Thor::Shell::Basic.new
166
+ shell.say "Commands:"
167
+ shell.print_table(thor_list, :indent => 2, :truncate => true)
168
+
169
+ if jets_project? && !rake_list.empty?
170
+ shell.say "\nCommands via rake:"
171
+ shell.print_table(rake_list, :indent => 2, :truncate => true)
172
+ end
173
+
174
+ shell.say "\n"
175
+ shell.say main_help_body
176
+ end
177
+
178
+ def thor_list
179
+ Jets::Commands::Base.help_list(show_all_tasks)
180
+ end
181
+
182
+ def rake_list
183
+ list = Jets::Commands::RakeCommand.formatted_rake_tasks(show_all_tasks)
184
+ list.map do |array|
185
+ array[0] = "jets #{array[0]}"
186
+ array
187
+ end
188
+ end
189
+
190
+ def show_all_tasks
191
+ @given_args.include?("--all") || @given_args.include?("-A")
192
+ end
193
+
194
+ def main_help_body
195
+ <<-EOL
196
+ Add -h to any of the commands for more help. Examples:
197
+
198
+ jets call -h
199
+ jets routes -h
200
+ jets deploy -h
201
+ jets status -h
202
+ jets dynamodb:create -h
203
+ jets db:create -h
204
+
205
+ EOL
206
+ end
207
+
208
+ end