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,17 @@
1
+ class Jets::Controller
2
+ module Layout
3
+ extend ActiveSupport::Concern
4
+ included do
5
+ class_attribute :layout_name
6
+
7
+ def self.layout(name=nil)
8
+ if !name.nil?
9
+ name = name.to_s if name.is_a?(Symbol)
10
+ self.layout_name = name
11
+ else
12
+ self.layout_name
13
+ end
14
+ end
15
+ end # included
16
+ end # Layout
17
+ end
@@ -0,0 +1,5 @@
1
+ module Jets::Controller::Middleware
2
+ autoload :Cors, "jets/controller/middleware/cors"
3
+ autoload :Local, "jets/controller/middleware/local"
4
+ autoload :Main, "jets/controller/middleware/main"
5
+ end
@@ -0,0 +1,60 @@
1
+ # The rack cors middleware handles all types of requests locally, this includes the OPTIONS request.
2
+ # Remotely on lambda, the rack cors middleware handles all requests except the OPTIONS request.
3
+ # The options request is handled by a OPTIONS API Gateway Method Mock. This is to allow it to bypass
4
+ # API Gateway authorizers.
5
+ module Jets::Controller::Middleware
6
+ class Cors
7
+ extend Memoist
8
+
9
+ def initialize(app)
10
+ @app = app
11
+ end
12
+
13
+ def call(env)
14
+ if env['REQUEST_METHOD'] == 'OPTIONS'
15
+ return [200, cors_headers(true), StringIO.new]
16
+ end
17
+
18
+ status, headers, body = @app.call(env)
19
+ cors_headers.each do |k,v|
20
+ headers[k] ||= v
21
+ end
22
+ [status, headers, body]
23
+ end
24
+
25
+ def cors_headers(preflight=false)
26
+ headers = case Jets.config.cors
27
+ when true
28
+ {
29
+ "access-control-allow-origin" => "*", # Required for CORS support to work
30
+ "access-control-allow-credentials" => "true" # Required for cookies, authorization headers with HTTPS
31
+ }
32
+ when String
33
+ {
34
+ "access-control-allow-origin" => Jets.config.cors, # contains Hash with Access-Control-Allow-* values
35
+ "access-control-allow-credentials" => "true" # Required for cookies, authorization headers with HTTPS
36
+ }
37
+ when Hash
38
+ Jets.config.cors # contains Hash with Access-Control-Allow-* values
39
+ else
40
+ {}
41
+ end
42
+
43
+ headers.merge!(preflight_headers) if preflight
44
+ headers
45
+ end
46
+
47
+ private
48
+ # Preflight OPTIONS request has extra headers.
49
+ # This is only used locally. Remotely on AWS Lambda, OPTIONS requests are handled by an API Gateway Method.
50
+ def preflight_headers
51
+ # FYI: Jets as part of the rack processing normalizes the casing of these headers eventually.
52
+ # IE: Access-Control-Allow-Methods
53
+ default = {
54
+ "access-control-allow-methods" => "DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT",
55
+ "access-control-allow-headers" => "Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent",
56
+ }
57
+ Jets.config.cors_preflight || default
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,119 @@
1
+ require 'kramdown'
2
+
3
+ # Handles mimicking of API Gateway to Lambda function call locally
4
+ module Jets::Controller::Middleware
5
+ class Local
6
+ extend Memoist
7
+
8
+ autoload :ApiGateway, 'jets/controller/middleware/local/api_gateway'
9
+ autoload :MimicAwsCall, 'jets/controller/middleware/local/mimic_aws_call'
10
+ autoload :RouteMatcher, 'jets/controller/middleware/local/route_matcher'
11
+
12
+ def initialize(app)
13
+ @app = app
14
+ end
15
+
16
+ def call(env)
17
+ route = RouteMatcher.new(env).find_route
18
+ unless route
19
+ return [404, {'Content-Type' => 'text/html'}, not_found(env)]
20
+ end
21
+
22
+ mimic = MimicAwsCall.new(route, env)
23
+ # Make @controller and @meth instance available so we dont not have to pass it around.
24
+ @controller, @meth, @event = mimic.controller, mimic.meth, mimic.event
25
+
26
+ if route.to == 'jets/rack#process' # megamode
27
+ # Bypass the Jets middlewares since it could interfere with the Rack
28
+ # application's middleware stack.
29
+ #
30
+ # Rails sends back a transfer-encoding=chunked. Curling Rails directly works,
31
+ # but passing the Rails response back through this middleware results in errors.
32
+ # Disable chunking responses by deleting the transfer-encoding response header.
33
+ # Would like to understand why this happens this better, if someone can explain please let me know.
34
+ status, headers, body = @controller.dispatch! # jets/rack_controller
35
+ headers.delete "transfer-encoding"
36
+ [status, headers, body]
37
+ elsif polymorphic_function?
38
+ # Will never hit when calling polymorphic function on AWS Lambda.
39
+ # This can only really get called with the local server.
40
+ run_polymophic_function
41
+ else # Normal Jets request
42
+ mimick_aws_lambda!(env, mimic.vars) unless on_aws?(env)
43
+ @app.call(env)
44
+ end
45
+ end
46
+
47
+ def polymorphic_function?
48
+ polymorphic_function.task.lang != :ruby
49
+ end
50
+
51
+ def polymorphic_function
52
+ # Abusing PolyFun to run polymorphic code, should call LambdaExecutor directly
53
+ # after reworking LambdaExecutor so it has a better interface.
54
+ Jets::PolyFun.new(@controller.class, @meth)
55
+ end
56
+ memoize :polymorphic_function
57
+
58
+ def run_polymophic_function
59
+ resp = polymorphic_function.run(@event, @meth) # polymorphic code
60
+ status = resp['statusCode']
61
+ headers = resp['headers']
62
+ body = StringIO.new(resp['body'])
63
+ [status, headers, body] # triplet
64
+ end
65
+
66
+ # Modifies env the in the same way real call from AWS lambda would modify env
67
+ def mimick_aws_lambda!(env, vars)
68
+ env.merge!(vars)
69
+ env
70
+ end
71
+
72
+ def on_aws?(env)
73
+ return false if ENV['TEST'] # usually with test we're passing in full API Gateway fixtures with the HTTP_X_AMZN_TRACE_ID
74
+ !!env['HTTP_X_AMZN_TRACE_ID']
75
+ end
76
+
77
+ def routes_error_message(env)
78
+ message = "<h2>404 Error: Route #{env['PATH_INFO'].sub('/','')} not found</h2>"
79
+ if Jets.env != "production"
80
+ message << "<p>Here are the routes defined in your application:</p>"
81
+ message << "#{routes_table}"
82
+ end
83
+ message
84
+ end
85
+
86
+ def not_found(env)
87
+ message = routes_error_message(env)
88
+ body = <<~HTML
89
+ <!DOCTYPE html>
90
+ <html>
91
+ <head>
92
+ <meta charset="utf-8">
93
+ <title>Route not found</title>
94
+ </head>
95
+ <body>
96
+ #{message}
97
+ </body>
98
+ </html>
99
+ HTML
100
+ StringIO.new(body)
101
+ end
102
+
103
+ # Show pretty route table for user to help with debugging in non-production mode
104
+ def routes_table
105
+ routes = Jets::Router.routes
106
+
107
+ return "Your routes table is empty." if routes.empty?
108
+
109
+ text = "Verb | Path | Controller#action\n"
110
+ text << "--- | --- | ---\n"
111
+ routes.each do |route|
112
+ text << "#{route.method} | #{route.path} | #{route.to}\n"
113
+ end
114
+ html = Kramdown::Document.new(text).to_html
115
+ puts html
116
+ html
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,93 @@
1
+ # Takes a Rack env and converts to ApiGateway event
2
+ class Jets::Controller::Middleware::Local
3
+ class ApiGateway
4
+ extend Memoist
5
+
6
+ def initialize(route, env)
7
+ @route, @env = route, env
8
+ end
9
+
10
+ def event
11
+ resource = @route.path(:api_gateway) # posts/{id}/edit
12
+ path = @env['PATH_INFO'].sub('/','') # remove beginning slash
13
+ {
14
+ "resource" => "/#{resource}", # "/posts/{id}/edit"
15
+ "path" => @env['PATH_INFO'], # /posts/tung/edit
16
+ "httpMethod" => @env['REQUEST_METHOD'], # GET
17
+ "headers" => request_headers,
18
+ "queryStringParameters" => query_string_parameters,
19
+ "pathParameters" => @route.extract_parameters(path),
20
+ "stageVariables" => nil,
21
+ "requestContext" => {},
22
+ "body" => get_body,
23
+ "isBase64Encoded" => false,
24
+ }
25
+ end
26
+ memoize :event
27
+
28
+ # Annoying. The headers part of the AWS Lambda proxy structure
29
+ # does not consisently use the same casing scheme for the header keys.
30
+ # Sometimes it looks like this:
31
+ # Accept-Encoding
32
+ # and sometimes it looks like this:
33
+ # cache-control
34
+ # Map for special cases when the casing doesn't match.
35
+ CASING_MAP = {
36
+ "Cache-Control" => "cache-control",
37
+ "Content-Type" => "content-type",
38
+ "Origin" => "origin",
39
+ "Upgrade-Insecure-Requests" => "upgrade-insecure-requests",
40
+ }
41
+
42
+ # Map rack env headers to Api Gateway event headers. Most rack env headers are
43
+ # prepended by HTTP_.
44
+ #
45
+ # Some API Gateway Lambda Proxy are also in the rack env headers. Example:
46
+ #
47
+ # "X-Amz-Cf-Id": "W8DF6J-lx1bkV00eCiBwIq5dldTSGGiG4BinJlxvN_4o8fCZtbsVjw==",
48
+ # "X-Amzn-Trace-Id": "Root=1-5a0dc1ac-58a7db712a57d6aa4186c2ac",
49
+ # "X-Forwarded-For": "88.88.88.88, 54.239.203.117",
50
+ # "X-Forwarded-Port": "443",
51
+ # "X-Forwarded-Proto": "https",
52
+ #
53
+ # For sample dump of the event headers, check out:
54
+ # spec/fixtures/samples/event-headers-form-post.json
55
+ #
56
+ # We generally do add those API Gateway Lambda specific headers because
57
+ # they would be fake anyway and by not adding them we can distinguish a
58
+ # local request from a remote request on API Gateway.
59
+ def request_headers
60
+ headers = @env.select { |k,v| k =~ /^HTTP_/ }.inject({}) do |h,(k,v)|
61
+ # map things like HTTP_USER_AGENT to "User-Agent"
62
+ key = k.sub('HTTP_','').split('_').map(&:capitalize).join('-')
63
+ h[key] = v
64
+ h
65
+ end
66
+ # Content type is not prepended with HTTP_
67
+ headers["Content-Type"] = @env["CONTENT_TYPE"] if @env["CONTENT_TYPE"]
68
+
69
+ # Adjust the casing so it matches the Lambda AWS Proxy structure
70
+ CASING_MAP.each do |nice_casing, bad_casing|
71
+ if headers.key?(nice_casing)
72
+ headers[bad_casing] = headers.delete(nice_casing)
73
+ end
74
+ end
75
+
76
+ headers
77
+ end
78
+
79
+ def query_string_parameters
80
+ Rack::Utils.parse_nested_query(@env['QUERY_STRING'])
81
+ end
82
+
83
+ # To get the post body:
84
+ # rack.input: #<StringIO:0x007f8ccf8db9a0>
85
+ def get_body
86
+ input = @env["rack.input"] || StringIO.new
87
+ body = input.read
88
+ input.rewind # IMPORTANT or else it screws up other middlewares that use the body
89
+ # return nil for blank string, because Lambda AWS_PROXY does this
90
+ body unless body.empty?
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,38 @@
1
+ class Jets::Controller::Middleware::Local
2
+ class MimicAwsCall
3
+ extend Memoist
4
+
5
+ def initialize(route, env)
6
+ @route, @env = route, env
7
+ end
8
+
9
+ def vars
10
+ {
11
+ 'jets.controller' => controller,
12
+ 'lambda.context' => context,
13
+ 'lambda.event' => event,
14
+ 'lambda.meth' => meth,
15
+ }
16
+ end
17
+
18
+ # Actual controller instance
19
+ def controller
20
+ controller_class = @route.controller_name.constantize
21
+ meth = @route.action_name
22
+ controller_class.new(event, context, meth)
23
+ end
24
+
25
+ def meth
26
+ @route.action_name
27
+ end
28
+
29
+ def event
30
+ @env['adapter.event'] || ApiGateway.new(@route, @env).event
31
+ end
32
+ memoize :event
33
+
34
+ def context
35
+ @env['adapter.context'] || {"fake" => "context in mimic_aws_call.rb"}
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,97 @@
1
+ class Jets::Controller::Middleware::Local
2
+ class RouteMatcher
3
+ def initialize(env)
4
+ @env = env
5
+ end
6
+
7
+ def find_route
8
+ # Precedence:
9
+ # 1. Routes with no captures get highest precedence: posts/new
10
+ # 2. Then we consider the routes with captures: post/:id
11
+ #
12
+ # Within these 2 groups we consider the routes with the longest path first
13
+ # since posts/:id and posts/:id/edit can both match.
14
+ routes = router.ordered_routes
15
+ route = routes.find do |r|
16
+ route_found?(r)
17
+ end
18
+ route
19
+ end
20
+
21
+ def route_found?(route)
22
+ request_method = @env["REQUEST_METHOD"] || "GET"
23
+ actual_path = @env["PATH_INFO"].sub(/^\//,'') # remove beginning slash
24
+
25
+ # Immediately stop checking when the request method: GET, POST, ANY, etc
26
+ # doesnt match.
27
+ return false if request_method != route.method and route.method != "ANY"
28
+
29
+ path = route.path
30
+
31
+ if actual_path == path
32
+ # regular string match detection
33
+ return true # exact route matches are highest precedence
34
+ end
35
+
36
+ # Check path for route capture and wildcard matches:
37
+ # A colon (:) means the variable has a variable
38
+ if path.include?(':') # 2nd highest precedence
39
+ capture_detection(path, actual_path) # early return true or false
40
+ # A star (*) means the variable has a glob
41
+ elsif path.include?('*') # lowest precedence
42
+ proxy_detection(path, actual_path) # early return true or false
43
+ else
44
+ false # reach here, means no route matched
45
+ end
46
+ end
47
+
48
+ # catchall/globbing/wildcard/proxy routes. Examples:
49
+ #
50
+ # get "files/*path", to: "files#show"
51
+ # get "others/*rest", to: "others#show"
52
+ # get "*catchall", to: "public_files#show" # last catchall route for Jets
53
+ #
54
+ def proxy_detection(route_path, actual_path)
55
+ # drop the proxy_segment
56
+ leading_path = route_path.split('/')[0..-2].join('/')
57
+
58
+ # get "*catchall", to: "public_files#show"
59
+ if leading_path.empty? # This is the last catchall route "*catchall"
60
+ return true # always return true here because the entire path
61
+ # will always match
62
+ end
63
+
64
+ # Other types of wildcard route:
65
+ #
66
+ # get "files/*path", to: "files#show"
67
+ # get "others/*rest", to: "others#show"
68
+ unless leading_path.ends_with?('/')
69
+ # Ensure trailing slash to make pattern matching stricter
70
+ leading_path = "#{leading_path}/"
71
+ end
72
+
73
+ pattern = "^#{leading_path}"
74
+ regexp = Regexp.new(pattern)
75
+ !!regexp.match(actual_path) # could be true or false
76
+ end
77
+
78
+ def capture_detection(route_path, actual_path)
79
+ # changes path to a string used for a regexp
80
+ # posts/:id/edit => posts\/(.*)\/edit
81
+
82
+ regexp_string = route_path.split('/').map do |s|
83
+ s.include?(':') ? Jets::Route::CAPTURE_REGEX : s
84
+ end.join('\/')
85
+ # make sure beginning and end of the string matches
86
+ regexp_string = "^#{regexp_string}$"
87
+
88
+ regexp = Regexp.new(regexp_string)
89
+ !!regexp.match(actual_path) # could be true or false
90
+ end
91
+
92
+ def router
93
+ return @router if @router
94
+ @router = Jets.application.routes
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,46 @@
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
+ dup.call!
22
+ end
23
+
24
+ def call!
25
+ setup
26
+ @controller.dispatch! # Returns triplet
27
+ end
28
+
29
+ # Common setup logical at this point of middleware processing right before
30
+ # calling any controller actions.
31
+ def setup
32
+ # We already recreated a mimicke rack env earlier as part of the very first
33
+ # middleware layer. However, by the time the rack env reaches the main middleware
34
+ # it could had been updated by other middlewares. We update the env here again.
35
+ @controller.request.set_env!(@env)
36
+ # This allows sesison helpers to work. Sessions are managed by
37
+ # the Rack::Session::Cookie middleware by default.
38
+ @controller.session = @env['rack.session'] || {}
39
+ end
40
+
41
+ def self.call(env)
42
+ instance = new(env)
43
+ instance.call
44
+ end
45
+ end
46
+ end