jets_bb_fork 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/bin/commit_docs.sh +26 -0
  3. data/.circleci/config.yml +126 -0
  4. data/.codebuild/README.md +68 -0
  5. data/.codebuild/bin/jets +3 -0
  6. data/.codebuild/buildspec-base.yml +14 -0
  7. data/.codebuild/integration.sh +72 -0
  8. data/.codebuild/jets.postman_collection.json +323 -0
  9. data/.codebuild/scripts/install-docker.sh +12 -0
  10. data/.codebuild/scripts/install-dynamodb-local.sh +22 -0
  11. data/.codebuild/scripts/install-java.sh +22 -0
  12. data/.codebuild/scripts/install-node.sh +4 -0
  13. data/.github/ISSUE_TEMPLATE.md +7 -0
  14. data/.github/ISSUE_TEMPLATE/bug_report.md +84 -0
  15. data/.github/ISSUE_TEMPLATE/documentation.md +27 -0
  16. data/.github/ISSUE_TEMPLATE/feature_request.md +64 -0
  17. data/.github/ISSUE_TEMPLATE/question.md +16 -0
  18. data/.github/PULL_REQUEST_TEMPLATE.md +42 -0
  19. data/.gitignore +24 -0
  20. data/.gitmodules +0 -0
  21. data/.python-version +1 -0
  22. data/.rspec +4 -0
  23. data/.ruby-version +1 -0
  24. data/CHANGELOG.md +734 -0
  25. data/CONDUCT.md +1 -0
  26. data/CONTRIBUTING.md +1 -0
  27. data/Dockerfile +16 -0
  28. data/Dockerfile.base +53 -0
  29. data/Gemfile +14 -0
  30. data/Guardfile +22 -0
  31. data/LICENSE.txt +22 -0
  32. data/Procfile +2 -0
  33. data/README.md +203 -0
  34. data/Rakefile +24 -0
  35. data/backers.md +16 -0
  36. data/bin/release +9 -0
  37. data/buildspec.yml +18 -0
  38. data/exe/jets_bb_fork +14 -0
  39. data/jets.gemspec +68 -0
  40. data/lib/jets.rb +27 -0
  41. data/lib/jets/application.rb +216 -0
  42. data/lib/jets/application/defaults.rb +172 -0
  43. data/lib/jets/autoloaders.rb +97 -0
  44. data/lib/jets/aws_info.rb +113 -0
  45. data/lib/jets/aws_services.rb +65 -0
  46. data/lib/jets/aws_services/global_memoist.rb +57 -0
  47. data/lib/jets/aws_services/s3_bucket.rb +34 -0
  48. data/lib/jets/aws_services/stack_status.rb +59 -0
  49. data/lib/jets/booter.rb +119 -0
  50. data/lib/jets/builders/code_builder.rb +399 -0
  51. data/lib/jets/builders/code_size.rb +57 -0
  52. data/lib/jets/builders/gem_replacer.rb +76 -0
  53. data/lib/jets/builders/handler_generator.rb +186 -0
  54. data/lib/jets/builders/lambda_layer.rb +69 -0
  55. data/lib/jets/builders/md5.rb +60 -0
  56. data/lib/jets/builders/md5_zip.rb +61 -0
  57. data/lib/jets/builders/purger.rb +35 -0
  58. data/lib/jets/builders/rack_packager.rb +51 -0
  59. data/lib/jets/builders/rackup_wrappers/rackup +19 -0
  60. data/lib/jets/builders/rackup_wrappers/rackup.rb +7 -0
  61. data/lib/jets/builders/reconfigure_rails.rb +114 -0
  62. data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +16 -0
  63. data/lib/jets/builders/ruby_packager.rb +207 -0
  64. data/lib/jets/builders/shim_vars/app.rb +78 -0
  65. data/lib/jets/builders/shim_vars/base.rb +25 -0
  66. data/lib/jets/builders/shim_vars/shared.rb +37 -0
  67. data/lib/jets/builders/templates/handler.rb +12 -0
  68. data/lib/jets/builders/tidy.rb +107 -0
  69. data/lib/jets/builders/util.rb +31 -0
  70. data/lib/jets/bundle.rb +82 -0
  71. data/lib/jets/camelizer.rb +71 -0
  72. data/lib/jets/cfn/builders/api_deployment_builder.rb +63 -0
  73. data/lib/jets/cfn/builders/api_gateway_builder.rb +157 -0
  74. data/lib/jets/cfn/builders/base_child_builder.rb +75 -0
  75. data/lib/jets/cfn/builders/controller_builder.rb +42 -0
  76. data/lib/jets/cfn/builders/function_builder.rb +14 -0
  77. data/lib/jets/cfn/builders/interface.rb +137 -0
  78. data/lib/jets/cfn/builders/job_builder.rb +14 -0
  79. data/lib/jets/cfn/builders/paged.rb +37 -0
  80. data/lib/jets/cfn/builders/parent_builder.rb +100 -0
  81. data/lib/jets/cfn/builders/rule_builder.rb +24 -0
  82. data/lib/jets/cfn/builders/shared_builder.rb +14 -0
  83. data/lib/jets/cfn/ship.rb +185 -0
  84. data/lib/jets/cfn/status.rb +212 -0
  85. data/lib/jets/cfn/upload.rb +139 -0
  86. data/lib/jets/cli.rb +194 -0
  87. data/lib/jets/commands/base.rb +146 -0
  88. data/lib/jets/commands/build.rb +234 -0
  89. data/lib/jets/commands/call.rb +169 -0
  90. data/lib/jets/commands/call/anonymous_guesser.rb +96 -0
  91. data/lib/jets/commands/call/autoload_guesser.rb +136 -0
  92. data/lib/jets/commands/call/base_guesser.rb +60 -0
  93. data/lib/jets/commands/call/guesser.rb +48 -0
  94. data/lib/jets/commands/clean.rb +19 -0
  95. data/lib/jets/commands/clean/base.rb +24 -0
  96. data/lib/jets/commands/clean/build.rb +13 -0
  97. data/lib/jets/commands/clean/log.rb +107 -0
  98. data/lib/jets/commands/console.rb +12 -0
  99. data/lib/jets/commands/db.rb +13 -0
  100. data/lib/jets/commands/db/environment-task.rake +3 -0
  101. data/lib/jets/commands/db/tasks.rb +44 -0
  102. data/lib/jets/commands/dbconsole.rb +131 -0
  103. data/lib/jets/commands/delete.rb +143 -0
  104. data/lib/jets/commands/deploy.rb +141 -0
  105. data/lib/jets/commands/dynamodb.rb +19 -0
  106. data/lib/jets/commands/dynamodb/migrate.rb +9 -0
  107. data/lib/jets/commands/dynamodb/migrator.rb +36 -0
  108. data/lib/jets/commands/gems.rb +21 -0
  109. data/lib/jets/commands/help.rb +9 -0
  110. data/lib/jets/commands/help/build.md +6 -0
  111. data/lib/jets/commands/help/call.md +61 -0
  112. data/lib/jets/commands/help/clean/build.md +5 -0
  113. data/lib/jets/commands/help/clean/log.md +5 -0
  114. data/lib/jets/commands/help/console.md +18 -0
  115. data/lib/jets/commands/help/db/generate.md +8 -0
  116. data/lib/jets/commands/help/dbconsole.md +9 -0
  117. data/lib/jets/commands/help/delete.md +22 -0
  118. data/lib/jets/commands/help/deploy.md +32 -0
  119. data/lib/jets/commands/help/destroy.md +16 -0
  120. data/lib/jets/commands/help/dynamodb/generate.md +52 -0
  121. data/lib/jets/commands/help/dynamodb/migrate.md +4 -0
  122. data/lib/jets/commands/help/gems/check.md +8 -0
  123. data/lib/jets/commands/help/generate.md +22 -0
  124. data/lib/jets/commands/help/import/rack.md +13 -0
  125. data/lib/jets/commands/help/import/rails.md +11 -0
  126. data/lib/jets/commands/help/new.md +42 -0
  127. data/lib/jets/commands/help/routes.md +16 -0
  128. data/lib/jets/commands/help/runner.md +17 -0
  129. data/lib/jets/commands/help/server.md +15 -0
  130. data/lib/jets/commands/help/status.md +14 -0
  131. data/lib/jets/commands/help/upgrade.md +5 -0
  132. data/lib/jets/commands/help/url.md +6 -0
  133. data/lib/jets/commands/import.rb +12 -0
  134. data/lib/jets/commands/import/base.rb +49 -0
  135. data/lib/jets/commands/import/cheatsheet.rb +35 -0
  136. data/lib/jets/commands/import/rack.rb +16 -0
  137. data/lib/jets/commands/import/rails.rb +74 -0
  138. data/lib/jets/commands/import/sequence.rb +90 -0
  139. data/lib/jets/commands/import/templates/config/database.yml +26 -0
  140. data/lib/jets/commands/import/templates/submodules-cheatsheet.md +89 -0
  141. data/lib/jets/commands/main.rb +157 -0
  142. data/lib/jets/commands/markdown/creator.rb +58 -0
  143. data/lib/jets/commands/markdown/index.rb +27 -0
  144. data/lib/jets/commands/markdown/page.rb +125 -0
  145. data/lib/jets/commands/markdown/shell.rb +11 -0
  146. data/lib/jets/commands/new.rb +157 -0
  147. data/lib/jets/commands/rake_command.rb +61 -0
  148. data/lib/jets/commands/rake_tasks.rb +46 -0
  149. data/lib/jets/commands/runner.rb +16 -0
  150. data/lib/jets/commands/sequence.rb +99 -0
  151. data/lib/jets/commands/stack_info.rb +30 -0
  152. data/lib/jets/commands/templates/skeleton/.gitignore +12 -0
  153. data/lib/jets/commands/templates/skeleton/.jetskeep +1 -0
  154. data/lib/jets/commands/templates/skeleton/.rspec +3 -0
  155. data/lib/jets/commands/templates/skeleton/Gemfile.tt +38 -0
  156. data/lib/jets/commands/templates/skeleton/Procfile +7 -0
  157. data/lib/jets/commands/templates/skeleton/README.md +11 -0
  158. data/lib/jets/commands/templates/skeleton/Rakefile +2 -0
  159. data/lib/jets/commands/templates/skeleton/app/controllers/application_controller.rb +2 -0
  160. data/lib/jets/commands/templates/skeleton/app/helpers/application_helper.rb +2 -0
  161. data/lib/jets/commands/templates/skeleton/app/jobs/application_job.rb +4 -0
  162. data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +2 -0
  163. data/lib/jets/commands/templates/skeleton/app/models/application_record.rb +3 -0
  164. data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +25 -0
  165. data/lib/jets/commands/templates/skeleton/config.ru +5 -0
  166. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +67 -0
  167. data/lib/jets/commands/templates/skeleton/config/database.yml.tt +26 -0
  168. data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +22 -0
  169. data/lib/jets/commands/templates/skeleton/config/environments/development.rb +7 -0
  170. data/lib/jets/commands/templates/skeleton/config/environments/production.rb +9 -0
  171. data/lib/jets/commands/templates/skeleton/config/environments/test.rb +7 -0
  172. data/lib/jets/commands/templates/skeleton/config/routes.rb +9 -0
  173. data/lib/jets/commands/templates/skeleton/db/.gitkeep +0 -0
  174. data/lib/jets/commands/templates/skeleton/public/404.html +67 -0
  175. data/lib/jets/commands/templates/skeleton/public/422.html +67 -0
  176. data/lib/jets/commands/templates/skeleton/public/500.html +66 -0
  177. data/lib/jets/commands/templates/skeleton/public/favicon.ico +0 -0
  178. data/lib/jets/commands/templates/skeleton/public/index.html.tt +91 -0
  179. data/lib/jets/commands/templates/skeleton/spec/controllers/posts_controller_spec.rb +15 -0
  180. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-index.json +51 -0
  181. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-show.json +53 -0
  182. data/lib/jets/commands/templates/skeleton/spec/spec_helper.rb.tt +30 -0
  183. data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +14 -0
  184. data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -0
  185. data/lib/jets/commands/templates/webpacker/app/javascript/src/jets/crud.js +87 -0
  186. data/lib/jets/commands/upgrade.rb +145 -0
  187. data/lib/jets/commands/upgrade/templates/bin/webpack +19 -0
  188. data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +19 -0
  189. data/lib/jets/commands/url.rb +68 -0
  190. data/lib/jets/commands/webpacker_template.rb +18 -0
  191. data/lib/jets/controller.rb +3 -0
  192. data/lib/jets/controller/base.rb +108 -0
  193. data/lib/jets/controller/callbacks.rb +68 -0
  194. data/lib/jets/controller/cookies.rb +38 -0
  195. data/lib/jets/controller/cookies/jar.rb +269 -0
  196. data/lib/jets/controller/layout.rb +17 -0
  197. data/lib/jets/controller/middleware/cors.rb +60 -0
  198. data/lib/jets/controller/middleware/local.rb +116 -0
  199. data/lib/jets/controller/middleware/local/api_gateway.rb +93 -0
  200. data/lib/jets/controller/middleware/local/mimic_aws_call.rb +38 -0
  201. data/lib/jets/controller/middleware/local/route_matcher.rb +106 -0
  202. data/lib/jets/controller/middleware/main.rb +46 -0
  203. data/lib/jets/controller/middleware/reloader.rb +15 -0
  204. data/lib/jets/controller/middleware/webpacker_setup.rb +6 -0
  205. data/lib/jets/controller/params.rb +87 -0
  206. data/lib/jets/controller/rack/adapter.rb +88 -0
  207. data/lib/jets/controller/rack/env.rb +105 -0
  208. data/lib/jets/controller/redirection.rb +55 -0
  209. data/lib/jets/controller/rendering.rb +79 -0
  210. data/lib/jets/controller/rendering/rack_renderer.rb +250 -0
  211. data/lib/jets/controller/request.rb +29 -0
  212. data/lib/jets/controller/response.rb +61 -0
  213. data/lib/jets/controller/stage.rb +33 -0
  214. data/lib/jets/core.rb +149 -0
  215. data/lib/jets/core_ext/kernel.rb +13 -0
  216. data/lib/jets/db.rb +15 -0
  217. data/lib/jets/dotenv.rb +48 -0
  218. data/lib/jets/dotenv/ssm.rb +48 -0
  219. data/lib/jets/erb.rb +51 -0
  220. data/lib/jets/generator.rb +48 -0
  221. data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
  222. data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +39 -0
  223. data/lib/jets/generator/templates/erb/scaffold/edit.html.erb +6 -0
  224. data/lib/jets/generator/templates/erb/scaffold/index.html.erb +29 -0
  225. data/lib/jets/generator/templates/erb/scaffold/new.html.erb +5 -0
  226. data/lib/jets/generator/templates/erb/scaffold/show.html.erb +9 -0
  227. data/lib/jets/generator/templates/rails/assets/javascript.js +2 -0
  228. data/lib/jets/generator/templates/rails/assets/stylesheet.css +4 -0
  229. data/lib/jets/generator/templates/rails/controller/controller.rb +13 -0
  230. data/lib/jets/generator/templates/rails/helper/helper.rb +4 -0
  231. data/lib/jets/generator/templates/rails/scaffold/scaffold.css +80 -0
  232. data/lib/jets/generator/templates/rails/scaffold_controller/api_controller.rb +62 -0
  233. data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +79 -0
  234. data/lib/jets/inflections.rb +32 -0
  235. data/lib/jets/internal/app/controllers/jets/mailers_controller.rb +97 -0
  236. data/lib/jets/internal/app/controllers/jets/public_controller.rb +31 -0
  237. data/lib/jets/internal/app/controllers/jets/rack_controller.rb +25 -0
  238. data/lib/jets/internal/app/functions/jets/base_path.rb +157 -0
  239. data/lib/jets/internal/app/helpers/jets/mailers_helper.rb +9 -0
  240. data/lib/jets/internal/app/jobs/jets/preheat_job.rb +70 -0
  241. data/lib/jets/internal/app/shared/functions/jets/s3_bucket_config.rb +43 -0
  242. data/lib/jets/internal/app/views/jets/mailers/email.html.erb +145 -0
  243. data/lib/jets/internal/app/views/jets/mailers/index.html.erb +8 -0
  244. data/lib/jets/internal/app/views/jets/mailers/mailer.html.erb +6 -0
  245. data/lib/jets/internal/turbines/jets/mailer.rb +51 -0
  246. data/lib/jets/job/base.rb +39 -0
  247. data/lib/jets/job/dsl.rb +40 -0
  248. data/lib/jets/job/dsl/dynamodb_event.rb +65 -0
  249. data/lib/jets/job/dsl/event_source_mapping.rb +11 -0
  250. data/lib/jets/job/dsl/iot_event.rb +24 -0
  251. data/lib/jets/job/dsl/kinesis_event.rb +46 -0
  252. data/lib/jets/job/dsl/log_event.rb +15 -0
  253. data/lib/jets/job/dsl/rule_event.rb +75 -0
  254. data/lib/jets/job/dsl/s3_event.rb +36 -0
  255. data/lib/jets/job/dsl/sns_event.rb +54 -0
  256. data/lib/jets/job/dsl/sqs_event.rb +96 -0
  257. data/lib/jets/job/helpers/kinesis_event_helper.rb +13 -0
  258. data/lib/jets/job/helpers/log_event_helper.rb +17 -0
  259. data/lib/jets/job/helpers/s3_event_helper.rb +13 -0
  260. data/lib/jets/klass.rb +109 -0
  261. data/lib/jets/lambda/dsl.rb +419 -0
  262. data/lib/jets/lambda/function.rb +29 -0
  263. data/lib/jets/lambda/function_constructor.rb +55 -0
  264. data/lib/jets/lambda/functions.rb +34 -0
  265. data/lib/jets/lambda/task.rb +111 -0
  266. data/lib/jets/logger.rb +21 -0
  267. data/lib/jets/mega/hash_converter.rb +25 -0
  268. data/lib/jets/mega/request.rb +139 -0
  269. data/lib/jets/mega/request/source.rb +21 -0
  270. data/lib/jets/middleware.rb +33 -0
  271. data/lib/jets/middleware/configurator.rb +84 -0
  272. data/lib/jets/middleware/default_stack.rb +51 -0
  273. data/lib/jets/middleware/layer.rb +34 -0
  274. data/lib/jets/middleware/stack.rb +77 -0
  275. data/lib/jets/naming.rb +49 -0
  276. data/lib/jets/overrides/lambda.rb +1 -0
  277. data/lib/jets/overrides/lambda/marshaller.rb +31 -0
  278. data/lib/jets/overrides/rails.rb +4 -0
  279. data/lib/jets/overrides/rails/asset_tag_helper.rb +114 -0
  280. data/lib/jets/overrides/rails/common_methods.rb +13 -0
  281. data/lib/jets/overrides/rails/rendering_helper.rb +26 -0
  282. data/lib/jets/overrides/rails/url_helper.rb +25 -0
  283. data/lib/jets/poly_fun.rb +73 -0
  284. data/lib/jets/poly_fun/base_executor.rb +125 -0
  285. data/lib/jets/poly_fun/lambda_executor.rb +16 -0
  286. data/lib/jets/poly_fun/node_error.rb +8 -0
  287. data/lib/jets/poly_fun/node_executor.rb +54 -0
  288. data/lib/jets/poly_fun/python_error.rb +8 -0
  289. data/lib/jets/poly_fun/python_executor.rb +23 -0
  290. data/lib/jets/preheat.rb +117 -0
  291. data/lib/jets/processors/deducer.rb +65 -0
  292. data/lib/jets/processors/main_processor.rb +61 -0
  293. data/lib/jets/rack_server.rb +86 -0
  294. data/lib/jets/rdoc.rb +30 -0
  295. data/lib/jets/resource.rb +71 -0
  296. data/lib/jets/resource/api_gateway/base_path/function.rb +42 -0
  297. data/lib/jets/resource/api_gateway/base_path/mapping.rb +44 -0
  298. data/lib/jets/resource/api_gateway/base_path/role.rb +76 -0
  299. data/lib/jets/resource/api_gateway/cors.rb +61 -0
  300. data/lib/jets/resource/api_gateway/deployment.rb +78 -0
  301. data/lib/jets/resource/api_gateway/domain_name.rb +59 -0
  302. data/lib/jets/resource/api_gateway/method.rb +98 -0
  303. data/lib/jets/resource/api_gateway/resource.rb +101 -0
  304. data/lib/jets/resource/api_gateway/rest_api.rb +56 -0
  305. data/lib/jets/resource/api_gateway/rest_api/change_detection.rb +42 -0
  306. data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +63 -0
  307. data/lib/jets/resource/api_gateway/rest_api/routes.rb +7 -0
  308. data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +8 -0
  309. data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +130 -0
  310. data/lib/jets/resource/api_gateway/rest_api/routes/change/to.rb +29 -0
  311. data/lib/jets/resource/api_gateway/rest_api/routes/change/variable.rb +39 -0
  312. data/lib/jets/resource/api_gateway/rest_api/routes/collision.rb +121 -0
  313. data/lib/jets/resource/api_gateway/rest_api/routes/collision/variable_exception.rb +7 -0
  314. data/lib/jets/resource/associated.rb +37 -0
  315. data/lib/jets/resource/base.rb +28 -0
  316. data/lib/jets/resource/child_stack/api_deployment.rb +56 -0
  317. data/lib/jets/resource/child_stack/api_gateway.rb +53 -0
  318. data/lib/jets/resource/child_stack/app_class.rb +107 -0
  319. data/lib/jets/resource/child_stack/base.rb +24 -0
  320. data/lib/jets/resource/child_stack/shared.rb +92 -0
  321. data/lib/jets/resource/config/config_rule.rb +74 -0
  322. data/lib/jets/resource/config/managed_rule.rb +15 -0
  323. data/lib/jets/resource/events/rule.rb +31 -0
  324. data/lib/jets/resource/iam/application_role.rb +27 -0
  325. data/lib/jets/resource/iam/base_role_definition.rb +47 -0
  326. data/lib/jets/resource/iam/class_role.rb +74 -0
  327. data/lib/jets/resource/iam/function_role.rb +54 -0
  328. data/lib/jets/resource/iam/managed_policy.rb +22 -0
  329. data/lib/jets/resource/iam/policy_document.rb +41 -0
  330. data/lib/jets/resource/iot/topic_rule.rb +34 -0
  331. data/lib/jets/resource/lambda/event_source_mapping.rb +31 -0
  332. data/lib/jets/resource/lambda/function.rb +214 -0
  333. data/lib/jets/resource/lambda/function/environment.rb +62 -0
  334. data/lib/jets/resource/lambda/gem_layer.rb +17 -0
  335. data/lib/jets/resource/lambda/layer_version.rb +44 -0
  336. data/lib/jets/resource/logs/subscription_filter.rb +31 -0
  337. data/lib/jets/resource/permission.rb +45 -0
  338. data/lib/jets/resource/replacer.rb +85 -0
  339. data/lib/jets/resource/route53/record_set.rb +70 -0
  340. data/lib/jets/resource/s3/bucket.rb +24 -0
  341. data/lib/jets/resource/sns/subscription.rb +29 -0
  342. data/lib/jets/resource/sns/topic.rb +35 -0
  343. data/lib/jets/resource/sns/topic_policy.rb +40 -0
  344. data/lib/jets/resource/sqs/queue.rb +21 -0
  345. data/lib/jets/resource/standardizer.rb +42 -0
  346. data/lib/jets/route.rb +166 -0
  347. data/lib/jets/router.rb +177 -0
  348. data/lib/jets/router/scope.rb +30 -0
  349. data/lib/jets/rule/base.rb +19 -0
  350. data/lib/jets/rule/dsl.rb +110 -0
  351. data/lib/jets/spec_helpers.rb +54 -0
  352. data/lib/jets/spec_helpers/params.rb +10 -0
  353. data/lib/jets/spec_helpers/request.rb +78 -0
  354. data/lib/jets/spec_helpers/response.rb +5 -0
  355. data/lib/jets/stack.rb +88 -0
  356. data/lib/jets/stack/builder.rb +43 -0
  357. data/lib/jets/stack/definition.rb +50 -0
  358. data/lib/jets/stack/depends.rb +34 -0
  359. data/lib/jets/stack/depends/item.rb +9 -0
  360. data/lib/jets/stack/function.rb +69 -0
  361. data/lib/jets/stack/main.rb +4 -0
  362. data/lib/jets/stack/main/dsl.rb +28 -0
  363. data/lib/jets/stack/main/dsl/base.rb +49 -0
  364. data/lib/jets/stack/main/dsl/cloudwatch.rb +19 -0
  365. data/lib/jets/stack/main/dsl/iam.rb +8 -0
  366. data/lib/jets/stack/main/dsl/lambda.rb +83 -0
  367. data/lib/jets/stack/main/dsl/s3.rb +12 -0
  368. data/lib/jets/stack/main/dsl/sns.rb +16 -0
  369. data/lib/jets/stack/main/dsl/sqs.rb +10 -0
  370. data/lib/jets/stack/output.rb +35 -0
  371. data/lib/jets/stack/output/dsl.rb +19 -0
  372. data/lib/jets/stack/output/lookup.rb +36 -0
  373. data/lib/jets/stack/parameter.rb +37 -0
  374. data/lib/jets/stack/parameter/dsl.rb +42 -0
  375. data/lib/jets/stack/resource.rb +31 -0
  376. data/lib/jets/stack/resource/dsl.rb +19 -0
  377. data/lib/jets/stack/s3_event.rb +87 -0
  378. data/lib/jets/tmp_loader.rb +52 -0
  379. data/lib/jets/turbine.rb +41 -0
  380. data/lib/jets/turbo.rb +55 -0
  381. data/lib/jets/turbo/database_yaml.rb +41 -0
  382. data/lib/jets/turbo/project/.gitignore +12 -0
  383. data/lib/jets/turbo/project/.jetskeep +1 -0
  384. data/lib/jets/turbo/project/Gemfile +16 -0
  385. data/lib/jets/turbo/project/Rakefile +2 -0
  386. data/lib/jets/turbo/project/app/controllers/application_controller.rb +2 -0
  387. data/lib/jets/turbo/project/app/helpers/application_helper.rb +2 -0
  388. data/lib/jets/turbo/project/app/jobs/application_job.rb +4 -0
  389. data/lib/jets/turbo/project/config.ru +5 -0
  390. data/lib/jets/turbo/project/config/application.rb +4 -0
  391. data/lib/jets/turbo/project/config/routes.rb +4 -0
  392. data/lib/jets/turbo/rails.rb +127 -0
  393. data/lib/jets/turbo/templates/config/database.yml +26 -0
  394. data/lib/jets/util.rb +38 -0
  395. data/lib/jets/version.rb +3 -0
  396. data/readme/prerelease.md +6 -0
  397. data/readme/testing.md +60 -0
  398. metadata +1004 -0
@@ -0,0 +1,13 @@
1
+ module Jets::CommonMethods
2
+ extend Memoist
3
+ # Add API Gateway Stage Name
4
+ def add_stage_name(url)
5
+ Jets::Controller::Stage.add(request.host, url)
6
+ end
7
+
8
+ def on_aws?
9
+ on_cloud9 = Jets::Controller::Stage.on_cloud9?(request.headers['HTTP_HOST'])
10
+ !request.headers['HTTP_X_AMZN_TRACE_ID'].nil? && !on_cloud9
11
+ end
12
+ memoize :on_aws?
13
+ end
@@ -0,0 +1,26 @@
1
+ module Jets::RenderingHelper
2
+ # ensure that we always add the controller view name. So when rendering
3
+ # a partial:
4
+ # <%= render "mypartial" %>
5
+ # gets turned into:
6
+ # <%= render "articles/mypartial" %>
7
+ def render(options = {}, locals = {}, &block)
8
+ if options.is_a?(String) && !options.include?('/')
9
+ folder = _get_containing_folder(caller[0])
10
+ partial_name = options # happens to be the partial name
11
+ partial_name = "#{folder}/#{partial_name}"
12
+ options = partial_name
13
+ end
14
+
15
+ super(options, locals, &block)
16
+ end
17
+
18
+ # Ugly, going back up the caller stack to find out what view path
19
+ # we are in
20
+ def _get_containing_folder(caller_line)
21
+ text = caller_line.split(':').first
22
+ # .../fixtures/apps/demo/app/views/posts/index.html.erb
23
+ text.split('/')[-2] # posts
24
+ end
25
+ end
26
+ ActionView::Helpers.send(:include, Jets::RenderingHelper)
@@ -0,0 +1,25 @@
1
+ require "action_view"
2
+
3
+ # hackety hack
4
+ module Jets::UrlHelper
5
+ include Jets::CommonMethods
6
+
7
+ # Basic implementation of url_for to allow use helpers without routes existence
8
+ def url_for(options = nil) # :nodoc:
9
+ url = case options
10
+ when String
11
+ options
12
+ when :back
13
+ _back_url
14
+ # TODO: hook this up to Jets implmentation of config/routes.rb
15
+ # when ActiveRecord::Base
16
+ # record = options
17
+ # record.id
18
+ else
19
+ raise ArgumentError, "Please provided a String to link_to as the the second argument. The Jets link_to helper takes as the second argument."
20
+ end
21
+
22
+ add_stage_name(url)
23
+ end
24
+ end # UrlHelper
25
+ ActionView::Helpers.send(:include, Jets::UrlHelper)
@@ -0,0 +1,73 @@
1
+ module Jets
2
+ class PolyFun
3
+ extend Memoist
4
+
5
+ def initialize(app_class, app_meth)
6
+ @app_class = app_class # already a Constant, IE: PostController
7
+ @app_meth = app_meth.to_sym
8
+ end
9
+
10
+ def run(event, context={})
11
+ check_private_method!
12
+
13
+ if task.lang == :ruby
14
+ # controller = PostsController.new(event, content)
15
+ # resp = controller.edit
16
+ run_ruby_code(event, context)
17
+ else
18
+ executor = LambdaExecutor.new(task)
19
+ resp = executor.run(event, context)
20
+ if resp["errorMessage"]
21
+ raise_error(resp)
22
+ end
23
+ resp
24
+ end
25
+ end
26
+
27
+ def run_ruby_code(event, context)
28
+ @app_class.process(event, context, @app_meth)
29
+ rescue Exception => e
30
+ Jets.on_exception(e)
31
+ raise(e)
32
+ end
33
+
34
+ def raise_error(resp)
35
+ backtrace = resp["stackTrace"] + caller
36
+ backtrace = backtrace.map { |l| l.sub(/^\s+/,'') }
37
+ # Adjust the paths from the tmp path to the app path to improve user debugging
38
+ # experience. Example:
39
+ # From:
40
+ # File "/tmp/jets/lite/executor/20180917-16777-43a9e48/app/controllers/jets/public_controller/python/show.py", line 32
41
+ # To:
42
+ # File "app/controllers/jets/public_controller/python/show.py", line 32 backtrace =
43
+ backtrace = backtrace.map do |l|
44
+ if l.include?(Jets.build_root) && !l.include?("lambda_executor.")
45
+ l.sub(/\/tmp\/jets.*executor\/\d{8}-+.*?\//, '')
46
+ else
47
+ l
48
+ end
49
+ end
50
+
51
+ # IE: Jets::PolyFun::PythonError
52
+ error_class = "Jets::PolyFun::#{task.lang.to_s.camelize}Error".constantize
53
+ raise error_class.new(resp["errorMessage"], backtrace)
54
+ end
55
+
56
+ def task
57
+ task = @app_class.all_public_tasks[@app_meth]
58
+ # Provider user a better error message to user than a nil failure.
59
+ unless task
60
+ raise "Unable to find #{@app_class}##{@app_meth}"
61
+ end
62
+ task
63
+ end
64
+ memoize :task
65
+
66
+ def check_private_method!
67
+ private_detected = @app_class.all_private_tasks.keys.include?(@app_meth)
68
+ return unless private_detected # Ok to continue
69
+
70
+ raise "The #{@app_class}##{@app_meth} is a private method. Unable to call it unless it is public"
71
+ end
72
+ end
73
+ end
@@ -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.camelize
112
+ # IE: PostsController
113
+ class_name.constantize # load app/**/* class definition
114
+ end.compact
115
+ end
116
+ end
117
+ end