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,66 @@
1
+ module Jets::Router::Helpers::NamedRoutes
2
+ class Proxy
3
+ include AddFullUrl
4
+
5
+ def initialize(view_context, helpers_module)
6
+ @helpers = helpers_class(helpers_module).new(view_context)
7
+ end
8
+
9
+ # * The helpers_module is passed as a argument to give the anonymous class
10
+ # access via closure at include time.
11
+ # * view_context is passed at initialize to provide access at instantiation time.
12
+ def helpers_class(helpers_module)
13
+ Class.new do
14
+ include helpers_module # IE: Generated::MainAppHelpers
15
+ def initialize(view_context)
16
+ @view_context = view_context
17
+ end
18
+
19
+ # Important:
20
+ #
21
+ # * The add_full_url method needs url_options.
22
+ # Without url_options the proxy methods are unavailable and creates
23
+ # an infinite loop with method_missing.
24
+ # * request is needed for add_apigw_stage? to check request correctly
25
+ # Otherwise, gems like kingsman, that use the named routes proxy methods,
26
+ # won't get able to get the correct url with the stage name prepended.
27
+ #
28
+ # The request is the main reason an anonymous class is used since the
29
+ # view_context has included modules like ApigwStage that assume a
30
+ # request method is available.
31
+ delegate :url_options, :request, :event, to: :@view_context
32
+ end
33
+ end
34
+
35
+ # No need to check respond_to? and call raise NoMethodError again because anonymous
36
+ # class will already return a undefined method error.
37
+ #
38
+ # It's annoying that we need to add_full_url here because
39
+ # the proxy calls the url methods with a module view_context instead
40
+ # of the controller or view_context instance. So we don't have access to
41
+ # the request and url_options. The url_options are only available in the controller
42
+ # or view_context instance.
43
+ #
44
+ # So we call the path method instead and then add_full_url here.
45
+ # Not calling the url method directly because could add the full url twice,
46
+ # when the user is setting the default_url_options.
47
+ # Also calling the url method would cause an error because request and url_options
48
+ # is not available.
49
+ #
50
+ # The logic is a bit convoluted but it works. Rails does something similar
51
+ # with their RoutesProxy class and view_context.url_options.
52
+ def method_missing(method_name, *args)
53
+ path_name = method_name.to_s.sub(/_url$/, '_path').to_sym
54
+ path = @helpers.send(path_name, *args)
55
+ if method_name.to_s.end_with?('_url')
56
+ options = args.extract_options!
57
+ options.merge!(path: path)
58
+ options = url_options.merge(options)
59
+ add_full_url(options)
60
+ else
61
+ path
62
+ end
63
+ end
64
+ end
65
+ end
66
+
@@ -1,19 +1,101 @@
1
- class Jets::Router
1
+ module Jets::Router
2
2
  class Matcher
3
- def initialize(path, method)
4
- @path = path.sub(/^\//,'')
5
- @method = method.to_s.upcase
3
+ extend Memoist
4
+
5
+ attr_reader :routes
6
+ def initialize(route_set=Jets.application.routes)
7
+ @route_set = route_set
8
+ @routes = route_set.ordered_routes
9
+ end
10
+
11
+ def request_path
12
+ # Ensure leading slash
13
+ # Be more forgiving and allow the request_path to be passed in without a leading slash.
14
+ # Note: request PATH_INFO will always have a leading slash, but just in case.
15
+ # This is also covered in specs.
16
+ return unless @request_path
17
+ @request_path.starts_with?('/') ? @request_path : "/#{@request_path}"
18
+ end
19
+
20
+ def request_method
21
+ @request_method.to_s.upcase if @request_method
22
+ end
23
+
24
+ # Precedence:
25
+ # 1. Routes with no captures get highest precedence: posts/new
26
+ # 2. Then we consider the routes with captures: post/:id
27
+ #
28
+ # Within these 2 groups we consider the routes with the longest path first
29
+ # since posts/:id and posts/:id/edit can both match.
30
+ def find_by_request(request, request_method=nil)
31
+ @request = request # @request is used to check constraints
32
+ # Checking the request_method_from_hidden_method_field so that handler can find the right route
33
+ # super early in the process. Otherwise lambda routes to the wrong controller action.
34
+ @request_method = request_method || @request.request_method_from_hidden_method_field || @request.request_method.to_s.upcase
35
+ @request_path = @request.path
36
+ route = find_route
37
+ match_constraints(route) if route
38
+ end
39
+
40
+ # Simpler version of find_by_request that does not check constraints.
41
+ # Used by Jets::Controller::Middleware::Mimic and called super-early on.
42
+ # Does not have access to @request object and path_params
43
+ def find_by_env(env)
44
+ @env = env
45
+ @request_method = env["REQUEST_METHOD"] || "GET"
46
+ @request_path = env["PATH_INFO"]
47
+ find_route
48
+ end
49
+
50
+ def find_by_controller_action(controller, action)
51
+ controller = "#{controller.camelize}Controller"
52
+ routes.find do |r|
53
+ r.controller_name == controller.to_s &&
54
+ r.action_name == action.to_s
55
+ end
56
+ end
57
+
58
+ def find_route
59
+ routes.each do |r|
60
+ if r.engine
61
+ route = find_engine_route(r)
62
+ return route if route
63
+ else
64
+ found = match?(r)
65
+ return r if found
66
+ end
67
+ end
68
+ nil
6
69
  end
7
70
 
71
+ def find_engine_route(route)
72
+ return unless mount
73
+
74
+ engine_matcher = self.class.new(route.engine.route_set)
75
+ engine_route = if @request
76
+ engine_matcher.find_by_request(@request, @request_method)
77
+ else
78
+ engine_matcher.find_by_env(@env)
79
+ end
80
+ # save original engine for route.extract_parameters later
81
+ engine_route.original_engine = route.engine if engine_route
82
+ engine_route
83
+ end
84
+
85
+ def mount
86
+ EngineMount.find_by(request_path: request_path)
87
+ end
88
+ memoize :mount
89
+
8
90
  def match?(route)
9
- # Immediately stop checking when the request method: GET, POST, ANY, etc
91
+ # Immediately stop checking when the request http_method: GET, POST, ANY, etc
10
92
  # doesnt match.
11
-
12
- return false if method != route.method && route.method != "ANY"
93
+ return false if request_method != route.http_method && route.http_method != "ANY"
13
94
 
14
95
  route_path = route.path
96
+ route_path = "#{mount.at}#{route_path}" if mount
15
97
 
16
- if path == route_path
98
+ if request_path == route_path
17
99
  # regular string match detection
18
100
  return true # exact route matches are highest precedence
19
101
  end
@@ -21,18 +103,54 @@ class Jets::Router
21
103
  # Check path for route capture and wildcard matches:
22
104
  # A colon (:) means the variable has a variable
23
105
  if route_path.include?(':') # 2nd highest precedence
24
- capture_detection(route_path, path) # early return true or false
106
+ capture_detection(route_path, request_path) # early return true or false
25
107
  # A star (*) means the variable has a glob
26
108
  elsif route_path.include?('*') # lowest precedence
27
- proxy_detection(route_path, path) # early return true or false
109
+ proxy_detection(route_path, request_path) # early return true or false
28
110
  else
29
111
  false # reach here, means no route matched
30
112
  end
31
113
  end
32
114
 
33
- private
115
+ def match_constraints(route)
116
+ return unless route
117
+ constraints_matches?(route) ? route : nil
118
+ end
34
119
 
35
- attr_reader :path, :method
120
+ # Matcher called in mimic.rb before mimic event is available
121
+ # We need to extract the parameters from the possible matching route directly
122
+ # since event is unavailable.
123
+ def constraints_matches?(route)
124
+ # Matcher is used super-early when request not yet available.
125
+ # Cannot check constraints because we dont have the request object.
126
+ # To build a request object, would need to build a mimic event and it's not yet available.
127
+ return true if @request.nil?
128
+
129
+ constraints = route.constraints
130
+ return true if constraints.blank?
131
+
132
+ if constraints.is_a?(Hash)
133
+ parameters = route.extract_parameters(request_path) # extract directly
134
+ constraints.any? do |key, value|
135
+ key = key.to_s
136
+ if value.is_a?(Regexp)
137
+ value.match(parameters[key])
138
+ else # String
139
+ if parameters[key]
140
+ value == parameters[key]
141
+ elsif @request.respond_to?(key)
142
+ value == @request.send(key)
143
+ end
144
+ end
145
+ end
146
+ elsif constraints.respond_to?(:call)
147
+ constraints.call(@request)
148
+ elsif constraints.respond_to?(:matches?)
149
+ constraints.matches?(@request)
150
+ end
151
+ end
152
+
153
+ private
36
154
 
37
155
  # catchall/globbing/wildcard/proxy routes. Examples:
38
156
  #
@@ -40,7 +158,7 @@ class Jets::Router
40
158
  # get "others/*rest", to: "others#show"
41
159
  # get "*catchall", to: "public_files#show" # last catchall route for Jets
42
160
  #
43
- def proxy_detection(route_path, actual_path)
161
+ def proxy_detection(route_path, request_path)
44
162
  # drop the proxy_segment
45
163
  leading_path = route_path.split('/')[0..-2].join('/')
46
164
 
@@ -61,10 +179,11 @@ class Jets::Router
61
179
 
62
180
  pattern = "^#{leading_path}"
63
181
  regexp = Regexp.new(pattern)
64
- !!regexp.match(actual_path) # could be true or false
182
+
183
+ !!regexp.match(request_path) # could be true or false
65
184
  end
66
185
 
67
- def capture_detection(route_path, actual_path)
186
+ def capture_detection(route_path, request_path)
68
187
  # changes path to a string used for a regexp
69
188
  # posts/:id/edit => posts\/(.*)\/edit
70
189
  regexp_string = route_path.split('/').map do |s|
@@ -75,7 +194,7 @@ class Jets::Router
75
194
 
76
195
  regexp = Regexp.new(regexp_string)
77
196
 
78
- !!regexp.match(actual_path) # could be true or false
197
+ !!regexp.match(request_path) # could be true or false
79
198
  end
80
199
  end
81
200
  end
@@ -1,12 +1,14 @@
1
1
  module Jets::Router::Resources
2
2
  class Options < Base
3
3
  def build(action)
4
- controller = @options[:singular_resource] ? @name.to_s.pluralize : @name
5
- options = @options.merge(to: "#{controller}##{action}") # important to create a copy of the options
6
- # remove special options from getting to create_route. For some reason .slice! doesnt work
4
+ # Important to create a copy of the options since we are mutating it
5
+ # The original options are used for resources and resource scope
6
+ options = @options.dup
7
+ # Remove special options from getting to create_route. For some reason .slice! doesnt work
7
8
  options.delete(:only)
8
9
  options.delete(:except)
9
- options[:from_scope] = true # flag to drop the prefix later in Route#compute_path
10
+ controller = options[:singular_resource] ? @name.to_s.pluralize : @name
11
+ options[:to] = "#{controller}##{action}"
10
12
  options
11
13
  end
12
14
  end
@@ -0,0 +1,64 @@
1
+ class Jets::Router::Route
2
+ module AfterInitialize
3
+ def after_initialize
4
+ normalize_to_option!
5
+ normalize_path_option!
6
+ normalize_id_constraint!
7
+ check_on_option!
8
+ end
9
+
10
+ # Possibly infer to option from the path. Example:
11
+ #
12
+ # get 'posts/index'
13
+ # get 'posts', to: 'posts#index'
14
+ #
15
+ # get 'posts/show'
16
+ # get 'posts', to: 'posts#show'
17
+ #
18
+ def normalize_to_option!
19
+ return if @options[:to]
20
+
21
+ path = @options[:path].to_s
22
+ return unless path.include?('/')
23
+
24
+ path = path.delete_prefix('/') # remove leading slash
25
+ items = path.split('/')
26
+ if items.size == 2
27
+ @options[:to] = items.join('#')
28
+ end
29
+ end
30
+
31
+ def normalize_path_option!
32
+ path = @options[:path]
33
+ resource_name = @scope.resource_name
34
+ if path.is_a?(Symbol) and resource_name # Treat as controller action
35
+ # Only supported with used within scope, resource, resources block
36
+ action = path # IE: get :list => action = :list
37
+ controller = @scope.virtual_controller
38
+ # infer and set to option if not set
39
+ @options[:to] ||= "#{controller}##{action}"
40
+ end
41
+
42
+ # override
43
+ @options.merge!(path: escape_path(path)) if path
44
+ end
45
+
46
+ def normalize_id_constraint!
47
+ if @options[:id] && !@options[:constraints]
48
+ @options[:constraints] = { id: @options[:id] }
49
+ end
50
+ end
51
+
52
+ def check_on_option!
53
+ if @options[:on] && !%w[resources resource].include?(@scope.from.to_s)
54
+ raise Jets::Router::Error.new("ERROR: The `on:` option can only be used within a resource or resources block")
55
+ end
56
+ end
57
+
58
+ def escape_path(path)
59
+ path.to_s.split('/').map { |s| s =~ /\A[:\*]/ ? s : CGI.escape(s) }.join('/')
60
+ path = "/#{path}" unless path.starts_with?('/')
61
+ path
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,93 @@
1
+ class Jets::Router::Route
2
+ module As
3
+ def as
4
+ return nil if @options[:as] == :disabled
5
+ return @options[:engine].engine_name if @options[:engine]
6
+ return unless @options[:root] || [:get, :post, :patch, :put, :delete].include?(@options[:http_method])
7
+
8
+ as = scoped_as
9
+ as = add_underscore_path(as)
10
+ as = add_action(as)
11
+ as = add_root(as)
12
+ as
13
+ end
14
+
15
+ def scoped_as
16
+ list = []
17
+ @scope.from_top.each do |scope|
18
+ node = Node.new(self, scope)
19
+
20
+ as = node.resolved_as
21
+ as = as.to_s.singularize if node.has_param?
22
+ list << as if as && node.append_as?
23
+ end
24
+ list.reject!(&:blank?) # IE: list [:posts, :comments]
25
+ list.unshift(@options[:as]) if @options[:as]
26
+ list.join('_').gsub('/','_') unless list.empty?
27
+ end
28
+
29
+ # IE: posts/:id/edit => posts
30
+ # Using this convention so that regular routes under namespace and path
31
+ # can be reassemble as if they were under resources
32
+ def add_underscore_path(as)
33
+ if as.nil? && @scope.needs_controller_path? # only consider leaf scope
34
+ @options[:as] || underscore_path_before_param
35
+ else
36
+ as
37
+ end
38
+ end
39
+
40
+ # IE: posts/:id/edit => posts
41
+ # Using this convention so that regular routes under namespace and path
42
+ # can be reassemble as if they were under resources
43
+ def underscore_path_before_param
44
+ action_suffixes = %w[new edit] # edit in case of singular resource
45
+ parts = []
46
+ path = @options[:path].to_s
47
+ return nil if path.include?('*') || !path.ascii_only? # IE: get '*catchall', to: 'public_files#show'
48
+
49
+ path = path.delete_prefix('/')
50
+ path.split('/').each do |part|
51
+ if part.starts_with?(':') || part.starts_with?('*') || action_suffixes.include?(part)
52
+ break
53
+ end
54
+ parts << part
55
+ end
56
+ parts.map! { |p| p.gsub(/[^a-zA-Z0-9]/,'_') }
57
+ path = parts.join('_').squeeze('_')
58
+ if action_suffixes.include?(@info.action)
59
+ path.singularize
60
+ else
61
+ path
62
+ end
63
+ end
64
+
65
+ def add_action(resource)
66
+ resource = resource.to_s
67
+ return resource if resource.blank?
68
+
69
+ as_name = @options[:as] || @info.action
70
+ as_name = as_name.to_s.delete_prefix('/') if as_name
71
+
72
+ if %w[new edit].include?(@info.action) && @options[:as].nil?
73
+ "#{as_name}_#{resource.singularize}" # IE: new_post
74
+ elsif %[index create].include?(@info.action)
75
+ resource # IE: posts
76
+ elsif %w[show edit update destroy].include?(as_name)
77
+ "#{resource.singularize}" # IE: post
78
+ elsif is_collection?(@scope) && @options[:as].nil?
79
+ "#{as_name}_#{resource}" # IE: list_post
80
+ elsif (is_member?(@scope) || @scope.from == :resource) && @options[:as].nil?
81
+ "#{as_name}_#{resource.singularize}" # IE: rate_post
82
+ elsif @scope.resource_name && @options[:as].nil?
83
+ "#{resource.singularize}_#{as_name}" # IE: post_list
84
+ else
85
+ resource # IE: post
86
+ end
87
+ end
88
+
89
+ def add_root(as)
90
+ @options[:root] ? 'root' : as
91
+ end
92
+ end
93
+ end
@@ -31,6 +31,7 @@ class Jets::Router::Route
31
31
  module ModuleMethods
32
32
  def logical_id(authorizer, prefix_class: true)
33
33
  klass, meth = authorizer.split("#")
34
+ klass += "_authorizer"
34
35
  words = [meth, "authorizer"]
35
36
  words.unshift(klass) if prefix_class
36
37
  words.join('_').camelize # logical_id
@@ -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
+