jets 3.1.0 → 5.0.0

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 (641) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.gitignore +5 -1
  4. data/CHANGELOG.md +141 -0
  5. data/Gemfile +1 -5
  6. data/LICENSE.txt +1 -1
  7. data/README.md +21 -43
  8. data/Rakefile +3 -3
  9. data/backers.md +0 -5
  10. data/engines/internal/app/controllers/jets/application_controller.rb +28 -0
  11. data/engines/internal/app/controllers/jets/bare_controller.rb +6 -0
  12. data/engines/internal/app/controllers/jets/health_controller.rb +55 -0
  13. data/engines/internal/app/controllers/jets/info_controller.rb +45 -0
  14. data/{lib/jets → engines}/internal/app/controllers/jets/mailers_controller.rb +12 -14
  15. data/{lib/jets → engines}/internal/app/controllers/jets/mount_controller.rb +6 -10
  16. data/{lib/jets → engines}/internal/app/controllers/jets/public_controller.rb +6 -2
  17. data/engines/internal/app/controllers/jets/welcome_controller.rb +9 -0
  18. data/engines/internal/app/functions/jets/base_path.rb +109 -0
  19. data/engines/internal/app/functions/jets/base_path_mapping.rb +191 -0
  20. data/engines/internal/app/jobs/jets/preheat_job.rb +67 -0
  21. data/engines/internal/app/views/jets/info/properties.html.erb +1 -0
  22. data/engines/internal/app/views/jets/info/routes.html.erb +10 -0
  23. data/{lib/jets → engines}/internal/app/views/jets/mailers/email.html.erb +37 -17
  24. data/engines/internal/app/views/jets/mailers/index.html.erb +8 -0
  25. data/engines/internal/app/views/jets/mailers/mailer.html.erb +6 -0
  26. data/{lib/jets/commands/templates/skeleton/public/index.html.tt → engines/internal/app/views/jets/welcome/index.html.erb} +8 -4
  27. data/engines/internal/app/views/layouts/application.html.erb +51 -0
  28. data/engines/internal/lib/internal/actiondispatch.rb +39 -0
  29. data/engines/internal/lib/internal/actionmailer.rb +51 -0
  30. data/engines/internal/lib/internal/actionview.rb +152 -0
  31. data/engines/internal/lib/internal/activerecord.rb +37 -0
  32. data/engines/internal/lib/internal/activesupport.rb +47 -0
  33. data/engines/internal/lib/internal/engine.rb +13 -0
  34. data/engines/internal/lib/internal/i18n_engine.rb +19 -0
  35. data/engines/internal/lib/internal/jets_controller.rb +46 -0
  36. data/engines/internal/lib/internal/overrides/debug_exceptions.rb +40 -0
  37. data/engines/internal/lib/internal/templates/rescues/_trace.html.erb +62 -0
  38. data/engines/internal/lib/internal/templates/rescues/_trace.text.erb +9 -0
  39. data/engines/internal/lib/internal/turbines/asset_tag_helper.rb +70 -0
  40. data/engines/internal/lib/internal/turbines/helpers.rb +18 -0
  41. data/engines/internal/lib/internal/turbines/routes_helpers.rb +42 -0
  42. data/exe/jets +1 -10
  43. data/jets.gemspec +16 -13
  44. data/lib/jets/app_loader.rb +77 -0
  45. data/lib/jets/application/bootstrap.rb +100 -0
  46. data/lib/jets/application/configuration/defaults.rb +256 -0
  47. data/lib/jets/application/configuration.rb +494 -0
  48. data/lib/jets/application/default_middleware_stack.rb +140 -0
  49. data/lib/jets/application/dummy_erb_compiler.rb +18 -0
  50. data/lib/jets/application/finisher.rb +266 -0
  51. data/lib/jets/application/routes_reloader.rb +80 -0
  52. data/lib/jets/application.rb +515 -199
  53. data/lib/jets/authorizer/base.rb +1 -0
  54. data/lib/jets/authorizer/dsl.rb +15 -11
  55. data/lib/jets/authorizer/helpers/iam_helper.rb +13 -11
  56. data/lib/jets/autoloaders/gem.rb +70 -0
  57. data/lib/jets/autoloaders/inflector.rb +21 -0
  58. data/lib/jets/autoloaders.rb +38 -101
  59. data/lib/jets/aws_info.rb +2 -2
  60. data/lib/jets/aws_services/stack_status.rb +1 -1
  61. data/lib/jets/aws_services.rb +8 -0
  62. data/lib/jets/backtrace_cleaner.rb +27 -0
  63. data/lib/jets/booter.rb +30 -118
  64. data/lib/jets/builders/code_builder.rb +64 -122
  65. data/lib/jets/builders/code_size.rb +1 -0
  66. data/lib/jets/builders/gem_replacer.rb +6 -12
  67. data/lib/jets/builders/handler_generator.rb +34 -14
  68. data/lib/jets/builders/lambda_layer.rb +2 -7
  69. data/lib/jets/builders/purger.rb +1 -1
  70. data/lib/jets/builders/rack_packager.rb +1 -1
  71. data/lib/jets/builders/ruby_packager.rb +54 -10
  72. data/lib/jets/builders/shim_vars/app.rb +10 -6
  73. data/lib/jets/builders/templates/handlers/one_lambda_for_all_controllers.rb +33 -0
  74. data/lib/jets/builders/templates/handlers/one_lambda_per_controller.rb +20 -0
  75. data/lib/jets/builders/templates/{handler.rb → handlers/one_lambda_per_method.rb} +6 -0
  76. data/lib/jets/bundle.rb +2 -9
  77. data/lib/jets/cfn/base.rb +82 -0
  78. data/lib/jets/cfn/builder/api/base.rb +12 -0
  79. data/lib/jets/cfn/{builders/api_deployment_builder.rb → builder/api/deployment.rb} +11 -21
  80. data/lib/jets/cfn/builder/api/gateway.rb +104 -0
  81. data/lib/jets/cfn/builder/api/mapping.rb +54 -0
  82. data/lib/jets/cfn/builder/api/methods.rb +72 -0
  83. data/lib/jets/cfn/builder/api/paged.rb +30 -0
  84. data/lib/jets/cfn/builder/api/pages/base.rb +105 -0
  85. data/lib/jets/cfn/builder/api/pages/methods.rb +17 -0
  86. data/lib/jets/cfn/builder/api/pages/page.rb +19 -0
  87. data/lib/jets/cfn/builder/api/pages/resources.rb +21 -0
  88. data/lib/jets/cfn/builder/api/resources.rb +40 -0
  89. data/lib/jets/cfn/{builders/authorizer_builder.rb → builder/authorizer.rb} +16 -19
  90. data/lib/jets/cfn/builder/controller.rb +28 -0
  91. data/lib/jets/cfn/builder/function.rb +9 -0
  92. data/lib/jets/cfn/builder/interface.rb +146 -0
  93. data/lib/jets/cfn/builder/job.rb +10 -0
  94. data/lib/jets/cfn/builder/nested.rb +130 -0
  95. data/lib/jets/cfn/builder/one_controller.rb +53 -0
  96. data/lib/jets/cfn/{builders/parent_builder → builder/parent}/stagger.rb +1 -1
  97. data/lib/jets/cfn/builder/parent.rb +149 -0
  98. data/lib/jets/cfn/builder/post_process.rb +25 -0
  99. data/lib/jets/cfn/{builders/rule_builder.rb → builder/rule.rb} +4 -8
  100. data/lib/jets/cfn/{builders/shared_builder.rb → builder/shared.rb} +5 -4
  101. data/lib/jets/cfn/{builders → builder}/util/source.rb +1 -1
  102. data/lib/jets/{commands/build.rb → cfn/builder.rb} +50 -78
  103. data/lib/jets/cfn/deployment.rb +45 -0
  104. data/lib/jets/cfn/download.rb +39 -0
  105. data/lib/jets/cfn/params/api/base.rb +39 -0
  106. data/lib/jets/cfn/params/api/cors.rb +10 -0
  107. data/lib/jets/cfn/params/api/methods.rb +69 -0
  108. data/lib/jets/cfn/params/api/resources.rb +28 -0
  109. data/lib/jets/{resource/child_stack/common_parameters.rb → cfn/params/common.rb} +3 -3
  110. data/lib/jets/{resource → cfn/resource}/api_gateway/authorizer.rb +21 -21
  111. data/lib/jets/cfn/resource/api_gateway/base_path/function.rb +57 -0
  112. data/lib/jets/{resource → cfn/resource}/api_gateway/base_path/mapping.rb +13 -12
  113. data/lib/jets/cfn/resource/api_gateway/base_path/role.rb +70 -0
  114. data/lib/jets/{resource → cfn/resource}/api_gateway/deployment.rb +13 -20
  115. data/lib/jets/{resource → cfn/resource}/api_gateway/domain_name.rb +11 -11
  116. data/lib/jets/{resource → cfn/resource}/api_gateway/method/authorization.rb +1 -1
  117. data/lib/jets/cfn/resource/api_gateway/method.rb +92 -0
  118. data/lib/jets/{resource → cfn/resource}/api_gateway/resource.rb +14 -10
  119. data/lib/jets/cfn/resource/api_gateway/resource_id.rb +25 -0
  120. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/change_detection.rb +1 -1
  121. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/logical_id/message.rb +14 -4
  122. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/logical_id.rb +2 -2
  123. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/base.rb +15 -41
  124. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/media_types.rb +3 -3
  125. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/page.rb +6 -6
  126. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/to.rb +8 -3
  127. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/variable.rb +2 -2
  128. data/lib/jets/cfn/resource/api_gateway/rest_api/routes/change.rb +27 -0
  129. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/collision/variable_exception.rb +1 -1
  130. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/collision.rb +1 -1
  131. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes.rb +1 -1
  132. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api.rb +22 -12
  133. data/lib/jets/{resource → cfn/resource}/associated.rb +1 -1
  134. data/lib/jets/{resource → cfn/resource}/config/config_rule.rb +18 -18
  135. data/lib/jets/{resource → cfn/resource}/config/managed_rule.rb +5 -5
  136. data/lib/jets/{resource → cfn/resource}/events/rule.rb +10 -10
  137. data/lib/jets/{resource → cfn/resource}/iam/application_role.rb +4 -4
  138. data/lib/jets/cfn/resource/iam/base_role_definition.rb +56 -0
  139. data/lib/jets/{resource → cfn/resource}/iam/class_role.rb +5 -5
  140. data/lib/jets/{resource → cfn/resource}/iam/function_role.rb +6 -6
  141. data/lib/jets/{resource → cfn/resource}/iam/managed_policy.rb +1 -1
  142. data/lib/jets/cfn/resource/iam/policy.rb +31 -0
  143. data/lib/jets/{resource → cfn/resource}/iam/policy_document.rb +10 -9
  144. data/lib/jets/{resource → cfn/resource}/iot/topic_rule.rb +10 -10
  145. data/lib/jets/{resource → cfn/resource}/lambda/event_source_mapping.rb +9 -9
  146. data/lib/jets/cfn/resource/lambda/function/controller.rb +21 -0
  147. data/lib/jets/{resource → cfn/resource}/lambda/function/environment.rb +9 -7
  148. data/lib/jets/cfn/resource/lambda/function.rb +266 -0
  149. data/lib/jets/{resource → cfn/resource}/lambda/gem_layer.rb +2 -2
  150. data/lib/jets/{resource → cfn/resource}/lambda/layer_version.rb +10 -10
  151. data/lib/jets/cfn/resource/lambda/permission.rb +51 -0
  152. data/lib/jets/cfn/resource/logs/subscription_filter.rb +31 -0
  153. data/lib/jets/cfn/resource/nested/api/base.rb +4 -0
  154. data/lib/jets/cfn/resource/nested/api/deployment.rb +53 -0
  155. data/lib/jets/cfn/resource/nested/api/gateway.rb +15 -0
  156. data/lib/jets/cfn/resource/nested/api/mapping.rb +33 -0
  157. data/lib/jets/cfn/resource/nested/api/methods.rb +30 -0
  158. data/lib/jets/cfn/resource/nested/api/page.rb +8 -0
  159. data/lib/jets/cfn/resource/nested/api/resources.rb +22 -0
  160. data/lib/jets/{resource/child_stack → cfn/resource/nested}/app_class.rb +15 -48
  161. data/lib/jets/{resource/child_stack → cfn/resource/nested}/authorizer.rb +8 -14
  162. data/lib/jets/cfn/resource/nested/base.rb +38 -0
  163. data/lib/jets/cfn/resource/nested/one_controller.rb +48 -0
  164. data/lib/jets/{resource/child_stack → cfn/resource/nested}/shared.rb +10 -16
  165. data/lib/jets/cfn/resource/one/function.rb +66 -0
  166. data/lib/jets/cfn/resource/one/permission.rb +17 -0
  167. data/lib/jets/{resource → cfn/resource}/replacer.rb +26 -27
  168. data/lib/jets/{resource → cfn/resource}/route53/record_set.rb +18 -18
  169. data/lib/jets/{resource → cfn/resource}/s3/bucket.rb +4 -4
  170. data/lib/jets/cfn/resource/s3/jets_bucket.rb +68 -0
  171. data/lib/jets/{resource → cfn/resource}/sns/subscription.rb +8 -8
  172. data/lib/jets/{resource → cfn/resource}/sns/topic.rb +10 -10
  173. data/lib/jets/{resource → cfn/resource}/sns/topic_policy.rb +13 -13
  174. data/lib/jets/{resource → cfn/resource}/sqs/queue.rb +5 -5
  175. data/lib/jets/{resource → cfn/resource}/standardizer.rb +8 -9
  176. data/lib/jets/cfn/resource.rb +8 -0
  177. data/lib/jets/cfn/ship.rb +30 -16
  178. data/lib/jets/cfn/status.rb +1 -1
  179. data/lib/jets/cfn/template.rb +89 -0
  180. data/lib/jets/cfn/upload.rb +26 -23
  181. data/lib/jets/cli.rb +28 -203
  182. data/lib/jets/command/actions.rb +49 -0
  183. data/lib/jets/command/api_helpers.rb +41 -0
  184. data/lib/jets/command/aws_helpers.rb +26 -0
  185. data/lib/jets/command/base.rb +204 -0
  186. data/lib/jets/command/behavior.rb +83 -0
  187. data/lib/jets/command/environment_argument.rb +42 -0
  188. data/lib/jets/command/help/call.md +48 -0
  189. data/lib/jets/{commands → command}/help/deploy.md +1 -1
  190. data/lib/jets/command/help/logs.md +21 -0
  191. data/lib/jets/{commands → command}/help/new.md +3 -4
  192. data/lib/jets/command/help/projects.md +6 -0
  193. data/lib/jets/command/help/releases.md +37 -0
  194. data/lib/jets/command/help/rollback.md +5 -0
  195. data/lib/jets/command/help/routes.md +15 -0
  196. data/lib/jets/command/help/runner.md +40 -0
  197. data/lib/jets/command/help/stacks.md +6 -0
  198. data/lib/jets/command/help.rb +17 -0
  199. data/lib/jets/command/helpers/editor.rb +35 -0
  200. data/lib/jets/command.rb +133 -0
  201. data/lib/jets/commands/application/application_command.rb +40 -0
  202. data/lib/jets/commands/build/build_command.rb +33 -0
  203. data/lib/jets/commands/call/anonymous_guesser.rb +1 -1
  204. data/lib/jets/commands/call/autoload_guesser.rb +2 -2
  205. data/lib/jets/commands/call/base_guesser.rb +5 -5
  206. data/lib/jets/commands/call/call_command.rb +27 -0
  207. data/lib/jets/commands/call/caller.rb +184 -0
  208. data/lib/jets/commands/call/guesser.rb +1 -1
  209. data/lib/jets/commands/clean/base.rb +1 -1
  210. data/lib/jets/commands/clean/build.rb +1 -1
  211. data/lib/jets/commands/clean/clean_command.rb +15 -0
  212. data/lib/jets/commands/clean/log.rb +4 -4
  213. data/lib/jets/commands/configure/configure_command.rb +9 -0
  214. data/lib/jets/commands/console/console_command.rb +38 -0
  215. data/lib/jets/commands/credentials/USAGE +103 -0
  216. data/lib/jets/commands/credentials/credentials_command/diffing.rb +51 -0
  217. data/lib/jets/commands/credentials/credentials_command.rb +139 -0
  218. data/lib/jets/commands/db/system/change/change_command.rb +24 -0
  219. data/lib/jets/commands/dbconsole/dbconsole_command.rb +184 -0
  220. data/lib/jets/commands/degenerate/degenerate_command.rb +21 -0
  221. data/lib/jets/commands/delete/delete_command.rb +155 -0
  222. data/lib/jets/commands/{deploy.rb → deploy/deploy_command.rb} +30 -49
  223. data/lib/jets/commands/dev/dev_command.rb +19 -0
  224. data/lib/jets/commands/{dotenv.rb → dotenv/dotenv_command.rb} +2 -2
  225. data/lib/jets/commands/encrypted/USAGE +46 -0
  226. data/lib/jets/commands/encrypted/encrypted_command.rb +87 -0
  227. data/lib/jets/commands/gems/gems_command.rb +14 -0
  228. data/lib/jets/commands/generate/generate_command.rb +95 -0
  229. data/lib/jets/commands/help/USAGE +20 -0
  230. data/lib/jets/commands/help/help_command.rb +15 -0
  231. data/lib/jets/commands/initializers/initializers_command.rb +19 -0
  232. data/lib/jets/commands/logs/logs_command.rb +45 -0
  233. data/lib/jets/commands/new/new_command.rb +19 -0
  234. data/lib/jets/commands/notes/notes_command.rb +30 -0
  235. data/lib/jets/commands/plugin/plugin_command.rb +45 -0
  236. data/lib/jets/commands/projects/projects_command.rb +30 -0
  237. data/lib/jets/commands/rake/rake_command.rb +59 -0
  238. data/lib/jets/commands/releases/releases_command.rb +72 -0
  239. data/lib/jets/commands/rollback/rollback_command.rb +41 -0
  240. data/lib/jets/commands/routes/routes_command.rb +19 -0
  241. data/lib/jets/commands/runner/runner_command.rb +60 -0
  242. data/lib/jets/commands/server/server_command.rb +291 -0
  243. data/lib/jets/commands/stacks/stacks_command.rb +39 -0
  244. data/lib/jets/commands/status/status_command.rb +9 -0
  245. data/lib/jets/commands/url/url_command.rb +92 -0
  246. data/lib/jets/commands/version/version_command.rb +11 -0
  247. data/lib/jets/commands.rb +17 -0
  248. data/lib/jets/configuration.rb +166 -0
  249. data/lib/jets/controller/base.rb +105 -183
  250. data/lib/jets/controller/compat/abstract_controller/base.rb +126 -0
  251. data/lib/jets/controller/compat/action_controller/metal.rb +99 -0
  252. data/lib/jets/controller/compat/caching.rb +13 -0
  253. data/lib/jets/controller/compat/future.rb +13 -0
  254. data/lib/jets/controller/compat/route_set.rb +47 -0
  255. data/lib/jets/controller/decorate/apigw_stage.rb +39 -0
  256. data/lib/jets/controller/{authorization.rb → decorate/authorization.rb} +1 -1
  257. data/lib/jets/controller/decorate/logging.rb +90 -0
  258. data/lib/jets/controller/decorate/redirecting.rb +16 -0
  259. data/lib/jets/controller/decorate/url_for.rb +10 -0
  260. data/lib/jets/controller/{rack/adapter.rb → handler/apigw.rb} +36 -37
  261. data/lib/jets/controller/handler.rb +41 -0
  262. data/lib/jets/controller/middleware/main.rb +16 -8
  263. data/lib/jets/controller/middleware/{local/api_gateway.rb → mimic/apigw.rb} +41 -4
  264. data/lib/jets/controller/middleware/mimic/lambda_context.rb +44 -0
  265. data/lib/jets/controller/middleware/{local.rb → mimic.rb} +36 -51
  266. data/lib/jets/controller/rack_adapter/action.rb +35 -0
  267. data/lib/jets/controller/{rack → rack_adapter}/env.rb +39 -18
  268. data/lib/jets/controller/request/compat/params.rb +144 -0
  269. data/lib/jets/controller/request/compat/request.rb +125 -0
  270. data/lib/jets/controller/request.rb +35 -18
  271. data/lib/jets/controller/response/compat/response.rb +67 -0
  272. data/lib/jets/controller/response.rb +91 -8
  273. data/lib/jets/core.rb +153 -50
  274. data/lib/jets/core_ext/file.rb +9 -0
  275. data/lib/jets/core_ext/kernel.rb +2 -2
  276. data/lib/jets/core_ext/symbol.rb +5 -0
  277. data/lib/jets/core_ext.rb +4 -0
  278. data/lib/jets/dev_caching.rb +44 -0
  279. data/lib/jets/dotenv/ssm.rb +5 -2
  280. data/lib/jets/dotenv.rb +4 -3
  281. data/lib/jets/engine/configuration.rb +96 -0
  282. data/lib/jets/engine/turbines.rb +23 -0
  283. data/lib/jets/engine.rb +380 -0
  284. data/lib/jets/erb.rb +1 -1
  285. data/lib/jets/exception_reporting.rb +43 -0
  286. data/lib/jets/generators/job/job_generator.rb +41 -0
  287. data/lib/jets/generators/job/templates/event_types/dynamodb.rb.tt +8 -0
  288. data/lib/jets/generators/job/templates/event_types/iot.rb.tt +8 -0
  289. data/lib/jets/generators/job/templates/event_types/kinesis.rb.tt +9 -0
  290. data/lib/jets/generators/job/templates/event_types/log.rb.tt +9 -0
  291. data/lib/jets/generators/job/templates/event_types/rule.rb.tt +23 -0
  292. data/lib/jets/generators/job/templates/event_types/s3.rb.tt +11 -0
  293. data/lib/jets/{generator/templates/active_job/job/templates/job.rb.tt → generators/job/templates/event_types/scheduled.rb.tt} +3 -3
  294. data/lib/jets/generators/job/templates/event_types/sns.rb.tt +9 -0
  295. data/lib/jets/generators/job/templates/event_types/sqs.rb.tt +9 -0
  296. data/lib/jets/generators/overrides/app/USAGE +38 -0
  297. data/lib/jets/generators/overrides/app/app_generator.rb +148 -0
  298. data/lib/jets/generators/overrides/app/helpers.rb +139 -0
  299. data/lib/jets/generators/overrides/app/templates/.env +10 -0
  300. data/lib/jets/{commands/templates/skeleton/.gitignore → generators/overrides/app/templates/.gitignore.tt} +2 -1
  301. data/lib/jets/generators/overrides/app/templates/Gemfile.tt +25 -0
  302. data/lib/jets/generators/overrides/app/templates/Rakefile +2 -0
  303. data/lib/jets/generators/overrides/app/templates/app/assets/config/manifest.js +3 -0
  304. data/lib/jets/generators/overrides/app/templates/app/assets/stylesheets/application.css +15 -0
  305. data/lib/jets/generators/overrides/app/templates/app/javascript/application.js +5 -0
  306. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/models/application_record.rb +1 -1
  307. data/lib/jets/generators/overrides/app/templates/app/views/layouts/application.html.erb.tt +30 -0
  308. data/lib/jets/generators/overrides/app/templates/bin/jets +3 -0
  309. data/lib/jets/generators/overrides/app/templates/config/application.rb.tt +15 -0
  310. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/config/database.yml.tt +1 -1
  311. data/lib/jets/generators/overrides/app/templates/config/environments/development.rb.tt +29 -0
  312. data/lib/jets/generators/overrides/app/templates/config/environments/production.rb.tt +19 -0
  313. data/lib/jets/generators/overrides/app/templates/config/environments/test.rb.tt +23 -0
  314. data/lib/jets/generators/overrides/app/templates/config/initializers/content_security_policy.rb +31 -0
  315. data/lib/jets/generators/overrides/app/templates/config/initializers/filter_parameter_logging.rb +8 -0
  316. data/lib/jets/generators/overrides/app/templates/config/initializers/permissions_policy.rb +11 -0
  317. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/config/routes.rb +5 -1
  318. data/lib/jets/generators/overrides/app/templates/db/.gitkeep +0 -0
  319. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/404.html +6 -6
  320. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/422.html +6 -6
  321. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/500.html +6 -6
  322. data/lib/jets/generators/overrides/templates/erb/scaffold/index.html.erb +22 -0
  323. data/lib/jets/generators/overrides/templates/erb/scaffold/partial.html.erb +8 -0
  324. data/lib/jets/{generator/templates/rails/scaffold_controller/api_controller.rb → generators/overrides/templates/rails/scaffold_controller/api_controller.rb.tt} +5 -9
  325. data/lib/jets/generators/overrides/templates/rails/scaffold_controller/controller.rb.tt +67 -0
  326. data/lib/jets/generators.rb +112 -0
  327. data/lib/jets/inflections.rb +1 -1
  328. data/lib/jets/info.rb +116 -0
  329. data/lib/jets/initializable.rb +95 -0
  330. data/lib/jets/job/base.rb +5 -2
  331. data/lib/jets/job/dsl/dynamodb_event.rb +19 -9
  332. data/lib/jets/job/dsl/event_source_mapping.rb +1 -1
  333. data/lib/jets/job/dsl/iot_event.rb +6 -6
  334. data/lib/jets/job/dsl/kinesis_event.rb +5 -5
  335. data/lib/jets/job/dsl/log_event.rb +2 -2
  336. data/lib/jets/job/dsl/rule_event.rb +7 -4
  337. data/lib/jets/job/dsl/s3_event.rb +1 -1
  338. data/lib/jets/job/dsl/sns_event.rb +6 -6
  339. data/lib/jets/job/dsl/sqs_event.rb +11 -11
  340. data/lib/jets/job/helpers/sns_event_helper.rb +8 -0
  341. data/lib/jets/job/helpers/sqs_event_helper.rb +8 -0
  342. data/lib/jets/klass.rb +5 -6
  343. data/lib/jets/lambda/definition.rb +118 -0
  344. data/lib/jets/lambda/dsl/warnings.rb +57 -0
  345. data/lib/jets/lambda/dsl.rb +73 -54
  346. data/lib/jets/lambda/function.rb +3 -3
  347. data/lib/jets/lambda/function_constructor.rb +6 -6
  348. data/lib/jets/lambda/functions.rb +36 -1
  349. data/lib/jets/mega/hash_converter.rb +2 -2
  350. data/lib/jets/mega/request/source.rb +1 -2
  351. data/lib/jets/mega/request.rb +4 -4
  352. data/lib/jets/names.rb +79 -0
  353. data/lib/jets/overrides/dummy/rails.rb +11 -0
  354. data/lib/jets/overrides/lambda/marshaller.rb +10 -0
  355. data/lib/jets/overrides/puma.rb +10 -0
  356. data/lib/jets/paths.rb +243 -0
  357. data/lib/jets/{poly_fun → poly}/base_executor.rb +13 -13
  358. data/lib/jets/{poly_fun → poly}/lambda_executor.rb +2 -2
  359. data/lib/jets/{poly_fun → poly}/node_error.rb +1 -1
  360. data/lib/jets/{poly_fun → poly}/node_executor.rb +4 -4
  361. data/lib/jets/{poly_fun → poly}/python_error.rb +1 -1
  362. data/lib/jets/{poly_fun → poly}/python_executor.rb +2 -2
  363. data/lib/jets/{poly_fun.rb → poly.rb} +12 -12
  364. data/lib/jets/preheat.rb +26 -33
  365. data/lib/jets/processors/deducer.rb +2 -2
  366. data/lib/jets/processors/main_processor.rb +6 -13
  367. data/lib/jets/rack/logger.rb +77 -0
  368. data/lib/jets/router/compat/route_set.rb +177 -0
  369. data/lib/jets/router/dsl/mount.rb +40 -6
  370. data/lib/jets/router/dsl.rb +125 -105
  371. data/lib/jets/router/engine_mount.rb +36 -0
  372. data/lib/jets/router/help.rb +130 -0
  373. data/lib/jets/router/helpers/named_routes/add_full_url.rb +13 -0
  374. data/lib/jets/router/helpers/named_routes/generated.rb +197 -0
  375. data/lib/jets/router/helpers/named_routes/proxy.rb +66 -0
  376. data/lib/jets/router/matcher.rb +140 -17
  377. data/lib/jets/router/resources/options.rb +6 -4
  378. data/lib/jets/router/route/after_initialize.rb +64 -0
  379. data/lib/jets/router/route/as.rb +93 -0
  380. data/lib/jets/router/route/authorizer.rb +1 -0
  381. data/lib/jets/router/route/compat.rb +45 -0
  382. data/lib/jets/router/route/info.rb +74 -0
  383. data/lib/jets/router/route/node.rb +137 -0
  384. data/lib/jets/router/route/path.rb +93 -0
  385. data/lib/jets/router/route.rb +109 -90
  386. data/lib/jets/router/route_set.rb +214 -0
  387. data/lib/jets/router/scope.rb +204 -69
  388. data/lib/jets/router/state.rb +67 -0
  389. data/lib/jets/router/util.rb +1 -31
  390. data/lib/jets/router.rb +64 -150
  391. data/lib/jets/ruby_version_check.rb +15 -0
  392. data/lib/jets/rule/base.rb +1 -0
  393. data/lib/jets/rule/dsl.rb +7 -7
  394. data/lib/jets/secrets.rb +110 -0
  395. data/lib/jets/spec_helpers/controllers/request.rb +22 -16
  396. data/lib/jets/spec_helpers/controllers.rb +32 -24
  397. data/lib/jets/spec_helpers.rb +0 -6
  398. data/lib/jets/stack/builder.rb +3 -2
  399. data/lib/jets/stack/definition.rb +1 -4
  400. data/lib/jets/stack/function.rb +2 -2
  401. data/lib/jets/stack/main/dsl/cloudwatch.rb +4 -4
  402. data/lib/jets/stack/main/dsl/kinesis.rb +2 -2
  403. data/lib/jets/stack/main/dsl/lambda.rb +26 -19
  404. data/lib/jets/stack/main/dsl/sqs.rb +2 -2
  405. data/lib/jets/stack/output/lookup.rb +1 -1
  406. data/lib/jets/stack/output.rb +2 -2
  407. data/lib/jets/stack/parameter.rb +2 -2
  408. data/lib/jets/stack/resource.rb +3 -3
  409. data/lib/jets/stack/s3_event.rb +51 -37
  410. data/lib/jets/stack.rb +1 -1
  411. data/lib/jets/tasks/engine.rake +85 -0
  412. data/lib/jets/tasks/framework.rake +66 -0
  413. data/lib/jets/tasks/log.rake +41 -0
  414. data/lib/jets/tasks/middleware.rake +9 -0
  415. data/lib/jets/tasks/misc.rake +81 -0
  416. data/lib/jets/tasks/statistics.rake +37 -0
  417. data/lib/jets/tasks/tmp.rake +51 -0
  418. data/lib/jets/tasks/yarn.rake +29 -0
  419. data/lib/jets/tasks/zeitwerk.rake +61 -0
  420. data/lib/jets/tasks.rb +18 -0
  421. data/lib/jets/tmp_loader.rb +1 -1
  422. data/lib/jets/turbine/configurable.rb +36 -0
  423. data/lib/jets/turbine/configuration.rb +101 -0
  424. data/lib/jets/turbine.rb +164 -20
  425. data/lib/jets/util/camelize.rb +24 -0
  426. data/lib/jets/util/yamler.rb +16 -0
  427. data/lib/jets/version.rb +1 -1
  428. data/lib/jets.rb +8 -14
  429. metadata +444 -347
  430. data/.python-version +0 -1
  431. data/.ruby-version +0 -1
  432. data/bin/release +0 -9
  433. data/lib/jets/application/defaults.rb +0 -200
  434. data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +0 -16
  435. data/lib/jets/builders/reconfigure_rails.rb +0 -114
  436. data/lib/jets/cfn/builders/api_gateway_builder.rb +0 -123
  437. data/lib/jets/cfn/builders/api_resources_builder.rb +0 -44
  438. data/lib/jets/cfn/builders/base_child_builder.rb +0 -69
  439. data/lib/jets/cfn/builders/controller_builder.rb +0 -50
  440. data/lib/jets/cfn/builders/function_builder.rb +0 -14
  441. data/lib/jets/cfn/builders/interface.rb +0 -133
  442. data/lib/jets/cfn/builders/job_builder.rb +0 -14
  443. data/lib/jets/cfn/builders/parent_builder.rb +0 -130
  444. data/lib/jets/cfn/built_template.rb +0 -15
  445. data/lib/jets/cfn/template_source.rb +0 -61
  446. data/lib/jets/commands/base.rb +0 -145
  447. data/lib/jets/commands/call.rb +0 -182
  448. data/lib/jets/commands/clean.rb +0 -19
  449. data/lib/jets/commands/configure.rb +0 -51
  450. data/lib/jets/commands/console.rb +0 -12
  451. data/lib/jets/commands/db/environment-task.rake +0 -3
  452. data/lib/jets/commands/db/tasks/dummy/app.rb +0 -25
  453. data/lib/jets/commands/db/tasks/dummy/config.rb +0 -14
  454. data/lib/jets/commands/db/tasks.rb +0 -34
  455. data/lib/jets/commands/db.rb +0 -13
  456. data/lib/jets/commands/dbconsole.rb +0 -134
  457. data/lib/jets/commands/delete.rb +0 -136
  458. data/lib/jets/commands/dynamodb/migrate.rb +0 -9
  459. data/lib/jets/commands/dynamodb/migrator.rb +0 -36
  460. data/lib/jets/commands/dynamodb.rb +0 -19
  461. data/lib/jets/commands/gems.rb +0 -13
  462. data/lib/jets/commands/help/call.md +0 -69
  463. data/lib/jets/commands/help/dynamodb/generate.md +0 -52
  464. data/lib/jets/commands/help/dynamodb/migrate.md +0 -4
  465. data/lib/jets/commands/help/routes.md +0 -16
  466. data/lib/jets/commands/help/runner.md +0 -17
  467. data/lib/jets/commands/help.rb +0 -9
  468. data/lib/jets/commands/import/base.rb +0 -49
  469. data/lib/jets/commands/import/cheatsheet.rb +0 -35
  470. data/lib/jets/commands/import/rack.rb +0 -16
  471. data/lib/jets/commands/import/rails.rb +0 -74
  472. data/lib/jets/commands/import/sequence.rb +0 -90
  473. data/lib/jets/commands/import/templates/config/database.yml +0 -30
  474. data/lib/jets/commands/import/templates/submodules-cheatsheet.md +0 -89
  475. data/lib/jets/commands/import.rb +0 -12
  476. data/lib/jets/commands/main.rb +0 -166
  477. data/lib/jets/commands/markdown/creator.rb +0 -58
  478. data/lib/jets/commands/markdown/index.rb +0 -27
  479. data/lib/jets/commands/markdown/page.rb +0 -125
  480. data/lib/jets/commands/markdown/shell.rb +0 -11
  481. data/lib/jets/commands/new.rb +0 -173
  482. data/lib/jets/commands/rake_command.rb +0 -61
  483. data/lib/jets/commands/rake_tasks.rb +0 -50
  484. data/lib/jets/commands/runner.rb +0 -16
  485. data/lib/jets/commands/sequence.rb +0 -105
  486. data/lib/jets/commands/stack_info.rb +0 -30
  487. data/lib/jets/commands/templates/skeleton/.env.development.tt +0 -3
  488. data/lib/jets/commands/templates/skeleton/.env.test +0 -3
  489. data/lib/jets/commands/templates/skeleton/.env.tt +0 -3
  490. data/lib/jets/commands/templates/skeleton/.jetskeep +0 -1
  491. data/lib/jets/commands/templates/skeleton/Gemfile.tt +0 -40
  492. data/lib/jets/commands/templates/skeleton/Procfile +0 -7
  493. data/lib/jets/commands/templates/skeleton/Rakefile +0 -2
  494. data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +0 -2
  495. data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +0 -26
  496. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +0 -71
  497. data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +0 -22
  498. data/lib/jets/commands/templates/skeleton/config/environments/development.rb +0 -7
  499. data/lib/jets/commands/templates/skeleton/config/environments/production.rb +0 -9
  500. data/lib/jets/commands/templates/skeleton/config/environments/test.rb +0 -7
  501. data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +0 -23
  502. data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +0 -24
  503. data/lib/jets/commands/upgrade/templates/bin/webpack +0 -19
  504. data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +0 -19
  505. data/lib/jets/commands/upgrade/version1.rb +0 -136
  506. data/lib/jets/commands/upgrade.rb +0 -105
  507. data/lib/jets/commands/url.rb +0 -69
  508. data/lib/jets/commands/webpacker_template.rb +0 -18
  509. data/lib/jets/controller/callbacks.rb +0 -73
  510. data/lib/jets/controller/cookies/jar.rb +0 -269
  511. data/lib/jets/controller/cookies.rb +0 -38
  512. data/lib/jets/controller/error/invalid_authenticity_token.rb +0 -6
  513. data/lib/jets/controller/error.rb +0 -4
  514. data/lib/jets/controller/forgery_protection.rb +0 -43
  515. data/lib/jets/controller/layout.rb +0 -17
  516. data/lib/jets/controller/middleware/cors.rb +0 -60
  517. data/lib/jets/controller/middleware/local/mimic_aws_call.rb +0 -38
  518. data/lib/jets/controller/middleware/local/route_matcher.rb +0 -22
  519. data/lib/jets/controller/middleware/reloader.rb +0 -15
  520. data/lib/jets/controller/parameters_filter.rb +0 -29
  521. data/lib/jets/controller/params.rb +0 -117
  522. data/lib/jets/controller/redirection.rb +0 -61
  523. data/lib/jets/controller/rendering/rack_renderer.rb +0 -267
  524. data/lib/jets/controller/rendering.rb +0 -96
  525. data/lib/jets/controller/stage.rb +0 -34
  526. data/lib/jets/controller.rb +0 -3
  527. data/lib/jets/db.rb +0 -15
  528. data/lib/jets/generator/templates/erb/controller/view.html.erb +0 -2
  529. data/lib/jets/generator/templates/erb/scaffold/index.html.erb +0 -29
  530. data/lib/jets/generator/templates/rails/controller/controller.rb +0 -13
  531. data/lib/jets/generator/templates/rails/helper/helper.rb +0 -4
  532. data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +0 -67
  533. data/lib/jets/generator.rb +0 -112
  534. data/lib/jets/internal/app/controllers/jets/bare_controller.rb +0 -16
  535. data/lib/jets/internal/app/controllers/jets/rack_controller.rb +0 -12
  536. data/lib/jets/internal/app/functions/jets/base_path.rb +0 -18
  537. data/lib/jets/internal/app/functions/jets/base_path_mapping.rb +0 -100
  538. data/lib/jets/internal/app/helpers/jets/mailers_helper.rb +0 -9
  539. data/lib/jets/internal/app/jobs/jets/preheat_job.rb +0 -70
  540. data/lib/jets/internal/app/views/jets/mailers/index.html.erb +0 -8
  541. data/lib/jets/internal/app/views/jets/mailers/mailer.html.erb +0 -6
  542. data/lib/jets/internal/turbines/jets/mailer.rb +0 -52
  543. data/lib/jets/lambda/task.rb +0 -111
  544. data/lib/jets/logger.rb +0 -21
  545. data/lib/jets/middleware/configurator.rb +0 -84
  546. data/lib/jets/middleware/default_stack.rb +0 -53
  547. data/lib/jets/middleware/layer.rb +0 -34
  548. data/lib/jets/middleware/stack.rb +0 -77
  549. data/lib/jets/middleware.rb +0 -33
  550. data/lib/jets/naming.rb +0 -63
  551. data/lib/jets/overrides/rails/action_controller.rb +0 -13
  552. data/lib/jets/overrides/rails/asset_tag_helper.rb +0 -114
  553. data/lib/jets/overrides/rails/common_methods.rb +0 -13
  554. data/lib/jets/overrides/rails/migration_checker.rb +0 -34
  555. data/lib/jets/overrides/rails/rendering_helper.rb +0 -27
  556. data/lib/jets/overrides/rails/url_helper.rb +0 -88
  557. data/lib/jets/overrides/rails.rb +0 -6
  558. data/lib/jets/rack_server.rb +0 -86
  559. data/lib/jets/resource/api_gateway/base_path/function.rb +0 -49
  560. data/lib/jets/resource/api_gateway/base_path/role.rb +0 -76
  561. data/lib/jets/resource/api_gateway/cors.rb +0 -61
  562. data/lib/jets/resource/api_gateway/method.rb +0 -102
  563. data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +0 -16
  564. data/lib/jets/resource/base.rb +0 -28
  565. data/lib/jets/resource/child_stack/api_deployment.rb +0 -58
  566. data/lib/jets/resource/child_stack/api_gateway.rb +0 -23
  567. data/lib/jets/resource/child_stack/api_resource/page.rb +0 -20
  568. data/lib/jets/resource/child_stack/api_resource.rb +0 -54
  569. data/lib/jets/resource/child_stack/base.rb +0 -24
  570. data/lib/jets/resource/iam/base_role_definition.rb +0 -47
  571. data/lib/jets/resource/lambda/function.rb +0 -221
  572. data/lib/jets/resource/logs/subscription_filter.rb +0 -31
  573. data/lib/jets/resource/permission.rb +0 -45
  574. data/lib/jets/resource.rb +0 -71
  575. data/lib/jets/router/error.rb +0 -4
  576. data/lib/jets/router/finder.rb +0 -47
  577. data/lib/jets/router/helpers/core_helper.rb +0 -27
  578. data/lib/jets/router/helpers/named_routes_helper.rb +0 -8
  579. data/lib/jets/router/helpers.rb +0 -4
  580. data/lib/jets/router/method_creator/code.rb +0 -99
  581. data/lib/jets/router/method_creator/edit.rb +0 -12
  582. data/lib/jets/router/method_creator/generic.rb +0 -11
  583. data/lib/jets/router/method_creator/index.rb +0 -48
  584. data/lib/jets/router/method_creator/new.rb +0 -12
  585. data/lib/jets/router/method_creator/root.rb +0 -15
  586. data/lib/jets/router/method_creator/show.rb +0 -12
  587. data/lib/jets/router/method_creator.rb +0 -50
  588. data/lib/jets/turbo/database_yaml.rb +0 -41
  589. data/lib/jets/turbo/project/.gitignore +0 -12
  590. data/lib/jets/turbo/project/.jetskeep +0 -1
  591. data/lib/jets/turbo/project/Gemfile +0 -16
  592. data/lib/jets/turbo/project/Rakefile +0 -2
  593. data/lib/jets/turbo/project/app/controllers/application_controller.rb +0 -2
  594. data/lib/jets/turbo/project/app/helpers/application_helper.rb +0 -2
  595. data/lib/jets/turbo/project/app/jobs/application_job.rb +0 -4
  596. data/lib/jets/turbo/project/config/application.rb +0 -5
  597. data/lib/jets/turbo/project/config/routes.rb +0 -4
  598. data/lib/jets/turbo/project/config.ru +0 -5
  599. data/lib/jets/turbo/rails.rb +0 -127
  600. data/lib/jets/turbo/templates/config/database.yml +0 -30
  601. data/lib/jets/turbo.rb +0 -56
  602. data/readme/prerelease.md +0 -6
  603. data/readme/testing.md +0 -60
  604. /data/{lib/jets → engines}/internal/app/shared/functions/jets/s3_bucket_config.rb +0 -0
  605. /data/lib/jets/{commands → command}/help/build.md +0 -0
  606. /data/lib/jets/{commands → command}/help/clean/build.md +0 -0
  607. /data/lib/jets/{commands → command}/help/clean/log.md +0 -0
  608. /data/lib/jets/{commands → command}/help/console.md +0 -0
  609. /data/lib/jets/{commands → command}/help/db/generate.md +0 -0
  610. /data/lib/jets/{commands → command}/help/dbconsole.md +0 -0
  611. /data/lib/jets/{commands → command}/help/degenerate.md +0 -0
  612. /data/lib/jets/{commands → command}/help/delete.md +0 -0
  613. /data/lib/jets/{commands → command}/help/gems/check.md +0 -0
  614. /data/lib/jets/{commands → command}/help/generate.md +0 -0
  615. /data/lib/jets/{commands → command}/help/import/rack.md +0 -0
  616. /data/lib/jets/{commands → command}/help/import/rails.md +0 -0
  617. /data/lib/jets/{commands → command}/help/server.md +0 -0
  618. /data/lib/jets/{commands → command}/help/status.md +0 -0
  619. /data/lib/jets/{commands → command}/help/upgrade.md +0 -0
  620. /data/lib/jets/{commands → command}/help/url.md +0 -0
  621. /data/lib/jets/{generator/templates/active_job → generators}/job/templates/application_job.rb.tt +0 -0
  622. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/.rspec +0 -0
  623. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/README.md +0 -0
  624. /data/{.gitmodules → lib/jets/generators/overrides/app/templates/app/assets/images/.keep} +0 -0
  625. /data/lib/jets/{commands/templates/skeleton/db/.gitkeep → generators/overrides/app/templates/app/assets/javascripts/.keep} +0 -0
  626. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/controllers/application_controller.rb +0 -0
  627. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/helpers/application_helper.rb +0 -0
  628. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/jobs/application_job.rb +0 -0
  629. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/config.ru +0 -0
  630. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/favicon.ico +0 -0
  631. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/controllers/posts_controller_spec.rb +0 -0
  632. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/fixtures/payloads/posts-index.json +0 -0
  633. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/fixtures/payloads/posts-show.json +0 -0
  634. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/spec_helper.rb.tt +0 -0
  635. /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/_form.html.erb +0 -0
  636. /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/edit.html.erb +0 -0
  637. /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/new.html.erb +0 -0
  638. /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/show.html.erb +0 -0
  639. /data/lib/jets/{generator → generators/overrides}/templates/rails/assets/javascript.js +0 -0
  640. /data/lib/jets/{generator → generators/overrides}/templates/rails/assets/stylesheet.css +0 -0
  641. /data/lib/jets/{generator → generators/overrides}/templates/rails/scaffold/scaffold.css +0 -0
@@ -0,0 +1,103 @@
1
+ ## Storing Encrypted Credentials in Source Control
2
+
3
+ The Jets `credentials` commands provide access to encrypted credentials,
4
+ so you can safely store access tokens, database passwords, and the like
5
+ safely inside the app without relying on a mess of ENVs.
6
+
7
+ This also allows for atomic deploys: no need to coordinate key changes
8
+ to get everything working as the keys are shipped with the code.
9
+
10
+ ## Setup
11
+
12
+ Applications after Jets 5 automatically have a basic credentials file generated
13
+ that just contains the secret_key_base used by MessageVerifiers/MessageEncryptors, like the ones
14
+ signing and encrypting cookies.
15
+
16
+ For applications created prior to Jets 5, we'll automatically generate a new
17
+ credentials file in `config/credentials.yml.enc` the first time you run `bin/jets credentials:edit`.
18
+ If you didn't have a master key saved in `config/master.key`, that'll be created too.
19
+
20
+ Don't lose this master key! Put it in a password manager your team can access.
21
+ Should you lose it no one, including you, will be able to access any encrypted
22
+ credentials.
23
+
24
+ Don't commit the key! Add `config/master.key` to your source control's
25
+ ignore file. If you use Git, Jets handles this for you.
26
+
27
+ Jets also looks for the master key in `ENV["JETS_MASTER_KEY"]`, if that's easier to manage.
28
+
29
+ You could prepend that to your server's start command like this:
30
+
31
+ JETS_MASTER_KEY="very-secret-and-secure" server.start
32
+
33
+ ## Set up Git to Diff Credentials
34
+
35
+ Jets provides `bin/jets credentials:diff --enroll` to instruct Git to call
36
+ `bin/jets credentials:diff` when `git diff` is run on a credentials file.
37
+
38
+ Running the command enrolls the project such that all credentials files use the
39
+ "jets_credentials" diff driver in .gitattributes.
40
+
41
+ Additionally since Git requires the driver itself to be set up in a config file
42
+ that isn't tracked Jets automatically ensures it's configured when running
43
+ `credentials:edit`.
44
+
45
+ Otherwise each co-worker would have to run enable manually, including on each new
46
+ repo clone.
47
+
48
+ To disenroll from this feature, run `bin/jets credentials:diff --disenroll`.
49
+
50
+ ## Editing Credentials
51
+
52
+ This will open a temporary file in `$EDITOR` with the decrypted contents to edit
53
+ the encrypted credentials.
54
+
55
+ When the temporary file is next saved the contents are encrypted and written to
56
+ `config/credentials.yml.enc` while the file itself is destroyed to prevent credentials
57
+ from leaking.
58
+
59
+ ## Environment Specific Credentials
60
+
61
+ The `credentials` command supports passing an `--environment` option to create an
62
+ environment specific override. That override will take precedence over the
63
+ global `config/credentials.yml.enc` file when running in that environment. So:
64
+
65
+ bin/jets credentials:edit --environment development
66
+
67
+ will create `config/credentials/development.yml.enc` with the corresponding
68
+ encryption key in `config/credentials/development.key` if the credentials file
69
+ doesn't exist.
70
+
71
+ The encryption key can also be put in `ENV["JETS_MASTER_KEY"]`, which takes
72
+ precedence over the file encryption key.
73
+
74
+ In addition to that, the default credentials lookup paths can be overridden through
75
+ `config.credentials.content_path` and `config.credentials.key_path`.
76
+
77
+ ## Editor wait
78
+
79
+ For editors that fork and exit immediately, it's important to pass a wait flag,
80
+ otherwise the credentials will be saved immediately with no chance to edit.
81
+
82
+ EDITOR="code --wait" jets credentials:edit
83
+
84
+ ## Accessing in App
85
+
86
+ Let's say you have credentials like so:
87
+
88
+ ❯ jets credentials:show
89
+ secret_key_base: somesecretvalue
90
+ foo: bar
91
+
92
+ You can access them in the app like so:
93
+
94
+ ❯ jets console
95
+ > Jets.application.credentials.secret_key_base
96
+ => "somesecretvalue"
97
+ > Jets.application.credentials.foo
98
+ => "bar"
99
+ > Jets.application.credentials.does_not_exist
100
+ => nil
101
+
102
+ Remember, when you deploy this to Lambda you should set the `JETS_MASTER_KEY`. You set it with [Env Files](https://rubyonjets.com/docs/env-files/). Otherwise the `Jets.application.credentials.xx` values will return `nil`.
103
+
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jets::Command::CredentialsCommand::Diffing # :nodoc:
4
+ GITATTRIBUTES_ENTRY = <<~END
5
+ config/credentials/*.yml.enc diff=jets_credentials
6
+ config/credentials.yml.enc diff=jets_credentials
7
+ END
8
+
9
+ def enroll_project_in_credentials_diffing
10
+ if enrolled_in_credentials_diffing?
11
+ say "Project is already enrolled in credentials file diffing."
12
+ else
13
+ gitattributes.write(GITATTRIBUTES_ENTRY, mode: "a")
14
+
15
+ say "Enrolled project in credentials file diffing!"
16
+ say "Jets ensures the jets_credentials diff driver is set when running `credentials:edit`. See `credentials:help` for more."
17
+ end
18
+ end
19
+
20
+ def disenroll_project_from_credentials_diffing
21
+ if enrolled_in_credentials_diffing?
22
+ gitattributes.write(gitattributes.read.gsub(GITATTRIBUTES_ENTRY, ""))
23
+ gitattributes.delete if gitattributes.empty?
24
+
25
+ say "Disenrolled project from credentials file diffing!"
26
+ else
27
+ say "Project is not enrolled in credentials file diffing."
28
+ end
29
+ end
30
+
31
+ def ensure_diffing_driver_is_configured
32
+ configure_diffing_driver if enrolled_in_credentials_diffing? && !diffing_driver_configured?
33
+ end
34
+
35
+ private
36
+ def enrolled_in_credentials_diffing?
37
+ gitattributes.file? && gitattributes.read.include?(GITATTRIBUTES_ENTRY)
38
+ end
39
+
40
+ def diffing_driver_configured?
41
+ system "git config --get diff.jets_credentials.textconv", out: File::NULL
42
+ end
43
+
44
+ def configure_diffing_driver
45
+ system "git config diff.jets_credentials.textconv 'bin/jets credentials:diff'"
46
+ end
47
+
48
+ def gitattributes
49
+ Jets.root.join(".gitattributes")
50
+ end
51
+ end
@@ -0,0 +1,139 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pathname"
4
+ require "shellwords"
5
+ require "active_support"
6
+
7
+ module Jets
8
+ module Command
9
+ class CredentialsCommand < Jets::Command::Base # :nodoc:
10
+ include Helpers::Editor
11
+ include EnvironmentArgument
12
+
13
+ require_relative "credentials_command/diffing"
14
+ include Diffing
15
+
16
+ self.environment_desc = "Uses credentials from config/credentials/:environment.yml.enc encrypted by config/credentials/:environment.key key"
17
+
18
+ no_commands do
19
+ def help
20
+ say "Usage:\n #{self.class.banner}"
21
+ say ""
22
+ say self.class.desc
23
+ end
24
+ end
25
+
26
+ def edit
27
+ extract_environment_option_from_argument(default_environment: nil)
28
+ require_application!
29
+
30
+ ensure_editor_available(command: "bin/jets credentials:edit") || (return)
31
+
32
+ ensure_encryption_key_has_been_added if credentials.key.nil?
33
+ ensure_credentials_have_been_added
34
+ ensure_diffing_driver_is_configured
35
+
36
+ catch_editing_exceptions do
37
+ change_credentials_in_system_editor
38
+ end
39
+
40
+ say "File encrypted and saved."
41
+ rescue ActiveSupport::MessageEncryptor::InvalidMessage
42
+ say "Couldn't decrypt #{content_path}. Perhaps you passed the wrong key?"
43
+ end
44
+
45
+ def show
46
+ extract_environment_option_from_argument(default_environment: nil)
47
+ require_application!
48
+
49
+ say credentials.read.presence || missing_credentials_message
50
+ end
51
+
52
+ option :enroll, type: :boolean, default: false,
53
+ desc: "Enrolls project in credentials file diffing with `git diff`"
54
+
55
+ option :disenroll, type: :boolean, default: false,
56
+ desc: "Disenrolls project from credentials file diffing"
57
+
58
+ def diff(content_path = nil)
59
+ if @content_path = content_path
60
+ extract_environment_option_from_argument(default_environment: extract_environment_from_path(content_path))
61
+ require_application!
62
+
63
+ say credentials.read.presence || credentials.content_path.read
64
+ else
65
+ require_application!
66
+ disenroll_project_from_credentials_diffing if options[:disenroll]
67
+ enroll_project_in_credentials_diffing if options[:enroll]
68
+ end
69
+ rescue ActiveSupport::MessageEncryptor::InvalidMessage
70
+ say credentials.content_path.read
71
+ end
72
+
73
+ private
74
+ def credentials
75
+ Jets.application.encrypted(content_path, key_path: key_path)
76
+ end
77
+
78
+ def ensure_encryption_key_has_been_added
79
+ encryption_key_file_generator.add_key_file(key_path)
80
+ encryption_key_file_generator.ignore_key_file(key_path)
81
+ end
82
+
83
+ def ensure_credentials_have_been_added
84
+ if options[:environment]
85
+ encrypted_file_generator.add_encrypted_file_silently(content_path, key_path)
86
+ else
87
+ credentials_generator.add_credentials_file_silently
88
+ end
89
+ end
90
+
91
+ def change_credentials_in_system_editor
92
+ credentials.change do |tmp_path|
93
+ system(*Shellwords.split(ENV["EDITOR"]), tmp_path.to_s)
94
+ end
95
+ end
96
+
97
+ def missing_credentials_message
98
+ if credentials.key.nil?
99
+ "Missing '#{key_path}' to decrypt credentials. See `bin/jets credentials:help`"
100
+ else
101
+ "File '#{content_path}' does not exist. Use `bin/jets credentials:edit` to change that."
102
+ end
103
+ end
104
+
105
+ def content_path
106
+ @content_path ||= options[:environment] ? "config/credentials/#{options[:environment]}.yml.enc" : "config/credentials.yml.enc"
107
+ end
108
+
109
+ def key_path
110
+ options[:environment] ? "config/credentials/#{options[:environment]}.key" : "config/master.key"
111
+ end
112
+
113
+ def extract_environment_from_path(path)
114
+ available_environments.find { |env| path.include? env } if path.end_with?(".yml.enc")
115
+ end
116
+
117
+ def encryption_key_file_generator
118
+ require "rails/generators"
119
+ require "rails/generators/rails/encryption_key_file/encryption_key_file_generator"
120
+
121
+ Rails::Generators::EncryptionKeyFileGenerator.new
122
+ end
123
+
124
+ def encrypted_file_generator
125
+ require "rails/generators"
126
+ require "rails/generators/rails/encrypted_file/encrypted_file_generator"
127
+
128
+ Rails::Generators::EncryptedFileGenerator.new
129
+ end
130
+
131
+ def credentials_generator
132
+ require "rails/generators"
133
+ require "rails/generators/rails/credentials/credentials_generator"
134
+
135
+ Rails::Generators::CredentialsGenerator.new
136
+ end
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jets
4
+ module Command
5
+ module Db
6
+ module System
7
+ class ChangeCommand < Base # :nodoc:
8
+ class_option :to, desc: "The database system to switch to."
9
+
10
+ def initialize(positional_args, option_args, *)
11
+ @argv = positional_args + option_args
12
+ super
13
+ end
14
+
15
+ def perform
16
+ require "rails/generators"
17
+ require "rails/generators/rails/db/system/change/change_generator"
18
+ Rails::Generators::Db::System::ChangeGenerator.start(@argv)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,184 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/string/filters"
4
+ require "active_support/deprecation"
5
+
6
+ module Jets
7
+ class DBConsole
8
+ def self.start(*args)
9
+ new(*args).start
10
+ end
11
+
12
+ def initialize(options = {})
13
+ @options = options
14
+ end
15
+
16
+ def start
17
+ ENV["JETS_ENV"] ||= @options[:environment] || environment
18
+ config = db_config.configuration_hash
19
+
20
+ case db_config.adapter
21
+ when /^(jdbc)?mysql/
22
+ args = {
23
+ host: "--host",
24
+ port: "--port",
25
+ socket: "--socket",
26
+ username: "--user",
27
+ encoding: "--default-character-set",
28
+ sslca: "--ssl-ca",
29
+ sslcert: "--ssl-cert",
30
+ sslcapath: "--ssl-capath",
31
+ sslcipher: "--ssl-cipher",
32
+ sslkey: "--ssl-key"
33
+ }.filter_map { |opt, arg| "#{arg}=#{config[opt]}" if config[opt] }
34
+
35
+ if config[:password] && @options[:include_password]
36
+ args << "--password=#{config[:password]}"
37
+ elsif config[:password] && !config[:password].to_s.empty?
38
+ args << "-p"
39
+ end
40
+
41
+ args << db_config.database
42
+
43
+ find_cmd_and_exec(["mysql", "mysql5"], *args)
44
+
45
+ when /^postgres|^postgis/
46
+ ENV["PGUSER"] = config[:username] if config[:username]
47
+ ENV["PGHOST"] = config[:host] if config[:host]
48
+ ENV["PGPORT"] = config[:port].to_s if config[:port]
49
+ ENV["PGPASSWORD"] = config[:password].to_s if config[:password] && @options[:include_password]
50
+ ENV["PGSSLMODE"] = config[:sslmode].to_s if config[:sslmode]
51
+ ENV["PGSSLCERT"] = config[:sslcert].to_s if config[:sslcert]
52
+ ENV["PGSSLKEY"] = config[:sslkey].to_s if config[:sslkey]
53
+ ENV["PGSSLROOTCERT"] = config[:sslrootcert].to_s if config[:sslrootcert]
54
+ find_cmd_and_exec("psql", db_config.database)
55
+
56
+ when "sqlite3"
57
+ args = []
58
+
59
+ args << "-#{@options[:mode]}" if @options[:mode]
60
+ args << "-header" if @options[:header]
61
+ args << File.expand_path(db_config.database, Jets.respond_to?(:root) ? Jets.root : nil)
62
+
63
+ find_cmd_and_exec("sqlite3", *args)
64
+
65
+ when "oracle", "oracle_enhanced"
66
+ logon = ""
67
+
68
+ if config[:username]
69
+ logon = config[:username].dup
70
+ logon << "/#{config[:password]}" if config[:password] && @options[:include_password]
71
+ logon << "@#{db_config.database}" if db_config.database
72
+ end
73
+
74
+ find_cmd_and_exec("sqlplus", logon)
75
+
76
+ when "sqlserver"
77
+ args = []
78
+
79
+ args += ["-d", "#{db_config.database}"] if db_config.database
80
+ args += ["-U", "#{config[:username]}"] if config[:username]
81
+ args += ["-P", "#{config[:password]}"] if config[:password]
82
+
83
+ if config[:host]
84
+ host_arg = +"tcp:#{config[:host]}"
85
+ host_arg << ",#{config[:port]}" if config[:port]
86
+ args += ["-S", host_arg]
87
+ end
88
+
89
+ find_cmd_and_exec("sqlcmd", *args)
90
+
91
+ else
92
+ abort "Unknown command-line client for #{db_config.database}."
93
+ end
94
+ end
95
+
96
+ def db_config
97
+ return @db_config if defined?(@db_config)
98
+
99
+ # If the user provided a database, use that. Otherwise find
100
+ # the first config in the database.yml
101
+ if database
102
+ @db_config = configurations.configs_for(env_name: environment, name: database, include_hidden: true)
103
+ else
104
+ @db_config = configurations.find_db_config(environment)
105
+ end
106
+
107
+ unless @db_config
108
+ missing_db = database ? "'#{database}' database is not" : "No databases are"
109
+ raise ActiveRecord::AdapterNotSpecified,
110
+ "#{missing_db} configured for '#{environment}'. Available configuration: #{configurations.inspect}"
111
+ end
112
+
113
+ @db_config
114
+ end
115
+
116
+ def environment
117
+ Jets.respond_to?(:env) ? Jets.env : Jets::Command.environment
118
+ end
119
+
120
+ def database
121
+ @options[:database]
122
+ end
123
+
124
+ private
125
+ def configurations # :doc:
126
+ # require APP_PATH
127
+ ActiveRecord::Base.configurations = Jets.application.config.database_configuration
128
+ ActiveRecord::Base.configurations
129
+ end
130
+
131
+ def find_cmd_and_exec(commands, *args) # :doc:
132
+ commands = Array(commands)
133
+
134
+ dirs_on_path = ENV["PATH"].to_s.split(File::PATH_SEPARATOR)
135
+ unless (ext = RbConfig::CONFIG["EXEEXT"]).empty?
136
+ commands = commands.map { |cmd| "#{cmd}#{ext}" }
137
+ end
138
+
139
+ full_path_command = nil
140
+ found = commands.detect do |cmd|
141
+ dirs_on_path.detect do |path|
142
+ full_path_command = File.join(path, cmd)
143
+ begin
144
+ stat = File.stat(full_path_command)
145
+ rescue SystemCallError
146
+ else
147
+ stat.file? && stat.executable?
148
+ end
149
+ end
150
+ end
151
+
152
+ if found
153
+ exec full_path_command, *args
154
+ else
155
+ abort("Couldn't find database client: #{commands.join(', ')}. Check your $PATH and try again.")
156
+ end
157
+ end
158
+ end
159
+
160
+ module Command
161
+ class DbconsoleCommand < Base # :nodoc:
162
+ include EnvironmentArgument
163
+
164
+ class_option :include_password, aliases: "-p", type: :boolean,
165
+ desc: "Automatically provide the password from database.yml"
166
+
167
+ class_option :mode, enum: %w( html list line column ), type: :string,
168
+ desc: "Automatically put the sqlite3 database in the specified mode (html, list, line, column)."
169
+
170
+ class_option :header, type: :boolean
171
+
172
+ class_option :database, aliases: "--db", type: :string,
173
+ desc: "Specifies the database to use."
174
+
175
+ desc "dbconsole", "Starts DB REPL console"
176
+ long_desc Help.text(:dbconsole)
177
+ def perform
178
+ extract_environment_option_from_argument
179
+ require_application_and_environment!
180
+ Jets::DBConsole.start(options)
181
+ end
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "jets/generators"
4
+ require "jets/commands/generate/generate_command"
5
+
6
+ module Jets
7
+ module Command
8
+ class DegenerateCommand < GenerateCommand # :nodoc:
9
+ desc "Degenerate", "Opposite of generate. Removes the generated code."
10
+ long_desc Help.text(:degenerate)
11
+ def perform(*)
12
+ super
13
+ end
14
+
15
+ private
16
+ def behavior
17
+ :revoke
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,155 @@
1
+ module Jets::Command
2
+ class DeleteCommand < Base # :nodoc:
3
+ desc "delete", "Delete the Jets project and all its resources"
4
+ long_desc Help.text(:delete)
5
+ option :yes, aliases: %w[y], type: :boolean, desc: "Skip are you sure prompt."
6
+ option :wait, type: :boolean, default: true, desc: "Wait for stack deletion to complete."
7
+ def perform
8
+ Delete.new(options).run
9
+ end
10
+ end
11
+
12
+ class Delete
13
+ include Jets::AwsServices
14
+ include AwsHelpers
15
+
16
+ def initialize(options={})
17
+ @options = options
18
+ end
19
+
20
+ def run
21
+ puts("Deleting project...")
22
+ return if @options[:noop]
23
+
24
+ are_you_sure?
25
+ confirm_project_exists
26
+
27
+ # Must first remove all objects from s3 bucket in order to delete stack
28
+ puts "First, deleting objects in s3 bucket #{s3_bucket_name}" if s3_bucket_name
29
+ empty_s3_bucket
30
+
31
+ stack_in_progress?(parent_stack_name)
32
+
33
+ cfn.delete_stack(stack_name: parent_stack_name)
34
+ puts "Deleting #{Jets.project_namespace.color(:green)}..."
35
+
36
+ if @options[:wait]
37
+ stack = find_stack(parent_stack_name)
38
+ wait_for_stack
39
+ Jets::Cfn::Deployment.new(stack_name: stack.stack_id, message: "Deleted").create
40
+ end
41
+
42
+ delete_logs
43
+
44
+ puts "Project #{Jets.project_namespace.color(:green)} deleted!"
45
+ end
46
+
47
+ def wait_for_stack
48
+ status = Jets::Cfn::Status.new(@options)
49
+ start_time = Time.now
50
+ status.wait
51
+ took = Time.now - start_time
52
+ puts "Time took for deletion: #{status.pretty_time(took).color(:green)}."
53
+ end
54
+
55
+ def delete_logs
56
+ puts "Deleting CloudWatch logs"
57
+ log = Jets::Commands::Clean::Log.new(mute: true, yes: true)
58
+ log.clean
59
+ end
60
+
61
+ def confirm_project_exists
62
+ stack = find_stack(parent_stack_name)
63
+ return if stack
64
+ puts "ERROR: Project #{parent_stack_name} does not exist".color(:red)
65
+ exit 1
66
+ end
67
+
68
+ def empty_s3_bucket
69
+ return unless s3_bucket_name # Happens when minimal stack fails to build
70
+ return unless bucket_exists?(s3_bucket_name)
71
+
72
+ resp = s3.list_objects(bucket: s3_bucket_name)
73
+ if resp.contents.size > 0
74
+ # IE: objects = [{key: "objectkey1"}, {key: "objectkey2"}]
75
+ objects = resp.contents.map { |item| {key: item.key} }
76
+ s3.delete_objects(
77
+ bucket: s3_bucket_name,
78
+ delete: {
79
+ objects: objects,
80
+ quiet: false,
81
+ }
82
+ )
83
+ empty_s3_bucket # keep deleting objects until bucket is empty
84
+ end
85
+ end
86
+
87
+ def s3_bucket_name
88
+ return @s3_bucket_name if defined?(@s3_bucket_name)
89
+
90
+ resp = cfn.describe_stacks(stack_name: parent_stack_name)
91
+ outputs = resp.stacks[0].outputs
92
+ if outputs.empty?
93
+ @s3_bucket_name = false
94
+ else
95
+ @s3_bucket_name = outputs.find {|o| o.output_key == 'S3Bucket'}.output_value
96
+ end
97
+ end
98
+
99
+ # Thanks: https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/s3-example-does-bucket-exist.html
100
+ def bucket_exists?(bucket_name)
101
+ bucket_exists = false
102
+ begin
103
+ resp = s3.head_bucket(bucket: bucket_name, use_accelerate_endpoint: false)
104
+ bucket_exists = true
105
+ rescue
106
+ end
107
+ bucket_exists
108
+ end
109
+
110
+ def parent_stack_name
111
+ Jets::Names.parent_stack_name
112
+ end
113
+
114
+ def are_you_sure?
115
+ if @options[:yes]
116
+ sure = 'y'
117
+ else
118
+ puts "Are you sure you want to want to delete the #{Jets.project_namespace.color(:green)} project? (y/N)"
119
+ sure = $stdin.gets
120
+ end
121
+
122
+ unless sure =~ /^y/
123
+ puts "Phew! Jets #{Jets.project_namespace.color(:green)} project was not deleted."
124
+ exit 0
125
+ end
126
+ end
127
+
128
+ # All CloudFormation states listed here: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html
129
+ #
130
+ # Returns resp so we can use it to grab data about the stack without calling api again.
131
+ def check_deleteable_status
132
+ return true if !stack_exists?(@parent_stack_name)
133
+
134
+ # Assumes stack exists
135
+ resp = cfn.describe_stacks(stack_name: @parent_stack_name)
136
+ status = resp.stacks[0].stack_status
137
+
138
+ return true if status == 'ROLLBACK_COMPLETE'
139
+
140
+ if status =~ /_IN_PROGRESS$/
141
+ puts "The '#{@parent_stack_name}' stack status is #{status}. " \
142
+ "It is not in an updateable status. Please wait until the stack is ready and try again.".color(:red)
143
+ exit 0
144
+ elsif resp.stacks[0].outputs.empty?
145
+ # This Happens when the miminal stack fails at the very beginning.
146
+ # There is no s3 bucket at all. User should delete the stack.
147
+ puts "The minimal stack failed to create. Please delete the stack first and try again. " \
148
+ "You can delete the CloudFormation stack or use the `jets delete` command"
149
+ exit 0
150
+ else
151
+ true
152
+ end
153
+ end
154
+ end
155
+ end