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,145 @@
1
+ require "thor"
2
+
3
+ # Override thor's long_desc identation behavior
4
+ # https://github.com/erikhuda/thor/issues/398
5
+ class Thor
6
+ module Shell
7
+ class Basic
8
+ def print_wrapped(message, options = {})
9
+ message = "\n#{message}" unless message.starts_with?("\n")
10
+ stdout.puts message
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ class Jets::Commands::Base < Thor
17
+ class << self
18
+ extend Memoist
19
+
20
+ # thor_args is an array of commands. Examples:
21
+ # ["help"]
22
+ # ["dynamodb:migrate"]
23
+ #
24
+ # Same signature as RakeCommand.perform. Not using full_command.
25
+ def perform(full_command, thor_args)
26
+ config = {} # doesnt seem like config is used
27
+ dispatch(nil, thor_args, nil, config)
28
+ end
29
+
30
+ # Hacky way to handle error for 'jets new' when no project name is passed in to avoid
31
+ # this error:
32
+ #
33
+ # required arguments 'project_name' (Thor::RequiredArgumentMissingError)
34
+ def dispatch(command, given_args, given_opts, config)
35
+ if given_args.reject{|s| s =~ /^-/} == ['new'] # user forgot to pass a project name
36
+ given_args = ['help', 'new']
37
+ end
38
+ super
39
+ end
40
+
41
+ # Track all command subclasses.
42
+ def subclasses
43
+ @subclasses ||= []
44
+ end
45
+
46
+ def inherited(base)
47
+ super
48
+
49
+ if base.name
50
+ self.subclasses << base
51
+ end
52
+ end
53
+
54
+ # Fully qualifed task names. Examples:
55
+ # build
56
+ # process:controller
57
+ # dynamodb:migrate:down
58
+ def namespaced_commands
59
+ eager_load!
60
+ subclasses.map do |klass|
61
+ # This all_tasks is part of Thor not the lambda/dsl.rb
62
+ klass.all_tasks.keys.map do |task_name|
63
+ klass = klass.to_s.sub('Jets::Commands::','')
64
+ namespace = klass =~ /^Main/ ? nil : klass.underscore.gsub('/',':')
65
+ [namespace, task_name].compact.join(':')
66
+ end
67
+ end.flatten.sort
68
+ end
69
+
70
+ # Use Jets banner instead of Thor to account for namespaces in commands.
71
+ def banner(command, namespace = nil, subcommand = false)
72
+ namespace = namespace_from_class(self)
73
+ command_name = command.usage # set with desc when defining tht Thor class
74
+ namespaced_command = [namespace, command_name].compact.join(':')
75
+
76
+ "jets #{namespaced_command}"
77
+ end
78
+
79
+ def namespace_from_class(klass)
80
+ namespace = klass.to_s.sub('Jets::Commands::', '').underscore.gsub('/',':')
81
+ namespace unless namespace == "main"
82
+ end
83
+
84
+ def help_list(all=false)
85
+ # hack to show hidden comands when requested
86
+ Thor::HiddenCommand.class_eval do
87
+ def hidden?; false; end
88
+ end if all
89
+
90
+ list = []
91
+ eager_load!
92
+ subclasses.each do |klass|
93
+ commands = klass.printable_commands(true, false)
94
+ commands.reject! { |array| array[0].include?(':help') }
95
+ list += commands
96
+ end
97
+
98
+ list.sort_by! { |array| array[0] }
99
+ end
100
+
101
+ def klass_from_namespace(namespace)
102
+ if namespace.nil?
103
+ Jets::Commands::Main
104
+ else
105
+ class_name = namespace.gsub(':','/')
106
+ class_name = "Jets::Commands::#{class_name.camelize}"
107
+ class_name.constantize
108
+ end
109
+ end
110
+
111
+ # If this fails to find a match then return the original full command
112
+ def autocomplete(full_command)
113
+ return nil if full_command.nil? # jets help
114
+
115
+ eager_load!
116
+
117
+ words = full_command.split(':')
118
+ namespace = words[0..-2].join(':') if words.size > 1
119
+ command = words.last
120
+
121
+ # Thor's normalize_command_name autocompletes the command but then we need to add the namespace back
122
+ begin
123
+ thor_subclass = klass_from_namespace(namespace) # could NameError
124
+ command = thor_subclass.normalize_command_name(command) # could Thor::AmbiguousCommandError
125
+ [namespace, command].compact.join(':')
126
+ rescue NameError
127
+ full_command # return original full_command
128
+ rescue Thor::AmbiguousCommandError => e
129
+ puts "Unable to autodetect the command name. #{e.message}."
130
+ full_command # return original full_command
131
+ end
132
+ end
133
+
134
+ # For help menu to list all commands, we must eager load the command classes.
135
+ #
136
+ # There is special eager_load logic here because this is called super early as part of the CLI start.
137
+ # We cannot assume we have full access to to the project yet.
138
+ def eager_load!
139
+ return if Jets::Turbo.afterburner?
140
+
141
+ Jets::Autoloaders.cli.eager_load
142
+ end
143
+ memoize :eager_load!
144
+ end
145
+ end
@@ -0,0 +1,252 @@
1
+ require 'digest'
2
+
3
+ module Jets::Commands
4
+ class Build
5
+ include StackInfo
6
+
7
+ def initialize(options)
8
+ @options = options.dup
9
+ end
10
+
11
+ def run
12
+ puts "Building project for Lambda..."
13
+
14
+ return if @options[:noop]
15
+ # run gets called from the CLI and does not have all the stack_options yet.
16
+ # We compute it and change the options early here.
17
+ @options.merge!(stack_type: stack_type, s3_bucket: s3_bucket)
18
+ build
19
+ end
20
+
21
+ def build
22
+ build_code unless @options[:templates]
23
+ build_templates
24
+ end
25
+
26
+ def build_code
27
+ Jets::Builders::CodeBuilder.new.build unless @options[:noop]
28
+ end
29
+
30
+ def build_templates
31
+ puts "Building CloudFormation templates."
32
+ clean_templates
33
+ build_minimal_template
34
+ build_all_templates if full?
35
+ puts "Generated CloudFormation templates at #{Jets.build_root}/templates"
36
+ end
37
+
38
+ def full?
39
+ @options[:templates] || @options[:stack_type] == :full
40
+ end
41
+
42
+ def build_all_templates
43
+ # CloudFormation templates
44
+ # 1. Shared and authorizer templates - child templates needs them
45
+ build_api_gateway_templates
46
+ build_authorizer_templates # controllers can use these
47
+ # 2. Child templates - parent template needs them
48
+ build_app_child_templates
49
+ # 2. Child templates - parent template needs them
50
+ build_shared_resources_templates
51
+ # 4. Finally parent template
52
+ build_parent_template # must be called at the end
53
+ end
54
+
55
+ def build_minimal_template
56
+ Jets::Cfn::Builders::ParentBuilder.new(@options).build(parent=true)
57
+ end
58
+
59
+ def build_api_gateway_templates
60
+ Jets::Cfn::Builders::ApiGatewayBuilder.new(@options).build
61
+ Jets::Cfn::Builders::ApiDeploymentBuilder.new(@options).build
62
+ end
63
+
64
+ def build_authorizer_templates
65
+ authorizer_files.each do |path|
66
+ Jets::Cfn::Builders::AuthorizerBuilder.new(path).build
67
+ end
68
+ end
69
+
70
+ def build_app_child_templates
71
+ app_files.each do |path|
72
+ build_child_template(path)
73
+ end
74
+ end
75
+
76
+ def build_shared_resources_templates
77
+ Jets::Stack.subclasses.each do |subclass|
78
+ Jets::Cfn::Builders::SharedBuilder.new(subclass).build
79
+ end
80
+ end
81
+
82
+ # path: app/controllers/comments_controller.rb
83
+ # path: app/jobs/easy_job.rb
84
+ def build_child_template(path)
85
+ return if authorizer?(path) # AuthorizerBuilder is built earlier
86
+
87
+ md = path.match(%r{app/(.*?)/}) # extract: controller, job or function
88
+ process_class = md[1].classify
89
+ builder_class = "Jets::Cfn::Builders::#{process_class}Builder".constantize
90
+
91
+ # Examples:
92
+ # Jets::Cfn::Builders::ControllerBuilder.new(PostsController)
93
+ # Jets::Cfn::Builders::JobBuilder.new(EasyJob)
94
+ # Jets::Cfn::Builders::RuleBuilder.new(CheckRule)
95
+ # Jets::Cfn::Builders::FunctionBuilder.new(Hello)
96
+ # Jets::Cfn::Builders::FunctionBuilder.new(HelloFunction)
97
+ app_class = Jets::Klass.from_path(path)
98
+ if Jets.poly_only? && app_class == Jets::PreheatJob
99
+ return # No prewarm when there's only poly functions
100
+ end
101
+
102
+ builder = builder_class.new(app_class)
103
+ builder.build
104
+ end
105
+
106
+ def authorizer?(path)
107
+ path.include?("app/authorizers")
108
+ end
109
+
110
+ def build_parent_template
111
+ Jets::Cfn::Builders::ParentBuilder.new(@options).build(parent=true)
112
+ end
113
+
114
+ def clean_templates
115
+ FileUtils.rm_rf("#{Jets.build_root}/templates")
116
+ end
117
+
118
+ def app_files
119
+ self.class.app_files
120
+ end
121
+
122
+ def shared_files
123
+ self.class.shared_files
124
+ end
125
+
126
+ def authorizer_files
127
+ self.class.authorizer_files
128
+ end
129
+
130
+ class << self
131
+ # Crucial that the Dir.pwd is in the tmp_code because for because Jets.boot set ups autoload_paths and this is
132
+ # how project classes are loaded.
133
+ # TODO: rework code so that Dir.pwd does not have to be in tmp_code for build to work.
134
+ #
135
+ # app_files used to determine what CloudFormation templates to build.
136
+ # app_files also used to determine what handlers to build.
137
+ def app_files
138
+ paths = []
139
+ expression = "#{Jets.root}/app/**/**/*.rb"
140
+ Dir.glob(expression).each do |path|
141
+ next unless app_file?(path)
142
+ relative_path = path.sub("#{Jets.root}/", '') # rid of the Jets.root at beginning
143
+ paths << relative_path
144
+ end
145
+ paths += internal_app_files
146
+ paths
147
+ end
148
+
149
+ APP_FOLDERS = %w[authorizers controllers functions jobs rules]
150
+ def app_file?(path)
151
+ return false unless File.extname(path) == ".rb"
152
+ return false unless File.file?(path) unless Jets.env.test?
153
+ return false if application_abstract_classes.detect { |p| path.include?(p) }
154
+ return false if concerns?(path)
155
+ return true if APP_FOLDERS.detect { |p| path.include?("app/#{p}") }
156
+ false
157
+ end
158
+
159
+ # Do not define lamda functions for abstract application parent classes. Examples:
160
+ #
161
+ # application_controller.rb
162
+ # application_job.rb
163
+ # application_authorizer.rb
164
+ def application_abstract_classes
165
+ APP_FOLDERS.map { |a| "application_#{a.singularize}.rb" }
166
+ end
167
+
168
+ def concerns?(path)
169
+ path =~ %r{app/\w+/concerns/}
170
+ end
171
+
172
+ def authorizer_files
173
+ app_files.select { |p| p.include?("app/authorizers") }
174
+ end
175
+
176
+ def shared_files
177
+ find_app_paths("shared/resources")
178
+ end
179
+
180
+ def find_app_paths(app_path)
181
+ paths = []
182
+ expression = "#{Jets.root}/app/#{app_path}/**/*.rb"
183
+ Dir.glob(expression).each do |path|
184
+ return false unless File.file?(path)
185
+
186
+ relative_path = path.sub("#{Jets.root}/", '')
187
+ # Rids of the Jets.root at beginning
188
+ paths << relative_path
189
+ end
190
+ paths
191
+ end
192
+
193
+ # Finds out of the app has polymorphic functions only and zero ruby functions.
194
+ # In this case, we can skip a lot of the ruby related building and speed up the
195
+ # deploy process.
196
+ def poly_only?
197
+ !app_has_ruby? && !shared_has_ruby?
198
+ end
199
+
200
+ def app_has_ruby?
201
+ has_ruby = app_files.detect do |path|
202
+ app_class = Jets::Klass.from_path(path) # IE: PostsController, Jets::PublicController
203
+ langs = app_class.tasks.map(&:lang)
204
+ langs.include?(:ruby) && app_class != Jets::PreheatJob
205
+ end
206
+ !!has_ruby
207
+ end
208
+
209
+ def shared_has_ruby?
210
+ has_ruby = false
211
+ Jets::Stack.subclasses.each do |klass|
212
+ klass.functions.each do |fun|
213
+ if fun.lang == :ruby
214
+ has_ruby = true
215
+ break
216
+ end
217
+ end
218
+ end
219
+ has_ruby
220
+ end
221
+
222
+ # Add internal Jets controllers if they are being used
223
+ # TODO: Interesting, this eventually just used to generate handlers and controllers only.
224
+ # Maybe rename to make that clear.
225
+ # The copying of other internal files like views is done in builders/code_builder.rb copy_internal_jets_code
226
+ def internal_app_files
227
+ paths = []
228
+ internal = File.expand_path("../internal", __dir__)
229
+
230
+ controllers = "#{internal}/app/controllers/jets"
231
+ paths << "#{controllers}/public_controller.rb" if router_has?("Jets::PublicController")
232
+ paths << "#{controllers}/rack_controller.rb" if router_has?("Jets::RackController")
233
+ paths << "#{controllers}/mailers_controller.rb" if router_has?("Jets::MailersController")
234
+ paths << "#{controllers}/mount_controller.rb" if router_has?("Jets::MountController")
235
+
236
+ if Jets.config.prewarm.enable
237
+ paths << "#{internal}/app/jobs/jets/preheat_job.rb"
238
+ end
239
+
240
+ paths
241
+ end
242
+
243
+ def router_has?(controller)
244
+ Jets::Router.has_controller?(controller)
245
+ end
246
+
247
+ def tmp_code(full_build_path=false)
248
+ full_build_path ? "#{Jets.build_root}/stage/code" : "stage/code"
249
+ end
250
+ end
251
+ end
252
+ end
@@ -0,0 +1,96 @@
1
+ class Jets::Commands::Call
2
+ class AnonymousGuesser < BaseGuesser
3
+ def detect_class_name
4
+ found_path = function_paths.find do |path|
5
+ File.exist?("#{Jets.root}/#{path}")
6
+ end
7
+
8
+ klass = Jets::Klass.from_path(found_path) if found_path
9
+ klass.to_s
10
+ end
11
+
12
+ def method_name
13
+ return @method_name if defined?(@method_name)
14
+
15
+ full_function_name = @provided_function_name.underscore
16
+ underscored_class_name = class_name.underscore
17
+ meth = full_function_name.sub("#{underscored_class_name}_","")
18
+
19
+ if meth == class_name.constantize.handler.to_s
20
+ @method_name = meth
21
+ else
22
+ @method_name_error = "#{class_name} class found but #{meth} method not found"
23
+ @method_name = nil
24
+ end
25
+ end
26
+
27
+ # Useful to printing out what was attempted to look up
28
+ def error_message
29
+ guess_paths = function_paths
30
+ puts "Unable to find the function to call."
31
+ if class_name and !method_name
32
+ puts @method_name_error
33
+ else
34
+ puts "Tried: #{guess_paths.join(', ')}"
35
+ end
36
+ end
37
+
38
+ def function_filenames(meth=nil, primary_namespace=nil)
39
+ guesses = []
40
+ parts = meth.split('_')
41
+
42
+ if primary_namespace.nil?
43
+ guesses << meth
44
+
45
+ if parts.size == 1 # already on final_primary_namespace
46
+ return guesses # end of recursion
47
+ else
48
+ next_primary_namespace = parts.first
49
+ guesses += function_filenames(meth, next_primary_namespace) # start of recursion
50
+ return guesses # return early
51
+ end
52
+ end
53
+
54
+ next_meth = meth.sub("#{primary_namespace}_", '')
55
+ next_parts = next_meth.split('_')
56
+
57
+ # Takes the next_parts and creates guesses with the parts joined by '/'
58
+ # with the primary_namespace prepended. So if next_parts is
59
+ # ["long", "name", "function"] and primary_namespace is "complex"
60
+ #
61
+ # guesses that get added:
62
+ #
63
+ # [
64
+ # "complex/long_name_function",
65
+ # "complex/long/name_function",
66
+ # "complex/long/name/function",
67
+ # ]
68
+ n = next_parts.size + 1
69
+ next_parts.size.times do |i|
70
+ namespace = i == 0 ? nil : next_parts[0..i-1].join('/')
71
+ class_path = next_parts[i..-1].join('_')
72
+ guesses << [primary_namespace, namespace, class_path].compact.join('/')
73
+ end
74
+
75
+ final_primary_namespace = parts[0..-2].join('_')
76
+ if primary_namespace == final_primary_namespace
77
+ return guesses # end of recursion
78
+ else
79
+ namespace_size = parts.size - next_parts.size
80
+ next_primary_namespace = parts[0..namespace_size].join('_')
81
+ guesses += function_filenames(meth, next_primary_namespace)
82
+ return guesses
83
+ end
84
+ end
85
+
86
+ def function_paths
87
+ # drop the last word for starting filename
88
+ starting_filename = @provided_function_name.underscore.split('_')[0..-2].join('_')
89
+ filenames = function_filenames(starting_filename)
90
+ filenames.map do |name|
91
+ "app/functions/#{name}.rb"
92
+ end
93
+ end
94
+
95
+ end
96
+ end
@@ -0,0 +1,136 @@
1
+ class Jets::Commands::Call
2
+ class AutoloadGuesser < BaseGuesser
3
+ def detect_class_name
4
+ # First guess the class name assuming simple
5
+ class_name = simple_detect_class_name
6
+ return class_name if class_name
7
+
8
+ guess_classes.each do |class_name_guess|
9
+ begin
10
+ class_name_guess.constantize
11
+ return class_name_guess # if there's no error then the class is found
12
+ rescue NameError
13
+ if out_of_guesses(class_name_guess)
14
+ # puts "Unable to find the class to call. Tried guessing: #{guess_classes[0..-2].join(', ')}."
15
+ # raise # re-raise NameError for now but maybe better to provide
16
+ # a custom error class, so we can rescue it and provide a
17
+ # friendly message to the user
18
+ else
19
+ next
20
+ end
21
+ end
22
+ end
23
+
24
+ nil
25
+ end
26
+
27
+ # Can guess name by looking at underscore and dashes.
28
+ #
29
+ # Example:
30
+ #
31
+ # @provided_function_name: first_module-lost_controller-index
32
+ # return: FirstModule::LostController
33
+ #
34
+ def simple_detect_class_name
35
+ parts = @provided_function_name.split('-')
36
+ namespace = parts[0..-3].join('/')
37
+ controller = parts[-2..-2] # dont include the action
38
+ class_name = [namespace, controller].reject {|s| s.empty?}.compact.join('/').camelize
39
+ begin
40
+ class_name.constantize
41
+ return class_name
42
+ rescue NameError
43
+ nil
44
+ end
45
+ end
46
+
47
+ def method_name
48
+ return @method_name if defined?(@method_name)
49
+ return nil unless class_name
50
+
51
+ underscored_class_name = class_name.underscore.gsub('/','_')
52
+ underscored_function_name = @provided_function_name.underscore.gsub('/','_')
53
+ meth = underscored_function_name.sub(underscored_class_name, '')
54
+ meth = meth.sub(/^[-_]/,'') # remove leading _ or -
55
+
56
+ if class_name.constantize.tasks.map(&:meth).include?(meth.to_sym)
57
+ @method_name = meth
58
+ else
59
+ @method_name_error ="#{class_name} class found but #{meth} method not found"
60
+ @method_name = nil
61
+ end
62
+ end
63
+
64
+ # Useful to printing out what was attempted to look up
65
+ def error_message
66
+ guesses = guess_classes
67
+ puts "Unable to find the function to call."
68
+ if class_name and !method_name
69
+ puts @method_name_error
70
+ else
71
+ puts "Tried: #{guesses.join(', ')}"
72
+ end
73
+ end
74
+
75
+ def process_type
76
+ if @provided_function_name =~ /[-_]controller/
77
+ "controller"
78
+ elsif @provided_function_name =~ /[-_]job/
79
+ "job"
80
+ elsif @provided_function_name =~ /[-_]rule/
81
+ "rule"
82
+ else
83
+ "function"
84
+ end
85
+ end
86
+
87
+ def process_type_pattern
88
+ Regexp.new("[-_]#{process_type}[-_](.*)")
89
+ end
90
+
91
+ # Strips the action because we dont want it to guess the class name
92
+ # So:
93
+ # admin-related-pages => admin_related_pages_controller
94
+ def underscored_name
95
+ # strip action and concidentally the _controller_ string
96
+ name = @provided_function_name.sub(process_type_pattern,'')
97
+ # Ensure _controller or _job at the end except for simple functions
98
+ unless process_type == "function"
99
+ name = name.gsub('-','_') + "_#{process_type}"
100
+ end
101
+ name
102
+ end
103
+
104
+ # Guesses autoload paths.
105
+ #
106
+ # underscored_name: admin_related_pages_controller
107
+ # Returns:
108
+ # [
109
+ # "admin_related_pages_controller",
110
+ # "admin/related_pages_controller",
111
+ # "admin_related/pages_controller",
112
+ # "admin_related_pages/controller",
113
+ # ]
114
+ def autoload_paths
115
+ guesses = []
116
+
117
+ parts = underscored_name.split('_')
118
+ parts.size.times do |i|
119
+ namespace = i == 0 ? nil : parts[0..i-1].join('/')
120
+ class_path = parts[i..-1].join('_')
121
+ guesses << [namespace, class_path].compact.join('/')
122
+ end
123
+
124
+ guesses
125
+ end
126
+
127
+ def guess_classes
128
+ autoload_paths.map(&:classify)
129
+ end
130
+
131
+ def out_of_guesses(guess)
132
+ guess.include?("::Controller")
133
+ end
134
+
135
+ end
136
+ end
@@ -0,0 +1,62 @@
1
+ # Subclasses of BaseGuessor must implement interface:
2
+ # detect_class_name
3
+ # method_name
4
+ # error_message
5
+ #
6
+ class Jets::Commands::Call
7
+ class BaseGuesser
8
+ include Jets::AwsServices
9
+
10
+ # provided_function_name:
11
+ # admin/related_pages_controller-list_all
12
+ # admin-related-pages-controller-list-all
13
+ def initialize(provided_function_name)
14
+ @provided_function_name = provided_function_name
15
+ end
16
+
17
+ def class_name
18
+ return @class_name if @detection_ran
19
+
20
+ @class_name = detect_class_name
21
+ @detection_ran = true
22
+ @class_name
23
+ end
24
+
25
+ def function_name
26
+ # Strip the project namespace if the user has accidentally added it
27
+ # Since we're going to automatically add it no matter what at the end
28
+ # and dont want the namespace to be included twice
29
+ @provided_function_name = @provided_function_name.sub("#{Jets.config.project_namespace}-", "")
30
+
31
+ code_path = class_name.underscore.gsub('/','-')
32
+ function_name = [Jets.config.project_namespace, code_path, method_name].join('-')
33
+ generated_function_name(function_name)
34
+ end
35
+
36
+ def generated_function_name(function_name)
37
+ if function_name.size > Jets::MAX_FUNCTION_NAME_SIZE # name generated by CloudFormation
38
+ logical_id = @class_name.gsub('::','')
39
+
40
+ parent_resources = stack_resources(parent_stack.stack_id)
41
+ app_stack = parent_resources.find { |s| s.logical_resource_id == logical_id }
42
+
43
+ resources = stack_resources(app_stack.physical_resource_id)
44
+ resource = resources.find { |r| r.logical_resource_id == method_name.camelize + "LambdaFunction" } # method_name only contains the method
45
+ resource.physical_resource_id # actual function name
46
+ else
47
+ function_name
48
+ end
49
+ end
50
+
51
+ # Class variable caches
52
+ @@stack_resources = {}
53
+ def stack_resources(stack_name)
54
+ @@stack_resources[stack_name] ||= cfn.describe_stack_resources(stack_name: stack_name).stack_resources
55
+ end
56
+
57
+ @@parent_stack = nil
58
+ def parent_stack
59
+ @@parent_stack ||= cfn.describe_stacks(stack_name: Jets::Naming.parent_stack_name).stacks.first
60
+ end
61
+ end
62
+ end