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,105 @@
1
+ require 'fileutils'
2
+
3
+ # This class tries to be idempotent, so users should be able to run it multiple times safely.
4
+ module Jets::Commands
5
+ class Upgrade
6
+ def initialize(options)
7
+ @options = options
8
+ end
9
+
10
+ def run
11
+ puts "Upgrading to Jets structure to latest version"
12
+ Version1.new.run
13
+ # version 2 upgrades
14
+ inject_csrf_meta_tags
15
+ update_crud_js
16
+ update_config_application_rb
17
+ update_autoload_paths_config
18
+ puts "Upgrade complete."
19
+ end
20
+
21
+ def inject_csrf_meta_tags
22
+ layout = "app/views/layouts/application.html.erb"
23
+ return unless File.exist?(layout)
24
+
25
+ lines = IO.readlines(layout)
26
+ csrf_meta_tags = lines.find { |l| l =~ /<%= csrf_meta_tags %>/ }
27
+ return if csrf_meta_tags
28
+
29
+ puts "Update: #{layout} with csrf_meta_tags helper"
30
+ lines.map! do |line|
31
+ if line.include?("<head>")
32
+ # add csrf_meta_tags helper
33
+ "#{line} <%= csrf_meta_tags %>\n"
34
+ else
35
+ line
36
+ end
37
+ end
38
+
39
+ content = lines.join
40
+ IO.write(layout, content)
41
+ end
42
+
43
+ def update_crud_js
44
+ src = File.expand_path("templates/webpacker/app/javascript/src/jets/crud.js", File.dirname(__FILE__))
45
+ dest = "app/javascript/src/jets/crud.js"
46
+ return unless File.exist?(dest)
47
+
48
+ lines = IO.readlines(dest)
49
+ csrf = lines.find { |l| l =~ /csrf-token/ }
50
+ return if csrf
51
+
52
+ FileUtils.mkdir_p(File.dirname(dest))
53
+ FileUtils.cp(src, dest)
54
+ puts "Update: #{dest}"
55
+ end
56
+
57
+ def update_config_application_rb
58
+ app_rb = "config/application.rb"
59
+ lines = IO.readlines(app_rb)
60
+ api_mode = lines.find { |l| l =~ /config\.mode/ && l =~ /api/ }
61
+ return unless api_mode
62
+
63
+ forgery = lines.find { |l| l =~ /default_protect_from_forgery/ }
64
+ return if forgery
65
+
66
+ lines.map! do |line|
67
+ if line =~ /^end/
68
+ # add default_protect_from_forgery = false
69
+ " config.controllers.default_protect_from_forgery = false\n#{line}"
70
+ else
71
+ line
72
+ end
73
+ end
74
+
75
+ content = lines.join
76
+ IO.write(app_rb, content)
77
+ puts "Update: #{app_rb} with default_protect_from_forgery"
78
+ end
79
+
80
+ def update_autoload_paths_config
81
+ app_rb = "config/application.rb"
82
+ lines = IO.readlines(app_rb)
83
+
84
+ new_config = lines.find { |l| l.include?('config.autoload_paths') }
85
+ return if new_config
86
+
87
+ old_config = lines.find { |l| l.include?('config.extra_autoload_paths') }
88
+ return unless old_config
89
+
90
+ lines.map! do |line|
91
+ md = line.match(/config\.extra_autoload_paths(.*)/)
92
+ if md
93
+ rest = md[1]
94
+ " config.autoload_paths#{rest}"
95
+ else
96
+ line
97
+ end
98
+ end
99
+
100
+ content = lines.join
101
+ IO.write(app_rb, content)
102
+ puts "Update: #{app_rb} with config.autoload_paths"
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,69 @@
1
+ module Jets::Commands
2
+ class Url
3
+ include Jets::AwsServices
4
+
5
+ def initialize(options)
6
+ @options = options
7
+ end
8
+
9
+ def display
10
+ stack_name = Jets::Naming.parent_stack_name
11
+ unless stack_exists?(stack_name)
12
+ puts "Stack for #{Jets.config.project_name.color(:green)} project for environment #{Jets.env.color(:green)}. Couldn't find #{stack_name.color(:green)} stack."
13
+ exit
14
+ end
15
+
16
+ stack = cfn.describe_stacks(stack_name: stack_name).stacks.first
17
+
18
+ api_gateway_stack_arn = lookup(stack[:outputs], "ApiGateway")
19
+ if api_gateway_stack_arn && endpoint_available?
20
+ api_gateway_endpoint = get_gateway_endpoint(api_gateway_stack_arn)
21
+ STDOUT.puts "API Gateway Endpoint: #{api_gateway_endpoint}"
22
+ show_custom_domain
23
+ else
24
+ puts "API Gateway not found. This jets app does have an API Gateway associated with it. Please double check your config/routes.rb if you were expecting to see a url for the app. Also check that #{stack_name.color(:green)} is a jets app."
25
+ end
26
+ end
27
+
28
+ def get_gateway_endpoint(api_gateway_stack_arn)
29
+ stack = cfn.describe_stacks(stack_name: api_gateway_stack_arn).stacks.first
30
+ rest_api = lookup(stack[:outputs], "RestApi")
31
+ region_id = lookup(stack[:outputs], "Region")
32
+ stage_name = Jets::Resource::ApiGateway::Deployment.stage_name
33
+
34
+ # https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-call-api.html
35
+ # https://my-api-id.execute-api.region-id.amazonaws.com/stage-name/{resourcePath}
36
+ "https://#{rest_api}.execute-api.#{region_id}.amazonaws.com/#{stage_name}"
37
+ end
38
+
39
+ def show_custom_domain
40
+ return unless endpoint_available? && Jets.custom_domain? && Jets.config.domain.route53
41
+
42
+ domain_name = Jets::Resource::ApiGateway::DomainName.new
43
+ # Looks funny but its right.
44
+ # domain_name is a method on the Jets::Resource::ApiGateway::Domain instance
45
+ url = "https://#{domain_name.domain_name}"
46
+ puts "Custom Domain: #{url}"
47
+ puts "App Domain: #{Jets.config.app.domain}" if Jets.config.app.domain
48
+ end
49
+
50
+ def endpoint_unavailable?
51
+ return false if Jets::Router.routes.empty?
52
+ resp, status = stack_status
53
+ return false if status.include?("ROLLBACK")
54
+ end
55
+
56
+ def endpoint_available?
57
+ !endpoint_unavailable?
58
+ end
59
+
60
+ # All CloudFormation states listed here:
61
+ # http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html
62
+ def stack_status
63
+ resp = cfn.describe_stacks(stack_name: @parent_stack_name)
64
+ status = resp.stacks[0].stack_status
65
+ [resp, status]
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,18 @@
1
+ require 'thor'
2
+
3
+ # These commands are ran after rake webpacker:install to enhance the generated
4
+ # javascript assets to support Jets.
5
+ # Done this way so it works for both jets new and jets webpacker:install
6
+ class Jets::Commands::WebpackerTemplate < Thor::Group
7
+ include Thor::Actions
8
+
9
+ class_option :force, desc: "Bypass confirmation and overwrite existing files."
10
+ class_option :bootstrap, type: :boolean, default: true, desc: "Install bootstrap"
11
+ def self.source_root
12
+ File.expand_path("templates/webpacker", File.dirname(__FILE__))
13
+ end
14
+
15
+ def reapply_templates
16
+ directory "app/javascript", "app/javascript", force: options[:force]#, bootstrap: options[:bootstrap]
17
+ end
18
+ end
@@ -0,0 +1,91 @@
1
+ class Jets::Controller
2
+ module Authorization
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ class_attribute :auth_type,
7
+ :auth_to,
8
+ :auth_options, # for only and except filters
9
+ :api_key_needed,
10
+ :authorization_scopes_value
11
+ end
12
+
13
+ class_methods do
14
+ def controller_path
15
+ name.sub(/Controller$/, "".freeze).underscore
16
+ end
17
+
18
+ def authorization_type(value=nil)
19
+ if !value.nil?
20
+ self.auth_type = value
21
+ else
22
+ self.auth_type
23
+ end
24
+ end
25
+
26
+ def authorizer(value=nil, options={})
27
+ if !value.nil?
28
+ self.auth_to = value # IE: main#protect
29
+ self.auth_options = options # IE: only: %w[index] or expect: [:show]
30
+ else
31
+ self.auth_to
32
+ end
33
+ end
34
+
35
+ def authorization_scopes(value=nil)
36
+ if !value.nil?
37
+ self.authorization_scopes_value = value
38
+ else
39
+ self.authorization_scopes_value
40
+ end
41
+ end
42
+
43
+ def authorizer_metadata
44
+ Jets::Router::Route::Authorizer.metadata(auth_to)
45
+ end
46
+
47
+ # Used to add to parameter to controller templates
48
+ def authorizer_id
49
+ Jets::Router::Route::Authorizer.logical_id(auth_to)
50
+ end
51
+
52
+ # Used to add to the API::Gateway Method selectively
53
+ def authorizer_logical_id_for(action_name)
54
+ return unless auth_to
55
+
56
+ only = auth_options[:only].map(&:to_s) if auth_options && auth_options[:only]
57
+ except = auth_options[:except].map(&:to_s) if auth_options && auth_options[:except]
58
+
59
+ if except and !except.include?(action_name)
60
+ logical_id = Jets::Router::Route::Authorizer.logical_id(auth_to)
61
+ end
62
+
63
+ # only overrides except
64
+ if only and only.include?(action_name)
65
+ logical_id = Jets::Router::Route::Authorizer.logical_id(auth_to)
66
+ end
67
+
68
+ # if both only and except are not set then always set the logical_id
69
+ if !only && !except
70
+ logical_id = Jets::Router::Route::Authorizer.logical_id(auth_to)
71
+ end
72
+
73
+ logical_id
74
+ end
75
+
76
+ # Autoamtically sets authorization_type for the specific route based on the controller authorizer
77
+ def infer_authorization_type_for(action_name)
78
+ return unless authorizer_logical_id_for(action_name)
79
+ Jets::Authorizer::Base.authorization_type(auth_to)
80
+ end
81
+
82
+ def api_key_required(value=nil)
83
+ if !value.nil?
84
+ self.api_key_needed = value
85
+ else
86
+ self.api_key_needed
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,175 @@
1
+ require "json"
2
+ require "rack/utils" # Rack::Utils.parse_nested_query
3
+
4
+ # Controller public methods get turned into Lambda functions.
5
+ class Jets::Controller
6
+ class Base < Jets::Lambda::Functions
7
+ include ActiveSupport::Rescuable
8
+ include Authorization
9
+ include Callbacks
10
+ include Cookies
11
+ include ForgeryProtection
12
+ include Jets::Router::Helpers
13
+ include Layout
14
+ include Params
15
+ include Rendering
16
+
17
+ delegate :headers, to: :request
18
+ delegate :set_header, to: :response
19
+ attr_reader :request, :response
20
+ attr_accessor :session
21
+ def initialize(event, context={}, meth)
22
+ super
23
+ @request = Request.new(event, context)
24
+ @response = Response.new
25
+ end
26
+
27
+ # Overrides Base.process
28
+ def self.process(event, context={}, meth)
29
+ controller = new(event, context, meth)
30
+ # Using send because process! is private method in Jets::RackController so
31
+ # it doesnt create a lambda function. It's doesnt matter what scope process!
32
+ # is in Controller::Base because Jets lambda functions inheritance doesnt
33
+ # include methods in Controller::Base.
34
+ # TODO: Can process! be a protected method to avoid this?
35
+ controller.send(:process!)
36
+ end
37
+
38
+ # One key difference between process! vs dispatch!
39
+ #
40
+ # process! - takes the request through the middleware stack
41
+ # dispatch! - does not
42
+ #
43
+ # Most of the time, you want process! instead of dispatch!
44
+ #
45
+ def process!
46
+ adapter = Jets::Controller::Rack::Adapter.new(event, context, meth)
47
+ adapter.rack_vars(
48
+ 'jets.controller' => self,
49
+ 'lambda.context' => context,
50
+ 'lambda.event' => event,
51
+ 'lambda.meth' => meth,
52
+ )
53
+
54
+ # adapter.process calls
55
+ #
56
+ # Jets.application.call(env)
57
+ #
58
+ # and that goes through the middleware stacks. The last middleware stack is Jets::Controller::Middleware::Main
59
+ #
60
+ # class Jets::Controller::Middleware::Main
61
+ # def call!
62
+ # setup
63
+ # @controller.dispatch! # Returns triplet
64
+ # end
65
+ # end
66
+ #
67
+ adapter.process # Returns API Gateway hash structure
68
+ end
69
+
70
+ # One key difference between process! vs dispatch!
71
+ #
72
+ # process! - takes the request through the middleware stack
73
+ # dispatch! - does not
74
+ #
75
+ # dispatch! is useful for megamode or mounted applications
76
+ #
77
+ def dispatch!
78
+ t1 = Time.now
79
+ log_start
80
+
81
+ begin
82
+ if run_before_actions(break_if: -> { @rendered })
83
+ send(@meth)
84
+ action_completed = true
85
+ else
86
+ Jets.logger.info "Filter chain halted as #{@last_callback_name} rendered or redirected"
87
+ end
88
+
89
+ triplet = ensure_render
90
+ run_after_actions if action_completed
91
+ rescue Exception => exception
92
+ rescue_with_handler(exception) || raise
93
+ triplet = ensure_render
94
+ end
95
+
96
+ took = Time.now - t1
97
+ status = triplet[0]
98
+ log_finish(status: status, took: took)
99
+ triplet # status, headers, body
100
+ end
101
+
102
+ # Documented interface method, careful not to rename
103
+ def log_start
104
+ # JSON.dump makes logging look pretty in CloudWatch logs because it keeps it on 1 line
105
+ ip = request.ip
106
+ Jets.logger.info "Started #{@event['httpMethod']} \"#{@event['path']}\" for #{ip} at #{Time.now}"
107
+ Jets.logger.info "Processing #{self.class.name}##{@meth}"
108
+ Jets.logger.info " Event: #{event_log}"
109
+ Jets.logger.info " Parameters: #{JSON.dump(filtered_parameters.to_h)}"
110
+ end
111
+
112
+ # Documented interface method, careful not to rename
113
+ def log_finish(options={})
114
+ status, took = options[:status], options[:took]
115
+ Jets.logger.info "Completed Status Code #{status} in #{took}s"
116
+ end
117
+
118
+ def event_log
119
+ display_event = @event.dup
120
+
121
+ if @event['isBase64Encoded']
122
+ display_event['body'] = '[BASE64_ENCODED]'
123
+ else
124
+ display_event['body'] = parameter_filter.filter_json(display_event['body'])
125
+ end
126
+
127
+ display_event["queryStringParameters"] = parameter_filter.filter(display_event['queryStringParameters'])
128
+ display_event["pathParameters"] = parameter_filter.filter(display_event['pathParameters'])
129
+ json_dump(display_event)
130
+ end
131
+
132
+ # Handles binary data safely
133
+ def json_dump(data)
134
+ JSON.dump(data)
135
+ rescue Encoding::UndefinedConversionError
136
+ data['body'] = '[BINARY]'
137
+ JSON.dump(data)
138
+ end
139
+
140
+ def controller_paths
141
+ paths = []
142
+ klass = self.class
143
+ while klass != Jets::Controller::Base
144
+ paths << klass.controller_path
145
+ klass = klass.superclass
146
+ end
147
+ paths
148
+ end
149
+
150
+ def controller_name
151
+ self.class.to_s.underscore
152
+ end
153
+
154
+ def action_name
155
+ @meth
156
+ end
157
+
158
+ class_attribute :internal_controller
159
+ class << self
160
+ def internal(value=nil)
161
+ if !value.nil?
162
+ self.internal_controller = value
163
+ else
164
+ self.internal_controller
165
+ end
166
+ end
167
+
168
+ def helper_method(*meths)
169
+ meths.each do |meth|
170
+ Jets::Router::Helpers.define_helper_method(meth)
171
+ end
172
+ end
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,73 @@
1
+ # Simpified version of callbacks
2
+ # Does not support if
3
+ class Jets::Controller
4
+ module Callbacks
5
+ extend ActiveSupport::Concern
6
+ included do
7
+ class_attribute :before_actions, default: []
8
+ class_attribute :after_actions, default: []
9
+
10
+ class << self
11
+ def before_action(meth, options = {})
12
+ self.before_actions += [[meth, options]]
13
+ end
14
+
15
+ def prepend_before_action(meth, options = {})
16
+ self.before_actions = [[meth, options]] + self.before_actions
17
+ end
18
+
19
+ def skip_before_action(meth, options = {})
20
+ self.before_actions = before_actions
21
+ .reject { |act| act.first.to_s == meth.to_s }
22
+
23
+ # If options include the `only` option,
24
+ # re-add the action using the setter with the `except` option
25
+ before_action(meth, { except: options[:only] }) if options[:only].present?
26
+ end
27
+
28
+ alias_method :append_before_action, :before_action
29
+
30
+ def after_action(meth, options = {})
31
+ self.after_actions += [[meth, options]]
32
+ end
33
+
34
+ def prepend_after_action(meth, options = {})
35
+ self.after_actions = [[meth, options]] + self.after_actions
36
+ end
37
+
38
+ def skip_after_action(meth)
39
+ self.after_actions = self.after_actions.reject { |el| el.first.to_s == meth.to_s }
40
+ end
41
+
42
+ alias_method :append_after_action, :after_action
43
+ end
44
+ end # included
45
+
46
+ # Instance Methods
47
+ # define run_before_actions and run_after_actions
48
+ # returns true if all actions were run, false if break_if condition yielded `true`
49
+ [:before, :after].each do |type|
50
+ define_method "run_#{type}_actions" do |break_if: nil|
51
+ called_method = @meth.to_sym
52
+ callbacks = self.class.send("#{type}_actions")
53
+ callbacks.each do |array|
54
+ callback, options = array
55
+
56
+ except = options[:except]
57
+ next if except && except.include?(called_method)
58
+
59
+ only = options[:only]
60
+ if only
61
+ send(callback) if only.include?(called_method)
62
+ else
63
+ send(callback)
64
+ end
65
+ @last_callback_name = callback
66
+
67
+ return false if !break_if.nil? && break_if.call
68
+ end
69
+ true
70
+ end
71
+ end
72
+ end # ClassOptions
73
+ end