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,49 @@
1
+ module Jets::Middleware
2
+ class DefaultStack
3
+ attr_reader :config, :app
4
+ def initialize(app, config)
5
+ @app = app
6
+ @config = config
7
+ end
8
+
9
+ def build_stack
10
+ Stack.new do |middleware|
11
+ middleware.use Rack::Runtime
12
+ middleware.use Jets::Controller::Middleware::Cors if cors_enabled?
13
+ middleware.use Rack::MethodOverride # must come before Middleware::Local for multipart post forms to work
14
+ middleware.use Jets::Controller::Middleware::Local # mimics AWS Lambda for local server only
15
+ middleware.use session_store, session_options # use session_store, session_options
16
+ middleware.use Rack::Head
17
+ middleware.use Rack::ConditionalGet
18
+ middleware.use Rack::ETag
19
+ use_webpacker(middleware)
20
+ end
21
+ end
22
+
23
+ private
24
+ def cors_enabled?
25
+ Jets.config.cors
26
+ end
27
+
28
+ # Written as method to easily not include webpacker for case when either
29
+ # webpacker not installed at all or disabled upon `jets deploy`.
30
+ def use_webpacker(middleware)
31
+ return unless Jets.webpacker? # checks for local development if webpacker installed
32
+ # Different check for middleware because we need webpacker helpers for url helpers.
33
+ # But we dont want to actually serve via webpacker middleware when running on AWS.
34
+ # By this time the url helpers are serving assets out of s3.
35
+ return if File.exist?("#{Jets.root}/config/disable-webpacker-middleware.txt") # created as part of `jets deploy`
36
+ require "jets/controller/middleware/webpacker_setup"
37
+ middleware.use Webpacker::DevServerProxy
38
+ end
39
+
40
+ def session_store
41
+ Jets.config.session[:store] # do not use dot notation. session.store is a method on ActiveSupport::OrderedOptions.new
42
+ end
43
+
44
+ def session_options
45
+ defaults = { secret: ENV['SECRET_KEY_BASE'] }
46
+ defaults.merge(Jets.config.session.options)
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,34 @@
1
+ module Jets::Middleware
2
+ class Layer
3
+ attr_reader :args, :block, :klass
4
+
5
+ def initialize(klass, args, block)
6
+ @klass = klass
7
+ @args = args
8
+ @block = block
9
+ end
10
+
11
+ def name; klass.name; end
12
+
13
+ def ==(middleware)
14
+ case middleware
15
+ when Layer
16
+ klass == middleware.klass
17
+ when Class
18
+ klass == middleware
19
+ end
20
+ end
21
+
22
+ def inspect
23
+ if klass.is_a?(Class)
24
+ klass.to_s
25
+ else
26
+ klass.class.to_s
27
+ end
28
+ end
29
+
30
+ def build(app)
31
+ klass.new(app, *args, &block)
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,77 @@
1
+ module Jets::Middleware
2
+ class Stack
3
+ include Enumerable
4
+
5
+ attr_accessor :middlewares
6
+ def initialize(*args)
7
+ @middlewares = []
8
+ yield(self) if block_given?
9
+ end
10
+
11
+ def each
12
+ @middlewares.each { |x| yield x }
13
+ end
14
+
15
+ def size
16
+ middlewares.size
17
+ end
18
+
19
+ def last
20
+ middlewares.last
21
+ end
22
+
23
+ def [](i)
24
+ middlewares[i]
25
+ end
26
+
27
+ def unshift(klass, *args, &block)
28
+ middlewares.unshift(build_middleware(klass, args, block))
29
+ end
30
+
31
+ def initialize_copy(other)
32
+ self.middlewares = other.middlewares.dup
33
+ end
34
+
35
+ def insert(index, klass, *args, &block)
36
+ index = assert_index(index, :before)
37
+ middlewares.insert(index, build_middleware(klass, args, block))
38
+ end
39
+
40
+ alias_method :insert_before, :insert
41
+
42
+ def insert_after(index, *args, &block)
43
+ index = assert_index(index, :after)
44
+ insert(index + 1, *args, &block)
45
+ end
46
+
47
+ def swap(target, *args, &block)
48
+ index = assert_index(target, :before)
49
+ insert(index, *args, &block)
50
+ middlewares.delete_at(index + 1)
51
+ end
52
+
53
+ def delete(target)
54
+ middlewares.delete_if { |m| m.klass == target }
55
+ end
56
+
57
+ def use(klass, *args, &block)
58
+ middlewares.push(build_middleware(klass, args, block))
59
+ end
60
+
61
+ def build(app = Proc.new)
62
+ middlewares.freeze.reverse.inject(app) { |a, e| e.build(a) }
63
+ end
64
+
65
+ private
66
+
67
+ def assert_index(index, where)
68
+ i = index.is_a?(Integer) ? index : middlewares.index { |m| m.klass == index }
69
+ raise "No such middleware to insert #{where}: #{index.inspect}" unless i
70
+ i
71
+ end
72
+
73
+ def build_middleware(klass, args, block)
74
+ Layer.new(klass, args, block)
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,49 @@
1
+ # This class groups the naming in one place.
2
+ # Some naming is for CloudFormation
3
+ # Some are for the Build process
4
+ class Jets::Naming
5
+ # Mainly used by build.rb
6
+ class << self
7
+ extend Memoist
8
+
9
+ def app_template_path(app_class)
10
+ underscored = app_class.to_s.underscore.gsub('/','-')
11
+ "#{template_path_prefix}-app-#{underscored}.yml"
12
+ end
13
+
14
+ def shared_template_path(shared_class)
15
+ underscored = shared_class.to_s.underscore.gsub('/','-')
16
+ "#{template_path_prefix}-shared-#{underscored}.yml"
17
+ end
18
+
19
+ def template_path_prefix
20
+ "#{Jets.build_root}/templates/#{Jets.config.project_namespace}"
21
+ end
22
+
23
+ # consider moving these methods into cfn/builder/helpers.rb or that area.
24
+ def parent_template_path
25
+ "#{template_path_prefix}.yml"
26
+ end
27
+
28
+ # consider moving these methods into cfn/builder/helpers.rb or that area.
29
+ def api_gateway_template_path
30
+ "#{template_path_prefix}-api-gateway.yml"
31
+ end
32
+
33
+ def api_deployment_template_path
34
+ "#{template_path_prefix}-api-deployment.yml"
35
+ end
36
+
37
+ def shared_resources_template_path
38
+ "#{template_path_prefix}-shared-resources.yml"
39
+ end
40
+
41
+ def parent_stack_name
42
+ File.basename(parent_template_path, ".yml")
43
+ end
44
+
45
+ def gateway_api_name
46
+ "#{Jets.config.project_namespace}"
47
+ end
48
+ end
49
+ end
@@ -0,0 +1 @@
1
+ require "jets/overrides/lambda/marshaller"
@@ -0,0 +1,31 @@
1
+ require 'json'
2
+
3
+ # Hack AwsLambda Ruby Runtime to fix .to_json issue collision with ActiveSupport.
4
+ # To reproduce:
5
+ # Create a shared resource from the docs and call sns.publish
6
+ #
7
+ # Causes an infinite loop when calling sns.publish somehow.
8
+ # Overriding with JSON.dump and follow up with AWS ticket.
9
+ module AwsLambda
10
+ class Marshaller
11
+ class << self
12
+ # By default, just runs #to_json on the method's response value.
13
+ # This can be overwritten by users who know what they are doing.
14
+ # The response is an array of response, content-type.
15
+ # If returned without a content-type, it is assumed to be application/json
16
+ # Finally, StringIO/IO is used to signal a response that shouldn't be
17
+ # formatted as JSON, and should get a different content-type header.
18
+ def marshall_response(method_response)
19
+ case method_response
20
+ when StringIO, IO
21
+ [method_response, 'application/unknown']
22
+ else
23
+ # Orignal method calls .to_json but this collides with ActiveSupport's to_json
24
+ # method_response.to_json # application/json is assumed
25
+ JSON.dump(method_response)
26
+ end
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,4 @@
1
+ require "jets/overrides/rails/common_methods"
2
+ require "jets/overrides/rails/url_helper"
3
+ require "jets/overrides/rails/rendering_helper"
4
+ require "jets/overrides/rails/asset_tag_helper"
@@ -0,0 +1,114 @@
1
+ # Override to prepend stage name when on AWS.
2
+ module Jets::AssetTagHelper
3
+ extend Memoist
4
+ include Jets::CommonMethods
5
+ include Jets::AwsServices
6
+
7
+ def javascript_include_tag(*sources, **options)
8
+ sources = sources.map { |s| s3_public_url(s, :javascripts) }
9
+ super
10
+ end
11
+
12
+ def stylesheet_link_tag(*sources, **options)
13
+ sources = sources.map { |s| s3_public_url(s, :stylesheets) }
14
+ super
15
+ end
16
+
17
+ # Locally:
18
+ #
19
+ # image_tag("jets.png") => /images/jets.png
20
+ # image_tag("/images/jets.png") => /images/jets.png
21
+ #
22
+ # Remotely:
23
+ #
24
+ # image_tag("jets.png") => https://s3-us-west-2.amazonaws.com/demo-dev-s3bucket-1kih4n2te0n66/jets/public/images/jets.png
25
+ def image_tag(source, options = {})
26
+ source = source.to_s # convert to String because passing a posts.photo object to results in failure to resolve the immage to a URL since we haven't defined polymorphic_url yet
27
+
28
+ # mimic original behavior to get /images in source
29
+ source = "/images/#{source}" unless source.starts_with?('/') || source.starts_with?('http')
30
+ if on_aws? && !source.starts_with?('http')
31
+ source = "#{s3_public}#{source}"
32
+ end
33
+
34
+ super
35
+ end
36
+
37
+ def asset_path(source, options = {})
38
+ source = source.to_s # convert to String because passing a posts.photo object to results in failure to resolve the immage to a URL since we haven't defined polymorphic_url yet
39
+ # mimic original behavior to get /images in source
40
+ source = "/images/#{source}" unless source.starts_with?('/') || source.starts_with?('http')
41
+
42
+ # Examples to help understand:
43
+ #
44
+ # puts "AssetTagHelper#asset_path source #{source}"
45
+ # puts "AssetTagHelper#asset_path asset_folder?(source) #{asset_folder?(source).inspect}"
46
+ # AssetTagHelper#asset_path source /packs/images/myimage-e5f675d1ba26865fd65e919beb5bb86b.png
47
+ # AssetTagHelper#asset_path asset_folder?(source) "images"
48
+ #
49
+ if on_aws? && asset_folder?(source) && !source.starts_with?('http')
50
+ source = "#{s3_public}#{source}"
51
+ end
52
+
53
+ super
54
+ end
55
+
56
+ # Serves favicon out of s3 when on API gateway.
57
+ #
58
+ # Useful helper for API Gateway since serving binary data like images without
59
+ # an Accept header doesnt work well. You can changed Media Types to '*/*'
60
+ # but then that messes up form data.
61
+ def favicon_path(path='favicon.ico')
62
+ on_aws? ? "#{s3_public}/#{path}" : "/#{path}"
63
+ end
64
+
65
+ private
66
+ # Whatever is configured in Jets.config.assets.folders
67
+ # Example: packs, images, assets
68
+ def asset_folder?(url)
69
+ Jets.config.assets.folders.detect do |folder|
70
+ url.include?(folder)
71
+ end
72
+ end
73
+
74
+ # User can use:
75
+ # javascript_include_tag "assets/test"
76
+ #
77
+ # Rails automatically adds "javscript" in front, to become:
78
+ #
79
+ # /javascripts/assets/test
80
+ #
81
+ # We want to add the API Gateway stage name in front for this:
82
+ #
83
+ # /stag/javascript/asset/test
84
+ #
85
+ # But adding it in front results in this:
86
+ #
87
+ # /javascript/stag/asset/test
88
+ #
89
+ # If there's a / in front then rails will not add the "javascript":
90
+ # So we can add the javascript ourselves and then add the stag with a
91
+ # / in front.
92
+ def s3_public_url(url, asset_type)
93
+ unless url.starts_with?('/') or url.starts_with?('http')
94
+ url = "/#{asset_type}/#{url}" # /javascript/asset/test
95
+ end
96
+ add_s3_public(url)
97
+ end
98
+
99
+ # Example:
100
+ # Url: /packs/application-e7654c50abd78161b641.js
101
+ # Returns: https://s3-us-west-2.amazonaws.com/demo-dev-s3bucket-1jg5o076egkk4/jets/public/packs/application-e7654c50abd78161b641.js
102
+ def add_s3_public(url)
103
+ return url unless on_aws?
104
+ "#{s3_public}#{url}"
105
+ end
106
+
107
+ def s3_public
108
+ # s3_base_url.txt is created as part of the build process
109
+ s3_base_url = IO.read("#{Jets.root}/config/s3_base_url.txt").strip
110
+ "#{s3_base_url}/public"
111
+ end
112
+ memoize :s3_public
113
+ end
114
+ ActionView::Helpers.send(:include, Jets::AssetTagHelper)
@@ -0,0 +1,20 @@
1
+ module Jets::CommonMethods
2
+ extend Memoist
3
+ # Add API Gateway Stage Name
4
+ def add_stage_name(url)
5
+ return url unless add_stage?(url)
6
+
7
+ stage_name = Jets::Resource::ApiGateway::Deployment.stage_name
8
+ "/#{stage_name}#{url}"
9
+ end
10
+
11
+ def add_stage?(url)
12
+ request.host.include?("amazonaws.com") && url.starts_with?('/')
13
+ end
14
+ memoize :add_stage?
15
+
16
+ def on_aws?
17
+ !request.headers['HTTP_X_AMZN_TRACE_ID'].nil?
18
+ end
19
+ memoize :on_aws?
20
+ end
@@ -0,0 +1,26 @@
1
+ module Jets::RenderingHelper
2
+ # ensure that we always add the controller view name. So when rendering
3
+ # a partial:
4
+ # <%= render "mypartial" %>
5
+ # gets turned into:
6
+ # <%= render "articles/mypartial" %>
7
+ def render(options = {}, locals = {}, &block)
8
+ if options.is_a?(String) && !options.include?('/')
9
+ folder = _get_containing_folder(caller[0])
10
+ partial_name = options # happens to be the partial name
11
+ partial_name = "#{folder}/#{partial_name}"
12
+ options = partial_name
13
+ end
14
+
15
+ super(options, locals, &block)
16
+ end
17
+
18
+ # Ugly, going back up the caller stack to find out what view path
19
+ # we are in
20
+ def _get_containing_folder(caller_line)
21
+ text = caller_line.split(':').first
22
+ # .../fixtures/apps/demo/app/views/posts/index.html.erb
23
+ text.split('/')[-2] # posts
24
+ end
25
+ end
26
+ ActionView::Helpers.send(:include, Jets::RenderingHelper)
@@ -0,0 +1,25 @@
1
+ require "action_view"
2
+
3
+ # hackety hack
4
+ module Jets::UrlHelper
5
+ include Jets::CommonMethods
6
+
7
+ # Basic implementation of url_for to allow use helpers without routes existence
8
+ def url_for(options = nil) # :nodoc:
9
+ url = case options
10
+ when String
11
+ options
12
+ when :back
13
+ _back_url
14
+ # TODO: hook this up to Jets implmentation of config/routes.rb
15
+ # when ActiveRecord::Base
16
+ # record = options
17
+ # record.id
18
+ else
19
+ raise ArgumentError, "Please provided a String to link_to as the the second argument. The Jets link_to helper takes as the second argument."
20
+ end
21
+
22
+ add_stage_name(url)
23
+ end
24
+ end # UrlHelper
25
+ ActionView::Helpers.send(:include, Jets::UrlHelper)
@@ -0,0 +1,82 @@
1
+ module Jets
2
+ class PolyFun
3
+ autoload :LambdaExecutor, 'jets/poly_fun/lambda_executor' # main class delegates to other classes
4
+
5
+ autoload :BaseExecutor, 'jets/poly_fun/base_executor'
6
+ autoload :PythonExecutor, 'jets/poly_fun/python_executor'
7
+ autoload :NodeExecutor, 'jets/poly_fun/node_executor'
8
+
9
+ autoload :PythonError, 'jets/poly_fun/python_error'
10
+ autoload :NodeError, 'jets/poly_fun/node_error'
11
+
12
+ extend Memoist
13
+
14
+ def initialize(app_class, app_meth)
15
+ @app_class = app_class # already a Constant, IE: PostController
16
+ @app_meth = app_meth.to_sym
17
+ end
18
+
19
+ def run(event, context={})
20
+ check_private_method!
21
+
22
+ if task.lang == :ruby
23
+ # controller = PostsController.new(event, content)
24
+ # resp = controller.edit
25
+ run_ruby_code(event, context)
26
+ else
27
+ executor = LambdaExecutor.new(task)
28
+ resp = executor.run(event, context)
29
+ if resp["errorMessage"]
30
+ raise_error(resp)
31
+ end
32
+ resp
33
+ end
34
+ end
35
+
36
+ def run_ruby_code(event, context)
37
+ @app_class.process(event, context, @app_meth)
38
+ rescue Exception => e
39
+ Jets.on_exception(e)
40
+ raise(e)
41
+ end
42
+
43
+ def raise_error(resp)
44
+ backtrace = resp["stackTrace"] + caller
45
+ backtrace = backtrace.map { |l| l.sub(/^\s+/,'') }
46
+ # Adjust the paths from the tmp path to the app path to improve user debugging
47
+ # experience. Example:
48
+ # From:
49
+ # File "/tmp/jets/lite/executor/20180917-16777-43a9e48/app/controllers/jets/public_controller/python/show.py", line 32
50
+ # To:
51
+ # File "app/controllers/jets/public_controller/python/show.py", line 32 backtrace =
52
+ backtrace = backtrace.map do |l|
53
+ if l.include?(Jets.build_root) && !l.include?("lambda_executor.")
54
+ l.sub(/\/tmp\/jets.*executor\/\d{8}-+.*?\//, '')
55
+ else
56
+ l
57
+ end
58
+ end
59
+
60
+ # IE: Jets::PolyFun::PythonError
61
+ error_class = "Jets::PolyFun::#{task.lang.to_s.classify}Error".constantize
62
+ raise error_class.new(resp["errorMessage"], backtrace)
63
+ end
64
+
65
+ def task
66
+ task = @app_class.all_public_tasks[@app_meth]
67
+ # Provider user a better error message to user than a nil failure.
68
+ unless task
69
+ raise "Unable to find #{@app_class}##{@app_meth}"
70
+ end
71
+ task
72
+ end
73
+ memoize :task
74
+
75
+ def check_private_method!
76
+ private_detected = @app_class.all_private_tasks.keys.include?(@app_meth)
77
+ return unless private_detected # Ok to continue
78
+
79
+ raise "The #{@app_class}##{@app_meth} is a private method. Unable to call it unless it is public"
80
+ end
81
+ end
82
+ end