jets-fs 1.6.10

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 (379) 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 +73 -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 +6 -0
  21. data/.python-version +1 -0
  22. data/.rspec +4 -0
  23. data/.ruby-version +1 -0
  24. data/CHANGELOG.md +533 -0
  25. data/Dockerfile +16 -0
  26. data/Dockerfile.base +53 -0
  27. data/Gemfile +14 -0
  28. data/Gemfile.lock +190 -0
  29. data/Guardfile +22 -0
  30. data/LICENSE.txt +22 -0
  31. data/Procfile +2 -0
  32. data/README.md +203 -0
  33. data/Rakefile +21 -0
  34. data/backers.md +16 -0
  35. data/bin/release +9 -0
  36. data/buildspec.yml +18 -0
  37. data/exe/jets +14 -0
  38. data/jets.gemspec +61 -0
  39. data/lib/jets.rb +71 -0
  40. data/lib/jets/application.rb +308 -0
  41. data/lib/jets/aws_info.rb +111 -0
  42. data/lib/jets/aws_services.rb +60 -0
  43. data/lib/jets/aws_services/stack_status.rb +59 -0
  44. data/lib/jets/booter.rb +130 -0
  45. data/lib/jets/builders.rb +16 -0
  46. data/lib/jets/builders/code_builder.rb +379 -0
  47. data/lib/jets/builders/code_size.rb +57 -0
  48. data/lib/jets/builders/gem_replacer.rb +76 -0
  49. data/lib/jets/builders/handler_generator.rb +172 -0
  50. data/lib/jets/builders/lambda_layer.rb +69 -0
  51. data/lib/jets/builders/md5.rb +60 -0
  52. data/lib/jets/builders/md5_zip.rb +61 -0
  53. data/lib/jets/builders/purger.rb +35 -0
  54. data/lib/jets/builders/rack_packager.rb +51 -0
  55. data/lib/jets/builders/rackup_wrappers/rackup +19 -0
  56. data/lib/jets/builders/rackup_wrappers/rackup.rb +7 -0
  57. data/lib/jets/builders/reconfigure_rails.rb +114 -0
  58. data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +16 -0
  59. data/lib/jets/builders/ruby_packager.rb +207 -0
  60. data/lib/jets/builders/shim_vars.rb +5 -0
  61. data/lib/jets/builders/shim_vars/app.rb +78 -0
  62. data/lib/jets/builders/shim_vars/base.rb +25 -0
  63. data/lib/jets/builders/shim_vars/shared.rb +37 -0
  64. data/lib/jets/builders/templates/handler.rb +12 -0
  65. data/lib/jets/builders/tidy.rb +107 -0
  66. data/lib/jets/builders/util.rb +31 -0
  67. data/lib/jets/camelizer.rb +67 -0
  68. data/lib/jets/cfn.rb +6 -0
  69. data/lib/jets/cfn/builders.rb +20 -0
  70. data/lib/jets/cfn/builders/api_deployment_builder.rb +58 -0
  71. data/lib/jets/cfn/builders/api_gateway_builder.rb +80 -0
  72. data/lib/jets/cfn/builders/base_child_builder.rb +82 -0
  73. data/lib/jets/cfn/builders/controller_builder.rb +42 -0
  74. data/lib/jets/cfn/builders/function_builder.rb +14 -0
  75. data/lib/jets/cfn/builders/interface.rb +127 -0
  76. data/lib/jets/cfn/builders/job_builder.rb +14 -0
  77. data/lib/jets/cfn/builders/parent_builder.rb +93 -0
  78. data/lib/jets/cfn/builders/rule_builder.rb +24 -0
  79. data/lib/jets/cfn/builders/shared_builder.rb +14 -0
  80. data/lib/jets/cfn/ship.rb +189 -0
  81. data/lib/jets/cfn/status.rb +212 -0
  82. data/lib/jets/cfn/upload.rb +139 -0
  83. data/lib/jets/cli.rb +189 -0
  84. data/lib/jets/commands.rb +27 -0
  85. data/lib/jets/commands/base.rb +164 -0
  86. data/lib/jets/commands/build.rb +217 -0
  87. data/lib/jets/commands/call.rb +174 -0
  88. data/lib/jets/commands/call/anonymous_guesser.rb +96 -0
  89. data/lib/jets/commands/call/autoload_guesser.rb +112 -0
  90. data/lib/jets/commands/call/base_guesser.rb +33 -0
  91. data/lib/jets/commands/call/guesser.rb +48 -0
  92. data/lib/jets/commands/clean.rb +23 -0
  93. data/lib/jets/commands/clean/base.rb +24 -0
  94. data/lib/jets/commands/clean/build.rb +13 -0
  95. data/lib/jets/commands/clean/log.rb +107 -0
  96. data/lib/jets/commands/console.rb +13 -0
  97. data/lib/jets/commands/db.rb +15 -0
  98. data/lib/jets/commands/db/environment-task.rake +3 -0
  99. data/lib/jets/commands/db/tasks.rb +44 -0
  100. data/lib/jets/commands/dbconsole.rb +131 -0
  101. data/lib/jets/commands/delete.rb +143 -0
  102. data/lib/jets/commands/deploy.rb +131 -0
  103. data/lib/jets/commands/dynamodb.rb +22 -0
  104. data/lib/jets/commands/dynamodb/migrate.rb +9 -0
  105. data/lib/jets/commands/dynamodb/migrator.rb +36 -0
  106. data/lib/jets/commands/gems.rb +21 -0
  107. data/lib/jets/commands/help.rb +9 -0
  108. data/lib/jets/commands/help/build.md +6 -0
  109. data/lib/jets/commands/help/call.md +61 -0
  110. data/lib/jets/commands/help/clean/build.md +5 -0
  111. data/lib/jets/commands/help/clean/log.md +5 -0
  112. data/lib/jets/commands/help/console.md +18 -0
  113. data/lib/jets/commands/help/db/generate.md +8 -0
  114. data/lib/jets/commands/help/dbconsole.md +9 -0
  115. data/lib/jets/commands/help/delete.md +22 -0
  116. data/lib/jets/commands/help/deploy.md +32 -0
  117. data/lib/jets/commands/help/dynamodb/generate.md +52 -0
  118. data/lib/jets/commands/help/dynamodb/migrate.md +4 -0
  119. data/lib/jets/commands/help/gems/check.md +8 -0
  120. data/lib/jets/commands/help/generate.md +22 -0
  121. data/lib/jets/commands/help/import/rack.md +13 -0
  122. data/lib/jets/commands/help/import/rails.md +11 -0
  123. data/lib/jets/commands/help/new.md +42 -0
  124. data/lib/jets/commands/help/routes.md +16 -0
  125. data/lib/jets/commands/help/runner.md +17 -0
  126. data/lib/jets/commands/help/server.md +15 -0
  127. data/lib/jets/commands/help/status.md +14 -0
  128. data/lib/jets/commands/help/upgrade.md +5 -0
  129. data/lib/jets/commands/help/url.md +6 -0
  130. data/lib/jets/commands/import.rb +18 -0
  131. data/lib/jets/commands/import/base.rb +49 -0
  132. data/lib/jets/commands/import/cheatsheet.rb +35 -0
  133. data/lib/jets/commands/import/rack.rb +16 -0
  134. data/lib/jets/commands/import/rail.rb +74 -0
  135. data/lib/jets/commands/import/sequence.rb +90 -0
  136. data/lib/jets/commands/import/templates/config/database.yml +26 -0
  137. data/lib/jets/commands/import/templates/submodules-cheatsheet.md +89 -0
  138. data/lib/jets/commands/main.rb +152 -0
  139. data/lib/jets/commands/markdown.rb +8 -0
  140. data/lib/jets/commands/markdown/creator.rb +58 -0
  141. data/lib/jets/commands/markdown/index.rb +27 -0
  142. data/lib/jets/commands/markdown/page.rb +125 -0
  143. data/lib/jets/commands/markdown/shell.rb +11 -0
  144. data/lib/jets/commands/new.rb +157 -0
  145. data/lib/jets/commands/rake_command.rb +61 -0
  146. data/lib/jets/commands/rake_tasks.rb +45 -0
  147. data/lib/jets/commands/runner.rb +18 -0
  148. data/lib/jets/commands/sequence.rb +99 -0
  149. data/lib/jets/commands/stack_info.rb +30 -0
  150. data/lib/jets/commands/templates/skeleton/.gitignore +12 -0
  151. data/lib/jets/commands/templates/skeleton/.jetskeep +1 -0
  152. data/lib/jets/commands/templates/skeleton/.rspec +3 -0
  153. data/lib/jets/commands/templates/skeleton/Gemfile.tt +35 -0
  154. data/lib/jets/commands/templates/skeleton/Procfile +7 -0
  155. data/lib/jets/commands/templates/skeleton/README.md +11 -0
  156. data/lib/jets/commands/templates/skeleton/Rakefile +2 -0
  157. data/lib/jets/commands/templates/skeleton/app/controllers/application_controller.rb +2 -0
  158. data/lib/jets/commands/templates/skeleton/app/helpers/application_helper.rb +2 -0
  159. data/lib/jets/commands/templates/skeleton/app/jobs/application_job.rb +4 -0
  160. data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +2 -0
  161. data/lib/jets/commands/templates/skeleton/app/models/application_record.rb +3 -0
  162. data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +25 -0
  163. data/lib/jets/commands/templates/skeleton/config.ru +5 -0
  164. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +66 -0
  165. data/lib/jets/commands/templates/skeleton/config/database.yml.tt +26 -0
  166. data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +22 -0
  167. data/lib/jets/commands/templates/skeleton/config/environments/development.rb +4 -0
  168. data/lib/jets/commands/templates/skeleton/config/environments/production.rb +4 -0
  169. data/lib/jets/commands/templates/skeleton/config/routes.rb +9 -0
  170. data/lib/jets/commands/templates/skeleton/db/.gitkeep +0 -0
  171. data/lib/jets/commands/templates/skeleton/public/404.html +67 -0
  172. data/lib/jets/commands/templates/skeleton/public/422.html +67 -0
  173. data/lib/jets/commands/templates/skeleton/public/500.html +66 -0
  174. data/lib/jets/commands/templates/skeleton/public/favicon.ico +0 -0
  175. data/lib/jets/commands/templates/skeleton/public/index.html.tt +91 -0
  176. data/lib/jets/commands/templates/skeleton/spec/controllers/posts_controller_spec.rb +15 -0
  177. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-index.json +51 -0
  178. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-show.json +53 -0
  179. data/lib/jets/commands/templates/skeleton/spec/spec_helper.rb.tt +30 -0
  180. data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +14 -0
  181. data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -0
  182. data/lib/jets/commands/templates/webpacker/app/javascript/src/jets/crud.js +87 -0
  183. data/lib/jets/commands/upgrade.rb +146 -0
  184. data/lib/jets/commands/upgrade/templates/bin/webpack +19 -0
  185. data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +19 -0
  186. data/lib/jets/commands/url.rb +68 -0
  187. data/lib/jets/commands/webpacker_template.rb +18 -0
  188. data/lib/jets/controller.rb +16 -0
  189. data/lib/jets/controller/base.rb +103 -0
  190. data/lib/jets/controller/callbacks.rb +62 -0
  191. data/lib/jets/controller/cookies.rb +40 -0
  192. data/lib/jets/controller/cookies/jar.rb +269 -0
  193. data/lib/jets/controller/layout.rb +17 -0
  194. data/lib/jets/controller/middleware.rb +5 -0
  195. data/lib/jets/controller/middleware/cors.rb +60 -0
  196. data/lib/jets/controller/middleware/local.rb +119 -0
  197. data/lib/jets/controller/middleware/local/api_gateway.rb +93 -0
  198. data/lib/jets/controller/middleware/local/mimic_aws_call.rb +38 -0
  199. data/lib/jets/controller/middleware/local/route_matcher.rb +97 -0
  200. data/lib/jets/controller/middleware/main.rb +46 -0
  201. data/lib/jets/controller/middleware/webpacker_setup.rb +6 -0
  202. data/lib/jets/controller/params.rb +87 -0
  203. data/lib/jets/controller/rack.rb +5 -0
  204. data/lib/jets/controller/rack/adapter.rb +63 -0
  205. data/lib/jets/controller/rack/env.rb +105 -0
  206. data/lib/jets/controller/redirection.rb +55 -0
  207. data/lib/jets/controller/rendering.rb +84 -0
  208. data/lib/jets/controller/rendering/rack_renderer.rb +238 -0
  209. data/lib/jets/controller/request.rb +29 -0
  210. data/lib/jets/controller/response.rb +61 -0
  211. data/lib/jets/core.rb +211 -0
  212. data/lib/jets/core_ext/kernel.rb +56 -0
  213. data/lib/jets/db.rb +15 -0
  214. data/lib/jets/dotenv.rb +39 -0
  215. data/lib/jets/erb.rb +51 -0
  216. data/lib/jets/generator.rb +41 -0
  217. data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
  218. data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +39 -0
  219. data/lib/jets/generator/templates/erb/scaffold/edit.html.erb +6 -0
  220. data/lib/jets/generator/templates/erb/scaffold/index.html.erb +29 -0
  221. data/lib/jets/generator/templates/erb/scaffold/new.html.erb +5 -0
  222. data/lib/jets/generator/templates/erb/scaffold/show.html.erb +9 -0
  223. data/lib/jets/generator/templates/rails/assets/javascript.js +2 -0
  224. data/lib/jets/generator/templates/rails/assets/stylesheet.css +4 -0
  225. data/lib/jets/generator/templates/rails/controller/controller.rb +13 -0
  226. data/lib/jets/generator/templates/rails/helper/helper.rb +4 -0
  227. data/lib/jets/generator/templates/rails/scaffold/scaffold.css +80 -0
  228. data/lib/jets/generator/templates/rails/scaffold_controller/api_controller.rb +62 -0
  229. data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +79 -0
  230. data/lib/jets/inflections.rb +32 -0
  231. data/lib/jets/internal/app/controllers/jets/public_controller.rb +31 -0
  232. data/lib/jets/internal/app/controllers/jets/rack_controller.rb +25 -0
  233. data/lib/jets/internal/app/functions/jets/base_path.rb +153 -0
  234. data/lib/jets/internal/app/jobs/jets/preheat_job.rb +62 -0
  235. data/lib/jets/io.rb +14 -0
  236. data/lib/jets/job.rb +4 -0
  237. data/lib/jets/job/base.rb +29 -0
  238. data/lib/jets/job/dsl.rb +108 -0
  239. data/lib/jets/klass.rb +109 -0
  240. data/lib/jets/lambda.rb +18 -0
  241. data/lib/jets/lambda/dsl.rb +384 -0
  242. data/lib/jets/lambda/function.rb +29 -0
  243. data/lib/jets/lambda/function_constructor.rb +55 -0
  244. data/lib/jets/lambda/functions.rb +34 -0
  245. data/lib/jets/lambda/task.rb +111 -0
  246. data/lib/jets/logger.rb +24 -0
  247. data/lib/jets/mega.rb +7 -0
  248. data/lib/jets/mega/hash_converter.rb +25 -0
  249. data/lib/jets/mega/request.rb +140 -0
  250. data/lib/jets/mega/request/source.rb +21 -0
  251. data/lib/jets/middleware.rb +38 -0
  252. data/lib/jets/middleware/configurator.rb +84 -0
  253. data/lib/jets/middleware/default_stack.rb +49 -0
  254. data/lib/jets/middleware/layer.rb +34 -0
  255. data/lib/jets/middleware/stack.rb +77 -0
  256. data/lib/jets/naming.rb +49 -0
  257. data/lib/jets/overrides/lambda.rb +1 -0
  258. data/lib/jets/overrides/lambda/marshaller.rb +31 -0
  259. data/lib/jets/overrides/rails.rb +4 -0
  260. data/lib/jets/overrides/rails/asset_tag_helper.rb +114 -0
  261. data/lib/jets/overrides/rails/common_methods.rb +20 -0
  262. data/lib/jets/overrides/rails/rendering_helper.rb +26 -0
  263. data/lib/jets/overrides/rails/url_helper.rb +25 -0
  264. data/lib/jets/poly_fun.rb +82 -0
  265. data/lib/jets/poly_fun/base_executor.rb +125 -0
  266. data/lib/jets/poly_fun/lambda_executor.rb +16 -0
  267. data/lib/jets/poly_fun/node_error.rb +8 -0
  268. data/lib/jets/poly_fun/node_executor.rb +54 -0
  269. data/lib/jets/poly_fun/python_error.rb +8 -0
  270. data/lib/jets/poly_fun/python_executor.rb +23 -0
  271. data/lib/jets/preheat.rb +117 -0
  272. data/lib/jets/processors.rb +4 -0
  273. data/lib/jets/processors/deducer.rb +65 -0
  274. data/lib/jets/processors/main_processor.rb +59 -0
  275. data/lib/jets/rack_server.rb +80 -0
  276. data/lib/jets/rdoc.rb +30 -0
  277. data/lib/jets/resource.rb +74 -0
  278. data/lib/jets/resource/api_gateway.rb +9 -0
  279. data/lib/jets/resource/api_gateway/base_path.rb +5 -0
  280. data/lib/jets/resource/api_gateway/base_path/function.rb +42 -0
  281. data/lib/jets/resource/api_gateway/base_path/mapping.rb +44 -0
  282. data/lib/jets/resource/api_gateway/base_path/role.rb +76 -0
  283. data/lib/jets/resource/api_gateway/cors.rb +61 -0
  284. data/lib/jets/resource/api_gateway/deployment.rb +78 -0
  285. data/lib/jets/resource/api_gateway/domain_name.rb +59 -0
  286. data/lib/jets/resource/api_gateway/method.rb +98 -0
  287. data/lib/jets/resource/api_gateway/resource.rb +78 -0
  288. data/lib/jets/resource/api_gateway/rest_api.rb +60 -0
  289. data/lib/jets/resource/api_gateway/rest_api/change_detection.rb +42 -0
  290. data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +63 -0
  291. data/lib/jets/resource/api_gateway/rest_api/routes.rb +11 -0
  292. data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +12 -0
  293. data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +130 -0
  294. data/lib/jets/resource/api_gateway/rest_api/routes/change/to.rb +29 -0
  295. data/lib/jets/resource/api_gateway/rest_api/routes/change/variable.rb +39 -0
  296. data/lib/jets/resource/api_gateway/rest_api/routes/collision.rb +123 -0
  297. data/lib/jets/resource/api_gateway/rest_api/routes/collision/variable_exception.rb +7 -0
  298. data/lib/jets/resource/associated.rb +26 -0
  299. data/lib/jets/resource/base.rb +28 -0
  300. data/lib/jets/resource/child_stack.rb +7 -0
  301. data/lib/jets/resource/child_stack/api_deployment.rb +56 -0
  302. data/lib/jets/resource/child_stack/api_gateway.rb +29 -0
  303. data/lib/jets/resource/child_stack/app_class.rb +112 -0
  304. data/lib/jets/resource/child_stack/base.rb +24 -0
  305. data/lib/jets/resource/child_stack/shared.rb +90 -0
  306. data/lib/jets/resource/config.rb +4 -0
  307. data/lib/jets/resource/config/config_rule.rb +74 -0
  308. data/lib/jets/resource/config/managed_rule.rb +15 -0
  309. data/lib/jets/resource/events.rb +3 -0
  310. data/lib/jets/resource/events/rule.rb +31 -0
  311. data/lib/jets/resource/iam.rb +8 -0
  312. data/lib/jets/resource/iam/application_role.rb +27 -0
  313. data/lib/jets/resource/iam/base_role_definition.rb +47 -0
  314. data/lib/jets/resource/iam/class_role.rb +74 -0
  315. data/lib/jets/resource/iam/function_role.rb +54 -0
  316. data/lib/jets/resource/iam/managed_policy.rb +22 -0
  317. data/lib/jets/resource/iam/policy_document.rb +41 -0
  318. data/lib/jets/resource/lambda.rb +5 -0
  319. data/lib/jets/resource/lambda/function.rb +216 -0
  320. data/lib/jets/resource/lambda/function/environment.rb +61 -0
  321. data/lib/jets/resource/lambda/gem_layer.rb +17 -0
  322. data/lib/jets/resource/lambda/layer_version.rb +44 -0
  323. data/lib/jets/resource/permission.rb +45 -0
  324. data/lib/jets/resource/replacer.rb +77 -0
  325. data/lib/jets/resource/route53.rb +3 -0
  326. data/lib/jets/resource/route53/record_set.rb +70 -0
  327. data/lib/jets/resource/s3.rb +17 -0
  328. data/lib/jets/resource/sns.rb +3 -0
  329. data/lib/jets/resource/sqs.rb +3 -0
  330. data/lib/jets/resource/standardizer.rb +42 -0
  331. data/lib/jets/route.rb +166 -0
  332. data/lib/jets/router.rb +175 -0
  333. data/lib/jets/router/scope.rb +30 -0
  334. data/lib/jets/rule.rb +4 -0
  335. data/lib/jets/rule/base.rb +19 -0
  336. data/lib/jets/rule/dsl.rb +110 -0
  337. data/lib/jets/spec_helpers.rb +52 -0
  338. data/lib/jets/spec_helpers/params.rb +10 -0
  339. data/lib/jets/spec_helpers/request.rb +98 -0
  340. data/lib/jets/spec_helpers/response.rb +5 -0
  341. data/lib/jets/stack.rb +103 -0
  342. data/lib/jets/stack/builder.rb +38 -0
  343. data/lib/jets/stack/definition.rb +50 -0
  344. data/lib/jets/stack/function.rb +60 -0
  345. data/lib/jets/stack/main.rb +5 -0
  346. data/lib/jets/stack/main/dsl.rb +33 -0
  347. data/lib/jets/stack/main/extensions/base.rb +45 -0
  348. data/lib/jets/stack/main/extensions/cloudwatch.rb +19 -0
  349. data/lib/jets/stack/main/extensions/lambda.rb +71 -0
  350. data/lib/jets/stack/main/extensions/sns.rb +12 -0
  351. data/lib/jets/stack/main/extensions/sqs.rb +36 -0
  352. data/lib/jets/stack/output.rb +38 -0
  353. data/lib/jets/stack/output/dsl.rb +19 -0
  354. data/lib/jets/stack/output/lookup.rb +36 -0
  355. data/lib/jets/stack/parameter.rb +38 -0
  356. data/lib/jets/stack/parameter/dsl.rb +42 -0
  357. data/lib/jets/stack/resource.rb +32 -0
  358. data/lib/jets/stack/resource/dsl.rb +19 -0
  359. data/lib/jets/tmp_loader.rb +52 -0
  360. data/lib/jets/turbine.rb +30 -0
  361. data/lib/jets/turbo.rb +47 -0
  362. data/lib/jets/turbo/database_yaml.rb +41 -0
  363. data/lib/jets/turbo/project/.gitignore +12 -0
  364. data/lib/jets/turbo/project/.jetskeep +1 -0
  365. data/lib/jets/turbo/project/Gemfile +16 -0
  366. data/lib/jets/turbo/project/Rakefile +2 -0
  367. data/lib/jets/turbo/project/app/controllers/application_controller.rb +2 -0
  368. data/lib/jets/turbo/project/app/helpers/application_helper.rb +2 -0
  369. data/lib/jets/turbo/project/app/jobs/application_job.rb +4 -0
  370. data/lib/jets/turbo/project/config.ru +5 -0
  371. data/lib/jets/turbo/project/config/application.rb +4 -0
  372. data/lib/jets/turbo/project/config/routes.rb +4 -0
  373. data/lib/jets/turbo/rail.rb +113 -0
  374. data/lib/jets/turbo/templates/config/database.yml +26 -0
  375. data/lib/jets/util.rb +38 -0
  376. data/lib/jets/version.rb +3 -0
  377. data/readme/prerelease.md +6 -0
  378. data/readme/testing.md +60 -0
  379. metadata +859 -0
@@ -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,5 @@
1
+ module Jets::Controller::Rack
2
+ autoload :Adapter, "jets/controller/rack/adapter"
3
+ autoload :Env, "jets/controller/rack/env"
4
+ autoload :Middleware, "jets/controller/rack/middleware"
5
+ end
@@ -0,0 +1,63 @@
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
+ "statusCode" => status,
38
+ "headers" => headers,
39
+ "body" => body,
40
+ "isBase64Encoded" => base64,
41
+ }
42
+ end
43
+
44
+ # Called from Jets::Controller::Base.process. Example:
45
+ #
46
+ # adapter.rack_vars(
47
+ # 'jets.controller' => self,
48
+ # 'lambda.context' => context,
49
+ # 'lambda.event' => event,
50
+ # 'lambda.meth' => meth,
51
+ # )
52
+ #
53
+ # Passes a these special variables so we have access to them in the middleware.
54
+ # The controller instance is called in the Main middleware.
55
+ # The lambda.* info is used by the Rack::Local middleware to create a mimicked
56
+ # controller for the local server.
57
+ #
58
+ def rack_vars(vars)
59
+ env.merge!(vars)
60
+ end
61
+
62
+ end
63
+ 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,84 @@
1
+ class Jets::Controller
2
+ module Rendering
3
+ autoload :RackRenderer, "jets/controller/rendering/rack_renderer"
4
+ include Redirection
5
+
6
+ def ensure_render
7
+ return @rendered_data if @rendered
8
+
9
+ # defaults to rendering templates
10
+ RackRenderer.new(self, managed_options).render
11
+ end
12
+
13
+ # Many different ways to render:
14
+ #
15
+ # render "articles/index", layout: "application"
16
+ # render :new
17
+ # render template: "articles/index", layout: "application"
18
+ # render json: {my: "data"}
19
+ # render text: "plain text"
20
+ def render(options={}, rest={})
21
+ raise "DoubleRenderError" if @rendered
22
+
23
+ if options.is_a?(Symbol) or options.is_a?(String)
24
+ options = normalize_options(options, rest)
25
+ end
26
+
27
+ options.reverse_merge!(managed_options)
28
+ adjust_content_type!(options)
29
+
30
+ @rendered_data = RackRenderer.new(self, options).render
31
+
32
+ @rendered = true
33
+ @rendered_data
34
+ end
35
+
36
+ def adjust_content_type!(options)
37
+ if options.key?(:json)
38
+ options[:content_type] = "application/json"
39
+ elsif options.key?(:xml)
40
+ options[:content_type] = "application/xml"
41
+ end
42
+ end
43
+
44
+ def managed_options
45
+ layout = self.class.layout.nil? ? default_layout : self.class.layout
46
+ options = { layout: layout }
47
+ options[:headers] = response.headers unless response.headers.empty?
48
+ options
49
+ end
50
+
51
+ def default_layout
52
+ application_layout_exist = !Dir.glob("#{Jets.root}/app/views/layouts/application*").empty?
53
+ "application" if application_layout_exist
54
+ end
55
+
56
+ # Can normalize the options when it is a String or a Symbol
57
+ # Also set defaults here like the layout.
58
+ # Ensure options is a Hash, not a String or Symbol.
59
+ def normalize_options(options, rest)
60
+ template = options.to_s
61
+ rest.merge(template: template)
62
+ end
63
+
64
+ # Add API Gateway Stage Name
65
+ def add_stage_name(url)
66
+ return url unless actual_host
67
+
68
+ if actual_host.include?("amazonaws.com") && url.starts_with?('/')
69
+ stage_name = Jets::Resource::ApiGateway::Deployment.stage_name
70
+ url = "/#{stage_name}#{url}"
71
+ end
72
+ url
73
+ end
74
+
75
+ def url_for(url)
76
+ add_stage_name(url)
77
+ end
78
+
79
+ def actual_host
80
+ headers["host"]
81
+ end
82
+
83
+ end
84
+ end
@@ -0,0 +1,238 @@
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
+ renderer = ActionController::Base.renderer.new(renderer_options)
34
+ body = renderer.render(render_options)
35
+ body = StringIO.new(body)
36
+ end
37
+
38
+ [status, headers, body] # triplet
39
+ end
40
+
41
+ # Example: posts/index
42
+ def default_template_name
43
+ "#{template_namespace}/#{@controller.meth}"
44
+ end
45
+
46
+ # PostsController => "posts" is the namespace
47
+ def template_namespace
48
+ @controller.class.to_s.sub('Controller','').underscore.pluralize
49
+ end
50
+
51
+ # default options:
52
+ # https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/renderer.rb#L41-L47
53
+ def renderer_options
54
+ options = {
55
+ # script_name: "", # unfortunately doesnt seem to effect relative_url_root like desired
56
+ # input: ""
57
+ }
58
+
59
+ origin = headers["origin"]
60
+ if origin
61
+ uri = URI.parse(origin)
62
+ options[:https] = uri.scheme == "https"
63
+ end
64
+
65
+ # Important to not use rack_headers as local variable instead of headers.
66
+ # headers is a method that gets deleted to controller.headers and using it
67
+ # seems to cause issues.
68
+ rack_headers = rackify_headers(headers)
69
+ options.merge!(rack_headers)
70
+
71
+ # Note @options[:method] uses @options vs options on purpose
72
+ @options[:method] = event["httpMethod"].downcase if event["httpMethod"]
73
+ options
74
+ end
75
+
76
+ # Takes headers and adds HTTP_ to front of the keys because that is what rack
77
+ # does to the headers passed from a request. This seems to be the standard
78
+ # when testing with curl and inspecting the headers in a Rack app. Example:
79
+ # https://gist.github.com/tongueroo/94f22f6c261c8999e4f4f776547e2ee3
80
+ #
81
+ # This is useful for:
82
+ #
83
+ # ActionController::Base.renderer.new(renderer_options)
84
+ #
85
+ # renderer_options are rack normalized headers.
86
+ #
87
+ # Example input (from api gateway)
88
+ #
89
+ # {"host"=>"localhost:8888",
90
+ # "user-agent"=>"curl/7.53.1",
91
+ # "accept"=>"*/*",
92
+ # "version"=>"HTTP/1.1",
93
+ # "x-amzn-trace-id"=>"Root=1-5bde5b19-61d0d4ab4659144f8f69e38f"}
94
+ #
95
+ # Example output:
96
+ #
97
+ # {"HTTP_HOST"=>"localhost:8888",
98
+ # "HTTP_USER_AGENT"=>"curl/7.53.1",
99
+ # "HTTP_ACCEPT"=>"*/*",
100
+ # "HTTP_VERSION"=>"HTTP/1.1",
101
+ # "HTTP_X_AMZN_TRACE_ID"=>"Root=1-5bde5b19-61d0d4ab4659144f8f69e38f"}
102
+ #
103
+ def rackify_headers(headers)
104
+ results = {}
105
+ headers.each do |k,v|
106
+ rack_key = 'HTTP_' + k.gsub('-','_').upcase
107
+ results[rack_key] = v
108
+ end
109
+ results
110
+ end
111
+
112
+ def render_options
113
+ # nomralize the template option
114
+ template = @options[:template]
115
+ if template and !template.include?('/')
116
+ template = "#{template_namespace}/#{template}"
117
+ end
118
+ template ||= default_template_name
119
+ # ready to override @options[:template]
120
+ @options[:template] = template if @options[:template]
121
+
122
+ render_options = {
123
+ template: template, # weird: template needs to be set no matter because it
124
+ # sets the name which is used in lookup_context.rb:209:in `normalize_name'
125
+ layout: @options[:layout],
126
+ assigns: controller_instance_variables,
127
+ }
128
+ types = %w[json inline plain file xml body action].map(&:to_sym)
129
+ types.each do |type|
130
+ render_options[type] = @options[type] if @options[type]
131
+ end
132
+
133
+ render_options
134
+ end
135
+
136
+ def controller_instance_variables
137
+ instance_vars = @controller.instance_variables.inject({}) do |vars, v|
138
+ k = v.to_s.sub(/^@/,'') # @var => var
139
+ vars[k] = @controller.instance_variable_get(v)
140
+ vars
141
+ end
142
+ instance_vars[:event] = event
143
+ instance_vars
144
+ end
145
+
146
+ private
147
+ # From jets/controller/response.rb
148
+ def drop_content_info?(status)
149
+ status.to_i / 100 == 1 or drop_body?(status)
150
+ end
151
+
152
+ DROP_BODY_RESPONSES = [204, 304]
153
+ def drop_body?(status)
154
+ DROP_BODY_RESPONSES.include?(status.to_i)
155
+ end
156
+
157
+ # maps:
158
+ # :continue => 100
159
+ # :success => 200
160
+ # etc
161
+ def normalize_status_code(code)
162
+ status_code = if code.is_a?(Symbol)
163
+ Rack::Utils::SYMBOL_TO_STATUS_CODE[code]
164
+ else
165
+ code
166
+ end
167
+ (status_code || 200).to_s # API Gateway requires a string but rack is okay with either
168
+ end
169
+
170
+ def set_content_type!(status, headers)
171
+ if drop_content_info?(status)
172
+ headers.delete "Content-Length"
173
+ headers.delete "Content-Type"
174
+ else
175
+ headers["Content-Type"] = @options[:content_type] ||
176
+ headers['content-type'] || # Mega Mode (Rails)
177
+ headers['Content-Type'] || # Just in case
178
+ Jets::Controller::DEFAULT_CONTENT_TYPE
179
+ end
180
+ end
181
+
182
+ def normalized_base64_option(options)
183
+ base64 = @options[:base64] if options.key?(:base64)
184
+ base64 = @options[:isBase64Encoded] if options.key?(:isBase64Encoded)
185
+ base64
186
+ end
187
+
188
+ class << self
189
+ def setup!
190
+ require "action_controller"
191
+ require "jets/overrides/rails"
192
+
193
+ # Load helpers
194
+ # Assign local variable because scoe in the `:action_view do` changes
195
+ app_helper_classes = find_app_helper_classes
196
+ ActiveSupport.on_load :action_view do
197
+ include ApplicationHelper # include first
198
+ app_helper_classes.each do |helper_class|
199
+ include helper_class
200
+ end
201
+ end
202
+
203
+ ActionController::Base.append_view_path("#{Jets.root}/app/views")
204
+
205
+ setup_webpacker if Jets.webpacker?
206
+ end
207
+
208
+ # Does not include ApplicationHelper, will include ApplicationHelper explicitly first.
209
+ def find_app_helper_classes
210
+ klasses = []
211
+ expression = "#{Jets.root}/app/helpers/**/*"
212
+ Dir.glob(expression).each do |path|
213
+ next unless File.file?(path)
214
+ class_name = path.sub("#{Jets.root}/app/helpers/","").sub(/\.rb/,'')
215
+ unless class_name == "application_helper"
216
+ klasses << class_name.classify.constantize # autoload
217
+ end
218
+ end
219
+ klasses
220
+ end
221
+
222
+ def setup_webpacker
223
+ require 'webpacker'
224
+ require 'webpacker/helper'
225
+
226
+ ActiveSupport.on_load :action_controller do
227
+ ActionController::Base.helper Webpacker::Helper
228
+ end
229
+
230
+ ActiveSupport.on_load :action_view do
231
+ include Webpacker::Helper
232
+ end
233
+ end
234
+ end
235
+ end
236
+ end
237
+
238
+ Jets::Controller::Rendering::RackRenderer.setup!