jets.benforeva 3.0.17.pre.mount.pre.fix

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 (459) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +92 -0
  3. data/.cody/README.md +13 -0
  4. data/.cody/docs/bin/build.sh +7 -0
  5. data/.cody/docs/bin/bundler_setup.sh +8 -0
  6. data/.cody/docs/bin/cli_docs.sh +6 -0
  7. data/.cody/docs/bin/git_commit.sh +27 -0
  8. data/.cody/docs/bin/git_setup.sh +12 -0
  9. data/.cody/docs/bin/subnav.sh +14 -0
  10. data/.cody/docs/buildspec.yml +10 -0
  11. data/.cody/docs/project.rb +10 -0
  12. data/.github/ISSUE_TEMPLATE/bug_report.md +84 -0
  13. data/.github/ISSUE_TEMPLATE/documentation.md +27 -0
  14. data/.github/ISSUE_TEMPLATE/feature_request.md +64 -0
  15. data/.github/ISSUE_TEMPLATE/question.md +14 -0
  16. data/.github/ISSUE_TEMPLATE.md +7 -0
  17. data/.github/PULL_REQUEST_TEMPLATE.md +50 -0
  18. data/.gitignore +24 -0
  19. data/.gitmodules +0 -0
  20. data/.python-version +1 -0
  21. data/.rspec +4 -0
  22. data/.ruby-gemset +1 -0
  23. data/.ruby-version +1 -0
  24. data/CHANGELOG.md +1035 -0
  25. data/CONDUCT.md +1 -0
  26. data/CONTRIBUTING.md +1 -0
  27. data/Dockerfile +16 -0
  28. data/Dockerfile.base +53 -0
  29. data/Gemfile +14 -0
  30. data/Guardfile +22 -0
  31. data/LICENSE.txt +22 -0
  32. data/Procfile +2 -0
  33. data/README.md +212 -0
  34. data/Rakefile +24 -0
  35. data/backers.md +20 -0
  36. data/bin/release +9 -0
  37. data/exe/jets.benforeva +14 -0
  38. data/jets.benforeva.gemspec +71 -0
  39. data/lib/jets/application/defaults.rb +200 -0
  40. data/lib/jets/application.rb +240 -0
  41. data/lib/jets/authorizer/base.rb +36 -0
  42. data/lib/jets/authorizer/dsl.rb +69 -0
  43. data/lib/jets/authorizer/helpers/iam_helper.rb +47 -0
  44. data/lib/jets/autoloaders.rb +112 -0
  45. data/lib/jets/aws_info.rb +111 -0
  46. data/lib/jets/aws_services/global_memoist.rb +57 -0
  47. data/lib/jets/aws_services/s3_bucket.rb +34 -0
  48. data/lib/jets/aws_services/stack_status.rb +64 -0
  49. data/lib/jets/aws_services.rb +95 -0
  50. data/lib/jets/booter.rb +167 -0
  51. data/lib/jets/builders/code_builder.rb +410 -0
  52. data/lib/jets/builders/code_size.rb +57 -0
  53. data/lib/jets/builders/gem_replacer.rb +89 -0
  54. data/lib/jets/builders/handler_generator.rb +186 -0
  55. data/lib/jets/builders/lambda_layer.rb +68 -0
  56. data/lib/jets/builders/md5.rb +60 -0
  57. data/lib/jets/builders/md5_zip.rb +61 -0
  58. data/lib/jets/builders/purger.rb +35 -0
  59. data/lib/jets/builders/rack_packager.rb +51 -0
  60. data/lib/jets/builders/rackup_wrappers/rackup +19 -0
  61. data/lib/jets/builders/rackup_wrappers/rackup.rb +7 -0
  62. data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +16 -0
  63. data/lib/jets/builders/reconfigure_rails.rb +114 -0
  64. data/lib/jets/builders/ruby_packager.rb +235 -0
  65. data/lib/jets/builders/shim_vars/app.rb +78 -0
  66. data/lib/jets/builders/shim_vars/base.rb +25 -0
  67. data/lib/jets/builders/shim_vars/shared.rb +37 -0
  68. data/lib/jets/builders/templates/handler.rb +12 -0
  69. data/lib/jets/builders/tidy.rb +107 -0
  70. data/lib/jets/builders/util.rb +31 -0
  71. data/lib/jets/bundle.rb +88 -0
  72. data/lib/jets/camelizer.rb +4 -0
  73. data/lib/jets/cfn/builders/api_deployment_builder.rb +56 -0
  74. data/lib/jets/cfn/builders/api_gateway_builder.rb +123 -0
  75. data/lib/jets/cfn/builders/api_resources_builder.rb +44 -0
  76. data/lib/jets/cfn/builders/authorizer_builder.rb +67 -0
  77. data/lib/jets/cfn/builders/base_child_builder.rb +69 -0
  78. data/lib/jets/cfn/builders/controller_builder.rb +50 -0
  79. data/lib/jets/cfn/builders/function_builder.rb +14 -0
  80. data/lib/jets/cfn/builders/interface.rb +133 -0
  81. data/lib/jets/cfn/builders/job_builder.rb +14 -0
  82. data/lib/jets/cfn/builders/parent_builder/stagger.rb +34 -0
  83. data/lib/jets/cfn/builders/parent_builder.rb +130 -0
  84. data/lib/jets/cfn/builders/rule_builder.rb +24 -0
  85. data/lib/jets/cfn/builders/shared_builder.rb +14 -0
  86. data/lib/jets/cfn/builders/util/source.rb +21 -0
  87. data/lib/jets/cfn/built_template.rb +15 -0
  88. data/lib/jets/cfn/ship.rb +188 -0
  89. data/lib/jets/cfn/status.rb +10 -0
  90. data/lib/jets/cfn/template_source.rb +61 -0
  91. data/lib/jets/cfn/upload.rb +157 -0
  92. data/lib/jets/cli.rb +208 -0
  93. data/lib/jets/commands/base.rb +145 -0
  94. data/lib/jets/commands/build.rb +252 -0
  95. data/lib/jets/commands/call/anonymous_guesser.rb +96 -0
  96. data/lib/jets/commands/call/autoload_guesser.rb +136 -0
  97. data/lib/jets/commands/call/base_guesser.rb +62 -0
  98. data/lib/jets/commands/call/guesser.rb +48 -0
  99. data/lib/jets/commands/call.rb +182 -0
  100. data/lib/jets/commands/clean/base.rb +24 -0
  101. data/lib/jets/commands/clean/build.rb +13 -0
  102. data/lib/jets/commands/clean/log.rb +111 -0
  103. data/lib/jets/commands/clean.rb +19 -0
  104. data/lib/jets/commands/configure.rb +51 -0
  105. data/lib/jets/commands/console.rb +12 -0
  106. data/lib/jets/commands/db/environment-task.rake +3 -0
  107. data/lib/jets/commands/db/tasks/dummy/app.rb +25 -0
  108. data/lib/jets/commands/db/tasks/dummy/config.rb +14 -0
  109. data/lib/jets/commands/db/tasks.rb +34 -0
  110. data/lib/jets/commands/db.rb +13 -0
  111. data/lib/jets/commands/dbconsole.rb +134 -0
  112. data/lib/jets/commands/delete.rb +136 -0
  113. data/lib/jets/commands/deploy.rb +137 -0
  114. data/lib/jets/commands/dotenv.rb +9 -0
  115. data/lib/jets/commands/dynamodb/migrate.rb +9 -0
  116. data/lib/jets/commands/dynamodb/migrator.rb +36 -0
  117. data/lib/jets/commands/dynamodb.rb +19 -0
  118. data/lib/jets/commands/gems.rb +13 -0
  119. data/lib/jets/commands/help/build.md +6 -0
  120. data/lib/jets/commands/help/call.md +69 -0
  121. data/lib/jets/commands/help/clean/build.md +5 -0
  122. data/lib/jets/commands/help/clean/log.md +5 -0
  123. data/lib/jets/commands/help/console.md +18 -0
  124. data/lib/jets/commands/help/db/generate.md +8 -0
  125. data/lib/jets/commands/help/dbconsole.md +9 -0
  126. data/lib/jets/commands/help/degenerate.md +16 -0
  127. data/lib/jets/commands/help/delete.md +22 -0
  128. data/lib/jets/commands/help/deploy.md +32 -0
  129. data/lib/jets/commands/help/dynamodb/generate.md +52 -0
  130. data/lib/jets/commands/help/dynamodb/migrate.md +4 -0
  131. data/lib/jets/commands/help/gems/check.md +6 -0
  132. data/lib/jets/commands/help/generate.md +28 -0
  133. data/lib/jets/commands/help/import/rack.md +13 -0
  134. data/lib/jets/commands/help/import/rails.md +11 -0
  135. data/lib/jets/commands/help/new.md +42 -0
  136. data/lib/jets/commands/help/routes.md +16 -0
  137. data/lib/jets/commands/help/runner.md +17 -0
  138. data/lib/jets/commands/help/server.md +15 -0
  139. data/lib/jets/commands/help/status.md +14 -0
  140. data/lib/jets/commands/help/upgrade.md +7 -0
  141. data/lib/jets/commands/help/url.md +6 -0
  142. data/lib/jets/commands/help.rb +9 -0
  143. data/lib/jets/commands/import/base.rb +49 -0
  144. data/lib/jets/commands/import/cheatsheet.rb +35 -0
  145. data/lib/jets/commands/import/rack.rb +16 -0
  146. data/lib/jets/commands/import/rails.rb +74 -0
  147. data/lib/jets/commands/import/sequence.rb +90 -0
  148. data/lib/jets/commands/import/templates/config/database.yml +30 -0
  149. data/lib/jets/commands/import/templates/submodules-cheatsheet.md +89 -0
  150. data/lib/jets/commands/import.rb +12 -0
  151. data/lib/jets/commands/main.rb +166 -0
  152. data/lib/jets/commands/markdown/creator.rb +58 -0
  153. data/lib/jets/commands/markdown/index.rb +27 -0
  154. data/lib/jets/commands/markdown/page.rb +125 -0
  155. data/lib/jets/commands/markdown/shell.rb +11 -0
  156. data/lib/jets/commands/new.rb +173 -0
  157. data/lib/jets/commands/rake_command.rb +61 -0
  158. data/lib/jets/commands/rake_tasks.rb +50 -0
  159. data/lib/jets/commands/runner.rb +16 -0
  160. data/lib/jets/commands/sequence.rb +105 -0
  161. data/lib/jets/commands/stack_info.rb +30 -0
  162. data/lib/jets/commands/templates/skeleton/.env.development.tt +3 -0
  163. data/lib/jets/commands/templates/skeleton/.env.test +3 -0
  164. data/lib/jets/commands/templates/skeleton/.env.tt +3 -0
  165. data/lib/jets/commands/templates/skeleton/.gitignore +12 -0
  166. data/lib/jets/commands/templates/skeleton/.jetskeep +1 -0
  167. data/lib/jets/commands/templates/skeleton/.rspec +3 -0
  168. data/lib/jets/commands/templates/skeleton/Gemfile.tt +39 -0
  169. data/lib/jets/commands/templates/skeleton/Procfile +7 -0
  170. data/lib/jets/commands/templates/skeleton/README.md +11 -0
  171. data/lib/jets/commands/templates/skeleton/Rakefile +2 -0
  172. data/lib/jets/commands/templates/skeleton/app/controllers/application_controller.rb +2 -0
  173. data/lib/jets/commands/templates/skeleton/app/helpers/application_helper.rb +2 -0
  174. data/lib/jets/commands/templates/skeleton/app/jobs/application_job.rb +4 -0
  175. data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +2 -0
  176. data/lib/jets/commands/templates/skeleton/app/models/application_record.rb +3 -0
  177. data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +26 -0
  178. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +71 -0
  179. data/lib/jets/commands/templates/skeleton/config/database.yml.tt +27 -0
  180. data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +22 -0
  181. data/lib/jets/commands/templates/skeleton/config/environments/development.rb +7 -0
  182. data/lib/jets/commands/templates/skeleton/config/environments/production.rb +9 -0
  183. data/lib/jets/commands/templates/skeleton/config/environments/test.rb +7 -0
  184. data/lib/jets/commands/templates/skeleton/config/routes.rb +9 -0
  185. data/lib/jets/commands/templates/skeleton/config.ru +5 -0
  186. data/lib/jets/commands/templates/skeleton/db/.gitkeep +0 -0
  187. data/lib/jets/commands/templates/skeleton/public/404.html +67 -0
  188. data/lib/jets/commands/templates/skeleton/public/422.html +67 -0
  189. data/lib/jets/commands/templates/skeleton/public/500.html +66 -0
  190. data/lib/jets/commands/templates/skeleton/public/favicon.ico +0 -0
  191. data/lib/jets/commands/templates/skeleton/public/index.html.tt +91 -0
  192. data/lib/jets/commands/templates/skeleton/spec/controllers/posts_controller_spec.rb +15 -0
  193. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-index.json +51 -0
  194. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-show.json +53 -0
  195. data/lib/jets/commands/templates/skeleton/spec/spec_helper.rb.tt +30 -0
  196. data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +23 -0
  197. data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -0
  198. data/lib/jets/commands/upgrade/templates/bin/webpack +19 -0
  199. data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +19 -0
  200. data/lib/jets/commands/upgrade/version1.rb +136 -0
  201. data/lib/jets/commands/upgrade.rb +105 -0
  202. data/lib/jets/commands/url.rb +69 -0
  203. data/lib/jets/commands/webpacker_template.rb +18 -0
  204. data/lib/jets/controller/authorization.rb +91 -0
  205. data/lib/jets/controller/base.rb +175 -0
  206. data/lib/jets/controller/callbacks.rb +73 -0
  207. data/lib/jets/controller/cookies/jar.rb +269 -0
  208. data/lib/jets/controller/cookies.rb +38 -0
  209. data/lib/jets/controller/error/invalid_authenticity_token.rb +6 -0
  210. data/lib/jets/controller/error.rb +4 -0
  211. data/lib/jets/controller/forgery_protection.rb +43 -0
  212. data/lib/jets/controller/layout.rb +17 -0
  213. data/lib/jets/controller/middleware/cors.rb +60 -0
  214. data/lib/jets/controller/middleware/local/api_gateway.rb +93 -0
  215. data/lib/jets/controller/middleware/local/mimic_aws_call.rb +38 -0
  216. data/lib/jets/controller/middleware/local/route_matcher.rb +22 -0
  217. data/lib/jets/controller/middleware/local.rb +120 -0
  218. data/lib/jets/controller/middleware/main.rb +53 -0
  219. data/lib/jets/controller/middleware/reloader.rb +15 -0
  220. data/lib/jets/controller/middleware/webpacker_setup.rb +6 -0
  221. data/lib/jets/controller/parameters_filter.rb +29 -0
  222. data/lib/jets/controller/params.rb +117 -0
  223. data/lib/jets/controller/rack/adapter.rb +94 -0
  224. data/lib/jets/controller/rack/env.rb +122 -0
  225. data/lib/jets/controller/redirection.rb +51 -0
  226. data/lib/jets/controller/rendering/rack_renderer.rb +267 -0
  227. data/lib/jets/controller/rendering.rb +96 -0
  228. data/lib/jets/controller/request.rb +29 -0
  229. data/lib/jets/controller/response.rb +61 -0
  230. data/lib/jets/controller/stage.rb +34 -0
  231. data/lib/jets/controller.rb +3 -0
  232. data/lib/jets/core.rb +157 -0
  233. data/lib/jets/core_ext/bundler.rb +7 -0
  234. data/lib/jets/core_ext/kernel.rb +13 -0
  235. data/lib/jets/db.rb +15 -0
  236. data/lib/jets/dotenv/show.rb +11 -0
  237. data/lib/jets/dotenv/ssm.rb +64 -0
  238. data/lib/jets/dotenv.rb +48 -0
  239. data/lib/jets/erb.rb +51 -0
  240. data/lib/jets/generator/templates/active_job/job/templates/application_job.rb.tt +6 -0
  241. data/lib/jets/generator/templates/active_job/job/templates/job.rb.tt +8 -0
  242. data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
  243. data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +34 -0
  244. data/lib/jets/generator/templates/erb/scaffold/edit.html.erb +6 -0
  245. data/lib/jets/generator/templates/erb/scaffold/index.html.erb +29 -0
  246. data/lib/jets/generator/templates/erb/scaffold/new.html.erb +5 -0
  247. data/lib/jets/generator/templates/erb/scaffold/show.html.erb +9 -0
  248. data/lib/jets/generator/templates/rails/assets/javascript.js +2 -0
  249. data/lib/jets/generator/templates/rails/assets/stylesheet.css +4 -0
  250. data/lib/jets/generator/templates/rails/controller/controller.rb +13 -0
  251. data/lib/jets/generator/templates/rails/helper/helper.rb +4 -0
  252. data/lib/jets/generator/templates/rails/scaffold/scaffold.css +80 -0
  253. data/lib/jets/generator/templates/rails/scaffold_controller/api_controller.rb +62 -0
  254. data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +79 -0
  255. data/lib/jets/generator.rb +112 -0
  256. data/lib/jets/inflections.rb +32 -0
  257. data/lib/jets/internal/app/controllers/jets/bare_controller.rb +16 -0
  258. data/lib/jets/internal/app/controllers/jets/mailers_controller.rb +97 -0
  259. data/lib/jets/internal/app/controllers/jets/mount_controller.rb +63 -0
  260. data/lib/jets/internal/app/controllers/jets/public_controller.rb +31 -0
  261. data/lib/jets/internal/app/controllers/jets/rack_controller.rb +12 -0
  262. data/lib/jets/internal/app/functions/jets/base_path.rb +18 -0
  263. data/lib/jets/internal/app/functions/jets/base_path_mapping.rb +100 -0
  264. data/lib/jets/internal/app/helpers/jets/mailers_helper.rb +9 -0
  265. data/lib/jets/internal/app/jobs/jets/preheat_job.rb +70 -0
  266. data/lib/jets/internal/app/shared/functions/jets/s3_bucket_config.rb +33 -0
  267. data/lib/jets/internal/app/views/jets/mailers/email.html.erb +145 -0
  268. data/lib/jets/internal/app/views/jets/mailers/index.html.erb +8 -0
  269. data/lib/jets/internal/app/views/jets/mailers/mailer.html.erb +6 -0
  270. data/lib/jets/internal/turbines/jets/mailer.rb +52 -0
  271. data/lib/jets/job/base.rb +49 -0
  272. data/lib/jets/job/dsl/dynamodb_event.rb +67 -0
  273. data/lib/jets/job/dsl/event_source_mapping.rb +11 -0
  274. data/lib/jets/job/dsl/iot_event.rb +24 -0
  275. data/lib/jets/job/dsl/kinesis_event.rb +46 -0
  276. data/lib/jets/job/dsl/log_event.rb +15 -0
  277. data/lib/jets/job/dsl/rule_event.rb +75 -0
  278. data/lib/jets/job/dsl/s3_event.rb +36 -0
  279. data/lib/jets/job/dsl/sns_event.rb +54 -0
  280. data/lib/jets/job/dsl/sqs_event.rb +96 -0
  281. data/lib/jets/job/dsl.rb +40 -0
  282. data/lib/jets/job/helpers/kinesis_event_helper.rb +13 -0
  283. data/lib/jets/job/helpers/log_event_helper.rb +17 -0
  284. data/lib/jets/job/helpers/s3_event_helper.rb +13 -0
  285. data/lib/jets/klass.rb +109 -0
  286. data/lib/jets/lambda/dsl.rb +404 -0
  287. data/lib/jets/lambda/function.rb +29 -0
  288. data/lib/jets/lambda/function_constructor.rb +55 -0
  289. data/lib/jets/lambda/functions.rb +39 -0
  290. data/lib/jets/lambda/task.rb +111 -0
  291. data/lib/jets/logger.rb +21 -0
  292. data/lib/jets/mega/hash_converter.rb +25 -0
  293. data/lib/jets/mega/request/source.rb +21 -0
  294. data/lib/jets/mega/request.rb +163 -0
  295. data/lib/jets/middleware/configurator.rb +84 -0
  296. data/lib/jets/middleware/default_stack.rb +53 -0
  297. data/lib/jets/middleware/layer.rb +34 -0
  298. data/lib/jets/middleware/stack.rb +77 -0
  299. data/lib/jets/middleware.rb +33 -0
  300. data/lib/jets/naming.rb +63 -0
  301. data/lib/jets/overrides/lambda/marshaller.rb +31 -0
  302. data/lib/jets/overrides/lambda.rb +1 -0
  303. data/lib/jets/overrides/rails/action_controller.rb +13 -0
  304. data/lib/jets/overrides/rails/asset_tag_helper.rb +114 -0
  305. data/lib/jets/overrides/rails/common_methods.rb +13 -0
  306. data/lib/jets/overrides/rails/migration_checker.rb +34 -0
  307. data/lib/jets/overrides/rails/rendering_helper.rb +27 -0
  308. data/lib/jets/overrides/rails/url_helper.rb +88 -0
  309. data/lib/jets/overrides/rails.rb +6 -0
  310. data/lib/jets/poly_fun/base_executor.rb +125 -0
  311. data/lib/jets/poly_fun/lambda_executor.rb +16 -0
  312. data/lib/jets/poly_fun/node_error.rb +8 -0
  313. data/lib/jets/poly_fun/node_executor.rb +54 -0
  314. data/lib/jets/poly_fun/python_error.rb +8 -0
  315. data/lib/jets/poly_fun/python_executor.rb +23 -0
  316. data/lib/jets/poly_fun.rb +73 -0
  317. data/lib/jets/preheat.rb +117 -0
  318. data/lib/jets/processors/deducer.rb +65 -0
  319. data/lib/jets/processors/main_processor.rb +61 -0
  320. data/lib/jets/rack_server.rb +86 -0
  321. data/lib/jets/rdoc.rb +30 -0
  322. data/lib/jets/resource/api_gateway/authorizer.rb +82 -0
  323. data/lib/jets/resource/api_gateway/base_path/function.rb +49 -0
  324. data/lib/jets/resource/api_gateway/base_path/mapping.rb +44 -0
  325. data/lib/jets/resource/api_gateway/base_path/role.rb +76 -0
  326. data/lib/jets/resource/api_gateway/cors.rb +61 -0
  327. data/lib/jets/resource/api_gateway/deployment.rb +80 -0
  328. data/lib/jets/resource/api_gateway/domain_name.rb +65 -0
  329. data/lib/jets/resource/api_gateway/method/authorization.rb +41 -0
  330. data/lib/jets/resource/api_gateway/method.rb +102 -0
  331. data/lib/jets/resource/api_gateway/resource.rb +82 -0
  332. data/lib/jets/resource/api_gateway/rest_api/change_detection.rb +10 -0
  333. data/lib/jets/resource/api_gateway/rest_api/logical_id/message.rb +49 -0
  334. data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +98 -0
  335. data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +136 -0
  336. data/lib/jets/resource/api_gateway/rest_api/routes/change/media_types.rb +36 -0
  337. data/lib/jets/resource/api_gateway/rest_api/routes/change/page.rb +93 -0
  338. data/lib/jets/resource/api_gateway/rest_api/routes/change/to.rb +25 -0
  339. data/lib/jets/resource/api_gateway/rest_api/routes/change/variable.rb +35 -0
  340. data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +16 -0
  341. data/lib/jets/resource/api_gateway/rest_api/routes/collision/variable_exception.rb +7 -0
  342. data/lib/jets/resource/api_gateway/rest_api/routes/collision.rb +121 -0
  343. data/lib/jets/resource/api_gateway/rest_api/routes.rb +7 -0
  344. data/lib/jets/resource/api_gateway/rest_api.rb +64 -0
  345. data/lib/jets/resource/associated.rb +37 -0
  346. data/lib/jets/resource/base.rb +28 -0
  347. data/lib/jets/resource/child_stack/api_deployment.rb +58 -0
  348. data/lib/jets/resource/child_stack/api_gateway.rb +23 -0
  349. data/lib/jets/resource/child_stack/api_resource/page.rb +20 -0
  350. data/lib/jets/resource/child_stack/api_resource.rb +54 -0
  351. data/lib/jets/resource/child_stack/app_class.rb +149 -0
  352. data/lib/jets/resource/child_stack/authorizer.rb +40 -0
  353. data/lib/jets/resource/child_stack/base.rb +24 -0
  354. data/lib/jets/resource/child_stack/common_parameters.rb +14 -0
  355. data/lib/jets/resource/child_stack/shared.rb +85 -0
  356. data/lib/jets/resource/config/config_rule.rb +74 -0
  357. data/lib/jets/resource/config/managed_rule.rb +15 -0
  358. data/lib/jets/resource/events/rule.rb +31 -0
  359. data/lib/jets/resource/iam/application_role.rb +27 -0
  360. data/lib/jets/resource/iam/base_role_definition.rb +47 -0
  361. data/lib/jets/resource/iam/class_role.rb +74 -0
  362. data/lib/jets/resource/iam/function_role.rb +54 -0
  363. data/lib/jets/resource/iam/managed_policy.rb +22 -0
  364. data/lib/jets/resource/iam/policy_document.rb +41 -0
  365. data/lib/jets/resource/iot/topic_rule.rb +34 -0
  366. data/lib/jets/resource/lambda/event_source_mapping.rb +31 -0
  367. data/lib/jets/resource/lambda/function/environment.rb +62 -0
  368. data/lib/jets/resource/lambda/function.rb +221 -0
  369. data/lib/jets/resource/lambda/gem_layer.rb +17 -0
  370. data/lib/jets/resource/lambda/layer_version.rb +44 -0
  371. data/lib/jets/resource/logs/subscription_filter.rb +31 -0
  372. data/lib/jets/resource/permission.rb +45 -0
  373. data/lib/jets/resource/replacer.rb +85 -0
  374. data/lib/jets/resource/route53/record_set.rb +98 -0
  375. data/lib/jets/resource/s3/bucket.rb +24 -0
  376. data/lib/jets/resource/sns/subscription.rb +29 -0
  377. data/lib/jets/resource/sns/topic.rb +35 -0
  378. data/lib/jets/resource/sns/topic_policy.rb +40 -0
  379. data/lib/jets/resource/sqs/queue.rb +21 -0
  380. data/lib/jets/resource/standardizer.rb +42 -0
  381. data/lib/jets/resource.rb +71 -0
  382. data/lib/jets/router/dsl/mount.rb +13 -0
  383. data/lib/jets/router/dsl.rb +144 -0
  384. data/lib/jets/router/error.rb +4 -0
  385. data/lib/jets/router/finder.rb +47 -0
  386. data/lib/jets/router/helpers/core_helper.rb +27 -0
  387. data/lib/jets/router/helpers/named_routes_helper.rb +8 -0
  388. data/lib/jets/router/helpers.rb +4 -0
  389. data/lib/jets/router/matcher.rb +81 -0
  390. data/lib/jets/router/method_creator/code.rb +99 -0
  391. data/lib/jets/router/method_creator/edit.rb +12 -0
  392. data/lib/jets/router/method_creator/generic.rb +11 -0
  393. data/lib/jets/router/method_creator/index.rb +48 -0
  394. data/lib/jets/router/method_creator/new.rb +12 -0
  395. data/lib/jets/router/method_creator/root.rb +15 -0
  396. data/lib/jets/router/method_creator/show.rb +12 -0
  397. data/lib/jets/router/method_creator.rb +50 -0
  398. data/lib/jets/router/resources/base.rb +7 -0
  399. data/lib/jets/router/resources/filter.rb +15 -0
  400. data/lib/jets/router/resources/options.rb +13 -0
  401. data/lib/jets/router/route/authorizer.rb +57 -0
  402. data/lib/jets/router/route.rb +230 -0
  403. data/lib/jets/router/scope.rb +95 -0
  404. data/lib/jets/router/util.rb +38 -0
  405. data/lib/jets/router.rb +180 -0
  406. data/lib/jets/rule/base.rb +19 -0
  407. data/lib/jets/rule/dsl.rb +109 -0
  408. data/lib/jets/spec_helpers/controllers/params.rb +8 -0
  409. data/lib/jets/spec_helpers/controllers/request.rb +101 -0
  410. data/lib/jets/spec_helpers/controllers/response.rb +10 -0
  411. data/lib/jets/spec_helpers/controllers.rb +47 -0
  412. data/lib/jets/spec_helpers/fixtures.rb +11 -0
  413. data/lib/jets/spec_helpers.rb +21 -0
  414. data/lib/jets/stack/builder.rb +43 -0
  415. data/lib/jets/stack/definition.rb +50 -0
  416. data/lib/jets/stack/depends/item.rb +26 -0
  417. data/lib/jets/stack/depends.rb +34 -0
  418. data/lib/jets/stack/function.rb +69 -0
  419. data/lib/jets/stack/main/dsl/base.rb +63 -0
  420. data/lib/jets/stack/main/dsl/cloudwatch.rb +19 -0
  421. data/lib/jets/stack/main/dsl/iam.rb +8 -0
  422. data/lib/jets/stack/main/dsl/kinesis.rb +15 -0
  423. data/lib/jets/stack/main/dsl/lambda.rb +83 -0
  424. data/lib/jets/stack/main/dsl/s3.rb +12 -0
  425. data/lib/jets/stack/main/dsl/sns.rb +16 -0
  426. data/lib/jets/stack/main/dsl/sqs.rb +10 -0
  427. data/lib/jets/stack/main/dsl.rb +17 -0
  428. data/lib/jets/stack/main.rb +4 -0
  429. data/lib/jets/stack/output/dsl.rb +19 -0
  430. data/lib/jets/stack/output/lookup.rb +36 -0
  431. data/lib/jets/stack/output.rb +35 -0
  432. data/lib/jets/stack/parameter/dsl.rb +42 -0
  433. data/lib/jets/stack/parameter.rb +37 -0
  434. data/lib/jets/stack/resource/dsl.rb +19 -0
  435. data/lib/jets/stack/resource.rb +31 -0
  436. data/lib/jets/stack/s3_event.rb +87 -0
  437. data/lib/jets/stack.rb +88 -0
  438. data/lib/jets/tmp_loader.rb +53 -0
  439. data/lib/jets/turbine.rb +41 -0
  440. data/lib/jets/turbo/database_yaml.rb +41 -0
  441. data/lib/jets/turbo/project/.gitignore +12 -0
  442. data/lib/jets/turbo/project/.jetskeep +1 -0
  443. data/lib/jets/turbo/project/Gemfile +16 -0
  444. data/lib/jets/turbo/project/Rakefile +2 -0
  445. data/lib/jets/turbo/project/app/controllers/application_controller.rb +2 -0
  446. data/lib/jets/turbo/project/app/helpers/application_helper.rb +2 -0
  447. data/lib/jets/turbo/project/app/jobs/application_job.rb +4 -0
  448. data/lib/jets/turbo/project/config/application.rb +5 -0
  449. data/lib/jets/turbo/project/config/routes.rb +4 -0
  450. data/lib/jets/turbo/project/config.ru +5 -0
  451. data/lib/jets/turbo/rails.rb +127 -0
  452. data/lib/jets/turbo/templates/config/database.yml +30 -0
  453. data/lib/jets/turbo.rb +56 -0
  454. data/lib/jets/util.rb +40 -0
  455. data/lib/jets/version.rb +3 -0
  456. data/lib/jets.rb +31 -0
  457. data/readme/prerelease.md +6 -0
  458. data/readme/testing.md +60 -0
  459. metadata +1105 -0
@@ -0,0 +1,120 @@
1
+ require 'kramdown'
2
+
3
+ # Handles mimicing of API Gateway to Lambda function call locally
4
+ module Jets::Controller::Middleware
5
+ class Local
6
+ extend Memoist
7
+
8
+ def initialize(app)
9
+ @app = app
10
+ end
11
+
12
+ def call(env)
13
+ route = RouteMatcher.new(env).find_route
14
+ unless route
15
+ return [404, {'Content-Type' => 'text/html'}, not_found(env)]
16
+ end
17
+
18
+ mimic = MimicAwsCall.new(route, env)
19
+ # Make @controller and @meth instance available so we dont not have to pass it around.
20
+ @controller, @meth, @event = mimic.controller, mimic.meth, mimic.event
21
+
22
+ if route.to == 'jets/rack#process' # megamode
23
+ # Bypass the Jets middlewares since it could interfere with the Rack
24
+ # application's middleware stack.
25
+ #
26
+ # Rails sends back a transfer-encoding=chunked. Curling Rails directly works,
27
+ # but passing the Rails response back through this middleware results in errors.
28
+ # Disable chunking responses by deleting the transfer-encoding response header.
29
+ # Would like to understand why this happens this better, if someone can explain please let me know.
30
+ status, headers, body = @controller.dispatch! # jets/rack_controller
31
+ headers.delete "transfer-encoding"
32
+ [status, headers, body]
33
+ elsif route.to == 'jets/mount#call' # mount route
34
+ status, headers, body = @controller.dispatch! # jets/mount_controller
35
+ [status, headers, body]
36
+ elsif polymorphic_function?
37
+ run_polymophic_function
38
+ else # Normal Jets request
39
+ mimic_aws_lambda!(env, mimic.vars) unless on_aws?(env)
40
+ @app.call(env)
41
+ end
42
+ end
43
+
44
+ # Never hit when calling polymorphic function on AWS Lambda. Can only get called with the local server.
45
+ def polymorphic_function?
46
+ return false if ENV['_HANDLER'] # slight speed improvement on Lambda
47
+ polymorphic_function.task.lang != :ruby
48
+ end
49
+
50
+ def polymorphic_function
51
+ # Abusing PolyFun to run polymorphic code, should call LambdaExecutor directly
52
+ # after reworking LambdaExecutor so it has a better interface.
53
+ Jets::PolyFun.new(@controller.class, @meth)
54
+ end
55
+ memoize :polymorphic_function
56
+
57
+ def run_polymophic_function
58
+ resp = polymorphic_function.run(@event, @meth) # polymorphic code
59
+ status = resp['statusCode']
60
+ headers = resp['headers']
61
+ body = StringIO.new(resp['body'])
62
+ [status, headers, body] # triplet
63
+ end
64
+
65
+ # Modifies env the in the same way real call from AWS lambda would modify env
66
+ def mimic_aws_lambda!(env, vars)
67
+ env.merge!(vars)
68
+ env
69
+ end
70
+
71
+ def on_aws?(env)
72
+ return false if Jets.env.test? # usually with test we're passing in full API Gateway fixtures with the HTTP_X_AMZN_TRACE_ID
73
+ return false if ENV['JETS_ELB'] # If we're using an ELB and Jets is inside a container running jets server, we don't want to pretend we're on AWS.
74
+ on_cloud9 = !!(env['HTTP_HOST'] =~ /cloud9\..*\.amazonaws\.com/)
75
+ !!env['HTTP_X_AMZN_TRACE_ID'] && !on_cloud9
76
+ end
77
+
78
+ def routes_error_message(env)
79
+ message = "<h2>404 Error: Route #{env['PATH_INFO'].sub('/','')} not found</h2>"
80
+ if Jets.env != "production"
81
+ message << "<p>Here are the routes defined in your application:</p>"
82
+ message << "#{routes_table}"
83
+ end
84
+ message
85
+ end
86
+
87
+ def not_found(env)
88
+ message = routes_error_message(env)
89
+ body = <<~HTML
90
+ <!DOCTYPE html>
91
+ <html>
92
+ <head>
93
+ <meta charset="utf-8">
94
+ <title>Route not found</title>
95
+ </head>
96
+ <body>
97
+ #{message}
98
+ </body>
99
+ </html>
100
+ HTML
101
+ StringIO.new(body)
102
+ end
103
+
104
+ # Show pretty route table for user to help with debugging in non-production mode
105
+ def routes_table
106
+ routes = Jets::Router.routes
107
+
108
+ return "Your routes table is empty." if routes.empty?
109
+
110
+ text = "Verb | Path | Controller#action\n"
111
+ text << "--- | --- | ---\n"
112
+ routes.each do |route|
113
+ text << "#{route.method} | #{route.path} | #{route.to}\n"
114
+ end
115
+ html = Kramdown::Document.new(text).to_html
116
+ puts html
117
+ html
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,53 @@
1
+ # All roads lead here
2
+ #
3
+ # 1. AWS Lambda: PostsController - Rack::Adapter - Jets.application.call
4
+ # 2. Local server: config.ru - run Jet.application - Jets.application.call
5
+ #
6
+ # Then eventually:
7
+ #
8
+ # Jets.application.call - Middleware stack - Jets::Controller::Middleware::Main
9
+ #
10
+ module Jets::Controller::Middleware
11
+ class Main
12
+ def initialize(env)
13
+ @env = env
14
+ @controller = env['jets.controller']
15
+ @event = env['lambda.event']
16
+ @context = env['lambda.context']
17
+ @meth = env['lambda.meth']
18
+ end
19
+
20
+ def call
21
+ ENV['JETS_HOST'] = jets_host # Dirty to use what's essentially a global variable but unsure how else to achieve
22
+ dup.call!
23
+ end
24
+
25
+ def call!
26
+ setup
27
+ @controller.dispatch! # Returns triplet
28
+ end
29
+
30
+ # Common setup logical at this point of middleware processing right before
31
+ # calling any controller actions.
32
+ def setup
33
+ # We already recreated a mimic rack env earlier as part of the very first
34
+ # middleware layer. However, by the time the rack env reaches the main middleware
35
+ # it could had been updated by other middlewares. We update the env here again.
36
+ @controller.request.set_env!(@env)
37
+ # This allows sesison helpers to work. Sessions are managed by
38
+ # the Rack::Session::Cookie middleware by default.
39
+ @controller.session = @env['rack.session'] || {}
40
+ end
41
+
42
+ def jets_host
43
+ protocol = @event.dig('headers', 'X-Forwarded-Proto') || @env['rack.url_scheme']
44
+ default = "#{protocol}://#{@env['HTTP_HOST']}"
45
+ Jets.config.helpers.host || default
46
+ end
47
+
48
+ def self.call(env)
49
+ instance = new(env)
50
+ instance.call
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,15 @@
1
+ module Jets::Controller::Middleware
2
+ class Reloader
3
+ def initialize(app)
4
+ @app = app
5
+ end
6
+
7
+ @@reload_lock = Mutex.new
8
+ def call(env)
9
+ @@reload_lock.synchronize do
10
+ Jets::Autoloaders.main.reload
11
+ @app.call(env)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ # Breaking all the rules to get the beautiful webpacker middleware working
2
+
3
+ require "webpacker"
4
+ require "webpacker/dev_server_proxy"
5
+
6
+ Webpacker.bootstrap # whenever jets server is runs should Webpacker.bootstrap
@@ -0,0 +1,29 @@
1
+ require "active_support/parameter_filter"
2
+
3
+ class Jets::Controller
4
+ class ParametersFilter
5
+ attr_reader :filters, :params_filter
6
+
7
+ def initialize(filters)
8
+ @filters = filters
9
+ @params_filter = ActiveSupport::ParameterFilter.new(filters)
10
+ end
11
+
12
+ def filter(params)
13
+ params && params_filter.filter(params)
14
+ end
15
+
16
+ def filter_json(json_text)
17
+ return json_text if filters.blank? || json_text.blank?
18
+
19
+ begin
20
+ hash_params = JSON.parse(json_text)
21
+ filtered_params = filter(hash_params)
22
+ JSON.dump(filtered_params)
23
+ rescue JSON::ParserError
24
+ String.new
25
+ end
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,117 @@
1
+ require "action_controller/metal/strong_parameters"
2
+ require "action_dispatch"
3
+ require "rack"
4
+
5
+ class Jets::Controller
6
+ module Params
7
+ extend Memoist
8
+
9
+ # Merge all the parameters together for convenience. Users still have
10
+ # access via events.
11
+ #
12
+ # Precedence:
13
+ # 1. path parameters have highest precdence
14
+ # 2. query string parameters
15
+ # 3. body parameters
16
+ def params(raw: false, path_parameters: true, body_parameters: true)
17
+ params = {}
18
+ params = params.deep_merge(body_params) if body_parameters
19
+ params = params.deep_merge(unescape_recursively(query_params)) # always
20
+ params = params.deep_merge(path_params) if path_parameters
21
+
22
+ if raw
23
+ params
24
+ else
25
+ params = ActionDispatch::Request::Utils.normalize_encode_params(params) # for file uploads
26
+ ActionController::Parameters.new(params)
27
+ end
28
+ end
29
+
30
+ def unescape_recursively(obj)
31
+ case obj
32
+ when Hash then obj.map { |k, v| [k, unescape_recursively(v)] }.to_h
33
+ when Array then obj.map { |v| unescape_recursively(v) }
34
+ else CGI.unescape(obj.to_s)
35
+ end
36
+ end
37
+
38
+ def filtered_parameters(**kwargs)
39
+ parameter_filter.filter params(**kwargs, raw: true) # Always filter raw hash
40
+ end
41
+
42
+ def path_params
43
+ path_params = event["pathParameters"] || {}
44
+ path_params = path_params.map { |k, path| [k, CGI.unescape(path)] }.to_h
45
+ end
46
+ alias_method :path_parameters, :path_params
47
+
48
+ def query_params
49
+ event["queryStringParameters"] || {}
50
+ end
51
+ alias_method :query_parameters, :query_params
52
+
53
+ def request_params
54
+ {
55
+ controller: controller_name,
56
+ action: action_name,
57
+ }
58
+ end
59
+ alias_method :request_parameters, :request_params
60
+
61
+ def body_params
62
+ body = event['isBase64Encoded'] ? base64_decode(event["body"]) : event["body"]
63
+ return {} if body.nil?
64
+
65
+ parsed_json = parse_json(body)
66
+ return parsed_json if parsed_json
67
+
68
+ headers = event["headers"] || {}
69
+ # API Gateway seems to use either: content-type or Content-Type
70
+ headers = headers.transform_keys { |key| key.downcase }
71
+ content_type = headers["content-type"]
72
+
73
+ if content_type.to_s.include?("application/x-www-form-urlencoded")
74
+ return ::Rack::Utils.parse_nested_query(body)
75
+ elsif content_type.to_s.include?("multipart/form-data")
76
+ return parse_multipart(body)
77
+ end
78
+
79
+ {} # fallback to empty Hash
80
+ end
81
+ memoize :body_params
82
+ alias_method :body_parameters, :body_params
83
+
84
+ private
85
+
86
+ def parse_multipart(body)
87
+ boundary = ::Rack::Multipart::Parser.parse_boundary(headers["content-type"])
88
+ options = multipart_options(body, boundary)
89
+ env = ::Rack::MockRequest.env_for("/", options)
90
+ ::Rack::Multipart.parse_multipart(env) # params Hash
91
+ end
92
+
93
+ def multipart_options(data, boundary = "AaB03x")
94
+ type = %(multipart/form-data; boundary=#{boundary})
95
+ length = data.bytesize
96
+
97
+ { "CONTENT_TYPE" => type,
98
+ "CONTENT_LENGTH" => length.to_s,
99
+ :input => StringIO.new(data) }
100
+ end
101
+
102
+ def parse_json(text)
103
+ JSON.parse(text)
104
+ rescue JSON::ParserError
105
+ nil
106
+ end
107
+
108
+ def base64_decode(body)
109
+ return nil if body.nil?
110
+ Base64.decode64(body)
111
+ end
112
+
113
+ def parameter_filter
114
+ @parameter_filter ||= ParametersFilter.new Jets.config.controllers.filtered_parameters
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,94 @@
1
+ require 'base64'
2
+
3
+ module Jets::Controller::Rack
4
+ class Adapter
5
+ extend Memoist
6
+
7
+ # Returns back API Gateway response hash structure
8
+ def self.process(event, context, meth)
9
+ adapter = new(event, context, meth)
10
+ adapter.process
11
+ end
12
+
13
+ def initialize(event, context, meth)
14
+ @event, @context, @meth = event, context, meth
15
+ end
16
+
17
+ # 1. Convert API Gateway event event to Rack env
18
+ # 2. Process using full Rack middleware stack
19
+ # 3. Convert back to API gateway response structure payload
20
+ def process
21
+ status, headers, body = Jets.application.call(env)
22
+ convert_to_api_gateway(status, headers, body)
23
+ end
24
+
25
+ def env
26
+ Env.new(@event, @context, adapter: true).convert # convert to Rack env
27
+ end
28
+ memoize :env
29
+
30
+ # Transform the structure to AWS_PROXY compatible structure
31
+ # http://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-output-format
32
+ def convert_to_api_gateway(status, headers, body)
33
+ base64 = headers["x-jets-base64"] == 'yes'
34
+ body = body.respond_to?(:read) ? body.read : body
35
+ body = Base64.encode64(body) if base64
36
+
37
+ {}.tap do |resp|
38
+ resp['statusCode'] = status
39
+ resp['body'] = body
40
+ resp['isBase64Encoded'] = base64
41
+ add_response_headers(resp, headers)
42
+ adjust_for_elb(resp)
43
+ end
44
+ end
45
+
46
+ def add_response_headers(resp, headers)
47
+ resp['headers'] = headers.reject { |_, val| val.is_a?(Array) }
48
+ multi_value_headers = headers.select { |_, val| val.is_a?(Array) }
49
+
50
+ resp['multiValueHeaders'] = multi_value_headers unless multi_value_headers.blank?
51
+ end
52
+
53
+ # Note: ELB is not officially support. This is just in case users wish to manually
54
+ # connect ELBs to the functions created by Jets.
55
+ def adjust_for_elb(resp)
56
+ return resp unless from_elb?
57
+
58
+ # ELB requires statusCode to be an Integer whereas API Gateway requires statusCode to be a String
59
+ status = resp["statusCode"] = resp["statusCode"].to_i
60
+
61
+ # ELB also requires statusDescription attribute
62
+ status_desc = Rack::Utils::HTTP_STATUS_CODES[status]
63
+ status_desc = status_desc.nil? ? status.to_s : "#{status} #{status_desc}"
64
+ resp["statusDescription"] = status_desc
65
+
66
+ resp
67
+ end
68
+
69
+ def from_elb?
70
+ # NOTE: @event["requestContext"]["elb"] is set when the request is coming from an elb
71
+ # Can set JETS_ELB=1 for local testing
72
+ @event["requestContext"] && @event["requestContext"]["elb"] || ENV['JETS_ELB']
73
+ end
74
+
75
+ # Called from Jets::Controller::Base.process. Example:
76
+ #
77
+ # adapter.rack_vars(
78
+ # 'jets.controller' => self,
79
+ # 'lambda.context' => context,
80
+ # 'lambda.event' => event,
81
+ # 'lambda.meth' => meth,
82
+ # )
83
+ #
84
+ # Passes a these special variables so we have access to them in the middleware.
85
+ # The controller instance is called in the Main middleware.
86
+ # The lambda.* info is used by the Rack::Local middleware to create a mimiced
87
+ # controller for the local server.
88
+ #
89
+ def rack_vars(vars)
90
+ env.merge!(vars)
91
+ end
92
+
93
+ end
94
+ end
@@ -0,0 +1,122 @@
1
+ require 'rack'
2
+ require 'base64'
3
+
4
+ # Takes an ApiGateway event and converts it to an Rack env that can be used for
5
+ # rack.call(env).
6
+ module Jets::Controller::Rack
7
+ class Env
8
+ def initialize(event, context, options={})
9
+ @event, @context, @options = event, context, options
10
+ end
11
+
12
+ def convert
13
+ options = {}
14
+ options = add_top_level(options)
15
+ options = add_http_headers(options)
16
+ path = path_with_base_path || @event['path'] || '/' # always set by API Gateway but might not be when testing shim, so setting it to make testing easier
17
+
18
+ env = Rack::MockRequest.env_for(path, options)
19
+ if @options[:adapter]
20
+ env['adapter.event'] = @event
21
+ env['adapter.context'] = @context
22
+ end
23
+ env
24
+ end
25
+
26
+ private
27
+ def path_with_base_path
28
+ resource = @event['resource']
29
+ pathParameters = @event['pathParameters']
30
+
31
+ if(!pathParameters.nil? and !resource.nil?)
32
+ resource = pathParameters.reduce(resource) {|resource, parameter|
33
+ key, value = parameter
34
+ resource = resource.gsub("{#{key}+}", value)
35
+ resource = resource.gsub("{#{key}}", value)
36
+ resource
37
+ }
38
+ end
39
+
40
+ resource
41
+ end
42
+
43
+ def add_top_level(options)
44
+ map = {
45
+ 'CONTENT_TYPE' => content_type,
46
+ 'QUERY_STRING' => query_string,
47
+ 'REMOTE_ADDR' => headers['X-Forwarded-For'],
48
+ 'REMOTE_HOST' => headers['Host'],
49
+ 'REQUEST_METHOD' => @event['httpMethod'] || 'GET', # useful to default to GET when testing with Lambda console
50
+ 'REQUEST_PATH' => @event['path'],
51
+ 'REQUEST_URI' => request_uri,
52
+ 'SCRIPT_NAME' => "",
53
+ 'SERVER_NAME' => headers['Host'],
54
+ 'SERVER_PORT' => headers['X-Forwarded-Port'],
55
+ 'SERVER_PROTOCOL' => "HTTP/1.1", # unsure if this should be set
56
+ 'SERVER_SOFTWARE' => "WEBrick/1.3.1 (Ruby/2.2.2/2015-04-13)",
57
+ }
58
+
59
+ map['CONTENT_LENGTH'] = content_length if content_length
60
+ # Even if not set, Rack always assigns an StringIO to "rack.input"
61
+ map['rack.input'] = StringIO.new(body) if body
62
+
63
+ options.merge(map)
64
+ end
65
+
66
+ def content_type
67
+ headers['Content-Type'] || Jets::Controller::DEFAULT_CONTENT_TYPE
68
+ end
69
+
70
+ def content_length
71
+ bytesize = body.bytesize.to_s if body
72
+ headers['Content-Length'] || bytesize
73
+ end
74
+
75
+ # Decoding base64 from API Gateaway if necessary
76
+ # Rack will be none the wiser
77
+ def body
78
+ if @event['isBase64Encoded']
79
+ Base64.decode64(@event['body'])
80
+ else
81
+ @event['body']
82
+ end
83
+ end
84
+
85
+ def add_http_headers(options)
86
+ headers.each do |k,v|
87
+ # content-type => HTTP_CONTENT_TYPE
88
+ key = k.gsub('-','_').upcase
89
+ key = "HTTP_#{key}"
90
+ options[key] = v
91
+ end
92
+ options
93
+ end
94
+
95
+ def request_uri
96
+ # IE: "http://localhost:8888/posts/tung/edit?foo=bar"
97
+ proto = headers['X-Forwarded-Proto']
98
+ host = headers['Host']
99
+ port = headers['X-Forwarded-Port']
100
+
101
+ # Add port if needed
102
+ if proto == 'https' && port != '443' or
103
+ proto == 'http' && port != '80'
104
+ host = "#{host}:#{port}"
105
+ end
106
+
107
+ path = @event['path']
108
+ qs = "?#{query_string}" unless query_string.empty?
109
+ "#{proto}://#{host}#{path}#{qs}"
110
+ end
111
+
112
+ def query_string
113
+ qs_params = @event["queryStringParameters"] || {} # always set with API Gateway but when testing node shim might not be
114
+ hash = Jets::Mega::HashConverter.encode(qs_params)
115
+ hash.to_query
116
+ end
117
+
118
+ def headers
119
+ @event['headers'] || {}
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,51 @@
1
+ class Jets::Controller
2
+ module Redirection
3
+ # redirect_to "/posts", :status => 301
4
+ # redirect_to :action=>'atom', :status => 302
5
+ def redirect_to(url, options={})
6
+ unless url.is_a?(String)
7
+ raise "redirect_to url parameter must be a String. Please pass in a string"
8
+ end
9
+
10
+ redirect_url = add_stage(url)
11
+ redirect_url = ensure_protocol(redirect_url)
12
+
13
+ aws_proxy = Rendering::RackRenderer.new(self,
14
+ status: options[:status] || 302,
15
+ headers: { "Location" => redirect_url },
16
+ body: "",
17
+ isBase64Encoded: false,
18
+ )
19
+ resp = aws_proxy.render
20
+ # redirect is a type of rendering
21
+ @rendered = true
22
+ @rendered_data = resp
23
+ end
24
+
25
+ def redirect_back(fallback_location: '/')
26
+ location = request.headers["referer"] || fallback_location
27
+ redirect_to(location)
28
+ end
29
+
30
+ def ensure_protocol(url)
31
+ return url if url.starts_with?('http')
32
+
33
+ # annoying but the request payload is different with localhost/rack vs
34
+ # api gateway
35
+ # check out:
36
+ # spec/fixtures/dumps/api_gateway/posts/create.json
37
+ # spec/fixtures/dumps/rack/posts/create.json
38
+ protocol = if headers["x-forwarded-proto"] # API Gateway
39
+ headers["x-forwarded-proto"]
40
+ elsif headers["origin"] # Rack / localhost
41
+ URI.parse(headers["origin"]).scheme
42
+ else
43
+ "http" # fallback. Capybara / Selenium tests
44
+ end
45
+
46
+ raise "Invalid protocol #{protocol}" unless protocol.starts_with?('http')
47
+
48
+ "#{protocol}://#{url}"
49
+ end
50
+ end
51
+ end