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,200 @@
1
+ class Jets::Application
2
+ module Defaults
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ def self.default_iam_policy
7
+ project_namespace = Jets.project_namespace
8
+ logs = {
9
+ action: ["logs:*"],
10
+ effect: "Allow",
11
+ resource: "arn:aws:logs:#{Jets.aws.region}:#{Jets.aws.account}:log-group:/aws/lambda/#{project_namespace}-*",
12
+ }
13
+ s3_readonly = {
14
+ action: ["s3:Get*", "s3:List*", "s3:HeadBucket"],
15
+ effect: "Allow",
16
+ resource: "arn:aws:s3:::#{Jets.aws.s3_bucket}*",
17
+ }
18
+ policies = [logs, s3_readonly]
19
+
20
+ cloudformation = {
21
+ action: ["cloudformation:DescribeStacks", "cloudformation:DescribeStackResources"],
22
+ effect: "Allow",
23
+ resource: "arn:aws:cloudformation:#{Jets.aws.region}:#{Jets.aws.account}:stack/#{project_namespace}*",
24
+ }
25
+ policies << cloudformation
26
+
27
+ if Jets.config.function.vpc_config
28
+ vpc = {
29
+ action: %w[
30
+ ec2:CreateNetworkInterface
31
+ ec2:DeleteNetworkInterface
32
+ ec2:DescribeNetworkInterfaces
33
+ ec2:DescribeVpcs
34
+ ec2:DescribeSubnets
35
+ ec2:DescribeSecurityGroups
36
+ ],
37
+ effect: "Allow",
38
+ resource: "*",
39
+ }
40
+ policies << vpc
41
+ end
42
+
43
+ policies
44
+ end
45
+ end
46
+
47
+ def default_config
48
+ config = ActiveSupport::OrderedOptions.new
49
+ config.project_name = parse_project_name # must set early because other configs requires this
50
+ config.cors = false
51
+ config.autoload_paths = [] # allows for customization
52
+ config.ignore_paths = [] # allows for customization
53
+ config.logger = Jets::Logger.new($stderr)
54
+ config.time_zone = "UTC"
55
+
56
+ # function properties defaults
57
+ config.function = ActiveSupport::OrderedOptions.new
58
+ config.function.timeout = 30
59
+ # default memory setting based on:
60
+ # https://medium.com/epsagon/how-to-make-lambda-faster-memory-performance-benchmark-be6ebc41f0fc
61
+ config.function.memory_size = 1536
62
+
63
+ config.prewarm = ActiveSupport::OrderedOptions.new
64
+ config.prewarm.enable = true
65
+ config.prewarm.rate = '30 minutes'
66
+ config.prewarm.concurrency = 2
67
+ config.prewarm.public_ratio = 3
68
+ config.prewarm.rack_ratio = 5
69
+
70
+ config.gems = ActiveSupport::OrderedOptions.new
71
+ config.gems.clean = false
72
+ config.gems.disable = false
73
+ config.gems.source = "https://api.serverlessgems.com/api/v1"
74
+
75
+ config.inflections = ActiveSupport::OrderedOptions.new
76
+ config.inflections.irregular = {}
77
+
78
+ config.assets = ActiveSupport::OrderedOptions.new
79
+ config.assets.folders = %w[assets images packs]
80
+ config.assets.base_url = nil # IE: https://cloudfront.com/my/base/path
81
+ config.assets.max_age = 3600
82
+ config.assets.cache_control = nil # IE: public, max-age=3600 , max_age is a shorter way to set cache_control.
83
+
84
+ config.ruby = ActiveSupport::OrderedOptions.new
85
+
86
+ config.middleware = Jets::Middleware::Configurator.new
87
+
88
+ config.session = ActiveSupport::OrderedOptions.new
89
+ config.session.store = Rack::Session::Cookie # note when accessing it use session[:store] since .store is an OrderedOptions method
90
+ config.session.options = {}
91
+
92
+ config.api = ActiveSupport::OrderedOptions.new
93
+ config.api.api_key_required = false # Turn off API key required
94
+ config.api.authorization_type = "NONE"
95
+ config.api.auto_replace = nil # https://github.com/boltops-tools/jets/issues/391
96
+ config.api.binary_media_types = ['multipart/form-data']
97
+ config.api.cors_authorization_type = nil # nil so ApiGateway::Cors#cors_authorization_type handles
98
+ config.api.endpoint_policy = nil # required when endpoint_type is EDGE
99
+ config.api.endpoint_type = 'EDGE' # PRIVATE, EDGE, REGIONAL
100
+
101
+ config.api.authorizers = ActiveSupport::OrderedOptions.new
102
+ config.api.authorizers.default_token_source = "Auth" # method.request.header.Auth
103
+
104
+ config.domain = ActiveSupport::OrderedOptions.new
105
+ # config.domain.name = "#{Jets.project_namespace}.coolapp.com" # Default is nil
106
+ # config.domain.cert_arn = "..."
107
+ config.domain.endpoint_type = "REGIONAL" # EDGE or REGIONAL. Default to EDGE because CloudFormation update is faster
108
+ config.domain.route53 = true # controls whether or not to create the managed route53 record.
109
+ # Useful to disable this when user wants to manage the route themself like pointing
110
+ # it to CloudFront for blue-green deployments instead.
111
+
112
+ # Custom user lambda layers
113
+ config.lambda = ActiveSupport::OrderedOptions.new
114
+ config.lambda.layers = []
115
+
116
+ # Only used for Jets Afterburner, Mega Mode currently. This is a fallback default
117
+ # encoding. Usually, the Rails response will return a content-type header and
118
+ # the encoding in there is used when possible. Example Content-Type header:
119
+ # Content-Type text/html; charset=utf-8
120
+ config.encoding = ActiveSupport::OrderedOptions.new
121
+ config.encoding.default = "utf-8"
122
+
123
+ config.s3_event = ActiveSupport::OrderedOptions.new
124
+ # These notification_configuration properties correspond to the ruby aws-sdk
125
+ # s3.put_bucket_notification_configuration
126
+ # in jets/s3_bucket_config.rb, not the CloudFormation Bucket properties. The CloudFormation
127
+ # bucket properties have a similiar structure but is slightly different so it can be confusing.
128
+ #
129
+ # Ruby aws-sdk S3 Docs: https://amzn.to/2N7m5Lr
130
+ config.s3_event.configure_bucket = true
131
+ config.s3_event.notification_configuration = {
132
+ topic_configurations: [
133
+ {
134
+ events: ["s3:ObjectCreated:*"],
135
+ topic_arn: "!Ref SnsTopic", # must use this logical id
136
+ },
137
+ ],
138
+ }
139
+
140
+ # So tried to defined this in the jets/mailer.rb Turbine only but jets new requires it
141
+ # config.action_mailer = ActiveSupport::OrderedOptions.new
142
+
143
+ config.helpers = ActiveSupport::OrderedOptions.new
144
+ config.helpers.host = nil # nil by default. Other examples: https://myurl.com:8888
145
+
146
+ config.controllers = ActiveSupport::OrderedOptions.new
147
+ config.controllers.default_protect_from_forgery = nil
148
+ config.controllers.filtered_parameters = []
149
+
150
+ config.app = ActiveSupport::OrderedOptions.new
151
+ config.app.domain = nil
152
+
153
+ config.deploy = ActiveSupport::OrderedOptions.new
154
+ config.deploy.stagger = ActiveSupport::OrderedOptions.new
155
+ config.deploy.stagger.enabled = false
156
+ config.deploy.stagger.batch_size = 10
157
+
158
+ config.hot_reload = Jets.env.development?
159
+
160
+ config.ruby = ActiveSupport::OrderedOptions.new
161
+ config.ruby.check = true
162
+
163
+ config
164
+ end
165
+
166
+ # Essentially folders under app folder will be the default_autoload_paths. Example:
167
+ # app/controllers
168
+ # app/helpers
169
+ # app/jobs
170
+ # app/models
171
+ # app/rules
172
+ # app/shared/resources
173
+ #
174
+ # Also include:
175
+ # app/models/concerns
176
+ # app/controllers/concerns
177
+ def default_autoload_paths
178
+ paths = []
179
+ each_app_autoload_path("#{Jets.root}/app/*") do |path|
180
+ paths << path
181
+ end
182
+ # Handle concerns folders
183
+ each_app_autoload_path("#{Jets.root}/app/**/concerns") do |path|
184
+ paths << path
185
+ end
186
+
187
+ paths << "#{Jets.root}/app/shared/resources"
188
+ paths << "#{Jets.root}/app/shared/extensions"
189
+
190
+ paths
191
+ end
192
+
193
+ def default_ignore_paths
194
+ %w[
195
+ app/functions
196
+ app/shared/functions
197
+ ]
198
+ end
199
+ end
200
+ end
@@ -0,0 +1,240 @@
1
+ require "singleton"
2
+ require "rack"
3
+
4
+ class Jets::Application
5
+ include Singleton
6
+ extend Memoist
7
+ include Jets::Middleware
8
+ include Defaults
9
+
10
+ def configure(&block)
11
+ instance_eval(&block) if block
12
+ end
13
+
14
+ def setup!
15
+ load_default_config
16
+ setup_autoload_paths
17
+ setup_ignore_paths
18
+ main_loader_setup
19
+ end
20
+
21
+ def configs!
22
+ load_environments_config
23
+ load_db_config
24
+ set_iam_policy # relies on dependent values, must be called afterwards
25
+ set_time_zone
26
+ normalize_env_vars!
27
+ end
28
+
29
+ # After the mimimal template gets build, we need to reload it for the full stack
30
+ # creation. This allows us to reference IAM policies configs that depend on the
31
+ # creation of the s3 bucket.
32
+ def reload_configs!
33
+ # Tricky: reset only the things that depends on the minimal stack
34
+ @config.iam_policy = nil
35
+ configs!
36
+ end
37
+
38
+ def finish!
39
+ deprecated_configs_message
40
+ load_inflections
41
+ load_routes
42
+
43
+ Jets::Controller::Rendering::RackRenderer.setup! # Sets up ActionView etc
44
+ # Load libraries at the end to trigger onload so we can defined options in any order.
45
+ # Only action_mailer library have been used properly this way so far.
46
+ require 'action_mailer'
47
+ end
48
+
49
+ def load_inflections
50
+ Jets::Inflections.load!
51
+ end
52
+
53
+ def config
54
+ @config ||= ActiveSupport::OrderedOptions.new # dont use memoize since we reset @config later
55
+ end
56
+
57
+ # Double evaling config/application.rb causes subtle issues:
58
+ # * double loading of shared resources: Jets::Stack.subclasses will have the same
59
+ # class twice when config is called when declaring a function
60
+ # * forces us to rescue all exceptions, which is a big hammer
61
+ #
62
+ # Lets parse for the project name instead for now.
63
+ #
64
+ def parse_project_name
65
+ return ENV['JETS_PROJECT_NAME'] if ENV['JETS_PROJECT_NAME'] # override
66
+
67
+ lines = IO.readlines("#{Jets.root}/config/application.rb")
68
+ project_name_line = lines.find { |l| l =~ /config\.project_name.*=/ && l !~ /^\s+#/ }
69
+ project_name_line.gsub(/.*=/,'').strip.gsub(/["']/,'') # project_name
70
+ end
71
+
72
+ def load_default_config
73
+ @config = default_config # sets Jets.config.project_name by calling parse_project_name
74
+ set_computed_configs! # things like project_namespace that need project_name
75
+ Jets::Dotenv.load! # needs Jets.config.project_name when using ssm in dotenv files
76
+ Jets.config.project_name = parse_project_name # Must set again because JETS_PROJECT_NAME is possible
77
+ load_config_application # this overwrites Jets.config.project_name
78
+ end
79
+
80
+ def load_config_application
81
+ app_config = "#{Jets.root}/config/application.rb"
82
+ load app_config # use load instead of require so reload_configs! works
83
+ end
84
+
85
+ def load_environments_config
86
+ env_file = "#{Jets.root}/config/environments/#{Jets.env}.rb"
87
+ if File.exist?(env_file)
88
+ code = IO.read(env_file)
89
+ instance_eval(code, env_file)
90
+ end
91
+ end
92
+
93
+ def deprecated_configs_message
94
+ unless config.ruby.lazy_load.nil?
95
+ puts "Detected config.ruby.lazy_load = #{config.ruby.lazy_load.inspect}".color(:yellow)
96
+ puts "Deprecated: config.ruby.lazy_load".color(:yellow)
97
+ puts "Gems are now bundled with with Lambda Layer and there's no need to lazy load them."
98
+ puts "Please remove the config in your config/application.rb or config/environments files."
99
+ puts "You can have Jets automatically do this by running:"
100
+ puts " jets upgrade"
101
+ end
102
+ end
103
+
104
+ def main_loader
105
+ Jets::Autoloaders.main
106
+ end
107
+
108
+ def setup_autoload_paths
109
+ autoload_paths = default_autoload_paths + config.autoload_paths
110
+ autoload_paths.each do |path|
111
+ next unless File.exist?(path)
112
+ main_loader.push_dir(path)
113
+ end
114
+ end
115
+
116
+ # Allow use to add config.ignore_paths just in case there's some case Jets hasn't considered
117
+ def setup_ignore_paths
118
+ ignore_paths = default_ignore_paths + config.ignore_paths
119
+ ignore_paths.each do |path|
120
+ main_loader.ignore("#{Jets.root}/#{path}")
121
+ end
122
+ end
123
+
124
+ def main_loader_setup
125
+ main_loader.enable_reloading if Jets.env.development?
126
+ main_loader.setup # only respected on the first call
127
+ end
128
+
129
+ def each_app_autoload_path(expression)
130
+ Dir.glob(expression).each do |p|
131
+ p.sub!('./','')
132
+ yield(p) unless exclude_autoload_path?(p)
133
+ end
134
+ end
135
+
136
+ def exclude_autoload_path?(path)
137
+ path =~ %r{app/javascript} ||
138
+ path =~ %r{app/views} ||
139
+ path =~ %r{/functions} # app and shared
140
+ end
141
+
142
+ def internal_autoload_paths
143
+ internal = File.expand_path("../internal", __FILE__)
144
+ paths = %w[
145
+ app/controllers
146
+ app/helpers
147
+ app/jobs
148
+ app/models
149
+ ]
150
+ paths.map { |path| "#{internal}/#{path}" }
151
+ end
152
+
153
+ # Use the shorter name in stack names, but use the full name when it
154
+ # comes to checking for the env.
155
+ #
156
+ # Example:
157
+ #
158
+ # Jets.env: 'development'
159
+ # Jets.config.project_namespace: 'demo-dev'
160
+ ENV_MAP = {
161
+ development: 'dev',
162
+ production: 'prod',
163
+ staging: 'stag',
164
+ }
165
+ def set_computed_configs!
166
+ # env_extra can be also be set with JETS_ENV_EXTRA.
167
+ # JETS_ENV_EXTRA higher precedence than config.env_extra
168
+ config.env_extra = ENV['JETS_ENV_EXTRA'] if ENV['JETS_ENV_EXTRA']
169
+ # IE: With env_extra: project-dev-1
170
+ # Without env_extra: project-dev
171
+ config.short_env = ENV_MAP[Jets.env.to_sym] || Jets.env
172
+ # table_namespace does not have the env_extra, more common case desired.
173
+ config.table_namespace = [config.project_name, config.short_env].compact.join('-')
174
+
175
+ config.project_namespace = Jets.project_namespace
176
+ end
177
+
178
+ def set_iam_policy
179
+ config.iam_policy ||= []
180
+ config.default_iam_policy ||= self.class.default_iam_policy
181
+ config.iam_policy = config.default_iam_policy | config.iam_policy
182
+ config.managed_policy_definitions ||= [] # default empty
183
+ end
184
+
185
+ def set_time_zone
186
+ Time.zone_default = Time.find_zone!(config.time_zone)
187
+ end
188
+
189
+ # It is pretty easy to attempt to set environment variables without
190
+ # the correct AWS Environment.Variables path struture.
191
+ # Auto-fix it for convenience.
192
+ def normalize_env_vars!
193
+ environment = config.function.environment
194
+ if environment and !environment.to_h.key?(:variables)
195
+ config.function.environment = {
196
+ variables: environment.to_h
197
+ }
198
+ end
199
+ end
200
+
201
+ def load_db_config(database_yml="#{Jets.root}/config/database.yml")
202
+ config.database = {}
203
+
204
+ Jets::Dotenv.load!
205
+ if File.exist?(database_yml)
206
+ require "active_record/database_configurations" # lazy require
207
+ text = Jets::Erb.result(database_yml)
208
+ db_configs = YAML.load(text)
209
+ configurations = ActiveRecord::DatabaseConfigurations.new(db_configs)
210
+ config.database = configurations
211
+ end
212
+ end
213
+
214
+ # Naming it routes because config/routes.rb requires
215
+ #
216
+ # Jets.application.routes.draw do
217
+ #
218
+ # for scaffolding to work.
219
+ def routes
220
+ @router ||= Jets::Router.new
221
+ end
222
+
223
+ def load_routes(refresh: false)
224
+ @router = nil if refresh # clear_routes
225
+
226
+ routes_file = "#{Jets.root}/config/routes.rb"
227
+ return unless File.exist?(routes_file)
228
+ if refresh
229
+ load routes_file # always evaluate
230
+ else
231
+ require routes_file # evaluate once
232
+ end
233
+ end
234
+
235
+ def aws
236
+ Jets::AwsInfo.new
237
+ end
238
+ memoize :aws
239
+
240
+ end
@@ -0,0 +1,36 @@
1
+ # Authorizer public methods get turned into Lambda functions.
2
+ #
3
+ # Jets::Authorizer::Base < Jets::Lambda::Functions
4
+ # Both Jets::Authorizer::Base and Jets::Lambda::Functions have Dsl modules included.
5
+ # So the Jets::Authorizer::Dsl overrides some of the Jets::Lambda::Functions behavior.
6
+ module Jets::Authorizer
7
+ class Base < Jets::Lambda::Functions
8
+ include Dsl
9
+ include Helpers::IamHelper
10
+
11
+ class << self
12
+ def process(event, context, meth)
13
+ authorizer = new(event, context, meth)
14
+ authorizer.send(meth)
15
+ end
16
+
17
+ # Parameter: authorizer: Example: "main#protect"
18
+ #
19
+ # Determines authorization_type based on whether the authorizer is a Lambda or Cognito authorizer.
20
+ #
21
+ # Returns custom or cognito_user_pools
22
+ def authorization_type(authorizer)
23
+ class_name, meth = authorizer.split('#')
24
+ klass = "#{class_name}_authorizer".camelize.constantize
25
+ meth = meth.to_sym
26
+
27
+ # If there's a lambda function associated with the authorizer then it's a custom authorizer
28
+ # Otherwise it's a cognito authorizer.
29
+ #
30
+ # Returns: Valid values: none, aws_iam, custom, cognito_user_pools, aws_cross_account_iam
31
+ methods = klass.public_instance_methods(false)
32
+ methods.include?(meth) ? :custom : :cognito_user_pools
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,69 @@
1
+ require 'active_support'
2
+ require 'active_support/core_ext/class'
3
+
4
+ # Jets::Authorizer::Base < Jets::Lambda::Functions
5
+ # Both Jets::Authorizer::Base and Jets::Lambda::Functions have Dsl modules included.
6
+ # So the Jets::Authorizer::Dsl overrides some of the Jets::Lambda::Functions behavior.
7
+ #
8
+ # Implements:
9
+ #
10
+ # default_associated_resource_definition
11
+ #
12
+ module Jets::Authorizer
13
+ module Dsl
14
+ extend ActiveSupport::Concern
15
+
16
+ class_methods do
17
+ def authorizer(props={})
18
+ if props[:type].to_s.upcase == "COGNITO_USER_POOLS"
19
+ cognito_authorizer(props)
20
+ else
21
+ lambda_authorizer(props)
22
+ end
23
+ end
24
+
25
+ def lambda_authorizer(props={})
26
+ with_fresh_properties(multiple_resources: false) do
27
+ r = Jets::Resource::ApiGateway::Authorizer.new(props)
28
+ resource(r.definition) # add associated resource immediately
29
+ end
30
+ end
31
+
32
+ # Creates a task but registers it to cognito_authorizers instead of all_tasks because there is no Lambda
33
+ # function associated with the cognito authorizer.
34
+ def cognito_authorizer(props={})
35
+ resources = [props]
36
+ # Authorizer name can have dashes, but "method" name should be underscored for correct logical id.
37
+ meth = props[:name].gsub('-','_')
38
+ resource = Jets::Resource::ApiGateway::Authorizer.new(props)
39
+
40
+ # Mimic task to grab base_replacements, namely namespace.
41
+ # Do not actually use the task to create a Lambda function for cognito authorizer.
42
+ # Only using the task for base_replacements.
43
+ task = Jets::Lambda::Task.new(self.name, meth,
44
+ resources: resources,
45
+ replacements: {}) # No need for need additional replacements. Baseline replacements suffice
46
+ all_cognito_authorizers[name] = { definition: resource.definition, replacements: task.replacements }
47
+ clear_properties
48
+ end
49
+
50
+ def all_cognito_authorizers
51
+ @all_cognito_authorizers ||= ActiveSupport::OrderedHash.new
52
+ end
53
+
54
+ def cognito_authorizers
55
+ all_cognito_authorizers.values
56
+ end
57
+
58
+ def build?
59
+ !tasks.empty? || !all_cognito_authorizers.empty?
60
+ end
61
+ end
62
+
63
+ included do
64
+ class << self
65
+ include Jets::AwsServices
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,47 @@
1
+ module Jets::Authorizer::Helpers
2
+ module IamHelper
3
+ private
4
+ # Structure: https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-lambda-authorizer-output.html
5
+ # Example:
6
+ #
7
+ # {
8
+ # "principalId" => "yyyyyyyy", // The principal user identification associated with the token sent by the client.
9
+ # "policyDocument" => {},
10
+ # "context" => {},
11
+ # "usageIdentifierKey" => "{api-key}"
12
+ # }
13
+ #
14
+ def build_policy(*args)
15
+ if args.first.is_a?(Hash) # generalized form
16
+ props = args.first
17
+ else # build_policy(resource, principal, context, usage_identifier_key) form
18
+ resource, principal_id, context, usage_identifier_key = args
19
+ props = {
20
+ principal_id: principal_id || "default_user",
21
+ policy_document: {
22
+ version: "2012-10-17",
23
+ statement: [
24
+ action: "execute-api:Invoke",
25
+ effect: "Allow",
26
+ resource: resource || "*",
27
+ ],
28
+ },
29
+ }
30
+ props[:context] = context if context
31
+ props[:usage_identifier_key] = usage_identifier_key if usage_identifier_key
32
+ end
33
+
34
+ props.transform_keys! { |k| pascalize(k) } # Only top-level keys are pascalized
35
+ # policyDocument is camelized, everything else is left alone
36
+ props["policyDocument"] = Jets::Camelizer.transform(props["policyDocument"])
37
+ props
38
+ end
39
+
40
+ def pascalize(value)
41
+ new_value = value.to_s.camelize
42
+ first_char = new_value[0..0].downcase
43
+ new_value[0] = first_char
44
+ new_value
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,112 @@
1
+ require "jets/bundle"
2
+ Jets::Bundle.setup
3
+ require "zeitwerk"
4
+
5
+ module Jets
6
+ module Commands ; end
7
+
8
+ module Autoloaders
9
+ class OnceInflector < Zeitwerk::Inflector
10
+ def camelize(basename, _abspath)
11
+ map = {
12
+ cli: "CLI",
13
+ io: "IO",
14
+ version: "VERSION"
15
+ }
16
+ map[basename.to_sym] || super
17
+ end
18
+ end
19
+
20
+ class << self
21
+ extend Memoist
22
+
23
+ def log!
24
+ main.log!
25
+ once.log!
26
+ cli.log!
27
+ end
28
+
29
+ def main
30
+ Zeitwerk::Loader.new.tap do |loader|
31
+ loader.tag = "jets.main"
32
+ # loader.inflector = Inflector.new # TODO: allow custom app inflector
33
+ # The main loader is configured later on in Jets::Application#setup_autoload_paths
34
+ # because it needs access to Jets.root and Jets.config settings
35
+ end
36
+ end
37
+ memoize :main
38
+
39
+ def once
40
+ Zeitwerk::Loader.new.tap do |loader|
41
+ loader.tag = "jets.once"
42
+ loader.inflector = OnceInflector.new
43
+
44
+ loader.push_dir("#{__dir__}/..")
45
+ internal_app_paths.each do |path|
46
+ loader.push_dir("#{__dir__}/#{path}")
47
+ # Cannot eager load internal app classes because need the app first for classes like ApplicationHelper
48
+ loader.do_not_eager_load("#{__dir__}/#{path}")
49
+ end
50
+
51
+ do_not_eager_load_paths.each do |path|
52
+ loader.do_not_eager_load("#{__dir__}/#{path}")
53
+ end
54
+
55
+ ignore_paths.each do |path|
56
+ loader.ignore("#{__dir__}/#{path}")
57
+ end
58
+ end
59
+ end
60
+ memoize :once
61
+
62
+ def cli
63
+ Zeitwerk::Loader.new.tap do |loader|
64
+ loader.tag = "jets.cli"
65
+ loader.inflector = OnceInflector.new
66
+
67
+ loader.push_dir("#{__dir__}/commands", namespace: Jets::Commands)
68
+ loader.ignore("#{__dir__}/commands/templates*")
69
+ end
70
+ end
71
+ memoize :cli
72
+
73
+ private
74
+ def internal_app_paths
75
+ %w[
76
+ internal/app/controllers
77
+ internal/app/helpers
78
+ internal/app/jobs
79
+ internal/turbines
80
+ ]
81
+ end
82
+
83
+ # Do eager load but allow autoloading. Specs related files make sense here.
84
+ def do_not_eager_load_paths
85
+ %w[
86
+ cli
87
+ spec_helpers
88
+ spec_helpers.rb
89
+ generator
90
+ ]
91
+ end
92
+
93
+ # These files will not be eager loaded and also will not follow the autoloading convention.
94
+ # They are generally explictly required.
95
+ def ignore_paths
96
+ # eager loading builders/rackup_wrappers - will cause the program to exit
97
+ %w[
98
+ builders/rackup_wrappers
99
+ builders/reconfigure_rails
100
+ builders/templates
101
+ commands
102
+ controller/middleware/webpacker_setup.rb
103
+ core_ext
104
+ internal
105
+ overrides
106
+ turbo/project
107
+ ]
108
+ end
109
+ end
110
+ end
111
+ end
112
+