jets-fs 1.6.10

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 (379) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/bin/commit_docs.sh +26 -0
  3. data/.circleci/config.yml +126 -0
  4. data/.codebuild/README.md +68 -0
  5. data/.codebuild/bin/jets +3 -0
  6. data/.codebuild/buildspec-base.yml +14 -0
  7. data/.codebuild/integration.sh +72 -0
  8. data/.codebuild/jets.postman_collection.json +323 -0
  9. data/.codebuild/scripts/install-docker.sh +12 -0
  10. data/.codebuild/scripts/install-dynamodb-local.sh +22 -0
  11. data/.codebuild/scripts/install-java.sh +22 -0
  12. data/.codebuild/scripts/install-node.sh +4 -0
  13. data/.github/ISSUE_TEMPLATE.md +7 -0
  14. data/.github/ISSUE_TEMPLATE/bug_report.md +73 -0
  15. data/.github/ISSUE_TEMPLATE/documentation.md +27 -0
  16. data/.github/ISSUE_TEMPLATE/feature_request.md +64 -0
  17. data/.github/ISSUE_TEMPLATE/question.md +16 -0
  18. data/.github/PULL_REQUEST_TEMPLATE.md +42 -0
  19. data/.gitignore +24 -0
  20. data/.gitmodules +6 -0
  21. data/.python-version +1 -0
  22. data/.rspec +4 -0
  23. data/.ruby-version +1 -0
  24. data/CHANGELOG.md +533 -0
  25. data/Dockerfile +16 -0
  26. data/Dockerfile.base +53 -0
  27. data/Gemfile +14 -0
  28. data/Gemfile.lock +190 -0
  29. data/Guardfile +22 -0
  30. data/LICENSE.txt +22 -0
  31. data/Procfile +2 -0
  32. data/README.md +203 -0
  33. data/Rakefile +21 -0
  34. data/backers.md +16 -0
  35. data/bin/release +9 -0
  36. data/buildspec.yml +18 -0
  37. data/exe/jets +14 -0
  38. data/jets.gemspec +61 -0
  39. data/lib/jets.rb +71 -0
  40. data/lib/jets/application.rb +308 -0
  41. data/lib/jets/aws_info.rb +111 -0
  42. data/lib/jets/aws_services.rb +60 -0
  43. data/lib/jets/aws_services/stack_status.rb +59 -0
  44. data/lib/jets/booter.rb +130 -0
  45. data/lib/jets/builders.rb +16 -0
  46. data/lib/jets/builders/code_builder.rb +379 -0
  47. data/lib/jets/builders/code_size.rb +57 -0
  48. data/lib/jets/builders/gem_replacer.rb +76 -0
  49. data/lib/jets/builders/handler_generator.rb +172 -0
  50. data/lib/jets/builders/lambda_layer.rb +69 -0
  51. data/lib/jets/builders/md5.rb +60 -0
  52. data/lib/jets/builders/md5_zip.rb +61 -0
  53. data/lib/jets/builders/purger.rb +35 -0
  54. data/lib/jets/builders/rack_packager.rb +51 -0
  55. data/lib/jets/builders/rackup_wrappers/rackup +19 -0
  56. data/lib/jets/builders/rackup_wrappers/rackup.rb +7 -0
  57. data/lib/jets/builders/reconfigure_rails.rb +114 -0
  58. data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +16 -0
  59. data/lib/jets/builders/ruby_packager.rb +207 -0
  60. data/lib/jets/builders/shim_vars.rb +5 -0
  61. data/lib/jets/builders/shim_vars/app.rb +78 -0
  62. data/lib/jets/builders/shim_vars/base.rb +25 -0
  63. data/lib/jets/builders/shim_vars/shared.rb +37 -0
  64. data/lib/jets/builders/templates/handler.rb +12 -0
  65. data/lib/jets/builders/tidy.rb +107 -0
  66. data/lib/jets/builders/util.rb +31 -0
  67. data/lib/jets/camelizer.rb +67 -0
  68. data/lib/jets/cfn.rb +6 -0
  69. data/lib/jets/cfn/builders.rb +20 -0
  70. data/lib/jets/cfn/builders/api_deployment_builder.rb +58 -0
  71. data/lib/jets/cfn/builders/api_gateway_builder.rb +80 -0
  72. data/lib/jets/cfn/builders/base_child_builder.rb +82 -0
  73. data/lib/jets/cfn/builders/controller_builder.rb +42 -0
  74. data/lib/jets/cfn/builders/function_builder.rb +14 -0
  75. data/lib/jets/cfn/builders/interface.rb +127 -0
  76. data/lib/jets/cfn/builders/job_builder.rb +14 -0
  77. data/lib/jets/cfn/builders/parent_builder.rb +93 -0
  78. data/lib/jets/cfn/builders/rule_builder.rb +24 -0
  79. data/lib/jets/cfn/builders/shared_builder.rb +14 -0
  80. data/lib/jets/cfn/ship.rb +189 -0
  81. data/lib/jets/cfn/status.rb +212 -0
  82. data/lib/jets/cfn/upload.rb +139 -0
  83. data/lib/jets/cli.rb +189 -0
  84. data/lib/jets/commands.rb +27 -0
  85. data/lib/jets/commands/base.rb +164 -0
  86. data/lib/jets/commands/build.rb +217 -0
  87. data/lib/jets/commands/call.rb +174 -0
  88. data/lib/jets/commands/call/anonymous_guesser.rb +96 -0
  89. data/lib/jets/commands/call/autoload_guesser.rb +112 -0
  90. data/lib/jets/commands/call/base_guesser.rb +33 -0
  91. data/lib/jets/commands/call/guesser.rb +48 -0
  92. data/lib/jets/commands/clean.rb +23 -0
  93. data/lib/jets/commands/clean/base.rb +24 -0
  94. data/lib/jets/commands/clean/build.rb +13 -0
  95. data/lib/jets/commands/clean/log.rb +107 -0
  96. data/lib/jets/commands/console.rb +13 -0
  97. data/lib/jets/commands/db.rb +15 -0
  98. data/lib/jets/commands/db/environment-task.rake +3 -0
  99. data/lib/jets/commands/db/tasks.rb +44 -0
  100. data/lib/jets/commands/dbconsole.rb +131 -0
  101. data/lib/jets/commands/delete.rb +143 -0
  102. data/lib/jets/commands/deploy.rb +131 -0
  103. data/lib/jets/commands/dynamodb.rb +22 -0
  104. data/lib/jets/commands/dynamodb/migrate.rb +9 -0
  105. data/lib/jets/commands/dynamodb/migrator.rb +36 -0
  106. data/lib/jets/commands/gems.rb +21 -0
  107. data/lib/jets/commands/help.rb +9 -0
  108. data/lib/jets/commands/help/build.md +6 -0
  109. data/lib/jets/commands/help/call.md +61 -0
  110. data/lib/jets/commands/help/clean/build.md +5 -0
  111. data/lib/jets/commands/help/clean/log.md +5 -0
  112. data/lib/jets/commands/help/console.md +18 -0
  113. data/lib/jets/commands/help/db/generate.md +8 -0
  114. data/lib/jets/commands/help/dbconsole.md +9 -0
  115. data/lib/jets/commands/help/delete.md +22 -0
  116. data/lib/jets/commands/help/deploy.md +32 -0
  117. data/lib/jets/commands/help/dynamodb/generate.md +52 -0
  118. data/lib/jets/commands/help/dynamodb/migrate.md +4 -0
  119. data/lib/jets/commands/help/gems/check.md +8 -0
  120. data/lib/jets/commands/help/generate.md +22 -0
  121. data/lib/jets/commands/help/import/rack.md +13 -0
  122. data/lib/jets/commands/help/import/rails.md +11 -0
  123. data/lib/jets/commands/help/new.md +42 -0
  124. data/lib/jets/commands/help/routes.md +16 -0
  125. data/lib/jets/commands/help/runner.md +17 -0
  126. data/lib/jets/commands/help/server.md +15 -0
  127. data/lib/jets/commands/help/status.md +14 -0
  128. data/lib/jets/commands/help/upgrade.md +5 -0
  129. data/lib/jets/commands/help/url.md +6 -0
  130. data/lib/jets/commands/import.rb +18 -0
  131. data/lib/jets/commands/import/base.rb +49 -0
  132. data/lib/jets/commands/import/cheatsheet.rb +35 -0
  133. data/lib/jets/commands/import/rack.rb +16 -0
  134. data/lib/jets/commands/import/rail.rb +74 -0
  135. data/lib/jets/commands/import/sequence.rb +90 -0
  136. data/lib/jets/commands/import/templates/config/database.yml +26 -0
  137. data/lib/jets/commands/import/templates/submodules-cheatsheet.md +89 -0
  138. data/lib/jets/commands/main.rb +152 -0
  139. data/lib/jets/commands/markdown.rb +8 -0
  140. data/lib/jets/commands/markdown/creator.rb +58 -0
  141. data/lib/jets/commands/markdown/index.rb +27 -0
  142. data/lib/jets/commands/markdown/page.rb +125 -0
  143. data/lib/jets/commands/markdown/shell.rb +11 -0
  144. data/lib/jets/commands/new.rb +157 -0
  145. data/lib/jets/commands/rake_command.rb +61 -0
  146. data/lib/jets/commands/rake_tasks.rb +45 -0
  147. data/lib/jets/commands/runner.rb +18 -0
  148. data/lib/jets/commands/sequence.rb +99 -0
  149. data/lib/jets/commands/stack_info.rb +30 -0
  150. data/lib/jets/commands/templates/skeleton/.gitignore +12 -0
  151. data/lib/jets/commands/templates/skeleton/.jetskeep +1 -0
  152. data/lib/jets/commands/templates/skeleton/.rspec +3 -0
  153. data/lib/jets/commands/templates/skeleton/Gemfile.tt +35 -0
  154. data/lib/jets/commands/templates/skeleton/Procfile +7 -0
  155. data/lib/jets/commands/templates/skeleton/README.md +11 -0
  156. data/lib/jets/commands/templates/skeleton/Rakefile +2 -0
  157. data/lib/jets/commands/templates/skeleton/app/controllers/application_controller.rb +2 -0
  158. data/lib/jets/commands/templates/skeleton/app/helpers/application_helper.rb +2 -0
  159. data/lib/jets/commands/templates/skeleton/app/jobs/application_job.rb +4 -0
  160. data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +2 -0
  161. data/lib/jets/commands/templates/skeleton/app/models/application_record.rb +3 -0
  162. data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +25 -0
  163. data/lib/jets/commands/templates/skeleton/config.ru +5 -0
  164. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +66 -0
  165. data/lib/jets/commands/templates/skeleton/config/database.yml.tt +26 -0
  166. data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +22 -0
  167. data/lib/jets/commands/templates/skeleton/config/environments/development.rb +4 -0
  168. data/lib/jets/commands/templates/skeleton/config/environments/production.rb +4 -0
  169. data/lib/jets/commands/templates/skeleton/config/routes.rb +9 -0
  170. data/lib/jets/commands/templates/skeleton/db/.gitkeep +0 -0
  171. data/lib/jets/commands/templates/skeleton/public/404.html +67 -0
  172. data/lib/jets/commands/templates/skeleton/public/422.html +67 -0
  173. data/lib/jets/commands/templates/skeleton/public/500.html +66 -0
  174. data/lib/jets/commands/templates/skeleton/public/favicon.ico +0 -0
  175. data/lib/jets/commands/templates/skeleton/public/index.html.tt +91 -0
  176. data/lib/jets/commands/templates/skeleton/spec/controllers/posts_controller_spec.rb +15 -0
  177. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-index.json +51 -0
  178. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-show.json +53 -0
  179. data/lib/jets/commands/templates/skeleton/spec/spec_helper.rb.tt +30 -0
  180. data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +14 -0
  181. data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -0
  182. data/lib/jets/commands/templates/webpacker/app/javascript/src/jets/crud.js +87 -0
  183. data/lib/jets/commands/upgrade.rb +146 -0
  184. data/lib/jets/commands/upgrade/templates/bin/webpack +19 -0
  185. data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +19 -0
  186. data/lib/jets/commands/url.rb +68 -0
  187. data/lib/jets/commands/webpacker_template.rb +18 -0
  188. data/lib/jets/controller.rb +16 -0
  189. data/lib/jets/controller/base.rb +103 -0
  190. data/lib/jets/controller/callbacks.rb +62 -0
  191. data/lib/jets/controller/cookies.rb +40 -0
  192. data/lib/jets/controller/cookies/jar.rb +269 -0
  193. data/lib/jets/controller/layout.rb +17 -0
  194. data/lib/jets/controller/middleware.rb +5 -0
  195. data/lib/jets/controller/middleware/cors.rb +60 -0
  196. data/lib/jets/controller/middleware/local.rb +119 -0
  197. data/lib/jets/controller/middleware/local/api_gateway.rb +93 -0
  198. data/lib/jets/controller/middleware/local/mimic_aws_call.rb +38 -0
  199. data/lib/jets/controller/middleware/local/route_matcher.rb +97 -0
  200. data/lib/jets/controller/middleware/main.rb +46 -0
  201. data/lib/jets/controller/middleware/webpacker_setup.rb +6 -0
  202. data/lib/jets/controller/params.rb +87 -0
  203. data/lib/jets/controller/rack.rb +5 -0
  204. data/lib/jets/controller/rack/adapter.rb +63 -0
  205. data/lib/jets/controller/rack/env.rb +105 -0
  206. data/lib/jets/controller/redirection.rb +55 -0
  207. data/lib/jets/controller/rendering.rb +84 -0
  208. data/lib/jets/controller/rendering/rack_renderer.rb +238 -0
  209. data/lib/jets/controller/request.rb +29 -0
  210. data/lib/jets/controller/response.rb +61 -0
  211. data/lib/jets/core.rb +211 -0
  212. data/lib/jets/core_ext/kernel.rb +56 -0
  213. data/lib/jets/db.rb +15 -0
  214. data/lib/jets/dotenv.rb +39 -0
  215. data/lib/jets/erb.rb +51 -0
  216. data/lib/jets/generator.rb +41 -0
  217. data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
  218. data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +39 -0
  219. data/lib/jets/generator/templates/erb/scaffold/edit.html.erb +6 -0
  220. data/lib/jets/generator/templates/erb/scaffold/index.html.erb +29 -0
  221. data/lib/jets/generator/templates/erb/scaffold/new.html.erb +5 -0
  222. data/lib/jets/generator/templates/erb/scaffold/show.html.erb +9 -0
  223. data/lib/jets/generator/templates/rails/assets/javascript.js +2 -0
  224. data/lib/jets/generator/templates/rails/assets/stylesheet.css +4 -0
  225. data/lib/jets/generator/templates/rails/controller/controller.rb +13 -0
  226. data/lib/jets/generator/templates/rails/helper/helper.rb +4 -0
  227. data/lib/jets/generator/templates/rails/scaffold/scaffold.css +80 -0
  228. data/lib/jets/generator/templates/rails/scaffold_controller/api_controller.rb +62 -0
  229. data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +79 -0
  230. data/lib/jets/inflections.rb +32 -0
  231. data/lib/jets/internal/app/controllers/jets/public_controller.rb +31 -0
  232. data/lib/jets/internal/app/controllers/jets/rack_controller.rb +25 -0
  233. data/lib/jets/internal/app/functions/jets/base_path.rb +153 -0
  234. data/lib/jets/internal/app/jobs/jets/preheat_job.rb +62 -0
  235. data/lib/jets/io.rb +14 -0
  236. data/lib/jets/job.rb +4 -0
  237. data/lib/jets/job/base.rb +29 -0
  238. data/lib/jets/job/dsl.rb +108 -0
  239. data/lib/jets/klass.rb +109 -0
  240. data/lib/jets/lambda.rb +18 -0
  241. data/lib/jets/lambda/dsl.rb +384 -0
  242. data/lib/jets/lambda/function.rb +29 -0
  243. data/lib/jets/lambda/function_constructor.rb +55 -0
  244. data/lib/jets/lambda/functions.rb +34 -0
  245. data/lib/jets/lambda/task.rb +111 -0
  246. data/lib/jets/logger.rb +24 -0
  247. data/lib/jets/mega.rb +7 -0
  248. data/lib/jets/mega/hash_converter.rb +25 -0
  249. data/lib/jets/mega/request.rb +140 -0
  250. data/lib/jets/mega/request/source.rb +21 -0
  251. data/lib/jets/middleware.rb +38 -0
  252. data/lib/jets/middleware/configurator.rb +84 -0
  253. data/lib/jets/middleware/default_stack.rb +49 -0
  254. data/lib/jets/middleware/layer.rb +34 -0
  255. data/lib/jets/middleware/stack.rb +77 -0
  256. data/lib/jets/naming.rb +49 -0
  257. data/lib/jets/overrides/lambda.rb +1 -0
  258. data/lib/jets/overrides/lambda/marshaller.rb +31 -0
  259. data/lib/jets/overrides/rails.rb +4 -0
  260. data/lib/jets/overrides/rails/asset_tag_helper.rb +114 -0
  261. data/lib/jets/overrides/rails/common_methods.rb +20 -0
  262. data/lib/jets/overrides/rails/rendering_helper.rb +26 -0
  263. data/lib/jets/overrides/rails/url_helper.rb +25 -0
  264. data/lib/jets/poly_fun.rb +82 -0
  265. data/lib/jets/poly_fun/base_executor.rb +125 -0
  266. data/lib/jets/poly_fun/lambda_executor.rb +16 -0
  267. data/lib/jets/poly_fun/node_error.rb +8 -0
  268. data/lib/jets/poly_fun/node_executor.rb +54 -0
  269. data/lib/jets/poly_fun/python_error.rb +8 -0
  270. data/lib/jets/poly_fun/python_executor.rb +23 -0
  271. data/lib/jets/preheat.rb +117 -0
  272. data/lib/jets/processors.rb +4 -0
  273. data/lib/jets/processors/deducer.rb +65 -0
  274. data/lib/jets/processors/main_processor.rb +59 -0
  275. data/lib/jets/rack_server.rb +80 -0
  276. data/lib/jets/rdoc.rb +30 -0
  277. data/lib/jets/resource.rb +74 -0
  278. data/lib/jets/resource/api_gateway.rb +9 -0
  279. data/lib/jets/resource/api_gateway/base_path.rb +5 -0
  280. data/lib/jets/resource/api_gateway/base_path/function.rb +42 -0
  281. data/lib/jets/resource/api_gateway/base_path/mapping.rb +44 -0
  282. data/lib/jets/resource/api_gateway/base_path/role.rb +76 -0
  283. data/lib/jets/resource/api_gateway/cors.rb +61 -0
  284. data/lib/jets/resource/api_gateway/deployment.rb +78 -0
  285. data/lib/jets/resource/api_gateway/domain_name.rb +59 -0
  286. data/lib/jets/resource/api_gateway/method.rb +98 -0
  287. data/lib/jets/resource/api_gateway/resource.rb +78 -0
  288. data/lib/jets/resource/api_gateway/rest_api.rb +60 -0
  289. data/lib/jets/resource/api_gateway/rest_api/change_detection.rb +42 -0
  290. data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +63 -0
  291. data/lib/jets/resource/api_gateway/rest_api/routes.rb +11 -0
  292. data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +12 -0
  293. data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +130 -0
  294. data/lib/jets/resource/api_gateway/rest_api/routes/change/to.rb +29 -0
  295. data/lib/jets/resource/api_gateway/rest_api/routes/change/variable.rb +39 -0
  296. data/lib/jets/resource/api_gateway/rest_api/routes/collision.rb +123 -0
  297. data/lib/jets/resource/api_gateway/rest_api/routes/collision/variable_exception.rb +7 -0
  298. data/lib/jets/resource/associated.rb +26 -0
  299. data/lib/jets/resource/base.rb +28 -0
  300. data/lib/jets/resource/child_stack.rb +7 -0
  301. data/lib/jets/resource/child_stack/api_deployment.rb +56 -0
  302. data/lib/jets/resource/child_stack/api_gateway.rb +29 -0
  303. data/lib/jets/resource/child_stack/app_class.rb +112 -0
  304. data/lib/jets/resource/child_stack/base.rb +24 -0
  305. data/lib/jets/resource/child_stack/shared.rb +90 -0
  306. data/lib/jets/resource/config.rb +4 -0
  307. data/lib/jets/resource/config/config_rule.rb +74 -0
  308. data/lib/jets/resource/config/managed_rule.rb +15 -0
  309. data/lib/jets/resource/events.rb +3 -0
  310. data/lib/jets/resource/events/rule.rb +31 -0
  311. data/lib/jets/resource/iam.rb +8 -0
  312. data/lib/jets/resource/iam/application_role.rb +27 -0
  313. data/lib/jets/resource/iam/base_role_definition.rb +47 -0
  314. data/lib/jets/resource/iam/class_role.rb +74 -0
  315. data/lib/jets/resource/iam/function_role.rb +54 -0
  316. data/lib/jets/resource/iam/managed_policy.rb +22 -0
  317. data/lib/jets/resource/iam/policy_document.rb +41 -0
  318. data/lib/jets/resource/lambda.rb +5 -0
  319. data/lib/jets/resource/lambda/function.rb +216 -0
  320. data/lib/jets/resource/lambda/function/environment.rb +61 -0
  321. data/lib/jets/resource/lambda/gem_layer.rb +17 -0
  322. data/lib/jets/resource/lambda/layer_version.rb +44 -0
  323. data/lib/jets/resource/permission.rb +45 -0
  324. data/lib/jets/resource/replacer.rb +77 -0
  325. data/lib/jets/resource/route53.rb +3 -0
  326. data/lib/jets/resource/route53/record_set.rb +70 -0
  327. data/lib/jets/resource/s3.rb +17 -0
  328. data/lib/jets/resource/sns.rb +3 -0
  329. data/lib/jets/resource/sqs.rb +3 -0
  330. data/lib/jets/resource/standardizer.rb +42 -0
  331. data/lib/jets/route.rb +166 -0
  332. data/lib/jets/router.rb +175 -0
  333. data/lib/jets/router/scope.rb +30 -0
  334. data/lib/jets/rule.rb +4 -0
  335. data/lib/jets/rule/base.rb +19 -0
  336. data/lib/jets/rule/dsl.rb +110 -0
  337. data/lib/jets/spec_helpers.rb +52 -0
  338. data/lib/jets/spec_helpers/params.rb +10 -0
  339. data/lib/jets/spec_helpers/request.rb +98 -0
  340. data/lib/jets/spec_helpers/response.rb +5 -0
  341. data/lib/jets/stack.rb +103 -0
  342. data/lib/jets/stack/builder.rb +38 -0
  343. data/lib/jets/stack/definition.rb +50 -0
  344. data/lib/jets/stack/function.rb +60 -0
  345. data/lib/jets/stack/main.rb +5 -0
  346. data/lib/jets/stack/main/dsl.rb +33 -0
  347. data/lib/jets/stack/main/extensions/base.rb +45 -0
  348. data/lib/jets/stack/main/extensions/cloudwatch.rb +19 -0
  349. data/lib/jets/stack/main/extensions/lambda.rb +71 -0
  350. data/lib/jets/stack/main/extensions/sns.rb +12 -0
  351. data/lib/jets/stack/main/extensions/sqs.rb +36 -0
  352. data/lib/jets/stack/output.rb +38 -0
  353. data/lib/jets/stack/output/dsl.rb +19 -0
  354. data/lib/jets/stack/output/lookup.rb +36 -0
  355. data/lib/jets/stack/parameter.rb +38 -0
  356. data/lib/jets/stack/parameter/dsl.rb +42 -0
  357. data/lib/jets/stack/resource.rb +32 -0
  358. data/lib/jets/stack/resource/dsl.rb +19 -0
  359. data/lib/jets/tmp_loader.rb +52 -0
  360. data/lib/jets/turbine.rb +30 -0
  361. data/lib/jets/turbo.rb +47 -0
  362. data/lib/jets/turbo/database_yaml.rb +41 -0
  363. data/lib/jets/turbo/project/.gitignore +12 -0
  364. data/lib/jets/turbo/project/.jetskeep +1 -0
  365. data/lib/jets/turbo/project/Gemfile +16 -0
  366. data/lib/jets/turbo/project/Rakefile +2 -0
  367. data/lib/jets/turbo/project/app/controllers/application_controller.rb +2 -0
  368. data/lib/jets/turbo/project/app/helpers/application_helper.rb +2 -0
  369. data/lib/jets/turbo/project/app/jobs/application_job.rb +4 -0
  370. data/lib/jets/turbo/project/config.ru +5 -0
  371. data/lib/jets/turbo/project/config/application.rb +4 -0
  372. data/lib/jets/turbo/project/config/routes.rb +4 -0
  373. data/lib/jets/turbo/rail.rb +113 -0
  374. data/lib/jets/turbo/templates/config/database.yml +26 -0
  375. data/lib/jets/util.rb +38 -0
  376. data/lib/jets/version.rb +3 -0
  377. data/readme/prerelease.md +6 -0
  378. data/readme/testing.md +60 -0
  379. metadata +859 -0
@@ -0,0 +1,18 @@
1
+ # Task vs Functions
2
+ #
3
+ # Functions is inherited by Job::Base and Controller::Base.
4
+ # It is holds the event and context is used for processing when you
5
+ # call the lambda function.
6
+ #
7
+ # Task is a holds information for the method that gets registered
8
+ # with method_add and is used to build up the CloudFormation Lambda
9
+ # Function definition.
10
+ #
11
+ # Overview diagram : http://bit.ly/2zQeoF3
12
+ module Jets::Lambda
13
+ autoload :Dsl, "jets/lambda/dsl"
14
+ autoload :FunctionConstructor, "jets/lambda/function_constructor"
15
+ autoload :Function, "jets/lambda/function"
16
+ autoload :Functions, "jets/lambda/functions"
17
+ autoload :Task, "jets/lambda/task"
18
+ end
@@ -0,0 +1,384 @@
1
+ # Other dsl that rely on this must implement
2
+ #
3
+ # default_associated_resource_definition
4
+ #
5
+ module Jets::Lambda::Dsl
6
+ extend ActiveSupport::Concern
7
+
8
+ def lambda_functions
9
+ self.class.lambda_functions
10
+ end
11
+
12
+ included do
13
+ class << self
14
+ extend Memoist
15
+
16
+ def class_properties(options=nil)
17
+ if options
18
+ @class_properties ||= {}
19
+ @class_properties.deep_merge!(options)
20
+ else
21
+ @class_properties || {}
22
+ end
23
+ end
24
+ alias_method :class_props, :class_properties
25
+
26
+ def properties(options={})
27
+ @properties ||= {}
28
+ @properties.deep_merge!(options)
29
+ end
30
+ alias_method :props, :properties
31
+
32
+ def class_environment(hash)
33
+ environment = standardize_env(hash)
34
+ class_properties(environment: environment)
35
+ end
36
+ alias_method :class_env, :class_environment
37
+
38
+ def environment(hash)
39
+ environment = standardize_env(hash)
40
+ properties(environment: environment)
41
+ end
42
+ alias_method :env, :environment
43
+
44
+ # Allows user to pass in hash with or without the :variables key.
45
+ def standardize_env(hash)
46
+ return hash if hash.key?(:variables)
47
+
48
+ environment = {}
49
+ environment[:variables] ||= {}
50
+ environment[:variables].merge!(hash)
51
+ environment
52
+ end
53
+
54
+ # Convenience method that set properties. List based on https://amzn.to/2oSph1P
55
+ # Not all properites are included because some properties are not meant to be set
56
+ # directly. For example, function_name is a calculated setting by Jets.
57
+ PROPERTIES = %W[
58
+ dead_letter_config
59
+ description
60
+ handler
61
+ kms_key_arn
62
+ memory_size
63
+ reserved_concurrent_executions
64
+ role
65
+ runtime
66
+ timeout
67
+ tracing_config
68
+ vpc_config
69
+ tags
70
+ ]
71
+ PROPERTIES.each do |property|
72
+ # Example:
73
+ # def timeout(value)
74
+ # properties(timeout: value)
75
+ # end
76
+ #
77
+ # def class_timeout(value)
78
+ # class_properties(timeout: value)
79
+ # end
80
+ class_eval <<~CODE
81
+ def #{property}(value)
82
+ properties(#{property}: value)
83
+ end
84
+
85
+ def class_#{property}(value)
86
+ class_properties(#{property}: value)
87
+ end
88
+ CODE
89
+ end
90
+ # More convenience aliases
91
+ alias_method :memory, :memory_size
92
+ alias_method :class_memory, :class_memory_size
93
+ alias_method :desc, :description
94
+ alias_method :class_desc, :class_description
95
+
96
+ # definitions: one or more definitions
97
+ def iam_policy(*definitions)
98
+ if definitions.empty?
99
+ @iam_policy
100
+ else
101
+ @iam_policy = definitions.flatten
102
+ end
103
+ end
104
+
105
+ # definitions: one or more definitions
106
+ def class_iam_policy(*definitions)
107
+ if definitions.empty?
108
+ @class_iam_policy
109
+ else
110
+ @class_iam_policy = definitions.flatten
111
+ end
112
+ end
113
+
114
+ # definitions: one or more definitions
115
+ def managed_iam_policy(*definitions)
116
+ if definitions.empty?
117
+ @managed_iam_policy
118
+ else
119
+ @managed_iam_policy = definitions.flatten
120
+ end
121
+ end
122
+
123
+ # definitions: one or more definitions
124
+ def class_managed_iam_policy(*definitions)
125
+ if definitions.empty?
126
+ @class_managed_iam_policy
127
+ else
128
+ @class_managed_iam_policy = definitions.flatten
129
+ end
130
+ end
131
+
132
+ def build_class_iam?
133
+ !!(class_iam_policy || class_managed_iam_policy)
134
+ end
135
+
136
+ #############################
137
+ # Main method that registers resources associated with the Lambda function.
138
+ # All resources methods lead here.
139
+ def associated_resources(*definitions)
140
+ if definitions == [nil] # when associated_resources called with no arguments
141
+ @associated_resources || []
142
+ else
143
+ @associated_resources ||= []
144
+ @associated_resources << Jets::Resource::Associated.new(definitions)
145
+ @associated_resources.flatten!
146
+ end
147
+ end
148
+ # User-friendly short resource method. Users will use this.
149
+ alias_method :resource, :associated_resources
150
+
151
+ # Properties belonging to the associated resource
152
+ def associated_properties(options={})
153
+ @associated_properties ||= {}
154
+ @associated_properties.deep_merge!(options)
155
+ end
156
+ alias_method :associated_props, :associated_properties
157
+
158
+ # meta definition
159
+ def self.define_associated_properties(associated_properties)
160
+ associated_properties.each do |property|
161
+ # Example:
162
+ # def config_rule_name(value)
163
+ # associated_properties(config_rule_name: value)
164
+ # end
165
+ class_eval <<~CODE
166
+ def #{property}(value)
167
+ associated_properties(#{property}: value)
168
+ end
169
+ CODE
170
+ end
171
+ end
172
+
173
+ # Loop back through the resources and add a counter to the end of the id
174
+ # to handle multiple events.
175
+ # Then replace @associated_resources entirely
176
+ def add_logical_id_counter
177
+ numbered_resources = []
178
+ n = 1
179
+ @associated_resources.map do |associated|
180
+ logical_id = associated.logical_id
181
+ attributes = associated.attributes
182
+
183
+ logical_id = logical_id.to_s.sub(/\d+$/,'')
184
+ new_definition = { "#{logical_id}#{n}" => attributes }
185
+ numbered_resources << Jets::Resource::Associated.new(new_definition)
186
+ n += 1
187
+ end
188
+ @associated_resources = numbered_resources
189
+ end
190
+
191
+ def depends_on(*stacks)
192
+ if stacks == []
193
+ @depends_on
194
+ else
195
+ @depends_on ||= []
196
+ @depends_on += stacks
197
+ end
198
+ end
199
+
200
+ # meth is a Symbol
201
+ def method_added(meth)
202
+ return if %w[initialize method_missing].include?(meth.to_s)
203
+ return unless public_method_defined?(meth)
204
+
205
+ register_task(meth)
206
+ end
207
+
208
+ def register_task(meth, lang=:ruby)
209
+ # Note: for anonymous classes like for app/functions self.name is ""
210
+ # We adjust the class name when we build the functions later in
211
+ # FunctionContstructor#adjust_tasks.
212
+
213
+ # At this point we can use the current associated_properties and defined the
214
+ # associated resource with the Lambda function.
215
+ unless associated_properties.empty?
216
+ associated_resources(default_associated_resource_definition(meth))
217
+ end
218
+
219
+ # Unsure why but we have to use @associated_resources vs associated_resources
220
+ # associated_resources is always nil
221
+ if @associated_resources && @associated_resources.size > 1
222
+ add_logical_id_counter
223
+ end
224
+
225
+ all_tasks[meth] = Jets::Lambda::Task.new(self.name, meth,
226
+ properties: @properties, # lambda function properties
227
+ iam_policy: @iam_policy,
228
+ managed_iam_policy: @managed_iam_policy,
229
+ associated_resources: @associated_resources,
230
+ lang: lang,
231
+ replacements: replacements(meth))
232
+
233
+ # Done storing options, clear out for the next added method.
234
+ clear_properties
235
+ # Important to clear @properties at the end of registering outside of
236
+ # register_task because register_task is overridden in Jets::Job::Dsl
237
+ #
238
+ # Jets::Job::Base < Jets::Lambda::Functions
239
+ #
240
+ # Both Jets::Job::Base and Jets::Lambda::Functions have Dsl modules included.
241
+ # So the Jets::Job::Dsl overrides some of the Jets::Lambda::Dsl behavior.
242
+
243
+ true
244
+ end
245
+
246
+ # Meant to be overridden to add more custom replacements based on the app class type
247
+ def replacements(meth)
248
+ {}
249
+ end
250
+
251
+ def clear_properties
252
+ @properties = nil
253
+ @iam_policy = nil
254
+ @managed_iam_policy = nil
255
+ @associated_resources = nil
256
+ @associated_properties = nil
257
+ end
258
+
259
+ # Returns the all tasks for this class with their method names as keys.
260
+ #
261
+ # ==== Returns
262
+ # OrderedHash:: An ordered hash with tasks names as keys and Task
263
+ # objects as values.
264
+ #
265
+ def all_tasks
266
+ @all_tasks ||= ActiveSupport::OrderedHash.new
267
+ end
268
+ # Do not call all tasks outside this class, instead use: tasks or lambda functions
269
+ private :all_tasks
270
+
271
+ # Goes up the class inheritance chain to build the tasks.
272
+ #
273
+ # Example heirarchy:
274
+ #
275
+ # Jets::Lambda::Functions > Jets::Controller::Base > ApplicationController ...
276
+ # > PostsController > ChildPostsController
277
+ #
278
+ # Do not include tasks from the direct subclasses of Jets::Lambda::Functions
279
+ # because those classes are abstract. Dont want those methods to be included.
280
+ def find_all_tasks(public: true)
281
+ klass = self
282
+ direct_subclasses = Jets::Lambda::Functions.subclasses
283
+ lookup = []
284
+
285
+ # Go up class inheritance and builds lookup structure in memory
286
+ until direct_subclasses.include?(klass)
287
+ lookup << klass.send(:all_tasks) # one place we want to call private all_tasks method
288
+ klass = klass.superclass
289
+ end
290
+ merged_tasks = ActiveSupport::OrderedHash.new
291
+ # Go back down the class inheritance chain in reverse order and merge the tasks
292
+ lookup.reverse.each do |tasks_hash|
293
+ # tasks_hash is a result of all_tasks. Example: PostsController.all_tasks
294
+ merged_tasks.merge!(tasks_hash)
295
+ end
296
+
297
+ # The cfn builders required the right final child class to build the lambda functions correctly.
298
+ merged_tasks.each do |meth, task|
299
+ # Override the class name for the cfn builders
300
+ task = task.clone # do not stomp over current tasks since things are usually looked by reference
301
+ task.instance_variable_set(:@class_name, self.name)
302
+ merged_tasks[meth] = task
303
+ end
304
+
305
+ # Methods can be made private with the :private keyword after the method has been defined.
306
+ # To account for this, loop back thorugh all the methods and check if the method is indeed public.
307
+ tasks = ActiveSupport::OrderedHash.new
308
+ merged_tasks.each do |meth, task|
309
+ if public
310
+ tasks[meth] = task if task.public_meth?
311
+ else
312
+ tasks[meth] = task unless task.public_meth?
313
+ end
314
+ end
315
+ tasks
316
+ end
317
+ memoize :find_all_tasks
318
+
319
+ def all_public_tasks
320
+ find_all_tasks(public: true)
321
+ end
322
+
323
+ def all_private_tasks
324
+ find_all_tasks(public: false)
325
+ end
326
+
327
+ # Returns the tasks for this class in Array form.
328
+ #
329
+ # ==== Returns
330
+ # Array of task objects
331
+ #
332
+ def tasks
333
+ all_public_tasks.values
334
+ end
335
+
336
+ # The public methods defined in the project app class ulimately become
337
+ # lambda functions.
338
+ #
339
+ # Example return value:
340
+ # [:index, :new, :create, :show]
341
+ def lambda_functions
342
+ all_public_tasks.keys
343
+ end
344
+
345
+ # Used in Jets::Cfn::Builders::Interface#build
346
+ # Overridden in rule/dsl.rb
347
+ def build?
348
+ !tasks.empty?
349
+ end
350
+
351
+ # Polymorphic support
352
+ def defpoly(lang, meth)
353
+ register_task(meth, lang)
354
+ end
355
+
356
+ def python(meth)
357
+ defpoly(:python, meth)
358
+ end
359
+
360
+ def node(meth)
361
+ defpoly(:node, meth)
362
+ end
363
+ end # end of class << self
364
+ end # end of included
365
+
366
+ def self.add_custom_resource_extensions(base)
367
+ base_path = "#{Jets.root}/app/extensions"
368
+ unless ActiveSupport::Dependencies.autoload_paths.include?(base_path)
369
+ ActiveSupport::Dependencies.autoload_paths += [base_path]
370
+ end
371
+
372
+ Dir.glob("#{base_path}/**/*.rb").each do |path|
373
+ next unless File.file?(path)
374
+
375
+ class_name = path.sub("#{base_path}/", '').sub(/\.rb/,'').classify
376
+ klass = class_name.constantize # autoload
377
+ base.extend(klass)
378
+ end
379
+ end
380
+
381
+ def self.included(base)
382
+ add_custom_resource_extensions(base)
383
+ end
384
+ end
@@ -0,0 +1,29 @@
1
+ module Jets::Lambda
2
+ class Function < Functions
3
+ # Override and change the signature so we do not have to provide info at
4
+ # initialization. So:
5
+ #
6
+ # hello_function = HelloFunction.new
7
+ # hello_function.lambda_handler(event, context)
8
+ #
9
+ # Normally controller and job functions initialize like this:
10
+ #
11
+ # controller = PostController.new(event, context, "handler_handler")
12
+ def initialize
13
+ end
14
+
15
+ def self.handler
16
+ handler_task.meth
17
+ end
18
+
19
+ def self.handler_task
20
+ tasks.first
21
+ end
22
+
23
+ # Used by main_processor.rb. Same interface as controllers and jobs.
24
+ def self.process(event, context, meth)
25
+ function = new
26
+ function.send(handler, event, context)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,55 @@
1
+ # Builds an anonymous class that represents a single Lambda function from code
2
+ # in app/functions.
3
+ #
4
+ # The build method returns an anonymous class using Class.new that contains
5
+ # the methods defined in the app/functions/hello.rb code.
6
+ #
7
+ # Ruby Class.new docs:
8
+ #
9
+ # Creates a new anonymous (unnamed) class with the given superclass (or
10
+ # Object if no parameter is given). You can give a class a name by
11
+ # assigning the class object to a constant.
12
+ # http://ruby-doc.org/core-2.1.1/Class.html#method-c-new
13
+ #
14
+ # So assigning the result of build to a constant makes for a prettier
15
+ # class name. Example:
16
+ #
17
+ # constructor = FunctionConstructor.new(code_path)
18
+ # HelloFunction = constructor.build
19
+ #
20
+ # The class name will be HelloFunction instead of (anonymous). Then usage would
21
+ # be:
22
+ #
23
+ # hello_function = HelloFunction.new
24
+ # hello_function(hello_function.handler, event, context)
25
+ #
26
+ # Or call with the process class method:
27
+ #
28
+ # HelloFunction.process(event, context, "world")
29
+ module Jets::Lambda
30
+ class FunctionConstructor
31
+ def initialize(code_path)
32
+ @code_path = "#{Jets.root}/#{code_path}"
33
+ end
34
+
35
+ def build
36
+ code = IO.read(@code_path)
37
+ function_klass = Class.new(Jets::Lambda::Function)
38
+ function_klass.module_eval(code)
39
+ adjust_tasks(function_klass)
40
+ function_klass # assign this to a Constant for a pretty class name
41
+ end
42
+
43
+ # For anonymous classes method_added during task registration contains ""
44
+ # for the class name. We adjust it here.
45
+ def adjust_tasks(klass)
46
+ class_name = @code_path.to_s.sub(/.*\/functions\//,'').sub(/\.rb$/, '')
47
+ class_name = class_name.classify
48
+ klass.tasks.each do |task|
49
+ task.class_name = class_name
50
+ task.type = "function"
51
+ end
52
+ end
53
+ end
54
+ end
55
+