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,50 @@
1
+ class Jets::Router
2
+ class MethodCreator
3
+ include Util
4
+
5
+ def initialize(options, scope)
6
+ @options, @scope = options, scope
7
+ @controller, @action = get_controller_action(@options)
8
+ end
9
+
10
+ def define_url_helper!
11
+ return unless @options[:method] == :get
12
+
13
+ if %w[index new show edit].include?(@action)
14
+ create_method(@action)
15
+ else
16
+ create_method("generic")
17
+ end
18
+ end
19
+
20
+ # Examples:
21
+ #
22
+ # posts_path: path: 'posts'
23
+ # admin_posts_path: prefix: 'admin', path: 'posts'
24
+ # new_post_path
25
+ #
26
+ def create_method(action)
27
+ # Code eventually does this:
28
+ #
29
+ # code = Jets::Router::MethodCreator::Edit.new
30
+ # def_meth code.path_method
31
+ #
32
+ class_name = "Jets::Router::MethodCreator::#{action.camelize}"
33
+ klass = class_name.constantize # Index, Show, Edit, New
34
+ code = klass.new(@options, @scope, @controller)
35
+
36
+ def_meth(code.path_method) if code.path_method
37
+ def_meth(code.url_method) if code.url_method
38
+ end
39
+
40
+ def create_root_helper
41
+ code = Jets::Router::MethodCreator::Root.new(@options, @scope, @controller)
42
+ def_meth(code.path_method)
43
+ def_meth(code.url_method)
44
+ end
45
+
46
+ def def_meth(str)
47
+ Jets::Router::Helpers::NamedRoutesHelper.class_eval(str)
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,7 @@
1
+ module Jets::Router::Resources
2
+ class Base
3
+ def initialize(name, options)
4
+ @name, @options = name, options
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,15 @@
1
+ module Jets::Router::Resources
2
+ class Filter < Base
3
+ def yes?(action)
4
+ return true unless @options[:only] || @options[:except]
5
+
6
+ if @options[:only]
7
+ only = [@options[:only]].flatten.map(&:to_s)
8
+ only.include?(action.to_s)
9
+ else # except
10
+ except = [@options[:except]].flatten.map(&:to_s)
11
+ !except.include?(action.to_s)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ module Jets::Router::Resources
2
+ class Options < Base
3
+ def build(action)
4
+ controller = @options[:singular_resource] ? @name.to_s.pluralize : @name
5
+ options = @options.merge(to: "#{controller}##{action}") # important to create a copy of the options
6
+ # remove special options from getting to create_route. For some reason .slice! doesnt work
7
+ options.delete(:only)
8
+ options.delete(:except)
9
+ options[:from_scope] = true # flag to drop the prefix later in Route#compute_path
10
+ options
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,57 @@
1
+ class Jets::Router::Route
2
+ module Authorizer
3
+ # IE: main#protect => MainProtectAuthorizer
4
+ def authorizer_id(prefix_class: true)
5
+ return unless authorizer
6
+ logical_id(authorizer, prefix_class: prefix_class)
7
+ end
8
+
9
+ # Metadata about the authorizer class that can be used later. Stored in the Authorizer template parameters.
10
+ # In app_class.rb `def controller_params` it is used to build the input parameters for controller templates.
11
+ def authorizer_metadata
12
+ metadata(authorizer)
13
+ end
14
+
15
+ def authorizer
16
+ @options[:authorizer]
17
+ end
18
+
19
+ def authorization_scopes
20
+ @options[:authorization_scopes]
21
+ end
22
+
23
+ def authorization_type
24
+ @options[:authorization_type] || inferred_authorization_type
25
+ end
26
+
27
+ def api_key_required
28
+ @options[:api_key_required]
29
+ end
30
+
31
+ module ModuleMethods
32
+ def logical_id(authorizer, prefix_class: true)
33
+ klass, meth = authorizer.split("#")
34
+ words = [meth, "authorizer"]
35
+ words.unshift(klass) if prefix_class
36
+ words.join('_').camelize # logical_id
37
+ end
38
+
39
+ def metadata(authorizer)
40
+ klass = authorizer.split("#").first
41
+ authorizer_class = "#{klass}_authorizer".camelize
42
+ logical_id = logical_id(authorizer, prefix_class: false)
43
+ # IE: MainAuthorizer.ProtectAuthorizer
44
+ "#{authorizer_class}.#{logical_id}"
45
+ end
46
+ end
47
+ include ModuleMethods # so available as instance methods
48
+ extend ModuleMethods # so also available as module method. IE: Jets::Router::Route::Authorizer.metadata(auth_to)
49
+
50
+ private
51
+ def inferred_authorization_type
52
+ return unless authorizer
53
+ Jets::Authorizer::Base.authorization_type(authorizer)
54
+ end
55
+
56
+ end
57
+ end
@@ -0,0 +1,230 @@
1
+ # route = Jets::Router::Route.new(
2
+ # path: "posts",
3
+ # method: :get,
4
+ # to: "posts#index",
5
+ # )
6
+ class Jets::Router
7
+ class Route
8
+ include Util
9
+ include Authorizer
10
+
11
+ CAPTURE_REGEX = "([^/]*)" # as string
12
+
13
+ attr_reader :to, :as
14
+ def initialize(options, scope=Scope.new)
15
+ @options, @scope = options, scope
16
+ @path = compute_path
17
+ @to = compute_to
18
+ @as = compute_as
19
+ end
20
+
21
+ def compute_path
22
+ # Note: The @options[:prefix] is missing prefix and is not support via direct create_route.
23
+ # This is because it can be added directly to the path. IE:
24
+ #
25
+ # get "myprefix/posts", to: "posts#index"
26
+ #
27
+ # Also, this helps to keep the method creator logic more simple.
28
+ #
29
+ prefix = @scope.full_prefix
30
+ prefix = account_scope(prefix)
31
+ prefix = account_on(prefix)
32
+
33
+ path = [prefix, @options[:path]].compact.join('/')
34
+ path = path[1..-1] if path.starts_with?('/') # be more forgiving if / accidentally included
35
+ path
36
+ end
37
+
38
+ def account_scope(prefix)
39
+ return unless prefix
40
+ return prefix unless @options[:from_scope]
41
+
42
+ if @options[:singular_resource]
43
+ prefix.split('/')[0..-2].join('/')
44
+ else
45
+ prefix.split('/')[0..-3].join('/')
46
+ end
47
+ end
48
+
49
+ def account_on(prefix)
50
+ # Tricky @scope.from == :resources since the account_scope already has accounted for it
51
+ if @options[:on] == :collection && @scope.from == :resources
52
+ prefix = prefix.split('/')[0..-2].join('/')
53
+ end
54
+ prefix == '' ? nil : prefix
55
+ end
56
+
57
+ def compute_to
58
+ controller, action = get_controller_action(@options)
59
+ mod = @options[:module] || @scope.full_module
60
+ controller = [mod, controller].compact.join('/') # add module
61
+ "#{controller}##{action}"
62
+ end
63
+
64
+ def compute_as
65
+ return nil if @options[:as] == :disabled
66
+ return unless @options[:method] == :get || @options[:root]
67
+
68
+ controller, action = get_controller_action(@options)
69
+ klass = if @options[:root]
70
+ Jets::Router::MethodCreator::Root
71
+ elsif %w[index edit show new].include?(action.to_s)
72
+ class_name = "Jets::Router::MethodCreator::#{action.camelize}"
73
+ class_name.constantize # Index, Show, Edit, New
74
+ else
75
+ Jets::Router::MethodCreator::Generic
76
+ end
77
+
78
+ klass.new(@options, @scope, controller).full_meth_name(nil)
79
+ end
80
+
81
+ # IE: standard: posts/:id/edit
82
+ # api_gateway: posts/{id}/edit
83
+ def path(format=:jets)
84
+ case format
85
+ when :api_gateway
86
+ api_gateway_format(@path)
87
+ when :raw
88
+ @path
89
+ else # jets format
90
+ ensure_jets_format(@path)
91
+ end
92
+ end
93
+
94
+ def method
95
+ @options[:method].to_s.upcase
96
+ end
97
+
98
+ def internal?
99
+ !!@options[:internal]
100
+ end
101
+
102
+ def homepage?
103
+ path == ''
104
+ end
105
+
106
+ # IE: PostsController
107
+ def controller_name
108
+ to.sub(/#.*/,'').camelize + "Controller"
109
+ end
110
+
111
+ # IE: index
112
+ def action_name
113
+ to.sub(/.*#/,'')
114
+ end
115
+
116
+ # Checks to see if the corresponding controller exists. Useful to validate routes
117
+ # before deploying to CloudFormation and then rolling back.
118
+ def valid?
119
+ controller_class = begin
120
+ controller_name.constantize
121
+ rescue NameError
122
+ return false
123
+ end
124
+ controller_class.lambda_functions.include?(action_name.to_sym)
125
+ end
126
+
127
+ # Extracts the path parameters from the actual path
128
+ # Only supports extracting 1 parameter. So:
129
+ #
130
+ # actual_path: posts/tung/edit
131
+ # route.path: posts/:id/edit
132
+ #
133
+ # Returns:
134
+ # { id: "tung" }
135
+ def extract_parameters(actual_path)
136
+ if path.include?(':')
137
+ extract_parameters_capture(actual_path)
138
+ elsif path.include?('*')
139
+ extract_parameters_proxy(actual_path)
140
+ else
141
+ # Lambda AWS_PROXY sets null to the input request when there are no path parmeters
142
+ nil
143
+ end
144
+ end
145
+
146
+ def extract_parameters_proxy(actual_path)
147
+ # changes path to a string used for a regexp
148
+ # others/*proxy => others\/(.*)
149
+ # nested/others/*proxy => nested/others\/(.*)
150
+ if path.include?('/')
151
+ leading_path = path.split('/')[0..-2].join('/') # drop last segment
152
+ # leading_path: nested/others
153
+ # capture everything after the leading_path as the value
154
+ regexp = Regexp.new("#{leading_path}/(.*)")
155
+ value = actual_path.match(regexp)[1]
156
+ else
157
+ value = actual_path
158
+ end
159
+
160
+ # the last segment without the '*' is the key
161
+ proxy_segment = path.split('/').last # last segment is the proxy segment
162
+ # proxy_segment: *proxy
163
+ key = proxy_segment.sub('*','')
164
+
165
+ { key => value }
166
+ end
167
+
168
+ def extract_parameters_capture(actual_path)
169
+ # changes path to a string used for a regexp
170
+ # posts/:id/edit => posts\/(.*)\/edit
171
+ labels = []
172
+ regexp_string = path.split('/').map do |s|
173
+ if s.start_with?(':')
174
+ labels << s.delete_prefix(':')
175
+ CAPTURE_REGEX
176
+ else
177
+ s
178
+ end
179
+ end.join('\/')
180
+ # make sure beginning and end of the string matches
181
+ regexp_string = "^#{regexp_string}$"
182
+ regexp = Regexp.new(regexp_string)
183
+
184
+ values = regexp.match(actual_path).captures
185
+ labels.map do |next_label|
186
+ [next_label, values.delete_at(0)]
187
+ end.to_h
188
+ end
189
+
190
+ def mount_class
191
+ @options[:mount_class]
192
+ end
193
+
194
+ private
195
+ def ensure_jets_format(path)
196
+ path.split('/').map do |s|
197
+ if s =~ /^\{/ and s =~ /\+\}$/
198
+ s.sub(/^\{/, '*').sub(/\+\}$/,'') # {proxy+} => *proxy
199
+ elsif s =~ /^\{/ and s =~ /\}$/
200
+ s.sub('{',':').sub(/\}$/,'') # {id} => :id
201
+ else
202
+ s
203
+ end
204
+ end.join('/')
205
+ end
206
+
207
+ def api_gateway_format(path)
208
+ path.split('/')
209
+ .map {|s| transform_capture(s) }
210
+ .map {|s| transform_proxy(s) }
211
+ .join('/')
212
+ end
213
+
214
+ def transform_capture(text)
215
+ if text.starts_with?(':')
216
+ text = text.sub(':','')
217
+ text = "{#{text}}"
218
+ end
219
+ text
220
+ end
221
+
222
+ def transform_proxy(text)
223
+ if text.starts_with?('*')
224
+ text = text.sub('*','')
225
+ text = "{#{text}+}"
226
+ end
227
+ text
228
+ end
229
+ end
230
+ end
@@ -0,0 +1,95 @@
1
+ module Jets
2
+ class Router
3
+ class Scope
4
+ include Util
5
+
6
+ attr_reader :options, :parent, :level
7
+ def initialize(options = {}, parent = nil, level = 1)
8
+ @options = options
9
+ @parent = parent
10
+ @level = level
11
+ end
12
+
13
+ def root?
14
+ @parent.nil?
15
+ end
16
+
17
+ def new(options={})
18
+ self.class.new(options, self, level + 1)
19
+ end
20
+
21
+ def full_module
22
+ items = walk_parents do |current, i, result|
23
+ mod = current.options[:module]
24
+ next unless mod
25
+ result.unshift(mod)
26
+ end
27
+
28
+ items.empty? ? nil : items.join('/')
29
+ end
30
+
31
+ def full_prefix
32
+ items = walk_parents do |current, i, result|
33
+ prefix = current.options[:prefix]
34
+ next unless prefix
35
+
36
+ case current.from
37
+ when :resources
38
+ path_param = if current.options[:param]
39
+ ":#{current.options[:param]}"
40
+ else
41
+ resource_name = prefix.to_s.split('/').last
42
+ resource_name = ":#{resource_name.singularize}_id"
43
+ end
44
+ result.unshift(path_param)
45
+ result.unshift(prefix)
46
+ else # resource, namespace or general scope
47
+ result.unshift(prefix)
48
+ end
49
+ end
50
+
51
+ items.empty? ? nil : items.join('/')
52
+ end
53
+
54
+ def full_as
55
+ items = []
56
+ current = self
57
+ while current
58
+ items.unshift(current.options[:as]) # <= option_name
59
+ current = current.parent
60
+ end
61
+
62
+ items.compact!
63
+ return if items.empty?
64
+
65
+ items = singularize_leading(items)
66
+ items.join('_')
67
+ end
68
+
69
+ def walk_parents
70
+ current, i, result = self, 0, []
71
+ while current
72
+ yield(current, i, result)
73
+ current = current.parent
74
+ i += 1
75
+ end
76
+ result
77
+ end
78
+
79
+ # singularize all except last item
80
+ def singularize_leading(items)
81
+ result = []
82
+ items.each_with_index do |item, index|
83
+ item = item.to_s
84
+ r = index == items.size - 1 ? item : item.singularize
85
+ result << r
86
+ end
87
+ result
88
+ end
89
+
90
+ def from
91
+ @options[:from]
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,38 @@
1
+ class Jets::Router
2
+ module Util
3
+ # used in MethodCreator logic
4
+ def join(*items)
5
+ list = items.compact.join('_')
6
+ underscore(list)
7
+ end
8
+
9
+ def underscore(str)
10
+ return unless str
11
+ str.to_s.gsub(/[^a-zA-Z0-9]/,'_')
12
+ end
13
+
14
+ def get_controller_action(options)
15
+ if options.key?(:controller) && options.key?(:action)
16
+ [options[:controller], options[:action]]
17
+ elsif options.key?(:controller) && options.key?(:to)
18
+ action = options[:to].split('#').last
19
+ [options[:controller], action]
20
+ elsif options.key?(:on)
21
+ handle_on!(options)
22
+ else
23
+ options[:to].split('#') # controller, action
24
+ end
25
+ end
26
+
27
+ def handle_on!(options)
28
+ controller = @scope.options[:prefix].to_s
29
+ to = "#{controller}##{options[:path]}"
30
+ options[:to] = to
31
+
32
+ as = @options[:on] == :member ? controller.singularize : controller
33
+ as = "#{@options[:path]}_#{as}"
34
+ options[:as] = as
35
+ to.split('#')
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,180 @@
1
+ require 'text-table'
2
+
3
+ module Jets
4
+ class Router
5
+ include Dsl
6
+
7
+ attr_reader :routes
8
+ def initialize
9
+ @routes = []
10
+ @scope = Scope.new
11
+ end
12
+
13
+ def draw(&block)
14
+ instance_eval(&block)
15
+ check_collision!
16
+ end
17
+
18
+ # Validate routes that deployable
19
+ def check_collision!
20
+ paths = self.routes.map(&:path)
21
+ collision = Jets::Resource::ApiGateway::RestApi::Routes::Collision.new
22
+ collide = collision.collision?(paths)
23
+ raise collision.exception if collide
24
+ end
25
+
26
+ def create_route(options)
27
+ # TODO: Can use it to add additional things like authorization_type
28
+ # Would be good to add authorization_type at the controller level also
29
+ infer_to_option!(options)
30
+ handle_on!(options)
31
+ MethodCreator.new(options, @scope).define_url_helper!
32
+ @routes << Route.new(options, @scope)
33
+ end
34
+
35
+ # Can possibly infer to option from the path. Example:
36
+ #
37
+ # get 'posts/index'
38
+ # get 'posts', to: 'posts#index'
39
+ #
40
+ # get 'posts/show'
41
+ # get 'posts', to: 'posts#show'
42
+ #
43
+ def infer_to_option!(options)
44
+ return if options[:to]
45
+
46
+ path = options[:path].to_s
47
+ return unless path.include?('/')
48
+
49
+ items = path.split('/')
50
+ if items.size == 2
51
+ options[:to] = items.join('#')
52
+ end
53
+ end
54
+
55
+ def handle_on!(options)
56
+ if options[:on] && !%w[resources resource].include?(@scope.from.to_s)
57
+ raise Error.new("ERROR: The `on:` option can only be used within a resource or resources block")
58
+ end
59
+ options[:on] ||= @on_option if @on_option
60
+ end
61
+
62
+ def api_mode?
63
+ if Jets.config.key?(:api_mode) || Jets.config.key?(:api_generator)
64
+ puts <<~EOL.color(:yellow)
65
+ DEPRECATED: Jets.config.api_generator
66
+ Instead, please update your config/application.rb to use:
67
+ Jets.config.mode = 'api'
68
+ You can also run:
69
+ jets upgrade
70
+ EOL
71
+ end
72
+ api_mode = Jets.config.mode == 'api' || Jets.config.api_mode || Jets.config.api_generator
73
+ api_mode
74
+ end
75
+
76
+ # Useful for creating API Gateway Resources
77
+ def all_paths
78
+ results = []
79
+ paths = routes.map(&:path)
80
+ paths.each do |p|
81
+ sub_paths = []
82
+ parts = p.split('/')
83
+ until parts.empty?
84
+ parts.pop
85
+ sub_path = parts.join('/')
86
+ sub_paths << sub_path unless sub_path == ''
87
+ end
88
+ results += sub_paths
89
+ end
90
+ @all_paths = (results + paths).sort.uniq
91
+ end
92
+
93
+ # Useful for RouterMatcher
94
+ #
95
+ # Precedence:
96
+ # Routes with wildcards are considered after routes without wildcards
97
+ #
98
+ # Routes with fewer captures are ordered first since both
99
+ # /posts/:post_id/comments/new and /posts/:post_id/comments/:id are equally
100
+ # long
101
+ #
102
+ # Routes with the same amount of captures and wildcards are orderd so that
103
+ # the longest path is considered first since posts/:id and posts/:id/edit
104
+ # can both match.
105
+ def ordered_routes
106
+ length = Proc.new { |r| [r.path.count("*"), r.path.count(":"), r.path.length * -1] }
107
+ routes.sort_by(&length)
108
+ end
109
+
110
+ class << self
111
+ def has_controller?(name)
112
+ routes.detect { |r| r.controller_name == name }
113
+ end
114
+
115
+ # Class methods
116
+ def draw
117
+ drawn_router
118
+ end
119
+
120
+ @@drawn_router = nil
121
+ def drawn_router
122
+ return @@drawn_router if @@drawn_router
123
+
124
+ router = Jets.application.routes
125
+ @@drawn_router = router
126
+ end
127
+
128
+ def clear!
129
+ @@drawn_router = nil
130
+ Jets::Router::Helpers::NamedRoutesHelper.clear!
131
+ end
132
+
133
+ def routes
134
+ drawn_router.routes
135
+ end
136
+
137
+ # Returns all paths including subpaths.
138
+ # Example:
139
+ # Input: ["posts/:id/edit"]
140
+ # Output: ["posts", "posts/:id", "posts/:id/edit"]
141
+ def all_paths
142
+ drawn_router.all_paths
143
+ end
144
+
145
+ def help(routes)
146
+ return "Your routes table is empty." if routes.empty?
147
+
148
+ table = Text::Table.new
149
+ table.head = %w[As Verb Path Controller#action]
150
+ routes.each do |route|
151
+ table.rows << [route.as, route.method, route.path, route.to]
152
+ end
153
+ table
154
+ end
155
+
156
+ def all_routes_valid?
157
+ invalid_routes.empty?
158
+ end
159
+
160
+ def invalid_routes
161
+ routes.select { |r| !r.valid? }
162
+ end
163
+
164
+ def validate_routes!
165
+ check_route_connected_functions
166
+ end
167
+
168
+ # Checks that all routes are validate and have corresponding lambda functions
169
+ def check_route_connected_functions
170
+ return true if all_routes_valid?
171
+
172
+ puts "Please double check the routes below map to valid controllers:".color(:red)
173
+ invalid_routes.each do |route|
174
+ puts " /#{route.path} => #{route.controller_name}##{route.action_name}"
175
+ end
176
+ false
177
+ end
178
+ end
179
+ end
180
+ end