jets_bb_fork 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/bin/commit_docs.sh +26 -0
  3. data/.circleci/config.yml +126 -0
  4. data/.codebuild/README.md +68 -0
  5. data/.codebuild/bin/jets +3 -0
  6. data/.codebuild/buildspec-base.yml +14 -0
  7. data/.codebuild/integration.sh +72 -0
  8. data/.codebuild/jets.postman_collection.json +323 -0
  9. data/.codebuild/scripts/install-docker.sh +12 -0
  10. data/.codebuild/scripts/install-dynamodb-local.sh +22 -0
  11. data/.codebuild/scripts/install-java.sh +22 -0
  12. data/.codebuild/scripts/install-node.sh +4 -0
  13. data/.github/ISSUE_TEMPLATE.md +7 -0
  14. data/.github/ISSUE_TEMPLATE/bug_report.md +84 -0
  15. data/.github/ISSUE_TEMPLATE/documentation.md +27 -0
  16. data/.github/ISSUE_TEMPLATE/feature_request.md +64 -0
  17. data/.github/ISSUE_TEMPLATE/question.md +16 -0
  18. data/.github/PULL_REQUEST_TEMPLATE.md +42 -0
  19. data/.gitignore +24 -0
  20. data/.gitmodules +0 -0
  21. data/.python-version +1 -0
  22. data/.rspec +4 -0
  23. data/.ruby-version +1 -0
  24. data/CHANGELOG.md +734 -0
  25. data/CONDUCT.md +1 -0
  26. data/CONTRIBUTING.md +1 -0
  27. data/Dockerfile +16 -0
  28. data/Dockerfile.base +53 -0
  29. data/Gemfile +14 -0
  30. data/Guardfile +22 -0
  31. data/LICENSE.txt +22 -0
  32. data/Procfile +2 -0
  33. data/README.md +203 -0
  34. data/Rakefile +24 -0
  35. data/backers.md +16 -0
  36. data/bin/release +9 -0
  37. data/buildspec.yml +18 -0
  38. data/exe/jets_bb_fork +14 -0
  39. data/jets.gemspec +68 -0
  40. data/lib/jets.rb +27 -0
  41. data/lib/jets/application.rb +216 -0
  42. data/lib/jets/application/defaults.rb +172 -0
  43. data/lib/jets/autoloaders.rb +97 -0
  44. data/lib/jets/aws_info.rb +113 -0
  45. data/lib/jets/aws_services.rb +65 -0
  46. data/lib/jets/aws_services/global_memoist.rb +57 -0
  47. data/lib/jets/aws_services/s3_bucket.rb +34 -0
  48. data/lib/jets/aws_services/stack_status.rb +59 -0
  49. data/lib/jets/booter.rb +119 -0
  50. data/lib/jets/builders/code_builder.rb +399 -0
  51. data/lib/jets/builders/code_size.rb +57 -0
  52. data/lib/jets/builders/gem_replacer.rb +76 -0
  53. data/lib/jets/builders/handler_generator.rb +186 -0
  54. data/lib/jets/builders/lambda_layer.rb +69 -0
  55. data/lib/jets/builders/md5.rb +60 -0
  56. data/lib/jets/builders/md5_zip.rb +61 -0
  57. data/lib/jets/builders/purger.rb +35 -0
  58. data/lib/jets/builders/rack_packager.rb +51 -0
  59. data/lib/jets/builders/rackup_wrappers/rackup +19 -0
  60. data/lib/jets/builders/rackup_wrappers/rackup.rb +7 -0
  61. data/lib/jets/builders/reconfigure_rails.rb +114 -0
  62. data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +16 -0
  63. data/lib/jets/builders/ruby_packager.rb +207 -0
  64. data/lib/jets/builders/shim_vars/app.rb +78 -0
  65. data/lib/jets/builders/shim_vars/base.rb +25 -0
  66. data/lib/jets/builders/shim_vars/shared.rb +37 -0
  67. data/lib/jets/builders/templates/handler.rb +12 -0
  68. data/lib/jets/builders/tidy.rb +107 -0
  69. data/lib/jets/builders/util.rb +31 -0
  70. data/lib/jets/bundle.rb +82 -0
  71. data/lib/jets/camelizer.rb +71 -0
  72. data/lib/jets/cfn/builders/api_deployment_builder.rb +63 -0
  73. data/lib/jets/cfn/builders/api_gateway_builder.rb +157 -0
  74. data/lib/jets/cfn/builders/base_child_builder.rb +75 -0
  75. data/lib/jets/cfn/builders/controller_builder.rb +42 -0
  76. data/lib/jets/cfn/builders/function_builder.rb +14 -0
  77. data/lib/jets/cfn/builders/interface.rb +137 -0
  78. data/lib/jets/cfn/builders/job_builder.rb +14 -0
  79. data/lib/jets/cfn/builders/paged.rb +37 -0
  80. data/lib/jets/cfn/builders/parent_builder.rb +100 -0
  81. data/lib/jets/cfn/builders/rule_builder.rb +24 -0
  82. data/lib/jets/cfn/builders/shared_builder.rb +14 -0
  83. data/lib/jets/cfn/ship.rb +185 -0
  84. data/lib/jets/cfn/status.rb +212 -0
  85. data/lib/jets/cfn/upload.rb +139 -0
  86. data/lib/jets/cli.rb +194 -0
  87. data/lib/jets/commands/base.rb +146 -0
  88. data/lib/jets/commands/build.rb +234 -0
  89. data/lib/jets/commands/call.rb +169 -0
  90. data/lib/jets/commands/call/anonymous_guesser.rb +96 -0
  91. data/lib/jets/commands/call/autoload_guesser.rb +136 -0
  92. data/lib/jets/commands/call/base_guesser.rb +60 -0
  93. data/lib/jets/commands/call/guesser.rb +48 -0
  94. data/lib/jets/commands/clean.rb +19 -0
  95. data/lib/jets/commands/clean/base.rb +24 -0
  96. data/lib/jets/commands/clean/build.rb +13 -0
  97. data/lib/jets/commands/clean/log.rb +107 -0
  98. data/lib/jets/commands/console.rb +12 -0
  99. data/lib/jets/commands/db.rb +13 -0
  100. data/lib/jets/commands/db/environment-task.rake +3 -0
  101. data/lib/jets/commands/db/tasks.rb +44 -0
  102. data/lib/jets/commands/dbconsole.rb +131 -0
  103. data/lib/jets/commands/delete.rb +143 -0
  104. data/lib/jets/commands/deploy.rb +141 -0
  105. data/lib/jets/commands/dynamodb.rb +19 -0
  106. data/lib/jets/commands/dynamodb/migrate.rb +9 -0
  107. data/lib/jets/commands/dynamodb/migrator.rb +36 -0
  108. data/lib/jets/commands/gems.rb +21 -0
  109. data/lib/jets/commands/help.rb +9 -0
  110. data/lib/jets/commands/help/build.md +6 -0
  111. data/lib/jets/commands/help/call.md +61 -0
  112. data/lib/jets/commands/help/clean/build.md +5 -0
  113. data/lib/jets/commands/help/clean/log.md +5 -0
  114. data/lib/jets/commands/help/console.md +18 -0
  115. data/lib/jets/commands/help/db/generate.md +8 -0
  116. data/lib/jets/commands/help/dbconsole.md +9 -0
  117. data/lib/jets/commands/help/delete.md +22 -0
  118. data/lib/jets/commands/help/deploy.md +32 -0
  119. data/lib/jets/commands/help/destroy.md +16 -0
  120. data/lib/jets/commands/help/dynamodb/generate.md +52 -0
  121. data/lib/jets/commands/help/dynamodb/migrate.md +4 -0
  122. data/lib/jets/commands/help/gems/check.md +8 -0
  123. data/lib/jets/commands/help/generate.md +22 -0
  124. data/lib/jets/commands/help/import/rack.md +13 -0
  125. data/lib/jets/commands/help/import/rails.md +11 -0
  126. data/lib/jets/commands/help/new.md +42 -0
  127. data/lib/jets/commands/help/routes.md +16 -0
  128. data/lib/jets/commands/help/runner.md +17 -0
  129. data/lib/jets/commands/help/server.md +15 -0
  130. data/lib/jets/commands/help/status.md +14 -0
  131. data/lib/jets/commands/help/upgrade.md +5 -0
  132. data/lib/jets/commands/help/url.md +6 -0
  133. data/lib/jets/commands/import.rb +12 -0
  134. data/lib/jets/commands/import/base.rb +49 -0
  135. data/lib/jets/commands/import/cheatsheet.rb +35 -0
  136. data/lib/jets/commands/import/rack.rb +16 -0
  137. data/lib/jets/commands/import/rails.rb +74 -0
  138. data/lib/jets/commands/import/sequence.rb +90 -0
  139. data/lib/jets/commands/import/templates/config/database.yml +26 -0
  140. data/lib/jets/commands/import/templates/submodules-cheatsheet.md +89 -0
  141. data/lib/jets/commands/main.rb +157 -0
  142. data/lib/jets/commands/markdown/creator.rb +58 -0
  143. data/lib/jets/commands/markdown/index.rb +27 -0
  144. data/lib/jets/commands/markdown/page.rb +125 -0
  145. data/lib/jets/commands/markdown/shell.rb +11 -0
  146. data/lib/jets/commands/new.rb +157 -0
  147. data/lib/jets/commands/rake_command.rb +61 -0
  148. data/lib/jets/commands/rake_tasks.rb +46 -0
  149. data/lib/jets/commands/runner.rb +16 -0
  150. data/lib/jets/commands/sequence.rb +99 -0
  151. data/lib/jets/commands/stack_info.rb +30 -0
  152. data/lib/jets/commands/templates/skeleton/.gitignore +12 -0
  153. data/lib/jets/commands/templates/skeleton/.jetskeep +1 -0
  154. data/lib/jets/commands/templates/skeleton/.rspec +3 -0
  155. data/lib/jets/commands/templates/skeleton/Gemfile.tt +38 -0
  156. data/lib/jets/commands/templates/skeleton/Procfile +7 -0
  157. data/lib/jets/commands/templates/skeleton/README.md +11 -0
  158. data/lib/jets/commands/templates/skeleton/Rakefile +2 -0
  159. data/lib/jets/commands/templates/skeleton/app/controllers/application_controller.rb +2 -0
  160. data/lib/jets/commands/templates/skeleton/app/helpers/application_helper.rb +2 -0
  161. data/lib/jets/commands/templates/skeleton/app/jobs/application_job.rb +4 -0
  162. data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +2 -0
  163. data/lib/jets/commands/templates/skeleton/app/models/application_record.rb +3 -0
  164. data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +25 -0
  165. data/lib/jets/commands/templates/skeleton/config.ru +5 -0
  166. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +67 -0
  167. data/lib/jets/commands/templates/skeleton/config/database.yml.tt +26 -0
  168. data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +22 -0
  169. data/lib/jets/commands/templates/skeleton/config/environments/development.rb +7 -0
  170. data/lib/jets/commands/templates/skeleton/config/environments/production.rb +9 -0
  171. data/lib/jets/commands/templates/skeleton/config/environments/test.rb +7 -0
  172. data/lib/jets/commands/templates/skeleton/config/routes.rb +9 -0
  173. data/lib/jets/commands/templates/skeleton/db/.gitkeep +0 -0
  174. data/lib/jets/commands/templates/skeleton/public/404.html +67 -0
  175. data/lib/jets/commands/templates/skeleton/public/422.html +67 -0
  176. data/lib/jets/commands/templates/skeleton/public/500.html +66 -0
  177. data/lib/jets/commands/templates/skeleton/public/favicon.ico +0 -0
  178. data/lib/jets/commands/templates/skeleton/public/index.html.tt +91 -0
  179. data/lib/jets/commands/templates/skeleton/spec/controllers/posts_controller_spec.rb +15 -0
  180. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-index.json +51 -0
  181. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-show.json +53 -0
  182. data/lib/jets/commands/templates/skeleton/spec/spec_helper.rb.tt +30 -0
  183. data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +14 -0
  184. data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -0
  185. data/lib/jets/commands/templates/webpacker/app/javascript/src/jets/crud.js +87 -0
  186. data/lib/jets/commands/upgrade.rb +145 -0
  187. data/lib/jets/commands/upgrade/templates/bin/webpack +19 -0
  188. data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +19 -0
  189. data/lib/jets/commands/url.rb +68 -0
  190. data/lib/jets/commands/webpacker_template.rb +18 -0
  191. data/lib/jets/controller.rb +3 -0
  192. data/lib/jets/controller/base.rb +108 -0
  193. data/lib/jets/controller/callbacks.rb +68 -0
  194. data/lib/jets/controller/cookies.rb +38 -0
  195. data/lib/jets/controller/cookies/jar.rb +269 -0
  196. data/lib/jets/controller/layout.rb +17 -0
  197. data/lib/jets/controller/middleware/cors.rb +60 -0
  198. data/lib/jets/controller/middleware/local.rb +116 -0
  199. data/lib/jets/controller/middleware/local/api_gateway.rb +93 -0
  200. data/lib/jets/controller/middleware/local/mimic_aws_call.rb +38 -0
  201. data/lib/jets/controller/middleware/local/route_matcher.rb +106 -0
  202. data/lib/jets/controller/middleware/main.rb +46 -0
  203. data/lib/jets/controller/middleware/reloader.rb +15 -0
  204. data/lib/jets/controller/middleware/webpacker_setup.rb +6 -0
  205. data/lib/jets/controller/params.rb +87 -0
  206. data/lib/jets/controller/rack/adapter.rb +88 -0
  207. data/lib/jets/controller/rack/env.rb +105 -0
  208. data/lib/jets/controller/redirection.rb +55 -0
  209. data/lib/jets/controller/rendering.rb +79 -0
  210. data/lib/jets/controller/rendering/rack_renderer.rb +250 -0
  211. data/lib/jets/controller/request.rb +29 -0
  212. data/lib/jets/controller/response.rb +61 -0
  213. data/lib/jets/controller/stage.rb +33 -0
  214. data/lib/jets/core.rb +149 -0
  215. data/lib/jets/core_ext/kernel.rb +13 -0
  216. data/lib/jets/db.rb +15 -0
  217. data/lib/jets/dotenv.rb +48 -0
  218. data/lib/jets/dotenv/ssm.rb +48 -0
  219. data/lib/jets/erb.rb +51 -0
  220. data/lib/jets/generator.rb +48 -0
  221. data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
  222. data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +39 -0
  223. data/lib/jets/generator/templates/erb/scaffold/edit.html.erb +6 -0
  224. data/lib/jets/generator/templates/erb/scaffold/index.html.erb +29 -0
  225. data/lib/jets/generator/templates/erb/scaffold/new.html.erb +5 -0
  226. data/lib/jets/generator/templates/erb/scaffold/show.html.erb +9 -0
  227. data/lib/jets/generator/templates/rails/assets/javascript.js +2 -0
  228. data/lib/jets/generator/templates/rails/assets/stylesheet.css +4 -0
  229. data/lib/jets/generator/templates/rails/controller/controller.rb +13 -0
  230. data/lib/jets/generator/templates/rails/helper/helper.rb +4 -0
  231. data/lib/jets/generator/templates/rails/scaffold/scaffold.css +80 -0
  232. data/lib/jets/generator/templates/rails/scaffold_controller/api_controller.rb +62 -0
  233. data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +79 -0
  234. data/lib/jets/inflections.rb +32 -0
  235. data/lib/jets/internal/app/controllers/jets/mailers_controller.rb +97 -0
  236. data/lib/jets/internal/app/controllers/jets/public_controller.rb +31 -0
  237. data/lib/jets/internal/app/controllers/jets/rack_controller.rb +25 -0
  238. data/lib/jets/internal/app/functions/jets/base_path.rb +157 -0
  239. data/lib/jets/internal/app/helpers/jets/mailers_helper.rb +9 -0
  240. data/lib/jets/internal/app/jobs/jets/preheat_job.rb +70 -0
  241. data/lib/jets/internal/app/shared/functions/jets/s3_bucket_config.rb +43 -0
  242. data/lib/jets/internal/app/views/jets/mailers/email.html.erb +145 -0
  243. data/lib/jets/internal/app/views/jets/mailers/index.html.erb +8 -0
  244. data/lib/jets/internal/app/views/jets/mailers/mailer.html.erb +6 -0
  245. data/lib/jets/internal/turbines/jets/mailer.rb +51 -0
  246. data/lib/jets/job/base.rb +39 -0
  247. data/lib/jets/job/dsl.rb +40 -0
  248. data/lib/jets/job/dsl/dynamodb_event.rb +65 -0
  249. data/lib/jets/job/dsl/event_source_mapping.rb +11 -0
  250. data/lib/jets/job/dsl/iot_event.rb +24 -0
  251. data/lib/jets/job/dsl/kinesis_event.rb +46 -0
  252. data/lib/jets/job/dsl/log_event.rb +15 -0
  253. data/lib/jets/job/dsl/rule_event.rb +75 -0
  254. data/lib/jets/job/dsl/s3_event.rb +36 -0
  255. data/lib/jets/job/dsl/sns_event.rb +54 -0
  256. data/lib/jets/job/dsl/sqs_event.rb +96 -0
  257. data/lib/jets/job/helpers/kinesis_event_helper.rb +13 -0
  258. data/lib/jets/job/helpers/log_event_helper.rb +17 -0
  259. data/lib/jets/job/helpers/s3_event_helper.rb +13 -0
  260. data/lib/jets/klass.rb +109 -0
  261. data/lib/jets/lambda/dsl.rb +419 -0
  262. data/lib/jets/lambda/function.rb +29 -0
  263. data/lib/jets/lambda/function_constructor.rb +55 -0
  264. data/lib/jets/lambda/functions.rb +34 -0
  265. data/lib/jets/lambda/task.rb +111 -0
  266. data/lib/jets/logger.rb +21 -0
  267. data/lib/jets/mega/hash_converter.rb +25 -0
  268. data/lib/jets/mega/request.rb +139 -0
  269. data/lib/jets/mega/request/source.rb +21 -0
  270. data/lib/jets/middleware.rb +33 -0
  271. data/lib/jets/middleware/configurator.rb +84 -0
  272. data/lib/jets/middleware/default_stack.rb +51 -0
  273. data/lib/jets/middleware/layer.rb +34 -0
  274. data/lib/jets/middleware/stack.rb +77 -0
  275. data/lib/jets/naming.rb +49 -0
  276. data/lib/jets/overrides/lambda.rb +1 -0
  277. data/lib/jets/overrides/lambda/marshaller.rb +31 -0
  278. data/lib/jets/overrides/rails.rb +4 -0
  279. data/lib/jets/overrides/rails/asset_tag_helper.rb +114 -0
  280. data/lib/jets/overrides/rails/common_methods.rb +13 -0
  281. data/lib/jets/overrides/rails/rendering_helper.rb +26 -0
  282. data/lib/jets/overrides/rails/url_helper.rb +25 -0
  283. data/lib/jets/poly_fun.rb +73 -0
  284. data/lib/jets/poly_fun/base_executor.rb +125 -0
  285. data/lib/jets/poly_fun/lambda_executor.rb +16 -0
  286. data/lib/jets/poly_fun/node_error.rb +8 -0
  287. data/lib/jets/poly_fun/node_executor.rb +54 -0
  288. data/lib/jets/poly_fun/python_error.rb +8 -0
  289. data/lib/jets/poly_fun/python_executor.rb +23 -0
  290. data/lib/jets/preheat.rb +117 -0
  291. data/lib/jets/processors/deducer.rb +65 -0
  292. data/lib/jets/processors/main_processor.rb +61 -0
  293. data/lib/jets/rack_server.rb +86 -0
  294. data/lib/jets/rdoc.rb +30 -0
  295. data/lib/jets/resource.rb +71 -0
  296. data/lib/jets/resource/api_gateway/base_path/function.rb +42 -0
  297. data/lib/jets/resource/api_gateway/base_path/mapping.rb +44 -0
  298. data/lib/jets/resource/api_gateway/base_path/role.rb +76 -0
  299. data/lib/jets/resource/api_gateway/cors.rb +61 -0
  300. data/lib/jets/resource/api_gateway/deployment.rb +78 -0
  301. data/lib/jets/resource/api_gateway/domain_name.rb +59 -0
  302. data/lib/jets/resource/api_gateway/method.rb +98 -0
  303. data/lib/jets/resource/api_gateway/resource.rb +101 -0
  304. data/lib/jets/resource/api_gateway/rest_api.rb +56 -0
  305. data/lib/jets/resource/api_gateway/rest_api/change_detection.rb +42 -0
  306. data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +63 -0
  307. data/lib/jets/resource/api_gateway/rest_api/routes.rb +7 -0
  308. data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +8 -0
  309. data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +130 -0
  310. data/lib/jets/resource/api_gateway/rest_api/routes/change/to.rb +29 -0
  311. data/lib/jets/resource/api_gateway/rest_api/routes/change/variable.rb +39 -0
  312. data/lib/jets/resource/api_gateway/rest_api/routes/collision.rb +121 -0
  313. data/lib/jets/resource/api_gateway/rest_api/routes/collision/variable_exception.rb +7 -0
  314. data/lib/jets/resource/associated.rb +37 -0
  315. data/lib/jets/resource/base.rb +28 -0
  316. data/lib/jets/resource/child_stack/api_deployment.rb +56 -0
  317. data/lib/jets/resource/child_stack/api_gateway.rb +53 -0
  318. data/lib/jets/resource/child_stack/app_class.rb +107 -0
  319. data/lib/jets/resource/child_stack/base.rb +24 -0
  320. data/lib/jets/resource/child_stack/shared.rb +92 -0
  321. data/lib/jets/resource/config/config_rule.rb +74 -0
  322. data/lib/jets/resource/config/managed_rule.rb +15 -0
  323. data/lib/jets/resource/events/rule.rb +31 -0
  324. data/lib/jets/resource/iam/application_role.rb +27 -0
  325. data/lib/jets/resource/iam/base_role_definition.rb +47 -0
  326. data/lib/jets/resource/iam/class_role.rb +74 -0
  327. data/lib/jets/resource/iam/function_role.rb +54 -0
  328. data/lib/jets/resource/iam/managed_policy.rb +22 -0
  329. data/lib/jets/resource/iam/policy_document.rb +41 -0
  330. data/lib/jets/resource/iot/topic_rule.rb +34 -0
  331. data/lib/jets/resource/lambda/event_source_mapping.rb +31 -0
  332. data/lib/jets/resource/lambda/function.rb +214 -0
  333. data/lib/jets/resource/lambda/function/environment.rb +62 -0
  334. data/lib/jets/resource/lambda/gem_layer.rb +17 -0
  335. data/lib/jets/resource/lambda/layer_version.rb +44 -0
  336. data/lib/jets/resource/logs/subscription_filter.rb +31 -0
  337. data/lib/jets/resource/permission.rb +45 -0
  338. data/lib/jets/resource/replacer.rb +85 -0
  339. data/lib/jets/resource/route53/record_set.rb +70 -0
  340. data/lib/jets/resource/s3/bucket.rb +24 -0
  341. data/lib/jets/resource/sns/subscription.rb +29 -0
  342. data/lib/jets/resource/sns/topic.rb +35 -0
  343. data/lib/jets/resource/sns/topic_policy.rb +40 -0
  344. data/lib/jets/resource/sqs/queue.rb +21 -0
  345. data/lib/jets/resource/standardizer.rb +42 -0
  346. data/lib/jets/route.rb +166 -0
  347. data/lib/jets/router.rb +177 -0
  348. data/lib/jets/router/scope.rb +30 -0
  349. data/lib/jets/rule/base.rb +19 -0
  350. data/lib/jets/rule/dsl.rb +110 -0
  351. data/lib/jets/spec_helpers.rb +54 -0
  352. data/lib/jets/spec_helpers/params.rb +10 -0
  353. data/lib/jets/spec_helpers/request.rb +78 -0
  354. data/lib/jets/spec_helpers/response.rb +5 -0
  355. data/lib/jets/stack.rb +88 -0
  356. data/lib/jets/stack/builder.rb +43 -0
  357. data/lib/jets/stack/definition.rb +50 -0
  358. data/lib/jets/stack/depends.rb +34 -0
  359. data/lib/jets/stack/depends/item.rb +9 -0
  360. data/lib/jets/stack/function.rb +69 -0
  361. data/lib/jets/stack/main.rb +4 -0
  362. data/lib/jets/stack/main/dsl.rb +28 -0
  363. data/lib/jets/stack/main/dsl/base.rb +49 -0
  364. data/lib/jets/stack/main/dsl/cloudwatch.rb +19 -0
  365. data/lib/jets/stack/main/dsl/iam.rb +8 -0
  366. data/lib/jets/stack/main/dsl/lambda.rb +83 -0
  367. data/lib/jets/stack/main/dsl/s3.rb +12 -0
  368. data/lib/jets/stack/main/dsl/sns.rb +16 -0
  369. data/lib/jets/stack/main/dsl/sqs.rb +10 -0
  370. data/lib/jets/stack/output.rb +35 -0
  371. data/lib/jets/stack/output/dsl.rb +19 -0
  372. data/lib/jets/stack/output/lookup.rb +36 -0
  373. data/lib/jets/stack/parameter.rb +37 -0
  374. data/lib/jets/stack/parameter/dsl.rb +42 -0
  375. data/lib/jets/stack/resource.rb +31 -0
  376. data/lib/jets/stack/resource/dsl.rb +19 -0
  377. data/lib/jets/stack/s3_event.rb +87 -0
  378. data/lib/jets/tmp_loader.rb +52 -0
  379. data/lib/jets/turbine.rb +41 -0
  380. data/lib/jets/turbo.rb +55 -0
  381. data/lib/jets/turbo/database_yaml.rb +41 -0
  382. data/lib/jets/turbo/project/.gitignore +12 -0
  383. data/lib/jets/turbo/project/.jetskeep +1 -0
  384. data/lib/jets/turbo/project/Gemfile +16 -0
  385. data/lib/jets/turbo/project/Rakefile +2 -0
  386. data/lib/jets/turbo/project/app/controllers/application_controller.rb +2 -0
  387. data/lib/jets/turbo/project/app/helpers/application_helper.rb +2 -0
  388. data/lib/jets/turbo/project/app/jobs/application_job.rb +4 -0
  389. data/lib/jets/turbo/project/config.ru +5 -0
  390. data/lib/jets/turbo/project/config/application.rb +4 -0
  391. data/lib/jets/turbo/project/config/routes.rb +4 -0
  392. data/lib/jets/turbo/rails.rb +127 -0
  393. data/lib/jets/turbo/templates/config/database.yml +26 -0
  394. data/lib/jets/util.rb +38 -0
  395. data/lib/jets/version.rb +3 -0
  396. data/readme/prerelease.md +6 -0
  397. data/readme/testing.md +60 -0
  398. metadata +1004 -0
@@ -0,0 +1,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
@@ -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".camelize.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
+ Jets::Resource.truncate_id("#{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,101 @@
1
+ module Jets::Resource::ApiGateway
2
+ class Resource < Jets::Resource::Base
3
+ def initialize(path, internal: false, indexed_paths: nil)
4
+ @path = path # Examples: "posts/:id/edit" or "posts"
5
+ @internal = internal
6
+ @indexed_paths = indexed_paths unless indexed_paths.nil?
7
+ end
8
+
9
+ def definition
10
+ {
11
+ resource_logical_id => {
12
+ type: "AWS::ApiGateway::Resource",
13
+ properties: {
14
+ parent_id: parent_id,
15
+ path_part: path_part,
16
+ rest_api_id: "!Ref #{RestApi.logical_id(@internal)}",
17
+ }
18
+ }
19
+ }
20
+ end
21
+
22
+ def outputs
23
+ {
24
+ logical_id => {
25
+ Value: "!Ref #{logical_id}",
26
+ # RDB no longer exporting
27
+ # Export: {
28
+ # Name: "#{logical_id}-#{Jets::Resource::ApiGateway::Deployment.stage_name}"
29
+ # }
30
+ }
31
+ }
32
+ end
33
+
34
+ def resource_logical_id
35
+ if @path == ''
36
+ "RootResourceId"
37
+ else
38
+ Jets::Resource.truncate_id "#{path_logical_id(@path)}ApiResource"
39
+ end
40
+ end
41
+
42
+ # For parameter description
43
+ def desc
44
+ path.empty? ? 'Homepage route: /' : "Route for: /#{path}"
45
+ end
46
+
47
+ def parent_id
48
+ if @path.include?('/') # posts/:id or posts/:id/edit
49
+ parent_path = @path.split('/')[0..-2].join('/')
50
+ parent_logical_id = path_logical_id(parent_path)
51
+
52
+ resource_to_reference = Jets::Resource.truncate_id("#{parent_logical_id}ApiResource")
53
+ if @indexed_paths
54
+ # If the parent resource is not found in the same template as self, we need to save the parent
55
+ # off se we can pass it in as a Parameter from the parent template
56
+ path_page = @indexed_paths.fetch(@path)
57
+ parent_path_page = @indexed_paths.fetch(parent_path)
58
+ required_resources_from_parameters.push({
59
+ :logical_id => resource_to_reference,
60
+ :location => "ApiGateway#{parent_path_page}.Outputs.#{resource_to_reference}"
61
+ }) if path_page != parent_path_page
62
+ end
63
+ "!Ref #{resource_to_reference}"
64
+ else
65
+ '!Ref RootResourceId'
66
+ end
67
+ end
68
+
69
+ def required_resources_from_parameters
70
+ @required_resources_from_parameters ||= []
71
+ end
72
+
73
+ def path_part
74
+ last_part = path.split('/').last
75
+ last_part.split('/').map {|s| transform_capture(s) }.join('/') if last_part
76
+ end
77
+
78
+ # Modify the path to conform to API Gateway capture expressions
79
+ def path
80
+ @path.split('/').map {|s| transform_capture(s) }.join('/')
81
+ end
82
+
83
+ def transform_capture(text)
84
+ if text.starts_with?(':')
85
+ text = text.sub(':','')
86
+ text = "{#{text}}" # :foo => {foo}
87
+ end
88
+ if text.starts_with?('*')
89
+ text = text.sub('*','')
90
+ text = "{#{text}+}" # *foo => {foo+}
91
+ end
92
+ text
93
+ end
94
+
95
+ private
96
+ # Similar path_logical_id method in resource/route.rb
97
+ def path_logical_id(path)
98
+ path.gsub('/','_').gsub(':','').gsub('*','').gsub('-','_').camelize
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,56 @@
1
+ module Jets::Resource::ApiGateway
2
+ class RestApi < Jets::Resource::Base
3
+ def definition
4
+ properties = {
5
+ name: Jets::Naming.gateway_api_name,
6
+ endpoint_configuration: { types: endpoint_types }
7
+ }
8
+ properties[:binary_media_types] = binary_media_types if binary_media_types
9
+
10
+ {
11
+ internal_logical_id => {
12
+ type: "AWS::ApiGateway::RestApi",
13
+ properties: properties
14
+ }
15
+ }
16
+ end
17
+
18
+ def internal_logical_id
19
+ self.class.logical_id(true)
20
+ end
21
+
22
+ def self.logical_id(internal=false)
23
+ internal ? internal_logical_id : "RestApi"
24
+ end
25
+
26
+ @@internal_logical_id = nil
27
+ def self.internal_logical_id
28
+ @@internal_logical_id ||= LogicalId.new.get
29
+ end
30
+
31
+ def outputs
32
+ {
33
+ "RestApi" => "!Ref #{internal_logical_id}",
34
+ "Region" => "!Ref AWS::Region",
35
+ "RootResourceId" => "!GetAtt #{internal_logical_id}.RootResourceId",
36
+ }
37
+ end
38
+
39
+ def endpoint_types
40
+ [Jets.config.api.endpoint_type].flatten
41
+ end
42
+
43
+ # TODO: Looks like there's a bug with CloudFormation. On an API Gateway update
44
+ # we need to pass in the escaped version: multipart~1form-data
45
+ # On a brand new API Gateway creation, we need to pass in the unescaped form:
46
+ # multipart/form-data
47
+ # We are handling this with a full API Gateway replacement instead because it
48
+ # can be generalized more easily.
49
+ def binary_media_types
50
+ types = Jets.config.api.binary_media_types
51
+ return nil if types.nil? || types.empty?
52
+
53
+ [types].flatten
54
+ end
55
+ end
56
+ end