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,19 @@
1
+ require 'json'
2
+
3
+ # Base public methods get turned into Lambda functions.
4
+ #
5
+ # Jets::Rule::Base < Jets::Lambda::Functions
6
+ # Both Jets::Rule::Base and Jets::Lambda::Functions have Dsl modules included.
7
+ # So the Jets::Rule::Dsl overrides some of the Jets::Lambda::Functions behavior.
8
+ module Jets::Rule
9
+ class Base < Jets::Lambda::Functions
10
+ include Dsl
11
+
12
+ class << self
13
+ def process(event, context, meth)
14
+ job = new(event, context, meth)
15
+ job.send(meth)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,109 @@
1
+ # Jets::Rule::Base < Jets::Lambda::Functions
2
+ # Both Jets::Rule::Base and Jets::Lambda::Functions have Dsl modules included.
3
+ # So the Jets::Rule::Dsl overrides some of the Jets::Lambda::Functions behavior.
4
+ #
5
+ # Implements:
6
+ #
7
+ # default_associated_resource_definition
8
+ #
9
+ module Jets::Rule::Dsl
10
+ extend ActiveSupport::Concern
11
+
12
+ included do
13
+ class << self
14
+ def rule_namespace(value=nil)
15
+ if value.nil?
16
+ @rule_namespace # getter
17
+ else
18
+ @rule_namespace = value # # setter
19
+ end
20
+ end
21
+
22
+ # Allows for different types of values. Examples:
23
+ #
24
+ # String: scope "AWS::EC2::SecurityGroup"
25
+ # Array: scope ["AWS::EC2::SecurityGroup"]
26
+ # Hash: scope {"ComplianceResourceTypes" => ["AWS::EC2::SecurityGroup"]}
27
+ def scope(value)
28
+ scope = case value
29
+ when String
30
+ {compliance_resource_types: [value]}
31
+ when Array
32
+ {compliance_resource_types: value}
33
+ else # default to hash
34
+ value
35
+ end
36
+ associated_properties(scope: scope)
37
+ end
38
+
39
+ # Convenience method that set properties. List based on https://amzn.to/2oSph1P
40
+ # Not all properties are included because some properties are not meant to be set
41
+ # directly. For example, function_name is a calculated setting by Jets.
42
+ ASSOCIATED_PROPERTIES = %W[
43
+ config_rule_name
44
+ description
45
+ input_parameters
46
+ maximum_execution_frequency
47
+ ]
48
+ define_associated_properties(ASSOCIATED_PROPERTIES)
49
+ alias_method :desc, :description
50
+
51
+ def default_associated_resource_definition(meth)
52
+ config_rule_definition(meth)
53
+ end
54
+
55
+ def config_rule_definition(meth)
56
+ resource = Jets::Resource::Config::ConfigRule.new(self, meth, associated_properties)
57
+ resource.definition # returns a definition to be added by associated_resources
58
+ end
59
+
60
+ def managed_rule(name)
61
+ name = name.to_s
62
+ managed_rule = Jets::Resource::Config::ManagedRule.new(self, name, associated_properties)
63
+ resource(managed_rule.definition) # Sets @associated_resources
64
+
65
+ # The key to not register the task to all_tasks to avoid creating a Lambda function.
66
+ # Instead we store it in all_managed_rules.
67
+ register_managed_rule(name, managed_rule.definition)
68
+ end
69
+
70
+ # Creates a task but registers it to all_managed_rules instead of all_tasks
71
+ # because we do not want Lambda functions to be created.
72
+ def register_managed_rule(name, definition)
73
+ # Mimic task to grab base_replacements, namely namespace.
74
+ # Do not actually use the task to create a Lambda function for managed rules.
75
+ # Only using the task for base_replacements.
76
+ resources = [definition]
77
+ meth = name
78
+ task = Jets::Lambda::Task.new(self.name, meth,
79
+ resources: resources,
80
+ replacements: replacements(meth))
81
+ all_managed_rules[name] = { definition: definition, replacements: task.replacements }
82
+ clear_properties
83
+ end
84
+
85
+ # Override lambda/dsl.rb to add config_rule_name also
86
+ def replacements(meth)
87
+ name_without_rule = self.name.underscore.gsub(/_rule$/,'')
88
+ config_rule_name = "#{name_without_rule}_#{meth}".dasherize
89
+ {
90
+ config_rule_name: config_rule_name
91
+ }
92
+ end
93
+
94
+ # AWS managed rules are not actual Lambda functions and require their own storage.
95
+ def all_managed_rules
96
+ @all_managed_rules ||= ActiveSupport::OrderedHash.new
97
+ end
98
+
99
+ def managed_rules
100
+ all_managed_rules.values
101
+ end
102
+
103
+ # Override Lambda::Dsl.build? to account for possible managed_rules
104
+ def build?
105
+ !tasks.empty? || !managed_rules.empty?
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,8 @@
1
+ module Jets::SpecHelpers::Controllers
2
+ class Params
3
+ attr_accessor :path_params, :body_params, :query_params
4
+ def initialize(path_params={}, body_params={}, query_params={})
5
+ @path_params, @body_params, @query_params = path_params, body_params, query_params
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,101 @@
1
+ module Jets::SpecHelpers::Controllers
2
+ class Request
3
+ extend Memoist
4
+
5
+ attr_accessor :method, :path, :headers, :params
6
+ def initialize(method, path, headers={}, params={})
7
+ @method, @path, @headers, @params = method, path, headers, params
8
+ end
9
+
10
+ def event
11
+ json = {}
12
+ id_params = route.path.scan(%r{:([^/]+)}).flatten
13
+ expanded_path = escape_path(path)
14
+ path_parameters = {}
15
+
16
+ id_params.each do |id_param|
17
+ raise "missing param: :#{id_param}" unless path_params.include? id_param.to_sym
18
+
19
+ path_param_value = path_params[id_param.to_sym]
20
+ raise "Path param :#{id_param} value cannot be blank" if path_param_value.blank?
21
+
22
+ escaped_path_param_value = CGI.escape(path_param_value.to_s)
23
+ expanded_path.gsub!(":#{id_param}", escaped_path_param_value)
24
+ path_parameters.deep_merge!(id_param => escaped_path_param_value)
25
+ end
26
+
27
+ json['resource'] = escape_path(path)
28
+ json['path'] = expanded_path
29
+ json['httpMethod'] = method.to_s.upcase
30
+ json['pathParameters'] = path_parameters
31
+ json['headers'] = (headers || {}).stringify_keys
32
+
33
+ if method != :get
34
+ json['headers']['Content-Type'] ||= 'application/x-www-form-urlencoded'
35
+
36
+ if params.body_params.is_a? String
37
+ body = params.body_params
38
+ json['headers']['Content-Length'] ||= body.length.to_s
39
+ else
40
+ body = Rack::Multipart.build_multipart(params.body_params)
41
+
42
+ if body
43
+ json['headers']['Content-Length'] ||= body.length.to_s
44
+ json['headers']['Content-Type'] = "multipart/form-data; boundary=#{Rack::Multipart::MULTIPART_BOUNDARY}"
45
+ else
46
+ body = Rack::Utils.build_nested_query(params.body_params)
47
+ end
48
+ end
49
+
50
+ json['body'] = Base64.encode64(body)
51
+ json['isBase64Encoded'] = true
52
+ end
53
+
54
+ params.query_params.each do |key, value|
55
+ json['queryStringParameters'] ||= {}
56
+ json['queryStringParameters'][key.to_s] = value.deep_dup
57
+ end
58
+
59
+ json
60
+ end
61
+
62
+ def path_params
63
+ params.path_params.reverse_merge(extract_parameters)
64
+ end
65
+ memoize :path_params
66
+
67
+ def extract_parameters
68
+ route.extract_parameters(normalized_path).symbolize_keys
69
+ end
70
+
71
+ def normalized_path
72
+ path = self.path
73
+ path = path[0..-2] if path.end_with? '/'
74
+ path = path[1..-1] if path.start_with? '/'
75
+ path
76
+ end
77
+
78
+ def route
79
+ Jets::Router::Finder.new(normalized_path, method).run
80
+ end
81
+ memoize :route
82
+
83
+ def dispatch!
84
+ klass = Object.const_get(route.controller_name)
85
+ controller = klass.new(event, {}, route.action_name)
86
+ response = controller.process! # response is API Gateway Hash
87
+
88
+ unless response['statusCode'] && response['body']
89
+ raise "Expected response to an API Gateway Hash Structure. Are you rendering correctly?"
90
+ end
91
+
92
+ Response.new(response) # converts APIGW hash to prettier object
93
+ end
94
+
95
+ private
96
+
97
+ def escape_path(path)
98
+ path.to_s.split('/').map { |s| s =~ /\A[:\*]/ ? s : CGI.escape(s) }.join('/')
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,10 @@
1
+ module Jets::SpecHelpers::Controllers
2
+ class Response
3
+ attr_reader :status, :headers, :body
4
+ def initialize(response)
5
+ @status = response['statusCode'].to_i
6
+ @headers = response['headers']
7
+ @body = response['body']
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,47 @@
1
+ module Jets::SpecHelpers
2
+ module Controllers
3
+ include Jets::Router::Helpers # must be at the top because response is overridden later
4
+
5
+ attr_reader :response
6
+ # Note: caching it like this instead of within the initialize results in the headers not being cached
7
+ # See: https://community.rubyonjets.com/t/is-jets-spechelpers-controllers-request-being-cached/244/2
8
+ def request
9
+ @request ||= Request.new(:get, '/', {}, Params.new)
10
+ end
11
+
12
+ rest_methods = %w[get post put patch delete]
13
+ rest_methods.each do |meth|
14
+ define_method(meth) do |path, **params|
15
+ http_call(method: meth, path: path, **params)
16
+ end
17
+ # Example:
18
+ # def get(path, **params)
19
+ # http_call(method: :get, path: path, **params)
20
+ # end
21
+ end
22
+
23
+ def http_call(method:, path:, **params)
24
+ request.method = method.to_sym
25
+ request.path = path
26
+ request.headers.deep_merge!(params.delete(:headers) || {})
27
+
28
+ request.params.query_params = params.delete(:query)
29
+
30
+ if request.method == :get
31
+ request.params.body_params = {}
32
+ request.params.query_params ||= params.delete(:params)
33
+ request.params.query_params ||= params
34
+ else
35
+ request.params.body_params = params.delete(:body)
36
+ request.params.body_params ||= params.delete(:params)
37
+ request.params.body_params ||= params
38
+ end
39
+
40
+ request.params.query_params ||= {}
41
+
42
+ request.params.path_params = params
43
+
44
+ @response = request.dispatch!
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,11 @@
1
+ module Jets::SpecHelpers
2
+ module Fixtures
3
+ def fixture_path(filename)
4
+ "#{Jets.root}/spec/fixtures/#{filename}"
5
+ end
6
+
7
+ def fixture_file(filename)
8
+ File.new(fixture_path(filename))
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'base64'
4
+
5
+ module Jets
6
+ module SpecHelpers
7
+ include Fixtures
8
+ include Controllers
9
+ end
10
+ end
11
+
12
+ if File.exist?("#{Jets.root}/config/database.yml") && !ENV["SKIP_MIGRATION_CHECK"]
13
+ ActiveRecord::Tasks::DatabaseTasks.db_dir = "#{Jets.root}/db"
14
+ ActiveRecord::Migration.extend ActiveRecord::MigrationChecker
15
+ ActiveRecord::Migration.prepare_test_db
16
+ end
17
+
18
+ require "rspec"
19
+ RSpec.configure do |c|
20
+ c.include Jets::SpecHelpers
21
+ end
@@ -0,0 +1,43 @@
1
+ class Jets::Stack
2
+ class Builder
3
+ extend Memoist
4
+
5
+ def initialize(stack)
6
+ @stack = stack
7
+ @template = {} # will build this structure up
8
+ end
9
+
10
+ def template
11
+ build_section(:parameters)
12
+ build_section(:resources)
13
+ build_section(:outputs)
14
+ Jets::Camelizer.transform(@template)
15
+ end
16
+ memoize :template
17
+
18
+ def build_section(section)
19
+ elements = build_elements(section)
20
+ return unless elements
21
+
22
+ if section == :parameters
23
+ elements["GemLayer"] = {"Type"=>"String"} unless Jets.poly_only?
24
+ end
25
+ @template[section] = elements
26
+ end
27
+
28
+ def build_elements(section)
29
+ # s is a "section element". Examples:
30
+ #
31
+ # Jets::Stack::Parameter
32
+ # Jets::Stack::Resource
33
+ # Jets::Stack::Output
34
+ #
35
+ section_elements = @stack.send(section)
36
+ return unless section_elements
37
+
38
+ section_elements.inject({}) do |template_section, s|
39
+ template_section.merge(s.template)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,50 @@
1
+ # Class that include Definition should implement:
2
+ #
3
+ # template - method should use @definition to build a CloudFormation template section
4
+ #
5
+ class Jets::Stack
6
+ module Definition
7
+ extend ActiveSupport::Concern
8
+
9
+ # Example of usage that leads here:
10
+ #
11
+ # Parameter.new(self, *definition).register
12
+ #
13
+ # Which is defined in parameter/dsl.rb
14
+ #
15
+ # Example subclass: ExampleStack < Jets::Stack
16
+ def initialize(subclass, *definition)
17
+ @subclass = subclass.to_s # important to use to_s, dont want the object as keys in @definitions
18
+ @definition = definition.flatten
19
+ end
20
+
21
+ def register
22
+ self.class.register(@subclass, *@definition)
23
+ end
24
+
25
+ def camelize(attributes)
26
+ Jets::Camelizer.transform(attributes)
27
+ end
28
+
29
+ class_methods do
30
+ def register(subclass, *definition)
31
+ @definitions ||= {}
32
+ @definitions[subclass.to_s] ||= []
33
+ # Create instance of the CloudFormation section class and register it. Examples:
34
+ # Stack::Parameter.new(definition)
35
+ # Stack::Resource.new(definition)
36
+ # Stack::Output.new(definition)
37
+ @definitions[subclass.to_s] << new(subclass, definition)
38
+ end
39
+
40
+ def definitions(subclass)
41
+ @definitions ||= {}
42
+ @definitions[subclass.to_s]
43
+ end
44
+
45
+ def all_definitions
46
+ @definitions
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,26 @@
1
+ # Usage examples:
2
+ #
3
+ # Jets::Stack::Depends::Item.new(:custom)
4
+ # Jets::Stack::Depends::Item.new(:custom, :alert)
5
+ # Jets::Stack::Depends::Item.new(:custom, class_prefix: true)
6
+ # Jets::Stack::Depends::Item.new(:custom, :alert, class_prefix: true)
7
+ #
8
+ # The Jets::Stack::Depends#params uses the options to determine if the class prefix should be added.
9
+ #
10
+ class Jets::Stack::Depends
11
+ class Item
12
+ attr_reader :stack, :options
13
+ def initialize(stack, options={})
14
+ @stack = stack # should be underscore format. IE: admin/posts_controller
15
+ @options = options
16
+ end
17
+
18
+ def logical_id
19
+ @stack.to_s.gsub('::','').gsub('/','_').camelize
20
+ end
21
+
22
+ def class_name
23
+ @stack.to_s.camelize
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,34 @@
1
+ class Jets::Stack
2
+ class Depends
3
+ def initialize(items)
4
+ @items = items # Jets::Stack::Depends::Item - has stack and options properties
5
+ end
6
+
7
+ def params
8
+ result = {}
9
+ @items.each do |item|
10
+ class_name = item.class_name
11
+ dependency_outputs(class_name).each do |output|
12
+ dependency_class = class_name.to_s.camelize
13
+ output_key = item.options[:class_prefix] ?
14
+ "#{dependency_class}#{output}" : # already camelized
15
+ output
16
+
17
+ output_value = "!GetAtt #{dependency_class}.Outputs.#{output}"
18
+ result[output_key] = output_value
19
+ end
20
+ end
21
+ result
22
+ end
23
+
24
+ # Returns CloudFormation template logical ids
25
+ def stack_list
26
+ @items.map(&:logical_id)
27
+ end
28
+
29
+ private
30
+ def dependency_outputs(class_name)
31
+ class_name.to_s.camelize.constantize.output_keys
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,69 @@
1
+ class Jets::Stack
2
+ class Function
3
+ extend Memoist
4
+
5
+ attr_reader :template
6
+ def initialize(template)
7
+ @template = template
8
+ end
9
+
10
+ def meth
11
+ attributes = @template.values.first
12
+ handler = attributes['Properties']['Handler']
13
+ handler.split('.').last
14
+ end
15
+
16
+ def lang
17
+ return if internal?
18
+
19
+ if source_file
20
+ # Detect language from file extension
21
+ ext = File.extname(source_file).sub(/^\./,'').to_sym
22
+ lang_map[ext]
23
+ else
24
+ puts "WARN: Unable to find a source file for function. Looked at: #{search_expression}".color(:yellow)
25
+ end
26
+ end
27
+
28
+ def lang_map
29
+ {
30
+ rb: :ruby,
31
+ py: :python,
32
+ js: :node,
33
+ }
34
+ end
35
+
36
+ def source_file
37
+ Dir.glob(search_expression).first
38
+ end
39
+ memoize :source_file
40
+
41
+ def search_expression
42
+ base_search_expression.sub('handlers/shared/', "#{Jets.root}/app/shared/")
43
+ end
44
+
45
+ def internal_search_expression
46
+ internal = File.expand_path("../internal", File.dirname(__FILE__))
47
+ base_search_expression.sub('handlers/shared/', "#{internal}/app/shared/")
48
+ end
49
+
50
+ def base_search_expression
51
+ attributes = @template.values.first
52
+ handler = attributes['Properties']['Handler']
53
+ handler.split('.')[0..-2].join('.') + '.*' # search_expression
54
+ # Example: handlers/shared/functions/jets/s3_bucket_config.*
55
+ end
56
+
57
+ # Internal flag is mainly used to disable WARN messages
58
+ def internal?
59
+ !!Dir.glob(internal_search_expression).first
60
+ end
61
+
62
+ # Relative path
63
+ # app/shared/functions/kevin.py => handlers/shared/functions/kevin.py
64
+ def handler_dest
65
+ return unless source_file
66
+ source_file.sub(%r{.*/app/}, "handlers/")
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,63 @@
1
+ module Jets::Stack::Main::Dsl
2
+ module Base
3
+ def ref(value)
4
+ "!Ref #{value.to_s.camelize}"
5
+ end
6
+
7
+ # Examples:
8
+ # get_attr("logical_id.attribute")
9
+ # get_attr("logical_id", "attribute")
10
+ # get_attr(["logical_id", "attribute"])
11
+ def get_att(*item)
12
+ item = item.flatten
13
+ options = item.last.is_a?(Hash) ? item.pop : {}
14
+
15
+ # list is an Array
16
+ list = if item.size == 1
17
+ item.first.split('.')
18
+ else
19
+ item
20
+ end
21
+ list.map! { |s| s.to_s.camelize } unless options[:autoformat] == false
22
+ { "Fn::GetAtt" => list }
23
+ end
24
+
25
+ def logical_id(value)
26
+ value.to_s.camelize
27
+ end
28
+
29
+ def depends_on(*stacks)
30
+ if stacks == []
31
+ @depends_on
32
+ else
33
+ @depends_on ||= []
34
+ @depends_on += stacks
35
+ end
36
+ end
37
+
38
+ # Due to `if Jets::Stack.has_resources?` check early on in the bootstraping process
39
+ # The code has not been built at that point. So we use a placeholder and will replace
40
+ # the placeholder as part of the cfn template build process after the code has been built
41
+ # and the code_s3_key with md5 is available.
42
+ def code_s3_key
43
+ "code_s3_key_placeholder"
44
+ end
45
+
46
+ # resource(:hello,
47
+ # function_name: "hello",
48
+ # code: {
49
+ # s3_bucket: "!Ref S3Bucket",
50
+ # s3_key: code_s3_key
51
+ # },
52
+ # description: "Hello world",
53
+ # handler: handler_function("hello.lambda_handler"),
54
+ # memory_size: 128,
55
+ # role: "!Ref IamRole",
56
+ # runtime: "python3.6",
57
+ # timeout: 20,
58
+ # )
59
+ def handler(name)
60
+ "handlers/shared/functions/#{name}" # generated handler
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,19 @@
1
+ module Jets::Stack::Main::Dsl
2
+ module Cloudwatch
3
+ def cloudwatch_alarm(id, hash={})
4
+ if hash.key?(:depends_on)
5
+ attributes = hash # leave structure alone and add type only
6
+ attributes[:type] = "AWS::CloudWatch::Alarm"
7
+ else
8
+ # the attributes are properties
9
+ properties = hash
10
+ attributes = {
11
+ type: "AWS::CloudWatch::Alarm",
12
+ properties: properties,
13
+ }
14
+ end
15
+ resource(id, attributes)
16
+ output(id)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,8 @@
1
+ module Jets::Stack::Main::Dsl
2
+ module Iam
3
+ def iam_role(id, props={})
4
+ resource(id, "AWS::IAM::Role", props)
5
+ output(id) # IAM Arn
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,15 @@
1
+ module Jets::Stack::Main::Dsl
2
+ module Kinesis
3
+ def kinesis_stream(id, props={})
4
+ defaults = {
5
+ name: id,
6
+ shard_count: 1
7
+ }
8
+
9
+ props = defaults.merge(props)
10
+
11
+ resource(id, "AWS::Kinesis::Stream", props)
12
+ output(id)
13
+ end
14
+ end
15
+ end