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,25 @@
1
+ class Jets::RackController < Jets::Controller::Base
2
+ layout false
3
+ internal true
4
+
5
+ # Megamode
6
+ def process
7
+ resp = mega_request
8
+ render(resp)
9
+ end
10
+
11
+ private
12
+ # Override process! so it doesnt go through middleware adapter and hits
13
+ # process logic directly. This handles the case for AWS Lambda.
14
+ # For local server, we adjust the Middleware::Local logic.
15
+ def process!
16
+ status, headers, body = dispatch!
17
+ # Use the adapter only to convert the Rack triplet to a API Gateway hash structure
18
+ adapter = Jets::Controller::Rack::Adapter.new(event, context, meth)
19
+ adapter.convert_to_api_gateway(status, headers, body)
20
+ end
21
+
22
+ def mega_request
23
+ Jets::Mega::Request.new(event, self).proxy
24
+ end
25
+ end
@@ -0,0 +1,153 @@
1
+ require 'aws-sdk-apigateway'
2
+ require 'aws-sdk-cloudformation'
3
+
4
+ STAGE_NAME = "<%= @stage_name %>"
5
+
6
+ def lambda_handler(event:, context:)
7
+ puts("event['RequestType'] #{event['RequestType']}")
8
+ puts("event: #{JSON.dump(event)}")
9
+ puts("context: #{JSON.dump(context)}")
10
+ puts("context.log_stream_name #{context.log_stream_name.inspect}")
11
+
12
+ mimic = event['ResourceProperties']['Mimic']
13
+ physical_id = event['ResourceProperties']['PhysicalId'] || "PhysicalId"
14
+
15
+ puts "mimic: #{mimic}"
16
+ puts "physical_id: #{physical_id}"
17
+
18
+ if event['RequestType'] == 'Delete'
19
+ if mimic == 'FAILED'
20
+ send_response(event, context, "FAILED")
21
+ else
22
+ mapping = BasePathMapping.new(event)
23
+ mapping.delete(true) if mapping.should_delete?
24
+ send_response(event, context, "SUCCESS")
25
+ end
26
+ return # early return
27
+ end
28
+
29
+ mapping = BasePathMapping.new(event)
30
+ mapping.update
31
+
32
+ response_status = mimic == "FAILED" ? "FAILED" : "SUCCESS"
33
+ response_data = { "Hello" => "World" }
34
+
35
+ send_response(event, context, response_status, response_data, physical_id)
36
+
37
+ # We rescue all exceptions and send an message to CloudFormation so we dont have to
38
+ # wait for over an hour for the stack operation to timeout and rollback.
39
+ rescue Exception => e
40
+ puts e.message
41
+ puts e.backtrace
42
+ sleep 10 # provide delete to make sure that the log gets sent to CloudWatch
43
+ send_response(event, context, "FAILED")
44
+ end
45
+
46
+ def send_response(event, context, response_status, response_data={}, physical_id="PhysicalId")
47
+ response_body = JSON.dump(
48
+ Status: response_status,
49
+ Reason: "See the details in CloudWatch Log Stream: #{context.log_stream_name.inspect}",
50
+ PhysicalResourceId: physical_id,
51
+ StackId: event['StackId'],
52
+ RequestId: event['RequestId'],
53
+ LogicalResourceId: event['LogicalResourceId'],
54
+ Data: response_data
55
+ )
56
+
57
+ puts "RESPONSE BODY:\n"
58
+ puts response_body
59
+
60
+ url = event['ResponseURL']
61
+ uri = URI(url)
62
+ http = Net::HTTP.new(uri.host, uri.port)
63
+ http.open_timeout = http.read_timeout = 30
64
+ http.use_ssl = true if uri.scheme == 'https'
65
+
66
+
67
+ # must used url to include the AWSAccessKeyId and Signature
68
+ req = Net::HTTP::Put.new(url) # url includes query string and uri.path does not, must used url t
69
+ req.body = response_body
70
+ req.content_length = response_body.bytesize
71
+
72
+ # set headers
73
+ req['content-type'] = ''
74
+ req['content-length'] = response_body.bytesize
75
+
76
+ res = http.request(req)
77
+ puts "status code: #{res.code}"
78
+ puts "headers: #{res.each_header.to_h.inspect}"
79
+ puts "body: #{res.body}"
80
+ end
81
+
82
+
83
+ class BasePathMapping
84
+ def initialize(event)
85
+ @event = event
86
+ @rest_api_id = get_rest_api_id
87
+ @domain_name = get_domain_name
88
+ @base_path = ''
89
+ end
90
+
91
+ def update
92
+ # Cannot use update_base_path_mapping to update the base_mapping because it doesnt
93
+ # allow us to change the rest_api_id. So we delete and create.
94
+ delete(true)
95
+ create
96
+ end
97
+
98
+ # Dont delete the newly created base path mapping unless this is an operation
99
+ # where we're fully deleting the stack
100
+ def should_delete?
101
+ deleting_parent?
102
+ end
103
+
104
+ def delete(fail_silently=false)
105
+ apigateway.delete_base_path_mapping(
106
+ domain_name: @domain_name, # required
107
+ base_path: '(none)',
108
+ )
109
+ rescue Aws::APIGateway::Errors::NotFoundException => e
110
+ raise(e) unless fail_silently
111
+ end
112
+
113
+ def create
114
+ apigateway.create_base_path_mapping(
115
+ domain_name: @domain_name, # required
116
+ base_path: @base_path,
117
+ rest_api_id: @rest_api_id, # required
118
+ stage: STAGE_NAME,
119
+ )
120
+ end
121
+
122
+ def get_domain_name
123
+ param = deployment_stack[:parameters].find { |p| p.parameter_key == 'DomainName' }
124
+ param.parameter_value
125
+ end
126
+
127
+ def deployment_stack
128
+ @deployment_stack ||= cfn.describe_stacks(stack_name: @event['StackId']).stacks.first
129
+ end
130
+
131
+ def get_rest_api_id
132
+ param = deployment_stack[:parameters].find { |p| p.parameter_key == 'RestApi' }
133
+ param.parameter_value
134
+ end
135
+
136
+ def deleting_parent?
137
+ stack = cfn.describe_stacks(stack_name: parent_stack_name).stacks.first
138
+ stack.stack_status == 'DELETE_IN_PROGRESS'
139
+ end
140
+
141
+ def parent_stack_name
142
+ deployment_stack[:root_id]
143
+ end
144
+
145
+ private
146
+ def apigateway
147
+ @apigateway ||= Aws::APIGateway::Client.new
148
+ end
149
+
150
+ def cfn
151
+ @cfn ||= Aws::CloudFormation::Client.new
152
+ end
153
+ end
@@ -0,0 +1,62 @@
1
+ class Jets::PreheatJob < ApplicationJob
2
+ ENABLED = Jets.config.prewarm.enable
3
+ CONCURRENCY = Jets.config.prewarm.concurrency
4
+ PREWARM_RATE = Jets.config.prewarm.rate
5
+ torching = ENABLED && CONCURRENCY > 1
6
+ warming = ENABLED && CONCURRENCY == 1
7
+
8
+ class_timeout 30
9
+ class_memory 1024
10
+ class_iam_policy(
11
+ {
12
+ sid: "Statement1",
13
+ action: ["logs:*"],
14
+ effect: "Allow",
15
+ resource: "arn:aws:logs:#{Jets.aws.region}:#{Jets.aws.account}:log-group:#{Jets.config.project_namespace}-*",
16
+ },
17
+ {
18
+ sid: "Statement2",
19
+ action: ["lambda:InvokeFunction", "lambda:InvokeAsync"],
20
+ effect: "Allow",
21
+ resource: "arn:aws:lambda:#{Jets.aws.region}:#{Jets.aws.account}:function:#{Jets.config.project_namespace}-*",
22
+ }
23
+ )
24
+
25
+ rate(PREWARM_RATE) if torching
26
+ def torch
27
+ threads = []
28
+ CONCURRENCY.times do
29
+ threads << Thread.new do
30
+ # intentionally calling remote lambda for concurrency
31
+ # avoid passing the _prewarm=1 flag because we want the PreheatJob#warm
32
+ # to run it's normal workload.
33
+ # Do not use Jets::Preheat.warm(function_name) here as that passes the _prewarm=1.
34
+ function_name = "jets-preheat_job-warm"
35
+ event_json = JSON.dump(event)
36
+ options = call_options(event[:quiet])
37
+ Jets::Commands::Call.new(function_name, event_json, options).run unless ENV['TEST']
38
+ end
39
+ end
40
+ threads.each { |t| t.join }
41
+ "Finished prewarming your application with a concurrency of #{CONCURRENCY}."
42
+ end
43
+
44
+ rate(PREWARM_RATE) if warming
45
+ def warm
46
+ options = call_options(event[:quiet])
47
+ Jets::Preheat.warm_all(options)
48
+ "Finished prewarming your application."
49
+ end
50
+
51
+ private
52
+ def call_options(quiet)
53
+ options = {}
54
+ options.merge!(mute: true, mute_output: true) if quiet
55
+ # All the methods in this Job class leads to Jets::Commands::Call.
56
+ # This is true for the Jets::Preheat.warm_all also.
57
+ # These jobs delegate out to Lambda function calls. We do not need/want
58
+ # the invocation type: RequestResponse in this case.
59
+ options.merge!(invocation_type: "Event")
60
+ options
61
+ end
62
+ end
@@ -0,0 +1,14 @@
1
+ # Wrapper class works with jets/core_ext/kernel.rb
2
+ module Jets
3
+ class IO
4
+ class << self
5
+ def buffer
6
+ Kernel.io_buffer
7
+ end
8
+
9
+ def flush
10
+ Kernel.io_flush
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,4 @@
1
+ class Jets::Job
2
+ autoload :Dsl, "jets/job/dsl"
3
+ autoload :Base, "jets/job/base"
4
+ end
@@ -0,0 +1,29 @@
1
+ require 'json'
2
+
3
+ # Job public methods get turned into Lambda functions.
4
+ #
5
+ # Jets::Job::Base < Jets::Lambda::Functions
6
+ # Both Jets::Job::Base and Jets::Lambda::Functions have Dsl modules included.
7
+ # So the Jets::Job::Dsl overrides some of the Jets::Lambda::Functions behavior.
8
+ class Jets::Job
9
+ class Base < Jets::Lambda::Functions
10
+ include Dsl
11
+
12
+ class << self
13
+ def process(event, context, meth)
14
+ job = new(event, context, meth)
15
+ job.send(meth)
16
+ end
17
+
18
+ def perform_now(meth, event={}, context={})
19
+ new(event, context, meth).send(meth)
20
+ end
21
+
22
+ def perform_later(meth, event={}, context={})
23
+ function_name = "#{self.to_s.underscore}-#{meth}"
24
+ call = Jets::Commands::Call.new(function_name, JSON.dump(event), invocation_type: "Event")
25
+ call.run
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,108 @@
1
+ # Jets::Job::Base < Jets::Lambda::Functions
2
+ # Both Jets::Job::Base and Jets::Lambda::Functions have Dsl modules included.
3
+ # So the Jets::Job::Dsl overrides some of the Jets::Lambda::Functions behavior.
4
+ #
5
+ # Implements:
6
+ #
7
+ # default_associated_resource_definition
8
+ #
9
+ module Jets::Job::Dsl
10
+ extend ActiveSupport::Concern
11
+
12
+ included do
13
+ class << self
14
+ # Public: Creates CloudWatch Event Rule
15
+ #
16
+ # expression - The rate expression.
17
+ #
18
+ # Examples
19
+ #
20
+ # rate("10 minutes")
21
+ # rate("10 minutes", description: "Hard job")
22
+ #
23
+ def rate(expression, props={})
24
+ schedule_job("rate(#{expression})", props)
25
+ end
26
+
27
+ # Public: Creates CloudWatch Event Rule
28
+ #
29
+ # expression - The cron expression.
30
+ #
31
+ # Examples
32
+ #
33
+ # cron("0 */12 * * ? *")
34
+ # cron("0 */12 * * ? *", description: "Hard job")
35
+ #
36
+ def cron(expression, props={})
37
+ schedule_job("cron(#{expression})", props)
38
+ end
39
+
40
+ def schedule_job(expression, props={})
41
+ @associated_properties = nil # dont use any current associated_properties
42
+ props = props.merge(schedule_expression: expression)
43
+ associated_properties(props)
44
+ # Eager define resource
45
+ resource(events_rule_definition) # add associated resources immediately
46
+ @associated_properties = nil # reset for next definition, since we're defining eagerly
47
+ end
48
+
49
+ def event_pattern(details={}, props={})
50
+ @associated_properties = nil # dont use any current associated_properties
51
+ props = props.merge(event_pattern: details)
52
+ associated_properties(props)
53
+ # Eager define resource
54
+ resource(events_rule_definition) # add associated resources immediately
55
+ @associated_properties = nil # reset for next definition, since we're defining eagerly
56
+ add_descriptions # useful: generic description in the Event Rule console
57
+ end
58
+
59
+ def events_rule(props={})
60
+ @associated_properties = nil # dont use any current associated_properties
61
+ associated_properties(props)
62
+ # Eager define resource
63
+ resource(events_rule_definition) # add associated resources immediately
64
+ @associated_properties = nil # reset for next definition, since we're defining eagerly
65
+ end
66
+
67
+ # Works with eager definitions
68
+ def add_descriptions
69
+ numbered_resources = []
70
+ n = 1
71
+ @associated_resources.map do |associated|
72
+ # definition = associated.definition
73
+ # puts "associated #{associated.inspect}"
74
+ # puts "definition #{definition.inspect}"
75
+
76
+ # logical_id = definition.keys.first
77
+ # attributes = definition.values.first
78
+
79
+ logical_id = associated.logical_id
80
+ attributes = associated.attributes
81
+
82
+ attributes[:properties][:description] ||= "#{self.name} Event Rule #{n}"
83
+ new_definition = { "#{logical_id}" => attributes }
84
+ numbered_resources << Jets::Resource::Associated.new(new_definition)
85
+ n += 1
86
+ end
87
+ @associated_resources = numbered_resources
88
+ end
89
+
90
+ ASSOCIATED_PROPERTIES = %W[
91
+ description
92
+ state
93
+ schedule_expression
94
+ ]
95
+ define_associated_properties(ASSOCIATED_PROPERTIES)
96
+ alias_method :desc, :description
97
+
98
+ def default_associated_resource_definition(meth)
99
+ events_rule_definition
100
+ end
101
+
102
+ def events_rule_definition
103
+ resource = Jets::Resource::Events::Rule.new(associated_properties)
104
+ resource.definition # returns a definition to be added by associated_resources
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,109 @@
1
+ # Loading a class can usually be loaded via .constantize.
2
+ # But app/functions files are anonymous ruby classes created with
3
+ # Class.new. Anonymous classes cannot be loaded via .constantize and
4
+ # go through standard autoloading.
5
+ #
6
+ # Jets::Klass provides a way to load app classes in app/controllers, app/jobs,
7
+ # app/functions in a consistent way without having to worry about the anonymous
8
+ # class loading quirk. Classes that are not anonymously defined like controllers
9
+ # and jobs are loaded via autoloading with .constantize. Anonymously defined
10
+ # classes like functions are loaded via Object.const_set.
11
+ #
12
+ # Examples:
13
+ #
14
+ # Jets::Klass.from_path("app/controllers/posts_controller.rb")
15
+ # Jets::Klass.from_path("app/jobs/hard_job.rb")
16
+ # Jets::Klass.from_path("app/functions/hello.rb")
17
+ # Jets::Klass.from_path("app/functions/hello_function.rb")
18
+ # Jets::Klass.from_path("app/shared/functions/whatever.rb")
19
+ #
20
+ # Jets::Klass.from_task(task)
21
+ #
22
+ # The from_task method takes a Jets::Lambda::Task as an argument and is useful
23
+ # for the CloudFormation child stack generation there the registered task info
24
+ # is available but the path info is now.
25
+ class Jets::Klass
26
+ class << self
27
+ # from_path allows us to load any app classes in consistent way for
28
+ # app/controllers, app/jobs, and app/functions.
29
+ def from_path(path)
30
+ class_name = class_name(path)
31
+ if path.include?("/functions/") # simple function
32
+ class_name = load_anonymous_class(class_name, path)
33
+ class_name.constantize # removed :: for anonymous classes
34
+ else
35
+ class_name.constantize # autoload
36
+ end
37
+ end
38
+
39
+ # app/controllers/posts_controller.rb => PostsController
40
+ def class_name(path)
41
+ if path.include?("/shared/")
42
+ path.sub(%r{.*app/shared/(.*?)/},'').sub(/\.rb$/,'').classify
43
+ else
44
+ path.sub(%r{.*app/(.*?)/},'').sub(/\.rb$/,'').classify
45
+ end
46
+ end
47
+
48
+ def from_task(task)
49
+ class_name = task.class_name
50
+ filename = class_name.underscore
51
+
52
+ # Examples of filename: posts_controller, hard_job, security_rule,
53
+ # hello_function, hello
54
+ valid_types = %w[controller job rule]
55
+ type = filename.split('_').last
56
+ type = "function" unless valid_types.include?(type)
57
+
58
+ path = "app/#{type.pluralize}/#{filename}.rb"
59
+ from_path(path)
60
+ end
61
+
62
+ @@loaded_anonymous_classes = []
63
+ def load_anonymous_class(class_name, path)
64
+ parent_mod = modularize(class_name)
65
+
66
+ constructor = Jets::Lambda::FunctionConstructor.new(path)
67
+ # Dont load anonyomous class more than once to avoid these warnings:
68
+ # warning: already initialized constant Hello
69
+ # warning: previous definition of Hello was here
70
+ unless @@loaded_anonymous_classes.include?(class_name)
71
+ # use class_name as the variable name for prettier class name.
72
+ leaf_class_name = class_name.split('::').last
73
+ parent_mod.const_set(leaf_class_name, constructor.build)
74
+ @@loaded_anonymous_classes << class_name
75
+ end
76
+
77
+ class_name
78
+ end
79
+
80
+ # Ensures the parent namespace modules are defined. Example:
81
+ #
82
+ # modularize("Foo::Bar::Test")
83
+ # => Foo::Bar # is a now defined as a module if it wasnt before
84
+ #
85
+ # Also returns the parent module, so we can use it to do a const_set if needed. IE:
86
+ #
87
+ # parent_mod = modularize("Foo::Bar::Test")
88
+ # parent_mod.const_set("Test")
89
+ def modularize(class_name)
90
+ leaves = []
91
+ mods = class_name.split('::')[0..-2] # drop the last word
92
+ # puts "mods: #{mods}"
93
+ return Object if mods.empty?
94
+
95
+ leaves = []
96
+ mods.each do |leaf_mod|
97
+ leaves += [leaf_mod]
98
+ namespace = leaves.join('::')
99
+ previous_namespace = leaves[0..-2].join('::')
100
+ previous_namespace = "Object" if previous_namespace.empty?
101
+ previous_namespace = previous_namespace.constantize
102
+ previous_namespace.const_set(leaf_mod, Module.new) unless Object.const_defined?(namespace)
103
+ end
104
+
105
+ mods.join('::').constantize
106
+ end
107
+
108
+ end
109
+ end