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,80 @@
1
+ module Jets
2
+ class RackServer
3
+ def self.start(options={})
4
+ new(options).start
5
+ end
6
+
7
+ def initialize(options={})
8
+ @options = options
9
+ end
10
+
11
+ def start
12
+ return unless File.exist?("#{rack_project}/config.ru")
13
+ puts "Starting additional rack server for the project under the rack subfolder..." if ENV['JETS_DEBUG']
14
+
15
+ if ENV['FOREGROUND']
16
+ serve
17
+ return
18
+ end
19
+
20
+ # Reaching here means we'll run the server in the background.
21
+ # Handle daemonzing ourselves because it keeps the stdout of the 2nd
22
+ # rack server. The rackup --daemonize option ends up hiding the output.
23
+ pid = Process.fork
24
+ if pid.nil?
25
+ # we're in the child process
26
+ serve
27
+ else
28
+ # we're in the parent process
29
+ Process.detach(pid) # dettached but still in the "foreground" since bin/rackup runs in the foreground
30
+ end
31
+ end
32
+
33
+ # Runs in the child process
34
+ def serve
35
+ # Note, looks like stopping jets server with Ctrl-C sends the TERM signal
36
+ # down to the sub bin/rackup command cleans up the child process fine.
37
+ Bundler.with_clean_env do
38
+ args = ''
39
+ args << " --host #{@options[:host]}" if @options[:host] # only forward the host option
40
+ # port is always 9292 for simplicity
41
+ command = "cd #{rack_project} && bin/rackup#{args}" # leads to the same wrapper rack scripts
42
+ puts "=> #{command}".color(:green)
43
+ system(command)
44
+ end
45
+ end
46
+
47
+ # blocks until rack server is up
48
+ def wait_for_socket
49
+ return unless Jets.rack?
50
+
51
+ retries = 0
52
+ max_retries = 30 # 15 seconds at a delay of 0.5s
53
+ delay = 0.5
54
+ if ENV['C9_USER'] # overrides for local testing
55
+ max_retries = 3
56
+ delay = 3
57
+ end
58
+ begin
59
+ server = TCPSocket.new('localhost', 9292)
60
+ server.close
61
+ rescue Errno::ECONNREFUSED
62
+ puts "Unable to connect to localhost:9292. Delay for #{delay} and will try to connect again." if ENV['JETS_DEBUG']
63
+ sleep(delay)
64
+ retries += 1
65
+ if retries < max_retries
66
+ retry
67
+ else
68
+ puts "Giving up on trying to connect to localhost:9292"
69
+ return false
70
+ end
71
+ end
72
+ puts "Connected to localhost:9292 successfully"
73
+ true
74
+ end
75
+
76
+ def rack_project
77
+ "#{Jets.root}/rack"
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,30 @@
1
+ module Jets
2
+ module Rdoc
3
+ # Use for both jets.gemspec and rake rdoc task
4
+ def options
5
+ exclude = %w[
6
+ docs
7
+ spec
8
+ vendor
9
+ core.rb
10
+ .js
11
+ templates
12
+ commands
13
+ internal
14
+ support
15
+ Dockerfile
16
+ Dockerfile.base
17
+ Gemfile
18
+ Gemfile.lock
19
+ Guardfile
20
+ LICENSE
21
+ Procfile
22
+ Rakefile
23
+ bin
24
+ ]
25
+ exclude = exclude.map { |word| ['-x', word] }.flatten
26
+ ["-m", "README.md", "--markup", "tomdoc"] + exclude
27
+ end
28
+ extend self
29
+ end
30
+ end
@@ -0,0 +1,74 @@
1
+ class Jets::Resource
2
+ extend Memoist
3
+
4
+ autoload :ApiGateway, 'jets/resource/api_gateway'
5
+ autoload :Associated, 'jets/resource/associated'
6
+ autoload :Base, 'jets/resource/base'
7
+ autoload :ChildStack, 'jets/resource/child_stack'
8
+ autoload :Config, 'jets/resource/config'
9
+ autoload :Events, 'jets/resource/events'
10
+ autoload :Iam, 'jets/resource/iam'
11
+ autoload :Lambda, 'jets/resource/lambda'
12
+ autoload :Permission, 'jets/resource/permission'
13
+ autoload :Replacer, 'jets/resource/replacer'
14
+ autoload :Route53, 'jets/resource/route53'
15
+ autoload :S3, 'jets/resource/s3'
16
+ autoload :Sns, 'jets/resource/sns'
17
+ autoload :Sqs, 'jets/resource/sqs'
18
+ autoload :Standardizer, 'jets/resource/standardizer'
19
+
20
+ attr_reader :definition, :replacements
21
+ def initialize(definition, replacements={})
22
+ @definition = definition
23
+ @replacements = replacements
24
+ end
25
+
26
+ def template
27
+ standarize(definition)
28
+ end
29
+ memoize :template
30
+
31
+ # CloudFormation Resources reference: https://amzn.to/2NKg6ip
32
+ def standarize(*definition)
33
+ Standardizer.new(definition).template
34
+ end
35
+
36
+ def logical_id
37
+ id = template.keys.first
38
+ # replace possible {namespace} in the logical id
39
+ id = replacer.replace_value(id)
40
+ Jets::Camelizer.camelize(id)
41
+ end
42
+
43
+ def type
44
+ attributes['Type']
45
+ end
46
+
47
+ def properties
48
+ attributes['Properties']
49
+ end
50
+
51
+ def attributes
52
+ attributes = template.values.first
53
+ attributes = replacer.replace_placeholders(attributes)
54
+ Jets::Camelizer.transform(attributes)
55
+ end
56
+
57
+ def parameters
58
+ {}
59
+ end
60
+
61
+ def outputs
62
+ {}
63
+ end
64
+
65
+ def replacer
66
+ Replacer.new(replacements)
67
+ end
68
+ memoize :replacer
69
+
70
+ def permission
71
+ Permission.new(replacements, self)
72
+ end
73
+ memoize :permission
74
+ end
@@ -0,0 +1,9 @@
1
+ module Jets::Resource::ApiGateway
2
+ autoload :BasePath, 'jets/resource/api_gateway/base_path'
3
+ autoload :Cors, 'jets/resource/api_gateway/cors'
4
+ autoload :Deployment, 'jets/resource/api_gateway/deployment'
5
+ autoload :DomainName, 'jets/resource/api_gateway/domain_name'
6
+ autoload :Method, 'jets/resource/api_gateway/method'
7
+ autoload :Resource, 'jets/resource/api_gateway/resource'
8
+ autoload :RestApi, 'jets/resource/api_gateway/rest_api'
9
+ end
@@ -0,0 +1,5 @@
1
+ module Jets::Resource::ApiGateway::BasePath
2
+ autoload :Function, 'jets/resource/api_gateway/base_path/function'
3
+ autoload :Mapping, 'jets/resource/api_gateway/base_path/mapping'
4
+ autoload :Role, 'jets/resource/api_gateway/base_path/role'
5
+ end
@@ -0,0 +1,42 @@
1
+ module Jets::Resource::ApiGateway::BasePath
2
+ class Function < Jets::Resource::Base
3
+ include Jets::Resource::Lambda::Function::Environment
4
+
5
+ def definition
6
+ {
7
+ base_path_function: {
8
+ type: "AWS::Lambda::Function",
9
+ properties: {
10
+ function_name: function_name,
11
+ code: {
12
+ s3_bucket: "!Ref S3Bucket",
13
+ s3_key: code_s3_key,
14
+ },
15
+ role: "!GetAtt BasePathRole.Arn",
16
+ handler: handler,
17
+ runtime: "ruby2.5",
18
+ timeout: 60,
19
+ memory_size: 1536,
20
+ environment: env_properties[:environment],
21
+ }
22
+ }
23
+ }
24
+ end
25
+
26
+ def function_name
27
+ method = "jets-base-path"
28
+ # need to add the deployment timestamp because or else function name collides between deploys
29
+ timestamp = Jets::Resource::ApiGateway::Deployment.timestamp
30
+ "#{Jets.config.project_namespace}-#{method}-#{timestamp}"
31
+ end
32
+
33
+ def handler
34
+ "handlers/functions/jets/base_path.lambda_handler"
35
+ end
36
+
37
+ def code_s3_key
38
+ checksum = Jets::Builders::Md5.checksums["stage/code"]
39
+ "jets/code/code-#{checksum}.zip" # s3_key
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,44 @@
1
+ # CloudFormation Docs AWS::ApiGateway::DomainName: https://amzn.to/2BsrSqo
2
+ #
3
+ # Example:
4
+ #
5
+ # Type: AWS::ApiGateway::BasePathMapping
6
+ # Properties:
7
+ # BasePath: String
8
+ # DomainName: String
9
+ # RestApiId: String
10
+ # Stage: String
11
+ #
12
+ # Currently unable to add base path mapping in-place with CloudFormation.
13
+ # The workaround for this is to do it post deployment with raw API calls outside
14
+ # of CloudFormation. Leaving this around for now in case there's a workaround
15
+ # to get this into CloudFormation instead of raw API calls. Some notes:
16
+ # * Also tried to change the domain name of to something like demo-dev-[random].mydomain.com
17
+ # That does not work because the domain name has to match the route53 record exactly.
18
+ #
19
+ module Jets::Resource::ApiGateway::BasePath
20
+ class Mapping < Jets::Resource::Base
21
+ def definition
22
+ function_logical_id = "BasePathFunction" # lambda function that supports custom resource
23
+ {
24
+ base_path_mapping: {
25
+ type: "Custom::BasePathMapping",
26
+ properties: {
27
+ service_token: "!GetAtt #{function_logical_id}.Arn",
28
+ # base_path: '', # empty path represents root
29
+ # domain_name: "!Ref DomainName",
30
+ # rest_api_id: "!Ref RestApi", # since this is in the Deployment template
31
+ # stage: Deployment.stage_name,
32
+ },
33
+ depends_on: Jets::Resource::ApiGateway::Deployment.logical_id,
34
+ }
35
+ }
36
+ end
37
+
38
+ def outputs
39
+ {
40
+ "BasePathMapping" => "!Ref BasePathMapping",
41
+ }
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,76 @@
1
+ module Jets::Resource::ApiGateway::BasePath
2
+ class Role < Jets::Resource::Base
3
+ extend Memoist
4
+ include Jets::AwsServices
5
+
6
+ def definition
7
+ {
8
+ base_path_role: {
9
+ type: "AWS::IAM::Role",
10
+ properties: {
11
+ role_name: role_name,
12
+ path: "/",
13
+ assume_role_policy_document: {
14
+ version: "2012-10-17",
15
+ statement: [{
16
+ effect: "Allow",
17
+ principal: {service: ["lambda.amazonaws.com"]},
18
+ action: ["sts:AssumeRole"]}
19
+ ]
20
+ },
21
+ policies: [
22
+ policy_name: "#{role_name}-policy",
23
+ policy_document: policy_document,
24
+ ]
25
+ },
26
+ }
27
+ }
28
+ end
29
+
30
+ def policy_document
31
+ project_namespace = Jets.config.project_namespace
32
+ default_policy_statements = Jets::Application.default_iam_policy # Array of Hashes
33
+ apigateway = [{
34
+ action: [ "apigateway:*" ],
35
+ effect: "Allow",
36
+ resource: "arn:aws:apigateway:#{Jets.aws.region}::/restapis/*", # scoped to all restapis because this changes
37
+ },{
38
+ action: [ "apigateway:*" ],
39
+ effect: "Allow",
40
+ resource: "arn:aws:apigateway:#{Jets.aws.region}::/domainnames/*", # scoped to all restapis because this changes
41
+ }]
42
+ cloudformation = [{
43
+ action: ["cloudformation:DescribeStacks"],
44
+ effect: "Allow",
45
+ resource: "arn:aws:cloudformation:#{Jets.aws.region}:#{Jets.aws.account}:stack/#{project_namespace}*",
46
+ }]
47
+
48
+ # Combine the statements
49
+ {
50
+ version: '2012-10-17',
51
+ statement: default_policy_statements + apigateway + cloudformation
52
+ }
53
+ end
54
+
55
+ # Duplicated in rest_api/change_detection.rb, base_path/role.rb, rest_api/routes.rb
56
+ def rest_api_id
57
+ stack_name = Jets::Naming.parent_stack_name
58
+ return "RestApi" unless stack_exists?(stack_name)
59
+
60
+ stack = cfn.describe_stacks(stack_name: stack_name).stacks.first
61
+
62
+ api_gateway_stack_arn = lookup(stack[:outputs], "ApiGateway")
63
+
64
+ # resources = cfn.describe_stack_resources(stack_name: api_gateway_stack_arn).stack_resources
65
+ stack = cfn.describe_stacks(stack_name: api_gateway_stack_arn).stacks.first
66
+ rest_api_id = lookup(stack[:outputs], "RestApi")
67
+ end
68
+ memoize :rest_api_id
69
+
70
+ def role_name
71
+ # TODO: dont think we should change the role name every time but have to right now because the deployment logical id changes
72
+ timestamp = Jets::Resource::ApiGateway::Deployment.timestamp
73
+ "#{Jets.config.project_namespace}-base-path-mapping-#{timestamp}"
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,61 @@
1
+ module Jets::Resource::ApiGateway
2
+ # Might be weird inheriting from Method because Method has Method#cors also
3
+ # but Cors is essentially a Method class.
4
+ class Cors < Method
5
+ def definition
6
+ {
7
+ cors_logical_id => {
8
+ type: "AWS::ApiGateway::Method",
9
+
10
+ properties: {
11
+ resource_id: "!Ref #{resource_id}",
12
+ rest_api_id: "!Ref #{RestApi.logical_id}",
13
+ authorization_type: cors_authorization_type,
14
+ http_method: "OPTIONS",
15
+ method_responses: [{
16
+ status_code: '200',
17
+ response_parameters: response_parameters(true),
18
+ response_models: {},
19
+ }],
20
+ request_parameters: {},
21
+ integration: {
22
+ type: "MOCK",
23
+ request_templates: {
24
+ "application/json": "{statusCode:200}",
25
+ },
26
+ integration_responses: [{
27
+ status_code: '200',
28
+ response_parameters: response_parameters,
29
+ response_templates: {
30
+ "application/json": '',
31
+ },
32
+ }] # closes integration_responses
33
+ } # closes integration
34
+ } # closes properties
35
+ } # closes logical id
36
+ } # closes definition
37
+ end
38
+
39
+ def response_parameters(method_response=false)
40
+ cors_headers.map do |k,v|
41
+ k = "method.response.header.#{k}"
42
+ v = method_response ? true : "'#{v}'" # surround value with single quotes
43
+ [k,v]
44
+ end.to_h
45
+ end
46
+
47
+ # Always the pre-flight headers in this case
48
+ def cors_headers
49
+ rack = Jets::Controller::Middleware::Cors.new(Jets.application)
50
+ rack.cors_headers(true)
51
+ end
52
+
53
+ def cors_authorization_type
54
+ Jets.config.api.cors_authorization_type || @route.authorization_type || "NONE"
55
+ end
56
+
57
+ def cors_logical_id
58
+ "#{resource_logical_id}_cors_api_method"
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,78 @@
1
+ module Jets::Resource::ApiGateway
2
+ class Deployment < Jets::Resource::Base
3
+ def definition
4
+ {
5
+ deployment_logical_id => {
6
+ type: "AWS::ApiGateway::Deployment",
7
+ properties: {
8
+ description: "Version #{timestamp} deployed by jets",
9
+ rest_api_id: "!Ref #{RestApi.logical_id}",
10
+ stage_name: stage_name,
11
+ }
12
+ }
13
+ }
14
+ end
15
+
16
+ def parameters
17
+ p = {
18
+ "IamRole" => "IamRole",
19
+ "RestApi" => "RestApi",
20
+ "S3Bucket" => "S3Bucket",
21
+ }
22
+ p[:DomainName] = "DomainName" if Jets.custom_domain?
23
+ p
24
+ end
25
+
26
+ def outputs(internal=false)
27
+ rest_api = internal ? RestApi.internal_logical_id : "RestApi"
28
+ {
29
+ "RestApiUrl" => "!Sub 'https://${#{rest_api}}.execute-api.${AWS::Region}.amazonaws.com/#{stage_name}/'",
30
+ }
31
+ end
32
+
33
+ def depends_on
34
+ expression = "#{Jets::Naming.template_path_prefix}-*_controller*"
35
+ controller_logical_ids = []
36
+ Dir.glob(expression).each do |path|
37
+ next unless File.file?(path)
38
+
39
+ regexp = Regexp.new(".*#{Jets.config.project_namespace}-")
40
+ controller_name = path.sub(regexp, '').sub('.yml', '')
41
+ # map the path to a camelized logical_id. Example:
42
+ # /tmp/jets/demo/templates/demo-dev-2-posts_controller.yml to
43
+ # PostsController
44
+ controller_logical_id = controller_name.underscore.camelize
45
+
46
+ controller_logical_ids << controller_logical_id
47
+ end
48
+ controller_logical_ids
49
+ end
50
+
51
+ # stage_name: dev, dev-1, dev-2, etc
52
+ def stage_name
53
+ self.class.stage_name
54
+ end
55
+
56
+ def self.stage_name
57
+ # Stage name only allows a-zA-Z0-9_
58
+ [Jets.config.short_env, Jets.config.env_extra].compact.join('_').gsub('-','_')
59
+ end
60
+
61
+ def timestamp
62
+ self.class.timestamp
63
+ end
64
+
65
+ @@timestamp = nil
66
+ def self.timestamp
67
+ @@timestamp ||= Time.now.strftime("%Y%m%d%H%M%S")
68
+ end
69
+
70
+ def deployment_logical_id
71
+ self.class.logical_id.underscore
72
+ end
73
+
74
+ def self.logical_id
75
+ "ApiDeployment#{timestamp}"
76
+ end
77
+ end
78
+ end