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,31 @@
1
+ require "rack/mime"
2
+ require "mimemagic"
3
+
4
+ class Jets::PublicController < Jets::Controller::Base
5
+ layout false
6
+ internal true
7
+
8
+ def show
9
+ catchall = params[:catchall].blank? ? 'index.html' : params[:catchall]
10
+ public_path = Jets.root + "public"
11
+ catchall_path = "#{public_path}/#{catchall}"
12
+
13
+ if File.exist?(catchall_path)
14
+ content_type = Rack::Mime.mime_type(File.extname(catchall_path))
15
+ binary = !MimeMagic.by_path(catchall_path).text?
16
+
17
+ # For binary support to work, the client also has to send the right Accept header.
18
+ # And the media type has been to added to api gateway.
19
+ # Cavaet: adding * to as the media type breaks regular form submission.
20
+ # All form submission gets treated as binary.
21
+ if binary
22
+ encoded_content = Base64.encode64(IO.read(catchall_path))
23
+ render plain: encoded_content, content_type: content_type, base64: true
24
+ else
25
+ render file: catchall_path, content_type: content_type
26
+ end
27
+ else
28
+ render file: "#{public_path}/404", status: 404
29
+ end
30
+ end
31
+ end
@@ -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,157 @@
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
+ # https://github.com/tongueroo/jets/issues/255
110
+ # Used to return: Aws::APIGateway::Errors::NotFoundException
111
+ # Now returns: Aws::APIGateway::Errors::InternalFailure
112
+ # So we'll use a more generic error
113
+ rescue Aws::APIGateway::Errors::ServiceError => e
114
+ raise(e) unless fail_silently
115
+ end
116
+
117
+ def create
118
+ apigateway.create_base_path_mapping(
119
+ domain_name: @domain_name, # required
120
+ base_path: @base_path,
121
+ rest_api_id: @rest_api_id, # required
122
+ stage: STAGE_NAME,
123
+ )
124
+ end
125
+
126
+ def get_domain_name
127
+ param = deployment_stack[:parameters].find { |p| p.parameter_key == 'DomainName' }
128
+ param.parameter_value
129
+ end
130
+
131
+ def deployment_stack
132
+ @deployment_stack ||= cfn.describe_stacks(stack_name: @event['StackId']).stacks.first
133
+ end
134
+
135
+ def get_rest_api_id
136
+ param = deployment_stack[:parameters].find { |p| p.parameter_key == 'RestApi' }
137
+ param.parameter_value
138
+ end
139
+
140
+ def deleting_parent?
141
+ stack = cfn.describe_stacks(stack_name: parent_stack_name).stacks.first
142
+ stack.stack_status == 'DELETE_IN_PROGRESS'
143
+ end
144
+
145
+ def parent_stack_name
146
+ deployment_stack[:root_id]
147
+ end
148
+
149
+ private
150
+ def apigateway
151
+ @apigateway ||= Aws::APIGateway::Client.new
152
+ end
153
+
154
+ def cfn
155
+ @cfn ||= Aws::CloudFormation::Client.new
156
+ end
157
+ end
@@ -0,0 +1,9 @@
1
+ module Jets::MailersHelper
2
+ def part_query(mime_type)
3
+ mime_type
4
+ end
5
+
6
+ def locale_query(locale)
7
+ locale
8
+ end
9
+ end
@@ -0,0 +1,70 @@
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
+ class << self
52
+ # Can use this to prewarm post deploy
53
+ def prewarm!
54
+ meth = CONCURRENCY > 1 ? :torch : :warm
55
+ perform_now(meth, quiet: true)
56
+ end
57
+ end
58
+
59
+ private
60
+ def call_options(quiet)
61
+ options = {}
62
+ options.merge!(mute: true, mute_output: true) if quiet
63
+ # All the methods in this Job class leads to Jets::Commands::Call.
64
+ # This is true for the Jets::Preheat.warm_all also.
65
+ # These jobs delegate out to Lambda function calls. We do not need/want
66
+ # the invocation type: RequestResponse in this case.
67
+ options.merge!(invocation_type: "Event")
68
+ options
69
+ end
70
+ end
@@ -0,0 +1,43 @@
1
+ require "active_support/all"
2
+ require "aws-sdk-s3"
3
+ require "cfnresponse"
4
+ include Cfnresponse
5
+
6
+ def lambda_handler(event:, context:)
7
+ # Print out debugging info immediately just in case
8
+ puts "event: #{json_pretty(event)}"
9
+ puts "context: #{json_pretty(context)}"
10
+
11
+ if %w[Create Update].include?(event['RequestType'])
12
+ properties = event["ResourceProperties"].dup
13
+ # After deleting ServiceToken, the rest of the values is the bucket configuration properties.
14
+ properties.delete("ServiceToken")
15
+ configurator = BucketConfigurator.new
16
+ configurator.put(properties)
17
+ end
18
+
19
+ send_response(event, context, "SUCCESS")
20
+
21
+ # We rescue all exceptions and send an message to CloudFormation so we dont have to
22
+ # wait for over an hour for the stack operation to timeout and rollback.
23
+ rescue Exception => e
24
+ puts e.message
25
+ puts e.backtrace
26
+ sleep 10 # a little time for logs to be sent to CloudWatch
27
+ send_response(event, context, "FAILED")
28
+ end
29
+
30
+ ########################################################
31
+
32
+ class BucketConfigurator
33
+ def put(props={})
34
+ # all props including bucket gets passed from the Custom::S3BucketConfiguration resource
35
+ props = props.deep_transform_keys { |k| k.to_s.underscore.to_sym }
36
+ puts "props: #{JSON.dump(props)}"
37
+ s3.put_bucket_notification_configuration(props)
38
+ end
39
+
40
+ def s3
41
+ @s3 ||= Aws::S3::Client.new
42
+ end
43
+ end
@@ -0,0 +1,145 @@
1
+ <!DOCTYPE html>
2
+ <html><head>
3
+ <meta name="viewport" content="width=device-width" />
4
+ <style type="text/css">
5
+ html, body, iframe {
6
+ height: 100%;
7
+ }
8
+
9
+ body {
10
+ margin: 0;
11
+ }
12
+
13
+ header {
14
+ width: 100%;
15
+ padding: 10px 0 0 0;
16
+ margin: 0;
17
+ background: white;
18
+ font: 12px "Lucida Grande", sans-serif;
19
+ border-bottom: 1px solid #dedede;
20
+ overflow: hidden;
21
+ }
22
+
23
+ dl {
24
+ margin: 0 0 10px 0;
25
+ padding: 0;
26
+ }
27
+
28
+ dt {
29
+ width: 80px;
30
+ padding: 1px;
31
+ float: left;
32
+ clear: left;
33
+ text-align: right;
34
+ color: #7f7f7f;
35
+ }
36
+
37
+ dd {
38
+ margin-left: 90px; /* 80px + 10px */
39
+ padding: 1px;
40
+ }
41
+
42
+ dd:empty:before {
43
+ content: "\00a0"; // &nbsp;
44
+ }
45
+
46
+ iframe {
47
+ border: 0;
48
+ width: 100%;
49
+ }
50
+ </style>
51
+ </head>
52
+
53
+ <body>
54
+ <header>
55
+ <dl>
56
+ <% if @email.respond_to?(:smtp_envelope_from) && Array(@email.from) != Array(@email.smtp_envelope_from) %>
57
+ <dt>SMTP-From:</dt>
58
+ <dd><%= @email.smtp_envelope_from %></dd>
59
+ <% end %>
60
+
61
+ <% if @email.respond_to?(:smtp_envelope_to) && @email.to != @email.smtp_envelope_to %>
62
+ <dt>SMTP-To:</dt>
63
+ <dd><%= @email.smtp_envelope_to %></dd>
64
+ <% end %>
65
+
66
+ <dt>From:</dt>
67
+ <dd><%= @email.header['from'] %></dd>
68
+
69
+ <% if @email.reply_to %>
70
+ <dt>Reply-To:</dt>
71
+ <dd><%= @email.header['reply-to'] %></dd>
72
+ <% end %>
73
+
74
+ <dt>To:</dt>
75
+ <dd><%= @email.header['to'] %></dd>
76
+
77
+ <% if @email.cc %>
78
+ <dt>CC:</dt>
79
+ <dd><%= @email.header['cc'] %></dd>
80
+ <% end %>
81
+
82
+ <dt>Date:</dt>
83
+ <dd><%= Time.current.rfc2822 %></dd>
84
+
85
+ <dt>Subject:</dt>
86
+ <dd><strong><%= @email.subject %></strong></dd>
87
+
88
+ <% unless @email.attachments.nil? || @email.attachments.empty? %>
89
+ <dt>Attachments:</dt>
90
+ <dd>
91
+ <% @email.attachments.each do |a| %>
92
+ <% filename = a.respond_to?(:original_filename) ? a.original_filename : a.filename %>
93
+ <%= link_to filename, "data:application/octet-stream;charset=utf-8;base64,#{Base64.encode64(a.body.to_s)}", download: filename %>
94
+ <% end %>
95
+ </dd>
96
+ <% end %>
97
+
98
+ <dt>Format:</dt>
99
+ <% if @email.multipart? %>
100
+ <dd>
101
+ <select id="part" onchange="refreshBody(false);">
102
+ <option <%= request.format == Mime[:html] ? 'selected' : '' %> value="<%= part_query('text/html') %>">View as HTML email</option>
103
+ <option <%= request.format == Mime[:text] ? 'selected' : '' %> value="<%= part_query('text/plain') %>">View as plain-text email</option>
104
+ </select>
105
+ </dd>
106
+ <% else %>
107
+ <dd id="mime_type" data-mime-type="<%= part_query(@email.mime_type) %>"><%= @email.mime_type == 'text/html' ? 'HTML email' : 'plain-text email' %></dd>
108
+ <% end %>
109
+
110
+ <% if I18n.available_locales.count > 1 %>
111
+ <dt>Locale:</dt>
112
+ <dd>
113
+ <select id="locale" onchange="refreshBody(true);">
114
+ <% I18n.available_locales.each do |locale| %>
115
+ <option <%= I18n.locale == locale ? 'selected' : '' %> value="<%= locale_query(locale) %>"><%= locale %></option>
116
+ <% end %>
117
+ </select>
118
+ </dd>
119
+ <% end %>
120
+ </dl>
121
+ </header>
122
+
123
+ <iframe seamless name="messageBody" src="?part=<%= part_query(@part.mime_type) %>"></iframe>
124
+
125
+ <script>
126
+ function refreshBody(reload) {
127
+ var part_select = document.querySelector('select#part');
128
+ var locale_select = document.querySelector('select#locale');
129
+ var iframe = document.getElementsByName('messageBody')[0];
130
+ var part_param = part_select ?
131
+ part_select.options[part_select.selectedIndex].value :
132
+ document.querySelector('#mime_type').dataset.mimeType;
133
+ var fresh_location = '?part=' + part_param;
134
+ var doc = iframe.contentWindow.document;
135
+
136
+ doc.open();
137
+ doc.write("Loading...");
138
+ doc.close();
139
+
140
+ iframe.contentWindow.location = fresh_location;
141
+ }
142
+ </script>
143
+
144
+ </body>
145
+ </html>