jets-fs 1.6.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (379) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/bin/commit_docs.sh +26 -0
  3. data/.circleci/config.yml +126 -0
  4. data/.codebuild/README.md +68 -0
  5. data/.codebuild/bin/jets +3 -0
  6. data/.codebuild/buildspec-base.yml +14 -0
  7. data/.codebuild/integration.sh +72 -0
  8. data/.codebuild/jets.postman_collection.json +323 -0
  9. data/.codebuild/scripts/install-docker.sh +12 -0
  10. data/.codebuild/scripts/install-dynamodb-local.sh +22 -0
  11. data/.codebuild/scripts/install-java.sh +22 -0
  12. data/.codebuild/scripts/install-node.sh +4 -0
  13. data/.github/ISSUE_TEMPLATE.md +7 -0
  14. data/.github/ISSUE_TEMPLATE/bug_report.md +73 -0
  15. data/.github/ISSUE_TEMPLATE/documentation.md +27 -0
  16. data/.github/ISSUE_TEMPLATE/feature_request.md +64 -0
  17. data/.github/ISSUE_TEMPLATE/question.md +16 -0
  18. data/.github/PULL_REQUEST_TEMPLATE.md +42 -0
  19. data/.gitignore +24 -0
  20. data/.gitmodules +6 -0
  21. data/.python-version +1 -0
  22. data/.rspec +4 -0
  23. data/.ruby-version +1 -0
  24. data/CHANGELOG.md +533 -0
  25. data/Dockerfile +16 -0
  26. data/Dockerfile.base +53 -0
  27. data/Gemfile +14 -0
  28. data/Gemfile.lock +190 -0
  29. data/Guardfile +22 -0
  30. data/LICENSE.txt +22 -0
  31. data/Procfile +2 -0
  32. data/README.md +203 -0
  33. data/Rakefile +21 -0
  34. data/backers.md +16 -0
  35. data/bin/release +9 -0
  36. data/buildspec.yml +18 -0
  37. data/exe/jets +14 -0
  38. data/jets.gemspec +61 -0
  39. data/lib/jets.rb +71 -0
  40. data/lib/jets/application.rb +308 -0
  41. data/lib/jets/aws_info.rb +111 -0
  42. data/lib/jets/aws_services.rb +60 -0
  43. data/lib/jets/aws_services/stack_status.rb +59 -0
  44. data/lib/jets/booter.rb +130 -0
  45. data/lib/jets/builders.rb +16 -0
  46. data/lib/jets/builders/code_builder.rb +379 -0
  47. data/lib/jets/builders/code_size.rb +57 -0
  48. data/lib/jets/builders/gem_replacer.rb +76 -0
  49. data/lib/jets/builders/handler_generator.rb +172 -0
  50. data/lib/jets/builders/lambda_layer.rb +69 -0
  51. data/lib/jets/builders/md5.rb +60 -0
  52. data/lib/jets/builders/md5_zip.rb +61 -0
  53. data/lib/jets/builders/purger.rb +35 -0
  54. data/lib/jets/builders/rack_packager.rb +51 -0
  55. data/lib/jets/builders/rackup_wrappers/rackup +19 -0
  56. data/lib/jets/builders/rackup_wrappers/rackup.rb +7 -0
  57. data/lib/jets/builders/reconfigure_rails.rb +114 -0
  58. data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +16 -0
  59. data/lib/jets/builders/ruby_packager.rb +207 -0
  60. data/lib/jets/builders/shim_vars.rb +5 -0
  61. data/lib/jets/builders/shim_vars/app.rb +78 -0
  62. data/lib/jets/builders/shim_vars/base.rb +25 -0
  63. data/lib/jets/builders/shim_vars/shared.rb +37 -0
  64. data/lib/jets/builders/templates/handler.rb +12 -0
  65. data/lib/jets/builders/tidy.rb +107 -0
  66. data/lib/jets/builders/util.rb +31 -0
  67. data/lib/jets/camelizer.rb +67 -0
  68. data/lib/jets/cfn.rb +6 -0
  69. data/lib/jets/cfn/builders.rb +20 -0
  70. data/lib/jets/cfn/builders/api_deployment_builder.rb +58 -0
  71. data/lib/jets/cfn/builders/api_gateway_builder.rb +80 -0
  72. data/lib/jets/cfn/builders/base_child_builder.rb +82 -0
  73. data/lib/jets/cfn/builders/controller_builder.rb +42 -0
  74. data/lib/jets/cfn/builders/function_builder.rb +14 -0
  75. data/lib/jets/cfn/builders/interface.rb +127 -0
  76. data/lib/jets/cfn/builders/job_builder.rb +14 -0
  77. data/lib/jets/cfn/builders/parent_builder.rb +93 -0
  78. data/lib/jets/cfn/builders/rule_builder.rb +24 -0
  79. data/lib/jets/cfn/builders/shared_builder.rb +14 -0
  80. data/lib/jets/cfn/ship.rb +189 -0
  81. data/lib/jets/cfn/status.rb +212 -0
  82. data/lib/jets/cfn/upload.rb +139 -0
  83. data/lib/jets/cli.rb +189 -0
  84. data/lib/jets/commands.rb +27 -0
  85. data/lib/jets/commands/base.rb +164 -0
  86. data/lib/jets/commands/build.rb +217 -0
  87. data/lib/jets/commands/call.rb +174 -0
  88. data/lib/jets/commands/call/anonymous_guesser.rb +96 -0
  89. data/lib/jets/commands/call/autoload_guesser.rb +112 -0
  90. data/lib/jets/commands/call/base_guesser.rb +33 -0
  91. data/lib/jets/commands/call/guesser.rb +48 -0
  92. data/lib/jets/commands/clean.rb +23 -0
  93. data/lib/jets/commands/clean/base.rb +24 -0
  94. data/lib/jets/commands/clean/build.rb +13 -0
  95. data/lib/jets/commands/clean/log.rb +107 -0
  96. data/lib/jets/commands/console.rb +13 -0
  97. data/lib/jets/commands/db.rb +15 -0
  98. data/lib/jets/commands/db/environment-task.rake +3 -0
  99. data/lib/jets/commands/db/tasks.rb +44 -0
  100. data/lib/jets/commands/dbconsole.rb +131 -0
  101. data/lib/jets/commands/delete.rb +143 -0
  102. data/lib/jets/commands/deploy.rb +131 -0
  103. data/lib/jets/commands/dynamodb.rb +22 -0
  104. data/lib/jets/commands/dynamodb/migrate.rb +9 -0
  105. data/lib/jets/commands/dynamodb/migrator.rb +36 -0
  106. data/lib/jets/commands/gems.rb +21 -0
  107. data/lib/jets/commands/help.rb +9 -0
  108. data/lib/jets/commands/help/build.md +6 -0
  109. data/lib/jets/commands/help/call.md +61 -0
  110. data/lib/jets/commands/help/clean/build.md +5 -0
  111. data/lib/jets/commands/help/clean/log.md +5 -0
  112. data/lib/jets/commands/help/console.md +18 -0
  113. data/lib/jets/commands/help/db/generate.md +8 -0
  114. data/lib/jets/commands/help/dbconsole.md +9 -0
  115. data/lib/jets/commands/help/delete.md +22 -0
  116. data/lib/jets/commands/help/deploy.md +32 -0
  117. data/lib/jets/commands/help/dynamodb/generate.md +52 -0
  118. data/lib/jets/commands/help/dynamodb/migrate.md +4 -0
  119. data/lib/jets/commands/help/gems/check.md +8 -0
  120. data/lib/jets/commands/help/generate.md +22 -0
  121. data/lib/jets/commands/help/import/rack.md +13 -0
  122. data/lib/jets/commands/help/import/rails.md +11 -0
  123. data/lib/jets/commands/help/new.md +42 -0
  124. data/lib/jets/commands/help/routes.md +16 -0
  125. data/lib/jets/commands/help/runner.md +17 -0
  126. data/lib/jets/commands/help/server.md +15 -0
  127. data/lib/jets/commands/help/status.md +14 -0
  128. data/lib/jets/commands/help/upgrade.md +5 -0
  129. data/lib/jets/commands/help/url.md +6 -0
  130. data/lib/jets/commands/import.rb +18 -0
  131. data/lib/jets/commands/import/base.rb +49 -0
  132. data/lib/jets/commands/import/cheatsheet.rb +35 -0
  133. data/lib/jets/commands/import/rack.rb +16 -0
  134. data/lib/jets/commands/import/rail.rb +74 -0
  135. data/lib/jets/commands/import/sequence.rb +90 -0
  136. data/lib/jets/commands/import/templates/config/database.yml +26 -0
  137. data/lib/jets/commands/import/templates/submodules-cheatsheet.md +89 -0
  138. data/lib/jets/commands/main.rb +152 -0
  139. data/lib/jets/commands/markdown.rb +8 -0
  140. data/lib/jets/commands/markdown/creator.rb +58 -0
  141. data/lib/jets/commands/markdown/index.rb +27 -0
  142. data/lib/jets/commands/markdown/page.rb +125 -0
  143. data/lib/jets/commands/markdown/shell.rb +11 -0
  144. data/lib/jets/commands/new.rb +157 -0
  145. data/lib/jets/commands/rake_command.rb +61 -0
  146. data/lib/jets/commands/rake_tasks.rb +45 -0
  147. data/lib/jets/commands/runner.rb +18 -0
  148. data/lib/jets/commands/sequence.rb +99 -0
  149. data/lib/jets/commands/stack_info.rb +30 -0
  150. data/lib/jets/commands/templates/skeleton/.gitignore +12 -0
  151. data/lib/jets/commands/templates/skeleton/.jetskeep +1 -0
  152. data/lib/jets/commands/templates/skeleton/.rspec +3 -0
  153. data/lib/jets/commands/templates/skeleton/Gemfile.tt +35 -0
  154. data/lib/jets/commands/templates/skeleton/Procfile +7 -0
  155. data/lib/jets/commands/templates/skeleton/README.md +11 -0
  156. data/lib/jets/commands/templates/skeleton/Rakefile +2 -0
  157. data/lib/jets/commands/templates/skeleton/app/controllers/application_controller.rb +2 -0
  158. data/lib/jets/commands/templates/skeleton/app/helpers/application_helper.rb +2 -0
  159. data/lib/jets/commands/templates/skeleton/app/jobs/application_job.rb +4 -0
  160. data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +2 -0
  161. data/lib/jets/commands/templates/skeleton/app/models/application_record.rb +3 -0
  162. data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +25 -0
  163. data/lib/jets/commands/templates/skeleton/config.ru +5 -0
  164. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +66 -0
  165. data/lib/jets/commands/templates/skeleton/config/database.yml.tt +26 -0
  166. data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +22 -0
  167. data/lib/jets/commands/templates/skeleton/config/environments/development.rb +4 -0
  168. data/lib/jets/commands/templates/skeleton/config/environments/production.rb +4 -0
  169. data/lib/jets/commands/templates/skeleton/config/routes.rb +9 -0
  170. data/lib/jets/commands/templates/skeleton/db/.gitkeep +0 -0
  171. data/lib/jets/commands/templates/skeleton/public/404.html +67 -0
  172. data/lib/jets/commands/templates/skeleton/public/422.html +67 -0
  173. data/lib/jets/commands/templates/skeleton/public/500.html +66 -0
  174. data/lib/jets/commands/templates/skeleton/public/favicon.ico +0 -0
  175. data/lib/jets/commands/templates/skeleton/public/index.html.tt +91 -0
  176. data/lib/jets/commands/templates/skeleton/spec/controllers/posts_controller_spec.rb +15 -0
  177. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-index.json +51 -0
  178. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-show.json +53 -0
  179. data/lib/jets/commands/templates/skeleton/spec/spec_helper.rb.tt +30 -0
  180. data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +14 -0
  181. data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -0
  182. data/lib/jets/commands/templates/webpacker/app/javascript/src/jets/crud.js +87 -0
  183. data/lib/jets/commands/upgrade.rb +146 -0
  184. data/lib/jets/commands/upgrade/templates/bin/webpack +19 -0
  185. data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +19 -0
  186. data/lib/jets/commands/url.rb +68 -0
  187. data/lib/jets/commands/webpacker_template.rb +18 -0
  188. data/lib/jets/controller.rb +16 -0
  189. data/lib/jets/controller/base.rb +103 -0
  190. data/lib/jets/controller/callbacks.rb +62 -0
  191. data/lib/jets/controller/cookies.rb +40 -0
  192. data/lib/jets/controller/cookies/jar.rb +269 -0
  193. data/lib/jets/controller/layout.rb +17 -0
  194. data/lib/jets/controller/middleware.rb +5 -0
  195. data/lib/jets/controller/middleware/cors.rb +60 -0
  196. data/lib/jets/controller/middleware/local.rb +119 -0
  197. data/lib/jets/controller/middleware/local/api_gateway.rb +93 -0
  198. data/lib/jets/controller/middleware/local/mimic_aws_call.rb +38 -0
  199. data/lib/jets/controller/middleware/local/route_matcher.rb +97 -0
  200. data/lib/jets/controller/middleware/main.rb +46 -0
  201. data/lib/jets/controller/middleware/webpacker_setup.rb +6 -0
  202. data/lib/jets/controller/params.rb +87 -0
  203. data/lib/jets/controller/rack.rb +5 -0
  204. data/lib/jets/controller/rack/adapter.rb +63 -0
  205. data/lib/jets/controller/rack/env.rb +105 -0
  206. data/lib/jets/controller/redirection.rb +55 -0
  207. data/lib/jets/controller/rendering.rb +84 -0
  208. data/lib/jets/controller/rendering/rack_renderer.rb +238 -0
  209. data/lib/jets/controller/request.rb +29 -0
  210. data/lib/jets/controller/response.rb +61 -0
  211. data/lib/jets/core.rb +211 -0
  212. data/lib/jets/core_ext/kernel.rb +56 -0
  213. data/lib/jets/db.rb +15 -0
  214. data/lib/jets/dotenv.rb +39 -0
  215. data/lib/jets/erb.rb +51 -0
  216. data/lib/jets/generator.rb +41 -0
  217. data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
  218. data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +39 -0
  219. data/lib/jets/generator/templates/erb/scaffold/edit.html.erb +6 -0
  220. data/lib/jets/generator/templates/erb/scaffold/index.html.erb +29 -0
  221. data/lib/jets/generator/templates/erb/scaffold/new.html.erb +5 -0
  222. data/lib/jets/generator/templates/erb/scaffold/show.html.erb +9 -0
  223. data/lib/jets/generator/templates/rails/assets/javascript.js +2 -0
  224. data/lib/jets/generator/templates/rails/assets/stylesheet.css +4 -0
  225. data/lib/jets/generator/templates/rails/controller/controller.rb +13 -0
  226. data/lib/jets/generator/templates/rails/helper/helper.rb +4 -0
  227. data/lib/jets/generator/templates/rails/scaffold/scaffold.css +80 -0
  228. data/lib/jets/generator/templates/rails/scaffold_controller/api_controller.rb +62 -0
  229. data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +79 -0
  230. data/lib/jets/inflections.rb +32 -0
  231. data/lib/jets/internal/app/controllers/jets/public_controller.rb +31 -0
  232. data/lib/jets/internal/app/controllers/jets/rack_controller.rb +25 -0
  233. data/lib/jets/internal/app/functions/jets/base_path.rb +153 -0
  234. data/lib/jets/internal/app/jobs/jets/preheat_job.rb +62 -0
  235. data/lib/jets/io.rb +14 -0
  236. data/lib/jets/job.rb +4 -0
  237. data/lib/jets/job/base.rb +29 -0
  238. data/lib/jets/job/dsl.rb +108 -0
  239. data/lib/jets/klass.rb +109 -0
  240. data/lib/jets/lambda.rb +18 -0
  241. data/lib/jets/lambda/dsl.rb +384 -0
  242. data/lib/jets/lambda/function.rb +29 -0
  243. data/lib/jets/lambda/function_constructor.rb +55 -0
  244. data/lib/jets/lambda/functions.rb +34 -0
  245. data/lib/jets/lambda/task.rb +111 -0
  246. data/lib/jets/logger.rb +24 -0
  247. data/lib/jets/mega.rb +7 -0
  248. data/lib/jets/mega/hash_converter.rb +25 -0
  249. data/lib/jets/mega/request.rb +140 -0
  250. data/lib/jets/mega/request/source.rb +21 -0
  251. data/lib/jets/middleware.rb +38 -0
  252. data/lib/jets/middleware/configurator.rb +84 -0
  253. data/lib/jets/middleware/default_stack.rb +49 -0
  254. data/lib/jets/middleware/layer.rb +34 -0
  255. data/lib/jets/middleware/stack.rb +77 -0
  256. data/lib/jets/naming.rb +49 -0
  257. data/lib/jets/overrides/lambda.rb +1 -0
  258. data/lib/jets/overrides/lambda/marshaller.rb +31 -0
  259. data/lib/jets/overrides/rails.rb +4 -0
  260. data/lib/jets/overrides/rails/asset_tag_helper.rb +114 -0
  261. data/lib/jets/overrides/rails/common_methods.rb +20 -0
  262. data/lib/jets/overrides/rails/rendering_helper.rb +26 -0
  263. data/lib/jets/overrides/rails/url_helper.rb +25 -0
  264. data/lib/jets/poly_fun.rb +82 -0
  265. data/lib/jets/poly_fun/base_executor.rb +125 -0
  266. data/lib/jets/poly_fun/lambda_executor.rb +16 -0
  267. data/lib/jets/poly_fun/node_error.rb +8 -0
  268. data/lib/jets/poly_fun/node_executor.rb +54 -0
  269. data/lib/jets/poly_fun/python_error.rb +8 -0
  270. data/lib/jets/poly_fun/python_executor.rb +23 -0
  271. data/lib/jets/preheat.rb +117 -0
  272. data/lib/jets/processors.rb +4 -0
  273. data/lib/jets/processors/deducer.rb +65 -0
  274. data/lib/jets/processors/main_processor.rb +59 -0
  275. data/lib/jets/rack_server.rb +80 -0
  276. data/lib/jets/rdoc.rb +30 -0
  277. data/lib/jets/resource.rb +74 -0
  278. data/lib/jets/resource/api_gateway.rb +9 -0
  279. data/lib/jets/resource/api_gateway/base_path.rb +5 -0
  280. data/lib/jets/resource/api_gateway/base_path/function.rb +42 -0
  281. data/lib/jets/resource/api_gateway/base_path/mapping.rb +44 -0
  282. data/lib/jets/resource/api_gateway/base_path/role.rb +76 -0
  283. data/lib/jets/resource/api_gateway/cors.rb +61 -0
  284. data/lib/jets/resource/api_gateway/deployment.rb +78 -0
  285. data/lib/jets/resource/api_gateway/domain_name.rb +59 -0
  286. data/lib/jets/resource/api_gateway/method.rb +98 -0
  287. data/lib/jets/resource/api_gateway/resource.rb +78 -0
  288. data/lib/jets/resource/api_gateway/rest_api.rb +60 -0
  289. data/lib/jets/resource/api_gateway/rest_api/change_detection.rb +42 -0
  290. data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +63 -0
  291. data/lib/jets/resource/api_gateway/rest_api/routes.rb +11 -0
  292. data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +12 -0
  293. data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +130 -0
  294. data/lib/jets/resource/api_gateway/rest_api/routes/change/to.rb +29 -0
  295. data/lib/jets/resource/api_gateway/rest_api/routes/change/variable.rb +39 -0
  296. data/lib/jets/resource/api_gateway/rest_api/routes/collision.rb +123 -0
  297. data/lib/jets/resource/api_gateway/rest_api/routes/collision/variable_exception.rb +7 -0
  298. data/lib/jets/resource/associated.rb +26 -0
  299. data/lib/jets/resource/base.rb +28 -0
  300. data/lib/jets/resource/child_stack.rb +7 -0
  301. data/lib/jets/resource/child_stack/api_deployment.rb +56 -0
  302. data/lib/jets/resource/child_stack/api_gateway.rb +29 -0
  303. data/lib/jets/resource/child_stack/app_class.rb +112 -0
  304. data/lib/jets/resource/child_stack/base.rb +24 -0
  305. data/lib/jets/resource/child_stack/shared.rb +90 -0
  306. data/lib/jets/resource/config.rb +4 -0
  307. data/lib/jets/resource/config/config_rule.rb +74 -0
  308. data/lib/jets/resource/config/managed_rule.rb +15 -0
  309. data/lib/jets/resource/events.rb +3 -0
  310. data/lib/jets/resource/events/rule.rb +31 -0
  311. data/lib/jets/resource/iam.rb +8 -0
  312. data/lib/jets/resource/iam/application_role.rb +27 -0
  313. data/lib/jets/resource/iam/base_role_definition.rb +47 -0
  314. data/lib/jets/resource/iam/class_role.rb +74 -0
  315. data/lib/jets/resource/iam/function_role.rb +54 -0
  316. data/lib/jets/resource/iam/managed_policy.rb +22 -0
  317. data/lib/jets/resource/iam/policy_document.rb +41 -0
  318. data/lib/jets/resource/lambda.rb +5 -0
  319. data/lib/jets/resource/lambda/function.rb +216 -0
  320. data/lib/jets/resource/lambda/function/environment.rb +61 -0
  321. data/lib/jets/resource/lambda/gem_layer.rb +17 -0
  322. data/lib/jets/resource/lambda/layer_version.rb +44 -0
  323. data/lib/jets/resource/permission.rb +45 -0
  324. data/lib/jets/resource/replacer.rb +77 -0
  325. data/lib/jets/resource/route53.rb +3 -0
  326. data/lib/jets/resource/route53/record_set.rb +70 -0
  327. data/lib/jets/resource/s3.rb +17 -0
  328. data/lib/jets/resource/sns.rb +3 -0
  329. data/lib/jets/resource/sqs.rb +3 -0
  330. data/lib/jets/resource/standardizer.rb +42 -0
  331. data/lib/jets/route.rb +166 -0
  332. data/lib/jets/router.rb +175 -0
  333. data/lib/jets/router/scope.rb +30 -0
  334. data/lib/jets/rule.rb +4 -0
  335. data/lib/jets/rule/base.rb +19 -0
  336. data/lib/jets/rule/dsl.rb +110 -0
  337. data/lib/jets/spec_helpers.rb +52 -0
  338. data/lib/jets/spec_helpers/params.rb +10 -0
  339. data/lib/jets/spec_helpers/request.rb +98 -0
  340. data/lib/jets/spec_helpers/response.rb +5 -0
  341. data/lib/jets/stack.rb +103 -0
  342. data/lib/jets/stack/builder.rb +38 -0
  343. data/lib/jets/stack/definition.rb +50 -0
  344. data/lib/jets/stack/function.rb +60 -0
  345. data/lib/jets/stack/main.rb +5 -0
  346. data/lib/jets/stack/main/dsl.rb +33 -0
  347. data/lib/jets/stack/main/extensions/base.rb +45 -0
  348. data/lib/jets/stack/main/extensions/cloudwatch.rb +19 -0
  349. data/lib/jets/stack/main/extensions/lambda.rb +71 -0
  350. data/lib/jets/stack/main/extensions/sns.rb +12 -0
  351. data/lib/jets/stack/main/extensions/sqs.rb +36 -0
  352. data/lib/jets/stack/output.rb +38 -0
  353. data/lib/jets/stack/output/dsl.rb +19 -0
  354. data/lib/jets/stack/output/lookup.rb +36 -0
  355. data/lib/jets/stack/parameter.rb +38 -0
  356. data/lib/jets/stack/parameter/dsl.rb +42 -0
  357. data/lib/jets/stack/resource.rb +32 -0
  358. data/lib/jets/stack/resource/dsl.rb +19 -0
  359. data/lib/jets/tmp_loader.rb +52 -0
  360. data/lib/jets/turbine.rb +30 -0
  361. data/lib/jets/turbo.rb +47 -0
  362. data/lib/jets/turbo/database_yaml.rb +41 -0
  363. data/lib/jets/turbo/project/.gitignore +12 -0
  364. data/lib/jets/turbo/project/.jetskeep +1 -0
  365. data/lib/jets/turbo/project/Gemfile +16 -0
  366. data/lib/jets/turbo/project/Rakefile +2 -0
  367. data/lib/jets/turbo/project/app/controllers/application_controller.rb +2 -0
  368. data/lib/jets/turbo/project/app/helpers/application_helper.rb +2 -0
  369. data/lib/jets/turbo/project/app/jobs/application_job.rb +4 -0
  370. data/lib/jets/turbo/project/config.ru +5 -0
  371. data/lib/jets/turbo/project/config/application.rb +4 -0
  372. data/lib/jets/turbo/project/config/routes.rb +4 -0
  373. data/lib/jets/turbo/rail.rb +113 -0
  374. data/lib/jets/turbo/templates/config/database.yml +26 -0
  375. data/lib/jets/util.rb +38 -0
  376. data/lib/jets/version.rb +3 -0
  377. data/readme/prerelease.md +6 -0
  378. data/readme/testing.md +60 -0
  379. metadata +859 -0
@@ -0,0 +1,23 @@
1
+ module Jets::Commands
2
+ class Clean < Jets::Commands::Base
3
+ autoload :Base, 'jets/commands/clean/base'
4
+ autoload :Log, 'jets/commands/clean/log'
5
+ autoload :Build, 'jets/commands/clean/build'
6
+
7
+ class_option :noop, type: :boolean, desc: "noop or dry-run mode"
8
+ class_option :mute, type: :boolean, desc: "mute output"
9
+ class_option :sure, type: :boolean, desc: "bypass are you sure prompt"
10
+
11
+ desc "log", "Cleans CloudWatch log groups assocated with app"
12
+ long_desc Help.text('clean:log')
13
+ def log
14
+ Log.new(options).clean
15
+ end
16
+
17
+ desc "build", "Cleans jets build"
18
+ long_desc Help.text('clean:build')
19
+ def build
20
+ Build.new(options).clean
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,24 @@
1
+ class Jets::Commands::Clean
2
+ class Base
3
+ def initialize(options={})
4
+ @options = options
5
+ end
6
+
7
+ private
8
+ def say(message)
9
+ prefix = 'NOOP ' if @options[:noop]
10
+ puts "#{prefix}#{message}" unless @options[:mute]
11
+ end
12
+
13
+ def are_you_sure?(message)
14
+ return true if @options[:sure]
15
+
16
+ puts "Are you sure that you want to #{message}? (y/N)"
17
+ yes = $stdin.gets.strip
18
+ unless yes =~ /^y/
19
+ puts "Phew that was close!"
20
+ exit 0
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,13 @@
1
+ require 'fileutils'
2
+
3
+ class Jets::Commands::Clean
4
+ class Build < Base
5
+ def clean
6
+ are_you_sure?("delete /tmp/jets")
7
+
8
+ say "Removing /tmp/jets..."
9
+ FileUtils.rm_rf("/tmp/jets") unless @options[:noop]
10
+ say "Removed /tmp/jets"
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,107 @@
1
+ # The thing that limits this implementation is that there needs to be at least
2
+ # one lambda function created from an internal jets function. Example:
3
+ #
4
+ # /aws/lambda/demo-dev-2-jets-preheat_job-warm
5
+ # /aws/lambda/demo-dev-2-jets-public_controller-show
6
+ #
7
+ # We're doing this because JETS_ENV_EXTRA environments can create additional matching
8
+ # log groups and we don't want to overly-aggressively delete them.
9
+ #
10
+ # The `keep_prefixes(log_group_names)` method calcuates the log groups to keep.
11
+ class Jets::Commands::Clean
12
+ class Log < Base
13
+ extend Memoist
14
+ include Jets::AwsServices
15
+
16
+ def clean
17
+ are_you_sure?("delete CloudWatch logs")
18
+
19
+ say "Removing CloudWatch logs for #{prefix_guess}..."
20
+ log_groups.each do |g|
21
+ next if keep_log_group?(g.log_group_name)
22
+ logs.delete_log_group(log_group_name: g.log_group_name) unless @options[:noop]
23
+ say "Removed log group: #{g.log_group_name}"
24
+ end
25
+ say "Removed CloudWatch logs for #{prefix_guess}"
26
+ end
27
+
28
+ def clean_deploys
29
+ groups = deploy_log_groups.sort_by do |g|
30
+ g.log_group_name
31
+ end
32
+ # Keep the last 2 recent log groups so we can see the deleted logic
33
+ groups = groups[0..-3]
34
+ groups.each do |g|
35
+ logs.delete_log_group(log_group_name: g.log_group_name) unless @options[:noop]
36
+ end
37
+ end
38
+
39
+ def deploy_log_groups
40
+ log_groups.select do |g|
41
+ !keep_log_group?(g.log_group_name) &&
42
+ g.log_group_name.include?('jets-base-path')
43
+ end
44
+ end
45
+
46
+ private
47
+ def prefix_guess
48
+ Jets::Naming.parent_stack_name
49
+ end
50
+
51
+ def log_groups
52
+ groups, next_token = [], true
53
+ while next_token
54
+ next_token = nil if next_token == true # just at start the loop
55
+ resp = logs.describe_log_groups(
56
+ log_group_name_prefix: "/aws/lambda/#{prefix_guess}-",
57
+ next_token: next_token,
58
+ )
59
+ groups += resp.log_groups
60
+ next_token = resp.next_token
61
+ end
62
+ groups
63
+ end
64
+ memoize :log_groups
65
+
66
+ def log_group_names
67
+ log_groups.map(&:log_group_name)
68
+ end
69
+
70
+ def all_prefixes(log_group_names)
71
+ log_prefixes(log_group_names)
72
+ end
73
+ memoize :all_prefixes
74
+
75
+ # Check for the prefixes to keep. The slightly tricky thing to watch for is
76
+ # for the prefix matching addiitonal log groups that belong to other
77
+ # JETS_ENV_EXTRA=xxx created environments.
78
+ #
79
+ # We find and store the prefixes to keep so we don't over aggressively delete
80
+ # log groups.
81
+ def keep_prefixes(log_group_names)
82
+ names = log_group_names.reject do |name|
83
+ name =~ %r{/aws/lambda/#{prefix_guess}-jets}
84
+ end
85
+ log_prefixes(names)
86
+ end
87
+ memoize :keep_prefixes
88
+
89
+ # Strips -jets.* from the full log group name to leave only the prefix behind
90
+ def log_prefixes(names)
91
+ names = names.select do |name|
92
+ name.match(Regexp.new("#{prefix_guess}-.*jets"))
93
+ end
94
+ names.map do |name|
95
+ name.sub(/-jets.*/,'')
96
+ end.uniq.sort
97
+ end
98
+
99
+ # Check if it is safe to delete the log group
100
+ def keep_log_group?(log_group_name)
101
+ keep_prefixes = keep_prefixes(log_group_names)
102
+ !!keep_prefixes.detect do |keep_prefix|
103
+ log_group_name =~ Regexp.new(keep_prefix)
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,13 @@
1
+ class Jets::Commands::Console
2
+ def self.run
3
+ puts Jets::Booter.message
4
+ Jets.boot
5
+
6
+ # Thanks: https://mutelight.org/bin-console
7
+ require "irb"
8
+ require "irb/completion"
9
+
10
+ ARGV.clear # https://stackoverflow.com/questions/33070092/irb-start-not-starting/33136762
11
+ IRB.start
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ module Jets::Commands
2
+ class Db < Jets::Commands::Base
3
+ autoload :Tasks, 'jets/commands/db/tasks'
4
+
5
+ desc "generate", "Creates a migration to change a db table"
6
+ long_desc Help.text('db:generate')
7
+ def generate(*args)
8
+ require "rails/generators"
9
+ require "rails/generators/active_record/migration/migration_generator"
10
+
11
+ generator = ActiveRecord::Generators::MigrationGenerator.new(args)
12
+ generator.create_migration_file
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,3 @@
1
+ task :environment do
2
+ Jets.boot
3
+ end
@@ -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