jets_bb_fork 0.0.4

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 (398) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/bin/commit_docs.sh +26 -0
  3. data/.circleci/config.yml +126 -0
  4. data/.codebuild/README.md +68 -0
  5. data/.codebuild/bin/jets +3 -0
  6. data/.codebuild/buildspec-base.yml +14 -0
  7. data/.codebuild/integration.sh +72 -0
  8. data/.codebuild/jets.postman_collection.json +323 -0
  9. data/.codebuild/scripts/install-docker.sh +12 -0
  10. data/.codebuild/scripts/install-dynamodb-local.sh +22 -0
  11. data/.codebuild/scripts/install-java.sh +22 -0
  12. data/.codebuild/scripts/install-node.sh +4 -0
  13. data/.github/ISSUE_TEMPLATE.md +7 -0
  14. data/.github/ISSUE_TEMPLATE/bug_report.md +84 -0
  15. data/.github/ISSUE_TEMPLATE/documentation.md +27 -0
  16. data/.github/ISSUE_TEMPLATE/feature_request.md +64 -0
  17. data/.github/ISSUE_TEMPLATE/question.md +16 -0
  18. data/.github/PULL_REQUEST_TEMPLATE.md +42 -0
  19. data/.gitignore +24 -0
  20. data/.gitmodules +0 -0
  21. data/.python-version +1 -0
  22. data/.rspec +4 -0
  23. data/.ruby-version +1 -0
  24. data/CHANGELOG.md +734 -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 +203 -0
  34. data/Rakefile +24 -0
  35. data/backers.md +16 -0
  36. data/bin/release +9 -0
  37. data/buildspec.yml +18 -0
  38. data/exe/jets_bb_fork +14 -0
  39. data/jets.gemspec +68 -0
  40. data/lib/jets.rb +27 -0
  41. data/lib/jets/application.rb +216 -0
  42. data/lib/jets/application/defaults.rb +172 -0
  43. data/lib/jets/autoloaders.rb +97 -0
  44. data/lib/jets/aws_info.rb +113 -0
  45. data/lib/jets/aws_services.rb +65 -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 +59 -0
  49. data/lib/jets/booter.rb +119 -0
  50. data/lib/jets/builders/code_builder.rb +399 -0
  51. data/lib/jets/builders/code_size.rb +57 -0
  52. data/lib/jets/builders/gem_replacer.rb +76 -0
  53. data/lib/jets/builders/handler_generator.rb +186 -0
  54. data/lib/jets/builders/lambda_layer.rb +69 -0
  55. data/lib/jets/builders/md5.rb +60 -0
  56. data/lib/jets/builders/md5_zip.rb +61 -0
  57. data/lib/jets/builders/purger.rb +35 -0
  58. data/lib/jets/builders/rack_packager.rb +51 -0
  59. data/lib/jets/builders/rackup_wrappers/rackup +19 -0
  60. data/lib/jets/builders/rackup_wrappers/rackup.rb +7 -0
  61. data/lib/jets/builders/reconfigure_rails.rb +114 -0
  62. data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +16 -0
  63. data/lib/jets/builders/ruby_packager.rb +207 -0
  64. data/lib/jets/builders/shim_vars/app.rb +78 -0
  65. data/lib/jets/builders/shim_vars/base.rb +25 -0
  66. data/lib/jets/builders/shim_vars/shared.rb +37 -0
  67. data/lib/jets/builders/templates/handler.rb +12 -0
  68. data/lib/jets/builders/tidy.rb +107 -0
  69. data/lib/jets/builders/util.rb +31 -0
  70. data/lib/jets/bundle.rb +82 -0
  71. data/lib/jets/camelizer.rb +71 -0
  72. data/lib/jets/cfn/builders/api_deployment_builder.rb +63 -0
  73. data/lib/jets/cfn/builders/api_gateway_builder.rb +157 -0
  74. data/lib/jets/cfn/builders/base_child_builder.rb +75 -0
  75. data/lib/jets/cfn/builders/controller_builder.rb +42 -0
  76. data/lib/jets/cfn/builders/function_builder.rb +14 -0
  77. data/lib/jets/cfn/builders/interface.rb +137 -0
  78. data/lib/jets/cfn/builders/job_builder.rb +14 -0
  79. data/lib/jets/cfn/builders/paged.rb +37 -0
  80. data/lib/jets/cfn/builders/parent_builder.rb +100 -0
  81. data/lib/jets/cfn/builders/rule_builder.rb +24 -0
  82. data/lib/jets/cfn/builders/shared_builder.rb +14 -0
  83. data/lib/jets/cfn/ship.rb +185 -0
  84. data/lib/jets/cfn/status.rb +212 -0
  85. data/lib/jets/cfn/upload.rb +139 -0
  86. data/lib/jets/cli.rb +194 -0
  87. data/lib/jets/commands/base.rb +146 -0
  88. data/lib/jets/commands/build.rb +234 -0
  89. data/lib/jets/commands/call.rb +169 -0
  90. data/lib/jets/commands/call/anonymous_guesser.rb +96 -0
  91. data/lib/jets/commands/call/autoload_guesser.rb +136 -0
  92. data/lib/jets/commands/call/base_guesser.rb +60 -0
  93. data/lib/jets/commands/call/guesser.rb +48 -0
  94. data/lib/jets/commands/clean.rb +19 -0
  95. data/lib/jets/commands/clean/base.rb +24 -0
  96. data/lib/jets/commands/clean/build.rb +13 -0
  97. data/lib/jets/commands/clean/log.rb +107 -0
  98. data/lib/jets/commands/console.rb +12 -0
  99. data/lib/jets/commands/db.rb +13 -0
  100. data/lib/jets/commands/db/environment-task.rake +3 -0
  101. data/lib/jets/commands/db/tasks.rb +44 -0
  102. data/lib/jets/commands/dbconsole.rb +131 -0
  103. data/lib/jets/commands/delete.rb +143 -0
  104. data/lib/jets/commands/deploy.rb +141 -0
  105. data/lib/jets/commands/dynamodb.rb +19 -0
  106. data/lib/jets/commands/dynamodb/migrate.rb +9 -0
  107. data/lib/jets/commands/dynamodb/migrator.rb +36 -0
  108. data/lib/jets/commands/gems.rb +21 -0
  109. data/lib/jets/commands/help.rb +9 -0
  110. data/lib/jets/commands/help/build.md +6 -0
  111. data/lib/jets/commands/help/call.md +61 -0
  112. data/lib/jets/commands/help/clean/build.md +5 -0
  113. data/lib/jets/commands/help/clean/log.md +5 -0
  114. data/lib/jets/commands/help/console.md +18 -0
  115. data/lib/jets/commands/help/db/generate.md +8 -0
  116. data/lib/jets/commands/help/dbconsole.md +9 -0
  117. data/lib/jets/commands/help/delete.md +22 -0
  118. data/lib/jets/commands/help/deploy.md +32 -0
  119. data/lib/jets/commands/help/destroy.md +16 -0
  120. data/lib/jets/commands/help/dynamodb/generate.md +52 -0
  121. data/lib/jets/commands/help/dynamodb/migrate.md +4 -0
  122. data/lib/jets/commands/help/gems/check.md +8 -0
  123. data/lib/jets/commands/help/generate.md +22 -0
  124. data/lib/jets/commands/help/import/rack.md +13 -0
  125. data/lib/jets/commands/help/import/rails.md +11 -0
  126. data/lib/jets/commands/help/new.md +42 -0
  127. data/lib/jets/commands/help/routes.md +16 -0
  128. data/lib/jets/commands/help/runner.md +17 -0
  129. data/lib/jets/commands/help/server.md +15 -0
  130. data/lib/jets/commands/help/status.md +14 -0
  131. data/lib/jets/commands/help/upgrade.md +5 -0
  132. data/lib/jets/commands/help/url.md +6 -0
  133. data/lib/jets/commands/import.rb +12 -0
  134. data/lib/jets/commands/import/base.rb +49 -0
  135. data/lib/jets/commands/import/cheatsheet.rb +35 -0
  136. data/lib/jets/commands/import/rack.rb +16 -0
  137. data/lib/jets/commands/import/rails.rb +74 -0
  138. data/lib/jets/commands/import/sequence.rb +90 -0
  139. data/lib/jets/commands/import/templates/config/database.yml +26 -0
  140. data/lib/jets/commands/import/templates/submodules-cheatsheet.md +89 -0
  141. data/lib/jets/commands/main.rb +157 -0
  142. data/lib/jets/commands/markdown/creator.rb +58 -0
  143. data/lib/jets/commands/markdown/index.rb +27 -0
  144. data/lib/jets/commands/markdown/page.rb +125 -0
  145. data/lib/jets/commands/markdown/shell.rb +11 -0
  146. data/lib/jets/commands/new.rb +157 -0
  147. data/lib/jets/commands/rake_command.rb +61 -0
  148. data/lib/jets/commands/rake_tasks.rb +46 -0
  149. data/lib/jets/commands/runner.rb +16 -0
  150. data/lib/jets/commands/sequence.rb +99 -0
  151. data/lib/jets/commands/stack_info.rb +30 -0
  152. data/lib/jets/commands/templates/skeleton/.gitignore +12 -0
  153. data/lib/jets/commands/templates/skeleton/.jetskeep +1 -0
  154. data/lib/jets/commands/templates/skeleton/.rspec +3 -0
  155. data/lib/jets/commands/templates/skeleton/Gemfile.tt +38 -0
  156. data/lib/jets/commands/templates/skeleton/Procfile +7 -0
  157. data/lib/jets/commands/templates/skeleton/README.md +11 -0
  158. data/lib/jets/commands/templates/skeleton/Rakefile +2 -0
  159. data/lib/jets/commands/templates/skeleton/app/controllers/application_controller.rb +2 -0
  160. data/lib/jets/commands/templates/skeleton/app/helpers/application_helper.rb +2 -0
  161. data/lib/jets/commands/templates/skeleton/app/jobs/application_job.rb +4 -0
  162. data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +2 -0
  163. data/lib/jets/commands/templates/skeleton/app/models/application_record.rb +3 -0
  164. data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +25 -0
  165. data/lib/jets/commands/templates/skeleton/config.ru +5 -0
  166. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +67 -0
  167. data/lib/jets/commands/templates/skeleton/config/database.yml.tt +26 -0
  168. data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +22 -0
  169. data/lib/jets/commands/templates/skeleton/config/environments/development.rb +7 -0
  170. data/lib/jets/commands/templates/skeleton/config/environments/production.rb +9 -0
  171. data/lib/jets/commands/templates/skeleton/config/environments/test.rb +7 -0
  172. data/lib/jets/commands/templates/skeleton/config/routes.rb +9 -0
  173. data/lib/jets/commands/templates/skeleton/db/.gitkeep +0 -0
  174. data/lib/jets/commands/templates/skeleton/public/404.html +67 -0
  175. data/lib/jets/commands/templates/skeleton/public/422.html +67 -0
  176. data/lib/jets/commands/templates/skeleton/public/500.html +66 -0
  177. data/lib/jets/commands/templates/skeleton/public/favicon.ico +0 -0
  178. data/lib/jets/commands/templates/skeleton/public/index.html.tt +91 -0
  179. data/lib/jets/commands/templates/skeleton/spec/controllers/posts_controller_spec.rb +15 -0
  180. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-index.json +51 -0
  181. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-show.json +53 -0
  182. data/lib/jets/commands/templates/skeleton/spec/spec_helper.rb.tt +30 -0
  183. data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +14 -0
  184. data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -0
  185. data/lib/jets/commands/templates/webpacker/app/javascript/src/jets/crud.js +87 -0
  186. data/lib/jets/commands/upgrade.rb +145 -0
  187. data/lib/jets/commands/upgrade/templates/bin/webpack +19 -0
  188. data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +19 -0
  189. data/lib/jets/commands/url.rb +68 -0
  190. data/lib/jets/commands/webpacker_template.rb +18 -0
  191. data/lib/jets/controller.rb +3 -0
  192. data/lib/jets/controller/base.rb +108 -0
  193. data/lib/jets/controller/callbacks.rb +68 -0
  194. data/lib/jets/controller/cookies.rb +38 -0
  195. data/lib/jets/controller/cookies/jar.rb +269 -0
  196. data/lib/jets/controller/layout.rb +17 -0
  197. data/lib/jets/controller/middleware/cors.rb +60 -0
  198. data/lib/jets/controller/middleware/local.rb +116 -0
  199. data/lib/jets/controller/middleware/local/api_gateway.rb +93 -0
  200. data/lib/jets/controller/middleware/local/mimic_aws_call.rb +38 -0
  201. data/lib/jets/controller/middleware/local/route_matcher.rb +106 -0
  202. data/lib/jets/controller/middleware/main.rb +46 -0
  203. data/lib/jets/controller/middleware/reloader.rb +15 -0
  204. data/lib/jets/controller/middleware/webpacker_setup.rb +6 -0
  205. data/lib/jets/controller/params.rb +87 -0
  206. data/lib/jets/controller/rack/adapter.rb +88 -0
  207. data/lib/jets/controller/rack/env.rb +105 -0
  208. data/lib/jets/controller/redirection.rb +55 -0
  209. data/lib/jets/controller/rendering.rb +79 -0
  210. data/lib/jets/controller/rendering/rack_renderer.rb +250 -0
  211. data/lib/jets/controller/request.rb +29 -0
  212. data/lib/jets/controller/response.rb +61 -0
  213. data/lib/jets/controller/stage.rb +33 -0
  214. data/lib/jets/core.rb +149 -0
  215. data/lib/jets/core_ext/kernel.rb +13 -0
  216. data/lib/jets/db.rb +15 -0
  217. data/lib/jets/dotenv.rb +48 -0
  218. data/lib/jets/dotenv/ssm.rb +48 -0
  219. data/lib/jets/erb.rb +51 -0
  220. data/lib/jets/generator.rb +48 -0
  221. data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
  222. data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +39 -0
  223. data/lib/jets/generator/templates/erb/scaffold/edit.html.erb +6 -0
  224. data/lib/jets/generator/templates/erb/scaffold/index.html.erb +29 -0
  225. data/lib/jets/generator/templates/erb/scaffold/new.html.erb +5 -0
  226. data/lib/jets/generator/templates/erb/scaffold/show.html.erb +9 -0
  227. data/lib/jets/generator/templates/rails/assets/javascript.js +2 -0
  228. data/lib/jets/generator/templates/rails/assets/stylesheet.css +4 -0
  229. data/lib/jets/generator/templates/rails/controller/controller.rb +13 -0
  230. data/lib/jets/generator/templates/rails/helper/helper.rb +4 -0
  231. data/lib/jets/generator/templates/rails/scaffold/scaffold.css +80 -0
  232. data/lib/jets/generator/templates/rails/scaffold_controller/api_controller.rb +62 -0
  233. data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +79 -0
  234. data/lib/jets/inflections.rb +32 -0
  235. data/lib/jets/internal/app/controllers/jets/mailers_controller.rb +97 -0
  236. data/lib/jets/internal/app/controllers/jets/public_controller.rb +31 -0
  237. data/lib/jets/internal/app/controllers/jets/rack_controller.rb +25 -0
  238. data/lib/jets/internal/app/functions/jets/base_path.rb +157 -0
  239. data/lib/jets/internal/app/helpers/jets/mailers_helper.rb +9 -0
  240. data/lib/jets/internal/app/jobs/jets/preheat_job.rb +70 -0
  241. data/lib/jets/internal/app/shared/functions/jets/s3_bucket_config.rb +43 -0
  242. data/lib/jets/internal/app/views/jets/mailers/email.html.erb +145 -0
  243. data/lib/jets/internal/app/views/jets/mailers/index.html.erb +8 -0
  244. data/lib/jets/internal/app/views/jets/mailers/mailer.html.erb +6 -0
  245. data/lib/jets/internal/turbines/jets/mailer.rb +51 -0
  246. data/lib/jets/job/base.rb +39 -0
  247. data/lib/jets/job/dsl.rb +40 -0
  248. data/lib/jets/job/dsl/dynamodb_event.rb +65 -0
  249. data/lib/jets/job/dsl/event_source_mapping.rb +11 -0
  250. data/lib/jets/job/dsl/iot_event.rb +24 -0
  251. data/lib/jets/job/dsl/kinesis_event.rb +46 -0
  252. data/lib/jets/job/dsl/log_event.rb +15 -0
  253. data/lib/jets/job/dsl/rule_event.rb +75 -0
  254. data/lib/jets/job/dsl/s3_event.rb +36 -0
  255. data/lib/jets/job/dsl/sns_event.rb +54 -0
  256. data/lib/jets/job/dsl/sqs_event.rb +96 -0
  257. data/lib/jets/job/helpers/kinesis_event_helper.rb +13 -0
  258. data/lib/jets/job/helpers/log_event_helper.rb +17 -0
  259. data/lib/jets/job/helpers/s3_event_helper.rb +13 -0
  260. data/lib/jets/klass.rb +109 -0
  261. data/lib/jets/lambda/dsl.rb +419 -0
  262. data/lib/jets/lambda/function.rb +29 -0
  263. data/lib/jets/lambda/function_constructor.rb +55 -0
  264. data/lib/jets/lambda/functions.rb +34 -0
  265. data/lib/jets/lambda/task.rb +111 -0
  266. data/lib/jets/logger.rb +21 -0
  267. data/lib/jets/mega/hash_converter.rb +25 -0
  268. data/lib/jets/mega/request.rb +139 -0
  269. data/lib/jets/mega/request/source.rb +21 -0
  270. data/lib/jets/middleware.rb +33 -0
  271. data/lib/jets/middleware/configurator.rb +84 -0
  272. data/lib/jets/middleware/default_stack.rb +51 -0
  273. data/lib/jets/middleware/layer.rb +34 -0
  274. data/lib/jets/middleware/stack.rb +77 -0
  275. data/lib/jets/naming.rb +49 -0
  276. data/lib/jets/overrides/lambda.rb +1 -0
  277. data/lib/jets/overrides/lambda/marshaller.rb +31 -0
  278. data/lib/jets/overrides/rails.rb +4 -0
  279. data/lib/jets/overrides/rails/asset_tag_helper.rb +114 -0
  280. data/lib/jets/overrides/rails/common_methods.rb +13 -0
  281. data/lib/jets/overrides/rails/rendering_helper.rb +26 -0
  282. data/lib/jets/overrides/rails/url_helper.rb +25 -0
  283. data/lib/jets/poly_fun.rb +73 -0
  284. data/lib/jets/poly_fun/base_executor.rb +125 -0
  285. data/lib/jets/poly_fun/lambda_executor.rb +16 -0
  286. data/lib/jets/poly_fun/node_error.rb +8 -0
  287. data/lib/jets/poly_fun/node_executor.rb +54 -0
  288. data/lib/jets/poly_fun/python_error.rb +8 -0
  289. data/lib/jets/poly_fun/python_executor.rb +23 -0
  290. data/lib/jets/preheat.rb +117 -0
  291. data/lib/jets/processors/deducer.rb +65 -0
  292. data/lib/jets/processors/main_processor.rb +61 -0
  293. data/lib/jets/rack_server.rb +86 -0
  294. data/lib/jets/rdoc.rb +30 -0
  295. data/lib/jets/resource.rb +71 -0
  296. data/lib/jets/resource/api_gateway/base_path/function.rb +42 -0
  297. data/lib/jets/resource/api_gateway/base_path/mapping.rb +44 -0
  298. data/lib/jets/resource/api_gateway/base_path/role.rb +76 -0
  299. data/lib/jets/resource/api_gateway/cors.rb +61 -0
  300. data/lib/jets/resource/api_gateway/deployment.rb +78 -0
  301. data/lib/jets/resource/api_gateway/domain_name.rb +59 -0
  302. data/lib/jets/resource/api_gateway/method.rb +98 -0
  303. data/lib/jets/resource/api_gateway/resource.rb +101 -0
  304. data/lib/jets/resource/api_gateway/rest_api.rb +56 -0
  305. data/lib/jets/resource/api_gateway/rest_api/change_detection.rb +42 -0
  306. data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +63 -0
  307. data/lib/jets/resource/api_gateway/rest_api/routes.rb +7 -0
  308. data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +8 -0
  309. data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +130 -0
  310. data/lib/jets/resource/api_gateway/rest_api/routes/change/to.rb +29 -0
  311. data/lib/jets/resource/api_gateway/rest_api/routes/change/variable.rb +39 -0
  312. data/lib/jets/resource/api_gateway/rest_api/routes/collision.rb +121 -0
  313. data/lib/jets/resource/api_gateway/rest_api/routes/collision/variable_exception.rb +7 -0
  314. data/lib/jets/resource/associated.rb +37 -0
  315. data/lib/jets/resource/base.rb +28 -0
  316. data/lib/jets/resource/child_stack/api_deployment.rb +56 -0
  317. data/lib/jets/resource/child_stack/api_gateway.rb +53 -0
  318. data/lib/jets/resource/child_stack/app_class.rb +107 -0
  319. data/lib/jets/resource/child_stack/base.rb +24 -0
  320. data/lib/jets/resource/child_stack/shared.rb +92 -0
  321. data/lib/jets/resource/config/config_rule.rb +74 -0
  322. data/lib/jets/resource/config/managed_rule.rb +15 -0
  323. data/lib/jets/resource/events/rule.rb +31 -0
  324. data/lib/jets/resource/iam/application_role.rb +27 -0
  325. data/lib/jets/resource/iam/base_role_definition.rb +47 -0
  326. data/lib/jets/resource/iam/class_role.rb +74 -0
  327. data/lib/jets/resource/iam/function_role.rb +54 -0
  328. data/lib/jets/resource/iam/managed_policy.rb +22 -0
  329. data/lib/jets/resource/iam/policy_document.rb +41 -0
  330. data/lib/jets/resource/iot/topic_rule.rb +34 -0
  331. data/lib/jets/resource/lambda/event_source_mapping.rb +31 -0
  332. data/lib/jets/resource/lambda/function.rb +214 -0
  333. data/lib/jets/resource/lambda/function/environment.rb +62 -0
  334. data/lib/jets/resource/lambda/gem_layer.rb +17 -0
  335. data/lib/jets/resource/lambda/layer_version.rb +44 -0
  336. data/lib/jets/resource/logs/subscription_filter.rb +31 -0
  337. data/lib/jets/resource/permission.rb +45 -0
  338. data/lib/jets/resource/replacer.rb +85 -0
  339. data/lib/jets/resource/route53/record_set.rb +70 -0
  340. data/lib/jets/resource/s3/bucket.rb +24 -0
  341. data/lib/jets/resource/sns/subscription.rb +29 -0
  342. data/lib/jets/resource/sns/topic.rb +35 -0
  343. data/lib/jets/resource/sns/topic_policy.rb +40 -0
  344. data/lib/jets/resource/sqs/queue.rb +21 -0
  345. data/lib/jets/resource/standardizer.rb +42 -0
  346. data/lib/jets/route.rb +166 -0
  347. data/lib/jets/router.rb +177 -0
  348. data/lib/jets/router/scope.rb +30 -0
  349. data/lib/jets/rule/base.rb +19 -0
  350. data/lib/jets/rule/dsl.rb +110 -0
  351. data/lib/jets/spec_helpers.rb +54 -0
  352. data/lib/jets/spec_helpers/params.rb +10 -0
  353. data/lib/jets/spec_helpers/request.rb +78 -0
  354. data/lib/jets/spec_helpers/response.rb +5 -0
  355. data/lib/jets/stack.rb +88 -0
  356. data/lib/jets/stack/builder.rb +43 -0
  357. data/lib/jets/stack/definition.rb +50 -0
  358. data/lib/jets/stack/depends.rb +34 -0
  359. data/lib/jets/stack/depends/item.rb +9 -0
  360. data/lib/jets/stack/function.rb +69 -0
  361. data/lib/jets/stack/main.rb +4 -0
  362. data/lib/jets/stack/main/dsl.rb +28 -0
  363. data/lib/jets/stack/main/dsl/base.rb +49 -0
  364. data/lib/jets/stack/main/dsl/cloudwatch.rb +19 -0
  365. data/lib/jets/stack/main/dsl/iam.rb +8 -0
  366. data/lib/jets/stack/main/dsl/lambda.rb +83 -0
  367. data/lib/jets/stack/main/dsl/s3.rb +12 -0
  368. data/lib/jets/stack/main/dsl/sns.rb +16 -0
  369. data/lib/jets/stack/main/dsl/sqs.rb +10 -0
  370. data/lib/jets/stack/output.rb +35 -0
  371. data/lib/jets/stack/output/dsl.rb +19 -0
  372. data/lib/jets/stack/output/lookup.rb +36 -0
  373. data/lib/jets/stack/parameter.rb +37 -0
  374. data/lib/jets/stack/parameter/dsl.rb +42 -0
  375. data/lib/jets/stack/resource.rb +31 -0
  376. data/lib/jets/stack/resource/dsl.rb +19 -0
  377. data/lib/jets/stack/s3_event.rb +87 -0
  378. data/lib/jets/tmp_loader.rb +52 -0
  379. data/lib/jets/turbine.rb +41 -0
  380. data/lib/jets/turbo.rb +55 -0
  381. data/lib/jets/turbo/database_yaml.rb +41 -0
  382. data/lib/jets/turbo/project/.gitignore +12 -0
  383. data/lib/jets/turbo/project/.jetskeep +1 -0
  384. data/lib/jets/turbo/project/Gemfile +16 -0
  385. data/lib/jets/turbo/project/Rakefile +2 -0
  386. data/lib/jets/turbo/project/app/controllers/application_controller.rb +2 -0
  387. data/lib/jets/turbo/project/app/helpers/application_helper.rb +2 -0
  388. data/lib/jets/turbo/project/app/jobs/application_job.rb +4 -0
  389. data/lib/jets/turbo/project/config.ru +5 -0
  390. data/lib/jets/turbo/project/config/application.rb +4 -0
  391. data/lib/jets/turbo/project/config/routes.rb +4 -0
  392. data/lib/jets/turbo/rails.rb +127 -0
  393. data/lib/jets/turbo/templates/config/database.yml +26 -0
  394. data/lib/jets/util.rb +38 -0
  395. data/lib/jets/version.rb +3 -0
  396. data/readme/prerelease.md +6 -0
  397. data/readme/testing.md +60 -0
  398. metadata +1004 -0
@@ -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,87 @@
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
+ path_params = event["pathParameters"] || {}
18
+
19
+ params = {}
20
+ params = params.deep_merge(body_params) if body_parameters
21
+ params = params.deep_merge(query_parameters) # always
22
+ params = params.deep_merge(path_params) if path_parameters
23
+
24
+ if raw
25
+ params
26
+ else
27
+ params = ActionDispatch::Request::Utils.normalize_encode_params(params) # for file uploads
28
+ ActionController::Parameters.new(params)
29
+ end
30
+ end
31
+
32
+ def query_parameters
33
+ event["queryStringParameters"] || {}
34
+ end
35
+
36
+ def body_params
37
+ body = event['isBase64Encoded'] ? base64_decode(event["body"]) : event["body"]
38
+ return {} if body.nil?
39
+
40
+ parsed_json = parse_json(body)
41
+ return parsed_json if parsed_json
42
+
43
+ headers = event["headers"] || {}
44
+ # API Gateway seems to use either: content-type or Content-Type
45
+ headers = headers.transform_keys { |key| key.downcase }
46
+ content_type = headers["content-type"]
47
+
48
+ if content_type.to_s.include?("application/x-www-form-urlencoded")
49
+ return ::Rack::Utils.parse_nested_query(body)
50
+ elsif content_type.to_s.include?("multipart/form-data")
51
+ return parse_multipart(body)
52
+ end
53
+
54
+ {} # fallback to empty Hash
55
+ end
56
+ memoize :body_params
57
+
58
+ private
59
+
60
+ def parse_multipart(body)
61
+ boundary = ::Rack::Multipart::Parser.parse_boundary(headers["content-type"])
62
+ options = multipart_options(body, boundary)
63
+ env = ::Rack::MockRequest.env_for("/", options)
64
+ ::Rack::Multipart.parse_multipart(env) # params Hash
65
+ end
66
+
67
+ def multipart_options(data, boundary = "AaB03x")
68
+ type = %(multipart/form-data; boundary=#{boundary})
69
+ length = data.bytesize
70
+
71
+ { "CONTENT_TYPE" => type,
72
+ "CONTENT_LENGTH" => length.to_s,
73
+ :input => StringIO.new(data) }
74
+ end
75
+
76
+ def parse_json(text)
77
+ JSON.parse(text)
78
+ rescue JSON::ParserError
79
+ nil
80
+ end
81
+
82
+ def base64_decode(body)
83
+ return nil if body.nil?
84
+ Base64.decode64(body)
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,88 @@
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
+ resp = {
38
+ "statusCode" => status,
39
+ "headers" => headers,
40
+ "body" => body,
41
+ "isBase64Encoded" => base64,
42
+ }
43
+ adjust_for_elb(resp)
44
+ resp
45
+ end
46
+
47
+ # Note: ELB is not officially support. This is just in case users wish to manually
48
+ # connect ELBs to the functions created by Jets.
49
+ def adjust_for_elb(resp)
50
+ return resp unless from_elb?
51
+
52
+ # ELB requires statusCode to be an Integer whereas API Gateway requires statusCode to be a String
53
+ status = resp["statusCode"] = resp["statusCode"].to_i
54
+
55
+ # ELB also requires statusDescription attribute
56
+ status_desc = Rack::Utils::HTTP_STATUS_CODES[status]
57
+ status_desc = status_desc.nil? ? status.to_s : "#{status} #{status_desc}"
58
+ resp["statusDescription"] = status_desc
59
+
60
+ resp
61
+ end
62
+
63
+ def from_elb?
64
+ # NOTE: @event["requestContext"]["elb"] is set when the request is coming from an elb
65
+ # Can set JETS_ELB=1 for local testing
66
+ @event["requestContext"] && @event["requestContext"]["elb"] || ENV['JETS_ELB']
67
+ end
68
+
69
+ # Called from Jets::Controller::Base.process. Example:
70
+ #
71
+ # adapter.rack_vars(
72
+ # 'jets.controller' => self,
73
+ # 'lambda.context' => context,
74
+ # 'lambda.event' => event,
75
+ # 'lambda.meth' => meth,
76
+ # )
77
+ #
78
+ # Passes a these special variables so we have access to them in the middleware.
79
+ # The controller instance is called in the Main middleware.
80
+ # The lambda.* info is used by the Rack::Local middleware to create a mimicked
81
+ # controller for the local server.
82
+ #
83
+ def rack_vars(vars)
84
+ env.merge!(vars)
85
+ end
86
+
87
+ end
88
+ end
@@ -0,0 +1,105 @@
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 = @event['path'] || '/' # always set by API Gateway but might not be when testing shim, so setting it to make testing easier
17
+ env = Rack::MockRequest.env_for(path, options)
18
+ if @options[:adapter]
19
+ env['adapter.event'] = @event
20
+ env['adapter.context'] = @context
21
+ end
22
+ env
23
+ end
24
+
25
+ private
26
+ def add_top_level(options)
27
+ map = {
28
+ 'CONTENT_TYPE' => content_type,
29
+ 'QUERY_STRING' => query_string,
30
+ 'REMOTE_ADDR' => headers['X-Forwarded-For'],
31
+ 'REMOTE_HOST' => headers['Host'],
32
+ 'REQUEST_METHOD' => @event['httpMethod'],
33
+ 'REQUEST_PATH' => @event['path'],
34
+ 'REQUEST_URI' => request_uri,
35
+ 'SCRIPT_NAME' => "",
36
+ 'SERVER_NAME' => headers['Host'],
37
+ 'SERVER_PORT' => headers['X-Forwarded-Port'],
38
+ 'SERVER_PROTOCOL' => "HTTP/1.1", # unsure if this should be set
39
+ 'SERVER_SOFTWARE' => "WEBrick/1.3.1 (Ruby/2.2.2/2015-04-13)",
40
+ }
41
+
42
+ map['CONTENT_LENGTH'] = content_length if content_length
43
+ # Even if not set, Rack always assigns an StringIO to "rack.input"
44
+ map['rack.input'] = StringIO.new(body) if body
45
+
46
+ options.merge(map)
47
+ end
48
+
49
+ def content_type
50
+ headers['Content-Type'] || Jets::Controller::DEFAULT_CONTENT_TYPE
51
+ end
52
+
53
+ def content_length
54
+ bytesize = body.bytesize.to_s if body
55
+ headers['Content-Length'] || bytesize
56
+ end
57
+
58
+ # Decoding base64 from API Gateaway if necessary
59
+ # Rack will be none the wiser
60
+ def body
61
+ if @event['isBase64Encoded']
62
+ Base64.decode64(@event['body'])
63
+ else
64
+ @event['body']
65
+ end
66
+ end
67
+
68
+ def add_http_headers(options)
69
+ headers.each do |k,v|
70
+ # content-type => HTTP_CONTENT_TYPE
71
+ key = k.gsub('-','_').upcase
72
+ key = "HTTP_#{key}"
73
+ options[key] = v
74
+ end
75
+ options
76
+ end
77
+
78
+ def request_uri
79
+ # IE: "http://localhost:8888/posts/tung/edit?foo=bar"
80
+ proto = headers['X-Forwarded-Proto']
81
+ host = headers['Host']
82
+ port = headers['X-Forwarded-Port']
83
+
84
+ # Add port if needed
85
+ if proto == 'https' && port != '443' or
86
+ proto == 'http' && port != '80'
87
+ host = "#{host}:#{port}"
88
+ end
89
+
90
+ path = @event['path']
91
+ qs = "?#{query_string}" unless query_string.empty?
92
+ "#{proto}://#{host}#{path}#{qs}"
93
+ end
94
+
95
+ def query_string
96
+ qs_params = @event["queryStringParameters"] || {} # always set with API Gateway but when testing node shim might not be
97
+ hash = Jets::Mega::HashConverter.encode(qs_params)
98
+ hash.to_query
99
+ end
100
+
101
+ def headers
102
+ @event['headers'] || {}
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,55 @@
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
+ uri = URI.parse(url)
11
+ # if no location.host, we been provided a relative host
12
+ if !uri.host && actual_host
13
+ url = "/#{url}" unless url.starts_with?('/')
14
+ url = add_stage_name(url)
15
+ redirect_url = actual_host + url
16
+ else
17
+ redirect_url = url
18
+ end
19
+
20
+ redirect_url = ensure_protocol(redirect_url)
21
+
22
+ aws_proxy = Rendering::RackRenderer.new(self,
23
+ status: options[:status] || 302,
24
+ headers: { "Location" => redirect_url },
25
+ body: "",
26
+ isBase64Encoded: false,
27
+ )
28
+ resp = aws_proxy.render
29
+ # redirect is a type of rendering
30
+ @rendered = true
31
+ @rendered_data = resp
32
+ end
33
+
34
+ def ensure_protocol(url)
35
+ return url if url.starts_with?('http')
36
+
37
+ # annoying but the request payload is different with localhost/rack vs
38
+ # api gateway
39
+ # check out:
40
+ # spec/fixtures/dumps/api_gateway/posts/create.json
41
+ # spec/fixtures/dumps/rack/posts/create.json
42
+ protocol = if headers["x-forwarded-proto"] # API Gateway
43
+ headers["x-forwarded-proto"]
44
+ elsif headers["origin"] # Rack / localhost
45
+ URI.parse(headers["origin"]).scheme
46
+ else
47
+ "http" # fallback. Capybara / Selenium tests
48
+ end
49
+
50
+ raise "Invalid protocol #{protocol}" unless protocol.starts_with?('http')
51
+
52
+ "#{protocol}://#{url}"
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,79 @@
1
+ class Jets::Controller
2
+ module Rendering
3
+ include Redirection
4
+
5
+ def ensure_render
6
+ return @rendered_data if @rendered
7
+
8
+ # defaults to rendering templates
9
+ RackRenderer.new(self, managed_options).render
10
+ end
11
+
12
+ # Many different ways to render:
13
+ #
14
+ # render "articles/index", layout: "application"
15
+ # render :new
16
+ # render template: "articles/index", layout: "application"
17
+ # render json: {my: "data"}
18
+ # render text: "plain text"
19
+ def render(options={}, rest={})
20
+ raise "DoubleRenderError" if @rendered
21
+
22
+ if options.is_a?(Symbol) or options.is_a?(String)
23
+ options = normalize_options(options, rest)
24
+ end
25
+
26
+ options.reverse_merge!(managed_options)
27
+ adjust_content_type!(options)
28
+
29
+ @rendered_data = RackRenderer.new(self, options).render
30
+
31
+ @rendered = true
32
+ @rendered_data
33
+ end
34
+
35
+ def adjust_content_type!(options)
36
+ if options.key?(:json)
37
+ options[:content_type] = "application/json"
38
+ elsif options.key?(:xml)
39
+ options[:content_type] = "application/xml"
40
+ end
41
+ end
42
+
43
+ def managed_options
44
+ layout = self.class.layout.nil? ? default_layout : self.class.layout
45
+ options = { layout: layout }
46
+ options[:headers] = response.headers unless response.headers.empty?
47
+ options
48
+ end
49
+
50
+ def default_layout
51
+ application_layout_exist = !Dir.glob("#{Jets.root}/app/views/layouts/application*").empty?
52
+ "application" if application_layout_exist
53
+ end
54
+
55
+ # Can normalize the options when it is a String or a Symbol
56
+ # Also set defaults here like the layout.
57
+ # Ensure options is a Hash, not a String or Symbol.
58
+ def normalize_options(options, rest)
59
+ template = options.to_s
60
+ rest.merge(template: template)
61
+ end
62
+
63
+ # Add API Gateway Stage Name
64
+ def add_stage_name(url)
65
+ return url unless actual_host
66
+
67
+ Jets::Controller::Stage.add(actual_host, url)
68
+ end
69
+
70
+ def url_for(url)
71
+ add_stage_name(url)
72
+ end
73
+
74
+ def actual_host
75
+ headers["host"]
76
+ end
77
+
78
+ end
79
+ end
@@ -0,0 +1,250 @@
1
+ require "rack/utils"
2
+
3
+ # Special renderer. All the other renderers lead here
4
+ module Jets::Controller::Rendering
5
+ class RackRenderer
6
+ delegate :request, :event, :headers, to: :controller
7
+ attr_reader :controller
8
+ def initialize(controller, options={})
9
+ @controller = controller
10
+ @options = options
11
+ end
12
+
13
+ # Example response:
14
+ #
15
+ # [200, {"my-header" = > "value" }, "my body" ]
16
+ #
17
+ # Returns rack triplet
18
+ def render
19
+ # we do some normalization here
20
+ status = normalize_status_code(@options[:status])
21
+
22
+ base64 = normalized_base64_option(@options)
23
+
24
+ headers = @options[:headers] || {}
25
+ set_content_type!(status, headers)
26
+ # x-jets-base64 to convert this Rack triplet to a API Gateway hash structure later
27
+ headers["x-jets-base64"] = base64 ? 'yes' : 'no' # headers values must be Strings
28
+
29
+ # Rails rendering does heavy lifting
30
+ if drop_content_info?(status)
31
+ body = StringIO.new
32
+ else
33
+
34
+ renderer = ActionController::Base.renderer.new(renderer_options)
35
+ body = renderer.render(render_options)
36
+ body = StringIO.new(body)
37
+ end
38
+
39
+ [status, headers, body] # triplet
40
+ end
41
+
42
+ # Example: posts/index
43
+ def default_template_name
44
+ "#{template_namespace}/#{@controller.meth}"
45
+ end
46
+
47
+ # PostsController => "posts" is the namespace
48
+ def template_namespace
49
+ @controller.class.to_s.sub('Controller','').underscore.pluralize
50
+ end
51
+
52
+ # default options:
53
+ # https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/renderer.rb#L41-L47
54
+ def renderer_options
55
+ options = {
56
+ # script_name: "", # unfortunately doesnt seem to effect relative_url_root like desired
57
+ # input: ""
58
+ }
59
+
60
+ origin = headers["origin"]
61
+ if origin
62
+ uri = URI.parse(origin)
63
+ options[:https] = uri.scheme == "https"
64
+ end
65
+
66
+ # Important to not use rack_headers as local variable instead of headers.
67
+ # headers is a method that gets deleted to controller.headers and using it
68
+ # seems to cause issues.
69
+ rack_headers = rackify_headers(headers)
70
+ options.merge!(rack_headers)
71
+
72
+ # Note @options[:method] uses @options vs options on purpose
73
+ @options[:method] = event["httpMethod"].downcase if event["httpMethod"]
74
+ options
75
+ end
76
+
77
+ # Takes headers and adds HTTP_ to front of the keys because that is what rack
78
+ # does to the headers passed from a request. This seems to be the standard
79
+ # when testing with curl and inspecting the headers in a Rack app. Example:
80
+ # https://gist.github.com/tongueroo/94f22f6c261c8999e4f4f776547e2ee3
81
+ #
82
+ # This is useful for:
83
+ #
84
+ # ActionController::Base.renderer.new(renderer_options)
85
+ #
86
+ # renderer_options are rack normalized headers.
87
+ #
88
+ # Example input (from api gateway)
89
+ #
90
+ # {"host"=>"localhost:8888",
91
+ # "user-agent"=>"curl/7.53.1",
92
+ # "accept"=>"*/*",
93
+ # "version"=>"HTTP/1.1",
94
+ # "x-amzn-trace-id"=>"Root=1-5bde5b19-61d0d4ab4659144f8f69e38f"}
95
+ #
96
+ # Example output:
97
+ #
98
+ # {"HTTP_HOST"=>"localhost:8888",
99
+ # "HTTP_USER_AGENT"=>"curl/7.53.1",
100
+ # "HTTP_ACCEPT"=>"*/*",
101
+ # "HTTP_VERSION"=>"HTTP/1.1",
102
+ # "HTTP_X_AMZN_TRACE_ID"=>"Root=1-5bde5b19-61d0d4ab4659144f8f69e38f"}
103
+ #
104
+ def rackify_headers(headers)
105
+ results = {}
106
+ headers.each do |k,v|
107
+ rack_key = 'HTTP_' + k.gsub('-','_').upcase
108
+ results[rack_key] = v
109
+ end
110
+ results
111
+ end
112
+
113
+ def render_options
114
+ # nomralize the template option
115
+ template = @options[:template]
116
+ if template and !template.include?('/')
117
+ template = "#{template_namespace}/#{template}"
118
+ end
119
+ template ||= default_template_name
120
+ # ready to override @options[:template]
121
+ @options[:template] = template if @options[:template]
122
+
123
+ render_options = {
124
+ template: template, # weird: template needs to be set no matter because it
125
+ # sets the name which is used in lookup_context.rb:209:in `normalize_name'
126
+ layout: @options[:layout],
127
+ assigns: controller_instance_variables,
128
+ }
129
+ types = %w[json inline plain file xml body action].map(&:to_sym)
130
+ types.each do |type|
131
+ render_options[type] = @options[type] if @options[type]
132
+ end
133
+
134
+ render_options
135
+ end
136
+
137
+ def controller_instance_variables
138
+ instance_vars = @controller.instance_variables.inject({}) do |vars, v|
139
+ k = v.to_s.sub(/^@/,'') # @var => var
140
+ vars[k] = @controller.instance_variable_get(v)
141
+ vars
142
+ end
143
+ instance_vars[:event] = event
144
+ instance_vars
145
+ end
146
+
147
+ private
148
+ # From jets/controller/response.rb
149
+ def drop_content_info?(status)
150
+ status.to_i / 100 == 1 or drop_body?(status)
151
+ end
152
+
153
+ DROP_BODY_RESPONSES = [204, 304]
154
+ def drop_body?(status)
155
+ DROP_BODY_RESPONSES.include?(status.to_i)
156
+ end
157
+
158
+ # maps:
159
+ # :continue => 100
160
+ # :success => 200
161
+ # etc
162
+ def normalize_status_code(code)
163
+ status_code = if code.is_a?(Symbol)
164
+ Rack::Utils::SYMBOL_TO_STATUS_CODE[code]
165
+ else
166
+ code
167
+ end
168
+
169
+ # API Gateway requires status to be String but local rack is okay with either
170
+ # Note, ELB though requires status to be an Integer. We'll later in rack/adapter.rb
171
+ # adjust status to an Integer if request is coming from an ELB.
172
+ (status_code || 200).to_s
173
+ end
174
+
175
+ def set_content_type!(status, headers)
176
+ if drop_content_info?(status)
177
+ headers.delete "Content-Length"
178
+ headers.delete "Content-Type"
179
+ else
180
+ headers["Content-Type"] = @options[:content_type] ||
181
+ headers['content-type'] || # Mega Mode (Rails)
182
+ headers['Content-Type'] || # Just in case
183
+ Jets::Controller::DEFAULT_CONTENT_TYPE
184
+ end
185
+ end
186
+
187
+ def normalized_base64_option(options)
188
+ base64 = @options[:base64] if options.key?(:base64)
189
+ base64 = @options[:isBase64Encoded] if options.key?(:isBase64Encoded)
190
+ base64
191
+ end
192
+
193
+ class << self
194
+ def setup!
195
+ require "action_controller"
196
+ require "jets/overrides/rails"
197
+
198
+ # Load helpers
199
+ # Assign local variable because scope in the `:action_view do` block changes
200
+ app_helper_classes = find_app_helper_classes
201
+ ActiveSupport.on_load :action_view do
202
+ include ApplicationHelper # include first
203
+ app_helper_classes.each do |helper_class|
204
+ include helper_class
205
+ end
206
+ end
207
+
208
+ ActionController::Base.append_view_path("#{Jets.root}/app/views")
209
+ ActionView::Resolver.caching = !Jets.env.development?
210
+
211
+ setup_webpacker if Jets.webpacker?
212
+ end
213
+
214
+ # Does not include ApplicationHelper, will include ApplicationHelper explicitly first.
215
+ def find_app_helper_classes
216
+ internal_path = File.expand_path("../../internal", File.dirname(__FILE__))
217
+ internal_classes = find_app_helper_classes_from(internal_path)
218
+ app_classes = find_app_helper_classes_from(Jets.root)
219
+ (internal_classes + app_classes).uniq
220
+ end
221
+
222
+ def find_app_helper_classes_from(project_root)
223
+ klasses = []
224
+ expression = "#{project_root}/app/helpers/**/*"
225
+ Dir.glob(expression).each do |path|
226
+ next unless File.file?(path)
227
+ class_name = path.sub("#{project_root}/app/helpers/","").sub(/\.rb/,'')
228
+
229
+ unless class_name == "application_helper"
230
+ klasses << class_name.camelize.constantize # autoload
231
+ end
232
+ end
233
+ klasses
234
+ end
235
+
236
+ def setup_webpacker
237
+ require 'webpacker'
238
+ require 'webpacker/helper'
239
+
240
+ ActiveSupport.on_load :action_controller do
241
+ ActionController::Base.helper Webpacker::Helper
242
+ end
243
+
244
+ ActiveSupport.on_load :action_view do
245
+ include Webpacker::Helper
246
+ end
247
+ end
248
+ end
249
+ end
250
+ end