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,42 @@
1
+ class Jets::Resource
2
+ class Standardizer
3
+ attr_reader :definition
4
+ def initialize(*definition)
5
+ @definition = definition.flatten
6
+ end
7
+
8
+ def template
9
+ camelize(standarize(@definition))
10
+ end
11
+
12
+ def camelize(attributes)
13
+ Jets::Camelizer.transform(attributes)
14
+ end
15
+
16
+ def standarize(definition)
17
+ first, second, third, _ = definition
18
+ if definition.size == 1 && first.is_a?(Hash) # long form
19
+ first # pass through
20
+ elsif definition.size == 2 && second.is_a?(Hash) # medium form
21
+ logical_id, attributes = first, second
22
+ attributes.delete(:properties) if attributes[:properties].nil? || attributes[:properties].empty?
23
+ { logical_id => attributes }
24
+ elsif definition.size == 2 && second.is_a?(String) # short form
25
+ logical_id, type = first, second
26
+ { logical_id => {
27
+ type: type
28
+ }}
29
+ elsif definition.size == 3 && (second.is_a?(String) || second.is_a?(NilClass))# short form
30
+ logical_id, type, properties = first, second, third
31
+ template = { logical_id => {
32
+ type: type
33
+ }}
34
+ attributes = template.values.first
35
+ attributes[:properties] = properties unless properties.empty?
36
+ template
37
+ else # Dont understand this form
38
+ raise "Invalid form provided. definition #{definition.inspect}"
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,71 @@
1
+ class Jets::Resource
2
+ extend Memoist
3
+
4
+ attr_reader :definition, :replacements
5
+ def initialize(definition, replacements={})
6
+ @definition = definition
7
+ @replacements = replacements
8
+ end
9
+
10
+ def template
11
+ standarize(definition)
12
+ end
13
+ memoize :template
14
+
15
+ # CloudFormation Resources reference: https://amzn.to/2NKg6ip
16
+ def standarize(*definition)
17
+ Standardizer.new(definition).template
18
+ end
19
+
20
+ def logical_id
21
+ id = template.keys.first
22
+ # replace possible {namespace} in the logical id
23
+ id = replacer.replace_value(id)
24
+ id = Jets::Camelizer.camelize(id)
25
+
26
+ Jets::Resource.truncate_id(id)
27
+ end
28
+
29
+ def self.truncate_id(id, postfix = '')
30
+ # Api Gateway resource name has a limit of 64 characters.
31
+ # Yet it throws not found when ID is longer than 62 characters and I don't know why.
32
+ # To keep it safe, let's stick to the 62 characters limit.
33
+ if id.size + postfix.size > 62
34
+ "#{id[0..(55 - postfix.size)]}#{Digest::MD5.hexdigest(id)[0..5]}#{postfix}"
35
+ else
36
+ "#{id}#{postfix}"
37
+ end
38
+ end
39
+
40
+ def type
41
+ attributes['Type']
42
+ end
43
+
44
+ def properties
45
+ attributes['Properties']
46
+ end
47
+
48
+ def attributes
49
+ attributes = template.values.first
50
+ attributes = replacer.replace_placeholders(attributes)
51
+ Jets::Camelizer.transform(attributes)
52
+ end
53
+
54
+ def parameters
55
+ {}
56
+ end
57
+
58
+ def outputs
59
+ {}
60
+ end
61
+
62
+ def replacer
63
+ Replacer.new(replacements)
64
+ end
65
+ memoize :replacer
66
+
67
+ def permission
68
+ Permission.new(replacements, self)
69
+ end
70
+ memoize :permission
71
+ end
@@ -0,0 +1,13 @@
1
+ module Jets::Router::Dsl
2
+ module Mount
3
+ # The mounted class must be a Rack compatiable class
4
+ def mount(klass, at:)
5
+ options = {to: "jets/mount#call", mount_class: klass}
6
+ at = at[1..-1] if at.starts_with?('/') # be more forgiving if / accidentally included
7
+ at_wildcard = at.blank? ? "*path" : "#{at}/*path"
8
+
9
+ any at, options
10
+ any at_wildcard, options
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,144 @@
1
+ class Jets::Router
2
+ module Dsl
3
+ include Mount
4
+
5
+ # Methods supported by API Gateway
6
+ %w[any delete get head options patch post put].each do |method_name|
7
+ define_method method_name do |path, options={}|
8
+ create_route(options.merge(path: escape_path(path), method: __method__))
9
+ end
10
+ end
11
+
12
+ def namespace(ns, &block)
13
+ scope(module: ns, prefix: ns, as: ns, from: :namespace, &block)
14
+ end
15
+
16
+ def prefix(prefix, &block)
17
+ scope(prefix: prefix, &block)
18
+ end
19
+
20
+ # scope supports three options: module, prefix and as.
21
+ # Jets vs Rails:
22
+ # module - module
23
+ # prefix - path
24
+ # as - as
25
+ def scope(args)
26
+ # normalizes `scope(:admin)` as `scope(prefix: :admin)`
27
+ options = case args
28
+ when Hash
29
+ args
30
+ when String, Symbol
31
+ { prefix: args }
32
+ end
33
+
34
+ root_level = @scope.nil?
35
+ @scope = root_level ? Scope.new(options) : @scope.new(options)
36
+ yield
37
+ ensure
38
+ @scope = @scope.parent if @scope
39
+ end
40
+
41
+ # resources macro expands to all the routes
42
+ def resources(*items, **options)
43
+ items.each do |item|
44
+ scope_options = scope_options!(item, options)
45
+ scope_options[:from] = :resources # flag for MethodCreator logic: to handle method_name_leaf and more
46
+ scope(scope_options) do
47
+ each_resources(item, options, block_given?)
48
+ yield if block_given?
49
+ end
50
+ end
51
+ end
52
+
53
+ def scope_options!(item, options)
54
+ prefix = if options[:prefix]
55
+ # prefix given from the resources macro get automatically prepended to the item name
56
+ p = options.delete(:prefix)
57
+ "#{p}/#{item}"
58
+ else
59
+ item
60
+ end
61
+
62
+ {
63
+ as: options.delete(:as) || item, # delete as or it messes with create_route
64
+ prefix: prefix,
65
+ param: options[:param],
66
+ # module: options.delete(:module) || item, # NOTE: resources does not automatically set module, but namespace does
67
+ }
68
+ end
69
+
70
+ def each_resources(name, options={}, has_block=nil)
71
+ o = Resources::Options.new(name, options)
72
+ f = Resources::Filter.new(name, options)
73
+ param = default_param(has_block, name, options)
74
+
75
+ get name, o.build(:index) if f.yes?(:index)
76
+ get "#{name}/new", o.build(:new) if f.yes?(:new) && !api_mode?
77
+ get "#{name}/:#{param}", o.build(:show) if f.yes?(:show)
78
+ post name, o.build(:create) if f.yes?(:create)
79
+ get "#{name}/:#{param}/edit", o.build(:edit) if f.yes?(:edit) && !api_mode?
80
+ put "#{name}/:#{param}", o.build(:update) if f.yes?(:update)
81
+ post "#{name}/:#{param}", o.build(:update) if f.yes?(:update) # for binary uploads
82
+ patch "#{name}/:#{param}", o.build(:update) if f.yes?(:update)
83
+ delete "#{name}/:#{param}", o.build(:delete) if f.yes?(:delete)
84
+ end
85
+
86
+ def resource(*items, **options)
87
+ items.each do |item|
88
+ scope_options = scope_options!(item, options)
89
+ scope_options[:from] = :resource # flag for MethodCreator logic: to handle method_name_leaf and more
90
+ scope(scope_options) do
91
+ each_resource(item, options, block_given?)
92
+ yield if block_given?
93
+ end
94
+ end
95
+ end
96
+
97
+ def each_resource(name, options={}, has_block=nil)
98
+ o = Resources::Options.new(name, options.merge(singular_resource: true))
99
+ f = Resources::Filter.new(name, options)
100
+
101
+ get "#{name}/new", o.build(:new) if f.yes?(:new) && !api_mode?
102
+ get name, o.build(:show) if f.yes?(:show)
103
+ post name, o.build(:create) if f.yes?(:create)
104
+ get "#{name}/edit", o.build(:edit) if f.yes?(:edit) && !api_mode?
105
+ put name, o.build(:update) if f.yes?(:update)
106
+ post name, o.build(:update) if f.yes?(:update) # for binary uploads
107
+ patch name, o.build(:update) if f.yes?(:update)
108
+ delete name, o.build(:delete) if f.yes?(:delete)
109
+ end
110
+
111
+ def member
112
+ @on_option = :member
113
+ yield
114
+ @on_option = nil
115
+ end
116
+
117
+ def collection
118
+ @on_option = :collection
119
+ yield
120
+ @on_option = nil
121
+ end
122
+
123
+ # If a block has pass then we assume the resources will be nested and then prefix
124
+ # the param name with the resource. IE: post_id instead of id
125
+ # This avoids an API Gateway parent sibling variable collision.
126
+ def default_param(has_block, name, options)
127
+ default_param = has_block ? "#{name.to_s.singularize}_id".to_sym : :id
128
+ options[:param] || default_param
129
+ end
130
+
131
+ # root "posts#index"
132
+ def root(to, options={})
133
+ default = {path: '', to: to, method: :get, root: true}
134
+ options = default.merge(options)
135
+ MethodCreator.new(options, @scope).create_root_helper
136
+ @routes << Route.new(options, @scope)
137
+ end
138
+ private
139
+
140
+ def escape_path(path)
141
+ path.to_s.split('/').map { |s| s =~ /\A[:\*]/ ? s : CGI.escape(s) }.join('/')
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,4 @@
1
+ class Jets::Router
2
+ class Error < RuntimeError
3
+ end
4
+ end
@@ -0,0 +1,47 @@
1
+ class Jets::Router
2
+ class Finder
3
+ extend Memoist
4
+
5
+ def initialize(path, method)
6
+ @path = path
7
+ @method = method.to_s.upcase
8
+ end
9
+
10
+ def run
11
+ reset_routes!
12
+ # Precedence:
13
+ # 1. Routes with no captures get highest precedence: posts/new
14
+ # 2. Then we consider the routes with captures: post/:id
15
+ #
16
+ # Within these 2 groups we consider the routes with the longest path first
17
+ # since posts/:id and posts/:id/edit can both match.
18
+ routes = router.ordered_routes
19
+ route = routes.find do |r|
20
+ matcher.match?(r)
21
+ end
22
+ route
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :path, :method
28
+
29
+ # "hot reload" for development
30
+ def reset_routes!
31
+ return unless Jets.env.development?
32
+
33
+ Jets::Router.clear!
34
+ Jets.application.load_routes(refresh: true)
35
+ end
36
+
37
+ def matcher
38
+ Jets::Router::Matcher.new(path, method)
39
+ end
40
+ memoize :matcher
41
+
42
+ def router
43
+ Jets.application.routes
44
+ end
45
+ memoize :router
46
+ end
47
+ end
@@ -0,0 +1,27 @@
1
+ module Jets::Router::Helpers
2
+ module CoreHelper
3
+ extend ActiveSupport::Concern
4
+
5
+ # Used for form_for helper
6
+ def polymorphic_path(record, _)
7
+ url_for(record)
8
+ end
9
+
10
+ # override helper delegates to point to jets controller
11
+ # TODO: params is weird
12
+ CONTROLLER_DELEGATES = %w[session response headers]
13
+ CONTROLLER_DELEGATES.each do |meth|
14
+ define_method meth do
15
+ @_jets[:controller].send(meth)
16
+ end
17
+ end
18
+
19
+ class_methods do
20
+ def define_helper_method(name)
21
+ define_method(name) do
22
+ @_jets[:controller].send(name)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,8 @@
1
+ module Jets::Router::Helpers
2
+ module NamedRoutesHelper
3
+ def self.clear!
4
+ meths = public_instance_methods(false)
5
+ meths.each { |m| remove_method(m) }
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,4 @@
1
+ module Jets::Router::Helpers
2
+ include CoreHelper
3
+ include NamedRoutesHelper
4
+ end
@@ -0,0 +1,81 @@
1
+ class Jets::Router
2
+ class Matcher
3
+ def initialize(path, method)
4
+ @path = path.sub(/^\//,'')
5
+ @method = method.to_s.upcase
6
+ end
7
+
8
+ def match?(route)
9
+ # Immediately stop checking when the request method: GET, POST, ANY, etc
10
+ # doesnt match.
11
+
12
+ return false if method != route.method && route.method != "ANY"
13
+
14
+ route_path = route.path
15
+
16
+ if path == route_path
17
+ # regular string match detection
18
+ return true # exact route matches are highest precedence
19
+ end
20
+
21
+ # Check path for route capture and wildcard matches:
22
+ # A colon (:) means the variable has a variable
23
+ if route_path.include?(':') # 2nd highest precedence
24
+ capture_detection(route_path, path) # early return true or false
25
+ # A star (*) means the variable has a glob
26
+ elsif route_path.include?('*') # lowest precedence
27
+ proxy_detection(route_path, path) # early return true or false
28
+ else
29
+ false # reach here, means no route matched
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ attr_reader :path, :method
36
+
37
+ # catchall/globbing/wildcard/proxy routes. Examples:
38
+ #
39
+ # get "files/*path", to: "files#show"
40
+ # get "others/*rest", to: "others#show"
41
+ # get "*catchall", to: "public_files#show" # last catchall route for Jets
42
+ #
43
+ def proxy_detection(route_path, actual_path)
44
+ # drop the proxy_segment
45
+ leading_path = route_path.split('/')[0..-2].join('/')
46
+
47
+ # get "*catchall", to: "public_files#show"
48
+ if leading_path.empty? # This is the last catchall route "*catchall"
49
+ return true # always return true here because the entire path
50
+ # will always match
51
+ end
52
+
53
+ # Other types of wildcard route:
54
+ #
55
+ # get "files/*path", to: "files#show"
56
+ # get "others/*rest", to: "others#show"
57
+ unless leading_path.ends_with?('/')
58
+ # Ensure trailing slash to make pattern matching stricter
59
+ leading_path = "#{leading_path}/"
60
+ end
61
+
62
+ pattern = "^#{leading_path}"
63
+ regexp = Regexp.new(pattern)
64
+ !!regexp.match(actual_path) # could be true or false
65
+ end
66
+
67
+ def capture_detection(route_path, actual_path)
68
+ # changes path to a string used for a regexp
69
+ # posts/:id/edit => posts\/(.*)\/edit
70
+ regexp_string = route_path.split('/').map do |s|
71
+ s.include?(':') ? Jets::Router::Route::CAPTURE_REGEX : s
72
+ end.join('\/')
73
+ # make sure beginning and end of the string matches
74
+ regexp_string = "^#{regexp_string}$"
75
+
76
+ regexp = Regexp.new(regexp_string)
77
+
78
+ !!regexp.match(actual_path) # could be true or false
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,99 @@
1
+ class Jets::Router::MethodCreator
2
+ class Code
3
+ include Jets::Router::Util
4
+
5
+ def initialize(options, scope, controller, action=nil)
6
+ @options, @scope, @controller, @action = options, scope, controller, action
7
+ @path, @as = options[:path], options[:as]
8
+ end
9
+
10
+ def meth_args
11
+ params = full_path.split('/').select { |x| x.include?(':') }
12
+ items = params.map { |x| x.sub(':','') }
13
+
14
+ items.empty? ? nil : "("+items.join(', ')+")"
15
+ end
16
+
17
+ def meth_result
18
+ results = full_path.split('/').map do |x|
19
+ if x.include?(':')
20
+ variable = x.sub(':','')
21
+ "\#{#{variable}.to_param}"
22
+ else
23
+ x
24
+ end
25
+ end
26
+
27
+ '/' + results.join('/') unless results.empty?
28
+ end
29
+
30
+ def full_path
31
+ route = Jets::Router::Route.new(@options, @scope)
32
+ route.compute_path
33
+ end
34
+
35
+ def action
36
+ @action || self.class.name.split('::').last.downcase # MethodCreator::Edit, MethodCreator::New, etc
37
+ end
38
+
39
+ def full_as
40
+ @scope&.full_as
41
+ end
42
+
43
+ # The method_name_leaf is used to generate method names.
44
+ # Can be nil because sometimes the name is fully acquired from the scope.
45
+ def method_name_leaf
46
+ unless %w[resource resources].include?(@scope.from.to_s) && @options[:from_scope]
47
+ @controller
48
+ end
49
+ end
50
+
51
+ def full_meth_name(suffix=nil)
52
+ as = @as || meth_name
53
+ name = [as, suffix].compact.join('_')
54
+ underscore(name)
55
+ end
56
+
57
+ def path_method
58
+ return if @as == :disabled
59
+ <<~EOL
60
+ def #{full_meth_name(:path)}#{meth_args}
61
+ "#{meth_result}"
62
+ end
63
+ EOL
64
+ end
65
+
66
+ def url_method
67
+ return if @as == :disabled
68
+ path_method_call = "#{full_meth_name(:path)}#{meth_args}"
69
+ # Note: It is important lazily get the value of ENV['JETS_HOST'] within the method.
70
+ # Since it is not set until the request goes through the main middleware.
71
+ <<~EOL
72
+ def #{full_meth_name(:url)}#{meth_args}
73
+ "\#{ENV['JETS_HOST']}\#{#{path_method_call}}"
74
+ end
75
+ EOL
76
+ end
77
+
78
+ def param_name(name)
79
+ # split('/').last for case:
80
+ #
81
+ # resources :posts, prefix: "articles", only: :index do
82
+ # resources :comments, only: :new
83
+ # end
84
+ #
85
+ # Since the prefix at the scope level is added to the posts item, which results in:
86
+ #
87
+ # param_name("articles/posts")
88
+ #
89
+ # We drop the articles prefix portion. The resources items can only be words with no /.
90
+ #
91
+ name.to_s.split('/').last.singularize + "_id"
92
+ end
93
+
94
+ private
95
+ def singularize(s)
96
+ s&.singularize
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,12 @@
1
+ class Jets::Router::MethodCreator
2
+ class Edit < Code
3
+ def meth_name
4
+ path_items = @path.to_s.split('/')
5
+ if method_name_leaf && path_items.size != 3
6
+ nil # fallback: do not define url method
7
+ else # comes from resources
8
+ join(action, singularize(full_as), singularize(method_name_leaf))
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ class Jets::Router::MethodCreator
2
+ class Generic < Code
3
+ def meth_name
4
+ @options[:as]
5
+ end
6
+
7
+ def path_method
8
+ super if @options[:as]
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,48 @@
1
+ class Jets::Router::MethodCreator
2
+ class Index < Code
3
+ def meth_name
4
+ # TODO: figure out how to improve this and make easier to follow.
5
+ #
6
+ # Example 1:
7
+ #
8
+ # resources :users, only: [] do
9
+ # resources :posts, only: :index
10
+ # end
11
+ #
12
+ # Results in:
13
+ #
14
+ # full_as: user_posts
15
+ # method_name_leaf: nil
16
+ #
17
+ # Example 2:
18
+ #
19
+ # resources :users, only: [] do
20
+ # get "posts", to: "posts#index"
21
+ # end
22
+ #
23
+ # Results in:
24
+ #
25
+ # full_as: users
26
+ # method_name_leaf: posts
27
+ #
28
+ # This is because using resources contains all the info we need in parent scopes.
29
+ # The scope.full_as already has the desired meth_name.
30
+ #
31
+ # However, when using the simple create_route methods like get, the parent scope does not contain
32
+ # all the info we need. In this tricky case, the method_name_leaf is set.
33
+ # We then have to reconstruct the meth_name.
34
+ #
35
+
36
+ if method_name_leaf
37
+ path_items = @path.to_s.split('/')
38
+ if path_items.size == 1
39
+ join(singularize(full_as), method_name_leaf) # reconstruct
40
+ else
41
+ nil # fallback: do not define url method
42
+ end
43
+ else # comes from resources
44
+ join(full_as) # construct entirely from scope info
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,12 @@
1
+ class Jets::Router::MethodCreator
2
+ class New < Code
3
+ def meth_name
4
+ path_items = @path.to_s.split('/')
5
+ if method_name_leaf && path_items.size != 2
6
+ nil # fallback: do not define url method
7
+ else # comes from resources
8
+ join(action, singularize(full_as), singularize(method_name_leaf))
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ class Jets::Router::MethodCreator
2
+ class Root < Code
3
+ def meth_name
4
+ "root"
5
+ end
6
+
7
+ def meth_args
8
+ nil
9
+ end
10
+
11
+ def meth_result
12
+ nil
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ class Jets::Router::MethodCreator
2
+ class Show < Code
3
+ def meth_name
4
+ path_items = @path.to_s.split('/')
5
+ if method_name_leaf && path_items.size != 2
6
+ nil # fallback: do not define url method
7
+ else # comes from resources
8
+ join(singularize(full_as), singularize(method_name_leaf))
9
+ end
10
+ end
11
+ end
12
+ end