jets.benforeva 3.0.17.pre.mount.pre.fix

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 (459) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +92 -0
  3. data/.cody/README.md +13 -0
  4. data/.cody/docs/bin/build.sh +7 -0
  5. data/.cody/docs/bin/bundler_setup.sh +8 -0
  6. data/.cody/docs/bin/cli_docs.sh +6 -0
  7. data/.cody/docs/bin/git_commit.sh +27 -0
  8. data/.cody/docs/bin/git_setup.sh +12 -0
  9. data/.cody/docs/bin/subnav.sh +14 -0
  10. data/.cody/docs/buildspec.yml +10 -0
  11. data/.cody/docs/project.rb +10 -0
  12. data/.github/ISSUE_TEMPLATE/bug_report.md +84 -0
  13. data/.github/ISSUE_TEMPLATE/documentation.md +27 -0
  14. data/.github/ISSUE_TEMPLATE/feature_request.md +64 -0
  15. data/.github/ISSUE_TEMPLATE/question.md +14 -0
  16. data/.github/ISSUE_TEMPLATE.md +7 -0
  17. data/.github/PULL_REQUEST_TEMPLATE.md +50 -0
  18. data/.gitignore +24 -0
  19. data/.gitmodules +0 -0
  20. data/.python-version +1 -0
  21. data/.rspec +4 -0
  22. data/.ruby-gemset +1 -0
  23. data/.ruby-version +1 -0
  24. data/CHANGELOG.md +1035 -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 +212 -0
  34. data/Rakefile +24 -0
  35. data/backers.md +20 -0
  36. data/bin/release +9 -0
  37. data/exe/jets.benforeva +14 -0
  38. data/jets.benforeva.gemspec +71 -0
  39. data/lib/jets/application/defaults.rb +200 -0
  40. data/lib/jets/application.rb +240 -0
  41. data/lib/jets/authorizer/base.rb +36 -0
  42. data/lib/jets/authorizer/dsl.rb +69 -0
  43. data/lib/jets/authorizer/helpers/iam_helper.rb +47 -0
  44. data/lib/jets/autoloaders.rb +112 -0
  45. data/lib/jets/aws_info.rb +111 -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 +64 -0
  49. data/lib/jets/aws_services.rb +95 -0
  50. data/lib/jets/booter.rb +167 -0
  51. data/lib/jets/builders/code_builder.rb +410 -0
  52. data/lib/jets/builders/code_size.rb +57 -0
  53. data/lib/jets/builders/gem_replacer.rb +89 -0
  54. data/lib/jets/builders/handler_generator.rb +186 -0
  55. data/lib/jets/builders/lambda_layer.rb +68 -0
  56. data/lib/jets/builders/md5.rb +60 -0
  57. data/lib/jets/builders/md5_zip.rb +61 -0
  58. data/lib/jets/builders/purger.rb +35 -0
  59. data/lib/jets/builders/rack_packager.rb +51 -0
  60. data/lib/jets/builders/rackup_wrappers/rackup +19 -0
  61. data/lib/jets/builders/rackup_wrappers/rackup.rb +7 -0
  62. data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +16 -0
  63. data/lib/jets/builders/reconfigure_rails.rb +114 -0
  64. data/lib/jets/builders/ruby_packager.rb +235 -0
  65. data/lib/jets/builders/shim_vars/app.rb +78 -0
  66. data/lib/jets/builders/shim_vars/base.rb +25 -0
  67. data/lib/jets/builders/shim_vars/shared.rb +37 -0
  68. data/lib/jets/builders/templates/handler.rb +12 -0
  69. data/lib/jets/builders/tidy.rb +107 -0
  70. data/lib/jets/builders/util.rb +31 -0
  71. data/lib/jets/bundle.rb +88 -0
  72. data/lib/jets/camelizer.rb +4 -0
  73. data/lib/jets/cfn/builders/api_deployment_builder.rb +56 -0
  74. data/lib/jets/cfn/builders/api_gateway_builder.rb +123 -0
  75. data/lib/jets/cfn/builders/api_resources_builder.rb +44 -0
  76. data/lib/jets/cfn/builders/authorizer_builder.rb +67 -0
  77. data/lib/jets/cfn/builders/base_child_builder.rb +69 -0
  78. data/lib/jets/cfn/builders/controller_builder.rb +50 -0
  79. data/lib/jets/cfn/builders/function_builder.rb +14 -0
  80. data/lib/jets/cfn/builders/interface.rb +133 -0
  81. data/lib/jets/cfn/builders/job_builder.rb +14 -0
  82. data/lib/jets/cfn/builders/parent_builder/stagger.rb +34 -0
  83. data/lib/jets/cfn/builders/parent_builder.rb +130 -0
  84. data/lib/jets/cfn/builders/rule_builder.rb +24 -0
  85. data/lib/jets/cfn/builders/shared_builder.rb +14 -0
  86. data/lib/jets/cfn/builders/util/source.rb +21 -0
  87. data/lib/jets/cfn/built_template.rb +15 -0
  88. data/lib/jets/cfn/ship.rb +188 -0
  89. data/lib/jets/cfn/status.rb +10 -0
  90. data/lib/jets/cfn/template_source.rb +61 -0
  91. data/lib/jets/cfn/upload.rb +157 -0
  92. data/lib/jets/cli.rb +208 -0
  93. data/lib/jets/commands/base.rb +145 -0
  94. data/lib/jets/commands/build.rb +252 -0
  95. data/lib/jets/commands/call/anonymous_guesser.rb +96 -0
  96. data/lib/jets/commands/call/autoload_guesser.rb +136 -0
  97. data/lib/jets/commands/call/base_guesser.rb +62 -0
  98. data/lib/jets/commands/call/guesser.rb +48 -0
  99. data/lib/jets/commands/call.rb +182 -0
  100. data/lib/jets/commands/clean/base.rb +24 -0
  101. data/lib/jets/commands/clean/build.rb +13 -0
  102. data/lib/jets/commands/clean/log.rb +111 -0
  103. data/lib/jets/commands/clean.rb +19 -0
  104. data/lib/jets/commands/configure.rb +51 -0
  105. data/lib/jets/commands/console.rb +12 -0
  106. data/lib/jets/commands/db/environment-task.rake +3 -0
  107. data/lib/jets/commands/db/tasks/dummy/app.rb +25 -0
  108. data/lib/jets/commands/db/tasks/dummy/config.rb +14 -0
  109. data/lib/jets/commands/db/tasks.rb +34 -0
  110. data/lib/jets/commands/db.rb +13 -0
  111. data/lib/jets/commands/dbconsole.rb +134 -0
  112. data/lib/jets/commands/delete.rb +136 -0
  113. data/lib/jets/commands/deploy.rb +137 -0
  114. data/lib/jets/commands/dotenv.rb +9 -0
  115. data/lib/jets/commands/dynamodb/migrate.rb +9 -0
  116. data/lib/jets/commands/dynamodb/migrator.rb +36 -0
  117. data/lib/jets/commands/dynamodb.rb +19 -0
  118. data/lib/jets/commands/gems.rb +13 -0
  119. data/lib/jets/commands/help/build.md +6 -0
  120. data/lib/jets/commands/help/call.md +69 -0
  121. data/lib/jets/commands/help/clean/build.md +5 -0
  122. data/lib/jets/commands/help/clean/log.md +5 -0
  123. data/lib/jets/commands/help/console.md +18 -0
  124. data/lib/jets/commands/help/db/generate.md +8 -0
  125. data/lib/jets/commands/help/dbconsole.md +9 -0
  126. data/lib/jets/commands/help/degenerate.md +16 -0
  127. data/lib/jets/commands/help/delete.md +22 -0
  128. data/lib/jets/commands/help/deploy.md +32 -0
  129. data/lib/jets/commands/help/dynamodb/generate.md +52 -0
  130. data/lib/jets/commands/help/dynamodb/migrate.md +4 -0
  131. data/lib/jets/commands/help/gems/check.md +6 -0
  132. data/lib/jets/commands/help/generate.md +28 -0
  133. data/lib/jets/commands/help/import/rack.md +13 -0
  134. data/lib/jets/commands/help/import/rails.md +11 -0
  135. data/lib/jets/commands/help/new.md +42 -0
  136. data/lib/jets/commands/help/routes.md +16 -0
  137. data/lib/jets/commands/help/runner.md +17 -0
  138. data/lib/jets/commands/help/server.md +15 -0
  139. data/lib/jets/commands/help/status.md +14 -0
  140. data/lib/jets/commands/help/upgrade.md +7 -0
  141. data/lib/jets/commands/help/url.md +6 -0
  142. data/lib/jets/commands/help.rb +9 -0
  143. data/lib/jets/commands/import/base.rb +49 -0
  144. data/lib/jets/commands/import/cheatsheet.rb +35 -0
  145. data/lib/jets/commands/import/rack.rb +16 -0
  146. data/lib/jets/commands/import/rails.rb +74 -0
  147. data/lib/jets/commands/import/sequence.rb +90 -0
  148. data/lib/jets/commands/import/templates/config/database.yml +30 -0
  149. data/lib/jets/commands/import/templates/submodules-cheatsheet.md +89 -0
  150. data/lib/jets/commands/import.rb +12 -0
  151. data/lib/jets/commands/main.rb +166 -0
  152. data/lib/jets/commands/markdown/creator.rb +58 -0
  153. data/lib/jets/commands/markdown/index.rb +27 -0
  154. data/lib/jets/commands/markdown/page.rb +125 -0
  155. data/lib/jets/commands/markdown/shell.rb +11 -0
  156. data/lib/jets/commands/new.rb +173 -0
  157. data/lib/jets/commands/rake_command.rb +61 -0
  158. data/lib/jets/commands/rake_tasks.rb +50 -0
  159. data/lib/jets/commands/runner.rb +16 -0
  160. data/lib/jets/commands/sequence.rb +105 -0
  161. data/lib/jets/commands/stack_info.rb +30 -0
  162. data/lib/jets/commands/templates/skeleton/.env.development.tt +3 -0
  163. data/lib/jets/commands/templates/skeleton/.env.test +3 -0
  164. data/lib/jets/commands/templates/skeleton/.env.tt +3 -0
  165. data/lib/jets/commands/templates/skeleton/.gitignore +12 -0
  166. data/lib/jets/commands/templates/skeleton/.jetskeep +1 -0
  167. data/lib/jets/commands/templates/skeleton/.rspec +3 -0
  168. data/lib/jets/commands/templates/skeleton/Gemfile.tt +39 -0
  169. data/lib/jets/commands/templates/skeleton/Procfile +7 -0
  170. data/lib/jets/commands/templates/skeleton/README.md +11 -0
  171. data/lib/jets/commands/templates/skeleton/Rakefile +2 -0
  172. data/lib/jets/commands/templates/skeleton/app/controllers/application_controller.rb +2 -0
  173. data/lib/jets/commands/templates/skeleton/app/helpers/application_helper.rb +2 -0
  174. data/lib/jets/commands/templates/skeleton/app/jobs/application_job.rb +4 -0
  175. data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +2 -0
  176. data/lib/jets/commands/templates/skeleton/app/models/application_record.rb +3 -0
  177. data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +26 -0
  178. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +71 -0
  179. data/lib/jets/commands/templates/skeleton/config/database.yml.tt +27 -0
  180. data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +22 -0
  181. data/lib/jets/commands/templates/skeleton/config/environments/development.rb +7 -0
  182. data/lib/jets/commands/templates/skeleton/config/environments/production.rb +9 -0
  183. data/lib/jets/commands/templates/skeleton/config/environments/test.rb +7 -0
  184. data/lib/jets/commands/templates/skeleton/config/routes.rb +9 -0
  185. data/lib/jets/commands/templates/skeleton/config.ru +5 -0
  186. data/lib/jets/commands/templates/skeleton/db/.gitkeep +0 -0
  187. data/lib/jets/commands/templates/skeleton/public/404.html +67 -0
  188. data/lib/jets/commands/templates/skeleton/public/422.html +67 -0
  189. data/lib/jets/commands/templates/skeleton/public/500.html +66 -0
  190. data/lib/jets/commands/templates/skeleton/public/favicon.ico +0 -0
  191. data/lib/jets/commands/templates/skeleton/public/index.html.tt +91 -0
  192. data/lib/jets/commands/templates/skeleton/spec/controllers/posts_controller_spec.rb +15 -0
  193. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-index.json +51 -0
  194. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-show.json +53 -0
  195. data/lib/jets/commands/templates/skeleton/spec/spec_helper.rb.tt +30 -0
  196. data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +23 -0
  197. data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -0
  198. data/lib/jets/commands/upgrade/templates/bin/webpack +19 -0
  199. data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +19 -0
  200. data/lib/jets/commands/upgrade/version1.rb +136 -0
  201. data/lib/jets/commands/upgrade.rb +105 -0
  202. data/lib/jets/commands/url.rb +69 -0
  203. data/lib/jets/commands/webpacker_template.rb +18 -0
  204. data/lib/jets/controller/authorization.rb +91 -0
  205. data/lib/jets/controller/base.rb +175 -0
  206. data/lib/jets/controller/callbacks.rb +73 -0
  207. data/lib/jets/controller/cookies/jar.rb +269 -0
  208. data/lib/jets/controller/cookies.rb +38 -0
  209. data/lib/jets/controller/error/invalid_authenticity_token.rb +6 -0
  210. data/lib/jets/controller/error.rb +4 -0
  211. data/lib/jets/controller/forgery_protection.rb +43 -0
  212. data/lib/jets/controller/layout.rb +17 -0
  213. data/lib/jets/controller/middleware/cors.rb +60 -0
  214. data/lib/jets/controller/middleware/local/api_gateway.rb +93 -0
  215. data/lib/jets/controller/middleware/local/mimic_aws_call.rb +38 -0
  216. data/lib/jets/controller/middleware/local/route_matcher.rb +22 -0
  217. data/lib/jets/controller/middleware/local.rb +120 -0
  218. data/lib/jets/controller/middleware/main.rb +53 -0
  219. data/lib/jets/controller/middleware/reloader.rb +15 -0
  220. data/lib/jets/controller/middleware/webpacker_setup.rb +6 -0
  221. data/lib/jets/controller/parameters_filter.rb +29 -0
  222. data/lib/jets/controller/params.rb +117 -0
  223. data/lib/jets/controller/rack/adapter.rb +94 -0
  224. data/lib/jets/controller/rack/env.rb +122 -0
  225. data/lib/jets/controller/redirection.rb +51 -0
  226. data/lib/jets/controller/rendering/rack_renderer.rb +267 -0
  227. data/lib/jets/controller/rendering.rb +96 -0
  228. data/lib/jets/controller/request.rb +29 -0
  229. data/lib/jets/controller/response.rb +61 -0
  230. data/lib/jets/controller/stage.rb +34 -0
  231. data/lib/jets/controller.rb +3 -0
  232. data/lib/jets/core.rb +157 -0
  233. data/lib/jets/core_ext/bundler.rb +7 -0
  234. data/lib/jets/core_ext/kernel.rb +13 -0
  235. data/lib/jets/db.rb +15 -0
  236. data/lib/jets/dotenv/show.rb +11 -0
  237. data/lib/jets/dotenv/ssm.rb +64 -0
  238. data/lib/jets/dotenv.rb +48 -0
  239. data/lib/jets/erb.rb +51 -0
  240. data/lib/jets/generator/templates/active_job/job/templates/application_job.rb.tt +6 -0
  241. data/lib/jets/generator/templates/active_job/job/templates/job.rb.tt +8 -0
  242. data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
  243. data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +34 -0
  244. data/lib/jets/generator/templates/erb/scaffold/edit.html.erb +6 -0
  245. data/lib/jets/generator/templates/erb/scaffold/index.html.erb +29 -0
  246. data/lib/jets/generator/templates/erb/scaffold/new.html.erb +5 -0
  247. data/lib/jets/generator/templates/erb/scaffold/show.html.erb +9 -0
  248. data/lib/jets/generator/templates/rails/assets/javascript.js +2 -0
  249. data/lib/jets/generator/templates/rails/assets/stylesheet.css +4 -0
  250. data/lib/jets/generator/templates/rails/controller/controller.rb +13 -0
  251. data/lib/jets/generator/templates/rails/helper/helper.rb +4 -0
  252. data/lib/jets/generator/templates/rails/scaffold/scaffold.css +80 -0
  253. data/lib/jets/generator/templates/rails/scaffold_controller/api_controller.rb +62 -0
  254. data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +79 -0
  255. data/lib/jets/generator.rb +112 -0
  256. data/lib/jets/inflections.rb +32 -0
  257. data/lib/jets/internal/app/controllers/jets/bare_controller.rb +16 -0
  258. data/lib/jets/internal/app/controllers/jets/mailers_controller.rb +97 -0
  259. data/lib/jets/internal/app/controllers/jets/mount_controller.rb +63 -0
  260. data/lib/jets/internal/app/controllers/jets/public_controller.rb +31 -0
  261. data/lib/jets/internal/app/controllers/jets/rack_controller.rb +12 -0
  262. data/lib/jets/internal/app/functions/jets/base_path.rb +18 -0
  263. data/lib/jets/internal/app/functions/jets/base_path_mapping.rb +100 -0
  264. data/lib/jets/internal/app/helpers/jets/mailers_helper.rb +9 -0
  265. data/lib/jets/internal/app/jobs/jets/preheat_job.rb +70 -0
  266. data/lib/jets/internal/app/shared/functions/jets/s3_bucket_config.rb +33 -0
  267. data/lib/jets/internal/app/views/jets/mailers/email.html.erb +145 -0
  268. data/lib/jets/internal/app/views/jets/mailers/index.html.erb +8 -0
  269. data/lib/jets/internal/app/views/jets/mailers/mailer.html.erb +6 -0
  270. data/lib/jets/internal/turbines/jets/mailer.rb +52 -0
  271. data/lib/jets/job/base.rb +49 -0
  272. data/lib/jets/job/dsl/dynamodb_event.rb +67 -0
  273. data/lib/jets/job/dsl/event_source_mapping.rb +11 -0
  274. data/lib/jets/job/dsl/iot_event.rb +24 -0
  275. data/lib/jets/job/dsl/kinesis_event.rb +46 -0
  276. data/lib/jets/job/dsl/log_event.rb +15 -0
  277. data/lib/jets/job/dsl/rule_event.rb +75 -0
  278. data/lib/jets/job/dsl/s3_event.rb +36 -0
  279. data/lib/jets/job/dsl/sns_event.rb +54 -0
  280. data/lib/jets/job/dsl/sqs_event.rb +96 -0
  281. data/lib/jets/job/dsl.rb +40 -0
  282. data/lib/jets/job/helpers/kinesis_event_helper.rb +13 -0
  283. data/lib/jets/job/helpers/log_event_helper.rb +17 -0
  284. data/lib/jets/job/helpers/s3_event_helper.rb +13 -0
  285. data/lib/jets/klass.rb +109 -0
  286. data/lib/jets/lambda/dsl.rb +404 -0
  287. data/lib/jets/lambda/function.rb +29 -0
  288. data/lib/jets/lambda/function_constructor.rb +55 -0
  289. data/lib/jets/lambda/functions.rb +39 -0
  290. data/lib/jets/lambda/task.rb +111 -0
  291. data/lib/jets/logger.rb +21 -0
  292. data/lib/jets/mega/hash_converter.rb +25 -0
  293. data/lib/jets/mega/request/source.rb +21 -0
  294. data/lib/jets/mega/request.rb +163 -0
  295. data/lib/jets/middleware/configurator.rb +84 -0
  296. data/lib/jets/middleware/default_stack.rb +53 -0
  297. data/lib/jets/middleware/layer.rb +34 -0
  298. data/lib/jets/middleware/stack.rb +77 -0
  299. data/lib/jets/middleware.rb +33 -0
  300. data/lib/jets/naming.rb +63 -0
  301. data/lib/jets/overrides/lambda/marshaller.rb +31 -0
  302. data/lib/jets/overrides/lambda.rb +1 -0
  303. data/lib/jets/overrides/rails/action_controller.rb +13 -0
  304. data/lib/jets/overrides/rails/asset_tag_helper.rb +114 -0
  305. data/lib/jets/overrides/rails/common_methods.rb +13 -0
  306. data/lib/jets/overrides/rails/migration_checker.rb +34 -0
  307. data/lib/jets/overrides/rails/rendering_helper.rb +27 -0
  308. data/lib/jets/overrides/rails/url_helper.rb +88 -0
  309. data/lib/jets/overrides/rails.rb +6 -0
  310. data/lib/jets/poly_fun/base_executor.rb +125 -0
  311. data/lib/jets/poly_fun/lambda_executor.rb +16 -0
  312. data/lib/jets/poly_fun/node_error.rb +8 -0
  313. data/lib/jets/poly_fun/node_executor.rb +54 -0
  314. data/lib/jets/poly_fun/python_error.rb +8 -0
  315. data/lib/jets/poly_fun/python_executor.rb +23 -0
  316. data/lib/jets/poly_fun.rb +73 -0
  317. data/lib/jets/preheat.rb +117 -0
  318. data/lib/jets/processors/deducer.rb +65 -0
  319. data/lib/jets/processors/main_processor.rb +61 -0
  320. data/lib/jets/rack_server.rb +86 -0
  321. data/lib/jets/rdoc.rb +30 -0
  322. data/lib/jets/resource/api_gateway/authorizer.rb +82 -0
  323. data/lib/jets/resource/api_gateway/base_path/function.rb +49 -0
  324. data/lib/jets/resource/api_gateway/base_path/mapping.rb +44 -0
  325. data/lib/jets/resource/api_gateway/base_path/role.rb +76 -0
  326. data/lib/jets/resource/api_gateway/cors.rb +61 -0
  327. data/lib/jets/resource/api_gateway/deployment.rb +80 -0
  328. data/lib/jets/resource/api_gateway/domain_name.rb +65 -0
  329. data/lib/jets/resource/api_gateway/method/authorization.rb +41 -0
  330. data/lib/jets/resource/api_gateway/method.rb +102 -0
  331. data/lib/jets/resource/api_gateway/resource.rb +82 -0
  332. data/lib/jets/resource/api_gateway/rest_api/change_detection.rb +10 -0
  333. data/lib/jets/resource/api_gateway/rest_api/logical_id/message.rb +49 -0
  334. data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +98 -0
  335. data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +136 -0
  336. data/lib/jets/resource/api_gateway/rest_api/routes/change/media_types.rb +36 -0
  337. data/lib/jets/resource/api_gateway/rest_api/routes/change/page.rb +93 -0
  338. data/lib/jets/resource/api_gateway/rest_api/routes/change/to.rb +25 -0
  339. data/lib/jets/resource/api_gateway/rest_api/routes/change/variable.rb +35 -0
  340. data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +16 -0
  341. data/lib/jets/resource/api_gateway/rest_api/routes/collision/variable_exception.rb +7 -0
  342. data/lib/jets/resource/api_gateway/rest_api/routes/collision.rb +121 -0
  343. data/lib/jets/resource/api_gateway/rest_api/routes.rb +7 -0
  344. data/lib/jets/resource/api_gateway/rest_api.rb +64 -0
  345. data/lib/jets/resource/associated.rb +37 -0
  346. data/lib/jets/resource/base.rb +28 -0
  347. data/lib/jets/resource/child_stack/api_deployment.rb +58 -0
  348. data/lib/jets/resource/child_stack/api_gateway.rb +23 -0
  349. data/lib/jets/resource/child_stack/api_resource/page.rb +20 -0
  350. data/lib/jets/resource/child_stack/api_resource.rb +54 -0
  351. data/lib/jets/resource/child_stack/app_class.rb +149 -0
  352. data/lib/jets/resource/child_stack/authorizer.rb +40 -0
  353. data/lib/jets/resource/child_stack/base.rb +24 -0
  354. data/lib/jets/resource/child_stack/common_parameters.rb +14 -0
  355. data/lib/jets/resource/child_stack/shared.rb +85 -0
  356. data/lib/jets/resource/config/config_rule.rb +74 -0
  357. data/lib/jets/resource/config/managed_rule.rb +15 -0
  358. data/lib/jets/resource/events/rule.rb +31 -0
  359. data/lib/jets/resource/iam/application_role.rb +27 -0
  360. data/lib/jets/resource/iam/base_role_definition.rb +47 -0
  361. data/lib/jets/resource/iam/class_role.rb +74 -0
  362. data/lib/jets/resource/iam/function_role.rb +54 -0
  363. data/lib/jets/resource/iam/managed_policy.rb +22 -0
  364. data/lib/jets/resource/iam/policy_document.rb +41 -0
  365. data/lib/jets/resource/iot/topic_rule.rb +34 -0
  366. data/lib/jets/resource/lambda/event_source_mapping.rb +31 -0
  367. data/lib/jets/resource/lambda/function/environment.rb +62 -0
  368. data/lib/jets/resource/lambda/function.rb +221 -0
  369. data/lib/jets/resource/lambda/gem_layer.rb +17 -0
  370. data/lib/jets/resource/lambda/layer_version.rb +44 -0
  371. data/lib/jets/resource/logs/subscription_filter.rb +31 -0
  372. data/lib/jets/resource/permission.rb +45 -0
  373. data/lib/jets/resource/replacer.rb +85 -0
  374. data/lib/jets/resource/route53/record_set.rb +98 -0
  375. data/lib/jets/resource/s3/bucket.rb +24 -0
  376. data/lib/jets/resource/sns/subscription.rb +29 -0
  377. data/lib/jets/resource/sns/topic.rb +35 -0
  378. data/lib/jets/resource/sns/topic_policy.rb +40 -0
  379. data/lib/jets/resource/sqs/queue.rb +21 -0
  380. data/lib/jets/resource/standardizer.rb +42 -0
  381. data/lib/jets/resource.rb +71 -0
  382. data/lib/jets/router/dsl/mount.rb +13 -0
  383. data/lib/jets/router/dsl.rb +144 -0
  384. data/lib/jets/router/error.rb +4 -0
  385. data/lib/jets/router/finder.rb +47 -0
  386. data/lib/jets/router/helpers/core_helper.rb +27 -0
  387. data/lib/jets/router/helpers/named_routes_helper.rb +8 -0
  388. data/lib/jets/router/helpers.rb +4 -0
  389. data/lib/jets/router/matcher.rb +81 -0
  390. data/lib/jets/router/method_creator/code.rb +99 -0
  391. data/lib/jets/router/method_creator/edit.rb +12 -0
  392. data/lib/jets/router/method_creator/generic.rb +11 -0
  393. data/lib/jets/router/method_creator/index.rb +48 -0
  394. data/lib/jets/router/method_creator/new.rb +12 -0
  395. data/lib/jets/router/method_creator/root.rb +15 -0
  396. data/lib/jets/router/method_creator/show.rb +12 -0
  397. data/lib/jets/router/method_creator.rb +50 -0
  398. data/lib/jets/router/resources/base.rb +7 -0
  399. data/lib/jets/router/resources/filter.rb +15 -0
  400. data/lib/jets/router/resources/options.rb +13 -0
  401. data/lib/jets/router/route/authorizer.rb +57 -0
  402. data/lib/jets/router/route.rb +230 -0
  403. data/lib/jets/router/scope.rb +95 -0
  404. data/lib/jets/router/util.rb +38 -0
  405. data/lib/jets/router.rb +180 -0
  406. data/lib/jets/rule/base.rb +19 -0
  407. data/lib/jets/rule/dsl.rb +109 -0
  408. data/lib/jets/spec_helpers/controllers/params.rb +8 -0
  409. data/lib/jets/spec_helpers/controllers/request.rb +101 -0
  410. data/lib/jets/spec_helpers/controllers/response.rb +10 -0
  411. data/lib/jets/spec_helpers/controllers.rb +47 -0
  412. data/lib/jets/spec_helpers/fixtures.rb +11 -0
  413. data/lib/jets/spec_helpers.rb +21 -0
  414. data/lib/jets/stack/builder.rb +43 -0
  415. data/lib/jets/stack/definition.rb +50 -0
  416. data/lib/jets/stack/depends/item.rb +26 -0
  417. data/lib/jets/stack/depends.rb +34 -0
  418. data/lib/jets/stack/function.rb +69 -0
  419. data/lib/jets/stack/main/dsl/base.rb +63 -0
  420. data/lib/jets/stack/main/dsl/cloudwatch.rb +19 -0
  421. data/lib/jets/stack/main/dsl/iam.rb +8 -0
  422. data/lib/jets/stack/main/dsl/kinesis.rb +15 -0
  423. data/lib/jets/stack/main/dsl/lambda.rb +83 -0
  424. data/lib/jets/stack/main/dsl/s3.rb +12 -0
  425. data/lib/jets/stack/main/dsl/sns.rb +16 -0
  426. data/lib/jets/stack/main/dsl/sqs.rb +10 -0
  427. data/lib/jets/stack/main/dsl.rb +17 -0
  428. data/lib/jets/stack/main.rb +4 -0
  429. data/lib/jets/stack/output/dsl.rb +19 -0
  430. data/lib/jets/stack/output/lookup.rb +36 -0
  431. data/lib/jets/stack/output.rb +35 -0
  432. data/lib/jets/stack/parameter/dsl.rb +42 -0
  433. data/lib/jets/stack/parameter.rb +37 -0
  434. data/lib/jets/stack/resource/dsl.rb +19 -0
  435. data/lib/jets/stack/resource.rb +31 -0
  436. data/lib/jets/stack/s3_event.rb +87 -0
  437. data/lib/jets/stack.rb +88 -0
  438. data/lib/jets/tmp_loader.rb +53 -0
  439. data/lib/jets/turbine.rb +41 -0
  440. data/lib/jets/turbo/database_yaml.rb +41 -0
  441. data/lib/jets/turbo/project/.gitignore +12 -0
  442. data/lib/jets/turbo/project/.jetskeep +1 -0
  443. data/lib/jets/turbo/project/Gemfile +16 -0
  444. data/lib/jets/turbo/project/Rakefile +2 -0
  445. data/lib/jets/turbo/project/app/controllers/application_controller.rb +2 -0
  446. data/lib/jets/turbo/project/app/helpers/application_helper.rb +2 -0
  447. data/lib/jets/turbo/project/app/jobs/application_job.rb +4 -0
  448. data/lib/jets/turbo/project/config/application.rb +5 -0
  449. data/lib/jets/turbo/project/config/routes.rb +4 -0
  450. data/lib/jets/turbo/project/config.ru +5 -0
  451. data/lib/jets/turbo/rails.rb +127 -0
  452. data/lib/jets/turbo/templates/config/database.yml +30 -0
  453. data/lib/jets/turbo.rb +56 -0
  454. data/lib/jets/util.rb +40 -0
  455. data/lib/jets/version.rb +3 -0
  456. data/lib/jets.rb +31 -0
  457. data/readme/prerelease.md +6 -0
  458. data/readme/testing.md +60 -0
  459. metadata +1105 -0
@@ -0,0 +1,121 @@
1
+ # Detects path variable collisions
2
+ class Jets::Resource::ApiGateway::RestApi::Routes
3
+ class Collision
4
+ attr_reader :collisions
5
+ def initialize
6
+ @collisions = []
7
+ end
8
+
9
+ def collision?(paths)
10
+ paths = paths_with_variables(paths)
11
+ parents = variable_parents(paths)
12
+
13
+ collide = false
14
+ parents.each do |parent|
15
+ collide ||= variable_collision_exists?(parent, paths)
16
+ end
17
+ collide
18
+ end
19
+
20
+ def exception
21
+ VariableException.new(collision_message)
22
+ end
23
+
24
+ def collision_message
25
+ <<~EOL
26
+ There are routes with sibling variables under the same parent that collide.
27
+
28
+ Collisions:
29
+ #{@collisions.join("\n ")}
30
+
31
+ API Gateway only allows one unique variable path You must use the same variable name within
32
+ the same parent route path.
33
+ Example: /posts/:id and /posts/:post_id/reveal should both be /posts/:id and /posts/:id/reveal.
34
+
35
+ Please check your `config/routes.rb` and remove the colliding routes.
36
+ More info: http://rubyonjets.com/docs/considerations/api-gateway/
37
+ EOL
38
+ end
39
+
40
+ def variable_collision_exists?(parent, paths)
41
+ paths = paths_with_variables(paths)
42
+ variables = parent_variables(parent, paths)
43
+ collide = variables.uniq.size > 1
44
+ register_collision(parent, variables) if collide
45
+ collide
46
+ end
47
+
48
+ # register collision for later display
49
+ # We don't register the full path but this might be more helpful.
50
+ def register_collision(parent, variables)
51
+ return unless variables.uniq.size # check again just in case
52
+
53
+ variables.each do |v|
54
+ @collisions << "#{parent}/#{v}"
55
+ end
56
+ @collisions.uniq!
57
+ end
58
+
59
+ def parent_variables(parent, paths)
60
+ paths = paths.select do |path|
61
+ parent?(parent, path)
62
+ end
63
+ paths.map do |path|
64
+ path.sub("#{parent}/",'').gsub(%r{/.*},'')
65
+ end.select { |x| x =~ /^:/ }.uniq.sort
66
+ end
67
+
68
+ def parent?(parent, path)
69
+ return false if parent == path
70
+
71
+ parent_parts = parent.split('/')
72
+ path_parts = path.split('/')
73
+
74
+ n = parent_parts.size-1
75
+ parent_parts[0..n] == path_parts[0..n]
76
+ end
77
+
78
+ def direct_parent?(parent, path)
79
+ leaf = variable_leaf(path)
80
+ leaf_parent = leaf.split('/')[0..-2].join('/')
81
+ parent == leaf_parent
82
+ end
83
+
84
+ def variable_parents(paths)
85
+ parents = []
86
+ paths = paths_with_variables(paths)
87
+ paths.each do |path|
88
+ parents << variable_parent(path)
89
+ end
90
+ parents.uniq.sort
91
+ end
92
+
93
+ # Strips the path down until only the leaf node part is a variable
94
+ # Example: users/:user_id/posts/:post_id/edit
95
+ # Returns: users/:user_id/posts
96
+ def variable_parent(path)
97
+ path = variable_leaf(path)
98
+ # drop last variable to leave behind the parent
99
+ path.split('/')[0..-2].join('/')
100
+ end
101
+
102
+ # Strips the path down until only the leaf node part is a variable
103
+ # Example: users/:user_id/posts/:post_id/edit
104
+ # Returns: users/:user_id/posts
105
+ def variable_leaf(path)
106
+ return '' unless path.include?(':')
107
+
108
+ parts = path.split('/')
109
+ is_variable = parts.last.include?(':')
110
+ until is_variable
111
+ parts.pop
112
+ is_variable = parts.last.include?(':')
113
+ end
114
+ parts[0..-1].join('/') # parent
115
+ end
116
+
117
+ def paths_with_variables(paths)
118
+ paths.select { |p| p.include?(':') }.uniq
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,7 @@
1
+ class Jets::Resource::ApiGateway::RestApi
2
+ class Routes
3
+ def self.changed?
4
+ Change.new.changed?
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,64 @@
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
+ properties[:policy] = endpoint_policy if endpoint_policy
10
+
11
+ {
12
+ internal_logical_id => {
13
+ type: "AWS::ApiGateway::RestApi",
14
+ properties: properties
15
+ }
16
+ }
17
+ end
18
+
19
+ def internal_logical_id
20
+ self.class.logical_id(true)
21
+ end
22
+
23
+ def self.logical_id(internal=false)
24
+ internal ? internal_logical_id : "RestApi"
25
+ end
26
+
27
+ @@internal_logical_id = nil
28
+ def self.internal_logical_id
29
+ @@internal_logical_id ||= LogicalId.new.get
30
+ end
31
+
32
+ def outputs
33
+ {
34
+ "RestApi" => "!Ref #{internal_logical_id}",
35
+ "Region" => "!Ref AWS::Region",
36
+ "RootResourceId" => "!GetAtt #{internal_logical_id}.RootResourceId",
37
+ }
38
+ end
39
+
40
+ def endpoint_types
41
+ [Jets.config.api.endpoint_type].flatten
42
+ end
43
+
44
+ # TODO: Looks like there's a bug with CloudFormation. On an API Gateway update
45
+ # we need to pass in the escaped version: multipart~1form-data
46
+ # On a brand new API Gateway creation, we need to pass in the unescaped form:
47
+ # multipart/form-data
48
+ # We are handling this with a full API Gateway replacement instead because it
49
+ # can be generalized more easily.
50
+ def binary_media_types
51
+ types = Jets.config.api.binary_media_types
52
+ return nil if types.nil? || types.empty?
53
+
54
+ [types].flatten
55
+ end
56
+
57
+ def endpoint_policy
58
+ endpoint_policy = Jets.config.api.endpoint_policy
59
+ return nil if endpoint_policy.nil? || endpoint_policy.empty?
60
+
61
+ endpoint_policy
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,37 @@
1
+ # Does not do full expansion, mainly a container that holds the definition and
2
+ # standardizes it without camelizing it.
3
+ class Jets::Resource
4
+ class Associated
5
+ extend Memoist
6
+
7
+ attr_reader :definition
8
+ attr_accessor :multiple_resources
9
+ def initialize(*definition)
10
+ @definition = definition.flatten
11
+ # Some associated resources require multiple resources for a single Lambda function. For
12
+ # example `sqs_event` can create a `SQS::Queue` and `Lambda::EventSourceMapping`. We set
13
+ # a `multiple` flag so `add_logical_id_counter` can use it to avoid adding counter ids to
14
+ # these type of resources. The `multiple` flag allows us to handle both:
15
+ #
16
+ # 1. Associated resources that contain multiple resources for a single Lambda function
17
+ # 2. A single Lambda function with multiple events. In this case, a counter is added
18
+ #
19
+ # Setting `multiple` to true means the counter id will not be added.
20
+ @multiple_resources = false
21
+ end
22
+
23
+ def logical_id
24
+ standardized.keys.first
25
+ end
26
+
27
+ def attributes
28
+ standardized.values.first
29
+ end
30
+
31
+ def standardized
32
+ standardizer = Standardizer.new(definition)
33
+ standardizer.standarize(definition) # doesnt camelize keys yet
34
+ end
35
+ memoize :standardized
36
+ end
37
+ end
@@ -0,0 +1,28 @@
1
+ # Classes that inherit from this method should NOT define and override:
2
+ #
3
+ # logical_id
4
+ # type
5
+ # properties
6
+ # attributes
7
+ #
8
+ # These are computed methods that derive their values from the resource definition itself.
9
+ # Overriding these methods will remove the computed logical which handles things
10
+ # like camelizing and replacements.
11
+ #
12
+ # The implementation of these methods are in `Jets::Resource`.
13
+ class Jets::Resource
14
+ class Base
15
+ extend Memoist
16
+ delegate :logical_id, :type, :properties, :attributes, :parameters, :outputs,
17
+ to: :resource
18
+
19
+ def resource
20
+ Jets::Resource.new(definition, replacements)
21
+ end
22
+ memoize :resource
23
+
24
+ def replacements
25
+ @replacements || {}
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,58 @@
1
+ # Implements:
2
+ #
3
+ # definition
4
+ # template_filename
5
+ #
6
+ module Jets::Resource::ChildStack
7
+ class ApiDeployment < Base
8
+ def definition
9
+ {
10
+ deployment_id => {
11
+ type: "AWS::CloudFormation::Stack",
12
+ properties: {
13
+ template_url: template_url,
14
+ parameters: parameters,
15
+ },
16
+ depends_on: depends_on,
17
+ }
18
+ }
19
+ end
20
+
21
+ def parameters
22
+ p = {
23
+ GemLayer: "!Ref GemLayer",
24
+ IamRole: "!GetAtt IamRole.Arn",
25
+ RestApi: "!GetAtt ApiGateway.Outputs.RestApi",
26
+ S3Bucket: "!Ref S3Bucket",
27
+ }
28
+ p[:DomainName] = "!GetAtt ApiGateway.Outputs.DomainName" if Jets.custom_domain?
29
+ p[:BasePath] = Jets.config.domain.base_path unless Jets.config.domain.base_path.nil?
30
+ p
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
+ # map the path to a camelized logical_id. Example:
40
+ # /tmp/jets/demo/templates/demo-dev-2-posts_controller.yml to
41
+ # PostsController
42
+ regexp = Regexp.new(".*#{Jets.config.project_namespace}-app-")
43
+ controller_name = path.sub(regexp, '').sub('.yml', '')
44
+ controller_logical_id = controller_name.underscore.camelize
45
+ controller_logical_ids << controller_logical_id
46
+ end
47
+ controller_logical_ids
48
+ end
49
+
50
+ def deployment_id
51
+ Jets::Resource::ApiGateway::Deployment.logical_id
52
+ end
53
+
54
+ def template_filename
55
+ "#{Jets.config.project_namespace}-api-deployment.yml"
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,23 @@
1
+ # Implements:
2
+ #
3
+ # definition
4
+ # template_filename
5
+ #
6
+ module Jets::Resource::ChildStack
7
+ class ApiGateway < Base
8
+ def definition
9
+ {
10
+ api_gateway: {
11
+ type: "AWS::CloudFormation::Stack",
12
+ properties: {
13
+ template_url: template_url,
14
+ }
15
+ }
16
+ }
17
+ end
18
+
19
+ def template_filename
20
+ "#{Jets.config.project_namespace}-api-gateway.yml"
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,20 @@
1
+ class Jets::Resource::ChildStack::ApiResource
2
+ # Find the ApiResource Page that contains the AWS::ApiGateway::Resource
3
+ # Returns: logical id of ApiResource Page
4
+ class Page
5
+ def self.logical_id(parameter)
6
+ expression = "#{Jets::Naming.template_path_prefix}-api-resources-*"
7
+ # IE: path: #{Jets.build_root}/templates/demo-dev-2-api-resources-1.yml"
8
+ template_paths = Dir.glob(expression).sort.to_a
9
+ found_template = template_paths.detect do |path|
10
+ next unless File.file?(path)
11
+
12
+ template = Jets::Cfn::BuiltTemplate.get(path)
13
+ template['Outputs'].keys.include?(parameter)
14
+ end
15
+ md = found_template.match(/-(api-resources-\d+)/)
16
+
17
+ md[1].underscore.camelize # IE: ApiResources1
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,54 @@
1
+ # Implements:
2
+ #
3
+ # definition
4
+ # template_filename
5
+ #
6
+ module Jets::Resource::ChildStack
7
+ class ApiResource < Base
8
+ def initialize(*)
9
+ super
10
+ @page = @options[:page]
11
+ end
12
+
13
+ def definition
14
+ {
15
+ "api_resources_#{@page}" => {
16
+ type: "AWS::CloudFormation::Stack",
17
+ # depends_on: "ApiGateway", # CloudFormation seems to be smart enough
18
+ properties: {
19
+ template_url: template_url,
20
+ parameters: parameters,
21
+ }
22
+ }
23
+ }
24
+ end
25
+
26
+ def parameters
27
+ params = {}
28
+ # Since dont have all the info required.
29
+ # Read the template back to find the parameters required.
30
+ # Actually might be easier to rationalize this approach.
31
+ template_path = Jets::Naming.api_resources_template_path(@page)
32
+ template = Jets::Cfn::BuiltTemplate.get(template_path)
33
+ template['Parameters'].keys.each do |p|
34
+ case p
35
+ when "RestApi"
36
+ params[p] = "!GetAtt ApiGateway.Outputs.RestApi"
37
+ when "RootResourceId"
38
+ params[p] = "!GetAtt ApiGateway.Outputs.RootResourceId"
39
+ else
40
+ params[p] = "!GetAtt #{api_resource_page(p)}.Outputs.#{p}"
41
+ end
42
+ end
43
+ params
44
+ end
45
+
46
+ def api_resource_page(parameter)
47
+ Page.logical_id(parameter)
48
+ end
49
+
50
+ def template_filename
51
+ "#{Jets.config.project_namespace}-api-resources-#{@page}.yml"
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,149 @@
1
+ # Implements:
2
+ #
3
+ # definition
4
+ # template_filename
5
+ #
6
+ module Jets::Resource::ChildStack
7
+ class AppClass < Base
8
+ include CommonParameters
9
+
10
+ def initialize(s3_bucket, options={})
11
+ super
12
+ @path = options[:path]
13
+ end
14
+
15
+ def definition
16
+ logical_id = app_logical_id
17
+ defintion = {
18
+ logical_id => {
19
+ type: "AWS::CloudFormation::Stack",
20
+ properties: {
21
+ template_url: template_url,
22
+ parameters: parameters,
23
+ }
24
+ }
25
+ }
26
+ defintion[logical_id][:depends_on] = depends.stack_list if depends
27
+ defintion
28
+ end
29
+
30
+ def depends
31
+ return if all_depends_on.empty?
32
+ Jets::Stack::Depends.new(all_depends_on)
33
+ end
34
+ memoize :depends
35
+
36
+ # Always returns an Array, could be empty
37
+ def all_depends_on
38
+ depends_on = current_app_class.depends_on || [] # contains Depends::Items
39
+ stagger_depends_on = @stagger_depends_on || [] # contains Depends::Items
40
+ depends_on + stagger_depends_on
41
+ end
42
+
43
+ # For staggering. We're abusing depends_on to slow down the update rate.
44
+ #
45
+ # For this type of depends_on, there are no template parameters or outputs. To use the normal depends at we would
46
+ # have to make app classes adhere to what Jets::Stack::Depends requires. This is mainly dependency_outputs and
47
+ # output_keys for each class right now. It would not be that difficult but is not needed. So we create the
48
+ # Jets::Stack::Depends::Item objects directly.
49
+ def add_stagger_depends_on(stacks)
50
+ stack_names = stacks.map { |s| s.current_app_class.to_s.underscore }
51
+ items = stack_names.map { |name| Jets::Stack::Depends::Item.new(name) }
52
+ @stagger_depends_on ||= []
53
+ @stagger_depends_on += items.flatten
54
+ end
55
+
56
+ def parameters
57
+ params = self.class.common_parameters
58
+ params.merge!(controller_params) if controller?
59
+ params.merge!(depends.params) if depends
60
+ params
61
+ end
62
+
63
+ def self.common_parameters
64
+ parameters = {
65
+ IamRole: "!GetAtt IamRole.Arn",
66
+ S3Bucket: "!Ref S3Bucket",
67
+ }
68
+ parameters[:GemLayer] = "!Ref GemLayer" unless Jets.poly_only?
69
+ parameters
70
+ end
71
+
72
+ def controller_params
73
+ return {} if Jets::Router.routes.empty?
74
+
75
+ params = {
76
+ RestApi: "!GetAtt ApiGateway.Outputs.RestApi",
77
+ }
78
+
79
+ template_path = @path
80
+ template = Jets::Cfn::BuiltTemplate.get(template_path)
81
+ template['Parameters'].each do |p,data|
82
+ case p
83
+ when /Resource$/ # AWS::ApiGateway::Resource in api-resources templates. IE: demo-dev-api-resources-2.yml
84
+ params[p] = "!GetAtt #{api_resource_page(p)}.Outputs.#{p}"
85
+ when /Authorizer$/ # AWS::ApiGateway::Authorizer in authorizers templates. IE: demo-dev-authorizers.yml
86
+ # Description contains metadata to get the Authorizer logical id
87
+ params[p] = "!GetAtt #{authorizer_output(data["Description"])}"
88
+ when 'RootResourceId'
89
+ params[p] = "!GetAtt ApiGateway.Outputs.RootResourceId"
90
+ end
91
+ end
92
+ params
93
+ end
94
+
95
+ def api_resource_page(parameter)
96
+ ApiResource::Page.logical_id(parameter)
97
+ end
98
+
99
+ def authorizer_output(desc)
100
+ authorizer_stack, authorizer_logical_id = desc.split('.')
101
+ # IE: MainAuthorizer.Outputs.ProtectAuthorizer
102
+ "#{authorizer_stack}.Outputs.#{authorizer_logical_id}"
103
+ end
104
+
105
+ def outputs
106
+ if controller? or job?
107
+ {}
108
+ else
109
+ super # { logical_id => "!Ref #{logical_id}" } in base.rb
110
+ end
111
+ end
112
+
113
+ def controller?
114
+ @path.include?('_controller.yml')
115
+ end
116
+
117
+ def job?
118
+ @path.include?('_job.yml')
119
+ end
120
+
121
+ def scoped_routes
122
+ @routes ||= Jets::Router.routes.select do |route|
123
+ route.controller_name == current_app_class.to_s
124
+ end
125
+ end
126
+
127
+ def current_app_class
128
+ templates_prefix = "#{Jets::Naming.template_path_prefix}-app-"
129
+ @path.sub(templates_prefix, '')
130
+ .sub(/\.yml$/,'')
131
+ .gsub('-','/')
132
+ .camelize
133
+ .constantize
134
+ end
135
+
136
+ # map the path to a camelized logical_id. Example:
137
+ # /tmp/jets/demo/templates/demo-dev-2-posts_controller.yml to
138
+ # PostsController
139
+ def app_logical_id
140
+ regexp = Regexp.new(".*#{Jets.config.project_namespace}-app-")
141
+ controller_name = @path.sub(regexp, '').sub('.yml', '')
142
+ controller_name.underscore.camelize
143
+ end
144
+
145
+ def template_filename
146
+ @path
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,40 @@
1
+ module Jets::Resource::ChildStack
2
+ class Authorizer < Base
3
+ include CommonParameters
4
+
5
+ def initialize(s3_bucket, options={})
6
+ super
7
+ @path = options[:path]
8
+ end
9
+
10
+ def definition
11
+ logical_id = authorizer_logical_id
12
+ {
13
+ logical_id => {
14
+ type: "AWS::CloudFormation::Stack",
15
+ properties: {
16
+ template_url: template_url,
17
+ parameters: parameters,
18
+ }
19
+ }
20
+ }
21
+ end
22
+
23
+ def parameters
24
+ params = common_parameters
25
+ params[:RestApi] = "!GetAtt ApiGateway.Outputs.RestApi"
26
+ params
27
+ end
28
+
29
+ # map the path to a camelized logical_id. IE: ProtectAuthorizer
30
+ def authorizer_logical_id
31
+ regexp = Regexp.new(".*#{Jets.config.project_namespace}-authorizers-")
32
+ authorizer_name = @path.sub(regexp, '').sub('.yml', '')
33
+ authorizer_name.underscore.camelize
34
+ end
35
+
36
+ def template_filename
37
+ @path
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,24 @@
1
+ # Inheriting classes should implement:
2
+ #
3
+ # definition
4
+ # template_filename
5
+ #
6
+ module Jets::Resource::ChildStack
7
+ class Base < Jets::Resource::Base
8
+ def initialize(s3_bucket, options={})
9
+ @s3_bucket = s3_bucket
10
+ @options = options
11
+ end
12
+
13
+ def outputs
14
+ {
15
+ logical_id => "!Ref #{logical_id}",
16
+ }
17
+ end
18
+
19
+ def template_url
20
+ basename = File.basename(template_filename)
21
+ "https://s3.amazonaws.com/#{@s3_bucket}/jets/cfn-templates/#{basename}"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ module Jets::Resource::ChildStack
2
+ module CommonParameters
3
+ def common_parameters
4
+ parameters = {
5
+ IamRole: "!GetAtt IamRole.Arn",
6
+ S3Bucket: "!Ref S3Bucket",
7
+ }
8
+ parameters[:GemLayer] = "!Ref GemLayer" unless Jets.poly_only?
9
+ parameters
10
+ end
11
+
12
+ extend self
13
+ end
14
+ end