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,29 @@
1
+ # Detects route to changes
2
+ class Jets::Resource::ApiGateway::RestApi::Routes::Change
3
+ class To < Base
4
+ def self.changed?
5
+ new.changed?
6
+ end
7
+
8
+ def changed?
9
+ deployed_routes.each do |deployed_route|
10
+ new_route = find_comparable_route(deployed_route)
11
+ if new_route && new_route.to != deployed_route.to
12
+ # change in already deployed route has been detected, requires bluegreen deploy
13
+ return true
14
+ end
15
+ end
16
+ false # Reaching here means no routes have been changed in a way that requires a bluegreen deploy
17
+ end
18
+
19
+ # Find a route that has the same path and method. This is a comparable route
20
+ # Then we will compare the to or controller action to see if an already
21
+ # deployed route has been changed.
22
+ def find_comparable_route(deployed_route)
23
+ new_routes.find do |new_route|
24
+ new_route.path == deployed_route.path &&
25
+ new_route.method == deployed_route.method
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,39 @@
1
+ # Detects route variable changes
2
+ class Jets::Resource::ApiGateway::RestApi::Routes::Change
3
+ class Variable < Base
4
+ def self.changed?
5
+ new.changed?
6
+ end
7
+
8
+ def changed?
9
+ changed = false
10
+ deployed_routes.each do |deployed_route|
11
+ parent = collision.variable_parent(deployed_route.path)
12
+ parent_variables = collision.parent_variables(parent, [deployed_route.path])
13
+ new_parent_variables = collision.parent_variables(parent, new_paths)
14
+
15
+ changed = parent_variables.size > 0 && new_parent_variables.size > 0 &&
16
+ parent_variables != new_parent_variables
17
+ break if changed
18
+ end
19
+ changed
20
+ end
21
+
22
+ # Only consider paths with variables
23
+ def new_paths
24
+ new_routes.map(&:path).select {|p| p.include?(':')}.uniq
25
+ end
26
+
27
+ # Only consider deployed routes with variables
28
+ def deployed_routes
29
+ deployed_routes = super
30
+ deployed_routes.select do |route|
31
+ route.path.include?(':')
32
+ end
33
+ end
34
+
35
+ def collision
36
+ @collision ||= Jets::Resource::ApiGateway::RestApi::Routes::Collision.new
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,123 @@
1
+ # Detects path variable collisions
2
+ class Jets::Resource::ApiGateway::RestApi::Routes
3
+ class Collision
4
+ autoload :VariableException, 'jets/resource/api_gateway/rest_api/routes/collision/variable_exception'
5
+
6
+ attr_reader :collisions
7
+ def initialize
8
+ @collisions = []
9
+ end
10
+
11
+ def collision?(paths)
12
+ paths = paths_with_variables(paths)
13
+ parents = variable_parents(paths)
14
+
15
+ collide = false
16
+ parents.each do |parent|
17
+ collide ||= variable_collision_exists?(parent, paths)
18
+ end
19
+ collide
20
+ end
21
+
22
+ def exception
23
+ VariableException.new(collision_message)
24
+ end
25
+
26
+ def collision_message
27
+ <<~EOL
28
+ There are routes with sibling variables under the same parent that collide.
29
+
30
+ Collisions:
31
+ #{@collisions.join("\n ")}
32
+
33
+ API Gateway only allows one unique variable path You must use the same variable name within
34
+ the same parent route path.
35
+ Example: /posts/:id and /posts/:post_id/reveal should both be /posts/:id and /posts/:id/reveal.
36
+
37
+ Please check your `config/routes.rb` and remove the colliding routes.
38
+ More info: http://rubyonjets.com/docs/considerations-api-gateway/
39
+ EOL
40
+ end
41
+
42
+ def variable_collision_exists?(parent, paths)
43
+ paths = paths_with_variables(paths)
44
+ variables = parent_variables(parent, paths)
45
+ collide = variables.uniq.size > 1
46
+ register_collision(parent, variables) if collide
47
+ collide
48
+ end
49
+
50
+ # register collision for later display
51
+ # We don't register the full path but this might be more helpful.
52
+ def register_collision(parent, variables)
53
+ return unless variables.uniq.size # check again just in case
54
+
55
+ variables.each do |v|
56
+ @collisions << "#{parent}/#{v}"
57
+ end
58
+ @collisions.uniq!
59
+ end
60
+
61
+ def parent_variables(parent, paths)
62
+ paths = paths.select do |path|
63
+ parent?(parent, path)
64
+ end
65
+ paths.map do |path|
66
+ path.sub("#{parent}/",'').gsub(%r{/.*},'')
67
+ end.uniq.sort
68
+ end
69
+
70
+ def parent?(parent, path)
71
+ return false if parent == path
72
+
73
+ parent_parts = parent.split('/')
74
+ path_parts = path.split('/')
75
+
76
+ n = parent_parts.size-1
77
+ parent_parts[0..n] == path_parts[0..n]
78
+ end
79
+
80
+ def direct_parent?(parent, path)
81
+ leaf = variable_leaf(path)
82
+ leaf_parent = leaf.split('/')[0..-2].join('/')
83
+ parent == leaf_parent
84
+ end
85
+
86
+ def variable_parents(paths)
87
+ parents = []
88
+ paths = paths_with_variables(paths)
89
+ paths.each do |path|
90
+ parents << variable_parent(path)
91
+ end
92
+ parents.uniq.sort
93
+ end
94
+
95
+ # Strips the path down until only the leaf node part is a variable
96
+ # Example: users/:user_id/posts/:post_id/edit
97
+ # Returns: users/:user_id/posts
98
+ def variable_parent(path)
99
+ path = variable_leaf(path)
100
+ # drop last variable to leave behind the parent
101
+ path.split('/')[0..-2].join('/')
102
+ end
103
+
104
+ # Strips the path down until only the leaf node part is a variable
105
+ # Example: users/:user_id/posts/:post_id/edit
106
+ # Returns: users/:user_id/posts
107
+ def variable_leaf(path)
108
+ return '' unless path.include?(':')
109
+
110
+ parts = path.split('/')
111
+ is_variable = parts.last.include?(':')
112
+ until is_variable
113
+ parts.pop
114
+ is_variable = parts.last.include?(':')
115
+ end
116
+ parts[0..-1].join('/') # parent
117
+ end
118
+
119
+ def paths_with_variables(paths)
120
+ paths.select { |p| p.include?(':') }.uniq
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,7 @@
1
+ class Jets::Resource::ApiGateway::RestApi::Routes::Collision
2
+ class VariableException < RuntimeError
3
+ def initialize(message="Route variable collisions")
4
+ super(message)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,26 @@
1
+ # Does not do full expansion, mainly a container that holds the definition and
2
+ # standardizes it without camelizing it.
3
+ class Jets::Resource
4
+ class Associated
5
+ extend Memoist
6
+
7
+ attr_reader :definition
8
+ def initialize(*definition)
9
+ @definition = definition.flatten
10
+ end
11
+
12
+ def logical_id
13
+ standardized.keys.first
14
+ end
15
+
16
+ def attributes
17
+ standardized.values.first
18
+ end
19
+
20
+ def standardized
21
+ standardizer = Standardizer.new(definition)
22
+ standardizer.standarize(definition) # doesnt camelize keys yet
23
+ end
24
+ memoize :standardized
25
+ end
26
+ end
@@ -0,0 +1,28 @@
1
+ # Classes that inherit from this method should NOT define and override:
2
+ #
3
+ # logical_id
4
+ # type
5
+ # properties
6
+ # attributes
7
+ #
8
+ # These are computed methods that derive their values from the resource definition itself.
9
+ # Overriding these methods will remove the computed logical which handles things
10
+ # like camelizing and replacements.
11
+ #
12
+ # The implementation of these methods are in `Jets::Resource`.
13
+ class Jets::Resource
14
+ class Base
15
+ extend Memoist
16
+ delegate :logical_id, :type, :properties, :attributes, :parameters, :outputs,
17
+ to: :resource
18
+
19
+ def resource
20
+ Jets::Resource.new(definition, replacements)
21
+ end
22
+ memoize :resource
23
+
24
+ def replacements
25
+ @replacements || {}
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,7 @@
1
+ module Jets::Resource::ChildStack
2
+ autoload :AppClass, 'jets/resource/child_stack/app_class'
3
+ autoload :ApiGateway, 'jets/resource/child_stack/api_gateway'
4
+ autoload :ApiDeployment, 'jets/resource/child_stack/api_deployment'
5
+ autoload :Base, 'jets/resource/child_stack/base'
6
+ autoload :Shared, 'jets/resource/child_stack/shared'
7
+ end
@@ -0,0 +1,56 @@
1
+ # Implements:
2
+ #
3
+ # definition
4
+ # template_filename
5
+ #
6
+ module Jets::Resource::ChildStack
7
+ class ApiDeployment < Base
8
+ def definition
9
+ {
10
+ deployment_id => {
11
+ type: "AWS::CloudFormation::Stack",
12
+ properties: {
13
+ template_url: template_url,
14
+ parameters: parameters,
15
+ },
16
+ depends_on: depends_on,
17
+ }
18
+ }
19
+ end
20
+
21
+ def parameters
22
+ p = {
23
+ IamRole: "!GetAtt IamRole.Arn",
24
+ RestApi: "!GetAtt ApiGateway.Outputs.RestApi",
25
+ S3Bucket: "!Ref S3Bucket",
26
+ }
27
+ p[:DomainName] = "!GetAtt ApiGateway.Outputs.DomainName" if Jets.custom_domain?
28
+ p
29
+ end
30
+
31
+ def depends_on
32
+ expression = "#{Jets::Naming.template_path_prefix}-*_controller*"
33
+ controller_logical_ids = []
34
+ Dir.glob(expression).each do |path|
35
+ next unless File.file?(path)
36
+
37
+ # map the path to a camelized logical_id. Example:
38
+ # /tmp/jets/demo/templates/demo-dev-2-posts_controller.yml to
39
+ # PostsController
40
+ regexp = Regexp.new(".*#{Jets.config.project_namespace}-app-")
41
+ controller_name = path.sub(regexp, '').sub('.yml', '')
42
+ controller_logical_id = controller_name.underscore.camelize
43
+ controller_logical_ids << controller_logical_id
44
+ end
45
+ controller_logical_ids
46
+ end
47
+
48
+ def deployment_id
49
+ Jets::Resource::ApiGateway::Deployment.logical_id
50
+ end
51
+
52
+ def template_filename
53
+ "#{Jets.config.project_namespace}-api-deployment.yml"
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,29 @@
1
+ # Implements:
2
+ #
3
+ # definition
4
+ # template_filename
5
+ #
6
+ module Jets::Resource::ChildStack
7
+ class ApiGateway < Base
8
+ def definition
9
+ {
10
+ api_gateway: {
11
+ type: "AWS::CloudFormation::Stack",
12
+ properties: {
13
+ template_url: template_url,
14
+ }
15
+ }
16
+ }
17
+ end
18
+
19
+ def outputs
20
+ {
21
+ logical_id => "!Ref #{logical_id}",
22
+ }
23
+ end
24
+
25
+ def template_filename
26
+ "#{Jets.config.project_namespace}-api-gateway.yml"
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,112 @@
1
+ # Implements:
2
+ #
3
+ # definition
4
+ # template_filename
5
+ #
6
+ module Jets::Resource::ChildStack
7
+ class AppClass < Base
8
+ def initialize(s3_bucket, options={})
9
+ super
10
+ @path = options[:path]
11
+ end
12
+
13
+ def definition
14
+ logical_id = app_logical_id
15
+ defintion = {
16
+ logical_id => {
17
+ type: "AWS::CloudFormation::Stack",
18
+ properties: {
19
+ template_url: template_url,
20
+ parameters: parameters,
21
+ }
22
+ }
23
+ }
24
+ defintion[logical_id][:depends_on] = depends_on if depends_on
25
+ defintion
26
+ end
27
+
28
+ def depends_on
29
+ klass = current_app_class.constantize
30
+ return unless klass.depends_on
31
+
32
+ klass.depends_on.map do |shared_stack|
33
+ shared_stack.to_s.camelize # logical_id
34
+ end
35
+ end
36
+
37
+ def depends_on_params
38
+ params = {}
39
+ depends_on.each do |dependency|
40
+ dependency_outputs(dependency).each do |output|
41
+ dependency_class = dependency.to_s.classify
42
+ params[output] = "!GetAtt #{dependency_class}.Outputs.#{output}"
43
+ end
44
+ end
45
+ params
46
+ end
47
+
48
+ def dependency_outputs(dependency)
49
+ dependency.to_s.classify.constantize.output_keys
50
+ end
51
+
52
+ def parameters
53
+ common = self.class.common_parameters
54
+ common.merge!(controller_params) if controller?
55
+ common.merge!(depends_on_params) if depends_on
56
+ common
57
+ end
58
+
59
+ def self.common_parameters
60
+ parameters = {
61
+ IamRole: "!GetAtt IamRole.Arn",
62
+ S3Bucket: "!Ref S3Bucket",
63
+ }
64
+ parameters[:GemLayer] = "!Ref GemLayer" unless Jets.poly_only?
65
+ parameters
66
+ end
67
+
68
+ def controller_params
69
+ return {} if Jets::Router.routes.empty?
70
+
71
+ params = {
72
+ RestApi: "!GetAtt ApiGateway.Outputs.RestApi",
73
+ }
74
+ scoped_routes.each do |route|
75
+ resource = Jets::Resource::ApiGateway::Resource.new(route.path)
76
+ params[resource.logical_id] = "!GetAtt ApiGateway.Outputs.#{resource.logical_id}"
77
+ end
78
+ params
79
+ end
80
+
81
+ def controller?
82
+ @path.include?('_controller.yml')
83
+ end
84
+
85
+ def scoped_routes
86
+ @routes ||= Jets::Router.routes.select do |route|
87
+ route.controller_name == current_app_class
88
+ end
89
+ end
90
+
91
+ def current_app_class
92
+ templates_prefix = "#{Jets::Naming.template_path_prefix}-app-"
93
+ @path.sub(templates_prefix, '')
94
+ .sub(/\.yml$/,'')
95
+ .gsub('-','/')
96
+ .classify
97
+ end
98
+
99
+ # map the path to a camelized logical_id. Example:
100
+ # /tmp/jets/demo/templates/demo-dev-2-posts_controller.yml to
101
+ # PostsController
102
+ def app_logical_id
103
+ regexp = Regexp.new(".*#{Jets.config.project_namespace}-app-")
104
+ controller_name = @path.sub(regexp, '').sub('.yml', '')
105
+ controller_name.underscore.camelize
106
+ end
107
+
108
+ def template_filename
109
+ @path
110
+ end
111
+ end
112
+ end