jets 4.0.10 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (618) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -1
  3. data/CHANGELOG.md +53 -0
  4. data/Gemfile +1 -5
  5. data/LICENSE.txt +1 -1
  6. data/README.md +20 -36
  7. data/Rakefile +3 -3
  8. data/engines/internal/app/controllers/jets/application_controller.rb +28 -0
  9. data/engines/internal/app/controllers/jets/bare_controller.rb +6 -0
  10. data/engines/internal/app/controllers/jets/health_controller.rb +55 -0
  11. data/engines/internal/app/controllers/jets/info_controller.rb +45 -0
  12. data/{lib/jets → engines}/internal/app/controllers/jets/mailers_controller.rb +12 -14
  13. data/{lib/jets → engines}/internal/app/controllers/jets/mount_controller.rb +6 -10
  14. data/{lib/jets → engines}/internal/app/controllers/jets/public_controller.rb +6 -2
  15. data/engines/internal/app/controllers/jets/welcome_controller.rb +9 -0
  16. data/{lib/jets → engines}/internal/app/functions/jets/base_path.rb +2 -1
  17. data/{lib/jets → engines}/internal/app/functions/jets/base_path_mapping.rb +26 -6
  18. data/engines/internal/app/jobs/jets/preheat_job.rb +67 -0
  19. data/engines/internal/app/views/jets/info/properties.html.erb +1 -0
  20. data/engines/internal/app/views/jets/info/routes.html.erb +10 -0
  21. data/{lib/jets → engines}/internal/app/views/jets/mailers/email.html.erb +37 -17
  22. data/engines/internal/app/views/jets/mailers/index.html.erb +8 -0
  23. data/engines/internal/app/views/jets/mailers/mailer.html.erb +6 -0
  24. data/{lib/jets/commands/templates/skeleton/public/index.html.tt → engines/internal/app/views/jets/welcome/index.html.erb} +8 -4
  25. data/engines/internal/app/views/layouts/application.html.erb +51 -0
  26. data/engines/internal/lib/internal/actiondispatch.rb +39 -0
  27. data/engines/internal/lib/internal/actionmailer.rb +51 -0
  28. data/engines/internal/lib/internal/actionview.rb +152 -0
  29. data/engines/internal/lib/internal/activerecord.rb +37 -0
  30. data/engines/internal/lib/internal/activesupport.rb +47 -0
  31. data/engines/internal/lib/internal/engine.rb +13 -0
  32. data/engines/internal/lib/internal/i18n_engine.rb +19 -0
  33. data/engines/internal/lib/internal/jets_controller.rb +46 -0
  34. data/engines/internal/lib/internal/overrides/debug_exceptions.rb +40 -0
  35. data/engines/internal/lib/internal/templates/rescues/_trace.html.erb +62 -0
  36. data/engines/internal/lib/internal/templates/rescues/_trace.text.erb +9 -0
  37. data/engines/internal/lib/internal/turbines/asset_tag_helper.rb +70 -0
  38. data/engines/internal/lib/internal/turbines/helpers.rb +18 -0
  39. data/engines/internal/lib/internal/turbines/routes_helpers.rb +42 -0
  40. data/exe/jets +1 -10
  41. data/jets.gemspec +14 -11
  42. data/lib/jets/app_loader.rb +77 -0
  43. data/lib/jets/application/bootstrap.rb +100 -0
  44. data/lib/jets/application/configuration/defaults.rb +256 -0
  45. data/lib/jets/application/configuration.rb +494 -0
  46. data/lib/jets/application/default_middleware_stack.rb +140 -0
  47. data/lib/jets/application/dummy_erb_compiler.rb +18 -0
  48. data/lib/jets/application/finisher.rb +266 -0
  49. data/lib/jets/application/routes_reloader.rb +80 -0
  50. data/lib/jets/application.rb +515 -198
  51. data/lib/jets/authorizer/base.rb +1 -0
  52. data/lib/jets/authorizer/dsl.rb +15 -11
  53. data/lib/jets/authorizer/helpers/iam_helper.rb +13 -11
  54. data/lib/jets/autoloaders/gem.rb +70 -0
  55. data/lib/jets/autoloaders/inflector.rb +21 -0
  56. data/lib/jets/autoloaders.rb +38 -101
  57. data/lib/jets/aws_services/stack_status.rb +1 -1
  58. data/lib/jets/backtrace_cleaner.rb +27 -0
  59. data/lib/jets/booter.rb +29 -176
  60. data/lib/jets/builders/code_builder.rb +45 -117
  61. data/lib/jets/builders/code_size.rb +1 -0
  62. data/lib/jets/builders/gem_replacer.rb +5 -6
  63. data/lib/jets/builders/handler_generator.rb +34 -14
  64. data/lib/jets/builders/lambda_layer.rb +2 -7
  65. data/lib/jets/builders/purger.rb +1 -1
  66. data/lib/jets/builders/rack_packager.rb +1 -1
  67. data/lib/jets/builders/ruby_packager.rb +17 -6
  68. data/lib/jets/builders/shim_vars/app.rb +10 -6
  69. data/lib/jets/builders/templates/handlers/one_lambda_for_all_controllers.rb +33 -0
  70. data/lib/jets/builders/templates/handlers/one_lambda_per_controller.rb +20 -0
  71. data/lib/jets/builders/templates/{handler.rb → handlers/one_lambda_per_method.rb} +6 -0
  72. data/lib/jets/bundle.rb +2 -9
  73. data/lib/jets/cfn/base.rb +82 -0
  74. data/lib/jets/cfn/builder/api/base.rb +12 -0
  75. data/lib/jets/cfn/{builders/api_deployment_builder.rb → builder/api/deployment.rb} +10 -20
  76. data/lib/jets/cfn/{builders/api_gateway_builder.rb → builder/api/gateway.rb} +14 -37
  77. data/lib/jets/cfn/builder/api/mapping.rb +54 -0
  78. data/lib/jets/cfn/builder/api/methods.rb +72 -0
  79. data/lib/jets/cfn/builder/api/paged.rb +30 -0
  80. data/lib/jets/cfn/builder/api/pages/base.rb +105 -0
  81. data/lib/jets/cfn/builder/api/pages/methods.rb +17 -0
  82. data/lib/jets/cfn/builder/api/pages/page.rb +19 -0
  83. data/lib/jets/cfn/builder/api/pages/resources.rb +21 -0
  84. data/lib/jets/cfn/builder/api/resources.rb +40 -0
  85. data/lib/jets/cfn/{builders/authorizer_builder.rb → builder/authorizer.rb} +16 -19
  86. data/lib/jets/cfn/builder/controller.rb +28 -0
  87. data/lib/jets/cfn/builder/function.rb +9 -0
  88. data/lib/jets/cfn/{builders → builder}/interface.rb +45 -51
  89. data/lib/jets/cfn/builder/job.rb +10 -0
  90. data/lib/jets/cfn/builder/nested.rb +130 -0
  91. data/lib/jets/cfn/builder/one_controller.rb +53 -0
  92. data/lib/jets/cfn/{builders/parent_builder → builder/parent}/stagger.rb +1 -1
  93. data/lib/jets/cfn/{builders/parent_builder.rb → builder/parent.rb} +54 -54
  94. data/lib/jets/cfn/builder/post_process.rb +25 -0
  95. data/lib/jets/cfn/{builders/rule_builder.rb → builder/rule.rb} +4 -8
  96. data/lib/jets/cfn/{builders/shared_builder.rb → builder/shared.rb} +4 -3
  97. data/lib/jets/cfn/{builders → builder}/util/source.rb +1 -1
  98. data/lib/jets/{commands/build.rb → cfn/builder.rb} +50 -78
  99. data/lib/jets/cfn/deployment.rb +45 -0
  100. data/lib/jets/cfn/download.rb +39 -0
  101. data/lib/jets/cfn/params/api/base.rb +39 -0
  102. data/lib/jets/cfn/params/api/cors.rb +10 -0
  103. data/lib/jets/cfn/params/api/methods.rb +69 -0
  104. data/lib/jets/cfn/params/api/resources.rb +28 -0
  105. data/lib/jets/{resource/child_stack/common_parameters.rb → cfn/params/common.rb} +3 -3
  106. data/lib/jets/{resource → cfn/resource}/api_gateway/authorizer.rb +21 -21
  107. data/lib/jets/cfn/resource/api_gateway/base_path/function.rb +57 -0
  108. data/lib/jets/{resource → cfn/resource}/api_gateway/base_path/mapping.rb +13 -12
  109. data/lib/jets/cfn/resource/api_gateway/base_path/role.rb +70 -0
  110. data/lib/jets/{resource → cfn/resource}/api_gateway/deployment.rb +13 -20
  111. data/lib/jets/{resource → cfn/resource}/api_gateway/domain_name.rb +11 -11
  112. data/lib/jets/{resource → cfn/resource}/api_gateway/method/authorization.rb +1 -1
  113. data/lib/jets/cfn/resource/api_gateway/method.rb +92 -0
  114. data/lib/jets/{resource → cfn/resource}/api_gateway/resource.rb +14 -10
  115. data/lib/jets/cfn/resource/api_gateway/resource_id.rb +25 -0
  116. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/change_detection.rb +1 -1
  117. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/logical_id/message.rb +1 -1
  118. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/logical_id.rb +1 -1
  119. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/base.rb +5 -3
  120. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/media_types.rb +2 -2
  121. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/page.rb +5 -5
  122. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/to.rb +8 -3
  123. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/variable.rb +2 -2
  124. data/lib/jets/cfn/resource/api_gateway/rest_api/routes/change.rb +27 -0
  125. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/collision/variable_exception.rb +1 -1
  126. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/collision.rb +1 -1
  127. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes.rb +1 -1
  128. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api.rb +12 -12
  129. data/lib/jets/{resource → cfn/resource}/associated.rb +1 -1
  130. data/lib/jets/{resource → cfn/resource}/config/config_rule.rb +18 -18
  131. data/lib/jets/{resource → cfn/resource}/config/managed_rule.rb +5 -5
  132. data/lib/jets/{resource → cfn/resource}/events/rule.rb +10 -10
  133. data/lib/jets/{resource → cfn/resource}/iam/application_role.rb +4 -4
  134. data/lib/jets/{resource → cfn/resource}/iam/base_role_definition.rb +15 -15
  135. data/lib/jets/{resource → cfn/resource}/iam/class_role.rb +5 -5
  136. data/lib/jets/{resource → cfn/resource}/iam/function_role.rb +6 -6
  137. data/lib/jets/{resource → cfn/resource}/iam/managed_policy.rb +1 -1
  138. data/lib/jets/{resource → cfn/resource}/iam/policy.rb +8 -8
  139. data/lib/jets/{resource → cfn/resource}/iam/policy_document.rb +10 -9
  140. data/lib/jets/{resource → cfn/resource}/iot/topic_rule.rb +10 -10
  141. data/lib/jets/{resource → cfn/resource}/lambda/event_source_mapping.rb +9 -9
  142. data/lib/jets/cfn/resource/lambda/function/controller.rb +21 -0
  143. data/lib/jets/{resource → cfn/resource}/lambda/function/environment.rb +4 -5
  144. data/lib/jets/cfn/resource/lambda/function.rb +266 -0
  145. data/lib/jets/{resource → cfn/resource}/lambda/gem_layer.rb +2 -2
  146. data/lib/jets/{resource → cfn/resource}/lambda/layer_version.rb +10 -10
  147. data/lib/jets/cfn/resource/lambda/permission.rb +51 -0
  148. data/lib/jets/cfn/resource/logs/subscription_filter.rb +31 -0
  149. data/lib/jets/cfn/resource/nested/api/base.rb +4 -0
  150. data/lib/jets/cfn/resource/nested/api/deployment.rb +53 -0
  151. data/lib/jets/cfn/resource/nested/api/gateway.rb +15 -0
  152. data/lib/jets/cfn/resource/nested/api/mapping.rb +33 -0
  153. data/lib/jets/cfn/resource/nested/api/methods.rb +30 -0
  154. data/lib/jets/cfn/resource/nested/api/page.rb +8 -0
  155. data/lib/jets/cfn/resource/nested/api/resources.rb +22 -0
  156. data/lib/jets/{resource/child_stack → cfn/resource/nested}/app_class.rb +15 -48
  157. data/lib/jets/{resource/child_stack → cfn/resource/nested}/authorizer.rb +8 -14
  158. data/lib/jets/cfn/resource/nested/base.rb +38 -0
  159. data/lib/jets/cfn/resource/nested/one_controller.rb +48 -0
  160. data/lib/jets/{resource/child_stack → cfn/resource/nested}/shared.rb +10 -16
  161. data/lib/jets/cfn/resource/one/function.rb +66 -0
  162. data/lib/jets/cfn/resource/one/permission.rb +17 -0
  163. data/lib/jets/{resource → cfn/resource}/replacer.rb +26 -27
  164. data/lib/jets/{resource → cfn/resource}/route53/record_set.rb +18 -18
  165. data/lib/jets/{resource → cfn/resource}/s3/bucket.rb +4 -4
  166. data/lib/jets/cfn/resource/s3/jets_bucket.rb +68 -0
  167. data/lib/jets/{resource → cfn/resource}/sns/subscription.rb +8 -8
  168. data/lib/jets/{resource → cfn/resource}/sns/topic.rb +10 -10
  169. data/lib/jets/{resource → cfn/resource}/sns/topic_policy.rb +13 -13
  170. data/lib/jets/{resource → cfn/resource}/sqs/queue.rb +5 -5
  171. data/lib/jets/{resource → cfn/resource}/standardizer.rb +8 -9
  172. data/lib/jets/cfn/resource.rb +8 -0
  173. data/lib/jets/cfn/ship.rb +20 -19
  174. data/lib/jets/cfn/template.rb +89 -0
  175. data/lib/jets/cfn/upload.rb +26 -23
  176. data/lib/jets/cli.rb +28 -210
  177. data/lib/jets/command/actions.rb +49 -0
  178. data/lib/jets/command/api_helpers.rb +41 -0
  179. data/lib/jets/command/aws_helpers.rb +26 -0
  180. data/lib/jets/command/base.rb +204 -0
  181. data/lib/jets/command/behavior.rb +83 -0
  182. data/lib/jets/command/environment_argument.rb +42 -0
  183. data/lib/jets/command/help/call.md +48 -0
  184. data/lib/jets/{commands → command}/help/deploy.md +1 -1
  185. data/lib/jets/command/help/logs.md +21 -0
  186. data/lib/jets/{commands → command}/help/new.md +3 -4
  187. data/lib/jets/command/help/projects.md +6 -0
  188. data/lib/jets/command/help/releases.md +37 -0
  189. data/lib/jets/command/help/rollback.md +5 -0
  190. data/lib/jets/command/help/routes.md +15 -0
  191. data/lib/jets/command/help/stacks.md +6 -0
  192. data/lib/jets/command/help.rb +17 -0
  193. data/lib/jets/command/helpers/editor.rb +35 -0
  194. data/lib/jets/command.rb +133 -0
  195. data/lib/jets/commands/application/application_command.rb +40 -0
  196. data/lib/jets/commands/build/build_command.rb +33 -0
  197. data/lib/jets/commands/call/anonymous_guesser.rb +1 -1
  198. data/lib/jets/commands/call/autoload_guesser.rb +2 -2
  199. data/lib/jets/commands/call/base_guesser.rb +4 -4
  200. data/lib/jets/commands/call/call_command.rb +27 -0
  201. data/lib/jets/commands/call/caller.rb +184 -0
  202. data/lib/jets/commands/call/guesser.rb +1 -1
  203. data/lib/jets/commands/clean/base.rb +1 -1
  204. data/lib/jets/commands/clean/build.rb +1 -1
  205. data/lib/jets/commands/clean/clean_command.rb +15 -0
  206. data/lib/jets/commands/clean/log.rb +1 -1
  207. data/lib/jets/commands/configure/configure_command.rb +9 -0
  208. data/lib/jets/commands/console/console_command.rb +38 -0
  209. data/lib/jets/commands/credentials/USAGE +103 -0
  210. data/lib/jets/commands/credentials/credentials_command/diffing.rb +51 -0
  211. data/lib/jets/commands/credentials/credentials_command.rb +139 -0
  212. data/lib/jets/commands/db/system/change/change_command.rb +24 -0
  213. data/lib/jets/commands/dbconsole/dbconsole_command.rb +184 -0
  214. data/lib/jets/commands/degenerate/degenerate_command.rb +21 -0
  215. data/lib/jets/commands/delete/delete_command.rb +155 -0
  216. data/lib/jets/commands/{deploy.rb → deploy/deploy_command.rb} +28 -47
  217. data/lib/jets/commands/dev/dev_command.rb +19 -0
  218. data/lib/jets/commands/{dotenv.rb → dotenv/dotenv_command.rb} +2 -2
  219. data/lib/jets/commands/encrypted/USAGE +46 -0
  220. data/lib/jets/commands/encrypted/encrypted_command.rb +87 -0
  221. data/lib/jets/commands/gems/gems_command.rb +14 -0
  222. data/lib/jets/commands/generate/generate_command.rb +95 -0
  223. data/lib/jets/commands/help/USAGE +20 -0
  224. data/lib/jets/commands/help/help_command.rb +15 -0
  225. data/lib/jets/commands/initializers/initializers_command.rb +19 -0
  226. data/lib/jets/commands/logs/logs_command.rb +45 -0
  227. data/lib/jets/commands/new/new_command.rb +19 -0
  228. data/lib/jets/commands/notes/notes_command.rb +30 -0
  229. data/lib/jets/commands/plugin/plugin_command.rb +45 -0
  230. data/lib/jets/commands/projects/projects_command.rb +30 -0
  231. data/lib/jets/commands/rake/rake_command.rb +59 -0
  232. data/lib/jets/commands/releases/releases_command.rb +72 -0
  233. data/lib/jets/commands/rollback/rollback_command.rb +41 -0
  234. data/lib/jets/commands/routes/routes_command.rb +19 -0
  235. data/lib/jets/commands/runner/runner_command.rb +60 -0
  236. data/lib/jets/commands/server/server_command.rb +291 -0
  237. data/lib/jets/commands/stacks/stacks_command.rb +39 -0
  238. data/lib/jets/commands/status/status_command.rb +9 -0
  239. data/lib/jets/commands/{url.rb → url/url_command.rb} +37 -14
  240. data/lib/jets/commands/version/version_command.rb +11 -0
  241. data/lib/jets/commands.rb +17 -0
  242. data/lib/jets/configuration.rb +166 -0
  243. data/lib/jets/controller/base.rb +105 -183
  244. data/lib/jets/controller/compat/abstract_controller/base.rb +126 -0
  245. data/lib/jets/controller/compat/action_controller/metal.rb +99 -0
  246. data/lib/jets/controller/compat/caching.rb +13 -0
  247. data/lib/jets/controller/compat/future.rb +13 -0
  248. data/lib/jets/controller/compat/route_set.rb +47 -0
  249. data/lib/jets/controller/decorate/apigw_stage.rb +39 -0
  250. data/lib/jets/controller/{authorization.rb → decorate/authorization.rb} +1 -1
  251. data/lib/jets/controller/decorate/logging.rb +90 -0
  252. data/lib/jets/controller/decorate/redirecting.rb +16 -0
  253. data/lib/jets/controller/decorate/url_for.rb +10 -0
  254. data/lib/jets/controller/{rack/adapter.rb → handler/apigw.rb} +36 -37
  255. data/lib/jets/controller/handler.rb +41 -0
  256. data/lib/jets/controller/middleware/main.rb +16 -8
  257. data/lib/jets/controller/middleware/{local/api_gateway.rb → mimic/apigw.rb} +40 -15
  258. data/lib/jets/controller/middleware/mimic/lambda_context.rb +44 -0
  259. data/lib/jets/controller/middleware/{local.rb → mimic.rb} +36 -51
  260. data/lib/jets/controller/rack_adapter/action.rb +35 -0
  261. data/lib/jets/controller/{rack → rack_adapter}/env.rb +39 -24
  262. data/lib/jets/controller/request/compat/params.rb +144 -0
  263. data/lib/jets/controller/request/compat/request.rb +125 -0
  264. data/lib/jets/controller/request.rb +35 -18
  265. data/lib/jets/controller/response/compat/response.rb +67 -0
  266. data/lib/jets/controller/response.rb +91 -8
  267. data/lib/jets/core.rb +142 -51
  268. data/lib/jets/core_ext/kernel.rb +2 -2
  269. data/lib/jets/core_ext/symbol.rb +5 -0
  270. data/lib/jets/core_ext.rb +4 -0
  271. data/lib/jets/dev_caching.rb +44 -0
  272. data/lib/jets/dotenv/ssm.rb +5 -2
  273. data/lib/jets/dotenv.rb +2 -1
  274. data/lib/jets/engine/configuration.rb +96 -0
  275. data/lib/jets/engine/turbines.rb +23 -0
  276. data/lib/jets/engine.rb +380 -0
  277. data/lib/jets/exception_reporting.rb +43 -0
  278. data/lib/jets/generators/job/job_generator.rb +41 -0
  279. data/lib/jets/generators/job/templates/event_types/dynamodb.rb.tt +8 -0
  280. data/lib/jets/generators/job/templates/event_types/iot.rb.tt +8 -0
  281. data/lib/jets/generators/job/templates/event_types/kinesis.rb.tt +9 -0
  282. data/lib/jets/generators/job/templates/event_types/log.rb.tt +9 -0
  283. data/lib/jets/generators/job/templates/event_types/rule.rb.tt +23 -0
  284. data/lib/jets/generators/job/templates/event_types/s3.rb.tt +11 -0
  285. data/lib/jets/{generator/templates/active_job/job/templates/job.rb.tt → generators/job/templates/event_types/scheduled.rb.tt} +3 -3
  286. data/lib/jets/generators/job/templates/event_types/sns.rb.tt +9 -0
  287. data/lib/jets/generators/job/templates/event_types/sqs.rb.tt +9 -0
  288. data/lib/jets/generators/overrides/app/USAGE +38 -0
  289. data/lib/jets/generators/overrides/app/app_generator.rb +148 -0
  290. data/lib/jets/generators/overrides/app/helpers.rb +139 -0
  291. data/lib/jets/generators/overrides/app/templates/.env +10 -0
  292. data/lib/jets/{commands/templates/skeleton/.gitignore → generators/overrides/app/templates/.gitignore.tt} +2 -1
  293. data/lib/jets/generators/overrides/app/templates/Gemfile.tt +25 -0
  294. data/lib/jets/generators/overrides/app/templates/Rakefile +2 -0
  295. data/lib/jets/generators/overrides/app/templates/app/assets/config/manifest.js +3 -0
  296. data/lib/jets/generators/overrides/app/templates/app/assets/stylesheets/application.css +15 -0
  297. data/lib/jets/generators/overrides/app/templates/app/javascript/application.js +5 -0
  298. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/models/application_record.rb +1 -1
  299. data/lib/jets/generators/overrides/app/templates/app/views/layouts/application.html.erb.tt +30 -0
  300. data/lib/jets/generators/overrides/app/templates/bin/jets +3 -0
  301. data/lib/jets/generators/overrides/app/templates/config/application.rb.tt +15 -0
  302. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/config/database.yml.tt +1 -1
  303. data/lib/jets/generators/overrides/app/templates/config/environments/development.rb.tt +29 -0
  304. data/lib/jets/generators/overrides/app/templates/config/environments/production.rb.tt +19 -0
  305. data/lib/jets/generators/overrides/app/templates/config/environments/test.rb.tt +23 -0
  306. data/lib/jets/generators/overrides/app/templates/config/initializers/content_security_policy.rb +31 -0
  307. data/lib/jets/generators/overrides/app/templates/config/initializers/filter_parameter_logging.rb +8 -0
  308. data/lib/jets/generators/overrides/app/templates/config/initializers/permissions_policy.rb +11 -0
  309. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/config/routes.rb +5 -1
  310. data/lib/jets/generators/overrides/app/templates/db/.gitkeep +0 -0
  311. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/404.html +6 -6
  312. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/422.html +6 -6
  313. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/500.html +6 -6
  314. data/lib/jets/generators/overrides/templates/erb/scaffold/index.html.erb +22 -0
  315. data/lib/jets/generators/overrides/templates/erb/scaffold/partial.html.erb +8 -0
  316. data/lib/jets/{generator/templates/rails/scaffold_controller/api_controller.rb → generators/overrides/templates/rails/scaffold_controller/api_controller.rb.tt} +5 -9
  317. data/lib/jets/generators/overrides/templates/rails/scaffold_controller/controller.rb.tt +67 -0
  318. data/lib/jets/generators.rb +112 -0
  319. data/lib/jets/info.rb +116 -0
  320. data/lib/jets/initializable.rb +95 -0
  321. data/lib/jets/job/base.rb +3 -2
  322. data/lib/jets/job/dsl/dynamodb_event.rb +19 -9
  323. data/lib/jets/job/dsl/event_source_mapping.rb +1 -1
  324. data/lib/jets/job/dsl/iot_event.rb +6 -6
  325. data/lib/jets/job/dsl/kinesis_event.rb +5 -5
  326. data/lib/jets/job/dsl/log_event.rb +2 -2
  327. data/lib/jets/job/dsl/rule_event.rb +7 -4
  328. data/lib/jets/job/dsl/s3_event.rb +1 -1
  329. data/lib/jets/job/dsl/sns_event.rb +6 -6
  330. data/lib/jets/job/dsl/sqs_event.rb +11 -11
  331. data/lib/jets/klass.rb +5 -6
  332. data/lib/jets/lambda/definition.rb +118 -0
  333. data/lib/jets/lambda/dsl/warnings.rb +57 -0
  334. data/lib/jets/lambda/dsl.rb +64 -53
  335. data/lib/jets/lambda/function.rb +3 -3
  336. data/lib/jets/lambda/function_constructor.rb +6 -6
  337. data/lib/jets/lambda/functions.rb +36 -1
  338. data/lib/jets/mega/request/source.rb +1 -2
  339. data/lib/jets/mega/request.rb +4 -4
  340. data/lib/jets/names.rb +31 -15
  341. data/lib/jets/overrides/dummy/rails.rb +11 -0
  342. data/lib/jets/overrides/lambda/marshaller.rb +10 -0
  343. data/lib/jets/overrides/puma.rb +10 -0
  344. data/lib/jets/paths.rb +243 -0
  345. data/lib/jets/{poly_fun → poly}/base_executor.rb +13 -13
  346. data/lib/jets/{poly_fun → poly}/lambda_executor.rb +2 -2
  347. data/lib/jets/{poly_fun → poly}/node_error.rb +1 -1
  348. data/lib/jets/{poly_fun → poly}/node_executor.rb +4 -4
  349. data/lib/jets/{poly_fun → poly}/python_error.rb +1 -1
  350. data/lib/jets/{poly_fun → poly}/python_executor.rb +2 -2
  351. data/lib/jets/{poly_fun.rb → poly.rb} +12 -12
  352. data/lib/jets/preheat.rb +12 -25
  353. data/lib/jets/processors/deducer.rb +2 -2
  354. data/lib/jets/processors/main_processor.rb +6 -13
  355. data/lib/jets/rack/logger.rb +77 -0
  356. data/lib/jets/router/compat/route_set.rb +177 -0
  357. data/lib/jets/router/dsl/mount.rb +40 -6
  358. data/lib/jets/router/dsl.rb +125 -105
  359. data/lib/jets/router/engine_mount.rb +36 -0
  360. data/lib/jets/router/help.rb +130 -0
  361. data/lib/jets/router/helpers/named_routes/add_full_url.rb +13 -0
  362. data/lib/jets/router/helpers/named_routes/generated.rb +197 -0
  363. data/lib/jets/router/helpers/named_routes/proxy.rb +66 -0
  364. data/lib/jets/router/matcher.rb +140 -17
  365. data/lib/jets/router/resources/options.rb +6 -4
  366. data/lib/jets/router/route/after_initialize.rb +64 -0
  367. data/lib/jets/router/route/as.rb +93 -0
  368. data/lib/jets/router/route/authorizer.rb +1 -0
  369. data/lib/jets/router/route/compat.rb +45 -0
  370. data/lib/jets/router/route/info.rb +74 -0
  371. data/lib/jets/router/route/node.rb +137 -0
  372. data/lib/jets/router/route/path.rb +93 -0
  373. data/lib/jets/router/route.rb +109 -106
  374. data/lib/jets/router/route_set.rb +214 -0
  375. data/lib/jets/router/scope.rb +204 -69
  376. data/lib/jets/router/state.rb +36 -16
  377. data/lib/jets/router/util.rb +1 -31
  378. data/lib/jets/router.rb +64 -162
  379. data/lib/jets/ruby_version_check.rb +15 -0
  380. data/lib/jets/rule/base.rb +1 -0
  381. data/lib/jets/rule/dsl.rb +7 -7
  382. data/lib/jets/secrets.rb +110 -0
  383. data/lib/jets/spec_helpers/controllers/request.rb +22 -16
  384. data/lib/jets/spec_helpers/controllers.rb +32 -24
  385. data/lib/jets/spec_helpers.rb +0 -6
  386. data/lib/jets/stack/builder.rb +3 -2
  387. data/lib/jets/stack/definition.rb +1 -4
  388. data/lib/jets/stack/function.rb +2 -2
  389. data/lib/jets/stack/main/dsl/cloudwatch.rb +4 -4
  390. data/lib/jets/stack/main/dsl/kinesis.rb +2 -2
  391. data/lib/jets/stack/main/dsl/lambda.rb +26 -20
  392. data/lib/jets/stack/main/dsl/sqs.rb +2 -2
  393. data/lib/jets/stack/output/lookup.rb +1 -1
  394. data/lib/jets/stack/output.rb +2 -2
  395. data/lib/jets/stack/parameter.rb +2 -2
  396. data/lib/jets/stack/resource.rb +3 -3
  397. data/lib/jets/stack/s3_event.rb +51 -37
  398. data/lib/jets/stack.rb +1 -1
  399. data/lib/jets/tasks/engine.rake +85 -0
  400. data/lib/jets/tasks/framework.rake +66 -0
  401. data/lib/jets/tasks/log.rake +41 -0
  402. data/lib/jets/tasks/middleware.rake +9 -0
  403. data/lib/jets/tasks/misc.rake +81 -0
  404. data/lib/jets/tasks/statistics.rake +37 -0
  405. data/lib/jets/tasks/tmp.rake +51 -0
  406. data/lib/jets/tasks/yarn.rake +29 -0
  407. data/lib/jets/tasks/zeitwerk.rake +61 -0
  408. data/lib/jets/tasks.rb +18 -0
  409. data/lib/jets/turbine/configurable.rb +36 -0
  410. data/lib/jets/turbine/configuration.rb +101 -0
  411. data/lib/jets/turbine.rb +164 -20
  412. data/lib/jets/util/camelize.rb +24 -0
  413. data/lib/jets/version.rb +1 -1
  414. data/lib/jets.rb +7 -15
  415. metadata +427 -336
  416. data/bin/release +0 -9
  417. data/lib/jets/application/defaults.rb +0 -230
  418. data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +0 -16
  419. data/lib/jets/builders/reconfigure_rails.rb +0 -114
  420. data/lib/jets/cfn/builders/api_resources_builder.rb +0 -44
  421. data/lib/jets/cfn/builders/base_child_builder.rb +0 -88
  422. data/lib/jets/cfn/builders/controller_builder.rb +0 -50
  423. data/lib/jets/cfn/builders/function_builder.rb +0 -14
  424. data/lib/jets/cfn/builders/job_builder.rb +0 -14
  425. data/lib/jets/cfn/builders/page_builder.rb +0 -80
  426. data/lib/jets/cfn/built_template.rb +0 -15
  427. data/lib/jets/cfn/template_source.rb +0 -61
  428. data/lib/jets/commands/base.rb +0 -145
  429. data/lib/jets/commands/call.rb +0 -184
  430. data/lib/jets/commands/clean.rb +0 -19
  431. data/lib/jets/commands/configure.rb +0 -51
  432. data/lib/jets/commands/console.rb +0 -18
  433. data/lib/jets/commands/db/environment-task.rake +0 -3
  434. data/lib/jets/commands/db/tasks/dummy/app.rb +0 -25
  435. data/lib/jets/commands/db/tasks/dummy/config.rb +0 -14
  436. data/lib/jets/commands/db/tasks.rb +0 -34
  437. data/lib/jets/commands/db.rb +0 -13
  438. data/lib/jets/commands/dbconsole.rb +0 -134
  439. data/lib/jets/commands/delete.rb +0 -136
  440. data/lib/jets/commands/dynamodb/migrate.rb +0 -9
  441. data/lib/jets/commands/dynamodb/migrator.rb +0 -36
  442. data/lib/jets/commands/dynamodb.rb +0 -19
  443. data/lib/jets/commands/gems.rb +0 -13
  444. data/lib/jets/commands/help/call.md +0 -69
  445. data/lib/jets/commands/help/dynamodb/generate.md +0 -52
  446. data/lib/jets/commands/help/dynamodb/migrate.md +0 -4
  447. data/lib/jets/commands/help/routes.md +0 -16
  448. data/lib/jets/commands/help.rb +0 -9
  449. data/lib/jets/commands/import/base.rb +0 -49
  450. data/lib/jets/commands/import/cheatsheet.rb +0 -35
  451. data/lib/jets/commands/import/rack.rb +0 -16
  452. data/lib/jets/commands/import/rails.rb +0 -74
  453. data/lib/jets/commands/import/sequence.rb +0 -90
  454. data/lib/jets/commands/import/templates/config/database.yml +0 -30
  455. data/lib/jets/commands/import/templates/submodules-cheatsheet.md +0 -89
  456. data/lib/jets/commands/import.rb +0 -12
  457. data/lib/jets/commands/main.rb +0 -169
  458. data/lib/jets/commands/markdown/creator.rb +0 -58
  459. data/lib/jets/commands/markdown/index.rb +0 -27
  460. data/lib/jets/commands/markdown/page.rb +0 -125
  461. data/lib/jets/commands/markdown/shell.rb +0 -11
  462. data/lib/jets/commands/new.rb +0 -173
  463. data/lib/jets/commands/rake_command.rb +0 -61
  464. data/lib/jets/commands/rake_tasks.rb +0 -50
  465. data/lib/jets/commands/runner.rb +0 -16
  466. data/lib/jets/commands/sequence.rb +0 -104
  467. data/lib/jets/commands/stack_info.rb +0 -30
  468. data/lib/jets/commands/templates/skeleton/.env.development.tt +0 -3
  469. data/lib/jets/commands/templates/skeleton/.env.test +0 -3
  470. data/lib/jets/commands/templates/skeleton/.env.tt +0 -3
  471. data/lib/jets/commands/templates/skeleton/.jetskeep +0 -1
  472. data/lib/jets/commands/templates/skeleton/Gemfile.tt +0 -40
  473. data/lib/jets/commands/templates/skeleton/Procfile +0 -7
  474. data/lib/jets/commands/templates/skeleton/Rakefile +0 -2
  475. data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +0 -2
  476. data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +0 -26
  477. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +0 -72
  478. data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +0 -22
  479. data/lib/jets/commands/templates/skeleton/config/environments/development.rb +0 -7
  480. data/lib/jets/commands/templates/skeleton/config/environments/production.rb +0 -9
  481. data/lib/jets/commands/templates/skeleton/config/environments/test.rb +0 -7
  482. data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +0 -23
  483. data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +0 -24
  484. data/lib/jets/commands/upgrade/templates/bin/webpack +0 -19
  485. data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +0 -19
  486. data/lib/jets/commands/upgrade/version1.rb +0 -136
  487. data/lib/jets/commands/upgrade.rb +0 -105
  488. data/lib/jets/commands/webpacker_template.rb +0 -18
  489. data/lib/jets/controller/callbacks.rb +0 -73
  490. data/lib/jets/controller/cookies/jar.rb +0 -269
  491. data/lib/jets/controller/cookies.rb +0 -38
  492. data/lib/jets/controller/error/invalid_authenticity_token.rb +0 -6
  493. data/lib/jets/controller/error.rb +0 -4
  494. data/lib/jets/controller/forgery_protection.rb +0 -43
  495. data/lib/jets/controller/layout.rb +0 -17
  496. data/lib/jets/controller/middleware/cors.rb +0 -60
  497. data/lib/jets/controller/middleware/local/mimic_aws_call.rb +0 -38
  498. data/lib/jets/controller/middleware/local/route_matcher.rb +0 -22
  499. data/lib/jets/controller/middleware/reloader.rb +0 -15
  500. data/lib/jets/controller/parameters_filter.rb +0 -29
  501. data/lib/jets/controller/params.rb +0 -117
  502. data/lib/jets/controller/redirection.rb +0 -61
  503. data/lib/jets/controller/rendering/rack_renderer.rb +0 -267
  504. data/lib/jets/controller/rendering.rb +0 -96
  505. data/lib/jets/controller/stage.rb +0 -34
  506. data/lib/jets/controller.rb +0 -3
  507. data/lib/jets/db.rb +0 -15
  508. data/lib/jets/generator/templates/erb/controller/view.html.erb +0 -2
  509. data/lib/jets/generator/templates/erb/scaffold/index.html.erb +0 -29
  510. data/lib/jets/generator/templates/rails/controller/controller.rb +0 -13
  511. data/lib/jets/generator/templates/rails/helper/helper.rb +0 -4
  512. data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +0 -67
  513. data/lib/jets/generator.rb +0 -112
  514. data/lib/jets/internal/app/controllers/jets/bare_controller.rb +0 -16
  515. data/lib/jets/internal/app/controllers/jets/rack_controller.rb +0 -12
  516. data/lib/jets/internal/app/helpers/jets/mailers_helper.rb +0 -9
  517. data/lib/jets/internal/app/jobs/jets/preheat_job.rb +0 -57
  518. data/lib/jets/internal/app/views/jets/mailers/index.html.erb +0 -8
  519. data/lib/jets/internal/app/views/jets/mailers/mailer.html.erb +0 -6
  520. data/lib/jets/internal/turbines/jets/mailer.rb +0 -52
  521. data/lib/jets/lambda/task.rb +0 -111
  522. data/lib/jets/logger.rb +0 -21
  523. data/lib/jets/middleware/configurator.rb +0 -84
  524. data/lib/jets/middleware/default_stack.rb +0 -53
  525. data/lib/jets/middleware/layer.rb +0 -34
  526. data/lib/jets/middleware/stack.rb +0 -77
  527. data/lib/jets/middleware.rb +0 -33
  528. data/lib/jets/overrides/rails/action_controller.rb +0 -13
  529. data/lib/jets/overrides/rails/asset_tag_helper.rb +0 -114
  530. data/lib/jets/overrides/rails/common_methods.rb +0 -13
  531. data/lib/jets/overrides/rails/migration_checker.rb +0 -34
  532. data/lib/jets/overrides/rails/rendering_helper.rb +0 -27
  533. data/lib/jets/overrides/rails/url_helper.rb +0 -88
  534. data/lib/jets/overrides/rails.rb +0 -6
  535. data/lib/jets/rack_server.rb +0 -86
  536. data/lib/jets/resource/api_gateway/base_path/function.rb +0 -49
  537. data/lib/jets/resource/api_gateway/base_path/role.rb +0 -76
  538. data/lib/jets/resource/api_gateway/cors.rb +0 -61
  539. data/lib/jets/resource/api_gateway/method.rb +0 -102
  540. data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +0 -16
  541. data/lib/jets/resource/base.rb +0 -28
  542. data/lib/jets/resource/child_stack/api_deployment.rb +0 -58
  543. data/lib/jets/resource/child_stack/api_gateway.rb +0 -23
  544. data/lib/jets/resource/child_stack/api_resource/page.rb +0 -20
  545. data/lib/jets/resource/child_stack/api_resource.rb +0 -54
  546. data/lib/jets/resource/child_stack/base.rb +0 -24
  547. data/lib/jets/resource/lambda/function.rb +0 -221
  548. data/lib/jets/resource/logs/subscription_filter.rb +0 -31
  549. data/lib/jets/resource/permission.rb +0 -45
  550. data/lib/jets/resource.rb +0 -71
  551. data/lib/jets/router/error.rb +0 -4
  552. data/lib/jets/router/finder.rb +0 -47
  553. data/lib/jets/router/helpers/core_helper.rb +0 -27
  554. data/lib/jets/router/helpers/named_routes_helper.rb +0 -8
  555. data/lib/jets/router/helpers.rb +0 -4
  556. data/lib/jets/router/method_creator/code.rb +0 -99
  557. data/lib/jets/router/method_creator/edit.rb +0 -12
  558. data/lib/jets/router/method_creator/generic.rb +0 -11
  559. data/lib/jets/router/method_creator/index.rb +0 -48
  560. data/lib/jets/router/method_creator/new.rb +0 -12
  561. data/lib/jets/router/method_creator/root.rb +0 -15
  562. data/lib/jets/router/method_creator/show.rb +0 -12
  563. data/lib/jets/router/method_creator.rb +0 -50
  564. data/lib/jets/turbo/database_yaml.rb +0 -41
  565. data/lib/jets/turbo/project/.gitignore +0 -12
  566. data/lib/jets/turbo/project/.jetskeep +0 -1
  567. data/lib/jets/turbo/project/Gemfile +0 -16
  568. data/lib/jets/turbo/project/Rakefile +0 -2
  569. data/lib/jets/turbo/project/app/controllers/application_controller.rb +0 -2
  570. data/lib/jets/turbo/project/app/helpers/application_helper.rb +0 -2
  571. data/lib/jets/turbo/project/app/jobs/application_job.rb +0 -4
  572. data/lib/jets/turbo/project/config/application.rb +0 -5
  573. data/lib/jets/turbo/project/config/routes.rb +0 -4
  574. data/lib/jets/turbo/project/config.ru +0 -5
  575. data/lib/jets/turbo/rails.rb +0 -127
  576. data/lib/jets/turbo/templates/config/database.yml +0 -30
  577. data/lib/jets/turbo.rb +0 -56
  578. data/readme/prerelease.md +0 -6
  579. data/readme/testing.md +0 -60
  580. /data/{lib/jets → engines}/internal/app/shared/functions/jets/s3_bucket_config.rb +0 -0
  581. /data/lib/jets/{commands → command}/help/build.md +0 -0
  582. /data/lib/jets/{commands → command}/help/clean/build.md +0 -0
  583. /data/lib/jets/{commands → command}/help/clean/log.md +0 -0
  584. /data/lib/jets/{commands → command}/help/console.md +0 -0
  585. /data/lib/jets/{commands → command}/help/db/generate.md +0 -0
  586. /data/lib/jets/{commands → command}/help/dbconsole.md +0 -0
  587. /data/lib/jets/{commands → command}/help/degenerate.md +0 -0
  588. /data/lib/jets/{commands → command}/help/delete.md +0 -0
  589. /data/lib/jets/{commands → command}/help/gems/check.md +0 -0
  590. /data/lib/jets/{commands → command}/help/generate.md +0 -0
  591. /data/lib/jets/{commands → command}/help/import/rack.md +0 -0
  592. /data/lib/jets/{commands → command}/help/import/rails.md +0 -0
  593. /data/lib/jets/{commands → command}/help/runner.md +0 -0
  594. /data/lib/jets/{commands → command}/help/server.md +0 -0
  595. /data/lib/jets/{commands → command}/help/status.md +0 -0
  596. /data/lib/jets/{commands → command}/help/upgrade.md +0 -0
  597. /data/lib/jets/{commands → command}/help/url.md +0 -0
  598. /data/lib/jets/{generator/templates/active_job → generators}/job/templates/application_job.rb.tt +0 -0
  599. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/.rspec +0 -0
  600. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/README.md +0 -0
  601. /data/{.gitmodules → lib/jets/generators/overrides/app/templates/app/assets/images/.keep} +0 -0
  602. /data/lib/jets/{commands/templates/skeleton/db/.gitkeep → generators/overrides/app/templates/app/assets/javascripts/.keep} +0 -0
  603. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/controllers/application_controller.rb +0 -0
  604. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/helpers/application_helper.rb +0 -0
  605. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/jobs/application_job.rb +0 -0
  606. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/config.ru +0 -0
  607. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/favicon.ico +0 -0
  608. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/controllers/posts_controller_spec.rb +0 -0
  609. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/fixtures/payloads/posts-index.json +0 -0
  610. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/fixtures/payloads/posts-show.json +0 -0
  611. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/spec_helper.rb.tt +0 -0
  612. /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/_form.html.erb +0 -0
  613. /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/edit.html.erb +0 -0
  614. /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/new.html.erb +0 -0
  615. /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/show.html.erb +0 -0
  616. /data/lib/jets/{generator → generators/overrides}/templates/rails/assets/javascript.js +0 -0
  617. /data/lib/jets/{generator → generators/overrides}/templates/rails/assets/stylesheet.css +0 -0
  618. /data/lib/jets/{generator → generators/overrides}/templates/rails/scaffold/scaffold.css +0 -0
@@ -0,0 +1,45 @@
1
+ class Jets::Router::Route
2
+ # Work in progress. Considering making Jets Route more compatiable with Rails Route.
3
+ # Then will be able to leverage Rails RouteWrapper for presenting the routes for /jets/info/routes.
4
+ # Ran into Route#path method that is a bit of work to make compatiable.
5
+ # Leaving this here for the future.
6
+ module Compat
7
+ extend Memoist
8
+
9
+ # Interface based on Rails ActionDispatch::Routing::Endpoint
10
+ class App # :nodoc:
11
+ def initialize(route)
12
+ @route = route
13
+ end
14
+
15
+ def dispatcher?; false; end
16
+ def redirect?; false; end
17
+ def matches?(req); true; end
18
+ def app; self; end
19
+ def rack_app; app; end
20
+
21
+ def engine?
22
+ @route.engine?
23
+ end
24
+ end
25
+
26
+ def app
27
+ App.new(self)
28
+ end
29
+ memoize :app
30
+
31
+ # Rails interface method for ActionDispatch::Routing::RouteWrapper
32
+ def name
33
+ as || ''
34
+ end
35
+
36
+ # Rails interface method for ActionDispatch::Routing::RouteWrapper
37
+ def verb
38
+ http_method
39
+ end
40
+
41
+ def internal
42
+ !!@options[:internal]
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,74 @@
1
+ class Jets::Router::Route
2
+ # Organize to.controller and to.action into a class
3
+ # so don't have to keep repeating the logic.
4
+ class Info
5
+ def initialize(options, scope)
6
+ @options, @scope = options, scope
7
+ end
8
+
9
+ # IE: posts
10
+ def controller
11
+ return if @options[:engine] # IE: { engine: Blorgh::Engine, path: "/blog" }
12
+
13
+ controller = if @options[:controller]
14
+ @options[:controller]
15
+ elsif @options[:to]
16
+ @options[:to].split('#').first # IE: posts#index => posts
17
+ elsif @scope.virtual_controller
18
+ @scope.virtual_controller
19
+ else # {"/jets/info/properties"=>"jets/info#properties"}
20
+ map = @options.find { |k,v| k.is_a?(String) }
21
+ path, to = map[0], map[1]
22
+ to.split('#').first
23
+ end
24
+
25
+ if controller.starts_with?('/')
26
+ # absolute controller path specified. use without scope adjustments
27
+ return controller.delete_prefix('/') # remove leading slash
28
+ end
29
+
30
+ # no controller found yet, imply from the scope
31
+ segments = scoped_module_segments
32
+ segments << controller if controller
33
+ segments.compact.join('/') # add module
34
+ end
35
+
36
+ # IE: index
37
+ def action
38
+ if @options.key?(:action)
39
+ @options[:action].to_s
40
+ elsif is_collection?(@scope) || is_member?(@scope)
41
+ @options[:path].to_s.delete_prefix('/') # action
42
+ elsif @options[:on] && @options[:on] != :member && @options[:on] != :collection
43
+ @options[:on].to_s
44
+ elsif @options[:to]
45
+ @options[:to].split('#').last
46
+ else # {"/"=>"jets/welcome#index", :internal=>true}
47
+ map = @options.find { |k,v| k.is_a?(String) }
48
+ path, to = map[0], map[1]
49
+ to.split('#').last
50
+ end
51
+ end
52
+
53
+ def scoped_module_segments
54
+ segments = []
55
+ @scope.from_top.each do |scope|
56
+ segments << scope.module if scope.module
57
+ if @scope == scope # last scope node
58
+ last_segment = @options[:module]
59
+ segments << last_segment if last_segment
60
+ end
61
+ end
62
+ segments
63
+ end
64
+
65
+ def is_collection?(scope)
66
+ scope.from == :collection || @options[:on] == :collection
67
+ end
68
+
69
+ def is_member?(scope)
70
+ scope.from == :member || @options[:on] == :member
71
+ end
72
+ end
73
+ end
74
+
@@ -0,0 +1,137 @@
1
+ class Jets::Router::Route
2
+ # The Node class groups logic that requires both of route and scope info.
3
+ # It does not really belong in either the Route or Scope class and
4
+ # requires both to do its job. So it gets its own class.
5
+ # This seems to help keep the Route and Scope classes simpler.
6
+ #
7
+ # An instance of this class is made available with each
8
+ # iteration of loop that processes the DSL scopes.
9
+ class Node
10
+ attr_reader :route, :scope, :leaf_scope
11
+ def initialize(route, scope)
12
+ @route, @scope = route, scope # scope is current scope of iteration
13
+ @info = route.info
14
+ @options = route.options
15
+ @leaf_scope = @route.scope # the route scope is the leaf scope
16
+ end
17
+
18
+ def append_path?
19
+ has_path? && add_path_segment?
20
+ end
21
+
22
+ def append_param?
23
+ has_param? && add_path_segment?
24
+ end
25
+
26
+ def append_as?
27
+ has_path? && add_path_segment? ||
28
+ scope.from.nil? && scope.as
29
+ end
30
+
31
+ # Accounts for shallow scope. Example:
32
+ #
33
+ # resources :posts, shallow: true do
34
+ # resources :comments do
35
+ # resources :likes
36
+ # end
37
+ # end
38
+ #
39
+ # add_path_segment? = add_path_segment_considering_shallow?
40
+ #
41
+ def add_path_segment?
42
+ if param_action? && shallow_param_action?
43
+ leaf? # only add path segments for leaf
44
+ elsif paramless_action? && shallow_paramless_action?
45
+ leaf? || leaf_scope.real_parent?(scope)
46
+ else
47
+ true # default is to always path preceding path segments
48
+ end
49
+ end
50
+
51
+ def shallow_param_action?
52
+ lookahead_shallow? || leaf_scope.any_parent_shallow?
53
+ end
54
+
55
+ def shallow_paramless_action?
56
+ lookahead_shallow?(parent: true) || scope.any_parent_shallow?
57
+ end
58
+
59
+ def lookahead_shallow?(parent: false)
60
+ next_scope = scope
61
+ while next_scope
62
+ check_scope = parent ? next_scope.parent : next_scope
63
+ # Important to check next_scope == leaf_scope
64
+ # Otherwise it'll collapse path segments for higher scopes also.
65
+ return true if check_scope.shallow? && next_scope == leaf_scope
66
+ next_scope = next_scope.next
67
+ end
68
+ false
69
+ end
70
+
71
+ def has_path?
72
+ scope.resolved_path && !scope.virtual?
73
+ end
74
+
75
+ def has_param?
76
+ return false if scope.root?
77
+
78
+ resolved_param && param_action? ||
79
+ scope.resource_descendent? && !leaf? ||
80
+ scope.resource_sibling? && !leaf?
81
+ end
82
+
83
+ def resolved_as
84
+ as = scope.as || scope.resource_name
85
+ # as = scope.as || scope.resource_name
86
+ if scope.resource_name
87
+ controller = nil # dont need controller. can infer from resources, namespace, etc
88
+ else # direct route method without scope or module only etc
89
+ controller = @info.controller.split('/').last if leaf? #&& as.nil?
90
+ end
91
+ [as, controller].compact.join('_')
92
+ end
93
+
94
+ def param_action?
95
+ @options[:on] == :member || scope.from == :member ||
96
+ %w[edit show update destroy].include?(@info.action)
97
+ end
98
+
99
+ def paramless_action?
100
+ @options[:on] == :collection || scope.from == :collection ||
101
+ %w[index new create].include?(@info.action)
102
+ end
103
+
104
+ def leaf?
105
+ scope == leaf_scope
106
+ end
107
+
108
+ def resolved_path
109
+ scope.resolved_path
110
+ end
111
+
112
+ def resolved_param
113
+ case scope.from
114
+ when :resources, :member
115
+ ":#{param}"
116
+ else # :resource, :namespace, :path, :collection
117
+ nil
118
+ end
119
+ end
120
+
121
+ # If a block has pass then we assume the resources will be nested and then prefix
122
+ # the param name with the resource. IE: post_id instead of id
123
+ # This avoids an API Gateway parent sibling variable collision.
124
+ def param
125
+ return scope.options[:param] if scope.options[:param]
126
+
127
+ if leaf? && Jets.config.routes.allow_sibling_conflicts
128
+ "id"
129
+ elsif scope.resource_descendent? ||
130
+ scope.resource_sibling? && scope.colliding_resource_sibling?
131
+ "#{scope.resource_name.to_s.singularize}_id"
132
+ else
133
+ "id"
134
+ end
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,93 @@
1
+ class Jets::Router::Route
2
+ module Path
3
+ # Note: The @options[:path] is missing prefix and is not support via direct create_route.
4
+ # This is because it can be added directly to the path. IE:
5
+ #
6
+ # get "myprefix/posts", to: "posts#index"
7
+ #
8
+ # Also, this helps to keep the method creator logic simpler.
9
+ #
10
+ def path(format=:jets)
11
+ segments = path_prefixes + [path_option]
12
+ segments = add_path_suffix(segments)
13
+ path = segments.reject(&:blank?).join('/')
14
+ format_path(format, path)
15
+ end
16
+
17
+ # When scope used directly. IE: not coming from namespace or resources
18
+ # When coming from namespace or resources, the path is already accounted for.
19
+ def path_prefixes
20
+ list = []
21
+ @scope.from_top.each do |scope|
22
+ node = Node.new(self, scope)
23
+ # Update @path_names as we walk down
24
+ @path_names.merge!(scope.options[:path_names] || {})
25
+
26
+ list << scope.resolved_path if node.append_path?
27
+ list << node.resolved_param if node.append_param?
28
+ end
29
+ list.reject!(&:blank?) # allows for path: '' to remove resource name from path
30
+ list
31
+ end
32
+
33
+ def path_option
34
+ node = Node.new(self, @scope)
35
+ path = @options[:path].to_s.delete_prefix('/') # IE: new or edit
36
+ path.sub!(@scope.param_placeholder, ":#{node.resolved_param}")
37
+ path
38
+ end
39
+
40
+ # Accounts for path names options map. Example:
41
+ #
42
+ # {path_names: {new: "sign_up", edit: "edit"}}
43
+ #
44
+ # new posts/new => posts/sign_up
45
+ # edit posts/:id/edit => posts/:id/edit
46
+ #
47
+ def add_path_suffix(all_segments)
48
+ # rip apart last path as segments
49
+ # work with and modify segments to be returned
50
+ segments = all_segments.last.to_s.split('/')
51
+ current_suffix = segments.last
52
+
53
+ new_or_edit = %w[new edit].include?(current_suffix)
54
+ additional_action = @options[:on].is_a?(Symbol) && @options[:on] != :member && @options[:on] != :collection
55
+ will_replace = new_or_edit || additional_action
56
+
57
+ if will_replace
58
+ segments_without_last = all_segments[0..-2]
59
+ # reassemble path with additional on action
60
+ segments_without_last << @options[:on].to_s if additional_action
61
+ # reassemble with new suffix from path_names map
62
+ new_suffix = @path_names[current_suffix.to_sym] || current_suffix
63
+ segments_without_last << new_suffix
64
+ new_last = segments_without_last.join('/')
65
+ segments[-1] = new_last # replace
66
+ segments
67
+ else
68
+ all_segments # original
69
+ end
70
+ end
71
+
72
+ def path_suffixes
73
+ list = []
74
+ list << action_suffix if action_suffix
75
+ list
76
+ end
77
+
78
+ # IE: standard: posts/:id/edit
79
+ # api_gateway: posts/{id}/edit
80
+ def format_path(format, path)
81
+ path = case format
82
+ when :api_gateway
83
+ api_gateway_format(path)
84
+ when :raw
85
+ path
86
+ else # jets format
87
+ ensure_jets_format(path)
88
+ end
89
+ path = "/#{path}" unless path.starts_with?('/') # ensure starts with / be forgiving if / accidentally not included
90
+ path
91
+ end
92
+ end
93
+ end
@@ -1,114 +1,58 @@
1
1
  # route = Jets::Router::Route.new(
2
2
  # path: "posts",
3
- # method: :get,
3
+ # http_method: :get,
4
4
  # to: "posts#index",
5
5
  # )
6
- class Jets::Router
6
+ module Jets::Router
7
7
  class Route
8
- include Util
8
+ extend Memoist
9
+ include Compat
10
+ include AfterInitialize
11
+ include As
9
12
  include Authorizer
13
+ include Path
14
+ include Util
10
15
 
11
16
  CAPTURE_REGEX = "([^/]*)" # as string
12
17
 
13
- attr_reader :to, :as
18
+ attr_reader :options, :scope, :info, :defaults
19
+ attr_accessor :original_engine
14
20
  def initialize(options, scope=Scope.new)
15
- @options, @scope = options, scope
16
- @path = compute_path
17
- @to = compute_to
18
- @as = compute_as
19
- # Pretty tricky. The @options[:mount_class] is a class that is mounted.
20
- # For Grape apps, calling ActiveSupport to_json on a Grape class causes an infinite loop.
21
- # Can reproduce with `GrapeApp.to_json`
22
- # There's some type of collision between Grape and ActiveSupport to_json.
23
- # Coerce mount_class option into a string so that when the route is serialized to JSON
24
- # it is a string it won't cause an infinite loop. This allows the apigw routes to be
25
- # saved to s3 and loaded back up at the end of a deploy.
26
- # Related PR: smarter apigw routes paging calculation #635
27
- # https://github.com/boltops-tools/jets/pull/635
28
- # Debugging notes: https://gist.github.com/tongueroo/c9baa7e98d5ad68bbdd770fde4651963
29
- @options[:mount_class] = @options[:mount_class].to_s if @options[:mount_class]
30
- end
31
-
32
- # Constantize back to the original class
33
- def mount_class
34
- @options[:mount_class].constantize
21
+ @options = options
22
+ @scope = scope
23
+ @info = Info.new(@options, @scope) # @info.action and @info.controller
24
+ after_initialize
25
+ @path_names = {}
35
26
  end
36
27
 
37
- def compute_path
38
- # Note: The @options[:prefix] is missing prefix and is not support via direct create_route.
39
- # This is because it can be added directly to the path. IE:
40
- #
41
- # get "myprefix/posts", to: "posts#index"
42
- #
43
- # Also, this helps to keep the method creator logic more simple.
44
- #
45
- prefix = @scope.full_prefix
46
- prefix = account_scope(prefix)
47
- prefix = account_on(prefix)
48
-
49
- path = [prefix, @options[:path]].compact.join('/')
50
- path = path[1..-1] if path.starts_with?('/') # be more forgiving if / accidentally included
51
- path
28
+ def to
29
+ engine || "#{@info.controller}##{@info.action}" # IE: posts#index
52
30
  end
53
31
 
54
- def account_scope(prefix)
55
- return unless prefix
56
- return prefix unless @options[:from_scope]
57
-
58
- if @options[:singular_resource]
59
- prefix.split('/')[0..-2].join('/')
60
- else
61
- prefix.split('/')[0..-3].join('/')
62
- end
32
+ def engine
33
+ @options[:engine]
63
34
  end
35
+ alias rack_app engine
64
36
 
65
- def account_on(prefix)
66
- # Tricky @scope.from == :resources since the account_scope already has accounted for it
67
- if @options[:on] == :collection && @scope.from == :resources
68
- prefix = prefix.split('/')[0..-2].join('/')
69
- end
70
- prefix == '' ? nil : prefix
37
+ def engine?
38
+ !!engine
71
39
  end
72
40
 
73
- def compute_to
74
- controller, action = get_controller_action(@options)
75
- mod = @options[:module] || @scope.full_module
76
- controller = [mod, controller].compact.join('/') # add module
77
- "#{controller}##{action}"
41
+ def endpoint
42
+ engine.to_s if engine
78
43
  end
79
44
 
80
- def compute_as
81
- return nil if @options[:as] == :disabled
82
- return unless @options[:method] == :get || @options[:root]
83
-
84
- controller, action = get_controller_action(@options)
85
- klass = if @options[:root]
86
- Jets::Router::MethodCreator::Root
87
- elsif %w[index edit show new].include?(action.to_s)
88
- class_name = "Jets::Router::MethodCreator::#{action.camelize}"
89
- class_name.constantize # Index, Show, Edit, New
90
- else
91
- Jets::Router::MethodCreator::Generic
92
- end
93
-
94
- klass.new(@options, @scope, controller).full_meth_name(nil)
45
+ def resolved_defaults
46
+ defaults = @options[:defaults] || {}
47
+ @scope.resolved_defaults.merge(defaults)
95
48
  end
96
49
 
97
- # IE: standard: posts/:id/edit
98
- # api_gateway: posts/{id}/edit
99
- def path(format=:jets)
100
- case format
101
- when :api_gateway
102
- api_gateway_format(@path)
103
- when :raw
104
- @path
105
- else # jets format
106
- ensure_jets_format(@path)
107
- end
50
+ def http_method
51
+ @options[:http_method].to_s.upcase
108
52
  end
109
53
 
110
- def method
111
- @options[:method].to_s.upcase
54
+ def constraints
55
+ @options[:constraints] || @scope.resolved_constraints
112
56
  end
113
57
 
114
58
  def internal?
@@ -116,17 +60,18 @@ class Jets::Router
116
60
  end
117
61
 
118
62
  def homepage?
119
- path == ''
63
+ path == '/'
120
64
  end
121
65
 
122
66
  # IE: PostsController
123
- def controller_name
124
- to.sub(/#.*/,'').camelize + "Controller"
125
- end
126
-
127
67
  # IE: index
128
- def action_name
129
- to.sub(/.*#/,'')
68
+ delegate :action, :controller, :is_collection?, :is_member?, to: :@info
69
+ alias action_name action
70
+
71
+ # IE: PostsController
72
+ # Different from @info.action
73
+ def controller_name
74
+ "#{controller.camelize}Controller" if controller
130
75
  end
131
76
 
132
77
  # Checks to see if the corresponding controller exists. Useful to validate routes
@@ -134,32 +79,55 @@ class Jets::Router
134
79
  def valid?
135
80
  controller_class = begin
136
81
  controller_name.constantize
137
- rescue NameError
82
+ rescue NameError => e
138
83
  return false
139
84
  end
140
85
  controller_class.lambda_functions.include?(action_name.to_sym)
141
86
  end
142
87
 
88
+ # For Jets.config.cfn.build.routes == "one_apigw_method_for_all_routes"
89
+ # Need to build the pathParameters for the API Gateway event.
90
+ def rebuild_path_parameters(event)
91
+ extracted = extract_parameters(event["path"])
92
+ if extracted
93
+ params = event["pathParameters"] || {}
94
+ params.merge(extracted)
95
+ else
96
+ event["pathParameters"] # pass through
97
+ end
98
+ end
99
+
143
100
  # Extracts the path parameters from the actual path
144
101
  # Only supports extracting 1 parameter. So:
145
102
  #
146
- # actual_path: posts/tung/edit
103
+ # request_path: posts/tung/edit
147
104
  # route.path: posts/:id/edit
148
105
  #
149
106
  # Returns:
150
107
  # { id: "tung" }
151
- def extract_parameters(actual_path)
108
+ def extract_parameters(request_path)
109
+ request_path = "/#{request_path}" unless request_path.starts_with?('/') # be more forgiving if / accidentally not included
110
+ request_path = remove_engine_mount_at_path(request_path)
152
111
  if path.include?(':')
153
- extract_parameters_capture(actual_path)
112
+ extract_parameters_capture(request_path)
154
113
  elsif path.include?('*')
155
- extract_parameters_proxy(actual_path)
114
+ extract_parameters_proxy(request_path)
156
115
  else
157
116
  # Lambda AWS_PROXY sets null to the input request when there are no path parmeters
158
117
  nil
159
118
  end
160
119
  end
161
120
 
162
- def extract_parameters_proxy(actual_path)
121
+ def remove_engine_mount_at_path(request_path)
122
+ return request_path unless original_engine
123
+
124
+ mount = Jets::Router::EngineMount.find_by(engine: original_engine)
125
+ return request_path unless mount
126
+
127
+ request_path.sub(mount.at, '')
128
+ end
129
+
130
+ def extract_parameters_proxy(request_path)
163
131
  # changes path to a string used for a regexp
164
132
  # others/*proxy => others\/(.*)
165
133
  # nested/others/*proxy => nested/others\/(.*)
@@ -168,9 +136,9 @@ class Jets::Router
168
136
  # leading_path: nested/others
169
137
  # capture everything after the leading_path as the value
170
138
  regexp = Regexp.new("#{leading_path}/(.*)")
171
- value = actual_path.match(regexp)[1]
139
+ value = request_path.match(regexp)[1]
172
140
  else
173
- value = actual_path
141
+ value = request_path
174
142
  end
175
143
 
176
144
  # the last segment without the '*' is the key
@@ -181,7 +149,7 @@ class Jets::Router
181
149
  { key => value }
182
150
  end
183
151
 
184
- def extract_parameters_capture(actual_path)
152
+ def extract_parameters_capture(request_path)
185
153
  # changes path to a string used for a regexp
186
154
  # posts/:id/edit => posts\/(.*)\/edit
187
155
  labels = []
@@ -197,14 +165,49 @@ class Jets::Router
197
165
  regexp_string = "^#{regexp_string}$"
198
166
  regexp = Regexp.new(regexp_string)
199
167
 
200
- values = regexp.match(actual_path).captures
168
+ values = regexp.match(request_path).captures
201
169
  labels.map do |next_label|
202
170
  [next_label, values.delete_at(0)]
203
171
  end.to_h
204
172
  end
205
173
 
206
- def to_h
207
- JSON.load(to_json)
174
+ # Prevents infinite loop when calling route.to_json for state.save("routes", ...)
175
+ def as_json(options= nil)
176
+ data = {
177
+ path: path,
178
+ http_method: http_method,
179
+ to: to,
180
+ }
181
+ data[:engine] = engine if engine
182
+ data[:internal] = internal if internal
183
+ data
184
+ end
185
+
186
+ # To keep "self #{self}" more concise and helpful
187
+ # Use "self #{self.inspect}" more verbose info
188
+ def to_s
189
+ "#<Jets::Router::Route:#{object_id} @options=#{@options}>"
190
+ end
191
+
192
+ # Old notes:
193
+ # For Grape apps, calling ActiveSupport to_json on a Grape class used to cause an infinite loop.
194
+ # Believe Grape fixed this issue. A GrapeApp.to_json now produces a string.
195
+ # No longer need to coerce to a string and back to a class.
196
+ #
197
+ # This is important because Sprocket::Environment.new cannot be coerced into a string or mounting wont work.
198
+ # This is used in sprockets-jets/lib/sprockets/jets/engine.rb
199
+ #
200
+ # Related PR: smarter apigw routes paging calculation #635
201
+ # https://github.com/boltops-tools/jets/pull/635
202
+ # Debugging notes: https://gist.github.com/tongueroo/c9baa7e98d5ad68bbdd770fde4651963
203
+ def mount_class
204
+ @options[:mount_class]
205
+ end
206
+
207
+ # For jets routes help table of routes
208
+ def mount_class_name
209
+ return unless mount_class
210
+ mount_class.class == Class ? mount_class : "#{mount_class.class}.new"
208
211
  end
209
212
 
210
213
  private