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,214 @@
1
+ require 'dsl_evaluator'
2
+
3
+ # The Jets::Router::RouteSet mimics the Rails interface.
4
+ # Jets works in a similar way to Rails.
5
+ # For example the url_helpers:
6
+ #
7
+ # Jets.application.routes.url_helpers
8
+ # => Jets.application.routes.named_routes.path_helpers_module
9
+ # => Jets::Router::Helpers::NamedRoutes::Generated::MainAppHelpers
10
+ #
11
+ # Jets makes less use of anonymous modules. It uses generated named modules
12
+ # to help debugging. Whereas Rails:
13
+ #
14
+ # Rails.application.routes.url_helpers => <Module>
15
+ # Rails.application.routes.named_routes.path_helpers_module => <Module>
16
+ # Rails.application.routes.named_routes.url_helpers_module => <Module>
17
+ #
18
+ # Rails generates an anonymous module for url_helpers that wraps
19
+ # and includes the path_helpers_module and url_helpers_module.
20
+ #
21
+ # Jets tries to exhibit enough of the same as Rails interface to make it
22
+ # compatible with with ActionController and ActionView components.
23
+ #
24
+ module Jets::Router
25
+ class RouteSet
26
+ extend Memoist
27
+ include Compat::RouteSet
28
+ include Dsl
29
+
30
+ # With Jets, this class is not a really a Collection. It's a wrapper
31
+ # around Helpers::NamedRoutes::Generated which does the real work.
32
+ # Naming it NamedRouteCollection to be consistent with Rails and possibly
33
+ # in the future to make them more similar.
34
+ class NamedRouteCollection
35
+ attr_reader :url_helpers_module
36
+ def initialize(route_set)
37
+ @url_helpers_module = Helpers::NamedRoutes::Generated.create_helper_module(route_set)
38
+ end
39
+
40
+ # interface method
41
+ # Rails AbstractController::UrlFor calls this method
42
+ # Reason why this wrapper is needed.
43
+ def helper_names
44
+ url_helpers_module.path_helpers.map(&:to_s) +
45
+ url_helpers_module.url_helpers.map(&:to_s)
46
+ end
47
+
48
+ delegate :remove_methods!, :add_methods!, to: :url_helpers_module
49
+ end
50
+
51
+ attr_reader :routes, :engine
52
+ attr_accessor :draw_paths, :default_scope, :default_url_options,
53
+ :disable_clear_and_finalize
54
+ def initialize(engine=Jets.application)
55
+ @engine = engine
56
+ @engine_class = engine.class
57
+ @default_url_options = {} # {host: "localhost"}
58
+ @routes = []
59
+ @draw_paths = [] # not part of clear! addtional paths: config/routes/admin.rb
60
+ @prepend = [] # not part of clear! Otherwise breaks engines like sprockets-jets
61
+ @append = [] # not part of clear!
62
+ @finalized = false
63
+ @disable_clear_and_finalize = false
64
+ @default_scope = {}
65
+ end
66
+
67
+ # draw is called from config/routes.rb
68
+ # load! is what we just internally to trigger it
69
+ def draw(&block)
70
+ clear! unless @disable_clear_and_finalize
71
+ scope(default_scope) do
72
+ instance_eval(&block)
73
+ end
74
+ finalize! unless @disable_clear_and_finalize
75
+ check_collision!
76
+ end
77
+
78
+ # Be selective about what to clear. Keep other initialized instance variables
79
+ # like @prepend, @append, @default_scope
80
+ # Otherwise can break engines like sprockets-jets that use prepend.
81
+ def clear!
82
+ @finalized = false
83
+ @routes = []
84
+ @scope = Scope.new
85
+ named_routes.remove_methods!
86
+ @prepend.each { |blk| instance_eval(&blk) }
87
+ end
88
+
89
+ # Interface method for plugins.
90
+ # Plugins like kingsman use to hook into Jets after routes are loaded.
91
+ def finalize!
92
+ return if @finalized
93
+ @append.each { |blk| instance_eval(&blk) }
94
+ load_external_paths
95
+ named_routes.add_methods!
96
+ @finalized = true
97
+ end
98
+
99
+ # additonal paths: config/routes/admin.rb
100
+ def load_external_paths
101
+ @draw_paths.each do |draw_path|
102
+ Dir.glob("#{draw_path}/*.rb").each do |route_path|
103
+ instance_eval(File.read(route_path), route_path.to_s)
104
+ end
105
+ end
106
+ end
107
+
108
+ def append(&block)
109
+ @append << block
110
+ end
111
+
112
+ def prepend(&block)
113
+ @prepend << block
114
+ end
115
+
116
+ # Rails interface method
117
+ def eager_load!
118
+ # noop for Jets
119
+ end
120
+
121
+ def url_helpers(supports_path = true)
122
+ @url_helpers ||= named_routes.url_helpers_module
123
+ end
124
+
125
+ def mounted_helpers
126
+ # Calling url_helpers to create the mounted_helpers proxy methods
127
+ # IE: main_app and blorgh
128
+ url_helpers
129
+ @mounted_helpers ||= Helpers::NamedRoutes::Generated::MountedHelpers
130
+ end
131
+
132
+ def define_mounted_helper(name)
133
+ Helpers::NamedRoutes::Generated.define_mounted_helper(name, self)
134
+ end
135
+
136
+ # Note: Jets assigns this to a instance varialbe in the initialize method
137
+ # But Jets cannot do this because we currently eager load internally and
138
+ # that routes draw would not be called in proper order.
139
+ def named_routes
140
+ NamedRouteCollection.new(self)
141
+ end
142
+ memoize :named_routes
143
+
144
+ # Validate routes that deployable
145
+ def check_collision!
146
+ return if Jets.config.cfn.build.routes == "one_apigw_method_for_all_routes"
147
+ paths = self.routes.map(&:path)
148
+ collision = Jets::Cfn::Resource::ApiGateway::RestApi::Routes::Collision.new
149
+ collide = collision.collision?(paths)
150
+ raise collision.exception if collide
151
+ end
152
+
153
+ def one_apigw_method_for_all_routes_warning(options)
154
+ return unless options[:authorizer]
155
+ return unless Jets.config.cfn.build.routes == "one_apigw_method_for_all_routes"
156
+ return if options[:path].starts_with?('*') # *catchall
157
+ return if options[:path] == '' # root
158
+
159
+ puts <<~EOL.color(:yellow)
160
+ WARNING: Authorizer should not be set at individual routes when using
161
+
162
+ config.cfn.build.routes == "one_apigw_method_for_all_routes"
163
+
164
+ You should only set authorizer for the root route and *catchall route.
165
+ The root route uses the root authorizer.
166
+ And all other routes uses the *catchall authorizer.
167
+ Docs: http://rubyonjets.com/docs/routing/authorizers/one-method/
168
+ EOL
169
+ DslEvaluator.print_code(routes_call_line) if routes_call_line
170
+ end
171
+
172
+ def routes_call_line
173
+ caller.find { |l| l.include?('config/routes.rb') }
174
+ end
175
+
176
+ def api_mode?
177
+ Jets.config.mode == 'api' || Jets.config.api_only
178
+ end
179
+
180
+ # Useful for creating API Gateway Resources
181
+ def all_paths
182
+ results = []
183
+ paths = routes.map(&:path)
184
+ paths.each do |p|
185
+ sub_paths = []
186
+ parts = p.split('/')
187
+ until parts.empty?
188
+ parts.pop
189
+ sub_path = parts.join('/')
190
+ sub_paths << sub_path unless sub_path == ''
191
+ end
192
+ results += sub_paths
193
+ end
194
+ @all_paths = (results + paths).sort.uniq
195
+ end
196
+
197
+ # Useful for RouterMatcher
198
+ #
199
+ # Precedence:
200
+ # Routes with wildcards are considered after routes without wildcards
201
+ #
202
+ # Routes with fewer captures are ordered first since both
203
+ # /posts/:post_id/comments/new and /posts/:post_id/comments/:id are equally
204
+ # long
205
+ #
206
+ # Routes with the same amount of captures and wildcards are orderd so that
207
+ # the longest path is considered first since posts/:id and posts/:id/edit
208
+ # can both match.
209
+ def ordered_routes
210
+ length = Proc.new { |r| [r.path.count("*"), r.path.count(":"), r.path.length * -1] }
211
+ routes.sort_by(&length)
212
+ end
213
+ end
214
+ end
@@ -1,95 +1,230 @@
1
- module Jets
2
- class Router
3
- class Scope
4
- include Util
1
+ module Jets::Router
2
+ class Scope
3
+ include Util
5
4
 
6
- attr_reader :options, :parent, :level
7
- def initialize(options = {}, parent = nil, level = 1)
8
- @options = options
9
- @parent = parent
10
- @level = level
11
- end
5
+ module Macros
6
+ OPTION_ACCESSORS = Set.new
7
+ extend ActiveSupport::Concern
12
8
 
13
- def root?
14
- @parent.nil?
9
+ class_methods do
10
+ def option_accessor(*names)
11
+ names.each do |name|
12
+ define_method(name) do
13
+ @options[name]
14
+ end
15
+ define_method("#{name}=") do |value|
16
+ if value.nil?
17
+ @options.delete(name)
18
+ else
19
+ @options[name] = value
20
+ end
21
+ end
22
+ define_method("#{name}?") do
23
+ !!@options[name]
24
+ end
25
+ OPTION_ACCESSORS.add(name)
26
+ end
27
+ end
15
28
  end
16
29
 
17
- def new(options={})
18
- self.class.new(options, self, level + 1)
30
+ # Allow [] and []= notation. Though Jets does not use this internally.
31
+ # This is what Rails ActionDispatch::Routing::Mapper::Scope does.
32
+ # Helps with compatibility in case plugins use this notation.
33
+ def [](key)
34
+ if OPTION_ACCESSORS.include?(key)
35
+ send(key)
36
+ else
37
+ raise NoMethodError, "undefined method `#{key}' for #{self}"
38
+ end
19
39
  end
20
40
 
21
- def full_module
22
- items = walk_parents do |current, i, result|
23
- mod = current.options[:module]
24
- next unless mod
25
- result.unshift(mod)
41
+ def []=(key, value)
42
+ if OPTION_ACCESSORS.include?(key)
43
+ send("#{key}=", value)
44
+ else
45
+ raise NoMethodError, "undefined method `#{key}' for #{self}"
26
46
  end
47
+ end
48
+ end
49
+ include Macros
27
50
 
28
- items.empty? ? nil : items.join('/')
51
+ attr_reader :options, :parent, :level, :children
52
+ attr_accessor :next
53
+ option_accessor :from, :path, :as, :resource_name, :module, :singular_resource,
54
+ :controller, :defaults, :constraints, :shallow
55
+ def initialize(options = {}, parent = nil, level = 1)
56
+ @options = options
57
+ @parent = parent
58
+ @level = level
59
+ @children = []
60
+ if parent
61
+ parent.children << self
29
62
  end
63
+ end
30
64
 
31
- def full_prefix
32
- items = walk_parents do |current, i, result|
33
- prefix = current.options[:prefix]
34
- next unless prefix
65
+ def new(options={})
66
+ self.class.new(options, self, level + 1)
67
+ end
35
68
 
36
- case current.from
37
- when :resources
38
- path_param = if current.options[:param]
39
- ":#{current.options[:param]}"
40
- else
41
- resource_name = prefix.to_s.split('/').last
42
- resource_name = ":#{resource_name.singularize}_id"
43
- end
44
- result.unshift(path_param)
45
- result.unshift(prefix)
46
- else # resource, namespace or general scope
47
- result.unshift(prefix)
48
- end
49
- end
69
+ def virtual_controller
70
+ case from
71
+ when :member, :collection
72
+ parent.virtual_controller
73
+ when :resource
74
+ controller || resource_name.to_s.pluralize
75
+ else
76
+ controller || resource_name
77
+ end
78
+ end
50
79
 
51
- items.empty? ? nil : items.join('/')
80
+ def resolved_defaults
81
+ result = {}
82
+ from_top.each do |scope|
83
+ result.merge!(scope.defaults) if scope.defaults
52
84
  end
85
+ result
86
+ end
53
87
 
54
- def full_as
55
- items = []
56
- current = self
57
- while current
58
- items.unshift(current.options[:as]) # <= option_name
59
- current = current.parent
60
- end
88
+ def resolved_constraints
89
+ from_bottom.each do |scope|
90
+ return scope.constraints if scope.constraints
91
+ end
92
+ nil
93
+ end
94
+
95
+ def resolved_module
96
+ items = from_top.map(&:module).compact
97
+ items.join('/') unless items.empty?
98
+ end
61
99
 
62
- items.compact!
63
- return if items.empty?
100
+ def needs_controller_path?
101
+ return false if resource_name # no adjustments if within resource or resources scope
64
102
 
65
- items = singularize_leading(items)
66
- items.join('_')
103
+ from.nil?
104
+ end
105
+
106
+ def virtual?
107
+ from == :member || from == :collection
108
+ end
109
+
110
+ def resolved_path
111
+ case from
112
+ when :resource, :resources
113
+ path || resource_name
114
+ when :namespace, :path, nil
115
+ path
116
+ when :member, :collection
117
+ parent.resolved_path
67
118
  end
119
+ end
68
120
 
69
- def walk_parents
70
- current, i, result = self, 0, []
71
- while current
72
- yield(current, i, result)
73
- current = current.parent
74
- i += 1
75
- end
76
- result
121
+ def parent_or_higher?(other_scope)
122
+ current_scope = self
123
+
124
+ while current_scope.parent && !current_scope.parent.virtual?
125
+ return true if current_scope.parent == other_scope
126
+ current_scope = current_scope.parent
77
127
  end
78
128
 
79
- # singularize all except last item
80
- def singularize_leading(items)
81
- result = []
82
- items.each_with_index do |item, index|
83
- item = item.to_s
84
- r = index == items.size - 1 ? item : item.singularize
85
- result << r
86
- end
87
- result
129
+ false
130
+ end
131
+
132
+ def real_parent?(scope)
133
+ if scope.virtual?
134
+ scope.parent == parent
135
+ else
136
+ parent == scope
88
137
  end
138
+ end
89
139
 
90
- def from
91
- @options[:from]
140
+ def resource_descendent?(scope=self)
141
+ # return false
142
+ scope.children.each do |child|
143
+ return true if child.from == :resource || child.from == :resources
144
+ return true if resource_descendent?(child)
92
145
  end
146
+ false
147
+ end
148
+
149
+ def resource_sibling?
150
+ return false
151
+ !resource_siblings.empty?
152
+ end
153
+
154
+ def colliding_resource_sibling?
155
+ return false
156
+ # Don't think need to check for path because it doesn't really make sense
157
+ # to point 2 different resources to the same path.
158
+ resource_names = resource_siblings.map(&:resource_name)
159
+ resource_names.uniq.size != resource_names.size
160
+ end
161
+
162
+ def resource_siblings
163
+ return [] unless parent
164
+ parent.children.select do |c|
165
+ c != self &&
166
+ (c.from == :resource || c.from == :resources)
167
+ end
168
+ end
169
+
170
+ # At time of each_resource DSL evaluation, the routes file has not fully evaluated
171
+ # and the scope context is not fully available. IE: info on the children.
172
+ #
173
+ # Placeholder param allows the values to lazily replaced later with full context.
174
+ # We only have to replace the last segment with the placeholder.
175
+ # This is because previous segments are already replaced with Route::Path#path_prefixes
176
+ # scopes_from_top logic.
177
+ def param_placeholder
178
+ if resource_name
179
+ "#{resource_name.upcase}_PARAM"
180
+ else
181
+ prefix = path.to_s.gsub('/','_').upcase
182
+ "#{prefix}_PARAM"
183
+ end
184
+ end
185
+
186
+ def from_top
187
+ from_bottom.reverse
188
+ end
189
+ alias all_scopes from_top
190
+
191
+ def from_bottom
192
+ current_scope = self
193
+ scopes = []
194
+ previous_scope = nil # child
195
+ # do not include the root scope
196
+ while current_scope.parent
197
+ current_scope.next = previous_scope if previous_scope
198
+ scopes << current_scope
199
+ previous_scope = current_scope
200
+ current_scope = current_scope.parent
201
+ end
202
+ scopes
203
+ end
204
+
205
+ def any_parent_shallow?
206
+ from_bottom.any? do |scope|
207
+ scope.shallow? || scope.from == :shallow
208
+ end
209
+ end
210
+
211
+ # singularize all except last item
212
+ def singularize_leading(items)
213
+ result = []
214
+ items.each_with_index do |item, index|
215
+ item = item.to_s
216
+ r = index == items.size - 1 ? item : item.singularize
217
+ result << r
218
+ end
219
+ result
220
+ end
221
+
222
+ def root?
223
+ @parent.nil?
224
+ end
225
+
226
+ def to_s
227
+ "<Scope:#{object_id} @level=#{@level} @options=#{@options}>"
93
228
  end
94
229
  end
95
230
  end
@@ -1,40 +1,60 @@
1
- class Jets::Router
1
+ module Jets::Router
2
2
  class State
3
3
  extend Memoist
4
4
  include Jets::AwsServices
5
5
 
6
+ def self.save_apigw_state
7
+ state = Jets::Router::State.new
8
+ state.save("methods", Jets::Cfn::Builder::Api::Pages::Methods.pages)
9
+ state.save("resources", Jets::Cfn::Builder::Api::Pages::Resources.pages)
10
+ # To avoid API limits for calculating changed routes in next deploy
11
+ state.save("routes", Jets::Router.routes)
12
+ end
13
+
6
14
  def load(filename)
7
- resp = s3.get_object(
8
- bucket: Jets.aws.s3_bucket,
9
- key: s3_storage_path(filename),
10
- )
15
+ resp = nil
16
+ begin
17
+ resp = s3.get_object(
18
+ bucket: Jets.aws.s3_bucket,
19
+ key: s3_storage_path(filename),
20
+ )
21
+ rescue Aws::S3::Errors::NoSuchBucket
22
+ # Allow JETS_TEMPLATES=1 jets build to work with no-bucket-yet
23
+ return nil
24
+ end
11
25
  text = resp.body.read
12
26
  JSON.load(text)
13
- rescue
27
+ rescue Aws::S3::Errors::NoSuchKey, Aws::S3::Errors::PermanentRedirect
14
28
  end
15
29
  memoize :load
16
30
 
17
31
  # Save previously deployed APIGW routes state
18
32
  def save(filename, data)
19
- # body = Jets::Router.routes.to_json
20
- # body = JSON.generate(Jets::Cfn::Builders::PageBuilder.pages)
21
33
  body = data.respond_to?(:to_json) ? data.to_json : JSON.generate(data)
22
- s3.put_object(
23
- body: body,
24
- bucket: Jets.aws.s3_bucket,
25
- key: s3_storage_path(filename),
26
- )
34
+ body = JSON.pretty_generate(JSON.parse(body)) # pretty generate
35
+ if ENV['JETS_API_STATE_DEBUG'] # useful with jets build --templates
36
+ puts "WARN: JETS_API_STATE_DEBUG=1 detected. Saving to tmp/#{filename}.json instead of S3.".color(:yellow)
37
+ IO.write("tmp/#{filename}.json", body)
38
+ else
39
+ s3.put_object(
40
+ body: body,
41
+ bucket: Jets.aws.s3_bucket,
42
+ key: s3_storage_path(filename),
43
+ )
44
+ end
27
45
  end
28
46
 
29
47
  # Examples:
30
48
  #
31
- # jets/state/apigw/pages.json
49
+ # jets/state/apigw/resources.json
50
+ # jets/state/apigw/methods.json
32
51
  # jets/state/apigw/routes.json
33
52
  #
34
53
  # Fetch or loaded in:
35
54
  #
36
- # pages.json: Jets::Cfn::Builders::PageBuilder#old_pages
37
- # routes.json: Jets::Resource::ApiGateway::RestApi::Routes::Change::Base#deployed_routes
55
+ # resources.json: Jets::Cfn::Builder::Api::Pages::Resources#old_pages
56
+ # methods.json: Jets::Cfn::Builder::Api::Pages::Methods#old_pages
57
+ # routes.json: Jets::Cfn::Resource::ApiGateway::RestApi::Routes::Change::Base#deployed_routes
38
58
  #
39
59
  # Saved in:
40
60
  #
@@ -1,38 +1,8 @@
1
- class Jets::Router
1
+ module Jets::Router
2
2
  module Util
3
- # used in MethodCreator logic
4
- def join(*items)
5
- list = items.compact.join('_')
6
- underscore(list)
7
- end
8
-
9
3
  def underscore(str)
10
4
  return unless str
11
5
  str.to_s.gsub(/[^a-zA-Z0-9]/,'_')
12
6
  end
13
-
14
- def get_controller_action(options)
15
- if options.key?(:controller) && options.key?(:action)
16
- [options[:controller], options[:action]]
17
- elsif options.key?(:controller) && options.key?(:to)
18
- action = options[:to].split('#').last
19
- [options[:controller], action]
20
- elsif options.key?(:on)
21
- handle_on!(options)
22
- else
23
- options[:to].split('#') # controller, action
24
- end
25
- end
26
-
27
- def handle_on!(options)
28
- controller = @scope.options[:prefix].to_s
29
- to = "#{controller}##{options[:path]}"
30
- options[:to] = to
31
-
32
- as = @options[:on] == :member ? controller.singularize : controller
33
- as = "#{@options[:path]}_#{as}"
34
- options[:as] = as
35
- to.split('#')
36
- end
37
7
  end
38
8
  end