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,125 @@
1
+ require 'open3'
2
+ require 'tmpdir'
3
+
4
+ class Jets::PolyFun
5
+ class BaseExecutor
6
+ extend Memoist
7
+
8
+ def initialize(task)
9
+ @task = task
10
+ end
11
+
12
+ # Handler is in properties:
13
+ # 1. copy lambda function into tmp folder
14
+ # 2. generate Lang wrapper script
15
+ # 3. call wrapper script from ruby. Handle stdout and stderr and result. Pass info back to ruby
16
+ def run(event, context)
17
+ @temp_dir = create_tmpdir
18
+ copy_src_to_temp
19
+ write(code)
20
+ result = run_lambda_executor(event, context)
21
+ cleanup
22
+ result
23
+ end
24
+
25
+ def write(code)
26
+ puts "lambda_executor_script #{lambda_executor_script}" if ENV['KEEP_LAMBDA_WRAPPER']
27
+ IO.write(lambda_executor_script, code)
28
+ end
29
+
30
+ # Mimic Dir.mktmpdir randomness, not using Dir.mktmpdir because that generates
31
+ # the folder at the /tmp level only.
32
+ def create_tmpdir
33
+ random = "#{Time.now.strftime("%Y%d%H")}-#{Process.pid}-#{SecureRandom.hex[0..6]}"
34
+ tmpdir = "#{Jets.build_root}/executor/#{random}"
35
+ FileUtils.mkdir_p(tmpdir)
36
+ tmpdir
37
+ end
38
+
39
+ def copy_src_to_temp
40
+ app_class = @task.class_name.constantize
41
+ internal = app_class.respond_to?(:internal) && app_class.internal
42
+ src = internal ?
43
+ "#{File.expand_path("../internal", File.dirname(__FILE__))}/#{@task.poly_src_path}" :
44
+ "#{Jets.root}/#{@task.poly_src_path}"
45
+ dest = "#{@temp_dir}/#{@task.poly_src_path}"
46
+
47
+ FileUtils.mkdir_p(File.dirname(dest))
48
+ FileUtils.cp(src, dest)
49
+ end
50
+
51
+ def lambda_executor_script
52
+ File.dirname("#{@temp_dir}/#{@task.poly_src_path}") + "/lambda_executor" + @task.lang_ext
53
+ end
54
+
55
+ # When polymorphic method errors, this method reproduces an error in the lambda format
56
+ # Here's some examples to help example:
57
+ #
58
+ # Example of what the raw python prints out to stderr:
59
+ #
60
+ # Traceback (most recent call last):
61
+ # File "/tmp/jets/lite/executor/20180804-10727-mcs6qk/lambda_executor.py", line 6, in <module>
62
+ # resp = handle(event, context)
63
+ # File "/tmp/jets/lite/executor/20180804-10727-mcs6qk/index.py", line 22, in handle
64
+ # return response({'message': e.message}, 400)
65
+ # File "/tmp/jets/lite/executor/20180804-10727-mcs6qk/index.py", line 5, in response
66
+ # badcode
67
+ # NameError: global name 'badcode' is not defined
68
+ #
69
+ # So last line has the error summary info. Other lines have stack trace after the Traceback indicator.
70
+ #
71
+ # Example of the reproduced lambda error format:
72
+ #
73
+ # {
74
+ # "errorMessage": "'NameError' object has no attribute 'message'",
75
+ # "errorType": "AttributeError",
76
+ # "stackTrace": [
77
+ # [
78
+ # "/var/task/handlers/controllers/posts_controller/python/index.py",
79
+ # 22,
80
+ # "handle",
81
+ # "return response({'message': e.message}, 400)"
82
+ # ]
83
+ # ]
84
+ # }
85
+ #
86
+ def run_lambda_executor(event, context)
87
+ interpreter = @task.lang
88
+ command = %Q|#{interpreter} #{lambda_executor_script} '#{JSON.dump(event)}' '#{JSON.dump(context)}'|
89
+ stdout, stderr, status = Open3.capture3(command)
90
+ # puts "=> #{command}".color(:green)
91
+ # puts "stdout #{stdout}"
92
+ # puts "stderr #{stderr}"
93
+ # puts "status #{status}"
94
+ if status.success?
95
+ stdout
96
+ else
97
+ # We'll mimic the way lambda displays an error.
98
+ # $stderr.puts(stderr) # uncomment to debug
99
+ error_lines = stderr.split("\n")
100
+ error_message = error_lines.pop
101
+ error_type = error_message.split(':').first
102
+ error_lines.shift # remove first line that has the Traceback
103
+ stack_trace = error_lines.reverse # python shows stack trace in opposite order from ruby
104
+ JSON.dump(
105
+ "errorMessage" => error_message,
106
+ "errorType" => error_type, # hardcode
107
+ "stackTrace" => stack_trace
108
+ )
109
+ end
110
+ end
111
+
112
+ def cleanup
113
+ FileUtils.rm_rf(@temp_dir) unless ENV['KEEP_LAMBDA_WRAPPER']
114
+ end
115
+
116
+ def handler
117
+ # Must use the generated CloudFormation template to get the handler because
118
+ # the handler is derived from mutiple sources.
119
+ resource = Jets::Resource::Lambda::Function.new(@task)
120
+ full_handler = resource.properties["Handler"] # full handler here
121
+ File.extname(full_handler).sub(/^./,'') # the extension of the full handler is the handler
122
+ end
123
+ memoize :handler
124
+ end
125
+ end
@@ -0,0 +1,16 @@
1
+ require 'json'
2
+
3
+ class Jets::PolyFun
4
+ class LambdaExecutor
5
+ def initialize(task)
6
+ @task = task
7
+ end
8
+
9
+ def run(event, context)
10
+ executor_class = "Jets::PolyFun::#{@task.lang.capitalize}Executor".constantize
11
+ executor = executor_class.new(@task)
12
+ text = executor.run(event, context)
13
+ JSON.load(text)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,8 @@
1
+ class Jets::PolyFun
2
+ class NodeError < StandardError
3
+ def initialize(message, backtrace)
4
+ super(message)
5
+ set_backtrace(backtrace)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,54 @@
1
+ class Jets::PolyFun
2
+ class NodeExecutor < BaseExecutor
3
+ # Code for wrapper script that mimics lambda execution. Wrapper script usage:
4
+ #
5
+ # node WRAPPER_SCRIPT EVENT
6
+ #
7
+ # Example:
8
+ #
9
+ # node /tmp/jets/demo/executor/20180804-12816-imqb9/lambda_executor.js '{}'
10
+ #
11
+ def code
12
+ if async_syntax?
13
+ async_code
14
+ else
15
+ callback_code
16
+ end
17
+ end
18
+
19
+ # https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html
20
+ def async_syntax?
21
+ app_path = "#{Jets.root}/" + @task.handler_path.sub('handlers/', 'app/')
22
+ source_code = IO.read(app_path)
23
+ source_code.match(/=\s*async.*\(/)
24
+ end
25
+
26
+ def async_code
27
+ <<-EOL
28
+ var event = process.argv[2]
29
+ event = JSON.parse(event)
30
+ var context = {}
31
+
32
+ var app = require("./#{@task.meth}.js")
33
+ app.#{handler}(event, context).then(resp => console.log(JSON.stringify(resp)))
34
+ EOL
35
+ end
36
+
37
+
38
+ def callback_code
39
+ <<-EOL
40
+ function callback(error, response) {
41
+ var text = JSON.stringify(response)
42
+ console.log(text)
43
+ }
44
+
45
+ var event = process.argv[2]
46
+ event = JSON.parse(event)
47
+ var context = {}
48
+
49
+ var app = require("./#{@task.meth}.js")
50
+ var resp = app.#{handler}(event, context, callback)
51
+ EOL
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,8 @@
1
+ class Jets::PolyFun
2
+ class PythonError < StandardError
3
+ def initialize(message, backtrace)
4
+ super(message)
5
+ set_backtrace(backtrace)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,23 @@
1
+ class Jets::PolyFun
2
+ class PythonExecutor < BaseExecutor
3
+ # Code for wrapper script that mimics lambda execution. Wrapper script usage:
4
+ #
5
+ # python WRAPPER_SCRIPT EVENT
6
+ #
7
+ # Example:
8
+ #
9
+ # python /tmp/jets/demo/executor/20180804-12816-imqb9/lambda_executor.py '{}'
10
+ def code
11
+ <<-EOL
12
+ import sys
13
+ import json
14
+ from #{@task.meth} import #{handler}
15
+ event = json.loads(sys.argv[1])
16
+ context = {}
17
+ resp = #{handler}(event, context)
18
+ result = json.dumps(resp)
19
+ print(result)
20
+ EOL
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,117 @@
1
+ module Jets
2
+ class Preheat
3
+ extend Memoist
4
+
5
+ # Examples:
6
+ #
7
+ # Jets::Preheat.warm("posts_controller-index")
8
+ # Jets::Preheat.warm("jets-preheat_job-warm")
9
+ #
10
+ def self.warm(function_name, options={})
11
+ Preheat.new(options).warm(function_name)
12
+ end
13
+
14
+ def self.warm_all(options={})
15
+ Preheat.new(options).warm_all
16
+ end
17
+
18
+ def initialize(options)
19
+ @options = options # passed to Call.new options
20
+ @options[:mute_output] = true if @options[:mute_output].nil?
21
+ @options[:lambda_proxy] = false # do not transform controller event from {"event": "1"} to {"queryStringParameters":{"_prewarm":"1"}}
22
+ end
23
+
24
+ # Makes remote call to the Lambda function.
25
+ def warm(function_name)
26
+ Jets::Commands::Call.new(function_name, '{"_prewarm": "1"}', @options).run unless ENV['TEST']
27
+ end
28
+
29
+ # Loop through all methods for each class and makes special prewarm call to each method.
30
+ def warm_all
31
+ threads = []
32
+ all_functions.each do |function_name|
33
+ next if function_name.include?('jets-public_controller') # handled by warm_public_controller_more
34
+ next if function_name.include?('jets-rack_controller') # handled by warm_rack_controller_more
35
+ threads << Thread.new do
36
+ warm(function_name)
37
+ end
38
+ end
39
+ threads.each { |t| t.join }
40
+
41
+ # Warm the these controllers more since they can be hit more often
42
+ warm_public_controller_more
43
+ warm_rack_controller_more
44
+
45
+ # return the funciton names so we can see in the Lambda console
46
+ # the functions being prewarmed
47
+ all_functions
48
+ end
49
+
50
+ def warm_public_controller_more
51
+ function_name = 'jets-public_controller-show' # key function name
52
+ return unless all_functions.include?(function_name)
53
+
54
+ public_ratio = Jets.config.prewarm.public_ratio
55
+ return if public_ratio == 0
56
+
57
+ puts "Prewarming the public controller extra at a ratio of #{public_ratio}" unless @options[:mute]
58
+
59
+ threads = []
60
+ public_ratio.times do
61
+ threads << Thread.new do
62
+ warm(function_name)
63
+ end
64
+ end
65
+ threads.each { |t| t.join }
66
+ end
67
+
68
+ def warm_rack_controller_more
69
+ return unless Jets.rack?
70
+ function_name = 'jets-rack_controller-process' # key function name
71
+ return unless all_functions.include?(function_name)
72
+
73
+ rack_ratio = Jets.config.prewarm.rack_ratio
74
+ return if rack_ratio == 0
75
+
76
+ puts "Prewarming the rack controller extra at a ratio of #{rack_ratio}" unless @options[:mute]
77
+
78
+ threads = []
79
+ rack_ratio.times do
80
+ threads << Thread.new do
81
+ warm(function_name)
82
+ end
83
+ end
84
+ threads.each { |t| t.join }
85
+ end
86
+
87
+ # Returns:
88
+ # [
89
+ # "posts_controller-index",
90
+ # "posts_controller-show",
91
+ # ...
92
+ # ]
93
+ def all_functions
94
+ classes.map do |klass|
95
+ tasks = klass.tasks.select { |t| t.lang == :ruby } # only prewarm ruby functions
96
+ tasks.map do |task|
97
+ meth = task.meth
98
+ underscored = klass.to_s.underscore.gsub('/','-')
99
+ "#{underscored}-#{meth}" # function_name
100
+ end
101
+ end.flatten.uniq.compact
102
+ end
103
+ memoize :all_functions
104
+
105
+ def classes
106
+ Jets::Commands::Build.app_files.map do |path|
107
+ next if path.include?("preheat_job.rb") # dont want to cause an infinite loop, just in case
108
+ next unless path =~ %r{app/controllers} # only prewarm controllers
109
+
110
+ class_path = path.sub(%r{.*app/\w+/},'').sub(/\.rb$/,'')
111
+ class_name = class_path.classify
112
+ # IE: PostsController
113
+ class_name.constantize # load app/**/* class definition
114
+ end.compact
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,4 @@
1
+ module Jets::Processors
2
+ autoload :Deducer, 'jets/processors/deducer'
3
+ autoload :MainProcessor, 'jets/processors/main_processor'
4
+ end
@@ -0,0 +1,65 @@
1
+ # Jets::Processors::Deducer class figures out information that allows the
2
+ # controller or job to be called. Sme key methods for deducer:
3
+ #
4
+ # code - code to instance eval. IE: PostsController.new(event, context).index
5
+ # path - full path to the app code. IE: #{Jets.root}app/controllers/posts_controller.rb
6
+ #
7
+ class Jets::Processors::Deducer
8
+ def initialize(handler)
9
+ @handler = handler # handlers/controllers/posts.show
10
+ # @handler_path: "handlers/controllers/posts"
11
+ # @handler_method: "show"
12
+ @handler_path, @handler_method = @handler.split('.')
13
+ end
14
+
15
+ def code
16
+ # code: "PostsController.process(event, context, meth: "show")"
17
+ # code: "HardJob.process(event, context, meth: "dig")"
18
+ %|#{class_name}.process(event, context, "#{@handler_method}")|
19
+ end
20
+
21
+ # Input: @handler_path: handlers/jobs/hard_job.rb
22
+ # Output: #{Jets.root/app/jobs/hard_job.rb
23
+ def path
24
+ @handler_path.sub("handlers", "app") + ".rb"
25
+ end
26
+
27
+ # process_type is key. It can be either "controller" or "job". It is used to
28
+ # deduce the rest of the methods: code, path.
29
+ def process_type
30
+ if shared?
31
+ "function" # all app/shared/functions are always function process_type
32
+ else
33
+ @handler.split('/')[1].singularize # controller, job, rule, etc
34
+ end
35
+ end
36
+
37
+ def shared?
38
+ @handler.include?("/shared/functions")
39
+ end
40
+
41
+ # Example underscored_class_name:
42
+ # class_name = underscored_class_name
43
+ # class_name = class_name # PostsController
44
+ def class_name
45
+ regexp = shared? ?
46
+ Regexp.new(".*handlers/shared/functions/") :
47
+ Regexp.new(".*handlers/#{process_type.pluralize}/")
48
+
49
+ # Example regexp:
50
+ # /.*handlers\/controllers\//
51
+ # /.*handlers\/jobs\//
52
+ class_name = @handler_path.sub(regexp, "")
53
+ # Example class names:
54
+ # posts_controller
55
+ # hard_job
56
+ # hello
57
+ # hello_function
58
+
59
+ class_name.classify
60
+ end
61
+
62
+ def load_class
63
+ Jets::Klass.from_path(path)
64
+ end
65
+ end
@@ -0,0 +1,59 @@
1
+ require 'json'
2
+ require 'stringio'
3
+
4
+ # Node shim calls this class to process both controllers and jobs
5
+ class Jets::Processors::MainProcessor
6
+ attr_reader :event, :context, :handler
7
+ def initialize(event, context, handler)
8
+ @event = event
9
+ @context = context
10
+ @handler = handler
11
+ end
12
+
13
+ def run
14
+ # Use the handler to deduce app code to run.
15
+ # Example handlers: handlers/controllers/posts.create, handlers/jobs/sleep.perform
16
+ #
17
+ # deducer = Jets::Processors::Deducer.new("handlers/controllers/posts.create")
18
+ #
19
+ deducer = Jets::Processors::Deducer.new(handler)
20
+ begin
21
+ # Examples:
22
+ # deducer.code => PostsController.process(event, context, "show")
23
+ # deducer.path => app/controllers/posts_controller.rb
24
+ #
25
+ # deducer.code => HardJob.process(event, context, "dig")
26
+ # deducer.path => app/jobs/hard_job.rb
27
+ #
28
+ # deducer.code => HelloFunction.process(event, context, "world")
29
+ # deducer.path => app/functions/hello.rb
30
+ deducer.load_class
31
+ # result = PostsController.process(event, context, "create")
32
+ result = instance_eval(deducer.code, deducer.path)
33
+ result = HashWithIndifferentAccess.new(result) if result.is_a?(Hash)
34
+
35
+ Jets.increase_call_count
36
+
37
+ if result.is_a?(Hash) && result["headers"]
38
+ result["headers"]["x-jets-call-count"] = Jets.call_count
39
+ result["headers"]["x-jets-prewarm-count"] = Jets.prewarm_count
40
+ end
41
+
42
+ result
43
+ rescue Exception => e
44
+ unless ENV['TEST']
45
+ # Customize error message slightly so nodejs shim can process the
46
+ # returned error message.
47
+ # The "RubyError: " is a marker that the javascript shim scans for.
48
+ $stderr.puts("RubyError: #{e.class}: #{e.message}") # js needs this as the first line
49
+ backtrace = e.backtrace.map {|l| " #{l}" }
50
+ $stderr.puts(backtrace)
51
+ # No need to having error in stderr above anymore because errors are handled in memory
52
+ # at ruby_server.rb but keeping around for posterity.
53
+ end
54
+
55
+ Jets.on_exception(e)
56
+ raise(e) # raise error to ruby_server.rb to rescue and handle
57
+ end
58
+ end
59
+ end