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
@@ -0,0 +1,90 @@
1
+ module Jets::Controller::Decorate
2
+ module Logging
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ # A little bit tricky. Jets::Controller::Base includes AbstractController::Logger
7
+ # via ActionController::Redirecting.
8
+ # AbstractController::Logger defines a config_accessor :logger
9
+ # This results in logger being nil. We set it to logger here to correct it.
10
+ # Unsure why this does not happen with ActionController::Base though.
11
+ delegate :logger, to: Jets # fixes logger but Rails doesnt need this
12
+ end
13
+
14
+ def dispatch!
15
+ t1 = Time.now
16
+ log_start
17
+ triplet = super # Abstract#dispatch!
18
+ took = Time.now - t1
19
+ log_finish status: status, took: took
20
+ triplet
21
+ end
22
+
23
+ def processing_log
24
+ processing = "Processing #{self.class.name}##{@meth}"
25
+ processing << " (original method #{@original_meth})" if @original_meth
26
+ processing
27
+ end
28
+
29
+ # Documented interface method, careful not to rename
30
+ def log_start
31
+ # Commented out Started because Jets::Rack::Logger middleware handles now
32
+ # ip = request.ip
33
+ # logger.info "Started (Jets) #{request.request_method} \"#{request.path}\" for #{ip} at #{Time.now}"
34
+
35
+ logger.info processing_log
36
+ logger.info " Raw Event: #{@event}" if ENV['JETS_LOG_RAW_EVENT']
37
+ logger.info " Event: #{event_log}" if log_event?
38
+ params = filtered_parameters.to_h.except('controller', 'action')
39
+ # JSON.dump makes logging look pretty in CloudWatch logs because it keeps it on 1 line
40
+ logger.info " Parameters: #{JSON.dump(params)}" unless params.empty?
41
+ end
42
+
43
+ def log_event?
44
+ return false if ENV['JETS_LOG_EVENT'] == '0'
45
+ Jets.config.logging.event
46
+ end
47
+
48
+ # Documented interface method, careful not to rename
49
+ def log_finish(options={})
50
+ status, took = options[:status], options[:took]
51
+ logger.info "Completed Status Code #{status} in #{"%.3f" % took}s"
52
+ end
53
+
54
+ def event_log
55
+ event = @event.dup # clone to display event
56
+
57
+ if event['isBase64Encoded']
58
+ event['body'] = '[BASE64_ENCODED]'
59
+ else
60
+ event['body'] = filter_json_log(event['body'])
61
+ end
62
+
63
+ event["multiValueQueryStringParameters"] = parameter_filter.filter(event['multiValueQueryStringParameters']) if event['multiValueQueryStringParameters']
64
+ event["pathParameters"] = parameter_filter.filter(event['pathParameters']) if event['pathParameters']
65
+ event["queryStringParameters"] = parameter_filter.filter(event['queryStringParameters']) if event['queryStringParameters']
66
+ json_dump_log(event)
67
+ end
68
+
69
+ # Append _log to reduce chance of name collision with user defined methods
70
+ def filter_json_log(json_text)
71
+ return json_text if json_text.blank?
72
+
73
+ begin
74
+ hash_params = JSON.parse(json_text)
75
+ filtered_params = parameter_filter.filter(hash_params)
76
+ JSON.dump(filtered_params)
77
+ rescue JSON::ParserError
78
+ '[FILTERED]'
79
+ end
80
+ end
81
+
82
+ # Handles binary data safely
83
+ def json_dump_log(data)
84
+ JSON.dump(data)
85
+ rescue Encoding::UndefinedConversionError
86
+ data['body'] = '[BINARY]'
87
+ JSON.dump(data)
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,16 @@
1
+ module Jets::Controller::Decorate
2
+ module Redirecting
3
+ include ApigwStage
4
+
5
+ def _compute_redirect_to_location(request, options) # :nodoc:
6
+ adjust = options.respond_to?(:to_str) || options.is_a?(String)
7
+ options = add_apigw_stage(options) if adjust
8
+ super
9
+ end
10
+
11
+ def redirect_back(fallback_location: '/')
12
+ location = request.headers["Referer"] || fallback_location
13
+ redirect_to location
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,10 @@
1
+ module Jets::Controller::Decorate
2
+ module UrlFor
3
+ include ApigwStage
4
+
5
+ def url_for(options = nil)
6
+ url = super
7
+ add_apigw_stage(url)
8
+ end
9
+ end
10
+ end
@@ -1,31 +1,49 @@
1
1
  require 'base64'
2
2
 
3
- module Jets::Controller::Rack
4
- class Adapter
3
+ # Also, logic in the opposite direction: Jets::Controller::Middleware::Mimic::Apigw
4
+ # Only called by AWS Lambda before it runs through the middlewares.
5
+ module Jets::Controller::Handler
6
+ class Apigw
5
7
  extend Memoist
6
8
 
7
- # Returns back API Gateway response hash structure
8
- def self.process(event, context)
9
- adapter = new(event, context)
10
- adapter.process
11
- end
12
-
13
- def initialize(event, context)
14
- @event, @context = event, context
9
+ attr_reader :event, :context, :controller, :meth, :rack_env
10
+ def initialize(event, context, controller, meth, rack_env)
11
+ @event = event
12
+ @context = context
13
+ @controller = controller
14
+ @meth = meth
15
+ @rack_env = rack_env
15
16
  end
16
17
 
17
18
  # 1. Convert API Gateway event event to Rack env
18
19
  # 2. Process using full Rack middleware stack
19
20
  # 3. Convert back to API gateway response structure payload
20
- def process
21
- status, headers, body = Jets.application.call(env)
22
- convert_to_api_gateway(status, headers, body)
23
- end
24
-
25
- def env
26
- Env.new(@event, @context, adapter: true).convert # convert to Rack env
21
+ #
22
+ # Returns back API Gateway response hash structure
23
+ # Only called when running in AWS Lambda.
24
+ #
25
+ # Set the jets.* env variables so we have access to them in the middleware.
26
+ # The controller instance is called in the Main middleware.
27
+ # On AWS, will use original event and context.
28
+ # On local server, will use Middleware::Mimic event and context.
29
+ def process_through_middlewares
30
+ env = rack_env.merge(
31
+ 'jets.controller' => @controller, # original controller instance from handler
32
+ 'jets.context' => @context, # original AWS Lambda context
33
+ 'jets.event' => @event, # original AWS Lambda event
34
+ 'jets.meth' => @meth,
35
+ )
36
+ status, headers, body = Jets.application.call(env) # goes through full middleware stack
37
+ # middleware can handle Array or BodyProxy, APIGW require Strings
38
+ case body
39
+ when Rack::Files::Iterator
40
+ str = File.read(body.path)
41
+ else
42
+ # join for Rack::BodyProxy or Array
43
+ str = body.join
44
+ end
45
+ convert_to_api_gateway(status, headers, str)
27
46
  end
28
- memoize :env
29
47
 
30
48
  # Transform the structure to AWS_PROXY compatible structure
31
49
  # http://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-output-format
@@ -71,24 +89,5 @@ module Jets::Controller::Rack
71
89
  # Can set JETS_ELB=1 for local testing
72
90
  @event["requestContext"] && @event["requestContext"]["elb"] || ENV['JETS_ELB']
73
91
  end
74
-
75
- # Called from Jets::Controller::Base.process. Example:
76
- #
77
- # adapter.rack_vars(
78
- # 'jets.controller' => self,
79
- # 'lambda.context' => context,
80
- # 'lambda.event' => event,
81
- # 'lambda.meth' => meth,
82
- # )
83
- #
84
- # Passes a these special variables so we have access to them in the middleware.
85
- # The controller instance is called in the Main middleware.
86
- # The lambda.* info is used by the Rack::Local middleware to create a mimiced
87
- # controller for the local server.
88
- #
89
- def rack_vars(vars)
90
- env.merge!(vars)
91
- end
92
-
93
92
  end
94
93
  end
@@ -0,0 +1,41 @@
1
+ module Jets::Controller
2
+ # Only called by AWS Lambda before it runs through the middlewares.
3
+ module Handler
4
+ extend ActiveSupport::Concern
5
+
6
+ # One key difference between process! vs dispatch!
7
+ #
8
+ # process! - takes the request through the middleware stack
9
+ # dispatch! - does not
10
+ #
11
+ # Generally, we want to use process! so it goes through the middleware stacks.
12
+ #
13
+ # The last middleware stack is Jets::Controller::Middleware::Main
14
+ # Which comes back to dispatch! in this same Controller Base class.
15
+ #
16
+ # class Jets::Controller::Middleware::Main
17
+ # def call!
18
+ # setup
19
+ # @controller.dispatch! # Returns triplet
20
+ # end
21
+ # end
22
+ #
23
+ def process!
24
+ apigw = Jets::Controller::Handler::Apigw.new(event, context, self, @meth, @rack_env)
25
+ apigw.process_through_middlewares # Returns API Gateway hash structure
26
+ end
27
+
28
+ class_methods do
29
+ def process(event, context={}, meth)
30
+ rack_env = Jets::Controller::RackAdapter::Env.new(event, context).convert # convert to Rack env
31
+ controller = new(event, context, meth, rack_env)
32
+ # Using send because process! was a private method in Jets::RackController (old) so
33
+ # it doesnt create a lambda function. It's doesnt matter what scope process!
34
+ # is in Controller::Base because Jets lambda functions inheritance doesnt
35
+ # include methods in Controller::Base.
36
+ controller.send(:process!)
37
+ end
38
+ end
39
+ end
40
+ end
41
+
@@ -1,6 +1,6 @@
1
1
  # All roads lead here
2
2
  #
3
- # 1. AWS Lambda: PostsController - Rack::Adapter - Jets.application.call
3
+ # 1. AWS Lambda: PostsController - Handler::Apigw - Jets.application.call
4
4
  # 2. Local server: config.ru - run Jet.application - Jets.application.call
5
5
  #
6
6
  # Then eventually:
@@ -9,22 +9,30 @@
9
9
  #
10
10
  module Jets::Controller::Middleware
11
11
  class Main
12
+ include Jets::ExceptionReporting
13
+
12
14
  def initialize(env)
13
15
  @env = env
14
- @controller = env['jets.controller']
15
- @event = env['lambda.event']
16
- @context = env['lambda.context']
17
- @meth = env['lambda.meth']
16
+ @controller = env['jets.controller'] # original controller instance from handler or mimic
17
+ @context = env['jets.context'] # original AWS Lambda event or mimic context
18
+ @event = env['jets.event'] # original AWS Lambda event or mimic event
19
+ @meth = env['jets.meth']
18
20
  end
19
21
 
20
22
  def call
21
- ENV['JETS_HOST'] = jets_host # Dirty to use what's essentially a global variable but unsure how else to achieve
22
23
  dup.call!
23
24
  end
24
25
 
26
+ # With exception reporting here instead of Controller::Base#process so any
27
+ # exception in the middleware stack is caught.
28
+ # Also using with_exception_reporting instead of
29
+ # prepend Jets::ExceptionReporting::Process because the method is call!
30
+ # not process. The interface is different.
25
31
  def call!
26
- setup
27
- @controller.dispatch! # Returns triplet
32
+ with_exception_reporting do
33
+ setup
34
+ @controller.dispatch! # Returns triplet
35
+ end
28
36
  end
29
37
 
30
38
  # Common setup logical at this point of middleware processing right before
@@ -1,17 +1,38 @@
1
1
  # Takes a Rack env and converts to ApiGateway event
2
- class Jets::Controller::Middleware::Local
3
- class ApiGateway
2
+ # This runs only locally, when not on AWS Lambda
3
+ # Note: Logic in the opposite direction: Jets::Controller::Handler::Apigw#rack_vars
4
+ class Jets::Controller::Middleware::Mimic
5
+ class Apigw
4
6
  extend Memoist
5
7
 
6
8
  def initialize(route, env)
7
9
  @route, @env = route, env
8
10
  end
9
11
 
12
+ # Actual controller instance
13
+ def controller
14
+ controller_class = @route.controller_name.constantize
15
+ meth = @route.action_name
16
+ # must keep the same env as @env, rack env, else constraint lambda proc request will be different
17
+ controller_class.new(event, context, meth, @env)
18
+ end
19
+ memoize :controller # for same object_id in case apigw.controller is called twice
20
+
21
+ def meth
22
+ @route.action_name
23
+ end
24
+ memoize :meth
25
+
26
+ def context
27
+ LambdaContext.new
28
+ end
29
+ memoize :context
30
+
10
31
  def event
11
- resource = @route.path(:api_gateway) # posts/{id}/edit
32
+ resource = @route.path(:api_gateway) # /posts/{id}/edit
12
33
  path = @env['PATH_INFO'].sub('/','') # remove beginning slash
13
34
  {
14
- "resource" => "/#{resource}", # "/posts/{id}/edit"
35
+ "resource" => resource, # "/posts/{id}/edit"
15
36
  "path" => @env['PATH_INFO'], # /posts/tung/edit
16
37
  "httpMethod" => @env['REQUEST_METHOD'], # GET
17
38
  "headers" => request_headers,
@@ -25,7 +46,9 @@ class Jets::Controller::Middleware::Local
25
46
  }
26
47
  end
27
48
  memoize :event
49
+ alias convert event
28
50
 
51
+ protected
29
52
  # Annoying. The headers part of the AWS Lambda proxy structure
30
53
  # does not consisently use the same casing scheme for the header keys.
31
54
  # Sometimes it looks like this:
@@ -78,19 +101,21 @@ class Jets::Controller::Middleware::Local
78
101
  end
79
102
 
80
103
  def query_string_parameters
81
- @env['QUERY_STRING']&.split('&')&.each_with_object({}) do |parameter, hash|
82
- key, value = parameter.split('=')
83
- hash[key] = value
84
- end || {}
104
+ Rack::Utils.parse_nested_query(@env['QUERY_STRING'])
105
+ # @env['QUERY_STRING']&.split('&')&.each_with_object({}) do |parameter, hash|
106
+ # key, value = parameter.split('=')
107
+ # hash[key] = value
108
+ # end || {}
85
109
  end
110
+ alias multi_value_query_string_parameters query_string_parameters
86
111
 
87
- def multi_value_query_string_parameters
88
- @env['QUERY_STRING']&.split('&')&.each_with_object({}) do |parameter, hash|
89
- key, value = parameter.split('=')
90
- hash[key] = [] if hash[key].nil?
91
- hash[key] << value
92
- end || {}
93
- end
112
+ # def multi_value_query_string_parameters
113
+ # @env['QUERY_STRING']&.split('&')&.each_with_object({}) do |parameter, hash|
114
+ # key, value = parameter.split('=')
115
+ # hash[key] = [] if hash[key].nil?
116
+ # hash[key] << value
117
+ # end || {}
118
+ # end
94
119
 
95
120
  # To get the post body:
96
121
  # rack.input: #<StringIO:0x007f8ccf8db9a0>
@@ -0,0 +1,44 @@
1
+ class Jets::Controller::Middleware::Mimic
2
+ # This class uses method_missing to mimic for all possible future methods
3
+ # that AWS Lambda might add to the context object.
4
+ #
5
+ # The current methods available on the Lambda Context object:
6
+ # aws_request_id, invoked_function_arn, log_group_name,
7
+ # log_stream_name, function_name, memory_limit_in_mb, function_version,
8
+ # identity, client_context, deadline_ms
9
+ #
10
+ # Locally, example mimic values:
11
+ #
12
+ # context.aws_request_id "mimic lambda context: aws_request_id"
13
+ # context.invoked_function_arn "mimic lambda context: invoked_function_arn"
14
+ # context.log_group_name "mimic lambda context: log_group_name"
15
+ # context.log_stream_name "mimic lambda context: log_stream_name"
16
+ # context.function_name "mimic lambda context: function_name"
17
+ # context.memory_limit_in_mb "mimic lambda context: memory_limit_in_mb"
18
+ # context.function_version "mimic lambda context: function_version"
19
+ # context.identity "mimic lambda context: identity"
20
+ # context.client_context "mimic lambda context: client_context"
21
+ # context.deadline_ms "mimic lambda context: deadline_ms"
22
+ #
23
+ # On AWS, example real values:
24
+ #
25
+ # context.aws_request_id "b8357b1d-15f2-4197-9c6b-d6873be5eaba"
26
+ # context.invoked_function_arn "arn:aws:lambda:us-west-2:112233445566:function:demo-dev-controller"
27
+ # context.log_group_name "/aws/lambda/demo-dev-controller"
28
+ # context.log_stream_name "2023/09/10/[$LATEST]18323c481c674665b25496c329daa382"
29
+ # context.function_name "demo-dev-controller"
30
+ # context.memory_limit_in_mb "1536"
31
+ # context.function_version "$LATEST"
32
+ # context.identity nil
33
+ # context.client_context nil
34
+ # context.deadline_ms 1694353587386
35
+ #
36
+ class LambdaContext
37
+ def initialize(*)
38
+ end
39
+
40
+ def method_missing(method_name, *args)
41
+ "mimic lambda context: #{method_name}"
42
+ end
43
+ end
44
+ end
@@ -1,8 +1,9 @@
1
1
  require 'kramdown'
2
2
 
3
3
  # Handles mimicing of API Gateway to Lambda function call locally
4
+ # Logic in the opposite direction: Jets::Controller::Handler::Apigw#rack_vars
4
5
  module Jets::Controller::Middleware
5
- class Local
6
+ class Mimic
6
7
  extend Memoist
7
8
 
8
9
  def initialize(app)
@@ -10,21 +11,30 @@ module Jets::Controller::Middleware
10
11
  end
11
12
 
12
13
  def call(env)
13
- route = RouteMatcher.new(env).find_route
14
- unless route
15
- return [404, {'Content-Type' => 'text/html'}, not_found(env)]
16
- end
14
+ matcher = Jets::Router::Matcher.new
15
+ route = matcher.find_by_env(env) # simpler version does not check constraints
16
+ return not_found(env) unless route
17
+
18
+ # Make instance available so we dont not have to pass it around.
19
+ # Also important to assign to instance variables so values are memoized in variables
20
+ # So the mimic logic work because @env.merge! does not happened
21
+ # until end. We do not want apigw.controller to create a new controller instance
22
+ # with a different object_id
23
+ apigw = Apigw.new(route, env) # takes rack env and converts to API Gateway event structure
24
+ @controller = apigw.controller
25
+ @meth = apigw.meth
26
+ @event = apigw.event
27
+ @context = apigw.context
17
28
 
18
- mimic = MimicAwsCall.new(route, env)
19
- # Make @controller and @meth instance available so we dont not have to pass it around.
20
- @controller, @meth, @event = mimic.controller, mimic.meth, mimic.event
29
+ route = matcher.find_by_request(@controller.request) # need request object to check constraints
30
+ return not_found(env) unless route
21
31
 
22
32
  if route.to == 'jets/rack#process' # megamode
23
33
  # Bypass the Jets middlewares since it could interfere with the Rack
24
34
  # application's middleware stack.
25
35
  #
26
- # Rails sends back a transfer-encoding=chunked. Curling Rails directly works,
27
- # but passing the Rails response back through this middleware results in errors.
36
+ # Jets sends back a transfer-encoding=chunked. Curling Jets directly works,
37
+ # but passing the Jets response back through this middleware results in errors.
28
38
  # Disable chunking responses by deleting the transfer-encoding response header.
29
39
  # Would like to understand why this happens this better, if someone can explain please let me know.
30
40
  status, headers, body = @controller.dispatch! # jets/rack_controller
@@ -36,21 +46,30 @@ module Jets::Controller::Middleware
36
46
  elsif polymorphic_function?
37
47
  run_polymophic_function
38
48
  else # Normal Jets request
39
- mimic_aws_lambda!(env, mimic.vars) unless on_aws?(env)
40
- @app.call(env)
49
+ unless on_aws?(env)
50
+ # Only set these variables when running locally and not on AWS.
51
+ # On AWS, these are set by the Jets::Controller::Handler::Apigw#rack_vars
52
+ env.merge!(
53
+ 'jets.controller' => @controller, # mimic controller instance
54
+ 'jets.context' => @context, # mimic context
55
+ 'jets.event' => @event, # mimic event
56
+ 'jets.meth' => @meth,
57
+ )
58
+ end
59
+ @app.call(env) # goes to all middleware all the way to Jets::Controller::Middleware::Main
41
60
  end
42
61
  end
43
62
 
44
63
  # Never hit when calling polymorphic function on AWS Lambda. Can only get called with the local server.
45
64
  def polymorphic_function?
46
65
  return false if ENV['_HANDLER'] # slight speed improvement on Lambda
47
- polymorphic_function.task.lang != :ruby
66
+ polymorphic_function.definition.lang != :ruby
48
67
  end
49
68
 
50
69
  def polymorphic_function
51
- # Abusing PolyFun to run polymorphic code, should call LambdaExecutor directly
70
+ # Abusing Poly to run polymorphic code, should call LambdaExecutor directly
52
71
  # after reworking LambdaExecutor so it has a better interface.
53
- Jets::PolyFun.new(@controller.class, @meth)
72
+ Jets::Poly.new(@controller.class, @meth)
54
73
  end
55
74
  memoize :polymorphic_function
56
75
 
@@ -62,13 +81,8 @@ module Jets::Controller::Middleware
62
81
  [status, headers, body] # triplet
63
82
  end
64
83
 
65
- # Modifies env the in the same way real call from AWS lambda would modify env
66
- def mimic_aws_lambda!(env, vars)
67
- env.merge!(vars)
68
- env
69
- end
70
-
71
84
  def on_aws?(env)
85
+ return true if ENV['ON_AWS']
72
86
  return false if Jets.env.test? # usually with test we're passing in full API Gateway fixtures with the HTTP_X_AMZN_TRACE_ID
73
87
  return false if ENV['JETS_ELB'] # If we're using an ELB and Jets is inside a container running jets server, we don't want to pretend we're on AWS.
74
88
  on_cloud9 = !!(env['HTTP_HOST'] =~ /cloud9\..*\.amazonaws\.com/)
@@ -85,36 +99,7 @@ module Jets::Controller::Middleware
85
99
  end
86
100
 
87
101
  def not_found(env)
88
- message = routes_error_message(env)
89
- body = <<~HTML
90
- <!DOCTYPE html>
91
- <html>
92
- <head>
93
- <meta charset="utf-8">
94
- <title>Route not found</title>
95
- </head>
96
- <body>
97
- #{message}
98
- </body>
99
- </html>
100
- HTML
101
- StringIO.new(body)
102
- end
103
-
104
- # Show pretty route table for user to help with debugging in non-production mode
105
- def routes_table
106
- routes = Jets::Router.routes
107
-
108
- return "Your routes table is empty." if routes.empty?
109
-
110
- text = "Verb | Path | Controller#action\n"
111
- text << "--- | --- | ---\n"
112
- routes.each do |route|
113
- text << "#{route.method} | #{route.path} | #{route.to}\n"
114
- end
115
- html = Kramdown::Document.new(text).to_html
116
- puts html
117
- html
102
+ raise Jets::Controller::RoutingError, "No route matches #{env['PATH_INFO'].inspect}"
118
103
  end
119
104
  end
120
105
  end
@@ -0,0 +1,35 @@
1
+ module Jets::Controller::RackAdapter
2
+ module Action
3
+ extend ActiveSupport::Concern
4
+
5
+ class_methods do
6
+ def action(name)
7
+ lambda do |env|
8
+ route = find_first_route_for_action(name)
9
+ env['PATH_INFO'] = route_path(route)
10
+ controller = new({}, {}, name, env)
11
+ controller.dispatch! # does not go through middleware stack
12
+ end
13
+ end
14
+
15
+ # Find first route to be used for PATH_INFO.
16
+ # This allows engine_delegate to work properly.
17
+ def find_first_route_for_action(name)
18
+ Jets::Router.routes.find do |r|
19
+ route_controller_path, route_action_name = r.to.split('#')
20
+ route_controller_path == controller_path && route_action_name == name.to_s
21
+ end
22
+ end
23
+
24
+ def route_path(route)
25
+ if route
26
+ path = route.path
27
+ path = "/#{path}" unless path.starts_with?('/')
28
+ else
29
+ path = "/#{controller_path}##{name} (action proc)"
30
+ end
31
+ path
32
+ end
33
+ end
34
+ end
35
+ end