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,113 @@
1
+
2
+ module Jets
3
+ class AwsInfo
4
+ extend Memoist
5
+ include AwsServices
6
+
7
+ def region
8
+ return 'us-east-1' if test?
9
+
10
+ return ENV['JETS_AWS_REGION'] if ENV['JETS_AWS_REGION'] # highest precedence
11
+ return ENV['AWS_REGION'] if ENV['AWS_REGION']
12
+
13
+ region = nil
14
+
15
+ # First if aws binary is available
16
+ # try to get it from the ~/.aws/config
17
+ if which('aws')
18
+ region = `aws configure get region 2>&1`.strip rescue nil
19
+ exit_code = $?.exitstatus
20
+ if exit_code != 0
21
+ exception_message = region.split("\n").grep(/botocore\.exceptions/).first
22
+ if exception_message
23
+ puts "WARN: #{exception_message}".color(:yellow)
24
+ else
25
+ # show full message as warning
26
+ puts region.color(:yellow)
27
+ end
28
+ puts "You can also get rid of this message by setting AWS_REGION or configuring ~/.aws/config with the region"
29
+ region = nil
30
+ end
31
+ region = nil if region == ''
32
+ return region if region
33
+ end
34
+
35
+ # Second try the metadata endpoint, should be available on AWS Lambda environment
36
+ # https://stackoverflow.com/questions/4249488/find-region-from-within-an-ec2-instance
37
+ begin
38
+ az = `curl -s --max-time 3 --connect-timeout 5 http://169.254.169.254/latest/meta-data/placement/availability-zone`
39
+ region = az.strip.chop # remove last char
40
+ region = nil if region == ''
41
+ rescue
42
+ end
43
+ return region if region
44
+
45
+ 'us-east-1' # default if all else fails
46
+ end
47
+ memoize :region
48
+
49
+ # aws sts get-caller-identity
50
+ def account
51
+ return '123456789' if test?
52
+ return ENV['JETS_AWS_ACCOUNT'] if ENV['JETS_AWS_ACCOUNT']
53
+
54
+ # ensure region set, required for sts.get_caller_identity.account to work
55
+ ENV['AWS_REGION'] ||= region
56
+ begin
57
+ sts.get_caller_identity.account
58
+ rescue Aws::Errors::MissingCredentialsError
59
+ puts "INFO: You're missing AWS credentials. Only local services are currently available"
60
+ end
61
+ end
62
+ memoize :account
63
+
64
+ # If bucket does not exist, do not use the cache value and check for the bucket again.
65
+ # This is because we can build the app before deploying it for the first time.
66
+ # The deploy sequence ensure an minimal stack exists and will return a s3 bucket
67
+ # value for real deployments though, just not for the `jets build` only command.
68
+ BUCKET_DOES_NOT_YET_EXIST = "bucket-does-not-yet-exist" # use const to save from misspellings
69
+ @@s3_bucket = BUCKET_DOES_NOT_YET_EXIST
70
+ def s3_bucket
71
+ return "fake-test-s3-bucket" if ENV['TEST']
72
+ return @@s3_bucket unless @@s3_bucket == BUCKET_DOES_NOT_YET_EXIST
73
+
74
+ resp = cfn.describe_stacks(stack_name: Jets::Naming.parent_stack_name)
75
+ stack = resp.stacks.first
76
+ output = stack["outputs"].find { |o| o["output_key"] == "S3Bucket" }
77
+ @@s3_bucket = output["output_value"] # s3_bucket
78
+ rescue Exception => e
79
+ # When user uses Jets::Application.default_iam_policy in their config/application.rb
80
+ # it looks up the s3 bucket for the iam policy, but the project name has
81
+ # not been loaded in the config yet. We do some trickery with loading
82
+ # the config twice in Application#load_app_config
83
+ # The first load will result in a Aws::CloudFormation::Errors::ValidationError
84
+ # since the Jets::Naming.parent_stack_name has not been properly set yet.
85
+ #
86
+ # Rescuing all exceptions in case there are other exceptions dont know about yet
87
+ # Here are the known ones: Aws::CloudFormation::Errors::ValidationError, Aws::CloudFormation::Errors::InvalidClientTokenId
88
+ BUCKET_DOES_NOT_YET_EXIST
89
+ end
90
+
91
+ def test?
92
+ ENV['TEST']
93
+ end
94
+
95
+ private
96
+
97
+ # Cross-platform way of finding an executable in the $PATH.
98
+ #
99
+ # which('ruby') #=> /usr/bin/ruby
100
+ #
101
+ # source: https://stackoverflow.com/questions/2108727/which-in-ruby-checking-if-program-exists-in-path-from-ruby
102
+ def which(cmd)
103
+ exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
104
+ ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
105
+ exts.each { |ext|
106
+ exe = File.join(path, "#{cmd}#{ext}")
107
+ return exe if File.executable?(exe) && !File.directory?(exe)
108
+ }
109
+ end
110
+ return nil
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,65 @@
1
+ require "aws-sdk-apigateway"
2
+ require "aws-sdk-cloudformation"
3
+ require "aws-sdk-cloudwatchlogs"
4
+ require "aws-sdk-dynamodb"
5
+ require "aws-sdk-lambda"
6
+ require "aws-sdk-s3"
7
+ require "aws-sdk-sts"
8
+ # Not used in Jets internally but convenient for shared resources
9
+ require "aws-sdk-sns"
10
+ require "aws-sdk-sqs"
11
+
12
+ module Jets::AwsServices
13
+ include GlobalMemoist
14
+ include StackStatus
15
+
16
+ def apigateway
17
+ Aws::APIGateway::Client.new
18
+ end
19
+ global_memoize :apigateway
20
+
21
+ def cfn
22
+ Aws::CloudFormation::Client.new
23
+ end
24
+ global_memoize :cfn
25
+
26
+ def dynamodb
27
+ Aws::DynamoDB::Client.new
28
+ end
29
+ global_memoize :dynamodb
30
+
31
+ def aws_lambda
32
+ Aws::Lambda::Client.new
33
+ end
34
+ global_memoize :aws_lambda
35
+
36
+ def logs
37
+ Aws::CloudWatchLogs::Client.new
38
+ end
39
+ global_memoize :logs
40
+
41
+ def s3
42
+ Aws::S3::Client.new
43
+ end
44
+ global_memoize :s3
45
+
46
+ def s3_resource
47
+ Aws::S3::Resource.new
48
+ end
49
+ global_memoize :s3_resource
50
+
51
+ def sns
52
+ Aws::SNS::Client.new
53
+ end
54
+ global_memoize :sns
55
+
56
+ def sqs
57
+ Aws::SQS::Client.new
58
+ end
59
+ global_memoize :sqs
60
+
61
+ def sts
62
+ Aws::STS::Client.new
63
+ end
64
+ global_memoize :sts
65
+ end
@@ -0,0 +1,57 @@
1
+ # We cache the clients globally to avoid re-instantiating them again after the initial Lambda cold start.
2
+ #
3
+ # Based on: https://hashrocket.com/blog/posts/implementing-a-macro-in-ruby-for-memoization
4
+ # Except we use a global variable for the cache. So we'll use the same client across
5
+ # all instances as well as across Lambda executions after the cold-start. Example:
6
+ #
7
+ # class Foo
8
+ # def s3
9
+ # Aws::S3::Client.new
10
+ # end
11
+ # global_memoize :s3
12
+ # end
13
+ #
14
+ # foo1 = Foo.new
15
+ # foo2 = Foo.new
16
+ # foo1.s3
17
+ # foo2.s3 # same client as foo1
18
+ #
19
+ # A prewarmed request after a cold-start will still use the same s3 client instance since it uses the
20
+ # global variable $__memo_methods as the cache.
21
+ #
22
+ module Jets::AwsServices
23
+ module GlobalMemoist
24
+ def self.included(klass)
25
+ klass.extend(Macros)
26
+ end
27
+
28
+ module Macros
29
+ def global_memoize(*methods)
30
+ const_defined?(:"GlobalMemoist#{self.object_id}") ?
31
+ const_get(:"GlobalMemoist#{self.object_id}") : const_set(:"GlobalMemoist#{self.object_id}", Module.new)
32
+ mod = const_get(:"GlobalMemoist#{self.object_id}")
33
+
34
+ mod.class_eval do
35
+ methods.each do |method|
36
+ define_method(method) do |skip_cache = false|
37
+ $__memo_methods ||= {}
38
+ if $__memo_methods.include?(method) && !skip_cache
39
+ $__memo_methods[method]
40
+ else
41
+ $__memo_methods[method] = super()
42
+ end
43
+ end
44
+ end
45
+ end
46
+ prepend mod
47
+ end
48
+
49
+ def global_memoize_class_method(*methods)
50
+ singleton_class.class_eval do
51
+ include GlobalMemoist
52
+ global_memoize(*methods)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,34 @@
1
+ module Jets::AwsServices
2
+ class S3Bucket
3
+ include Jets::AwsServices
4
+
5
+ def self.ensure_exists(bucket_name)
6
+ new(bucket_name).ensure_exists
7
+ end
8
+
9
+ def initialize(name)
10
+ @name = name
11
+ end
12
+
13
+ def ensure_exists
14
+ s3.create_bucket(bucket: @name) unless exists?
15
+ rescue Aws::S3::Errors::BucketAlreadyExists => e
16
+ puts "ERROR #{e.class}: #{e.message}".color(:red)
17
+ puts "Bucket name: #{@name}"
18
+ exit 1
19
+ end
20
+
21
+ def exists?
22
+ begin
23
+ s3.head_bucket(bucket: @name)
24
+ true
25
+ rescue Aws::S3::Errors::BucketAlreadyOwnedByYou, Aws::S3::Errors::Http301Error => e
26
+ # These exceptions indicate bucket already exists
27
+ # Aws::S3::Errors::Http301Error could be inaccurate but compromising for simplicity
28
+ true
29
+ rescue
30
+ false
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,59 @@
1
+ module Jets::AwsServices
2
+ module StackStatus
3
+ def stack_exists?(stack_name)
4
+ return false if ENV['TEST']
5
+
6
+ exist = nil
7
+ begin
8
+ # When the stack does not exist an exception is raised. Example:
9
+ # Aws::CloudFormation::Errors::ValidationError: Stack with id blah does not exist
10
+ resp = cfn.describe_stacks(stack_name: stack_name)
11
+ exist = true
12
+ rescue Aws::CloudFormation::Errors::ValidationError => e
13
+ if e.message =~ /does not exist/
14
+ exist = false
15
+ elsif e.message.include?("'stackName' failed to satisfy constraint")
16
+ # Example of e.message when describe_stack with invalid stack name
17
+ # "1 validation error detected: Value 'instance_and_route53' at 'stackName' failed to satisfy constraint: Member must satisfy regular expression pattern: [a-zA-Z][-a-zA-Z0-9]*|arn:[-a-zA-Z0-9:/._+]*"
18
+ puts "Invalid stack name: #{stack_name}"
19
+ puts "Full error message: #{e.message}"
20
+ exit 1
21
+ else
22
+ raise # re-raise exception because unsure what other errors can happen
23
+ end
24
+ end
25
+ exist
26
+ end
27
+
28
+ # All CloudFormation states listed here: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html
29
+ #
30
+ # Returns resp so we can use it to grab data about the stack without calling api again.
31
+ def stack_in_progress?(stack_name)
32
+ return true if !stack_exists?(stack_name)
33
+
34
+ # Assumes stack exists
35
+ resp = cfn.describe_stacks(stack_name: stack_name)
36
+ status = resp.stacks[0].stack_status
37
+ if status =~ /_IN_PROGRESS$/
38
+ puts "The '#{stack_name}' stack status is #{status}. " \
39
+ "Please wait until the stack is ready and try again.".color(:red)
40
+ exit 0
41
+ elsif resp.stacks[0].outputs.empty? && status != 'ROLLBACK_COMPLETE'
42
+ # This Happens when the miminal stack fails at the very beginning.
43
+ # There is no s3 bucket at all. User should delete the stack.
44
+ puts "The minimal stack failed to create. Please delete the stack first and try again. " \
45
+ "You can delete the CloudFormation stack or use the `jets delete` command"
46
+ exit 0
47
+ else
48
+ true
49
+ end
50
+ end
51
+
52
+ # Lookup output value.
53
+ # Used in Jets::Resource::ApiGateway::RestApi::* andJets::Commands::Url
54
+ def lookup(outputs, key)
55
+ out = outputs.find { |o| o.output_key == key }
56
+ out&.output_value
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,119 @@
1
+ require "jets/core_ext/kernel" # Hack prevents Rails const from being defined
2
+
3
+ class Jets::Booter
4
+ class << self
5
+ @booted = false
6
+ def boot!
7
+ return if @booted
8
+
9
+ confirm_jets_project!
10
+ Jets::Bundle.require
11
+
12
+ Jets.application.setup!
13
+
14
+ # Turbines are loaded after setup_auto_load_paths in Jets.application.setup! Some Turbine options are defined
15
+ # in the project so setup must happen before internal Turbines are loaded.
16
+ load_internal_turbines
17
+
18
+ run_turbines(:initializers)
19
+ # Load configs after Turbine initializers so Turbines can defined some config options and they are available in
20
+ # user's project environment configs.
21
+ Jets.application.configs!
22
+ app_initializers
23
+ run_turbines(:after_initializers)
24
+ Jets.application.finish!
25
+
26
+ # Eager load project code. Rather have user find out early than later on AWS Lambda.
27
+ Jets::Autoloaders.main.eager_load
28
+
29
+ setup_db
30
+ # TODO: Figure out how to build middleware during Jets.boot without breaking jets new and webpacker:install
31
+ # build_middleware_stack
32
+
33
+ @booted = true
34
+ end
35
+
36
+ def load_internal_turbines
37
+ Dir.glob("#{__dir__}/internal/turbines/**/*.rb").each do |path|
38
+ Jets::Autoloaders.once.preload(path)
39
+ end
40
+ end
41
+
42
+ # All Turbines
43
+ def turbine_initializers
44
+ Jets::Turbine.subclasses.each do |subclass|
45
+ initializers = subclass.initializers || []
46
+ initializers.each do |label, block|
47
+ block.call(Jets.application)
48
+ end
49
+ end
50
+ end
51
+
52
+ # All Turbines
53
+ def app_initializers
54
+ Dir.glob("#{Jets.root}/config/initializers/**/*").each do |path|
55
+ load path
56
+ end
57
+ end
58
+
59
+ # run_turbines(:initializers)
60
+ # run_turbines(:after_initializers)
61
+ def run_turbines(name)
62
+ Jets::Turbine.subclasses.each do |subclass|
63
+ hooks = subclass.send(name) || []
64
+ hooks.each do |label, block|
65
+ block.call(Jets.application)
66
+ end
67
+ end
68
+ end
69
+
70
+ # Builds and memoize stack so it only gets built on bootup
71
+ def build_middleware_stack
72
+ Jets.application.build_stack
73
+ end
74
+
75
+ # Only connects connect to database for ActiveRecord and when
76
+ # config/database.yml exists.
77
+ # Dynomite handles connecting to the clients lazily.
78
+ def setup_db
79
+ return unless File.exist?("#{Jets.root}/config/database.yml")
80
+
81
+ db_configs = Jets.application.config.database
82
+ # DatabaseTasks.database_configuration for db:create db:migrate tasks
83
+ # Documented in DatabaseTasks that this is the right way to set it when
84
+ # using ActiveRecord rake tasks outside of Rails.
85
+ ActiveRecord::Tasks::DatabaseTasks.database_configuration = db_configs
86
+
87
+ current_config = db_configs[Jets.env]
88
+ if current_config.blank?
89
+ abort("ERROR: config/database.yml exists but no environment section configured for #{Jets.env}")
90
+ end
91
+ # Using ActiveRecord rake tasks outside of Rails, so we need to set up the
92
+ # db connection ourselves
93
+ ActiveRecord::Base.establish_connection(current_config)
94
+ end
95
+
96
+ # Cannot call this for the jets new
97
+ def confirm_jets_project!
98
+ unless File.exist?("#{Jets.root}/config/application.rb")
99
+ puts "It does not look like you are running this command within a jets project. Please confirm that you are in a jets project and try again.".color(:red)
100
+ exit 1
101
+ end
102
+ end
103
+
104
+ def message
105
+ "Jets booting up in #{Jets.env.color(:green)} mode!"
106
+ end
107
+
108
+ def check_config_ru!
109
+ config_ru = File.read("#{Jets.root}/config.ru")
110
+ unless config_ru.include?("Jets.boot")
111
+ puts 'The config.ru file is missing Jets.boot. Please add Jets.boot after require "jets"'.color(:red)
112
+ puts "This was changed as made in Jets v1.1.0."
113
+ puts "To have Jets update the config.fu file for you, you can run:\n\n"
114
+ puts " jets upgrade"
115
+ exit 1
116
+ end
117
+ end
118
+ end
119
+ end