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,44 @@
1
+ class Jets::Commands::Db::Tasks
2
+ # Ugly but it loads ActiveRecord database tasks
3
+ def self.load!
4
+ # Lazy require rails so Rails const is only defined in jets db:* tasks
5
+ require "rails"
6
+ require "active_record"
7
+ require "recursive-open-struct"
8
+
9
+ # Jets.boot # Jets.boot here screws up jets -h, the db_config doesnt seem to match exactly
10
+ # but seems to be working anyway.
11
+ db_configs = Jets.application.config.database
12
+ ActiveRecord::Tasks::DatabaseTasks.database_configuration = db_configs
13
+ ActiveRecord::Tasks::DatabaseTasks.migrations_paths = ["db/migrate"]
14
+ ActiveRecord::Tasks::DatabaseTasks.seed_loader = Seeder.new("#{Jets.root}/db/seeds.rb")
15
+
16
+ # Need to mock out the usage of Rails.application in:
17
+ # activerecord-5.1.4/lib/active_record/tasks/database_tasks.rb
18
+ Rails.application = RecursiveOpenStruct.new(
19
+ config: {
20
+ paths: {
21
+ db: ["db"],
22
+ }
23
+ },
24
+ paths: {
25
+ "db/migrate": ["db/migrate"]
26
+ }
27
+ )
28
+ load "active_record/railties/databases.rake"
29
+
30
+ load File.expand_path("../environment-task.rake", __FILE__)
31
+ end
32
+
33
+ # Thanks: https://stackoverflow.com/questions/19206764/how-can-i-load-activerecord-database-tasks-on-a-ruby-project-outside-rails/24840749
34
+ class Seeder
35
+ def initialize(seed_file)
36
+ @seed_file = seed_file
37
+ end
38
+
39
+ def load_seed
40
+ raise "Seed file '#{@seed_file}' does not exist" unless File.file?(@seed_file)
41
+ load @seed_file
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,131 @@
1
+ # Thanks: Rails dbconsole_command.rb
2
+ module Jets::Commands
3
+ class Dbconsole
4
+ def self.start(*args)
5
+ new(*args).start
6
+ end
7
+
8
+ def initialize(options = {})
9
+ @options = options
10
+ end
11
+
12
+ def start
13
+ ENV["RAILS_ENV"] ||= @options[:environment] || environment
14
+
15
+ case config["adapter"]
16
+ when /^(jdbc)?mysql/
17
+ args = {
18
+ "host" => "--host",
19
+ "port" => "--port",
20
+ "socket" => "--socket",
21
+ "username" => "--user",
22
+ "encoding" => "--default-character-set",
23
+ "sslca" => "--ssl-ca",
24
+ "sslcert" => "--ssl-cert",
25
+ "sslcapath" => "--ssl-capath",
26
+ "sslcipher" => "--ssl-cipher",
27
+ "sslkey" => "--ssl-key"
28
+ }.map { |opt, arg| "#{arg}=#{config[opt]}" if config[opt] }.compact
29
+
30
+ if config["password"] && @options["include_password"]
31
+ args << "--password=#{config['password']}"
32
+ elsif config["password"] && !config["password"].to_s.empty?
33
+ args << "-p"
34
+ end
35
+
36
+ args << config["database"]
37
+
38
+ find_cmd_and_exec(["mysql", "mysql5"], *args)
39
+
40
+ when /^postgres|^postgis/
41
+ ENV["PGUSER"] = config["username"] if config["username"]
42
+ ENV["PGHOST"] = config["host"] if config["host"]
43
+ ENV["PGPORT"] = config["port"].to_s if config["port"]
44
+ ENV["PGPASSWORD"] = config["password"].to_s if config["password"] && @options["include_password"]
45
+ find_cmd_and_exec("psql", config["database"])
46
+
47
+ when "sqlite3"
48
+ args = []
49
+
50
+ args << "-#{@options['mode']}" if @options["mode"]
51
+ args << "-header" if @options["header"]
52
+ args << File.expand_path(config["database"], Jets.root)
53
+
54
+ find_cmd_and_exec("sqlite3", *args)
55
+
56
+ when "oracle", "oracle_enhanced"
57
+ logon = ""
58
+
59
+ if config["username"]
60
+ logon = config["username"]
61
+ logon << "/#{config['password']}" if config["password"] && @options["include_password"]
62
+ logon << "@#{config['database']}" if config["database"]
63
+ end
64
+
65
+ find_cmd_and_exec("sqlplus", logon)
66
+
67
+ when "sqlserver"
68
+ args = []
69
+
70
+ args += ["-D", "#{config['database']}"] if config["database"]
71
+ args += ["-U", "#{config['username']}"] if config["username"]
72
+ args += ["-P", "#{config['password']}"] if config["password"]
73
+
74
+ if config["host"]
75
+ host_arg = "#{config['host']}"
76
+ host_arg << ":#{config['port']}" if config["port"]
77
+ args += ["-S", host_arg]
78
+ end
79
+
80
+ find_cmd_and_exec("sqsh", *args)
81
+
82
+ else
83
+ abort "Unknown command-line client for #{config['database']}."
84
+ end
85
+ end
86
+
87
+ def config
88
+ @config ||= begin
89
+ if configurations[environment].blank?
90
+ raise ActiveRecord::AdapterNotSpecified, "'#{environment}' database is not configured. Available configuration: #{configurations.inspect}"
91
+ else
92
+ configurations[environment]
93
+ end
94
+ end
95
+ end
96
+
97
+ def environment
98
+ Jets.env.to_s
99
+ end
100
+
101
+ private
102
+ def configurations # :doc:
103
+ db_config = Jets.application.config.database
104
+ ActiveRecord::Base.configurations = db_config
105
+ ActiveRecord::Base.configurations
106
+ end
107
+
108
+ def find_cmd_and_exec(commands, *args) # :doc:
109
+ commands = Array(commands)
110
+
111
+ dirs_on_path = ENV["PATH"].to_s.split(File::PATH_SEPARATOR)
112
+ unless (ext = RbConfig::CONFIG["EXEEXT"]).empty?
113
+ commands = commands.map { |cmd| "#{cmd}#{ext}" }
114
+ end
115
+
116
+ full_path_command = nil
117
+ found = commands.detect do |cmd|
118
+ dirs_on_path.detect do |path|
119
+ full_path_command = File.join(path, cmd)
120
+ File.file?(full_path_command) && File.executable?(full_path_command)
121
+ end
122
+ end
123
+
124
+ if found
125
+ exec full_path_command, *args
126
+ else
127
+ abort("Couldn't find database client: #{commands.join(', ')}. Check your $PATH and try again.")
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,143 @@
1
+ class Jets::Commands::Delete
2
+ include Jets::AwsServices
3
+
4
+ def initialize(options)
5
+ @options = options
6
+ end
7
+
8
+ def run
9
+ puts("Deleting project...")
10
+ return if @options[:noop]
11
+
12
+ are_you_sure?
13
+
14
+ confirm_project_exists
15
+
16
+ # Must first remove all objects from s3 bucket in order to delete stack
17
+ puts "First, deleting objects in s3 bucket #{s3_bucket_name}" if s3_bucket_name
18
+ empty_s3_bucket
19
+
20
+ stack_in_progress?(parent_stack_name)
21
+
22
+ cfn.delete_stack(stack_name: parent_stack_name)
23
+ puts "Deleting #{Jets.config.project_namespace.color(:green)}..."
24
+
25
+ wait_for_stack if @options[:wait]
26
+
27
+ delete_logs
28
+
29
+ puts "Project #{Jets.config.project_namespace.color(:green)} deleted!"
30
+ end
31
+
32
+ def wait_for_stack
33
+ status = Jets::Cfn::Status.new(@options)
34
+ start_time = Time.now
35
+ status.wait
36
+ took = Time.now - start_time
37
+ puts "Time took for deletion: #{status.pretty_time(took).color(:green)}."
38
+ end
39
+
40
+ def delete_logs
41
+ puts "Deleting CloudWatch logs"
42
+ log = Jets::Commands::Clean::Log.new(mute: true, sure: true)
43
+ log.clean
44
+ end
45
+
46
+ def confirm_project_exists
47
+ begin
48
+ resp = cfn.describe_stacks(stack_name: parent_stack_name)
49
+ rescue Aws::CloudFormation::Errors::ValidationError
50
+ # Aws::CloudFormation::Errors::ValidationError is thrown when the stack
51
+ # does not exist
52
+ puts "The parent stack #{Jets.config.project_namespace.color(:green)} for the project #{Jets.config.project_name.color(:green)} does not exist. So it cannot be deleted."
53
+ exit 0
54
+ end
55
+ end
56
+
57
+ def empty_s3_bucket
58
+ return unless s3_bucket_name # Happens when minimal stack fails to build
59
+ return unless bucket_exists?(s3_bucket_name)
60
+
61
+ resp = s3.list_objects(bucket: s3_bucket_name)
62
+ if resp.contents.size > 0
63
+ # IE: objects = [{key: "objectkey1"}, {key: "objectkey2"}]
64
+ objects = resp.contents.map { |item| {key: item.key} }
65
+ s3.delete_objects(
66
+ bucket: s3_bucket_name,
67
+ delete: {
68
+ objects: objects,
69
+ quiet: false,
70
+ }
71
+ )
72
+ empty_s3_bucket # keep deleting objects until bucket is empty
73
+ end
74
+ end
75
+
76
+ def s3_bucket_name
77
+ return @s3_bucket_name if defined?(@s3_bucket_name)
78
+
79
+ resp = cfn.describe_stacks(stack_name: parent_stack_name)
80
+ outputs = resp.stacks[0].outputs
81
+ if outputs.empty?
82
+ @s3_bucket_name = false
83
+ else
84
+ @s3_bucket_name = outputs.find {|o| o.output_key == 'S3Bucket'}.output_value
85
+ end
86
+ end
87
+
88
+ # Thanks: https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/s3-example-does-bucket-exist.html
89
+ def bucket_exists?(bucket_name)
90
+ bucket_exists = false
91
+ begin
92
+ resp = s3.head_bucket(bucket: bucket_name, use_accelerate_endpoint: false)
93
+ bucket_exists = true
94
+ rescue
95
+ end
96
+ bucket_exists
97
+ end
98
+
99
+ def parent_stack_name
100
+ Jets::Naming.parent_stack_name
101
+ end
102
+
103
+ def are_you_sure?
104
+ if @options[:sure]
105
+ sure = 'y'
106
+ else
107
+ puts "Are you sure you want to want to delete the #{Jets.config.project_namespace.color(:green)} project? (y/N)"
108
+ sure = $stdin.gets
109
+ end
110
+
111
+ unless sure =~ /^y/
112
+ puts "Phew! Jets #{Jets.config.project_namespace.color(:green)} project was not deleted."
113
+ exit 0
114
+ end
115
+ end
116
+
117
+ # All CloudFormation states listed here: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html
118
+ #
119
+ # Returns resp so we can use it to grab data about the stack without calling api again.
120
+ def check_deleteable_status
121
+ return true if !stack_exists?(@parent_stack_name)
122
+
123
+ # Assumes stack exists
124
+ resp = cfn.describe_stacks(stack_name: @parent_stack_name)
125
+ status = resp.stacks[0].stack_status
126
+
127
+ return true if status == 'ROLLBACK_COMPLETE'
128
+
129
+ if status =~ /_IN_PROGRESS$/
130
+ puts "The '#{@parent_stack_name}' stack status is #{status}. " \
131
+ "It is not in an updateable status. Please wait until the stack is ready and try again.".color(:red)
132
+ exit 0
133
+ elsif resp.stacks[0].outputs.empty?
134
+ # This Happens when the miminal stack fails at the very beginning.
135
+ # There is no s3 bucket at all. User should delete the stack.
136
+ puts "The minimal stack failed to create. Please delete the stack first and try again. " \
137
+ "You can delete the CloudFormation stack or use the `jets delete` command"
138
+ exit 0
139
+ else
140
+ true
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,141 @@
1
+ module Jets::Commands
2
+ class Deploy
3
+ extend Memoist
4
+ include StackInfo
5
+ def initialize(options)
6
+ @options = options
7
+ end
8
+
9
+ def run
10
+ deployment_env = Jets.config.project_namespace.color(:green)
11
+ puts "Deploying to Lambda #{deployment_env} environment..."
12
+ return if @options[:noop]
13
+
14
+ check_dev_mode
15
+ validate_routes!
16
+
17
+ # deploy full nested stack when stack already exists
18
+ # Delete existing rollback stack from previous bad minimal deploy
19
+ delete_minimal_stack if minimal_rollback_complete?
20
+ exit_unless_updateable! # Stack could be in a weird rollback state or in progress state
21
+
22
+ if first_run?
23
+ ship(stack_type: :minimal)
24
+ Jets.application.reload_configs!
25
+ end
26
+
27
+ # Build code after the minimal stack because need s3 bucket for assets
28
+ # on_aws? and s3_base_url logic
29
+ # TODO: possible deploy hook point: before_build
30
+ build_code
31
+
32
+ # TODO: possible deploy hook point: before_ship
33
+ create_s3_event_buckets
34
+ ship(stack_type: :full, s3_bucket: s3_bucket)
35
+ end
36
+
37
+ def create_s3_event_buckets
38
+ buckets = Jets::Job::Base.s3_events.keys
39
+ buckets.each do |bucket|
40
+ Jets::AwsServices::S3Bucket.ensure_exists(bucket)
41
+ end
42
+ end
43
+
44
+ def delete_minimal_stack
45
+ puts "Existing stack is in ROLLBACK_COMPLETE state from a previous failed minimal deploy. Deleting stack and continuing."
46
+ cfn.delete_stack(stack_name: stack_name)
47
+ status.wait
48
+ status.reset
49
+ end
50
+
51
+ def check_dev_mode
52
+ if File.exist?("#{Jets.root}/dev.mode")
53
+ puts "The dev.mode file exists. Please removed it and run bundle update before you deploy.".color(:red)
54
+ exit 1
55
+ end
56
+ end
57
+
58
+ def build_code
59
+ Jets::Commands::Build.new(@options).build_code
60
+ end
61
+
62
+ def validate_routes!
63
+ check_route_connected_functions
64
+ end
65
+
66
+ # Checks that all routes are validate and have corresponding lambda functions
67
+ def check_route_connected_functions
68
+ return if Jets::Router.all_routes_valid
69
+
70
+ puts "Deploy fail: The jets application contain invalid routes.".color(:red)
71
+ puts "Please double check the routes below map to valid controllers:"
72
+ Jets::Router.invalid_routes.each do |route|
73
+ puts " /#{route.path} => #{route.controller_name}##{route.action_name}"
74
+ end
75
+ exit 1
76
+ end
77
+
78
+ def ship(stack_options)
79
+ options = @options.merge(stack_options) # includes stack_type and s3_bucket
80
+ Jets::Commands::Build.new(options).build_templates
81
+ Jets::Cfn::Ship.new(options).run
82
+ end
83
+
84
+ def status
85
+ Jets::Cfn::Status.new(stack_name)
86
+ end
87
+ memoize :status
88
+
89
+ def stack_name
90
+ Jets::Naming.parent_stack_name
91
+ end
92
+
93
+ # Checks for a few things before deciding to delete the parent stack
94
+ #
95
+ # * Parent stack status status is ROLLBACK_COMPLETE
96
+ # * Parent resources are in the DELETE_COMPLETE state
97
+ #
98
+ def minimal_rollback_complete?
99
+ stack = find_stack(stack_name)
100
+ return false unless stack
101
+
102
+ return false unless stack.stack_status == 'ROLLBACK_COMPLETE'
103
+
104
+ # Finally check if all the minimal resources in the parent template have been deleted
105
+ resp = cfn.describe_stack_resources(stack_name: stack_name)
106
+ resource_statuses = resp.stack_resources.map(&:resource_status).uniq
107
+ resource_statuses == ['DELETE_COMPLETE']
108
+ end
109
+
110
+ def find_stack(stack_name)
111
+ resp = cfn.describe_stacks(stack_name: stack_name)
112
+ resp.stacks.first
113
+ rescue Aws::CloudFormation::Errors::ValidationError => e
114
+ # example: Stack with id demo-dev does not exist
115
+ if e.message =~ /Stack with/ && e.message =~ /does not exist/
116
+ nil
117
+ else
118
+ raise
119
+ end
120
+ end
121
+
122
+ # All CloudFormation states listed here: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html
123
+ def exit_unless_updateable!
124
+ stack_name = Jets::Naming.parent_stack_name
125
+ exists = stack_exists?(stack_name)
126
+ return unless exists # continue because stack could be updating
127
+
128
+ stack = cfn.describe_stacks(stack_name: stack_name).stacks.first
129
+ status = stack["stack_status"]
130
+ if status =~ /^ROLLBACK_/ ||
131
+ status =~ /_IN_PROGRESS$/
132
+ region = `aws configure get region`.strip rescue "us-east-1"
133
+ url = "https://console.aws.amazon.com/cloudformation/home?region=#{region}#/stacks"
134
+ puts "The parent stack of the #{Jets.config.project_name.color(:green)} project is not in an updateable state."
135
+ puts "Stack name #{stack_name.color(:yellow)} status #{stack["stack_status"].color(:yellow)}"
136
+ puts "Here's the CloudFormation url to check for more details #{url}"
137
+ exit 1
138
+ end
139
+ end
140
+ end
141
+ end