jets 4.0.17 → 5.0.0.beta1

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 (616) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -1
  3. data/CHANGELOG.md +52 -23
  4. data/Gemfile +1 -5
  5. data/LICENSE.txt +1 -1
  6. data/Rakefile +3 -3
  7. data/engines/internal/app/controllers/jets/application_controller.rb +28 -0
  8. data/engines/internal/app/controllers/jets/bare_controller.rb +6 -0
  9. data/engines/internal/app/controllers/jets/health_controller.rb +55 -0
  10. data/engines/internal/app/controllers/jets/info_controller.rb +45 -0
  11. data/{lib/jets → engines}/internal/app/controllers/jets/mailers_controller.rb +12 -14
  12. data/{lib/jets → engines}/internal/app/controllers/jets/mount_controller.rb +6 -10
  13. data/{lib/jets → engines}/internal/app/controllers/jets/public_controller.rb +6 -2
  14. data/engines/internal/app/controllers/jets/welcome_controller.rb +9 -0
  15. data/{lib/jets → engines}/internal/app/functions/jets/base_path.rb +2 -1
  16. data/{lib/jets → engines}/internal/app/functions/jets/base_path_mapping.rb +26 -6
  17. data/engines/internal/app/jobs/jets/preheat_job.rb +67 -0
  18. data/engines/internal/app/views/jets/info/properties.html.erb +1 -0
  19. data/engines/internal/app/views/jets/info/routes.html.erb +10 -0
  20. data/{lib/jets → engines}/internal/app/views/jets/mailers/email.html.erb +37 -17
  21. data/engines/internal/app/views/jets/mailers/index.html.erb +8 -0
  22. data/engines/internal/app/views/jets/mailers/mailer.html.erb +6 -0
  23. data/{lib/jets/commands/templates/skeleton/public/index.html.tt → engines/internal/app/views/jets/welcome/index.html.erb} +8 -4
  24. data/engines/internal/app/views/layouts/application.html.erb +51 -0
  25. data/engines/internal/lib/internal/actiondispatch.rb +39 -0
  26. data/engines/internal/lib/internal/actionmailer.rb +51 -0
  27. data/engines/internal/lib/internal/actionview.rb +152 -0
  28. data/engines/internal/lib/internal/activerecord.rb +37 -0
  29. data/engines/internal/lib/internal/activesupport.rb +47 -0
  30. data/engines/internal/lib/internal/engine.rb +13 -0
  31. data/engines/internal/lib/internal/i18n_engine.rb +19 -0
  32. data/engines/internal/lib/internal/jets_controller.rb +46 -0
  33. data/engines/internal/lib/internal/overrides/debug_exceptions.rb +40 -0
  34. data/engines/internal/lib/internal/templates/rescues/_trace.html.erb +62 -0
  35. data/engines/internal/lib/internal/templates/rescues/_trace.text.erb +9 -0
  36. data/engines/internal/lib/internal/turbines/asset_tag_helper.rb +70 -0
  37. data/engines/internal/lib/internal/turbines/helpers.rb +18 -0
  38. data/engines/internal/lib/internal/turbines/routes_helpers.rb +42 -0
  39. data/exe/jets +1 -10
  40. data/jets.gemspec +29 -27
  41. data/lib/jets/app_loader.rb +77 -0
  42. data/lib/jets/application/bootstrap.rb +100 -0
  43. data/lib/jets/application/configuration/defaults.rb +256 -0
  44. data/lib/jets/application/configuration.rb +494 -0
  45. data/lib/jets/application/default_middleware_stack.rb +140 -0
  46. data/lib/jets/application/dummy_erb_compiler.rb +18 -0
  47. data/lib/jets/application/finisher.rb +266 -0
  48. data/lib/jets/application/routes_reloader.rb +80 -0
  49. data/lib/jets/application.rb +515 -198
  50. data/lib/jets/authorizer/base.rb +1 -0
  51. data/lib/jets/authorizer/dsl.rb +15 -11
  52. data/lib/jets/authorizer/helpers/iam_helper.rb +13 -11
  53. data/lib/jets/autoloaders/gem.rb +70 -0
  54. data/lib/jets/autoloaders/inflector.rb +21 -0
  55. data/lib/jets/autoloaders.rb +38 -101
  56. data/lib/jets/aws_services/stack_status.rb +1 -1
  57. data/lib/jets/backtrace_cleaner.rb +27 -0
  58. data/lib/jets/booter.rb +29 -176
  59. data/lib/jets/builders/code_builder.rb +45 -117
  60. data/lib/jets/builders/code_size.rb +1 -0
  61. data/lib/jets/builders/gem_replacer.rb +5 -6
  62. data/lib/jets/builders/handler_generator.rb +34 -14
  63. data/lib/jets/builders/lambda_layer.rb +2 -7
  64. data/lib/jets/builders/purger.rb +1 -1
  65. data/lib/jets/builders/rack_packager.rb +1 -1
  66. data/lib/jets/builders/ruby_packager.rb +32 -21
  67. data/lib/jets/builders/shim_vars/app.rb +10 -6
  68. data/lib/jets/builders/templates/handlers/one_lambda_for_all_controllers.rb +33 -0
  69. data/lib/jets/builders/templates/handlers/one_lambda_per_controller.rb +20 -0
  70. data/lib/jets/builders/templates/{handler.rb → handlers/one_lambda_per_method.rb} +6 -0
  71. data/lib/jets/bundle.rb +2 -9
  72. data/lib/jets/cfn/base.rb +82 -0
  73. data/lib/jets/cfn/builder/api/base.rb +12 -0
  74. data/lib/jets/cfn/{builders/api_deployment_builder.rb → builder/api/deployment.rb} +10 -20
  75. data/lib/jets/cfn/{builders/api_gateway_builder.rb → builder/api/gateway.rb} +14 -37
  76. data/lib/jets/cfn/builder/api/mapping.rb +54 -0
  77. data/lib/jets/cfn/builder/api/methods.rb +72 -0
  78. data/lib/jets/cfn/builder/api/paged.rb +30 -0
  79. data/lib/jets/cfn/builder/api/pages/base.rb +105 -0
  80. data/lib/jets/cfn/builder/api/pages/methods.rb +17 -0
  81. data/lib/jets/cfn/builder/api/pages/page.rb +19 -0
  82. data/lib/jets/cfn/builder/api/pages/resources.rb +21 -0
  83. data/lib/jets/cfn/builder/api/resources.rb +40 -0
  84. data/lib/jets/cfn/{builders/authorizer_builder.rb → builder/authorizer.rb} +16 -19
  85. data/lib/jets/cfn/builder/controller.rb +28 -0
  86. data/lib/jets/cfn/builder/function.rb +9 -0
  87. data/lib/jets/cfn/{builders → builder}/interface.rb +45 -51
  88. data/lib/jets/cfn/builder/job.rb +10 -0
  89. data/lib/jets/cfn/builder/nested.rb +130 -0
  90. data/lib/jets/cfn/builder/one_controller.rb +53 -0
  91. data/lib/jets/cfn/{builders/parent_builder → builder/parent}/stagger.rb +1 -1
  92. data/lib/jets/cfn/{builders/parent_builder.rb → builder/parent.rb} +54 -54
  93. data/lib/jets/cfn/builder/post_process.rb +25 -0
  94. data/lib/jets/cfn/{builders/rule_builder.rb → builder/rule.rb} +4 -8
  95. data/lib/jets/cfn/{builders/shared_builder.rb → builder/shared.rb} +4 -3
  96. data/lib/jets/cfn/{builders → builder}/util/source.rb +1 -1
  97. data/lib/jets/{commands/build.rb → cfn/builder.rb} +50 -78
  98. data/lib/jets/cfn/deployment.rb +45 -0
  99. data/lib/jets/cfn/download.rb +39 -0
  100. data/lib/jets/cfn/params/api/base.rb +39 -0
  101. data/lib/jets/cfn/params/api/cors.rb +10 -0
  102. data/lib/jets/cfn/params/api/methods.rb +69 -0
  103. data/lib/jets/cfn/params/api/resources.rb +28 -0
  104. data/lib/jets/{resource/child_stack/common_parameters.rb → cfn/params/common.rb} +3 -3
  105. data/lib/jets/{resource → cfn/resource}/api_gateway/authorizer.rb +21 -21
  106. data/lib/jets/cfn/resource/api_gateway/base_path/function.rb +57 -0
  107. data/lib/jets/{resource → cfn/resource}/api_gateway/base_path/mapping.rb +13 -12
  108. data/lib/jets/cfn/resource/api_gateway/base_path/role.rb +70 -0
  109. data/lib/jets/{resource → cfn/resource}/api_gateway/deployment.rb +13 -20
  110. data/lib/jets/{resource → cfn/resource}/api_gateway/domain_name.rb +11 -11
  111. data/lib/jets/{resource → cfn/resource}/api_gateway/method/authorization.rb +1 -1
  112. data/lib/jets/cfn/resource/api_gateway/method.rb +92 -0
  113. data/lib/jets/{resource → cfn/resource}/api_gateway/resource.rb +14 -10
  114. data/lib/jets/cfn/resource/api_gateway/resource_id.rb +25 -0
  115. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/change_detection.rb +1 -1
  116. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/logical_id/message.rb +1 -1
  117. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/logical_id.rb +1 -1
  118. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/base.rb +4 -3
  119. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/media_types.rb +2 -2
  120. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/page.rb +5 -5
  121. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/to.rb +8 -3
  122. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/variable.rb +2 -2
  123. data/lib/jets/cfn/resource/api_gateway/rest_api/routes/change.rb +21 -0
  124. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/collision/variable_exception.rb +1 -1
  125. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/collision.rb +1 -1
  126. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes.rb +1 -1
  127. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api.rb +12 -12
  128. data/lib/jets/{resource → cfn/resource}/associated.rb +1 -1
  129. data/lib/jets/{resource → cfn/resource}/config/config_rule.rb +18 -18
  130. data/lib/jets/{resource → cfn/resource}/config/managed_rule.rb +5 -5
  131. data/lib/jets/{resource → cfn/resource}/events/rule.rb +10 -10
  132. data/lib/jets/{resource → cfn/resource}/iam/application_role.rb +4 -4
  133. data/lib/jets/{resource → cfn/resource}/iam/base_role_definition.rb +15 -15
  134. data/lib/jets/{resource → cfn/resource}/iam/class_role.rb +5 -5
  135. data/lib/jets/{resource → cfn/resource}/iam/function_role.rb +6 -6
  136. data/lib/jets/{resource → cfn/resource}/iam/managed_policy.rb +1 -1
  137. data/lib/jets/{resource → cfn/resource}/iam/policy.rb +8 -8
  138. data/lib/jets/{resource → cfn/resource}/iam/policy_document.rb +10 -9
  139. data/lib/jets/{resource → cfn/resource}/iot/topic_rule.rb +10 -10
  140. data/lib/jets/{resource → cfn/resource}/lambda/event_source_mapping.rb +9 -9
  141. data/lib/jets/cfn/resource/lambda/function/controller.rb +21 -0
  142. data/lib/jets/{resource → cfn/resource}/lambda/function/environment.rb +4 -5
  143. data/lib/jets/cfn/resource/lambda/function.rb +266 -0
  144. data/lib/jets/{resource → cfn/resource}/lambda/gem_layer.rb +2 -2
  145. data/lib/jets/{resource → cfn/resource}/lambda/layer_version.rb +10 -10
  146. data/lib/jets/cfn/resource/lambda/permission.rb +51 -0
  147. data/lib/jets/cfn/resource/logs/subscription_filter.rb +31 -0
  148. data/lib/jets/cfn/resource/nested/api/base.rb +4 -0
  149. data/lib/jets/cfn/resource/nested/api/deployment.rb +53 -0
  150. data/lib/jets/cfn/resource/nested/api/gateway.rb +15 -0
  151. data/lib/jets/cfn/resource/nested/api/mapping.rb +33 -0
  152. data/lib/jets/cfn/resource/nested/api/methods.rb +30 -0
  153. data/lib/jets/cfn/resource/nested/api/page.rb +8 -0
  154. data/lib/jets/cfn/resource/nested/api/resources.rb +22 -0
  155. data/lib/jets/{resource/child_stack → cfn/resource/nested}/app_class.rb +15 -48
  156. data/lib/jets/{resource/child_stack → cfn/resource/nested}/authorizer.rb +8 -14
  157. data/lib/jets/cfn/resource/nested/base.rb +38 -0
  158. data/lib/jets/cfn/resource/nested/one_controller.rb +48 -0
  159. data/lib/jets/{resource/child_stack → cfn/resource/nested}/shared.rb +10 -16
  160. data/lib/jets/cfn/resource/one/function.rb +66 -0
  161. data/lib/jets/cfn/resource/one/permission.rb +17 -0
  162. data/lib/jets/{resource → cfn/resource}/replacer.rb +26 -27
  163. data/lib/jets/{resource → cfn/resource}/route53/record_set.rb +18 -18
  164. data/lib/jets/{resource → cfn/resource}/s3/bucket.rb +4 -4
  165. data/lib/jets/cfn/resource/s3/jets_bucket.rb +68 -0
  166. data/lib/jets/{resource → cfn/resource}/sns/subscription.rb +8 -8
  167. data/lib/jets/{resource → cfn/resource}/sns/topic.rb +10 -10
  168. data/lib/jets/{resource → cfn/resource}/sns/topic_policy.rb +13 -13
  169. data/lib/jets/{resource → cfn/resource}/sqs/queue.rb +5 -5
  170. data/lib/jets/{resource → cfn/resource}/standardizer.rb +8 -9
  171. data/lib/jets/cfn/resource.rb +8 -0
  172. data/lib/jets/cfn/ship.rb +20 -19
  173. data/lib/jets/cfn/template.rb +89 -0
  174. data/lib/jets/cfn/upload.rb +40 -37
  175. data/lib/jets/cli.rb +28 -210
  176. data/lib/jets/command/actions.rb +49 -0
  177. data/lib/jets/command/api_helpers.rb +41 -0
  178. data/lib/jets/command/aws_helpers.rb +26 -0
  179. data/lib/jets/command/base.rb +204 -0
  180. data/lib/jets/command/behavior.rb +83 -0
  181. data/lib/jets/command/environment_argument.rb +42 -0
  182. data/lib/jets/command/help/call.md +48 -0
  183. data/lib/jets/{commands → command}/help/deploy.md +1 -1
  184. data/lib/jets/command/help/logs.md +21 -0
  185. data/lib/jets/{commands → command}/help/new.md +3 -4
  186. data/lib/jets/command/help/projects.md +6 -0
  187. data/lib/jets/command/help/releases.md +37 -0
  188. data/lib/jets/command/help/rollback.md +5 -0
  189. data/lib/jets/command/help/routes.md +15 -0
  190. data/lib/jets/command/help/stacks.md +6 -0
  191. data/lib/jets/command/help.rb +17 -0
  192. data/lib/jets/command/helpers/editor.rb +35 -0
  193. data/lib/jets/command.rb +133 -0
  194. data/lib/jets/commands/application/application_command.rb +40 -0
  195. data/lib/jets/commands/build/build_command.rb +33 -0
  196. data/lib/jets/commands/call/anonymous_guesser.rb +1 -1
  197. data/lib/jets/commands/call/autoload_guesser.rb +2 -2
  198. data/lib/jets/commands/call/base_guesser.rb +4 -4
  199. data/lib/jets/commands/call/call_command.rb +27 -0
  200. data/lib/jets/commands/call/caller.rb +184 -0
  201. data/lib/jets/commands/call/guesser.rb +1 -1
  202. data/lib/jets/commands/clean/base.rb +1 -1
  203. data/lib/jets/commands/clean/build.rb +1 -1
  204. data/lib/jets/commands/clean/clean_command.rb +15 -0
  205. data/lib/jets/commands/clean/log.rb +1 -1
  206. data/lib/jets/commands/configure/configure_command.rb +9 -0
  207. data/lib/jets/commands/console/console_command.rb +38 -0
  208. data/lib/jets/commands/credentials/USAGE +103 -0
  209. data/lib/jets/commands/credentials/credentials_command/diffing.rb +51 -0
  210. data/lib/jets/commands/credentials/credentials_command.rb +139 -0
  211. data/lib/jets/commands/db/system/change/change_command.rb +24 -0
  212. data/lib/jets/commands/dbconsole/dbconsole_command.rb +184 -0
  213. data/lib/jets/commands/degenerate/degenerate_command.rb +21 -0
  214. data/lib/jets/commands/delete/delete_command.rb +155 -0
  215. data/lib/jets/commands/{deploy.rb → deploy/deploy_command.rb} +28 -47
  216. data/lib/jets/commands/dev/dev_command.rb +19 -0
  217. data/lib/jets/commands/{dotenv.rb → dotenv/dotenv_command.rb} +2 -2
  218. data/lib/jets/commands/encrypted/USAGE +46 -0
  219. data/lib/jets/commands/encrypted/encrypted_command.rb +87 -0
  220. data/lib/jets/commands/gems/gems_command.rb +14 -0
  221. data/lib/jets/commands/generate/generate_command.rb +95 -0
  222. data/lib/jets/commands/help/USAGE +20 -0
  223. data/lib/jets/commands/help/help_command.rb +15 -0
  224. data/lib/jets/commands/initializers/initializers_command.rb +19 -0
  225. data/lib/jets/commands/logs/logs_command.rb +45 -0
  226. data/lib/jets/commands/new/new_command.rb +19 -0
  227. data/lib/jets/commands/notes/notes_command.rb +30 -0
  228. data/lib/jets/commands/plugin/plugin_command.rb +45 -0
  229. data/lib/jets/commands/projects/projects_command.rb +30 -0
  230. data/lib/jets/commands/rake/rake_command.rb +59 -0
  231. data/lib/jets/commands/releases/releases_command.rb +72 -0
  232. data/lib/jets/commands/rollback/rollback_command.rb +41 -0
  233. data/lib/jets/commands/routes/routes_command.rb +19 -0
  234. data/lib/jets/commands/runner/runner_command.rb +60 -0
  235. data/lib/jets/commands/server/server_command.rb +291 -0
  236. data/lib/jets/commands/stacks/stacks_command.rb +39 -0
  237. data/lib/jets/commands/status/status_command.rb +9 -0
  238. data/lib/jets/commands/{url.rb → url/url_command.rb} +37 -14
  239. data/lib/jets/commands/version/version_command.rb +11 -0
  240. data/lib/jets/commands.rb +17 -0
  241. data/lib/jets/configuration.rb +166 -0
  242. data/lib/jets/controller/base.rb +105 -183
  243. data/lib/jets/controller/compat/abstract_controller/base.rb +126 -0
  244. data/lib/jets/controller/compat/action_controller/metal.rb +99 -0
  245. data/lib/jets/controller/compat/caching.rb +13 -0
  246. data/lib/jets/controller/compat/future.rb +13 -0
  247. data/lib/jets/controller/compat/route_set.rb +47 -0
  248. data/lib/jets/controller/decorate/apigw_stage.rb +39 -0
  249. data/lib/jets/controller/{authorization.rb → decorate/authorization.rb} +1 -1
  250. data/lib/jets/controller/decorate/logging.rb +90 -0
  251. data/lib/jets/controller/decorate/redirecting.rb +16 -0
  252. data/lib/jets/controller/decorate/url_for.rb +10 -0
  253. data/lib/jets/controller/{rack/adapter.rb → handler/apigw.rb} +36 -37
  254. data/lib/jets/controller/handler.rb +41 -0
  255. data/lib/jets/controller/middleware/main.rb +16 -8
  256. data/lib/jets/controller/middleware/{local/api_gateway.rb → mimic/apigw.rb} +40 -15
  257. data/lib/jets/controller/middleware/mimic/lambda_context.rb +44 -0
  258. data/lib/jets/controller/middleware/{local.rb → mimic.rb} +36 -51
  259. data/lib/jets/controller/rack_adapter/action.rb +35 -0
  260. data/lib/jets/controller/{rack → rack_adapter}/env.rb +39 -24
  261. data/lib/jets/controller/request/compat/params.rb +144 -0
  262. data/lib/jets/controller/request/compat/request.rb +125 -0
  263. data/lib/jets/controller/request.rb +35 -18
  264. data/lib/jets/controller/response/compat/response.rb +67 -0
  265. data/lib/jets/controller/response.rb +91 -8
  266. data/lib/jets/core.rb +136 -51
  267. data/lib/jets/core_ext/kernel.rb +2 -2
  268. data/lib/jets/core_ext/symbol.rb +5 -0
  269. data/lib/jets/core_ext.rb +4 -0
  270. data/lib/jets/dev_caching.rb +44 -0
  271. data/lib/jets/dotenv/ssm.rb +2 -2
  272. data/lib/jets/dotenv.rb +2 -1
  273. data/lib/jets/engine/configuration.rb +96 -0
  274. data/lib/jets/engine/turbines.rb +23 -0
  275. data/lib/jets/engine.rb +380 -0
  276. data/lib/jets/exception_reporting.rb +43 -0
  277. data/lib/jets/generators/job/job_generator.rb +41 -0
  278. data/lib/jets/generators/job/templates/event_types/dynamodb.rb.tt +8 -0
  279. data/lib/jets/generators/job/templates/event_types/iot.rb.tt +8 -0
  280. data/lib/jets/generators/job/templates/event_types/kinesis.rb.tt +9 -0
  281. data/lib/jets/generators/job/templates/event_types/log.rb.tt +9 -0
  282. data/lib/jets/generators/job/templates/event_types/rule.rb.tt +23 -0
  283. data/lib/jets/generators/job/templates/event_types/s3.rb.tt +11 -0
  284. data/lib/jets/{generator/templates/active_job/job/templates/job.rb.tt → generators/job/templates/event_types/scheduled.rb.tt} +3 -3
  285. data/lib/jets/generators/job/templates/event_types/sns.rb.tt +9 -0
  286. data/lib/jets/generators/job/templates/event_types/sqs.rb.tt +9 -0
  287. data/lib/jets/generators/overrides/app/USAGE +38 -0
  288. data/lib/jets/generators/overrides/app/app_generator.rb +148 -0
  289. data/lib/jets/generators/overrides/app/helpers.rb +143 -0
  290. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/.gitignore +2 -1
  291. data/lib/jets/generators/overrides/app/templates/Gemfile.tt +25 -0
  292. data/lib/jets/generators/overrides/app/templates/Rakefile +2 -0
  293. data/lib/jets/generators/overrides/app/templates/app/assets/config/manifest.js +3 -0
  294. data/lib/jets/generators/overrides/app/templates/app/assets/stylesheets/application.css +15 -0
  295. data/lib/jets/generators/overrides/app/templates/app/javascript/application.js +5 -0
  296. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/models/application_record.rb +1 -1
  297. data/lib/jets/generators/overrides/app/templates/app/views/layouts/application.html.erb.tt +30 -0
  298. data/lib/jets/generators/overrides/app/templates/bin/jets +3 -0
  299. data/lib/jets/generators/overrides/app/templates/config/application.rb.tt +15 -0
  300. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/config/database.yml.tt +1 -1
  301. data/lib/jets/generators/overrides/app/templates/config/environments/development.rb.tt +29 -0
  302. data/lib/jets/generators/overrides/app/templates/config/environments/production.rb.tt +19 -0
  303. data/lib/jets/generators/overrides/app/templates/config/environments/test.rb.tt +23 -0
  304. data/lib/jets/generators/overrides/app/templates/config/initializers/content_security_policy.rb +31 -0
  305. data/lib/jets/generators/overrides/app/templates/config/initializers/filter_parameter_logging.rb +8 -0
  306. data/lib/jets/generators/overrides/app/templates/config/initializers/permissions_policy.rb +11 -0
  307. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/config/routes.rb +5 -1
  308. data/lib/jets/generators/overrides/app/templates/db/.gitkeep +0 -0
  309. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/404.html +6 -6
  310. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/422.html +6 -6
  311. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/500.html +6 -6
  312. data/lib/jets/generators/overrides/templates/erb/scaffold/index.html.erb +22 -0
  313. data/lib/jets/generators/overrides/templates/erb/scaffold/partial.html.erb +8 -0
  314. data/lib/jets/{generator/templates/rails/scaffold_controller/api_controller.rb → generators/overrides/templates/rails/scaffold_controller/api_controller.rb.tt} +5 -9
  315. data/lib/jets/generators/overrides/templates/rails/scaffold_controller/controller.rb.tt +67 -0
  316. data/lib/jets/generators.rb +112 -0
  317. data/lib/jets/info.rb +116 -0
  318. data/lib/jets/initializable.rb +95 -0
  319. data/lib/jets/job/base.rb +3 -2
  320. data/lib/jets/job/dsl/dynamodb_event.rb +19 -9
  321. data/lib/jets/job/dsl/event_source_mapping.rb +1 -1
  322. data/lib/jets/job/dsl/iot_event.rb +6 -6
  323. data/lib/jets/job/dsl/kinesis_event.rb +5 -5
  324. data/lib/jets/job/dsl/log_event.rb +2 -2
  325. data/lib/jets/job/dsl/rule_event.rb +7 -4
  326. data/lib/jets/job/dsl/s3_event.rb +1 -1
  327. data/lib/jets/job/dsl/sns_event.rb +6 -6
  328. data/lib/jets/job/dsl/sqs_event.rb +11 -11
  329. data/lib/jets/klass.rb +5 -6
  330. data/lib/jets/lambda/definition.rb +118 -0
  331. data/lib/jets/lambda/dsl/warnings.rb +57 -0
  332. data/lib/jets/lambda/dsl.rb +64 -53
  333. data/lib/jets/lambda/function.rb +3 -3
  334. data/lib/jets/lambda/function_constructor.rb +6 -6
  335. data/lib/jets/lambda/functions.rb +36 -1
  336. data/lib/jets/mega/request/source.rb +1 -2
  337. data/lib/jets/mega/request.rb +4 -4
  338. data/lib/jets/names.rb +31 -15
  339. data/lib/jets/overrides/dummy/rails.rb +11 -0
  340. data/lib/jets/overrides/lambda/marshaller.rb +10 -0
  341. data/lib/jets/overrides/puma.rb +10 -0
  342. data/lib/jets/paths.rb +243 -0
  343. data/lib/jets/{poly_fun → poly}/base_executor.rb +13 -13
  344. data/lib/jets/{poly_fun → poly}/lambda_executor.rb +2 -2
  345. data/lib/jets/{poly_fun → poly}/node_error.rb +1 -1
  346. data/lib/jets/{poly_fun → poly}/node_executor.rb +4 -4
  347. data/lib/jets/{poly_fun → poly}/python_error.rb +1 -1
  348. data/lib/jets/{poly_fun → poly}/python_executor.rb +2 -2
  349. data/lib/jets/{poly_fun.rb → poly.rb} +12 -12
  350. data/lib/jets/preheat.rb +12 -25
  351. data/lib/jets/processors/deducer.rb +2 -2
  352. data/lib/jets/processors/main_processor.rb +6 -13
  353. data/lib/jets/rack/logger.rb +77 -0
  354. data/lib/jets/router/compat/route_set.rb +177 -0
  355. data/lib/jets/router/dsl/mount.rb +40 -6
  356. data/lib/jets/router/dsl.rb +125 -105
  357. data/lib/jets/router/engine_mount.rb +36 -0
  358. data/lib/jets/router/help.rb +130 -0
  359. data/lib/jets/router/helpers/named_routes/add_full_url.rb +13 -0
  360. data/lib/jets/router/helpers/named_routes/generated.rb +197 -0
  361. data/lib/jets/router/helpers/named_routes/proxy.rb +66 -0
  362. data/lib/jets/router/matcher.rb +135 -16
  363. data/lib/jets/router/resources/options.rb +6 -4
  364. data/lib/jets/router/route/after_initialize.rb +64 -0
  365. data/lib/jets/router/route/as.rb +93 -0
  366. data/lib/jets/router/route/authorizer.rb +1 -0
  367. data/lib/jets/router/route/compat.rb +45 -0
  368. data/lib/jets/router/route/info.rb +74 -0
  369. data/lib/jets/router/route/node.rb +137 -0
  370. data/lib/jets/router/route/path.rb +93 -0
  371. data/lib/jets/router/route.rb +109 -106
  372. data/lib/jets/router/route_set.rb +214 -0
  373. data/lib/jets/router/scope.rb +204 -69
  374. data/lib/jets/router/state.rb +36 -16
  375. data/lib/jets/router/util.rb +1 -31
  376. data/lib/jets/router.rb +64 -162
  377. data/lib/jets/ruby_version_check.rb +15 -0
  378. data/lib/jets/rule/base.rb +1 -0
  379. data/lib/jets/rule/dsl.rb +7 -7
  380. data/lib/jets/secrets.rb +110 -0
  381. data/lib/jets/spec_helpers/controllers/request.rb +22 -16
  382. data/lib/jets/spec_helpers/controllers.rb +32 -24
  383. data/lib/jets/spec_helpers.rb +0 -6
  384. data/lib/jets/stack/builder.rb +3 -2
  385. data/lib/jets/stack/definition.rb +1 -4
  386. data/lib/jets/stack/function.rb +2 -2
  387. data/lib/jets/stack/main/dsl/cloudwatch.rb +4 -4
  388. data/lib/jets/stack/main/dsl/kinesis.rb +2 -2
  389. data/lib/jets/stack/main/dsl/lambda.rb +26 -20
  390. data/lib/jets/stack/main/dsl/sqs.rb +2 -2
  391. data/lib/jets/stack/output/lookup.rb +1 -1
  392. data/lib/jets/stack/output.rb +2 -2
  393. data/lib/jets/stack/parameter.rb +2 -2
  394. data/lib/jets/stack/resource.rb +3 -3
  395. data/lib/jets/stack/s3_event.rb +51 -37
  396. data/lib/jets/stack.rb +1 -1
  397. data/lib/jets/tasks/engine.rake +85 -0
  398. data/lib/jets/tasks/framework.rake +66 -0
  399. data/lib/jets/tasks/log.rake +41 -0
  400. data/lib/jets/tasks/middleware.rake +9 -0
  401. data/lib/jets/tasks/misc.rake +81 -0
  402. data/lib/jets/tasks/statistics.rake +37 -0
  403. data/lib/jets/tasks/tmp.rake +51 -0
  404. data/lib/jets/tasks/yarn.rake +29 -0
  405. data/lib/jets/tasks/zeitwerk.rake +61 -0
  406. data/lib/jets/tasks.rb +18 -0
  407. data/lib/jets/turbine/configurable.rb +36 -0
  408. data/lib/jets/turbine/configuration.rb +101 -0
  409. data/lib/jets/turbine.rb +164 -20
  410. data/lib/jets/util/camelize.rb +24 -0
  411. data/lib/jets/version.rb +1 -1
  412. data/lib/jets.rb +7 -16
  413. metadata +410 -362
  414. data/bin/release +0 -9
  415. data/lib/jets/application/defaults.rb +0 -230
  416. data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +0 -16
  417. data/lib/jets/builders/reconfigure_rails.rb +0 -114
  418. data/lib/jets/cfn/builders/api_resources_builder.rb +0 -44
  419. data/lib/jets/cfn/builders/base_child_builder.rb +0 -88
  420. data/lib/jets/cfn/builders/controller_builder.rb +0 -50
  421. data/lib/jets/cfn/builders/function_builder.rb +0 -14
  422. data/lib/jets/cfn/builders/job_builder.rb +0 -14
  423. data/lib/jets/cfn/builders/page_builder.rb +0 -80
  424. data/lib/jets/cfn/built_template.rb +0 -15
  425. data/lib/jets/cfn/template_source.rb +0 -64
  426. data/lib/jets/commands/base.rb +0 -145
  427. data/lib/jets/commands/call.rb +0 -185
  428. data/lib/jets/commands/clean.rb +0 -19
  429. data/lib/jets/commands/configure.rb +0 -51
  430. data/lib/jets/commands/console.rb +0 -18
  431. data/lib/jets/commands/db/environment-task.rake +0 -3
  432. data/lib/jets/commands/db/tasks/dummy/app.rb +0 -25
  433. data/lib/jets/commands/db/tasks/dummy/config.rb +0 -14
  434. data/lib/jets/commands/db/tasks.rb +0 -34
  435. data/lib/jets/commands/db.rb +0 -13
  436. data/lib/jets/commands/dbconsole.rb +0 -134
  437. data/lib/jets/commands/delete.rb +0 -136
  438. data/lib/jets/commands/dynamodb/migrate.rb +0 -9
  439. data/lib/jets/commands/dynamodb/migrator.rb +0 -36
  440. data/lib/jets/commands/dynamodb.rb +0 -19
  441. data/lib/jets/commands/gems.rb +0 -13
  442. data/lib/jets/commands/help/call.md +0 -69
  443. data/lib/jets/commands/help/dynamodb/generate.md +0 -52
  444. data/lib/jets/commands/help/dynamodb/migrate.md +0 -4
  445. data/lib/jets/commands/help/routes.md +0 -16
  446. data/lib/jets/commands/help.rb +0 -9
  447. data/lib/jets/commands/import/base.rb +0 -49
  448. data/lib/jets/commands/import/cheatsheet.rb +0 -35
  449. data/lib/jets/commands/import/rack.rb +0 -16
  450. data/lib/jets/commands/import/rails.rb +0 -74
  451. data/lib/jets/commands/import/sequence.rb +0 -90
  452. data/lib/jets/commands/import/templates/config/database.yml +0 -30
  453. data/lib/jets/commands/import/templates/submodules-cheatsheet.md +0 -89
  454. data/lib/jets/commands/import.rb +0 -12
  455. data/lib/jets/commands/main.rb +0 -169
  456. data/lib/jets/commands/markdown/creator.rb +0 -58
  457. data/lib/jets/commands/markdown/index.rb +0 -27
  458. data/lib/jets/commands/markdown/page.rb +0 -125
  459. data/lib/jets/commands/markdown/shell.rb +0 -11
  460. data/lib/jets/commands/new.rb +0 -173
  461. data/lib/jets/commands/rake_command.rb +0 -61
  462. data/lib/jets/commands/rake_tasks.rb +0 -50
  463. data/lib/jets/commands/runner.rb +0 -16
  464. data/lib/jets/commands/sequence.rb +0 -104
  465. data/lib/jets/commands/stack_info.rb +0 -30
  466. data/lib/jets/commands/templates/skeleton/.env.development.tt +0 -3
  467. data/lib/jets/commands/templates/skeleton/.env.test +0 -3
  468. data/lib/jets/commands/templates/skeleton/.env.tt +0 -3
  469. data/lib/jets/commands/templates/skeleton/.jetskeep +0 -1
  470. data/lib/jets/commands/templates/skeleton/Gemfile.tt +0 -40
  471. data/lib/jets/commands/templates/skeleton/Procfile +0 -7
  472. data/lib/jets/commands/templates/skeleton/Rakefile +0 -2
  473. data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +0 -2
  474. data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +0 -26
  475. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +0 -72
  476. data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +0 -22
  477. data/lib/jets/commands/templates/skeleton/config/environments/development.rb +0 -7
  478. data/lib/jets/commands/templates/skeleton/config/environments/production.rb +0 -9
  479. data/lib/jets/commands/templates/skeleton/config/environments/test.rb +0 -7
  480. data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +0 -23
  481. data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +0 -24
  482. data/lib/jets/commands/upgrade/templates/bin/webpack +0 -20
  483. data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +0 -19
  484. data/lib/jets/commands/upgrade/version1.rb +0 -136
  485. data/lib/jets/commands/upgrade.rb +0 -105
  486. data/lib/jets/commands/webpacker_template.rb +0 -18
  487. data/lib/jets/controller/callbacks.rb +0 -73
  488. data/lib/jets/controller/cookies/jar.rb +0 -269
  489. data/lib/jets/controller/cookies.rb +0 -38
  490. data/lib/jets/controller/error/invalid_authenticity_token.rb +0 -6
  491. data/lib/jets/controller/error.rb +0 -4
  492. data/lib/jets/controller/forgery_protection.rb +0 -43
  493. data/lib/jets/controller/layout.rb +0 -17
  494. data/lib/jets/controller/middleware/cors.rb +0 -60
  495. data/lib/jets/controller/middleware/local/mimic_aws_call.rb +0 -38
  496. data/lib/jets/controller/middleware/local/route_matcher.rb +0 -22
  497. data/lib/jets/controller/middleware/reloader.rb +0 -15
  498. data/lib/jets/controller/parameters_filter.rb +0 -29
  499. data/lib/jets/controller/params.rb +0 -117
  500. data/lib/jets/controller/redirection.rb +0 -61
  501. data/lib/jets/controller/rendering/rack_renderer.rb +0 -267
  502. data/lib/jets/controller/rendering.rb +0 -96
  503. data/lib/jets/controller/stage.rb +0 -34
  504. data/lib/jets/controller.rb +0 -3
  505. data/lib/jets/db.rb +0 -15
  506. data/lib/jets/generator/templates/erb/controller/view.html.erb +0 -2
  507. data/lib/jets/generator/templates/erb/scaffold/index.html.erb +0 -29
  508. data/lib/jets/generator/templates/rails/controller/controller.rb +0 -13
  509. data/lib/jets/generator/templates/rails/helper/helper.rb +0 -4
  510. data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +0 -67
  511. data/lib/jets/generator.rb +0 -112
  512. data/lib/jets/internal/app/controllers/jets/bare_controller.rb +0 -16
  513. data/lib/jets/internal/app/controllers/jets/rack_controller.rb +0 -12
  514. data/lib/jets/internal/app/helpers/jets/mailers_helper.rb +0 -9
  515. data/lib/jets/internal/app/jobs/jets/preheat_job.rb +0 -52
  516. data/lib/jets/internal/app/views/jets/mailers/index.html.erb +0 -8
  517. data/lib/jets/internal/app/views/jets/mailers/mailer.html.erb +0 -6
  518. data/lib/jets/internal/turbines/jets/mailer.rb +0 -52
  519. data/lib/jets/lambda/task.rb +0 -111
  520. data/lib/jets/logger.rb +0 -21
  521. data/lib/jets/middleware/configurator.rb +0 -84
  522. data/lib/jets/middleware/default_stack.rb +0 -53
  523. data/lib/jets/middleware/layer.rb +0 -34
  524. data/lib/jets/middleware/stack.rb +0 -77
  525. data/lib/jets/middleware.rb +0 -33
  526. data/lib/jets/overrides/rails/action_controller.rb +0 -13
  527. data/lib/jets/overrides/rails/asset_tag_helper.rb +0 -114
  528. data/lib/jets/overrides/rails/common_methods.rb +0 -13
  529. data/lib/jets/overrides/rails/migration_checker.rb +0 -34
  530. data/lib/jets/overrides/rails/rendering_helper.rb +0 -27
  531. data/lib/jets/overrides/rails/url_helper.rb +0 -88
  532. data/lib/jets/overrides/rails.rb +0 -6
  533. data/lib/jets/rack_server.rb +0 -86
  534. data/lib/jets/resource/api_gateway/base_path/function.rb +0 -49
  535. data/lib/jets/resource/api_gateway/base_path/role.rb +0 -76
  536. data/lib/jets/resource/api_gateway/cors.rb +0 -61
  537. data/lib/jets/resource/api_gateway/method.rb +0 -102
  538. data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +0 -16
  539. data/lib/jets/resource/base.rb +0 -28
  540. data/lib/jets/resource/child_stack/api_deployment.rb +0 -58
  541. data/lib/jets/resource/child_stack/api_gateway.rb +0 -23
  542. data/lib/jets/resource/child_stack/api_resource/page.rb +0 -20
  543. data/lib/jets/resource/child_stack/api_resource.rb +0 -54
  544. data/lib/jets/resource/child_stack/base.rb +0 -24
  545. data/lib/jets/resource/lambda/function.rb +0 -221
  546. data/lib/jets/resource/logs/subscription_filter.rb +0 -31
  547. data/lib/jets/resource/permission.rb +0 -45
  548. data/lib/jets/resource.rb +0 -71
  549. data/lib/jets/router/error.rb +0 -4
  550. data/lib/jets/router/finder.rb +0 -47
  551. data/lib/jets/router/helpers/core_helper.rb +0 -27
  552. data/lib/jets/router/helpers/named_routes_helper.rb +0 -8
  553. data/lib/jets/router/helpers.rb +0 -4
  554. data/lib/jets/router/method_creator/code.rb +0 -99
  555. data/lib/jets/router/method_creator/edit.rb +0 -12
  556. data/lib/jets/router/method_creator/generic.rb +0 -11
  557. data/lib/jets/router/method_creator/index.rb +0 -48
  558. data/lib/jets/router/method_creator/new.rb +0 -12
  559. data/lib/jets/router/method_creator/root.rb +0 -15
  560. data/lib/jets/router/method_creator/show.rb +0 -12
  561. data/lib/jets/router/method_creator.rb +0 -50
  562. data/lib/jets/turbo/database_yaml.rb +0 -41
  563. data/lib/jets/turbo/project/.gitignore +0 -12
  564. data/lib/jets/turbo/project/.jetskeep +0 -1
  565. data/lib/jets/turbo/project/Gemfile +0 -16
  566. data/lib/jets/turbo/project/Rakefile +0 -2
  567. data/lib/jets/turbo/project/app/controllers/application_controller.rb +0 -2
  568. data/lib/jets/turbo/project/app/helpers/application_helper.rb +0 -2
  569. data/lib/jets/turbo/project/app/jobs/application_job.rb +0 -4
  570. data/lib/jets/turbo/project/config/application.rb +0 -5
  571. data/lib/jets/turbo/project/config/routes.rb +0 -4
  572. data/lib/jets/turbo/project/config.ru +0 -5
  573. data/lib/jets/turbo/rails.rb +0 -127
  574. data/lib/jets/turbo/templates/config/database.yml +0 -30
  575. data/lib/jets/turbo.rb +0 -56
  576. data/readme/prerelease.md +0 -6
  577. data/readme/testing.md +0 -60
  578. /data/{lib/jets → engines}/internal/app/shared/functions/jets/s3_bucket_config.rb +0 -0
  579. /data/lib/jets/{commands → command}/help/build.md +0 -0
  580. /data/lib/jets/{commands → command}/help/clean/build.md +0 -0
  581. /data/lib/jets/{commands → command}/help/clean/log.md +0 -0
  582. /data/lib/jets/{commands → command}/help/console.md +0 -0
  583. /data/lib/jets/{commands → command}/help/db/generate.md +0 -0
  584. /data/lib/jets/{commands → command}/help/dbconsole.md +0 -0
  585. /data/lib/jets/{commands → command}/help/degenerate.md +0 -0
  586. /data/lib/jets/{commands → command}/help/delete.md +0 -0
  587. /data/lib/jets/{commands → command}/help/gems/check.md +0 -0
  588. /data/lib/jets/{commands → command}/help/generate.md +0 -0
  589. /data/lib/jets/{commands → command}/help/import/rack.md +0 -0
  590. /data/lib/jets/{commands → command}/help/import/rails.md +0 -0
  591. /data/lib/jets/{commands → command}/help/runner.md +0 -0
  592. /data/lib/jets/{commands → command}/help/server.md +0 -0
  593. /data/lib/jets/{commands → command}/help/status.md +0 -0
  594. /data/lib/jets/{commands → command}/help/upgrade.md +0 -0
  595. /data/lib/jets/{commands → command}/help/url.md +0 -0
  596. /data/lib/jets/{generator/templates/active_job → generators}/job/templates/application_job.rb.tt +0 -0
  597. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/.rspec +0 -0
  598. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/README.md +0 -0
  599. /data/{.gitmodules → lib/jets/generators/overrides/app/templates/app/assets/images/.keep} +0 -0
  600. /data/lib/jets/{commands/templates/skeleton/db/.gitkeep → generators/overrides/app/templates/app/assets/javascripts/.keep} +0 -0
  601. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/controllers/application_controller.rb +0 -0
  602. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/helpers/application_helper.rb +0 -0
  603. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/jobs/application_job.rb +0 -0
  604. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/config.ru +0 -0
  605. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/favicon.ico +0 -0
  606. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/controllers/posts_controller_spec.rb +0 -0
  607. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/fixtures/payloads/posts-index.json +0 -0
  608. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/fixtures/payloads/posts-show.json +0 -0
  609. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/spec_helper.rb.tt +0 -0
  610. /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/_form.html.erb +0 -0
  611. /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/edit.html.erb +0 -0
  612. /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/new.html.erb +0 -0
  613. /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/show.html.erb +0 -0
  614. /data/lib/jets/{generator → generators/overrides}/templates/rails/assets/javascript.js +0 -0
  615. /data/lib/jets/{generator → generators/overrides}/templates/rails/assets/stylesheet.css +0 -0
  616. /data/lib/jets/{generator → generators/overrides}/templates/rails/scaffold/scaffold.css +0 -0
@@ -1,239 +1,556 @@
1
- require "singleton"
2
- require "rack"
1
+ # frozen_string_literal: true
2
+
3
+ require "yaml"
4
+ require "active_support/core_ext/hash/keys"
5
+ require "active_support/core_ext/object/blank"
6
+ require "active_support/key_generator"
7
+ require "active_support/message_verifier"
8
+ require "active_support/encrypted_configuration"
9
+ require "active_support/hash_with_indifferent_access"
10
+ require "active_support/configuration_file"
11
+
12
+ module Jets
13
+ class Application < Engine
14
+ class << self
15
+ def inherited(base)
16
+ super
17
+ Jets.app_class = base
18
+ add_lib_to_load_path!(find_root(base.called_from))
19
+ ActiveSupport.run_load_hooks(:before_configuration, base)
20
+ end
21
+
22
+ def instance
23
+ super.run_load_hooks!
24
+ end
25
+
26
+ def create(initial_variable_values = {}, &block)
27
+ new(initial_variable_values, &block).run_load_hooks!
28
+ end
29
+
30
+ def find_root(from)
31
+ find_root_with_flag "config.ru", from, Dir.pwd
32
+ end
33
+
34
+ # Makes the +new+ method public.
35
+ #
36
+ # Note that Jets::Application inherits from Jets::Engine, which
37
+ # inherits from Jets::Turbine and the +new+ method on Jets::Turbine is
38
+ # private
39
+ public :new
40
+ end
3
41
 
4
- class Jets::Application
5
- include Singleton
6
- extend Memoist
7
- include Jets::Middleware
8
- include Defaults
42
+ attr_accessor :assets, :sandbox
43
+ alias_method :sandbox?, :sandbox
44
+ attr_reader :reloaders, :reloader, :executor, :autoloaders
9
45
 
10
- def configure(&block)
11
- instance_eval(&block) if block
12
- end
46
+ delegate :default_url_options, :default_url_options=, to: :routes
13
47
 
14
- def setup!
15
- load_default_config
16
- setup_autoload_paths
17
- setup_ignore_paths
18
- main_loader_setup
19
- end
48
+ INITIAL_VARIABLES = [:config, :turbines, :routes_reloader, :reloaders,
49
+ :routes, :helpers, :app_env_config, :secrets] # :nodoc:
20
50
 
21
- def configs!
22
- load_environments_config
23
- load_db_config
24
- set_iam_policy # relies on dependent values, must be called afterwards
25
- set_time_zone
26
- normalize_env_vars!
27
- end
51
+ def initialize(initial_variable_values = {}, &block)
52
+ super()
53
+ @initialized = false
54
+ @reloaders = []
55
+ @routes_reloader = nil
56
+ @app_env_config = nil
57
+ @ordered_turbines = nil
58
+ @turbines = nil
59
+ @message_verifiers = {}
60
+ @ran_load_hooks = false
28
61
 
29
- # After the mimimal template gets build, we need to reload it for the full stack
30
- # creation. This allows us to reference IAM policies configs that depend on the
31
- # creation of the s3 bucket.
32
- def reload_configs!
33
- # Tricky: reset only the things that depends on the minimal stack
34
- @config.iam_policy = nil
35
- configs!
36
- end
62
+ @executor = Class.new(ActiveSupport::Executor)
63
+ @reloader = Class.new(ActiveSupport::Reloader)
64
+ @reloader.executor = @executor
37
65
 
38
- def finish!
39
- deprecated_configs_message
40
- load_inflections
41
- load_routes
66
+ @autoloaders = Jets::Autoloaders.new
42
67
 
43
- Jets::Controller::Rendering::RackRenderer.setup! # Sets up ActionView etc
44
- # Load libraries at the end to trigger onload so we can defined options in any order.
45
- # Only action_mailer library have been used properly this way so far.
46
- require 'action_mailer'
47
- end
68
+ # are these actually used?
69
+ @initial_variable_values = initial_variable_values
70
+ @block = block
71
+ end
48
72
 
49
- def load_inflections
50
- Jets::Inflections.load!
51
- end
73
+ # Returns true if the application is initialized.
74
+ def initialized?
75
+ @initialized
76
+ end
52
77
 
53
- def config
54
- @config ||= ActiveSupport::OrderedOptions.new # dont use memoize since we reset @config later
55
- end
78
+ def run_load_hooks! # :nodoc:
79
+ return self if @ran_load_hooks
80
+ @ran_load_hooks = true
56
81
 
57
- # Double evaling config/application.rb causes subtle issues:
58
- # * double loading of shared resources: Jets::Stack.subclasses will have the same
59
- # class twice when config is called when declaring a function
60
- # * forces us to rescue all exceptions, which is a big hammer
61
- #
62
- # Lets parse for the project name instead for now.
63
- #
64
- def parse_project_name
65
- return ENV['JETS_PROJECT_NAME'] if ENV['JETS_PROJECT_NAME'] # override
66
-
67
- lines = IO.readlines("#{Jets.root}/config/application.rb")
68
- project_name_line = lines.find { |l| l =~ /config\.project_name.*=/ && l !~ /^\s+#/ }
69
- project_name_line.gsub(/.*=/,'').strip.gsub(/["']/,'') # project_name
70
- end
82
+ @initial_variable_values.each do |variable_name, value|
83
+ if INITIAL_VARIABLES.include?(variable_name)
84
+ instance_variable_set("@#{variable_name}", value)
85
+ end
86
+ end
71
87
 
72
- def load_default_config
73
- @config = default_config # sets Jets.config.project_name by calling parse_project_name
74
- set_computed_configs! # things like project_namespace that need project_name
75
- Jets::Dotenv.load! # needs Jets.config.project_name when using ssm in dotenv files
76
- Jets.config.project_name = parse_project_name # Must set again because JETS_PROJECT_NAME is possible
77
- load_config_application # this overwrites Jets.config.project_name
78
- end
88
+ instance_eval(&@block) if @block
89
+ self
90
+ end
79
91
 
80
- def load_config_application
81
- app_config = "#{Jets.root}/config/application.rb"
82
- load app_config # use load instead of require so reload_configs! works
83
- end
92
+ # Reload application routes regardless if they changed or not.
93
+ def reload_routes!
94
+ routes_reloader.reload!
95
+ end
84
96
 
85
- def load_environments_config
86
- env_file = "#{Jets.root}/config/environments/#{Jets.env}.rb"
87
- if File.exist?(env_file)
88
- code = IO.read(env_file)
89
- instance_eval(code, env_file)
97
+ # Returns the application's KeyGenerator
98
+ def key_generator
99
+ # number of iterations selected based on consultation with the google security
100
+ # team. Details at https://github.com/jets/jets/pull/6952#issuecomment-7661220
101
+ @caching_key_generator ||= ActiveSupport::CachingKeyGenerator.new(
102
+ ActiveSupport::KeyGenerator.new(secret_key_base, iterations: 1000)
103
+ )
90
104
  end
91
- end
92
105
 
93
- def deprecated_configs_message
94
- unless config.ruby.lazy_load.nil?
95
- puts "Detected config.ruby.lazy_load = #{config.ruby.lazy_load.inspect}".color(:yellow)
96
- puts "Deprecated: config.ruby.lazy_load".color(:yellow)
97
- puts "Gems are now bundled with with Lambda Layer and there's no need to lazy load them."
98
- puts "Please remove the config in your config/application.rb or config/environments files."
99
- puts "You can have Jets automatically do this by running:"
100
- puts " jets upgrade"
106
+ # Returns a message verifier object.
107
+ #
108
+ # This verifier can be used to generate and verify signed messages in the application.
109
+ #
110
+ # It is recommended not to use the same verifier for different things, so you can get different
111
+ # verifiers passing the +verifier_name+ argument.
112
+ #
113
+ # ==== Parameters
114
+ #
115
+ # * +verifier_name+ - the name of the message verifier.
116
+ #
117
+ # ==== Examples
118
+ #
119
+ # message = Jets.application.message_verifier('sensitive_data').generate('my sensible data')
120
+ # Jets.application.message_verifier('sensitive_data').verify(message)
121
+ # # => 'my sensible data'
122
+ #
123
+ # See the ActiveSupport::MessageVerifier documentation for more information.
124
+ def message_verifier(verifier_name)
125
+ @message_verifiers[verifier_name] ||= begin
126
+ secret = key_generator.generate_key(verifier_name.to_s)
127
+ ActiveSupport::MessageVerifier.new(secret)
128
+ end
101
129
  end
102
- end
103
130
 
104
- def main_loader
105
- Jets::Autoloaders.main
106
- end
131
+ # Convenience for loading config/foo.yml for the current Jets env.
132
+ #
133
+ # Examples:
134
+ #
135
+ # # config/exception_notification.yml:
136
+ # production:
137
+ # url: http://127.0.0.1:8080
138
+ # namespace: my_app_production
139
+ #
140
+ # development:
141
+ # url: http://localhost:3001
142
+ # namespace: my_app_development
143
+ #
144
+ # # config/environments/production.rb
145
+ # Jets.application.configure do
146
+ # config.middleware.use ExceptionNotifier, config_for(:exception_notification)
147
+ # end
148
+ #
149
+ # # You can also store configurations in a shared section which will be
150
+ # # merged with the environment configuration
151
+ #
152
+ # # config/example.yml
153
+ # shared:
154
+ # foo:
155
+ # bar:
156
+ # baz: 1
157
+ #
158
+ # development:
159
+ # foo:
160
+ # bar:
161
+ # qux: 2
162
+ #
163
+ # # development environment
164
+ # Jets.application.config_for(:example)[:foo][:bar]
165
+ # # => { baz: 1, qux: 2 }
166
+ def config_for(name, env: Jets.env)
167
+ yaml = name.is_a?(Pathname) ? name : Pathname.new("#{paths["config"].existent.first}/#{name}.yml")
168
+
169
+ if yaml.exist?
170
+ require "erb"
171
+ all_configs = ActiveSupport::ConfigurationFile.parse(yaml).deep_symbolize_keys
172
+ config, shared = all_configs[env.to_sym], all_configs[:shared]
173
+
174
+ if shared
175
+ config = {} if config.nil? && shared.is_a?(Hash)
176
+ if config.is_a?(Hash) && shared.is_a?(Hash)
177
+ config = shared.deep_merge(config)
178
+ elsif config.nil?
179
+ config = shared
180
+ end
181
+ end
182
+
183
+ if config.is_a?(Hash)
184
+ config = ActiveSupport::OrderedOptions.new.update(config)
185
+ end
186
+
187
+ config
188
+ else
189
+ raise "Could not load configuration. No such file - #{yaml}"
190
+ end
191
+ end
107
192
 
108
- def setup_autoload_paths
109
- autoload_paths = default_autoload_paths + config.autoload_paths
110
- autoload_paths.each do |path|
111
- next unless File.exist?(path)
112
- main_loader.push_dir(path)
193
+ # Stores some of the Jets initial environment parameters which
194
+ # will be used by middlewares and engines to configure themselves.
195
+ def env_config
196
+ @app_env_config ||= super.merge(
197
+ "action_dispatch.parameter_filter" => config.filter_parameters,
198
+ "action_dispatch.redirect_filter" => config.filter_redirect,
199
+ "action_dispatch.secret_key_base" => secret_key_base,
200
+ "action_dispatch.show_exceptions" => config.action_dispatch.show_exceptions,
201
+ "action_dispatch.show_detailed_exceptions" => config.consider_all_requests_local,
202
+ "action_dispatch.log_rescued_responses" => config.action_dispatch.log_rescued_responses,
203
+ "action_dispatch.logger" => Jets.logger,
204
+ "action_dispatch.backtrace_cleaner" => Jets.backtrace_cleaner,
205
+ "action_dispatch.key_generator" => key_generator,
206
+ "action_dispatch.http_auth_salt" => config.action_dispatch.http_auth_salt,
207
+ "action_dispatch.signed_cookie_salt" => config.action_dispatch.signed_cookie_salt,
208
+ "action_dispatch.encrypted_cookie_salt" => config.action_dispatch.encrypted_cookie_salt,
209
+ "action_dispatch.encrypted_signed_cookie_salt" => config.action_dispatch.encrypted_signed_cookie_salt,
210
+ "action_dispatch.authenticated_encrypted_cookie_salt" => config.action_dispatch.authenticated_encrypted_cookie_salt,
211
+ "action_dispatch.use_authenticated_cookie_encryption" => config.action_dispatch.use_authenticated_cookie_encryption,
212
+ "action_dispatch.encrypted_cookie_cipher" => config.action_dispatch.encrypted_cookie_cipher,
213
+ "action_dispatch.signed_cookie_digest" => config.action_dispatch.signed_cookie_digest,
214
+ "action_dispatch.cookies_serializer" => config.action_dispatch.cookies_serializer,
215
+ "action_dispatch.cookies_digest" => config.action_dispatch.cookies_digest,
216
+ "action_dispatch.cookies_rotations" => config.action_dispatch.cookies_rotations,
217
+ "action_dispatch.cookies_same_site_protection" => coerce_same_site_protection(config.action_dispatch.cookies_same_site_protection),
218
+ "action_dispatch.use_cookies_with_metadata" => config.action_dispatch.use_cookies_with_metadata,
219
+ "action_dispatch.content_security_policy" => config.content_security_policy,
220
+ "action_dispatch.content_security_policy_report_only" => config.content_security_policy_report_only,
221
+ "action_dispatch.content_security_policy_nonce_generator" => config.content_security_policy_nonce_generator,
222
+ "action_dispatch.content_security_policy_nonce_directives" => config.content_security_policy_nonce_directives,
223
+ "action_dispatch.permissions_policy" => config.permissions_policy,
224
+ )
113
225
  end
114
- end
115
226
 
116
- # Allow use to add config.ignore_paths just in case there's some case Jets hasn't considered
117
- def setup_ignore_paths
118
- ignore_paths = default_ignore_paths + config.ignore_paths
119
- ignore_paths.each do |path|
120
- main_loader.ignore("#{Jets.root}/#{path}")
227
+ # If you try to define a set of Rake tasks on the instance, these will get
228
+ # passed up to the Rake tasks defined on the application's class.
229
+ def rake_tasks(&block)
230
+ self.class.rake_tasks(&block)
121
231
  end
122
- end
123
232
 
124
- def main_loader_setup
125
- main_loader.enable_reloading if Jets.env.development?
126
- main_loader.setup # only respected on the first call
127
- end
233
+ # Sends the initializers to the +initializer+ method defined in the
234
+ # Jets::Initializable module. Each Jets::Application class has its own
235
+ # set of initializers, as defined by the Initializable module.
236
+ def initializer(name, opts = {}, &block)
237
+ self.class.initializer(name, opts, &block)
238
+ end
128
239
 
129
- def each_app_autoload_path(expression)
130
- Dir.glob(expression).each do |p|
131
- p.sub!('./','')
132
- yield(p) unless exclude_autoload_path?(p)
240
+ # Sends any runner called in the instance of a new application up
241
+ # to the +runner+ method defined in Jets::Turbine.
242
+ def runner(&blk)
243
+ self.class.runner(&blk)
133
244
  end
134
- end
135
245
 
136
- def exclude_autoload_path?(path)
137
- path =~ %r{app/javascript} ||
138
- path =~ %r{app/views} ||
139
- path =~ %r{/functions} # app and shared
140
- end
246
+ # Sends any console called in the instance of a new application up
247
+ # to the +console+ method defined in Jets::Turbine.
248
+ def console(&blk)
249
+ self.class.console(&blk)
250
+ end
141
251
 
142
- def internal_autoload_paths
143
- internal = File.expand_path("../internal", __FILE__)
144
- paths = %w[
145
- app/controllers
146
- app/helpers
147
- app/jobs
148
- app/models
149
- ]
150
- paths.map { |path| "#{internal}/#{path}" }
151
- end
252
+ # Sends any generators called in the instance of a new application up
253
+ # to the +generators+ method defined in Jets::Turbine.
254
+ def generators(&blk)
255
+ self.class.generators(&blk)
256
+ end
152
257
 
153
- # Use the shorter name in stack names, but use the full name when it
154
- # comes to checking for the env.
155
- #
156
- # Example:
157
- #
158
- # Jets.env: 'development'
159
- # Jets.config.project_namespace: 'demo-dev'
160
- ENV_MAP = {
161
- development: 'dev',
162
- production: 'prod',
163
- staging: 'stag',
164
- }
165
- def set_computed_configs!
166
- # env var JETS_EXTRA higher precedence than config.extra
167
- config.extra = Jets.extra
168
- # IE: With extra: project-dev-1
169
- # Without extra: project-dev
170
- config.short_env = ENV_MAP[Jets.env.to_sym] || Jets.env
171
- # table_namespace does not have the extra, more common case desired.
172
- config.table_namespace = [config.project_name, config.short_env].compact.join('-')
173
-
174
- config.project_namespace = Jets.project_namespace
175
- end
258
+ # Sends any server called in the instance of a new application up
259
+ # to the +server+ method defined in Jets::Turbine.
260
+ def server(&blk)
261
+ self.class.server(&blk)
262
+ end
176
263
 
177
- def set_iam_policy
178
- config.iam_policy ||= []
179
- config.default_iam_policy ||= self.class.default_iam_policy
180
- config.iam_policy = config.default_iam_policy | config.iam_policy
181
- config.managed_policy_definitions ||= [] # default empty
182
- end
264
+ # Sends the +isolate_namespace+ method up to the class method.
265
+ def isolate_namespace(mod)
266
+ self.class.isolate_namespace(mod)
267
+ end
183
268
 
184
- def set_time_zone
185
- Time.zone_default = Time.find_zone!(config.time_zone)
186
- end
269
+ ## Jets internal API
270
+
271
+ # This method is called just after an application inherits from Jets::Application,
272
+ # allowing the developer to load classes in lib and use them during application
273
+ # configuration.
274
+ #
275
+ # class MyApplication < Jets::Application
276
+ # require "my_backend" # in lib/my_backend
277
+ # config.i18n.backend = MyBackend
278
+ # end
279
+ #
280
+ # Notice this method takes into consideration the default root path. So if you
281
+ # are changing config.root inside your application definition or having a custom
282
+ # Jets application, you will need to add lib to $LOAD_PATH on your own in case
283
+ # you need to load files in lib/ during the application configuration as well.
284
+ def self.add_lib_to_load_path!(root) # :nodoc:
285
+ path = File.join root, "lib"
286
+ if File.exist?(path) && !$LOAD_PATH.include?(path)
287
+ $LOAD_PATH.unshift(path)
288
+ end
289
+ end
187
290
 
188
- # It is pretty easy to attempt to set environment variables without
189
- # the correct AWS Environment.Variables path struture.
190
- # Auto-fix it for convenience.
191
- def normalize_env_vars!
192
- environment = config.function.environment
193
- if environment and !environment.to_h.key?(:variables)
194
- config.function.environment = {
195
- variables: environment.to_h
196
- }
291
+ def require_environment! # :nodoc:
292
+ environment = paths["config/environment"].existent.first
293
+ require environment if environment
197
294
  end
198
- end
199
295
 
200
- def load_db_config(database_yml="#{Jets.root}/config/database.yml")
201
- config.database = {}
296
+ def routes_reloader # :nodoc:
297
+ @routes_reloader ||= RoutesReloader.new
298
+ end
299
+
300
+ # Returns an array of file paths appended with a hash of
301
+ # directories-extensions suitable for ActiveSupport::FileUpdateChecker
302
+ # API.
303
+ def watchable_args # :nodoc:
304
+ files, dirs = config.watchable_files.dup, config.watchable_dirs.dup
305
+
306
+ ActiveSupport::Dependencies.autoload_paths.each do |path|
307
+ File.file?(path) ? files << path.to_s : dirs[path.to_s] = [:rb]
308
+ end
202
309
 
203
- Jets::Dotenv.load!
204
- if File.exist?(database_yml)
205
- require "active_record/database_configurations" # lazy require
206
- text = Jets::Erb.result(database_yml)
207
- db_configs = Jets::Util::Yamler.load(text)
208
- configurations = ActiveRecord::DatabaseConfigurations.new(db_configs)
209
- config.database = configurations
310
+ [files, dirs]
210
311
  end
211
- end
212
312
 
213
- # Naming it routes because config/routes.rb requires
214
- #
215
- # Jets.application.routes.draw do
216
- #
217
- # for scaffolding to work.
218
- def routes
219
- @router ||= Jets::Router.new
220
- end
313
+ # Initialize the application passing the given group. By default, the
314
+ # group is :default
315
+ def initialize!(group = :default) # :nodoc:
316
+ raise "Application has been already initialized." if @initialized
317
+ run_initializers(group, self)
318
+ @initialized = true
319
+ self
320
+ end
221
321
 
222
- def load_routes(refresh: false)
223
- @router = nil if refresh # clear_routes
322
+ def initializers # :nodoc:
323
+ Bootstrap.initializers_for(self) +
324
+ turbines_initializers(super) +
325
+ Finisher.initializers_for(self)
326
+ end
224
327
 
225
- routes_file = "#{Jets.root}/config/routes.rb"
226
- return unless File.exist?(routes_file)
227
- if refresh
228
- load routes_file # always evaluate
229
- else
230
- require routes_file # evaluate once
328
+ def config # :nodoc:
329
+ @config ||= Application::Configuration.new(self.class.find_root(self.class.called_from))
231
330
  end
232
- end
233
331
 
234
- def aws
235
- Jets::AwsInfo.new
236
- end
237
- memoize :aws
332
+ attr_writer :config
333
+
334
+ def secrets
335
+ @secrets ||= begin
336
+ secrets = ActiveSupport::OrderedOptions.new
337
+ files = config.paths["config/secrets"].existent
338
+ files = files.reject { |path| path.end_with?(".enc") } unless config.read_encrypted_secrets
339
+ secrets.merge! Jets::Secrets.parse(files, env: Jets.env)
340
+
341
+ # Fallback to config.secret_key_base if secrets.secret_key_base isn't set
342
+ secrets.secret_key_base ||= config.secret_key_base
238
343
 
344
+ secrets
345
+ end
346
+ end
347
+
348
+ attr_writer :secrets, :credentials
349
+
350
+ # The secret_key_base is used as the input secret to the application's key generator, which in turn
351
+ # is used to create all ActiveSupport::MessageVerifier and ActiveSupport::MessageEncryptor instances,
352
+ # including the ones that sign and encrypt cookies.
353
+ #
354
+ # In development and test, this is randomly generated and stored in a
355
+ # temporary file in <tt>tmp/development_secret.txt</tt>.
356
+ #
357
+ # In all other environments, we look for it first in <tt>ENV["SECRET_KEY_BASE"]</tt>,
358
+ # then +credentials.secret_key_base+, and finally +secrets.secret_key_base+. For most applications,
359
+ # the correct place to store it is in the encrypted credentials file.
360
+ def secret_key_base
361
+ if Jets.env.development? || Jets.env.test?
362
+ secrets.secret_key_base ||= generate_development_secret
363
+ else
364
+ validate_secret_key_base(
365
+ ENV["SECRET_KEY_BASE"] || credentials.secret_key_base || secrets.secret_key_base
366
+ )
367
+ end
368
+ end
369
+
370
+ # Returns an ActiveSupport::EncryptedConfiguration instance for the
371
+ # credentials file specified by +config.credentials.content_path+.
372
+ #
373
+ # By default, +config.credentials.content_path+ will point to either
374
+ # <tt>config/credentials/#{environment}.yml.enc</tt> for the current
375
+ # environment (for example, +config/credentials/production.yml.enc+ for the
376
+ # +production+ environment), or +config/credentials.yml.enc+ if that file
377
+ # does not exist.
378
+ #
379
+ # The encryption key is taken from either <tt>ENV["JETS_MASTER_KEY"]</tt>,
380
+ # or from the file specified by +config.credentials.key_path+. By default,
381
+ # +config.credentials.key_path+ will point to either
382
+ # <tt>config/credentials/#{environment}.key</tt> for the current
383
+ # environment, or +config/master.key+ if that file does not exist.
384
+ def credentials
385
+ @credentials ||= encrypted(config.credentials.content_path, key_path: config.credentials.key_path)
386
+ end
387
+
388
+ # Returns an ActiveSupport::EncryptedConfiguration instance for an encrypted
389
+ # file. By default, the encryption key is taken from either
390
+ # <tt>ENV["JETS_MASTER_KEY"]</tt>, or from the +config/master.key+ file.
391
+ #
392
+ # my_config = Jets.application.encrypted("config/my_config.enc")
393
+ #
394
+ # my_config.read
395
+ # # => "foo:\n bar: 123\n"
396
+ #
397
+ # my_config.foo.bar
398
+ # # => 123
399
+ #
400
+ # Encrypted files can be edited with the <tt>bin/jets encrypted:edit</tt>
401
+ # command. (See the output of <tt>bin/jets encrypted:edit --help</tt> for
402
+ # more information.)
403
+ def encrypted(path, key_path: "config/master.key", env_key: "JETS_MASTER_KEY")
404
+ ActiveSupport::EncryptedConfiguration.new(
405
+ config_path: Jets.root.join(path),
406
+ key_path: Jets.root.join(key_path),
407
+ env_key: env_key,
408
+ raise_if_missing_key: config.require_master_key
409
+ )
410
+ end
411
+
412
+ def to_app # :nodoc:
413
+ self
414
+ end
415
+
416
+ def helpers_paths # :nodoc:
417
+ config.helpers_paths
418
+ end
419
+
420
+ console do
421
+ unless ::Kernel.private_method_defined?(:y)
422
+ require "psych/y"
423
+ end
424
+ end
425
+
426
+ # Return an array of turbines respecting the order they're loaded
427
+ # and the order specified by the +turbines_order+ config.
428
+ #
429
+ # While running initializers we need engines in reverse order here when
430
+ # copying migrations from turbines ; we need them in the order given by
431
+ # +turbines_order+.
432
+ def migration_turbines # :nodoc:
433
+ ordered_turbines.flatten - [self]
434
+ end
435
+
436
+ # Eager loads the application code.
437
+ def eager_load!
438
+ Jets.autoloaders.each(&:eager_load)
439
+ end
440
+
441
+ # Added for Application::Configuration::Defaults
442
+ def aws
443
+ @aws ||= Jets::AwsInfo.new
444
+ end
445
+
446
+ protected
447
+ alias :build_middleware_stack :app
448
+
449
+ def run_tasks_blocks(app) # :nodoc:
450
+ turbines.each { |r| r.run_tasks_blocks(app) }
451
+ super
452
+ load "jets/tasks.rb"
453
+ task :environment do
454
+ ActiveSupport.on_load(:before_initialize) { config.eager_load = config.rake_eager_load }
455
+
456
+ require_environment!
457
+ end
458
+ end
459
+
460
+ def run_generators_blocks(app) # :nodoc:
461
+ turbines.each { |r| r.run_generators_blocks(app) }
462
+ super
463
+ end
464
+
465
+ def run_runner_blocks(app) # :nodoc:
466
+ turbines.each { |r| r.run_runner_blocks(app) }
467
+ super
468
+ end
469
+
470
+ def run_console_blocks(app) # :nodoc:
471
+ turbines.each { |r| r.run_console_blocks(app) }
472
+ super
473
+ end
474
+
475
+ def run_server_blocks(app) # :nodoc:
476
+ turbines.each { |r| r.run_server_blocks(app) }
477
+ super
478
+ end
479
+
480
+ # Returns the ordered turbines for this application considering turbines_order.
481
+ def ordered_turbines # :nodoc:
482
+ @ordered_turbines ||= begin
483
+ order = config.turbines_order.map do |turbine|
484
+ if turbine == :main_app
485
+ self
486
+ elsif turbine.respond_to?(:instance)
487
+ turbine.instance
488
+ else
489
+ turbine
490
+ end
491
+ end
492
+
493
+ all = (turbines - order)
494
+ all.push(self) unless (all + order).include?(self)
495
+ order.push(:all) unless order.include?(:all)
496
+
497
+ index = order.index(:all)
498
+ order[index] = all
499
+ order
500
+ end
501
+ end
502
+
503
+ def turbines_initializers(current) # :nodoc:
504
+ initializers = []
505
+ ordered_turbines.reverse.flatten.each do |t|
506
+ if t == self
507
+ initializers += current
508
+ else
509
+ initializers += t.initializers
510
+ end
511
+ end
512
+ initializers
513
+ end
514
+
515
+ def default_middleware_stack # :nodoc:
516
+ default_stack = DefaultMiddlewareStack.new(self, config, paths)
517
+ default_stack.build_stack
518
+ end
519
+
520
+ def validate_secret_key_base(secret_key_base)
521
+ if secret_key_base.is_a?(String) && secret_key_base.present?
522
+ secret_key_base
523
+ elsif secret_key_base
524
+ raise ArgumentError, "`secret_key_base` for #{Jets.env} environment must be a type of String`"
525
+ else
526
+ raise ArgumentError, "Missing `secret_key_base` for '#{Jets.env}' environment, set this string with `bin/jets credentials:edit`"
527
+ end
528
+ end
529
+
530
+ private
531
+ def generate_development_secret
532
+ if secrets.secret_key_base.nil?
533
+ # key_file = Jets.root.join("tmp/development_secret.txt")
534
+ key_file = Pathname.new("/tmp/jets/#{Jets.project_name}/development_secret.txt")
535
+
536
+ if !File.exist?(key_file)
537
+ random_key = SecureRandom.hex(64)
538
+ FileUtils.mkdir_p(key_file.dirname)
539
+ File.binwrite(key_file, random_key)
540
+ end
541
+
542
+ secrets.secret_key_base = File.binread(key_file)
543
+ end
544
+
545
+ secrets.secret_key_base
546
+ end
547
+
548
+ def build_middleware
549
+ config.app_middleware + super
550
+ end
551
+
552
+ def coerce_same_site_protection(protection)
553
+ protection.respond_to?(:call) ? protection : proc { protection }
554
+ end
555
+ end
239
556
  end