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,57 @@
1
+ class Jets::Builders
2
+ class CodeSize
3
+ LAMBDA_SIZE_LIMIT = 250 # Total lambda limit is 250MB
4
+ include Util
5
+
6
+ def self.check!
7
+ new.check
8
+ end
9
+
10
+ def check
11
+ return if within_lambda_limit?
12
+ say "Over the Lambda size limit of #{LAMBDA_SIZE_LIMIT}MB".color(:red)
13
+ say "Please reduce the size of your code."
14
+ display_sizes
15
+ exit 1
16
+ end
17
+
18
+ def within_lambda_limit?
19
+ total_size < LAMBDA_SIZE_LIMIT * 1024 # 120MB
20
+ end
21
+
22
+ def total_size
23
+ code_size = compute_size("#{stage_area}/code")
24
+ opt_size = compute_size("#{stage_area}/opt")
25
+ opt_size + code_size # total_size
26
+ end
27
+
28
+ def display_sizes
29
+ code_size = compute_size("#{stage_area}/code")
30
+ opt_size = compute_size("#{stage_area}/opt")
31
+ total_size = opt_size + code_size
32
+ overlimit = (LAMBDA_SIZE_LIMIT * 1024 - total_size) * -1
33
+ say "Sizes:"
34
+ say "Code: #{megabytes(code_size)} - #{stage_area}/code"
35
+ say "Gem Layer: #{megabytes(opt_size)} - #{stage_area}/opt"
36
+ say "Total Package: #{megabytes(total_size)}"
37
+ say "Over limit by: #{megabytes(overlimit)}"
38
+ say "Sometimes blowing away the /tmp/jets cache will reduce the size: rm -rf /tmp/jets"
39
+ # sh "du -kcsh #{stage_area}/*" unless ENV['TEST'] # uncomment to debug
40
+ end
41
+
42
+ def compute_size(path)
43
+ # -k option is required for macosx but not for linux
44
+ out = `du -ks #{path}`
45
+ out.split(' ').first.to_i # bytes
46
+ end
47
+
48
+ def megabytes(bytes)
49
+ n = bytes / 1024.0
50
+ sprintf('%.1f', n) + 'MB'
51
+ end
52
+
53
+ def say(message)
54
+ puts message unless ENV['TEST']
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,76 @@
1
+ class Jets::Builders
2
+ class GemReplacer
3
+ extend Memoist
4
+ def initialize(options)
5
+ @options = options
6
+ end
7
+
8
+ def run
9
+ check = Jets::Gems::Check.new
10
+ if Jets.config.lambda.layers.empty?
11
+ found_gems = check.run! # exits early if missing gems found
12
+ else
13
+ # assumes missing gems are in the provided custom layer by the user
14
+ found_gems = check.run # does not exist early
15
+ end
16
+
17
+ # found gems will only have gems that were found
18
+ found_gems.each do |gem_name, source|
19
+ options = @options.merge(source_url: source)
20
+ gem_extractor = Jets::Gems::Extract::Gem.new(gem_name, options)
21
+ gem_extractor.run
22
+ end
23
+
24
+ tidy
25
+ end
26
+
27
+ def sh(command)
28
+ puts "=> #{command}".color(:green)
29
+ success = system(command)
30
+ abort("Command Failed") unless success
31
+ success
32
+ end
33
+
34
+ def ruby_folder
35
+ Jets::Gems.ruby_folder
36
+ end
37
+
38
+ # remove unnecessary files to reduce package size
39
+ def tidy
40
+ # project_root: /tmp/jets/demo/stage/code/
41
+ # /tmp/jets/demo/stage/code/bundled
42
+ tidy_gems("#{@options[:project_root]}/ruby/gems/#{ruby_folder}/*/gems/*")
43
+ tidy_gems("#{@options[:project_root]}/ruby/gems/#{ruby_folder}/*/bundler/gems/*")
44
+ end
45
+
46
+ def tidy_gems(gems_path)
47
+ Dir.glob(gems_path).each do |gem_path|
48
+ tidy_gem(gem_path)
49
+ end
50
+ end
51
+
52
+ # Clean up some unneeded files to try to keep the package size down
53
+ # In a generated jets app this made a decent 9% difference:
54
+ # 175M test2
55
+ # 191M test3
56
+ def tidy_gem(path)
57
+ # remove top level tests and cache folders
58
+ Dir.glob("#{path}/*").each do |path|
59
+ next unless File.directory?(path)
60
+ folder = File.basename(path)
61
+ if %w[test tests spec features benchmark cache doc].include?(folder)
62
+ FileUtils.rm_rf(path)
63
+ end
64
+ end
65
+
66
+ Dir.glob("#{path}/**/*").each do |path|
67
+ next unless File.file?(path)
68
+ ext = File.extname(path)
69
+ if %w[.rdoc .md .markdown].include?(ext) or
70
+ path =~ /LICENSE|CHANGELOG|README/
71
+ FileUtils.rm_f(path)
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,172 @@
1
+ require "fileutils"
2
+ require "erb"
3
+
4
+ # Example:
5
+ #
6
+ # Jets::Builders::HandlerGenerator.new(
7
+ # "PostsController",
8
+ # :create, :update
9
+ # )
10
+ class Jets::Builders
11
+ class HandlerGenerator
12
+ def self.build!
13
+ new.build
14
+ end
15
+
16
+ def build
17
+ generate_data_yaml
18
+ app_ruby_shims
19
+ poly_shims
20
+ shared_shims
21
+ internal_shims
22
+ end
23
+
24
+ # The handlers/data.yml is used by the shims
25
+ def generate_data_yaml
26
+ vars = Jets::Builders::ShimVars::Base.new
27
+ data = {
28
+ "s3_bucket" => vars.s3_bucket
29
+ }
30
+ data["rack_zip"] = vars.rack_zip if vars.rack_zip
31
+
32
+ content = YAML.dump(data)
33
+ path = "#{tmp_code}/handlers/data.yml"
34
+ FileUtils.mkdir_p(File.dirname(path))
35
+ IO.write(path, content)
36
+ end
37
+
38
+ def app_ruby_shims
39
+ app_files.each do |path|
40
+ # Generates one shim for each app class: controller, job, etc
41
+ vars = Jets::Builders::ShimVars::App.new(path)
42
+ if path.include?('app/functions')
43
+ copy_simple_function(path)
44
+ else
45
+ generate_handler(vars)
46
+ end
47
+ end
48
+ end
49
+
50
+ # source_path: app/functions/simple.rb
51
+ def copy_simple_function(source_path)
52
+ # Handler: handlers/controllers/posts_controller.handle
53
+ dest_path = source_path.sub('app/functions', 'handlers/functions')
54
+ FileUtils.mkdir_p(File.dirname(dest_path))
55
+ FileUtils.cp(source_path, dest_path)
56
+ end
57
+
58
+ def app_files
59
+ Jets::Commands::Build.app_files
60
+ end
61
+
62
+ def poly_shims
63
+ missing = []
64
+
65
+ app_files.each do |path|
66
+ vars = Jets::Builders::ShimVars::App.new(path)
67
+ poly_tasks = vars.klass.tasks.select { |t| t.lang != :ruby }
68
+ poly_tasks.each do |task|
69
+ source_path = get_source_path(path, task)
70
+ if File.exist?(source_path)
71
+ native_function(path, task)
72
+ else
73
+ missing << source_path
74
+ end
75
+ end
76
+
77
+ unless missing.empty?
78
+ puts "ERROR: Missing source files. Please make sure these source files exist or remove their declarations".color(:red)
79
+ puts missing
80
+ exit 1
81
+ end
82
+ end
83
+ end
84
+
85
+ def shared_shims
86
+ Jets::Stack.subclasses.each do |subclass|
87
+ subclass.functions.each do |fun|
88
+ if fun.lang.to_s == "ruby"
89
+ shared_ruby_shim(fun)
90
+ else
91
+ copy_source_as_handler(fun)
92
+ end
93
+ end
94
+ end
95
+ end
96
+
97
+ def internal_shims
98
+ jets_base_path if Jets.custom_domain?
99
+ end
100
+
101
+ def jets_base_path
102
+ path = "jets/base_path.rb"
103
+ internal = File.expand_path("../internal", File.dirname(__FILE__))
104
+ src = "#{internal}/app/functions/#{path}"
105
+ result = Jets::Erb.result(src, stage_name: Jets::Resource::ApiGateway::Deployment.stage_name)
106
+ dest = "#{tmp_code}/handlers/functions/#{path}"
107
+ FileUtils.mkdir_p(File.dirname(dest))
108
+ IO.write(dest, result)
109
+ end
110
+
111
+ # app/shared/functions/kevin.py => /tmp/jets/demo/app_root/handlers/shared/functions/kevin.py
112
+ def copy_source_as_handler(fun)
113
+ source_path = fun.source_file
114
+ unless source_path
115
+ attributes = fun.template.values.first
116
+ function_name = attributes['Properties']['FunctionName']
117
+ puts "WARN: missing source file for: '#{function_name}' function".color(:yellow)
118
+ return
119
+ end
120
+
121
+ dest_path = "#{tmp_code}/#{fun.handler_dest}"
122
+ FileUtils.mkdir_p(File.dirname(dest_path))
123
+ FileUtils.cp(source_path, dest_path)
124
+ end
125
+
126
+ def get_source_path(original_path, task)
127
+ folder = original_path.sub(/\.rb$/,'')
128
+ lang_folder = "#{folder}/#{task.lang}"
129
+ root = Jets.root unless original_path.include?("lib/jets/internal")
130
+ "#{root}/#{lang_folder}/#{task.meth}#{task.lang_ext}"
131
+ end
132
+
133
+ # Builds and copies over the native source code: python or node
134
+ def native_function(original_path, task)
135
+ source_path = get_source_path(original_path, task)
136
+ # Handler: handlers/controllers/posts_controller.handle
137
+ dest_path = "#{tmp_code}/#{task.handler_path}"
138
+ FileUtils.mkdir_p(File.dirname(dest_path))
139
+ FileUtils.cp(source_path, dest_path)
140
+ end
141
+
142
+ def shared_ruby_shim(fun)
143
+ vars = Jets::Builders::ShimVars::Shared.new(fun)
144
+ generate_handler(vars)
145
+ end
146
+
147
+ def common_base_shim
148
+ vars = Jets::Builders::ShimVars::Base.new
149
+ result = evaluate_template("shim.js", vars)
150
+ dest = "#{tmp_code}/handlers/shim.js"
151
+ FileUtils.mkdir_p(File.dirname(dest))
152
+ IO.write(dest, result)
153
+ end
154
+
155
+ def generate_handler(vars)
156
+ result = evaluate_template("handler.rb", vars)
157
+ dest = "#{tmp_code}/#{vars.dest_path}"
158
+ FileUtils.mkdir_p(File.dirname(dest))
159
+ IO.write(dest, result)
160
+ end
161
+
162
+ def evaluate_template(template_file, vars)
163
+ template_path = File.expand_path("../templates/#{template_file}", __FILE__)
164
+ Jets::Erb.result(template_path, vars: vars)
165
+ end
166
+
167
+ # TODO: move CodeBuilder.tmp_code to a common level for HandlerGenerator and CodeBuilder
168
+ def tmp_code
169
+ "#{Jets.build_root}/#{CodeBuilder.tmp_code}"
170
+ end
171
+ end
172
+ end
@@ -0,0 +1,69 @@
1
+ class Jets::Builders
2
+ class LambdaLayer
3
+ include Util
4
+
5
+ # At this point gems are in the stage/code and stage/rack folders still.
6
+ # We consolidate all gems to stage/opt.
7
+ # Then replace the binary gems.
8
+ def build
9
+ consolidate_gems_to_opt
10
+ replace_compiled_gems
11
+ end
12
+
13
+ # Also restructure the folder from:
14
+ # vendor/gems/ruby/2.5.0
15
+ # To:
16
+ # ruby/gems/2.5.0
17
+ #
18
+ # For Lambda Layer structure
19
+ def consolidate_gems_to_opt
20
+ src = "#{stage_area}/code/vendor/gems/ruby/2.5.0"
21
+ dest = "#{stage_area}/opt/ruby/gems/2.5.0"
22
+ rsync_and_link(src, dest)
23
+
24
+ return unless Jets.rack?
25
+
26
+ src = "#{stage_area}/rack/vendor/gems/ruby/2.5.0"
27
+ rsync_and_link(src, dest)
28
+ end
29
+
30
+ def rsync_and_link(src, dest)
31
+ FileUtils.mkdir_p(dest)
32
+ # Trailing slashes are required
33
+ sh "rsync -a --links #{src}/ #{dest}/"
34
+
35
+ FileUtils.rm_rf(src) # blow away original 2.5.0 folder
36
+
37
+ # Create symlink that will point to the gems in the Lambda Layer:
38
+ # stage/opt/ruby/gems/2.5.0 -> /opt/ruby/gems/2.5.0
39
+ FileUtils.ln_sf("/opt/ruby/gems/#{Jets::Gems.ruby_folder}", src)
40
+ end
41
+
42
+ # replace_compiled_gems:
43
+ # remove binary gems in vendor/gems/ruby/2.5.0
44
+ # extract binary gems in opt/ruby/gems/2.5.0
45
+ # move binary gems from opt/ruby/gems/2.5.0 to vendor/gems/ruby/2.5.0
46
+ #
47
+ # After this point, gems have been replace in stage/code/vendor/gems with their
48
+ # binary extensions: a good state. This method moves these gems to the Lambda
49
+ # Layers structure and creates a symlinks to it. First:
50
+ #
51
+ # from stage/code/vendor/gems/ruby/2.5.0
52
+ # to stage/opt/ruby/gems/2.5.0
53
+ #
54
+ # Then:
55
+ #
56
+ # stage/code/vendor/gems/ruby/2.5.0 -> /opt/ruby/gems/2.5.0
57
+ #
58
+ def replace_compiled_gems
59
+ project_root = "#{stage_area}/opt"
60
+ headline "Replacing compiled gems with AWS Lambda Linux compiled versions: #{project_root}"
61
+ options = {
62
+ s3: "lambdagems2",
63
+ build_root: cache_area, # used in jets-gems
64
+ project_root: project_root, # used in gem_replacer and jets-gems
65
+ }
66
+ GemReplacer.new(options).run
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,60 @@
1
+ require 'digest'
2
+
3
+ # Resolves the chicken-and-egg problem with md5 checksums. The handlers need
4
+ # to reference files with the md5 checksum. The files are the:
5
+ #
6
+ # jets/code/rack-checksum.zip
7
+ # jets/code/opt-checksum.zip
8
+ #
9
+ # We compute the checksums before we generate the node shim handlers.
10
+ class Jets::Builders
11
+ class Md5
12
+ class << self
13
+ @@checksums = {}
14
+ def checksums
15
+ @@checksums
16
+ end
17
+
18
+ def stage_folders
19
+ paths = []
20
+ paths << "stage/opt" if folder_exist?("opt")
21
+ paths << "stage/rack" if folder_exist?("rack")
22
+ # Important to have stage/code at the end, since its md5 checksum depends
23
+ # on the previous folders.
24
+ paths << "stage/code"
25
+ paths
26
+ end
27
+
28
+ def folder_exist?(folder)
29
+ path = "#{Jets.build_root}/stage/#{folder}"
30
+ File.directory?(path)
31
+ end
32
+
33
+ def compute!
34
+ stage_folders.each do |path|
35
+ @@checksums[path] = dir(path)
36
+ end
37
+ @@checksums
38
+ end
39
+
40
+ def dir(short_path)
41
+ path = "#{Jets.build_root}/#{short_path}"
42
+ files = Dir["#{path}/**/*"]
43
+ files.reject! { |f| File.directory?(f) }
44
+ .reject! { |f| File.symlink?(f) }
45
+ content = files.map do |f|
46
+ Digest::MD5.file(f).to_s[0..7]
47
+ end.join
48
+
49
+ # The stage/code md5 sha depends on the other 'symlinked' folders.
50
+ if short_path == "stage/code"
51
+ content += @@checksums.values.join
52
+ end
53
+
54
+ md5 = Digest::MD5.new
55
+ md5.update(content)
56
+ md5.hexdigest.to_s[0..7]
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,61 @@
1
+ require 'action_view'
2
+
3
+ # Examples:
4
+ #
5
+ # zip = Jets::Builders::Md5Zip.new("/tmp/jets/demo/stage/code")
6
+ # zip.create
7
+ #
8
+ # zip = Jets::Builders::Md5Zip.new("/tmp/jets/demo/stage/bundled")
9
+ # zip.create
10
+ #
11
+ class Jets::Builders
12
+ class Md5Zip
13
+ include ActionView::Helpers::NumberHelper # number_to_human_size
14
+ include Util
15
+
16
+ def initialize(folder)
17
+ @path = "#{Jets.build_root}/#{folder}"
18
+ @checksum = Md5.checksums[folder]
19
+ end
20
+
21
+ def create
22
+ headline "Creating zip file for #{@path}"
23
+ # => Creating zip file for /tmp/jets/demo/stage/bundled
24
+
25
+ # https://serverfault.com/questions/265675/how-can-i-zip-compress-a-symlink
26
+ command = "cd #{@path} && zip --symlinks -rq #{zip_file} ."
27
+ sh(command)
28
+ # move out of the lower folder to the stage folder
29
+ # mv /tmp/jets/demo/stage/code/code.zip /tmp/jets/demo/stage/code.zip
30
+ FileUtils.mkdir_p(File.dirname(zip_dest))
31
+ FileUtils.mv("#{@path}/#{zip_file}", zip_dest)
32
+
33
+ # mv /tmp/jets/demo/stage/zips/code.zip /tmp/jets/demo/stage/zips/code-a8a604aa.zip
34
+ FileUtils.mv(zip_dest, md5_dest)
35
+
36
+ file_size = number_to_human_size(File.size(md5_dest))
37
+ puts "Zip file created at: #{md5_dest.color(:green)} (#{file_size})"
38
+ end
39
+
40
+ # /tmp/jets/demo/stage/zips/code.zip
41
+ def zip_dest
42
+ stage_area, filename = File.dirname(@path), File.basename(@path)
43
+ zip_area = stage_area + '/zips' # /tmp/jets/demo/stage/zips
44
+ zip_file = filename + '.zip' # code.zip
45
+ "#{zip_area}/#{zip_file}" # /tmp/jets/demo/stage/zips/code.zip
46
+ end
47
+
48
+ def zip_file
49
+ File.basename(zip_dest)
50
+ end
51
+
52
+ # /tmp/jets/demo/stage/zips/code-SHA.zip
53
+ def md5_dest
54
+ zip_dest.sub(".zip", "-#{@checksum}.zip")
55
+ end
56
+
57
+ def md5_name
58
+ File.basename(md5_dest)
59
+ end
60
+ end
61
+ end