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,59 @@
1
+ # CloudFormation Docs AWS::ApiGateway::DomainName: https://amzn.to/2Bsnmbq
2
+ #
3
+ # Example:
4
+ #
5
+ # MyDomainName:
6
+ # Type: 'AWS::ApiGateway::DomainName'
7
+ # Properties:
8
+ # DomainName: api.mydomain.com
9
+ # CertificateArn: arn:aws:acm:us-east-1:111122223333:certificate/fb1b9770-a305-495d-aefb-27e5e101ff3
10
+ #
11
+ module Jets::Resource::ApiGateway
12
+ class DomainName < Jets::Resource::Base
13
+ def definition
14
+ properties = {
15
+ domain_name: domain_name,
16
+ endpoint_configuration: {
17
+ types: endpoint_types
18
+ }
19
+ }
20
+ # Can really only be REGIONAL or EDGE
21
+ if endpoint_types.include?("REGIONAL")
22
+ properties[:regional_certificate_arn] = cert_arn
23
+ end
24
+ if endpoint_types.include?("EDGE")
25
+ properties[:certificate_arn] = cert_arn
26
+ end
27
+
28
+ {
29
+ domain_name: {
30
+ type: "AWS::ApiGateway::DomainName",
31
+ properties: properties
32
+ }
33
+ }
34
+ end
35
+
36
+ def outputs
37
+ {
38
+ "DomainName" => "!Ref DomainName",
39
+ }
40
+ end
41
+
42
+ def domain_name
43
+ subdomain = Jets.project_namespace
44
+ managed_domain_name = "#{subdomain}.#{Jets.config.domain.hosted_zone_name}"
45
+ name = Jets.config.domain.name || managed_domain_name
46
+ # Strip trailing period if there is one set accidentally or else get this error
47
+ # Trailing period should be omitted from domain name (Service: AmazonApiGateway; Status Code: 400; Error Code: BadRequestException
48
+ name.sub(/\.$/,'')
49
+ end
50
+
51
+ def endpoint_types
52
+ [Jets.config.domain.endpoint_type].flatten
53
+ end
54
+
55
+ def cert_arn
56
+ Jets.config.domain.cert_arn
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,98 @@
1
+ # Converts a Jets::Route to a CloudFormation Jets::Resource::ApiGateway::Method resource
2
+ module Jets::Resource::ApiGateway
3
+ class Method < Jets::Resource::Base
4
+ # also delegate permission for a method
5
+ delegate :permission,
6
+ to: :resource
7
+
8
+ # route - Jets::Route
9
+ def initialize(route)
10
+ @route = route
11
+ end
12
+
13
+ def definition
14
+ {
15
+ method_logical_id => {
16
+ type: "AWS::ApiGateway::Method",
17
+ properties: {
18
+ resource_id: "!Ref #{resource_id}",
19
+ rest_api_id: "!Ref #{RestApi.logical_id}",
20
+ http_method: @route.method,
21
+ request_parameters: {},
22
+ authorization_type: authorization_type,
23
+ integration: {
24
+ integration_http_method: "POST",
25
+ type: "AWS_PROXY",
26
+ uri: "!Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${{namespace}LambdaFunction.Arn}/invocations"
27
+ },
28
+ method_responses: []
29
+ }
30
+ }
31
+ }
32
+ end
33
+
34
+ def method_logical_id
35
+ # https://stackoverflow.com/questions/6104240/how-do-i-strip-non-alphanumeric-characters-from-a-string-and-keep-spaces
36
+ # Add path to the logical id to allow 2 different paths to be connected to the same controller action.
37
+ # Example:
38
+ #
39
+ # root "jets/public#show"
40
+ # any "*catchall", to: "jets/public#show"
41
+ #
42
+ # Without the path in the logical id, the logical id would be ShowApiMethod for both routes and only the
43
+ # last one would be created in the CloudFormation template.
44
+ path = @route.path.gsub('*','')
45
+ .gsub(/[^0-9a-z]/i, ' ')
46
+ .gsub(/\s+/, '_')
47
+ path = nil if path == ''
48
+ http_verb = @route.method.downcase
49
+ [path, "{namespace}_#{http_verb}_api_method"].compact.join('_')
50
+ end
51
+
52
+ def replacements
53
+ # mimic task to grab replacements, we want the namespace to be the lambda function's namespace
54
+ resources = [definition]
55
+ task = Jets::Lambda::Task.new(@route.controller_name, @route.action_name,
56
+ resources: resources)
57
+ task.replacements
58
+ end
59
+
60
+ def cors
61
+ Cors.new(@route)
62
+ end
63
+ memoize :cors
64
+
65
+ private
66
+
67
+ def authorization_type
68
+ type = @route.authorization_type ||
69
+ controller_auth_type ||
70
+ Jets.config.api.authorization_type
71
+ type.to_s.upcase
72
+ end
73
+
74
+ def controller_auth_type
75
+ controller_name = @route.to.split('#').first
76
+ controller = "#{controller_name}_controller".classify.constantize
77
+ # Already handles inheritance via class_attribute
78
+ controller.authorization_type
79
+ end
80
+
81
+ def resource_id
82
+ @route.path == '' ?
83
+ "RootResourceId" :
84
+ "#{resource_logical_id.camelize}ApiResource"
85
+ end
86
+
87
+ # Example: Posts
88
+ def resource_logical_id
89
+ camelized_path.underscore
90
+ end
91
+
92
+ def camelized_path
93
+ path = @route.path
94
+ path = "homepage" if path == ''
95
+ path.gsub('/','_').gsub(':','').gsub('*','').camelize
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,78 @@
1
+ module Jets::Resource::ApiGateway
2
+ class Resource < Jets::Resource::Base
3
+ def initialize(path, internal: false)
4
+ @path = path # Examples: "posts/:id/edit" or "posts"
5
+ @internal = internal
6
+ end
7
+
8
+ def definition
9
+ {
10
+ resource_logical_id => {
11
+ type: "AWS::ApiGateway::Resource",
12
+ properties: {
13
+ parent_id: parent_id,
14
+ path_part: path_part,
15
+ rest_api_id: "!Ref #{RestApi.logical_id(@internal)}",
16
+ }
17
+ }
18
+ }
19
+ end
20
+
21
+ def outputs
22
+ {
23
+ logical_id => "!Ref #{logical_id}",
24
+ }
25
+ end
26
+
27
+ def resource_logical_id
28
+ if @path == ''
29
+ "RootResourceId"
30
+ else
31
+ "#{path_logical_id(@path)}ApiResource"
32
+ end
33
+ end
34
+
35
+ # For parameter description
36
+ def desc
37
+ path.empty? ? 'Homepage route: /' : "Route for: /#{path}"
38
+ end
39
+
40
+ def parent_id
41
+ if @path.include?('/') # posts/:id or posts/:id/edit
42
+ parent_path = @path.split('/')[0..-2].join('/')
43
+ parent_logical_id = path_logical_id(parent_path)
44
+ "!Ref #{parent_logical_id}ApiResource"
45
+ else
46
+ "!GetAtt #{RestApi.logical_id(@internal)}.RootResourceId"
47
+ end
48
+ end
49
+
50
+ def path_part
51
+ last_part = path.split('/').last
52
+ last_part.split('/').map {|s| transform_capture(s) }.join('/') if last_part
53
+ end
54
+
55
+ # Modify the path to conform to API Gateway capture expressions
56
+ def path
57
+ @path.split('/').map {|s| transform_capture(s) }.join('/')
58
+ end
59
+
60
+ def transform_capture(text)
61
+ if text.starts_with?(':')
62
+ text = text.sub(':','')
63
+ text = "{#{text}}" # :foo => {foo}
64
+ end
65
+ if text.starts_with?('*')
66
+ text = text.sub('*','')
67
+ text = "{#{text}+}" # *foo => {foo+}
68
+ end
69
+ text
70
+ end
71
+
72
+ private
73
+ # Similar path_logical_id method in resource/route.rb
74
+ def path_logical_id(path)
75
+ path.gsub('/','_').gsub(':','').gsub('*','').camelize
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,60 @@
1
+ module Jets::Resource::ApiGateway
2
+ class RestApi < Jets::Resource::Base
3
+ autoload :ChangeDetection, 'jets/resource/api_gateway/rest_api/change_detection'
4
+ autoload :LogicalId, 'jets/resource/api_gateway/rest_api/logical_id'
5
+ autoload :Routes, 'jets/resource/api_gateway/rest_api/routes'
6
+
7
+ def definition
8
+ properties = {
9
+ name: Jets::Naming.gateway_api_name,
10
+ endpoint_configuration: { types: endpoint_types }
11
+ }
12
+ properties[:binary_media_types] = binary_media_types if binary_media_types
13
+
14
+ {
15
+ internal_logical_id => {
16
+ type: "AWS::ApiGateway::RestApi",
17
+ properties: properties
18
+ }
19
+ }
20
+ end
21
+
22
+ def internal_logical_id
23
+ self.class.logical_id(true)
24
+ end
25
+
26
+ def self.logical_id(internal=false)
27
+ internal ? internal_logical_id : "RestApi"
28
+ end
29
+
30
+ @@internal_logical_id = nil
31
+ def self.internal_logical_id
32
+ @@internal_logical_id ||= LogicalId.new.get
33
+ end
34
+
35
+ def outputs
36
+ {
37
+ "RestApi" => "!Ref #{internal_logical_id}",
38
+ "Region" => "!Ref AWS::Region",
39
+ "RootResourceId" => "!GetAtt #{internal_logical_id}.RootResourceId",
40
+ }
41
+ end
42
+
43
+ def endpoint_types
44
+ [Jets.config.api.endpoint_type].flatten
45
+ end
46
+
47
+ # TODO: Looks like there's a bug with CloudFormation. On an API Gateway update
48
+ # we need to pass in the escaped version: multipart~1form-data
49
+ # On a brand new API Gateway creation, we need to pass in the unescaped form:
50
+ # multipart/form-data
51
+ # We are handling this with a full API Gateway replacement instead because it
52
+ # can be generalized more easily.
53
+ def binary_media_types
54
+ types = Jets.config.api.binary_media_types
55
+ return nil if types.nil? || types.empty?
56
+
57
+ [types].flatten
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,42 @@
1
+ class Jets::Resource::ApiGateway::RestApi
2
+ class ChangeDetection
3
+ extend Memoist
4
+ include Jets::AwsServices
5
+
6
+ def changed?
7
+ return false unless parent_stack_exists?
8
+ current_binary_media_types != new_binary_media_types ||
9
+ Routes.changed?
10
+ end
11
+
12
+ def new_binary_media_types
13
+ rest_api = Jets::Resource::ApiGateway::RestApi.new
14
+ rest_api.binary_media_types
15
+ end
16
+ memoize :new_binary_media_types
17
+
18
+ # Duplicated in rest_api/change_detection.rb, base_path/role.rb, rest_api/routes.rb
19
+ def current_binary_media_types
20
+ return nil unless parent_stack_exists?
21
+
22
+ stack = cfn.describe_stacks(stack_name: parent_stack_name).stacks.first
23
+
24
+ api_gateway_stack_arn = lookup(stack[:outputs], "ApiGateway")
25
+
26
+ stack = cfn.describe_stacks(stack_name: api_gateway_stack_arn).stacks.first
27
+ rest_api_id = lookup(stack[:outputs], "RestApi")
28
+
29
+ resp = apigateway.get_rest_api(rest_api_id: rest_api_id)
30
+ resp.binary_media_types
31
+ end
32
+ memoize :current_binary_media_types
33
+
34
+ def parent_stack_exists?
35
+ stack_exists?(parent_stack_name)
36
+ end
37
+
38
+ def parent_stack_name
39
+ Jets::Naming.parent_stack_name
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,63 @@
1
+ class Jets::Resource::ApiGateway::RestApi
2
+ class LogicalId
3
+ extend Memoist
4
+ include Jets::AwsServices
5
+
6
+ def get
7
+ return default unless stack_exists?(parent_stack_name) && api_gateway_exists?
8
+
9
+ if changed?
10
+ new_id
11
+ else
12
+ current
13
+ end
14
+ end
15
+
16
+ def changed?
17
+ change_detection = ChangeDetection.new
18
+ change_detection.changed?
19
+ end
20
+
21
+ # Takes current logical id and increments the number that is appended to it.
22
+ #
23
+ # Examples:
24
+ #
25
+ # RestApi => RestApi1
26
+ # RestApi1 => RestApi2
27
+ # RestApi2 => RestApi3
28
+ # RestApi7 => RestApi8
29
+ def new_id
30
+ regexp = /(\d+)/
31
+ md = current.match(regexp)
32
+ if md
33
+ current.gsub(regexp,'') + (md[1].to_i + 1).to_s
34
+ else
35
+ current + "1"
36
+ end
37
+ end
38
+
39
+ def current
40
+ resources = cfn.describe_stack_resources(stack_name: api_gateway_stack_arn).stack_resources
41
+ rest_api = resources.find { |r| r.resource_type == 'AWS::ApiGateway::RestApi' }
42
+ rest_api.logical_resource_id
43
+ end
44
+ memoize :current
45
+
46
+ def api_gateway_stack_arn
47
+ stack = cfn.describe_stacks(stack_name: parent_stack_name).stacks.first
48
+ lookup(stack[:outputs], "ApiGateway") # api_gateway_stack_arn
49
+ end
50
+
51
+ def api_gateway_exists?
52
+ !!api_gateway_stack_arn
53
+ end
54
+
55
+ def parent_stack_name
56
+ Jets::Naming.parent_stack_name
57
+ end
58
+
59
+ def default
60
+ "RestApi"
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,11 @@
1
+ class Jets::Resource::ApiGateway::RestApi
2
+ class Routes
3
+ autoload :Base, 'jets/resource/api_gateway/rest_api/routes/base'
4
+ autoload :Change, 'jets/resource/api_gateway/rest_api/routes/change'
5
+ autoload :Collision, 'jets/resource/api_gateway/rest_api/routes/collision'
6
+
7
+ def self.changed?
8
+ Change.new.changed?
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ # Detects route changes
2
+ class Jets::Resource::ApiGateway::RestApi::Routes
3
+ class Change
4
+ autoload :Base, 'jets/resource/api_gateway/rest_api/routes/change/base'
5
+ autoload :To, 'jets/resource/api_gateway/rest_api/routes/change/to'
6
+ autoload :Variable, 'jets/resource/api_gateway/rest_api/routes/change/variable'
7
+
8
+ def changed?
9
+ To.changed? || Variable.changed? || ENV['JETS_REPLACE_API']
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,130 @@
1
+ class Jets::Resource::ApiGateway::RestApi::Routes::Change
2
+ class Base
3
+ extend Memoist
4
+ include Jets::AwsServices
5
+
6
+ # Build up deployed routes from the existing CloudFormation resources.
7
+ def deployed_routes
8
+ routes = []
9
+
10
+ resources, position = [], true
11
+ while position
12
+ position = nil if position == true # start of loop
13
+ resp = apigateway.get_resources(
14
+ rest_api_id: rest_api_id,
15
+ position: position,
16
+ )
17
+ resources += resp.items
18
+ position = resp.position
19
+ end
20
+
21
+ resources.each do |resource|
22
+ resource_methods = resource.resource_methods
23
+ next if resource_methods.nil?
24
+
25
+ resource_methods.each do |http_verb, resource_method|
26
+ # puts "#{http_verb} #{resource.path} | resource.id #{resource.id}"
27
+ # puts to(resource.id, http_verb)
28
+
29
+ # Test changing config.cors and CloudFormation does an in-place update
30
+ # on the resource. So no need to do bluegreen deployments for OPTIONS.
31
+ next if http_verb == "OPTIONS"
32
+
33
+ path = recreate_path(resource.path)
34
+ method = http_verb.downcase.to_sym
35
+ to = to(resource.id, http_verb)
36
+ route = Jets::Route.new(path: path, method: method, to: to)
37
+ routes << route
38
+ end
39
+ end
40
+ routes
41
+ end
42
+ memoize :deployed_routes
43
+
44
+ def recreate_path(path)
45
+ path = path.gsub(%r{^/},'')
46
+ path = path.gsub(/{([^}]*)\+}/, '*\1')
47
+ path.gsub(/{([^}]*)}/, ':\1')
48
+ end
49
+
50
+ def to(resource_id, http_method)
51
+ uri = method_uri(resource_id, http_method)
52
+ recreate_to(uri) unless uri.nil?
53
+ end
54
+
55
+ def method_uri(resource_id, http_method)
56
+ resp = apigateway.get_method(
57
+ rest_api_id: rest_api_id,
58
+ resource_id: resource_id,
59
+ http_method: http_method
60
+ )
61
+ resp.method_integration.uri
62
+ end
63
+
64
+ # Parses method uri and recreates a Route to argument.
65
+ # So:
66
+ # "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:112233445566:function:demo-test-posts_controller-new/invocations"
67
+ # Returns:
68
+ # posts#new
69
+ def recreate_to(method_uri)
70
+ md = method_uri.match(/function:(.*)\//)
71
+ function_arn = md[1] # IE: demo-dev-posts_controller-new
72
+ controller, action = get_controller_action(function_arn)
73
+ "#{controller}##{action}" # IE: posts#new
74
+ end
75
+
76
+ def get_controller_action(function_arn)
77
+ if function_arn.include?('_controller-')
78
+ controller_action_from_string(function_arn)
79
+ else
80
+ controller_action_from_api(function_arn)
81
+ end
82
+ end
83
+
84
+ # TODO: If this hits the Lambda Rate limit, then list_functions also contains the Lambda
85
+ # function description. So we can paginate through list_functions results and store
86
+ # description from there if needed.
87
+ # Dont think this will be needed though because controller_action_from_string gets called
88
+ # most of the time. Also, user might be able to request their Lambda limit to be increased.
89
+ def controller_action_from_api(function_arn)
90
+ desc = lambda_function_description(function_arn)
91
+ controller, action = desc.split('#')
92
+ controller = controller.underscore.sub(/_controller$/,'')
93
+ [controller, action]
94
+ end
95
+
96
+ def controller_action_from_string(function_arn)
97
+ controller_action = function_arn.sub("#{Jets.project_namespace}-", '')
98
+ md = controller_action.match(/(.*)_controller-(.*)/)
99
+ controller = md[1]
100
+ controller = controller.gsub('-','/')
101
+ action = md[2]
102
+ [controller, action]
103
+ end
104
+
105
+ def lambda_function_description(function_arn)
106
+ resp = lambda.get_function(function_name: function_arn)
107
+ resp.configuration.description # contains full info: PostsController#index
108
+ end
109
+
110
+ # Duplicated in rest_api/change_detection.rb, base_path/role.rb, rest_api/routes.rb
111
+ def rest_api_id
112
+ stack_name = Jets::Naming.parent_stack_name
113
+ return "RestApi" unless stack_exists?(stack_name)
114
+
115
+ stack = cfn.describe_stacks(stack_name: stack_name).stacks.first
116
+
117
+ api_gateway_stack_arn = lookup(stack[:outputs], "ApiGateway")
118
+
119
+ # resources = cfn.describe_stack_resources(stack_name: api_gateway_stack_arn).stack_resources
120
+ stack = cfn.describe_stacks(stack_name: api_gateway_stack_arn).stacks.first
121
+ lookup(stack[:outputs], "RestApi") # rest_api_id
122
+ end
123
+ memoize :rest_api_id
124
+
125
+ def new_routes
126
+ Jets::Router.routes
127
+ end
128
+ memoize :new_routes
129
+ end
130
+ end